Made polyfill route more flexible

This commit is contained in:
Sebastian Seedorf
2020-11-16 13:11:15 +01:00
parent 110e6f74e8
commit 99527fdb49
5 changed files with 32 additions and 34 deletions

View File

@@ -5,14 +5,14 @@ const worker_1 = require("threads/worker");
const fs = require("fs"); const fs = require("fs");
const polyfill_analyzer_1 = require("@10xjs/polyfill-analyzer"); const polyfill_analyzer_1 = require("@10xjs/polyfill-analyzer");
const polyfills_1 = require("@10xjs/polyfill-analyzer/dist/polyfills"); const polyfills_1 = require("@10xjs/polyfill-analyzer/dist/polyfills");
worker_1.expose(() => { worker_1.expose((fileToWatch) => {
const exclude = [ const exclude = [
"console.markTimeline", "console.markTimeline",
"console.timeline", "console.timeline",
"console.timelineEnd", "console.timelineEnd",
]; ];
const featureList = polyfill_analyzer_1.analyze({ const featureList = polyfill_analyzer_1.analyze({
source: fs.readFileSync('./public/js/bundle.js', 'utf-8'), source: fs.readFileSync(fileToWatch, 'utf-8'),
include: polyfills_1.default.filter(x => !exclude.includes(x)), include: polyfills_1.default.filter(x => !exclude.includes(x)),
// Not all features listed by polyfillLibrary.listAllPolyfills()` can be detected. // Not all features listed by polyfillLibrary.listAllPolyfills()` can be detected.
unsupportedPolyfill: 'ignore', unsupportedPolyfill: 'ignore',

2
out/polyfill.d.ts vendored
View File

@@ -12,7 +12,7 @@ export declare type PolyfillOptions = {
uaString: string; uaString: string;
rum: boolean; rum: boolean;
}; };
declare function getRouter(opts?: Partial<PolyfillOptions>): RequestHandler; declare function getRouter(fileToWatch: string, opts?: Partial<PolyfillOptions>): RequestHandler;
export declare const Polyfill: { export declare const Polyfill: {
getRouter: typeof getRouter; getRouter: typeof getRouter;
}; };

View File

@@ -14,19 +14,19 @@ const polyfillLibrary = require("polyfill-library");
const _1 = require("."); const _1 = require(".");
const threads_1 = require("threads"); const threads_1 = require("threads");
const features = new _1.WaitForSync(); const features = new _1.WaitForSync();
(() => __awaiter(void 0, void 0, void 0, function* () { function getRouter(fileToWatch, opts) {
const worker = yield threads_1.spawn(new threads_1.Worker("./polyfill-worker")); (() => __awaiter(this, void 0, void 0, function* () {
const feats = yield worker(); const worker = yield threads_1.spawn(new threads_1.Worker("./polyfill-worker"));
yield threads_1.Thread.terminate(worker); const feats = yield worker(fileToWatch);
return feats; yield threads_1.Thread.terminate(worker);
}))() return feats;
.then(feats => { }))()
feats["fetch"] = {}; .then(feats => {
_1.Logger.debug("Polyfill analysed:", Object.keys(feats)); feats["fetch"] = {};
features.setData(feats); _1.Logger.debug("Polyfill analysed:", Object.keys(feats));
}) features.setData(feats);
.catch(err => features.setError(err)); })
function getRouter(opts) { .catch(err => features.setError(err));
const options = Object.assign({ minify: _1.DefaultConfig.isProduction, unknown: "polyfill" }, opts); const options = Object.assign({ minify: _1.DefaultConfig.isProduction, unknown: "polyfill" }, opts);
return (req, res) => __awaiter(this, void 0, void 0, function* () { return (req, res) => __awaiter(this, void 0, void 0, function* () {
const polyfillBundle = yield polyfillLibrary.getPolyfillString(Object.assign(Object.assign({}, options), { uaString: req.header("user-agent"), features: yield features.resolve(), stream: false })); const polyfillBundle = yield polyfillLibrary.getPolyfillString(Object.assign(Object.assign({}, options), { uaString: req.header("user-agent"), features: yield features.resolve(), stream: false }));

View File

@@ -5,14 +5,14 @@ import {analyze} from '@10xjs/polyfill-analyzer';
import allPolyfills from '@10xjs/polyfill-analyzer/dist/polyfills'; import allPolyfills from '@10xjs/polyfill-analyzer/dist/polyfills';
import {PolyfillFeatureList} from 'polyfill-library'; import {PolyfillFeatureList} from 'polyfill-library';
expose(() => { expose((fileToWatch) => {
const exclude = [ const exclude = [
"console.markTimeline", "console.markTimeline",
"console.timeline", "console.timeline",
"console.timelineEnd", "console.timelineEnd",
]; ];
const featureList = analyze({ const featureList = analyze({
source: fs.readFileSync('./public/js/bundle.js', 'utf-8'), source: fs.readFileSync(fileToWatch, 'utf-8'),
include: allPolyfills.filter(x => !exclude.includes(x)), include: allPolyfills.filter(x => !exclude.includes(x)),
// Not all features listed by polyfillLibrary.listAllPolyfills()` can be detected. // Not all features listed by polyfillLibrary.listAllPolyfills()` can be detected.
unsupportedPolyfill: 'ignore', unsupportedPolyfill: 'ignore',

View File

@@ -19,23 +19,21 @@ export type PolyfillOptions = {
rum: boolean, rum: boolean,
} }
const features = new WaitForSync<PolyfillFeatureList>(); function getRouter(fileToWatch: string, opts?: Partial<PolyfillOptions>): RequestHandler {
const features = new WaitForSync<PolyfillFeatureList>();
(async () => {
const worker = await spawn<WorkerFunction>(new Worker("./polyfill-worker"));
const feats = await worker(fileToWatch) as PolyfillFeatureList;
await Thread.terminate(worker);
return feats;
})()
.then(feats => {
feats["fetch"] = {};
Logger.debug("Polyfill analysed:", Object.keys(feats));
features.setData(feats);
})
.catch(err => features.setError(err));
(async () => {
const worker = await spawn<WorkerFunction>(new Worker("./polyfill-worker"));
const feats = await worker() as PolyfillFeatureList;
await Thread.terminate(worker);
return feats;
})()
.then(feats => {
feats["fetch"] = {};
Logger.debug("Polyfill analysed:", Object.keys(feats));
features.setData(feats);
})
.catch(err => features.setError(err));
function getRouter(opts?: Partial<PolyfillOptions>): RequestHandler {
const options: Partial<PolyfillOptions> = { const options: Partial<PolyfillOptions> = {
minify: DefaultConfig.isProduction, minify: DefaultConfig.isProduction,
unknown: "polyfill", unknown: "polyfill",