@jsenv/core 29.8.6 → 29.9.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 (52) hide show
  1. package/README.md +1 -1
  2. package/dist/html/explorer.html +4 -3
  3. package/dist/js/autoreload.js +59 -39
  4. package/dist/js/server_events_client.js +9 -4
  5. package/dist/js/supervisor.js +4 -2
  6. package/dist/main.js +50 -2085
  7. package/package.json +2 -2
  8. package/src/build/build.js +33 -33
  9. package/src/plugins/autoreload/client/autoreload.js +57 -31
  10. package/src/plugins/autoreload/client/url_helpers.js +7 -4
  11. package/src/plugins/explorer/client/explorer.html +4 -3
  12. package/src/plugins/plugins.js +1 -1
  13. package/src/plugins/ribbon/jsenv_plugin_ribbon.js +6 -1
  14. package/src/plugins/server_events/client/connection_manager.js +8 -3
  15. package/src/plugins/supervisor/client/supervisor.js +4 -2
  16. package/src/plugins/url_resolution/jsenv_plugin_url_resolution.js +6 -2
  17. package/src/plugins/url_resolution/node_esm_resolver.js +6 -1
  18. package/dist/js/html_src_set.js +0 -20
  19. package/src/plugins/autoreload/client/autoreload_preference.js +0 -11
  20. package/src/plugins/toolbar/client/animation/toolbar_animation.js +0 -39
  21. package/src/plugins/toolbar/client/eventsource/eventsource.css +0 -83
  22. package/src/plugins/toolbar/client/eventsource/toolbar_eventsource.js +0 -57
  23. package/src/plugins/toolbar/client/execution/execution.css +0 -79
  24. package/src/plugins/toolbar/client/execution/toolbar_execution.js +0 -88
  25. package/src/plugins/toolbar/client/focus/focus.css +0 -61
  26. package/src/plugins/toolbar/client/focus/toolbar_focus.js +0 -19
  27. package/src/plugins/toolbar/client/jsenv_logo.svg +0 -140
  28. package/src/plugins/toolbar/client/notification/toolbar_notification.js +0 -181
  29. package/src/plugins/toolbar/client/responsive/overflow_menu.css +0 -61
  30. package/src/plugins/toolbar/client/responsive/toolbar_responsive.js +0 -103
  31. package/src/plugins/toolbar/client/settings/settings.css +0 -201
  32. package/src/plugins/toolbar/client/settings/toolbar_settings.js +0 -47
  33. package/src/plugins/toolbar/client/theme/jsenv_theme.css +0 -77
  34. package/src/plugins/toolbar/client/theme/light_theme.css +0 -106
  35. package/src/plugins/toolbar/client/theme/toolbar_theme.js +0 -34
  36. package/src/plugins/toolbar/client/toolbar.html +0 -457
  37. package/src/plugins/toolbar/client/toolbar_injector.js +0 -218
  38. package/src/plugins/toolbar/client/toolbar_main.css +0 -172
  39. package/src/plugins/toolbar/client/toolbar_main.js +0 -197
  40. package/src/plugins/toolbar/client/tooltip/tooltip.css +0 -61
  41. package/src/plugins/toolbar/client/tooltip/tooltip.js +0 -39
  42. package/src/plugins/toolbar/client/util/animation.js +0 -305
  43. package/src/plugins/toolbar/client/util/dom.js +0 -108
  44. package/src/plugins/toolbar/client/util/fetch_using_xhr.js +0 -400
  45. package/src/plugins/toolbar/client/util/fetching.js +0 -14
  46. package/src/plugins/toolbar/client/util/iframe_to_parent_href.js +0 -10
  47. package/src/plugins/toolbar/client/util/jsenv_logger.js +0 -28
  48. package/src/plugins/toolbar/client/util/preferences.js +0 -10
  49. package/src/plugins/toolbar/client/util/responsive.js +0 -112
  50. package/src/plugins/toolbar/client/util/util.js +0 -19
  51. package/src/plugins/toolbar/client/variant/variant.js +0 -74
  52. package/src/plugins/toolbar/jsenv_plugin_toolbar.js +0 -62
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "29.8.6",
3
+ "version": "29.9.1",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -73,7 +73,7 @@
73
73
  "@jsenv/importmap": "1.2.1",
74
74
  "@jsenv/integrity": "0.0.1",
75
75
  "@jsenv/log": "3.3.1",
76
- "@jsenv/node-esm-resolution": "1.0.0",
76
+ "@jsenv/node-esm-resolution": "1.0.1",
77
77
  "@jsenv/server": "14.1.10",
78
78
  "@jsenv/sourcemap": "1.0.7",
79
79
  "@jsenv/uneval": "1.6.0",
@@ -669,43 +669,43 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
669
669
  }
670
670
  if (rawUrlInfo.isEntryPoint) {
671
671
  addToBundlerIfAny(rawUrlInfo)
672
- if (rawUrlInfo.type === "html") {
673
- rawUrlInfo.dependencies.forEach((dependencyUrl) => {
674
- const dependencyUrlInfo = rawGraph.getUrlInfo(dependencyUrl)
675
- if (dependencyUrlInfo.isInline) {
676
- if (dependencyUrlInfo.type === "js_module") {
677
- // bundle inline script type module deps
678
- dependencyUrlInfo.references.forEach((inlineScriptRef) => {
679
- if (inlineScriptRef.type === "js_import") {
680
- const inlineUrlInfo = rawGraph.getUrlInfo(
681
- inlineScriptRef.url,
682
- )
683
- addToBundlerIfAny(inlineUrlInfo)
684
- }
685
- })
686
- }
687
- // inline content cannot be bundled
688
- return
672
+ }
673
+ if (rawUrlInfo.type === "html") {
674
+ rawUrlInfo.dependencies.forEach((dependencyUrl) => {
675
+ const dependencyUrlInfo = rawGraph.getUrlInfo(dependencyUrl)
676
+ if (dependencyUrlInfo.isInline) {
677
+ if (dependencyUrlInfo.type === "js_module") {
678
+ // bundle inline script type module deps
679
+ dependencyUrlInfo.references.forEach((inlineScriptRef) => {
680
+ if (inlineScriptRef.type === "js_import") {
681
+ const inlineUrlInfo = rawGraph.getUrlInfo(
682
+ inlineScriptRef.url,
683
+ )
684
+ addToBundlerIfAny(inlineUrlInfo)
685
+ }
686
+ })
689
687
  }
690
- addToBundlerIfAny(dependencyUrlInfo)
691
- })
692
- rawUrlInfo.references.forEach((reference) => {
688
+ // inline content cannot be bundled
689
+ return
690
+ }
691
+ addToBundlerIfAny(dependencyUrlInfo)
692
+ })
693
+ rawUrlInfo.references.forEach((reference) => {
694
+ if (
695
+ reference.isResourceHint &&
696
+ reference.expectedType === "js_module"
697
+ ) {
698
+ const referencedUrlInfo = rawGraph.getUrlInfo(reference.url)
693
699
  if (
694
- reference.isResourceHint &&
695
- reference.expectedType === "js_module"
700
+ referencedUrlInfo &&
701
+ // something else than the resource hint is using this url
702
+ referencedUrlInfo.dependents.size > 0
696
703
  ) {
697
- const referencedUrlInfo = rawGraph.getUrlInfo(reference.url)
698
- if (
699
- referencedUrlInfo &&
700
- // something else than the resource hint is using this url
701
- referencedUrlInfo.dependents.size > 0
702
- ) {
703
- addToBundlerIfAny(referencedUrlInfo)
704
- }
704
+ addToBundlerIfAny(referencedUrlInfo)
705
705
  }
706
- })
707
- return
708
- }
706
+ }
707
+ })
708
+ return
709
709
  }
710
710
  // File referenced with new URL('./file.js', import.meta.url)
711
711
  // are entry points that should be bundled
@@ -1,8 +1,4 @@
1
1
  import { urlHotMetas } from "../../import_meta_hot/client/import_meta_hot.js"
2
- import {
3
- isAutoreloadEnabled,
4
- setAutoreloadPreference,
5
- } from "./autoreload_preference.js"
6
2
  import { compareTwoUrlPaths } from "./url_helpers.js"
7
3
  import {
8
4
  reloadHtmlPage,
@@ -12,39 +8,63 @@ import {
12
8
 
13
9
  const reloader = {
14
10
  urlHotMetas,
15
- isAutoreloadEnabled,
16
- setAutoreloadPreference,
17
- status: "idle",
18
- currentExecution: null,
19
- onstatuschange: () => {},
20
- setStatus: (status) => {
21
- reloader.status = status
22
- reloader.onstatuschange()
11
+ status: {
12
+ value: "idle",
13
+ onchange: () => {},
14
+ goTo: (value) => {
15
+ reloader.status.value = value
16
+ reloader.status.onchange()
17
+ },
23
18
  },
24
- messages: [],
25
- addMessage: (reloadMessage) => {
26
- reloader.messages.push(reloadMessage)
27
- if (isAutoreloadEnabled()) {
28
- reloader.reload()
29
- } else {
30
- reloader.setStatus("can_reload")
31
- }
19
+ autoreload: {
20
+ enabled: ["1", null].includes(window.localStorage.getItem("autoreload")),
21
+ onchange: () => {},
22
+ enable: () => {
23
+ reloader.autoreload.enabled = true
24
+ window.localStorage.setItem("autoreload", "1")
25
+ reloader.autoreload.onchange()
26
+ },
27
+ disable: () => {
28
+ reloader.autoreload.enabled = false
29
+ window.localStorage.setItem("autoreload", "0")
30
+ reloader.autoreload.onchange()
31
+ },
32
32
  },
33
+ changes: {
34
+ value: [],
35
+ onchange: () => {},
36
+ add: (reloadMessage) => {
37
+ reloader.changes.value.push(reloadMessage)
38
+ reloader.changes.onchange()
39
+ if (reloader.autoreload.enabled) {
40
+ reloader.reload()
41
+ } else {
42
+ reloader.status.goTo("can_reload")
43
+ }
44
+ },
45
+ remove: (reloadMessage) => {
46
+ const index = reloader.changes.value.indexOf(reloadMessage)
47
+ if (index > -1) {
48
+ reloader.changes.value.splice(index, 1)
49
+ if (reloader.changes.value.length === 0) {
50
+ reloader.status.goTo("idle")
51
+ }
52
+ reloader.changes.onchange()
53
+ }
54
+ },
55
+ },
56
+ currentExecution: null,
33
57
  reload: () => {
34
- const someEffectIsFullReload = reloader.messages.some(
58
+ const someEffectIsFullReload = reloader.changes.value.some(
35
59
  (reloadMessage) => reloadMessage.type === "full",
36
60
  )
37
61
  if (someEffectIsFullReload) {
38
62
  reloadHtmlPage()
39
63
  return
40
64
  }
41
- reloader.setStatus("reloading")
65
+ reloader.status.goTo("reloading")
42
66
  const onApplied = (reloadMessage) => {
43
- const index = reloader.messages.indexOf(reloadMessage)
44
- reloader.messages.splice(index, 1)
45
- if (reloader.messages.length === 0) {
46
- reloader.setStatus("idle")
47
- }
67
+ reloader.changes.remove(reloadMessage)
48
68
  }
49
69
  const setReloadMessagePromise = (reloadMessage, promise) => {
50
70
  promise.then(
@@ -53,7 +73,7 @@ const reloader = {
53
73
  reloader.currentExecution = null
54
74
  },
55
75
  (e) => {
56
- reloader.setStatus("failed")
76
+ reloader.status.goTo("failed")
57
77
  if (typeof window.reportError === "function") {
58
78
  window.reportError(e)
59
79
  } else {
@@ -67,7 +87,7 @@ This could be due to syntax errors or importing non-existent modules (see errors
67
87
  },
68
88
  )
69
89
  }
70
- reloader.messages.forEach((reloadMessage) => {
90
+ reloader.changes.value.forEach((reloadMessage) => {
71
91
  if (reloadMessage.type === "hot") {
72
92
  const promise = addToHotQueue(() => {
73
93
  return applyHotReload(reloadMessage)
@@ -162,7 +182,13 @@ const applyHotReload = async ({ hotInstructions }) => {
162
182
  return namespace
163
183
  }
164
184
  if (type === "html") {
165
- if (!compareTwoUrlPaths(urlToFetch, window.location.href)) {
185
+ const isRootHtmlFile =
186
+ window.location.pathname === "/" &&
187
+ new URL(urlToFetch).pathname.slice(1).indexOf("/") === -1
188
+ if (
189
+ !isRootHtmlFile &&
190
+ !compareTwoUrlPaths(urlToFetch, window.location.href)
191
+ ) {
166
192
  // we are not in that HTML page
167
193
  return null
168
194
  }
@@ -194,6 +220,6 @@ const applyHotReload = async ({ hotInstructions }) => {
194
220
  window.__reloader__ = reloader
195
221
  window.__server_events__.listenEvents({
196
222
  reload: (reloadServerEvent) => {
197
- reloader.addMessage(reloadServerEvent.data)
223
+ reloader.changes.add(reloadServerEvent.data)
198
224
  },
199
225
  })
@@ -4,10 +4,13 @@ export const compareTwoUrlPaths = (url, otherUrl) => {
4
4
  }
5
5
  const urlObject = new URL(url)
6
6
  const otherUrlObject = new URL(otherUrl)
7
- return (
8
- urlObject.origin === otherUrlObject.origin &&
9
- urlObject.pathname === otherUrlObject.pathname
10
- )
7
+ if (urlObject.origin !== otherUrlObject.origin) {
8
+ return false
9
+ }
10
+ if (urlObject.pathname !== otherUrlObject.pathname) {
11
+ return false
12
+ }
13
+ return true
11
14
  }
12
15
 
13
16
  export const injectQuery = (url, query) => {
@@ -175,6 +175,7 @@
175
175
  padding-right: 25px;
176
176
  padding-top: 25px;
177
177
  background-color: #204143;
178
+ position: relative;
178
179
  }
179
180
 
180
181
  #explorables_header_bottom_spacing {
@@ -220,7 +221,7 @@
220
221
  fill: #24b1b0;
221
222
  }
222
223
 
223
- #fileIconSvgConfig {
224
+ #explorables_icon {
224
225
  width: 25px;
225
226
  height: 25px;
226
227
  stroke: none;
@@ -325,9 +326,9 @@
325
326
  <section id="explorables">
326
327
  <div id="explorables-header">
327
328
  <div id="explorables_header_and_menu">
328
- <h2 style="white-space: nowrap">
329
+ <h2>
329
330
  <svg
330
- id="fileIconSvgConfig"
331
+ id="explorables_icon"
331
332
  viewBox="0 0 24 24"
332
333
  width="32"
333
334
  height="32"
@@ -83,8 +83,8 @@ export const getCorePlugins = ({
83
83
  jsenvPluginHttpUrls(),
84
84
  jsenvPluginUrlResolution({
85
85
  runtimeCompat,
86
- urlResolution,
87
86
  clientMainFileUrl,
87
+ urlResolution,
88
88
  }),
89
89
  jsenvPluginUrlVersion(),
90
90
  jsenvPluginCommonJsGlobals(),
@@ -14,7 +14,9 @@ export const jsenvPluginRibbon = ({
14
14
  const ribbonClientFileUrl = new URL("./client/ribbon.js", import.meta.url)
15
15
  const associations = URL_META.resolveAssociations(
16
16
  {
17
- ribbon: { [htmlInclude]: true },
17
+ ribbon: {
18
+ [htmlInclude]: true,
19
+ },
18
20
  },
19
21
  rootDirectoryUrl,
20
22
  )
@@ -23,6 +25,9 @@ export const jsenvPluginRibbon = ({
23
25
  appliesDuring: "dev",
24
26
  transformUrlContent: {
25
27
  html: (urlInfo, context) => {
28
+ if (urlInfo.data.isJsenvToolbar || urlInfo.data.noribbon) {
29
+ return null
30
+ }
26
31
  const { ribbon } = URL_META.applyAssociations({
27
32
  url: asUrlWithoutSearch(urlInfo.url),
28
33
  associations,
@@ -34,7 +34,8 @@ export const createConnectionManager = (
34
34
  let msSpent = 0
35
35
  const attempt = () => {
36
36
  readyState.goTo(READY_STATES.CONNECTING)
37
- _disconnect = attemptConnection({
37
+ let timeout
38
+ const cancelAttempt = attemptConnection({
38
39
  onClosed: () => {
39
40
  if (!retry) {
40
41
  readyState.goTo(READY_STATES.CLOSED)
@@ -55,7 +56,6 @@ export const createConnectionManager = (
55
56
  )
56
57
  return
57
58
  }
58
-
59
59
  // if closed while open -> connection lost
60
60
  // otherwise it's the attempt to connect for the first time
61
61
  // or to reconnect
@@ -63,7 +63,7 @@ export const createConnectionManager = (
63
63
  console.info(`[jsenv] server connection lost; retrying to connect`)
64
64
  }
65
65
  retryCount++
66
- setTimeout(() => {
66
+ timeout = setTimeout(() => {
67
67
  msSpent += retryAfter
68
68
  attempt()
69
69
  }, retryAfter)
@@ -73,6 +73,11 @@ export const createConnectionManager = (
73
73
  // console.info(`[jsenv] connected to server`)
74
74
  },
75
75
  })
76
+ _disconnect = () => {
77
+ cancelAttempt()
78
+ clearTimeout(timeout)
79
+ readyState.goTo(READY_STATES.CLOSED)
80
+ }
76
81
  }
77
82
  attempt()
78
83
  }
@@ -664,8 +664,10 @@ window.__supervisor__ = (() => {
664
664
  errorDetailsPromise,
665
665
  })
666
666
  if (window.__reloader__) {
667
- window.__reloader__.onstatuschange = () => {
668
- if (window.__reloader__.status === "reloading") {
667
+ const onchange = window.__reloader__.status.onchange
668
+ window.__reloader__.status.onchange = () => {
669
+ onchange()
670
+ if (window.__reloader__.status.value === "reloading") {
669
671
  removeErrorOverlay()
670
672
  }
671
673
  }
@@ -70,10 +70,11 @@ export const jsenvPluginUrlResolution = ({
70
70
  }
71
71
  if (node_esm) {
72
72
  if (node_esm === true) node_esm = {}
73
- const { packageConditions } = node_esm
73
+ const { packageConditions, preservesSymlink } = node_esm
74
74
  resolvers[urlType] = createNodeEsmResolver({
75
75
  runtimeCompat,
76
76
  packageConditions,
77
+ preservesSymlink,
77
78
  })
78
79
  } else if (web) {
79
80
  resolvers[urlType] = resolveUrlUsingWebResolution
@@ -81,7 +82,10 @@ export const jsenvPluginUrlResolution = ({
81
82
  })
82
83
 
83
84
  if (!resolvers.js_module) {
84
- resolvers.js_module = createNodeEsmResolver({ runtimeCompat })
85
+ resolvers.js_module = createNodeEsmResolver({
86
+ runtimeCompat,
87
+ preservesSymlink: true,
88
+ })
85
89
  }
86
90
  if (!resolvers["*"]) {
87
91
  resolvers["*"] = resolveUrlUsingWebResolution
@@ -16,7 +16,11 @@ import {
16
16
  defaultReadPackageJson,
17
17
  } from "@jsenv/node-esm-resolution"
18
18
 
19
- export const createNodeEsmResolver = ({ runtimeCompat, packageConditions }) => {
19
+ export const createNodeEsmResolver = ({
20
+ runtimeCompat,
21
+ packageConditions,
22
+ preservesSymlink,
23
+ }) => {
20
24
  const nodeRuntimeEnabled = Object.keys(runtimeCompat).includes("node")
21
25
  // https://nodejs.org/api/esm.html#resolver-algorithm-specification
22
26
  packageConditions = packageConditions || [
@@ -37,6 +41,7 @@ export const createNodeEsmResolver = ({ runtimeCompat, packageConditions }) => {
37
41
  conditions: packageConditions,
38
42
  parentUrl,
39
43
  specifier: reference.specifier,
44
+ preservesSymlink,
40
45
  })
41
46
  if (context.dev) {
42
47
  const dependsOnPackageJson =
@@ -1,20 +0,0 @@
1
- const parseSrcSet = srcset => {
2
- const srcCandidates = [];
3
- srcset.split(",").forEach(set => {
4
- const [specifier, descriptor] = set.trim().split(" ");
5
- srcCandidates.push({
6
- specifier,
7
- descriptor
8
- });
9
- });
10
- return srcCandidates;
11
- };
12
- const stringifySrcSet = srcCandidates => {
13
- const srcset = srcCandidates.map(({
14
- specifier,
15
- descriptor
16
- }) => `${specifier} ${descriptor}`).join(", ");
17
- return srcset;
18
- };
19
-
20
- export { parseSrcSet as p, stringifySrcSet as s };
@@ -1,11 +0,0 @@
1
- export const isAutoreloadEnabled = () => {
2
- const value = window.localStorage.getItem("autoreload")
3
- if (value === "0") {
4
- return false
5
- }
6
- return true
7
- }
8
-
9
- export const setAutoreloadPreference = (value) => {
10
- window.localStorage.setItem("autoreload", value ? "1" : "0")
11
- }
@@ -1,39 +0,0 @@
1
- import { createPreference } from "../util/preferences.js"
2
-
3
- const animationPreference = createPreference("animation")
4
-
5
- export const renderToolbarAnimation = () => {
6
- const animCheckbox = document.querySelector("#toggle-anims")
7
- animCheckbox.checked = getAnimationPreference()
8
- animCheckbox.onchange = () => {
9
- setAnimationPreference(animCheckbox.checked)
10
- onPreferenceChange(animCheckbox.checked)
11
- }
12
- onPreferenceChange()
13
-
14
- // enable toolbar transition only after first render
15
- setTimeout(() => {
16
- document.querySelector("#toolbar").setAttribute("data-animate", "")
17
- })
18
- }
19
-
20
- const onPreferenceChange = (value = getAnimationPreference()) => {
21
- if (value) {
22
- enableAnimation()
23
- } else {
24
- disableAnimation()
25
- }
26
- }
27
-
28
- const getAnimationPreference = () =>
29
- animationPreference.has() ? animationPreference.get() : true
30
-
31
- const setAnimationPreference = (value) => animationPreference.set(value)
32
-
33
- const enableAnimation = () => {
34
- document.documentElement.removeAttribute("data-animation-disabled")
35
- }
36
-
37
- const disableAnimation = () => {
38
- document.documentElement.setAttribute("data-animation-disabled", "")
39
- }
@@ -1,83 +0,0 @@
1
- #eventsource-indicator button {
2
- position: relative;
3
- }
4
-
5
- #eventsource-indicator button svg {
6
- width: 40px;
7
- height: 40px;
8
- }
9
-
10
- #eventsource-indicator .event-source-autoreload {
11
- position: absolute;
12
- width: 32px;
13
- height: 32px;
14
- margin: 4px;
15
- left: 0;
16
- top: 0;
17
- }
18
-
19
- .event-source-autoreload[data-variant="enabled"] {
20
- color: green;
21
- }
22
-
23
- #eventsource-indicator .event-source-icon {
24
- width: 40px;
25
- height: 40px;
26
- }
27
-
28
- .eventsource-circle {
29
- stroke: black;
30
- stroke-width: 0;
31
- }
32
-
33
- .eventsource-circle[data-variant="off"] {
34
- fill: #cecece;
35
- }
36
-
37
- .eventsource-circle[data-variant="connecting"] {
38
- fill: #cecece;
39
- animation: wink 1.2s ease-out infinite;
40
- transform-origin: center;
41
- }
42
-
43
- @keyframes wink {
44
- 0% {
45
- opacity: 0;
46
- }
47
- 80% {
48
- opacity: 1;
49
- }
50
- 100% {
51
- opacity: 0;
52
- }
53
- }
54
-
55
- .eventsource-ring {
56
- stroke: rgba(206, 206, 206, 0.46);
57
- stroke-width: 4;
58
- fill: transparent;
59
- animation: pulse 1.2s ease-out infinite;
60
- transform-origin: center;
61
- }
62
-
63
- @keyframes pulse {
64
- 0% {
65
- transform: scale(0);
66
- opacity: 0;
67
- }
68
- 50% {
69
- opacity: 1;
70
- }
71
- 100% {
72
- transform: scale(1);
73
- opacity: 0;
74
- }
75
- }
76
-
77
- .eventsource-circle[data-variant="connected"] {
78
- fill: green;
79
- }
80
-
81
- .eventsource-circle[data-variant="failed"] {
82
- fill: #cc0000;
83
- }
@@ -1,57 +0,0 @@
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
- const parentEventSourceClient = window.parent.__jsenv_event_source_client__
10
-
11
- export const initToolbarEventSource = () => {
12
- removeForceHideElement(document.querySelector("#eventsource-indicator"))
13
- if (!parentEventSourceClient) {
14
- disableAutoreloadSetting()
15
- return
16
- }
17
- parentEventSourceClient.status.onchange = () => {
18
- updateEventSourceIndicator()
19
- }
20
- updateEventSourceIndicator()
21
- }
22
-
23
- const updateEventSourceIndicator = () => {
24
- const eventSourceIndicator = document.querySelector("#eventsource-indicator")
25
- const eventSourceConnectionState = parentEventSourceClient.status.value
26
- enableVariant(eventSourceIndicator, {
27
- eventsource: eventSourceConnectionState,
28
- })
29
- const variantNode = document.querySelector(
30
- "#eventsource-indicator > [data-when-active]",
31
- )
32
- variantNode.querySelector("button").onclick = () => {
33
- toggleTooltip(eventSourceIndicator)
34
- }
35
- if (eventSourceConnectionState === "connecting") {
36
- variantNode.querySelector("a").onclick = () => {
37
- parentEventSourceClient.disconnect()
38
- }
39
- } else if (eventSourceConnectionState === "connected") {
40
- removeAutoShowTooltip(eventSourceIndicator)
41
- } else if (eventSourceConnectionState === "disconnected") {
42
- autoShowTooltip(eventSourceIndicator)
43
- variantNode.querySelector("a").onclick = () => {
44
- parentEventSourceClient.connect()
45
- }
46
- }
47
- }
48
-
49
- const disableAutoreloadSetting = () => {
50
- document
51
- .querySelector(".settings-autoreload")
52
- .setAttribute("data-disabled", "true")
53
- document
54
- .querySelector(".settings-autoreload")
55
- .setAttribute("title", `Autoreload not available: disabled by server`)
56
- document.querySelector("#toggle-autoreload").disabled = true
57
- }