Skip to content

Commit

Permalink
Fix double rendering of components in SSR mode after hydration in Ang…
Browse files Browse the repository at this point in the history
…ular (#28685)
  • Loading branch information
GoodDayForSurf authored Jan 31, 2025
1 parent 9c6c6e9 commit 965aade
Show file tree
Hide file tree
Showing 89 changed files with 266 additions and 20 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"axe-core": "4.10.2",
"cheerio": "1.0.0-rc.10",
"codelyzer": "6.0.2",
"devextreme-internal-tools": "16.3.0",
"devextreme-internal-tools": "16.3.1",
"http-server": "14.1.1",
"husky": "8.0.3",
"jest": "29.7.0",
Expand Down
10 changes: 6 additions & 4 deletions packages/devextreme-angular/gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ gulp.task('before-generate.preserve-component-files', (done) => {
return () => gulp.src(src).pipe(gulp.dest(dest));
});

gulp.parallel(...tasks)(done)
gulp.parallel(...tasks)(done);
});

gulp.task('generate.facades', gulp.series('generate.moduleFacades', (done) => {
Expand Down Expand Up @@ -213,16 +213,16 @@ gulp.task('npm.content', gulp.series(

return gulp.src([`${cmpConfig.outputPath}/**/collection.json`, ...npmConfig.content])
.pipe(gulp.dest(npmConfig.distPath));
}
},
));

gulp.task('npm.package-json', (cb) => {
const pkgPath = path.join('.', buildConfig.npm.distPath, 'package.json');
const pkg = require(`./${pkgPath}`);
delete pkg.publishConfig;
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2))
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
cb();
})
});

gulp.task('npm.pack', gulp.series(
'npm.content',
Expand Down Expand Up @@ -298,6 +298,8 @@ gulp.task('test.components.client', gulp.series('build.tests', (done) => {

gulp.task('test.components.server', gulp.series('build.tests', (done) => {
new karmaServer(getKarmaConfig('./karma.server.test.shim.js'), done).start();
}, (done) => {
new karmaServer(getKarmaConfig('./karma.hydration.test.shim.js'), done).start();
}));

gulp.task('test.components.client.debug', (done) => {
Expand Down
19 changes: 19 additions & 0 deletions packages/devextreme-angular/karma.hydration.test.shim.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
require('./karma.common.test.shim');

const testing = require('@angular/core/testing');
const server = require('@angular/platform-server/testing');

const windowUtils = require('devextreme/core/utils/window');

const windowMock = {};
windowMock.window = windowMock;
windowUtils.setWindow(windowMock);

testing.TestBed.initTestEnvironment(
server.ServerTestingModule,
server.platformServerTesting(),
);

const context = require.context('./tests/dist/server', true, /hydration\.spec\.js$/);
context.keys().map(context);
__karma__.start();
2 changes: 1 addition & 1 deletion packages/devextreme-angular/karma.server.test.shim.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ testing.TestBed.initTestEnvironment(
server.platformServerTesting(),
);

const context = require.context('./tests/dist/server', true, /\.spec\.js$/);
const context = require.context('./tests/dist/server', true, /^.\/(?!(hydration)\.spec\.js$).*\.spec\.js$/);
context.keys().map(context);
__karma__.start();
2 changes: 1 addition & 1 deletion packages/devextreme-angular/karma.test.shim.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ testing.TestBed.initTestEnvironment(
browser.platformBrowserDynamicTesting(),
);

const context = require.context('./tests/dist', true, /^.\/(?!.*\/ssr-components\.spec.js$).*\.spec\.js$/);
const context = require.context('./tests/dist', true, /^.\/(?!.*\/(ssr-components|hydration)\.spec\.js$).*\.spec\.js$/);
context.keys().map(context);
__karma__.start();
12 changes: 9 additions & 3 deletions packages/devextreme-angular/src/server/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,21 @@ export class DxServerModule {
const el = infernoRenderer.createElement(component, props);
const document = container.ownerDocument;
const temp = document.createElement(container.tagName);

temp.innerHTML = renderToString(el);

const mainElement = temp.childNodes[0];
const childString = mainElement.innerHTML;

for (let i = 0; i < mainElement.attributes.length; i++) {
temp.setAttribute(mainElement.attributes[i].name, mainElement.attributes[i].value);
const attr = mainElement.attributes[i];

if (!container.hasAttribute(attr.name)) {
container.setAttribute(attr.name, attr.value);
}
}
temp.innerHTML = childString;
container.outerHTML = temp.outerHTML;

container.innerHTML = childString;
},
});
}
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/accordion/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import { DxiAccordionItemComponent } from 'devextreme-angular/ui/accordion/neste
@Component({
selector: 'dx-accordion',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/action-sheet/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import { DxiActionSheetItemComponent } from 'devextreme-angular/ui/action-sheet/
@Component({
selector: 'dx-action-sheet',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/autocomplete/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-autocomplete',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/bar-gauge/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ import { DxoBarGaugeTooltipBorderModule } from 'devextreme-angular/ui/bar-gauge/
selector: 'dx-bar-gauge',
template: '',
styles: [ ' :host { display: block; }'],
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import { DxiBoxItemComponent } from 'devextreme-angular/ui/box/nested';
@Component({
selector: 'dx-box',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/bullet/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import { DxoBulletTooltipModule } from 'devextreme-angular/ui/bullet/nested';
selector: 'dx-bullet',
template: '',
styles: [ ' :host { display: block; }'],
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/button-group/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import { DxiButtonGroupItemComponent } from 'devextreme-angular/ui/button-group/
@Component({
selector: 'dx-button-group',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/button/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import {
@Component({
selector: 'dx-button',
template: '<ng-content></ng-content>',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/calendar/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-calendar',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/chart/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ import { DxiChartValueAxisComponent } from 'devextreme-angular/ui/chart/nested';
selector: 'dx-chart',
template: '',
styles: [ ' :host { display: block; }'],
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/chat/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import { DxiChatTypingUserComponent } from 'devextreme-angular/ui/chat/nested';
@Component({
selector: 'dx-chat',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/check-box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-check-box',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/circular-gauge/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ import { DxoCircularGaugeValueIndicatorModule } from 'devextreme-angular/ui/circ
selector: 'dx-circular-gauge',
template: '',
styles: [ ' :host { display: block; }'],
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/color-box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-color-box',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/context-menu/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ import { DxiContextMenuItemComponent } from 'devextreme-angular/ui/context-menu/
@Component({
selector: 'dx-context-menu',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/data-grid/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ import { DxiDataGridSortByGroupSummaryInfoComponent } from 'devextreme-angular/u
@Component({
selector: 'dx-data-grid',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/date-box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-date-box',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/date-range-box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-date-range-box',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import { DxoDeferRenderingToModule } from 'devextreme-angular/ui/defer-rendering
@Component({
selector: 'dx-defer-rendering',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/diagram/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ import { DxiDiagramCustomShapeComponent } from 'devextreme-angular/ui/diagram/ne
@Component({
selector: 'dx-diagram',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/draggable/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import { DxoDraggableCursorOffsetModule } from 'devextreme-angular/ui/draggable/
@Component({
selector: 'dx-draggable',
template: '<ng-content></ng-content>',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/drawer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import {
@Component({
selector: 'dx-drawer',
template: '<ng-content></ng-content>',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/drop-down-box/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-drop-down-box',
template: '<ng-content></ng-content>',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ import { DxiDropDownButtonItemComponent } from 'devextreme-angular/ui/drop-down-
@Component({
selector: 'dx-drop-down-button',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/file-manager/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ import { DxoFileManagerUploadModule } from 'devextreme-angular/ui/file-manager/n
@Component({
selector: 'dx-file-manager',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/file-uploader/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-file-uploader',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/filter-builder/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-filter-builder',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/form/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ import { DxiFormTabbedItemComponent } from 'devextreme-angular/ui/form/nested';
@Component({
selector: 'dx-form',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/funnel/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ import { DxoFunnelTooltipBorderModule } from 'devextreme-angular/ui/funnel/neste
selector: 'dx-funnel',
template: '',
styles: [ ' :host { display: block; }'],
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/gallery/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import { DxiGalleryItemComponent } from 'devextreme-angular/ui/gallery/nested';
@Component({
selector: 'dx-gallery',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/gantt/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ import { DxiGanttStripLineComponent } from 'devextreme-angular/ui/gantt/nested';
@Component({
selector: 'dx-gantt',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/html-editor/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ const CUSTOM_VALUE_ACCESSOR_PROVIDER = {
@Component({
selector: 'dx-html-editor',
template: '<ng-content></ng-content>',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/linear-gauge/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ import { DxoLinearGaugeWidthModule } from 'devextreme-angular/ui/linear-gauge/ne
selector: 'dx-linear-gauge',
template: '',
styles: [ ' :host { display: block; }'],
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/list/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ import { DxiListMenuItemComponent } from 'devextreme-angular/ui/list/nested';
@Component({
selector: 'dx-list',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/load-indicator/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import {
@Component({
selector: 'dx-load-indicator',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
1 change: 1 addition & 0 deletions packages/devextreme-angular/src/ui/load-panel/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import { DxoLoadPanelToModule } from 'devextreme-angular/ui/load-panel/nested';
@Component({
selector: 'dx-load-panel',
template: '',
host: { ngSkipHydration: 'true' },
providers: [
DxTemplateHost,
WatcherHelper,
Expand Down
Loading

0 comments on commit 965aade

Please sign in to comment.