1 | "use strict";
|
2 | var fs = require('fs');
|
3 | var request = require('request');
|
4 | var mkdirp = require('mkdirp');
|
5 | var path = require('path');
|
6 | var rimraf = require('rimraf');
|
7 | var copydir = require('copy-dir');
|
8 | var moment = require('moment');
|
9 | function ensureDirectoryExistence(filePath) {
|
10 | var dirname = path.dirname(filePath);
|
11 | if (fs.existsSync(dirname)) {
|
12 | return true;
|
13 | }
|
14 | ensureDirectoryExistence(dirname);
|
15 | fs.mkdirSync(dirname);
|
16 | }
|
17 | exports.handleRoutesArray = function (arr, resultArr, base) {
|
18 | if (base === void 0) { base = '/'; }
|
19 | arr.forEach(function (route) {
|
20 | if (route.path !== '**') {
|
21 | resultArr.push(base + route.path);
|
22 | if (route.children && route.children.length > 0) {
|
23 | exports.handleRoutesArray(route.children, resultArr, base + route.path + '/');
|
24 | }
|
25 | }
|
26 | });
|
27 | };
|
28 | function generateStaticWebsite(baseHost, port, routesArray, outputLocation, assetsDirectory) {
|
29 | var siteMapArr = [];
|
30 | function generateSiteMap(pathArr) {
|
31 | console.log('Generating sitemap.xml file');
|
32 | return new Promise(function (resolve) {
|
33 | var base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">";
|
34 | pathArr.forEach(function (p) {
|
35 | var path = p;
|
36 | if (path === 'index') {
|
37 | path = '/';
|
38 | }
|
39 | var priority;
|
40 | var depth = (path.split('/') || []).length;
|
41 | if (depth === 0 || depth === 1) {
|
42 | priority = '1.0';
|
43 | }
|
44 | else if (depth === 2) {
|
45 | priority = '0.8';
|
46 | }
|
47 | else {
|
48 | priority = '0.5';
|
49 | }
|
50 | base += "\n <url>\n <loc>http://angular-meteor.com" + path + "</loc>\n <lastmod>" + moment().format('YYYY-MM-DD') + "</lastmod>\n <changefreq>weekly</changefreq>\n <priority>" + priority + "</priority>\n </url>";
|
51 | });
|
52 | base += "</urlset>";
|
53 | var fullFilePath = path.join(outputLocation, 'sitemap.xml');
|
54 | fs.writeFileSync(fullFilePath, base);
|
55 | resolve();
|
56 | });
|
57 | }
|
58 | function generateStaticForUrl(fullBaseUrl, urlPath) {
|
59 | var url = fullBaseUrl + urlPath;
|
60 | return new Promise(function (resolve, reject) {
|
61 | request(url, function (err, res) {
|
62 | if (err) {
|
63 | return reject(err);
|
64 | }
|
65 | console.log('Done loading HTML content for ' + url);
|
66 | resolve({
|
67 | html: res.body,
|
68 | url: urlPath
|
69 | });
|
70 | });
|
71 | });
|
72 | }
|
73 | rimraf.sync(outputLocation);
|
74 | copydir.sync(assetsDirectory, path.join(outputLocation, path.basename(assetsDirectory)), function (stat, filepath, filename) {
|
75 | if (stat === 'file' && (path.extname(filepath) === '.md' || path.extname(filepath) === '.patch')) {
|
76 | return false;
|
77 | }
|
78 | return true;
|
79 | });
|
80 | var fullBaseUrl = 'http://' + baseHost + ':' + port;
|
81 | var urlsToLoad = ['/'];
|
82 | exports.handleRoutesArray(routesArray, urlsToLoad);
|
83 | var r;
|
84 | var donePromise = new Promise(function (resolve) {
|
85 | r = resolve;
|
86 | });
|
87 | function runNext(arr, i) {
|
88 | if (i === void 0) { i = 0; }
|
89 | if (arr[i]) {
|
90 | generateStaticForUrl(fullBaseUrl, arr[i]).then(function (result) {
|
91 | var filePath = result.url;
|
92 | if (filePath === '/') {
|
93 | filePath = 'index';
|
94 | }
|
95 | siteMapArr.push(filePath);
|
96 | var filePathIndex = filePath + '/index.html';
|
97 | filePath = filePath + '.html';
|
98 | var fullFilePath = path.join(outputLocation, filePath);
|
99 | var fullFilePathIndex = path.join(outputLocation, filePathIndex);
|
100 | mkdirp.sync(path.dirname(fullFilePath));
|
101 | mkdirp.sync(path.dirname(fullFilePathIndex));
|
102 | fs.writeFileSync(fullFilePath, result.html);
|
103 | fs.writeFileSync(fullFilePathIndex, result.html);
|
104 | console.log('Done writing to files:' + [fullFilePath, fullFilePathIndex].join(', '));
|
105 | runNext(arr, i + 1);
|
106 | });
|
107 | }
|
108 | else {
|
109 | generateSiteMap(siteMapArr).then(function () {
|
110 | r();
|
111 | });
|
112 | }
|
113 | return donePromise;
|
114 | }
|
115 | return runNext(urlsToLoad);
|
116 | }
|
117 | exports.generateStaticWebsite = generateStaticWebsite;
|
118 |
|
\ | No newline at end of file |