@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.
- package/README.md +1 -1
- package/dist/html/explorer.html +4 -3
- package/dist/js/autoreload.js +59 -39
- package/dist/js/server_events_client.js +9 -4
- package/dist/js/supervisor.js +4 -2
- package/dist/main.js +50 -2085
- package/package.json +2 -2
- package/src/build/build.js +33 -33
- package/src/plugins/autoreload/client/autoreload.js +57 -31
- package/src/plugins/autoreload/client/url_helpers.js +7 -4
- package/src/plugins/explorer/client/explorer.html +4 -3
- package/src/plugins/plugins.js +1 -1
- package/src/plugins/ribbon/jsenv_plugin_ribbon.js +6 -1
- package/src/plugins/server_events/client/connection_manager.js +8 -3
- package/src/plugins/supervisor/client/supervisor.js +4 -2
- package/src/plugins/url_resolution/jsenv_plugin_url_resolution.js +6 -2
- package/src/plugins/url_resolution/node_esm_resolver.js +6 -1
- package/dist/js/html_src_set.js +0 -20
- package/src/plugins/autoreload/client/autoreload_preference.js +0 -11
- package/src/plugins/toolbar/client/animation/toolbar_animation.js +0 -39
- package/src/plugins/toolbar/client/eventsource/eventsource.css +0 -83
- package/src/plugins/toolbar/client/eventsource/toolbar_eventsource.js +0 -57
- package/src/plugins/toolbar/client/execution/execution.css +0 -79
- package/src/plugins/toolbar/client/execution/toolbar_execution.js +0 -88
- package/src/plugins/toolbar/client/focus/focus.css +0 -61
- package/src/plugins/toolbar/client/focus/toolbar_focus.js +0 -19
- package/src/plugins/toolbar/client/jsenv_logo.svg +0 -140
- package/src/plugins/toolbar/client/notification/toolbar_notification.js +0 -181
- package/src/plugins/toolbar/client/responsive/overflow_menu.css +0 -61
- package/src/plugins/toolbar/client/responsive/toolbar_responsive.js +0 -103
- package/src/plugins/toolbar/client/settings/settings.css +0 -201
- package/src/plugins/toolbar/client/settings/toolbar_settings.js +0 -47
- package/src/plugins/toolbar/client/theme/jsenv_theme.css +0 -77
- package/src/plugins/toolbar/client/theme/light_theme.css +0 -106
- package/src/plugins/toolbar/client/theme/toolbar_theme.js +0 -34
- package/src/plugins/toolbar/client/toolbar.html +0 -457
- package/src/plugins/toolbar/client/toolbar_injector.js +0 -218
- package/src/plugins/toolbar/client/toolbar_main.css +0 -172
- package/src/plugins/toolbar/client/toolbar_main.js +0 -197
- package/src/plugins/toolbar/client/tooltip/tooltip.css +0 -61
- package/src/plugins/toolbar/client/tooltip/tooltip.js +0 -39
- package/src/plugins/toolbar/client/util/animation.js +0 -305
- package/src/plugins/toolbar/client/util/dom.js +0 -108
- package/src/plugins/toolbar/client/util/fetch_using_xhr.js +0 -400
- package/src/plugins/toolbar/client/util/fetching.js +0 -14
- package/src/plugins/toolbar/client/util/iframe_to_parent_href.js +0 -10
- package/src/plugins/toolbar/client/util/jsenv_logger.js +0 -28
- package/src/plugins/toolbar/client/util/preferences.js +0 -10
- package/src/plugins/toolbar/client/util/responsive.js +0 -112
- package/src/plugins/toolbar/client/util/util.js +0 -19
- package/src/plugins/toolbar/client/variant/variant.js +0 -74
- 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.
|
|
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.
|
|
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",
|
package/src/build/build.js
CHANGED
|
@@ -669,43 +669,43 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
669
669
|
}
|
|
670
670
|
if (rawUrlInfo.isEntryPoint) {
|
|
671
671
|
addToBundlerIfAny(rawUrlInfo)
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
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
|
-
|
|
691
|
-
|
|
692
|
-
|
|
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
|
-
|
|
695
|
-
|
|
700
|
+
referencedUrlInfo &&
|
|
701
|
+
// something else than the resource hint is using this url
|
|
702
|
+
referencedUrlInfo.dependents.size > 0
|
|
696
703
|
) {
|
|
697
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
reloader.
|
|
29
|
-
|
|
30
|
-
reloader.
|
|
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.
|
|
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.
|
|
65
|
+
reloader.status.goTo("reloading")
|
|
42
66
|
const onApplied = (reloadMessage) => {
|
|
43
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
#
|
|
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
|
|
329
|
+
<h2>
|
|
329
330
|
<svg
|
|
330
|
-
id="
|
|
331
|
+
id="explorables_icon"
|
|
331
332
|
viewBox="0 0 24 24"
|
|
332
333
|
width="32"
|
|
333
334
|
height="32"
|
package/src/plugins/plugins.js
CHANGED
|
@@ -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: {
|
|
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
|
-
|
|
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__.
|
|
668
|
-
|
|
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({
|
|
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 = ({
|
|
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 =
|
package/dist/js/html_src_set.js
DELETED
|
@@ -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
|
-
}
|