return function (filePath: string, options: { req: Request, res?: Response }, callback: Send): void { try { const moduleFactory = setupOptions.bootstrap; if (!moduleFactory) throw new Error('You must pass in a NgModule or NgModuleFactory to be bootstrapped'); const extraProviders: any = setupOptions.providers.concat( getReqResProviders(options.req, options.res), [ { provide: INITIAL_CONFIG, useValue: { document: getDocument(filePath), url: options.req.originalUrl } } ]); const moduleRefPromise = setupOptions.aot ? platformServer(extraProviders).bootstrapModuleFactory(moduleFactory as NgModuleFactory<{}>) : platformDynamicServer(extraProviders).bootstrapModule(moduleFactory as Type<{}>); moduleRefPromise.then((moduleRef: NgModuleRef<{}>) => { handleModuleRef(moduleRef, callback); }); } catch (e) { callback(e); } };
beforeEach((done) => { platformServer().bootstrapModuleFactory(MainModuleNgFactory).then((moduleRef: any) => { mainModuleRef = moduleRef; done(); }); });
return new Promise((resolve, reject) => { try { const moduleOrFactory = options.ngModule; if (!moduleOrFactory) { throw new Error('You must pass in a NgModule or NgModuleFactory to be bootstrapped'); } const extraProviders = options.providers.concat( options.providers, [ { provide: INITIAL_CONFIG, useValue: { document: options.appSelector, url: options.request.url } }, { provide: ORIGIN_URL, useValue: options.request.origin }, { provide: REQUEST, useValue: options.request.data.request } ] ); const platform = platformServer(extraProviders); getFactory(moduleOrFactory, compiler) .then((factory: NgModuleFactory<{}>) => { return platform.bootstrapModuleFactory(factory).then((moduleRef: NgModuleRef<{}>) => { const state: PlatformState = moduleRef.injector.get(PlatformState); const appRef: ApplicationRef = moduleRef.injector.get(ApplicationRef); appRef.isStable .filter((isStable: boolean) => isStable) .first() .subscribe((stable) => { // Fire the TransferState Cache const bootstrap = moduleRef.instance['ngOnBootstrap']; bootstrap && bootstrap(); // The parse5 Document itself const AST_DOCUMENT = state.getDocument(); // Strip out the Angular application const htmlDoc = state.renderToString(); const APP_HTML = htmlDoc.substring( htmlDoc.indexOf('<body>') + 6, htmlDoc.indexOf('</body>') ); // Strip out Styles / Meta-tags / Title const STYLES = []; const SCRIPTS = []; const META = []; const LINKS = []; let TITLE = ''; //let STYLES_STRING = htmlDoc.substring( //htmlDoc.indexOf('<style ng-transition'), //htmlDoc.lastIndexOf('</style>') + 8 //); let STYLES_STRING: string = htmlDoc.indexOf('<style ng-transition') > -1 ? htmlDoc.substring( htmlDoc.indexOf('<style ng-transition'), htmlDoc.lastIndexOf('</style>') + 8) : null; // STYLES_STRING = STYLES_STRING.replace(/\s/g, '').replace('<styleng-transition', '<style ng-transition'); const HEAD = AST_DOCUMENT.head; let count = 0; for (let i = 0; i < HEAD.children.length; i++) { let element = HEAD.children[i]; if (element.name === 'title') { TITLE = element.children[0].data; } if (element.name === 'script') { SCRIPTS.push( `<script>${element.children[0].data}</script>` ); } // Broken after 4.0 (worked in rc) // if (element.name === 'style') { // let styleTag = '<style '; // for (let key in element.attribs) { // if (key) { // styleTag += `${key}="${element.attribs[key]}">`; // } // } // styleTag += `${element.children[0].data}</style>`; // STYLES.push(styleTag); // } if (element.name === 'meta') { count = count + 1; let metaString = '<meta'; for (let key in element.attribs) { if (key) { metaString += ` ${key}="${element.attribs[key]}"`; } } META.push(`${metaString} />\n`); } if (element.name === 'link') { let linkString = '<link'; for (let key in element.attribs) { if (key) { linkString += ` ${key}="${element.attribs[key]}"`; } } LINKS.push(`${linkString} />\n`); } } resolve({ html: APP_HTML, globals: { styles: STYLES_STRING, title: TITLE, scripts: SCRIPTS.join(' '), meta: META.join(' '), links: LINKS.join(' ') } }); moduleRef.destroy(); }, (err) => { // isStable subscription error (Template / code error) reject(err); }); }, err => { // bootstrapModuleFactory error reject(err); }); }, err => { // getFactory error reject(err); }); } catch (ex) { // try/catch error reject(ex); } });