@launchdarkly/js-sdk-common 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +25 -0
  3. package/dist/AttributeReference.d.ts +35 -0
  4. package/dist/AttributeReference.d.ts.map +1 -0
  5. package/dist/AttributeReference.js +126 -0
  6. package/dist/AttributeReference.js.map +1 -0
  7. package/dist/Context.d.ts +90 -0
  8. package/dist/Context.d.ts.map +1 -0
  9. package/dist/Context.js +385 -0
  10. package/dist/Context.js.map +1 -0
  11. package/dist/ContextFilter.d.ts +11 -0
  12. package/dist/ContextFilter.d.ts.map +1 -0
  13. package/dist/ContextFilter.js +122 -0
  14. package/dist/ContextFilter.js.map +1 -0
  15. package/dist/api/context/LDContext.d.ts +8 -0
  16. package/dist/api/context/LDContext.d.ts.map +1 -0
  17. package/dist/api/context/LDContext.js +3 -0
  18. package/dist/api/context/LDContext.js.map +1 -0
  19. package/dist/api/context/LDContextCommon.d.ts +29 -0
  20. package/dist/api/context/LDContextCommon.d.ts.map +1 -0
  21. package/dist/api/context/LDContextCommon.js +3 -0
  22. package/dist/api/context/LDContextCommon.js.map +1 -0
  23. package/dist/api/context/LDContextMeta.d.ts +52 -0
  24. package/dist/api/context/LDContextMeta.d.ts.map +1 -0
  25. package/dist/api/context/LDContextMeta.js +3 -0
  26. package/dist/api/context/LDContextMeta.js.map +1 -0
  27. package/dist/api/context/LDMultiKindContext.d.ts +46 -0
  28. package/dist/api/context/LDMultiKindContext.d.ts.map +1 -0
  29. package/dist/api/context/LDMultiKindContext.js +3 -0
  30. package/dist/api/context/LDMultiKindContext.js.map +1 -0
  31. package/dist/api/context/LDSingleKindContext.d.ts +24 -0
  32. package/dist/api/context/LDSingleKindContext.d.ts.map +1 -0
  33. package/dist/api/context/LDSingleKindContext.js +3 -0
  34. package/dist/api/context/LDSingleKindContext.js.map +1 -0
  35. package/dist/api/context/LDUser.d.ts +66 -0
  36. package/dist/api/context/LDUser.d.ts.map +1 -0
  37. package/dist/api/context/LDUser.js +3 -0
  38. package/dist/api/context/LDUser.js.map +1 -0
  39. package/dist/api/context/index.d.ts +7 -0
  40. package/dist/api/context/index.d.ts.map +1 -0
  41. package/dist/api/context/index.js +23 -0
  42. package/dist/api/context/index.js.map +1 -0
  43. package/dist/api/data/LDEvaluationDetail.d.ts +27 -0
  44. package/dist/api/data/LDEvaluationDetail.d.ts.map +1 -0
  45. package/dist/api/data/LDEvaluationDetail.js +3 -0
  46. package/dist/api/data/LDEvaluationDetail.js.map +1 -0
  47. package/dist/api/data/LDEvaluationReason.d.ts +57 -0
  48. package/dist/api/data/LDEvaluationReason.d.ts.map +1 -0
  49. package/dist/api/data/LDEvaluationReason.js +3 -0
  50. package/dist/api/data/LDEvaluationReason.js.map +1 -0
  51. package/dist/api/data/LDFlagSet.d.ts +8 -0
  52. package/dist/api/data/LDFlagSet.d.ts.map +1 -0
  53. package/dist/api/data/LDFlagSet.js +3 -0
  54. package/dist/api/data/LDFlagSet.js.map +1 -0
  55. package/dist/api/data/LDFlagValue.d.ts +7 -0
  56. package/dist/api/data/LDFlagValue.d.ts.map +1 -0
  57. package/dist/api/data/LDFlagValue.js +3 -0
  58. package/dist/api/data/LDFlagValue.js.map +1 -0
  59. package/dist/api/data/index.d.ts +5 -0
  60. package/dist/api/data/index.d.ts.map +1 -0
  61. package/dist/api/data/index.js +21 -0
  62. package/dist/api/data/index.js.map +1 -0
  63. package/dist/api/index.d.ts +7 -0
  64. package/dist/api/index.d.ts.map +1 -0
  65. package/dist/api/index.js +24 -0
  66. package/dist/api/index.js.map +1 -0
  67. package/dist/api/logging/BasicLoggerOptions.d.ts +43 -0
  68. package/dist/api/logging/BasicLoggerOptions.d.ts.map +1 -0
  69. package/dist/api/logging/BasicLoggerOptions.js +3 -0
  70. package/dist/api/logging/BasicLoggerOptions.js.map +1 -0
  71. package/dist/api/logging/LDLogLevel.d.ts +10 -0
  72. package/dist/api/logging/LDLogLevel.d.ts.map +1 -0
  73. package/dist/api/logging/LDLogLevel.js +3 -0
  74. package/dist/api/logging/LDLogLevel.js.map +1 -0
  75. package/dist/api/logging/LDLogger.d.ts +47 -0
  76. package/dist/api/logging/LDLogger.d.ts.map +1 -0
  77. package/dist/api/logging/LDLogger.js +3 -0
  78. package/dist/api/logging/LDLogger.js.map +1 -0
  79. package/dist/api/logging/index.d.ts +4 -0
  80. package/dist/api/logging/index.d.ts.map +1 -0
  81. package/dist/api/logging/index.js +20 -0
  82. package/dist/api/logging/index.js.map +1 -0
  83. package/dist/api/options/LDClientContext.d.ts +43 -0
  84. package/dist/api/options/LDClientContext.d.ts.map +1 -0
  85. package/dist/api/options/LDClientContext.js +3 -0
  86. package/dist/api/options/LDClientContext.js.map +1 -0
  87. package/dist/api/options/index.d.ts +3 -0
  88. package/dist/api/options/index.d.ts.map +1 -0
  89. package/dist/api/options/index.js +3 -0
  90. package/dist/api/options/index.js.map +1 -0
  91. package/dist/api/platform/Crypto.d.ts +31 -0
  92. package/dist/api/platform/Crypto.d.ts.map +1 -0
  93. package/dist/api/platform/Crypto.js +3 -0
  94. package/dist/api/platform/Crypto.js.map +1 -0
  95. package/dist/api/platform/EventSource.d.ts +25 -0
  96. package/dist/api/platform/EventSource.d.ts.map +1 -0
  97. package/dist/api/platform/EventSource.js +3 -0
  98. package/dist/api/platform/EventSource.js.map +1 -0
  99. package/dist/api/platform/Filesystem.d.ts +40 -0
  100. package/dist/api/platform/Filesystem.d.ts.map +1 -0
  101. package/dist/api/platform/Filesystem.js +3 -0
  102. package/dist/api/platform/Filesystem.js.map +1 -0
  103. package/dist/api/platform/Info.d.ts +64 -0
  104. package/dist/api/platform/Info.d.ts.map +1 -0
  105. package/dist/api/platform/Info.js +3 -0
  106. package/dist/api/platform/Info.js.map +1 -0
  107. package/dist/api/platform/Platform.d.ts +25 -0
  108. package/dist/api/platform/Platform.d.ts.map +1 -0
  109. package/dist/api/platform/Platform.js +3 -0
  110. package/dist/api/platform/Platform.js.map +1 -0
  111. package/dist/api/platform/Requests.d.ts +75 -0
  112. package/dist/api/platform/Requests.d.ts.map +1 -0
  113. package/dist/api/platform/Requests.js +6 -0
  114. package/dist/api/platform/Requests.js.map +1 -0
  115. package/dist/api/platform/index.d.ts +7 -0
  116. package/dist/api/platform/index.d.ts.map +1 -0
  117. package/dist/api/platform/index.js +23 -0
  118. package/dist/api/platform/index.js.map +1 -0
  119. package/dist/api/subsystem/LDContextDeduplicator.d.ts +24 -0
  120. package/dist/api/subsystem/LDContextDeduplicator.d.ts.map +1 -0
  121. package/dist/api/subsystem/LDContextDeduplicator.js +3 -0
  122. package/dist/api/subsystem/LDContextDeduplicator.js.map +1 -0
  123. package/dist/api/subsystem/LDEventProcessor.d.ts +7 -0
  124. package/dist/api/subsystem/LDEventProcessor.d.ts.map +1 -0
  125. package/dist/api/subsystem/LDEventProcessor.js +3 -0
  126. package/dist/api/subsystem/LDEventProcessor.js.map +1 -0
  127. package/dist/api/subsystem/LDEventSender.d.ts +18 -0
  128. package/dist/api/subsystem/LDEventSender.d.ts.map +1 -0
  129. package/dist/api/subsystem/LDEventSender.js +15 -0
  130. package/dist/api/subsystem/LDEventSender.js.map +1 -0
  131. package/dist/api/subsystem/index.d.ts +5 -0
  132. package/dist/api/subsystem/index.d.ts.map +1 -0
  133. package/dist/api/subsystem/index.js +7 -0
  134. package/dist/api/subsystem/index.js.map +1 -0
  135. package/dist/index.d.ts +10 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +29 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/internal/events/EventProcessor.d.ts +51 -0
  140. package/dist/internal/events/EventProcessor.d.ts.map +1 -0
  141. package/dist/internal/events/EventProcessor.js +214 -0
  142. package/dist/internal/events/EventProcessor.js.map +1 -0
  143. package/dist/internal/events/EventSummarizer.d.ts +2 -0
  144. package/dist/internal/events/EventSummarizer.d.ts.map +1 -0
  145. package/dist/internal/events/EventSummarizer.js +84 -0
  146. package/dist/internal/events/EventSummarizer.js.map +1 -0
  147. package/dist/internal/events/InputCustomEvent.d.ts +11 -0
  148. package/dist/internal/events/InputCustomEvent.d.ts.map +1 -0
  149. package/dist/internal/events/InputCustomEvent.js +14 -0
  150. package/dist/internal/events/InputCustomEvent.js.map +1 -0
  151. package/dist/internal/events/InputEvalEvent.d.ts +19 -0
  152. package/dist/internal/events/InputEvalEvent.d.ts.map +1 -0
  153. package/dist/internal/events/InputEvalEvent.js +35 -0
  154. package/dist/internal/events/InputEvalEvent.js.map +1 -0
  155. package/dist/internal/events/InputEvent.d.ts +6 -0
  156. package/dist/internal/events/InputEvent.d.ts.map +1 -0
  157. package/dist/internal/events/InputEvent.js +3 -0
  158. package/dist/internal/events/InputEvent.js.map +1 -0
  159. package/dist/internal/events/InputEventBase.d.ts +8 -0
  160. package/dist/internal/events/InputEventBase.d.ts.map +1 -0
  161. package/dist/internal/events/InputEventBase.js +11 -0
  162. package/dist/internal/events/InputEventBase.js.map +1 -0
  163. package/dist/internal/events/InputIdentifyEvent.d.ts +8 -0
  164. package/dist/internal/events/InputIdentifyEvent.d.ts.map +1 -0
  165. package/dist/internal/events/InputIdentifyEvent.js +11 -0
  166. package/dist/internal/events/InputIdentifyEvent.js.map +1 -0
  167. package/dist/internal/events/LDInvalidSDKKeyError.d.ts +4 -0
  168. package/dist/internal/events/LDInvalidSDKKeyError.d.ts.map +1 -0
  169. package/dist/internal/events/LDInvalidSDKKeyError.js +10 -0
  170. package/dist/internal/events/LDInvalidSDKKeyError.js.map +1 -0
  171. package/dist/internal/events/SummaryCounter.d.ts +2 -0
  172. package/dist/internal/events/SummaryCounter.d.ts.map +1 -0
  173. package/dist/internal/events/SummaryCounter.js +20 -0
  174. package/dist/internal/events/SummaryCounter.js.map +1 -0
  175. package/dist/internal/events/guards.d.ts +7 -0
  176. package/dist/internal/events/guards.d.ts.map +1 -0
  177. package/dist/internal/events/guards.js +16 -0
  178. package/dist/internal/events/guards.js.map +1 -0
  179. package/dist/internal/events/index.d.ts +7 -0
  180. package/dist/internal/events/index.d.ts.map +1 -0
  181. package/dist/internal/events/index.js +12 -0
  182. package/dist/internal/events/index.js.map +1 -0
  183. package/dist/internal/index.d.ts +2 -0
  184. package/dist/internal/index.d.ts.map +1 -0
  185. package/dist/internal/index.js +18 -0
  186. package/dist/internal/index.js.map +1 -0
  187. package/dist/logging/BasicLogger.d.ts +27 -0
  188. package/dist/logging/BasicLogger.d.ts.map +1 -0
  189. package/dist/logging/BasicLogger.js +89 -0
  190. package/dist/logging/BasicLogger.js.map +1 -0
  191. package/dist/logging/SafeLogger.d.ts +28 -0
  192. package/dist/logging/SafeLogger.d.ts.map +1 -0
  193. package/dist/logging/SafeLogger.js +63 -0
  194. package/dist/logging/SafeLogger.js.map +1 -0
  195. package/dist/logging/format.d.ts +2 -0
  196. package/dist/logging/format.d.ts.map +1 -0
  197. package/dist/logging/format.js +156 -0
  198. package/dist/logging/format.js.map +1 -0
  199. package/dist/logging/index.d.ts +4 -0
  200. package/dist/logging/index.d.ts.map +1 -0
  201. package/dist/logging/index.js +8 -0
  202. package/dist/logging/index.js.map +1 -0
  203. package/dist/options/ApplicationTags.d.ts +15 -0
  204. package/dist/options/ApplicationTags.d.ts.map +1 -0
  205. package/dist/options/ApplicationTags.js +57 -0
  206. package/dist/options/ApplicationTags.js.map +1 -0
  207. package/dist/options/ClientContext.d.ts +36 -0
  208. package/dist/options/ClientContext.d.ts.map +1 -0
  209. package/dist/options/ClientContext.js +19 -0
  210. package/dist/options/ClientContext.js.map +1 -0
  211. package/dist/options/OptionMessages.d.ts +14 -0
  212. package/dist/options/OptionMessages.d.ts.map +1 -0
  213. package/dist/options/OptionMessages.js +33 -0
  214. package/dist/options/OptionMessages.js.map +1 -0
  215. package/dist/options/ServiceEndpoints.d.ts +10 -0
  216. package/dist/options/ServiceEndpoints.d.ts.map +1 -0
  217. package/dist/options/ServiceEndpoints.js +17 -0
  218. package/dist/options/ServiceEndpoints.js.map +1 -0
  219. package/dist/options/index.d.ts +6 -0
  220. package/dist/options/index.d.ts.map +1 -0
  221. package/dist/options/index.js +12 -0
  222. package/dist/options/index.js.map +1 -0
  223. package/dist/validators.d.ts +84 -0
  224. package/dist/validators.d.ts.map +1 -0
  225. package/dist/validators.js +149 -0
  226. package/dist/validators.js.map +1 -0
  227. package/package.json +40 -0
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const AttributeReference_1 = require("./AttributeReference");
4
+ const validators_1 = require("./validators");
5
+ // The general strategy for the context is to transform the passed in context
6
+ // as little as possible. We do convert the legacy users to a single kind
7
+ // context, but we do not translate all passed contexts into a rigid structure.
8
+ // The context will have to be copied for events, but we want to avoid any
9
+ // copying that we can.
10
+ // So we validate that the information we are given is correct, and then we
11
+ // just proxy calls with a nicely typed interface.
12
+ // This is to reduce work on the hot-path. Later, for event processing, deeper
13
+ // cloning of the context will be done.
14
+ // Validates a kind excluding check that it isn't "kind".
15
+ const KindValidator = validators_1.TypeValidators.stringMatchingRegex(/^(\w|\.|-)+$/);
16
+ // When no kind is specified, then this kind will be used.
17
+ const DEFAULT_KIND = 'user';
18
+ // The API allows for calling with an `LDContext` which is
19
+ // `LDUser | LDSingleKindContext | LDMultiKindContext`. When ingesting a context
20
+ // first the type must be determined to allow us to put it into a consistent type.
21
+ /**
22
+ * The partial URL encoding is needed because : is a valid character in context keys.
23
+ *
24
+ * Partial encoding is the replacement of all colon (:) characters with the URL
25
+ * encoded equivalent (%3A) and all percent (%) characters with the URL encoded
26
+ * equivalent (%25).
27
+ * @param key The key to encode.
28
+ * @returns Partially URL encoded key.
29
+ */
30
+ function encodeKey(key) {
31
+ if (key.includes('%') || key.includes(':')) {
32
+ return key.replace(/%/g, '%25').replace(/:/g, '%3A');
33
+ }
34
+ return key;
35
+ }
36
+ /**
37
+ * Check if a context is a single kind context.
38
+ * @param context
39
+ * @returns true if the context is a single kind context.
40
+ */
41
+ function isSingleKind(context) {
42
+ if ('kind' in context) {
43
+ return validators_1.TypeValidators.String.is(context.kind) && context.kind !== 'multi';
44
+ }
45
+ return false;
46
+ }
47
+ /**
48
+ * Check if a context is a multi-kind context.
49
+ * @param context
50
+ * @returns true if it is a multi-kind context.
51
+ */
52
+ function isMultiKind(context) {
53
+ if ('kind' in context) {
54
+ return validators_1.TypeValidators.String.is(context.kind) && context.kind === 'multi';
55
+ }
56
+ return false;
57
+ }
58
+ /**
59
+ * Check if a context is a legacy user context.
60
+ * @param context
61
+ * @returns true if it is a legacy user context.
62
+ */
63
+ function isLegacyUser(context) {
64
+ return !('kind' in context) || context.kind === null || context.kind === undefined;
65
+ }
66
+ /**
67
+ * Check if the given value is a LDContextCommon.
68
+ * @param kindOrContext
69
+ * @returns true if it is an LDContextCommon
70
+ *
71
+ * Due to a limitation in the expressiveness of these highly polymorphic types any field
72
+ * in a multi-kind context can either be a context or 'kind'. So we need to re-assure
73
+ * the compiler that it isn't the word multi.
74
+ *
75
+ * Because we do not allow top level values in a multi-kind context we can validate
76
+ * that as well.
77
+ */
78
+ function isContextCommon(kindOrContext) {
79
+ return kindOrContext && validators_1.TypeValidators.Object.is(kindOrContext);
80
+ }
81
+ /**
82
+ * Validate a context kind.
83
+ * @param kind
84
+ * @returns true if the kind is valid.
85
+ */
86
+ function validKind(kind) {
87
+ return KindValidator.is(kind) && kind !== 'kind';
88
+ }
89
+ /**
90
+ * Validate a context key.
91
+ * @param key
92
+ * @returns true if the key is valid.
93
+ */
94
+ function validKey(key) {
95
+ return validators_1.TypeValidators.String.is(key) && key !== '';
96
+ }
97
+ function processPrivateAttributes(privateAttributes, literals = false) {
98
+ if (privateAttributes) {
99
+ return privateAttributes.map((privateAttribute) => new AttributeReference_1.default(privateAttribute, literals));
100
+ }
101
+ return [];
102
+ }
103
+ function defined(value) {
104
+ return value !== null && value !== undefined;
105
+ }
106
+ /**
107
+ * Convert a legacy user to a single kind context.
108
+ * @param user
109
+ * @returns A single kind context.
110
+ */
111
+ function legacyToSingleKind(user) {
112
+ const singleKindContext = Object.assign(Object.assign({}, (user.custom || [])), { kind: 'user', key: String(user.key) });
113
+ // For legacy users we never established a difference between null
114
+ // and undefined for inputs. Because anonymous can be used in evaluations
115
+ // we would want it to not possibly match true/false unless defined.
116
+ // Which is different than coercing a null/undefined anonymous as `false`.
117
+ if (defined(user.anonymous)) {
118
+ const anonymous = !!user.anonymous;
119
+ delete singleKindContext.anonymous;
120
+ singleKindContext.anonymous = anonymous;
121
+ }
122
+ if (user.name !== null && user.name !== undefined) {
123
+ singleKindContext.name = user.name;
124
+ }
125
+ if (user.ip !== null && user.ip !== undefined) {
126
+ singleKindContext.ip = user.ip;
127
+ }
128
+ if (user.firstName !== null && user.firstName !== undefined) {
129
+ singleKindContext.firstName = user.firstName;
130
+ }
131
+ if (user.lastName !== null && user.lastName !== undefined) {
132
+ singleKindContext.lastName = user.lastName;
133
+ }
134
+ if (user.email !== null && user.email !== undefined) {
135
+ singleKindContext.email = user.email;
136
+ }
137
+ if (user.avatar !== null && user.avatar !== undefined) {
138
+ singleKindContext.avatar = user.avatar;
139
+ }
140
+ if (user.country !== null && user.country !== undefined) {
141
+ singleKindContext.country = user.country;
142
+ }
143
+ // We are not pulling private attributes over because we will serialize
144
+ // those from attribute references for events.
145
+ return singleKindContext;
146
+ }
147
+ /**
148
+ * Container for a context/contexts. Because contexts come from external code
149
+ * they must be thoroughly validated and then formed to comply with
150
+ * the type system.
151
+ */
152
+ class Context {
153
+ /**
154
+ * Contexts should be created using the static factory method {@link Context.fromLDContext}.
155
+ * @param kind The kind of the context.
156
+ *
157
+ * The factory methods are static functions within the class because they access private
158
+ * implementation details, so they cannot be free functions.
159
+ */
160
+ constructor(valid, kind, message) {
161
+ this.isMulti = false;
162
+ this.isUser = false;
163
+ this.wasLegacy = false;
164
+ this.contexts = {};
165
+ this.kind = kind;
166
+ this.valid = valid;
167
+ this.message = message;
168
+ }
169
+ static contextForError(kind, message) {
170
+ return new Context(false, kind, message);
171
+ }
172
+ static getValueFromContext(reference, context) {
173
+ if (!context || !reference.isValid) {
174
+ return undefined;
175
+ }
176
+ if (reference.depth === 1 && reference.getComponent(0) === 'anonymous') {
177
+ return !!(context === null || context === void 0 ? void 0 : context.anonymous);
178
+ }
179
+ return reference.get(context);
180
+ }
181
+ contextForKind(kind) {
182
+ if (this.isMulti) {
183
+ return this.contexts[kind];
184
+ }
185
+ if (this.kind === kind) {
186
+ return this.context;
187
+ }
188
+ return undefined;
189
+ }
190
+ static fromMultiKindContext(context) {
191
+ const kinds = Object.keys(context).filter((key) => key !== 'kind');
192
+ const kindsValid = kinds.every(validKind);
193
+ if (!kinds.length) {
194
+ return Context.contextForError('multi', 'A multi-kind context must contain at least one kind');
195
+ }
196
+ if (!kindsValid) {
197
+ return Context.contextForError('multi', 'Context contains invalid kinds');
198
+ }
199
+ const privateAttributes = {};
200
+ let contextsAreObjects = true;
201
+ const contexts = kinds.reduce((acc, kind) => {
202
+ var _a;
203
+ const singleContext = context[kind];
204
+ if (isContextCommon(singleContext)) {
205
+ acc[kind] = singleContext;
206
+ privateAttributes[kind] = processPrivateAttributes((_a = singleContext._meta) === null || _a === void 0 ? void 0 : _a.privateAttributes);
207
+ }
208
+ else {
209
+ // No early break isn't the most efficient, but it is an error condition.
210
+ contextsAreObjects = false;
211
+ }
212
+ return acc;
213
+ }, {});
214
+ if (!contextsAreObjects) {
215
+ return Context.contextForError('multi', 'Context contained contexts that were not objects');
216
+ }
217
+ if (!Object.values(contexts).every((part) => validKey(part.key))) {
218
+ return Context.contextForError('multi', 'Context contained invalid keys');
219
+ }
220
+ // There was only a single kind in the multi-kind context.
221
+ // So we can just translate this to a single-kind context.
222
+ if (kinds.length === 1) {
223
+ const kind = kinds[0];
224
+ const created = new Context(true, kind);
225
+ created.context = contexts[kind];
226
+ created.privateAttributeReferences = privateAttributes;
227
+ created.isUser = kind === 'user';
228
+ return created;
229
+ }
230
+ const created = new Context(true, context.kind);
231
+ created.contexts = contexts;
232
+ created.privateAttributeReferences = privateAttributes;
233
+ created.isMulti = true;
234
+ return created;
235
+ }
236
+ static fromSingleKindContext(context) {
237
+ var _a;
238
+ const { key, kind } = context;
239
+ const kindValid = validKind(kind);
240
+ const keyValid = validKey(key);
241
+ if (!kindValid) {
242
+ return Context.contextForError(kind !== null && kind !== void 0 ? kind : 'unknown', 'The kind was not valid for the context');
243
+ }
244
+ if (!keyValid) {
245
+ return Context.contextForError(kind, 'The key for the context was not valid');
246
+ }
247
+ // The JSON interfaces uses dangling _.
248
+ // eslint-disable-next-line no-underscore-dangle
249
+ const privateAttributeReferences = processPrivateAttributes((_a = context._meta) === null || _a === void 0 ? void 0 : _a.privateAttributes);
250
+ const created = new Context(true, kind);
251
+ created.isUser = kind === 'user';
252
+ created.context = context;
253
+ created.privateAttributeReferences = {
254
+ [kind]: privateAttributeReferences,
255
+ };
256
+ return created;
257
+ }
258
+ static fromLegacyUser(context) {
259
+ const keyValid = context.key !== undefined && context.key !== null;
260
+ // For legacy users we allow empty keys.
261
+ if (!keyValid) {
262
+ return Context.contextForError('user', 'The key for the context was not valid');
263
+ }
264
+ const created = new Context(true, 'user');
265
+ created.isUser = true;
266
+ created.wasLegacy = true;
267
+ created.context = legacyToSingleKind(context);
268
+ created.privateAttributeReferences = {
269
+ user: processPrivateAttributes(context.privateAttributeNames, true),
270
+ };
271
+ return created;
272
+ }
273
+ /**
274
+ * Attempt to create a {@link Context} from an {@link LDContext}.
275
+ * @param context The input context to create a Context from.
276
+ * @returns a {@link Context}, if the context was not valid, then the returned contexts `valid`
277
+ * property will be false.
278
+ */
279
+ static fromLDContext(context) {
280
+ if (!context) {
281
+ return Context.contextForError('unknown', 'No context specified. Returning default value');
282
+ }
283
+ if (isSingleKind(context)) {
284
+ return Context.fromSingleKindContext(context);
285
+ }
286
+ if (isMultiKind(context)) {
287
+ return Context.fromMultiKindContext(context);
288
+ }
289
+ if (isLegacyUser(context)) {
290
+ return Context.fromLegacyUser(context);
291
+ }
292
+ return Context.contextForError('unknown', 'Context was not of a valid kind');
293
+ }
294
+ /**
295
+ * Attempt to get a value for the given context kind using the given reference.
296
+ * @param reference The reference to the value to get.
297
+ * @param kind The kind of the context to get the value for.
298
+ * @returns a value or `undefined` if one is not found.
299
+ */
300
+ valueForKind(reference, kind = DEFAULT_KIND) {
301
+ if (reference.isKind) {
302
+ return this.kinds;
303
+ }
304
+ return Context.getValueFromContext(reference, this.contextForKind(kind));
305
+ }
306
+ /**
307
+ * Attempt to get a key for the specified kind.
308
+ * @param kind The kind to get a key for.
309
+ * @returns The key for the specified kind, or undefined.
310
+ */
311
+ key(kind = DEFAULT_KIND) {
312
+ var _a;
313
+ return (_a = this.contextForKind(kind)) === null || _a === void 0 ? void 0 : _a.key;
314
+ }
315
+ /**
316
+ * True if this is a multi-kind context.
317
+ */
318
+ get isMultiKind() {
319
+ return this.isMulti;
320
+ }
321
+ /**
322
+ * Get the canonical key for this context.
323
+ */
324
+ get canonicalKey() {
325
+ if (this.isUser) {
326
+ return this.context.key;
327
+ }
328
+ if (this.isMulti) {
329
+ return Object.keys(this.contexts)
330
+ .sort()
331
+ .map((key) => `${key}:${encodeKey(this.contexts[key].key)}`)
332
+ .join(':');
333
+ }
334
+ return `${this.kind}:${encodeKey(this.context.key)}`;
335
+ }
336
+ /**
337
+ * Get the kinds of this context.
338
+ */
339
+ get kinds() {
340
+ if (this.isMulti) {
341
+ return Object.keys(this.contexts);
342
+ }
343
+ return [this.kind];
344
+ }
345
+ /**
346
+ * Get the kinds, and their keys, for this context.
347
+ */
348
+ get kindsAndKeys() {
349
+ if (this.isMulti) {
350
+ return Object.entries(this.contexts).reduce((acc, [kind, context]) => {
351
+ acc[kind] = context.key;
352
+ return acc;
353
+ }, {});
354
+ }
355
+ return { [this.kind]: this.context.key };
356
+ }
357
+ /**
358
+ * Get the attribute references.
359
+ *
360
+ * @param kind
361
+ */
362
+ privateAttributes(kind) {
363
+ var _a;
364
+ return ((_a = this.privateAttributeReferences) === null || _a === void 0 ? void 0 : _a[kind]) || [];
365
+ }
366
+ /**
367
+ * Get the underlying context objects from this context.
368
+ *
369
+ * This method is intended to be used in event generation.
370
+ *
371
+ * The returned objects should not be modified.
372
+ */
373
+ getContexts() {
374
+ if (this.isMulti) {
375
+ return Object.entries(this.contexts);
376
+ }
377
+ return [[this.kind, this.context]];
378
+ }
379
+ get legacy() {
380
+ return this.wasLegacy;
381
+ }
382
+ }
383
+ exports.default = Context;
384
+ Context.userKind = DEFAULT_KIND;
385
+ //# sourceMappingURL=Context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../src/Context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import AttributeReference from './AttributeReference';
2
+ import Context from './Context';
3
+ export default class ContextFilter {
4
+ private readonly allAttributesPrivate;
5
+ private readonly privateAttributes;
6
+ constructor(allAttributesPrivate: boolean, privateAttributes: AttributeReference[]);
7
+ filter(context: Context): any;
8
+ private getAttributesToFilter;
9
+ private filterSingleKind;
10
+ }
11
+ //# sourceMappingURL=ContextFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextFilter.d.ts","sourceRoot":"","sources":["../src/ContextFilter.ts"],"names":[],"mappings":"AAGA,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,OAAO,MAAM,WAAW,CAAC;AAyFhC,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBADjB,oBAAoB,EAAE,OAAO,EAC7B,iBAAiB,EAAE,kBAAkB,EAAE;IAG1D,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG;IAc7B,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gBAAgB;CA6BzB"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const AttributeReference_1 = require("./AttributeReference");
4
+ // These attributes cannot be removed via a private attribute.
5
+ const protectedAttributes = ['key', 'kind', '_meta', 'anonymous'].map((str) => new AttributeReference_1.default(str, true));
6
+ // Attributes that should be stringified for legacy users.
7
+ const legacyTopLevelCopyAttributes = [
8
+ 'name',
9
+ 'ip',
10
+ 'firstName',
11
+ 'lastName',
12
+ 'email',
13
+ 'avatar',
14
+ 'country',
15
+ ];
16
+ function compare(a, b) {
17
+ return a.depth === b.length && b.every((value, index) => value === a.getComponent(index));
18
+ }
19
+ function cloneWithRedactions(target, references) {
20
+ const stack = [];
21
+ const cloned = {};
22
+ const excluded = [];
23
+ stack.push(...Object.keys(target).map((key) => ({
24
+ key,
25
+ ptr: [key],
26
+ source: target,
27
+ parent: cloned,
28
+ visited: [target],
29
+ })));
30
+ while (stack.length) {
31
+ const item = stack.pop();
32
+ const redactRef = references.find((ref) => compare(ref, item.ptr));
33
+ if (!redactRef) {
34
+ const value = item.source[item.key];
35
+ // Handle null because it overlaps with object, which we will want to handle later.
36
+ if (value === null) {
37
+ item.parent[item.key] = value;
38
+ }
39
+ else if (Array.isArray(value)) {
40
+ item.parent[item.key] = [...value];
41
+ }
42
+ else if (typeof value === 'object') {
43
+ // Arrays and null must already be handled.
44
+ // Prevent cycles by not visiting the same object
45
+ // with in the same branch. Different branches
46
+ // may contain the same object.
47
+ //
48
+ // Same object visited twice in different branches.
49
+ // A -> B -> D
50
+ // -> C -> D
51
+ // This is fine, which is why it doesn't just check if the object
52
+ // was visited ever.
53
+ if (!item.visited.includes(value)) {
54
+ item.parent[item.key] = {};
55
+ stack.push(...Object.keys(value).map((key) => ({
56
+ key,
57
+ ptr: [...item.ptr, key],
58
+ source: value,
59
+ parent: item.parent[item.key],
60
+ visited: [...item.visited, value],
61
+ })));
62
+ }
63
+ }
64
+ else {
65
+ item.parent[item.key] = value;
66
+ }
67
+ }
68
+ else {
69
+ excluded.push(redactRef.redactionName);
70
+ }
71
+ }
72
+ return { cloned, excluded: excluded.sort() };
73
+ }
74
+ class ContextFilter {
75
+ constructor(allAttributesPrivate, privateAttributes) {
76
+ this.allAttributesPrivate = allAttributesPrivate;
77
+ this.privateAttributes = privateAttributes;
78
+ }
79
+ filter(context) {
80
+ const contexts = context.getContexts();
81
+ if (contexts.length === 1) {
82
+ return this.filterSingleKind(context, contexts[0][1], contexts[0][0]);
83
+ }
84
+ const filteredMulti = {
85
+ kind: 'multi',
86
+ };
87
+ contexts.forEach(([kind, single]) => {
88
+ filteredMulti[kind] = this.filterSingleKind(context, single, kind);
89
+ });
90
+ return filteredMulti;
91
+ }
92
+ getAttributesToFilter(context, single, kind) {
93
+ return (this.allAttributesPrivate
94
+ ? Object.keys(single).map((k) => new AttributeReference_1.default(k, true))
95
+ : [...this.privateAttributes, ...context.privateAttributes(kind)]).filter((attr) => !protectedAttributes.some((protectedAttr) => protectedAttr.compare(attr)));
96
+ }
97
+ filterSingleKind(context, single, kind) {
98
+ const { cloned, excluded } = cloneWithRedactions(single, this.getAttributesToFilter(context, single, kind));
99
+ if (context.legacy) {
100
+ legacyTopLevelCopyAttributes.forEach((name) => {
101
+ if (name in cloned) {
102
+ cloned[name] = String(cloned[name]);
103
+ }
104
+ });
105
+ }
106
+ if (excluded.length) {
107
+ if (!cloned._meta) {
108
+ cloned._meta = {};
109
+ }
110
+ cloned._meta.redactedAttributes = excluded;
111
+ }
112
+ if (cloned._meta) {
113
+ delete cloned._meta.privateAttributes;
114
+ if (Object.keys(cloned._meta).length === 0) {
115
+ delete cloned._meta;
116
+ }
117
+ }
118
+ return cloned;
119
+ }
120
+ }
121
+ exports.default = ContextFilter;
122
+ //# sourceMappingURL=ContextFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextFilter.js","sourceRoot":"","sources":["../src/ContextFilter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { LDMultiKindContext } from './LDMultiKindContext';
2
+ import { LDSingleKindContext } from './LDSingleKindContext';
3
+ import { LDUser } from './LDUser';
4
+ /**
5
+ * A LaunchDarkly context object.
6
+ */
7
+ export type LDContext = LDUser | LDSingleKindContext | LDMultiKindContext;
8
+ //# sourceMappingURL=LDContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDContext.d.ts","sourceRoot":"","sources":["../../../src/api/context/LDContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,mBAAmB,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LDContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDContext.js","sourceRoot":"","sources":["../../../src/api/context/LDContext.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { LDContextMeta } from './LDContextMeta';
2
+ export interface LDContextCommon {
3
+ /**
4
+ * A unique string identifying a context.
5
+ */
6
+ key: string;
7
+ /**
8
+ * The context's name.
9
+ *
10
+ * You can search for contexts on the Contexts page by name.
11
+ */
12
+ name?: string;
13
+ /**
14
+ * Meta attributes are used to control behavioral aspects of the Context, such as private
15
+ * private attributes. See {@link LDContextMeta.privateAttributes} as an example.
16
+ *
17
+ * They cannot be addressed in targeting rules.
18
+ */
19
+ _meta?: LDContextMeta;
20
+ /**
21
+ * If true, the context will _not_ appear on the Contexts page in the LaunchDarkly dashboard.
22
+ */
23
+ anonymous?: boolean;
24
+ /**
25
+ * Any additional attributes associated with the context.
26
+ */
27
+ [attribute: string]: any;
28
+ }
29
+ //# sourceMappingURL=LDContextCommon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDContextCommon.d.ts","sourceRoot":"","sources":["../../../src/api/context/LDContextCommon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC;CAC1B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LDContextCommon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDContextCommon.js","sourceRoot":"","sources":["../../../src/api/context/LDContextCommon.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Meta attributes are used to control behavioral aspects of the Context.
3
+ * They cannot be addressed in targeting rules.
4
+ */
5
+ export interface LDContextMeta {
6
+ /**
7
+ *
8
+ * Designate any number of Context attributes, or properties within them, as private: that is,
9
+ * their values will not be sent to LaunchDarkly.
10
+ *
11
+ * Each parameter can be a simple attribute name, such as "email". Or, if the first character is
12
+ * a slash, the parameter is interpreted as a slash-delimited path to a property within a JSON
13
+ * object, where the first path component is a Context attribute name and each following
14
+ * component is a nested property name: for example, suppose the attribute "address" had the
15
+ * following JSON object value:
16
+ *
17
+ * ```
18
+ * {"street": {"line1": "abc", "line2": "def"}}
19
+ * ```
20
+ *
21
+ * Using ["/address/street/line1"] in this case would cause the "line1" property to be marked as
22
+ * private. This syntax deliberately resembles JSON Pointer, but other JSON Pointer features
23
+ * such as array indexing are not supported for Private.
24
+ *
25
+ * This action only affects analytics events that involve this particular Context. To mark some
26
+ * (or all) Context attributes as private for all users, use the overall configuration for the
27
+ * SDK.
28
+ * See {@link LDOptions.allAttributesPrivate} and {@link LDOptions.privateAttributes}.
29
+ *
30
+ * The attributes "kind" and "key", and the "_meta" attributes cannot be made private.
31
+ *
32
+ * In this example, firstName is marked as private, but lastName is not:
33
+ *
34
+ * ```
35
+ * const context = {
36
+ * kind: 'org',
37
+ * key: 'my-key',
38
+ * firstName: 'Pierre',
39
+ * lastName: 'Menard',
40
+ * _meta: {
41
+ * privateAttributes: ['firstName'],
42
+ * }
43
+ * };
44
+ * ```
45
+ *
46
+ * This is a metadata property, rather than an attribute that can be addressed in evaluations:
47
+ * that is, a rule clause that references the attribute name "privateAttributes", will not use
48
+ * this value, but would use a "privateAttributes" attribute set on the context.
49
+ */
50
+ privateAttributes?: string[];
51
+ }
52
+ //# sourceMappingURL=LDContextMeta.d.ts.map