Skip to content

Commit 552772f

Browse files
[FSSDK-10440] update outdated deps (#271)
* [FSSDK-10440] test deps update * [FSSDK-10440] react echo updates * [FSSDK-10440] build system update * [FSSDK-10440] package manager update * [FSSDK-10440] linter: eslint + prettier update * [FSSDK-10440] misc deps update * [FSSDK-10440] workflow update for yarn * [FSSDK-10440] yarn breaking change revert * [FSSDK-10440] Node engine 14 support restored * [FSSDK-10440] test debug * [FSSDK-10440] test debug 2 * cleanup
1 parent 234a5bf commit 552772f

13 files changed

+3033
-3358
lines changed

.devcontainer/devcontainer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "React SDK",
33
"image": "mcr.microsoft.com/devcontainers/javascript-node:1-18-bullseye",
4-
"postCreateCommand": "yarn install",
4+
"postCreateCommand": "npm i -g [email protected] && yarn install",
55
"customizations": {
66
"vscode": {
77
"extensions": [

.eslintrc.js

-4
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ module.exports = {
1717
'plugin:react-hooks/recommended',
1818
'eslint:recommended',
1919
'plugin:@typescript-eslint/recommended',
20-
'prettier/@typescript-eslint',
21-
22-
// Prettier should always go last so it can trump any rules above
2320
'plugin:prettier/recommended',
24-
'prettier/react',
2521
],
2622
rules: {
2723
'@typescript-eslint/ban-ts-ignore': 'off',

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
node_modules/
2+
.yarn/
23
lerna-debug.log
34
npm-debug.log
45
lib

.vscode/settings.json

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
{
2-
"jest.runMode": "on-demand",
3-
"jest.jestCommandLine": "~/.nvm/nvm-exec yarn test"
2+
"eslint.enable": true,
3+
"eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"],
4+
"prettier.requireConfig": true,
5+
"editor.formatOnSave": false,
6+
"editor.codeActionsOnSave": {
7+
"source.fixAll.eslint": "never"
8+
},
9+
10+
"editor.defaultFormatter": "esbenp.prettier-vscode"
411
}

jest.config.js

+7-16
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,11 @@
1414
* limitations under the License.
1515
*/
1616

17+
/** @type {import('jest').Config} */
1718
module.exports = {
18-
"roots": [
19-
"./src"
20-
],
21-
"transform": {
22-
"^.+\\.tsx?$": "ts-jest"
23-
},
24-
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
25-
"moduleFileExtensions": [
26-
"ts",
27-
"tsx",
28-
"js",
29-
"jsx",
30-
"json",
31-
"node"
32-
],
33-
}
19+
testEnvironment: 'jsdom',
20+
roots: ['./src'],
21+
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
22+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
23+
preset: 'ts-jest',
24+
};

package.json

+26-25
Original file line numberDiff line numberDiff line change
@@ -35,40 +35,41 @@
3535
},
3636
"dependencies": {
3737
"@optimizely/optimizely-sdk": "^5.3.4",
38-
"hoist-non-react-statics": "^3.3.0",
39-
"prop-types": "^15.6.2",
38+
"hoist-non-react-statics": "^3.3.2",
39+
"prop-types": "^15.8.1",
4040
"utility-types": "^2.1.0 || ^3.0.0"
4141
},
4242
"peerDependencies": {
4343
"react": ">=16.8.0"
4444
},
4545
"devDependencies": {
46-
"@rollup/plugin-commonjs": "^16.0.0",
47-
"@rollup/plugin-node-resolve": "^10.0.0",
48-
"@rollup/plugin-replace": "^2.3.4",
49-
"@rollup/plugin-terser": "^0.4.4",
50-
"@testing-library/jest-dom": "^5.16.4",
51-
"@testing-library/react": "^13.1.1",
52-
"@types/hoist-non-react-statics": "^3.3.1",
53-
"@types/jest": "^26.0.14",
54-
"@types/prop-types": "^15.5.6",
46+
"@rollup/plugin-commonjs": "^26.0.1",
47+
"@rollup/plugin-node-resolve": "^15.2.3",
48+
"@rollup/plugin-replace": "^5.0.7",
49+
"@rollup/plugin-terser": "0.4.2",
50+
"@testing-library/jest-dom": "^6.4.8",
51+
"@testing-library/react": "^14.3.0",
52+
"@types/hoist-non-react-statics": "^3.3.5",
53+
"@types/jest": "^29.5.12",
54+
"@types/prop-types": "^15.7.12",
5555
"@types/react": "^18.0.15",
5656
"@types/react-dom": "^18.0.6",
57-
"@typescript-eslint/eslint-plugin": "^2.23.0",
58-
"@typescript-eslint/parser": "^2.23.0",
59-
"eslint": "^6.8.0",
60-
"eslint-config-prettier": "^6.10.0",
61-
"eslint-plugin-prettier": "^3.1.2",
62-
"eslint-plugin-react": "^7.19.0",
63-
"eslint-plugin-react-hooks": "^4.1.0",
64-
"jest": "^26.5.2",
65-
"prettier": "1.19.1",
57+
"@typescript-eslint/eslint-plugin": "^5.6.2",
58+
"@typescript-eslint/parser": "^5.6.2",
59+
"eslint": "^8.57.0",
60+
"eslint-config-prettier": "^9.1.0",
61+
"eslint-plugin-prettier": "^5.2.1",
62+
"eslint-plugin-react": "^7.35.0",
63+
"eslint-plugin-react-hooks": "^4.6.2",
64+
"jest": "^29.7.0",
65+
"jest-environment-jsdom": "^29.7.0",
66+
"prettier": "^3.3.3",
6667
"react": "^18.2.0",
6768
"react-dom": "^18.2.0",
68-
"rollup": "^2.32.1",
69-
"rollup-plugin-typescript2": "^0.28.0",
70-
"ts-jest": "^26.4.1",
71-
"tslib": "^2.4.0",
72-
"typescript": "^4.7.4"
69+
"rollup": "^3.29.4",
70+
"rollup-plugin-typescript2": "^0.36.0",
71+
"ts-jest": "^29.2.3",
72+
"tslib": "^2.6.3",
73+
"typescript": "^5.5.4"
7374
}
7475
}

scripts/config.js

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ function getPlugins(env, externals) {
5050
plugins.push(
5151
replace({
5252
'process.env.NODE_ENV': JSON.stringify(env),
53+
preventAssignment: false,
5354
})
5455
);
5556
}

src/Experiment.spec.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
*/
1616

1717
/// <reference types="jest" />
18-
1918
import * as React from 'react';
2019
import { act } from 'react-dom/test-utils';
2120
import { render, screen, waitFor } from '@testing-library/react';
22-
import '@testing-library/jest-dom/extend-expect';
21+
import '@testing-library/jest-dom';
2322

2423
import { OptimizelyExperiment } from './Experiment';
2524
import { OptimizelyProvider } from './Provider';

src/Feature.spec.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import * as React from 'react';
2020
import { act } from 'react-dom/test-utils';
2121
import { render, screen, waitFor } from '@testing-library/react';
22-
import '@testing-library/jest-dom/extend-expect';
22+
import '@testing-library/jest-dom';
2323

2424
import { OptimizelyProvider } from './Provider';
2525
import { NotReadyReason, ReactSDKClient, VariableValuesObject } from './client';

src/hooks.spec.tsx

+28-28
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import * as React from 'react';
2020
import { act } from 'react-dom/test-utils';
2121
import { render, renderHook, screen, waitFor } from '@testing-library/react';
22-
import '@testing-library/jest-dom/extend-expect';
22+
import '@testing-library/jest-dom';
2323

2424
import { OptimizelyProvider } from './Provider';
2525
import { OnReadyResult, ReactSDKClient, VariableValuesObject } from './client';
@@ -71,6 +71,7 @@ describe('hooks', () => {
7171
let notificationListenerCallbacks: Array<() => void>;
7272
let optimizelyMock: ReactSDKClient;
7373
let readySuccess: boolean;
74+
// let reason: NotReadyReason;
7475
let userUpdateCallbacks: Array<() => void>;
7576
let UseExperimentLoggingComponent: React.FunctionComponent<any>;
7677
let UseFeatureLoggingComponent: React.FunctionComponent<any>;
@@ -84,15 +85,15 @@ describe('hooks', () => {
8485

8586
beforeEach(() => {
8687
getOnReadyPromise = ({ timeout = 0 }: any): Promise<OnReadyResult> =>
87-
new Promise(resolve => {
88-
setTimeout(function() {
88+
new Promise((resolve) => {
89+
setTimeout(function () {
8990
resolve(
9091
Object.assign(
9192
{
9293
success: readySuccess,
9394
},
9495
!readySuccess && {
95-
dataReadyPromise: new Promise(r => setTimeout(r, mockDelay)),
96+
dataReadyPromise: new Promise((r) => setTimeout(r, mockDelay)),
9697
}
9798
)
9899
);
@@ -109,21 +110,21 @@ describe('hooks', () => {
109110
decideMock = jest.fn();
110111
setForcedDecisionMock = jest.fn();
111112
hooksLoggerErrorSpy = jest.spyOn(hooksLogger, 'error');
112-
optimizelyMock = ({
113+
optimizelyMock = {
113114
activate: activateMock,
114-
onReady: jest.fn().mockImplementation(config => getOnReadyPromise(config || {})),
115+
onReady: jest.fn().mockImplementation((config) => getOnReadyPromise(config || {})),
115116
getFeatureVariables: jest.fn().mockImplementation(() => featureVariables),
116117
isFeatureEnabled: isFeatureEnabledMock,
117118
getVuid: jest.fn().mockReturnValue('vuid_95bf72cebc774dfd8e8e580a5a1'),
118-
onUserUpdate: jest.fn().mockImplementation(handler => {
119+
onUserUpdate: jest.fn().mockImplementation((handler) => {
119120
userUpdateCallbacks.push(handler);
120121
return () => {};
121122
}),
122123
notificationCenter: {
123124
addNotificationListener: jest.fn().mockImplementation((type, handler) => {
124125
notificationListenerCallbacks.push(handler);
125126
}),
126-
removeNotificationListener: jest.fn().mockImplementation(id => {}),
127+
removeNotificationListener: jest.fn().mockImplementation((id) => {}),
127128
},
128129
user: {
129130
id: 'testuser',
@@ -132,15 +133,16 @@ describe('hooks', () => {
132133
isReady: () => readySuccess,
133134
getIsReadyPromiseFulfilled: () => true,
134135
getIsUsingSdkKey: () => true,
135-
onForcedVariationsUpdate: jest.fn().mockImplementation(handler => {
136+
onForcedVariationsUpdate: jest.fn().mockImplementation((handler) => {
136137
forcedVariationUpdateCallbacks.push(handler);
137138
return () => {};
138139
}),
139140
getForcedVariations: jest.fn().mockReturnValue({}),
140141
decide: decideMock,
141142
setForcedDecision: setForcedDecisionMock,
142143
track: jest.fn(),
143-
} as unknown) as ReactSDKClient;
144+
setUser: jest.fn(),
145+
} as unknown as ReactSDKClient;
144146

145147
mockLog = jest.fn();
146148
UseExperimentLoggingComponent = ({ options = {}, overrides = {} }: any) => {
@@ -164,8 +166,8 @@ describe('hooks', () => {
164166

165167
afterEach(async () => {
166168
await optimizelyMock.onReady().then(
167-
res => res.dataReadyPromise,
168-
err => null
169+
(res) => res.dataReadyPromise,
170+
(err) => null
169171
);
170172
hooksLoggerErrorSpy.mockReset();
171173
});
@@ -204,16 +206,14 @@ describe('hooks', () => {
204206
<MyExperimentComponent options={{ timeout: mockDelay }} />
205207
</OptimizelyProvider>
206208
);
209+
207210
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('null|false|false')); // initial render
208211

209-
await optimizelyMock.onReady();
210212
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('null|false|true')); // when didTimeout
211213

212214
// Simulate datafile fetch completing after timeout has already passed
213215
// Activate now returns a variation
214216
activateMock.mockReturnValue('12345');
215-
// Wait for completion of dataReadyPromise
216-
await optimizelyMock.onReady().then(res => res.dataReadyPromise);
217217
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('12345|true|true')); // when clientReady
218218
});
219219

@@ -255,7 +255,7 @@ describe('hooks', () => {
255255
activateMock.mockReturnValue('12345');
256256
// Simulate the user object changing
257257
await act(async () => {
258-
userUpdateCallbacks.forEach(fn => fn());
258+
userUpdateCallbacks.forEach((fn) => fn());
259259
});
260260
// component.update();
261261
// await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('12345|true|false');
@@ -278,7 +278,7 @@ describe('hooks', () => {
278278
activateMock.mockReturnValue('12345');
279279
// Simulate the user object changing
280280
await act(async () => {
281-
userUpdateCallbacks.forEach(fn => fn());
281+
userUpdateCallbacks.forEach((fn) => fn());
282282
});
283283
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('null|true|false'));
284284
});
@@ -299,7 +299,7 @@ describe('hooks', () => {
299299
it('should re-render after the client becomes ready', async () => {
300300
readySuccess = false;
301301
let resolveReadyPromise: (result: { success: boolean; dataReadyPromise: Promise<any> }) => void;
302-
const readyPromise: Promise<any> = new Promise(res => {
302+
const readyPromise: Promise<any> = new Promise((res) => {
303303
resolveReadyPromise = (result): void => {
304304
readySuccess = true;
305305
res(result);
@@ -472,13 +472,13 @@ describe('hooks', () => {
472472
isFeatureEnabledMock.mockReturnValue(true);
473473
featureVariables = mockFeatureVariables;
474474
// Wait for completion of dataReadyPromise
475-
await optimizelyMock.onReady().then(res => res.dataReadyPromise);
475+
await optimizelyMock.onReady().then((res) => res.dataReadyPromise);
476476

477477
// Simulate datafile fetch completing after timeout has already passed
478478
// Activate now returns a variation
479479
activateMock.mockReturnValue('12345');
480480
// Wait for completion of dataReadyPromise
481-
await optimizelyMock.onReady().then(res => res.dataReadyPromise);
481+
await optimizelyMock.onReady().then((res) => res.dataReadyPromise);
482482
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('true|{"foo":"bar"}|true|true')); // when clientReady
483483
});
484484

@@ -522,7 +522,7 @@ describe('hooks', () => {
522522
featureVariables = mockFeatureVariables;
523523
// Simulate the user object changing
524524
await act(async () => {
525-
userUpdateCallbacks.forEach(fn => fn());
525+
userUpdateCallbacks.forEach((fn) => fn());
526526
});
527527
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('true|{"foo":"bar"}|true|false'));
528528
});
@@ -546,7 +546,7 @@ describe('hooks', () => {
546546
featureVariables = mockFeatureVariables;
547547
// Simulate the user object changing
548548
act(() => {
549-
userUpdateCallbacks.forEach(fn => fn());
549+
userUpdateCallbacks.forEach((fn) => fn());
550550
});
551551
// component.update();
552552
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('false|{}|true|false'));
@@ -567,7 +567,7 @@ describe('hooks', () => {
567567
it('should re-render after the client becomes ready', async () => {
568568
readySuccess = false;
569569
let resolveReadyPromise: (result: { success: boolean; dataReadyPromise: Promise<any> }) => void;
570-
const readyPromise: Promise<any> = new Promise(res => {
570+
const readyPromise: Promise<any> = new Promise((res) => {
571571
resolveReadyPromise = (result): void => {
572572
readySuccess = true;
573573
res(result);
@@ -731,11 +731,11 @@ describe('hooks', () => {
731731
variables: { foo: 'bar' },
732732
});
733733

734-
await optimizelyMock.onReady().then(res => res.dataReadyPromise);
734+
await optimizelyMock.onReady().then((res) => res.dataReadyPromise);
735735

736736
// Simulate datafile fetch completing after timeout has already passed
737737
// Wait for completion of dataReadyPromise
738-
await optimizelyMock.onReady().then(res => res.dataReadyPromise);
738+
await optimizelyMock.onReady().then((res) => res.dataReadyPromise);
739739

740740
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('true|{"foo":"bar"}|true|true')); // when clientReady
741741
});
@@ -781,7 +781,7 @@ describe('hooks', () => {
781781
});
782782
// Simulate the user object changing
783783
await act(async () => {
784-
userUpdateCallbacks.forEach(fn => fn());
784+
userUpdateCallbacks.forEach((fn) => fn());
785785
});
786786
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('true|{"foo":"bar"}|true|false'));
787787
});
@@ -806,7 +806,7 @@ describe('hooks', () => {
806806
});
807807
// Simulate the user object changing
808808
await act(async () => {
809-
userUpdateCallbacks.forEach(fn => fn());
809+
userUpdateCallbacks.forEach((fn) => fn());
810810
});
811811
await waitFor(() => expect(screen.getByTestId('result')).toHaveTextContent('false|{}|true|false'));
812812
});
@@ -827,7 +827,7 @@ describe('hooks', () => {
827827
it('should re-render after the client becomes ready', async () => {
828828
readySuccess = false;
829829
let resolveReadyPromise: (result: { success: boolean; dataReadyPromise: Promise<any> }) => void;
830-
const readyPromise: Promise<any> = new Promise(res => {
830+
const readyPromise: Promise<any> = new Promise((res) => {
831831
resolveReadyPromise = (result): void => {
832832
readySuccess = true;
833833
res(result);

src/hooks.ts

-1
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,6 @@ export const useExperiment: UseExperiment = (experimentKey, options = {}, overri
304304
}),
305305
[getCurrentDecision, optimizely]
306306
);
307-
308307
return [state.variation, state.clientReady, state.didTimeout];
309308
};
310309

0 commit comments

Comments
 (0)