diff --git a/aio/deploy-cn.sh b/aio/deploy-cn.sh index c54f2016f8..f65a4bbf6c 100755 --- a/aio/deploy-cn.sh +++ b/aio/deploy-cn.sh @@ -16,7 +16,7 @@ pid=$! sleep 3; -node ./tools/translator/bin/prerender.js +npx ts-node --project=./tools/translator/tsconfig.json ./tools/translator/bin/prerender.ts kill -9 ${pid} diff --git a/aio/package.json b/aio/package.json index 49f9c2d8b8..31ca1f554f 100644 --- a/aio/package.json +++ b/aio/package.json @@ -113,7 +113,6 @@ "@angular/compiler-cli": "11.0.0", "@types/html-minifier": "^3.5.3", "@types/jasmine": "~3.6.0", - "@types/klaw-sync": "^6.0.0", "@types/lodash": "^4.14.133", "@types/lunr": "^2.3.2", "@types/mkdirp": "^0.5.2", @@ -137,7 +136,7 @@ "find-free-port": "^2.0.0", "firebase-tools": "^8.14.1", "fs-extra": "^2.1.2", - "globby": "^6.1.0", + "globby": "^11.0.2", "hast-util-is-element": "^1.0.0", "hast-util-to-string": "^1.0.0", "html": "^1.0.0", @@ -157,7 +156,6 @@ "karma-coverage": "~2.0.3", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "klaw-sync": "^6.0.0", "light-server": "^2.6.2", "lighthouse": "6.1.0", "lighthouse-logger": "^1.2.0", diff --git a/aio/tools/translator/bin/prerender.js b/aio/tools/translator/bin/prerender.js deleted file mode 100644 index b6b002e191..0000000000 --- a/aio/tools/translator/bin/prerender.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -exports.__esModule = true; -var fs_1 = require("fs"); -var klawSync = require("klaw-sync"); -var mkdirp_1 = require("mkdirp"); -var html_minifier_1 = require("html-minifier"); -var path_1 = require("path"); -var puppeteer_1 = require("puppeteer"); -var lodash_1 = require("lodash"); -var minifyOptions = { - collapseWhitespace: true, - ignoreCustomFragments: [/[\s\S]*?<\/code>/], - minifyCSS: true, - minifyJS: true, - removeComments: true, - removeScriptTypeAttributes: true, - removeStyleLinkTypeAttributes: true -}; -function getGuideUrls() { - var navigation = fs_1.readFileSync('./content/navigation.json', 'utf-8'); - return (navigation.match(/"url": "(.*?)"/g) || []) - .map(function (entry) { return entry.replace(/^"url": "(.*?)".*$/, '$1'); }) - .filter(function (url) { return url.slice(0, 4) !== 'http'; }); -} -function getApiUrls() { - return klawSync('./dist/generated/docs/api', { nodir: true }) - .map(function (file) { return file.path.replace(/^.*generated\/docs\/(.*).json$/, '$1'); }); -} -var urls = getGuideUrls().concat(getApiUrls(), ['index.html']); -function filterResource(request) { - var type = request.resourceType(); - if (['image', 'stylesheet', 'font'].indexOf(type) !== -1) { - request.abort(); - } - else { - request["continue"](); - } -} -function renderPage(browser, url) { - return __awaiter(this, void 0, void 0, function () { - var page, content, filename; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, browser.newPage()]; - case 1: - page = _a.sent(); - return [4 /*yield*/, page.setRequestInterception(true)]; - case 2: - _a.sent(); - page.on('request', filterResource); - return [4 /*yield*/, page.goto("http://localhost:4200/" + url, { waitUntil: 'domcontentloaded' })]; - case 3: - _a.sent(); - return [4 /*yield*/, page.waitForSelector('aio-doc-viewer>div')]; - case 4: - _a.sent(); - return [4 /*yield*/, page.content()]; - case 5: - content = _a.sent(); - filename = path_1.join('dist', url + ".html"); - mkdirp_1.sync(path_1.dirname(filename)); - fs_1.writeFileSync(filename, html_minifier_1.minify(content, minifyOptions), 'utf-8'); - return [4 /*yield*/, page.close()]; - case 6: - _a.sent(); - console.log("rendered " + url + "."); - return [2 /*return*/]; - } - }); - }); -} -function renderPageGroup(browser, urls) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, Promise.all(urls.map(function (url) { return renderPage(browser, url); }))]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); -} -function prerender() { - return __awaiter(this, void 0, void 0, function () { - var browser, groups, i; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, puppeteer_1.launch({ defaultViewport: { width: 1280, height: 768 } })]; - case 1: - browser = _a.sent(); - groups = lodash_1.chunk(lodash_1.uniq(urls), 4); - i = 0; - _a.label = 2; - case 2: - if (!(i < groups.length)) return [3 /*break*/, 5]; - return [4 /*yield*/, renderPageGroup(browser, groups[i])]; - case 3: - _a.sent(); - _a.label = 4; - case 4: - ++i; - return [3 /*break*/, 2]; - case 5: return [4 /*yield*/, browser.close()]; - case 6: - _a.sent(); - return [2 /*return*/]; - } - }); - }); -} -prerender().then(function () { - process.exit(0); -})["catch"](function (e) { - console.error(e); - process.exit(-1); -}); diff --git a/aio/tools/translator/bin/prerender.ts b/aio/tools/translator/bin/prerender.ts index aac20379dd..92be225362 100644 --- a/aio/tools/translator/bin/prerender.ts +++ b/aio/tools/translator/bin/prerender.ts @@ -1,6 +1,6 @@ -import { readFileSync, writeFileSync } from 'fs'; +import { writeFileSync } from 'fs'; +import * as globby from 'globby'; import { minify } from 'html-minifier'; -import * as klawSync from 'klaw-sync'; import { chunk, uniq } from 'lodash'; import { sync as mkdirp } from 'mkdirp'; import { dirname, join } from 'path'; @@ -16,26 +16,19 @@ const minifyOptions = { removeStyleLinkTypeAttributes: true, }; -function getGuideUrls(): string[] { - const navigation = readFileSync('./content/navigation.json', 'utf-8'); - return (navigation.match(/"url": "(.*?)"/g) || []) - .map((entry) => entry.replace(/^"url": "(.*?)".*$/, '$1')) - .filter(url => url.slice(0, 4) !== 'http'); +function getAllUrls(): string[] { + return globby.sync('./dist/generated/docs/**/*.json') + .map(file => file.replace(/^.*generated\/docs\/(.*).json$/, '$1')); } -function getApiUrls(): string[] { - return klawSync('./dist/generated/docs/api', { nodir: true }) - .map(file => file.path.replace(/^.*generated\/docs\/(.*).json$/, '$1')); -} +const urls = [...getAllUrls(), 'index.html']; -const urls = [...getGuideUrls(), ...getApiUrls(), 'translations/cn/about.html', 'index.html']; - -function filterResource(request: Request) { +async function filterResource(request: Request) { const type = request.resourceType(); if (['image', 'stylesheet', 'font'].indexOf(type) !== -1) { - request.abort(); + return request.abort(); } else { - request.continue(); + return request.continue(); } } diff --git a/aio/yarn.lock b/aio/yarn.lock index 3d621cf22a..8de7730341 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -6742,6 +6742,18 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -8898,13 +8910,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"