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

Commit abe57e0

Browse files
alan-agius4vikerman
authored andcommitted
fix(hapi-engine): update schematic for server.ts
1 parent bdd91dd commit abe57e0

File tree

8 files changed

+178
-66
lines changed

8 files changed

+178
-66
lines changed

integration/hapi-engine-ivy/package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,21 @@
2828
"@angular/platform-browser-dynamic": "9.0.0-next.5",
2929
"@angular/platform-server": "9.0.0-next.5",
3030
"@angular/router": "9.0.0-next.5",
31-
"@nguniversal/hapi-engine": "file:../../dist/mdules-dist/hapi-engine",
31+
"@nguniversal/hapi-engine": "file:../../dist/modules-dist/hapi-engine",
3232
"hapi": "file:../../node_modules/hapi",
3333
"inert": "5.1.0",
3434
"rxjs": "file:../../node_modules/rxjs",
35-
"zone.js": "file:../../node_modules/zone.js"
35+
"zone.js": "file:../../node_modules/zone.js",
36+
"vision": "5.4.4"
3637
},
3738
"devDependencies": {
3839
"@angular-devkit/build-angular": "0.900.0-next.4",
3940
"@angular/cli": "9.0.0-next.4",
4041
"@angular/compiler-cli": "file:../../node_modules/@angular/compiler-cli",
42+
"@types/inert": "file:../../node_modules/@types/inert",
4143
"@types/node": "file:../../node_modules/@types/node",
4244
"@types/jasmine": "file:../../node_modules/@types/jasmine",
45+
"@types/vision": "file:../../node_modules/@types/vision",
4346
"codelyzer": "5.1.0",
4447
"concurrently": "3.1.0",
4548
"jasmine-core": "3.4.0",
Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,56 @@
11
import 'zone.js/dist/zone-node';
22

33
import { ngHapiEngine } from '@nguniversal/hapi-engine';
4-
import { Request, Server } from 'hapi';
5-
import * as Inert from 'inert';
4+
import * as inert from 'inert';
5+
import * as vision from 'vision';
6+
import { Request, Server, ResponseToolkit } from 'hapi';
67
import { join } from 'path';
78

89
import { AppServerModule } from './src/main.server';
910

1011
// Hapi server
1112
async function run(): Promise<void> {
1213
const port: string | number = process.env.PORT || 4000;
13-
const server = new Server({ port, host: 'localhost' });
14-
const distFolder = join(process.cwd(), 'dist/hapi-ve/browser');
14+
const distFolder = join(process.cwd(), 'dist/hapi-engine-ivy/browser');
15+
const server = new Server({
16+
port,
17+
host: 'localhost',
18+
routes: {
19+
files: {
20+
relativeTo: distFolder
21+
}
22+
},
23+
});
24+
25+
await server.register(vision);
26+
server.views({
27+
engines: {
28+
html : {
29+
compile: (document: string) => (req: Request) => ngHapiEngine({
30+
bootstrap: AppServerModule,
31+
document,
32+
req,
33+
})
34+
}
35+
},
36+
path: distFolder,
37+
});
1538

1639
server.route({
1740
method: 'GET',
18-
path: '/*',
19-
handler: (req: Request) =>
20-
ngHapiEngine({
21-
bootstrap: AppServerModule,
22-
req,
23-
})
41+
path: '/{path*}',
42+
handler: (req: Request, res: ResponseToolkit) =>
43+
res.view('index', req)
2444
});
2545

26-
await server.register(Inert);
46+
await server.register(inert);
2747

28-
// Client bundles will be statically served from the built/ directory.
48+
// Client bundles will be statically served from the dist directory.
2949
server.route({
3050
method: 'GET',
31-
path: '/{file*}',
32-
handler: {
33-
directory: {
34-
path: distFolder
35-
}
36-
}
51+
path: '/{filename}.{ext}',
52+
handler: (req: Request, res: ResponseToolkit) =>
53+
res.file(`${req.params.filename}.${req.params.ext}`)
3754
});
3855

3956
await server.start();
@@ -46,10 +63,7 @@ async function run(): Promise<void> {
4663
declare const __non_webpack_require__: NodeRequire;
4764
const mainModule = __non_webpack_require__.main;
4865
if (mainModule && mainModule.filename === __filename) {
49-
run().catch(error => {
50-
console.error(`Error: ${error.toString()}`);
51-
process.exit(1);
52-
});
66+
run();
5367
}
5468

5569
export * from './src/main.server';

integration/hapi-engine-ve/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,21 @@
2828
"@angular/platform-browser-dynamic": "9.0.0-next.5",
2929
"@angular/platform-server": "9.0.0-next.5",
3030
"@angular/router": "9.0.0-next.5",
31-
"@nguniversal/hapi-engine": "file:../../dist/mdules-dist/hapi-engine",
31+
"@nguniversal/hapi-engine": "file:../../dist/modules-dist/hapi-engine",
3232
"hapi": "file:../../node_modules/hapi",
3333
"inert": "5.1.0",
3434
"rxjs": "file:../../node_modules/rxjs",
35-
"zone.js": "file:../../node_modules/zone.js"
35+
"zone.js": "file:../../node_modules/zone.js",
36+
"vision": "5.4.4"
3637
},
3738
"devDependencies": {
3839
"@angular-devkit/build-angular": "0.900.0-next.4",
3940
"@angular/cli": "9.0.0-next.4",
4041
"@angular/compiler-cli": "file:../../node_modules/@angular/compiler-cli",
41-
"@types/express": "file:../../node_modules/@types/express",
42+
"@types/inert": "file:../../node_modules/@types/inert",
4243
"@types/node": "file:../../node_modules/@types/node",
4344
"@types/jasmine": "file:../../node_modules/@types/jasmine",
45+
"@types/vision": "file:../../node_modules/@types/vision",
4446
"codelyzer": "5.1.0",
4547
"concurrently": "3.1.0",
4648
"jasmine-core": "3.4.0",

integration/hapi-engine-ve/server.ts

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,60 @@
11
import 'zone.js/dist/zone-node';
22

3-
import { ngExpressEngine } from '@nguniversal/express-engine';
4-
import * as express from 'express';
3+
import { ngHapiEngine } from '@nguniversal/hapi-engine';
4+
import * as inert from 'inert';
5+
import * as vision from 'vision';
6+
import { Request, Server, ResponseToolkit } from 'hapi';
57
import { join } from 'path';
68

79
import { AppServerModuleNgFactory } from './src/main.server';
810

911
// Hapi server
10-
function run() {
11-
const app = express();
12+
async function run(): Promise<void> {
1213
const port: string | number = process.env.PORT || 4000;
1314
const distFolder = join(process.cwd(), 'dist/hapi-engine-ve/browser');
15+
const server = new Server({
16+
port,
17+
host: 'localhost',
18+
routes: {
19+
files: {
20+
relativeTo: distFolder
21+
}
22+
},
23+
});
1424

15-
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
16-
app.engine('html', ngExpressEngine({
17-
bootstrap: AppServerModuleNgFactory,
18-
}));
25+
await server.register(vision);
26+
server.views({
27+
engines: {
28+
html : {
29+
compile: (document: string) => (req: Request) => ngHapiEngine({
30+
bootstrap: AppServerModuleNgFactory,
31+
document,
32+
req,
33+
})
34+
}
35+
},
36+
path: distFolder,
37+
});
1938

20-
app.set('view engine', 'html');
21-
app.set('views', distFolder);
39+
server.route({
40+
method: 'GET',
41+
path: '/{path*}',
42+
handler: (req: Request, res: ResponseToolkit) =>
43+
res.view('index', req)
44+
});
2245

23-
// Example Express Rest API endpoints
24-
// app.get('/api/**', (req, res) => { });
25-
// Serve static files from /browser
26-
app.get('*.*', express.static(distFolder, {
27-
maxAge: '1y'
28-
}));
46+
await server.register(inert);
2947

30-
// All regular routes use the Universal engine
31-
app.get('*', (req, res) => {
32-
res.render('index', { req });
48+
// Client bundles will be statically served from the dist directory.
49+
server.route({
50+
method: 'GET',
51+
path: '/{filename}.{ext}',
52+
handler: (req: Request, res: ResponseToolkit) =>
53+
res.file(`${req.params.filename}.${req.params.ext}`)
3354
});
3455

35-
// Start up the Node server
36-
app.listen(port, () => {
37-
console.log(`Node Express server listening on http://localhost:${port}`);
38-
});
56+
await server.start();
57+
console.log(`Node Hapi server listening on http://localhost:${port}`);
3958
}
4059

4160
// Webpack will replace 'require' with '__webpack_require__'

modules/hapi-engine/schematics/install/files/__serverFileName@stripTsExtension__.ts

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,56 @@
11
import 'zone.js/dist/zone-node';
22

33
import { ngHapiEngine } from '@nguniversal/hapi-engine';
4-
import { Request, Server } from 'hapi';
5-
import * as Inert from 'inert';
4+
import * as inert from 'inert';
5+
import * as vision from 'vision';
6+
import { Request, Server, ResponseToolkit } from 'hapi';
67
import { join } from 'path';
78

89
import { AppServerModule } from './src/<%= stripTsExtension(main) %>';
910

1011
// Hapi server
1112
async function run(): Promise<void> {
1213
const port: string | number = process.env.PORT || <%= serverPort %>;
13-
const server = new Server({ port, host: 'localhost' });
1414
const distFolder = join(process.cwd(), '<%= browserDistDirectory %>');
15+
const server = new Server({
16+
port,
17+
host: 'localhost',
18+
routes: {
19+
files: {
20+
relativeTo: distFolder
21+
}
22+
},
23+
});
24+
25+
await server.register(vision);
26+
server.views({
27+
engines: {
28+
html : {
29+
compile: (document: string) => (req: Request) => ngHapiEngine({
30+
bootstrap: AppServerModule,
31+
document,
32+
req,
33+
})
34+
}
35+
},
36+
path: distFolder,
37+
});
1538

1639
server.route({
1740
method: 'GET',
18-
path: '/*',
19-
handler: (req: Request) =>
20-
ngHapiEngine({
21-
bootstrap: AppServerModule,
22-
req,
23-
})
41+
path: '/{path*}',
42+
handler: (req: Request, res: ResponseToolkit) =>
43+
res.view('index', req)
2444
});
2545

26-
await server.register(Inert);
46+
await server.register(inert);
2747

2848
// Client bundles will be statically served from the dist directory.
2949
server.route({
3050
method: 'GET',
31-
path: '/{file*}',
32-
handler: {
33-
directory: {
34-
path: distFolder
35-
}
36-
}
51+
path: '/{filename}.{ext}',
52+
handler: (req: Request, res: ResponseToolkit) =>
53+
res.file(`${req.params.filename}.${req.params.ext}`)
3754
});
3855

3956
await server.start();

modules/hapi-engine/schematics/install/index.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ function addDependencies(options: UniversalOptions): Rule {
5050
name: 'inert',
5151
version: '^5.1.0',
5252
});
53+
addPackageJsonDependency(host, {
54+
type: NodeDependencyType.Default,
55+
name: 'vision',
56+
version: '^5.4.4',
57+
});
58+
addPackageJsonDependency(host, {
59+
type: NodeDependencyType.Dev,
60+
name: '@types/vision',
61+
version: '^5.4.4',
62+
});
63+
addPackageJsonDependency(host, {
64+
type: NodeDependencyType.Dev,
65+
name: '@types/inert',
66+
version: '^5.1.0',
67+
});
5368
return host;
5469
};
5570
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@
100100
"@types/express": "^4.0.39",
101101
"@types/fs-extra": "^4.0.5",
102102
"@types/hapi": "^17.0.12",
103+
"@types/inert": "^5.1.2",
103104
"@types/jasmine": "^2.8.6",
104105
"@types/node": "^9.4.6",
106+
"@types/vision": "^5.3.6",
105107
"camelcase": "^4.1.0",
106108
"domino": "^2.1.2",
107109
"express": "^4.15.2",

yarn.lock

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,20 @@
436436
dependencies:
437437
"@types/node" "*"
438438

439+
"@types/hapi@*":
440+
version "18.0.2"
441+
resolved "https://registry.yarnpkg.com/@types/hapi/-/hapi-18.0.2.tgz#2c3ed843e1e7358486eccf64256e91f7918948b2"
442+
integrity sha512-I3THPpOY0G0bXNLzyaqUzMIbqPrci21C1Vqlnek348SJq2Gp7TLSnQbwOb+v/xunxCTzY3o2fV3h7uffL3Ln0w==
443+
dependencies:
444+
"@types/boom" "*"
445+
"@types/catbox" "*"
446+
"@types/iron" "*"
447+
"@types/joi" "*"
448+
"@types/mimos" "*"
449+
"@types/node" "*"
450+
"@types/podium" "*"
451+
"@types/shot" "*"
452+
439453
"@types/hapi@^17.0.12":
440454
version "17.8.2"
441455
resolved "https://registry.yarnpkg.com/@types/hapi/-/hapi-17.8.2.tgz#667fbeff250c338dca9e6cc1779f5696c7c148ed"
@@ -449,6 +463,13 @@
449463
"@types/podium" "*"
450464
"@types/shot" "*"
451465

466+
"@types/inert@^5.1.2":
467+
version "5.1.2"
468+
resolved "https://registry.yarnpkg.com/@types/inert/-/inert-5.1.2.tgz#2bb8bef3b2462f904c960654c9edfa39285a85c6"
469+
integrity sha512-3IoSFLQWvhLfZ85kHas/F3iD/TyZPfeJbTsDjrwYljK1MgBGCB2OywAsyeA/YiJ62VbNXfXBwpD1/VbJPIZSGA==
470+
dependencies:
471+
"@types/hapi" "*"
472+
452473
"@types/iron@*":
453474
version "5.0.1"
454475
resolved "https://registry.yarnpkg.com/@types/iron/-/iron-5.0.1.tgz#5420bbda8623c48ee51b9a78ebad05d7305b4b24"
@@ -540,6 +561,14 @@
540561
dependencies:
541562
"@types/node" "*"
542563

564+
"@types/vision@^5.3.6":
565+
version "5.3.6"
566+
resolved "https://registry.yarnpkg.com/@types/vision/-/vision-5.3.6.tgz#d696d007ca82254b955fd485bfae0f738d8ae617"
567+
integrity sha512-Wo+9LNI9wGcHRShuZW+lbwwj+g6+dyTxtHtNpzfYl4iehYzvFVzGyNo1MgW4qTHQCFEYOirLHBlrutkIRE2TMw==
568+
dependencies:
569+
"@types/hapi" "*"
570+
handlebars "^4.1.0"
571+
543572
544573
version "3.16.31"
545574
resolved "https://registry.yarnpkg.com/@types/z-schema/-/z-schema-3.16.31.tgz#2eb1d00a5e4ec3fa58c76afde12e182b66dc5c1c"
@@ -2601,6 +2630,17 @@ handlebars@^4.0.3:
26012630
optionalDependencies:
26022631
uglify-js "^3.1.4"
26032632

2633+
handlebars@^4.1.0:
2634+
version "4.2.0"
2635+
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e"
2636+
integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==
2637+
dependencies:
2638+
neo-async "^2.6.0"
2639+
optimist "^0.6.1"
2640+
source-map "^0.6.1"
2641+
optionalDependencies:
2642+
uglify-js "^3.1.4"
2643+
26042644
hapi@^17.5.1:
26052645
version "17.8.1"
26062646
resolved "https://registry.yarnpkg.com/hapi/-/hapi-17.8.1.tgz#63cc5bbc138b6ae0919e977764647a17556e4c87"

0 commit comments

Comments
 (0)