1
1
import { Type , NgModuleFactory , CompilerFactory , Compiler } from '@angular/core' ;
2
- import { platformDynamicServer , BEFORE_APP_SERIALIZED , renderModuleFactory } from '@angular/platform-server' ;
2
+ import { platformDynamicServer } from '@angular/platform-server' ;
3
+ import { DOCUMENT } from '@angular/platform-browser' ;
3
4
import { ResourceLoader } from '@angular/compiler' ;
4
5
5
6
import { REQUEST , ORIGIN_URL } from './tokens' ;
6
7
import { FileLoader } from './file-loader' ;
7
-
8
8
import { IEngineOptions } from './interfaces/engine-options' ;
9
- import { DOCUMENT } from '@angular/platform-browser' ;
9
+ import { IEngineRenderResult } from './interfaces/engine-render-result' ;
10
+ import { renderModuleFactory } from './platform-server-utils' ;
10
11
11
12
/* @internal */
12
13
export class UniversalData {
13
- public static appNode = '' ;
14
- public static title = '' ;
15
- public static scripts = '' ;
16
- public static styles = '' ;
17
- public static meta = '' ;
18
- public static links = '' ;
14
+ public appNode = '' ;
15
+ public title = '' ;
16
+ public scripts = '' ;
17
+ public styles = '' ;
18
+ public meta = '' ;
19
+ public links = '' ;
19
20
}
20
21
21
22
/* @internal */
22
23
let appSelector = 'app-root' ; // default
23
24
24
25
/* @internal */
25
- function beforeAppSerialized (
26
+ function _getUniversalData (
26
27
doc : any /* TODO: type definition for Domino - DomAPI Spec (similar to "Document") */
27
- ) {
28
-
29
- return ( ) => {
30
- const STYLES = [ ] ;
31
- const SCRIPTS = [ ] ;
32
- const META = [ ] ;
33
- const LINKS = [ ] ;
34
-
35
- for ( let i = 0 ; i < doc . head . children . length ; i ++ ) {
36
- const element = doc . head . children [ i ] ;
37
- const tagName = element . tagName . toUpperCase ( ) ;
38
-
39
- switch ( tagName ) {
40
- case 'SCRIPT' :
41
- SCRIPTS . push ( element . outerHTML ) ;
42
- break ;
43
- case 'STYLE' :
44
- STYLES . push ( element . outerHTML ) ;
45
- break ;
46
- case 'LINK' :
47
- LINKS . push ( element . outerHTML ) ;
48
- break ;
49
- case 'META' :
50
- META . push ( element . outerHTML ) ;
51
- break ;
52
- default :
53
- break ;
54
- }
28
+ ) : UniversalData {
29
+
30
+ const STYLES = [ ] ;
31
+ const SCRIPTS = [ ] ;
32
+ const META = [ ] ;
33
+ const LINKS = [ ] ;
34
+
35
+ for ( let i = 0 ; i < doc . head . children . length ; i ++ ) {
36
+ const element = doc . head . children [ i ] ;
37
+ const tagName = element . tagName . toUpperCase ( ) ;
38
+
39
+ switch ( tagName ) {
40
+ case 'SCRIPT' :
41
+ SCRIPTS . push ( element . outerHTML ) ;
42
+ break ;
43
+ case 'STYLE' :
44
+ STYLES . push ( element . outerHTML ) ;
45
+ break ;
46
+ case 'LINK' :
47
+ LINKS . push ( element . outerHTML ) ;
48
+ break ;
49
+ case 'META' :
50
+ META . push ( element . outerHTML ) ;
51
+ break ;
52
+ default :
53
+ break ;
54
+ }
55
+ }
56
+
57
+ for ( let i = 0 ; i < doc . body . children . length ; i ++ ) {
58
+ const element : Element = doc . body . children [ i ] ;
59
+ const tagName = element . tagName . toUpperCase ( ) ;
60
+
61
+ switch ( tagName ) {
62
+ case 'SCRIPT' :
63
+ SCRIPTS . push ( element . outerHTML ) ;
64
+ break ;
65
+ case 'STYLE' :
66
+ STYLES . push ( element . outerHTML ) ;
67
+ break ;
68
+ case 'LINK' :
69
+ LINKS . push ( element . outerHTML ) ;
70
+ break ;
71
+ case 'META' :
72
+ META . push ( element . outerHTML ) ;
73
+ break ;
74
+ default :
75
+ break ;
55
76
}
77
+ }
56
78
57
- UniversalData . title = doc . title ;
58
- UniversalData . appNode = doc . querySelector ( appSelector ) . outerHTML ;
59
- UniversalData . scripts = SCRIPTS . join ( ' ' ) ;
60
- UniversalData . styles = STYLES . join ( ' ' ) ;
61
- UniversalData . meta = META . join ( ' ' ) ;
62
- UniversalData . links = LINKS . join ( ' ' ) ;
79
+ return {
80
+ title : doc . title ,
81
+ appNode : doc . querySelector ( appSelector ) . outerHTML ,
82
+ scripts : SCRIPTS . join ( '\n' ) ,
83
+ styles : STYLES . join ( '\n' ) ,
84
+ meta : META . join ( '\n' ) ,
85
+ links : LINKS . join ( '\n' )
63
86
} ;
64
87
}
65
88
66
-
67
- export function ngAspnetCoreEngine (
68
- options : IEngineOptions
69
- ) : Promise < { html : string , globals : { styles : string , title : string , meta : string , transferData ?: { } , [ key : string ] : any } } > {
89
+ export function ngAspnetCoreEngine ( options : IEngineOptions ) : Promise < IEngineRenderResult > {
70
90
71
91
if ( ! options . appSelector ) {
72
92
throw new Error ( `appSelector is required! Pass in " appSelector: '<app-root></app-root>' ", for your root App component.` ) ;
@@ -95,17 +115,13 @@ export function ngAspnetCoreEngine(
95
115
options . providers = options . providers || [ ] ;
96
116
97
117
const extraProviders = options . providers . concat (
98
- ...options . providers ,
99
- [ {
100
- provide : ORIGIN_URL ,
101
- useValue : options . request . origin
102
- } , {
103
- provide : REQUEST ,
104
- useValue : options . request . data . request
105
- } , {
106
- provide : BEFORE_APP_SERIALIZED ,
107
- useFactory : beforeAppSerialized , multi : true , deps : [ DOCUMENT ]
108
- }
118
+ [ {
119
+ provide : ORIGIN_URL ,
120
+ useValue : options . request . origin
121
+ } , {
122
+ provide : REQUEST ,
123
+ useValue : options . request . data . request
124
+ }
109
125
]
110
126
) ;
111
127
@@ -117,18 +133,20 @@ export function ngAspnetCoreEngine(
117
133
extraProviders : extraProviders
118
134
} ) ;
119
135
} )
120
- . then ( ( ) => {
136
+ . then ( result => {
137
+ const doc = result . moduleRef . injector . get ( DOCUMENT ) ;
138
+ const universalData = _getUniversalData ( doc ) ;
121
139
122
140
resolve ( {
123
- html : UniversalData . appNode ,
141
+ html : universalData . appNode ,
142
+ moduleRef : result . moduleRef ,
124
143
globals : {
125
- styles : UniversalData . styles ,
126
- title : UniversalData . title ,
127
- scripts : UniversalData . scripts ,
128
- meta : UniversalData . meta ,
129
- links : UniversalData . links
144
+ styles : universalData . styles ,
145
+ title : universalData . title ,
146
+ scripts : universalData . scripts ,
147
+ meta : universalData . meta ,
148
+ links : universalData . links
130
149
}
131
-
132
150
} ) ;
133
151
} , ( err ) => {
134
152
reject ( err ) ;
0 commit comments