Skip to content
This repository was archived by the owner on Feb 17, 2024. It is now read-only.

Commit 6f89702

Browse files
committed
🎉 src
0 parents  commit 6f89702

10 files changed

+157
-0
lines changed

browser.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './dist/browser';

browser.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./dist/browser');

server.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './dist/server';

server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./dist/server');

src/browser-transfer-state.module.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { NgModule } from '@angular/core';
2+
import { TransferState } from './transfer-state';
3+
4+
export function getTransferState(): TransferState {
5+
const win: any = window;
6+
const transferState = new TransferState();
7+
transferState.initialize(win[TransferState.KEY] || {});
8+
return transferState;
9+
}
10+
11+
@NgModule({
12+
providers: [
13+
{
14+
provide: TransferState,
15+
useFactory: getTransferState
16+
}
17+
]
18+
})
19+
export class BrowserTransferStateModule {
20+
21+
}

src/browser.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './browser-transfer-state.module';
2+
export * from './transfer-state';

src/server-transfer-state.module.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { NgModule } from '@angular/core';
2+
import { ServerTransferState } from './server-transfer-state';
3+
import { TransferState } from './transfer-state';
4+
5+
@NgModule({
6+
providers: [
7+
{ provide: TransferState, useClass: ServerTransferState }
8+
]
9+
})
10+
export class ServerTransferStateModule {
11+
12+
}

src/server-transfer-state.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { Injectable, Optional, RendererFactory2, ViewEncapsulation } from '@angular/core';
2+
import { TransferState } from './transfer-state';
3+
import { PlatformState } from '@angular/platform-server';
4+
5+
export function isTag(tagName: string, node: any): boolean {
6+
return node.type === 'tag' && node.name === tagName;
7+
}
8+
9+
@Injectable()
10+
export class ServerTransferState extends TransferState {
11+
constructor( private state: PlatformState, private rendererFactory: RendererFactory2) {
12+
super();
13+
}
14+
15+
/**
16+
* Inject the State into the bottom of the <head>
17+
*/
18+
inject(location?: string) {
19+
try {
20+
const document: any = this.state.getDocument();
21+
const transferStateString = JSON.stringify(this.toJson());
22+
const renderer = this.rendererFactory.createRenderer(document, {
23+
id: '-1',
24+
encapsulation: ViewEncapsulation.None,
25+
styles: [],
26+
data: {}
27+
});
28+
29+
30+
let rootNode: any = undefined;
31+
let bodyNode: any = undefined;
32+
let headNode: any = undefined;
33+
34+
// let titleNode: any = undefined;
35+
36+
for (let i: number = 0; i < document.childNodes.length; ++i) {
37+
const child = document.childNodes[i];
38+
39+
if (isTag('html', child)) {
40+
rootNode = child;
41+
break;
42+
}
43+
}
44+
45+
if (!rootNode) {
46+
rootNode = document;
47+
}
48+
49+
50+
for (let i: number = 0; i < rootNode.childNodes.length; ++i) {
51+
const child = rootNode.childNodes[i];
52+
53+
if (isTag('head', child)) {
54+
headNode = child;
55+
}
56+
if (isTag('body', child)) {
57+
bodyNode = child;
58+
}
59+
}
60+
61+
const body = location === 'head' ? headNode : bodyNode;
62+
63+
const script = renderer.createElement('script');
64+
renderer.setValue(script, `
65+
try {
66+
window['${ TransferState.KEY }'] = ${ transferStateString }
67+
} catch (e) {
68+
console.log('Angular Universal: There was a problem parsing the server data during rehydrate');
69+
}
70+
`);
71+
renderer.appendChild(body, script);
72+
renderer.setAttribute(script, 'angular', 'universal');
73+
rootNode = undefined;
74+
bodyNode = undefined;
75+
headNode = undefined;
76+
} catch (e) {
77+
console.error(e);
78+
}
79+
}
80+
81+
82+
}

src/server.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './server-transfer-state.module';
2+
export * from './server-transfer-state';
3+
export * from './transfer-state';

src/transfer-state.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Injectable } from '@angular/core';
2+
3+
@Injectable()
4+
export class TransferState {
5+
static KEY = 'TransferState';
6+
private _map = new Map<string, any>();
7+
8+
constructor() {}
9+
10+
keys() {
11+
return this._map.keys();
12+
}
13+
14+
get(key: string): any {
15+
return this._map.get(key);
16+
}
17+
18+
set(key: string, value: any): Map<string, any> {
19+
return this._map.set(key, value);
20+
}
21+
22+
toJson(): any {
23+
const obj: any = {};
24+
Array.from(this.keys()).forEach((key: string) => obj[key] = this.get(key));
25+
return obj;
26+
}
27+
28+
initialize(obj: any): void {
29+
Object.keys(obj).forEach((key: string) => this.set(key, obj[key]));
30+
}
31+
32+
inject(): void {}
33+
}

0 commit comments

Comments
 (0)