@jsenv/core 27.0.0-alpha.82 → 27.0.0-alpha.85

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 (76) hide show
  1. package/dist/js/event_source_client.js +208 -4
  2. package/dist/js/s.js +2 -2
  3. package/dist/main.js +1430 -615
  4. package/dist/s.js +2 -2
  5. package/dist/s.js.map +2 -1
  6. package/package.json +6 -2
  7. package/src/build/build.js +5 -8
  8. package/src/build/build_urls_generator.js +1 -2
  9. package/src/build/inject_global_version_mappings.js +4 -4
  10. package/src/build/inject_service_worker_urls.js +2 -2
  11. package/src/build/resync_ressource_hints.js +17 -18
  12. package/src/build/start_build_server.js +33 -26
  13. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +1 -2
  14. package/src/dev/plugins/toolbar/client/util/fetching.js +1 -1
  15. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -3
  16. package/src/dev/start_dev_server.js +38 -30
  17. package/src/execute/runtimes/browsers/from_playwright.js +5 -4
  18. package/src/execute/runtimes/node/node_process.js +2 -2
  19. package/src/helpers/command/command.js +73 -0
  20. package/src/helpers/event_source/event_source.js +197 -0
  21. package/src/helpers/event_source/sse_service.js +53 -0
  22. package/src/helpers/worker_reload.js +57 -0
  23. package/src/omega/compat/runtime_compat.js +2 -1
  24. package/src/omega/kitchen.js +4 -1
  25. package/src/omega/server/user_agent.js +2 -1
  26. package/src/omega/url_graph/sort_by_dependencies.js +27 -0
  27. package/src/omega/url_graph/url_info_transformations.js +24 -14
  28. package/src/plugins/autoreload/dev_sse/client/event_source_client.js +1 -1
  29. package/src/plugins/autoreload/dev_sse/client/reload.js +6 -3
  30. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +3 -3
  31. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +1 -1
  32. package/src/plugins/bundling/css/bundle_css.js +4 -4
  33. package/src/plugins/bundling/js_module/bundle_js_module.js +86 -67
  34. package/src/plugins/commonjs_globals/jsenv_plugin_commonjs_globals.js +2 -2
  35. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +4 -5
  36. package/src/plugins/html_supervisor/jsenv_plugin_html_supervisor.js +62 -74
  37. package/src/plugins/import_meta_hot/html_hot_dependencies.js +9 -15
  38. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +3 -3
  39. package/src/plugins/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +2 -2
  40. package/src/plugins/importmap/jsenv_plugin_importmap.js +25 -27
  41. package/src/plugins/inject_globals/inject_globals.js +4 -4
  42. package/src/plugins/inline/jsenv_plugin_data_urls.js +1 -1
  43. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +41 -43
  44. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +4 -4
  45. package/src/plugins/minification/css/minify_css.js +1 -1
  46. package/src/plugins/transpilation/as_js_classic/client/s.js +2 -2
  47. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +2 -4
  48. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +45 -67
  49. package/src/plugins/transpilation/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +2 -3
  50. package/src/plugins/transpilation/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +3 -4
  51. package/src/plugins/transpilation/babel/jsenv_plugin_babel.js +1 -1
  52. package/src/plugins/transpilation/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +2 -3
  53. package/src/plugins/transpilation/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +2 -3
  54. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +1 -1
  55. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +1 -1
  56. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +2 -1
  57. package/src/plugins/url_analysis/css/css_urls.js +2 -3
  58. package/src/plugins/url_analysis/html/html_urls.js +98 -113
  59. package/src/plugins/url_analysis/js/js_urls.js +3 -2
  60. package/src/test/coverage/babel_plugin_instrument.js +82 -0
  61. package/src/test/coverage/coverage_reporter_html_directory.js +36 -0
  62. package/src/test/coverage/coverage_reporter_json_file.js +22 -0
  63. package/src/test/coverage/coverage_reporter_text_log.js +19 -0
  64. package/src/test/coverage/empty_coverage_factory.js +52 -0
  65. package/src/test/coverage/file_by_file_coverage.js +25 -0
  66. package/src/test/coverage/istanbul_coverage_composition.js +28 -0
  67. package/src/test/coverage/istanbul_coverage_map_from_coverage.js +16 -0
  68. package/src/test/coverage/list_files_not_covered.js +15 -0
  69. package/src/test/coverage/missing_coverage.js +41 -0
  70. package/src/test/coverage/report_to_coverage.js +196 -0
  71. package/src/test/coverage/v8_and_istanbul.js +37 -0
  72. package/src/test/coverage/v8_coverage_composition.js +24 -0
  73. package/src/test/coverage/v8_coverage_from_directory.js +87 -0
  74. package/src/test/coverage/v8_coverage_to_istanbul.js +99 -0
  75. package/src/test/execute_plan.js +2 -2
  76. package/src/test/execute_test_plan.js +3 -3
@@ -1,6 +1,210 @@
1
- import { createEventSourceConnection } from "@jsenv/utils/event_source/event_source.js";
2
1
  import { urlHotMetas } from "./import_meta_hot.js";
3
- import { htmlAttributeSrcSet } from "@jsenv/utils/html_ast/html_attribute_src_set.js";
2
+ import { parseSrcSet, stringifySrcSet } from "@jsenv/ast/src/html/html_src_set.js";
3
+
4
+ /* eslint-env browser */
5
+ const createEventSourceConnection = (eventSourceUrl, events = {}, {
6
+ retryMaxAttempt = Infinity,
7
+ retryAllocatedMs = Infinity,
8
+ lastEventId
9
+ } = {}) => {
10
+ const {
11
+ EventSource
12
+ } = window;
13
+
14
+ if (typeof EventSource !== "function") {
15
+ return () => {};
16
+ }
17
+
18
+ const eventSourceOrigin = new URL(eventSourceUrl).origin;
19
+ Object.keys(events).forEach(eventName => {
20
+ const eventCallback = events[eventName];
21
+
22
+ events[eventName] = e => {
23
+ if (e.origin === eventSourceOrigin) {
24
+ if (e.lastEventId) {
25
+ lastEventId = e.lastEventId;
26
+ }
27
+
28
+ eventCallback(e);
29
+ }
30
+ };
31
+ });
32
+ const status = {
33
+ value: "default",
34
+ goTo: value => {
35
+ if (value === status.value) {
36
+ return;
37
+ }
38
+
39
+ status.value = value;
40
+ status.onchange();
41
+ },
42
+ onchange: () => {}
43
+ };
44
+
45
+ let _disconnect = () => {};
46
+
47
+ const attemptConnection = url => {
48
+ const eventSource = new EventSource(url, {
49
+ withCredentials: true
50
+ });
51
+
52
+ _disconnect = () => {
53
+ if (status.value !== "connecting" && status.value !== "connected") {
54
+ console.warn(`disconnect() ignored because connection is ${status.value}`);
55
+ return;
56
+ }
57
+
58
+ eventSource.onerror = undefined;
59
+ eventSource.close();
60
+ Object.keys(events).forEach(eventName => {
61
+ eventSource.removeEventListener(eventName, events[eventName]);
62
+ });
63
+ status.goTo("disconnected");
64
+ };
65
+
66
+ let retryCount = 0;
67
+ let firstRetryMs = Date.now();
68
+
69
+ eventSource.onerror = errorEvent => {
70
+ if (errorEvent.target.readyState === EventSource.CONNECTING) {
71
+ if (retryCount > retryMaxAttempt) {
72
+ console.info(`could not connect after ${retryMaxAttempt} attempt`);
73
+
74
+ _disconnect();
75
+
76
+ return;
77
+ }
78
+
79
+ if (retryCount === 0) {
80
+ firstRetryMs = Date.now();
81
+ } else {
82
+ const allRetryDuration = Date.now() - firstRetryMs;
83
+
84
+ if (retryAllocatedMs && allRetryDuration > retryAllocatedMs) {
85
+ console.info(`could not connect in less than ${retryAllocatedMs} ms`);
86
+
87
+ _disconnect();
88
+
89
+ return;
90
+ }
91
+ }
92
+
93
+ retryCount++;
94
+ status.goTo("connecting");
95
+ return;
96
+ }
97
+
98
+ if (errorEvent.target.readyState === EventSource.CLOSED) {
99
+ _disconnect();
100
+
101
+ return;
102
+ }
103
+ };
104
+
105
+ eventSource.onopen = () => {
106
+ status.goTo("connected");
107
+ };
108
+
109
+ Object.keys(events).forEach(eventName => {
110
+ eventSource.addEventListener(eventName, events[eventName]);
111
+ });
112
+
113
+ if (!events.hasOwnProperty("welcome")) {
114
+ eventSource.addEventListener("welcome", e => {
115
+ if (e.origin === eventSourceOrigin && e.lastEventId) {
116
+ lastEventId = e.lastEventId;
117
+ }
118
+ });
119
+ }
120
+
121
+ status.goTo("connecting");
122
+ };
123
+
124
+ let connect = () => {
125
+ attemptConnection(eventSourceUrl);
126
+
127
+ connect = () => {
128
+ attemptConnection(lastEventId ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId) : eventSourceUrl);
129
+ };
130
+ };
131
+
132
+ const removePageUnloadListener = listenPageUnload(() => {
133
+ if (status.value === "connecting" || status.value === "connected") {
134
+ _disconnect();
135
+ }
136
+ });
137
+
138
+ const destroy = () => {
139
+ removePageUnloadListener();
140
+
141
+ _disconnect();
142
+ };
143
+
144
+ return {
145
+ status,
146
+ connect,
147
+ disconnect: () => _disconnect(),
148
+ destroy
149
+ };
150
+ };
151
+
152
+ const addLastEventIdIntoUrlSearchParams = (url, lastEventId) => {
153
+ if (url.indexOf("?") === -1) {
154
+ url += "?";
155
+ } else {
156
+ url += "&";
157
+ }
158
+
159
+ return `${url}last-event-id=${encodeURIComponent(lastEventId)}`;
160
+ }; // const listenPageMightFreeze = (callback) => {
161
+ // const removePageHideListener = listenEvent(window, "pagehide", (pageHideEvent) => {
162
+ // if (pageHideEvent.persisted === true) {
163
+ // callback(pageHideEvent)
164
+ // }
165
+ // })
166
+ // return removePageHideListener
167
+ // }
168
+ // const listenPageFreeze = (callback) => {
169
+ // const removeFreezeListener = listenEvent(document, "freeze", (freezeEvent) => {
170
+ // callback(freezeEvent)
171
+ // })
172
+ // return removeFreezeListener
173
+ // }
174
+ // const listenPageIsRestored = (callback) => {
175
+ // const removeResumeListener = listenEvent(document, "resume", (resumeEvent) => {
176
+ // removePageshowListener()
177
+ // callback(resumeEvent)
178
+ // })
179
+ // const removePageshowListener = listenEvent(window, "pageshow", (pageshowEvent) => {
180
+ // if (pageshowEvent.persisted === true) {
181
+ // removePageshowListener()
182
+ // removeResumeListener()
183
+ // callback(pageshowEvent)
184
+ // }
185
+ // })
186
+ // return () => {
187
+ // removeResumeListener()
188
+ // removePageshowListener()
189
+ // }
190
+ // }
191
+
192
+
193
+ const listenPageUnload = callback => {
194
+ const removePageHideListener = listenEvent(window, "pagehide", pageHideEvent => {
195
+ if (pageHideEvent.persisted !== true) {
196
+ callback(pageHideEvent);
197
+ }
198
+ });
199
+ return removePageHideListener;
200
+ };
201
+
202
+ const listenEvent = (emitter, event, callback) => {
203
+ emitter.addEventListener(event, callback);
204
+ return () => {
205
+ emitter.removeEventListener(event, callback);
206
+ };
207
+ };
4
208
 
5
209
  const isAutoreloadEnabled = () => {
6
210
  const value = window.localStorage.getItem("autoreload");
@@ -97,7 +301,7 @@ const reloadDOMNodesUsingUrl = urlToReload => {
97
301
  const srcset = img.srcset;
98
302
 
99
303
  if (srcset) {
100
- const srcCandidates = htmlAttributeSrcSet.parse(srcset);
304
+ const srcCandidates = parseSrcSet(srcset);
101
305
  srcCandidates.forEach(srcCandidate => {
102
306
  const url = new URL(srcCandidate.specifier, `${window.location.href}`);
103
307
 
@@ -108,7 +312,7 @@ const reloadDOMNodesUsingUrl = urlToReload => {
108
312
  }
109
313
  });
110
314
  mutations.push(() => {
111
- img.srcset = htmlAttributeSrcSet.stringify(srcCandidates);
315
+ img.srcset = stringifySrcSet(srcCandidates);
112
316
  });
113
317
  }
114
318
  });
package/dist/js/s.js CHANGED
@@ -43,7 +43,7 @@
43
43
  }
44
44
  System.register = (deps, declare) => {
45
45
  if (!document.currentScript) {
46
- throw new Error("unexpected call")
46
+ throw new Error("unexpected call to System.register (document.currentScript is undefined)")
47
47
  }
48
48
  if (document.currentScript.__s__) {
49
49
  registerRegistry[document.currentScript.src] = [deps, declare]
@@ -169,7 +169,7 @@
169
169
 
170
170
  System.register = async (deps, declare) => {
171
171
  System.register = () => {
172
- throw new Error("unexpected call")
172
+ throw new Error("unexpected call to System.register (called outside url instantiation)")
173
173
  }
174
174
  const url = self.location.href
175
175
  registerRegistry[url] = [deps, declare]