@nlabs/metropolisjs 0.3.4 → 0.3.6

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 (122) hide show
  1. package/.github/copilot-instructions.md +55 -167
  2. package/AGENTS.md +52 -10
  3. package/README.md +52 -2
  4. package/docs/ACTIONS.md +84 -22
  5. package/docs/assets/metropolisjs-logo.png +0 -0
  6. package/examples/factory-pattern-usage.ts +15 -10
  7. package/lex.config.mjs +5 -8
  8. package/lib/actions/appActions/appActions.d.ts.map +1 -1
  9. package/lib/actions/appActions/appActions.js +77 -6
  10. package/lib/actions/awsRumActions/awsRumActions.d.ts +34 -0
  11. package/lib/actions/awsRumActions/awsRumActions.d.ts.map +1 -0
  12. package/lib/actions/awsRumActions/awsRumActions.js +183 -0
  13. package/lib/actions/crmActions/crmActions.d.ts +87 -0
  14. package/lib/actions/crmActions/crmActions.d.ts.map +1 -0
  15. package/lib/actions/crmActions/crmActions.js +338 -0
  16. package/lib/actions/index.d.ts +3 -0
  17. package/lib/actions/index.d.ts.map +1 -1
  18. package/lib/actions/index.js +4 -1
  19. package/lib/actions/restActions/restActions.d.ts +19 -0
  20. package/lib/actions/restActions/restActions.d.ts.map +1 -0
  21. package/lib/actions/restActions/restActions.js +40 -0
  22. package/lib/actions/userActions/userActions.d.ts +12 -0
  23. package/lib/actions/userActions/userActions.d.ts.map +1 -1
  24. package/lib/actions/userActions/userActions.js +20 -4
  25. package/lib/adapters/appAdapter/appAdapter.d.ts +2 -2
  26. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -1
  27. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +2 -2
  28. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -1
  29. package/lib/adapters/contentAdapter/contentAdapter.d.ts +2 -2
  30. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -1
  31. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +2 -2
  32. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -1
  33. package/lib/adapters/eventAdapter/eventAdapter.d.ts +2 -2
  34. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -1
  35. package/lib/adapters/fileAdapter/fileAdapter.d.ts +2 -2
  36. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -1
  37. package/lib/adapters/groupAdapter/groupAdapter.d.ts +2 -2
  38. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -1
  39. package/lib/adapters/imageAdapter/imageAdapter.d.ts +2 -2
  40. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -1
  41. package/lib/adapters/locationAdapter/locationAdapter.d.ts +2 -2
  42. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -1
  43. package/lib/adapters/messageAdapter/messageAdapter.d.ts +2 -2
  44. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -1
  45. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +2 -2
  46. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -1
  47. package/lib/adapters/personaAdapter/personaAdapter.d.ts +2 -2
  48. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -1
  49. package/lib/adapters/postAdapter/postAdapter.d.ts +2 -2
  50. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -1
  51. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +2 -2
  52. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -1
  53. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +2 -2
  54. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -1
  55. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +2 -2
  56. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -1
  57. package/lib/adapters/tagAdapter/tagAdapter.d.ts +2 -2
  58. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -1
  59. package/lib/adapters/translationAdapter/translationAdapter.d.ts +2 -2
  60. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -1
  61. package/lib/adapters/userAdapter/userAdapter.d.ts +2 -2
  62. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -1
  63. package/lib/adapters/videoAdapter/videoAdapter.d.ts +2 -2
  64. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -1
  65. package/lib/config/index.d.ts +9 -0
  66. package/lib/config/index.d.ts.map +1 -1
  67. package/lib/config/index.js +1 -1
  68. package/lib/constants/Collections.d.ts +16 -0
  69. package/lib/constants/Collections.d.ts.map +1 -1
  70. package/lib/constants/Collections.js +17 -1
  71. package/lib/index.d.ts +6 -3
  72. package/lib/index.d.ts.map +1 -1
  73. package/lib/index.js +6 -3
  74. package/lib/stores/appStore.d.ts +10 -0
  75. package/lib/stores/appStore.d.ts.map +1 -1
  76. package/lib/stores/appStore.js +12 -2
  77. package/lib/tests/actionTestScenarios.d.ts +20 -0
  78. package/lib/tests/actionTestScenarios.d.ts.map +1 -0
  79. package/lib/tests/actionTestScenarios.js +851 -0
  80. package/lib/tests/testGraphQLServer.d.ts.map +1 -0
  81. package/lib/tests/testGraphQLServer.js +197 -0
  82. package/lib/tests/testGraphQLServerSimple.d.ts.map +1 -0
  83. package/lib/tests/testGraphQLServerSimple.js +52 -0
  84. package/lib/types/crm.types.d.ts +100 -0
  85. package/lib/types/crm.types.d.ts.map +1 -0
  86. package/lib/types/crm.types.js +6 -0
  87. package/lib/types/index.d.ts +1 -0
  88. package/lib/types/index.d.ts.map +1 -1
  89. package/lib/types/index.js +2 -1
  90. package/lib/utils/MetropolisProvider.d.ts +1 -1
  91. package/lib/utils/MetropolisProvider.d.ts.map +1 -1
  92. package/lib/utils/actionFactory.d.ts +7 -4
  93. package/lib/utils/actionFactory.d.ts.map +1 -1
  94. package/lib/utils/actionFactory.js +13 -1
  95. package/lib/utils/api.d.ts +15 -2
  96. package/lib/utils/api.d.ts.map +1 -1
  97. package/lib/utils/api.js +120 -32
  98. package/lib/utils/baseActionFactory.d.ts +2 -2
  99. package/lib/utils/dateUtils.d.ts +1 -1
  100. package/lib/utils/dateUtils.d.ts.map +1 -1
  101. package/lib/utils/index.d.ts +2 -2
  102. package/lib/utils/index.d.ts.map +1 -1
  103. package/lib/utils/index.js +3 -3
  104. package/lib/utils/location.d.ts +1 -1
  105. package/lib/utils/location.d.ts.map +1 -1
  106. package/lib/utils/requestCache.d.ts +1 -1
  107. package/lib/utils/requestCache.d.ts.map +1 -1
  108. package/lib/utils/useMetropolis.d.ts +3 -0
  109. package/lib/utils/useMetropolis.d.ts.map +1 -1
  110. package/lib/utils/useMetropolis.js +39 -6
  111. package/lib/utils/validatorFactory.d.ts +1 -1
  112. package/lib/utils/validatorFactory.d.ts.map +1 -1
  113. package/package.json +12 -12
  114. package/tsconfig.lint.json +2 -2
  115. package/tsconfig.test.json +3 -2
  116. package/jest.config.mjs +0 -28
  117. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +0 -1
  118. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +0 -197
  119. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +0 -1
  120. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +0 -52
  121. /package/lib/{__tests__/e2e/helpers → tests}/testGraphQLServer.d.ts +0 -0
  122. /package/lib/{__tests__/e2e/helpers → tests}/testGraphQLServerSimple.d.ts +0 -0
@@ -3,6 +3,7 @@
3
3
  * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
4
  */ import { parseId, parseNum } from '@nlabs/utils';
5
5
  import { validateAppInput } from '../../adapters/appAdapter/appAdapter.js';
6
+ import { APP_CONSTANTS } from '../../stores/appStore.js';
6
7
  import { appMutation, appQuery } from '../../utils/api.js';
7
8
  import { createBaseActions } from '../../utils/baseActionFactory.js';
8
9
  import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
@@ -21,11 +22,25 @@ export const createAppActions = (flux, options)=>{
21
22
  value: appBase.validator(appData)
22
23
  }
23
24
  };
25
+ const onSuccess = (data)=>{
26
+ const app = data?.apps?.add || {};
27
+ return flux.dispatch({
28
+ app,
29
+ type: APP_CONSTANTS.ADD_ITEM_SUCCESS
30
+ });
31
+ };
24
32
  return await appMutation(flux, 'add', DATA_TYPE, queryVariables, [
25
33
  'appId',
26
34
  ...appProps
27
- ]);
35
+ ], {
36
+ ...requestOptions,
37
+ onSuccess
38
+ });
28
39
  } catch (error) {
40
+ flux.dispatch({
41
+ error,
42
+ type: APP_CONSTANTS.ADD_ITEM_ERROR
43
+ });
29
44
  throw error;
30
45
  } finally{
31
46
  await clearCachedRequest(flux, 'app.list');
@@ -46,6 +61,13 @@ export const createAppActions = (flux, options)=>{
46
61
  value: parseId(appId)
47
62
  }
48
63
  };
64
+ const onSuccess = (data)=>{
65
+ const app = data?.apps?.itemById || {};
66
+ return flux.dispatch({
67
+ app,
68
+ type: APP_CONSTANTS.GET_ITEM_SUCCESS
69
+ });
70
+ };
49
71
  const result = await appQuery(flux, 'itemById', DATA_TYPE, queryVariables, [
50
72
  'apiKey',
51
73
  'appId',
@@ -57,12 +79,19 @@ export const createAppActions = (flux, options)=>{
57
79
  'url',
58
80
  'userId',
59
81
  ...appProps
60
- ]);
82
+ ], {
83
+ ...requestOptions,
84
+ onSuccess
85
+ });
61
86
  return await setCachedRequest(flux, `app.itemById:${appId}`, {
62
87
  appId,
63
88
  appProps
64
89
  }, result, requestOptions);
65
90
  } catch (error) {
91
+ flux.dispatch({
92
+ error,
93
+ type: APP_CONSTANTS.GET_ITEM_ERROR
94
+ });
66
95
  throw error;
67
96
  }
68
97
  };
@@ -86,6 +115,13 @@ export const createAppActions = (flux, options)=>{
86
115
  value: parseNum(to)
87
116
  }
88
117
  };
118
+ const onSuccess = (data)=>{
119
+ const list = data?.apps?.list || [];
120
+ return flux.dispatch({
121
+ list,
122
+ type: APP_CONSTANTS.GET_LIST_SUCCESS
123
+ });
124
+ };
89
125
  const result = await appQuery(flux, 'list', DATA_TYPE, queryVariables, [
90
126
  'apiKey',
91
127
  'appId',
@@ -97,13 +133,20 @@ export const createAppActions = (flux, options)=>{
97
133
  'url',
98
134
  'userId',
99
135
  ...appProps
100
- ]);
136
+ ], {
137
+ ...requestOptions,
138
+ onSuccess
139
+ });
101
140
  return await setCachedRequest(flux, 'app.list', {
102
141
  from,
103
142
  to,
104
143
  appProps
105
144
  }, result, requestOptions);
106
145
  } catch (error) {
146
+ flux.dispatch({
147
+ error,
148
+ type: APP_CONSTANTS.GET_LIST_ERROR
149
+ });
107
150
  throw error;
108
151
  }
109
152
  };
@@ -115,11 +158,25 @@ export const createAppActions = (flux, options)=>{
115
158
  value: parseId(appId)
116
159
  }
117
160
  };
161
+ const onSuccess = (data)=>{
162
+ const app = data?.apps?.remove || {};
163
+ return flux.dispatch({
164
+ app,
165
+ type: APP_CONSTANTS.REMOVE_ITEM_SUCCESS
166
+ });
167
+ };
118
168
  return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [
119
169
  'appId',
120
170
  ...appProps
121
- ]);
171
+ ], {
172
+ ...requestOptions,
173
+ onSuccess
174
+ });
122
175
  } catch (error) {
176
+ flux.dispatch({
177
+ error,
178
+ type: APP_CONSTANTS.REMOVE_ITEM_ERROR
179
+ });
123
180
  throw error;
124
181
  } finally{
125
182
  await clearCachedRequest(flux, `app.itemById:${appId}`);
@@ -134,11 +191,25 @@ export const createAppActions = (flux, options)=>{
134
191
  value: appBase.validator(app)
135
192
  }
136
193
  };
194
+ const onSuccess = (data)=>{
195
+ const updatedApp = data?.apps?.update || {};
196
+ return flux.dispatch({
197
+ app: updatedApp,
198
+ type: APP_CONSTANTS.UPDATE_ITEM_SUCCESS
199
+ });
200
+ };
137
201
  return await appMutation(flux, 'update', DATA_TYPE, queryVariables, [
138
202
  'appId',
139
203
  ...appProps
140
- ]);
204
+ ], {
205
+ ...requestOptions,
206
+ onSuccess
207
+ });
141
208
  } catch (error) {
209
+ flux.dispatch({
210
+ error,
211
+ type: APP_CONSTANTS.UPDATE_ITEM_ERROR
212
+ });
142
213
  throw error;
143
214
  } finally{
144
215
  await clearCachedRequest(flux, `app.itemById:${String(app?.appId || '')}`);
@@ -156,4 +227,4 @@ export const createAppActions = (flux, options)=>{
156
227
  };
157
228
  };
158
229
 
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hcHBBY3Rpb25zL2FwcEFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VJZCwgcGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscyc7XG5cbmltcG9ydCB7dmFsaWRhdGVBcHBJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvYXBwQWRhcHRlci9hcHBBZGFwdGVyLmpzJztcbmltcG9ydCB7YXBwTXV0YXRpb24sIGFwcFF1ZXJ5fSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHtjcmVhdGVCYXNlQWN0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGlvbkZhY3RvcnkuanMnO1xuaW1wb3J0IHtjbGVhckNhY2hlZFJlcXVlc3QsIGdldENhY2hlZFJlcXVlc3QsIHNldENhY2hlZFJlcXVlc3R9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUge0FwcFR5cGV9IGZyb20gJy4uLy4uL3R5cGVzL2FwcHMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Jhc2VBZGFwdGVyT3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICdhcHBzJztcblxuZXhwb3J0IHR5cGUgQXBwQWRhcHRlck9wdGlvbnMgPSBCYXNlQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQWN0aW9uc09wdGlvbnMge1xuICBhcHBBZGFwdGVyPzogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogQXBwQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgYXBwQWRhcHRlck9wdGlvbnM/OiBBcHBBZGFwdGVyT3B0aW9ucztcbn1cblxuZXhwb3J0IHR5cGUgQXBwQXBpUmVzdWx0c1R5cGUgPSB7XG4gIGFwcHM6IHtcbiAgICBhZGQ/OiBBcHBUeXBlO1xuICAgIGl0ZW1CeUlkPzogQXBwVHlwZTtcbiAgICBsaXN0PzogQXBwVHlwZVtdO1xuICAgIHJlbW92ZT86IEFwcFR5cGU7XG4gICAgdXBkYXRlPzogQXBwVHlwZTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQWN0aW9ucyB7XG4gIGFkZDogKGFwcERhdGE6IFBhcnRpYWw8QXBwVHlwZT4sIGFwcFByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8QXBwVHlwZT47XG4gIGRlbGV0ZTogKGFwcElkOiBzdHJpbmcsIGFwcFByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8QXBwVHlwZT47XG4gIGl0ZW1CeUlkOiAoYXBwSWQ6IHN0cmluZywgYXBwUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxBcHBUeXBlPjtcbiAgbGlzdDogKGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBhcHBQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEFwcFR5cGVbXT47XG4gIHVwZGF0ZTogKGFwcDogUGFydGlhbDxBcHBUeXBlPiwgYXBwUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxBcHBUeXBlPjtcbiAgdXBkYXRlQXBwQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEFwcEFkYXB0ZXJPcHRpb25zKSA9PiBhbnkpID0+IHZvaWQ7XG4gIHVwZGF0ZUFwcEFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogQXBwQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRBcHBWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBBcHBBZGFwdGVyT3B0aW9ucykgPT5cbiAgdmFsaWRhdGVBcHBJbnB1dChpbnB1dCk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBcHBBY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogQXBwQWN0aW9uc09wdGlvbnNcbik6IEFwcEFjdGlvbnMgPT4ge1xuICBjb25zdCBhcHBCYXNlID0gY3JlYXRlQmFzZUFjdGlvbnMoZmx1eCwgZGVmYXVsdEFwcFZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LmFwcEFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LmFwcEFkYXB0ZXJPcHRpb25zXG4gIH0pO1xuXG4gIGNvbnN0IGFkZCA9IGFzeW5jIChcbiAgICBhcHBEYXRhOiBQYXJ0aWFsPEFwcFR5cGU+LFxuICAgIGFwcFByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8QXBwVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgdHlwZTogJ0FwcElucHV0IScsXG4gICAgICAgICAgdmFsdWU6IGFwcEJhc2UudmFsaWRhdG9yKGFwcERhdGEpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxBcHBUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2FkZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnYXBwSWQnLCAuLi5hcHBQcm9wc11cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnYXBwLmxpc3QnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaXRlbUJ5SWQgPSBhc3luYyAoYXBwSWQ6IHN0cmluZywgYXBwUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxBcHBUeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8QXBwVHlwZT4oZmx1eCwgYGFwcC5pdGVtQnlJZDoke2FwcElkfWAsIHthcHBJZCwgYXBwUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBhcHBJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZUlkKGFwcElkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxBcHBUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2l0ZW1CeUlkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdhcGlLZXknLFxuICAgICAgICAgICdhcHBJZCcsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdpc0FjdGl2ZScsXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgICdzZXR0aW5ncycsXG4gICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICAgLi4uYXBwUHJvcHNcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KGZsdXgsIGBhcHAuaXRlbUJ5SWQ6JHthcHBJZH1gLCB7YXBwSWQsIGFwcFByb3BzfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3QgPSBhc3luYyAoXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgYXBwUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxBcHBUeXBlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxBcHBUeXBlW10+KGZsdXgsICdhcHAubGlzdCcsIHtmcm9tLCB0bywgYXBwUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IHBhcnNlTnVtKGZyb20pXG4gICAgICAgIH0sXG4gICAgICAgIHRvOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IHBhcnNlTnVtKHRvKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxBcHBUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnbGlzdCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnYXBpS2V5JyxcbiAgICAgICAgICAnYXBwSWQnLFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgICAnaXNBY3RpdmUnLFxuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAnc2V0dGluZ3MnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgIC4uLmFwcFByb3BzXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCAnYXBwLmxpc3QnLCB7ZnJvbSwgdG8sIGFwcFByb3BzfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZUFwcCA9IGFzeW5jIChcbiAgICBhcHBJZDogc3RyaW5nLFxuICAgIGFwcFByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8QXBwVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgYXBwSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZChhcHBJZClcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPEFwcFR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAncmVtb3ZlJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWydhcHBJZCcsIC4uLmFwcFByb3BzXVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGBhcHAuaXRlbUJ5SWQ6JHthcHBJZH1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnYXBwLmxpc3QnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlID0gYXN5bmMgKFxuICAgIGFwcDogUGFydGlhbDxBcHBUeXBlPixcbiAgICBhcHBQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPEFwcFR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGFwcDoge1xuICAgICAgICAgIHR5cGU6ICdBcHBVcGRhdGVJbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiBhcHBCYXNlLnZhbGlkYXRvcihhcHApXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxBcHBUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnYXBwSWQnLCAuLi5hcHBQcm9wc11cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgYXBwLml0ZW1CeUlkOiR7U3RyaW5nKGFwcD8uYXBwSWQgfHwgJycpfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICdhcHAubGlzdCcpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBkZWxldGU6IGRlbGV0ZUFwcCxcbiAgICBpdGVtQnlJZCxcbiAgICBsaXN0LFxuICAgIHVwZGF0ZSxcbiAgICB1cGRhdGVBcHBBZGFwdGVyOiBhcHBCYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlQXBwQWRhcHRlck9wdGlvbnM6IGFwcEJhc2UudXBkYXRlT3B0aW9uc1xuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJwYXJzZUlkIiwicGFyc2VOdW0iLCJ2YWxpZGF0ZUFwcElucHV0IiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsImNyZWF0ZUJhc2VBY3Rpb25zIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJEQVRBX1RZUEUiLCJkZWZhdWx0QXBwVmFsaWRhdG9yIiwiaW5wdXQiLCJvcHRpb25zIiwiY3JlYXRlQXBwQWN0aW9ucyIsImZsdXgiLCJhcHBCYXNlIiwiYWRhcHRlciIsImFwcEFkYXB0ZXIiLCJhZGFwdGVyT3B0aW9ucyIsImFwcEFkYXB0ZXJPcHRpb25zIiwiYWRkIiwiYXBwRGF0YSIsImFwcFByb3BzIiwicmVxdWVzdE9wdGlvbnMiLCJxdWVyeVZhcmlhYmxlcyIsImFwcCIsInR5cGUiLCJ2YWx1ZSIsInZhbGlkYXRvciIsImVycm9yIiwiaXRlbUJ5SWQiLCJhcHBJZCIsImNhY2hlZFJlc3VsdCIsInVuZGVmaW5lZCIsInJlc3VsdCIsImxpc3QiLCJmcm9tIiwidG8iLCJkZWxldGVBcHAiLCJ1cGRhdGUiLCJTdHJpbmciLCJkZWxldGUiLCJ1cGRhdGVBcHBBZGFwdGVyIiwidXBkYXRlQWRhcHRlciIsInVwZGF0ZUFwcEFkYXB0ZXJPcHRpb25zIiwidXBkYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsT0FBTyxFQUFFQyxRQUFRLFFBQU8sZUFBZTtBQUUvQyxTQUFRQyxnQkFBZ0IsUUFBTywwQ0FBMEM7QUFDekUsU0FBUUMsV0FBVyxFQUFFQyxRQUFRLFFBQU8scUJBQXFCO0FBQ3pELFNBQVFDLGlCQUFpQixRQUFPLG1DQUFtQztBQUNuRSxTQUFRQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFPLDhCQUE4QjtBQU9uRyxNQUFNQyxZQUFZO0FBNkJsQixNQUFNQyxzQkFBc0IsQ0FBQ0MsT0FBZ0JDLFVBQzNDVixpQkFBaUJTO0FBRW5CLE9BQU8sTUFBTUUsbUJBQW1CLENBQzlCQyxNQUNBRjtJQUVBLE1BQU1HLFVBQVVWLGtCQUFrQlMsTUFBTUoscUJBQXFCO1FBQzNETSxTQUFTSixTQUFTSztRQUNsQkMsZ0JBQWdCTixTQUFTTztJQUMzQjtJQUVBLE1BQU1DLE1BQU0sT0FDVkMsU0FDQUMsV0FBcUIsRUFBRSxFQUN2QkMsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxJQUFJO1lBQ0YsTUFBTUMsaUJBQWlCO2dCQUNyQkMsS0FBSztvQkFDSEMsTUFBTTtvQkFDTkMsT0FBT1osUUFBUWEsU0FBUyxDQUFDUDtnQkFDM0I7WUFDRjtZQUVBLE9BQU8sTUFBTWxCLFlBQ1hXLE1BQ0EsT0FDQUwsV0FDQWUsZ0JBQ0E7Z0JBQUM7bUJBQVlGO2FBQVM7UUFFMUIsRUFBRSxPQUFNTyxPQUFPO1lBQ2IsTUFBTUE7UUFDUixTQUFVO1lBQ1IsTUFBTXZCLG1CQUFtQlEsTUFBTTtRQUNqQztJQUNGO0lBRUEsTUFBTWdCLFdBQVcsT0FBT0MsT0FBZVQsV0FBcUIsRUFBRSxFQUFFQyxpQkFBdUMsQ0FBQyxDQUFDO1FB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
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hcHBBY3Rpb25zL2FwcEFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VJZCwgcGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscyc7XG5cbmltcG9ydCB7dmFsaWRhdGVBcHBJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvYXBwQWRhcHRlci9hcHBBZGFwdGVyLmpzJztcbmltcG9ydCB7QVBQX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL2FwcFN0b3JlLmpzJztcbmltcG9ydCB7YXBwTXV0YXRpb24sIGFwcFF1ZXJ5fSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHtjcmVhdGVCYXNlQWN0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGlvbkZhY3RvcnkuanMnO1xuaW1wb3J0IHtjbGVhckNhY2hlZFJlcXVlc3QsIGdldENhY2hlZFJlcXVlc3QsIHNldENhY2hlZFJlcXVlc3R9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUge0FwcFR5cGV9IGZyb20gJy4uLy4uL3R5cGVzL2FwcHMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Jhc2VBZGFwdGVyT3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICdhcHBzJztcblxuZXhwb3J0IHR5cGUgQXBwQWRhcHRlck9wdGlvbnMgPSBCYXNlQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQWN0aW9uc09wdGlvbnMge1xuICBhcHBBZGFwdGVyPzogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogQXBwQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgYXBwQWRhcHRlck9wdGlvbnM/OiBBcHBBZGFwdGVyT3B0aW9ucztcbn1cblxuZXhwb3J0IHR5cGUgQXBwQXBpUmVzdWx0c1R5cGUgPSB7XG4gIGFwcHM6IHtcbiAgICBhZGQ/OiBBcHBUeXBlO1xuICAgIGl0ZW1CeUlkPzogQXBwVHlwZTtcbiAgICBsaXN0PzogQXBwVHlwZVtdO1xuICAgIHJlbW92ZT86IEFwcFR5cGU7XG4gICAgdXBkYXRlPzogQXBwVHlwZTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQWN0aW9ucyB7XG4gIGFkZDogKGFwcERhdGE6IFBhcnRpYWw8QXBwVHlwZT4sIGFwcFByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8QXBwVHlwZT47XG4gIGRlbGV0ZTogKGFwcElkOiBzdHJpbmcsIGFwcFByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8QXBwVHlwZT47XG4gIGl0ZW1CeUlkOiAoYXBwSWQ6IHN0cmluZywgYXBwUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxBcHBUeXBlPjtcbiAgbGlzdDogKGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBhcHBQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEFwcFR5cGVbXT47XG4gIHVwZGF0ZTogKGFwcDogUGFydGlhbDxBcHBUeXBlPiwgYXBwUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxBcHBUeXBlPjtcbiAgdXBkYXRlQXBwQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEFwcEFkYXB0ZXJPcHRpb25zKSA9PiBhbnkpID0+IHZvaWQ7XG4gIHVwZGF0ZUFwcEFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogQXBwQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRBcHBWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBBcHBBZGFwdGVyT3B0aW9ucykgPT5cbiAgdmFsaWRhdGVBcHBJbnB1dChpbnB1dCk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBcHBBY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogQXBwQWN0aW9uc09wdGlvbnNcbik6IEFwcEFjdGlvbnMgPT4ge1xuICBjb25zdCBhcHBCYXNlID0gY3JlYXRlQmFzZUFjdGlvbnMoZmx1eCwgZGVmYXVsdEFwcFZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LmFwcEFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LmFwcEFkYXB0ZXJPcHRpb25zXG4gIH0pO1xuXG4gIGNvbnN0IGFkZCA9IGFzeW5jIChcbiAgICBhcHBEYXRhOiBQYXJ0aWFsPEFwcFR5cGU+LFxuICAgIGFwcFByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8QXBwVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgdHlwZTogJ0FwcElucHV0IScsXG4gICAgICAgICAgdmFsdWU6IGFwcEJhc2UudmFsaWRhdG9yKGFwcERhdGEpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBwQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgYXBwID0gZGF0YT8uYXBwcz8uYWRkIHx8IHt9O1xuICAgICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7YXBwLCB0eXBlOiBBUFBfQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxBcHBUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2FkZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnYXBwSWQnLCAuLi5hcHBQcm9wc10sXG4gICAgICAgIHsuLi5yZXF1ZXN0T3B0aW9ucywgb25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogQVBQX0NPTlNUQU5UUy5BRERfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnYXBwLmxpc3QnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaXRlbUJ5SWQgPSBhc3luYyAoYXBwSWQ6IHN0cmluZywgYXBwUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxBcHBUeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8QXBwVHlwZT4oZmx1eCwgYGFwcC5pdGVtQnlJZDoke2FwcElkfWAsIHthcHBJZCwgYXBwUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBhcHBJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZUlkKGFwcElkKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwcEFwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcCA9IGRhdGE/LmFwcHM/Lml0ZW1CeUlkIHx8IHt9O1xuICAgICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7YXBwLCB0eXBlOiBBUFBfQ09OU1RBTlRTLkdFVF9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PEFwcFR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaXRlbUJ5SWQnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2FwaUtleScsXG4gICAgICAgICAgJ2FwcElkJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICAgJ2lzQWN0aXZlJyxcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgJ3NldHRpbmdzJyxcbiAgICAgICAgICAndXJsJyxcbiAgICAgICAgICAndXNlcklkJyxcbiAgICAgICAgICAuLi5hcHBQcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7Li4ucmVxdWVzdE9wdGlvbnMsIG9uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCBgYXBwLml0ZW1CeUlkOiR7YXBwSWR9YCwge2FwcElkLCBhcHBQcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBBUFBfQ09OU1RBTlRTLkdFVF9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbGlzdCA9IGFzeW5jIChcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICBhcHBQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPEFwcFR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PEFwcFR5cGVbXT4oZmx1eCwgJ2FwcC5saXN0Jywge2Zyb20sIHRvLCBhcHBQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0oZnJvbSlcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0odG8pXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBwQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgbGlzdCA9IGRhdGE/LmFwcHM/Lmxpc3QgfHwgW107XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBBUFBfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PEFwcFR5cGVbXT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdsaXN0JyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdhcGlLZXknLFxuICAgICAgICAgICdhcHBJZCcsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdpc0FjdGl2ZScsXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgICdzZXR0aW5ncycsXG4gICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICAgLi4uYXBwUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAgey4uLnJlcXVlc3RPcHRpb25zLCBvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgJ2FwcC5saXN0Jywge2Zyb20sIHRvLCBhcHBQcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBBUFBfQ09OU1RBTlRTLkdFVF9MSVNUX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlQXBwID0gYXN5bmMgKFxuICAgIGFwcElkOiBzdHJpbmcsXG4gICAgYXBwUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxBcHBUeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBhcHBJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZUlkKGFwcElkKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwcEFwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcCA9IGRhdGE/LmFwcHM/LnJlbW92ZSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2FwcCwgdHlwZTogQVBQX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9TVUNDRVNTfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb248QXBwVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdyZW1vdmUnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2FwcElkJywgLi4uYXBwUHJvcHNdLFxuICAgICAgICB7Li4ucmVxdWVzdE9wdGlvbnMsIG9uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IEFQUF9DT05TVEFOVFMuUkVNT1ZFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGFwcC5pdGVtQnlJZDoke2FwcElkfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICdhcHAubGlzdCcpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGUgPSBhc3luYyAoXG4gICAgYXBwOiBQYXJ0aWFsPEFwcFR5cGU+LFxuICAgIGFwcFByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8QXBwVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgdHlwZTogJ0FwcFVwZGF0ZUlucHV0IScsXG4gICAgICAgICAgdmFsdWU6IGFwcEJhc2UudmFsaWRhdG9yKGFwcClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcHBBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkQXBwID0gZGF0YT8uYXBwcz8udXBkYXRlIHx8IHt9O1xuICAgICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7YXBwOiB1cGRhdGVkQXBwLCB0eXBlOiBBUFBfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxBcHBUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnYXBwSWQnLCAuLi5hcHBQcm9wc10sXG4gICAgICAgIHsuLi5yZXF1ZXN0T3B0aW9ucywgb25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogQVBQX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgYXBwLml0ZW1CeUlkOiR7U3RyaW5nKGFwcD8uYXBwSWQgfHwgJycpfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICdhcHAubGlzdCcpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBkZWxldGU6IGRlbGV0ZUFwcCxcbiAgICBpdGVtQnlJZCxcbiAgICBsaXN0LFxuICAgIHVwZGF0ZSxcbiAgICB1cGRhdGVBcHBBZGFwdGVyOiBhcHBCYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlQXBwQWRhcHRlck9wdGlvbnM6IGFwcEJhc2UudXBkYXRlT3B0aW9uc1xuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJwYXJzZUlkIiwicGFyc2VOdW0iLCJ2YWxpZGF0ZUFwcElucHV0IiwiQVBQX0NPTlNUQU5UUyIsImFwcE11dGF0aW9uIiwiYXBwUXVlcnkiLCJjcmVhdGVCYXNlQWN0aW9ucyIsImNsZWFyQ2FjaGVkUmVxdWVzdCIsImdldENhY2hlZFJlcXVlc3QiLCJzZXRDYWNoZWRSZXF1ZXN0IiwiREFUQV9UWVBFIiwiZGVmYXVsdEFwcFZhbGlkYXRvciIsImlucHV0Iiwib3B0aW9ucyIsImNyZWF0ZUFwcEFjdGlvbnMiLCJmbHV4IiwiYXBwQmFzZSIsImFkYXB0ZXIiLCJhcHBBZGFwdGVyIiwiYWRhcHRlck9wdGlvbnMiLCJhcHBBZGFwdGVyT3B0aW9ucyIsImFkZCIsImFwcERhdGEiLCJhcHBQcm9wcyIsInJlcXVlc3RPcHRpb25zIiwicXVlcnlWYXJpYWJsZXMiLCJhcHAiLCJ0eXBlIiwidmFsdWUiLCJ2YWxpZGF0b3IiLCJvblN1Y2Nlc3MiLCJkYXRhIiwiYXBwcyIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsImVycm9yIiwiQUREX0lURU1fRVJST1IiLCJpdGVtQnlJZCIsImFwcElkIiwiY2FjaGVkUmVzdWx0IiwidW5kZWZpbmVkIiwiR0VUX0lURU1fU1VDQ0VTUyIsInJlc3VsdCIsIkdFVF9JVEVNX0VSUk9SIiwibGlzdCIsImZyb20iLCJ0byIsIkdFVF9MSVNUX1NVQ0NFU1MiLCJHRVRfTElTVF9FUlJPUiIsImRlbGV0ZUFwcCIsInJlbW92ZSIsIlJFTU9WRV9JVEVNX1NVQ0NFU1MiLCJSRU1PVkVfSVRFTV9FUlJPUiIsInVwZGF0ZSIsInVwZGF0ZWRBcHAiLCJVUERBVEVfSVRFTV9TVUNDRVNTIiwiVVBEQVRFX0lURU1fRVJST1IiLCJTdHJpbmciLCJkZWxldGUiLCJ1cGRhdGVBcHBBZGFwdGVyIiwidXBkYXRlQWRhcHRlciIsInVwZGF0ZUFwcEFkYXB0ZXJPcHRpb25zIiwidXBkYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsT0FBTyxFQUFFQyxRQUFRLFFBQU8sZUFBZTtBQUUvQyxTQUFRQyxnQkFBZ0IsUUFBTywwQ0FBMEM7QUFDekUsU0FBUUMsYUFBYSxRQUFPLDJCQUEyQjtBQUN2RCxTQUFRQyxXQUFXLEVBQUVDLFFBQVEsUUFBTyxxQkFBcUI7QUFDekQsU0FBUUMsaUJBQWlCLFFBQU8sbUNBQW1DO0FBQ25FLFNBQVFDLGtCQUFrQixFQUFFQyxnQkFBZ0IsRUFBRUMsZ0JBQWdCLFFBQU8sOEJBQThCO0FBT25HLE1BQU1DLFlBQVk7QUE2QmxCLE1BQU1DLHNCQUFzQixDQUFDQyxPQUFnQkMsVUFDM0NYLGlCQUFpQlU7QUFFbkIsT0FBTyxNQUFNRSxtQkFBbUIsQ0FDOUJDLE1BQ0FGO0lBRUEsTUFBTUcsVUFBVVYsa0JBQWtCUyxNQUFNSixxQkFBcUI7UUFDM0RNLFNBQVNKLFNBQVNLO1FBQ2xCQyxnQkFBZ0JOLFNBQVNPO0lBQzNCO0lBRUEsTUFBTUMsTUFBTSxPQUNWQyxTQUNBQyxXQUFxQixFQUFFLEVBQ3ZCQyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNQyxpQkFBaUI7Z0JBQ3JCQyxLQUFLO29CQUNIQyxNQUFNO29CQUNOQyxPQUFPWixRQUFRYSxTQUFTLENBQUNQO2dCQUMzQjtZQUNGO1lBQ0EsTUFBTVEsWUFBWSxDQUFDQztnQkFDakIsTUFBTUwsTUFBTUssTUFBTUMsTUFBTVgsT0FBTyxDQUFDO2dCQUNoQyxPQUFPTixLQUFLa0IsUUFBUSxDQUFDO29CQUFDUDtvQkFBS0MsTUFBTXhCLGNBQWMrQixnQkFBZ0I7Z0JBQUE7WUFDakU7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
@@ -0,0 +1,34 @@
1
+ import type { FluxFramework } from '@nlabs/arkhamjs';
2
+ export declare const AWS_RUM_CONSTANTS: {
3
+ readonly TRACK_ERROR: "AWS_RUM_TRACK_ERROR";
4
+ readonly TRACK_QUEUED: "AWS_RUM_TRACK_QUEUED";
5
+ readonly TRACK_SUCCESS: "AWS_RUM_TRACK_SUCCESS";
6
+ };
7
+ export type AwsRumEventType = 'click' | 'page_view' | (string & {});
8
+ export type AwsRumProperty = boolean | number | string;
9
+ export interface AwsRumTrackInput {
10
+ readonly name: string;
11
+ readonly path?: string;
12
+ readonly properties?: Record<string, AwsRumProperty>;
13
+ readonly type: AwsRumEventType;
14
+ }
15
+ export interface AwsRumEvent extends AwsRumTrackInput {
16
+ readonly eventId: string;
17
+ readonly journeyId: string;
18
+ readonly sequence: number;
19
+ readonly timestamp: number;
20
+ }
21
+ export interface AwsRumActionsOptions {
22
+ readonly appId?: string;
23
+ readonly debounceMs?: number;
24
+ readonly dedupeMs?: number;
25
+ readonly enabled?: boolean;
26
+ readonly throttleMs?: number;
27
+ }
28
+ export interface AwsRumActions {
29
+ readonly destroy: () => Promise<void>;
30
+ readonly flush: () => Promise<void>;
31
+ readonly track: (event: AwsRumTrackInput) => void;
32
+ }
33
+ export declare const createAwsRumActions: (flux: FluxFramework, options?: AwsRumActionsOptions) => AwsRumActions;
34
+ //# sourceMappingURL=awsRumActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"awsRumActions.d.ts","sourceRoot":"","sources":["../../../src/actions/awsRumActions/awsRumActions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;AAED,MAAM,WAAW,WAAY,SAAQ,gBAAgB;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACnD;AAyDD,eAAO,MAAM,mBAAmB,GAC9B,MAAM,aAAa,EACnB,UAAS,oBAAyB,KACjC,aAyHF,CAAC"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Copyright (c) 2026-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { rumMutation } from '../../utils/api.js';
5
+ export const AWS_RUM_CONSTANTS = {
6
+ TRACK_ERROR: 'AWS_RUM_TRACK_ERROR',
7
+ TRACK_QUEUED: 'AWS_RUM_TRACK_QUEUED',
8
+ TRACK_SUCCESS: 'AWS_RUM_TRACK_SUCCESS'
9
+ };
10
+ const DEFAULT_DEBOUNCE_MS = 250;
11
+ const DEFAULT_DEDUPE_MS = 1000;
12
+ const DEFAULT_THROTTLE_MS = 1000;
13
+ const MAX_PROPERTIES = 20;
14
+ const MAX_SEEN_EVENTS = 500;
15
+ const createId = ()=>{
16
+ if (typeof globalThis.crypto?.randomUUID === 'function') {
17
+ return globalThis.crypto.randomUUID();
18
+ }
19
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
20
+ };
21
+ const normalizeText = (value, maxLength)=>String(value || '').trim().slice(0, maxLength);
22
+ const sanitizeProperties = (properties = {})=>Object.entries(properties).slice(0, MAX_PROPERTIES).reduce((result, [key, value])=>{
23
+ const propertyKey = normalizeText(key, 64);
24
+ if (!propertyKey || ![
25
+ 'boolean',
26
+ 'number',
27
+ 'string'
28
+ ].includes(typeof value)) {
29
+ return result;
30
+ }
31
+ result[propertyKey] = typeof value === 'string' ? normalizeText(value, 256) : value;
32
+ return result;
33
+ }, {});
34
+ const sanitizeEvent = (event)=>{
35
+ const name = normalizeText(event.name, 128);
36
+ const type = normalizeText(event.type, 64);
37
+ if (!name || !type) {
38
+ return null;
39
+ }
40
+ const path = normalizeText(event.path, 256).split('?')[0].split('#')[0];
41
+ return {
42
+ name,
43
+ ...path ? {
44
+ path
45
+ } : {},
46
+ properties: sanitizeProperties(event.properties),
47
+ type
48
+ };
49
+ };
50
+ const eventFingerprint = (event)=>{
51
+ const properties = Object.entries(event.properties || {}).sort(([left], [right])=>left.localeCompare(right));
52
+ return JSON.stringify([
53
+ event.type,
54
+ event.name,
55
+ event.path || '',
56
+ properties
57
+ ]);
58
+ };
59
+ export const createAwsRumActions = (flux, options = {})=>{
60
+ const appId = normalizeText(options.appId, 128);
61
+ const debounceMs = Math.max(0, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
62
+ const dedupeMs = Math.max(0, options.dedupeMs ?? DEFAULT_DEDUPE_MS);
63
+ const enabled = options.enabled !== false;
64
+ const throttleMs = Math.max(0, options.throttleMs ?? DEFAULT_THROTTLE_MS);
65
+ const journeyId = createId();
66
+ const pendingEvents = new Map();
67
+ const seenEvents = new Map();
68
+ let flushPromise;
69
+ let lastFlushAt = 0;
70
+ let sequence = 0;
71
+ let timer;
72
+ const pruneSeenEvents = ()=>{
73
+ if (seenEvents.size <= MAX_SEEN_EVENTS) {
74
+ return;
75
+ }
76
+ const cutoff = Date.now() - dedupeMs;
77
+ seenEvents.forEach((timestamp, fingerprint)=>{
78
+ if (timestamp < cutoff) {
79
+ seenEvents.delete(fingerprint);
80
+ }
81
+ });
82
+ };
83
+ const flush = async ()=>{
84
+ if (flushPromise) {
85
+ return flushPromise;
86
+ }
87
+ if (!enabled || !appId || pendingEvents.size === 0) {
88
+ return;
89
+ }
90
+ if (timer) {
91
+ clearTimeout(timer);
92
+ timer = undefined;
93
+ }
94
+ const events = [
95
+ ...pendingEvents.values()
96
+ ];
97
+ pendingEvents.clear();
98
+ lastFlushAt = Date.now();
99
+ flushPromise = rumMutation(flux, 'track', 'rum', {
100
+ batch: {
101
+ type: 'RumBatchInput!',
102
+ value: {
103
+ appId,
104
+ events
105
+ }
106
+ }
107
+ }, [
108
+ 'accepted',
109
+ 'appId'
110
+ ]).then(async ()=>{
111
+ await flux.dispatch({
112
+ appId,
113
+ events,
114
+ type: AWS_RUM_CONSTANTS.TRACK_SUCCESS
115
+ });
116
+ }).catch(async (error)=>{
117
+ events.forEach((event)=>pendingEvents.set(eventFingerprint(event), event));
118
+ await flux.dispatch({
119
+ appId,
120
+ error,
121
+ events,
122
+ type: AWS_RUM_CONSTANTS.TRACK_ERROR
123
+ });
124
+ }).finally(()=>{
125
+ flushPromise = undefined;
126
+ });
127
+ return flushPromise;
128
+ };
129
+ const scheduleFlush = ()=>{
130
+ if (timer) {
131
+ clearTimeout(timer);
132
+ }
133
+ const throttleRemaining = Math.max(0, throttleMs - (Date.now() - lastFlushAt));
134
+ timer = setTimeout(()=>void flush(), Math.max(debounceMs, throttleRemaining));
135
+ };
136
+ const track = (input)=>{
137
+ if (!enabled || !appId) {
138
+ return;
139
+ }
140
+ const event = sanitizeEvent(input);
141
+ if (!event) {
142
+ return;
143
+ }
144
+ const fingerprint = eventFingerprint(event);
145
+ const now = Date.now();
146
+ const lastSeenAt = seenEvents.get(fingerprint) || 0;
147
+ if (seenEvents.has(fingerprint) && now - lastSeenAt < dedupeMs) {
148
+ return;
149
+ }
150
+ seenEvents.set(fingerprint, now);
151
+ pruneSeenEvents();
152
+ sequence += 1;
153
+ const queuedEvent = {
154
+ ...event,
155
+ eventId: createId(),
156
+ journeyId,
157
+ sequence,
158
+ timestamp: now
159
+ };
160
+ pendingEvents.set(fingerprint, queuedEvent);
161
+ void flux.dispatch({
162
+ appId,
163
+ event: queuedEvent,
164
+ type: AWS_RUM_CONSTANTS.TRACK_QUEUED
165
+ });
166
+ scheduleFlush();
167
+ };
168
+ const destroy = async ()=>{
169
+ if (timer) {
170
+ clearTimeout(timer);
171
+ timer = undefined;
172
+ }
173
+ await flush();
174
+ seenEvents.clear();
175
+ };
176
+ return {
177
+ destroy,
178
+ flush,
179
+ track
180
+ };
181
+ };
182
+
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hd3NSdW1BY3Rpb25zL2F3c1J1bUFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cnVtTXV0YXRpb259IGZyb20gJy4uLy4uL3V0aWxzL2FwaS5qcyc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuXG5leHBvcnQgY29uc3QgQVdTX1JVTV9DT05TVEFOVFMgPSB7XG4gIFRSQUNLX0VSUk9SOiAnQVdTX1JVTV9UUkFDS19FUlJPUicsXG4gIFRSQUNLX1FVRVVFRDogJ0FXU19SVU1fVFJBQ0tfUVVFVUVEJyxcbiAgVFJBQ0tfU1VDQ0VTUzogJ0FXU19SVU1fVFJBQ0tfU1VDQ0VTUydcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEF3c1J1bUV2ZW50VHlwZSA9ICdjbGljaycgfCAncGFnZV92aWV3JyB8IChzdHJpbmcgJiB7fSk7XG5leHBvcnQgdHlwZSBBd3NSdW1Qcm9wZXJ0eSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtVHJhY2tJbnB1dCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIEF3c1J1bVByb3BlcnR5PjtcbiAgcmVhZG9ubHkgdHlwZTogQXdzUnVtRXZlbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUV2ZW50IGV4dGVuZHMgQXdzUnVtVHJhY2tJbnB1dCB7XG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgam91cm5leUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUFjdGlvbnNPcHRpb25zIHtcbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYm91bmNlTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGRlZHVwZU1zPzogbnVtYmVyO1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGhyb3R0bGVNcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBd3NSdW1BY3Rpb25zIHtcbiAgcmVhZG9ubHkgZGVzdHJveTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVhZG9ubHkgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHJlYWRvbmx5IHRyYWNrOiAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpID0+IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfREVCT1VOQ0VfTVMgPSAyNTA7XG5jb25zdCBERUZBVUxUX0RFRFVQRV9NUyA9IDEwMDA7XG5jb25zdCBERUZBVUxUX1RIUk9UVExFX01TID0gMTAwMDtcbmNvbnN0IE1BWF9QUk9QRVJUSUVTID0gMjA7XG5jb25zdCBNQVhfU0VFTl9FVkVOVFMgPSA1MDA7XG5cbmNvbnN0IGNyZWF0ZUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmNyeXB0bz8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICByZXR1cm4gYCR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodmFsdWU6IHVua25vd24sIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+XG4gIFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpLnNsaWNlKDAsIG1heExlbmd0aCk7XG5cbmNvbnN0IHNhbml0aXplUHJvcGVydGllcyA9IChcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+ID0ge31cbik6IFJlY29yZDxzdHJpbmcsIEF3c1J1bVByb3BlcnR5PiA9PiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKVxuICAuc2xpY2UoMCwgTUFYX1BST1BFUlRJRVMpXG4gIC5yZWR1Y2U8UmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+PigocmVzdWx0LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eUtleSA9IG5vcm1hbGl6ZVRleHQoa2V5LCA2NCk7XG5cbiAgICBpZighcHJvcGVydHlLZXkgfHwgIVsnYm9vbGVhbicsICdudW1iZXInLCAnc3RyaW5nJ10uaW5jbHVkZXModHlwZW9mIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHRbcHJvcGVydHlLZXldID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5vcm1hbGl6ZVRleHQodmFsdWUsIDI1NikgOiB2YWx1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCB7fSk7XG5cbmNvbnN0IHNhbml0aXplRXZlbnQgPSAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpOiBBd3NSdW1UcmFja0lucHV0IHwgbnVsbCA9PiB7XG4gIGNvbnN0IG5hbWUgPSBub3JtYWxpemVUZXh0KGV2ZW50Lm5hbWUsIDEyOCk7XG4gIGNvbnN0IHR5cGUgPSBub3JtYWxpemVUZXh0KGV2ZW50LnR5cGUsIDY0KTtcblxuICBpZighbmFtZSB8fCAhdHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZVRleHQoZXZlbnQucGF0aCwgMjU2KS5zcGxpdCgnPycpWzBdLnNwbGl0KCcjJylbMF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIC4uLihwYXRoID8ge3BhdGh9IDoge30pLFxuICAgIHByb3BlcnRpZXM6IHNhbml0aXplUHJvcGVydGllcyhldmVudC5wcm9wZXJ0aWVzKSxcbiAgICB0eXBlXG4gIH07XG59O1xuXG5jb25zdCBldmVudEZpbmdlcnByaW50ID0gKGV2ZW50OiBBd3NSdW1UcmFja0lucHV0KTogc3RyaW5nID0+IHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKGV2ZW50LnByb3BlcnRpZXMgfHwge30pLnNvcnQoKFtsZWZ0XSwgW3JpZ2h0XSkgPT4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KSk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbZXZlbnQudHlwZSwgZXZlbnQubmFtZSwgZXZlbnQucGF0aCB8fCAnJywgcHJvcGVydGllc10pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUF3c1J1bUFjdGlvbnMgPSAoXG4gIGZsdXg6IEZsdXhGcmFtZXdvcmssXG4gIG9wdGlvbnM6IEF3c1J1bUFjdGlvbnNPcHRpb25zID0ge31cbik6IEF3c1J1bUFjdGlvbnMgPT4ge1xuICBjb25zdCBhcHBJZCA9IG5vcm1hbGl6ZVRleHQob3B0aW9ucy5hcHBJZCwgMTI4KTtcbiAgY29uc3QgZGVib3VuY2VNcyA9IE1hdGgubWF4KDAsIG9wdGlvbnMuZGVib3VuY2VNcyA/PyBERUZBVUxUX0RFQk9VTkNFX01TKTtcbiAgY29uc3QgZGVkdXBlTXMgPSBNYXRoLm1heCgwLCBvcHRpb25zLmRlZHVwZU1zID8/IERFRkFVTFRfREVEVVBFX01TKTtcbiAgY29uc3QgZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCAhPT0gZmFsc2U7XG4gIGNvbnN0IHRocm90dGxlTXMgPSBNYXRoLm1heCgwLCBvcHRpb25zLnRocm90dGxlTXMgPz8gREVGQVVMVF9USFJPVFRMRV9NUyk7XG4gIGNvbnN0IGpvdXJuZXlJZCA9IGNyZWF0ZUlkKCk7XG4gIGNvbnN0IHBlbmRpbmdFdmVudHMgPSBuZXcgTWFwPHN0cmluZywgQXdzUnVtRXZlbnQ+KCk7XG4gIGNvbnN0IHNlZW5FdmVudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBsZXQgZmx1c2hQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdEZsdXNoQXQgPSAwO1xuICBsZXQgc2VxdWVuY2UgPSAwO1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHBydW5lU2VlbkV2ZW50cyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZihzZWVuRXZlbnRzLnNpemUgPD0gTUFYX1NFRU5fRVZFTlRTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIGRlZHVwZU1zO1xuICAgIHNlZW5FdmVudHMuZm9yRWFjaCgodGltZXN0YW1wLCBmaW5nZXJwcmludCkgPT4ge1xuICAgICAgaWYodGltZXN0YW1wIDwgY3V0b2ZmKSB7XG4gICAgICAgIHNlZW5FdmVudHMuZGVsZXRlKGZpbmdlcnByaW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBmbHVzaCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZihmbHVzaFByb21pc2UpIHtcbiAgICAgIHJldHVybiBmbHVzaFByb21pc2U7XG4gICAgfVxuXG4gICAgaWYoIWVuYWJsZWQgfHwgIWFwcElkIHx8IHBlbmRpbmdFdmVudHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRzID0gWy4uLnBlbmRpbmdFdmVudHMudmFsdWVzKCldO1xuICAgIHBlbmRpbmdFdmVudHMuY2xlYXIoKTtcbiAgICBsYXN0Rmx1c2hBdCA9IERhdGUubm93KCk7XG5cbiAgICBmbHVzaFByb21pc2UgPSBydW1NdXRhdGlvbihmbHV4LCAndHJhY2snLCAncnVtJywge1xuICAgICAgYmF0Y2g6IHtcbiAgICAgICAgdHlwZTogJ1J1bUJhdGNoSW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHthcHBJZCwgZXZlbnRzfVxuICAgICAgfVxuICAgIH0sIFsnYWNjZXB0ZWQnLCAnYXBwSWQnXSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7YXBwSWQsIGV2ZW50cywgdHlwZTogQVdTX1JVTV9DT05TVEFOVFMuVFJBQ0tfU1VDQ0VTU30pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiBwZW5kaW5nRXZlbnRzLnNldChldmVudEZpbmdlcnByaW50KGV2ZW50KSwgZXZlbnQpKTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7YXBwSWQsIGVycm9yLCBldmVudHMsIHR5cGU6IEFXU19SVU1fQ09OU1RBTlRTLlRSQUNLX0VSUk9SfSk7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBmbHVzaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBmbHVzaFByb21pc2U7XG4gIH07XG5cbiAgY29uc3Qgc2NoZWR1bGVGbHVzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZih0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvdHRsZVJlbWFpbmluZyA9IE1hdGgubWF4KDAsIHRocm90dGxlTXMgLSAoRGF0ZS5ub3coKSAtIGxhc3RGbHVzaEF0KSk7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgZmx1c2goKSwgTWF0aC5tYXgoZGVib3VuY2VNcywgdGhyb3R0bGVSZW1haW5pbmcpKTtcbiAgfTtcblxuICBjb25zdCB0cmFjayA9IChpbnB1dDogQXdzUnVtVHJhY2tJbnB1dCk6IHZvaWQgPT4ge1xuICAgIGlmKCFlbmFibGVkIHx8ICFhcHBJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50ID0gc2FuaXRpemVFdmVudChpbnB1dCk7XG5cbiAgICBpZighZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5nZXJwcmludCA9IGV2ZW50RmluZ2VycHJpbnQoZXZlbnQpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbGFzdFNlZW5BdCA9IHNlZW5FdmVudHMuZ2V0KGZpbmdlcnByaW50KSB8fCAwO1xuXG4gICAgaWYoc2VlbkV2ZW50cy5oYXMoZmluZ2VycHJpbnQpICYmIG5vdyAtIGxhc3RTZWVuQXQgPCBkZWR1cGVNcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlZW5FdmVudHMuc2V0KGZpbmdlcnByaW50LCBub3cpO1xuICAgIHBydW5lU2VlbkV2ZW50cygpO1xuICAgIHNlcXVlbmNlICs9IDE7XG5cbiAgICBjb25zdCBxdWV1ZWRFdmVudDogQXdzUnVtRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGV2ZW50SWQ6IGNyZWF0ZUlkKCksXG4gICAgICBqb3VybmV5SWQsXG4gICAgICBzZXF1ZW5jZSxcbiAgICAgIHRpbWVzdGFtcDogbm93XG4gICAgfTtcblxuICAgIHBlbmRpbmdFdmVudHMuc2V0KGZpbmdlcnByaW50LCBxdWV1ZWRFdmVudCk7XG4gICAgdm9pZCBmbHV4LmRpc3BhdGNoKHthcHBJZCwgZXZlbnQ6IHF1ZXVlZEV2ZW50LCB0eXBlOiBBV1NfUlVNX0NPTlNUQU5UUy5UUkFDS19RVUVVRUR9KTtcbiAgICBzY2hlZHVsZUZsdXNoKCk7XG4gIH07XG5cbiAgY29uc3QgZGVzdHJveSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZih0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGF3YWl0IGZsdXNoKCk7XG4gICAgc2VlbkV2ZW50cy5jbGVhcigpO1xuICB9O1xuXG4gIHJldHVybiB7ZGVzdHJveSwgZmx1c2gsIHRyYWNrfTtcbn07XG4iXSwibmFtZXMiOlsicnVtTXV0YXRpb24iLCJBV1NfUlVNX0NPTlNUQU5UUyIsIlRSQUNLX0VSUk9SIiwiVFJBQ0tfUVVFVUVEIiwiVFJBQ0tfU1VDQ0VTUyIsIkRFRkFVTFRfREVCT1VOQ0VfTVMiLCJERUZBVUxUX0RFRFVQRV9NUyIsIkRFRkFVTFRfVEhST1RUTEVfTVMiLCJNQVhfUFJPUEVSVElFUyIsIk1BWF9TRUVOX0VWRU5UUyIsImNyZWF0ZUlkIiwiZ2xvYmFsVGhpcyIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJEYXRlIiwibm93IiwidG9TdHJpbmciLCJNYXRoIiwicmFuZG9tIiwic2xpY2UiLCJub3JtYWxpemVUZXh0IiwidmFsdWUiLCJtYXhMZW5ndGgiLCJTdHJpbmciLCJ0cmltIiwic2FuaXRpemVQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJrZXkiLCJwcm9wZXJ0eUtleSIsImluY2x1ZGVzIiwic2FuaXRpemVFdmVudCIsImV2ZW50IiwibmFtZSIsInR5cGUiLCJwYXRoIiwic3BsaXQiLCJldmVudEZpbmdlcnByaW50Iiwic29ydCIsImxlZnQiLCJyaWdodCIsImxvY2FsZUNvbXBhcmUiLCJKU09OIiwic3RyaW5naWZ5IiwiY3JlYXRlQXdzUnVtQWN0aW9ucyIsImZsdXgiLCJvcHRpb25zIiwiYXBwSWQiLCJkZWJvdW5jZU1zIiwibWF4IiwiZGVkdXBlTXMiLCJlbmFibGVkIiwidGhyb3R0bGVNcyIsImpvdXJuZXlJZCIsInBlbmRpbmdFdmVudHMiLCJNYXAiLCJzZWVuRXZlbnRzIiwiZmx1c2hQcm9taXNlIiwibGFzdEZsdXNoQXQiLCJzZXF1ZW5jZSIsInRpbWVyIiwicHJ1bmVTZWVuRXZlbnRzIiwic2l6ZSIsImN1dG9mZiIsImZvckVhY2giLCJ0aW1lc3RhbXAiLCJmaW5nZXJwcmludCIsImRlbGV0ZSIsImZsdXNoIiwiY2xlYXJUaW1lb3V0IiwidW5kZWZpbmVkIiwiZXZlbnRzIiwidmFsdWVzIiwiY2xlYXIiLCJiYXRjaCIsInRoZW4iLCJkaXNwYXRjaCIsImNhdGNoIiwiZXJyb3IiLCJzZXQiLCJmaW5hbGx5Iiwic2NoZWR1bGVGbHVzaCIsInRocm90dGxlUmVtYWluaW5nIiwic2V0VGltZW91dCIsInRyYWNrIiwiaW5wdXQiLCJsYXN0U2VlbkF0IiwiZ2V0IiwiaGFzIiwicXVldWVkRXZlbnQiLCJldmVudElkIiwiZGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsV0FBVyxRQUFPLHFCQUFxQjtBQUkvQyxPQUFPLE1BQU1DLG9CQUFvQjtJQUMvQkMsYUFBYTtJQUNiQyxjQUFjO0lBQ2RDLGVBQWU7QUFDakIsRUFBVztBQWlDWCxNQUFNQyxzQkFBc0I7QUFDNUIsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsa0JBQWtCO0FBRXhCLE1BQU1DLFdBQVc7SUFDZixJQUFHLE9BQU9DLFdBQVdDLE1BQU0sRUFBRUMsZUFBZSxZQUFZO1FBQ3RELE9BQU9GLFdBQVdDLE1BQU0sQ0FBQ0MsVUFBVTtJQUNyQztJQUVBLE9BQU8sR0FBR0MsS0FBS0MsR0FBRyxHQUFHQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUVDLEtBQUtDLE1BQU0sR0FBR0YsUUFBUSxDQUFDLElBQUlHLEtBQUssQ0FBQyxJQUFJO0FBQzVFO0FBRUEsTUFBTUMsZ0JBQWdC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
@@ -0,0 +1,87 @@
1
+ import type { FluxFramework } from '@nlabs/arkhamjs';
2
+ import type { User } from '../../adapters/userAdapter/userAdapter.js';
3
+ import type { ApiOptions } from '../../utils/api.js';
4
+ import type { CustomerNotification, CustomerOrder, MailingList, ShopifyCustomerOrderInput, SupportTicket, SupportTicketEvent, SupportTicketMessage, SupportTicketStatus } from '../../types/crm.types.js';
5
+ export declare const CRM_CONSTANTS: {
6
+ readonly ADD_SUPPORT_TICKET_MESSAGE_ERROR: "CRM_ADD_SUPPORT_TICKET_MESSAGE_ERROR";
7
+ readonly ADD_SUPPORT_TICKET_MESSAGE_SUCCESS: "CRM_ADD_SUPPORT_TICKET_MESSAGE_SUCCESS";
8
+ readonly ADD_USER_TO_MAILING_LIST_ERROR: "CRM_ADD_USER_TO_MAILING_LIST_ERROR";
9
+ readonly ADD_USER_TO_MAILING_LIST_SUCCESS: "CRM_ADD_USER_TO_MAILING_LIST_SUCCESS";
10
+ readonly CREATE_MAILING_LIST_ERROR: "CRM_CREATE_MAILING_LIST_ERROR";
11
+ readonly CREATE_MAILING_LIST_SUCCESS: "CRM_CREATE_MAILING_LIST_SUCCESS";
12
+ readonly CREATE_SUPPORT_TICKET_ERROR: "CRM_CREATE_SUPPORT_TICKET_ERROR";
13
+ readonly CREATE_SUPPORT_TICKET_SUCCESS: "CRM_CREATE_SUPPORT_TICKET_SUCCESS";
14
+ readonly CUSTOMER_NOTIFICATIONS_BY_USER_ERROR: "CRM_CUSTOMER_NOTIFICATIONS_BY_USER_ERROR";
15
+ readonly CUSTOMER_NOTIFICATIONS_BY_USER_SUCCESS: "CRM_CUSTOMER_NOTIFICATIONS_BY_USER_SUCCESS";
16
+ readonly CUSTOMER_ORDERS_BY_USER_ERROR: "CRM_CUSTOMER_ORDERS_BY_USER_ERROR";
17
+ readonly CUSTOMER_ORDERS_BY_USER_SUCCESS: "CRM_CUSTOMER_ORDERS_BY_USER_SUCCESS";
18
+ readonly ELIGIBLE_MAILING_USERS_ERROR: "CRM_ELIGIBLE_MAILING_USERS_ERROR";
19
+ readonly ELIGIBLE_MAILING_USERS_SUCCESS: "CRM_ELIGIBLE_MAILING_USERS_SUCCESS";
20
+ readonly INGEST_SHOPIFY_CUSTOMER_ORDER_ERROR: "CRM_INGEST_SHOPIFY_CUSTOMER_ORDER_ERROR";
21
+ readonly INGEST_SHOPIFY_CUSTOMER_ORDER_SUCCESS: "CRM_INGEST_SHOPIFY_CUSTOMER_ORDER_SUCCESS";
22
+ readonly MAILING_LIST_USERS_ERROR: "CRM_MAILING_LIST_USERS_ERROR";
23
+ readonly MAILING_LIST_USERS_SUCCESS: "CRM_MAILING_LIST_USERS_SUCCESS";
24
+ readonly MAILING_LISTS_ERROR: "CRM_MAILING_LISTS_ERROR";
25
+ readonly MAILING_LISTS_SUCCESS: "CRM_MAILING_LISTS_SUCCESS";
26
+ readonly REMOVE_USER_FROM_MAILING_LIST_ERROR: "CRM_REMOVE_USER_FROM_MAILING_LIST_ERROR";
27
+ readonly REMOVE_USER_FROM_MAILING_LIST_SUCCESS: "CRM_REMOVE_USER_FROM_MAILING_LIST_SUCCESS";
28
+ readonly SUPPORT_TICKET_EVENTS_ERROR: "CRM_SUPPORT_TICKET_EVENTS_ERROR";
29
+ readonly SUPPORT_TICKET_EVENTS_SUCCESS: "CRM_SUPPORT_TICKET_EVENTS_SUCCESS";
30
+ readonly SUPPORT_TICKET_MESSAGES_ERROR: "CRM_SUPPORT_TICKET_MESSAGES_ERROR";
31
+ readonly SUPPORT_TICKET_MESSAGES_SUCCESS: "CRM_SUPPORT_TICKET_MESSAGES_SUCCESS";
32
+ readonly SUPPORT_TICKETS_ERROR: "CRM_SUPPORT_TICKETS_ERROR";
33
+ readonly SUPPORT_TICKETS_SUCCESS: "CRM_SUPPORT_TICKETS_SUCCESS";
34
+ readonly UPDATE_SUPPORT_TICKET_STATUS_ERROR: "CRM_UPDATE_SUPPORT_TICKET_STATUS_ERROR";
35
+ readonly UPDATE_SUPPORT_TICKET_STATUS_SUCCESS: "CRM_UPDATE_SUPPORT_TICKET_STATUS_SUCCESS";
36
+ readonly USERS_BY_PURCHASED_PRODUCT_ERROR: "CRM_USERS_BY_PURCHASED_PRODUCT_ERROR";
37
+ readonly USERS_BY_PURCHASED_PRODUCT_SUCCESS: "CRM_USERS_BY_PURCHASED_PRODUCT_SUCCESS";
38
+ };
39
+ export interface CrmActionsOptions {
40
+ }
41
+ export type CrmApiResultsType = {
42
+ readonly crm: {
43
+ readonly addSupportTicketMessage?: SupportTicketMessage;
44
+ readonly addUserToMailingList?: MailingList;
45
+ readonly createMailingList?: MailingList;
46
+ readonly createSupportTicket?: SupportTicket;
47
+ readonly customerNotificationsByUser?: CustomerNotification[];
48
+ readonly customerOrdersByUser?: CustomerOrder[];
49
+ readonly eligibleMailingUsers?: User[];
50
+ readonly ingestShopifyCustomerOrder?: CustomerOrder;
51
+ readonly mailingLists?: MailingList[];
52
+ readonly mailingListUsers?: User[];
53
+ readonly removeUserFromMailingList?: boolean;
54
+ readonly supportTicketEvents?: SupportTicketEvent[];
55
+ readonly supportTicketMessages?: SupportTicketMessage[];
56
+ readonly supportTickets?: SupportTicket[];
57
+ readonly updateSupportTicketStatus?: SupportTicket;
58
+ readonly usersByPurchasedProduct?: User[];
59
+ };
60
+ };
61
+ export interface CrmActions {
62
+ readonly addSupportTicketMessage: (message: Partial<SupportTicketMessage>, messageProps?: string[], requestOptions?: ApiOptions) => Promise<SupportTicketMessage>;
63
+ readonly addUserToMailingList: (userId: string, mailingListId: string, source?: string, mailingListProps?: string[], requestOptions?: ApiOptions) => Promise<MailingList>;
64
+ readonly createMailingList: (mailingList: Partial<MailingList>, mailingListProps?: string[], requestOptions?: ApiOptions) => Promise<MailingList>;
65
+ readonly createSupportTicket: (ticket: Partial<SupportTicket>, ticketProps?: string[], requestOptions?: ApiOptions) => Promise<SupportTicket>;
66
+ readonly customerNotificationsByUser: (userId: string, notificationProps?: string[], requestOptions?: ApiOptions) => Promise<CustomerNotification[]>;
67
+ readonly customerOrdersByUser: (userId: string, orderProps?: string[], requestOptions?: ApiOptions) => Promise<CustomerOrder[]>;
68
+ readonly eligibleMailingUsers: (options?: {
69
+ readonly excludeOpenSupportTickets?: boolean;
70
+ readonly mailingListId?: string;
71
+ readonly productId?: string;
72
+ }, userProps?: string[], requestOptions?: ApiOptions) => Promise<User[]>;
73
+ readonly ingestShopifyCustomerOrder: (order: ShopifyCustomerOrderInput, orderProps?: string[], requestOptions?: ApiOptions) => Promise<CustomerOrder>;
74
+ readonly mailingLists: (mailingListProps?: string[], requestOptions?: ApiOptions) => Promise<MailingList[]>;
75
+ readonly mailingListUsers: (mailingListId: string, userProps?: string[], requestOptions?: ApiOptions) => Promise<User[]>;
76
+ readonly removeUserFromMailingList: (userId: string, mailingListId: string, requestOptions?: ApiOptions) => Promise<boolean>;
77
+ readonly supportTicketEvents: (supportTicketId: string, eventProps?: string[], requestOptions?: ApiOptions) => Promise<SupportTicketEvent[]>;
78
+ readonly supportTicketMessages: (supportTicketId: string, messageProps?: string[], requestOptions?: ApiOptions) => Promise<SupportTicketMessage[]>;
79
+ readonly supportTickets: (filters?: {
80
+ readonly status?: string;
81
+ readonly userId?: string;
82
+ }, ticketProps?: string[], requestOptions?: ApiOptions) => Promise<SupportTicket[]>;
83
+ readonly updateSupportTicketStatus: (supportTicketId: string, status: SupportTicketStatus, resolutionSummary?: string, ticketProps?: string[], requestOptions?: ApiOptions) => Promise<SupportTicket>;
84
+ readonly usersByPurchasedProduct: (productId: string, userProps?: string[], requestOptions?: ApiOptions) => Promise<User[]>;
85
+ }
86
+ export declare const createCrmActions: (flux: FluxFramework, _options?: CrmActionsOptions) => CrmActions;
87
+ //# sourceMappingURL=crmActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crmActions.d.ts","sourceRoot":"","sources":["../../../src/actions/crmActions/crmActions.ts"],"names":[],"mappings":"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"}