Skip to content

Commit b7afce9

Browse files
committed
feat(cli): add --template option
1 parent bb8a678 commit b7afce9

File tree

4 files changed

+177
-36
lines changed

4 files changed

+177
-36
lines changed

cli/index.ts

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ServerStyleSheet } from 'styled-components';
55
import { createServer, ServerResponse, ServerRequest } from 'http';
66
import * as zlib from 'zlib';
77
import { join, dirname } from 'path';
8+
import { compile } from 'handlebars';
89

910
// @ts-ignore
1011
import { Redoc, loadAndBundleSpec, createStore } from 'redoc';
@@ -19,6 +20,7 @@ type Options = {
1920
cdn?: boolean;
2021
output?: string;
2122
title?: string;
23+
templateFileName?: string;
2224
};
2325

2426
const BUNDLES_DIR = dirname(require.resolve('redoc'));
@@ -54,7 +56,11 @@ yargs
5456
},
5557
async argv => {
5658
try {
57-
await serve(argv.port, argv.spec, { ssr: argv.ssr, watch: argv.watch });
59+
await serve(argv.port, argv.spec, {
60+
ssr: argv.ssr,
61+
watch: argv.watch,
62+
templateFileName: argv.template,
63+
});
5864
} catch (e) {
5965
console.log(e.stack);
6066
}
@@ -92,12 +98,23 @@ yargs
9298
},
9399
async argv => {
94100
try {
95-
await bundle(argv.spec, { ssr: true, output: argv.o, cdn: argv.cdn, title: argv.title });
101+
await bundle(argv.spec, {
102+
ssr: true,
103+
output: argv.o,
104+
cdn: argv.cdn,
105+
title: argv.title,
106+
templateFileName: argv.template,
107+
});
96108
} catch (e) {
97109
console.log(e.message);
98110
}
99111
},
100112
)
113+
.options('t', {
114+
alias: 'template',
115+
describe: 'Path to handlebars page template, see https://git.io/vxZ3V for the example ',
116+
type: 'string',
117+
})
101118
.demandCommand().argv;
102119

103120
async function serve(port: number, pathToSpec: string, options: Options = {}) {
@@ -168,7 +185,11 @@ async function bundle(pathToSpec, options: Options = {}) {
168185
);
169186
}
170187

171-
async function getPageHTML(spec: any, pathToSpec: string, { ssr, cdn, title }: Options) {
188+
async function getPageHTML(
189+
spec: any,
190+
pathToSpec: string,
191+
{ ssr, cdn, title, templateFileName }: Options,
192+
) {
172193
let html, css, state;
173194
let redocStandaloneSrc;
174195
if (ssr) {
@@ -184,40 +205,27 @@ async function getPageHTML(spec: any, pathToSpec: string, { ssr, cdn, title }: O
184205
}
185206
}
186207

187-
return `<!DOCTYPE html>
188-
<html>
189-
<head>
190-
<meta charset="utf8" />
191-
<title>${title}</title>
192-
<!-- needed for adaptive design -->
193-
<meta name="viewport" content="width=device-width, initial-scale=1">
194-
<style>
195-
body {
196-
padding: 0;
197-
margin: 0;
198-
}
199-
</style>
200-
${
201-
ssr
202-
? cdn
203-
? '<script src="https://unpkg.com/redoc@next/bundles/redoc.standalone.js"></script>'
204-
: `<script>${redocStandaloneSrc}</script>`
205-
: `<script src="redoc.standalone.js"></script>`
206-
}
207-
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
208-
${(ssr && css) || ''}
209-
</head>
210-
<body>
211-
<script>
208+
templateFileName = templateFileName ? templateFileName : join(__dirname, './template.hbs');
209+
const template = compile(readFileSync(templateFileName).toString());
210+
console.log(readFileSync(templateFileName).toString());
211+
debugger;
212+
return template({
213+
redocHTML: `
214+
<script>
215+
${(ssr && `const __redoc_state = ${JSON.stringify(state)};`) || ''}
212216
document.addEventListener('DOMContentLoaded', function() {
213-
${(ssr && `const state = ${JSON.stringify(state)};`) || ''}
214217
var container = document.getElementById('redoc');
215-
Redoc.${ssr ? 'hydrate(state, container);' : 'init("spec.json", {}, container)'};
218+
Redoc.${ssr ? 'hydrate(__redoc_state, container);' : 'init("spec.json", {}, container)'};
216219
});
217-
</script>
218-
<div id="redoc">${(ssr && html) || ''}</div>
219-
</body>
220-
</html>`;
220+
</script>
221+
<div id="redoc">${(ssr && html) || ''}</div>`,
222+
redocHead: ssr
223+
? (cdn
224+
? '<script src="https://unpkg.com/redoc@next/bundles/redoc.standalone.js"></script>'
225+
: `<script>${redocStandaloneSrc}</script>`) + css
226+
: '<script src="redoc.standalone.js"></script>',
227+
title: title,
228+
});
221229
}
222230

223231
// credits: https://stackoverflow.com/a/9238214/1749888

cli/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"author": "Roman Hotsiy <gotsijroman@gmail.com>",
1111
"license": "MIT",
1212
"dependencies": {
13+
"handlebars": "^4.0.11",
1314
"isarray": "^2.0.4",
1415
"react": "^16.3.0-alpha.2",
1516
"react-dom": "^16.3.0-alpha.2",

cli/template.hbs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<!DOCTYPE html>
2+
<html>
3+
4+
<head>
5+
<meta charset="utf8" />
6+
<title>{{title}}</title>
7+
<!-- needed for adaptive design -->
8+
<meta name="viewport" content="width=device-width, initial-scale=1">
9+
<style>
10+
body {
11+
padding: 0;
12+
margin: 0;
13+
}
14+
</style>
15+
{{{redocHead}}}
16+
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
17+
</head>
18+
19+
<body>
20+
{{{redocHTML}}}
21+
</body>
22+
23+
</html>

cli/yarn.lock

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,22 @@ ajv@^5.0.1, ajv@^5.1.0:
3939
fast-json-stable-stringify "^2.0.0"
4040
json-schema-traverse "^0.3.0"
4141

42+
align-text@^0.1.1, align-text@^0.1.3:
43+
version "0.1.4"
44+
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
45+
dependencies:
46+
kind-of "^3.0.2"
47+
longest "^1.0.1"
48+
repeat-string "^1.5.2"
49+
4250
always-error@1.0.0:
4351
version "1.0.0"
4452
resolved "https://registry.yarnpkg.com/always-error/-/always-error-1.0.0.tgz#95c84042cfa86f38c86ca6c2cc42c0a0103441b2"
4553

54+
amdefine@>=0.0.4:
55+
version "1.0.1"
56+
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
57+
4658
ansi-align@^1.1.0:
4759
version "1.1.0"
4860
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba"
@@ -124,6 +136,10 @@ assert-plus@^0.2.0:
124136
version "0.2.0"
125137
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
126138

139+
async@^1.4.0:
140+
version "1.5.2"
141+
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
142+
127143
asynckit@^0.4.0:
128144
version "0.4.0"
129145
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -272,6 +288,10 @@ call-me-maybe@^1.0.1:
272288
version "1.0.1"
273289
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
274290

291+
camelcase@^1.0.2:
292+
version "1.2.1"
293+
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
294+
275295
camelcase@^2.1.0:
276296
version "2.1.1"
277297
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
@@ -288,6 +308,13 @@ caseless@~0.12.0:
288308
version "0.12.0"
289309
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
290310

311+
center-align@^0.1.1:
312+
version "0.1.3"
313+
resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
314+
dependencies:
315+
align-text "^0.1.3"
316+
lazy-cache "^1.0.3"
317+
291318
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1:
292319
version "1.1.3"
293320
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -395,6 +422,14 @@ clipboard@^2.0.0:
395422
select "^1.1.2"
396423
tiny-emitter "^2.0.0"
397424

425+
cliui@^2.1.0:
426+
version "2.1.0"
427+
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
428+
dependencies:
429+
center-align "^0.1.1"
430+
right-align "^0.1.1"
431+
wordwrap "0.0.2"
432+
398433
cliui@^4.0.0:
399434
version "4.0.0"
400435
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc"
@@ -591,7 +626,7 @@ debug@^3.1.0:
591626
dependencies:
592627
ms "2.0.0"
593628

594-
decamelize@^1.1.1:
629+
decamelize@^1.0.0, decamelize@^1.1.1:
595630
version "1.2.0"
596631
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
597632

@@ -976,6 +1011,16 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
9761011
version "4.1.11"
9771012
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
9781013

1014+
handlebars@^4.0.11:
1015+
version "4.0.11"
1016+
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
1017+
dependencies:
1018+
async "^1.4.0"
1019+
optimist "^0.6.1"
1020+
source-map "^0.4.4"
1021+
optionalDependencies:
1022+
uglify-js "^2.6"
1023+
9791024
har-schema@^1.0.5:
9801025
version "1.0.5"
9811026
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
@@ -1314,6 +1359,12 @@ jsprim@^1.2.2:
13141359
json-schema "0.2.3"
13151360
verror "1.10.0"
13161361

1362+
kind-of@^3.0.2:
1363+
version "3.2.2"
1364+
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
1365+
dependencies:
1366+
is-buffer "^1.1.5"
1367+
13171368
latest-version@^2.0.0:
13181369
version "2.0.0"
13191370
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b"
@@ -1338,6 +1389,10 @@ lazy-ass@1.6.0:
13381389
version "1.6.0"
13391390
resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
13401391

1392+
lazy-cache@^1.0.3:
1393+
version "1.0.4"
1394+
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
1395+
13411396
lazy-req@^1.1.0:
13421397
version "1.1.0"
13431398
resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
@@ -1378,6 +1433,10 @@ lodash@^4.3.0, lodash@^4.6.1:
13781433
version "4.17.5"
13791434
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
13801435

1436+
longest@^1.0.1:
1437+
version "1.0.1"
1438+
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
1439+
13811440
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
13821441
version "1.3.1"
13831442
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
@@ -1669,7 +1728,7 @@ opn@4.0.2:
16691728
object-assign "^4.0.1"
16701729
pinkie-promise "^2.0.0"
16711730

1672-
optimist@0.6.1:
1731+
optimist@0.6.1, optimist@^0.6.1:
16731732
version "0.6.1"
16741733
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
16751734
dependencies:
@@ -2052,6 +2111,10 @@ registry-url@3.1.0, registry-url@^3.0.3:
20522111
dependencies:
20532112
rc "^1.0.1"
20542113

2114+
repeat-string@^1.5.2:
2115+
version "1.6.1"
2116+
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
2117+
20552118
repeating@^2.0.0:
20562119
version "2.0.1"
20572120
resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
@@ -2144,6 +2207,12 @@ retry@^0.10.0:
21442207
version "0.10.1"
21452208
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
21462209

2210+
right-align@^0.1.1:
2211+
version "0.1.3"
2212+
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
2213+
dependencies:
2214+
align-text "^0.1.1"
2215+
21472216
rimraf@^2.2.8:
21482217
version "2.6.2"
21492218
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
@@ -2289,10 +2358,20 @@ source-map@0.5.6:
22892358
version "0.5.6"
22902359
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
22912360

2361+
source-map@^0.4.4:
2362+
version "0.4.4"
2363+
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
2364+
dependencies:
2365+
amdefine ">=0.0.4"
2366+
22922367
source-map@^0.6.1:
22932368
version "0.6.1"
22942369
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
22952370

2371+
source-map@~0.5.1:
2372+
version "0.5.7"
2373+
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
2374+
22962375
sourcemapped-stacktrace@^1.1.6:
22972376
version "1.1.8"
22982377
resolved "https://registry.yarnpkg.com/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.8.tgz#6b7a3f1a6fb15f6d40e701e23ce404553480d688"
@@ -2524,6 +2603,19 @@ ua-parser-js@^0.7.9:
25242603
version "0.7.17"
25252604
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
25262605

2606+
uglify-js@^2.6:
2607+
version "2.8.29"
2608+
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
2609+
dependencies:
2610+
source-map "~0.5.1"
2611+
yargs "~3.10.0"
2612+
optionalDependencies:
2613+
uglify-to-browserify "~1.0.0"
2614+
2615+
uglify-to-browserify@~1.0.0:
2616+
version "1.0.2"
2617+
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
2618+
25272619
unique-string@^1.0.0:
25282620
version "1.0.0"
25292621
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
@@ -2659,10 +2751,18 @@ widest-line@^2.0.0:
26592751
dependencies:
26602752
string-width "^2.1.1"
26612753

2754+
window-size@0.1.0:
2755+
version "0.1.0"
2756+
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
2757+
26622758
word-wrap@1.2.3:
26632759
version "1.2.3"
26642760
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
26652761

2762+
wordwrap@0.0.2:
2763+
version "0.0.2"
2764+
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
2765+
26662766
wordwrap@~0.0.2:
26672767
version "0.0.3"
26682768
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
@@ -2738,3 +2838,12 @@ yargs@^11.0.0:
27382838
which-module "^2.0.0"
27392839
y18n "^3.2.1"
27402840
yargs-parser "^9.0.2"
2841+
2842+
yargs@~3.10.0:
2843+
version "3.10.0"
2844+
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
2845+
dependencies:
2846+
camelcase "^1.0.2"
2847+
cliui "^2.1.0"
2848+
decamelize "^1.0.0"
2849+
window-size "0.1.0"

0 commit comments

Comments
 (0)