@jsenv/core 27.0.0-alpha.64 → 27.0.0-alpha.67
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/dist/babel_helpers/AsyncGenerator/AsyncGenerator.js +95 -0
- package/dist/babel_helpers/AwaitValue/AwaitValue.js +3 -0
- package/dist/babel_helpers/applyDecoratorDescriptor/applyDecoratorDescriptor.js +29 -0
- package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +9 -0
- package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +4 -0
- package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +5 -0
- package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +8 -0
- package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +52 -0
- package/dist/babel_helpers/asyncIterator/asyncIterator.js +78 -0
- package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +39 -0
- package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +4 -0
- package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +24 -0
- package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +7 -0
- package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +14 -0
- package/dist/babel_helpers/classCallCheck/classCallCheck.js +5 -0
- package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -0
- package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -0
- package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +8 -0
- package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +4 -0
- package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +6 -0
- package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +6 -0
- package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +7 -0
- package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -0
- package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +7 -0
- package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +7 -0
- package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +3 -0
- package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +8 -0
- package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +9 -0
- package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +5 -0
- package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -0
- package/dist/babel_helpers/construct/construct.js +15 -0
- package/dist/babel_helpers/createClass/createClass.js +18 -0
- package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +63 -0
- package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +22 -0
- package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +50 -0
- package/dist/babel_helpers/createSuper/createSuper.js +22 -0
- package/dist/babel_helpers/decorate/decorate.js +622 -0
- package/dist/babel_helpers/defaults/defaults.js +14 -0
- package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +26 -0
- package/dist/babel_helpers/defineProperty/defineProperty.js +19 -0
- package/dist/babel_helpers/extends/extends.js +16 -0
- package/dist/babel_helpers/get/get.js +21 -0
- package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +2 -0
- package/dist/babel_helpers/inherits/inherits.js +21 -0
- package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +6 -0
- package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +10 -0
- package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +3 -0
- package/dist/babel_helpers/instanceof/instanceof.js +7 -0
- package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +5 -0
- package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +49 -0
- package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +4 -0
- package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -0
- package/dist/babel_helpers/iterableToArray/iterableToArray.js +3 -0
- package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +38 -0
- package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +13 -0
- package/dist/babel_helpers/jsx/jsx.js +49 -0
- package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +10 -0
- package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +5 -0
- package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +3 -0
- package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +3 -0
- package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -0
- package/dist/babel_helpers/objectSpread/objectSpread.js +22 -0
- package/dist/babel_helpers/objectSpread2/objectSpread2.js +41 -0
- package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +20 -0
- package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +15 -0
- package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +10 -0
- package/dist/babel_helpers/readOnlyError/readOnlyError.js +4 -0
- package/dist/babel_helpers/readme.md +8 -0
- package/dist/babel_helpers/set/set.js +51 -0
- package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +5 -0
- package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -0
- package/dist/babel_helpers/slicedToArray/slicedToArray.js +5 -0
- package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +7 -0
- package/dist/babel_helpers/superPropBase/superPropBase.js +10 -0
- package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +11 -0
- package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +8 -0
- package/dist/babel_helpers/tdz/tdz.js +4 -0
- package/dist/babel_helpers/temporalRef/temporalRef.js +5 -0
- package/dist/babel_helpers/temporalUndefined/temporalUndefined.js +3 -0
- package/dist/babel_helpers/toArray/toArray.js +5 -0
- package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +5 -0
- package/dist/babel_helpers/toPrimitive/toPrimitive.js +14 -0
- package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +5 -0
- package/dist/babel_helpers/typeof/typeof.js +7 -0
- package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +10 -0
- package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +7 -0
- package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +35 -0
- package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +67 -0
- package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +4 -0
- package/dist/html/explorer.html +557 -0
- package/dist/js/controllable_file.mjs +227 -0
- package/dist/{event_source_client.js → js/event_source_client.js} +19 -244
- package/dist/js/global_this.js +32 -0
- package/dist/js/html_supervisor_installer.js +522 -0
- package/dist/js/html_supervisor_setup.js +79 -0
- package/dist/{import_meta_hot.js → js/import_meta_hot.js} +1 -3
- package/dist/js/inline_content.js +8 -0
- package/dist/js/new_stylesheet.js +409 -0
- package/dist/js/regenerator_runtime.js +721 -0
- package/dist/js/s.js +429 -0
- package/dist/main.js +13450 -0
- package/dist/other/jsenv.png +0 -0
- package/dist/s.js.map +59 -62
- package/package.json +16 -12
- package/src/build/build.js +169 -68
- package/src/build/build_urls_generator.js +18 -2
- package/src/build/inject_service_worker_urls.js +1 -1
- package/src/build/resync_ressource_hints.js +56 -9
- package/src/dev/plugins/explorer/client/explorer.html +1 -1
- package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +1 -1
- package/src/dev/start_dev_server.js +17 -3
- package/src/execute/execute.js +3 -0
- package/src/omega/errors.js +12 -9
- package/src/omega/kitchen.js +252 -217
- package/src/omega/server/file_service.js +1 -1
- package/src/omega/url_graph/url_graph_report.js +2 -2
- package/src/omega/url_graph/url_info_transformations.js +10 -5
- package/src/omega/url_graph.js +3 -2
- package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +5 -10
- package/src/plugins/autoreload/jsenv_plugin_autoreload.js +1 -3
- package/src/plugins/bundling/js_module/bundle_js_module.js +66 -24
- package/src/plugins/file_urls/jsenv_plugin_file_urls.js +185 -53
- package/src/plugins/html_supervisor/jsenv_plugin_html_supervisor.js +9 -13
- package/src/plugins/http_urls/jsenv_plugin_http_urls.js +6 -6
- package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +5 -10
- package/src/plugins/inline/jsenv_plugin_js_inline_content.js +2 -2
- package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +12 -2
- package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +12 -0
- package/src/plugins/plugin_controller.js +17 -3
- package/src/plugins/plugins.js +16 -19
- package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +17 -19
- package/src/plugins/transpilation/as_js_classic/{jsenv_plugin_script_type_module_as_classic.js → jsenv_plugin_as_js_classic_html.js} +0 -0
- package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +9 -4
- package/src/plugins/transpilation/jsenv_plugin_transpilation.js +1 -2
- package/src/plugins/url_analysis/css/css_urls.js +1 -1
- package/src/plugins/url_analysis/html/html_urls.js +4 -1
- package/src/plugins/url_analysis/js/js_urls.js +3 -2
- package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +94 -1
- package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +3 -0
- package/src/plugins/url_resolution/jsenv_plugin_url_resolution.js +0 -3
- package/src/test/execute_plan.js +3 -1
- package/dist/event_source_client.js.map +0 -188
- package/dist/html_supervisor_installer.js +0 -1236
- package/dist/html_supervisor_installer.js.map +0 -337
- package/dist/html_supervisor_setup.js +0 -95
- package/dist/html_supervisor_setup.js.map +0 -57
- package/dist/import_meta_hot.js.map +0 -42
- package/src/jsenv_root_directory_url.js +0 -1
- package/src/omega/compat/default_runtime_compat.js +0 -11
- package/src/plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -61
- package/src/plugins/transpilation/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { uneval } from "@jsenv/uneval";
|
|
2
|
+
|
|
3
|
+
const unevalException = value => {
|
|
4
|
+
if (value && value.hasOwnProperty("toString")) {
|
|
5
|
+
delete value.toString;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
return uneval(value, {
|
|
9
|
+
ignoreSymbols: true
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const displayErrorInDocument = error => {
|
|
14
|
+
const title = "An error occured";
|
|
15
|
+
let theme = error && error.cause && error.cause.code === "PARSE_ERROR" ? "light" : "dark";
|
|
16
|
+
let message = errorToHTML(error);
|
|
17
|
+
const css = `
|
|
18
|
+
.jsenv-console {
|
|
19
|
+
background: rgba(0, 0, 0, 0.95);
|
|
20
|
+
position: absolute;
|
|
21
|
+
top: 0;
|
|
22
|
+
left: 0;
|
|
23
|
+
width: 100%;
|
|
24
|
+
height: 100%;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
align-items: center;
|
|
28
|
+
z-index: 1000;
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
padding: 1em;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.jsenv-console h1 {
|
|
34
|
+
color: red;
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#button-close-jsenv-console {
|
|
40
|
+
margin-left: 10px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.jsenv-console pre {
|
|
44
|
+
overflow: auto;
|
|
45
|
+
max-width: 70em;
|
|
46
|
+
/* avoid scrollbar to hide the text behind it */
|
|
47
|
+
padding: 20px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.jsenv-console pre[data-theme="dark"] {
|
|
51
|
+
background: #111;
|
|
52
|
+
border: 1px solid #333;
|
|
53
|
+
color: #eee;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.jsenv-console pre[data-theme="light"] {
|
|
57
|
+
background: #1E1E1E;
|
|
58
|
+
border: 1px solid white;
|
|
59
|
+
color: #EEEEEE;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.jsenv-console pre a {
|
|
63
|
+
color: inherit;
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
const html = `
|
|
67
|
+
<style type="text/css">${css}></style>
|
|
68
|
+
<div class="jsenv-console">
|
|
69
|
+
<h1>${title} <button id="button-close-jsenv-console">X</button></h1>
|
|
70
|
+
<pre data-theme="${theme}">${message}</pre>
|
|
71
|
+
</div>
|
|
72
|
+
`;
|
|
73
|
+
const removeJsenvConsole = appendHMTLInside(html, document.body);
|
|
74
|
+
|
|
75
|
+
document.querySelector("#button-close-jsenv-console").onclick = () => {
|
|
76
|
+
removeJsenvConsole();
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const escapeHtml = string => {
|
|
81
|
+
return string.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const errorToHTML = error => {
|
|
85
|
+
let html;
|
|
86
|
+
|
|
87
|
+
if (error && error instanceof Error) {
|
|
88
|
+
if (error.cause && error.cause.code === "PARSE_ERROR") {
|
|
89
|
+
html = error.messageHTML || escapeHtml(error.message);
|
|
90
|
+
} // stackTrace formatted by V8
|
|
91
|
+
else if (Error.captureStackTrace) {
|
|
92
|
+
html = escapeHtml(error.stack);
|
|
93
|
+
} else {
|
|
94
|
+
// other stack trace such as firefox do not contain error.message
|
|
95
|
+
html = escapeHtml(`${error.message}
|
|
96
|
+
${error.stack}`);
|
|
97
|
+
}
|
|
98
|
+
} else if (typeof error === "string") {
|
|
99
|
+
html = error;
|
|
100
|
+
} else if (error === undefined) {
|
|
101
|
+
html = "undefined";
|
|
102
|
+
} else {
|
|
103
|
+
html = JSON.stringify(error);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const htmlWithCorrectLineBreaks = html.replace(/\n/g, "\n");
|
|
107
|
+
const htmlWithLinks = stringToStringWithLink(htmlWithCorrectLineBreaks, {
|
|
108
|
+
transform: url => {
|
|
109
|
+
return {
|
|
110
|
+
href: url,
|
|
111
|
+
text: url
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return htmlWithLinks;
|
|
116
|
+
}; // `Error: yo
|
|
117
|
+
// at Object.execute (http://127.0.0.1:57300/build/src/__test__/file-throw.js:9:13)
|
|
118
|
+
// at doExec (http://127.0.0.1:3000/src/__test__/file-throw.js:452:38)
|
|
119
|
+
// at postOrderExec (http://127.0.0.1:3000/src/__test__/file-throw.js:448:16)
|
|
120
|
+
// at http://127.0.0.1:3000/src/__test__/file-throw.js:399:18`.replace(/(?:https?|ftp|file):\/\/(.*+)$/gm, (...args) => {
|
|
121
|
+
// debugger
|
|
122
|
+
// })
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
const stringToStringWithLink = (source, {
|
|
126
|
+
transform = url => {
|
|
127
|
+
return {
|
|
128
|
+
href: url,
|
|
129
|
+
text: url
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
} = {}) => {
|
|
133
|
+
return source.replace(/(?:https?|ftp|file):\/\/\S+/gm, match => {
|
|
134
|
+
let linkHTML = "";
|
|
135
|
+
const lastChar = match[match.length - 1]; // hotfix because our url regex sucks a bit
|
|
136
|
+
|
|
137
|
+
const endsWithSeparationChar = lastChar === ")" || lastChar === ":";
|
|
138
|
+
|
|
139
|
+
if (endsWithSeparationChar) {
|
|
140
|
+
match = match.slice(0, -1);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const lineAndColumnPattern = /:([0-9]+):([0-9]+)$/;
|
|
144
|
+
const lineAndColumMatch = match.match(lineAndColumnPattern);
|
|
145
|
+
|
|
146
|
+
if (lineAndColumMatch) {
|
|
147
|
+
const lineAndColumnString = lineAndColumMatch[0];
|
|
148
|
+
const lineNumber = lineAndColumMatch[1];
|
|
149
|
+
const columnNumber = lineAndColumMatch[2];
|
|
150
|
+
const url = match.slice(0, -lineAndColumnString.length);
|
|
151
|
+
const {
|
|
152
|
+
href,
|
|
153
|
+
text
|
|
154
|
+
} = transform(url);
|
|
155
|
+
linkHTML = link({
|
|
156
|
+
href,
|
|
157
|
+
text: `${text}:${lineNumber}:${columnNumber}`
|
|
158
|
+
});
|
|
159
|
+
} else {
|
|
160
|
+
const linePattern = /:([0-9]+)$/;
|
|
161
|
+
const lineMatch = match.match(linePattern);
|
|
162
|
+
|
|
163
|
+
if (lineMatch) {
|
|
164
|
+
const lineString = lineMatch[0];
|
|
165
|
+
const lineNumber = lineMatch[1];
|
|
166
|
+
const url = match.slice(0, -lineString.length);
|
|
167
|
+
const {
|
|
168
|
+
href,
|
|
169
|
+
text
|
|
170
|
+
} = transform(url);
|
|
171
|
+
linkHTML = link({
|
|
172
|
+
href,
|
|
173
|
+
text: `${text}:${lineNumber}`
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
const url = match;
|
|
177
|
+
const {
|
|
178
|
+
href,
|
|
179
|
+
text
|
|
180
|
+
} = transform(url);
|
|
181
|
+
linkHTML = link({
|
|
182
|
+
href,
|
|
183
|
+
text
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (endsWithSeparationChar) {
|
|
189
|
+
return `${linkHTML}${lastChar}`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return linkHTML;
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const link = ({
|
|
197
|
+
href,
|
|
198
|
+
text = href
|
|
199
|
+
}) => `<a href="${href}">${text}</a>`;
|
|
200
|
+
|
|
201
|
+
const appendHMTLInside = (html, parentNode) => {
|
|
202
|
+
const temoraryParent = document.createElement("div");
|
|
203
|
+
temoraryParent.innerHTML = html;
|
|
204
|
+
return transferChildren(temoraryParent, parentNode);
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const transferChildren = (fromNode, toNode) => {
|
|
208
|
+
const childNodes = [].slice.call(fromNode.childNodes, 0);
|
|
209
|
+
let i = 0;
|
|
210
|
+
|
|
211
|
+
while (i < childNodes.length) {
|
|
212
|
+
toNode.appendChild(childNodes[i]);
|
|
213
|
+
i++;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return () => {
|
|
217
|
+
let c = 0;
|
|
218
|
+
|
|
219
|
+
while (c < childNodes.length) {
|
|
220
|
+
fromNode.appendChild(childNodes[c]);
|
|
221
|
+
c++;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const {
|
|
227
|
+
Notification
|
|
228
|
+
} = window;
|
|
229
|
+
|
|
230
|
+
const displayErrorNotificationNotAvailable = () => {};
|
|
231
|
+
|
|
232
|
+
const displayErrorNotificationImplementation = (error, {
|
|
233
|
+
icon
|
|
234
|
+
} = {}) => {
|
|
235
|
+
if (Notification.permission === "granted") {
|
|
236
|
+
const notification = new Notification("An error occured", {
|
|
237
|
+
lang: "en",
|
|
238
|
+
body: error ? error.stack : "undefined",
|
|
239
|
+
icon
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
notification.onclick = () => {
|
|
243
|
+
window.focus();
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
const displayErrorNotification = typeof Notification === "function" ? displayErrorNotificationImplementation : displayErrorNotificationNotAvailable;
|
|
249
|
+
|
|
250
|
+
const {
|
|
251
|
+
__html_supervisor__
|
|
252
|
+
} = window;
|
|
253
|
+
const installHtmlSupervisor = ({
|
|
254
|
+
logs,
|
|
255
|
+
measurePerf
|
|
256
|
+
}) => {
|
|
257
|
+
|
|
258
|
+
const scriptExecutionResults = {};
|
|
259
|
+
let collectCalled = false;
|
|
260
|
+
let pendingExecutionCount = 0;
|
|
261
|
+
let resolveScriptExecutionsPromise;
|
|
262
|
+
const scriptExecutionsPromise = new Promise(resolve => {
|
|
263
|
+
resolveScriptExecutionsPromise = resolve;
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
const onExecutionStart = name => {
|
|
267
|
+
scriptExecutionResults[name] = null; // ensure execution order is reflected into the object
|
|
268
|
+
|
|
269
|
+
pendingExecutionCount++;
|
|
270
|
+
|
|
271
|
+
if (measurePerf) {
|
|
272
|
+
performance.mark(`execution_start`);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
const onExecutionSettled = (name, executionResult) => {
|
|
277
|
+
if (measurePerf) {
|
|
278
|
+
performance.measure(`execution`, `execution_start`);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
scriptExecutionResults[name] = executionResult;
|
|
282
|
+
pendingExecutionCount--;
|
|
283
|
+
|
|
284
|
+
if (pendingExecutionCount === 0 && collectCalled) {
|
|
285
|
+
resolveScriptExecutionsPromise();
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const onExecutionError = (executionResult, {
|
|
290
|
+
currentScript,
|
|
291
|
+
errorExposureInNotification = false,
|
|
292
|
+
errorExposureInDocument = true
|
|
293
|
+
}) => {
|
|
294
|
+
const error = executionResult.error;
|
|
295
|
+
|
|
296
|
+
if (error && error.code === "NETWORK_FAILURE") {
|
|
297
|
+
if (currentScript) {
|
|
298
|
+
const errorEvent = new Event("error");
|
|
299
|
+
currentScript.dispatchEvent(errorEvent);
|
|
300
|
+
}
|
|
301
|
+
} else if (typeof error === "object") {
|
|
302
|
+
const globalErrorEvent = new Event("error");
|
|
303
|
+
globalErrorEvent.filename = error.filename;
|
|
304
|
+
globalErrorEvent.lineno = error.line || error.lineno;
|
|
305
|
+
globalErrorEvent.colno = error.column || error.columnno;
|
|
306
|
+
globalErrorEvent.message = error.message;
|
|
307
|
+
window.dispatchEvent(globalErrorEvent);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (errorExposureInNotification) {
|
|
311
|
+
displayErrorNotification(error);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (errorExposureInDocument) {
|
|
315
|
+
displayErrorInDocument(error);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
executionResult.exceptionSource = unevalException(error);
|
|
319
|
+
delete executionResult.error;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
const getNavigationStartTime = () => {
|
|
323
|
+
try {
|
|
324
|
+
return window.performance.timing.navigationStart;
|
|
325
|
+
} catch (e) {
|
|
326
|
+
return Date.now();
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
const performExecution = async ({
|
|
331
|
+
src,
|
|
332
|
+
type,
|
|
333
|
+
currentScript,
|
|
334
|
+
execute // https://developer.mozilla.org/en-US/docs/web/html/element/script
|
|
335
|
+
|
|
336
|
+
}) => {
|
|
337
|
+
if (logs) {
|
|
338
|
+
console.group(`[jsenv] loading ${type} ${src}`);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
onExecutionStart(src);
|
|
342
|
+
let completed;
|
|
343
|
+
let result;
|
|
344
|
+
let error;
|
|
345
|
+
|
|
346
|
+
try {
|
|
347
|
+
result = await execute();
|
|
348
|
+
completed = true;
|
|
349
|
+
} catch (e) {
|
|
350
|
+
completed = false;
|
|
351
|
+
error = e;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (completed) {
|
|
355
|
+
const executionResult = {
|
|
356
|
+
status: "completed",
|
|
357
|
+
namespace: result,
|
|
358
|
+
coverage: window.__coverage__
|
|
359
|
+
};
|
|
360
|
+
onExecutionSettled(src, executionResult);
|
|
361
|
+
|
|
362
|
+
if (logs) {
|
|
363
|
+
console.log(`${type} load ended`);
|
|
364
|
+
console.groupEnd();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const executionResult = {
|
|
371
|
+
status: "errored",
|
|
372
|
+
coverage: window.__coverage__
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
if (error.name === "SyntaxError") ;
|
|
376
|
+
|
|
377
|
+
executionResult.error = error;
|
|
378
|
+
onExecutionSettled(src, executionResult);
|
|
379
|
+
onExecutionError(executionResult, {
|
|
380
|
+
currentScript
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
{
|
|
384
|
+
if (typeof window.reportError === "function") {
|
|
385
|
+
window.reportError(error);
|
|
386
|
+
} else {
|
|
387
|
+
console.error(error);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (logs) {
|
|
392
|
+
console.groupEnd();
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
const queue = [];
|
|
397
|
+
let previousDonePromise = null;
|
|
398
|
+
|
|
399
|
+
const dequeue = () => {
|
|
400
|
+
const next = queue.shift();
|
|
401
|
+
|
|
402
|
+
if (next) {
|
|
403
|
+
__html_supervisor__.addScriptToExecute(next);
|
|
404
|
+
} else {
|
|
405
|
+
const nextDefered = deferQueue.shift();
|
|
406
|
+
|
|
407
|
+
if (nextDefered) {
|
|
408
|
+
__html_supervisor__.addScriptToExecute(nextDefered);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const deferQueue = [];
|
|
414
|
+
let previousDeferDonePromise = null;
|
|
415
|
+
|
|
416
|
+
__html_supervisor__.addScriptToExecute = async scriptToExecute => {
|
|
417
|
+
if (scriptToExecute.async) {
|
|
418
|
+
performExecution(scriptToExecute);
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const useDeferQueue = scriptToExecute.defer || scriptToExecute.type === "js_module";
|
|
423
|
+
|
|
424
|
+
if (useDeferQueue) {
|
|
425
|
+
if (document.readyState !== "interactive") {
|
|
426
|
+
deferQueue.push(scriptToExecute);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (previousDonePromise) {
|
|
431
|
+
// defer must wait for the regular script to be done
|
|
432
|
+
deferQueue.push(scriptToExecute);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
if (previousDeferDonePromise) {
|
|
437
|
+
deferQueue.push(scriptToExecute);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
previousDeferDonePromise = performExecution(scriptToExecute);
|
|
442
|
+
await previousDeferDonePromise;
|
|
443
|
+
previousDeferDonePromise = null;
|
|
444
|
+
dequeue();
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (previousDonePromise) {
|
|
449
|
+
queue.push(scriptToExecute);
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
previousDonePromise = performExecution(scriptToExecute);
|
|
454
|
+
await previousDonePromise;
|
|
455
|
+
previousDonePromise = null;
|
|
456
|
+
dequeue();
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
if (document.readyState !== "interactive" && document.readyState !== "complete") {
|
|
460
|
+
document.addEventListener("readystatechange", () => {
|
|
461
|
+
if (document.readyState === "interactive") {
|
|
462
|
+
const nextDefered = deferQueue.shift();
|
|
463
|
+
|
|
464
|
+
if (nextDefered) {
|
|
465
|
+
__html_supervisor__.addScriptToExecute(nextDefered);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
__html_supervisor__.collectScriptResults = async () => {
|
|
472
|
+
collectCalled = true;
|
|
473
|
+
|
|
474
|
+
if (pendingExecutionCount === 0) {
|
|
475
|
+
resolveScriptExecutionsPromise();
|
|
476
|
+
} else {
|
|
477
|
+
await scriptExecutionsPromise;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
let status = "completed";
|
|
481
|
+
let exceptionSource = "";
|
|
482
|
+
Object.keys(scriptExecutionResults).forEach(key => {
|
|
483
|
+
const scriptExecutionResult = scriptExecutionResults[key];
|
|
484
|
+
|
|
485
|
+
if (scriptExecutionResult.status === "errored") {
|
|
486
|
+
status = "errored";
|
|
487
|
+
exceptionSource = scriptExecutionResult.exceptionSource;
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
return {
|
|
491
|
+
status,
|
|
492
|
+
...(status === "errored" ? {
|
|
493
|
+
exceptionSource
|
|
494
|
+
} : {}),
|
|
495
|
+
startTime: getNavigationStartTime(),
|
|
496
|
+
endTime: Date.now(),
|
|
497
|
+
scriptExecutionResults
|
|
498
|
+
};
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
const {
|
|
502
|
+
scriptsToExecute
|
|
503
|
+
} = __html_supervisor__;
|
|
504
|
+
const copy = scriptsToExecute.slice();
|
|
505
|
+
scriptsToExecute.length = 0;
|
|
506
|
+
copy.forEach(scriptToExecute => {
|
|
507
|
+
__html_supervisor__.addScriptToExecute(scriptToExecute);
|
|
508
|
+
});
|
|
509
|
+
};
|
|
510
|
+
const superviseScriptTypeModule = ({
|
|
511
|
+
src,
|
|
512
|
+
isInline
|
|
513
|
+
}) => {
|
|
514
|
+
__html_supervisor__.addScriptToExecute({
|
|
515
|
+
src,
|
|
516
|
+
type: "js_module",
|
|
517
|
+
isInline,
|
|
518
|
+
execute: () => import(new URL(src, document.location.href).href)
|
|
519
|
+
});
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
export { installHtmlSupervisor, superviseScriptTypeModule };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
window.__html_supervisor__ = {
|
|
2
|
+
// "html_supervisor_installer.js" will implement
|
|
3
|
+
// - "addScriptToExecute"
|
|
4
|
+
// - "superviseScriptTypeModule"
|
|
5
|
+
// - "collectScriptResults"
|
|
6
|
+
// and take all executions in "scriptsToExecute" and implement their supervision
|
|
7
|
+
scriptsToExecute: [],
|
|
8
|
+
addScriptToExecute: (scriptToExecute) => {
|
|
9
|
+
window.__html_supervisor__.scriptsToExecute.push(scriptToExecute)
|
|
10
|
+
},
|
|
11
|
+
superviseScript: ({ src, isInline, crossorigin, integrity }) => {
|
|
12
|
+
window.__html_supervisor__.addScriptToExecute({
|
|
13
|
+
src,
|
|
14
|
+
type: "js_classic",
|
|
15
|
+
isInline,
|
|
16
|
+
currentScript: document.currentScript,
|
|
17
|
+
execute: () => {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const script = document.createElement("script")
|
|
20
|
+
if (crossorigin) {
|
|
21
|
+
script.crossorigin = crossorigin
|
|
22
|
+
}
|
|
23
|
+
if (integrity) {
|
|
24
|
+
script.integrity = integrity
|
|
25
|
+
}
|
|
26
|
+
script.src = src
|
|
27
|
+
const scriptUrl = new URL(src, window.location).href
|
|
28
|
+
let lastWindowErrorUrl
|
|
29
|
+
let lastWindowError
|
|
30
|
+
const windowErrorCallback = (e) => {
|
|
31
|
+
lastWindowErrorUrl = e.filename
|
|
32
|
+
lastWindowError = e.error
|
|
33
|
+
}
|
|
34
|
+
const cleanup = () => {
|
|
35
|
+
document.body.removeChild(script)
|
|
36
|
+
window.removeEventListener("error", windowErrorCallback)
|
|
37
|
+
}
|
|
38
|
+
window.addEventListener("error", windowErrorCallback)
|
|
39
|
+
script.addEventListener("error", () => {
|
|
40
|
+
cleanup()
|
|
41
|
+
reject(src)
|
|
42
|
+
})
|
|
43
|
+
script.addEventListener("load", () => {
|
|
44
|
+
cleanup()
|
|
45
|
+
if (lastWindowErrorUrl === scriptUrl) {
|
|
46
|
+
reject(lastWindowError)
|
|
47
|
+
} else {
|
|
48
|
+
resolve()
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
document.body.appendChild(script)
|
|
52
|
+
})
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
},
|
|
56
|
+
superviseScriptTypeModule: () => {
|
|
57
|
+
throw new Error("htmlSupervisor not installed")
|
|
58
|
+
},
|
|
59
|
+
getScriptExecutionResults: () => {
|
|
60
|
+
// wait for page to load before collecting script execution results
|
|
61
|
+
const htmlReadyPromise = new Promise((resolve) => {
|
|
62
|
+
if (document.readyState === "complete") {
|
|
63
|
+
resolve()
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
const loadCallback = () => {
|
|
67
|
+
window.removeEventListener("load", loadCallback)
|
|
68
|
+
resolve()
|
|
69
|
+
}
|
|
70
|
+
window.addEventListener("load", loadCallback)
|
|
71
|
+
})
|
|
72
|
+
return htmlReadyPromise.then(() => {
|
|
73
|
+
return window.__html_supervisor__.collectScriptResults()
|
|
74
|
+
})
|
|
75
|
+
},
|
|
76
|
+
collectScriptResults: () => {
|
|
77
|
+
throw new Error("htmlSupervisor not installed")
|
|
78
|
+
},
|
|
79
|
+
}
|
|
@@ -41,7 +41,7 @@ const createImportMetaHot = importMetaUrl => {
|
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
throw new Error(
|
|
44
|
+
throw new Error(`invalid call to import.meta.hot.accept(), received ${firstArg}`);
|
|
45
45
|
},
|
|
46
46
|
dispose: callback => {
|
|
47
47
|
addUrlMeta(url, {
|
|
@@ -82,5 +82,3 @@ const asUrlWithoutHmrQuery = url => {
|
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
export { createImportMetaHot, urlHotMetas };
|
|
85
|
-
|
|
86
|
-
//# sourceMappingURL=import_meta_hot.js.map
|