flagsmith-nodejs 3.3.3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.github/workflows/publish.yml +2 -2
  2. package/.github/workflows/pull_request.yaml +7 -14
  3. package/build/{flagsmith-engine → cjs/flagsmith-engine}/environments/models.d.ts +3 -3
  4. package/build/{flagsmith-engine → cjs/flagsmith-engine}/environments/models.js +20 -13
  5. package/build/{flagsmith-engine → cjs/flagsmith-engine}/environments/util.d.ts +1 -1
  6. package/build/cjs/flagsmith-engine/environments/util.js +23 -0
  7. package/build/cjs/flagsmith-engine/features/models.js +118 -0
  8. package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/util.d.ts +1 -1
  9. package/build/cjs/flagsmith-engine/features/util.js +27 -0
  10. package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/models.d.ts +2 -2
  11. package/build/cjs/flagsmith-engine/identities/models.js +48 -0
  12. package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/traits/models.js +5 -4
  13. package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/util.d.ts +2 -2
  14. package/build/cjs/flagsmith-engine/identities/util.js +22 -0
  15. package/build/cjs/flagsmith-engine/index.d.ts +14 -0
  16. package/build/cjs/flagsmith-engine/index.js +75 -0
  17. package/build/cjs/flagsmith-engine/organisations/models.js +21 -0
  18. package/build/{flagsmith-engine → cjs/flagsmith-engine}/organisations/util.d.ts +1 -1
  19. package/build/cjs/flagsmith-engine/organisations/util.js +8 -0
  20. package/build/{flagsmith-engine → cjs/flagsmith-engine}/projects/models.d.ts +2 -2
  21. package/build/{flagsmith-engine → cjs/flagsmith-engine}/projects/models.js +8 -5
  22. package/build/{flagsmith-engine → cjs/flagsmith-engine}/projects/util.d.ts +1 -1
  23. package/build/cjs/flagsmith-engine/projects/util.js +15 -0
  24. package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/evaluators.d.ts +4 -4
  25. package/build/cjs/flagsmith-engine/segments/evaluators.js +37 -0
  26. package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/models.d.ts +1 -1
  27. package/build/cjs/flagsmith-engine/segments/models.js +111 -0
  28. package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/util.d.ts +1 -1
  29. package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/util.js +9 -11
  30. package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/collections.d.ts +1 -1
  31. package/build/cjs/flagsmith-engine/utils/collections.js +6 -0
  32. package/build/cjs/flagsmith-engine/utils/errors.js +6 -0
  33. package/build/cjs/flagsmith-engine/utils/hashing/index.js +29 -0
  34. package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/index.js +5 -5
  35. package/build/{index.d.ts → cjs/index.d.ts} +3 -3
  36. package/build/cjs/index.js +18 -0
  37. package/build/cjs/package.json +1 -0
  38. package/build/{sdk → cjs/sdk}/analytics.d.ts +3 -0
  39. package/build/cjs/sdk/analytics.js +73 -0
  40. package/build/cjs/sdk/errors.js +9 -0
  41. package/build/{sdk → cjs/sdk}/index.d.ts +19 -18
  42. package/build/cjs/sdk/index.js +400 -0
  43. package/build/{sdk → cjs/sdk}/models.d.ts +2 -2
  44. package/build/cjs/sdk/models.js +101 -0
  45. package/build/{sdk → cjs/sdk}/offline_handlers.d.ts +1 -1
  46. package/build/cjs/sdk/offline_handlers.js +23 -0
  47. package/build/{sdk → cjs/sdk}/polling_manager.d.ts +1 -1
  48. package/build/cjs/sdk/polling_manager.js +29 -0
  49. package/build/{sdk → cjs/sdk}/types.d.ts +15 -7
  50. package/build/cjs/sdk/utils.d.ts +36 -0
  51. package/build/cjs/sdk/utils.js +63 -0
  52. package/build/esm/flagsmith-engine/environments/models.d.ts +22 -0
  53. package/build/esm/flagsmith-engine/environments/models.js +32 -0
  54. package/build/esm/flagsmith-engine/environments/util.d.ts +3 -0
  55. package/build/esm/flagsmith-engine/environments/util.js +18 -0
  56. package/build/esm/flagsmith-engine/features/constants.d.ts +4 -0
  57. package/build/esm/flagsmith-engine/features/constants.js +4 -0
  58. package/build/esm/flagsmith-engine/features/models.d.ts +37 -0
  59. package/build/esm/flagsmith-engine/features/models.js +110 -0
  60. package/build/esm/flagsmith-engine/features/util.d.ts +4 -0
  61. package/build/esm/flagsmith-engine/features/util.js +21 -0
  62. package/build/esm/flagsmith-engine/identities/models.d.ts +15 -0
  63. package/build/esm/flagsmith-engine/identities/models.js +44 -0
  64. package/build/esm/flagsmith-engine/identities/traits/models.d.ts +5 -0
  65. package/build/esm/flagsmith-engine/identities/traits/models.js +8 -0
  66. package/build/esm/flagsmith-engine/identities/util.d.ts +4 -0
  67. package/build/esm/flagsmith-engine/identities/util.js +17 -0
  68. package/build/esm/flagsmith-engine/index.d.ts +14 -0
  69. package/build/esm/flagsmith-engine/index.js +62 -0
  70. package/build/esm/flagsmith-engine/organisations/models.d.ts +9 -0
  71. package/build/esm/flagsmith-engine/organisations/models.js +17 -0
  72. package/build/esm/flagsmith-engine/organisations/util.d.ts +2 -0
  73. package/build/esm/flagsmith-engine/organisations/util.js +4 -0
  74. package/build/esm/flagsmith-engine/projects/models.d.ts +10 -0
  75. package/build/esm/flagsmith-engine/projects/models.js +13 -0
  76. package/build/esm/flagsmith-engine/projects/util.d.ts +2 -0
  77. package/build/esm/flagsmith-engine/projects/util.js +11 -0
  78. package/build/esm/flagsmith-engine/segments/constants.d.ts +34 -0
  79. package/build/esm/flagsmith-engine/segments/constants.js +36 -0
  80. package/build/esm/flagsmith-engine/segments/evaluators.d.ts +7 -0
  81. package/build/esm/flagsmith-engine/segments/evaluators.js +31 -0
  82. package/build/esm/flagsmith-engine/segments/models.d.ts +37 -0
  83. package/build/esm/flagsmith-engine/segments/models.js +102 -0
  84. package/build/esm/flagsmith-engine/segments/util.d.ts +6 -0
  85. package/build/esm/flagsmith-engine/segments/util.js +23 -0
  86. package/build/esm/flagsmith-engine/utils/collections.d.ts +3 -0
  87. package/build/esm/flagsmith-engine/utils/collections.js +2 -0
  88. package/build/esm/flagsmith-engine/utils/errors.d.ts +2 -0
  89. package/build/esm/flagsmith-engine/utils/errors.js +2 -0
  90. package/build/esm/flagsmith-engine/utils/hashing/index.d.ts +9 -0
  91. package/build/esm/flagsmith-engine/utils/hashing/index.js +25 -0
  92. package/build/esm/flagsmith-engine/utils/index.d.ts +1 -0
  93. package/build/esm/flagsmith-engine/utils/index.js +13 -0
  94. package/build/esm/index.d.ts +3 -0
  95. package/build/esm/index.js +2 -0
  96. package/build/esm/sdk/analytics.d.ts +35 -0
  97. package/build/esm/sdk/analytics.js +69 -0
  98. package/build/esm/sdk/errors.d.ts +4 -0
  99. package/build/esm/sdk/errors.js +4 -0
  100. package/build/esm/sdk/index.d.ts +131 -0
  101. package/build/esm/sdk/index.js +390 -0
  102. package/build/esm/sdk/models.d.ts +55 -0
  103. package/build/esm/sdk/models.js +94 -0
  104. package/build/esm/sdk/offline_handlers.d.ts +9 -0
  105. package/build/esm/sdk/offline_handlers.js +18 -0
  106. package/build/esm/sdk/polling_manager.d.ts +9 -0
  107. package/build/esm/sdk/polling_manager.js +25 -0
  108. package/build/esm/sdk/types.d.ts +38 -0
  109. package/build/esm/sdk/types.js +1 -0
  110. package/build/esm/sdk/utils.d.ts +36 -0
  111. package/build/esm/sdk/utils.js +56 -0
  112. package/flagsmith-engine/environments/models.ts +3 -3
  113. package/flagsmith-engine/environments/util.ts +4 -4
  114. package/flagsmith-engine/features/models.ts +2 -2
  115. package/flagsmith-engine/features/util.ts +1 -1
  116. package/flagsmith-engine/identities/models.ts +4 -5
  117. package/flagsmith-engine/identities/traits/models.ts +0 -1
  118. package/flagsmith-engine/identities/util.ts +4 -4
  119. package/flagsmith-engine/index.ts +13 -13
  120. package/flagsmith-engine/organisations/util.ts +1 -1
  121. package/flagsmith-engine/projects/models.ts +2 -2
  122. package/flagsmith-engine/projects/util.ts +4 -4
  123. package/flagsmith-engine/segments/evaluators.ts +6 -6
  124. package/flagsmith-engine/segments/models.ts +5 -5
  125. package/flagsmith-engine/segments/util.ts +3 -3
  126. package/flagsmith-engine/utils/collections.ts +1 -1
  127. package/flagsmith-engine/utils/hashing/index.ts +5 -29
  128. package/flagsmith-engine/utils/index.ts +1 -1
  129. package/index.ts +4 -8
  130. package/package.json +21 -16
  131. package/sdk/analytics.ts +7 -5
  132. package/sdk/index.ts +55 -46
  133. package/sdk/models.ts +2 -3
  134. package/sdk/offline_handlers.ts +2 -2
  135. package/sdk/polling_manager.ts +2 -3
  136. package/sdk/types.ts +35 -24
  137. package/sdk/utils.ts +49 -37
  138. package/tests/engine/e2e/engine.test.ts +8 -11
  139. package/tests/engine/unit/engine.test.ts +5 -5
  140. package/tests/engine/unit/segments/segment_evaluators.test.ts +9 -9
  141. package/tests/engine/unit/utils/utils.test.ts +2 -2
  142. package/tests/sdk/analytics.test.ts +8 -13
  143. package/tests/sdk/data/identity-with-transient-traits.json +41 -0
  144. package/tests/sdk/data/transient-identity.json +29 -0
  145. package/tests/sdk/flagsmith-cache.test.ts +16 -32
  146. package/tests/sdk/flagsmith-environment-flags.test.ts +21 -36
  147. package/tests/sdk/flagsmith-identity-flags.test.ts +83 -32
  148. package/tests/sdk/flagsmith.test.ts +67 -99
  149. package/tests/sdk/offline-handlers.test.ts +5 -6
  150. package/tests/sdk/polling.test.ts +6 -8
  151. package/tests/sdk/utils.ts +19 -15
  152. package/tsconfig.cjs.json +7 -0
  153. package/tsconfig.esm.json +7 -0
  154. package/tsconfig.json +8 -4
  155. package/vitest.config.ts +17 -0
  156. package/build/flagsmith-engine/environments/util.js +0 -27
  157. package/build/flagsmith-engine/features/models.js +0 -132
  158. package/build/flagsmith-engine/features/util.js +0 -27
  159. package/build/flagsmith-engine/identities/models.js +0 -113
  160. package/build/flagsmith-engine/identities/util.js +0 -46
  161. package/build/flagsmith-engine/index.d.ts +0 -14
  162. package/build/flagsmith-engine/index.js +0 -127
  163. package/build/flagsmith-engine/organisations/models.js +0 -21
  164. package/build/flagsmith-engine/organisations/util.js +0 -8
  165. package/build/flagsmith-engine/projects/util.js +0 -15
  166. package/build/flagsmith-engine/segments/evaluators.js +0 -45
  167. package/build/flagsmith-engine/segments/models.js +0 -147
  168. package/build/flagsmith-engine/utils/collections.js +0 -26
  169. package/build/flagsmith-engine/utils/errors.js +0 -26
  170. package/build/flagsmith-engine/utils/hashing/index.js +0 -60
  171. package/build/index.js +0 -23
  172. package/build/sdk/analytics.js +0 -120
  173. package/build/sdk/errors.js +0 -34
  174. package/build/sdk/index.js +0 -594
  175. package/build/sdk/models.js +0 -149
  176. package/build/sdk/offline_handlers.js +0 -66
  177. package/build/sdk/polling_manager.js +0 -72
  178. package/build/sdk/utils.d.ts +0 -12
  179. package/build/sdk/utils.js +0 -107
  180. package/jest.config.js +0 -5
  181. package/tests/index.js +0 -0
  182. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/constants.d.ts +0 -0
  183. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/constants.js +0 -0
  184. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/features/models.d.ts +0 -0
  185. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/identities/traits/models.d.ts +0 -0
  186. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/organisations/models.d.ts +0 -0
  187. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/constants.d.ts +0 -0
  188. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/segments/constants.js +0 -0
  189. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/errors.d.ts +0 -0
  190. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/hashing/index.d.ts +0 -0
  191. /package/build/{flagsmith-engine → cjs/flagsmith-engine}/utils/index.d.ts +0 -0
  192. /package/build/{sdk → cjs/sdk}/errors.d.ts +0 -0
  193. /package/build/{sdk → cjs/sdk}/types.js +0 -0
@@ -1,14 +1,7 @@
1
- import fetch, { Headers } from 'node-fetch';
2
- import { environmentJSON, environmentModel, flagsJSON, flagsmith, identitiesJSON, TestCache } from './utils';
3
-
4
- jest.mock('node-fetch');
5
- jest.mock('../../sdk/polling_manager');
6
-
7
- const { Response } = jest.requireActual('node-fetch');
1
+ import { fetch, environmentJSON, environmentModel, flagsJSON, flagsmith, identitiesJSON, TestCache } from './utils.js';
8
2
 
9
3
  beforeEach(() => {
10
- // @ts-ignore
11
- jest.clearAllMocks();
4
+ vi.clearAllMocks();
12
5
  });
13
6
 
14
7
  test('test_wrong_cache_interface_throws_an_error', async () => {
@@ -21,14 +14,13 @@ test('test_wrong_cache_interface_throws_an_error', async () => {
21
14
  });
22
15
 
23
16
  test('test_empty_cache_not_read_but_populated', async () => {
24
- // @ts-ignore
25
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
17
+ fetch.mockResolvedValue(new Response(flagsJSON));
26
18
 
27
19
  const cache = new TestCache();
28
- const set = jest.spyOn(cache, 'set');
20
+ const set = vi.spyOn(cache, 'set');
29
21
 
30
22
  const flg = flagsmith({ cache });
31
- const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
23
+ const allFlags = (await flg.getEnvironmentFlags()).allFlags();
32
24
 
33
25
  expect(set).toBeCalled();
34
26
  expect(await cache.has('flags')).toBe(true);
@@ -40,11 +32,10 @@ test('test_empty_cache_not_read_but_populated', async () => {
40
32
  });
41
33
 
42
34
  test('test_api_not_called_when_cache_present', async () => {
43
- // @ts-ignore
44
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
35
+ fetch.mockResolvedValue(new Response(flagsJSON));
45
36
 
46
37
  const cache = new TestCache();
47
- const set = jest.spyOn(cache, 'set');
38
+ const set = vi.spyOn(cache, 'set');
48
39
 
49
40
  const flg = flagsmith({ cache });
50
41
  await (await flg.getEnvironmentFlags()).allFlags();
@@ -60,13 +51,11 @@ test('test_api_not_called_when_cache_present', async () => {
60
51
  });
61
52
 
62
53
  test('test_api_called_twice_when_no_cache', async () => {
63
- // @ts-ignore
64
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
54
+ fetch.mockImplementation(() => Promise.resolve(new Response(flagsJSON)));
65
55
 
66
56
  const flg = flagsmith();
67
57
  await (await flg.getEnvironmentFlags()).allFlags();
68
- // @ts-ignore
69
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
58
+
70
59
  const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
71
60
 
72
61
  expect(fetch).toBeCalledTimes(2);
@@ -76,14 +65,13 @@ test('test_api_called_twice_when_no_cache', async () => {
76
65
  });
77
66
 
78
67
  test('test_get_environment_flags_uses_local_environment_when_available', async () => {
79
- // @ts-ignore
80
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
68
+ fetch.mockResolvedValue(new Response(flagsJSON));
81
69
 
82
70
  const cache = new TestCache();
83
- const set = jest.spyOn(cache, 'set');
71
+ const set = vi.spyOn(cache, 'set');
84
72
 
85
73
  const flg = flagsmith({ cache });
86
- const model = environmentModel(JSON.parse(environmentJSON()));
74
+ const model = environmentModel(JSON.parse(environmentJSON));
87
75
  flg.environment = model;
88
76
 
89
77
  const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
@@ -96,11 +84,10 @@ test('test_get_environment_flags_uses_local_environment_when_available', async (
96
84
  });
97
85
 
98
86
  test('test_cache_used_for_identity_flags', async () => {
99
- // @ts-ignore
100
- fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
87
+ fetch.mockResolvedValue(new Response(identitiesJSON));
101
88
 
102
89
  const cache = new TestCache();
103
- const set = jest.spyOn(cache, 'set');
90
+ const set = vi.spyOn(cache, 'set');
104
91
 
105
92
  const identifier = 'identifier';
106
93
  const traits = { some_trait: 'some_value' };
@@ -120,11 +107,10 @@ test('test_cache_used_for_identity_flags', async () => {
120
107
  });
121
108
 
122
109
  test('test_cache_used_for_identity_flags_local_evaluation', async () => {
123
- // @ts-ignore
124
- fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
110
+ fetch.mockResolvedValue(new Response(environmentJSON));
125
111
 
126
112
  const cache = new TestCache();
127
- const set = jest.spyOn(cache, 'set');
113
+ const set = vi.spyOn(cache, 'set');
128
114
 
129
115
  const identifier = 'identifier';
130
116
  const traits = { some_trait: 'some_value' };
@@ -146,5 +132,3 @@ test('test_cache_used_for_identity_flags_local_evaluation', async () => {
146
132
  expect(identityFlags[0].value).toBe('some-value');
147
133
  expect(identityFlags[0].featureName).toBe('some_feature');
148
134
  });
149
-
150
- test('test_cache_used_for_all_flags', async () => { });
@@ -1,20 +1,15 @@
1
- import Flagsmith from '../../sdk';
2
- import fetch from 'node-fetch';
3
- import { environmentJSON, environmentModel, flagsJSON, flagsmith, identitiesJSON } from './utils';
4
- import { DefaultFlag } from '../../sdk/models';
1
+ import Flagsmith from '../../sdk/index.js';
2
+ import { environmentJSON, environmentModel, flagsJSON, flagsmith, fetch } from './utils.js';
3
+ import { DefaultFlag } from '../../sdk/models.js';
5
4
 
6
- jest.mock('node-fetch');
7
- jest.mock('../../sdk/polling_manager');
8
- const { Response } = jest.requireActual('node-fetch');
5
+ vi.mock('../../sdk/polling_manager');
9
6
 
10
7
  beforeEach(() => {
11
- // @ts-ignore
12
- jest.clearAllMocks();
8
+ vi.clearAllMocks();
13
9
  });
14
10
 
15
11
  test('test_get_environment_flags_calls_api_when_no_local_environment', async () => {
16
- // @ts-ignore
17
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
12
+ fetch.mockResolvedValue(new Response(flagsJSON));
18
13
 
19
14
  const flg = flagsmith();
20
15
  const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
@@ -26,11 +21,10 @@ test('test_get_environment_flags_calls_api_when_no_local_environment', async ()
26
21
  });
27
22
 
28
23
  test('test_get_environment_flags_uses_local_environment_when_available', async () => {
29
- // @ts-ignore
30
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
24
+ fetch.mockResolvedValue(new Response(flagsJSON));
31
25
 
32
26
  const flg = flagsmith();
33
- const model = environmentModel(JSON.parse(environmentJSON()));
27
+ const model = environmentModel(JSON.parse(environmentJSON));
34
28
  flg.environment = model;
35
29
 
36
30
  const allFlags = await (await flg.getEnvironmentFlags()).allFlags();
@@ -41,8 +35,7 @@ test('test_get_environment_flags_uses_local_environment_when_available', async (
41
35
  });
42
36
 
43
37
  test('test_default_flag_is_used_when_no_environment_flags_returned', async () => {
44
- // @ts-ignore
45
- fetch.mockReturnValue(Promise.resolve(new Response(JSON.stringify([]))));
38
+ fetch.mockResolvedValue(new Response(JSON.stringify([])));
46
39
 
47
40
  const defaultFlag = new DefaultFlag('some-default-value', true);
48
41
 
@@ -64,14 +57,13 @@ test('test_default_flag_is_used_when_no_environment_flags_returned', async () =>
64
57
  });
65
58
 
66
59
  test('test_analytics_processor_tracks_flags', async () => {
67
- // @ts-ignore
68
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
60
+ fetch.mockResolvedValue(new Response(flagsJSON));
69
61
 
70
62
  const defaultFlag = new DefaultFlag('some-default-value', true);
71
63
 
72
64
  const defaultFlagHandler = (featureName: string) => defaultFlag;
73
65
 
74
- const flg = new Flagsmith({
66
+ const flg = flagsmith({
75
67
  environmentKey: 'key',
76
68
  defaultFlagHandler: defaultFlagHandler,
77
69
  enableAnalytics: true,
@@ -86,14 +78,13 @@ test('test_analytics_processor_tracks_flags', async () => {
86
78
  });
87
79
 
88
80
  test('test_getFeatureValue', async () => {
89
- // @ts-ignore
90
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
81
+ fetch.mockResolvedValue(new Response(flagsJSON));
91
82
 
92
83
  const defaultFlag = new DefaultFlag('some-default-value', true);
93
84
 
94
85
  const defaultFlagHandler = (featureName: string) => defaultFlag;
95
86
 
96
- const flg = new Flagsmith({
87
+ const flg = flagsmith({
97
88
  environmentKey: 'key',
98
89
  defaultFlagHandler: defaultFlagHandler,
99
90
  enableAnalytics: true,
@@ -106,11 +97,9 @@ test('test_getFeatureValue', async () => {
106
97
  });
107
98
 
108
99
  test('test_throws_when_no_default_flag_handler_after_multiple_API_errors', async () => {
109
- fetch
110
- // @ts-ignore
111
- .mockRejectedValue(new Error('Error during fetching the API response'));
100
+ fetch.mockRejectedValue('Error during fetching the API response');
112
101
 
113
- const flg = new Flagsmith({
102
+ const flg = flagsmith({
114
103
  environmentKey: 'key',
115
104
  });
116
105
 
@@ -124,8 +113,7 @@ test('test_non_200_response_raises_flagsmith_api_error', async () => {
124
113
  const errorResponse403 = new Response('403 Forbidden', {
125
114
  status: 403
126
115
  });
127
- // @ts-ignore
128
- fetch.mockReturnValue(Promise.resolve(errorResponse403));
116
+ fetch.mockResolvedValue(errorResponse403);
129
117
 
130
118
  const flg = new Flagsmith({
131
119
  environmentKey: 'some'
@@ -134,14 +122,13 @@ test('test_non_200_response_raises_flagsmith_api_error', async () => {
134
122
  await expect(flg.getEnvironmentFlags()).rejects.toThrow();
135
123
  });
136
124
  test('test_default_flag_is_not_used_when_environment_flags_returned', async () => {
137
- // @ts-ignore
138
- fetch.mockReturnValue(Promise.resolve(new Response(flagsJSON())));
125
+ fetch.mockResolvedValue(new Response(flagsJSON));
139
126
 
140
127
  const defaultFlag = new DefaultFlag('some-default-value', true);
141
128
 
142
129
  const defaultFlagHandler = (featureName: string) => defaultFlag;
143
130
 
144
- const flg = new Flagsmith({
131
+ const flg = flagsmith({
145
132
  environmentKey: 'key',
146
133
  defaultFlagHandler: defaultFlagHandler
147
134
  });
@@ -155,8 +142,7 @@ test('test_default_flag_is_not_used_when_environment_flags_returned', async () =
155
142
  });
156
143
 
157
144
  test('test_default_flag_is_used_when_bad_api_response_happens', async () => {
158
- // @ts-ignore
159
- fetch.mockReturnValue(Promise.resolve(new Response('bad-data')));
145
+ fetch.mockResolvedValue(new Response('bad-data'));
160
146
 
161
147
  const defaultFlag = new DefaultFlag('some-default-value', true);
162
148
 
@@ -175,14 +161,13 @@ test('test_default_flag_is_used_when_bad_api_response_happens', async () => {
175
161
  });
176
162
 
177
163
  test('test_local_evaluation', async () => {
178
- // @ts-ignore
179
- fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
164
+ fetch.mockResolvedValue(new Response(environmentJSON));
180
165
 
181
166
  const defaultFlag = new DefaultFlag('some-default-value', true);
182
167
 
183
168
  const defaultFlagHandler = (featureName: string) => defaultFlag;
184
169
 
185
- const flg = new Flagsmith({
170
+ const flg = flagsmith({
186
171
  environmentKey: 'ser.key',
187
172
  enableLocalEvaluation: true,
188
173
  defaultFlagHandler: defaultFlagHandler
@@ -1,21 +1,16 @@
1
- import Flagsmith from '../../sdk';
2
- import fetch from 'node-fetch';
3
- import { environmentJSON, flagsmith, identitiesJSON } from './utils';
4
- import { DefaultFlag } from '../../sdk/models';
1
+ import Flagsmith from '../../sdk/index.js';
2
+ import { fetch, environmentJSON, flagsmith, identitiesJSON, identityWithTransientTraitsJSON, transientIdentityJSON } from './utils.js';
3
+ import { DefaultFlag } from '../../sdk/models.js';
5
4
 
6
- jest.mock('node-fetch');
7
- jest.mock('../../sdk/polling_manager');
8
- const { Response } = jest.requireActual('node-fetch');
5
+ vi.mock('../../sdk/polling_manager');
9
6
 
10
7
  beforeEach(() => {
11
- // @ts-ignore
12
- jest.clearAllMocks();
8
+ vi.clearAllMocks();
13
9
  });
14
10
 
15
11
 
16
12
  test('test_get_identity_flags_calls_api_when_no_local_environment_no_traits', async () => {
17
- // @ts-ignore
18
- fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
13
+ fetch.mockResolvedValue(new Response(identitiesJSON));
19
14
  const identifier = 'identifier';
20
15
 
21
16
  const flg = flagsmith();
@@ -28,14 +23,12 @@ test('test_get_identity_flags_calls_api_when_no_local_environment_no_traits', as
28
23
  });
29
24
 
30
25
  test('test_get_identity_flags_uses_environment_when_local_environment_no_traits', async () => {
31
- // @ts-ignore
32
- fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
26
+ fetch.mockResolvedValue(new Response(environmentJSON))
33
27
  const identifier = 'identifier';
34
28
 
35
29
  const flg = flagsmith({
36
- environmentKey: 'ser.key',
37
- enableLocalEvaluation: true,
38
-
30
+ environmentKey: 'ser.key',
31
+ enableLocalEvaluation: true,
39
32
  });
40
33
 
41
34
 
@@ -47,8 +40,7 @@ test('test_get_identity_flags_uses_environment_when_local_environment_no_traits'
47
40
  });
48
41
 
49
42
  test('test_get_identity_flags_calls_api_when_no_local_environment_with_traits', async () => {
50
- // @ts-ignore
51
- fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
43
+ fetch.mockResolvedValue(new Response(identitiesJSON))
52
44
  const identifier = 'identifier';
53
45
  const traits = { some_trait: 'some_value' };
54
46
  const flg = flagsmith();
@@ -61,14 +53,13 @@ test('test_get_identity_flags_calls_api_when_no_local_environment_with_traits',
61
53
  });
62
54
 
63
55
  test('test_default_flag_is_not_used_when_identity_flags_returned', async () => {
64
- // @ts-ignore
65
- fetch.mockReturnValue(Promise.resolve(new Response(identitiesJSON())));
56
+ fetch.mockResolvedValue(new Response(identitiesJSON))
66
57
 
67
58
  const defaultFlag = new DefaultFlag('some-default-value', true);
68
59
 
69
60
  const defaultFlagHandler = (featureName: string) => defaultFlag;
70
61
 
71
- const flg = new Flagsmith({
62
+ const flg = flagsmith({
72
63
  environmentKey: 'key',
73
64
  defaultFlagHandler: defaultFlagHandler
74
65
  });
@@ -82,8 +73,7 @@ test('test_default_flag_is_not_used_when_identity_flags_returned', async () => {
82
73
  });
83
74
 
84
75
  test('test_default_flag_is_used_when_no_identity_flags_returned', async () => {
85
- // @ts-ignore
86
- fetch.mockReturnValue(Promise.resolve(new Response(JSON.stringify({ flags: [], traits: [] }))));
76
+ fetch.mockResolvedValue(new Response(JSON.stringify({ flags: [], traits: [] })));
87
77
 
88
78
  const defaultFlag = new DefaultFlag('some-default-value', true);
89
79
  const defaultFlagHandler = (featureName: string) => defaultFlag;
@@ -102,8 +92,7 @@ test('test_default_flag_is_used_when_no_identity_flags_returned', async () => {
102
92
  });
103
93
 
104
94
  test('test_default_flag_is_used_when_no_identity_flags_returned_due_to_error', async () => {
105
- // @ts-ignore
106
- fetch.mockReturnValue(Promise.resolve(new Response('bad data')));
95
+ fetch.mockResolvedValue(new Response('bad data'))
107
96
 
108
97
  const defaultFlag = new DefaultFlag('some-default-value', true);
109
98
  const defaultFlagHandler = (featureName: string) => defaultFlag;
@@ -122,12 +111,10 @@ test('test_default_flag_is_used_when_no_identity_flags_returned_due_to_error', a
122
111
  });
123
112
 
124
113
  test('test_default_flag_is_used_when_no_identity_flags_returned_and_no_custom_default_flag_handler', async () => {
125
- // @ts-ignore
126
- fetch.mockReturnValue(Promise.resolve(new Response(JSON.stringify({ flags: [], traits: [] }))));
127
-
114
+ fetch.mockResolvedValue(new Response(JSON.stringify({ flags: [], traits: [] })))
128
115
 
129
- const flg = new Flagsmith({
130
- environmentKey: 'key',
116
+ const flg = flagsmith({
117
+ environmentKey: 'key',
131
118
  });
132
119
 
133
120
  const flags = await flg.getIdentityFlags('identifier');
@@ -140,8 +127,7 @@ test('test_default_flag_is_used_when_no_identity_flags_returned_and_no_custom_de
140
127
 
141
128
 
142
129
  test('test_get_identity_flags_multivariate_value_with_local_evaluation_enabled', async () => {
143
- // @ts-ignore
144
- fetch.mockReturnValue(Promise.resolve(new Response(environmentJSON())));
130
+ fetch.mockResolvedValue(new Response(environmentJSON));
145
131
  const identifier = 'identifier';
146
132
 
147
133
  const flg = flagsmith({
@@ -155,3 +141,68 @@ test('test_get_identity_flags_multivariate_value_with_local_evaluation_enabled',
155
141
  expect(identityFlags.getFeatureValue('mv_feature')).toBe('bar');
156
142
  expect(identityFlags.isFeatureEnabled('mv_feature')).toBe(false);
157
143
  });
144
+
145
+
146
+ test('test_transient_identity', async () => {
147
+ fetch.mockResolvedValue(new Response(transientIdentityJSON));
148
+ const identifier = 'transient_identifier';
149
+ const traits = { some_trait: 'some_value' };
150
+ const traitsInRequest = [{trait_key:Object.keys(traits)[0],trait_value:traits.some_trait}]
151
+ const transient = true;
152
+ const flg = flagsmith();
153
+ const identityFlags = (await flg.getIdentityFlags(identifier, traits, transient)).allFlags();
154
+
155
+ expect(fetch).toHaveBeenCalledWith(
156
+ `https://edge.api.flagsmith.com/api/v1/identities/`,
157
+ expect.objectContaining({
158
+ method: 'POST',
159
+ headers: { 'Content-Type': 'application/json', 'X-Environment-Key': 'sometestfakekey' },
160
+ body: JSON.stringify({identifier, traits: traitsInRequest, transient })
161
+ }
162
+ ));
163
+
164
+ expect(identityFlags[0].enabled).toBe(false);
165
+ expect(identityFlags[0].value).toBe('some-transient-identity-value');
166
+ expect(identityFlags[0].featureName).toBe('some_feature');
167
+ });
168
+
169
+
170
+ test('test_identity_with_transient_traits', async () => {
171
+ fetch.mockResolvedValue(new Response(identityWithTransientTraitsJSON));
172
+ const identifier = 'transient_trait_identifier';
173
+ const traits = {
174
+ some_trait: 'some_value',
175
+ another_trait: {value: 'another_value', transient: true},
176
+ explicitly_non_transient_trait: {value: 'non_transient_value', transient: false}
177
+ }
178
+ const traitsInRequest = [
179
+ {
180
+ trait_key:Object.keys(traits)[0],
181
+ trait_value:traits.some_trait,
182
+ },
183
+ {
184
+ trait_key:Object.keys(traits)[1],
185
+ trait_value:traits.another_trait.value,
186
+ transient: true,
187
+ },
188
+ {
189
+ trait_key:Object.keys(traits)[2],
190
+ trait_value:traits.explicitly_non_transient_trait.value,
191
+ transient: false,
192
+ },
193
+ ]
194
+ const flg = flagsmith();
195
+
196
+ const identityFlags = (await flg.getIdentityFlags(identifier, traits)).allFlags();
197
+ expect(fetch).toHaveBeenCalledWith(
198
+ `https://edge.api.flagsmith.com/api/v1/identities/`,
199
+ expect.objectContaining({
200
+ method: 'POST',
201
+ headers: { 'Content-Type': 'application/json', 'X-Environment-Key': 'sometestfakekey' },
202
+ body: JSON.stringify({identifier, traits: traitsInRequest})
203
+ })
204
+ );
205
+ expect(identityFlags[0].enabled).toBe(true);
206
+ expect(identityFlags[0].value).toBe('some-identity-with-transient-trait-value');
207
+ expect(identityFlags[0].featureName).toBe('some_feature');
208
+ });