@jsenv/core 28.0.2 → 28.1.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.
Files changed (55) hide show
  1. package/dist/controllable_child_process.mjs +1 -2
  2. package/dist/controllable_worker_thread.mjs +1 -2
  3. package/dist/js/autoreload.js +25 -9
  4. package/dist/js/execute_using_dynamic_import.js +804 -1
  5. package/dist/js/script_type_module_supervisor.js +129 -0
  6. package/dist/js/supervisor.js +921 -0
  7. package/dist/main.js +432 -492
  8. package/package.json +13 -13
  9. package/readme.md +1 -1
  10. package/src/build/inject_global_version_mappings.js +3 -3
  11. package/src/dev/start_dev_server.js +2 -2
  12. package/src/execute/execute.js +1 -1
  13. package/src/execute/run.js +26 -38
  14. package/src/execute/runtimes/browsers/from_playwright.js +51 -77
  15. package/src/execute/runtimes/node/node_child_process.js +36 -36
  16. package/src/execute/runtimes/node/node_worker_thread.js +36 -36
  17. package/src/omega/kitchen.js +12 -9
  18. package/src/omega/omega_server.js +2 -2
  19. package/src/omega/server/file_service.js +2 -2
  20. package/src/omega/url_graph/url_info_transformations.js +8 -1
  21. package/src/plugins/autoreload/client/reload.js +20 -7
  22. package/src/plugins/autoreload/jsenv_plugin_autoreload_client.js +4 -4
  23. package/src/plugins/import_meta_hot/html_hot_dependencies.js +2 -2
  24. package/src/plugins/importmap/jsenv_plugin_importmap.js +5 -3
  25. package/src/plugins/inject_globals/inject_globals.js +3 -3
  26. package/src/plugins/inline/jsenv_plugin_data_urls.js +1 -1
  27. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +10 -5
  28. package/src/plugins/plugins.js +5 -5
  29. package/src/plugins/server_events/jsenv_plugin_server_events_client_injection.js +4 -4
  30. package/src/plugins/supervisor/client/script_type_module_supervisor.js +108 -0
  31. package/src/plugins/supervisor/client/supervisor.js +921 -0
  32. package/src/plugins/{html_supervisor/jsenv_plugin_html_supervisor.js → supervisor/jsenv_plugin_supervisor.js} +128 -102
  33. package/src/plugins/toolbar/client/execution/toolbar_execution.js +1 -1
  34. package/src/plugins/toolbar/jsenv_plugin_toolbar.js +4 -4
  35. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +7 -5
  36. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +5 -4
  37. package/src/plugins/transpilation/babel/jsenv_plugin_babel.js +13 -7
  38. package/src/plugins/transpilation/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +6 -4
  39. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +4 -2
  40. package/src/plugins/url_analysis/html/html_urls.js +11 -10
  41. package/src/test/coverage/babel_plugin_instrument.js +1 -35
  42. package/src/test/coverage/empty_coverage_factory.js +1 -1
  43. package/src/test/execute_plan.js +7 -3
  44. package/src/test/execute_test_plan.js +2 -1
  45. package/src/test/logs_file_execution.js +49 -8
  46. package/dist/js/html_supervisor_installer.js +0 -1091
  47. package/dist/js/html_supervisor_setup.js +0 -89
  48. package/dist/js/uneval.js +0 -804
  49. package/src/plugins/html_supervisor/client/error_formatter.js +0 -426
  50. package/src/plugins/html_supervisor/client/error_in_notification.js +0 -21
  51. package/src/plugins/html_supervisor/client/error_overlay.js +0 -191
  52. package/src/plugins/html_supervisor/client/html_supervisor_installer.js +0 -315
  53. package/src/plugins/html_supervisor/client/html_supervisor_setup.js +0 -89
  54. package/src/plugins/html_supervisor/client/perf_browser.js +0 -17
  55. package/src/plugins/html_supervisor/client/uneval_exception.js +0 -8
@@ -0,0 +1,129 @@
1
+ let previousExecutionPromise; // https://twitter.com/damienmaillard/status/1554752482273787906
2
+
3
+ const isWebkitOrSafari = typeof window.webkitConvertPointFromNodeToPage === "function";
4
+ const superviseScriptTypeModule = async ({
5
+ src,
6
+ async
7
+ }) => {
8
+ const execute = isWebkitOrSafari ? createExecuteWithDynamicImport({
9
+ src
10
+ }) : createExecuteWithScript({
11
+ src
12
+ });
13
+
14
+ const startExecution = () => {
15
+ const execution = window.__supervisor__.createExecution({
16
+ src,
17
+ type: "js_module",
18
+ execute
19
+ });
20
+
21
+ return execution.start();
22
+ };
23
+
24
+ if (async) {
25
+ startExecution();
26
+ return;
27
+ } // there is guaranteed execution order for non async script type="module"
28
+ // see https://gist.github.com/jakub-g/385ee6b41085303a53ad92c7c8afd7a6#typemodule-vs-non-module-typetextjavascript-vs-script-nomodule
29
+
30
+
31
+ if (previousExecutionPromise) {
32
+ await previousExecutionPromise;
33
+ previousExecutionPromise = null;
34
+ }
35
+
36
+ previousExecutionPromise = startExecution();
37
+ };
38
+
39
+ const createExecuteWithScript = ({
40
+ src
41
+ }) => {
42
+ const currentScript = document.querySelector(`script[type="module"][inlined-from-src="${src}"]`);
43
+ const parentNode = currentScript.parentNode;
44
+ let nodeToReplace;
45
+ let currentScriptClone;
46
+ return async ({
47
+ isReload
48
+ }) => {
49
+ const urlObject = new URL(src, window.location);
50
+ const loadPromise = new Promise((resolve, reject) => {
51
+ currentScriptClone = document.createElement("script");
52
+ Array.from(currentScript.attributes).forEach(attribute => {
53
+ currentScriptClone.setAttribute(attribute.nodeName, attribute.nodeValue);
54
+ });
55
+
56
+ if (isReload) {
57
+ urlObject.searchParams.set("hmr", Date.now());
58
+ nodeToReplace = currentScriptClone;
59
+ currentScriptClone.src = urlObject.href;
60
+ } else {
61
+ currentScriptClone.removeAttribute("jsenv-plugin-owner");
62
+ currentScriptClone.removeAttribute("jsenv-plugin-action");
63
+ currentScriptClone.removeAttribute("inlined-from-src");
64
+ currentScriptClone.removeAttribute("original-position");
65
+ currentScriptClone.removeAttribute("original-src-position");
66
+ nodeToReplace = currentScript;
67
+ currentScriptClone.src = src;
68
+ }
69
+
70
+ currentScriptClone.addEventListener("error", reject);
71
+ currentScriptClone.addEventListener("load", resolve);
72
+ parentNode.replaceChild(currentScriptClone, nodeToReplace);
73
+ });
74
+
75
+ try {
76
+ await loadPromise;
77
+ } catch (e) {
78
+ // eslint-disable-next-line no-throw-literal
79
+ throw {
80
+ message: `Failed to fetch module: ${urlObject.href}`,
81
+ reportedBy: "script_error_event",
82
+ url: urlObject.href,
83
+ // window.error won't be dispatched for this error
84
+ needsReport: true
85
+ };
86
+ } // do not resolve right away, wait for top level execution
87
+
88
+
89
+ try {
90
+ const namespace = await import(urlObject.href);
91
+ return namespace;
92
+ } catch (e) {
93
+ e.reportedBy = "dynamic_import";
94
+ throw e;
95
+ }
96
+ };
97
+ };
98
+
99
+ const createExecuteWithDynamicImport = ({
100
+ src
101
+ }) => {
102
+ return async ({
103
+ isReload
104
+ }) => {
105
+ const urlObject = new URL(src, window.location);
106
+
107
+ if (isReload) {
108
+ urlObject.searchParams.set("hmr", Date.now());
109
+ }
110
+
111
+ try {
112
+ const namespace = await import(urlObject.href);
113
+ return namespace;
114
+ } catch (e) {
115
+ e.reportedBy = "dynamic_import"; // dynamic import would hide the error to the browser
116
+ // so it must be re-reported using window.reportError
117
+
118
+ if (typeof window.reportError === "function") {
119
+ window.reportError(e);
120
+ } else {
121
+ console.error(e);
122
+ }
123
+
124
+ throw e;
125
+ }
126
+ };
127
+ };
128
+
129
+ export { superviseScriptTypeModule };