Skip to content

Commit 98e4586

Browse files
authored
Bump dependencies (#351)
* Bump deps * Update webpack * Add buffer * Clean up * Clean config * Add babel-loader * Prevent console on test * Update event-target-shim signature
1 parent ef94e99 commit 98e4586

16 files changed

+6874
-6834
lines changed

.babelrc.js

Lines changed: 0 additions & 40 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,47 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1616

1717
## [Unreleased]
1818

19+
### Changed
20+
21+
- Bumped dependencies, by [@compulim](https://github.com/compulim), in PR [#351](https://github.com/microsoft/BotFramework-DirectLineJS/pull/351)
22+
- Production dependencies
23+
- [`@babel/runtime@7.14.8`](https://npmjs.com/package/@babel/runtime)
24+
- [`botframework-streaming@4.14.1`](https://npmjs.com/package/botframework-streaming)
25+
- [`buffer@6.0.3`](https://npmjs.com/package/buffer)
26+
- [`core-js@3.15.2`](https://npmjs.com/package/core-js)
27+
- [`cross-fetch@3.1.4`](https://npmjs.com/package/cross-fetch)
28+
- [`rxjs@5.5.12`](https://npmjs.com/package/rxjs)
29+
- [`url-search-params-polyfill@8.1.1`](https://npmjs.com/package/url-search-params-polyfill)
30+
- Development dependencies
31+
- [`@babel/cli@7.14.8`](https://npmjs.com/package/@babel/cli)
32+
- [`@babel/core@7.14.8`](https://npmjs.com/package/@babel/core)
33+
- [`@babel/plugin-transform-runtime@7.14.5`](https://npmjs.com/package/@babel/plugin-transform-runtime)
34+
- [`@babel/preset-env@7.14.8`](https://npmjs.com/package/@babel/preset-env)
35+
- [`@babel/preset-typescript@7.14.5`](https://npmjs.com/package/@babel/preset-typescript)
36+
- [`@types/jest@26.0.24`](https://npmjs.com/package/@types/jest)
37+
- [`@types/jsonwebtoken@8.5.4`](https://npmjs.com/package/@types/jsonwebtoken)
38+
- [`@types/node@16.4.0`](https://npmjs.com/package/@types/node)
39+
- [`babel-loader@8.2.2`](https://npmjs.com/package/babel-loader)
40+
- [`babel-jest@27.0.6`](https://npmjs.com/package/babel-jest)
41+
- [`babel-plugin-istanbul@6.0.0`](https://npmjs.com/package/babel-plugin-istanbul)
42+
- [`concurrently@6.2.0`](https://npmjs.com/package/concurrently)
43+
- [`dotenv@10.0.0`](https://npmjs.com/package/dotenv)
44+
- [`event-target-shim@6.0.2`](https://npmjs.com/package/event-target-shim)
45+
- [`get-port@5.1.1`](https://npmjs.com/package/get-port)
46+
- [`global-agent@2.2.0`](https://npmjs.com/package/global-agent)
47+
- [`jest@27.0.6`](https://npmjs.com/package/jest)
48+
- [`jest-environment-jsdom@27.0.6`](https://npmjs.com/package/jest-environment-jsdom)
49+
- [`jsdom@16.6.0`](https://npmjs.com/package/jsdom)
50+
- [`nock@13.1.1`](https://npmjs.com/package/nock)
51+
- [`node-fetch@2.6.1`](https://npmjs.com/package/node-fetch)
52+
- [`restify@8.5.1`](https://npmjs.com/package/restify)
53+
- [`rimraf@3.0.2`](https://npmjs.com/package/rimraf)
54+
- [`simple-update-in@2.2.0`](https://npmjs.com/package/simple-update-in)
55+
- [`typescript@4.3.5`](https://npmjs.com/package/typescript)
56+
- [`webpack@5.45.1`](https://npmjs.com/package/webpack)
57+
- [`webpack-cli@4.7.2`](https://npmjs.com/package/webpack-cli)
58+
- [`webpack-stats-plugin@1.0.3`](https://npmjs.com/package/webpack-stats-plugin)
59+
1960
## [0.14.1] - 2021-02-10
2061

2162
### Changed

__tests__/setup.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ test('createServer setup correctly', async () => {
2121
dispose();
2222
}
2323
});
24+
25+
test('test environment has Web Cryptography API', () => {
26+
expect(typeof global.crypto.getRandomValues).toBe('function');
27+
});

__tests__/setup/createDirectLineForwarder.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { createProxyServer } from 'http-proxy';
22
import { createServer } from 'http';
33
import { promisify } from 'util';
44

5-
export default async function createDirectLineForwarder(port, handler, target = 'https://directline.botframework.com/') {
5+
export default async function createDirectLineForwarder(
6+
port,
7+
handler,
8+
target = 'https://directline.botframework.com/'
9+
) {
610
// We need a reverse proxy (a.k.a. forwarder) to control the network traffic.
711
// This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost").
812

@@ -12,14 +16,20 @@ export default async function createDirectLineForwarder(port, handler, target =
1216
target
1317
});
1418

19+
proxy.on('proxyReq', (proxyRes, req, res, options) => {
20+
// JSDOM requires all HTTP response, including those already pre-flighted, to have "Access-Control-Allow-Origin".
21+
// https://github.com/jsdom/jsdom/issues/2024
22+
res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*');
23+
});
24+
1525
const proxyServer = createServer((req, res) => {
1626
handler(req, res, () => proxy.web(req, res));
1727
});
1828

1929
await promisify(proxyServer.listen.bind(proxyServer))(port);
2030

2131
return {
22-
domain: `http://localhost:${ port }/v3/directline`,
32+
domain: `http://localhost:${port}/v3/directline`,
2333
unsubscribe: promisify(proxyServer.close.bind(proxyServer))
2434
};
2535
}

__tests__/setup/createServer.ts

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,12 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
4141
deferred: createDeferred()
4242
}));
4343
} else {
44-
return [{
45-
...unorderedPlaybacks,
46-
deferred: createDeferred()
47-
}];
44+
return [
45+
{
46+
...unorderedPlaybacks,
47+
deferred: createDeferred()
48+
}
49+
];
4850
}
4951
});
5052

@@ -58,11 +60,7 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
5860
const unorderedPlaybacks = Array.isArray(firstPlayback) ? firstPlayback : [firstPlayback];
5961
let handled;
6062

61-
unorderedPlaybacks.forEach(({
62-
deferred,
63-
req: preq = {},
64-
res: pres = {}
65-
}, index) => {
63+
unorderedPlaybacks.forEach(({ deferred, req: preq = {}, res: pres = {} }, index) => {
6664
if (req.url === (preq.url || '/')) {
6765
if (req.method === 'OPTIONS') {
6866
res.send(200, '', {
@@ -80,14 +78,13 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
8078
headers['Content-Type'] = 'text/plain';
8179
}
8280

83-
res.send(
84-
pres.code || 200,
85-
pres.body,
86-
{
87-
...headers,
88-
...pres.headers
89-
}
90-
);
81+
res.send(pres.code || 200, pres.body, {
82+
// JSDOM requires all HTTP response, including those already pre-flighted, to have "Access-Control-Allow-Origin".
83+
// https://github.com/jsdom/jsdom/issues/2024
84+
'Access-Control-Allow-Origin': req.header('Origin') || '*',
85+
...headers,
86+
...pres.headers
87+
});
9188

9289
handled = true;
9390
deferred.resolve();
@@ -114,11 +111,11 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
114111
return new Promise(resolve => server.close(resolve));
115112
},
116113
port,
117-
promises: options.playbacks.map((unorderedPlayback: (Playback | Playback[]), index) => {
114+
promises: options.playbacks.map((unorderedPlayback: Playback | Playback[], index) => {
118115
if (Array.isArray(unorderedPlayback)) {
119116
return (orderedPlaybacks[index] as PlaybackWithDeferred[]).map(({ deferred: { promise } }) => promise);
120117
} else {
121-
return (orderedPlaybacks[index][0]).deferred.promise;
118+
return orderedPlaybacks[index][0].deferred.promise;
122119
}
123120
})
124121
};

__tests__/setup/jsdomEnvironmentWithProxy.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ require('global-agent/bootstrap');
22

33
// To use proxy, SET GLOBAL_AGENT_HTTP_PROXY=http://localhost:8888
44

5-
const JSDOMEnvironment = require('jest-environment-jsdom-fourteen');
5+
const JSDOMEnvironment = require('jest-environment-jsdom');
66

77
class JSDOMEnvironmentWithProxy extends JSDOMEnvironment {
88
setup() {
@@ -14,9 +14,9 @@ class JSDOMEnvironmentWithProxy extends JSDOMEnvironment {
1414
// This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic).
1515
// Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeed when running without watch.
1616
this.global._resourceLoader = resources;
17-
18-
return super.setup();
1917
}
18+
19+
return super.setup();
2020
}
2121
}
2222

__tests__/setup/setupCrypto.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const crypto = require('crypto');
2+
3+
global.crypto = {
4+
// uuid.v4() required Web Cryptography.
5+
// https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues
6+
getRandomValues(array) {
7+
if (
8+
!(
9+
array instanceof Int8Array ||
10+
array instanceof Uint8Array ||
11+
array instanceof Int16Array ||
12+
array instanceof Uint16Array ||
13+
array instanceof In32Array ||
14+
array instanceof Uint32Array ||
15+
array instanceof Uint8ClampedArray
16+
)
17+
) {
18+
throw new Error('TypeMismatchError');
19+
} else if (array.length > 65536) {
20+
throw new Error('QuotaExceededError');
21+
}
22+
23+
return crypto.randomFillSync(array);
24+
}
25+
};

__tests__/unhappy.brokenWebSocket.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'dotenv/config';
22
import 'global-agent/bootstrap';
33

4-
import { defineEventAttribute, EventTarget } from 'event-target-shim';
4+
import { EventTarget, getEventAttributeValue, setEventAttributeValue } from 'event-target-shim';
55
import nock from 'nock';
66
import onErrorResumeNext from 'on-error-resume-next';
77

@@ -64,9 +64,7 @@ describe('Unhappy path', () => {
6464
.options(uri => uri.startsWith('/v3/directline/conversations'))
6565
);
6666

67-
window.WebSocket = class extends (
68-
EventTarget
69-
) {
67+
window.WebSocket = class extends EventTarget {
7068
constructor() {
7169
super();
7270

@@ -79,10 +77,23 @@ describe('Unhappy path', () => {
7977
this.dispatchEvent(new CustomEvent('close'));
8078
}, 10);
8179
}
82-
};
8380

84-
defineEventAttribute(window.WebSocket.prototype, 'close');
85-
defineEventAttribute(window.WebSocket.prototype, 'error');
81+
get onclose() {
82+
return getEventAttributeValue(this, 'close');
83+
}
84+
85+
set onclose(value) {
86+
setEventAttributeValue(this, 'close', value);
87+
}
88+
89+
get onerror() {
90+
return getEventAttributeValue(this, 'error');
91+
}
92+
93+
set onerror(value) {
94+
setEventAttributeValue(this, 'error', value);
95+
}
96+
};
8697
});
8798

8899
afterEach(() => {

__tests__/unhappy.postActivityFatalAfterConnect.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import waitForConnected from './setup/waitForConnected';
1313
describe('Unhappy path', () => {
1414
let unsubscribes;
1515

16-
beforeEach(() => unsubscribes = []);
16+
beforeEach(() => (unsubscribes = []));
1717
afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn)));
1818

1919
describe('channel returned 404 on post activity after connected', () => {
@@ -23,7 +23,7 @@ describe('Unhappy path', () => {
2323

2424
beforeEach(async () => {
2525
proxyPort = await getPort();
26-
proxyDomain = `http://localhost:${ proxyPort }/v3/directline`;
26+
proxyDomain = `http://localhost:${proxyPort}/v3/directline`;
2727
});
2828

2929
describe('using REST', () => {
@@ -57,23 +57,27 @@ describe('Unhappy path', () => {
5757

5858
afterEach(async () => {
5959
// If directLine object is undefined, that means the test is failing.
60-
if (!directLine) { return; }
60+
if (!directLine) {
61+
return;
62+
}
6163

6264
let lastConnectionStatus;
6365

6466
const connectionStatusSubscription = directLine.connectionStatus$.subscribe({
65-
next(value) { lastConnectionStatus = value; }
67+
next(value) {
68+
lastConnectionStatus = value;
69+
}
6670
});
6771

6872
unsubscribes.push(connectionStatusSubscription.unsubscribe.bind(connectionStatusSubscription));
6973

7074
let alwaysReturn404;
7175

7276
const { unsubscribe } = await createDirectLineForwarder(proxyPort, (req, res, next) => {
73-
if (
74-
req.method !== 'OPTIONS'
75-
&& alwaysReturn404
76-
) {
77+
if (req.method !== 'OPTIONS' && alwaysReturn404) {
78+
// JSDOM requires all HTTP response, including those already pre-flighted, to have "Access-Control-Allow-Origin".
79+
// https://github.com/jsdom/jsdom/issues/2024
80+
res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*');
7781
res.statusCode = 404;
7882
res.end();
7983
} else {

babel-jest-config.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const {
2+
default: { createTransformer }
3+
} = require('babel-jest');
4+
const { join } = require('path');
5+
const { readFileSync } = require('fs');
6+
7+
const stringifiedBabelOptions = readFileSync(join(__dirname, 'babel.config.json'), 'utf8');
8+
const babelOptions = JSON.parse(stringifiedBabelOptions);
9+
const transformer = createTransformer(babelOptions);
10+
11+
// Jest is supposed to use babel-jest to consume the .babelrc file in the root of the project,
12+
// but for some reason it can't seem to locate the file, so we must manually load the .babelrc
13+
// file in memory and create a transformer for it.
14+
15+
module.exports = transformer;

0 commit comments

Comments
 (0)