@jsenv/core 24.1.0-alpha.0 → 24.3.1

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 (180) hide show
  1. package/{license → LICENSE} +0 -0
  2. package/dist/browser_runtime/browser_runtime-fbd309a1.js +5137 -0
  3. package/dist/browser_runtime/browser_runtime-fbd309a1.js.map +1064 -0
  4. package/dist/{jsenv_browser_system.js → browser_system/browser_system-29eda202.js} +12 -12
  5. package/dist/{jsenv_browser_system.js.map → browser_system/browser_system-29eda202.js.map} +64 -64
  6. package/dist/build_manifest.js +12 -0
  7. package/dist/compile_proxy/assets/s.js-749702e8.map +242 -0
  8. package/dist/compile_proxy/compile_proxy-405777e6.html +2074 -0
  9. package/dist/compile_proxy/compile_proxy.html__inline__20-39c0801c.js.map +385 -0
  10. package/dist/event_source_client/event_source_client-9f14c8b9.js +356 -0
  11. package/dist/event_source_client/event_source_client-9f14c8b9.js.map +127 -0
  12. package/dist/redirector/assets/s.js-749702e8.map +242 -0
  13. package/dist/redirector/redirector-237cd168.html +2118 -0
  14. package/dist/redirector/redirector.html__inline__15-33acb0b9.js.map +390 -0
  15. package/dist/toolbar/assets/compilation.css-209d68b4.map +12 -0
  16. package/dist/toolbar/assets/eventsource.css-38cd0a36.map +12 -0
  17. package/dist/toolbar/assets/execution.css-0ebe522f.map +12 -0
  18. package/dist/toolbar/assets/focus.css-3f9c156d.map +12 -0
  19. package/dist/toolbar/assets/light-theme.css-78b19a80.map +12 -0
  20. package/dist/toolbar/assets/overflow-menu.css-d9688a1c.map +12 -0
  21. package/dist/toolbar/assets/s.js-749702e8.map +242 -0
  22. package/dist/toolbar/assets/settings.css-2b81b245.map +12 -0
  23. package/dist/toolbar/assets/toolbar.main.css-846920e9.map +28 -0
  24. package/dist/toolbar/assets/tooltip.css-03395ee6.map +12 -0
  25. package/dist/toolbar/toolbar-d3d98c2e.html +4778 -0
  26. package/dist/toolbar/toolbar.main-cab36c15.js.map +795 -0
  27. package/dist/toolbar_injector/assets/jsenv-logo-188b9ca6.svg +95 -0
  28. package/dist/{jsenv_toolbar_injector.js → toolbar_injector/toolbar_injector-01f71ce3.js} +62 -137
  29. package/dist/toolbar_injector/toolbar_injector-01f71ce3.js.map +294 -0
  30. package/main.js +0 -1
  31. package/package.json +4 -2
  32. package/readme.md +10 -7
  33. package/src/buildProject.js +8 -2
  34. package/src/dev_server.js +45 -102
  35. package/src/importUsingChildProcess.js +1 -1
  36. package/src/internal/{runtime/detectBrowser/detectBrowser.js → browser_detection/browser_detection.js} +0 -0
  37. package/src/internal/{runtime/detectBrowser → browser_detection}/detectAndroid.js +0 -0
  38. package/src/internal/{runtime/detectBrowser → browser_detection}/detectChrome.js +0 -0
  39. package/src/internal/{runtime/detectBrowser → browser_detection}/detectEdge.js +0 -0
  40. package/src/internal/{runtime/detectBrowser → browser_detection}/detectElectron.js +0 -0
  41. package/src/internal/{runtime/detectBrowser → browser_detection}/detectFirefox.js +0 -0
  42. package/src/internal/{runtime/detectBrowser → browser_detection}/detectIOS.js +0 -0
  43. package/src/internal/{runtime/detectBrowser → browser_detection}/detectInternetExplorer.js +0 -0
  44. package/src/internal/{runtime/detectBrowser → browser_detection}/detectOpera.js +0 -0
  45. package/src/internal/{runtime/detectBrowser → browser_detection}/detectSafari.js +0 -0
  46. package/src/internal/{runtime/detectBrowser → browser_detection}/util.js +0 -0
  47. package/src/internal/{runtime/createBrowserRuntime/scanBrowserRuntimeFeatures.js → browser_feature_detection/browser_feature_detection.js} +116 -81
  48. package/src/internal/browser_feature_detection/compile_proxy.html +27 -0
  49. package/src/internal/{browser-launcher → browser_launcher}/createSharing.js +0 -0
  50. package/src/internal/{browser-launcher → browser_launcher}/executeHtmlFile.js +7 -4
  51. package/src/internal/{browser-launcher → browser_launcher}/trackPageToNotify.js +0 -0
  52. package/src/internal/{browser-launcher/jsenv-browser-system.js → browser_runtime/browser_runtime.js} +4 -4
  53. package/src/internal/{runtime/createBrowserRuntime/createBrowserSystem.js → browser_runtime/browser_system.js} +3 -2
  54. package/src/internal/{runtime/createBrowserRuntime → browser_runtime}/createBrowserRuntime.js +7 -5
  55. package/src/internal/{browser-launcher → browser_runtime}/displayErrorInDocument.js +0 -0
  56. package/src/internal/{browser-launcher → browser_runtime}/displayErrorNotification.js +2 -4
  57. package/src/internal/{runtime/createBrowserRuntime → browser_runtime}/evalSource.js +2 -0
  58. package/src/internal/{runtime/createBrowserRuntime → browser_runtime}/makeNamespaceTransferable.js +0 -0
  59. package/src/internal/{browser-utils → browser_utils}/fetch-browser.js +2 -0
  60. package/src/internal/{browser-utils → browser_utils}/fetchAndEvalUsingFetch.js +3 -0
  61. package/src/internal/{browser-utils → browser_utils}/fetchAndEvalUsingScript.js +2 -0
  62. package/src/internal/{browser-utils → browser_utils}/fetchJson.js +0 -0
  63. package/src/internal/{browser-utils → browser_utils}/fetchUsingXHR.js +4 -4
  64. package/src/internal/building/buildUsingRollup.js +4 -0
  65. package/src/internal/building/createJsenvRollupPlugin.js +19 -9
  66. package/src/internal/building/css/applyPostCss.js +19 -8
  67. package/src/internal/building/css/moveCssUrls.js +44 -0
  68. package/src/internal/building/css/parseCssRessource.js +67 -17
  69. package/src/internal/building/css/parseCssUrls.js +29 -23
  70. package/src/internal/building/css/postcss_plugin_url_visitor.js +11 -20
  71. package/src/internal/building/css/replaceCssUrls.js +38 -19
  72. package/src/internal/building/css_module.js +6 -10
  73. package/src/internal/building/html/parseHtmlRessource.js +37 -11
  74. package/src/internal/building/parseRessource.js +3 -0
  75. package/src/internal/building/ressource_builder.js +12 -3
  76. package/src/internal/compiling/babel_plugin_import_assertions.js +1 -2
  77. package/src/internal/compiling/compile-directory/validateCache.js +0 -5
  78. package/src/internal/compiling/compileFile.js +17 -54
  79. package/src/internal/compiling/createCompiledFileService.js +2 -0
  80. package/src/internal/compiling/html_source_file_service.js +49 -13
  81. package/src/internal/compiling/jsenvCompilerForHtml.js +29 -12
  82. package/src/internal/compiling/startCompileServer.js +39 -33
  83. package/src/internal/dev_server/event_source_client/event_source_client.js +63 -0
  84. package/src/internal/{toolbar/eventsource/connectEventSource.js → dev_server/event_source_client/event_source_connection.js} +66 -88
  85. package/src/internal/dev_server/event_source_client/file_changes.js +82 -0
  86. package/src/internal/dev_server/event_source_client/livereload_preference.js +13 -0
  87. package/src/internal/{exploring → dev_server/exploring}/exploring.css +0 -0
  88. package/src/internal/{exploring → dev_server/exploring}/exploring.html +8 -3
  89. package/src/internal/{exploring → dev_server/exploring}/exploring.js +0 -0
  90. package/src/internal/{exploring → dev_server/exploring}/fetchExploringJson.js +4 -9
  91. package/src/internal/dev_server/redirector/redirector.html +48 -0
  92. package/src/internal/{toolbar → dev_server/toolbar}/animation/toolbar.animation.js +0 -0
  93. package/src/internal/{toolbar → dev_server/toolbar}/compilation/compilation.css +0 -0
  94. package/src/internal/{toolbar → dev_server/toolbar}/compilation/toolbar.compilation.js +4 -7
  95. package/src/internal/{toolbar → dev_server/toolbar}/eventsource/eventsource.css +0 -0
  96. package/src/internal/dev_server/toolbar/eventsource/toolbar.eventsource.js +83 -0
  97. package/src/internal/{toolbar → dev_server/toolbar}/execution/execution.css +0 -0
  98. package/src/internal/{toolbar → dev_server/toolbar}/execution/toolbar.execution.js +0 -0
  99. package/src/internal/{toolbar → dev_server/toolbar}/focus/focus.css +0 -0
  100. package/src/internal/{toolbar → dev_server/toolbar}/focus/toolbar.focus.js +0 -0
  101. package/src/internal/{toolbar → dev_server/toolbar}/jsenv-logo.svg +0 -0
  102. package/src/internal/dev_server/toolbar/notification/toolbar.notification.js +152 -0
  103. package/src/internal/{toolbar → dev_server/toolbar}/responsive/overflow-menu.css +0 -0
  104. package/src/internal/{toolbar → dev_server/toolbar}/responsive/toolbar.responsive.js +0 -0
  105. package/src/internal/{toolbar → dev_server/toolbar}/settings/settings.css +0 -0
  106. package/src/internal/{toolbar → dev_server/toolbar}/settings/toolbar.settings.js +0 -0
  107. package/src/internal/{toolbar → dev_server/toolbar}/theme/jsenv-theme.css +0 -0
  108. package/src/internal/{toolbar → dev_server/toolbar}/theme/light-theme.css +0 -0
  109. package/src/internal/{toolbar → dev_server/toolbar}/theme/toolbar.theme.js +0 -0
  110. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.html +35 -42
  111. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.injector.js +53 -125
  112. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.css +0 -0
  113. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.js +44 -31
  114. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.css +0 -0
  115. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.js +0 -0
  116. package/src/internal/{toolbar → dev_server/toolbar}/util/animation.js +0 -0
  117. package/src/internal/{toolbar → dev_server/toolbar}/util/dom.js +0 -0
  118. package/src/internal/{toolbar → dev_server/toolbar}/util/fetching.js +2 -2
  119. package/src/internal/{toolbar → dev_server/toolbar}/util/jsenvLogger.js +0 -0
  120. package/src/internal/{toolbar → dev_server/toolbar}/util/preferences.js +0 -0
  121. package/src/internal/{toolbar → dev_server/toolbar}/util/responsive.js +0 -0
  122. package/src/internal/{toolbar → dev_server/toolbar}/util/util.js +0 -0
  123. package/src/internal/{toolbar → dev_server/toolbar}/variant/variant.js +0 -0
  124. package/src/internal/generateGroupMap/one_runtime_compat.js +1 -1
  125. package/src/internal/generateGroupMap/runtime_compat_composition.js +1 -1
  126. package/src/internal/generateGroupMap/runtime_support.js +1 -1
  127. package/src/internal/jsenvInternalFiles.js +0 -84
  128. package/src/internal/jsenv_builds.js +19 -0
  129. package/src/internal/{runtime/node-feature-detect/feature-detect-dynamic-import.mjs → node_feature_detection/feature_detect_dynamic_import.mjs} +0 -0
  130. package/src/internal/{runtime/node-feature-detect/feature-detect-top-level-await.mjs → node_feature_detection/feature_detect_top_level_await.mjs} +0 -0
  131. package/src/internal/{runtime/node-feature-detect → node_feature_detection}/nodeSupportsDynamicImport.js +0 -0
  132. package/src/internal/node_feature_detection/nodeSupportsTopLevelAwait.js +16 -0
  133. package/src/internal/{runtime/createNodeRuntime/scanNodeRuntimeFeatures.js → node_feature_detection/node_feature_detection.js} +12 -13
  134. package/src/internal/{node-launcher → node_launcher}/createChildProcessOptions.js +0 -0
  135. package/src/internal/{node-launcher → node_launcher}/createControllableNodeProcess.js +9 -14
  136. package/src/internal/{node-launcher → node_launcher}/kill_process_tree.js +0 -0
  137. package/src/internal/{node-launcher → node_launcher}/processOptions.js +0 -0
  138. package/src/internal/{runtime/detectNode → node_runtime}/detectNode.js +0 -0
  139. package/src/internal/{runtime/createNodeRuntime → node_runtime}/evalSource.js +1 -1
  140. package/src/internal/{runtime/createNodeRuntime → node_runtime}/fetchSource.js +1 -1
  141. package/src/internal/{node-launcher → node_runtime}/nodeControllableFile.mjs +14 -11
  142. package/src/internal/{runtime/createNodeRuntime/createNodeExecutionWithDynamicImport.js → node_runtime/node_execution_dynamic_import.js} +34 -6
  143. package/src/internal/node_runtime/node_execution_performance.js +67 -0
  144. package/src/internal/{runtime/createNodeRuntime/createNodeExecutionWithSystemJs.js → node_runtime/node_execution_systemjs.js} +38 -24
  145. package/src/internal/{runtime/createNodeRuntime/createNodeSystem.js → node_runtime/node_system.js} +4 -4
  146. package/src/internal/runtime/computeCompileIdFromGroupId.js +1 -0
  147. package/src/internal/runtime/resolveGroup.js +1 -1
  148. package/src/internal/runtime/resolveRuntimeGroup.js +2 -2
  149. package/src/internal/{semantic-versioning → semantic_versioning}/findHighestVersion.js +0 -0
  150. package/src/internal/{semantic-versioning → semantic_versioning}/findLowestVersion.js +0 -0
  151. package/src/internal/{semantic-versioning → semantic_versioning}/index.js +0 -0
  152. package/src/internal/{semantic-versioning → semantic_versioning}/valueToVersion.js +0 -0
  153. package/src/internal/{semantic-versioning → semantic_versioning}/versionCompare.js +0 -0
  154. package/src/internal/{semantic-versioning → semantic_versioning}/versionIsAbove.js +0 -0
  155. package/src/internal/{semantic-versioning → semantic_versioning}/versionIsBelow.js +0 -0
  156. package/src/internal/{semantic-versioning → semantic_versioning}/versionIsEqual.js +0 -0
  157. package/src/launchBrowser.js +3 -3
  158. package/src/launchNode.js +33 -7
  159. package/src/requireUsingChildProcess.js +1 -1
  160. package/dist/jsenv_compile_proxy.js +0 -1339
  161. package/dist/jsenv_compile_proxy.js.map +0 -378
  162. package/dist/jsenv_exploring_index.js +0 -1092
  163. package/dist/jsenv_exploring_index.js.map +0 -353
  164. package/dist/jsenv_exploring_redirector.js +0 -1386
  165. package/dist/jsenv_exploring_redirector.js.map +0 -384
  166. package/dist/jsenv_toolbar.js +0 -3347
  167. package/dist/jsenv_toolbar.js.map +0 -846
  168. package/dist/jsenv_toolbar_injector.js.map +0 -320
  169. package/src/internal/browser-launcher/jsenv_compile_proxy.html +0 -13
  170. package/src/internal/browser-launcher/jsenv_compile_proxy.js +0 -5
  171. package/src/internal/exploring/exploring.redirector.html +0 -13
  172. package/src/internal/exploring/exploring.redirector.js +0 -28
  173. package/src/internal/node-launcher/node-js-file.js +0 -110
  174. package/src/internal/runtime/createNodeRuntime/createNodeRuntime.js +0 -32
  175. package/src/internal/runtime/node-feature-detect/nodeSupportsTopLevelAwait.js +0 -18
  176. package/src/internal/toolbar/backtolist/toolbar.backtolist.js +0 -33
  177. package/src/internal/toolbar/eventsource/connectCompileServerEventSource.js +0 -74
  178. package/src/internal/toolbar/eventsource/toolbar.eventsource.js +0 -239
  179. package/src/internal/toolbar/notification/toolbar.notification.js +0 -121
  180. package/src/nodeRuntime.js +0 -5
@@ -0,0 +1,63 @@
1
+ /* eslint-env browser */
2
+
3
+ import { createEventSourceConnection } from "./event_source_connection.js"
4
+ import {
5
+ getFileChanges,
6
+ addFileChange,
7
+ setFileChangeCallback,
8
+ reloadIfNeeded,
9
+ } from "./file_changes.js"
10
+ import {
11
+ isLivereloadEnabled,
12
+ setLivereloadPreference,
13
+ } from "./livereload_preference.js"
14
+
15
+ const eventsourceConnection = createEventSourceConnection(
16
+ document.location.href,
17
+ {
18
+ "file-added": ({ data }) => {
19
+ addFileChange({
20
+ file: data,
21
+ eventType: "added",
22
+ })
23
+ },
24
+ "file-modified": ({ data }) => {
25
+ addFileChange({
26
+ file: data,
27
+ eventType: "modified",
28
+ })
29
+ },
30
+ "file-removed": ({ data }) => {
31
+ addFileChange({
32
+ file: data,
33
+ eventType: "removed",
34
+ })
35
+ },
36
+ },
37
+ {
38
+ retryMaxAttempt: Infinity,
39
+ retryAllocatedMs: 20 * 1000,
40
+ },
41
+ )
42
+
43
+ const {
44
+ connect,
45
+ disconnect,
46
+ setConnectionStatusChangeCallback,
47
+ getConnectionStatus,
48
+ } = eventsourceConnection
49
+
50
+ connect()
51
+
52
+ window.__jsenv_event_source_client__ = {
53
+ connect,
54
+ disconnect,
55
+ getConnectionStatus,
56
+ setConnectionStatusChangeCallback,
57
+ getFileChanges,
58
+ addFileChange,
59
+ setFileChangeCallback,
60
+ reloadIfNeeded,
61
+ isLivereloadEnabled,
62
+ setLivereloadPreference,
63
+ }
@@ -1,15 +1,9 @@
1
- export const connectEventSource = (
1
+ /* eslint-env browser */
2
+
3
+ export const createEventSourceConnection = (
2
4
  eventSourceUrl,
3
5
  events = {},
4
- {
5
- connecting = () => {},
6
- connected = () => {},
7
- cancelled = () => {},
8
- failed = () => {},
9
- retryMaxAttempt = Infinity,
10
- retryAllocatedMs = Infinity,
11
- lastEventId,
12
- } = {},
6
+ { retryMaxAttempt = Infinity, retryAllocatedMs = Infinity, lastEventId } = {},
13
7
  ) => {
14
8
  const { EventSource } = window
15
9
  if (typeof EventSource !== "function") {
@@ -17,83 +11,57 @@ export const connectEventSource = (
17
11
  }
18
12
 
19
13
  const eventSourceOrigin = new URL(eventSourceUrl).origin
14
+ Object.keys(events).forEach((eventName) => {
15
+ const eventCallback = events[eventName]
16
+ events[eventName] = (e) => {
17
+ if (e.origin === eventSourceOrigin) {
18
+ if (e.lastEventId) {
19
+ lastEventId = e.lastEventId
20
+ }
21
+ eventCallback(e)
22
+ }
23
+ }
24
+ })
20
25
 
21
- // will be either abort, disconnect or a third function calling cancelled
22
- // depending on connectionStatus
23
- let cancelCurrentConnection = () => {}
26
+ let connectionStatus = "default"
27
+ let connectionStatusChangeCallback = () => {}
28
+ let _disconnect = () => {}
24
29
 
25
- const reconnect = () => {
26
- attemptConnection(
27
- lastEventId
28
- ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId)
29
- : eventSourceUrl,
30
- )
30
+ const goToStatus = (newStatus) => {
31
+ if (newStatus !== connectionStatus) {
32
+ connectionStatus = newStatus
33
+ connectionStatusChangeCallback()
34
+ }
31
35
  }
32
36
 
33
37
  const attemptConnection = (url) => {
34
38
  const eventSource = new EventSource(url, {
35
39
  withCredentials: true,
36
40
  })
37
-
38
- let connectionStatus = "connecting"
39
- const abort = () => {
40
- if (connectionStatus !== "connecting") {
41
- console.warn(`abort ignored because connection is ${connectionStatus}`)
41
+ _disconnect = () => {
42
+ if (
43
+ connectionStatus !== "connecting" &&
44
+ connectionStatus !== "connected"
45
+ ) {
46
+ console.warn(
47
+ `disconnect() ignored because connection is ${connectionStatus}`,
48
+ )
42
49
  return
43
50
  }
44
- connectionStatus = "aborted"
45
51
  eventSource.onerror = undefined
46
52
  eventSource.close()
47
- cancelled({ connect: reconnect })
48
- }
49
- cancelCurrentConnection = abort
50
- connecting({ cancel: abort })
51
-
52
- eventSource.onopen = () => {
53
- connectionStatus = "connected"
54
- const disconnect = () => {
55
- if (connectionStatus !== "connected") {
56
- console.warn(
57
- `disconnect ignored because connection is ${connectionStatus}`,
58
- )
59
- return
60
- }
61
- connectionStatus = "disconnected"
62
- eventSource.onerror = undefined
63
- eventSource.close()
64
- cancelled({ connect: reconnect })
65
- }
66
- cancelCurrentConnection = disconnect
67
- connected({ cancel: disconnect })
53
+ Object.keys(events).forEach((eventName) => {
54
+ eventSource.removeEventListener(eventName, events[eventName])
55
+ })
56
+ goToStatus("disconnected")
68
57
  }
69
-
70
58
  let retryCount = 0
71
59
  let firstRetryMs = Date.now()
72
-
73
60
  eventSource.onerror = (errorEvent) => {
74
- const considerFailed = () => {
75
- connectionStatus = "disconnected"
76
- failed({
77
- cancel: () => {
78
- if (connectionStatus !== "failed") {
79
- console.warn(
80
- `disable ignored because connection is ${connectionStatus}`,
81
- )
82
- return
83
- }
84
- connectionStatus = "disabled"
85
- cancelled({ connect: reconnect })
86
- },
87
- connect: reconnect,
88
- })
89
- }
90
-
91
61
  if (errorEvent.target.readyState === EventSource.CONNECTING) {
92
62
  if (retryCount > retryMaxAttempt) {
93
63
  console.info(`could not connect after ${retryMaxAttempt} attempt`)
94
- eventSource.onerror = undefined
95
- eventSource.close()
96
- considerFailed()
64
+ _disconnect()
97
65
  return
98
66
  }
99
67
 
@@ -105,33 +73,26 @@ export const connectEventSource = (
105
73
  console.info(
106
74
  `could not connect in less than ${retryAllocatedMs} ms`,
107
75
  )
108
- eventSource.onerror = undefined
109
- eventSource.close()
110
- considerFailed()
76
+ _disconnect()
111
77
  return
112
78
  }
113
79
  }
114
80
 
115
- connectionStatus = "connecting"
116
81
  retryCount++
117
- connecting({ cancel: abort })
82
+ goToStatus("connecting")
118
83
  return
119
84
  }
120
85
 
121
86
  if (errorEvent.target.readyState === EventSource.CLOSED) {
122
- considerFailed()
87
+ _disconnect()
123
88
  return
124
89
  }
125
90
  }
91
+ eventSource.onopen = () => {
92
+ goToStatus("connected")
93
+ }
126
94
  Object.keys(events).forEach((eventName) => {
127
- eventSource.addEventListener(eventName, (e) => {
128
- if (e.origin === eventSourceOrigin) {
129
- if (e.lastEventId) {
130
- lastEventId = e.lastEventId
131
- }
132
- events[eventName](e)
133
- }
134
- })
95
+ eventSource.addEventListener(eventName, events[eventName])
135
96
  })
136
97
  if (!events.hasOwnProperty("welcome")) {
137
98
  eventSource.addEventListener("welcome", (e) => {
@@ -140,20 +101,37 @@ export const connectEventSource = (
140
101
  }
141
102
  })
142
103
  }
104
+ goToStatus("connecting")
143
105
  }
144
106
 
145
- attemptConnection(eventSourceUrl)
146
- const disconnect = () => {
147
- cancelCurrentConnection()
107
+ let connect = () => {
108
+ attemptConnection(eventSourceUrl)
109
+ connect = () => {
110
+ attemptConnection(
111
+ lastEventId
112
+ ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId)
113
+ : eventSourceUrl,
114
+ )
115
+ }
148
116
  }
149
117
 
150
118
  const removePageUnloadListener = listenPageUnload(() => {
151
- disconnect()
119
+ _disconnect()
152
120
  })
153
121
 
154
- return () => {
122
+ const destroy = () => {
155
123
  removePageUnloadListener()
156
- disconnect()
124
+ _disconnect()
125
+ }
126
+
127
+ return {
128
+ getConnectionStatus: () => connectionStatus,
129
+ setConnectionStatusChangeCallback: (callback) => {
130
+ connectionStatusChangeCallback = callback
131
+ },
132
+ connect,
133
+ disconnect: () => _disconnect(),
134
+ destroy,
157
135
  }
158
136
  }
159
137
 
@@ -0,0 +1,82 @@
1
+ /* eslint-env browser */
2
+
3
+ import { isLivereloadEnabled } from "./livereload_preference.js"
4
+
5
+ let fileChanges = {}
6
+ let filechangeCallback = () => {}
7
+
8
+ export const getFileChanges = () => fileChanges
9
+
10
+ export const addFileChange = ({ file, eventType }) => {
11
+ fileChanges[file] = eventType
12
+ if (isLivereloadEnabled()) {
13
+ reloadIfNeeded()
14
+ } else {
15
+ filechangeCallback()
16
+ }
17
+ }
18
+
19
+ export const setFileChangeCallback = (callback) => {
20
+ filechangeCallback = callback
21
+ }
22
+
23
+ export const reloadIfNeeded = () => {
24
+ const customReloads = []
25
+ const cssReloads = []
26
+ const fullReloads = []
27
+
28
+ Object.keys(fileChanges).forEach((key) => {
29
+ const livereloadCallback = window.__jsenv__.livereloadingCallbacks[key]
30
+ if (livereloadCallback) {
31
+ customReloads.push(() => {
32
+ delete fileChanges[key]
33
+ livereloadCallback({
34
+ reloadPage,
35
+ })
36
+ })
37
+ } else if (
38
+ key.endsWith(".css") ||
39
+ key.endsWith(".scss") ||
40
+ key.endsWith(".sass")
41
+ ) {
42
+ cssReloads.push(() => {
43
+ delete fileChanges[key]
44
+ })
45
+ } else {
46
+ fullReloads.push(key)
47
+ }
48
+ })
49
+
50
+ if (fullReloads.length > 0) {
51
+ reloadPage()
52
+ return
53
+ }
54
+
55
+ customReloads.forEach((customReload) => {
56
+ customReload()
57
+ })
58
+
59
+ if (cssReloads.length) {
60
+ reloadAllCss()
61
+ cssReloads.forEach((cssReload) => {
62
+ cssReload()
63
+ })
64
+ }
65
+
66
+ filechangeCallback()
67
+ }
68
+
69
+ const reloadAllCss = () => {
70
+ const links = Array.from(window.parent.document.getElementsByTagName("link"))
71
+ links.forEach((link) => {
72
+ if (link.rel === "stylesheet") {
73
+ const url = new URL(link.href)
74
+ url.searchParams.set("t", Date.now())
75
+ link.href = String(url)
76
+ }
77
+ })
78
+ }
79
+
80
+ const reloadPage = () => {
81
+ window.parent.location.reload(true)
82
+ }
@@ -0,0 +1,13 @@
1
+ /* eslint-env browser */
2
+
3
+ export const isLivereloadEnabled = () => {
4
+ const value = window.localStorage.hasOwnProperty("livereload")
5
+ if (value === "0") {
6
+ return false
7
+ }
8
+ return true
9
+ }
10
+
11
+ export const setLivereloadPreference = (value) => {
12
+ window.localStorage.setItem("livereload", value ? "1" : "0")
13
+ }
@@ -4,7 +4,7 @@
4
4
  <title>Exploring</title>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <meta charset="utf-8" />
7
- <link rel="icon" href="../jsenv.png" />
7
+ <link rel="icon" href="../../jsenv.png" />
8
8
  <link rel="stylesheet" type="text/css" href="./exploring.css" />
9
9
  </head>
10
10
 
@@ -35,7 +35,12 @@
35
35
  <div id="explorables-header">
36
36
  <div id="explorables_header_and_menu">
37
37
  <h2 style="white-space: nowrap">
38
- <svg id="fileIconSvgConfig" viewBox="0 0 24 24">
38
+ <svg
39
+ id="fileIconSvgConfig"
40
+ viewBox="0 0 24 24"
41
+ width="32"
42
+ height="32"
43
+ >
39
44
  <path d="M0 0h24v24H0V0z" fill="none" />
40
45
  <path
41
46
  d="M8 16h8v2H8zm0-4h8v2H8zm6-10H6c-1.1 0-2 .9-2 2v16c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z"
@@ -69,6 +74,6 @@
69
74
  </section>
70
75
  </article>
71
76
  </div>
72
- <script src="/.jsenv/exploring.index.js"></script>
77
+ <script type="module" src="./exploring.js"></script>
73
78
  </body>
74
79
  </html>
@@ -1,6 +1,4 @@
1
- import { createDetailedMessage } from "@jsenv/logger"
2
-
3
- import { fetchJson } from "../browser-utils/fetchJson.js"
1
+ import { fetchJson } from "../../browser_utils/fetchJson.js"
4
2
 
5
3
  export const fetchExploringJson = async ({ signal } = {}) => {
6
4
  try {
@@ -13,12 +11,9 @@ export const fetchExploringJson = async ({ signal } = {}) => {
13
11
  throw e
14
12
  }
15
13
  throw new Error(
16
- createDetailedMessage(
17
- `Cannot communicate with exploring server due to a network error`,
18
- {
19
- ["error stack"]: e.stack,
20
- },
21
- ),
14
+ `Cannot communicate with exploring server due to a network error
15
+ --- error stack ---
16
+ ${e.stack}`,
22
17
  )
23
18
  }
24
19
  }
@@ -0,0 +1,48 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Jsenv redirector</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta charset="utf-8" />
7
+ <link rel="icon" href="data:," />
8
+ </head>
9
+
10
+ <body>
11
+ <script
12
+ type="importmap"
13
+ src="../../../../node_resolution.importmap"
14
+ ></script>
15
+ <script type="module">
16
+ import { scanBrowserRuntimeFeatures } from "../../browser_feature_detection/browser_feature_detection.js"
17
+
18
+ const redirect = async () => {
19
+ const redirectTarget = new URLSearchParams(window.location.search).get(
20
+ "redirect",
21
+ )
22
+ const browserRuntimeFeaturesReport = await scanBrowserRuntimeFeatures({
23
+ failFastOnFeatureDetection: true,
24
+ })
25
+
26
+ const href = `${getDirectoryUrl(
27
+ browserRuntimeFeaturesReport,
28
+ )}${redirectTarget}`
29
+ // It's IMPORTANT to use location.replace and NOT location.href = url
30
+ // otherwise it would break the back button
31
+ window.location.replace(href)
32
+ }
33
+
34
+ const getDirectoryUrl = ({
35
+ canAvoidCompilation,
36
+ outDirectoryRelativeUrl,
37
+ compileId,
38
+ }) => {
39
+ if (canAvoidCompilation) {
40
+ return `/`
41
+ }
42
+ return `/${outDirectoryRelativeUrl}${compileId}/`
43
+ }
44
+
45
+ redirect()
46
+ </script>
47
+ </body>
48
+ </html>
@@ -1,4 +1,4 @@
1
- import { scanBrowserRuntimeFeatures } from "../../runtime/createBrowserRuntime/scanBrowserRuntimeFeatures.js"
1
+ import { scanBrowserRuntimeFeatures } from "../../../browser_feature_detection/browser_feature_detection.js"
2
2
  import { removeForceHideElement } from "../util/dom.js"
3
3
  import { enableVariant } from "../variant/variant.js"
4
4
 
@@ -133,8 +133,7 @@ const getBrowserSupportMessage = ({
133
133
  }) => {
134
134
  const parts = []
135
135
 
136
- const { importmapSupported } = featuresReport
137
- if (importmapSupported) {
136
+ if (featuresReport.importmap) {
138
137
  if (!missingOnly) {
139
138
  if (inlineImportMapIntoHTML) {
140
139
  parts.push(`importmaps are supported (only when inlined in html files)`)
@@ -146,8 +145,7 @@ const getBrowserSupportMessage = ({
146
145
  parts.push(`importmaps are not supported`)
147
146
  }
148
147
 
149
- const { dynamicImportSupported } = featuresReport
150
- if (dynamicImportSupported) {
148
+ if (featuresReport.dynamicImport) {
151
149
  if (!missingOnly) {
152
150
  parts.push(`dynamic imports are supported`)
153
151
  }
@@ -155,8 +153,7 @@ const getBrowserSupportMessage = ({
155
153
  parts.push(`dynamic imports are not supported`)
156
154
  }
157
155
 
158
- const { topLevelAwaitSupported } = featuresReport
159
- if (topLevelAwaitSupported) {
156
+ if (featuresReport.topLevelAwait) {
160
157
  if (!missingOnly) {
161
158
  parts.push(`top level await is supported`)
162
159
  }
@@ -0,0 +1,83 @@
1
+ import { removeForceHideElement } from "../util/dom.js"
2
+ import { enableVariant } from "../variant/variant.js"
3
+ import {
4
+ toggleTooltip,
5
+ removeAutoShowTooltip,
6
+ autoShowTooltip,
7
+ } from "../tooltip/tooltip.js"
8
+
9
+ let livereloadingAvailableOnServer = false
10
+ const parentEventSourceClient = window.parent.__jsenv_event_source_client__
11
+
12
+ export const initToolbarEventSource = ({ livereloading }) => {
13
+ removeForceHideElement(document.querySelector("#eventsource-indicator"))
14
+ livereloadingAvailableOnServer = livereloading
15
+ if (!livereloadingAvailableOnServer) {
16
+ disableLivereloadSetting()
17
+ }
18
+ parentEventSourceClient.setConnectionStatusChangeCallback(() => {
19
+ updateEventSourceIndicator()
20
+ })
21
+ const livereloadCheckbox = document.querySelector("#toggle-livereload")
22
+ livereloadCheckbox.checked = parentEventSourceClient.isLivereloadEnabled()
23
+ livereloadCheckbox.onchange = () => {
24
+ parentEventSourceClient.setLivereloadPreference(livereloadCheckbox.checked)
25
+ updateEventSourceIndicator()
26
+ }
27
+ updateEventSourceIndicator()
28
+ }
29
+
30
+ const updateEventSourceIndicator = () => {
31
+ const eventSourceIndicator = document.querySelector("#eventsource-indicator")
32
+ const fileChanges = parentEventSourceClient.getFileChanges()
33
+ const changeCount = Object.keys(fileChanges).length
34
+ const eventSourceConnectionState =
35
+ parentEventSourceClient.getConnectionStatus()
36
+ enableVariant(eventSourceIndicator, {
37
+ eventsource: eventSourceConnectionState,
38
+ livereload: parentEventSourceClient.isLivereloadEnabled() ? "on" : "off",
39
+ changes: changeCount > 0 ? "yes" : "no",
40
+ })
41
+
42
+ const variantNode = document.querySelector(
43
+ "#eventsource-indicator > [data-when-active]",
44
+ )
45
+ variantNode.querySelector("button").onclick = () => {
46
+ toggleTooltip(eventSourceIndicator)
47
+ }
48
+
49
+ if (eventSourceConnectionState === "connecting") {
50
+ variantNode.querySelector("a").onclick = () => {
51
+ parentEventSourceClient.disconnect()
52
+ }
53
+ } else if (eventSourceConnectionState === "connected") {
54
+ removeAutoShowTooltip(eventSourceIndicator)
55
+ if (changeCount) {
56
+ const changeLink = variantNode.querySelector(".eventsource-changes-link")
57
+ changeLink.innerHTML = changeCount
58
+ changeLink.onclick = () => {
59
+ console.log(JSON.stringify(fileChanges, null, " "), fileChanges)
60
+ // eslint-disable-next-line no-alert
61
+ window.parent.alert(JSON.stringify(fileChanges, null, " "))
62
+ }
63
+ variantNode.querySelector(".eventsource-reload-link").onclick = () => {
64
+ parentEventSourceClient.reloadIfNeeded()
65
+ }
66
+ }
67
+ } else if (eventSourceConnectionState === "disconnected") {
68
+ autoShowTooltip(eventSourceIndicator)
69
+ variantNode.querySelector("a").onclick = () => {
70
+ parentEventSourceClient.connect()
71
+ }
72
+ }
73
+ }
74
+
75
+ const disableLivereloadSetting = () => {
76
+ document
77
+ .querySelector(".settings-livereload")
78
+ .setAttribute("data-disabled", "true")
79
+ document
80
+ .querySelector(".settings-livereload")
81
+ .setAttribute("title", `Livereload not available: disabled by server`)
82
+ document.querySelector("#toggle-livereload").disabled = true
83
+ }