@walkeros/server-destination-linkedin 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 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,{DestinationLinkedIn:()=>types_exports,default:()=>index_default,destinationLinkedIn:()=>destinationLinkedIn}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core=require("@walkeros/core"),import_server_core=require("@walkeros/server-core"),import_server_core2=require("@walkeros/server-core"),types_exports={},destinationLinkedIn={type:"linkedin",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,conversionRuleId:conversionRuleId}=settings;accessToken||logger.throw("Config settings accessToken missing"),conversionRuleId||logger.throw("Config settings conversionRuleId missing");const settingsConfig={...settings,accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:settings.apiVersion||"202604"};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await async function(event,{config:config,rule:rule,data:data,env:env,logger:logger}){const{accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:apiVersion="202604",doNotHash:doNotHash,url:url="https://api.linkedin.com/rest/",user_data:user_data}=config.settings,userDataCustom=user_data?await(0,import_core.getMappingValue)(event,{map:user_data}):{},eventData=(0,import_core.isObject)(data)?data:{},userData={...(0,import_core.isObject)(userDataCustom)?userDataCustom:{},...(0,import_core.isObject)(eventData.user_data)?eventData.user_data:{}},email=(0,import_core.isString)(userData.email)?userData.email:(0,import_core.isString)(event.user.email)?event.user.email:void 0,userIds=[];if(email){const normalizedEmail=email.trim().toLowerCase(),idValue=doNotHash?.includes("email")?normalizedEmail:await(0,import_server_core2.getHashServer)(normalizedEmail);userIds.push({idType:"SHA256_EMAIL",idValue:idValue})}const liFatIdRaw=userData.li_fat_id,liFatId=(0,import_core.isString)(liFatIdRaw)?liFatIdRaw:(0,import_core.isArray)(liFatIdRaw)&&(0,import_core.isString)(liFatIdRaw[0])?liFatIdRaw[0]:void 0;if(liFatId&&userIds.push({idType:"LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID",idValue:liFatId}),0===userIds.length)return;let userInfo;const firstName=userData.firstName,lastName=userData.lastName;(0,import_core.isString)(firstName)&&(0,import_core.isString)(lastName)&&firstName&&lastName&&(userInfo={firstName:firstName,lastName:lastName},(0,import_core.isString)(userData.title)&&userData.title&&(userInfo.title=userData.title),(0,import_core.isString)(userData.companyName)&&userData.companyName&&(userInfo.companyName=userData.companyName),(0,import_core.isString)(userData.countryCode)&&userData.countryCode&&(userInfo.countryCode=userData.countryCode));const mappingSettings=rule?.settings||{},conversionResolved=mappingSettings.conversion?await(0,import_core.getMappingValue)(event,mappingSettings.conversion):void 0,conversionOverride=(0,import_core.isObject)(conversionResolved)?conversionResolved:{},conversion=`urn:lla:llaPartnerConversion:${(0,import_core.isString)(conversionOverride.ruleId)?conversionOverride.ruleId:conversionRuleId}`;let conversionValue;const valueRaw=conversionOverride.value,currencyRaw=conversionOverride.currency;null!=valueRaw&&(conversionValue={currencyCode:(0,import_core.isString)(currencyRaw)?currencyRaw:"USD",amount:String(valueRaw)});const conversionEvent={conversion:conversion,conversionHappenedAt:event.timestamp,user:{userIds:userIds,...userInfo?{userInfo:userInfo}:{}},eventId:event.id};conversionValue&&(conversionEvent.conversionValue=conversionValue);const body={elements:[conversionEvent]},endpoint=`${url}conversionEvents`;logger.debug("Calling LinkedIn API",{endpoint:endpoint,method:"POST",conversion:conversion,eventId:event.id});const sendServerFn=env?.sendServer||import_server_core.sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/json","X-Restli-Protocol-Version":"2.0.0","X-RestLi-Method":"BATCH_CREATE","Linkedin-Version":apiVersion}});logger.debug("LinkedIn API response",{ok:!(0,import_core.isObject)(result)||result.ok}),(0,import_core.isObject)(result)&&!1===result.ok&&logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`)}(event,context)},index_default=destinationLinkedIn;//# 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,{DestinationLinkedIn:()=>types_exports,default:()=>index_default,destinationLinkedIn:()=>destinationLinkedIn}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core=require("@walkeros/core"),import_server_core=require("@walkeros/server-core"),import_server_core2=require("@walkeros/server-core"),types_exports={},destinationLinkedIn={type:"linkedin",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,conversionRuleId:conversionRuleId}=settings;accessToken||logger.throw("Config settings accessToken missing"),conversionRuleId||logger.throw("Config settings conversionRuleId missing");const settingsConfig={...settings,accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:settings.apiVersion||"202604"};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await async function(event,{config:config,rule:rule,data:data,env:env,logger:logger,collector:collector}){const{accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:apiVersion="202604",doNotHash:doNotHash,url:url="https://api.linkedin.com/rest/",user_data:user_data}=config.settings,userDataCustom=user_data?await(0,import_core.getMappingValue)(event,{map:user_data},{collector:collector}):{},eventData=(0,import_core.isObject)(data)?data:{},userData={...(0,import_core.isObject)(userDataCustom)?userDataCustom:{},...(0,import_core.isObject)(eventData.user_data)?eventData.user_data:{}},email=(0,import_core.isString)(userData.email)?userData.email:(0,import_core.isString)(event.user.email)?event.user.email:void 0,userIds=[];if(email){const normalizedEmail=email.trim().toLowerCase(),idValue=doNotHash?.includes("email")?normalizedEmail:await(0,import_server_core2.getHashServer)(normalizedEmail);userIds.push({idType:"SHA256_EMAIL",idValue:idValue})}const liFatIdRaw=userData.li_fat_id,liFatId=(0,import_core.isString)(liFatIdRaw)?liFatIdRaw:(0,import_core.isArray)(liFatIdRaw)&&(0,import_core.isString)(liFatIdRaw[0])?liFatIdRaw[0]:void 0;if(liFatId&&userIds.push({idType:"LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID",idValue:liFatId}),0===userIds.length)return;let userInfo;const firstName=userData.firstName,lastName=userData.lastName;(0,import_core.isString)(firstName)&&(0,import_core.isString)(lastName)&&firstName&&lastName&&(userInfo={firstName:firstName,lastName:lastName},(0,import_core.isString)(userData.title)&&userData.title&&(userInfo.title=userData.title),(0,import_core.isString)(userData.companyName)&&userData.companyName&&(userInfo.companyName=userData.companyName),(0,import_core.isString)(userData.countryCode)&&userData.countryCode&&(userInfo.countryCode=userData.countryCode));const mappingSettings=rule?.settings||{},conversionResolved=mappingSettings.conversion?await(0,import_core.getMappingValue)(event,mappingSettings.conversion,{collector:collector}):void 0,conversionOverride=(0,import_core.isObject)(conversionResolved)?conversionResolved:{},conversion=`urn:lla:llaPartnerConversion:${(0,import_core.isString)(conversionOverride.ruleId)?conversionOverride.ruleId:conversionRuleId}`;let conversionValue;const valueRaw=conversionOverride.value,currencyRaw=conversionOverride.currency;null!=valueRaw&&(conversionValue={currencyCode:(0,import_core.isString)(currencyRaw)?currencyRaw:"USD",amount:String(valueRaw)});const conversionEvent={conversion:conversion,conversionHappenedAt:event.timestamp,user:{userIds:userIds,...userInfo?{userInfo:userInfo}:{}},eventId:event.id};conversionValue&&(conversionEvent.conversionValue=conversionValue);const body={elements:[conversionEvent]},endpoint=`${url}conversionEvents`;logger.debug("Calling LinkedIn API",{endpoint:endpoint,method:"POST",conversion:conversion,eventId:event.id});const sendServerFn=env?.sendServer||import_server_core.sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/json","X-Restli-Protocol-Version":"2.0.0","X-RestLi-Method":"BATCH_CREATE","Linkedin-Version":apiVersion}});logger.debug("LinkedIn API response",{ok:!(0,import_core.isObject)(result)||result.ok}),(0,import_core.isObject)(result)&&!1===result.ok&&logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`)}(event,context)},index_default=destinationLinkedIn;//# 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/types/index.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationLinkedIn from './types';\n\nexport const destinationLinkedIn: Destination = {\n type: 'linkedin',\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 destinationLinkedIn;\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, conversionRuleId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!conversionRuleId)\n logger.throw('Config settings conversionRuleId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n conversionRuleId,\n apiVersion: settings.apiVersion || '202604',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type {\n ConversionEvent,\n ConversionEventsRequest,\n ConversionValue,\n Env,\n Mapping,\n PushFn,\n UserIdentifier,\n UserInfo,\n} from './types';\nimport { getMappingValue, isArray, isObject, isString } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { getHashServer } from '@walkeros/server-core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, env, logger },\n) {\n const {\n accessToken,\n conversionRuleId,\n apiVersion = '202604',\n doNotHash,\n url = 'https://api.linkedin.com/rest/',\n user_data,\n } = config.settings!;\n\n // Resolve user data from settings-level mapping\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data })\n : {};\n\n // Merge user data sources: config mapping + event mapping data\n const eventData = isObject(data) ? data : {};\n const userData: Record<string, unknown> = {\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Always try to get email from event.user.email if not already mapped\n const email = isString(userData.email)\n ? userData.email\n : isString(event.user.email)\n ? event.user.email\n : undefined;\n\n // Build userIds array\n const userIds: UserIdentifier[] = [];\n\n // SHA256_EMAIL\n if (email) {\n const normalizedEmail = email.trim().toLowerCase();\n const shouldHash = !doNotHash?.includes('email');\n const idValue = shouldHash\n ? await getHashServer(normalizedEmail)\n : normalizedEmail;\n\n userIds.push({\n idType: 'SHA256_EMAIL',\n idValue,\n });\n }\n\n // LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID from li_fat_id\n // Handle both string and context tuple [value, order] formats\n const liFatIdRaw = userData.li_fat_id;\n const liFatId = isString(liFatIdRaw)\n ? liFatIdRaw\n : isArray(liFatIdRaw) && isString(liFatIdRaw[0])\n ? liFatIdRaw[0]\n : undefined;\n if (liFatId) {\n userIds.push({\n idType: 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID',\n idValue: liFatId,\n });\n }\n\n // Skip event if no user identifiers\n if (userIds.length === 0) return;\n\n // Build optional userInfo\n let userInfo: UserInfo | undefined;\n const firstName = userData.firstName;\n const lastName = userData.lastName;\n if (isString(firstName) && isString(lastName) && firstName && lastName) {\n userInfo = { firstName, lastName };\n if (isString(userData.title) && userData.title)\n userInfo.title = userData.title;\n if (isString(userData.companyName) && userData.companyName)\n userInfo.companyName = userData.companyName;\n if (isString(userData.countryCode) && userData.countryCode)\n userInfo.countryCode = userData.countryCode;\n }\n\n // Resolve per-event conversion override\n const mappingSettings = (rule?.settings || {}) as Mapping;\n const conversionResolved = mappingSettings.conversion\n ? await getMappingValue(event, mappingSettings.conversion)\n : undefined;\n const conversionOverride = isObject(conversionResolved)\n ? conversionResolved\n : {};\n\n // Build conversion URN\n const ruleId = isString(conversionOverride.ruleId)\n ? conversionOverride.ruleId\n : conversionRuleId;\n const conversion = `urn:lla:llaPartnerConversion:${ruleId}`;\n\n // Build conversion value\n let conversionValue: ConversionValue | undefined;\n const valueRaw = conversionOverride.value;\n const currencyRaw = conversionOverride.currency;\n if (valueRaw !== undefined && valueRaw !== null) {\n conversionValue = {\n currencyCode: isString(currencyRaw) ? currencyRaw : 'USD',\n amount: String(valueRaw),\n };\n }\n\n // Construct the conversion event\n const conversionEvent: ConversionEvent = {\n conversion,\n conversionHappenedAt: event.timestamp,\n user: {\n userIds,\n ...(userInfo ? { userInfo } : {}),\n },\n eventId: event.id,\n };\n\n if (conversionValue) {\n conversionEvent.conversionValue = conversionValue;\n }\n\n // Construct request body\n const body: ConversionEventsRequest = {\n elements: [conversionEvent],\n };\n\n const endpoint = `${url}conversionEvents`;\n\n logger.debug('Calling LinkedIn API', {\n endpoint,\n method: 'POST',\n conversion,\n eventId: event.id,\n });\n\n const sendServerFn = (env as Env)?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'X-Restli-Protocol-Version': '2.0.0',\n 'X-RestLi-Method': 'BATCH_CREATE',\n 'Linkedin-Version': apiVersion,\n },\n });\n\n logger.debug('LinkedIn API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`);\n }\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 conversionRuleId: string;\n apiVersion?: string;\n doNotHash?: string[];\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n conversion?: WalkerOSMapping.Value;\n}\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// LinkedIn API types\n\nexport type UserIdType =\n | 'SHA256_EMAIL'\n | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID'\n | 'ACXIOM_ID'\n | 'ORACLE_MOAT_ID';\n\nexport interface UserIdentifier {\n idType: UserIdType;\n idValue: string;\n}\n\nexport interface UserInfo {\n firstName: string;\n lastName: string;\n title?: string;\n companyName?: string;\n countryCode?: string;\n}\n\nexport interface ConversionUser {\n userIds: UserIdentifier[];\n userInfo?: UserInfo;\n}\n\nexport interface ConversionValue {\n currencyCode: string;\n amount: string;\n}\n\nexport interface ConversionEvent {\n conversion: string;\n conversionHappenedAt: number;\n conversionValue?: ConversionValue;\n user: ConversionUser;\n eventId?: string;\n}\n\nexport interface ConversionEventsRequest {\n elements: ConversionEvent[];\n}\n"],"mappings":"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","names":["import_server_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationLinkedIn from './types';\n\nexport const destinationLinkedIn: Destination = {\n type: 'linkedin',\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 destinationLinkedIn;\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, conversionRuleId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!conversionRuleId)\n logger.throw('Config settings conversionRuleId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n conversionRuleId,\n apiVersion: settings.apiVersion || '202604',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type {\n ConversionEvent,\n ConversionEventsRequest,\n ConversionValue,\n Env,\n Mapping,\n PushFn,\n UserIdentifier,\n UserInfo,\n} from './types';\nimport { getMappingValue, isArray, isObject, isString } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { getHashServer } from '@walkeros/server-core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, env, logger, collector },\n) {\n const {\n accessToken,\n conversionRuleId,\n apiVersion = '202604',\n doNotHash,\n url = 'https://api.linkedin.com/rest/',\n user_data,\n } = config.settings!;\n\n // Resolve user data from settings-level mapping\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data }, { collector })\n : {};\n\n // Merge user data sources: config mapping + event mapping data\n const eventData = isObject(data) ? data : {};\n const userData: Record<string, unknown> = {\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Always try to get email from event.user.email if not already mapped\n const email = isString(userData.email)\n ? userData.email\n : isString(event.user.email)\n ? event.user.email\n : undefined;\n\n // Build userIds array\n const userIds: UserIdentifier[] = [];\n\n // SHA256_EMAIL\n if (email) {\n const normalizedEmail = email.trim().toLowerCase();\n const shouldHash = !doNotHash?.includes('email');\n const idValue = shouldHash\n ? await getHashServer(normalizedEmail)\n : normalizedEmail;\n\n userIds.push({\n idType: 'SHA256_EMAIL',\n idValue,\n });\n }\n\n // LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID from li_fat_id\n // Handle both string and context tuple [value, order] formats\n const liFatIdRaw = userData.li_fat_id;\n const liFatId = isString(liFatIdRaw)\n ? liFatIdRaw\n : isArray(liFatIdRaw) && isString(liFatIdRaw[0])\n ? liFatIdRaw[0]\n : undefined;\n if (liFatId) {\n userIds.push({\n idType: 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID',\n idValue: liFatId,\n });\n }\n\n // Skip event if no user identifiers\n if (userIds.length === 0) return;\n\n // Build optional userInfo\n let userInfo: UserInfo | undefined;\n const firstName = userData.firstName;\n const lastName = userData.lastName;\n if (isString(firstName) && isString(lastName) && firstName && lastName) {\n userInfo = { firstName, lastName };\n if (isString(userData.title) && userData.title)\n userInfo.title = userData.title;\n if (isString(userData.companyName) && userData.companyName)\n userInfo.companyName = userData.companyName;\n if (isString(userData.countryCode) && userData.countryCode)\n userInfo.countryCode = userData.countryCode;\n }\n\n // Resolve per-event conversion override\n const mappingSettings = (rule?.settings || {}) as Mapping;\n const conversionResolved = mappingSettings.conversion\n ? await getMappingValue(event, mappingSettings.conversion, { collector })\n : undefined;\n const conversionOverride = isObject(conversionResolved)\n ? conversionResolved\n : {};\n\n // Build conversion URN\n const ruleId = isString(conversionOverride.ruleId)\n ? conversionOverride.ruleId\n : conversionRuleId;\n const conversion = `urn:lla:llaPartnerConversion:${ruleId}`;\n\n // Build conversion value\n let conversionValue: ConversionValue | undefined;\n const valueRaw = conversionOverride.value;\n const currencyRaw = conversionOverride.currency;\n if (valueRaw !== undefined && valueRaw !== null) {\n conversionValue = {\n currencyCode: isString(currencyRaw) ? currencyRaw : 'USD',\n amount: String(valueRaw),\n };\n }\n\n // Construct the conversion event\n const conversionEvent: ConversionEvent = {\n conversion,\n conversionHappenedAt: event.timestamp,\n user: {\n userIds,\n ...(userInfo ? { userInfo } : {}),\n },\n eventId: event.id,\n };\n\n if (conversionValue) {\n conversionEvent.conversionValue = conversionValue;\n }\n\n // Construct request body\n const body: ConversionEventsRequest = {\n elements: [conversionEvent],\n };\n\n const endpoint = `${url}conversionEvents`;\n\n logger.debug('Calling LinkedIn API', {\n endpoint,\n method: 'POST',\n conversion,\n eventId: event.id,\n });\n\n const sendServerFn = (env as Env)?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'X-Restli-Protocol-Version': '2.0.0',\n 'X-RestLi-Method': 'BATCH_CREATE',\n 'Linkedin-Version': apiVersion,\n },\n });\n\n logger.debug('LinkedIn API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`);\n }\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 conversionRuleId: string;\n apiVersion?: string;\n doNotHash?: string[];\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n conversion?: WalkerOSMapping.Value;\n}\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// LinkedIn API types\n\nexport type UserIdType =\n | 'SHA256_EMAIL'\n | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID'\n | 'ACXIOM_ID'\n | 'ORACLE_MOAT_ID';\n\nexport interface UserIdentifier {\n idType: UserIdType;\n idValue: string;\n}\n\nexport interface UserInfo {\n firstName: string;\n lastName: string;\n title?: string;\n companyName?: string;\n countryCode?: string;\n}\n\nexport interface ConversionUser {\n userIds: UserIdentifier[];\n userInfo?: UserInfo;\n}\n\nexport interface ConversionValue {\n currencyCode: string;\n amount: string;\n}\n\nexport interface ConversionEvent {\n conversion: string;\n conversionHappenedAt: number;\n conversionValue?: ConversionValue;\n user: ConversionUser;\n eventId?: string;\n}\n\nexport interface ConversionEventsRequest {\n elements: ConversionEvent[];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,SAAS,UACd,gBAA+B,CAAC,GAChC,QACQ;AACR,QAAM,WAAY,cAAc,YAAY,CAAC;AAC7C,QAAM,EAAE,aAAa,iBAAiB,IAAI;AAE1C,MAAI,CAAC,YAAa,QAAO,MAAM,qCAAqC;AACpE,MAAI,CAAC;AACH,WAAO,MAAM,0CAA0C;AAEzD,QAAM,iBAA2B;AAAA,IAC/B,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,YAAY,SAAS,cAAc;AAAA,EACrC;AAEA,SAAO,EAAE,GAAG,eAAe,UAAU,eAAe;AACtD;;;ACZA,kBAA6D;AAC7D,yBAA2B;AAC3B,IAAAA,sBAA8B;AAEvB,IAAM,OAAe,eAC1B,OACA,EAAE,QAAQ,MAAM,MAAM,KAAK,QAAQ,UAAU,GAC7C;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF,IAAI,OAAO;AAGX,QAAM,iBAAiB,YACnB,UAAM,6BAAgB,OAAO,EAAE,KAAK,UAAU,GAAG,EAAE,UAAU,CAAC,IAC9D,CAAC;AAGL,QAAM,gBAAY,sBAAS,IAAI,IAAI,OAAO,CAAC;AAC3C,QAAM,WAAoC;AAAA,IACxC,OAAI,sBAAS,cAAc,IAAI,iBAAiB,CAAC;AAAA,IACjD,OAAI,sBAAS,UAAU,SAAS,IAAI,UAAU,YAAY,CAAC;AAAA,EAC7D;AAGA,QAAM,YAAQ,sBAAS,SAAS,KAAK,IACjC,SAAS,YACT,sBAAS,MAAM,KAAK,KAAK,IACvB,MAAM,KAAK,QACX;AAGN,QAAM,UAA4B,CAAC;AAGnC,MAAI,OAAO;AACT,UAAM,kBAAkB,MAAM,KAAK,EAAE,YAAY;AACjD,UAAM,aAAa,CAAC,WAAW,SAAS,OAAO;AAC/C,UAAM,UAAU,aACZ,UAAM,mCAAc,eAAe,IACnC;AAEJ,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAIA,QAAM,aAAa,SAAS;AAC5B,QAAM,cAAU,sBAAS,UAAU,IAC/B,iBACA,qBAAQ,UAAU,SAAK,sBAAS,WAAW,CAAC,CAAC,IAC3C,WAAW,CAAC,IACZ;AACN,MAAI,SAAS;AACX,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI,QAAQ,WAAW,EAAG;AAG1B,MAAI;AACJ,QAAM,YAAY,SAAS;AAC3B,QAAM,WAAW,SAAS;AAC1B,UAAI,sBAAS,SAAS,SAAK,sBAAS,QAAQ,KAAK,aAAa,UAAU;AACtE,eAAW,EAAE,WAAW,SAAS;AACjC,YAAI,sBAAS,SAAS,KAAK,KAAK,SAAS;AACvC,eAAS,QAAQ,SAAS;AAC5B,YAAI,sBAAS,SAAS,WAAW,KAAK,SAAS;AAC7C,eAAS,cAAc,SAAS;AAClC,YAAI,sBAAS,SAAS,WAAW,KAAK,SAAS;AAC7C,eAAS,cAAc,SAAS;AAAA,EACpC;AAGA,QAAM,kBAAmB,MAAM,YAAY,CAAC;AAC5C,QAAM,qBAAqB,gBAAgB,aACvC,UAAM,6BAAgB,OAAO,gBAAgB,YAAY,EAAE,UAAU,CAAC,IACtE;AACJ,QAAM,yBAAqB,sBAAS,kBAAkB,IAClD,qBACA,CAAC;AAGL,QAAM,aAAS,sBAAS,mBAAmB,MAAM,IAC7C,mBAAmB,SACnB;AACJ,QAAM,aAAa,gCAAgC,MAAM;AAGzD,MAAI;AACJ,QAAM,WAAW,mBAAmB;AACpC,QAAM,cAAc,mBAAmB;AACvC,MAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,sBAAkB;AAAA,MAChB,kBAAc,sBAAS,WAAW,IAAI,cAAc;AAAA,MACpD,QAAQ,OAAO,QAAQ;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,kBAAmC;AAAA,IACvC;AAAA,IACA,sBAAsB,MAAM;AAAA,IAC5B,MAAM;AAAA,MACJ;AAAA,MACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,SAAS,MAAM;AAAA,EACjB;AAEA,MAAI,iBAAiB;AACnB,oBAAgB,kBAAkB;AAAA,EACpC;AAGA,QAAM,OAAgC;AAAA,IACpC,UAAU,CAAC,eAAe;AAAA,EAC5B;AAEA,QAAM,WAAW,GAAG,GAAG;AAEvB,SAAO,MAAM,wBAAwB;AAAA,IACnC;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,SAAS,MAAM;AAAA,EACjB,CAAC;AAED,QAAM,eAAgB,KAAa,cAAc;AACjD,QAAM,SAAS,MAAM,aAAa,UAAU,KAAK,UAAU,IAAI,GAAG;AAAA,IAChE,SAAS;AAAA,MACP,eAAe,UAAU,WAAW;AAAA,MACpC,gBAAgB;AAAA,MAChB,6BAA6B;AAAA,MAC7B,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,IACtB;AAAA,EACF,CAAC;AAED,SAAO,MAAM,yBAAyB;AAAA,IACpC,QAAI,sBAAS,MAAM,IAAI,OAAO,KAAK;AAAA,EACrC,CAAC;AAED,UAAI,sBAAS,MAAM,KAAK,OAAO,OAAO,OAAO;AAC3C,WAAO,MAAM,uBAAuB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EAC9D;AACF;;;ACxKA;;;AHOO,IAAM,sBAAmC;AAAA,EAC9C,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":["import_server_core"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{getMappingValue,isArray,isObject,isString}from"@walkeros/core";import{sendServer}from"@walkeros/server-core";import{getHashServer}from"@walkeros/server-core";var types_exports={},destinationLinkedIn={type:"linkedin",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,conversionRuleId:conversionRuleId}=settings;accessToken||logger.throw("Config settings accessToken missing"),conversionRuleId||logger.throw("Config settings conversionRuleId missing");const settingsConfig={...settings,accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:settings.apiVersion||"202604"};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await async function(event,{config:config,rule:rule,data:data,env:env,logger:logger}){const{accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:apiVersion="202604",doNotHash:doNotHash,url:url="https://api.linkedin.com/rest/",user_data:user_data}=config.settings,userDataCustom=user_data?await getMappingValue(event,{map:user_data}):{},eventData=isObject(data)?data:{},userData={...isObject(userDataCustom)?userDataCustom:{},...isObject(eventData.user_data)?eventData.user_data:{}},email=isString(userData.email)?userData.email:isString(event.user.email)?event.user.email:void 0,userIds=[];if(email){const normalizedEmail=email.trim().toLowerCase(),idValue=doNotHash?.includes("email")?normalizedEmail:await getHashServer(normalizedEmail);userIds.push({idType:"SHA256_EMAIL",idValue:idValue})}const liFatIdRaw=userData.li_fat_id,liFatId=isString(liFatIdRaw)?liFatIdRaw:isArray(liFatIdRaw)&&isString(liFatIdRaw[0])?liFatIdRaw[0]:void 0;if(liFatId&&userIds.push({idType:"LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID",idValue:liFatId}),0===userIds.length)return;let userInfo;const firstName=userData.firstName,lastName=userData.lastName;isString(firstName)&&isString(lastName)&&firstName&&lastName&&(userInfo={firstName:firstName,lastName:lastName},isString(userData.title)&&userData.title&&(userInfo.title=userData.title),isString(userData.companyName)&&userData.companyName&&(userInfo.companyName=userData.companyName),isString(userData.countryCode)&&userData.countryCode&&(userInfo.countryCode=userData.countryCode));const mappingSettings=rule?.settings||{},conversionResolved=mappingSettings.conversion?await getMappingValue(event,mappingSettings.conversion):void 0,conversionOverride=isObject(conversionResolved)?conversionResolved:{},conversion=`urn:lla:llaPartnerConversion:${isString(conversionOverride.ruleId)?conversionOverride.ruleId:conversionRuleId}`;let conversionValue;const valueRaw=conversionOverride.value,currencyRaw=conversionOverride.currency;null!=valueRaw&&(conversionValue={currencyCode:isString(currencyRaw)?currencyRaw:"USD",amount:String(valueRaw)});const conversionEvent={conversion:conversion,conversionHappenedAt:event.timestamp,user:{userIds:userIds,...userInfo?{userInfo:userInfo}:{}},eventId:event.id};conversionValue&&(conversionEvent.conversionValue=conversionValue);const body={elements:[conversionEvent]},endpoint=`${url}conversionEvents`;logger.debug("Calling LinkedIn API",{endpoint:endpoint,method:"POST",conversion:conversion,eventId:event.id});const sendServerFn=env?.sendServer||sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/json","X-Restli-Protocol-Version":"2.0.0","X-RestLi-Method":"BATCH_CREATE","Linkedin-Version":apiVersion}});logger.debug("LinkedIn API response",{ok:!isObject(result)||result.ok}),isObject(result)&&!1===result.ok&&logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`)}(event,context)},index_default=destinationLinkedIn;export{types_exports as DestinationLinkedIn,index_default as default,destinationLinkedIn};//# sourceMappingURL=index.mjs.map
1
+ import{getMappingValue,isArray,isObject,isString}from"@walkeros/core";import{sendServer}from"@walkeros/server-core";import{getHashServer}from"@walkeros/server-core";var types_exports={},destinationLinkedIn={type:"linkedin",config:{},async init({config:partialConfig,logger:logger}){const config=function(partialConfig={},logger){const settings=partialConfig.settings||{},{accessToken:accessToken,conversionRuleId:conversionRuleId}=settings;accessToken||logger.throw("Config settings accessToken missing"),conversionRuleId||logger.throw("Config settings conversionRuleId missing");const settingsConfig={...settings,accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:settings.apiVersion||"202604"};return{...partialConfig,settings:settingsConfig}}(partialConfig,logger);return config},push:async(event,context)=>await async function(event,{config:config,rule:rule,data:data,env:env,logger:logger,collector:collector}){const{accessToken:accessToken,conversionRuleId:conversionRuleId,apiVersion:apiVersion="202604",doNotHash:doNotHash,url:url="https://api.linkedin.com/rest/",user_data:user_data}=config.settings,userDataCustom=user_data?await getMappingValue(event,{map:user_data},{collector:collector}):{},eventData=isObject(data)?data:{},userData={...isObject(userDataCustom)?userDataCustom:{},...isObject(eventData.user_data)?eventData.user_data:{}},email=isString(userData.email)?userData.email:isString(event.user.email)?event.user.email:void 0,userIds=[];if(email){const normalizedEmail=email.trim().toLowerCase(),idValue=doNotHash?.includes("email")?normalizedEmail:await getHashServer(normalizedEmail);userIds.push({idType:"SHA256_EMAIL",idValue:idValue})}const liFatIdRaw=userData.li_fat_id,liFatId=isString(liFatIdRaw)?liFatIdRaw:isArray(liFatIdRaw)&&isString(liFatIdRaw[0])?liFatIdRaw[0]:void 0;if(liFatId&&userIds.push({idType:"LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID",idValue:liFatId}),0===userIds.length)return;let userInfo;const firstName=userData.firstName,lastName=userData.lastName;isString(firstName)&&isString(lastName)&&firstName&&lastName&&(userInfo={firstName:firstName,lastName:lastName},isString(userData.title)&&userData.title&&(userInfo.title=userData.title),isString(userData.companyName)&&userData.companyName&&(userInfo.companyName=userData.companyName),isString(userData.countryCode)&&userData.countryCode&&(userInfo.countryCode=userData.countryCode));const mappingSettings=rule?.settings||{},conversionResolved=mappingSettings.conversion?await getMappingValue(event,mappingSettings.conversion,{collector:collector}):void 0,conversionOverride=isObject(conversionResolved)?conversionResolved:{},conversion=`urn:lla:llaPartnerConversion:${isString(conversionOverride.ruleId)?conversionOverride.ruleId:conversionRuleId}`;let conversionValue;const valueRaw=conversionOverride.value,currencyRaw=conversionOverride.currency;null!=valueRaw&&(conversionValue={currencyCode:isString(currencyRaw)?currencyRaw:"USD",amount:String(valueRaw)});const conversionEvent={conversion:conversion,conversionHappenedAt:event.timestamp,user:{userIds:userIds,...userInfo?{userInfo:userInfo}:{}},eventId:event.id};conversionValue&&(conversionEvent.conversionValue=conversionValue);const body={elements:[conversionEvent]},endpoint=`${url}conversionEvents`;logger.debug("Calling LinkedIn API",{endpoint:endpoint,method:"POST",conversion:conversion,eventId:event.id});const sendServerFn=env?.sendServer||sendServer,result=await sendServerFn(endpoint,JSON.stringify(body),{headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/json","X-Restli-Protocol-Version":"2.0.0","X-RestLi-Method":"BATCH_CREATE","Linkedin-Version":apiVersion}});logger.debug("LinkedIn API response",{ok:!isObject(result)||result.ok}),isObject(result)&&!1===result.ok&&logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`)}(event,context)},index_default=destinationLinkedIn;export{types_exports as DestinationLinkedIn,index_default as default,destinationLinkedIn};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/push.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, conversionRuleId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!conversionRuleId)\n logger.throw('Config settings conversionRuleId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n conversionRuleId,\n apiVersion: settings.apiVersion || '202604',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type {\n ConversionEvent,\n ConversionEventsRequest,\n ConversionValue,\n Env,\n Mapping,\n PushFn,\n UserIdentifier,\n UserInfo,\n} from './types';\nimport { getMappingValue, isArray, isObject, isString } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { getHashServer } from '@walkeros/server-core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, env, logger },\n) {\n const {\n accessToken,\n conversionRuleId,\n apiVersion = '202604',\n doNotHash,\n url = 'https://api.linkedin.com/rest/',\n user_data,\n } = config.settings!;\n\n // Resolve user data from settings-level mapping\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data })\n : {};\n\n // Merge user data sources: config mapping + event mapping data\n const eventData = isObject(data) ? data : {};\n const userData: Record<string, unknown> = {\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Always try to get email from event.user.email if not already mapped\n const email = isString(userData.email)\n ? userData.email\n : isString(event.user.email)\n ? event.user.email\n : undefined;\n\n // Build userIds array\n const userIds: UserIdentifier[] = [];\n\n // SHA256_EMAIL\n if (email) {\n const normalizedEmail = email.trim().toLowerCase();\n const shouldHash = !doNotHash?.includes('email');\n const idValue = shouldHash\n ? await getHashServer(normalizedEmail)\n : normalizedEmail;\n\n userIds.push({\n idType: 'SHA256_EMAIL',\n idValue,\n });\n }\n\n // LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID from li_fat_id\n // Handle both string and context tuple [value, order] formats\n const liFatIdRaw = userData.li_fat_id;\n const liFatId = isString(liFatIdRaw)\n ? liFatIdRaw\n : isArray(liFatIdRaw) && isString(liFatIdRaw[0])\n ? liFatIdRaw[0]\n : undefined;\n if (liFatId) {\n userIds.push({\n idType: 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID',\n idValue: liFatId,\n });\n }\n\n // Skip event if no user identifiers\n if (userIds.length === 0) return;\n\n // Build optional userInfo\n let userInfo: UserInfo | undefined;\n const firstName = userData.firstName;\n const lastName = userData.lastName;\n if (isString(firstName) && isString(lastName) && firstName && lastName) {\n userInfo = { firstName, lastName };\n if (isString(userData.title) && userData.title)\n userInfo.title = userData.title;\n if (isString(userData.companyName) && userData.companyName)\n userInfo.companyName = userData.companyName;\n if (isString(userData.countryCode) && userData.countryCode)\n userInfo.countryCode = userData.countryCode;\n }\n\n // Resolve per-event conversion override\n const mappingSettings = (rule?.settings || {}) as Mapping;\n const conversionResolved = mappingSettings.conversion\n ? await getMappingValue(event, mappingSettings.conversion)\n : undefined;\n const conversionOverride = isObject(conversionResolved)\n ? conversionResolved\n : {};\n\n // Build conversion URN\n const ruleId = isString(conversionOverride.ruleId)\n ? conversionOverride.ruleId\n : conversionRuleId;\n const conversion = `urn:lla:llaPartnerConversion:${ruleId}`;\n\n // Build conversion value\n let conversionValue: ConversionValue | undefined;\n const valueRaw = conversionOverride.value;\n const currencyRaw = conversionOverride.currency;\n if (valueRaw !== undefined && valueRaw !== null) {\n conversionValue = {\n currencyCode: isString(currencyRaw) ? currencyRaw : 'USD',\n amount: String(valueRaw),\n };\n }\n\n // Construct the conversion event\n const conversionEvent: ConversionEvent = {\n conversion,\n conversionHappenedAt: event.timestamp,\n user: {\n userIds,\n ...(userInfo ? { userInfo } : {}),\n },\n eventId: event.id,\n };\n\n if (conversionValue) {\n conversionEvent.conversionValue = conversionValue;\n }\n\n // Construct request body\n const body: ConversionEventsRequest = {\n elements: [conversionEvent],\n };\n\n const endpoint = `${url}conversionEvents`;\n\n logger.debug('Calling LinkedIn API', {\n endpoint,\n method: 'POST',\n conversion,\n eventId: event.id,\n });\n\n const sendServerFn = (env as Env)?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'X-Restli-Protocol-Version': '2.0.0',\n 'X-RestLi-Method': 'BATCH_CREATE',\n 'Linkedin-Version': apiVersion,\n },\n });\n\n logger.debug('LinkedIn API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`);\n }\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 conversionRuleId: string;\n apiVersion?: string;\n doNotHash?: string[];\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n conversion?: WalkerOSMapping.Value;\n}\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// LinkedIn API types\n\nexport type UserIdType =\n | 'SHA256_EMAIL'\n | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID'\n | 'ACXIOM_ID'\n | 'ORACLE_MOAT_ID';\n\nexport interface UserIdentifier {\n idType: UserIdType;\n idValue: string;\n}\n\nexport interface UserInfo {\n firstName: string;\n lastName: string;\n title?: string;\n companyName?: string;\n countryCode?: string;\n}\n\nexport interface ConversionUser {\n userIds: UserIdentifier[];\n userInfo?: UserInfo;\n}\n\nexport interface ConversionValue {\n currencyCode: string;\n amount: string;\n}\n\nexport interface ConversionEvent {\n conversion: string;\n conversionHappenedAt: number;\n conversionValue?: ConversionValue;\n user: ConversionUser;\n eventId?: string;\n}\n\nexport interface ConversionEventsRequest {\n elements: ConversionEvent[];\n}\n","import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationLinkedIn from './types';\n\nexport const destinationLinkedIn: Destination = {\n type: 'linkedin',\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 destinationLinkedIn;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/config.ts","../src/push.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, conversionRuleId } = settings;\n\n if (!accessToken) logger.throw('Config settings accessToken missing');\n if (!conversionRuleId)\n logger.throw('Config settings conversionRuleId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n conversionRuleId,\n apiVersion: settings.apiVersion || '202604',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type {\n ConversionEvent,\n ConversionEventsRequest,\n ConversionValue,\n Env,\n Mapping,\n PushFn,\n UserIdentifier,\n UserInfo,\n} from './types';\nimport { getMappingValue, isArray, isObject, isString } from '@walkeros/core';\nimport { sendServer } from '@walkeros/server-core';\nimport { getHashServer } from '@walkeros/server-core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, env, logger, collector },\n) {\n const {\n accessToken,\n conversionRuleId,\n apiVersion = '202604',\n doNotHash,\n url = 'https://api.linkedin.com/rest/',\n user_data,\n } = config.settings!;\n\n // Resolve user data from settings-level mapping\n const userDataCustom = user_data\n ? await getMappingValue(event, { map: user_data }, { collector })\n : {};\n\n // Merge user data sources: config mapping + event mapping data\n const eventData = isObject(data) ? data : {};\n const userData: Record<string, unknown> = {\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n // Always try to get email from event.user.email if not already mapped\n const email = isString(userData.email)\n ? userData.email\n : isString(event.user.email)\n ? event.user.email\n : undefined;\n\n // Build userIds array\n const userIds: UserIdentifier[] = [];\n\n // SHA256_EMAIL\n if (email) {\n const normalizedEmail = email.trim().toLowerCase();\n const shouldHash = !doNotHash?.includes('email');\n const idValue = shouldHash\n ? await getHashServer(normalizedEmail)\n : normalizedEmail;\n\n userIds.push({\n idType: 'SHA256_EMAIL',\n idValue,\n });\n }\n\n // LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID from li_fat_id\n // Handle both string and context tuple [value, order] formats\n const liFatIdRaw = userData.li_fat_id;\n const liFatId = isString(liFatIdRaw)\n ? liFatIdRaw\n : isArray(liFatIdRaw) && isString(liFatIdRaw[0])\n ? liFatIdRaw[0]\n : undefined;\n if (liFatId) {\n userIds.push({\n idType: 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID',\n idValue: liFatId,\n });\n }\n\n // Skip event if no user identifiers\n if (userIds.length === 0) return;\n\n // Build optional userInfo\n let userInfo: UserInfo | undefined;\n const firstName = userData.firstName;\n const lastName = userData.lastName;\n if (isString(firstName) && isString(lastName) && firstName && lastName) {\n userInfo = { firstName, lastName };\n if (isString(userData.title) && userData.title)\n userInfo.title = userData.title;\n if (isString(userData.companyName) && userData.companyName)\n userInfo.companyName = userData.companyName;\n if (isString(userData.countryCode) && userData.countryCode)\n userInfo.countryCode = userData.countryCode;\n }\n\n // Resolve per-event conversion override\n const mappingSettings = (rule?.settings || {}) as Mapping;\n const conversionResolved = mappingSettings.conversion\n ? await getMappingValue(event, mappingSettings.conversion, { collector })\n : undefined;\n const conversionOverride = isObject(conversionResolved)\n ? conversionResolved\n : {};\n\n // Build conversion URN\n const ruleId = isString(conversionOverride.ruleId)\n ? conversionOverride.ruleId\n : conversionRuleId;\n const conversion = `urn:lla:llaPartnerConversion:${ruleId}`;\n\n // Build conversion value\n let conversionValue: ConversionValue | undefined;\n const valueRaw = conversionOverride.value;\n const currencyRaw = conversionOverride.currency;\n if (valueRaw !== undefined && valueRaw !== null) {\n conversionValue = {\n currencyCode: isString(currencyRaw) ? currencyRaw : 'USD',\n amount: String(valueRaw),\n };\n }\n\n // Construct the conversion event\n const conversionEvent: ConversionEvent = {\n conversion,\n conversionHappenedAt: event.timestamp,\n user: {\n userIds,\n ...(userInfo ? { userInfo } : {}),\n },\n eventId: event.id,\n };\n\n if (conversionValue) {\n conversionEvent.conversionValue = conversionValue;\n }\n\n // Construct request body\n const body: ConversionEventsRequest = {\n elements: [conversionEvent],\n };\n\n const endpoint = `${url}conversionEvents`;\n\n logger.debug('Calling LinkedIn API', {\n endpoint,\n method: 'POST',\n conversion,\n eventId: event.id,\n });\n\n const sendServerFn = (env as Env)?.sendServer || sendServer;\n const result = await sendServerFn(endpoint, JSON.stringify(body), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'X-Restli-Protocol-Version': '2.0.0',\n 'X-RestLi-Method': 'BATCH_CREATE',\n 'Linkedin-Version': apiVersion,\n },\n });\n\n logger.debug('LinkedIn API response', {\n ok: isObject(result) ? result.ok : true,\n });\n\n if (isObject(result) && result.ok === false) {\n logger.throw(`LinkedIn API error: ${JSON.stringify(result)}`);\n }\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 conversionRuleId: string;\n apiVersion?: string;\n doNotHash?: string[];\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n conversion?: WalkerOSMapping.Value;\n}\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// LinkedIn API types\n\nexport type UserIdType =\n | 'SHA256_EMAIL'\n | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID'\n | 'ACXIOM_ID'\n | 'ORACLE_MOAT_ID';\n\nexport interface UserIdentifier {\n idType: UserIdType;\n idValue: string;\n}\n\nexport interface UserInfo {\n firstName: string;\n lastName: string;\n title?: string;\n companyName?: string;\n countryCode?: string;\n}\n\nexport interface ConversionUser {\n userIds: UserIdentifier[];\n userInfo?: UserInfo;\n}\n\nexport interface ConversionValue {\n currencyCode: string;\n amount: string;\n}\n\nexport interface ConversionEvent {\n conversion: string;\n conversionHappenedAt: number;\n conversionValue?: ConversionValue;\n user: ConversionUser;\n eventId?: string;\n}\n\nexport interface ConversionEventsRequest {\n elements: ConversionEvent[];\n}\n","import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationLinkedIn from './types';\n\nexport const destinationLinkedIn: Destination = {\n type: 'linkedin',\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 destinationLinkedIn;\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-destination-linkedin",
4
- "version": "4.0.0-next-1777463920154",
4
+ "version": "4.0.0",
5
5
  "type": "destination",
6
6
  "platform": [
7
7
  "server"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-destination-linkedin",
3
3
  "description": "LinkedIn Conversions API server destination for walkerOS",
4
- "version": "4.0.0-next-1777463920154",
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-next-1777463920154",
38
- "@walkeros/server-core": "4.0.0-next-1777463920154"
37
+ "@walkeros/core": "4.0.0",
38
+ "@walkeros/server-core": "4.0.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@walkeros/collector": "4.0.0-next-1777463920154"
41
+ "@walkeros/collector": "4.0.0"
42
42
  },
43
43
  "repository": {
44
44
  "url": "git+https://github.com/elbwalker/walkerOS.git",