@walkeros/server-destination-meta 0.1.2 → 0.2.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/examples/index.d.mts +18 -1
- package/dist/examples/index.d.ts +18 -1
- package/dist/examples/index.js +21 -0
- package/dist/examples/index.mjs +20 -0
- package/dist/index.d.mts +32 -16
- package/dist/index.d.ts +32 -16
- 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/package.json +3 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Mapping as Mapping$1 } from '@walkeros/core';
|
|
2
|
+
import { DestinationServer, sendServer } from '@walkeros/server-core';
|
|
2
3
|
|
|
3
4
|
interface Settings {
|
|
4
5
|
accessToken: string;
|
|
@@ -11,6 +12,9 @@ interface Settings {
|
|
|
11
12
|
}
|
|
12
13
|
interface Mapping {
|
|
13
14
|
}
|
|
15
|
+
interface Env extends DestinationServer.Env {
|
|
16
|
+
sendServer?: typeof sendServer;
|
|
17
|
+
}
|
|
14
18
|
type Rule = Mapping$1.Rule<Mapping>;
|
|
15
19
|
interface BodyParameters {
|
|
16
20
|
data: Array<ServerEventParameters>;
|
|
@@ -269,6 +273,19 @@ interface OriginalEventDataParameters {
|
|
|
269
273
|
event_id?: string;
|
|
270
274
|
}
|
|
271
275
|
|
|
276
|
+
/**
|
|
277
|
+
* Standard mock environment for push operations
|
|
278
|
+
*
|
|
279
|
+
* Use this for testing Meta Conversions API events without making
|
|
280
|
+
* actual HTTP requests to Facebook's servers.
|
|
281
|
+
*/
|
|
282
|
+
declare const push: Env;
|
|
283
|
+
|
|
284
|
+
declare const env_push: typeof push;
|
|
285
|
+
declare namespace env {
|
|
286
|
+
export { env_push as push };
|
|
287
|
+
}
|
|
288
|
+
|
|
272
289
|
declare function Purchase$1(): BodyParameters;
|
|
273
290
|
|
|
274
291
|
declare namespace events {
|
|
@@ -290,4 +307,4 @@ declare namespace mapping {
|
|
|
290
307
|
export { mapping_InitUserData as InitUserData, mapping_Purchase as Purchase, mapping_config as config };
|
|
291
308
|
}
|
|
292
309
|
|
|
293
|
-
export { events, mapping };
|
|
310
|
+
export { env, events, mapping };
|
package/dist/examples/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Mapping as Mapping$1 } from '@walkeros/core';
|
|
2
|
+
import { DestinationServer, sendServer } from '@walkeros/server-core';
|
|
2
3
|
|
|
3
4
|
interface Settings {
|
|
4
5
|
accessToken: string;
|
|
@@ -11,6 +12,9 @@ interface Settings {
|
|
|
11
12
|
}
|
|
12
13
|
interface Mapping {
|
|
13
14
|
}
|
|
15
|
+
interface Env extends DestinationServer.Env {
|
|
16
|
+
sendServer?: typeof sendServer;
|
|
17
|
+
}
|
|
14
18
|
type Rule = Mapping$1.Rule<Mapping>;
|
|
15
19
|
interface BodyParameters {
|
|
16
20
|
data: Array<ServerEventParameters>;
|
|
@@ -269,6 +273,19 @@ interface OriginalEventDataParameters {
|
|
|
269
273
|
event_id?: string;
|
|
270
274
|
}
|
|
271
275
|
|
|
276
|
+
/**
|
|
277
|
+
* Standard mock environment for push operations
|
|
278
|
+
*
|
|
279
|
+
* Use this for testing Meta Conversions API events without making
|
|
280
|
+
* actual HTTP requests to Facebook's servers.
|
|
281
|
+
*/
|
|
282
|
+
declare const push: Env;
|
|
283
|
+
|
|
284
|
+
declare const env_push: typeof push;
|
|
285
|
+
declare namespace env {
|
|
286
|
+
export { env_push as push };
|
|
287
|
+
}
|
|
288
|
+
|
|
272
289
|
declare function Purchase$1(): BodyParameters;
|
|
273
290
|
|
|
274
291
|
declare namespace events {
|
|
@@ -290,4 +307,4 @@ declare namespace mapping {
|
|
|
290
307
|
export { mapping_InitUserData as InitUserData, mapping_Purchase as Purchase, mapping_config as config };
|
|
291
308
|
}
|
|
292
309
|
|
|
293
|
-
export { events, mapping };
|
|
310
|
+
export { env, events, mapping };
|
package/dist/examples/index.js
CHANGED
|
@@ -20,11 +20,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/examples/index.ts
|
|
21
21
|
var examples_exports = {};
|
|
22
22
|
__export(examples_exports, {
|
|
23
|
+
env: () => env_exports,
|
|
23
24
|
events: () => events_exports,
|
|
24
25
|
mapping: () => mapping_exports
|
|
25
26
|
});
|
|
26
27
|
module.exports = __toCommonJS(examples_exports);
|
|
27
28
|
|
|
29
|
+
// src/examples/env.ts
|
|
30
|
+
var env_exports = {};
|
|
31
|
+
__export(env_exports, {
|
|
32
|
+
push: () => push
|
|
33
|
+
});
|
|
34
|
+
async function mockSendServer(url, data, options) {
|
|
35
|
+
return {
|
|
36
|
+
ok: true,
|
|
37
|
+
data: {
|
|
38
|
+
events_received: 1,
|
|
39
|
+
messages: [],
|
|
40
|
+
fbtrace_id: "mock-trace-id"
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
var push = {
|
|
45
|
+
sendServer: mockSendServer
|
|
46
|
+
};
|
|
47
|
+
|
|
28
48
|
// src/examples/events.ts
|
|
29
49
|
var events_exports = {};
|
|
30
50
|
__export(events_exports, {
|
|
@@ -109,6 +129,7 @@ var config = {
|
|
|
109
129
|
};
|
|
110
130
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
131
|
0 && (module.exports = {
|
|
132
|
+
env,
|
|
112
133
|
events,
|
|
113
134
|
mapping
|
|
114
135
|
});
|
package/dist/examples/index.mjs
CHANGED
|
@@ -4,6 +4,25 @@ var __export = (target, all) => {
|
|
|
4
4
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
// src/examples/env.ts
|
|
8
|
+
var env_exports = {};
|
|
9
|
+
__export(env_exports, {
|
|
10
|
+
push: () => push
|
|
11
|
+
});
|
|
12
|
+
async function mockSendServer(url, data, options) {
|
|
13
|
+
return {
|
|
14
|
+
ok: true,
|
|
15
|
+
data: {
|
|
16
|
+
events_received: 1,
|
|
17
|
+
messages: [],
|
|
18
|
+
fbtrace_id: "mock-trace-id"
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
var push = {
|
|
23
|
+
sendServer: mockSendServer
|
|
24
|
+
};
|
|
25
|
+
|
|
7
26
|
// src/examples/events.ts
|
|
8
27
|
var events_exports = {};
|
|
9
28
|
__export(events_exports, {
|
|
@@ -87,6 +106,7 @@ var config = {
|
|
|
87
106
|
order: { complete: Purchase2 }
|
|
88
107
|
};
|
|
89
108
|
export {
|
|
109
|
+
env_exports as env,
|
|
90
110
|
events_exports as events,
|
|
91
111
|
mapping_exports as mapping
|
|
92
112
|
};
|
package/dist/index.d.mts
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
import { Mapping as Mapping$1 } from '@walkeros/core';
|
|
1
|
+
import { Destination as Destination$1, Mapping as Mapping$1 } from '@walkeros/core';
|
|
2
2
|
import { DestinationServer, sendServer } from '@walkeros/server-core';
|
|
3
3
|
|
|
4
|
-
interface Destination extends DestinationServer.Destination<Settings, Mapping> {
|
|
5
|
-
init: DestinationServer.InitFn<Settings, Mapping>;
|
|
6
|
-
}
|
|
7
|
-
type Config = {
|
|
8
|
-
settings: Settings;
|
|
9
|
-
} & DestinationServer.Config<Settings, Mapping>;
|
|
10
|
-
type InitFn = DestinationServer.InitFn<Settings, Mapping>;
|
|
11
|
-
type PushFn = DestinationServer.PushFn<Settings, Mapping>;
|
|
12
|
-
type PartialConfig = DestinationServer.PartialConfig<Settings, Mapping>;
|
|
13
|
-
type PushEvents = DestinationServer.PushEvents<Mapping>;
|
|
14
4
|
interface Settings {
|
|
15
5
|
accessToken: string;
|
|
16
6
|
pixelId: string;
|
|
@@ -22,9 +12,20 @@ interface Settings {
|
|
|
22
12
|
}
|
|
23
13
|
interface Mapping {
|
|
24
14
|
}
|
|
25
|
-
interface
|
|
26
|
-
sendServer
|
|
15
|
+
interface Env extends DestinationServer.Env {
|
|
16
|
+
sendServer?: typeof sendServer;
|
|
27
17
|
}
|
|
18
|
+
type Types = Destination$1.Types<Settings, Mapping, Env>;
|
|
19
|
+
interface Destination extends DestinationServer.Destination<Types> {
|
|
20
|
+
init: DestinationServer.InitFn<Types>;
|
|
21
|
+
}
|
|
22
|
+
type Config = {
|
|
23
|
+
settings: Settings;
|
|
24
|
+
} & DestinationServer.Config<Types>;
|
|
25
|
+
type InitFn = DestinationServer.InitFn<Types>;
|
|
26
|
+
type PushFn = DestinationServer.PushFn<Types>;
|
|
27
|
+
type PartialConfig = DestinationServer.PartialConfig<Types>;
|
|
28
|
+
type PushEvents = DestinationServer.PushEvents<Mapping>;
|
|
28
29
|
type Rule = Mapping$1.Rule<Mapping>;
|
|
29
30
|
type Rules = Mapping$1.Rules<Rule>;
|
|
30
31
|
interface BodyParameters {
|
|
@@ -292,7 +293,7 @@ type index$1_CustomerInformationParameters = CustomerInformationParameters;
|
|
|
292
293
|
type index$1_CustomerSegmentation = CustomerSegmentation;
|
|
293
294
|
type index$1_DataProcessingOption = DataProcessingOption;
|
|
294
295
|
type index$1_Destination = Destination;
|
|
295
|
-
type index$
|
|
296
|
+
type index$1_Env = Env;
|
|
296
297
|
type index$1_EventName = EventName;
|
|
297
298
|
type index$1_InitFn = InitFn;
|
|
298
299
|
type index$1_Mapping = Mapping;
|
|
@@ -305,8 +306,22 @@ type index$1_Rules = Rules;
|
|
|
305
306
|
type index$1_ServerEventParameters = ServerEventParameters;
|
|
306
307
|
type index$1_Settings = Settings;
|
|
307
308
|
type index$1_StandardParameters = StandardParameters;
|
|
309
|
+
type index$1_Types = Types;
|
|
308
310
|
declare namespace index$1 {
|
|
309
|
-
export type { index$1_ActionSource as ActionSource, index$1_AppData as AppData, index$1_BodyParameters as BodyParameters, index$1_Config as Config, index$1_CustomerInformationParameters as CustomerInformationParameters, index$1_CustomerSegmentation as CustomerSegmentation, index$1_DataProcessingOption as DataProcessingOption, index$1_Destination as Destination, index$
|
|
311
|
+
export type { index$1_ActionSource as ActionSource, index$1_AppData as AppData, index$1_BodyParameters as BodyParameters, index$1_Config as Config, index$1_CustomerInformationParameters as CustomerInformationParameters, index$1_CustomerSegmentation as CustomerSegmentation, index$1_DataProcessingOption as DataProcessingOption, index$1_Destination as Destination, index$1_Env as Env, index$1_EventName as EventName, index$1_InitFn as InitFn, index$1_Mapping as Mapping, index$1_OriginalEventDataParameters as OriginalEventDataParameters, index$1_PartialConfig as PartialConfig, index$1_PushEvents as PushEvents, index$1_PushFn as PushFn, index$1_Rule as Rule, index$1_Rules as Rules, index$1_ServerEventParameters as ServerEventParameters, index$1_Settings as Settings, index$1_StandardParameters as StandardParameters, index$1_Types as Types };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Standard mock environment for push operations
|
|
316
|
+
*
|
|
317
|
+
* Use this for testing Meta Conversions API events without making
|
|
318
|
+
* actual HTTP requests to Facebook's servers.
|
|
319
|
+
*/
|
|
320
|
+
declare const push: Env;
|
|
321
|
+
|
|
322
|
+
declare const env_push: typeof push;
|
|
323
|
+
declare namespace env {
|
|
324
|
+
export { env_push as push };
|
|
310
325
|
}
|
|
311
326
|
|
|
312
327
|
declare function Purchase$1(): BodyParameters;
|
|
@@ -330,10 +345,11 @@ declare namespace mapping {
|
|
|
330
345
|
export { mapping_InitUserData as InitUserData, mapping_Purchase as Purchase, mapping_config as config };
|
|
331
346
|
}
|
|
332
347
|
|
|
348
|
+
declare const index_env: typeof env;
|
|
333
349
|
declare const index_events: typeof events;
|
|
334
350
|
declare const index_mapping: typeof mapping;
|
|
335
351
|
declare namespace index {
|
|
336
|
-
export { index_events as events, index_mapping as mapping };
|
|
352
|
+
export { index_env as env, index_events as events, index_mapping as mapping };
|
|
337
353
|
}
|
|
338
354
|
|
|
339
355
|
declare const destinationMeta: Destination;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
import { Mapping as Mapping$1 } from '@walkeros/core';
|
|
1
|
+
import { Destination as Destination$1, Mapping as Mapping$1 } from '@walkeros/core';
|
|
2
2
|
import { DestinationServer, sendServer } from '@walkeros/server-core';
|
|
3
3
|
|
|
4
|
-
interface Destination extends DestinationServer.Destination<Settings, Mapping> {
|
|
5
|
-
init: DestinationServer.InitFn<Settings, Mapping>;
|
|
6
|
-
}
|
|
7
|
-
type Config = {
|
|
8
|
-
settings: Settings;
|
|
9
|
-
} & DestinationServer.Config<Settings, Mapping>;
|
|
10
|
-
type InitFn = DestinationServer.InitFn<Settings, Mapping>;
|
|
11
|
-
type PushFn = DestinationServer.PushFn<Settings, Mapping>;
|
|
12
|
-
type PartialConfig = DestinationServer.PartialConfig<Settings, Mapping>;
|
|
13
|
-
type PushEvents = DestinationServer.PushEvents<Mapping>;
|
|
14
4
|
interface Settings {
|
|
15
5
|
accessToken: string;
|
|
16
6
|
pixelId: string;
|
|
@@ -22,9 +12,20 @@ interface Settings {
|
|
|
22
12
|
}
|
|
23
13
|
interface Mapping {
|
|
24
14
|
}
|
|
25
|
-
interface
|
|
26
|
-
sendServer
|
|
15
|
+
interface Env extends DestinationServer.Env {
|
|
16
|
+
sendServer?: typeof sendServer;
|
|
27
17
|
}
|
|
18
|
+
type Types = Destination$1.Types<Settings, Mapping, Env>;
|
|
19
|
+
interface Destination extends DestinationServer.Destination<Types> {
|
|
20
|
+
init: DestinationServer.InitFn<Types>;
|
|
21
|
+
}
|
|
22
|
+
type Config = {
|
|
23
|
+
settings: Settings;
|
|
24
|
+
} & DestinationServer.Config<Types>;
|
|
25
|
+
type InitFn = DestinationServer.InitFn<Types>;
|
|
26
|
+
type PushFn = DestinationServer.PushFn<Types>;
|
|
27
|
+
type PartialConfig = DestinationServer.PartialConfig<Types>;
|
|
28
|
+
type PushEvents = DestinationServer.PushEvents<Mapping>;
|
|
28
29
|
type Rule = Mapping$1.Rule<Mapping>;
|
|
29
30
|
type Rules = Mapping$1.Rules<Rule>;
|
|
30
31
|
interface BodyParameters {
|
|
@@ -292,7 +293,7 @@ type index$1_CustomerInformationParameters = CustomerInformationParameters;
|
|
|
292
293
|
type index$1_CustomerSegmentation = CustomerSegmentation;
|
|
293
294
|
type index$1_DataProcessingOption = DataProcessingOption;
|
|
294
295
|
type index$1_Destination = Destination;
|
|
295
|
-
type index$
|
|
296
|
+
type index$1_Env = Env;
|
|
296
297
|
type index$1_EventName = EventName;
|
|
297
298
|
type index$1_InitFn = InitFn;
|
|
298
299
|
type index$1_Mapping = Mapping;
|
|
@@ -305,8 +306,22 @@ type index$1_Rules = Rules;
|
|
|
305
306
|
type index$1_ServerEventParameters = ServerEventParameters;
|
|
306
307
|
type index$1_Settings = Settings;
|
|
307
308
|
type index$1_StandardParameters = StandardParameters;
|
|
309
|
+
type index$1_Types = Types;
|
|
308
310
|
declare namespace index$1 {
|
|
309
|
-
export type { index$1_ActionSource as ActionSource, index$1_AppData as AppData, index$1_BodyParameters as BodyParameters, index$1_Config as Config, index$1_CustomerInformationParameters as CustomerInformationParameters, index$1_CustomerSegmentation as CustomerSegmentation, index$1_DataProcessingOption as DataProcessingOption, index$1_Destination as Destination, index$
|
|
311
|
+
export type { index$1_ActionSource as ActionSource, index$1_AppData as AppData, index$1_BodyParameters as BodyParameters, index$1_Config as Config, index$1_CustomerInformationParameters as CustomerInformationParameters, index$1_CustomerSegmentation as CustomerSegmentation, index$1_DataProcessingOption as DataProcessingOption, index$1_Destination as Destination, index$1_Env as Env, index$1_EventName as EventName, index$1_InitFn as InitFn, index$1_Mapping as Mapping, index$1_OriginalEventDataParameters as OriginalEventDataParameters, index$1_PartialConfig as PartialConfig, index$1_PushEvents as PushEvents, index$1_PushFn as PushFn, index$1_Rule as Rule, index$1_Rules as Rules, index$1_ServerEventParameters as ServerEventParameters, index$1_Settings as Settings, index$1_StandardParameters as StandardParameters, index$1_Types as Types };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Standard mock environment for push operations
|
|
316
|
+
*
|
|
317
|
+
* Use this for testing Meta Conversions API events without making
|
|
318
|
+
* actual HTTP requests to Facebook's servers.
|
|
319
|
+
*/
|
|
320
|
+
declare const push: Env;
|
|
321
|
+
|
|
322
|
+
declare const env_push: typeof push;
|
|
323
|
+
declare namespace env {
|
|
324
|
+
export { env_push as push };
|
|
310
325
|
}
|
|
311
326
|
|
|
312
327
|
declare function Purchase$1(): BodyParameters;
|
|
@@ -330,10 +345,11 @@ declare namespace mapping {
|
|
|
330
345
|
export { mapping_InitUserData as InitUserData, mapping_Purchase as Purchase, mapping_config as config };
|
|
331
346
|
}
|
|
332
347
|
|
|
348
|
+
declare const index_env: typeof env;
|
|
333
349
|
declare const index_events: typeof events;
|
|
334
350
|
declare const index_mapping: typeof mapping;
|
|
335
351
|
declare namespace index {
|
|
336
|
-
export { index_events as events, index_mapping as mapping };
|
|
352
|
+
export { index_env as env, index_events as events, index_mapping as mapping };
|
|
337
353
|
}
|
|
338
354
|
|
|
339
355
|
declare const destinationMeta: Destination;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,i=(e,r)=>{for(var a in r)t(e,a,{get:r[a],enumerable:!0})},s={};i(s,{DestinationMeta:()=>
|
|
1
|
+
"use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,i=(e,r)=>{for(var a in r)t(e,a,{get:r[a],enumerable:!0})},s={};i(s,{DestinationMeta:()=>_,default:()=>N,destinationMeta:()=>P,examples:()=>b}),module.exports=(e=s,((e,i,s,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let o of a(i))n.call(e,o)||o===s||t(e,o,{get:()=>i[o],enumerable:!(c=r(i,o))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=require("@walkeros/core");var o=require("@walkeros/core"),d=require("@walkeros/server-core"),u=require("@walkeros/core"),l=require("@walkeros/server-core"),p=["em","ph","fn","ln","db","ge","ct","st","zp","country","external_id"];function m(e,t=[]){return p.includes(e)&&!t.includes(e)}async function v(e,t){return t?(0,u.isArray)(e)?Promise.all(e.map(e=>(0,l.getHashServer)(String(e)))):(0,l.getHashServer)(String(e)):e}var f=async function(e,{config:t,mapping:r,data:a,collector:n,env:i}){var s;const{accessToken:c,pixelId:l,action_source:p="website",doNotHash:f,test_event_code:_,url:b="https://graph.facebook.com/v22.0/",user_data:g}=t.settings,y=(0,o.isObject)(a)?a:{},w=t.data?await(0,o.getMappingValue)(e,t.data):{},k=g?await(0,o.getMappingValue)(e,{map:g}):{},h={...(0,o.isObject)(w)&&(0,o.isObject)(w.user_data)?w.user_data:{},...(0,o.isObject)(k)?k:{},...(0,o.isObject)(y.user_data)?y.user_data:{}};h.fbclid&&(h.fbc=function(e,t){if(!e)return;const r="fb",a="1",n=t||Date.now();return`${r}.${a}.${n}.${e}`}(h.fbclid,(null==(s=null==n?void 0:n.session)?void 0:s.start)||e.timestamp),delete h.fbclid);const O={event_name:e.name,event_id:e.id,event_time:Math.round((e.timestamp||Date.now())/1e3),action_source:p,...y,user_data:h};"website"===p&&(O.event_source_url=e.source.id);const j=await async function(e,t=[]){if(!(0,u.isObject)(e))return e;const r="user_data"in e,a=r?e.user_data:e,n=(await Promise.all(Object.entries(a).map(async([e,a])=>[e,await v(a,r&&m(e,t))]))).reduce((e,[t,r])=>((0,u.isString)(t)&&(e[t]=r),e),{});return r?{...e,user_data:n}:n}(O,f),S={data:[j]};_&&(S.test_event_code=_);const q=(null==i?void 0:i.sendServer)||d.sendServer,x=await q(`${b}${l}/events?access_token=${c}`,JSON.stringify(S));if((0,o.isObject)(x)&&!1===x.ok)throw new Error(JSON.stringify(x))};var _={},b={};i(b,{env:()=>g,events:()=>w,mapping:()=>O});var g={};i(g,{push:()=>y});var y={sendServer:async function(e,t,r){return{ok:!0,data:{events_received:1,messages:[],fbtrace_id:"mock-trace-id"}}}},w={};i(w,{Purchase:()=>h});var k=require("@walkeros/core");function h(){const e=(0,k.getEvent)("order complete");return{data:[{event_name:"Purchase",event_time:e.timestamp/1e3,event_id:e.id,event_source_url:e.source.id,action_source:"website",user_data:{external_id:["cc8e27118413234d4297ed00a02711365312c79325df9b5b8f4199cbd0b96e7e","9176e6f336dbdb4f99b0e45cbd7e41e0e2323812b236822842a61ffbd362ac8c"]},order_id:String(e.data.id),currency:"EUR",value:Number(e.data.total),contents:e.nested.filter(e=>"product"===e.entity).map(e=>({id:String(e.data.id),quantity:Number(e.data.quantity)||1,item_price:Number(e.data.price)})),num_items:2}]}}var O={};i(O,{InitUserData:()=>S,Purchase:()=>q,config:()=>x});var j=require("@walkeros/core"),S={pixelId:"p1x3l1d",accessToken:"s3cr3t",user_data:{external_id:{set:["user.device","user.session"]}}},q={name:"Purchase",data:{map:{order_id:"data.id",currency:{key:"data.currency",value:"EUR"},value:"data.total",contents:{loop:["nested",{condition:e=>(0,j.isObject)(e)&&"product"===e.entity,map:{id:"data.id",item_price:"data.price",quantity:{key:"data.quantity",value:1}}}]},num_items:{fn:e=>e.nested.filter(e=>"product"===e.entity).length}}}},x={order:{complete:q}},P={type:"meta",config:{},async init({config:e}){const t=function(e={}){const t=e.settings||{},{accessToken:r,pixelId:a}=t;r||(0,c.throwError)("Config settings accessToken missing"),a||(0,c.throwError)("Config settings pixelId missing");const n={...t,accessToken:r,pixelId:a};return{...e,settings:n}}(e);return t},push:async(e,{config:t,mapping:r,data:a,collector:n,env:i})=>await f(e,{config:t,mapping:r,data:a,collector:n,env:i})},N=P;//# 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","../src/examples/index.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\nimport { sendServer } from '@walkeros/server-core';\n\n// Types\nexport * as DestinationMeta from './types';\n\n// Examples\nexport * as examples from './examples';\n\nexport const destinationMeta: Destination = {\n type: 'meta',\n\n config: {},\n\n // Default environment with sendServer function\n env: {\n sendServer,\n },\n\n async init({ config: partialConfig }) {\n const config = getConfig(partialConfig);\n return config;\n },\n\n async push(event, { config, mapping, data, collector, env }) {\n return await push(event, { config, mapping, data, collector, env });\n },\n};\n\nexport default destinationMeta;\n","import type { Config, Settings, PartialConfig } from './types';\nimport { throwError } from '@walkeros/core';\n\nexport function getConfig(partialConfig: PartialConfig = {}): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, pixelId } = settings;\n\n if (!accessToken) throwError('Config settings accessToken missing');\n if (!pixelId) throwError('Config settings pixelId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n pixelId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n BodyParameters,\n CustomerInformationParameters,\n PushFn,\n ServerEventParameters,\n Environment,\n} 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, mapping, data, collector, env },\n) {\n const {\n accessToken,\n pixelId,\n action_source = 'website',\n doNotHash,\n test_event_code,\n url = 'https://graph.facebook.com/v22.0/',\n user_data,\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 const userData: CustomerInformationParameters = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n if (userData.fbclid) {\n userData.fbc = formatClickId(\n userData.fbclid,\n collector?.session?.start || event.timestamp,\n );\n delete userData.fbclid;\n }\n const serverEvent: ServerEventParameters = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...eventData,\n user_data: userData,\n };\n\n if (action_source === 'website')\n serverEvent.event_source_url = event.source.id;\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: BodyParameters = { data: [hashedServerEvent] };\n\n // Test event code\n if (test_event_code) body.test_event_code = test_event_code;\n\n const { sendServer } = env as unknown as Environment;\n const result = await sendServer(\n `${url}${pixelId}/events?access_token=${accessToken}`,\n JSON.stringify(body),\n );\n\n if (isObject(result) && result.ok === false)\n throw new Error(JSON.stringify(result));\n};\n\nfunction formatClickId(clickId: unknown, time?: number): string | undefined {\n // https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc#2--format-clickid\n\n if (!clickId) return;\n\n // Version is always \"fb\"\n const version = 'fb';\n\n // Subdomain ('com' = 0, 'example.com' = 1, 'www.example.com' = 2)\n const subdomainIndex = '1';\n\n // Get the current timestamp in milliseconds (or when the fbclid was observed)\n const creationTime = time || Date.now();\n\n return `${version}.${subdomainIndex}.${creationTime}.${clickId}`;\n}\n\nfunction lower(str: WalkerOS.Property): string {\n return String(str).toLocaleLowerCase();\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];\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 { Mapping as WalkerOSMapping } from '@walkeros/core';\nimport type { DestinationServer, sendServer } from '@walkeros/server-core';\n\nexport interface Destination\n extends DestinationServer.Destination<Settings, Mapping> {\n init: DestinationServer.InitFn<Settings, Mapping>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Settings, Mapping>;\n\nexport type InitFn = DestinationServer.InitFn<Settings, Mapping>;\nexport type PushFn = DestinationServer.PushFn<Settings, Mapping>;\n\nexport type PartialConfig = DestinationServer.PartialConfig<Settings, Mapping>;\n\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\n\nexport interface Settings {\n accessToken: string;\n pixelId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test_event_code?: string;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\n\nexport interface Mapping {}\n\nexport interface Environment {\n sendServer: typeof sendServer;\n}\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/main-body\nexport interface BodyParameters {\n data: Array<ServerEventParameters>;\n test_event_code?: string;\n}\n\n/**\n * Represents the top‑level parameters for a server event sent via Meta's Conversions API.\n * https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/server-event\n */\nexport interface ServerEventParameters extends StandardParameters {\n /** The event name or custom event identifier. Required for deduplication. */\n event_name: EventName;\n\n /** Unix timestamp (in seconds) when the event actually occurred. GMT timezone. */\n event_time: number;\n\n /** Map of customer information for matching (emails, phone, etc.). */\n user_data: CustomerInformationParameters;\n\n /** Additional business data about the event. */\n custom_data?: Record<string, unknown>;\n\n /** URL of the page where the event occurred. */\n event_source_url?: string;\n\n /** If true, exclude this event from ads optimization (only attribution). */\n opt_out?: boolean;\n\n /** Unique ID for deduplication across Pixel and CAPI. */\n event_id?: string;\n\n /** Source of the event (e.g., website, app). */\n action_source: ActionSource;\n\n /** Processing options (e.g., ['LDU'] for CCPA limited data use). */\n data_processing_options?: DataProcessingOption[];\n\n /** Country code for data processing option (1 = USA, 0 = auto‑geolocate). */\n data_processing_options_country?: number;\n\n /** State code for data processing option (1000 = California, 0 = auto). */\n data_processing_options_state?: number;\n\n /** App‑specific data (required if action_source is 'app'). */\n app_data?: AppData;\n\n /** HTTP referrer header of the event. */\n referrer_url?: string;\n\n /** Metadata to link delayed events to past acquisition events. */\n original_event_data?: OriginalEventDataParameters;\n\n /** User segment for more context about the customer's relationship. */\n customer_segmentation?: CustomerSegmentation;\n}\n\nexport type EventName =\n | 'AddPaymentInfo'\n | 'AddToCart'\n | 'AddToWishlist'\n | 'CompleteRegistration'\n | 'Contact'\n | 'CustomizeProduct'\n | 'Donate'\n | 'FindLocation'\n | 'InitiateCheckout'\n | 'Lead'\n | 'Purchase'\n | 'Schedule'\n | 'Search'\n | 'StartTrial'\n | 'SubmitApplication'\n | 'Subscribe'\n | 'ViewContent'\n | string;\n\nexport type ActionSource =\n | 'email'\n | 'website'\n | 'app'\n | 'phone_call'\n | 'chat'\n | 'physical_store'\n | 'system_generated'\n | 'business_messaging'\n | 'other';\n\nexport type DataProcessingOption = 'LDU';\n\nexport type CustomerSegmentation =\n | 'new_customer_to_business'\n | 'new_customer_to_business_line'\n | 'new_customer_to_product_area'\n | 'new_customer_to_medium'\n | 'existing_customer_to_business'\n | 'existing_customer_to_business_line'\n | 'existing_customer_to_product_area'\n | 'existing_customer_to_medium'\n | 'customer_in_loyalty_program';\n\n/** Extended device info for app events (Android version 'a2', iOS 'i2') */\nexport interface AppData {\n /**\n * Comma-separated array of strings with fixed order:\n * [sdk_version, os_version, device_model, device_brand,\n * screen_width, screen_height, ...]\n */\n extinfo: string[];\n}\n\n// Customer Information Parameters\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters\nexport interface CustomerInformationParameters {\n /** Email(s), SHA-256 hashed, lowercase and trimmed */\n em?: string | string[];\n\n /** Phone number(s), SHA-256 hashed, E.164 format (no leading 0s or symbols) */\n ph?: string | string[];\n\n /** First name(s), SHA-256 hashed, lowercase */\n fn?: string | string[];\n\n /** Last name(s), SHA-256 hashed, lowercase */\n ln?: string | string[];\n\n /** Date(s) of birth in YYYYMMDD, SHA-256 hashed */\n db?: string | string[];\n\n /** Gender(s) in lowercase single letter (\"m\", \"f\", etc.), SHA-256 hashed */\n ge?: string | string[];\n\n /** City name(s), SHA-256 hashed, lowercase */\n ct?: string | string[];\n\n /** State abbreviation(s), SHA-256 hashed, lowercase (e.g., \"ca\", \"ny\") */\n st?: string | string[];\n\n /** ZIP or postal code(s), SHA-256 hashed, lowercase */\n zp?: string | string[];\n\n /** Country code(s), SHA-256 hashed, lowercase (ISO 3166-1 alpha-2) */\n country?: string | string[];\n\n /** External IDs, unique per user. SHA-256 hash recommended */\n external_id?: string | string[];\n\n /** IPv4 or IPv6 address of client. Do NOT hash. */\n client_ip_address?: string;\n\n /** User agent string from browser. Do NOT hash. */\n client_user_agent?: string;\n\n /** fbclid parameter value from the URL. Do NOT hash. */\n fbclid?: string;\n\n /** Facebook click ID (_fbc cookie). Do NOT hash. */\n fbc?: string;\n\n /** Facebook browser ID (_fbp cookie). Do NOT hash. */\n fbp?: string;\n\n /** Subscription ID for the transaction. Do NOT hash. */\n subscription_id?: string;\n\n /** Facebook login ID (App-Scoped ID). Do NOT hash. */\n fb_login_id?: number;\n\n /** Meta Lead Ad lead ID. Do NOT hash. */\n lead_id?: number;\n\n /** Anonymous install ID. App events only. Do NOT hash. */\n anon_id?: string;\n\n /** Mobile advertiser ID (GAID/IDFA). Do NOT hash. */\n madid?: string;\n\n /** Facebook Page ID. Do NOT hash. */\n page_id?: string;\n\n /** Messenger Page-scoped user ID. Do NOT hash. */\n page_scoped_user_id?: string;\n\n /** Click to WhatsApp ad click ID. Do NOT hash. */\n ctwa_clid?: string;\n\n /** Instagram business account ID. Do NOT hash. */\n ig_account_id?: string;\n\n /** Instagram-scoped user ID. Do NOT hash. */\n ig_sid?: string;\n}\n\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data\nexport interface StandardParameters {\n // Web and Offline parameters\n availability?: string;\n body_style?: string;\n checkin_date?: string;\n city?: string;\n condition_of_vehicle?: string;\n content_ids?: string[];\n content_type?: 'product' | 'product_group' | string;\n contents?: Array<{\n id: string;\n quantity?: number;\n item_price?: number;\n delivery_category?: string;\n }>;\n country?: string;\n currency?: string;\n delivery_category?: 'in_store' | 'curbside' | 'home_delivery' | string;\n departing_arrival_date?: string;\n departing_departure_date?: string;\n destination_airport?: string;\n destination_ids?: string[];\n dma_code?: string;\n drivetrain?: string;\n exterior_color?: string;\n fuel_type?: string;\n hotel_score?: number;\n interior_color?: string;\n lead_event_source?: string;\n lease_end_date?: string;\n lease_start_date?: string;\n listing_type?: string;\n make?: string;\n // @TODO is mileage an object?\n 'mileage.unit'?: string;\n 'mileage.value'?: number;\n model?: string;\n neighborhood?: string;\n net_revenue?: number;\n num_adults?: number;\n num_children?: number;\n num_infants?: number;\n num_items?: number;\n order_id?: string;\n origin_airport?: string;\n postal_code?: string;\n predicted_ltv?: number;\n preferred_baths_range?: string;\n preferred_beds_range?: string;\n preferred_neighborhoods?: string[];\n preferred_num_stops?: number;\n preferred_price_range?: string;\n preferred_star_ratings?: [number, number];\n price?: string;\n product_catalog_id?: string;\n property_type?: string;\n region?: string;\n returning_arrival_date?: string;\n returning_departure_date?: string;\n search_string?: string;\n state_of_vehicle?: string;\n suggested_destinations?: string[];\n suggested_home_listings?: string[];\n suggested_hotels?: string[];\n suggested_jobs?: string[];\n suggested_local_service_businesses?: string[];\n suggested_location_based_items?: string[];\n suggested_vehicles?: string[];\n transmission?: string;\n travel_class?: string;\n travel_end?: string;\n travel_start?: string;\n trim?: string;\n\n // App-specific parameters (with fb_ prefix)\n fb_availability?: string;\n fb_body_style?: string;\n fb_checkin_date?: string;\n fb_city?: string;\n fb_condition_of_vehicle?: string;\n fb_content_ids?: string[];\n fb_content_type?: string;\n fb_contents?: Array<{ id: string; quantity?: number; item_price?: number }>;\n fb_country?: string;\n fb_currency?: string;\n fb_delivery_category?: string;\n fb_departing_arrival_date?: string;\n fb_departing_departure_date?: string;\n fb_destination_airport?: string;\n fb_destination_ids?: string[];\n fb_dma_code?: string;\n fb_drivetrain?: string;\n fb_exterior_color?: string;\n fb_fuel_type?: string;\n fb_hotel_score?: number;\n fb_interior_color?: string;\n fb_lease_end_date?: string;\n fb_lease_start_date?: string;\n fb_listing_type?: string;\n fb_make?: string;\n // @TODO is fb_mileage an object?\n 'fb_mileage.unit'?: string;\n 'fb_mileage.value'?: number;\n fb_model?: string;\n fb_neighborhood?: string;\n fb_num_adults?: number;\n fb_num_children?: number;\n fb_num_infants?: number;\n fb_num_items?: number;\n fb_order_id?: string;\n fb_origin_airport?: string;\n fb_postal_code?: string;\n fb_predicted_ltv?: number;\n fb_preferred_baths_range?: string;\n fb_preferred_beds_range?: string;\n fb_preferred_neighborhoods?: string[];\n fb_preferred_num_stops?: number;\n fb_preferred_price_range?: string;\n fb_preferred_star_ratings?: [number, number];\n fb_price?: string;\n fb_product_catalog_id?: string;\n fb_property_type?: string;\n fb_region?: string;\n fb_returning_arrival_date?: string;\n fb_returning_departure_date?: string;\n fb_search_string?: string;\n fb_state_of_vehicle?: string;\n fb_suggested_destinations?: string[];\n fb_suggested_home_listings?: string[];\n fb_suggested_hotels?: string[];\n fb_suggested_jobs?: string[];\n fb_suggested_local_service_businesses?: string[];\n fb_suggested_location_based_items?: string[];\n fb_suggested_vehicles?: string[];\n fb_transmission?: string;\n fb_travel_class?: string;\n fb_travel_end?: string;\n fb_travel_start?: string;\n\n // Offline-specific parameters\n user_bucket?: string;\n value?: number;\n vin?: string;\n year?: number;\n item_number?: string;\n}\n\nexport interface OriginalEventDataParameters {\n event_name?: EventName;\n event_time?: number;\n order_id?: number;\n event_id?: string;\n}\n","export * as events from './events';\nexport * as mapping from './mapping';\n","import type { BodyParameters } from '../types';\nimport { getEvent } from '@walkeros/core';\n\nexport function Purchase(): BodyParameters {\n const event = getEvent('order complete');\n\n return {\n data: [\n {\n event_name: 'Purchase',\n event_time: event.timestamp / 1000,\n event_id: event.id,\n event_source_url: event.source.id,\n action_source: 'website',\n user_data: {\n external_id: [\n 'cc8e27118413234d4297ed00a02711365312c79325df9b5b8f4199cbd0b96e7e',\n '9176e6f336dbdb4f99b0e45cbd7e41e0e2323812b236822842a61ffbd362ac8c',\n ],\n },\n order_id: String(event.data.id),\n currency: 'EUR',\n value: Number(event.data.total),\n contents: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n id: String(item.data.id),\n quantity: Number(item.data.quantity) || 1,\n item_price: Number(item.data.price),\n })),\n num_items: 2,\n },\n ],\n };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { DestinationMeta } from '..';\nimport { isObject } from '@walkeros/core';\n\nexport const InitUserData: DestinationMeta.Settings = {\n pixelId: 'p1x3l1d',\n accessToken: 's3cr3t',\n user_data: {\n external_id: { set: ['user.device', 'user.session'] },\n },\n};\n\nexport const Purchase: DestinationMeta.Rule = {\n name: 'Purchase',\n data: {\n map: {\n order_id: 'data.id',\n currency: { key: 'data.currency', value: 'EUR' },\n value: 'data.total',\n contents: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n id: 'data.id',\n item_price: 'data.price',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n num_items: {\n fn: (event) =>\n (event as WalkerOS.Event).nested.filter(\n (item) => item.entity === 'product',\n ).length,\n },\n },\n },\n};\n\nexport const config = {\n order: { complete: Purchase },\n} satisfies DestinationMeta.Rules;\n"],"mappings":"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","names":["import_core","import_core","config","sendServer","import_server_core","import_core","Purchase","import_core","config"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/hash.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationMeta from './types';\n\n// Examples\nexport * as examples from './examples';\n\nexport const destinationMeta: Destination = {\n type: 'meta',\n\n config: {},\n\n async init({ config: partialConfig }) {\n const config = getConfig(partialConfig);\n return config;\n },\n\n async push(event, { config, mapping, data, collector, env }) {\n return await push(event, { config, mapping, data, collector, env });\n },\n};\n\nexport default destinationMeta;\n","import type { Config, Settings, PartialConfig } from './types';\nimport { throwError } from '@walkeros/core';\n\nexport function getConfig(partialConfig: PartialConfig = {}): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, pixelId } = settings;\n\n if (!accessToken) throwError('Config settings accessToken missing');\n if (!pixelId) throwError('Config settings pixelId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n pixelId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n BodyParameters,\n CustomerInformationParameters,\n PushFn,\n ServerEventParameters,\n Env,\n} 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, mapping, data, collector, env },\n) {\n const {\n accessToken,\n pixelId,\n action_source = 'website',\n doNotHash,\n test_event_code,\n url = 'https://graph.facebook.com/v22.0/',\n user_data,\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 const userData: CustomerInformationParameters = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n if (userData.fbclid) {\n userData.fbc = formatClickId(\n userData.fbclid,\n collector?.session?.start || event.timestamp,\n );\n delete userData.fbclid;\n }\n const serverEvent: ServerEventParameters = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...eventData,\n user_data: userData,\n };\n\n if (action_source === 'website')\n serverEvent.event_source_url = event.source.id;\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: BodyParameters = { data: [hashedServerEvent] };\n\n // Test event code\n if (test_event_code) body.test_event_code = test_event_code;\n\n const sendServerFn = env?.sendServer || sendServer;\n const result = await sendServerFn(\n `${url}${pixelId}/events?access_token=${accessToken}`,\n JSON.stringify(body),\n );\n\n if (isObject(result) && result.ok === false)\n throw new Error(JSON.stringify(result));\n};\n\nfunction formatClickId(clickId: unknown, time?: number): string | undefined {\n // https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc#2--format-clickid\n\n if (!clickId) return;\n\n // Version is always \"fb\"\n const version = 'fb';\n\n // Subdomain ('com' = 0, 'example.com' = 1, 'www.example.com' = 2)\n const subdomainIndex = '1';\n\n // Get the current timestamp in milliseconds (or when the fbclid was observed)\n const creationTime = time || Date.now();\n\n return `${version}.${subdomainIndex}.${creationTime}.${clickId}`;\n}\n\nfunction lower(str: WalkerOS.Property): string {\n return String(str).toLocaleLowerCase();\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];\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 pixelId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test_event_code?: string;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\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>;\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// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/main-body\nexport interface BodyParameters {\n data: Array<ServerEventParameters>;\n test_event_code?: string;\n}\n\n/**\n * Represents the top‑level parameters for a server event sent via Meta's Conversions API.\n * https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/server-event\n */\nexport interface ServerEventParameters extends StandardParameters {\n /** The event name or custom event identifier. Required for deduplication. */\n event_name: EventName;\n\n /** Unix timestamp (in seconds) when the event actually occurred. GMT timezone. */\n event_time: number;\n\n /** Map of customer information for matching (emails, phone, etc.). */\n user_data: CustomerInformationParameters;\n\n /** Additional business data about the event. */\n custom_data?: Record<string, unknown>;\n\n /** URL of the page where the event occurred. */\n event_source_url?: string;\n\n /** If true, exclude this event from ads optimization (only attribution). */\n opt_out?: boolean;\n\n /** Unique ID for deduplication across Pixel and CAPI. */\n event_id?: string;\n\n /** Source of the event (e.g., website, app). */\n action_source: ActionSource;\n\n /** Processing options (e.g., ['LDU'] for CCPA limited data use). */\n data_processing_options?: DataProcessingOption[];\n\n /** Country code for data processing option (1 = USA, 0 = auto‑geolocate). */\n data_processing_options_country?: number;\n\n /** State code for data processing option (1000 = California, 0 = auto). */\n data_processing_options_state?: number;\n\n /** App‑specific data (required if action_source is 'app'). */\n app_data?: AppData;\n\n /** HTTP referrer header of the event. */\n referrer_url?: string;\n\n /** Metadata to link delayed events to past acquisition events. */\n original_event_data?: OriginalEventDataParameters;\n\n /** User segment for more context about the customer's relationship. */\n customer_segmentation?: CustomerSegmentation;\n}\n\nexport type EventName =\n | 'AddPaymentInfo'\n | 'AddToCart'\n | 'AddToWishlist'\n | 'CompleteRegistration'\n | 'Contact'\n | 'CustomizeProduct'\n | 'Donate'\n | 'FindLocation'\n | 'InitiateCheckout'\n | 'Lead'\n | 'Purchase'\n | 'Schedule'\n | 'Search'\n | 'StartTrial'\n | 'SubmitApplication'\n | 'Subscribe'\n | 'ViewContent'\n | string;\n\nexport type ActionSource =\n | 'email'\n | 'website'\n | 'app'\n | 'phone_call'\n | 'chat'\n | 'physical_store'\n | 'system_generated'\n | 'business_messaging'\n | 'other';\n\nexport type DataProcessingOption = 'LDU';\n\nexport type CustomerSegmentation =\n | 'new_customer_to_business'\n | 'new_customer_to_business_line'\n | 'new_customer_to_product_area'\n | 'new_customer_to_medium'\n | 'existing_customer_to_business'\n | 'existing_customer_to_business_line'\n | 'existing_customer_to_product_area'\n | 'existing_customer_to_medium'\n | 'customer_in_loyalty_program';\n\n/** Extended device info for app events (Android version 'a2', iOS 'i2') */\nexport interface AppData {\n /**\n * Comma-separated array of strings with fixed order:\n * [sdk_version, os_version, device_model, device_brand,\n * screen_width, screen_height, ...]\n */\n extinfo: string[];\n}\n\n// Customer Information Parameters\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters\nexport interface CustomerInformationParameters {\n /** Email(s), SHA-256 hashed, lowercase and trimmed */\n em?: string | string[];\n\n /** Phone number(s), SHA-256 hashed, E.164 format (no leading 0s or symbols) */\n ph?: string | string[];\n\n /** First name(s), SHA-256 hashed, lowercase */\n fn?: string | string[];\n\n /** Last name(s), SHA-256 hashed, lowercase */\n ln?: string | string[];\n\n /** Date(s) of birth in YYYYMMDD, SHA-256 hashed */\n db?: string | string[];\n\n /** Gender(s) in lowercase single letter (\"m\", \"f\", etc.), SHA-256 hashed */\n ge?: string | string[];\n\n /** City name(s), SHA-256 hashed, lowercase */\n ct?: string | string[];\n\n /** State abbreviation(s), SHA-256 hashed, lowercase (e.g., \"ca\", \"ny\") */\n st?: string | string[];\n\n /** ZIP or postal code(s), SHA-256 hashed, lowercase */\n zp?: string | string[];\n\n /** Country code(s), SHA-256 hashed, lowercase (ISO 3166-1 alpha-2) */\n country?: string | string[];\n\n /** External IDs, unique per user. SHA-256 hash recommended */\n external_id?: string | string[];\n\n /** IPv4 or IPv6 address of client. Do NOT hash. */\n client_ip_address?: string;\n\n /** User agent string from browser. Do NOT hash. */\n client_user_agent?: string;\n\n /** fbclid parameter value from the URL. Do NOT hash. */\n fbclid?: string;\n\n /** Facebook click ID (_fbc cookie). Do NOT hash. */\n fbc?: string;\n\n /** Facebook browser ID (_fbp cookie). Do NOT hash. */\n fbp?: string;\n\n /** Subscription ID for the transaction. Do NOT hash. */\n subscription_id?: string;\n\n /** Facebook login ID (App-Scoped ID). Do NOT hash. */\n fb_login_id?: number;\n\n /** Meta Lead Ad lead ID. Do NOT hash. */\n lead_id?: number;\n\n /** Anonymous install ID. App events only. Do NOT hash. */\n anon_id?: string;\n\n /** Mobile advertiser ID (GAID/IDFA). Do NOT hash. */\n madid?: string;\n\n /** Facebook Page ID. Do NOT hash. */\n page_id?: string;\n\n /** Messenger Page-scoped user ID. Do NOT hash. */\n page_scoped_user_id?: string;\n\n /** Click to WhatsApp ad click ID. Do NOT hash. */\n ctwa_clid?: string;\n\n /** Instagram business account ID. Do NOT hash. */\n ig_account_id?: string;\n\n /** Instagram-scoped user ID. Do NOT hash. */\n ig_sid?: string;\n}\n\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data\nexport interface StandardParameters {\n // Web and Offline parameters\n availability?: string;\n body_style?: string;\n checkin_date?: string;\n city?: string;\n condition_of_vehicle?: string;\n content_ids?: string[];\n content_type?: 'product' | 'product_group' | string;\n contents?: Array<{\n id: string;\n quantity?: number;\n item_price?: number;\n delivery_category?: string;\n }>;\n country?: string;\n currency?: string;\n delivery_category?: 'in_store' | 'curbside' | 'home_delivery' | string;\n departing_arrival_date?: string;\n departing_departure_date?: string;\n destination_airport?: string;\n destination_ids?: string[];\n dma_code?: string;\n drivetrain?: string;\n exterior_color?: string;\n fuel_type?: string;\n hotel_score?: number;\n interior_color?: string;\n lead_event_source?: string;\n lease_end_date?: string;\n lease_start_date?: string;\n listing_type?: string;\n make?: string;\n // @TODO is mileage an object?\n 'mileage.unit'?: string;\n 'mileage.value'?: number;\n model?: string;\n neighborhood?: string;\n net_revenue?: number;\n num_adults?: number;\n num_children?: number;\n num_infants?: number;\n num_items?: number;\n order_id?: string;\n origin_airport?: string;\n postal_code?: string;\n predicted_ltv?: number;\n preferred_baths_range?: string;\n preferred_beds_range?: string;\n preferred_neighborhoods?: string[];\n preferred_num_stops?: number;\n preferred_price_range?: string;\n preferred_star_ratings?: [number, number];\n price?: string;\n product_catalog_id?: string;\n property_type?: string;\n region?: string;\n returning_arrival_date?: string;\n returning_departure_date?: string;\n search_string?: string;\n state_of_vehicle?: string;\n suggested_destinations?: string[];\n suggested_home_listings?: string[];\n suggested_hotels?: string[];\n suggested_jobs?: string[];\n suggested_local_service_businesses?: string[];\n suggested_location_based_items?: string[];\n suggested_vehicles?: string[];\n transmission?: string;\n travel_class?: string;\n travel_end?: string;\n travel_start?: string;\n trim?: string;\n\n // App-specific parameters (with fb_ prefix)\n fb_availability?: string;\n fb_body_style?: string;\n fb_checkin_date?: string;\n fb_city?: string;\n fb_condition_of_vehicle?: string;\n fb_content_ids?: string[];\n fb_content_type?: string;\n fb_contents?: Array<{ id: string; quantity?: number; item_price?: number }>;\n fb_country?: string;\n fb_currency?: string;\n fb_delivery_category?: string;\n fb_departing_arrival_date?: string;\n fb_departing_departure_date?: string;\n fb_destination_airport?: string;\n fb_destination_ids?: string[];\n fb_dma_code?: string;\n fb_drivetrain?: string;\n fb_exterior_color?: string;\n fb_fuel_type?: string;\n fb_hotel_score?: number;\n fb_interior_color?: string;\n fb_lease_end_date?: string;\n fb_lease_start_date?: string;\n fb_listing_type?: string;\n fb_make?: string;\n // @TODO is fb_mileage an object?\n 'fb_mileage.unit'?: string;\n 'fb_mileage.value'?: number;\n fb_model?: string;\n fb_neighborhood?: string;\n fb_num_adults?: number;\n fb_num_children?: number;\n fb_num_infants?: number;\n fb_num_items?: number;\n fb_order_id?: string;\n fb_origin_airport?: string;\n fb_postal_code?: string;\n fb_predicted_ltv?: number;\n fb_preferred_baths_range?: string;\n fb_preferred_beds_range?: string;\n fb_preferred_neighborhoods?: string[];\n fb_preferred_num_stops?: number;\n fb_preferred_price_range?: string;\n fb_preferred_star_ratings?: [number, number];\n fb_price?: string;\n fb_product_catalog_id?: string;\n fb_property_type?: string;\n fb_region?: string;\n fb_returning_arrival_date?: string;\n fb_returning_departure_date?: string;\n fb_search_string?: string;\n fb_state_of_vehicle?: string;\n fb_suggested_destinations?: string[];\n fb_suggested_home_listings?: string[];\n fb_suggested_hotels?: string[];\n fb_suggested_jobs?: string[];\n fb_suggested_local_service_businesses?: string[];\n fb_suggested_location_based_items?: string[];\n fb_suggested_vehicles?: string[];\n fb_transmission?: string;\n fb_travel_class?: string;\n fb_travel_end?: string;\n fb_travel_start?: string;\n\n // Offline-specific parameters\n user_bucket?: string;\n value?: number;\n vin?: string;\n year?: number;\n item_number?: string;\n}\n\nexport interface OriginalEventDataParameters {\n event_name?: EventName;\n event_time?: number;\n order_id?: number;\n event_id?: string;\n}\n","export * as env from './env';\nexport * as events from './events';\nexport * as mapping from './mapping';\n","import type { SendDataValue, SendResponse } from '@walkeros/core';\nimport type { SendServerOptions } from '@walkeros/server-core';\nimport type { Env } from '../types';\n\n/**\n * Example environment configurations for Meta Conversions API destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring actual HTTP requests.\n */\n\n/**\n * Mock sendServer function that simulates successful HTTP responses\n */\nasync function mockSendServer(\n url: string,\n data?: SendDataValue,\n options?: SendServerOptions,\n): Promise<SendResponse> {\n // Simulate successful Meta API response\n return {\n ok: true,\n data: {\n events_received: 1,\n messages: [],\n fbtrace_id: 'mock-trace-id',\n },\n };\n}\n\n/**\n * Standard mock environment for push operations\n *\n * Use this for testing Meta Conversions API events without making\n * actual HTTP requests to Facebook's servers.\n */\nexport const push: Env = {\n sendServer: mockSendServer,\n};\n","import type { BodyParameters } from '../types';\nimport { getEvent } from '@walkeros/core';\n\nexport function Purchase(): BodyParameters {\n const event = getEvent('order complete');\n\n return {\n data: [\n {\n event_name: 'Purchase',\n event_time: event.timestamp / 1000,\n event_id: event.id,\n event_source_url: event.source.id,\n action_source: 'website',\n user_data: {\n external_id: [\n 'cc8e27118413234d4297ed00a02711365312c79325df9b5b8f4199cbd0b96e7e',\n '9176e6f336dbdb4f99b0e45cbd7e41e0e2323812b236822842a61ffbd362ac8c',\n ],\n },\n order_id: String(event.data.id),\n currency: 'EUR',\n value: Number(event.data.total),\n contents: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n id: String(item.data.id),\n quantity: Number(item.data.quantity) || 1,\n item_price: Number(item.data.price),\n })),\n num_items: 2,\n },\n ],\n };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { DestinationMeta } from '..';\nimport { isObject } from '@walkeros/core';\n\nexport const InitUserData: DestinationMeta.Settings = {\n pixelId: 'p1x3l1d',\n accessToken: 's3cr3t',\n user_data: {\n external_id: { set: ['user.device', 'user.session'] },\n },\n};\n\nexport const Purchase: DestinationMeta.Rule = {\n name: 'Purchase',\n data: {\n map: {\n order_id: 'data.id',\n currency: { key: 'data.currency', value: 'EUR' },\n value: 'data.total',\n contents: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n id: 'data.id',\n item_price: 'data.price',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n num_items: {\n fn: (event) =>\n (event as WalkerOS.Event).nested.filter(\n (item) => item.entity === 'product',\n ).length,\n },\n },\n },\n};\n\nexport const config = {\n order: { complete: Purchase },\n} satisfies DestinationMeta.Rules;\n"],"mappings":"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","names":["import_core","import_server_core","import_core","config","push","import_core","Purchase","import_core","config"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,a)=>{for(var r in a)e(t,r,{get:a[r],enumerable:!0})};import{throwError as a}from"@walkeros/core";import{getMappingValue as r,isObject as n}from"@walkeros/core";import{isArray as
|
|
1
|
+
var e=Object.defineProperty,t=(t,a)=>{for(var r in a)e(t,r,{get:a[r],enumerable:!0})};import{throwError as a}from"@walkeros/core";import{getMappingValue as r,isObject as n}from"@walkeros/core";import{sendServer as i}from"@walkeros/server-core";import{isArray as s,isObject as o,isString as c}from"@walkeros/core";import{getHashServer as d}from"@walkeros/server-core";var u=["em","ph","fn","ln","db","ge","ct","st","zp","country","external_id"];function m(e,t=[]){return u.includes(e)&&!t.includes(e)}async function l(e,t){return t?s(e)?Promise.all(e.map(e=>d(String(e)))):d(String(e)):e}var p=async function(e,{config:t,mapping:a,data:s,collector:d,env:u}){var p;const{accessToken:f,pixelId:v,action_source:_="website",doNotHash:g,test_event_code:b,url:y="https://graph.facebook.com/v22.0/",user_data:w}=t.settings,k=n(s)?s:{},h=t.data?await r(e,t.data):{},x=w?await r(e,{map:w}):{},S={...n(h)&&n(h.user_data)?h.user_data:{},...n(x)?x:{},...n(k.user_data)?k.user_data:{}};S.fbclid&&(S.fbc=function(e,t){if(!e)return;const a="fb",r="1",n=t||Date.now();return`${a}.${r}.${n}.${e}`}(S.fbclid,(null==(p=null==d?void 0:d.session)?void 0:p.start)||e.timestamp),delete S.fbclid);const P={event_name:e.name,event_id:e.id,event_time:Math.round((e.timestamp||Date.now())/1e3),action_source:_,...k,user_data:S};"website"===_&&(P.event_source_url=e.source.id);const $=await async function(e,t=[]){if(!o(e))return e;const a="user_data"in e,r=a?e.user_data:e,n=(await Promise.all(Object.entries(r).map(async([e,r])=>[e,await l(r,a&&m(e,t))]))).reduce((e,[t,a])=>(c(t)&&(e[t]=a),e),{});return a?{...e,user_data:n}:n}(P,g),I={data:[$]};b&&(I.test_event_code=b);const N=(null==u?void 0:u.sendServer)||i,O=await N(`${y}${v}/events?access_token=${f}`,JSON.stringify(I));if(n(O)&&!1===O.ok)throw new Error(JSON.stringify(O))};var f={},v={};t(v,{env:()=>_,events:()=>b,mapping:()=>k});var _={};t(_,{push:()=>g});var g={sendServer:async function(e,t,a){return{ok:!0,data:{events_received:1,messages:[],fbtrace_id:"mock-trace-id"}}}},b={};t(b,{Purchase:()=>w});import{getEvent as y}from"@walkeros/core";function w(){const e=y("order complete");return{data:[{event_name:"Purchase",event_time:e.timestamp/1e3,event_id:e.id,event_source_url:e.source.id,action_source:"website",user_data:{external_id:["cc8e27118413234d4297ed00a02711365312c79325df9b5b8f4199cbd0b96e7e","9176e6f336dbdb4f99b0e45cbd7e41e0e2323812b236822842a61ffbd362ac8c"]},order_id:String(e.data.id),currency:"EUR",value:Number(e.data.total),contents:e.nested.filter(e=>"product"===e.entity).map(e=>({id:String(e.data.id),quantity:Number(e.data.quantity)||1,item_price:Number(e.data.price)})),num_items:2}]}}var k={};t(k,{InitUserData:()=>x,Purchase:()=>S,config:()=>P});import{isObject as h}from"@walkeros/core";var x={pixelId:"p1x3l1d",accessToken:"s3cr3t",user_data:{external_id:{set:["user.device","user.session"]}}},S={name:"Purchase",data:{map:{order_id:"data.id",currency:{key:"data.currency",value:"EUR"},value:"data.total",contents:{loop:["nested",{condition:e=>h(e)&&"product"===e.entity,map:{id:"data.id",item_price:"data.price",quantity:{key:"data.quantity",value:1}}}]},num_items:{fn:e=>e.nested.filter(e=>"product"===e.entity).length}}}},P={order:{complete:S}},$={type:"meta",config:{},async init({config:e}){const t=function(e={}){const t=e.settings||{},{accessToken:r,pixelId:n}=t;r||a("Config settings accessToken missing"),n||a("Config settings pixelId missing");const i={...t,accessToken:r,pixelId:n};return{...e,settings:i}}(e);return t},push:async(e,{config:t,mapping:a,data:r,collector:n,env:i})=>await p(e,{config:t,mapping:a,data:r,collector:n,env:i})},I=$;export{f as DestinationMeta,I as default,$ as destinationMeta,v as examples};//# 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/index.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Config, Settings, PartialConfig } from './types';\nimport { throwError } from '@walkeros/core';\n\nexport function getConfig(partialConfig: PartialConfig = {}): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, pixelId } = settings;\n\n if (!accessToken) throwError('Config settings accessToken missing');\n if (!pixelId) throwError('Config settings pixelId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n pixelId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n BodyParameters,\n CustomerInformationParameters,\n PushFn,\n ServerEventParameters,\n Environment,\n} 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, mapping, data, collector, env },\n) {\n const {\n accessToken,\n pixelId,\n action_source = 'website',\n doNotHash,\n test_event_code,\n url = 'https://graph.facebook.com/v22.0/',\n user_data,\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 const userData: CustomerInformationParameters = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n if (userData.fbclid) {\n userData.fbc = formatClickId(\n userData.fbclid,\n collector?.session?.start || event.timestamp,\n );\n delete userData.fbclid;\n }\n const serverEvent: ServerEventParameters = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...eventData,\n user_data: userData,\n };\n\n if (action_source === 'website')\n serverEvent.event_source_url = event.source.id;\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: BodyParameters = { data: [hashedServerEvent] };\n\n // Test event code\n if (test_event_code) body.test_event_code = test_event_code;\n\n const { sendServer } = env as unknown as Environment;\n const result = await sendServer(\n `${url}${pixelId}/events?access_token=${accessToken}`,\n JSON.stringify(body),\n );\n\n if (isObject(result) && result.ok === false)\n throw new Error(JSON.stringify(result));\n};\n\nfunction formatClickId(clickId: unknown, time?: number): string | undefined {\n // https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc#2--format-clickid\n\n if (!clickId) return;\n\n // Version is always \"fb\"\n const version = 'fb';\n\n // Subdomain ('com' = 0, 'example.com' = 1, 'www.example.com' = 2)\n const subdomainIndex = '1';\n\n // Get the current timestamp in milliseconds (or when the fbclid was observed)\n const creationTime = time || Date.now();\n\n return `${version}.${subdomainIndex}.${creationTime}.${clickId}`;\n}\n\nfunction lower(str: WalkerOS.Property): string {\n return String(str).toLocaleLowerCase();\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];\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 { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\nimport { sendServer } from '@walkeros/server-core';\n\n// Types\nexport * as DestinationMeta from './types';\n\n// Examples\nexport * as examples from './examples';\n\nexport const destinationMeta: Destination = {\n type: 'meta',\n\n config: {},\n\n // Default environment with sendServer function\n env: {\n sendServer,\n },\n\n async init({ config: partialConfig }) {\n const config = getConfig(partialConfig);\n return config;\n },\n\n async push(event, { config, mapping, data, collector, env }) {\n return await push(event, { config, mapping, data, collector, env });\n },\n};\n\nexport default destinationMeta;\n","import type { Mapping as WalkerOSMapping } from '@walkeros/core';\nimport type { DestinationServer, sendServer } from '@walkeros/server-core';\n\nexport interface Destination\n extends DestinationServer.Destination<Settings, Mapping> {\n init: DestinationServer.InitFn<Settings, Mapping>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Settings, Mapping>;\n\nexport type InitFn = DestinationServer.InitFn<Settings, Mapping>;\nexport type PushFn = DestinationServer.PushFn<Settings, Mapping>;\n\nexport type PartialConfig = DestinationServer.PartialConfig<Settings, Mapping>;\n\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\n\nexport interface Settings {\n accessToken: string;\n pixelId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test_event_code?: string;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\n\nexport interface Mapping {}\n\nexport interface Environment {\n sendServer: typeof sendServer;\n}\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/main-body\nexport interface BodyParameters {\n data: Array<ServerEventParameters>;\n test_event_code?: string;\n}\n\n/**\n * Represents the top‑level parameters for a server event sent via Meta's Conversions API.\n * https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/server-event\n */\nexport interface ServerEventParameters extends StandardParameters {\n /** The event name or custom event identifier. Required for deduplication. */\n event_name: EventName;\n\n /** Unix timestamp (in seconds) when the event actually occurred. GMT timezone. */\n event_time: number;\n\n /** Map of customer information for matching (emails, phone, etc.). */\n user_data: CustomerInformationParameters;\n\n /** Additional business data about the event. */\n custom_data?: Record<string, unknown>;\n\n /** URL of the page where the event occurred. */\n event_source_url?: string;\n\n /** If true, exclude this event from ads optimization (only attribution). */\n opt_out?: boolean;\n\n /** Unique ID for deduplication across Pixel and CAPI. */\n event_id?: string;\n\n /** Source of the event (e.g., website, app). */\n action_source: ActionSource;\n\n /** Processing options (e.g., ['LDU'] for CCPA limited data use). */\n data_processing_options?: DataProcessingOption[];\n\n /** Country code for data processing option (1 = USA, 0 = auto‑geolocate). */\n data_processing_options_country?: number;\n\n /** State code for data processing option (1000 = California, 0 = auto). */\n data_processing_options_state?: number;\n\n /** App‑specific data (required if action_source is 'app'). */\n app_data?: AppData;\n\n /** HTTP referrer header of the event. */\n referrer_url?: string;\n\n /** Metadata to link delayed events to past acquisition events. */\n original_event_data?: OriginalEventDataParameters;\n\n /** User segment for more context about the customer's relationship. */\n customer_segmentation?: CustomerSegmentation;\n}\n\nexport type EventName =\n | 'AddPaymentInfo'\n | 'AddToCart'\n | 'AddToWishlist'\n | 'CompleteRegistration'\n | 'Contact'\n | 'CustomizeProduct'\n | 'Donate'\n | 'FindLocation'\n | 'InitiateCheckout'\n | 'Lead'\n | 'Purchase'\n | 'Schedule'\n | 'Search'\n | 'StartTrial'\n | 'SubmitApplication'\n | 'Subscribe'\n | 'ViewContent'\n | string;\n\nexport type ActionSource =\n | 'email'\n | 'website'\n | 'app'\n | 'phone_call'\n | 'chat'\n | 'physical_store'\n | 'system_generated'\n | 'business_messaging'\n | 'other';\n\nexport type DataProcessingOption = 'LDU';\n\nexport type CustomerSegmentation =\n | 'new_customer_to_business'\n | 'new_customer_to_business_line'\n | 'new_customer_to_product_area'\n | 'new_customer_to_medium'\n | 'existing_customer_to_business'\n | 'existing_customer_to_business_line'\n | 'existing_customer_to_product_area'\n | 'existing_customer_to_medium'\n | 'customer_in_loyalty_program';\n\n/** Extended device info for app events (Android version 'a2', iOS 'i2') */\nexport interface AppData {\n /**\n * Comma-separated array of strings with fixed order:\n * [sdk_version, os_version, device_model, device_brand,\n * screen_width, screen_height, ...]\n */\n extinfo: string[];\n}\n\n// Customer Information Parameters\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters\nexport interface CustomerInformationParameters {\n /** Email(s), SHA-256 hashed, lowercase and trimmed */\n em?: string | string[];\n\n /** Phone number(s), SHA-256 hashed, E.164 format (no leading 0s or symbols) */\n ph?: string | string[];\n\n /** First name(s), SHA-256 hashed, lowercase */\n fn?: string | string[];\n\n /** Last name(s), SHA-256 hashed, lowercase */\n ln?: string | string[];\n\n /** Date(s) of birth in YYYYMMDD, SHA-256 hashed */\n db?: string | string[];\n\n /** Gender(s) in lowercase single letter (\"m\", \"f\", etc.), SHA-256 hashed */\n ge?: string | string[];\n\n /** City name(s), SHA-256 hashed, lowercase */\n ct?: string | string[];\n\n /** State abbreviation(s), SHA-256 hashed, lowercase (e.g., \"ca\", \"ny\") */\n st?: string | string[];\n\n /** ZIP or postal code(s), SHA-256 hashed, lowercase */\n zp?: string | string[];\n\n /** Country code(s), SHA-256 hashed, lowercase (ISO 3166-1 alpha-2) */\n country?: string | string[];\n\n /** External IDs, unique per user. SHA-256 hash recommended */\n external_id?: string | string[];\n\n /** IPv4 or IPv6 address of client. Do NOT hash. */\n client_ip_address?: string;\n\n /** User agent string from browser. Do NOT hash. */\n client_user_agent?: string;\n\n /** fbclid parameter value from the URL. Do NOT hash. */\n fbclid?: string;\n\n /** Facebook click ID (_fbc cookie). Do NOT hash. */\n fbc?: string;\n\n /** Facebook browser ID (_fbp cookie). Do NOT hash. */\n fbp?: string;\n\n /** Subscription ID for the transaction. Do NOT hash. */\n subscription_id?: string;\n\n /** Facebook login ID (App-Scoped ID). Do NOT hash. */\n fb_login_id?: number;\n\n /** Meta Lead Ad lead ID. Do NOT hash. */\n lead_id?: number;\n\n /** Anonymous install ID. App events only. Do NOT hash. */\n anon_id?: string;\n\n /** Mobile advertiser ID (GAID/IDFA). Do NOT hash. */\n madid?: string;\n\n /** Facebook Page ID. Do NOT hash. */\n page_id?: string;\n\n /** Messenger Page-scoped user ID. Do NOT hash. */\n page_scoped_user_id?: string;\n\n /** Click to WhatsApp ad click ID. Do NOT hash. */\n ctwa_clid?: string;\n\n /** Instagram business account ID. Do NOT hash. */\n ig_account_id?: string;\n\n /** Instagram-scoped user ID. Do NOT hash. */\n ig_sid?: string;\n}\n\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data\nexport interface StandardParameters {\n // Web and Offline parameters\n availability?: string;\n body_style?: string;\n checkin_date?: string;\n city?: string;\n condition_of_vehicle?: string;\n content_ids?: string[];\n content_type?: 'product' | 'product_group' | string;\n contents?: Array<{\n id: string;\n quantity?: number;\n item_price?: number;\n delivery_category?: string;\n }>;\n country?: string;\n currency?: string;\n delivery_category?: 'in_store' | 'curbside' | 'home_delivery' | string;\n departing_arrival_date?: string;\n departing_departure_date?: string;\n destination_airport?: string;\n destination_ids?: string[];\n dma_code?: string;\n drivetrain?: string;\n exterior_color?: string;\n fuel_type?: string;\n hotel_score?: number;\n interior_color?: string;\n lead_event_source?: string;\n lease_end_date?: string;\n lease_start_date?: string;\n listing_type?: string;\n make?: string;\n // @TODO is mileage an object?\n 'mileage.unit'?: string;\n 'mileage.value'?: number;\n model?: string;\n neighborhood?: string;\n net_revenue?: number;\n num_adults?: number;\n num_children?: number;\n num_infants?: number;\n num_items?: number;\n order_id?: string;\n origin_airport?: string;\n postal_code?: string;\n predicted_ltv?: number;\n preferred_baths_range?: string;\n preferred_beds_range?: string;\n preferred_neighborhoods?: string[];\n preferred_num_stops?: number;\n preferred_price_range?: string;\n preferred_star_ratings?: [number, number];\n price?: string;\n product_catalog_id?: string;\n property_type?: string;\n region?: string;\n returning_arrival_date?: string;\n returning_departure_date?: string;\n search_string?: string;\n state_of_vehicle?: string;\n suggested_destinations?: string[];\n suggested_home_listings?: string[];\n suggested_hotels?: string[];\n suggested_jobs?: string[];\n suggested_local_service_businesses?: string[];\n suggested_location_based_items?: string[];\n suggested_vehicles?: string[];\n transmission?: string;\n travel_class?: string;\n travel_end?: string;\n travel_start?: string;\n trim?: string;\n\n // App-specific parameters (with fb_ prefix)\n fb_availability?: string;\n fb_body_style?: string;\n fb_checkin_date?: string;\n fb_city?: string;\n fb_condition_of_vehicle?: string;\n fb_content_ids?: string[];\n fb_content_type?: string;\n fb_contents?: Array<{ id: string; quantity?: number; item_price?: number }>;\n fb_country?: string;\n fb_currency?: string;\n fb_delivery_category?: string;\n fb_departing_arrival_date?: string;\n fb_departing_departure_date?: string;\n fb_destination_airport?: string;\n fb_destination_ids?: string[];\n fb_dma_code?: string;\n fb_drivetrain?: string;\n fb_exterior_color?: string;\n fb_fuel_type?: string;\n fb_hotel_score?: number;\n fb_interior_color?: string;\n fb_lease_end_date?: string;\n fb_lease_start_date?: string;\n fb_listing_type?: string;\n fb_make?: string;\n // @TODO is fb_mileage an object?\n 'fb_mileage.unit'?: string;\n 'fb_mileage.value'?: number;\n fb_model?: string;\n fb_neighborhood?: string;\n fb_num_adults?: number;\n fb_num_children?: number;\n fb_num_infants?: number;\n fb_num_items?: number;\n fb_order_id?: string;\n fb_origin_airport?: string;\n fb_postal_code?: string;\n fb_predicted_ltv?: number;\n fb_preferred_baths_range?: string;\n fb_preferred_beds_range?: string;\n fb_preferred_neighborhoods?: string[];\n fb_preferred_num_stops?: number;\n fb_preferred_price_range?: string;\n fb_preferred_star_ratings?: [number, number];\n fb_price?: string;\n fb_product_catalog_id?: string;\n fb_property_type?: string;\n fb_region?: string;\n fb_returning_arrival_date?: string;\n fb_returning_departure_date?: string;\n fb_search_string?: string;\n fb_state_of_vehicle?: string;\n fb_suggested_destinations?: string[];\n fb_suggested_home_listings?: string[];\n fb_suggested_hotels?: string[];\n fb_suggested_jobs?: string[];\n fb_suggested_local_service_businesses?: string[];\n fb_suggested_location_based_items?: string[];\n fb_suggested_vehicles?: string[];\n fb_transmission?: string;\n fb_travel_class?: string;\n fb_travel_end?: string;\n fb_travel_start?: string;\n\n // Offline-specific parameters\n user_bucket?: string;\n value?: number;\n vin?: string;\n year?: number;\n item_number?: string;\n}\n\nexport interface OriginalEventDataParameters {\n event_name?: EventName;\n event_time?: number;\n order_id?: number;\n event_id?: string;\n}\n","export * as events from './events';\nexport * as mapping from './mapping';\n","import type { BodyParameters } from '../types';\nimport { getEvent } from '@walkeros/core';\n\nexport function Purchase(): BodyParameters {\n const event = getEvent('order complete');\n\n return {\n data: [\n {\n event_name: 'Purchase',\n event_time: event.timestamp / 1000,\n event_id: event.id,\n event_source_url: event.source.id,\n action_source: 'website',\n user_data: {\n external_id: [\n 'cc8e27118413234d4297ed00a02711365312c79325df9b5b8f4199cbd0b96e7e',\n '9176e6f336dbdb4f99b0e45cbd7e41e0e2323812b236822842a61ffbd362ac8c',\n ],\n },\n order_id: String(event.data.id),\n currency: 'EUR',\n value: Number(event.data.total),\n contents: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n id: String(item.data.id),\n quantity: Number(item.data.quantity) || 1,\n item_price: Number(item.data.price),\n })),\n num_items: 2,\n },\n ],\n };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { DestinationMeta } from '..';\nimport { isObject } from '@walkeros/core';\n\nexport const InitUserData: DestinationMeta.Settings = {\n pixelId: 'p1x3l1d',\n accessToken: 's3cr3t',\n user_data: {\n external_id: { set: ['user.device', 'user.session'] },\n },\n};\n\nexport const Purchase: DestinationMeta.Rule = {\n name: 'Purchase',\n data: {\n map: {\n order_id: 'data.id',\n currency: { key: 'data.currency', value: 'EUR' },\n value: 'data.total',\n contents: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n id: 'data.id',\n item_price: 'data.price',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n num_items: {\n fn: (event) =>\n (event as WalkerOS.Event).nested.filter(\n (item) => item.entity === 'product',\n ).length,\n },\n },\n },\n};\n\nexport const config = {\n order: { complete: Purchase },\n} satisfies DestinationMeta.Rules;\n"],"mappings":"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","names":["isObject","config","isObject","sendServer","Purchase","isObject","config"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/push.ts","../src/hash.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/index.ts"],"sourcesContent":["import type { Config, Settings, PartialConfig } from './types';\nimport { throwError } from '@walkeros/core';\n\nexport function getConfig(partialConfig: PartialConfig = {}): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { accessToken, pixelId } = settings;\n\n if (!accessToken) throwError('Config settings accessToken missing');\n if (!pixelId) throwError('Config settings pixelId missing');\n\n const settingsConfig: Settings = {\n ...settings,\n accessToken,\n pixelId,\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n BodyParameters,\n CustomerInformationParameters,\n PushFn,\n ServerEventParameters,\n Env,\n} 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, mapping, data, collector, env },\n) {\n const {\n accessToken,\n pixelId,\n action_source = 'website',\n doNotHash,\n test_event_code,\n url = 'https://graph.facebook.com/v22.0/',\n user_data,\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 const userData: CustomerInformationParameters = {\n // Destination config\n ...(isObject(configData) && isObject(configData.user_data)\n ? configData.user_data\n : {}),\n // Custom user_data\n ...(isObject(userDataCustom) ? userDataCustom : {}),\n // Event mapping\n ...(isObject(eventData.user_data) ? eventData.user_data : {}),\n };\n\n if (userData.fbclid) {\n userData.fbc = formatClickId(\n userData.fbclid,\n collector?.session?.start || event.timestamp,\n );\n delete userData.fbclid;\n }\n const serverEvent: ServerEventParameters = {\n event_name: event.name,\n event_id: event.id,\n event_time: Math.round((event.timestamp || Date.now()) / 1000),\n action_source,\n ...eventData,\n user_data: userData,\n };\n\n if (action_source === 'website')\n serverEvent.event_source_url = event.source.id;\n\n const hashedServerEvent = await hashEvent(serverEvent, doNotHash);\n\n const body: BodyParameters = { data: [hashedServerEvent] };\n\n // Test event code\n if (test_event_code) body.test_event_code = test_event_code;\n\n const sendServerFn = env?.sendServer || sendServer;\n const result = await sendServerFn(\n `${url}${pixelId}/events?access_token=${accessToken}`,\n JSON.stringify(body),\n );\n\n if (isObject(result) && result.ok === false)\n throw new Error(JSON.stringify(result));\n};\n\nfunction formatClickId(clickId: unknown, time?: number): string | undefined {\n // https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc#2--format-clickid\n\n if (!clickId) return;\n\n // Version is always \"fb\"\n const version = 'fb';\n\n // Subdomain ('com' = 0, 'example.com' = 1, 'www.example.com' = 2)\n const subdomainIndex = '1';\n\n // Get the current timestamp in milliseconds (or when the fbclid was observed)\n const creationTime = time || Date.now();\n\n return `${version}.${subdomainIndex}.${creationTime}.${clickId}`;\n}\n\nfunction lower(str: WalkerOS.Property): string {\n return String(str).toLocaleLowerCase();\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];\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 pixelId: string;\n action_source?: ActionSource;\n doNotHash?: string[];\n test_event_code?: string;\n url?: string;\n user_data?: WalkerOSMapping.Map;\n}\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>;\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// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/main-body\nexport interface BodyParameters {\n data: Array<ServerEventParameters>;\n test_event_code?: string;\n}\n\n/**\n * Represents the top‑level parameters for a server event sent via Meta's Conversions API.\n * https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/server-event\n */\nexport interface ServerEventParameters extends StandardParameters {\n /** The event name or custom event identifier. Required for deduplication. */\n event_name: EventName;\n\n /** Unix timestamp (in seconds) when the event actually occurred. GMT timezone. */\n event_time: number;\n\n /** Map of customer information for matching (emails, phone, etc.). */\n user_data: CustomerInformationParameters;\n\n /** Additional business data about the event. */\n custom_data?: Record<string, unknown>;\n\n /** URL of the page where the event occurred. */\n event_source_url?: string;\n\n /** If true, exclude this event from ads optimization (only attribution). */\n opt_out?: boolean;\n\n /** Unique ID for deduplication across Pixel and CAPI. */\n event_id?: string;\n\n /** Source of the event (e.g., website, app). */\n action_source: ActionSource;\n\n /** Processing options (e.g., ['LDU'] for CCPA limited data use). */\n data_processing_options?: DataProcessingOption[];\n\n /** Country code for data processing option (1 = USA, 0 = auto‑geolocate). */\n data_processing_options_country?: number;\n\n /** State code for data processing option (1000 = California, 0 = auto). */\n data_processing_options_state?: number;\n\n /** App‑specific data (required if action_source is 'app'). */\n app_data?: AppData;\n\n /** HTTP referrer header of the event. */\n referrer_url?: string;\n\n /** Metadata to link delayed events to past acquisition events. */\n original_event_data?: OriginalEventDataParameters;\n\n /** User segment for more context about the customer's relationship. */\n customer_segmentation?: CustomerSegmentation;\n}\n\nexport type EventName =\n | 'AddPaymentInfo'\n | 'AddToCart'\n | 'AddToWishlist'\n | 'CompleteRegistration'\n | 'Contact'\n | 'CustomizeProduct'\n | 'Donate'\n | 'FindLocation'\n | 'InitiateCheckout'\n | 'Lead'\n | 'Purchase'\n | 'Schedule'\n | 'Search'\n | 'StartTrial'\n | 'SubmitApplication'\n | 'Subscribe'\n | 'ViewContent'\n | string;\n\nexport type ActionSource =\n | 'email'\n | 'website'\n | 'app'\n | 'phone_call'\n | 'chat'\n | 'physical_store'\n | 'system_generated'\n | 'business_messaging'\n | 'other';\n\nexport type DataProcessingOption = 'LDU';\n\nexport type CustomerSegmentation =\n | 'new_customer_to_business'\n | 'new_customer_to_business_line'\n | 'new_customer_to_product_area'\n | 'new_customer_to_medium'\n | 'existing_customer_to_business'\n | 'existing_customer_to_business_line'\n | 'existing_customer_to_product_area'\n | 'existing_customer_to_medium'\n | 'customer_in_loyalty_program';\n\n/** Extended device info for app events (Android version 'a2', iOS 'i2') */\nexport interface AppData {\n /**\n * Comma-separated array of strings with fixed order:\n * [sdk_version, os_version, device_model, device_brand,\n * screen_width, screen_height, ...]\n */\n extinfo: string[];\n}\n\n// Customer Information Parameters\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters\nexport interface CustomerInformationParameters {\n /** Email(s), SHA-256 hashed, lowercase and trimmed */\n em?: string | string[];\n\n /** Phone number(s), SHA-256 hashed, E.164 format (no leading 0s or symbols) */\n ph?: string | string[];\n\n /** First name(s), SHA-256 hashed, lowercase */\n fn?: string | string[];\n\n /** Last name(s), SHA-256 hashed, lowercase */\n ln?: string | string[];\n\n /** Date(s) of birth in YYYYMMDD, SHA-256 hashed */\n db?: string | string[];\n\n /** Gender(s) in lowercase single letter (\"m\", \"f\", etc.), SHA-256 hashed */\n ge?: string | string[];\n\n /** City name(s), SHA-256 hashed, lowercase */\n ct?: string | string[];\n\n /** State abbreviation(s), SHA-256 hashed, lowercase (e.g., \"ca\", \"ny\") */\n st?: string | string[];\n\n /** ZIP or postal code(s), SHA-256 hashed, lowercase */\n zp?: string | string[];\n\n /** Country code(s), SHA-256 hashed, lowercase (ISO 3166-1 alpha-2) */\n country?: string | string[];\n\n /** External IDs, unique per user. SHA-256 hash recommended */\n external_id?: string | string[];\n\n /** IPv4 or IPv6 address of client. Do NOT hash. */\n client_ip_address?: string;\n\n /** User agent string from browser. Do NOT hash. */\n client_user_agent?: string;\n\n /** fbclid parameter value from the URL. Do NOT hash. */\n fbclid?: string;\n\n /** Facebook click ID (_fbc cookie). Do NOT hash. */\n fbc?: string;\n\n /** Facebook browser ID (_fbp cookie). Do NOT hash. */\n fbp?: string;\n\n /** Subscription ID for the transaction. Do NOT hash. */\n subscription_id?: string;\n\n /** Facebook login ID (App-Scoped ID). Do NOT hash. */\n fb_login_id?: number;\n\n /** Meta Lead Ad lead ID. Do NOT hash. */\n lead_id?: number;\n\n /** Anonymous install ID. App events only. Do NOT hash. */\n anon_id?: string;\n\n /** Mobile advertiser ID (GAID/IDFA). Do NOT hash. */\n madid?: string;\n\n /** Facebook Page ID. Do NOT hash. */\n page_id?: string;\n\n /** Messenger Page-scoped user ID. Do NOT hash. */\n page_scoped_user_id?: string;\n\n /** Click to WhatsApp ad click ID. Do NOT hash. */\n ctwa_clid?: string;\n\n /** Instagram business account ID. Do NOT hash. */\n ig_account_id?: string;\n\n /** Instagram-scoped user ID. Do NOT hash. */\n ig_sid?: string;\n}\n\n// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data\nexport interface StandardParameters {\n // Web and Offline parameters\n availability?: string;\n body_style?: string;\n checkin_date?: string;\n city?: string;\n condition_of_vehicle?: string;\n content_ids?: string[];\n content_type?: 'product' | 'product_group' | string;\n contents?: Array<{\n id: string;\n quantity?: number;\n item_price?: number;\n delivery_category?: string;\n }>;\n country?: string;\n currency?: string;\n delivery_category?: 'in_store' | 'curbside' | 'home_delivery' | string;\n departing_arrival_date?: string;\n departing_departure_date?: string;\n destination_airport?: string;\n destination_ids?: string[];\n dma_code?: string;\n drivetrain?: string;\n exterior_color?: string;\n fuel_type?: string;\n hotel_score?: number;\n interior_color?: string;\n lead_event_source?: string;\n lease_end_date?: string;\n lease_start_date?: string;\n listing_type?: string;\n make?: string;\n // @TODO is mileage an object?\n 'mileage.unit'?: string;\n 'mileage.value'?: number;\n model?: string;\n neighborhood?: string;\n net_revenue?: number;\n num_adults?: number;\n num_children?: number;\n num_infants?: number;\n num_items?: number;\n order_id?: string;\n origin_airport?: string;\n postal_code?: string;\n predicted_ltv?: number;\n preferred_baths_range?: string;\n preferred_beds_range?: string;\n preferred_neighborhoods?: string[];\n preferred_num_stops?: number;\n preferred_price_range?: string;\n preferred_star_ratings?: [number, number];\n price?: string;\n product_catalog_id?: string;\n property_type?: string;\n region?: string;\n returning_arrival_date?: string;\n returning_departure_date?: string;\n search_string?: string;\n state_of_vehicle?: string;\n suggested_destinations?: string[];\n suggested_home_listings?: string[];\n suggested_hotels?: string[];\n suggested_jobs?: string[];\n suggested_local_service_businesses?: string[];\n suggested_location_based_items?: string[];\n suggested_vehicles?: string[];\n transmission?: string;\n travel_class?: string;\n travel_end?: string;\n travel_start?: string;\n trim?: string;\n\n // App-specific parameters (with fb_ prefix)\n fb_availability?: string;\n fb_body_style?: string;\n fb_checkin_date?: string;\n fb_city?: string;\n fb_condition_of_vehicle?: string;\n fb_content_ids?: string[];\n fb_content_type?: string;\n fb_contents?: Array<{ id: string; quantity?: number; item_price?: number }>;\n fb_country?: string;\n fb_currency?: string;\n fb_delivery_category?: string;\n fb_departing_arrival_date?: string;\n fb_departing_departure_date?: string;\n fb_destination_airport?: string;\n fb_destination_ids?: string[];\n fb_dma_code?: string;\n fb_drivetrain?: string;\n fb_exterior_color?: string;\n fb_fuel_type?: string;\n fb_hotel_score?: number;\n fb_interior_color?: string;\n fb_lease_end_date?: string;\n fb_lease_start_date?: string;\n fb_listing_type?: string;\n fb_make?: string;\n // @TODO is fb_mileage an object?\n 'fb_mileage.unit'?: string;\n 'fb_mileage.value'?: number;\n fb_model?: string;\n fb_neighborhood?: string;\n fb_num_adults?: number;\n fb_num_children?: number;\n fb_num_infants?: number;\n fb_num_items?: number;\n fb_order_id?: string;\n fb_origin_airport?: string;\n fb_postal_code?: string;\n fb_predicted_ltv?: number;\n fb_preferred_baths_range?: string;\n fb_preferred_beds_range?: string;\n fb_preferred_neighborhoods?: string[];\n fb_preferred_num_stops?: number;\n fb_preferred_price_range?: string;\n fb_preferred_star_ratings?: [number, number];\n fb_price?: string;\n fb_product_catalog_id?: string;\n fb_property_type?: string;\n fb_region?: string;\n fb_returning_arrival_date?: string;\n fb_returning_departure_date?: string;\n fb_search_string?: string;\n fb_state_of_vehicle?: string;\n fb_suggested_destinations?: string[];\n fb_suggested_home_listings?: string[];\n fb_suggested_hotels?: string[];\n fb_suggested_jobs?: string[];\n fb_suggested_local_service_businesses?: string[];\n fb_suggested_location_based_items?: string[];\n fb_suggested_vehicles?: string[];\n fb_transmission?: string;\n fb_travel_class?: string;\n fb_travel_end?: string;\n fb_travel_start?: string;\n\n // Offline-specific parameters\n user_bucket?: string;\n value?: number;\n vin?: string;\n year?: number;\n item_number?: string;\n}\n\nexport interface OriginalEventDataParameters {\n event_name?: EventName;\n event_time?: number;\n order_id?: number;\n event_id?: string;\n}\n","export * as env from './env';\nexport * as events from './events';\nexport * as mapping from './mapping';\n","import type { SendDataValue, SendResponse } from '@walkeros/core';\nimport type { SendServerOptions } from '@walkeros/server-core';\nimport type { Env } from '../types';\n\n/**\n * Example environment configurations for Meta Conversions API destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring actual HTTP requests.\n */\n\n/**\n * Mock sendServer function that simulates successful HTTP responses\n */\nasync function mockSendServer(\n url: string,\n data?: SendDataValue,\n options?: SendServerOptions,\n): Promise<SendResponse> {\n // Simulate successful Meta API response\n return {\n ok: true,\n data: {\n events_received: 1,\n messages: [],\n fbtrace_id: 'mock-trace-id',\n },\n };\n}\n\n/**\n * Standard mock environment for push operations\n *\n * Use this for testing Meta Conversions API events without making\n * actual HTTP requests to Facebook's servers.\n */\nexport const push: Env = {\n sendServer: mockSendServer,\n};\n","import type { BodyParameters } from '../types';\nimport { getEvent } from '@walkeros/core';\n\nexport function Purchase(): BodyParameters {\n const event = getEvent('order complete');\n\n return {\n data: [\n {\n event_name: 'Purchase',\n event_time: event.timestamp / 1000,\n event_id: event.id,\n event_source_url: event.source.id,\n action_source: 'website',\n user_data: {\n external_id: [\n 'cc8e27118413234d4297ed00a02711365312c79325df9b5b8f4199cbd0b96e7e',\n '9176e6f336dbdb4f99b0e45cbd7e41e0e2323812b236822842a61ffbd362ac8c',\n ],\n },\n order_id: String(event.data.id),\n currency: 'EUR',\n value: Number(event.data.total),\n contents: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n id: String(item.data.id),\n quantity: Number(item.data.quantity) || 1,\n item_price: Number(item.data.price),\n })),\n num_items: 2,\n },\n ],\n };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { DestinationMeta } from '..';\nimport { isObject } from '@walkeros/core';\n\nexport const InitUserData: DestinationMeta.Settings = {\n pixelId: 'p1x3l1d',\n accessToken: 's3cr3t',\n user_data: {\n external_id: { set: ['user.device', 'user.session'] },\n },\n};\n\nexport const Purchase: DestinationMeta.Rule = {\n name: 'Purchase',\n data: {\n map: {\n order_id: 'data.id',\n currency: { key: 'data.currency', value: 'EUR' },\n value: 'data.total',\n contents: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n id: 'data.id',\n item_price: 'data.price',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n num_items: {\n fn: (event) =>\n (event as WalkerOS.Event).nested.filter(\n (item) => item.entity === 'product',\n ).length,\n },\n },\n },\n};\n\nexport const config = {\n order: { complete: Purchase },\n} satisfies DestinationMeta.Rules;\n","import type { Destination } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationMeta from './types';\n\n// Examples\nexport * as examples from './examples';\n\nexport const destinationMeta: Destination = {\n type: 'meta',\n\n config: {},\n\n async init({ config: partialConfig }) {\n const config = getConfig(partialConfig);\n return config;\n },\n\n async push(event, { config, mapping, data, collector, env }) {\n return await push(event, { config, mapping, data, collector, env });\n },\n};\n\nexport default destinationMeta;\n"],"mappings":"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","names":["isObject","config","isObject","push","Purchase","isObject","config"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/server-destination-meta",
|
|
3
3
|
"description": "Meta server destination for walkerOS",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"update": "npx npm-check-updates -u && npm update"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@walkeros/core": "0.
|
|
34
|
-
"@walkeros/server-core": "0.
|
|
33
|
+
"@walkeros/core": "0.2.0",
|
|
34
|
+
"@walkeros/server-core": "0.2.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {},
|
|
37
37
|
"repository": {
|