@rindo/core 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/config-flags.d.ts +122 -122
- package/cli/index.cjs +2335 -2432
- package/cli/index.d.ts +19 -19
- package/cli/index.js +2336 -2433
- package/cli/package.json +1 -1
- package/compiler/package.json +1 -1
- package/compiler/rindo.d.ts +73 -73
- package/compiler/rindo.js +66180 -62899
- package/compiler/rindo.min.js +2 -2
- package/compiler/sys/in-memory-fs.d.ts +218 -218
- package/compiler/transpile.d.ts +32 -32
- package/dev-server/client/app-error.d.ts +18 -18
- package/dev-server/client/events.d.ts +6 -6
- package/dev-server/client/hmr-components.d.ts +1 -1
- package/dev-server/client/hmr-external-styles.d.ts +1 -1
- package/dev-server/client/hmr-images.d.ts +1 -1
- package/dev-server/client/hmr-inline-styles.d.ts +1 -1
- package/dev-server/client/hmr-util.d.ts +9 -9
- package/dev-server/client/hmr-window.d.ts +10 -10
- package/dev-server/client/index.d.ts +6 -6
- package/dev-server/client/index.js +781 -781
- package/dev-server/client/logger.d.ts +5 -5
- package/dev-server/client/package.json +1 -1
- package/dev-server/client/progress.d.ts +3 -3
- package/dev-server/client/status.d.ts +4 -4
- package/dev-server/connector.html +2 -2
- package/dev-server/index.d.ts +3 -3
- package/dev-server/index.js +228 -228
- package/dev-server/open-in-editor-api.js +1 -1
- package/dev-server/package.json +1 -1
- package/dev-server/server-process.js +1300 -1281
- package/dev-server/ws.js +1 -1
- package/dev-server/xdg-open +0 -0
- package/internal/app-data/index.cjs +88 -88
- package/internal/app-data/index.d.ts +4 -4
- package/internal/app-data/index.js +88 -88
- package/internal/app-data/package.json +1 -1
- package/internal/client/css-shim.js +1 -1
- package/internal/client/dom.js +1 -1
- package/internal/client/index.js +3380 -3380
- package/internal/client/package.json +1 -1
- package/internal/client/patch-browser.js +155 -155
- package/internal/client/patch-esm.js +25 -25
- package/internal/client/shadow-css.js +382 -382
- package/internal/hydrate/package.json +1 -1
- package/internal/index.d.ts +2 -2
- package/internal/index.js +1 -1
- package/internal/package.json +1 -1
- package/internal/rindo-private.d.ts +2289 -2268
- package/internal/rindo-public-compiler.d.ts +2429 -2356
- package/internal/rindo-public-docs.d.ts +139 -139
- package/internal/rindo-public-runtime.d.ts +1636 -1636
- package/internal/testing/package.json +1 -1
- package/mock-doc/index.cjs +4766 -4766
- package/mock-doc/index.d.ts +1006 -1006
- package/mock-doc/index.js +4766 -4766
- package/mock-doc/package.json +1 -1
- package/package.json +9 -9
- package/screenshot/connector-base.d.ts +42 -42
- package/screenshot/connector-local.d.ts +7 -7
- package/screenshot/index.d.ts +3 -3
- package/screenshot/index.js +615 -615
- package/screenshot/package.json +1 -1
- package/screenshot/pixel-match.d.ts +1 -1
- package/screenshot/pixel-match.js +14 -14
- package/screenshot/screenshot-compare.d.ts +3 -3
- package/screenshot/screenshot-fs.d.ts +15 -15
- package/sys/node/autoprefixer.js +2 -2
- package/sys/node/glob.js +1 -1
- package/sys/node/graceful-fs.js +1 -1
- package/sys/node/index.d.ts +22 -22
- package/sys/node/index.js +14 -8
- package/sys/node/node-fetch.js +1 -1
- package/sys/node/package.json +1 -1
- package/sys/node/prompts.js +1 -1
- package/sys/node/worker.js +1 -1
- package/testing/index.d.ts +12 -12
- package/testing/index.js +7 -3
- package/testing/jest/jest-config.d.ts +16 -16
- package/testing/jest/jest-environment.d.ts +15 -15
- package/testing/jest/jest-preprocessor.d.ts +59 -59
- package/testing/jest/jest-runner.d.ts +10 -10
- package/testing/jest/jest-screenshot.d.ts +2 -2
- package/testing/jest/jest-serializer.d.ts +4 -4
- package/testing/jest/jest-setup-test-framework.d.ts +1 -1
- package/testing/jest-preset.js +1 -1
- package/testing/matchers/attributes.d.ts +14 -14
- package/testing/matchers/class-list.d.ts +12 -12
- package/testing/matchers/events.d.ts +21 -21
- package/testing/matchers/html.d.ts +12 -12
- package/testing/matchers/index.d.ts +23 -23
- package/testing/matchers/screenshot.d.ts +5 -5
- package/testing/matchers/text.d.ts +4 -4
- package/testing/mock-fetch.d.ts +11 -11
- package/testing/mocks.d.ts +56 -56
- package/testing/package.json +1 -1
- package/testing/puppeteer/index.d.ts +2 -2
- package/testing/puppeteer/puppeteer-browser.d.ts +6 -6
- package/testing/puppeteer/puppeteer-declarations.d.ts +403 -403
- package/testing/puppeteer/puppeteer-element.d.ts +67 -67
- package/testing/puppeteer/puppeteer-emulate.d.ts +2 -2
- package/testing/puppeteer/puppeteer-events.d.ts +21 -21
- package/testing/puppeteer/puppeteer-page.d.ts +2 -2
- package/testing/puppeteer/puppeteer-screenshot.d.ts +4 -4
- package/testing/reset-build-conditionals.d.ts +2 -2
- package/testing/spec-page.d.ts +2 -2
- package/testing/test-transpile.d.ts +2 -2
- package/testing/testing-logger.d.ts +25 -25
- package/testing/testing-sys.d.ts +6 -6
- package/testing/testing-utils.d.ts +79 -79
- package/testing/testing.d.ts +2 -2
- package/dependencies.json +0 -120
|
@@ -1,808 +1,808 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
Rindo Dev Server Client v3.0
|
|
2
|
+
Rindo Dev Server Client v3.2.0 | MIT Licensed | https://rindojs.web.app
|
|
3
3
|
*/
|
|
4
4
|
var appErrorCss = "#dev-server-modal * { box-sizing: border-box !important; } #dev-server-modal { direction: ltr !important; display: block !important; position: absolute !important; top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; z-index: 100000; margin: 0 !important; padding: 0 !important; font-family: -apple-system, 'Roboto', BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' !important; font-size: 14px !important; line-height: 1.5 !important; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; text-size-adjust: none; word-wrap: break-word; color: #333 !important; background-color: white !important; box-sizing: border-box !important; overflow: hidden; user-select: auto; } #dev-server-modal-inner { position: relative !important; padding: 0 0 30px 0 !important; width: 100% !important; height: 100%; overflow-x: hidden; overflow-y: scroll; -webkit-overflow-scrolling: touch; } .dev-server-diagnostic { margin: 20px !important; border: 1px solid #ddd !important; border-radius: 3px !important; } .dev-server-diagnostic-masthead { padding: 8px 12px 12px 12px !important; } .dev-server-diagnostic-title { margin: 0 !important; font-weight: bold !important; color: #222 !important; } .dev-server-diagnostic-message { margin-top: 4px !important; color: #555 !important; } .dev-server-diagnostic-file { position: relative !important; border-top: 1px solid #ddd !important; } .dev-server-diagnostic-file-header { display: block !important; padding: 5px 10px !important; color: #555 !important; border-bottom: 1px solid #ddd !important; border-top-left-radius: 2px !important; border-top-right-radius: 2px !important; background-color: #f9f9f9 !important; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; font-size: 12px !important; } a.dev-server-diagnostic-file-header { color: #0000ee !important; text-decoration: underline !important; } a.dev-server-diagnostic-file-header:hover { text-decoration: none !important; background-color: #f4f4f4 !important; } .dev-server-diagnostic-file-name { font-weight: bold !important; } .dev-server-diagnostic-blob { overflow-x: auto !important; overflow-y: hidden !important; border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; } .dev-server-diagnostic-table { margin: 0 !important; padding: 0 !important; border-spacing: 0 !important; border-collapse: collapse !important; border-width: 0 !important; border-style: none !important; -moz-tab-size: 2; tab-size: 2; } .dev-server-diagnostic-table td, .dev-server-diagnostic-table th { padding: 0 !important; border-width: 0 !important; border-style: none !important; } td.dev-server-diagnostic-blob-num { padding-right: 10px !important; padding-left: 10px !important; width: 1% !important; min-width: 50px !important; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; font-size: 12px !important; line-height: 20px !important; color: rgba(0, 0, 0, 0.3) !important; text-align: right !important; white-space: nowrap !important; vertical-align: top !important; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; border: solid #eee !important; border-width: 0 1px 0 0 !important; } td.dev-server-diagnostic-blob-num::before { content: attr(data-line-number) !important; } .dev-server-diagnostic-error-line td.dev-server-diagnostic-blob-num { background-color: #ffdddd !important; border-color: #ffc9c9 !important; } .dev-server-diagnostic-error-line td.dev-server-diagnostic-blob-code { background: rgba(255, 221, 221, 0.25) !important; z-index: -1; } .dev-server-diagnostic-open-in-editor td.dev-server-diagnostic-blob-num:hover { cursor: pointer; background-color: #ffffe3 !important; font-weight: bold; } .dev-server-diagnostic-open-in-editor.dev-server-diagnostic-error-line td.dev-server-diagnostic-blob-num:hover { background-color: #ffdada !important; } td.dev-server-diagnostic-blob-code { position: relative !important; padding-right: 10px !important; padding-left: 10px !important; line-height: 20px !important; vertical-align: top !important; overflow: visible !important; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; font-size: 12px !important; color: #333 !important; word-wrap: normal !important; white-space: pre !important; } td.dev-server-diagnostic-blob-code::before { content: '' !important; } .dev-server-diagnostic-error-chr { position: relative !important; } .dev-server-diagnostic-error-chr::before { position: absolute !important; z-index: -1; top: -3px !important; left: 0px !important; width: 8px !important; height: 20px !important; background-color: #ffdddd !important; content: '' !important; } /** * GitHub Gist Theme * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro * https://highlightjs.org/ */ .hljs-comment, .hljs-meta { color: #969896; } .hljs-string, .hljs-variable, .hljs-template-variable, .hljs-strong, .hljs-emphasis, .hljs-quote { color: #df5000; } .hljs-keyword, .hljs-selector-tag, .hljs-type { color: #a71d5d; } .hljs-literal, .hljs-symbol, .hljs-bullet, .hljs-attribute { color: #0086b3; } .hljs-section, .hljs-name { color: #63a35c; } .hljs-tag { color: #333333; } .hljs-title, .hljs-attr, .hljs-selector-id, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo { color: #795da3; } .hljs-addition { color: #55a532; background-color: #eaffea; } .hljs-deletion { color: #bd2c00; background-color: #ffecec; } .hljs-link { text-decoration: underline; }";
|
|
5
5
|
|
|
6
|
-
const appError = (data) => {
|
|
7
|
-
const results = {
|
|
8
|
-
diagnostics: [],
|
|
9
|
-
status: null,
|
|
10
|
-
};
|
|
11
|
-
if (data && data.window && Array.isArray(data.buildResults.diagnostics)) {
|
|
12
|
-
const diagnostics = data.buildResults.diagnostics.filter((diagnostic) => diagnostic.level === 'error');
|
|
13
|
-
if (diagnostics.length > 0) {
|
|
14
|
-
const modal = getDevServerModal(data.window.document);
|
|
15
|
-
diagnostics.forEach((diagnostic) => {
|
|
16
|
-
results.diagnostics.push(diagnostic);
|
|
17
|
-
appendDiagnostic(data.window.document, data.openInEditor, modal, diagnostic);
|
|
18
|
-
});
|
|
19
|
-
results.status = 'error';
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return results;
|
|
23
|
-
};
|
|
24
|
-
const appendDiagnostic = (doc, openInEditor, modal, diagnostic) => {
|
|
25
|
-
const card = doc.createElement('div');
|
|
26
|
-
card.className = 'dev-server-diagnostic';
|
|
27
|
-
const masthead = doc.createElement('div');
|
|
28
|
-
masthead.className = 'dev-server-diagnostic-masthead';
|
|
29
|
-
masthead.title = `${escapeHtml(diagnostic.type)} error: ${escapeHtml(diagnostic.code)}`;
|
|
30
|
-
card.appendChild(masthead);
|
|
31
|
-
const title = doc.createElement('div');
|
|
32
|
-
title.className = 'dev-server-diagnostic-title';
|
|
33
|
-
if (typeof diagnostic.header === 'string' && diagnostic.header.trim().length > 0) {
|
|
34
|
-
title.textContent = diagnostic.header;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
title.textContent = `${titleCase(diagnostic.type)} ${titleCase(diagnostic.level)}`;
|
|
38
|
-
}
|
|
39
|
-
masthead.appendChild(title);
|
|
40
|
-
const message = doc.createElement('div');
|
|
41
|
-
message.className = 'dev-server-diagnostic-message';
|
|
42
|
-
message.textContent = diagnostic.messageText;
|
|
43
|
-
masthead.appendChild(message);
|
|
44
|
-
const file = doc.createElement('div');
|
|
45
|
-
file.className = 'dev-server-diagnostic-file';
|
|
46
|
-
card.appendChild(file);
|
|
47
|
-
const isUrl = typeof diagnostic.absFilePath === 'string' && diagnostic.absFilePath.indexOf('http') === 0;
|
|
48
|
-
const canOpenInEditor = typeof openInEditor === 'function' && typeof diagnostic.absFilePath === 'string' && !isUrl;
|
|
49
|
-
if (isUrl) {
|
|
50
|
-
const fileHeader = doc.createElement('a');
|
|
51
|
-
fileHeader.href = diagnostic.absFilePath;
|
|
52
|
-
fileHeader.setAttribute('target', '_blank');
|
|
53
|
-
fileHeader.setAttribute('rel', 'noopener noreferrer');
|
|
54
|
-
fileHeader.className = 'dev-server-diagnostic-file-header';
|
|
55
|
-
const filePath = doc.createElement('span');
|
|
56
|
-
filePath.className = 'dev-server-diagnostic-file-path';
|
|
57
|
-
filePath.textContent = diagnostic.absFilePath;
|
|
58
|
-
fileHeader.appendChild(filePath);
|
|
59
|
-
file.appendChild(fileHeader);
|
|
60
|
-
}
|
|
61
|
-
else if (diagnostic.relFilePath) {
|
|
62
|
-
const fileHeader = doc.createElement(canOpenInEditor ? 'a' : 'div');
|
|
63
|
-
fileHeader.className = 'dev-server-diagnostic-file-header';
|
|
64
|
-
if (diagnostic.absFilePath) {
|
|
65
|
-
fileHeader.title = escapeHtml(diagnostic.absFilePath);
|
|
66
|
-
if (canOpenInEditor) {
|
|
67
|
-
addOpenInEditor(openInEditor, fileHeader, diagnostic.absFilePath, diagnostic.lineNumber, diagnostic.columnNumber);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
const parts = diagnostic.relFilePath.split('/');
|
|
71
|
-
const fileName = doc.createElement('span');
|
|
72
|
-
fileName.className = 'dev-server-diagnostic-file-name';
|
|
73
|
-
fileName.textContent = parts.pop();
|
|
74
|
-
const filePath = doc.createElement('span');
|
|
75
|
-
filePath.className = 'dev-server-diagnostic-file-path';
|
|
76
|
-
filePath.textContent = parts.join('/') + '/';
|
|
77
|
-
fileHeader.appendChild(filePath);
|
|
78
|
-
fileHeader.appendChild(fileName);
|
|
79
|
-
file.appendChild(fileHeader);
|
|
80
|
-
}
|
|
81
|
-
if (diagnostic.lines && diagnostic.lines.length > 0) {
|
|
82
|
-
const blob = doc.createElement('div');
|
|
83
|
-
blob.className = 'dev-server-diagnostic-blob';
|
|
84
|
-
file.appendChild(blob);
|
|
85
|
-
const table = doc.createElement('table');
|
|
86
|
-
table.className = 'dev-server-diagnostic-table';
|
|
87
|
-
blob.appendChild(table);
|
|
88
|
-
prepareLines(diagnostic.lines).forEach((l) => {
|
|
89
|
-
const tr = doc.createElement('tr');
|
|
90
|
-
if (l.errorCharStart > 0) {
|
|
91
|
-
tr.classList.add('dev-server-diagnostic-error-line');
|
|
92
|
-
}
|
|
93
|
-
if (canOpenInEditor) {
|
|
94
|
-
tr.classList.add('dev-server-diagnostic-open-in-editor');
|
|
95
|
-
}
|
|
96
|
-
table.appendChild(tr);
|
|
97
|
-
const tdNum = doc.createElement('td');
|
|
98
|
-
tdNum.className = 'dev-server-diagnostic-blob-num';
|
|
99
|
-
if (l.lineNumber > 0) {
|
|
100
|
-
tdNum.setAttribute('data-line-number', l.lineNumber + '');
|
|
101
|
-
tdNum.title = escapeHtml(diagnostic.relFilePath) + ', line ' + l.lineNumber;
|
|
102
|
-
if (canOpenInEditor) {
|
|
103
|
-
const column = l.lineNumber === diagnostic.lineNumber ? diagnostic.columnNumber : 1;
|
|
104
|
-
addOpenInEditor(openInEditor, tdNum, diagnostic.absFilePath, l.lineNumber, column);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
tr.appendChild(tdNum);
|
|
108
|
-
const tdCode = doc.createElement('td');
|
|
109
|
-
tdCode.className = 'dev-server-diagnostic-blob-code';
|
|
110
|
-
tdCode.innerHTML = highlightError(l.text, l.errorCharStart, l.errorLength);
|
|
111
|
-
tr.appendChild(tdCode);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
modal.appendChild(card);
|
|
115
|
-
};
|
|
116
|
-
const addOpenInEditor = (openInEditor, elm, file, line, column) => {
|
|
117
|
-
if (elm.tagName === 'A') {
|
|
118
|
-
elm.href = '#open-in-editor';
|
|
119
|
-
}
|
|
120
|
-
if (typeof line !== 'number' || line < 1) {
|
|
121
|
-
line = 1;
|
|
122
|
-
}
|
|
123
|
-
if (typeof column !== 'number' || column < 1) {
|
|
124
|
-
column = 1;
|
|
125
|
-
}
|
|
126
|
-
elm.addEventListener('click', (ev) => {
|
|
127
|
-
ev.preventDefault();
|
|
128
|
-
ev.stopPropagation();
|
|
129
|
-
openInEditor({
|
|
130
|
-
file: file,
|
|
131
|
-
line: line,
|
|
132
|
-
column: column,
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
};
|
|
136
|
-
const getDevServerModal = (doc) => {
|
|
137
|
-
let outer = doc.getElementById(DEV_SERVER_MODAL);
|
|
138
|
-
if (!outer) {
|
|
139
|
-
outer = doc.createElement('div');
|
|
140
|
-
outer.id = DEV_SERVER_MODAL;
|
|
141
|
-
outer.setAttribute('role', 'dialog');
|
|
142
|
-
doc.body.appendChild(outer);
|
|
143
|
-
}
|
|
144
|
-
outer.innerHTML = `<style>${appErrorCss}</style><div id="${DEV_SERVER_MODAL}-inner"></div>`;
|
|
145
|
-
return doc.getElementById(`${DEV_SERVER_MODAL}-inner`);
|
|
146
|
-
};
|
|
147
|
-
const clearAppErrorModal = (data) => {
|
|
148
|
-
const appErrorElm = data.window.document.getElementById(DEV_SERVER_MODAL);
|
|
149
|
-
if (appErrorElm) {
|
|
150
|
-
appErrorElm.parentNode.removeChild(appErrorElm);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
const escapeHtml = (unsafe) => {
|
|
154
|
-
if (typeof unsafe === 'number' || typeof unsafe === 'boolean') {
|
|
155
|
-
return unsafe.toString();
|
|
156
|
-
}
|
|
157
|
-
if (typeof unsafe === 'string') {
|
|
158
|
-
return unsafe
|
|
159
|
-
.replace(/&/g, '&')
|
|
160
|
-
.replace(/</g, '<')
|
|
161
|
-
.replace(/>/g, '>')
|
|
162
|
-
.replace(/"/g, '"')
|
|
163
|
-
.replace(/'/g, ''');
|
|
164
|
-
}
|
|
165
|
-
return '';
|
|
166
|
-
};
|
|
167
|
-
const titleCase = (str) => str.charAt(0).toUpperCase() + str.slice(1);
|
|
168
|
-
const highlightError = (text, errorCharStart, errorLength) => {
|
|
169
|
-
if (typeof text !== 'string') {
|
|
170
|
-
return '';
|
|
171
|
-
}
|
|
172
|
-
const errorCharEnd = errorCharStart + errorLength;
|
|
173
|
-
return text
|
|
174
|
-
.split('')
|
|
175
|
-
.map((inputChar, charIndex) => {
|
|
176
|
-
let outputChar;
|
|
177
|
-
if (inputChar === `<`) {
|
|
178
|
-
outputChar = `<`;
|
|
179
|
-
}
|
|
180
|
-
else if (inputChar === `>`) {
|
|
181
|
-
outputChar = `>`;
|
|
182
|
-
}
|
|
183
|
-
else if (inputChar === `"`) {
|
|
184
|
-
outputChar = `"`;
|
|
185
|
-
}
|
|
186
|
-
else if (inputChar === `'`) {
|
|
187
|
-
outputChar = `'`;
|
|
188
|
-
}
|
|
189
|
-
else if (inputChar === `&`) {
|
|
190
|
-
outputChar = `&`;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
outputChar = inputChar;
|
|
194
|
-
}
|
|
195
|
-
if (charIndex >= errorCharStart && charIndex < errorCharEnd) {
|
|
196
|
-
outputChar = `<span class="dev-server-diagnostic-error-chr">${outputChar}</span>`;
|
|
197
|
-
}
|
|
198
|
-
return outputChar;
|
|
199
|
-
})
|
|
200
|
-
.join('');
|
|
201
|
-
};
|
|
202
|
-
const prepareLines = (orgLines) => {
|
|
203
|
-
const lines = JSON.parse(JSON.stringify(orgLines));
|
|
204
|
-
for (let i = 0; i < 100; i++) {
|
|
205
|
-
if (!eachLineHasLeadingWhitespace(lines)) {
|
|
206
|
-
return lines;
|
|
207
|
-
}
|
|
208
|
-
for (let i = 0; i < lines.length; i++) {
|
|
209
|
-
lines[i].text = lines[i].text.slice(1);
|
|
210
|
-
lines[i].errorCharStart--;
|
|
211
|
-
if (!lines[i].text.length) {
|
|
212
|
-
return lines;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return lines;
|
|
217
|
-
};
|
|
218
|
-
const eachLineHasLeadingWhitespace = (lines) => {
|
|
219
|
-
if (!lines.length) {
|
|
220
|
-
return false;
|
|
221
|
-
}
|
|
222
|
-
for (let i = 0; i < lines.length; i++) {
|
|
223
|
-
if (!lines[i].text || lines[i].text.length < 1) {
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
const firstChar = lines[i].text.charAt(0);
|
|
227
|
-
if (firstChar !== ' ' && firstChar !== '\t') {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return true;
|
|
232
|
-
};
|
|
6
|
+
const appError = (data) => {
|
|
7
|
+
const results = {
|
|
8
|
+
diagnostics: [],
|
|
9
|
+
status: null,
|
|
10
|
+
};
|
|
11
|
+
if (data && data.window && Array.isArray(data.buildResults.diagnostics)) {
|
|
12
|
+
const diagnostics = data.buildResults.diagnostics.filter((diagnostic) => diagnostic.level === 'error');
|
|
13
|
+
if (diagnostics.length > 0) {
|
|
14
|
+
const modal = getDevServerModal(data.window.document);
|
|
15
|
+
diagnostics.forEach((diagnostic) => {
|
|
16
|
+
results.diagnostics.push(diagnostic);
|
|
17
|
+
appendDiagnostic(data.window.document, data.openInEditor, modal, diagnostic);
|
|
18
|
+
});
|
|
19
|
+
results.status = 'error';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return results;
|
|
23
|
+
};
|
|
24
|
+
const appendDiagnostic = (doc, openInEditor, modal, diagnostic) => {
|
|
25
|
+
const card = doc.createElement('div');
|
|
26
|
+
card.className = 'dev-server-diagnostic';
|
|
27
|
+
const masthead = doc.createElement('div');
|
|
28
|
+
masthead.className = 'dev-server-diagnostic-masthead';
|
|
29
|
+
masthead.title = `${escapeHtml(diagnostic.type)} error: ${escapeHtml(diagnostic.code)}`;
|
|
30
|
+
card.appendChild(masthead);
|
|
31
|
+
const title = doc.createElement('div');
|
|
32
|
+
title.className = 'dev-server-diagnostic-title';
|
|
33
|
+
if (typeof diagnostic.header === 'string' && diagnostic.header.trim().length > 0) {
|
|
34
|
+
title.textContent = diagnostic.header;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
title.textContent = `${titleCase(diagnostic.type)} ${titleCase(diagnostic.level)}`;
|
|
38
|
+
}
|
|
39
|
+
masthead.appendChild(title);
|
|
40
|
+
const message = doc.createElement('div');
|
|
41
|
+
message.className = 'dev-server-diagnostic-message';
|
|
42
|
+
message.textContent = diagnostic.messageText;
|
|
43
|
+
masthead.appendChild(message);
|
|
44
|
+
const file = doc.createElement('div');
|
|
45
|
+
file.className = 'dev-server-diagnostic-file';
|
|
46
|
+
card.appendChild(file);
|
|
47
|
+
const isUrl = typeof diagnostic.absFilePath === 'string' && diagnostic.absFilePath.indexOf('http') === 0;
|
|
48
|
+
const canOpenInEditor = typeof openInEditor === 'function' && typeof diagnostic.absFilePath === 'string' && !isUrl;
|
|
49
|
+
if (isUrl) {
|
|
50
|
+
const fileHeader = doc.createElement('a');
|
|
51
|
+
fileHeader.href = diagnostic.absFilePath;
|
|
52
|
+
fileHeader.setAttribute('target', '_blank');
|
|
53
|
+
fileHeader.setAttribute('rel', 'noopener noreferrer');
|
|
54
|
+
fileHeader.className = 'dev-server-diagnostic-file-header';
|
|
55
|
+
const filePath = doc.createElement('span');
|
|
56
|
+
filePath.className = 'dev-server-diagnostic-file-path';
|
|
57
|
+
filePath.textContent = diagnostic.absFilePath;
|
|
58
|
+
fileHeader.appendChild(filePath);
|
|
59
|
+
file.appendChild(fileHeader);
|
|
60
|
+
}
|
|
61
|
+
else if (diagnostic.relFilePath) {
|
|
62
|
+
const fileHeader = doc.createElement(canOpenInEditor ? 'a' : 'div');
|
|
63
|
+
fileHeader.className = 'dev-server-diagnostic-file-header';
|
|
64
|
+
if (diagnostic.absFilePath) {
|
|
65
|
+
fileHeader.title = escapeHtml(diagnostic.absFilePath);
|
|
66
|
+
if (canOpenInEditor) {
|
|
67
|
+
addOpenInEditor(openInEditor, fileHeader, diagnostic.absFilePath, diagnostic.lineNumber, diagnostic.columnNumber);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const parts = diagnostic.relFilePath.split('/');
|
|
71
|
+
const fileName = doc.createElement('span');
|
|
72
|
+
fileName.className = 'dev-server-diagnostic-file-name';
|
|
73
|
+
fileName.textContent = parts.pop();
|
|
74
|
+
const filePath = doc.createElement('span');
|
|
75
|
+
filePath.className = 'dev-server-diagnostic-file-path';
|
|
76
|
+
filePath.textContent = parts.join('/') + '/';
|
|
77
|
+
fileHeader.appendChild(filePath);
|
|
78
|
+
fileHeader.appendChild(fileName);
|
|
79
|
+
file.appendChild(fileHeader);
|
|
80
|
+
}
|
|
81
|
+
if (diagnostic.lines && diagnostic.lines.length > 0) {
|
|
82
|
+
const blob = doc.createElement('div');
|
|
83
|
+
blob.className = 'dev-server-diagnostic-blob';
|
|
84
|
+
file.appendChild(blob);
|
|
85
|
+
const table = doc.createElement('table');
|
|
86
|
+
table.className = 'dev-server-diagnostic-table';
|
|
87
|
+
blob.appendChild(table);
|
|
88
|
+
prepareLines(diagnostic.lines).forEach((l) => {
|
|
89
|
+
const tr = doc.createElement('tr');
|
|
90
|
+
if (l.errorCharStart > 0) {
|
|
91
|
+
tr.classList.add('dev-server-diagnostic-error-line');
|
|
92
|
+
}
|
|
93
|
+
if (canOpenInEditor) {
|
|
94
|
+
tr.classList.add('dev-server-diagnostic-open-in-editor');
|
|
95
|
+
}
|
|
96
|
+
table.appendChild(tr);
|
|
97
|
+
const tdNum = doc.createElement('td');
|
|
98
|
+
tdNum.className = 'dev-server-diagnostic-blob-num';
|
|
99
|
+
if (l.lineNumber > 0) {
|
|
100
|
+
tdNum.setAttribute('data-line-number', l.lineNumber + '');
|
|
101
|
+
tdNum.title = escapeHtml(diagnostic.relFilePath) + ', line ' + l.lineNumber;
|
|
102
|
+
if (canOpenInEditor) {
|
|
103
|
+
const column = l.lineNumber === diagnostic.lineNumber ? diagnostic.columnNumber : 1;
|
|
104
|
+
addOpenInEditor(openInEditor, tdNum, diagnostic.absFilePath, l.lineNumber, column);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
tr.appendChild(tdNum);
|
|
108
|
+
const tdCode = doc.createElement('td');
|
|
109
|
+
tdCode.className = 'dev-server-diagnostic-blob-code';
|
|
110
|
+
tdCode.innerHTML = highlightError(l.text, l.errorCharStart, l.errorLength);
|
|
111
|
+
tr.appendChild(tdCode);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
modal.appendChild(card);
|
|
115
|
+
};
|
|
116
|
+
const addOpenInEditor = (openInEditor, elm, file, line, column) => {
|
|
117
|
+
if (elm.tagName === 'A') {
|
|
118
|
+
elm.href = '#open-in-editor';
|
|
119
|
+
}
|
|
120
|
+
if (typeof line !== 'number' || line < 1) {
|
|
121
|
+
line = 1;
|
|
122
|
+
}
|
|
123
|
+
if (typeof column !== 'number' || column < 1) {
|
|
124
|
+
column = 1;
|
|
125
|
+
}
|
|
126
|
+
elm.addEventListener('click', (ev) => {
|
|
127
|
+
ev.preventDefault();
|
|
128
|
+
ev.stopPropagation();
|
|
129
|
+
openInEditor({
|
|
130
|
+
file: file,
|
|
131
|
+
line: line,
|
|
132
|
+
column: column,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
const getDevServerModal = (doc) => {
|
|
137
|
+
let outer = doc.getElementById(DEV_SERVER_MODAL);
|
|
138
|
+
if (!outer) {
|
|
139
|
+
outer = doc.createElement('div');
|
|
140
|
+
outer.id = DEV_SERVER_MODAL;
|
|
141
|
+
outer.setAttribute('role', 'dialog');
|
|
142
|
+
doc.body.appendChild(outer);
|
|
143
|
+
}
|
|
144
|
+
outer.innerHTML = `<style>${appErrorCss}</style><div id="${DEV_SERVER_MODAL}-inner"></div>`;
|
|
145
|
+
return doc.getElementById(`${DEV_SERVER_MODAL}-inner`);
|
|
146
|
+
};
|
|
147
|
+
const clearAppErrorModal = (data) => {
|
|
148
|
+
const appErrorElm = data.window.document.getElementById(DEV_SERVER_MODAL);
|
|
149
|
+
if (appErrorElm) {
|
|
150
|
+
appErrorElm.parentNode.removeChild(appErrorElm);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const escapeHtml = (unsafe) => {
|
|
154
|
+
if (typeof unsafe === 'number' || typeof unsafe === 'boolean') {
|
|
155
|
+
return unsafe.toString();
|
|
156
|
+
}
|
|
157
|
+
if (typeof unsafe === 'string') {
|
|
158
|
+
return unsafe
|
|
159
|
+
.replace(/&/g, '&')
|
|
160
|
+
.replace(/</g, '<')
|
|
161
|
+
.replace(/>/g, '>')
|
|
162
|
+
.replace(/"/g, '"')
|
|
163
|
+
.replace(/'/g, ''');
|
|
164
|
+
}
|
|
165
|
+
return '';
|
|
166
|
+
};
|
|
167
|
+
const titleCase = (str) => str.charAt(0).toUpperCase() + str.slice(1);
|
|
168
|
+
const highlightError = (text, errorCharStart, errorLength) => {
|
|
169
|
+
if (typeof text !== 'string') {
|
|
170
|
+
return '';
|
|
171
|
+
}
|
|
172
|
+
const errorCharEnd = errorCharStart + errorLength;
|
|
173
|
+
return text
|
|
174
|
+
.split('')
|
|
175
|
+
.map((inputChar, charIndex) => {
|
|
176
|
+
let outputChar;
|
|
177
|
+
if (inputChar === `<`) {
|
|
178
|
+
outputChar = `<`;
|
|
179
|
+
}
|
|
180
|
+
else if (inputChar === `>`) {
|
|
181
|
+
outputChar = `>`;
|
|
182
|
+
}
|
|
183
|
+
else if (inputChar === `"`) {
|
|
184
|
+
outputChar = `"`;
|
|
185
|
+
}
|
|
186
|
+
else if (inputChar === `'`) {
|
|
187
|
+
outputChar = `'`;
|
|
188
|
+
}
|
|
189
|
+
else if (inputChar === `&`) {
|
|
190
|
+
outputChar = `&`;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
outputChar = inputChar;
|
|
194
|
+
}
|
|
195
|
+
if (charIndex >= errorCharStart && charIndex < errorCharEnd) {
|
|
196
|
+
outputChar = `<span class="dev-server-diagnostic-error-chr">${outputChar}</span>`;
|
|
197
|
+
}
|
|
198
|
+
return outputChar;
|
|
199
|
+
})
|
|
200
|
+
.join('');
|
|
201
|
+
};
|
|
202
|
+
const prepareLines = (orgLines) => {
|
|
203
|
+
const lines = JSON.parse(JSON.stringify(orgLines));
|
|
204
|
+
for (let i = 0; i < 100; i++) {
|
|
205
|
+
if (!eachLineHasLeadingWhitespace(lines)) {
|
|
206
|
+
return lines;
|
|
207
|
+
}
|
|
208
|
+
for (let i = 0; i < lines.length; i++) {
|
|
209
|
+
lines[i].text = lines[i].text.slice(1);
|
|
210
|
+
lines[i].errorCharStart--;
|
|
211
|
+
if (!lines[i].text.length) {
|
|
212
|
+
return lines;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return lines;
|
|
217
|
+
};
|
|
218
|
+
const eachLineHasLeadingWhitespace = (lines) => {
|
|
219
|
+
if (!lines.length) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
for (let i = 0; i < lines.length; i++) {
|
|
223
|
+
if (!lines[i].text || lines[i].text.length < 1) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
const firstChar = lines[i].text.charAt(0);
|
|
227
|
+
if (firstChar !== ' ' && firstChar !== '\t') {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
};
|
|
233
233
|
const DEV_SERVER_MODAL = `dev-server-modal`;
|
|
234
234
|
|
|
235
|
-
const emitBuildLog = (win, buildLog) => {
|
|
236
|
-
win.dispatchEvent(new CustomEvent(BUILD_LOG, { detail: buildLog }));
|
|
237
|
-
};
|
|
238
|
-
const emitBuildResults = (win, buildResults) => {
|
|
239
|
-
win.dispatchEvent(new CustomEvent(BUILD_RESULTS, { detail: buildResults }));
|
|
240
|
-
};
|
|
241
|
-
const emitBuildStatus = (win, buildStatus) => {
|
|
242
|
-
win.dispatchEvent(new CustomEvent(BUILD_STATUS, { detail: buildStatus }));
|
|
243
|
-
};
|
|
244
|
-
const onBuildLog = (win, cb) => {
|
|
245
|
-
win.addEventListener(BUILD_LOG, (ev) => {
|
|
246
|
-
cb(ev.detail);
|
|
247
|
-
});
|
|
248
|
-
};
|
|
249
|
-
const onBuildResults = (win, cb) => {
|
|
250
|
-
win.addEventListener(BUILD_RESULTS, (ev) => {
|
|
251
|
-
cb(ev.detail);
|
|
252
|
-
});
|
|
253
|
-
};
|
|
254
|
-
const onBuildStatus = (win, cb) => {
|
|
255
|
-
win.addEventListener(BUILD_STATUS, (ev) => {
|
|
256
|
-
cb(ev.detail);
|
|
257
|
-
});
|
|
258
|
-
};
|
|
259
|
-
const BUILD_LOG = `devserver:buildlog`;
|
|
260
|
-
const BUILD_RESULTS = `devserver:buildresults`;
|
|
235
|
+
const emitBuildLog = (win, buildLog) => {
|
|
236
|
+
win.dispatchEvent(new CustomEvent(BUILD_LOG, { detail: buildLog }));
|
|
237
|
+
};
|
|
238
|
+
const emitBuildResults = (win, buildResults) => {
|
|
239
|
+
win.dispatchEvent(new CustomEvent(BUILD_RESULTS, { detail: buildResults }));
|
|
240
|
+
};
|
|
241
|
+
const emitBuildStatus = (win, buildStatus) => {
|
|
242
|
+
win.dispatchEvent(new CustomEvent(BUILD_STATUS, { detail: buildStatus }));
|
|
243
|
+
};
|
|
244
|
+
const onBuildLog = (win, cb) => {
|
|
245
|
+
win.addEventListener(BUILD_LOG, (ev) => {
|
|
246
|
+
cb(ev.detail);
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
const onBuildResults = (win, cb) => {
|
|
250
|
+
win.addEventListener(BUILD_RESULTS, (ev) => {
|
|
251
|
+
cb(ev.detail);
|
|
252
|
+
});
|
|
253
|
+
};
|
|
254
|
+
const onBuildStatus = (win, cb) => {
|
|
255
|
+
win.addEventListener(BUILD_STATUS, (ev) => {
|
|
256
|
+
cb(ev.detail);
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
const BUILD_LOG = `devserver:buildlog`;
|
|
260
|
+
const BUILD_RESULTS = `devserver:buildresults`;
|
|
261
261
|
const BUILD_STATUS = `devserver:buildstatus`;
|
|
262
262
|
|
|
263
|
-
const getHmrHref = (versionId, fileName, testUrl) => {
|
|
264
|
-
if (typeof testUrl === 'string' && testUrl.trim() !== '') {
|
|
265
|
-
if (getUrlFileName(fileName) === getUrlFileName(testUrl)) {
|
|
266
|
-
// only compare by filename w/out querystrings, not full path
|
|
267
|
-
return setHmrQueryString(testUrl, versionId);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return testUrl;
|
|
271
|
-
};
|
|
272
|
-
const getUrlFileName = (url) => {
|
|
273
|
-
// not using URL because IE11 doesn't support it
|
|
274
|
-
const splt = url.split('/');
|
|
275
|
-
return splt[splt.length - 1].split('&')[0].split('?')[0];
|
|
276
|
-
};
|
|
277
|
-
const parseQuerystring = (oldQs) => {
|
|
278
|
-
const newQs = {};
|
|
279
|
-
if (typeof oldQs === 'string') {
|
|
280
|
-
oldQs.split('&').forEach((kv) => {
|
|
281
|
-
const splt = kv.split('=');
|
|
282
|
-
newQs[splt[0]] = splt[1] ? splt[1] : '';
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
return newQs;
|
|
286
|
-
};
|
|
287
|
-
const stringifyQuerystring = (qs) => Object.keys(qs)
|
|
288
|
-
.map((key) => key + '=' + qs[key])
|
|
289
|
-
.join('&');
|
|
290
|
-
const setQueryString = (url, qsKey, qsValue) => {
|
|
291
|
-
// not using URL because IE11 doesn't support it
|
|
292
|
-
const urlSplt = url.split('?');
|
|
293
|
-
const urlPath = urlSplt[0];
|
|
294
|
-
const qs = parseQuerystring(urlSplt[1]);
|
|
295
|
-
qs[qsKey] = qsValue;
|
|
296
|
-
return urlPath + '?' + stringifyQuerystring(qs);
|
|
297
|
-
};
|
|
298
|
-
const setHmrQueryString = (url, versionId) => setQueryString(url, 's-hmr', versionId);
|
|
299
|
-
const updateCssUrlValue = (versionId, fileName, oldCss) => {
|
|
300
|
-
const reg = /url\((['"]?)(.*)\1\)/gi;
|
|
301
|
-
let result;
|
|
302
|
-
let newCss = oldCss;
|
|
303
|
-
while ((result = reg.exec(oldCss)) !== null) {
|
|
304
|
-
const url = result[2];
|
|
305
|
-
newCss = newCss.replace(url, getHmrHref(versionId, fileName, url));
|
|
306
|
-
}
|
|
307
|
-
return newCss;
|
|
308
|
-
};
|
|
309
|
-
const isLinkStylesheet = (elm) => elm.nodeName.toLowerCase() === 'link' &&
|
|
310
|
-
elm.href &&
|
|
311
|
-
elm.rel &&
|
|
312
|
-
elm.rel.toLowerCase() === 'stylesheet';
|
|
313
|
-
const isTemplate = (elm) => elm.nodeName.toLowerCase() === 'template' &&
|
|
314
|
-
!!elm.content &&
|
|
315
|
-
elm.content.nodeType === 11;
|
|
316
|
-
const setHmrAttr = (elm, versionId) => elm.setAttribute('data-hmr', versionId);
|
|
317
|
-
const hasShadowRoot = (elm) => !!elm.shadowRoot && elm.shadowRoot.nodeType === 11 && elm.shadowRoot !== elm;
|
|
263
|
+
const getHmrHref = (versionId, fileName, testUrl) => {
|
|
264
|
+
if (typeof testUrl === 'string' && testUrl.trim() !== '') {
|
|
265
|
+
if (getUrlFileName(fileName) === getUrlFileName(testUrl)) {
|
|
266
|
+
// only compare by filename w/out querystrings, not full path
|
|
267
|
+
return setHmrQueryString(testUrl, versionId);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return testUrl;
|
|
271
|
+
};
|
|
272
|
+
const getUrlFileName = (url) => {
|
|
273
|
+
// not using URL because IE11 doesn't support it
|
|
274
|
+
const splt = url.split('/');
|
|
275
|
+
return splt[splt.length - 1].split('&')[0].split('?')[0];
|
|
276
|
+
};
|
|
277
|
+
const parseQuerystring = (oldQs) => {
|
|
278
|
+
const newQs = {};
|
|
279
|
+
if (typeof oldQs === 'string') {
|
|
280
|
+
oldQs.split('&').forEach((kv) => {
|
|
281
|
+
const splt = kv.split('=');
|
|
282
|
+
newQs[splt[0]] = splt[1] ? splt[1] : '';
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
return newQs;
|
|
286
|
+
};
|
|
287
|
+
const stringifyQuerystring = (qs) => Object.keys(qs)
|
|
288
|
+
.map((key) => key + '=' + qs[key])
|
|
289
|
+
.join('&');
|
|
290
|
+
const setQueryString = (url, qsKey, qsValue) => {
|
|
291
|
+
// not using URL because IE11 doesn't support it
|
|
292
|
+
const urlSplt = url.split('?');
|
|
293
|
+
const urlPath = urlSplt[0];
|
|
294
|
+
const qs = parseQuerystring(urlSplt[1]);
|
|
295
|
+
qs[qsKey] = qsValue;
|
|
296
|
+
return urlPath + '?' + stringifyQuerystring(qs);
|
|
297
|
+
};
|
|
298
|
+
const setHmrQueryString = (url, versionId) => setQueryString(url, 's-hmr', versionId);
|
|
299
|
+
const updateCssUrlValue = (versionId, fileName, oldCss) => {
|
|
300
|
+
const reg = /url\((['"]?)(.*)\1\)/gi;
|
|
301
|
+
let result;
|
|
302
|
+
let newCss = oldCss;
|
|
303
|
+
while ((result = reg.exec(oldCss)) !== null) {
|
|
304
|
+
const url = result[2];
|
|
305
|
+
newCss = newCss.replace(url, getHmrHref(versionId, fileName, url));
|
|
306
|
+
}
|
|
307
|
+
return newCss;
|
|
308
|
+
};
|
|
309
|
+
const isLinkStylesheet = (elm) => elm.nodeName.toLowerCase() === 'link' &&
|
|
310
|
+
elm.href &&
|
|
311
|
+
elm.rel &&
|
|
312
|
+
elm.rel.toLowerCase() === 'stylesheet';
|
|
313
|
+
const isTemplate = (elm) => elm.nodeName.toLowerCase() === 'template' &&
|
|
314
|
+
!!elm.content &&
|
|
315
|
+
elm.content.nodeType === 11;
|
|
316
|
+
const setHmrAttr = (elm, versionId) => elm.setAttribute('data-hmr', versionId);
|
|
317
|
+
const hasShadowRoot = (elm) => !!elm.shadowRoot && elm.shadowRoot.nodeType === 11 && elm.shadowRoot !== elm;
|
|
318
318
|
const isElement = (elm) => !!elm && elm.nodeType === 1 && !!elm.getAttribute;
|
|
319
319
|
|
|
320
|
-
const hmrComponents = (elm, versionId, hmrTagNames) => {
|
|
321
|
-
const updatedTags = [];
|
|
322
|
-
hmrTagNames.forEach((hmrTagName) => {
|
|
323
|
-
hmrComponent(updatedTags, elm, versionId, hmrTagName);
|
|
324
|
-
});
|
|
325
|
-
return updatedTags.sort();
|
|
326
|
-
};
|
|
327
|
-
const hmrComponent = (updatedTags, elm, versionId, cmpTagName) => {
|
|
328
|
-
// drill down through every node in the page
|
|
329
|
-
// to include shadow roots and look for this
|
|
330
|
-
// component tag to run hmr() on
|
|
331
|
-
if (elm.nodeName.toLowerCase() === cmpTagName && typeof elm['s-hmr'] === 'function') {
|
|
332
|
-
elm['s-hmr'](versionId);
|
|
333
|
-
setHmrAttr(elm, versionId);
|
|
334
|
-
if (updatedTags.indexOf(cmpTagName) === -1) {
|
|
335
|
-
updatedTags.push(cmpTagName);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
if (hasShadowRoot(elm)) {
|
|
339
|
-
hmrComponent(updatedTags, elm.shadowRoot, versionId, cmpTagName);
|
|
340
|
-
}
|
|
341
|
-
if (elm.children) {
|
|
342
|
-
for (let i = 0; i < elm.children.length; i++) {
|
|
343
|
-
hmrComponent(updatedTags, elm.children[i], versionId, cmpTagName);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
320
|
+
const hmrComponents = (elm, versionId, hmrTagNames) => {
|
|
321
|
+
const updatedTags = [];
|
|
322
|
+
hmrTagNames.forEach((hmrTagName) => {
|
|
323
|
+
hmrComponent(updatedTags, elm, versionId, hmrTagName);
|
|
324
|
+
});
|
|
325
|
+
return updatedTags.sort();
|
|
326
|
+
};
|
|
327
|
+
const hmrComponent = (updatedTags, elm, versionId, cmpTagName) => {
|
|
328
|
+
// drill down through every node in the page
|
|
329
|
+
// to include shadow roots and look for this
|
|
330
|
+
// component tag to run hmr() on
|
|
331
|
+
if (elm.nodeName.toLowerCase() === cmpTagName && typeof elm['s-hmr'] === 'function') {
|
|
332
|
+
elm['s-hmr'](versionId);
|
|
333
|
+
setHmrAttr(elm, versionId);
|
|
334
|
+
if (updatedTags.indexOf(cmpTagName) === -1) {
|
|
335
|
+
updatedTags.push(cmpTagName);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (hasShadowRoot(elm)) {
|
|
339
|
+
hmrComponent(updatedTags, elm.shadowRoot, versionId, cmpTagName);
|
|
340
|
+
}
|
|
341
|
+
if (elm.children) {
|
|
342
|
+
for (let i = 0; i < elm.children.length; i++) {
|
|
343
|
+
hmrComponent(updatedTags, elm.children[i], versionId, cmpTagName);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
346
|
};
|
|
347
347
|
|
|
348
|
-
const hmrExternalStyles = (elm, versionId, cssFileNames) => {
|
|
349
|
-
if (isLinkStylesheet(elm)) {
|
|
350
|
-
cssFileNames.forEach((cssFileName) => {
|
|
351
|
-
hmrStylesheetLink(elm, versionId, cssFileName);
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
if (isTemplate(elm)) {
|
|
355
|
-
hmrExternalStyles(elm.content, versionId, cssFileNames);
|
|
356
|
-
}
|
|
357
|
-
if (hasShadowRoot(elm)) {
|
|
358
|
-
hmrExternalStyles(elm.shadowRoot, versionId, cssFileNames);
|
|
359
|
-
}
|
|
360
|
-
if (elm.children) {
|
|
361
|
-
for (let i = 0; i < elm.children.length; i++) {
|
|
362
|
-
hmrExternalStyles(elm.children[i], versionId, cssFileNames);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
return cssFileNames.sort();
|
|
366
|
-
};
|
|
367
|
-
const hmrStylesheetLink = (styleSheetElm, versionId, cssFileName) => {
|
|
368
|
-
const orgHref = styleSheetElm.getAttribute('href');
|
|
369
|
-
const newHref = getHmrHref(versionId, cssFileName, styleSheetElm.href);
|
|
370
|
-
if (newHref !== orgHref) {
|
|
371
|
-
styleSheetElm.setAttribute('href', newHref);
|
|
372
|
-
setHmrAttr(styleSheetElm, versionId);
|
|
373
|
-
}
|
|
348
|
+
const hmrExternalStyles = (elm, versionId, cssFileNames) => {
|
|
349
|
+
if (isLinkStylesheet(elm)) {
|
|
350
|
+
cssFileNames.forEach((cssFileName) => {
|
|
351
|
+
hmrStylesheetLink(elm, versionId, cssFileName);
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
if (isTemplate(elm)) {
|
|
355
|
+
hmrExternalStyles(elm.content, versionId, cssFileNames);
|
|
356
|
+
}
|
|
357
|
+
if (hasShadowRoot(elm)) {
|
|
358
|
+
hmrExternalStyles(elm.shadowRoot, versionId, cssFileNames);
|
|
359
|
+
}
|
|
360
|
+
if (elm.children) {
|
|
361
|
+
for (let i = 0; i < elm.children.length; i++) {
|
|
362
|
+
hmrExternalStyles(elm.children[i], versionId, cssFileNames);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return cssFileNames.sort();
|
|
366
|
+
};
|
|
367
|
+
const hmrStylesheetLink = (styleSheetElm, versionId, cssFileName) => {
|
|
368
|
+
const orgHref = styleSheetElm.getAttribute('href');
|
|
369
|
+
const newHref = getHmrHref(versionId, cssFileName, styleSheetElm.href);
|
|
370
|
+
if (newHref !== orgHref) {
|
|
371
|
+
styleSheetElm.setAttribute('href', newHref);
|
|
372
|
+
setHmrAttr(styleSheetElm, versionId);
|
|
373
|
+
}
|
|
374
374
|
};
|
|
375
375
|
|
|
376
|
-
const hmrImages = (win, doc, versionId, imageFileNames) => {
|
|
377
|
-
if (win.location.protocol !== 'file:' && doc.styleSheets) {
|
|
378
|
-
hmrStyleSheetsImages(doc, versionId, imageFileNames);
|
|
379
|
-
}
|
|
380
|
-
hmrImagesElements(win, doc.documentElement, versionId, imageFileNames);
|
|
381
|
-
return imageFileNames.sort();
|
|
382
|
-
};
|
|
383
|
-
const hmrStyleSheetsImages = (doc, versionId, imageFileNames) => {
|
|
384
|
-
const cssImageProps = Object.keys(doc.documentElement.style).filter((cssProp) => {
|
|
385
|
-
return cssProp.endsWith('Image');
|
|
386
|
-
});
|
|
387
|
-
for (let i = 0; i < doc.styleSheets.length; i++) {
|
|
388
|
-
hmrStyleSheetImages(cssImageProps, doc.styleSheets[i], versionId, imageFileNames);
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
const hmrStyleSheetImages = (cssImageProps, styleSheet, versionId, imageFileNames) => {
|
|
392
|
-
try {
|
|
393
|
-
const cssRules = styleSheet.cssRules;
|
|
394
|
-
for (let i = 0; i < cssRules.length; i++) {
|
|
395
|
-
const cssRule = cssRules[i];
|
|
396
|
-
switch (cssRule.type) {
|
|
397
|
-
case CSSRule.IMPORT_RULE:
|
|
398
|
-
hmrStyleSheetImages(cssImageProps, cssRule.styleSheet, versionId, imageFileNames);
|
|
399
|
-
break;
|
|
400
|
-
case CSSRule.STYLE_RULE:
|
|
401
|
-
hmrStyleSheetRuleImages(cssImageProps, cssRule, versionId, imageFileNames);
|
|
402
|
-
break;
|
|
403
|
-
case CSSRule.MEDIA_RULE:
|
|
404
|
-
hmrStyleSheetImages(cssImageProps, cssRule, versionId, imageFileNames);
|
|
405
|
-
break;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
catch (e) {
|
|
410
|
-
console.error('hmrStyleSheetImages: ' + e);
|
|
411
|
-
}
|
|
412
|
-
};
|
|
413
|
-
const hmrStyleSheetRuleImages = (cssImageProps, cssRule, versionId, imageFileNames) => {
|
|
414
|
-
cssImageProps.forEach((cssImageProp) => {
|
|
415
|
-
imageFileNames.forEach((imageFileName) => {
|
|
416
|
-
const oldCssText = cssRule.style[cssImageProp];
|
|
417
|
-
const newCssText = updateCssUrlValue(versionId, imageFileName, oldCssText);
|
|
418
|
-
if (oldCssText !== newCssText) {
|
|
419
|
-
cssRule.style[cssImageProp] = newCssText;
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
};
|
|
424
|
-
const hmrImagesElements = (win, elm, versionId, imageFileNames) => {
|
|
425
|
-
const tagName = elm.nodeName.toLowerCase();
|
|
426
|
-
if (tagName === 'img') {
|
|
427
|
-
hmrImgElement(elm, versionId, imageFileNames);
|
|
428
|
-
}
|
|
429
|
-
if (isElement(elm)) {
|
|
430
|
-
const styleAttr = elm.getAttribute('style');
|
|
431
|
-
if (styleAttr) {
|
|
432
|
-
hmrUpdateStyleAttr(elm, versionId, imageFileNames, styleAttr);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
if (tagName === 'style') {
|
|
436
|
-
hmrUpdateStyleElementUrl(elm, versionId, imageFileNames);
|
|
437
|
-
}
|
|
438
|
-
if (win.location.protocol !== 'file:' && isLinkStylesheet(elm)) {
|
|
439
|
-
hmrUpdateLinkElementUrl(elm, versionId, imageFileNames);
|
|
440
|
-
}
|
|
441
|
-
if (isTemplate(elm)) {
|
|
442
|
-
hmrImagesElements(win, elm.content, versionId, imageFileNames);
|
|
443
|
-
}
|
|
444
|
-
if (hasShadowRoot(elm)) {
|
|
445
|
-
hmrImagesElements(win, elm.shadowRoot, versionId, imageFileNames);
|
|
446
|
-
}
|
|
447
|
-
if (elm.children) {
|
|
448
|
-
for (let i = 0; i < elm.children.length; i++) {
|
|
449
|
-
hmrImagesElements(win, elm.children[i], versionId, imageFileNames);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
};
|
|
453
|
-
const hmrImgElement = (imgElm, versionId, imageFileNames) => {
|
|
454
|
-
imageFileNames.forEach((imageFileName) => {
|
|
455
|
-
const orgSrc = imgElm.getAttribute('src');
|
|
456
|
-
const newSrc = getHmrHref(versionId, imageFileName, orgSrc);
|
|
457
|
-
if (newSrc !== orgSrc) {
|
|
458
|
-
imgElm.setAttribute('src', newSrc);
|
|
459
|
-
setHmrAttr(imgElm, versionId);
|
|
460
|
-
}
|
|
461
|
-
});
|
|
462
|
-
};
|
|
463
|
-
const hmrUpdateStyleAttr = (elm, versionId, imageFileNames, oldStyleAttr) => {
|
|
464
|
-
imageFileNames.forEach((imageFileName) => {
|
|
465
|
-
const newStyleAttr = updateCssUrlValue(versionId, imageFileName, oldStyleAttr);
|
|
466
|
-
if (newStyleAttr !== oldStyleAttr) {
|
|
467
|
-
elm.setAttribute('style', newStyleAttr);
|
|
468
|
-
setHmrAttr(elm, versionId);
|
|
469
|
-
}
|
|
470
|
-
});
|
|
471
|
-
};
|
|
472
|
-
const hmrUpdateStyleElementUrl = (styleElm, versionId, imageFileNames) => {
|
|
473
|
-
imageFileNames.forEach((imageFileName) => {
|
|
474
|
-
const oldCssText = styleElm.innerHTML;
|
|
475
|
-
const newCssText = updateCssUrlValue(versionId, imageFileName, oldCssText);
|
|
476
|
-
if (newCssText !== oldCssText) {
|
|
477
|
-
styleElm.innerHTML = newCssText;
|
|
478
|
-
setHmrAttr(styleElm, versionId);
|
|
479
|
-
}
|
|
480
|
-
});
|
|
481
|
-
};
|
|
482
|
-
const hmrUpdateLinkElementUrl = (linkElm, versionId, imageFileNames) => {
|
|
483
|
-
linkElm.href = setQueryString(linkElm.href, 's-hmr-urls', imageFileNames.sort().join(','));
|
|
484
|
-
linkElm.href = setHmrQueryString(linkElm.href, versionId);
|
|
485
|
-
linkElm.setAttribute('data-hmr', versionId);
|
|
376
|
+
const hmrImages = (win, doc, versionId, imageFileNames) => {
|
|
377
|
+
if (win.location.protocol !== 'file:' && doc.styleSheets) {
|
|
378
|
+
hmrStyleSheetsImages(doc, versionId, imageFileNames);
|
|
379
|
+
}
|
|
380
|
+
hmrImagesElements(win, doc.documentElement, versionId, imageFileNames);
|
|
381
|
+
return imageFileNames.sort();
|
|
382
|
+
};
|
|
383
|
+
const hmrStyleSheetsImages = (doc, versionId, imageFileNames) => {
|
|
384
|
+
const cssImageProps = Object.keys(doc.documentElement.style).filter((cssProp) => {
|
|
385
|
+
return cssProp.endsWith('Image');
|
|
386
|
+
});
|
|
387
|
+
for (let i = 0; i < doc.styleSheets.length; i++) {
|
|
388
|
+
hmrStyleSheetImages(cssImageProps, doc.styleSheets[i], versionId, imageFileNames);
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
const hmrStyleSheetImages = (cssImageProps, styleSheet, versionId, imageFileNames) => {
|
|
392
|
+
try {
|
|
393
|
+
const cssRules = styleSheet.cssRules;
|
|
394
|
+
for (let i = 0; i < cssRules.length; i++) {
|
|
395
|
+
const cssRule = cssRules[i];
|
|
396
|
+
switch (cssRule.type) {
|
|
397
|
+
case CSSRule.IMPORT_RULE:
|
|
398
|
+
hmrStyleSheetImages(cssImageProps, cssRule.styleSheet, versionId, imageFileNames);
|
|
399
|
+
break;
|
|
400
|
+
case CSSRule.STYLE_RULE:
|
|
401
|
+
hmrStyleSheetRuleImages(cssImageProps, cssRule, versionId, imageFileNames);
|
|
402
|
+
break;
|
|
403
|
+
case CSSRule.MEDIA_RULE:
|
|
404
|
+
hmrStyleSheetImages(cssImageProps, cssRule, versionId, imageFileNames);
|
|
405
|
+
break;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
console.error('hmrStyleSheetImages: ' + e);
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
const hmrStyleSheetRuleImages = (cssImageProps, cssRule, versionId, imageFileNames) => {
|
|
414
|
+
cssImageProps.forEach((cssImageProp) => {
|
|
415
|
+
imageFileNames.forEach((imageFileName) => {
|
|
416
|
+
const oldCssText = cssRule.style[cssImageProp];
|
|
417
|
+
const newCssText = updateCssUrlValue(versionId, imageFileName, oldCssText);
|
|
418
|
+
if (oldCssText !== newCssText) {
|
|
419
|
+
cssRule.style[cssImageProp] = newCssText;
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
};
|
|
424
|
+
const hmrImagesElements = (win, elm, versionId, imageFileNames) => {
|
|
425
|
+
const tagName = elm.nodeName.toLowerCase();
|
|
426
|
+
if (tagName === 'img') {
|
|
427
|
+
hmrImgElement(elm, versionId, imageFileNames);
|
|
428
|
+
}
|
|
429
|
+
if (isElement(elm)) {
|
|
430
|
+
const styleAttr = elm.getAttribute('style');
|
|
431
|
+
if (styleAttr) {
|
|
432
|
+
hmrUpdateStyleAttr(elm, versionId, imageFileNames, styleAttr);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (tagName === 'style') {
|
|
436
|
+
hmrUpdateStyleElementUrl(elm, versionId, imageFileNames);
|
|
437
|
+
}
|
|
438
|
+
if (win.location.protocol !== 'file:' && isLinkStylesheet(elm)) {
|
|
439
|
+
hmrUpdateLinkElementUrl(elm, versionId, imageFileNames);
|
|
440
|
+
}
|
|
441
|
+
if (isTemplate(elm)) {
|
|
442
|
+
hmrImagesElements(win, elm.content, versionId, imageFileNames);
|
|
443
|
+
}
|
|
444
|
+
if (hasShadowRoot(elm)) {
|
|
445
|
+
hmrImagesElements(win, elm.shadowRoot, versionId, imageFileNames);
|
|
446
|
+
}
|
|
447
|
+
if (elm.children) {
|
|
448
|
+
for (let i = 0; i < elm.children.length; i++) {
|
|
449
|
+
hmrImagesElements(win, elm.children[i], versionId, imageFileNames);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
const hmrImgElement = (imgElm, versionId, imageFileNames) => {
|
|
454
|
+
imageFileNames.forEach((imageFileName) => {
|
|
455
|
+
const orgSrc = imgElm.getAttribute('src');
|
|
456
|
+
const newSrc = getHmrHref(versionId, imageFileName, orgSrc);
|
|
457
|
+
if (newSrc !== orgSrc) {
|
|
458
|
+
imgElm.setAttribute('src', newSrc);
|
|
459
|
+
setHmrAttr(imgElm, versionId);
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
};
|
|
463
|
+
const hmrUpdateStyleAttr = (elm, versionId, imageFileNames, oldStyleAttr) => {
|
|
464
|
+
imageFileNames.forEach((imageFileName) => {
|
|
465
|
+
const newStyleAttr = updateCssUrlValue(versionId, imageFileName, oldStyleAttr);
|
|
466
|
+
if (newStyleAttr !== oldStyleAttr) {
|
|
467
|
+
elm.setAttribute('style', newStyleAttr);
|
|
468
|
+
setHmrAttr(elm, versionId);
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
};
|
|
472
|
+
const hmrUpdateStyleElementUrl = (styleElm, versionId, imageFileNames) => {
|
|
473
|
+
imageFileNames.forEach((imageFileName) => {
|
|
474
|
+
const oldCssText = styleElm.innerHTML;
|
|
475
|
+
const newCssText = updateCssUrlValue(versionId, imageFileName, oldCssText);
|
|
476
|
+
if (newCssText !== oldCssText) {
|
|
477
|
+
styleElm.innerHTML = newCssText;
|
|
478
|
+
setHmrAttr(styleElm, versionId);
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
};
|
|
482
|
+
const hmrUpdateLinkElementUrl = (linkElm, versionId, imageFileNames) => {
|
|
483
|
+
linkElm.href = setQueryString(linkElm.href, 's-hmr-urls', imageFileNames.sort().join(','));
|
|
484
|
+
linkElm.href = setHmrQueryString(linkElm.href, versionId);
|
|
485
|
+
linkElm.setAttribute('data-hmr', versionId);
|
|
486
486
|
};
|
|
487
487
|
|
|
488
|
-
const hmrInlineStyles = (elm, versionId, stylesUpdatedData) => {
|
|
489
|
-
const stylesUpdated = stylesUpdatedData;
|
|
490
|
-
if (isElement(elm) && elm.nodeName.toLowerCase() === 'style') {
|
|
491
|
-
stylesUpdated.forEach((styleUpdated) => {
|
|
492
|
-
hmrStyleElement(elm, versionId, styleUpdated);
|
|
493
|
-
});
|
|
494
|
-
}
|
|
495
|
-
if (isTemplate(elm)) {
|
|
496
|
-
hmrInlineStyles(elm.content, versionId, stylesUpdated);
|
|
497
|
-
}
|
|
498
|
-
if (hasShadowRoot(elm)) {
|
|
499
|
-
hmrInlineStyles(elm.shadowRoot, versionId, stylesUpdated);
|
|
500
|
-
}
|
|
501
|
-
if (elm.children) {
|
|
502
|
-
for (let i = 0; i < elm.children.length; i++) {
|
|
503
|
-
hmrInlineStyles(elm.children[i], versionId, stylesUpdated);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
return stylesUpdated
|
|
507
|
-
.map((s) => s.styleTag)
|
|
508
|
-
.reduce((arr, v) => {
|
|
509
|
-
if (arr.indexOf(v) === -1) {
|
|
510
|
-
arr.push(v);
|
|
511
|
-
}
|
|
512
|
-
return arr;
|
|
513
|
-
}, [])
|
|
514
|
-
.sort();
|
|
515
|
-
};
|
|
516
|
-
const hmrStyleElement = (elm, versionId, stylesUpdated) => {
|
|
517
|
-
const styleId = elm.getAttribute('sty-id');
|
|
518
|
-
if (styleId === stylesUpdated.styleId && stylesUpdated.styleText) {
|
|
519
|
-
// if we made it this far then it's a match!
|
|
520
|
-
// update the new style text
|
|
521
|
-
elm.innerHTML = stylesUpdated.styleText.replace(/\\n/g, '\n');
|
|
522
|
-
elm.setAttribute('data-hmr', versionId);
|
|
523
|
-
}
|
|
488
|
+
const hmrInlineStyles = (elm, versionId, stylesUpdatedData) => {
|
|
489
|
+
const stylesUpdated = stylesUpdatedData;
|
|
490
|
+
if (isElement(elm) && elm.nodeName.toLowerCase() === 'style') {
|
|
491
|
+
stylesUpdated.forEach((styleUpdated) => {
|
|
492
|
+
hmrStyleElement(elm, versionId, styleUpdated);
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
if (isTemplate(elm)) {
|
|
496
|
+
hmrInlineStyles(elm.content, versionId, stylesUpdated);
|
|
497
|
+
}
|
|
498
|
+
if (hasShadowRoot(elm)) {
|
|
499
|
+
hmrInlineStyles(elm.shadowRoot, versionId, stylesUpdated);
|
|
500
|
+
}
|
|
501
|
+
if (elm.children) {
|
|
502
|
+
for (let i = 0; i < elm.children.length; i++) {
|
|
503
|
+
hmrInlineStyles(elm.children[i], versionId, stylesUpdated);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return stylesUpdated
|
|
507
|
+
.map((s) => s.styleTag)
|
|
508
|
+
.reduce((arr, v) => {
|
|
509
|
+
if (arr.indexOf(v) === -1) {
|
|
510
|
+
arr.push(v);
|
|
511
|
+
}
|
|
512
|
+
return arr;
|
|
513
|
+
}, [])
|
|
514
|
+
.sort();
|
|
515
|
+
};
|
|
516
|
+
const hmrStyleElement = (elm, versionId, stylesUpdated) => {
|
|
517
|
+
const styleId = elm.getAttribute('sty-id');
|
|
518
|
+
if (styleId === stylesUpdated.styleId && stylesUpdated.styleText) {
|
|
519
|
+
// if we made it this far then it's a match!
|
|
520
|
+
// update the new style text
|
|
521
|
+
elm.innerHTML = stylesUpdated.styleText.replace(/\\n/g, '\n');
|
|
522
|
+
elm.setAttribute('data-hmr', versionId);
|
|
523
|
+
}
|
|
524
524
|
};
|
|
525
525
|
|
|
526
|
-
const hmrWindow = (data) => {
|
|
527
|
-
const results = {
|
|
528
|
-
updatedComponents: [],
|
|
529
|
-
updatedExternalStyles: [],
|
|
530
|
-
updatedInlineStyles: [],
|
|
531
|
-
updatedImages: [],
|
|
532
|
-
versionId: '',
|
|
533
|
-
};
|
|
534
|
-
try {
|
|
535
|
-
if (!data ||
|
|
536
|
-
!data.window ||
|
|
537
|
-
!data.window.document.documentElement ||
|
|
538
|
-
!data.hmr ||
|
|
539
|
-
typeof data.hmr.versionId !== 'string') {
|
|
540
|
-
return results;
|
|
541
|
-
}
|
|
542
|
-
const win = data.window;
|
|
543
|
-
const doc = win.document;
|
|
544
|
-
const hmr = data.hmr;
|
|
545
|
-
const documentElement = doc.documentElement;
|
|
546
|
-
const versionId = hmr.versionId;
|
|
547
|
-
results.versionId = versionId;
|
|
548
|
-
if (hmr.componentsUpdated) {
|
|
549
|
-
results.updatedComponents = hmrComponents(documentElement, versionId, hmr.componentsUpdated);
|
|
550
|
-
}
|
|
551
|
-
if (hmr.inlineStylesUpdated) {
|
|
552
|
-
results.updatedInlineStyles = hmrInlineStyles(documentElement, versionId, hmr.inlineStylesUpdated);
|
|
553
|
-
}
|
|
554
|
-
if (hmr.externalStylesUpdated) {
|
|
555
|
-
results.updatedExternalStyles = hmrExternalStyles(documentElement, versionId, hmr.externalStylesUpdated);
|
|
556
|
-
}
|
|
557
|
-
if (hmr.imagesUpdated) {
|
|
558
|
-
results.updatedImages = hmrImages(win, doc, versionId, hmr.imagesUpdated);
|
|
559
|
-
}
|
|
560
|
-
setHmrAttr(documentElement, versionId);
|
|
561
|
-
}
|
|
562
|
-
catch (e) {
|
|
563
|
-
console.error(e);
|
|
564
|
-
}
|
|
565
|
-
return results;
|
|
526
|
+
const hmrWindow = (data) => {
|
|
527
|
+
const results = {
|
|
528
|
+
updatedComponents: [],
|
|
529
|
+
updatedExternalStyles: [],
|
|
530
|
+
updatedInlineStyles: [],
|
|
531
|
+
updatedImages: [],
|
|
532
|
+
versionId: '',
|
|
533
|
+
};
|
|
534
|
+
try {
|
|
535
|
+
if (!data ||
|
|
536
|
+
!data.window ||
|
|
537
|
+
!data.window.document.documentElement ||
|
|
538
|
+
!data.hmr ||
|
|
539
|
+
typeof data.hmr.versionId !== 'string') {
|
|
540
|
+
return results;
|
|
541
|
+
}
|
|
542
|
+
const win = data.window;
|
|
543
|
+
const doc = win.document;
|
|
544
|
+
const hmr = data.hmr;
|
|
545
|
+
const documentElement = doc.documentElement;
|
|
546
|
+
const versionId = hmr.versionId;
|
|
547
|
+
results.versionId = versionId;
|
|
548
|
+
if (hmr.componentsUpdated) {
|
|
549
|
+
results.updatedComponents = hmrComponents(documentElement, versionId, hmr.componentsUpdated);
|
|
550
|
+
}
|
|
551
|
+
if (hmr.inlineStylesUpdated) {
|
|
552
|
+
results.updatedInlineStyles = hmrInlineStyles(documentElement, versionId, hmr.inlineStylesUpdated);
|
|
553
|
+
}
|
|
554
|
+
if (hmr.externalStylesUpdated) {
|
|
555
|
+
results.updatedExternalStyles = hmrExternalStyles(documentElement, versionId, hmr.externalStylesUpdated);
|
|
556
|
+
}
|
|
557
|
+
if (hmr.imagesUpdated) {
|
|
558
|
+
results.updatedImages = hmrImages(win, doc, versionId, hmr.imagesUpdated);
|
|
559
|
+
}
|
|
560
|
+
setHmrAttr(documentElement, versionId);
|
|
561
|
+
}
|
|
562
|
+
catch (e) {
|
|
563
|
+
console.error(e);
|
|
564
|
+
}
|
|
565
|
+
return results;
|
|
566
566
|
};
|
|
567
567
|
|
|
568
|
-
const logBuild = (msg) => log(BLUE, 'Build', msg);
|
|
569
|
-
const logReload = (msg) => logWarn('Reload', msg);
|
|
570
|
-
const logWarn = (prefix, msg) => log(YELLOW, prefix, msg);
|
|
571
|
-
const logDisabled = (prefix, msg) => log(GRAY, prefix, msg);
|
|
572
|
-
const logDiagnostic = (diag) => {
|
|
573
|
-
const diagnostic = diag;
|
|
574
|
-
let color = RED;
|
|
575
|
-
let prefix = 'Error';
|
|
576
|
-
if (diagnostic.level === 'warn') {
|
|
577
|
-
color = YELLOW;
|
|
578
|
-
prefix = 'Warning';
|
|
579
|
-
}
|
|
580
|
-
if (diagnostic.header) {
|
|
581
|
-
prefix = diagnostic.header;
|
|
582
|
-
}
|
|
583
|
-
let msg = ``;
|
|
584
|
-
if (diagnostic.relFilePath) {
|
|
585
|
-
msg += diagnostic.relFilePath;
|
|
586
|
-
if (typeof diagnostic.lineNumber === 'number' && diagnostic.lineNumber > 0) {
|
|
587
|
-
msg += ', line ' + diagnostic.lineNumber;
|
|
588
|
-
if (typeof diagnostic.columnNumber === 'number' && diagnostic.columnNumber > 0) {
|
|
589
|
-
msg += ', column ' + diagnostic.columnNumber;
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
msg += `\n`;
|
|
593
|
-
}
|
|
594
|
-
msg += diagnostic.messageText;
|
|
595
|
-
log(color, prefix, msg);
|
|
596
|
-
};
|
|
597
|
-
const log = (color, prefix, msg) => {
|
|
598
|
-
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.indexOf('Trident') > -1) {
|
|
599
|
-
console.log(prefix, msg);
|
|
600
|
-
}
|
|
601
|
-
else {
|
|
602
|
-
console.log.apply(console, [
|
|
603
|
-
'%c' + prefix,
|
|
604
|
-
`background: ${color}; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;`,
|
|
605
|
-
msg,
|
|
606
|
-
]);
|
|
607
|
-
}
|
|
608
|
-
};
|
|
609
|
-
const YELLOW = `#f39c12`;
|
|
610
|
-
const RED = `#c0392b`;
|
|
611
|
-
const BLUE = `#3498db`;
|
|
568
|
+
const logBuild = (msg) => log(BLUE, 'Build', msg);
|
|
569
|
+
const logReload = (msg) => logWarn('Reload', msg);
|
|
570
|
+
const logWarn = (prefix, msg) => log(YELLOW, prefix, msg);
|
|
571
|
+
const logDisabled = (prefix, msg) => log(GRAY, prefix, msg);
|
|
572
|
+
const logDiagnostic = (diag) => {
|
|
573
|
+
const diagnostic = diag;
|
|
574
|
+
let color = RED;
|
|
575
|
+
let prefix = 'Error';
|
|
576
|
+
if (diagnostic.level === 'warn') {
|
|
577
|
+
color = YELLOW;
|
|
578
|
+
prefix = 'Warning';
|
|
579
|
+
}
|
|
580
|
+
if (diagnostic.header) {
|
|
581
|
+
prefix = diagnostic.header;
|
|
582
|
+
}
|
|
583
|
+
let msg = ``;
|
|
584
|
+
if (diagnostic.relFilePath) {
|
|
585
|
+
msg += diagnostic.relFilePath;
|
|
586
|
+
if (typeof diagnostic.lineNumber === 'number' && diagnostic.lineNumber > 0) {
|
|
587
|
+
msg += ', line ' + diagnostic.lineNumber;
|
|
588
|
+
if (typeof diagnostic.columnNumber === 'number' && diagnostic.columnNumber > 0) {
|
|
589
|
+
msg += ', column ' + diagnostic.columnNumber;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
msg += `\n`;
|
|
593
|
+
}
|
|
594
|
+
msg += diagnostic.messageText;
|
|
595
|
+
log(color, prefix, msg);
|
|
596
|
+
};
|
|
597
|
+
const log = (color, prefix, msg) => {
|
|
598
|
+
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.indexOf('Trident') > -1) {
|
|
599
|
+
console.log(prefix, msg);
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
console.log.apply(console, [
|
|
603
|
+
'%c' + prefix,
|
|
604
|
+
`background: ${color}; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;`,
|
|
605
|
+
msg,
|
|
606
|
+
]);
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
const YELLOW = `#f39c12`;
|
|
610
|
+
const RED = `#c0392b`;
|
|
611
|
+
const BLUE = `#3498db`;
|
|
612
612
|
const GRAY = `#717171`;
|
|
613
613
|
|
|
614
|
-
const initBuildProgress = (data) => {
|
|
615
|
-
const win = data.window;
|
|
616
|
-
const doc = win.document;
|
|
617
|
-
const barColor = `#5851ff`;
|
|
618
|
-
const errorColor = `#b70c19`;
|
|
619
|
-
let addBarTimerId;
|
|
620
|
-
let removeBarTimerId;
|
|
621
|
-
let opacityTimerId;
|
|
622
|
-
let incIntervalId;
|
|
623
|
-
let progressIncrease;
|
|
624
|
-
let currentProgress = 0;
|
|
625
|
-
function update() {
|
|
626
|
-
clearTimeout(opacityTimerId);
|
|
627
|
-
clearTimeout(removeBarTimerId);
|
|
628
|
-
const progressBar = getProgressBar();
|
|
629
|
-
if (!progressBar) {
|
|
630
|
-
createProgressBar();
|
|
631
|
-
addBarTimerId = setTimeout(update, 16);
|
|
632
|
-
return;
|
|
633
|
-
}
|
|
634
|
-
progressBar.style.background = barColor;
|
|
635
|
-
progressBar.style.opacity = `1`;
|
|
636
|
-
progressBar.style.transform = `scaleX(${Math.min(1, displayProgress())})`;
|
|
637
|
-
if (incIntervalId == null) {
|
|
638
|
-
incIntervalId = setInterval(() => {
|
|
639
|
-
progressIncrease += Math.random() * 0.05 + 0.01;
|
|
640
|
-
if (displayProgress() < 0.9) {
|
|
641
|
-
update();
|
|
642
|
-
}
|
|
643
|
-
else {
|
|
644
|
-
clearInterval(incIntervalId);
|
|
645
|
-
}
|
|
646
|
-
}, 800);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
function reset() {
|
|
650
|
-
clearInterval(incIntervalId);
|
|
651
|
-
progressIncrease = 0.05;
|
|
652
|
-
incIntervalId = null;
|
|
653
|
-
clearTimeout(opacityTimerId);
|
|
654
|
-
clearTimeout(addBarTimerId);
|
|
655
|
-
clearTimeout(removeBarTimerId);
|
|
656
|
-
const progressBar = getProgressBar();
|
|
657
|
-
if (progressBar) {
|
|
658
|
-
if (currentProgress >= 1) {
|
|
659
|
-
progressBar.style.transform = `scaleX(1)`;
|
|
660
|
-
}
|
|
661
|
-
opacityTimerId = setTimeout(() => {
|
|
662
|
-
try {
|
|
663
|
-
const progressBar = getProgressBar();
|
|
664
|
-
if (progressBar) {
|
|
665
|
-
progressBar.style.opacity = `0`;
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
catch (e) { }
|
|
669
|
-
}, 150);
|
|
670
|
-
removeBarTimerId = setTimeout(() => {
|
|
671
|
-
try {
|
|
672
|
-
const progressBar = getProgressBar();
|
|
673
|
-
if (progressBar) {
|
|
674
|
-
progressBar.parentNode.removeChild(progressBar);
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
catch (e) { }
|
|
678
|
-
}, 1000);
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
function displayProgress() {
|
|
682
|
-
const p = currentProgress + progressIncrease;
|
|
683
|
-
return Math.max(0, Math.min(1, p));
|
|
684
|
-
}
|
|
685
|
-
reset();
|
|
686
|
-
onBuildLog(win, (buildLog) => {
|
|
687
|
-
currentProgress = buildLog.progress;
|
|
688
|
-
if (currentProgress >= 0 && currentProgress < 1) {
|
|
689
|
-
update();
|
|
690
|
-
}
|
|
691
|
-
else {
|
|
692
|
-
reset();
|
|
693
|
-
}
|
|
694
|
-
});
|
|
695
|
-
onBuildResults(win, (buildResults) => {
|
|
696
|
-
if (buildResults.hasError) {
|
|
697
|
-
const progressBar = getProgressBar();
|
|
698
|
-
if (progressBar) {
|
|
699
|
-
progressBar.style.transform = `scaleX(1)`;
|
|
700
|
-
progressBar.style.background = errorColor;
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
reset();
|
|
704
|
-
});
|
|
705
|
-
onBuildStatus(win, (buildStatus) => {
|
|
706
|
-
if (buildStatus === 'disabled') {
|
|
707
|
-
reset();
|
|
708
|
-
}
|
|
709
|
-
});
|
|
710
|
-
if (doc.head.dataset.tmpl === 'tmpl-initial-load') {
|
|
711
|
-
update();
|
|
712
|
-
}
|
|
713
|
-
const PROGRESS_BAR_ID = `dev-server-progress-bar`;
|
|
714
|
-
function getProgressBar() {
|
|
715
|
-
return doc.getElementById(PROGRESS_BAR_ID);
|
|
716
|
-
}
|
|
717
|
-
function createProgressBar() {
|
|
718
|
-
const progressBar = doc.createElement('div');
|
|
719
|
-
progressBar.id = PROGRESS_BAR_ID;
|
|
720
|
-
progressBar.style.position = `absolute`;
|
|
721
|
-
progressBar.style.top = `0`;
|
|
722
|
-
progressBar.style.left = `0`;
|
|
723
|
-
progressBar.style.zIndex = `100001`;
|
|
724
|
-
progressBar.style.width = `100%`;
|
|
725
|
-
progressBar.style.height = `2px`;
|
|
726
|
-
progressBar.style.transform = `scaleX(0)`;
|
|
727
|
-
progressBar.style.opacity = `1`;
|
|
728
|
-
progressBar.style.background = barColor;
|
|
729
|
-
progressBar.style.transformOrigin = `left center`;
|
|
730
|
-
progressBar.style.transition = `transform .1s ease-in-out, opacity .5s ease-in`;
|
|
731
|
-
progressBar.style.contain = `strict`;
|
|
732
|
-
doc.body.appendChild(progressBar);
|
|
733
|
-
}
|
|
614
|
+
const initBuildProgress = (data) => {
|
|
615
|
+
const win = data.window;
|
|
616
|
+
const doc = win.document;
|
|
617
|
+
const barColor = `#5851ff`;
|
|
618
|
+
const errorColor = `#b70c19`;
|
|
619
|
+
let addBarTimerId;
|
|
620
|
+
let removeBarTimerId;
|
|
621
|
+
let opacityTimerId;
|
|
622
|
+
let incIntervalId;
|
|
623
|
+
let progressIncrease;
|
|
624
|
+
let currentProgress = 0;
|
|
625
|
+
function update() {
|
|
626
|
+
clearTimeout(opacityTimerId);
|
|
627
|
+
clearTimeout(removeBarTimerId);
|
|
628
|
+
const progressBar = getProgressBar();
|
|
629
|
+
if (!progressBar) {
|
|
630
|
+
createProgressBar();
|
|
631
|
+
addBarTimerId = setTimeout(update, 16);
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
progressBar.style.background = barColor;
|
|
635
|
+
progressBar.style.opacity = `1`;
|
|
636
|
+
progressBar.style.transform = `scaleX(${Math.min(1, displayProgress())})`;
|
|
637
|
+
if (incIntervalId == null) {
|
|
638
|
+
incIntervalId = setInterval(() => {
|
|
639
|
+
progressIncrease += Math.random() * 0.05 + 0.01;
|
|
640
|
+
if (displayProgress() < 0.9) {
|
|
641
|
+
update();
|
|
642
|
+
}
|
|
643
|
+
else {
|
|
644
|
+
clearInterval(incIntervalId);
|
|
645
|
+
}
|
|
646
|
+
}, 800);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
function reset() {
|
|
650
|
+
clearInterval(incIntervalId);
|
|
651
|
+
progressIncrease = 0.05;
|
|
652
|
+
incIntervalId = null;
|
|
653
|
+
clearTimeout(opacityTimerId);
|
|
654
|
+
clearTimeout(addBarTimerId);
|
|
655
|
+
clearTimeout(removeBarTimerId);
|
|
656
|
+
const progressBar = getProgressBar();
|
|
657
|
+
if (progressBar) {
|
|
658
|
+
if (currentProgress >= 1) {
|
|
659
|
+
progressBar.style.transform = `scaleX(1)`;
|
|
660
|
+
}
|
|
661
|
+
opacityTimerId = setTimeout(() => {
|
|
662
|
+
try {
|
|
663
|
+
const progressBar = getProgressBar();
|
|
664
|
+
if (progressBar) {
|
|
665
|
+
progressBar.style.opacity = `0`;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
catch (e) { }
|
|
669
|
+
}, 150);
|
|
670
|
+
removeBarTimerId = setTimeout(() => {
|
|
671
|
+
try {
|
|
672
|
+
const progressBar = getProgressBar();
|
|
673
|
+
if (progressBar) {
|
|
674
|
+
progressBar.parentNode.removeChild(progressBar);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
catch (e) { }
|
|
678
|
+
}, 1000);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
function displayProgress() {
|
|
682
|
+
const p = currentProgress + progressIncrease;
|
|
683
|
+
return Math.max(0, Math.min(1, p));
|
|
684
|
+
}
|
|
685
|
+
reset();
|
|
686
|
+
onBuildLog(win, (buildLog) => {
|
|
687
|
+
currentProgress = buildLog.progress;
|
|
688
|
+
if (currentProgress >= 0 && currentProgress < 1) {
|
|
689
|
+
update();
|
|
690
|
+
}
|
|
691
|
+
else {
|
|
692
|
+
reset();
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
onBuildResults(win, (buildResults) => {
|
|
696
|
+
if (buildResults.hasError) {
|
|
697
|
+
const progressBar = getProgressBar();
|
|
698
|
+
if (progressBar) {
|
|
699
|
+
progressBar.style.transform = `scaleX(1)`;
|
|
700
|
+
progressBar.style.background = errorColor;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
reset();
|
|
704
|
+
});
|
|
705
|
+
onBuildStatus(win, (buildStatus) => {
|
|
706
|
+
if (buildStatus === 'disabled') {
|
|
707
|
+
reset();
|
|
708
|
+
}
|
|
709
|
+
});
|
|
710
|
+
if (doc.head.dataset.tmpl === 'tmpl-initial-load') {
|
|
711
|
+
update();
|
|
712
|
+
}
|
|
713
|
+
const PROGRESS_BAR_ID = `dev-server-progress-bar`;
|
|
714
|
+
function getProgressBar() {
|
|
715
|
+
return doc.getElementById(PROGRESS_BAR_ID);
|
|
716
|
+
}
|
|
717
|
+
function createProgressBar() {
|
|
718
|
+
const progressBar = doc.createElement('div');
|
|
719
|
+
progressBar.id = PROGRESS_BAR_ID;
|
|
720
|
+
progressBar.style.position = `absolute`;
|
|
721
|
+
progressBar.style.top = `0`;
|
|
722
|
+
progressBar.style.left = `0`;
|
|
723
|
+
progressBar.style.zIndex = `100001`;
|
|
724
|
+
progressBar.style.width = `100%`;
|
|
725
|
+
progressBar.style.height = `2px`;
|
|
726
|
+
progressBar.style.transform = `scaleX(0)`;
|
|
727
|
+
progressBar.style.opacity = `1`;
|
|
728
|
+
progressBar.style.background = barColor;
|
|
729
|
+
progressBar.style.transformOrigin = `left center`;
|
|
730
|
+
progressBar.style.transition = `transform .1s ease-in-out, opacity .5s ease-in`;
|
|
731
|
+
progressBar.style.contain = `strict`;
|
|
732
|
+
doc.body.appendChild(progressBar);
|
|
733
|
+
}
|
|
734
734
|
};
|
|
735
735
|
|
|
736
|
-
const initBuildStatus = (data) => {
|
|
737
|
-
const win = data.window;
|
|
738
|
-
const doc = win.document;
|
|
739
|
-
const iconElms = getFavIcons(doc);
|
|
740
|
-
iconElms.forEach((iconElm) => {
|
|
741
|
-
if (iconElm.href) {
|
|
742
|
-
iconElm.dataset.href = iconElm.href;
|
|
743
|
-
iconElm.dataset.type = iconElm.type;
|
|
744
|
-
}
|
|
745
|
-
});
|
|
746
|
-
onBuildStatus(win, (buildStatus) => {
|
|
747
|
-
updateBuildStatus(doc, buildStatus);
|
|
748
|
-
});
|
|
749
|
-
};
|
|
750
|
-
const updateBuildStatus = (doc, status) => {
|
|
751
|
-
const iconElms = getFavIcons(doc);
|
|
752
|
-
iconElms.forEach((iconElm) => {
|
|
753
|
-
updateFavIcon(iconElm, status);
|
|
754
|
-
});
|
|
755
|
-
};
|
|
756
|
-
const updateFavIcon = (linkElm, status) => {
|
|
757
|
-
if (status === 'pending') {
|
|
758
|
-
linkElm.href = ICON_PENDING;
|
|
759
|
-
linkElm.type = ICON_TYPE;
|
|
760
|
-
linkElm.setAttribute('data-status', status);
|
|
761
|
-
}
|
|
762
|
-
else if (status === 'error') {
|
|
763
|
-
linkElm.href = ICON_ERROR;
|
|
764
|
-
linkElm.type = ICON_TYPE;
|
|
765
|
-
linkElm.setAttribute('data-status', status);
|
|
766
|
-
}
|
|
767
|
-
else if (status === 'disabled') {
|
|
768
|
-
linkElm.href = ICON_DISABLED;
|
|
769
|
-
linkElm.type = ICON_TYPE;
|
|
770
|
-
linkElm.setAttribute('data-status', status);
|
|
771
|
-
}
|
|
772
|
-
else {
|
|
773
|
-
linkElm.removeAttribute('data-status');
|
|
774
|
-
if (linkElm.dataset.href) {
|
|
775
|
-
linkElm.href = linkElm.dataset.href;
|
|
776
|
-
linkElm.type = linkElm.dataset.type;
|
|
777
|
-
}
|
|
778
|
-
else {
|
|
779
|
-
linkElm.href = ICON_DEFAULT;
|
|
780
|
-
linkElm.type = ICON_TYPE;
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
};
|
|
784
|
-
const getFavIcons = (doc) => {
|
|
785
|
-
const iconElms = [];
|
|
786
|
-
const linkElms = doc.querySelectorAll('link');
|
|
787
|
-
for (let i = 0; i < linkElms.length; i++) {
|
|
788
|
-
if (linkElms[i].href &&
|
|
789
|
-
linkElms[i].rel &&
|
|
790
|
-
(linkElms[i].rel.indexOf('shortcut') > -1 || linkElms[i].rel.indexOf('icon') > -1)) {
|
|
791
|
-
iconElms.push(linkElms[i]);
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
if (iconElms.length === 0) {
|
|
795
|
-
const linkElm = doc.createElement('link');
|
|
796
|
-
linkElm.rel = 'shortcut icon';
|
|
797
|
-
doc.head.appendChild(linkElm);
|
|
798
|
-
iconElms.push(linkElm);
|
|
799
|
-
}
|
|
800
|
-
return iconElms;
|
|
801
|
-
};
|
|
802
|
-
const ICON_DEFAULT = 'data:image/png;base64,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';
|
|
803
|
-
const ICON_PENDING = 'data:image/png;base64,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';
|
|
804
|
-
const ICON_ERROR = 'data:image/png;base64,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';
|
|
805
|
-
const ICON_DISABLED = 'data:image/png;base64,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';
|
|
736
|
+
const initBuildStatus = (data) => {
|
|
737
|
+
const win = data.window;
|
|
738
|
+
const doc = win.document;
|
|
739
|
+
const iconElms = getFavIcons(doc);
|
|
740
|
+
iconElms.forEach((iconElm) => {
|
|
741
|
+
if (iconElm.href) {
|
|
742
|
+
iconElm.dataset.href = iconElm.href;
|
|
743
|
+
iconElm.dataset.type = iconElm.type;
|
|
744
|
+
}
|
|
745
|
+
});
|
|
746
|
+
onBuildStatus(win, (buildStatus) => {
|
|
747
|
+
updateBuildStatus(doc, buildStatus);
|
|
748
|
+
});
|
|
749
|
+
};
|
|
750
|
+
const updateBuildStatus = (doc, status) => {
|
|
751
|
+
const iconElms = getFavIcons(doc);
|
|
752
|
+
iconElms.forEach((iconElm) => {
|
|
753
|
+
updateFavIcon(iconElm, status);
|
|
754
|
+
});
|
|
755
|
+
};
|
|
756
|
+
const updateFavIcon = (linkElm, status) => {
|
|
757
|
+
if (status === 'pending') {
|
|
758
|
+
linkElm.href = ICON_PENDING;
|
|
759
|
+
linkElm.type = ICON_TYPE;
|
|
760
|
+
linkElm.setAttribute('data-status', status);
|
|
761
|
+
}
|
|
762
|
+
else if (status === 'error') {
|
|
763
|
+
linkElm.href = ICON_ERROR;
|
|
764
|
+
linkElm.type = ICON_TYPE;
|
|
765
|
+
linkElm.setAttribute('data-status', status);
|
|
766
|
+
}
|
|
767
|
+
else if (status === 'disabled') {
|
|
768
|
+
linkElm.href = ICON_DISABLED;
|
|
769
|
+
linkElm.type = ICON_TYPE;
|
|
770
|
+
linkElm.setAttribute('data-status', status);
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
linkElm.removeAttribute('data-status');
|
|
774
|
+
if (linkElm.dataset.href) {
|
|
775
|
+
linkElm.href = linkElm.dataset.href;
|
|
776
|
+
linkElm.type = linkElm.dataset.type;
|
|
777
|
+
}
|
|
778
|
+
else {
|
|
779
|
+
linkElm.href = ICON_DEFAULT;
|
|
780
|
+
linkElm.type = ICON_TYPE;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
};
|
|
784
|
+
const getFavIcons = (doc) => {
|
|
785
|
+
const iconElms = [];
|
|
786
|
+
const linkElms = doc.querySelectorAll('link');
|
|
787
|
+
for (let i = 0; i < linkElms.length; i++) {
|
|
788
|
+
if (linkElms[i].href &&
|
|
789
|
+
linkElms[i].rel &&
|
|
790
|
+
(linkElms[i].rel.indexOf('shortcut') > -1 || linkElms[i].rel.indexOf('icon') > -1)) {
|
|
791
|
+
iconElms.push(linkElms[i]);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
if (iconElms.length === 0) {
|
|
795
|
+
const linkElm = doc.createElement('link');
|
|
796
|
+
linkElm.rel = 'shortcut icon';
|
|
797
|
+
doc.head.appendChild(linkElm);
|
|
798
|
+
iconElms.push(linkElm);
|
|
799
|
+
}
|
|
800
|
+
return iconElms;
|
|
801
|
+
};
|
|
802
|
+
const ICON_DEFAULT = 'data:image/png;base64,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';
|
|
803
|
+
const ICON_PENDING = 'data:image/png;base64,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';
|
|
804
|
+
const ICON_ERROR = 'data:image/png;base64,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';
|
|
805
|
+
const ICON_DISABLED = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAZGklEQVR4nO2de9xXU77H30kklahcUlNShEouhxGDKLcJCQdj3J3DuB1nLi5DMcjgMDPHJYbBvMxrXEaaxyXpQu7CyF1EYZIJhUQXdXT++O6fnp6e5/db37XXZe/97PfrtV89Pc/aa63fb6/P3muv9b20WLFiBdUYO3Zs1b/Xoy9wNjAY2ACYB0wArgHeM62kpKQevYGfA/sCnYDPgcnA74E3TSoYPnx41b+vka5/3/MT4HXgJKA70A7YDDgVeAs41FE7Jc2Hw5BBfioyltohY+sk4A3gKBeNuBDA1sBfq/y9FTAGON5BWyXNg+OBe5Gx0xR3AtukbciFAO40LHc7cJ6D9kqKzfnIWDGh2o3XiLQCOAzYVlH+t8DolG2WFJcbgcsV5bdFxqA1aQVwjcU5PwMeBzZJ2XZJcdgYeAKZ72u5Ok3DaQRwEvADy3P3QF6a903RfkkxGIKMhd0tz+8OnGjbeBoBXJziXICOwCPAZSnrKckvlwATkSXONFxse6KtAA4Huto22oALkMfflo7qK8k+vYCngBGO6uuG5VK7rQB+bXleU+yOrPn+t+N6S7LHqcg6/m6O67UakzYC2AkYYNNYDVoCv0N2+vp5qL8kLlshlgE3Amt7qH974N+0J9kI4DSLczTsDbwKjEJEUZJ/LkCu6T6e2/mZ9gStANoC/65txIIWyCPtLWBYgPZK/HAg8Bqy0FFtV9cVRwDrak7QCuBQYB3lOWnYAvg7cD8y9SrJB/0QU4YHCDudbYPyZVgrgKOV5V1xEPA8Mn/sHqkPJbXpAvwBueun2qFNgWqMrqko2xkxdY7JqcBxyMvyaODjuN1pkvWRZeKOyc9dgA7I47k9cqdqmRxrAt8BS4FlwBJgAfAF8CXwCTA/+XcO8G2wT2FOJ+B04JfINDkmg5H+zDMprBHA/sjcPDbrIC9VZwN/BO4BXojUlx7IE2n75Oc+yJr0hsjgd8kyRASfAG8Ds4B3kJfLWcAix+2Z0B+505+BCD0LrAEcANxhUlgjgAOsuuOPdRFnibaEE8COwHbAQMQQawDhbgqtkKdKV2CHBn+bgywYPINMFZ9DniK++Q9k8GeN/XEsgLXwv4Rlw+n4tS7tBgwC9kQ26zb32FYaNk2OIcn/FyK76xOQfZW3PbV7ZlL39Z7qt2UIMmZrThdNBbA92XnEAcxElmOneah7E2TpdT/kiwy56uWKdsDQ5ACxvh0D1CFPC5fcgDxx7kZcGLNAR+TpXHNmYLoKNDBNbxwzHpmGuB78BwF3IeIanfw/j4O/MfZE7tIzEQcm14sZ05ABN85xvWkwGrN5E8BNyLvIQkf1bQKcg9im3A8cSXEGfWOsjfjSTgJeQnZOWzuqexHyxLnBUX1pcSqA/ik64oqRWGx1N0EX4EpgRvJvat/SHLI98qR7G1lRc2WfcwburDzTYDRmTQSwMbLEF5P/Ai51UE9b4Apk+fAc4q9ZZ4HuSJiRd7DzyGqMy5AFipj0BDaqVchEANsQxo6jKU4DrnVUz9vAuZQDvzG6Izvt/0AWANIyGjjFQT22tEIillTFRABbpO+LNachFyUN2wFTkLnppql7VHx2QBYabie9p9bNuJu22lBz7JoIoKeDjthwPukH/whkhWLP1L1pfhwPTEeCnqXhJuDC1L2xo+bYNRFAjLvm9chc3ZZuwKOIz2mJPZ2Q2Dt/Qmc10JBRwP866ZGOmm67JgLo7KAjGh5GdhhtORiJMrCXm+6UIBFAXiadafPZSBCEkNQcuyYC2MBBR0z5EBnAtpyL7Hau56Q3JfXpi+wdDEtRx0HABy46Y0hN6wUTAbRz0BFThgDLLc+9mXTTppLatEIclH5hef4ywsaCqjl2TQTgaqewFicC71qeew9imVgShquRDUQbZiBTqhDUHLsmAgixB3Af5gFRG/IAYfyUS1blHOxfbG9Drrlvao5dEwFUz6CRni+BYyzPHYs4XpfE4Szs4sMCHIs7m66mqDl2TQSwzEFHqnEMsNjivFuBQxz3pUTPz7Gz/VmE/Y3PlJpj10QANoPTlPHAQxbnXUiKgKglzrkE8dXWcj9+l0Zrjl0TAfhyrVsBnGBx3kG4MYwrccufsYjMBpzsuB/1+apWARMBfO6gI40xCnHw1tCNMC9PJXZMQKJeaJiDLimGhvm1CpgIYK6DjjTkC+A3FueNI92WfIlf1kcWJrRcjMHd2oKaY9dEAB+k78dqjEC/4TWKMmhuHtgb8d/QsAw/TjQf1ipgIoAZDjpSn7no3eb64j4ke4k//oA+e9C16KfEtag5dk0EMN1BR+rzW4tzTDNRlmQHm2tmu7vcFG/VKmAqgJovE4YsQG/jfyLl1CeP7Io+a8uNwNeO2p+HQTwkEwEsxV0IkpvQbay1RvxVS/LJDehyPCwhvRNUhZcxCIxlGhXiqXR9+R7t3P889MtqJdlhI/Rpr1yFVXnSpJCpAFzs1o0HZivKr4vY95fkm4vQhVz5EIlblBajMWsqgJdI/4aufbT9gnCm2DF4FvlObkJCCxaVtojRnIa0sUbnImO2JqYC+A5xhLBlPjqbnzWxd7rIOlOBnZGXxNOQqAkDgR8ioigi56KLoj2OdCY4f8fQilmTIcbWXh8kMKvGrPoYijn3fwbYhcaDtj6PiKKIIuiIhGQ05f9IZ/JiPFY1AngBScRgw9+U5dM4xWeVZZgtCx6KfxP0GGinQXdZtjMTeNG0sDZHmI0H0DwkPLcp2yLBrIpGHWbvUXNJN93MKjtjEKmtHo9jZ4ipGqNaAdyMPhXPI8g7hCnHKuvPC5o72t3eehEXzbVdDkxU1v8NcIvmBK0AlqBfp52gLH+4snweWIzuYk7CryNSLI5Qlh+vLH89MkaNsckUPwrZHTblcUXZnRGb/6IxEbk7mfI1+rtfHuiB5Fkz5TFF2W+xsDOzEcACzD2yXgM+UtRdVB9fGxt5m3PygOYaf4SBQVvCJVgsndoIAOAqzPKwPq2s10VY7qyxHDu/53HYBwnLMtprbGKGMw9LS1JbASzDzAl6qqLOTZEVoKIxBbvVjPnJuUVjeyQ1lSkm+yLHYXmzsBUASBDbWnc2o+3ohN1T9CXLpFnSLOJyKOiu9Ss1/v4QMhatSCMAgJ/StC/nZ0jaHVN+mLIvWeWBSOdmGc21nk7TT9CvkDFoTVoBLKDp3c3XkS1tU3ZK2Zcs8izp8vLOoZimEZprvQxZTGmMQ0kZtietAEAykTcWlVnjStmWYmZqdBHCpYhhYPoi5u6mvNHI765Axl4qXAgAJJ1Rw8e16fIVQB/ChmEPRV1G6sga7YGtFOUbujY+hIy51LgSAEhii/qDXvME0NiI5IVXsTcerM+spK6iobnmbzX4+SBXnXApAIAfsXJOVtMhuR59HPcjC7icuhRxGrSlomxlLC0E9sBhxHLXAvgcyc31FDqjuZipWH3hcgmziMuhGgEsQhYD9sJsA9YYH2EGpyEqXUtxTtGeAO/Q+IubLW8kdWoGTdbRfJYlyOxCY1VshOsnQIUVmBvMbUC8XMS+8HHHrvNQZ0x6YpDELmEpHgY/+BOAhi2AdWJ3wjH3e6izaNOgNmRg6psVARSJ2ehsoEx5Hl1YmTwQ/dpnQQBFWwKt81i3jydLTKJf+ywIoGgvwD7t+Iu2HBr92mdBAEV6AZ6HYUi+hKPQhQt5EneBirNA9GsfWwBtycCX4JAH0K1WnA6coSj/HcWaBvVEZxPknNgC2IzIX4BjNCs1LRCz4J3RRU0rkqtkW2QMRCO2ADaP3L5LvkIX1HUXJHR4y+RnUybjJ59WLKLOAGILoEjTn4fRRcsYXu9njaP4UvThQrJM1JtgbAH0jty+S+qU5etbNB6sPLdIm2K9YjYeWwBFmQItQZdDoT+rir83uoAA41EGgMowzVoAPSK374pJ6FzzGnMj1UyDtO8bWaZHzMZjCqAz0DVi+y7Rrsw0NtiHN/I7l21mla5Ap1iNxxRAF4phBLcCXeCrXjSe9bIfuneih/BkIRmYNshYiEJMAWgTKWeVKeicNKrlCNBMg+YBTyjKZ5lo8WBjCqB7xLZdop2KVJvqaKdBRbENijYWyidAejSmCd2oHhNHGx27TlE2y5QCyClT0UW/Nlnv1+wJzMGP70FoyilQTnGx+mNTpj5F2BRrlk8ATYTgrKKZ/nREggXUYg90y4J1irJZpdmtAnUi4tqvI14HZijKH4wYvtWiJbrATzOSvuSZTkhwhODEEsDG5N8M2sf0x6Ys5H8a1BYZE8GJJYANI7XrEs2gawsMUZQfkpxjShF2hTeK0WgsAUSb8zlCG6/zAGBtRfm1k3NMcRWHNCZR3gljCWDTSO26wuXml6tz8v4UiGIXFksAeV8B0gy21uju5hUOSM41Je8CaFZPgM6R2nXBR8BzivKDsct90C4515Tn0G3KZY0oYyLmMmgovkAiCz+N5C1LizYqQ5rcx9pzXUSM+BT5rp5FvrtQRFkWjyWAjgHaWAiciZgY74pEF+4FnAx8kqJezerPGsDQFG0NRXeN0iyHfgL8J/J9/Qj5znojoVtCOOGHGBOrEUMAa+Bf7fOB7YDrWTWQ1FfArYjt/fsW9c4DHleU35N0S74bJnWY8gR28fM/QFwyb2HVwT4fGI3k9vUdkKsTEcZjDAG0x78ADgNmVvn7Z8CBFvU+hC7zZZrpj00dtlnpf0z1p+JM5Dv1SSd0ex9OiCGADvjdBX4Gs7v0m+jnzNopxjBleRd1aPtYh1lCw8fxm7K1LTI2ghJDAOt5rl9zB3xQUfYbYKKi/E64Wdvuii6v7kR06ak034HN00VDB8/1r0asJ4BPmsoqnrasNhRJNddHLZpNsSXAOEV5zUqP7/eADp7rX40iCkDjXKEp69P4rRbaXWHNNEjzHfh2Yurguf7VKKIANC9rRxiWW4rurtow8FVaetN4JImmGId5mEbT7wD8vwh38Fz/asQQgO+M8H2Q9exaHAwMNKzzUXRr4cMUZU3RBs561LDsQMzcME/Bf5ZK32NjNWIIIMRS1x+pPm0YBNyrqC/G6k/aOjV9HoPk4K3W9k3K9m1oFsugoVR+H3AbsBuy8tQOibpwHfAY0Mqwnu/QrZT0RDbhXLMdumjaD2IeOGtN5IlxLfIdtUOmI7sBtxPO4Sb4E8BHouxahFT5CckxDxkMNruyT6EznXD58tuQ4cDVhmU/Qfpu4odc4czk+JQwO/YNKZ8AnuiEvUmC9u5nY/vvq27bO/eGxDFOaxbvADEEkAbNINoE8xdrG3ZBZzefN1/hZvEECP4hU/AS8E9F+WGe+mHbxj+Bf3jqhw+axRMgTwLQxt70Of2xbSNPnmLN4gnQJkKbtmgGT0dkedU3g9DZzudJAMFD5ZQCaJo3gHcU5YdiFvgqLS0R82VT3kE+Sx4IPjZCC2At8iOAOmX5YR760BTapdY6H53wQBtkjAQjtADakJ+sMJoVlHWBfXx1pBH2QTddyMs0qA2Bb5ChBbAO+QiJ+B4wTVF+f8JeuDboQq28THUPuaywLoFvkDEEkIcnwARleZ+7v67a1H6mGAS/QYYWQGugReA2bdDc/dciXeQHW36MuT0T6D5TTIIuhYYWQPvA7dkyR1F2KHE+V3t0jv2azxSTDiEbCy2ADoHbs0XjU7u3t164bfsbb71wi2+f8VUILYCgHy4FmkjOY7z1wm3bmjijMQmaKCO0AKJkAbFAk6xhCrAD8IqfrjTKq0ikiCmKc/ISkDioFWpoAeQlLVJ/ZflpSPS0i5DM8T65FHGOeVF5nsanOCaFfgJEif9owX4W56wALgG2QUIMuuZ2YGtgJHYis/lMMSj0EyBKGhwL+mF/x5yOOOVvjXhvacypG/IR8HugL3BiUrcN/ZM68kDQMRLaJTJPqZFGAoenOH868Cvg14hb4r7AAGT6sgGr74esQAJ1vYy8T0wAngS+TdGHCiMd1BGKoPnjQgsgSiZASw5DHMSfT1nPMmBycoCYMWyI3Awqu57fAB8jvriaJVgTdsZtlDrfBB0jIQWwHvmZAlUYi0RiMA0yZcIiJBz5Bw7rbIrW5McQrsJGyZEmh4MxId8BfkB+9gEqdEFCqMRKJJKGFkjf8zTtBBFtsIR5IS9sXjNDDkTyb+VlCRck3udUxIk+jwQTbUgB9AjYlmt2Ql5Od4/dEQOOAF5DF1I9a/gOwvs9IQXQJ2BbPuiKpCC6JHZHmqANEhLybvJjc9UUm4dqKKQAXEZLjskIxBRB45frmyORLC8mQYHzgO8gvN9TCsCO/ki2lLFI/MxY7A08DNwFdI/YD9cEGyuhBNAZXWDXvHAIEn9zLLqk1mkZjAS/nYy4YxaNngRadAglgL6ECRkSi0OAScDrwAXojelM6AOcg0R6m0QcL7RQtERMSbwTaiMsyIfJAH2By5LjJSSz4vPIO8P7yK6wKZshhnUDkVzBeV3StGUbxBTEK6EEkBdTXJfskBwV3k+OTxAjt6+BxUje4dZIXMyNkTXwbsBWITubQYKMmVAC2CZQO1lms+QoMSPIrCHEO0BrirUCVBKGLQjgxhlCAJuSPyO4kvhsQgDzmVACKCmxwbsfcwgB5MkHoCRbFOIJkDcT6JLs0MF3AyEEkJdw6CXZw3sc2RDLoHl0JqnGt8C7yc9tkDX7GOlmAZYDs1npRtmbwPH1PeM9jmyIC7c8QBshWIKYOdwHfJj8rgUrd2wHI0kyfNuyz0ZsjyYjFqDvszJMSg8kh9hl5CMKdy28j50QAshLTMpqzAd2ZfWUSSuAWcnxIPBL4GREKK5f4D4GRgF/oulIER8Av0MsVZ8hX15sjfG17wZCTE/mB2jDN8Mwyxe2DLgRMVy72WH7Nyd1jsYsTMoMwmSs9I33sRNCAB8FaMMnjwFPK8/5GjgFOMtB+2cmdS1UnvcUutihWcR7SPcQAvgQmT/nlTRhRa5DpkS2nARcn+L8vIVEqc9iAoSOCSGAeaxcNckjn6Y8/1bgcovzRgG3pWw7SGwdT7xLQaZAILbxecXFdvwFSKQGU14FLnTQbt5iAtUnyJgJJYDHArXjgzTxQetzrKLsMY7aPMxRPTEI8v4SSgCPAN8Fass1uyGBbdPyKmaZGicgrpVp2Y+4DvtpWIGMGe+EEsBn5PspMAbY0UE91xmUudZBOzsC9zqoJxaTkDHjnZBmCjcEbMs1bZGMLBeTLs7+ZGBBlb9/ycoo0jb0Rfr4IoHTjTrmxlANhRRAHflJ1dkUFyHTk5nIS6027v5SJGZnU0xFnw9gZNKXmUnfLlKenzU+QsZKEEIbcf0GtzuksajEOOqHOK8fpTj3DZp+p3hT2Y+7kVigRSJo6MnQlpq3IMZcReJIJEGeKf+y/FtDtqd4g382fvKrNUkMU+WTIrTpG00Ik2rGgRrDwSKGTTkxdIMxBDAJeXQXifUVZau5iGryY+Ul57Ipd5NuAcCKWM4qxyDmvUVBY3lZraxm46oI1p4V/oW7zT8VsQSwnGyFF0/LIMyC4/6E6hHP+iVlajEECZdYFA4gkuNUTHfFV3BnZpAF7mPVUIgNGQTcYVDPHcBeVf6+HbIxVxSOQMZCFGL7644BTo/cB1e0RyI3X8Sqm2UDgKuQnXCTCNktgUeTcwbU+33fpO6XkraKwOnA32J2IJYzd31GI0I0MRPIAxcnx3vI57LNi/Cr5JiF2FH1ctC3LHEWcu2jkgUBgDh9LMBsipAXXA3YIiYWOY6MXOvYU6D6/AV5sSuCD3FJ43yOvN9kYvBDtgQAkoVxAJJYoqRYTAG2JWN+ylkTAIgx1CDEi6qkGIxE7vyZC5CQRQFUuBxJkhDEMaLEC5ORvY1LY3ekKbIsAIDpSBbEY8m3Y31zYxbyojsEsX7NLFkXQIW/IOEHz6FYJhRF41PgfORaZeZFtxp5EQBI1LX/QVLnnEcG55PNmNnACOTaXEGO4kDlSQAVvgGuRL7sE6juYVXilxeRwF9bIgF5q7l7ZpI8CqDCYuDPSP7cwcCd6PLwltixAjFf2AfYCQn8tThqj1KQZwHU51HgaGBzZPk00y9eOeVt5LvthRiwTYrbHTcURQAVZiPLp/0QE9t7WBk7v8SOe4ADEQ+0y5EVnsJQNAHUZzzir9sH+GvkvuSRO5FBfySSb6CQFFkAFWYAPwX2Rhefs7nyFrJ+fzQy7Sk0zUEAFR5DbFEui92RDFOZPgb3zY1FcxJAhRHI6kW5fLqSF5HVtAvIbwxXK5qjAGDlBT+PAHmoMsxi4Fya8Q2huQqgwpWIq+GdsTsSgXuQz35V7I7EpLkLACSF09HIxs6zkfsSgueQ0OlHUrAlTRtKAaxkEpIK9RBkkBSN55DPNhCzPAXNglIAq1OHDJL9kVAneTavWIF8hqHIZ6qL2psMkhWn+CzySHL0RKYLh+AmSUYIXkESZNxL6UdRlVIAtZmFrI9fjkRkHoTMoXcB1o3Yr/p8A7wATEyOaXG7kx9KAeiYlhzXIEFu+yFC2AqJ2NYNaOO5D4sQX4g3kTv9VGSHe67ndgtJKQB75iZHfavITZEpU+XfLkBHoDPQDono1hZohUSAWwtogWSFWZYcixC7+oVIjuV5iBfcLCTDTuXfEgf8P/lHHmi8B/19AAAAAElFTkSuQmCC';
|
|
806
806
|
const ICON_TYPE = 'image/x-icon';
|
|
807
807
|
|
|
808
808
|
export { appError, clearAppErrorModal, emitBuildLog, emitBuildResults, emitBuildStatus, hmrWindow, initBuildProgress, initBuildStatus, logBuild, logDiagnostic, logDisabled, logReload, logWarn, onBuildLog, onBuildResults, onBuildStatus };
|