Skip to content

Commit 2e055d0

Browse files
authored
[Blazor] Update npm dependencies (#36088) (#36273)
* Updates npm dependencies to their latest versions. * Standardizes build process for our JS dependencies on webpack 5 with babel, etc. * Updates dependencies for the auth packages to their latest versions. * Fixes test assets so that they can be run locally.
1 parent 77a2bda commit 2e055d0

38 files changed

+6564
-4183
lines changed

.azure/pipelines/jobs/default-build.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ jobs:
170170
displayName: Start background dump collection
171171
- ${{ if eq(parameters.installNodeJs, 'true') }}:
172172
- task: NodeTool@0
173-
displayName: Install Node 10.x
173+
displayName: Install Node 14.x
174174
inputs:
175-
versionSpec: 10.x
175+
versionSpec: 14.x
176176
- ${{ if eq(parameters.agentOs, 'Windows') }}:
177177
- task: NuGetToolInstaller@1
178178
- task: NuGetCommand@2

eng/targets/Helix.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<IsMacHelixQueue Condition="$(HelixTargetQueue.Contains('OSX')) or $(HelixTargetQueue.Contains('macOs'))">true</IsMacHelixQueue>
2121
<HelixTestName>$(MSBuildProjectName)--$(TargetFramework)</HelixTestName>
2222
<LoggingTestingDisableFileLogging Condition="'$(IsHelixJob)' == 'true'">false</LoggingTestingDisableFileLogging>
23-
<NodeVersion>10.15.3</NodeVersion>
23+
<NodeVersion>14.17.6</NodeVersion>
2424
<TestDependsOnAspNetPackages>false</TestDependsOnAspNetPackages>
2525
<TestDependsOnAspNetRuntime>false</TestDependsOnAspNetRuntime>
2626
</PropertyGroup>

src/Components/Web.JS/dist/Release/blazor.server.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Components/Web.JS/dist/Release/blazor.webview.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Components/Web.JS/package.json

+17-17
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,27 @@
1818
"test": "jest"
1919
},
2020
"devDependencies": {
21-
"@babel/core": "^7.13.10",
22-
"@babel/preset-env": "^7.13.10",
21+
"@babel/core": "^7.15.0",
22+
"@babel/preset-env": "^7.15.0",
2323
"@microsoft/dotnet-js-interop": "link:../../JSInterop/Microsoft.JSInterop.JS/src",
2424
"@microsoft/signalr": "link:../../SignalR/clients/ts/signalr",
2525
"@microsoft/signalr-protocol-msgpack": "link:../../SignalR/clients/ts/signalr-protocol-msgpack",
26-
"@types/emscripten": "^1.39.4",
27-
"@types/jest": "^26.0.20",
28-
"@types/jsdom": "^16.2.7",
29-
"@typescript-eslint/eslint-plugin": "^4.17.0",
30-
"@typescript-eslint/parser": "^4.17.0",
31-
"babel-jest": "^26.6.3",
32-
"eslint": "^7.21.0",
33-
"inspectpack": "^4.6.1",
34-
"jest": "^26.6.3",
26+
"@types/emscripten": "^1.39.5",
27+
"@types/jest": "^27.0.1",
28+
"@types/jsdom": "^16.2.13",
29+
"@typescript-eslint/eslint-plugin": "^4.29.3",
30+
"@typescript-eslint/parser": "^4.29.3",
31+
"babel-jest": "^27.1.0",
32+
"eslint": "^7.32.0",
33+
"inspectpack": "^4.7.1",
34+
"jest": "^27.1.0",
3535
"rimraf": "^3.0.2",
36-
"terser": "^5.6.0",
37-
"ts-jest": "^26.5.3",
38-
"ts-loader": "^8.0.17",
39-
"typescript": "^4.2.3",
40-
"webpack": "^5.24.4",
41-
"webpack-cli": "^4.5.0"
36+
"terser": "^5.7.2",
37+
"ts-jest": "^27.0.5",
38+
"ts-loader": "^9.2.5",
39+
"typescript": "^4.4.2",
40+
"webpack": "^5.51.1",
41+
"webpack-cli": "^4.8.0"
4242
},
4343
"resolutions": {
4444
"**/set-value": "^3.0.2"

src/Components/Web.JS/src/Boot.Server.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,17 @@ async function initializeConnection(options: CircuitStartOptions, logger: Logger
139139
try {
140140
await connection.start();
141141
} catch (ex) {
142-
unhandledError(connection, ex, logger);
142+
unhandledError(connection, ex as Error, logger);
143143

144-
if (ex.innerErrors && ex.innerErrors.some(e => e.errorType === 'UnsupportedTransportError' && e.transport === HttpTransportType.WebSockets)) {
144+
if (!isNestedError(ex)) {
145+
showErrorNotification();
146+
} else if (ex.innerErrors && ex.innerErrors.some(e => e.errorType === 'UnsupportedTransportError' && e.transport === HttpTransportType.WebSockets)) {
145147
showErrorNotification('Unable to connect, please ensure you are using an updated browser that supports WebSockets.');
146148
} else if (ex.innerErrors && ex.innerErrors.some(e => e.errorType === 'FailedToStartTransportError' && e.transport === HttpTransportType.WebSockets)) {
147149
showErrorNotification('Unable to connect, please ensure WebSockets are available. A VPN or proxy may be blocking the connection.');
148150
} else if (ex.innerErrors && ex.innerErrors.some(e => e.errorType === 'DisabledTransportError' && e.transport === HttpTransportType.LongPolling)) {
149151
logger.log(LogLevel.Error, 'Unable to initiate a SignalR connection to the server. This might be because the server is not configured to support WebSockets. To troubleshoot this, visit https://aka.ms/blazor-server-websockets-error.');
150152
showErrorNotification();
151-
} else {
152-
showErrorNotification();
153153
}
154154
}
155155

@@ -166,8 +166,14 @@ async function initializeConnection(options: CircuitStartOptions, logger: Logger
166166
});
167167

168168
return connection;
169+
170+
function isNestedError(error: any): error is AggregateError {
171+
return error && ('innerErrors' in error);
172+
}
169173
}
170174

175+
type AggregateError = Error & { innerErrors: { errorType: string, transport: HttpTransportType }[] };
176+
171177
function unhandledError(connection: HubConnection, err: Error, logger: Logger): void {
172178
logger.log(LogLevel.Error, err);
173179

src/Components/Web.JS/src/Platform/Circuits/CircuitStreamingInterop.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export function sendJSDataStream(connection: HubConnection, data: ArrayBufferVie
4747
chunkId++;
4848
}
4949
} catch (error) {
50-
await connection.send('ReceiveJSDataChunk', streamId, -1, null, error.toString());
50+
await connection.send('ReceiveJSDataChunk', streamId, -1, null, (error as Error).toString());
5151
}
5252
}, 0);
5353
};

src/Components/Web.JS/src/Platform/Circuits/DefaultReconnectDisplay.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export class DefaultReconnectDisplay implements ReconnectDisplay {
4242
this.button = this.modal.querySelector('button')!;
4343
this.reloadParagraph = this.modal.querySelector('p')!;
4444
this.loader = this.getLoader();
45-
45+
4646
this.message.after(this.loader);
4747

4848
this.button.addEventListener('click', async () => {
@@ -59,7 +59,7 @@ export class DefaultReconnectDisplay implements ReconnectDisplay {
5959
}
6060
} catch (err) {
6161
// We got an exception, server is currently unavailable
62-
this.logger.log(LogLevel.Error, err);
62+
this.logger.log(LogLevel.Error, err as Error);
6363
this.failed();
6464
}
6565
});
@@ -126,7 +126,7 @@ export class DefaultReconnectDisplay implements ReconnectDisplay {
126126
loader.animate([
127127
{ transform: 'rotate(0deg)' },
128128
{ transform: 'rotate(360deg)' }
129-
], {
129+
], {
130130
duration: 2000,
131131
iterations: Infinity
132132
});

src/Components/Web.JS/src/Platform/Circuits/DefaultReconnectionHandler.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class ReconnectionProcess {
8282
return;
8383
} catch (err) {
8484
// We got an exception so will try again momentarily
85-
this.logger.log(LogLevel.Error, err);
85+
this.logger.log(LogLevel.Error, err as Error);
8686
}
8787
}
8888

src/Components/Web.JS/src/Platform/Circuits/RenderQueue.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ export class RenderQueue {
5454
renderBatch(this.browserRendererId, new OutOfProcessRenderBatch(batchData));
5555
await this.completeBatch(connection, receivedBatchId);
5656
} catch (error) {
57-
this.fatalError = error.toString();
57+
this.fatalError = (error as Error).toString();
5858
this.logger.log(LogLevel.Error, `There was an error applying batch ${receivedBatchId}.`);
5959

6060
// If there's a rendering exception, notify server *and* throw on client
61-
connection.send('OnRenderCompleted', receivedBatchId, error.toString());
61+
connection.send('OnRenderCompleted', receivedBatchId, (error as Error).toString());
6262
throw error;
6363
}
6464
}

src/Components/Web.JS/src/Platform/Mono/MonoPlatform.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourceLoade
271271
const dotnetWasmResource = await wasmBeingLoaded;
272272
compiledInstance = await compileWasmModule(dotnetWasmResource, imports);
273273
} catch (ex) {
274-
module.printErr(ex);
274+
module.printErr((ex as Error).toString());
275275
throw ex;
276276
}
277277
successCallback(compiledInstance);

src/Components/Web.JS/src/Platform/WebView/WebViewIpcReceiver.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function startIpcReceiver() {
2020
renderBatch(0, new OutOfProcessRenderBatch(batchData));
2121
sendRenderCompleted(batchId, null);
2222
} catch (ex) {
23-
sendRenderCompleted(batchId, ex.toString());
23+
sendRenderCompleted(batchId, (ex as Error).toString());
2424
}
2525
},
2626

src/Components/Web.JS/src/Rendering/BrowserRenderer.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -288,22 +288,26 @@ export class BrowserRenderer {
288288
private trySetSelectValueFromOptionElement(optionElement: HTMLOptionElement) {
289289
const selectElem = this.findClosestAncestorSelectElement(optionElement);
290290

291-
if (!selectElem || !(deferredValuePropname in selectElem)) {
291+
if (!isBlazorSelectElement(selectElem)) {
292292
return false;
293293
}
294294

295295
if (isMultipleSelectElement(selectElem)) {
296-
optionElement.selected = selectElem[deferredValuePropname].indexOf(optionElement.value) !== -1;
296+
optionElement.selected = selectElem._blazorDeferredValue!.indexOf(optionElement.value) !== -1;
297297
} else {
298-
if (selectElem[deferredValuePropname] !== optionElement.value) {
298+
if (selectElem._blazorDeferredValue !== optionElement.value) {
299299
return false;
300300
}
301301

302302
setSingleSelectElementValue(selectElem, optionElement.value);
303-
delete selectElem[deferredValuePropname];
303+
delete selectElem._blazorDeferredValue;
304304
}
305305

306306
return true;
307+
308+
function isBlazorSelectElement(selectElem: HTMLSelectElement | null) : selectElem is BlazorHtmlSelectElement {
309+
return !!selectElem && (deferredValuePropname in selectElem);
310+
}
307311
}
308312

309313
private insertComponent(batch: RenderBatch, parent: LogicalElement, childIndex: number, frame: RenderTreeFrame) {
@@ -560,6 +564,8 @@ function stripOnPrefix(attributeName: string) {
560564
throw new Error(`Attribute should be an event name, but doesn't start with 'on'. Value: '${attributeName}'`);
561565
}
562566

567+
type BlazorHtmlSelectElement = HTMLSelectElement & { _blazorDeferredValue?: string };
568+
563569
function isMultipleSelectElement(element: HTMLSelectElement) {
564570
return element.type === 'select-multiple';
565571
}

src/Components/Web.JS/src/Rendering/LogicalElements.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export function getLogicalChild(parent: LogicalElement, childIndex: number): Log
173173
export function isSvgElement(element: LogicalElement) {
174174
// Note: This check is intentionally case-sensitive since we expect this element
175175
// to appear as a child of an SVG element and SVGs are case-sensitive.
176-
var closestElement = getClosestDomElement(element);
176+
var closestElement = getClosestDomElement(element) as any;
177177
return closestElement.namespaceURI === 'http://www.w3.org/2000/svg' && closestElement['tagName'] !== 'foreignObject';
178178
}
179179

0 commit comments

Comments
 (0)