97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import 'zone.js/node';
 | |
| import './generated-config';
 | |
| 
 | |
| import * as domino from 'domino';
 | |
| import * as express from 'express';
 | |
| import * as fs from 'fs';
 | |
| import * as path from 'path';
 | |
| 
 | |
| const {readFileSync, existsSync} = require('fs');
 | |
| const {createProxyMiddleware} = require('http-proxy-middleware');
 | |
| 
 | |
| const template = fs.readFileSync(path.join(process.cwd(), 'dist/mempool/browser/en-US/', 'index.html')).toString();
 | |
| const win = domino.createWindow(template);
 | |
| 
 | |
| // @ts-ignore
 | |
| win.__env = global.__env;
 | |
| 
 | |
| // @ts-ignore
 | |
| win.matchMedia = () => {
 | |
|   return {
 | |
|     matches: true
 | |
|   };
 | |
| };
 | |
| 
 | |
| // @ts-ignore
 | |
| win.setTimeout = (fn) => { fn(); };
 | |
| win.document.body.scrollTo = (() => {});
 | |
| // @ts-ignore
 | |
| global['window'] = win;
 | |
| global['document'] = win.document;
 | |
| // @ts-ignore
 | |
| global['history'] = { state: { } };
 | |
| 
 | |
| global['localStorage'] = {
 | |
|   getItem: () => '',
 | |
|   setItem: () => {},
 | |
|   removeItem: () => {},
 | |
|   clear: () => {},
 | |
|   length: 0,
 | |
|   key: () => '',
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Return the list of supported and actually active locales
 | |
|  */
 | |
| function getActiveLocales() {
 | |
|   const angularConfig = JSON.parse(readFileSync('angular.json', 'utf8'));
 | |
| 
 | |
|   const supportedLocales = [
 | |
|     angularConfig.projects.mempool.i18n.sourceLocale,
 | |
|     ...Object.keys(angularConfig.projects.mempool.i18n.locales),
 | |
|   ];
 | |
| 
 | |
|   return supportedLocales.filter(locale => existsSync(`./dist/mempool/server/${locale}`));
 | |
| }
 | |
| 
 | |
| function app() {
 | |
|   const server = express();
 | |
| 
 | |
|   // proxy API to nginx
 | |
|   server.get('/api/**', createProxyMiddleware({
 | |
|     // @ts-ignore
 | |
|     target: win.__env.NGINX_PROTOCOL + '://' + win.__env.NGINX_HOSTNAME + ':' + win.__env.NGINX_PORT,
 | |
|     changeOrigin: true,
 | |
|   }));
 | |
| 
 | |
|   // map / and /en to en-US
 | |
|   const defaultLocale = 'en-US';
 | |
|   console.log(`serving default locale: ${defaultLocale}`);
 | |
|   const appServerModule = require(`./dist/mempool/server/${defaultLocale}/main.js`);
 | |
|   server.use('/', appServerModule.app(defaultLocale));
 | |
|   server.use('/en', appServerModule.app(defaultLocale));
 | |
| 
 | |
|   // map each locale to its localized main.js
 | |
|   getActiveLocales().forEach(locale => {
 | |
|     console.log('serving locale:', locale);
 | |
|     const appServerModule = require(`./dist/mempool/server/${locale}/main.js`);
 | |
| 
 | |
|     // map everything to itself
 | |
|     server.use(`/${locale}`, appServerModule.app(locale));
 | |
| 
 | |
|   });
 | |
| 
 | |
|   return server;
 | |
| }
 | |
| 
 | |
| function run() {
 | |
|   const port = process.env.PORT || 4000;
 | |
| 
 | |
|   // Start up the Node server
 | |
|   app().listen(port, () => {
 | |
|     console.log(`Node Express server listening on port ${port}`);
 | |
|   });
 | |
| }
 | |
| 
 | |
| run();
 |