1 | "use strict";
|
2 | var __asyncValues = (this && this.__asyncValues) || function (o) {
|
3 | if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
4 | var m = o[Symbol.asyncIterator], i;
|
5 | return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
6 | function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
7 | function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
8 | };
|
9 | var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
10 | var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
11 | if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
12 | var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
13 | return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
14 | function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
15 | function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
16 | function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
17 | function fulfill(value) { resume("next", value); }
|
18 | function reject(value) { resume("throw", value); }
|
19 | function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
20 | };
|
21 | Object.defineProperty(exports, "__esModule", { value: true });
|
22 | const dom5 = require("dom5/lib/index-next");
|
23 | const index_next_1 = require("dom5/lib/index-next");
|
24 | const parse5 = require("parse5");
|
25 | const url = require("url");
|
26 | const streams_1 = require("./streams");
|
27 | const attrValueMatches = (attrName, regex) => {
|
28 | return (node) => {
|
29 | const attrValue = dom5.getAttribute(node, attrName);
|
30 | return attrValue != null && regex.test(attrValue);
|
31 | };
|
32 | };
|
33 | const webcomponentsLoaderRegex = /\bwebcomponents\-(loader|lite|bundle)\.js\b/;
|
34 | const webcomponentsLoaderMatcher = index_next_1.predicates.AND(index_next_1.predicates.hasTagName('script'), attrValueMatches('src', webcomponentsLoaderRegex));
|
35 |
|
36 |
|
37 |
|
38 | class CustomElementsEs5AdapterInjector extends streams_1.AsyncTransformStream {
|
39 | constructor() {
|
40 | super({ objectMode: true });
|
41 | }
|
42 | _transformIter(files) {
|
43 | return __asyncGenerator(this, arguments, function* _transformIter_1() {
|
44 | var e_1, _a;
|
45 | try {
|
46 | for (var files_1 = __asyncValues(files), files_1_1; files_1_1 = yield __await(files_1.next()), !files_1_1.done;) {
|
47 | const file = files_1_1.value;
|
48 | if (file.contents === null || file.extname !== '.html') {
|
49 | yield yield __await(file);
|
50 | continue;
|
51 | }
|
52 | const contents = yield __await(streams_1.getFileContents(file));
|
53 | const updatedContents = addCustomElementsEs5Adapter(contents);
|
54 | if (contents === updatedContents) {
|
55 | yield yield __await(file);
|
56 | }
|
57 | else {
|
58 | const updatedFile = file.clone();
|
59 | updatedFile.contents = Buffer.from(updatedContents, 'utf-8');
|
60 | yield yield __await(updatedFile);
|
61 | }
|
62 | }
|
63 | }
|
64 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
65 | finally {
|
66 | try {
|
67 | if (files_1_1 && !files_1_1.done && (_a = files_1.return)) yield __await(_a.call(files_1));
|
68 | }
|
69 | finally { if (e_1) throw e_1.error; }
|
70 | }
|
71 | });
|
72 | }
|
73 | }
|
74 | exports.CustomElementsEs5AdapterInjector = CustomElementsEs5AdapterInjector;
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 | function addCustomElementsEs5Adapter(html) {
|
86 |
|
87 |
|
88 |
|
89 | if (!webcomponentsLoaderRegex.test(html)) {
|
90 | return html;
|
91 | }
|
92 | const parsed = parse5.parse(html, { locationInfo: true });
|
93 | const script = dom5.query(parsed, webcomponentsLoaderMatcher);
|
94 | if (!script) {
|
95 | return html;
|
96 | }
|
97 |
|
98 | const loaderScriptUrl = dom5.getAttribute(script, 'src');
|
99 | const adapterScriptUrl = url.resolve(loaderScriptUrl, 'custom-elements-es5-adapter.js');
|
100 | const es5AdapterFragment = parse5.parseFragment(`
|
101 | <script>if (!window.customElements) { document.write('<!--'); }</script>
|
102 | <script type="text/javascript" src="${adapterScriptUrl}"></script>
|
103 | <!--! do not remove -->
|
104 | `);
|
105 | dom5.insertBefore(script.parentNode, script, es5AdapterFragment);
|
106 | return parse5.serialize(parsed);
|
107 | }
|
108 | exports.addCustomElementsEs5Adapter = addCustomElementsEs5Adapter;
|
109 |
|
\ | No newline at end of file |