@jsenv/core 27.0.0-alpha.80 → 27.0.0-alpha.83

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 (36) hide show
  1. package/dist/babel_helpers/applyDecs/applyDecs.js +756 -0
  2. package/dist/babel_helpers/construct/construct.js +1 -1
  3. package/dist/babel_helpers/extends/extends.js +1 -1
  4. package/dist/babel_helpers/get/get.js +1 -1
  5. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +1 -1
  6. package/dist/babel_helpers/identity/identity.js +3 -0
  7. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +2 -2
  8. package/dist/js/event_source_client.js +205 -1
  9. package/dist/main.js +852 -63
  10. package/package.json +9 -10
  11. package/src/build/start_build_server.js +29 -26
  12. package/src/dev/start_dev_server.js +34 -30
  13. package/src/execute/runtimes/browsers/from_playwright.js +3 -2
  14. package/src/helpers/event_source/event_source.js +197 -0
  15. package/src/helpers/event_source/sse_service.js +53 -0
  16. package/src/helpers/worker_reload.js +56 -0
  17. package/src/plugins/autoreload/dev_sse/client/event_source_client.js +1 -1
  18. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +1 -1
  19. package/src/test/coverage/babel_plugin_instrument.js +82 -0
  20. package/src/test/coverage/coverage_reporter_html_directory.js +36 -0
  21. package/src/test/coverage/coverage_reporter_json_file.js +22 -0
  22. package/src/test/coverage/coverage_reporter_text_log.js +19 -0
  23. package/src/test/coverage/empty_coverage_factory.js +52 -0
  24. package/src/test/coverage/file_by_file_coverage.js +26 -0
  25. package/src/test/coverage/istanbul_coverage_composition.js +28 -0
  26. package/src/test/coverage/istanbul_coverage_map_from_coverage.js +16 -0
  27. package/src/test/coverage/list_files_not_covered.js +15 -0
  28. package/src/test/coverage/missing_coverage.js +41 -0
  29. package/src/test/coverage/report_to_coverage.js +196 -0
  30. package/src/test/coverage/v8_and_istanbul.js +37 -0
  31. package/src/test/coverage/v8_coverage_composition.js +24 -0
  32. package/src/test/coverage/v8_coverage_from_directory.js +87 -0
  33. package/src/test/coverage/v8_coverage_to_istanbul.js +99 -0
  34. package/src/test/execute_plan.js +2 -2
  35. package/src/test/execute_test_plan.js +3 -3
  36. package/dist/babel_helpers/readme.md +0 -8
@@ -12,4 +12,4 @@ function reflectConstruct(Parent, args, Class) {
12
12
  return instance;
13
13
  }
14
14
 
15
- export default isNativeReflectConstruct() ? Reflect.construct : reflectConstruct;
15
+ export default isNativeReflectConstruct() ? Reflect.construct.bind() : reflectConstruct;
@@ -13,4 +13,4 @@ function assign(target) {
13
13
  return target;
14
14
  }
15
15
 
16
- export default Object.assign || assign;
16
+ export default Object.assign ? Object.assign.bind() : assign;
@@ -1,7 +1,7 @@
1
1
  import superPropBase from "../superPropBase/superPropBase.js";
2
2
  export default function _get() {
3
3
  if (typeof Reflect !== "undefined" && Reflect.get) {
4
- _get = Reflect.get;
4
+ _get = Reflect.get.bind();
5
5
  } else {
6
6
  _get = function _get(target, property, receiver) {
7
7
  var base = superPropBase(target, property);
@@ -1,2 +1,2 @@
1
- export default Object.setPrototypeOf ? Object.getPrototypeOf : // eslint-disable-next-line no-proto
1
+ export default Object.setPrototypeOf ? Object.getPrototypeOf.bind() : // eslint-disable-next-line no-proto
2
2
  o => o.__proto__ || Object.getPrototypeOf(o);
@@ -0,0 +1,3 @@
1
+ export default function _identity(x) {
2
+ return x;
3
+ }
@@ -1,5 +1,5 @@
1
- export default Object.setPrototypeOf || ((o, p) => {
1
+ export default Object.setPrototypeOf ? Object.setPrototypeOf.bind() : (o, p) => {
2
2
  // eslint-disable-next-line no-proto
3
3
  o.__proto__ = p;
4
4
  return o;
5
- });
5
+ };
@@ -1,7 +1,211 @@
1
- import { createEventSourceConnection } from "@jsenv/utils/event_source/event_source.js";
2
1
  import { urlHotMetas } from "./import_meta_hot.js";
3
2
  import { htmlAttributeSrcSet } from "@jsenv/utils/html_ast/html_attribute_src_set.js";
4
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
+ };
208
+
5
209
  const isAutoreloadEnabled = () => {
6
210
  const value = window.localStorage.getItem("autoreload");
7
211