@walkeros/server-destination-pinterest 4.0.0-next-1777463920154 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/walkerOS.json +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,index_exports={};((target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})})(index_exports,{DestinationPinterest:()=>types_exports,default:()=>index_default,destinationPinterest:()=>destinationPinterest}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core2=require("@walkeros/core"),import_server_core2=require("@walkeros/server-core"),import_core=require("@walkeros/core"),import_server_core=require("@walkeros/server-core"),keysToHash=["em","ph","fn","ln","db","ge","ct","st","zp","country","external_id","hashed_maids"];function shouldBeHashed(key,doNotHash=[]){return keysToHash.includes(key)&&!doNotHash.includes(key)}async function processValue(value,shouldHash){return shouldHash?(0,import_core.isArray)(value)?Promise.all(value.map(item=>(0,import_server_core.getHashServer)(String(item)))):(0,import_server_core.getHashServer)(String(value)):value}var push=async function(event,{config:config,data:data,env:env,logger:logger}){const{accessToken:accessToken,adAccountId:adAccountId,action_source:action_source="web",doNotHash:doNotHash,test:test,url:url="https://api.pinterest.com/v5/",user_data:user_data,partner_name:partner_name}=config.settings,eventData=(0,import_core2.isObject)(data)?data:{},configData=config.data?await(0,import_core2.getMappingValue)(event,config.data):{},userDataCustom=user_data?await(0,import_core2.getMappingValue)(event,{map:user_data}):{},userData={...(0,import_core2.isObject)(configData)&&(0,import_core2.isObject)(configData.user_data)?configData.user_data:{},...(0,import_core2.isObject)(userDataCustom)?userDataCustom:{},...(0,import_core2.isObject)(eventData.user_data)?eventData.user_data:{}},{user_data:_ud,custom_data:eventCustomData,...restEventData}=eventData,serverEvent={event_name:event.name,event_id:event.id,event_time:Math.round((event.timestamp||Date.now())/1e3),action_source:action_source,...restEventData,user_data:userData};(0,import_core2.isObject)(eventCustomData)&&(serverEvent.custom_data=eventCustomData),"web"===action_source&&event.source?.url&&(serverEvent.event_source_url=event.source.url),partner_name&&(serverEvent.partner_name=partner_name);const hashedServerEvent=await async function(value,doNotHash=[]){if(!(0,import_core.isObject)(value))return value;const isUserData="user_data"in value,target=isUserData?value.user_data:value,result=(await Promise.all(Object.entries(target).map(async([k,v])=>[k,await processValue(v,isUserData&&shouldBeHashed(k,doNotHash))]))).reduce((acc,[k,v])=>((0,import_core.isString)(k)&&(acc[k]=v),acc),{});return isUserData?{...value,user_data:result}:result}(serverEvent,doNotHash),body={data:[hashedServerEvent]},endpoint=`${url}ad_accounts/${adAccountId}/events${test?"?test=true":""}`;logger.debug("Calling Pinterest API",{endpoint:endpoint,method:"POST",eventName:serverEvent.event_name,eventId:serverEvent.event_id});const sendServerFn=env?.sendServer||import_server_core2.sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`}});logger.debug("Pinterest API response",{ok:!(0,import_core2.isObject)(result)||result.ok}),(0,import_core2.isObject)(result)&&!1===result.ok&&logger.throw(`Pinterest API error: ${JSON.stringify(result)}`)},types_exports={},destinationPinterest={type:"pinterest",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,adAccountId:adAccountId}=settings;accessToken||logger.throw("Config settings accessToken missing"),adAccountId||logger.throw("Config settings adAccountId missing");const settingsConfig={...settings,accessToken:accessToken,adAccountId:adAccountId};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await push(event,context)},index_default=destinationPinterest;//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,index_exports={};((target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})})(index_exports,{DestinationPinterest:()=>types_exports,default:()=>index_default,destinationPinterest:()=>destinationPinterest}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core2=require("@walkeros/core"),import_server_core2=require("@walkeros/server-core"),import_core=require("@walkeros/core"),import_server_core=require("@walkeros/server-core"),keysToHash=["em","ph","fn","ln","db","ge","ct","st","zp","country","external_id","hashed_maids"];function shouldBeHashed(key,doNotHash=[]){return keysToHash.includes(key)&&!doNotHash.includes(key)}async function processValue(value,shouldHash){return shouldHash?(0,import_core.isArray)(value)?Promise.all(value.map(item=>(0,import_server_core.getHashServer)(String(item)))):(0,import_server_core.getHashServer)(String(value)):value}var push=async function(event,{config:config,data:data,env:env,logger:logger,collector:collector}){const{accessToken:accessToken,adAccountId:adAccountId,action_source:action_source="web",doNotHash:doNotHash,test:test,url:url="https://api.pinterest.com/v5/",user_data:user_data,partner_name:partner_name}=config.settings,eventData=(0,import_core2.isObject)(data)?data:{},configData=config.data?await(0,import_core2.getMappingValue)(event,config.data,{collector:collector}):{},userDataCustom=user_data?await(0,import_core2.getMappingValue)(event,{map:user_data},{collector:collector}):{},userData={...(0,import_core2.isObject)(configData)&&(0,import_core2.isObject)(configData.user_data)?configData.user_data:{},...(0,import_core2.isObject)(userDataCustom)?userDataCustom:{},...(0,import_core2.isObject)(eventData.user_data)?eventData.user_data:{}},{user_data:_ud,custom_data:eventCustomData,...restEventData}=eventData,serverEvent={event_name:event.name,event_id:event.id,event_time:Math.round((event.timestamp||Date.now())/1e3),action_source:action_source,...restEventData,user_data:userData};(0,import_core2.isObject)(eventCustomData)&&(serverEvent.custom_data=eventCustomData),"web"===action_source&&event.source?.url&&(serverEvent.event_source_url=event.source.url),partner_name&&(serverEvent.partner_name=partner_name);const hashedServerEvent=await async function(value,doNotHash=[]){if(!(0,import_core.isObject)(value))return value;const isUserData="user_data"in value,target=isUserData?value.user_data:value,result=(await Promise.all(Object.entries(target).map(async([k,v])=>[k,await processValue(v,isUserData&&shouldBeHashed(k,doNotHash))]))).reduce((acc,[k,v])=>((0,import_core.isString)(k)&&(acc[k]=v),acc),{});return isUserData?{...value,user_data:result}:result}(serverEvent,doNotHash),body={data:[hashedServerEvent]},endpoint=`${url}ad_accounts/${adAccountId}/events${test?"?test=true":""}`;logger.debug("Calling Pinterest API",{endpoint:endpoint,method:"POST",eventName:serverEvent.event_name,eventId:serverEvent.event_id});const sendServerFn=env?.sendServer||import_server_core2.sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`}});logger.debug("Pinterest API response",{ok:!(0,import_core2.isObject)(result)||result.ok}),(0,import_core2.isObject)(result)&&!1===result.ok&&logger.throw(`Pinterest API error: ${JSON.stringify(result)}`)},types_exports={},destinationPinterest={type:"pinterest",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,adAccountId:adAccountId}=settings;accessToken||logger.throw("Config settings accessToken missing"),adAccountId||logger.throw("Config settings adAccountId missing");const settingsConfig={...settings,accessToken:accessToken,adAccountId:adAccountId};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await push(event,context)},index_default=destinationPinterest;//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/hash.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationPinterest from './types';\n\nexport const destinationPinterest: Destination = {\n type: 'pinterest',\n\n config: {},\n\n async init({ config: partialConfig, logger }) {\n const config = getConfig(partialConfig, logger);\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n};\n\nexport default destinationPinterest;\n","import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, adAccountId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!adAccountId) logger.throw('Config settings adAccountId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n adAccountId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { ConversionEvent, PushFn, RequestBody, UserData } from './types';\nimport { getMappingValue, isObject } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { hashEvent } from './hash';\n\nexport const push: PushFn = async function (\n event,\n { config, data, env, logger },\n) {\n const {\n accessToken,\n adAccountId,\n action_source = 'web',\n doNotHash,\n test,\n url = 'https://api.pinterest.com/v5/',\n user_data,\n partner_name,\n } = config.settings!;\n\n const eventData = isObject(data) ? data : {};\n const configData = config.data\n ? await getMappingValue(event, config.data)\n : {};\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data })\n : {};\n\n // Merge user_data from config.data, settings.user_data, and event mapping\n const userData: UserData = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data from settings\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Extract custom_data and user_data from eventData, leave the rest\n const {\n user_data: _ud,\n custom_data: eventCustomData,\n ...restEventData\n } = eventData;\n\n const serverEvent: ConversionEvent = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...restEventData,\n user_data: userData,\n };\n\n // Nest custom_data from mapping\n if (isObject(eventCustomData)) {\n serverEvent.custom_data = eventCustomData as ConversionEvent['custom_data'];\n }\n\n // Set event_source_url for web events\n if (action_source === 'web' && event.source?.url) {\n serverEvent.event_source_url = event.source.url;\n }\n\n // Add partner_name from settings\n if (partner_name) {\n serverEvent.partner_name = partner_name;\n }\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: RequestBody = { data: [hashedServerEvent] };\n\n // Build endpoint URL\n const testParam = test ? '?test=true' : '';\n const endpoint = `${url}ad_accounts/${adAccountId}/events${testParam}`;\n\n logger.debug('Calling Pinterest API', {\n endpoint,\n method: 'POST',\n eventName: serverEvent.event_name,\n eventId: serverEvent.event_id,\n });\n\n const sendServerFn = env?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n logger.debug('Pinterest API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`Pinterest API error: ${JSON.stringify(result)}`);\n }\n};\n","import { WalkerOS } from '@walkeros/core';\nimport { isArray, isObject, isString } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\n\nconst keysToHash = [\n 'em',\n 'ph',\n 'fn',\n 'ln',\n 'db',\n 'ge',\n 'ct',\n 'st',\n 'zp',\n 'country',\n 'external_id',\n 'hashed_maids',\n];\n\nfunction shouldBeHashed(key: string, doNotHash: string[] = []): boolean {\n return keysToHash.includes(key) && !doNotHash.includes(key);\n}\n\ntype HashableValue = WalkerOS.AnyObject | unknown | unknown[];\n\nasync function processValue(\n value: unknown,\n shouldHash: boolean,\n): Promise<unknown> {\n if (!shouldHash) return value;\n if (isArray(value)) {\n return Promise.all(value.map((item) => getHashServer(String(item))));\n }\n return getHashServer(String(value));\n}\n\nexport async function hashEvent<T extends HashableValue>(\n value: T,\n doNotHash: string[] = [],\n): Promise<T> {\n if (!isObject(value)) return value;\n\n const isUserData = 'user_data' in value;\n const target = (isUserData ? value.user_data : value) as WalkerOS.AnyObject;\n\n const entries = await Promise.all(\n Object.entries(target).map(async ([k, v]) => [\n k,\n await processValue(v, isUserData && shouldBeHashed(k, doNotHash)),\n ]),\n );\n\n const result = entries.reduce((acc, [k, v]) => {\n if (isString(k)) acc[k] = v;\n return acc;\n }, {} as WalkerOS.AnyObject);\n\n return isUserData ? { ...value, user_data: result } : (result as T);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer, sendServer } from '@walkeros/server-core';\n\nexport interface Settings {\n accessToken: string;\n adAccountId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test?: boolean;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n partner_name?: string;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport interface Env extends DestinationServer.Env {\n sendServer?: typeof sendServer;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\n\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\n\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n\n// Pinterest Conversions API types\n// https://developers.pinterest.com/docs/conversions/conversions/\n\nexport type ActionSource = 'app_android' | 'app_ios' | 'web' | 'offline';\n\nexport type EventName =\n | 'add_payment_info'\n | 'add_to_cart'\n | 'add_to_wishlist'\n | 'app_install'\n | 'app_open'\n | 'checkout'\n | 'contact'\n | 'custom'\n | 'customize_product'\n | 'find_location'\n | 'initiate_checkout'\n | 'lead'\n | 'page_visit'\n | 'schedule'\n | 'search'\n | 'signup'\n | 'start_trial'\n | 'submit_application'\n | 'subscribe'\n | 'view_category'\n | 'view_content'\n | 'watch_video'\n | string;\n\nexport interface ConversionEvent {\n // Required\n event_name: EventName;\n event_time: number;\n event_id: string;\n action_source: ActionSource;\n user_data: UserData;\n\n // Optional\n event_source_url?: string;\n opt_out?: boolean;\n partner_name?: string;\n app_id?: string;\n app_name?: string;\n app_version?: string;\n device_brand?: string;\n device_carrier?: string;\n device_model?: string;\n device_type?: string;\n os_version?: string;\n language?: string;\n wifi?: boolean;\n custom_data?: CustomData;\n}\n\nexport interface UserData {\n // Hashable fields (SHA-256, arrays)\n em?: string[];\n ph?: string[];\n fn?: string[];\n ln?: string[];\n db?: string[];\n ge?: string[];\n ct?: string[];\n st?: string[];\n zp?: string[];\n country?: string[];\n external_id?: string[];\n hashed_maids?: string[];\n\n // Pass-through fields (do NOT hash)\n client_ip_address?: string;\n client_user_agent?: string;\n click_id?: string;\n partner_id?: string;\n}\n\nexport interface CustomData {\n currency?: string;\n value?: string;\n content_ids?: string[];\n content_name?: string;\n content_category?: string;\n content_brand?: string;\n contents?: ContentItem[];\n num_items?: number;\n order_id?: string;\n search_string?: string;\n opt_out_type?: string;\n np?: string;\n predicted_ltv?: string;\n}\n\nexport interface ContentItem {\n id?: string;\n item_name?: string;\n item_category?: string;\n item_brand?: string;\n item_price?: string;\n quantity?: number;\n}\n\nexport interface RequestBody {\n data: ConversionEvent[];\n}\n\nexport interface ResponseBody {\n num_events_received: number;\n num_events_processed: number;\n events: Array<{\n status: string;\n error_message?: string;\n warning_message?: string;\n }>;\n}\n"],"mappings":"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","names":["import_core","import_server_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/hash.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationPinterest from './types';\n\nexport const destinationPinterest: Destination = {\n type: 'pinterest',\n\n config: {},\n\n async init({ config: partialConfig, logger }) {\n const config = getConfig(partialConfig, logger);\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n};\n\nexport default destinationPinterest;\n","import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, adAccountId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!adAccountId) logger.throw('Config settings adAccountId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n adAccountId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { ConversionEvent, PushFn, RequestBody, UserData } from './types';\nimport { getMappingValue, isObject } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { hashEvent } from './hash';\n\nexport const push: PushFn = async function (\n event,\n { config, data, env, logger, collector },\n) {\n const {\n accessToken,\n adAccountId,\n action_source = 'web',\n doNotHash,\n test,\n url = 'https://api.pinterest.com/v5/',\n user_data,\n partner_name,\n } = config.settings!;\n\n const eventData = isObject(data) ? data : {};\n const configData = config.data\n ? await getMappingValue(event, config.data, { collector })\n : {};\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data }, { collector })\n : {};\n\n // Merge user_data from config.data, settings.user_data, and event mapping\n const userData: UserData = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data from settings\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Extract custom_data and user_data from eventData, leave the rest\n const {\n user_data: _ud,\n custom_data: eventCustomData,\n ...restEventData\n } = eventData;\n\n const serverEvent: ConversionEvent = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...restEventData,\n user_data: userData,\n };\n\n // Nest custom_data from mapping\n if (isObject(eventCustomData)) {\n serverEvent.custom_data = eventCustomData as ConversionEvent['custom_data'];\n }\n\n // Set event_source_url for web events\n if (action_source === 'web' && event.source?.url) {\n serverEvent.event_source_url = event.source.url;\n }\n\n // Add partner_name from settings\n if (partner_name) {\n serverEvent.partner_name = partner_name;\n }\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: RequestBody = { data: [hashedServerEvent] };\n\n // Build endpoint URL\n const testParam = test ? '?test=true' : '';\n const endpoint = `${url}ad_accounts/${adAccountId}/events${testParam}`;\n\n logger.debug('Calling Pinterest API', {\n endpoint,\n method: 'POST',\n eventName: serverEvent.event_name,\n eventId: serverEvent.event_id,\n });\n\n const sendServerFn = env?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n logger.debug('Pinterest API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`Pinterest API error: ${JSON.stringify(result)}`);\n }\n};\n","import { WalkerOS } from '@walkeros/core';\nimport { isArray, isObject, isString } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\n\nconst keysToHash = [\n 'em',\n 'ph',\n 'fn',\n 'ln',\n 'db',\n 'ge',\n 'ct',\n 'st',\n 'zp',\n 'country',\n 'external_id',\n 'hashed_maids',\n];\n\nfunction shouldBeHashed(key: string, doNotHash: string[] = []): boolean {\n return keysToHash.includes(key) && !doNotHash.includes(key);\n}\n\ntype HashableValue = WalkerOS.AnyObject | unknown | unknown[];\n\nasync function processValue(\n value: unknown,\n shouldHash: boolean,\n): Promise<unknown> {\n if (!shouldHash) return value;\n if (isArray(value)) {\n return Promise.all(value.map((item) => getHashServer(String(item))));\n }\n return getHashServer(String(value));\n}\n\nexport async function hashEvent<T extends HashableValue>(\n value: T,\n doNotHash: string[] = [],\n): Promise<T> {\n if (!isObject(value)) return value;\n\n const isUserData = 'user_data' in value;\n const target = (isUserData ? value.user_data : value) as WalkerOS.AnyObject;\n\n const entries = await Promise.all(\n Object.entries(target).map(async ([k, v]) => [\n k,\n await processValue(v, isUserData && shouldBeHashed(k, doNotHash)),\n ]),\n );\n\n const result = entries.reduce((acc, [k, v]) => {\n if (isString(k)) acc[k] = v;\n return acc;\n }, {} as WalkerOS.AnyObject);\n\n return isUserData ? { ...value, user_data: result } : (result as T);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer, sendServer } from '@walkeros/server-core';\n\nexport interface Settings {\n accessToken: string;\n adAccountId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test?: boolean;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n partner_name?: string;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport interface Env extends DestinationServer.Env {\n sendServer?: typeof sendServer;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\n\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\n\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n\n// Pinterest Conversions API types\n// https://developers.pinterest.com/docs/conversions/conversions/\n\nexport type ActionSource = 'app_android' | 'app_ios' | 'web' | 'offline';\n\nexport type EventName =\n | 'add_payment_info'\n | 'add_to_cart'\n | 'add_to_wishlist'\n | 'app_install'\n | 'app_open'\n | 'checkout'\n | 'contact'\n | 'custom'\n | 'customize_product'\n | 'find_location'\n | 'initiate_checkout'\n | 'lead'\n | 'page_visit'\n | 'schedule'\n | 'search'\n | 'signup'\n | 'start_trial'\n | 'submit_application'\n | 'subscribe'\n | 'view_category'\n | 'view_content'\n | 'watch_video'\n | string;\n\nexport interface ConversionEvent {\n // Required\n event_name: EventName;\n event_time: number;\n event_id: string;\n action_source: ActionSource;\n user_data: UserData;\n\n // Optional\n event_source_url?: string;\n opt_out?: boolean;\n partner_name?: string;\n app_id?: string;\n app_name?: string;\n app_version?: string;\n device_brand?: string;\n device_carrier?: string;\n device_model?: string;\n device_type?: string;\n os_version?: string;\n language?: string;\n wifi?: boolean;\n custom_data?: CustomData;\n}\n\nexport interface UserData {\n // Hashable fields (SHA-256, arrays)\n em?: string[];\n ph?: string[];\n fn?: string[];\n ln?: string[];\n db?: string[];\n ge?: string[];\n ct?: string[];\n st?: string[];\n zp?: string[];\n country?: string[];\n external_id?: string[];\n hashed_maids?: string[];\n\n // Pass-through fields (do NOT hash)\n client_ip_address?: string;\n client_user_agent?: string;\n click_id?: string;\n partner_id?: string;\n}\n\nexport interface CustomData {\n currency?: string;\n value?: string;\n content_ids?: string[];\n content_name?: string;\n content_category?: string;\n content_brand?: string;\n contents?: ContentItem[];\n num_items?: number;\n order_id?: string;\n search_string?: string;\n opt_out_type?: string;\n np?: string;\n predicted_ltv?: string;\n}\n\nexport interface ContentItem {\n id?: string;\n item_name?: string;\n item_category?: string;\n item_brand?: string;\n item_price?: string;\n quantity?: number;\n}\n\nexport interface RequestBody {\n data: ConversionEvent[];\n}\n\nexport interface ResponseBody {\n num_events_received: number;\n num_events_processed: number;\n events: Array<{\n status: string;\n error_message?: string;\n warning_message?: string;\n }>;\n}\n"],"mappings":"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","names":["import_core","import_server_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getMappingValue,isObject as isObject2}from"@walkeros/core";import{sendServer}from"@walkeros/server-core";import{isArray,isObject,isString}from"@walkeros/core";import{getHashServer}from"@walkeros/server-core";var keysToHash=["em","ph","fn","ln","db","ge","ct","st","zp","country","external_id","hashed_maids"];function shouldBeHashed(key,doNotHash=[]){return keysToHash.includes(key)&&!doNotHash.includes(key)}async function processValue(value,shouldHash){return shouldHash?isArray(value)?Promise.all(value.map(item=>getHashServer(String(item)))):getHashServer(String(value)):value}var push=async function(event,{config:config,data:data,env:env,logger:logger}){const{accessToken:accessToken,adAccountId:adAccountId,action_source:action_source="web",doNotHash:doNotHash,test:test,url:url="https://api.pinterest.com/v5/",user_data:user_data,partner_name:partner_name}=config.settings,eventData=isObject2(data)?data:{},configData=config.data?await getMappingValue(event,config.data):{},userDataCustom=user_data?await getMappingValue(event,{map:user_data}):{},userData={...isObject2(configData)&&isObject2(configData.user_data)?configData.user_data:{},...isObject2(userDataCustom)?userDataCustom:{},...isObject2(eventData.user_data)?eventData.user_data:{}},{user_data:_ud,custom_data:eventCustomData,...restEventData}=eventData,serverEvent={event_name:event.name,event_id:event.id,event_time:Math.round((event.timestamp||Date.now())/1e3),action_source:action_source,...restEventData,user_data:userData};isObject2(eventCustomData)&&(serverEvent.custom_data=eventCustomData),"web"===action_source&&event.source?.url&&(serverEvent.event_source_url=event.source.url),partner_name&&(serverEvent.partner_name=partner_name);const hashedServerEvent=await async function(value,doNotHash=[]){if(!isObject(value))return value;const isUserData="user_data"in value,target=isUserData?value.user_data:value,result=(await Promise.all(Object.entries(target).map(async([k,v])=>[k,await processValue(v,isUserData&&shouldBeHashed(k,doNotHash))]))).reduce((acc,[k,v])=>(isString(k)&&(acc[k]=v),acc),{});return isUserData?{...value,user_data:result}:result}(serverEvent,doNotHash),body={data:[hashedServerEvent]},endpoint=`${url}ad_accounts/${adAccountId}/events${test?"?test=true":""}`;logger.debug("Calling Pinterest API",{endpoint:endpoint,method:"POST",eventName:serverEvent.event_name,eventId:serverEvent.event_id});const sendServerFn=env?.sendServer||sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`}});logger.debug("Pinterest API response",{ok:!isObject2(result)||result.ok}),isObject2(result)&&!1===result.ok&&logger.throw(`Pinterest API error: ${JSON.stringify(result)}`)},types_exports={},destinationPinterest={type:"pinterest",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,adAccountId:adAccountId}=settings;accessToken||logger.throw("Config settings accessToken missing"),adAccountId||logger.throw("Config settings adAccountId missing");const settingsConfig={...settings,accessToken:accessToken,adAccountId:adAccountId};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await push(event,context)},index_default=destinationPinterest;export{types_exports as DestinationPinterest,index_default as default,destinationPinterest};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import{getMappingValue,isObject as isObject2}from"@walkeros/core";import{sendServer}from"@walkeros/server-core";import{isArray,isObject,isString}from"@walkeros/core";import{getHashServer}from"@walkeros/server-core";var keysToHash=["em","ph","fn","ln","db","ge","ct","st","zp","country","external_id","hashed_maids"];function shouldBeHashed(key,doNotHash=[]){return keysToHash.includes(key)&&!doNotHash.includes(key)}async function processValue(value,shouldHash){return shouldHash?isArray(value)?Promise.all(value.map(item=>getHashServer(String(item)))):getHashServer(String(value)):value}var push=async function(event,{config:config,data:data,env:env,logger:logger,collector:collector}){const{accessToken:accessToken,adAccountId:adAccountId,action_source:action_source="web",doNotHash:doNotHash,test:test,url:url="https://api.pinterest.com/v5/",user_data:user_data,partner_name:partner_name}=config.settings,eventData=isObject2(data)?data:{},configData=config.data?await getMappingValue(event,config.data,{collector:collector}):{},userDataCustom=user_data?await getMappingValue(event,{map:user_data},{collector:collector}):{},userData={...isObject2(configData)&&isObject2(configData.user_data)?configData.user_data:{},...isObject2(userDataCustom)?userDataCustom:{},...isObject2(eventData.user_data)?eventData.user_data:{}},{user_data:_ud,custom_data:eventCustomData,...restEventData}=eventData,serverEvent={event_name:event.name,event_id:event.id,event_time:Math.round((event.timestamp||Date.now())/1e3),action_source:action_source,...restEventData,user_data:userData};isObject2(eventCustomData)&&(serverEvent.custom_data=eventCustomData),"web"===action_source&&event.source?.url&&(serverEvent.event_source_url=event.source.url),partner_name&&(serverEvent.partner_name=partner_name);const hashedServerEvent=await async function(value,doNotHash=[]){if(!isObject(value))return value;const isUserData="user_data"in value,target=isUserData?value.user_data:value,result=(await Promise.all(Object.entries(target).map(async([k,v])=>[k,await processValue(v,isUserData&&shouldBeHashed(k,doNotHash))]))).reduce((acc,[k,v])=>(isString(k)&&(acc[k]=v),acc),{});return isUserData?{...value,user_data:result}:result}(serverEvent,doNotHash),body={data:[hashedServerEvent]},endpoint=`${url}ad_accounts/${adAccountId}/events${test?"?test=true":""}`;logger.debug("Calling Pinterest API",{endpoint:endpoint,method:"POST",eventName:serverEvent.event_name,eventId:serverEvent.event_id});const sendServerFn=env?.sendServer||sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`}});logger.debug("Pinterest API response",{ok:!isObject2(result)||result.ok}),isObject2(result)&&!1===result.ok&&logger.throw(`Pinterest API error: ${JSON.stringify(result)}`)},types_exports={},destinationPinterest={type:"pinterest",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,adAccountId:adAccountId}=settings;accessToken||logger.throw("Config settings accessToken missing"),adAccountId||logger.throw("Config settings adAccountId missing");const settingsConfig={...settings,accessToken:accessToken,adAccountId:adAccountId};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await push(event,context)},index_default=destinationPinterest;export{types_exports as DestinationPinterest,index_default as default,destinationPinterest};//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/push.ts","../src/hash.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, adAccountId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!adAccountId) logger.throw('Config settings adAccountId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n adAccountId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { ConversionEvent, PushFn, RequestBody, UserData } from './types';\nimport { getMappingValue, isObject } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { hashEvent } from './hash';\n\nexport const push: PushFn = async function (\n event,\n { config, data, env, logger },\n) {\n const {\n accessToken,\n adAccountId,\n action_source = 'web',\n doNotHash,\n test,\n url = 'https://api.pinterest.com/v5/',\n user_data,\n partner_name,\n } = config.settings!;\n\n const eventData = isObject(data) ? data : {};\n const configData = config.data\n ? await getMappingValue(event, config.data)\n : {};\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data })\n : {};\n\n // Merge user_data from config.data, settings.user_data, and event mapping\n const userData: UserData = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data from settings\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Extract custom_data and user_data from eventData, leave the rest\n const {\n user_data: _ud,\n custom_data: eventCustomData,\n ...restEventData\n } = eventData;\n\n const serverEvent: ConversionEvent = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...restEventData,\n user_data: userData,\n };\n\n // Nest custom_data from mapping\n if (isObject(eventCustomData)) {\n serverEvent.custom_data = eventCustomData as ConversionEvent['custom_data'];\n }\n\n // Set event_source_url for web events\n if (action_source === 'web' && event.source?.url) {\n serverEvent.event_source_url = event.source.url;\n }\n\n // Add partner_name from settings\n if (partner_name) {\n serverEvent.partner_name = partner_name;\n }\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: RequestBody = { data: [hashedServerEvent] };\n\n // Build endpoint URL\n const testParam = test ? '?test=true' : '';\n const endpoint = `${url}ad_accounts/${adAccountId}/events${testParam}`;\n\n logger.debug('Calling Pinterest API', {\n endpoint,\n method: 'POST',\n eventName: serverEvent.event_name,\n eventId: serverEvent.event_id,\n });\n\n const sendServerFn = env?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n logger.debug('Pinterest API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`Pinterest API error: ${JSON.stringify(result)}`);\n }\n};\n","import { WalkerOS } from '@walkeros/core';\nimport { isArray, isObject, isString } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\n\nconst keysToHash = [\n 'em',\n 'ph',\n 'fn',\n 'ln',\n 'db',\n 'ge',\n 'ct',\n 'st',\n 'zp',\n 'country',\n 'external_id',\n 'hashed_maids',\n];\n\nfunction shouldBeHashed(key: string, doNotHash: string[] = []): boolean {\n return keysToHash.includes(key) && !doNotHash.includes(key);\n}\n\ntype HashableValue = WalkerOS.AnyObject | unknown | unknown[];\n\nasync function processValue(\n value: unknown,\n shouldHash: boolean,\n): Promise<unknown> {\n if (!shouldHash) return value;\n if (isArray(value)) {\n return Promise.all(value.map((item) => getHashServer(String(item))));\n }\n return getHashServer(String(value));\n}\n\nexport async function hashEvent<T extends HashableValue>(\n value: T,\n doNotHash: string[] = [],\n): Promise<T> {\n if (!isObject(value)) return value;\n\n const isUserData = 'user_data' in value;\n const target = (isUserData ? value.user_data : value) as WalkerOS.AnyObject;\n\n const entries = await Promise.all(\n Object.entries(target).map(async ([k, v]) => [\n k,\n await processValue(v, isUserData && shouldBeHashed(k, doNotHash)),\n ]),\n );\n\n const result = entries.reduce((acc, [k, v]) => {\n if (isString(k)) acc[k] = v;\n return acc;\n }, {} as WalkerOS.AnyObject);\n\n return isUserData ? { ...value, user_data: result } : (result as T);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer, sendServer } from '@walkeros/server-core';\n\nexport interface Settings {\n accessToken: string;\n adAccountId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test?: boolean;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n partner_name?: string;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport interface Env extends DestinationServer.Env {\n sendServer?: typeof sendServer;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\n\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\n\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n\n// Pinterest Conversions API types\n// https://developers.pinterest.com/docs/conversions/conversions/\n\nexport type ActionSource = 'app_android' | 'app_ios' | 'web' | 'offline';\n\nexport type EventName =\n | 'add_payment_info'\n | 'add_to_cart'\n | 'add_to_wishlist'\n | 'app_install'\n | 'app_open'\n | 'checkout'\n | 'contact'\n | 'custom'\n | 'customize_product'\n | 'find_location'\n | 'initiate_checkout'\n | 'lead'\n | 'page_visit'\n | 'schedule'\n | 'search'\n | 'signup'\n | 'start_trial'\n | 'submit_application'\n | 'subscribe'\n | 'view_category'\n | 'view_content'\n | 'watch_video'\n | string;\n\nexport interface ConversionEvent {\n // Required\n event_name: EventName;\n event_time: number;\n event_id: string;\n action_source: ActionSource;\n user_data: UserData;\n\n // Optional\n event_source_url?: string;\n opt_out?: boolean;\n partner_name?: string;\n app_id?: string;\n app_name?: string;\n app_version?: string;\n device_brand?: string;\n device_carrier?: string;\n device_model?: string;\n device_type?: string;\n os_version?: string;\n language?: string;\n wifi?: boolean;\n custom_data?: CustomData;\n}\n\nexport interface UserData {\n // Hashable fields (SHA-256, arrays)\n em?: string[];\n ph?: string[];\n fn?: string[];\n ln?: string[];\n db?: string[];\n ge?: string[];\n ct?: string[];\n st?: string[];\n zp?: string[];\n country?: string[];\n external_id?: string[];\n hashed_maids?: string[];\n\n // Pass-through fields (do NOT hash)\n client_ip_address?: string;\n client_user_agent?: string;\n click_id?: string;\n partner_id?: string;\n}\n\nexport interface CustomData {\n currency?: string;\n value?: string;\n content_ids?: string[];\n content_name?: string;\n content_category?: string;\n content_brand?: string;\n contents?: ContentItem[];\n num_items?: number;\n order_id?: string;\n search_string?: string;\n opt_out_type?: string;\n np?: string;\n predicted_ltv?: string;\n}\n\nexport interface ContentItem {\n id?: string;\n item_name?: string;\n item_category?: string;\n item_brand?: string;\n item_price?: string;\n quantity?: number;\n}\n\nexport interface RequestBody {\n data: ConversionEvent[];\n}\n\nexport interface ResponseBody {\n num_events_received: number;\n num_events_processed: number;\n events: Array<{\n status: string;\n error_message?: string;\n warning_message?: string;\n }>;\n}\n","import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationPinterest from './types';\n\nexport const destinationPinterest: Destination = {\n type: 'pinterest',\n\n config: {},\n\n async init({ config: partialConfig, logger }) {\n const config = getConfig(partialConfig, logger);\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n};\n\nexport default destinationPinterest;\n"],"mappings":"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","names":["isObject","isObject"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/push.ts","../src/hash.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, adAccountId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!adAccountId) logger.throw('Config settings adAccountId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n adAccountId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { ConversionEvent, PushFn, RequestBody, UserData } from './types';\nimport { getMappingValue, isObject } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { hashEvent } from './hash';\n\nexport const push: PushFn = async function (\n event,\n { config, data, env, logger, collector },\n) {\n const {\n accessToken,\n adAccountId,\n action_source = 'web',\n doNotHash,\n test,\n url = 'https://api.pinterest.com/v5/',\n user_data,\n partner_name,\n } = config.settings!;\n\n const eventData = isObject(data) ? data : {};\n const configData = config.data\n ? await getMappingValue(event, config.data, { collector })\n : {};\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data }, { collector })\n : {};\n\n // Merge user_data from config.data, settings.user_data, and event mapping\n const userData: UserData = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data from settings\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Extract custom_data and user_data from eventData, leave the rest\n const {\n user_data: _ud,\n custom_data: eventCustomData,\n ...restEventData\n } = eventData;\n\n const serverEvent: ConversionEvent = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...restEventData,\n user_data: userData,\n };\n\n // Nest custom_data from mapping\n if (isObject(eventCustomData)) {\n serverEvent.custom_data = eventCustomData as ConversionEvent['custom_data'];\n }\n\n // Set event_source_url for web events\n if (action_source === 'web' && event.source?.url) {\n serverEvent.event_source_url = event.source.url;\n }\n\n // Add partner_name from settings\n if (partner_name) {\n serverEvent.partner_name = partner_name;\n }\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: RequestBody = { data: [hashedServerEvent] };\n\n // Build endpoint URL\n const testParam = test ? '?test=true' : '';\n const endpoint = `${url}ad_accounts/${adAccountId}/events${testParam}`;\n\n logger.debug('Calling Pinterest API', {\n endpoint,\n method: 'POST',\n eventName: serverEvent.event_name,\n eventId: serverEvent.event_id,\n });\n\n const sendServerFn = env?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n logger.debug('Pinterest API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`Pinterest API error: ${JSON.stringify(result)}`);\n }\n};\n","import { WalkerOS } from '@walkeros/core';\nimport { isArray, isObject, isString } from '@walkeros/core';\nimport { getHashServer } from '@walkeros/server-core';\n\nconst keysToHash = [\n 'em',\n 'ph',\n 'fn',\n 'ln',\n 'db',\n 'ge',\n 'ct',\n 'st',\n 'zp',\n 'country',\n 'external_id',\n 'hashed_maids',\n];\n\nfunction shouldBeHashed(key: string, doNotHash: string[] = []): boolean {\n return keysToHash.includes(key) && !doNotHash.includes(key);\n}\n\ntype HashableValue = WalkerOS.AnyObject | unknown | unknown[];\n\nasync function processValue(\n value: unknown,\n shouldHash: boolean,\n): Promise<unknown> {\n if (!shouldHash) return value;\n if (isArray(value)) {\n return Promise.all(value.map((item) => getHashServer(String(item))));\n }\n return getHashServer(String(value));\n}\n\nexport async function hashEvent<T extends HashableValue>(\n value: T,\n doNotHash: string[] = [],\n): Promise<T> {\n if (!isObject(value)) return value;\n\n const isUserData = 'user_data' in value;\n const target = (isUserData ? value.user_data : value) as WalkerOS.AnyObject;\n\n const entries = await Promise.all(\n Object.entries(target).map(async ([k, v]) => [\n k,\n await processValue(v, isUserData && shouldBeHashed(k, doNotHash)),\n ]),\n );\n\n const result = entries.reduce((acc, [k, v]) => {\n if (isString(k)) acc[k] = v;\n return acc;\n }, {} as WalkerOS.AnyObject);\n\n return isUserData ? { ...value, user_data: result } : (result as T);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer, sendServer } from '@walkeros/server-core';\n\nexport interface Settings {\n accessToken: string;\n adAccountId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test?: boolean;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n partner_name?: string;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport interface Env extends DestinationServer.Env {\n sendServer?: typeof sendServer;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\n\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\n\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n\n// Pinterest Conversions API types\n// https://developers.pinterest.com/docs/conversions/conversions/\n\nexport type ActionSource = 'app_android' | 'app_ios' | 'web' | 'offline';\n\nexport type EventName =\n | 'add_payment_info'\n | 'add_to_cart'\n | 'add_to_wishlist'\n | 'app_install'\n | 'app_open'\n | 'checkout'\n | 'contact'\n | 'custom'\n | 'customize_product'\n | 'find_location'\n | 'initiate_checkout'\n | 'lead'\n | 'page_visit'\n | 'schedule'\n | 'search'\n | 'signup'\n | 'start_trial'\n | 'submit_application'\n | 'subscribe'\n | 'view_category'\n | 'view_content'\n | 'watch_video'\n | string;\n\nexport interface ConversionEvent {\n // Required\n event_name: EventName;\n event_time: number;\n event_id: string;\n action_source: ActionSource;\n user_data: UserData;\n\n // Optional\n event_source_url?: string;\n opt_out?: boolean;\n partner_name?: string;\n app_id?: string;\n app_name?: string;\n app_version?: string;\n device_brand?: string;\n device_carrier?: string;\n device_model?: string;\n device_type?: string;\n os_version?: string;\n language?: string;\n wifi?: boolean;\n custom_data?: CustomData;\n}\n\nexport interface UserData {\n // Hashable fields (SHA-256, arrays)\n em?: string[];\n ph?: string[];\n fn?: string[];\n ln?: string[];\n db?: string[];\n ge?: string[];\n ct?: string[];\n st?: string[];\n zp?: string[];\n country?: string[];\n external_id?: string[];\n hashed_maids?: string[];\n\n // Pass-through fields (do NOT hash)\n client_ip_address?: string;\n client_user_agent?: string;\n click_id?: string;\n partner_id?: string;\n}\n\nexport interface CustomData {\n currency?: string;\n value?: string;\n content_ids?: string[];\n content_name?: string;\n content_category?: string;\n content_brand?: string;\n contents?: ContentItem[];\n num_items?: number;\n order_id?: string;\n search_string?: string;\n opt_out_type?: string;\n np?: string;\n predicted_ltv?: string;\n}\n\nexport interface ContentItem {\n id?: string;\n item_name?: string;\n item_category?: string;\n item_brand?: string;\n item_price?: string;\n quantity?: number;\n}\n\nexport interface RequestBody {\n data: ConversionEvent[];\n}\n\nexport interface ResponseBody {\n num_events_received: number;\n num_events_processed: number;\n events: Array<{\n status: string;\n error_message?: string;\n warning_message?: string;\n }>;\n}\n","import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationPinterest from './types';\n\nexport const destinationPinterest: Destination = {\n type: 'pinterest',\n\n config: {},\n\n async init({ config: partialConfig, logger }) {\n const config = getConfig(partialConfig, logger);\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n};\n\nexport default destinationPinterest;\n"],"mappings":";AAGO,SAAS,UACd,gBAA+B,CAAC,GAChC,QACQ;AACR,QAAM,WAAY,cAAc,YAAY,CAAC;AAC7C,QAAM,EAAE,aAAa,YAAY,IAAI;AAErC,MAAI,CAAC,YAAa,QAAO,MAAM,qCAAqC;AACpE,MAAI,CAAC,YAAa,QAAO,MAAM,qCAAqC;AAEpE,QAAM,iBAA2B;AAAA,IAC/B,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,eAAe,UAAU,eAAe;AACtD;;;ACnBA,SAAS,iBAAiB,YAAAA,iBAAgB;AAC1C,SAAS,kBAAkB;;;ACD3B,SAAS,SAAS,UAAU,gBAAgB;AAC5C,SAAS,qBAAqB;AAE9B,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAe,KAAa,YAAsB,CAAC,GAAY;AACtE,SAAO,WAAW,SAAS,GAAG,KAAK,CAAC,UAAU,SAAS,GAAG;AAC5D;AAIA,eAAe,aACb,OACA,YACkB;AAClB,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,QAAQ,KAAK,GAAG;AAClB,WAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,cAAc,OAAO,IAAI,CAAC,CAAC,CAAC;AAAA,EACrE;AACA,SAAO,cAAc,OAAO,KAAK,CAAC;AACpC;AAEA,eAAsB,UACpB,OACA,YAAsB,CAAC,GACX;AACZ,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,aAAa,eAAe;AAClC,QAAM,SAAU,aAAa,MAAM,YAAY;AAE/C,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,OAAO,QAAQ,MAAM,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;AAAA,MAC3C;AAAA,MACA,MAAM,aAAa,GAAG,cAAc,eAAe,GAAG,SAAS,CAAC;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,QAAQ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;AAC7C,QAAI,SAAS,CAAC,EAAG,KAAI,CAAC,IAAI;AAC1B,WAAO;AAAA,EACT,GAAG,CAAC,CAAuB;AAE3B,SAAO,aAAa,EAAE,GAAG,OAAO,WAAW,OAAO,IAAK;AACzD;;;ADrDO,IAAM,OAAe,eAC1B,OACA,EAAE,QAAQ,MAAM,KAAK,QAAQ,UAAU,GACvC;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,IAAI,OAAO;AAEX,QAAM,YAAYC,UAAS,IAAI,IAAI,OAAO,CAAC;AAC3C,QAAM,aAAa,OAAO,OACtB,MAAM,gBAAgB,OAAO,OAAO,MAAM,EAAE,UAAU,CAAC,IACvD,CAAC;AACL,QAAM,iBAAiB,YACnB,MAAM,gBAAgB,OAAO,EAAE,KAAK,UAAU,GAAG,EAAE,UAAU,CAAC,IAC9D,CAAC;AAGL,QAAM,WAAqB;AAAA;AAAA,IAEzB,GAAIA,UAAS,UAAU,KAAKA,UAAS,WAAW,SAAS,IACrD,WAAW,YACX,CAAC;AAAA;AAAA,IAEL,GAAIA,UAAS,cAAc,IAAI,iBAAiB,CAAC;AAAA;AAAA,IAEjD,GAAIA,UAAS,UAAU,SAAS,IAAI,UAAU,YAAY,CAAC;AAAA,EAC7D;AAGA,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,cAA+B;AAAA,IACnC,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,IAChB,YAAY,KAAK,OAAO,MAAM,aAAa,KAAK,IAAI,KAAK,GAAI;AAAA,IAC7D;AAAA,IACA,GAAG;AAAA,IACH,WAAW;AAAA,EACb;AAGA,MAAIA,UAAS,eAAe,GAAG;AAC7B,gBAAY,cAAc;AAAA,EAC5B;AAGA,MAAI,kBAAkB,SAAS,MAAM,QAAQ,KAAK;AAChD,gBAAY,mBAAmB,MAAM,OAAO;AAAA,EAC9C;AAGA,MAAI,cAAc;AAChB,gBAAY,eAAe;AAAA,EAC7B;AAEA,QAAM,oBAAoB,MAAM,UAAU,aAAa,SAAS;AAEhE,QAAM,OAAoB,EAAE,MAAM,CAAC,iBAAiB,EAAE;AAGtD,QAAM,YAAY,OAAO,eAAe;AACxC,QAAM,WAAW,GAAG,GAAG,eAAe,WAAW,UAAU,SAAS;AAEpE,SAAO,MAAM,yBAAyB;AAAA,IACpC;AAAA,IACA,QAAQ;AAAA,IACR,WAAW,YAAY;AAAA,IACvB,SAAS,YAAY;AAAA,EACvB,CAAC;AAED,QAAM,eAAe,KAAK,cAAc;AACxC,QAAM,SAAS,MAAM,aAAa,UAAU,KAAK,UAAU,IAAI,GAAG;AAAA,IAChE,SAAS,EAAE,eAAe,UAAU,WAAW,GAAG;AAAA,EACpD,CAAC;AAED,SAAO,MAAM,0BAA0B;AAAA,IACrC,IAAIA,UAAS,MAAM,IAAI,OAAO,KAAK;AAAA,EACrC,CAAC;AAED,MAAIA,UAAS,MAAM,KAAK,OAAO,OAAO,OAAO;AAC3C,WAAO,MAAM,wBAAwB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EAC/D;AACF;;;AElGA;;;ACOO,IAAM,uBAAoC;AAAA,EAC/C,MAAM;AAAA,EAEN,QAAQ,CAAC;AAAA,EAET,MAAM,KAAK,EAAE,QAAQ,eAAe,OAAO,GAAG;AAC5C,UAAM,SAAS,UAAU,eAAe,MAAM;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,OAAO,SAAS;AACzB,WAAO,MAAM,KAAK,OAAO,OAAO;AAAA,EAClC;AACF;AAEA,IAAO,gBAAQ;","names":["isObject","isObject"]}
|
package/dist/walkerOS.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/server-destination-pinterest",
|
|
3
3
|
"description": "Pinterest server destination for walkerOS",
|
|
4
|
-
"version": "4.0.0
|
|
4
|
+
"version": "4.0.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"update": "npx npm-check-updates -u && npm update"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@walkeros/core": "4.0.0
|
|
38
|
-
"@walkeros/server-core": "4.0.0
|
|
37
|
+
"@walkeros/core": "4.0.0",
|
|
38
|
+
"@walkeros/server-core": "4.0.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@walkeros/collector": "4.0.0
|
|
41
|
+
"@walkeros/collector": "4.0.0"
|
|
42
42
|
},
|
|
43
43
|
"repository": {
|
|
44
44
|
"url": "git+https://github.com/elbwalker/walkerOS.git",
|