@customerio/cdp-analytics-node 0.0.1

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.
Files changed (171) hide show
  1. package/LICENSE.MD +22 -0
  2. package/README.md +20 -0
  3. package/dist/cjs/app/analytics-node.js +170 -0
  4. package/dist/cjs/app/analytics-node.js.map +1 -0
  5. package/dist/cjs/app/context.js +13 -0
  6. package/dist/cjs/app/context.js.map +1 -0
  7. package/dist/cjs/app/dispatch-emit.js +37 -0
  8. package/dist/cjs/app/dispatch-emit.js.map +1 -0
  9. package/dist/cjs/app/emitter.js +8 -0
  10. package/dist/cjs/app/emitter.js.map +1 -0
  11. package/dist/cjs/app/event-factory.js +12 -0
  12. package/dist/cjs/app/event-factory.js.map +1 -0
  13. package/dist/cjs/app/event-queue.js +24 -0
  14. package/dist/cjs/app/event-queue.js.map +1 -0
  15. package/dist/cjs/app/settings.js +11 -0
  16. package/dist/cjs/app/settings.js.map +1 -0
  17. package/dist/cjs/app/types/event.js +3 -0
  18. package/dist/cjs/app/types/event.js.map +1 -0
  19. package/dist/cjs/app/types/index.js +7 -0
  20. package/dist/cjs/app/types/index.js.map +1 -0
  21. package/dist/cjs/app/types/params.js +3 -0
  22. package/dist/cjs/app/types/params.js.map +1 -0
  23. package/dist/cjs/app/types/plugin.js +3 -0
  24. package/dist/cjs/app/types/plugin.js.map +1 -0
  25. package/dist/cjs/generated/version.js +6 -0
  26. package/dist/cjs/generated/version.js.map +1 -0
  27. package/dist/cjs/index.js +11 -0
  28. package/dist/cjs/index.js.map +1 -0
  29. package/dist/cjs/lib/abort.js +77 -0
  30. package/dist/cjs/lib/abort.js.map +1 -0
  31. package/dist/cjs/lib/base-64-encode.js +19 -0
  32. package/dist/cjs/lib/base-64-encode.js.map +1 -0
  33. package/dist/cjs/lib/create-url.js +15 -0
  34. package/dist/cjs/lib/create-url.js.map +1 -0
  35. package/dist/cjs/lib/env.js +25 -0
  36. package/dist/cjs/lib/env.js.map +1 -0
  37. package/dist/cjs/lib/extract-promise-parts.js +21 -0
  38. package/dist/cjs/lib/extract-promise-parts.js.map +1 -0
  39. package/dist/cjs/lib/fetch.js +7 -0
  40. package/dist/cjs/lib/fetch.js.map +1 -0
  41. package/dist/cjs/lib/get-message-id.js +14 -0
  42. package/dist/cjs/lib/get-message-id.js.map +1 -0
  43. package/dist/cjs/lib/uuid.js +6 -0
  44. package/dist/cjs/lib/uuid.js.map +1 -0
  45. package/dist/cjs/plugins/customerio/context-batch.js +55 -0
  46. package/dist/cjs/plugins/customerio/context-batch.js.map +1 -0
  47. package/dist/cjs/plugins/customerio/index.js +44 -0
  48. package/dist/cjs/plugins/customerio/index.js.map +1 -0
  49. package/dist/cjs/plugins/customerio/publisher.js +189 -0
  50. package/dist/cjs/plugins/customerio/publisher.js.map +1 -0
  51. package/dist/esm/app/analytics-node.js +166 -0
  52. package/dist/esm/app/analytics-node.js.map +1 -0
  53. package/dist/esm/app/context.js +9 -0
  54. package/dist/esm/app/context.js.map +1 -0
  55. package/dist/esm/app/dispatch-emit.js +33 -0
  56. package/dist/esm/app/dispatch-emit.js.map +1 -0
  57. package/dist/esm/app/emitter.js +4 -0
  58. package/dist/esm/app/emitter.js.map +1 -0
  59. package/dist/esm/app/event-factory.js +8 -0
  60. package/dist/esm/app/event-factory.js.map +1 -0
  61. package/dist/esm/app/event-queue.js +20 -0
  62. package/dist/esm/app/event-queue.js.map +1 -0
  63. package/dist/esm/app/settings.js +7 -0
  64. package/dist/esm/app/settings.js.map +1 -0
  65. package/dist/esm/app/types/event.js +2 -0
  66. package/dist/esm/app/types/event.js.map +1 -0
  67. package/dist/esm/app/types/index.js +4 -0
  68. package/dist/esm/app/types/index.js.map +1 -0
  69. package/dist/esm/app/types/params.js +2 -0
  70. package/dist/esm/app/types/params.js.map +1 -0
  71. package/dist/esm/app/types/plugin.js +2 -0
  72. package/dist/esm/app/types/plugin.js.map +1 -0
  73. package/dist/esm/generated/version.js +3 -0
  74. package/dist/esm/generated/version.js.map +1 -0
  75. package/dist/esm/index.js +6 -0
  76. package/dist/esm/index.js.map +1 -0
  77. package/dist/esm/lib/abort.js +73 -0
  78. package/dist/esm/lib/abort.js.map +1 -0
  79. package/dist/esm/lib/base-64-encode.js +15 -0
  80. package/dist/esm/lib/base-64-encode.js.map +1 -0
  81. package/dist/esm/lib/create-url.js +11 -0
  82. package/dist/esm/lib/create-url.js.map +1 -0
  83. package/dist/esm/lib/env.js +21 -0
  84. package/dist/esm/lib/env.js.map +1 -0
  85. package/dist/esm/lib/extract-promise-parts.js +17 -0
  86. package/dist/esm/lib/extract-promise-parts.js.map +1 -0
  87. package/dist/esm/lib/fetch.js +3 -0
  88. package/dist/esm/lib/fetch.js.map +1 -0
  89. package/dist/esm/lib/get-message-id.js +10 -0
  90. package/dist/esm/lib/get-message-id.js.map +1 -0
  91. package/dist/esm/lib/uuid.js +2 -0
  92. package/dist/esm/lib/uuid.js.map +1 -0
  93. package/dist/esm/plugins/customerio/context-batch.js +51 -0
  94. package/dist/esm/plugins/customerio/context-batch.js.map +1 -0
  95. package/dist/esm/plugins/customerio/index.js +39 -0
  96. package/dist/esm/plugins/customerio/index.js.map +1 -0
  97. package/dist/esm/plugins/customerio/publisher.js +185 -0
  98. package/dist/esm/plugins/customerio/publisher.js.map +1 -0
  99. package/dist/types/app/analytics-node.d.ts +62 -0
  100. package/dist/types/app/analytics-node.d.ts.map +1 -0
  101. package/dist/types/app/context.d.ts +6 -0
  102. package/dist/types/app/context.d.ts.map +1 -0
  103. package/dist/types/app/dispatch-emit.d.ts +7 -0
  104. package/dist/types/app/dispatch-emit.d.ts.map +1 -0
  105. package/dist/types/app/emitter.d.ts +23 -0
  106. package/dist/types/app/emitter.d.ts.map +1 -0
  107. package/dist/types/app/event-factory.d.ts +14 -0
  108. package/dist/types/app/event-factory.d.ts.map +1 -0
  109. package/dist/types/app/event-queue.d.ts +7 -0
  110. package/dist/types/app/event-queue.d.ts.map +1 -0
  111. package/dist/types/app/settings.d.ts +33 -0
  112. package/dist/types/app/settings.d.ts.map +1 -0
  113. package/dist/types/app/types/event.d.ts +7 -0
  114. package/dist/types/app/types/event.d.ts.map +1 -0
  115. package/dist/types/app/types/index.d.ts +4 -0
  116. package/dist/types/app/types/index.d.ts.map +1 -0
  117. package/dist/types/app/types/params.d.ts +60 -0
  118. package/dist/types/app/types/params.d.ts.map +1 -0
  119. package/dist/types/app/types/plugin.d.ts +6 -0
  120. package/dist/types/app/types/plugin.d.ts.map +1 -0
  121. package/dist/types/generated/version.d.ts +2 -0
  122. package/dist/types/generated/version.d.ts.map +1 -0
  123. package/dist/types/index.d.ts +7 -0
  124. package/dist/types/index.d.ts.map +1 -0
  125. package/dist/types/lib/abort.d.ts +6 -0
  126. package/dist/types/lib/abort.d.ts.map +1 -0
  127. package/dist/types/lib/base-64-encode.d.ts +5 -0
  128. package/dist/types/lib/base-64-encode.d.ts.map +1 -0
  129. package/dist/types/lib/create-url.d.ts +8 -0
  130. package/dist/types/lib/create-url.d.ts.map +1 -0
  131. package/dist/types/lib/env.d.ts +3 -0
  132. package/dist/types/lib/env.d.ts.map +1 -0
  133. package/dist/types/lib/extract-promise-parts.d.ts +9 -0
  134. package/dist/types/lib/extract-promise-parts.d.ts.map +1 -0
  135. package/dist/types/lib/fetch.d.ts +2 -0
  136. package/dist/types/lib/fetch.d.ts.map +1 -0
  137. package/dist/types/lib/get-message-id.d.ts +7 -0
  138. package/dist/types/lib/get-message-id.d.ts.map +1 -0
  139. package/dist/types/lib/uuid.d.ts +2 -0
  140. package/dist/types/lib/uuid.d.ts.map +1 -0
  141. package/dist/types/plugins/customerio/context-batch.d.ts +26 -0
  142. package/dist/types/plugins/customerio/context-batch.d.ts.map +1 -0
  143. package/dist/types/plugins/customerio/index.d.ts +13 -0
  144. package/dist/types/plugins/customerio/index.d.ts.map +1 -0
  145. package/dist/types/plugins/customerio/publisher.d.ts +38 -0
  146. package/dist/types/plugins/customerio/publisher.d.ts.map +1 -0
  147. package/package.json +43 -0
  148. package/src/app/analytics-node.ts +295 -0
  149. package/src/app/context.ts +11 -0
  150. package/src/app/dispatch-emit.ts +42 -0
  151. package/src/app/emitter.ts +23 -0
  152. package/src/app/event-factory.ts +20 -0
  153. package/src/app/event-queue.ts +23 -0
  154. package/src/app/settings.ts +39 -0
  155. package/src/app/types/event.ts +7 -0
  156. package/src/app/types/index.ts +3 -0
  157. package/src/app/types/params.ts +74 -0
  158. package/src/app/types/plugin.ts +5 -0
  159. package/src/generated/version.ts +2 -0
  160. package/src/index.ts +17 -0
  161. package/src/lib/abort.ts +77 -0
  162. package/src/lib/base-64-encode.ts +14 -0
  163. package/src/lib/create-url.ts +11 -0
  164. package/src/lib/env.ts +32 -0
  165. package/src/lib/extract-promise-parts.ts +21 -0
  166. package/src/lib/fetch.ts +3 -0
  167. package/src/lib/get-message-id.ts +10 -0
  168. package/src/lib/uuid.ts +1 -0
  169. package/src/plugins/customerio/context-batch.ts +71 -0
  170. package/src/plugins/customerio/index.ts +65 -0
  171. package/src/plugins/customerio/publisher.ts +258 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-message-id.js","sourceRoot":"","sources":["../../../src/lib/get-message-id.ts"],"names":[],"mappings":";;;AAAA,iCAA6B;AAE7B;;;;GAIG;AACI,MAAM,eAAe,GAAG,GAAW,EAAE;IAC1C,OAAO,aAAa,IAAI,CAAC,GAAG,EAAE,IAAI,IAAA,WAAI,GAAE,EAAE,CAAA;AAC5C,CAAC,CAAA;AAFY,QAAA,eAAe,mBAE3B"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uuid = void 0;
4
+ var uuid_1 = require("uuid");
5
+ Object.defineProperty(exports, "uuid", { enumerable: true, get: function () { return uuid_1.v4; } });
6
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../../src/lib/uuid.ts"],"names":[],"mappings":";;;AAAA,6BAAiC;AAAxB,4FAAA,EAAE,OAAQ"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContextBatch = void 0;
4
+ const uuid_1 = require("@lukeed/uuid");
5
+ const MAX_EVENT_SIZE_IN_KB = 32;
6
+ const MAX_BATCH_SIZE_IN_KB = 480; // (500 KB is the limit, leaving some padding)
7
+ class ContextBatch {
8
+ constructor(maxEventCount) {
9
+ this.id = (0, uuid_1.v4)();
10
+ this.items = [];
11
+ this.sizeInBytes = 0;
12
+ this.maxEventCount = Math.max(1, maxEventCount);
13
+ }
14
+ tryAdd(item) {
15
+ if (this.length === this.maxEventCount)
16
+ return {
17
+ success: false,
18
+ message: `Event limit of ${this.maxEventCount} has been exceeded.`,
19
+ };
20
+ const eventSize = this.calculateSize(item.context);
21
+ if (eventSize > MAX_EVENT_SIZE_IN_KB * 1024) {
22
+ return {
23
+ success: false,
24
+ message: `Event exceeds maximum event size of ${MAX_EVENT_SIZE_IN_KB} KB`,
25
+ };
26
+ }
27
+ if (this.sizeInBytes + eventSize > MAX_BATCH_SIZE_IN_KB * 1024) {
28
+ return {
29
+ success: false,
30
+ message: `Event has caused batch size to exceed ${MAX_BATCH_SIZE_IN_KB} KB`,
31
+ };
32
+ }
33
+ this.items.push(item);
34
+ this.sizeInBytes += eventSize;
35
+ return { success: true };
36
+ }
37
+ get length() {
38
+ return this.items.length;
39
+ }
40
+ calculateSize(ctx) {
41
+ return encodeURI(JSON.stringify(ctx.event)).split(/%..|i/).length;
42
+ }
43
+ getEvents() {
44
+ const events = this.items.map(({ context }) => context.event);
45
+ return events;
46
+ }
47
+ getContexts() {
48
+ return this.items.map((item) => item.context);
49
+ }
50
+ resolveEvents() {
51
+ this.items.forEach(({ resolver, context }) => resolver(context));
52
+ }
53
+ }
54
+ exports.ContextBatch = ContextBatch;
55
+ //# sourceMappingURL=context-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-batch.js","sourceRoot":"","sources":["../../../../src/plugins/customerio/context-batch.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAIzC,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAC/B,MAAM,oBAAoB,GAAG,GAAG,CAAA,CAAC,+CAA+C;AAOhF,MAAa,YAAY;IAMvB,YAAY,aAAqB;QAL1B,OAAE,GAAG,IAAA,SAAI,GAAE,CAAA;QACV,UAAK,GAAkB,EAAE,CAAA;QACzB,gBAAW,GAAG,CAAC,CAAA;QAIrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;IACjD,CAAC;IACM,MAAM,CACX,IAAiB;QAEjB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,kBAAkB,IAAI,CAAC,aAAa,qBAAqB;aACnE,CAAA;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClD,IAAI,SAAS,GAAG,oBAAoB,GAAG,IAAI,EAAE;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,uCAAuC,oBAAoB,KAAK;aAC1E,CAAA;SACF;QAED,IAAI,IAAI,CAAC,WAAW,GAAG,SAAS,GAAG,oBAAoB,GAAG,IAAI,EAAE;YAC9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,yCAAyC,oBAAoB,KAAK;aAC5E,CAAA;SACF;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,IAAI,CAAC,WAAW,IAAI,SAAS,CAAA;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;IAC1B,CAAC;IAEO,aAAa,CAAC,GAAY;QAChC,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;IACnE,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7D,OAAO,MAAM,CAAA;IACf,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;IAED,aAAa;QACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,CAAC;CACF;AA1DD,oCA0DC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConfiguredNodePlugin = exports.createNodePlugin = void 0;
4
+ const publisher_1 = require("./publisher");
5
+ const version_1 = require("../../generated/version");
6
+ const env_1 = require("../../lib/env");
7
+ function normalizeEvent(ctx) {
8
+ ctx.updateEvent('context.library.name', '@customerio/cdp-analytics-node');
9
+ ctx.updateEvent('context.library.version', version_1.version);
10
+ const runtime = (0, env_1.detectRuntime)();
11
+ if (runtime === 'node') {
12
+ ctx.updateEvent('_metadata.nodeVersion', process.versions.node);
13
+ }
14
+ ctx.updateEvent('_metadata.jsRuntime', runtime);
15
+ }
16
+ function createNodePlugin(publisher) {
17
+ function action(ctx) {
18
+ normalizeEvent(ctx);
19
+ return publisher.enqueue(ctx);
20
+ }
21
+ return {
22
+ name: 'Customer.io Data Pipelines',
23
+ type: 'after',
24
+ version: '1.0.0',
25
+ isLoaded: () => true,
26
+ load: () => Promise.resolve(),
27
+ alias: action,
28
+ group: action,
29
+ identify: action,
30
+ page: action,
31
+ screen: action,
32
+ track: action,
33
+ };
34
+ }
35
+ exports.createNodePlugin = createNodePlugin;
36
+ const createConfiguredNodePlugin = (props, emitter) => {
37
+ const publisher = new publisher_1.Publisher(props, emitter);
38
+ return {
39
+ publisher: publisher,
40
+ plugin: createNodePlugin(publisher),
41
+ };
42
+ };
43
+ exports.createConfiguredNodePlugin = createConfiguredNodePlugin;
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/customerio/index.ts"],"names":[],"mappings":";;;AAAA,2CAAuD;AACvD,qDAAiD;AACjD,uCAA6C;AAK7C,SAAS,cAAc,CAAC,GAAY;IAClC,GAAG,CAAC,WAAW,CAAC,sBAAsB,EAAE,gCAAgC,CAAC,CAAA;IACzE,GAAG,CAAC,WAAW,CAAC,yBAAyB,EAAE,iBAAO,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,IAAA,mBAAa,GAAE,CAAA;IAC/B,IAAI,OAAO,KAAK,MAAM,EAAE;QACtB,GAAG,CAAC,WAAW,CAAC,uBAAuB,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;KAChE;IACD,GAAG,CAAC,WAAW,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAmBD,SAAgB,gBAAgB,CAAC,SAAoB;IACnD,SAAS,MAAM,CAAC,GAAY;QAC1B,cAAc,CAAC,GAAG,CAAC,CAAA;QACnB,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;QACpB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QAC7B,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,MAAM;KACd,CAAA;AACH,CAAC;AAnBD,4CAmBC;AAEM,MAAM,0BAA0B,GAAG,CACxC,KAA+B,EAC/B,OAAoB,EACpB,EAAE;IACF,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC/C,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,gBAAgB,CAAC,SAAS,CAAC;KACpC,CAAA;AACH,CAAC,CAAA;AATY,QAAA,0BAA0B,8BAStC"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Publisher = void 0;
4
+ const cdp_analytics_core_1 = require("@customerio/cdp-analytics-core");
5
+ const abort_1 = require("../../lib/abort");
6
+ const create_url_1 = require("../../lib/create-url");
7
+ const extract_promise_parts_1 = require("../../lib/extract-promise-parts");
8
+ const fetch_1 = require("../../lib/fetch");
9
+ const context_batch_1 = require("./context-batch");
10
+ const base_64_encode_1 = require("../../lib/base-64-encode");
11
+ function sleep(timeoutInMs) {
12
+ return new Promise((resolve) => setTimeout(resolve, timeoutInMs));
13
+ }
14
+ function noop() { }
15
+ /**
16
+ * The Publisher is responsible for batching events and sending them to the API.
17
+ */
18
+ class Publisher {
19
+ constructor({ host, path, maxRetries, maxEventsInBatch, flushInterval, writeKey, httpRequestTimeout, }, emitter) {
20
+ this._emitter = emitter;
21
+ this._maxRetries = maxRetries;
22
+ this._maxEventsInBatch = Math.max(maxEventsInBatch, 1);
23
+ this._flushInterval = flushInterval;
24
+ this._auth = (0, base_64_encode_1.b64encode)(`${writeKey}:`);
25
+ this._url = (0, create_url_1.tryCreateFormattedUrl)(host ?? 'https://cdp.customer.io', path ?? '/v1/batch');
26
+ this._httpRequestTimeout = httpRequestTimeout ?? 10000;
27
+ }
28
+ createBatch() {
29
+ this.pendingFlushTimeout && clearTimeout(this.pendingFlushTimeout);
30
+ const batch = new context_batch_1.ContextBatch(this._maxEventsInBatch);
31
+ this._batch = batch;
32
+ this.pendingFlushTimeout = setTimeout(() => {
33
+ if (batch === this._batch) {
34
+ this._batch = undefined;
35
+ }
36
+ this.pendingFlushTimeout = undefined;
37
+ if (batch.length) {
38
+ this.send(batch).catch(noop);
39
+ }
40
+ }, this._flushInterval);
41
+ return batch;
42
+ }
43
+ clearBatch() {
44
+ this.pendingFlushTimeout && clearTimeout(this.pendingFlushTimeout);
45
+ this._batch = undefined;
46
+ }
47
+ flushAfterClose(pendingItemsCount) {
48
+ if (!pendingItemsCount) {
49
+ // if number of pending items is 0, there will never be anything else entering the batch, since the app is closed.
50
+ return;
51
+ }
52
+ this._closeAndFlushPendingItemsCount = pendingItemsCount;
53
+ // if batch is empty, there's nothing to flush, and when things come in, enqueue will handle them.
54
+ if (!this._batch)
55
+ return;
56
+ // the number of globally pending items will always be larger or the same as batch size.
57
+ // Any mismatch is because some globally pending items are in plugins.
58
+ const isExpectingNoMoreItems = this._batch.length === pendingItemsCount;
59
+ if (isExpectingNoMoreItems) {
60
+ this.send(this._batch).catch(noop);
61
+ this.clearBatch();
62
+ }
63
+ }
64
+ /**
65
+ * Enqueues the context for future delivery.
66
+ * @param ctx - Context containing an event.
67
+ * @returns a promise that resolves with the context after the event has been delivered.
68
+ */
69
+ enqueue(ctx) {
70
+ const batch = this._batch ?? this.createBatch();
71
+ const { promise: ctxPromise, resolve } = (0, extract_promise_parts_1.extractPromiseParts)();
72
+ const pendingItem = {
73
+ context: ctx,
74
+ resolver: resolve,
75
+ };
76
+ /*
77
+ The following logic ensures that a batch is never orphaned,
78
+ and is always sent before a new batch is created.
79
+
80
+ Add an event to the existing batch.
81
+ Success: Check if batch is full or no more items are expected to come in (i.e. closing). If so, send batch.
82
+ Failure: Assume event is too big to fit in current batch - send existing batch.
83
+ Add an event to the new batch.
84
+ Success: Check if batch is full and send if it is.
85
+ Failure: Event exceeds maximum size (it will never fit), fail the event.
86
+ */
87
+ const addStatus = batch.tryAdd(pendingItem);
88
+ if (addStatus.success) {
89
+ const isExpectingNoMoreItems = batch.length === this._closeAndFlushPendingItemsCount;
90
+ const isFull = batch.length === this._maxEventsInBatch;
91
+ if (isFull || isExpectingNoMoreItems) {
92
+ this.send(batch).catch(noop);
93
+ this.clearBatch();
94
+ }
95
+ return ctxPromise;
96
+ }
97
+ // If the new item causes the maximimum event size to be exceeded, send the current batch and create a new one.
98
+ if (batch.length) {
99
+ this.send(batch).catch(noop);
100
+ this.clearBatch();
101
+ }
102
+ const fallbackBatch = this.createBatch();
103
+ const fbAddStatus = fallbackBatch.tryAdd(pendingItem);
104
+ if (fbAddStatus.success) {
105
+ const isExpectingNoMoreItems = fallbackBatch.length === this._closeAndFlushPendingItemsCount;
106
+ if (isExpectingNoMoreItems) {
107
+ this.send(fallbackBatch).catch(noop);
108
+ this.clearBatch();
109
+ }
110
+ return ctxPromise;
111
+ }
112
+ else {
113
+ // this should only occur if max event size is exceeded
114
+ ctx.setFailedDelivery({
115
+ reason: new Error(fbAddStatus.message),
116
+ });
117
+ return Promise.resolve(ctx);
118
+ }
119
+ }
120
+ async send(batch) {
121
+ if (this._closeAndFlushPendingItemsCount) {
122
+ this._closeAndFlushPendingItemsCount -= batch.length;
123
+ }
124
+ const events = batch.getEvents();
125
+ const payload = JSON.stringify({ batch: events });
126
+ const maxAttempts = this._maxRetries + 1;
127
+ let currentAttempt = 0;
128
+ while (currentAttempt < maxAttempts) {
129
+ currentAttempt++;
130
+ let failureReason;
131
+ const [signal, timeoutId] = (0, abort_1.abortSignalAfterTimeout)(this._httpRequestTimeout);
132
+ try {
133
+ const requestInit = {
134
+ signal: signal,
135
+ method: 'POST',
136
+ headers: {
137
+ 'Content-Type': 'application/json',
138
+ Authorization: `Basic ${this._auth}`,
139
+ 'User-Agent': 'cdp-analytics-node/latest',
140
+ },
141
+ body: payload,
142
+ };
143
+ this._emitter.emit('http_request', {
144
+ url: this._url,
145
+ method: requestInit.method,
146
+ headers: requestInit.headers,
147
+ body: requestInit.body,
148
+ });
149
+ const response = await (0, fetch_1.fetch)(this._url, requestInit);
150
+ clearTimeout(timeoutId);
151
+ if (response.ok) {
152
+ // Successfully sent events, so exit!
153
+ batch.resolveEvents();
154
+ return;
155
+ }
156
+ else if (response.status === 400) {
157
+ // Request either malformed or size exceeded - don't retry.
158
+ resolveFailedBatch(batch, new Error(`[${response.status}] ${response.statusText}`));
159
+ return;
160
+ }
161
+ else {
162
+ // Treat other errors as transient and retry.
163
+ failureReason = new Error(`[${response.status}] ${response.statusText}`);
164
+ }
165
+ }
166
+ catch (err) {
167
+ // Network errors get thrown, retry them.
168
+ failureReason = err;
169
+ }
170
+ // Final attempt failed, update context and resolve events.
171
+ if (currentAttempt === maxAttempts) {
172
+ resolveFailedBatch(batch, failureReason);
173
+ return;
174
+ }
175
+ // Retry after attempt-based backoff.
176
+ await sleep((0, cdp_analytics_core_1.backoff)({
177
+ attempt: currentAttempt,
178
+ minTimeout: 25,
179
+ maxTimeout: 1000,
180
+ }));
181
+ }
182
+ }
183
+ }
184
+ exports.Publisher = Publisher;
185
+ function resolveFailedBatch(batch, reason) {
186
+ batch.getContexts().forEach((ctx) => ctx.setFailedDelivery({ reason }));
187
+ batch.resolveEvents();
188
+ }
189
+ //# sourceMappingURL=publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../../src/plugins/customerio/publisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { bindAll, pTimeout, } from '@customerio/cdp-analytics-core';
2
+ import { validateSettings } from './settings';
3
+ import { version } from '../generated/version';
4
+ import { createConfiguredNodePlugin } from '../plugins/customerio';
5
+ import { NodeEventFactory } from './event-factory';
6
+ import { dispatchAndEmit } from './dispatch-emit';
7
+ import { NodeEmitter } from './emitter';
8
+ import { Context } from './context';
9
+ import { NodeEventQueue } from './event-queue';
10
+ export class Analytics extends NodeEmitter {
11
+ constructor(settings) {
12
+ super();
13
+ this._isClosed = false;
14
+ this._pendingEvents = 0;
15
+ validateSettings(settings);
16
+ this._eventFactory = new NodeEventFactory();
17
+ this._queue = new NodeEventQueue();
18
+ const flushInterval = settings.flushInterval ?? 10000;
19
+ this._closeAndFlushDefaultTimeout = flushInterval * 1.25; // add arbitrary multiplier in case an event is in a plugin.
20
+ const { plugin, publisher } = createConfiguredNodePlugin({
21
+ writeKey: settings.writeKey,
22
+ host: settings.host,
23
+ path: settings.path,
24
+ maxRetries: settings.maxRetries ?? 3,
25
+ maxEventsInBatch: settings.maxEventsInBatch ?? 15,
26
+ httpRequestTimeout: settings.httpRequestTimeout,
27
+ flushInterval,
28
+ }, this);
29
+ this._publisher = publisher;
30
+ this.ready = this.register(plugin).then(() => undefined);
31
+ this.emit('initialize', settings);
32
+ bindAll(this);
33
+ }
34
+ get VERSION() {
35
+ return version;
36
+ }
37
+ /**
38
+ * Call this method to stop collecting new events and flush all existing events.
39
+ * This method also waits for any event method-specific callbacks to be triggered,
40
+ * and any of their subsequent promises to be resolved/rejected.
41
+ */
42
+ closeAndFlush({ timeout = this._closeAndFlushDefaultTimeout, } = {}) {
43
+ this._publisher.flushAfterClose(this._pendingEvents);
44
+ this._isClosed = true;
45
+ const promise = new Promise((resolve) => {
46
+ if (!this._pendingEvents) {
47
+ resolve();
48
+ }
49
+ else {
50
+ this.once('drained', () => resolve());
51
+ }
52
+ });
53
+ return timeout ? pTimeout(promise, timeout).catch(() => undefined) : promise;
54
+ }
55
+ _dispatch(CustomerioEvent, callback) {
56
+ if (this._isClosed) {
57
+ this.emit('call_after_close', CustomerioEvent);
58
+ return undefined;
59
+ }
60
+ this._pendingEvents++;
61
+ dispatchAndEmit(CustomerioEvent, this._queue, this, callback)
62
+ .catch((ctx) => ctx)
63
+ .finally(() => {
64
+ this._pendingEvents--;
65
+ if (!this._pendingEvents) {
66
+ this.emit('drained');
67
+ }
68
+ });
69
+ }
70
+ /**
71
+ * Combines two unassociated user identities.
72
+ */
73
+ alias({ userId, previousId, context, timestamp, integrations }, callback) {
74
+ const CustomerioEvent = this._eventFactory.alias(userId, previousId, {
75
+ context,
76
+ integrations,
77
+ timestamp,
78
+ });
79
+ this._dispatch(CustomerioEvent, callback);
80
+ }
81
+ /**
82
+ * Associates an identified user with a collective.
83
+ */
84
+ group({ timestamp, groupId, userId, anonymousId, traits = {}, context, integrations, }, callback) {
85
+ const CustomerioEvent = this._eventFactory.group(groupId, traits, {
86
+ context,
87
+ anonymousId,
88
+ userId,
89
+ timestamp,
90
+ integrations,
91
+ });
92
+ this._dispatch(CustomerioEvent, callback);
93
+ }
94
+ /**
95
+ * Includes a unique userId and (maybe anonymousId) and any optional traits you know about them.
96
+ */
97
+ identify({ userId, anonymousId, traits = {}, context, timestamp, integrations, }, callback) {
98
+ const CustomerioEvent = this._eventFactory.identify(userId, traits, {
99
+ context,
100
+ anonymousId,
101
+ userId,
102
+ timestamp,
103
+ integrations,
104
+ });
105
+ this._dispatch(CustomerioEvent, callback);
106
+ }
107
+ /**
108
+ * The page method lets you record page views on your website, along with optional extra information about the page being viewed.
109
+ */
110
+ page({ userId, anonymousId, category, name, properties, context, timestamp, integrations, }, callback) {
111
+ const CustomerioEvent = this._eventFactory.page(category ?? null, name ?? null, properties, { context, anonymousId, userId, timestamp, integrations });
112
+ this._dispatch(CustomerioEvent, callback);
113
+ }
114
+ /**
115
+ * Records screen views on your app, along with optional extra information
116
+ * about the screen viewed by the user.
117
+ */
118
+ screen({ userId, anonymousId, category, name, properties, context, timestamp, integrations, }, callback) {
119
+ const CustomerioEvent = this._eventFactory.screen(category ?? null, name ?? null, properties, { context, anonymousId, userId, timestamp, integrations });
120
+ this._dispatch(CustomerioEvent, callback);
121
+ }
122
+ /**
123
+ * Records actions your users perform.
124
+ */
125
+ track({ userId, anonymousId, event, properties, context, timestamp, integrations, }, callback) {
126
+ const CustomerioEvent = this._eventFactory.track(event, properties, {
127
+ context,
128
+ userId,
129
+ anonymousId,
130
+ timestamp,
131
+ integrations,
132
+ });
133
+ this._dispatch(CustomerioEvent, callback);
134
+ }
135
+ /**
136
+ * Registers one or more plugins to augment Analytics functionality.
137
+ * @param plugins
138
+ */
139
+ register(...plugins) {
140
+ return this._queue.criticalTasks.run(async () => {
141
+ const ctx = Context.system();
142
+ const registrations = plugins.map((xt) => this._queue.register(ctx, xt, this));
143
+ await Promise.all(registrations);
144
+ this.emit('register', plugins.map((el) => el.name));
145
+ });
146
+ }
147
+ /**
148
+ * Deregisters one or more plugins based on their names.
149
+ * @param pluginNames - The names of one or more plugins to deregister.
150
+ */
151
+ async deregister(...pluginNames) {
152
+ const ctx = Context.system();
153
+ const deregistrations = pluginNames.map((pl) => {
154
+ const plugin = this._queue.plugins.find((p) => p.name === pl);
155
+ if (plugin) {
156
+ return this._queue.deregister(ctx, plugin, this);
157
+ }
158
+ else {
159
+ ctx.log('warn', `plugin ${pl} not found`);
160
+ }
161
+ });
162
+ await Promise.all(deregistrations);
163
+ this.emit('deregister', pluginNames);
164
+ }
165
+ }
166
+ //# sourceMappingURL=analytics-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-node.js","sourceRoot":"","sources":["../../../src/app/analytics-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ // create a derived class since we may want to add node specific things to Context later
2
+ import { CoreContext } from '@customerio/cdp-analytics-core';
3
+ // While this is not a type, it is a definition
4
+ export class Context extends CoreContext {
5
+ static system() {
6
+ return new this({ type: 'track', event: 'system' });
7
+ }
8
+ }
9
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/app/context.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAG5D,+CAA+C;AAC/C,MAAM,OAAO,OAAQ,SAAQ,WAA4B;IACvD,MAAM,CAAU,MAAM;QACpB,OAAO,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrD,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { dispatch } from '@customerio/cdp-analytics-core';
2
+ import { Context } from './context';
3
+ const normalizeDispatchCb = (cb) => (ctx) => {
4
+ const failedDelivery = ctx.failedDelivery();
5
+ return failedDelivery ? cb(failedDelivery.reason, ctx) : cb(undefined, ctx);
6
+ };
7
+ /* Dispatch function, but swallow promise rejections and use event emitter instead */
8
+ export const dispatchAndEmit = async (event, queue, emitter, callback) => {
9
+ try {
10
+ const context = new Context(event);
11
+ const ctx = await dispatch(context, queue, emitter, {
12
+ ...(callback ? { callback: normalizeDispatchCb(callback) } : {}),
13
+ });
14
+ const failedDelivery = ctx.failedDelivery();
15
+ if (failedDelivery) {
16
+ emitter.emit('error', {
17
+ code: 'delivery_failure',
18
+ reason: failedDelivery.reason,
19
+ ctx: ctx,
20
+ });
21
+ }
22
+ else {
23
+ emitter.emit(event.type, ctx);
24
+ }
25
+ }
26
+ catch (err) {
27
+ emitter.emit('error', {
28
+ code: 'unknown',
29
+ reason: err,
30
+ });
31
+ }
32
+ };
33
+ //# sourceMappingURL=dispatch-emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-emit.js","sourceRoot":"","sources":["../../../src/app/dispatch-emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,MAAM,mBAAmB,GAAG,CAAC,EAAY,EAAE,EAAE,CAAC,CAAC,GAAY,EAAE,EAAE;IAC7D,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;IAC3C,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;AAC7E,CAAC,CAAA;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,KAAsB,EACtB,KAAqB,EACrB,OAAoB,EACpB,QAAmB,EACJ,EAAE;IACjB,IAAI;QACF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAClD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CAAA;QACF,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;QAC3C,IAAI,cAAc,EAAE;YAClB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,GAAG,EAAE,GAAG;aACT,CAAC,CAAA;SACH;aAAM;YACL,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;SAC9B;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;YACpB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,GAAG;SACZ,CAAC,CAAA;KACH;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Emitter } from '@customerio/cdp-analytics-core';
2
+ export class NodeEmitter extends Emitter {
3
+ }
4
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../src/app/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAsB7E,MAAM,OAAO,WAAY,SAAQ,OAA0B;CAAI"}
@@ -0,0 +1,8 @@
1
+ import { EventFactory } from '@customerio/cdp-analytics-core';
2
+ import { createMessageId } from '../lib/get-message-id';
3
+ export class NodeEventFactory extends EventFactory {
4
+ constructor() {
5
+ super({ createMessageId });
6
+ }
7
+ }
8
+ //# sourceMappingURL=event-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-factory.js","sourceRoot":"","sources":["../../../src/app/event-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAcvD,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD;QACE,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IAC5B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import { CoreEventQueue, PriorityQueue } from '@customerio/cdp-analytics-core';
2
+ class NodePriorityQueue extends PriorityQueue {
3
+ constructor() {
4
+ super(1, []);
5
+ }
6
+ // do not use an internal "seen" map
7
+ getAttempts(ctx) {
8
+ return ctx.attempts ?? 0;
9
+ }
10
+ updateAttempts(ctx) {
11
+ ctx.attempts = this.getAttempts(ctx) + 1;
12
+ return this.getAttempts(ctx);
13
+ }
14
+ }
15
+ export class NodeEventQueue extends CoreEventQueue {
16
+ constructor() {
17
+ super(new NodePriorityQueue());
18
+ }
19
+ }
20
+ //# sourceMappingURL=event-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../../src/app/event-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAI9E,MAAM,iBAAkB,SAAQ,aAAsB;IACpD;QACE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACd,CAAC;IACD,oCAAoC;IACpC,WAAW,CAAC,GAAY;QACtB,OAAO,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAA;IAC1B,CAAC;IACD,cAAc,CAAC,GAAY;QACzB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,cAA+B;IACjE;QACE,KAAK,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAA;IAChC,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { ValidationError } from '@customerio/cdp-analytics-core';
2
+ export const validateSettings = (settings) => {
3
+ if (!settings.writeKey) {
4
+ throw new ValidationError('writeKey', 'writeKey is missing.');
5
+ }
6
+ };
7
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/app/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAkChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAA2B,EAAE,EAAE;IAC9D,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACtB,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAA;KAC9D;AACH,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../src/app/types/event.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export * from './params';
2
+ export * from './event';
3
+ export * from './plugin';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../../../../src/app/types/params.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.js.map