@jsenv/core 24.0.0 → 24.2.0
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/dist/jsenv_event_source_client.js +338 -0
- package/dist/jsenv_event_source_client.js.map +126 -0
- package/dist/jsenv_exploring_index.js.map +7 -7
- package/dist/jsenv_redirector.js +1386 -0
- package/dist/jsenv_redirector.js.map +384 -0
- package/dist/jsenv_toolbar.js +37 -504
- package/dist/jsenv_toolbar.js.map +37 -112
- package/dist/jsenv_toolbar_injector.js +31 -126
- package/dist/jsenv_toolbar_injector.js.map +11 -30
- package/package.json +1 -1
- package/src/buildProject.js +2 -0
- package/src/dev_server.js +108 -70
- package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +1 -2
- package/src/internal/compiling/compileFile.js +51 -23
- package/src/internal/compiling/createCompiledFileService.js +22 -10
- package/src/internal/compiling/html_source_file_service.js +43 -9
- package/src/internal/compiling/jsenvCompilerForHtml.js +146 -107
- package/src/internal/compiling/startCompileServer.js +60 -44
- package/src/internal/dev_server/event_source_client/event_source_client.js +63 -0
- package/src/internal/dev_server/event_source_client/event_source_client_file_info.js +17 -0
- package/src/internal/{toolbar/eventsource/connectEventSource.js → dev_server/event_source_client/event_source_connection.js} +47 -78
- package/src/internal/dev_server/event_source_client/file_changes.js +82 -0
- package/src/internal/dev_server/event_source_client/livereload_preference.js +13 -0
- package/src/internal/{exploring → dev_server/exploring}/exploring.css +0 -0
- package/src/internal/{exploring → dev_server/exploring}/exploring.html +1 -1
- package/src/internal/{exploring → dev_server/exploring}/exploring.js +0 -0
- package/src/internal/dev_server/exploring/exploring_file_info.js +21 -0
- package/src/internal/{exploring → dev_server/exploring}/fetchExploringJson.js +1 -1
- package/src/internal/{exploring/exploring.redirector.html → dev_server/redirector/redirector.html} +1 -1
- package/src/internal/{exploring/exploring.redirector.js → dev_server/redirector/redirector.js} +1 -1
- package/src/internal/dev_server/redirector/redirector_file_info.js +24 -0
- package/src/internal/{toolbar → dev_server/toolbar}/animation/toolbar.animation.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/backtolist/toolbar.backtolist.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/compilation/compilation.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/compilation/toolbar.compilation.js +1 -1
- package/src/internal/{toolbar → dev_server/toolbar}/eventsource/eventsource.css +0 -0
- package/src/internal/dev_server/toolbar/eventsource/toolbar.eventsource.js +83 -0
- package/src/internal/{toolbar → dev_server/toolbar}/execution/execution.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/execution/toolbar.execution.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/focus/focus.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/focus/toolbar.focus.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/jsenv-logo.svg +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/notification/toolbar.notification.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/responsive/overflow-menu.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/responsive/toolbar.responsive.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/settings/settings.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/settings/toolbar.settings.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/theme/jsenv-theme.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/theme/light-theme.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/theme/toolbar.theme.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/toolbar.html +4 -37
- package/src/internal/{toolbar → dev_server/toolbar}/toolbar.injector.js +3 -92
- package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.js +0 -0
- package/src/internal/dev_server/toolbar/toolbar_file_info.js +37 -0
- package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.css +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/util/animation.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/util/dom.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/util/fetching.js +2 -2
- package/src/internal/{toolbar → dev_server/toolbar}/util/jsenvLogger.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/util/preferences.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/util/responsive.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/util/util.js +0 -0
- package/src/internal/{toolbar → dev_server/toolbar}/variant/variant.js +0 -0
- package/src/internal/jsenvInternalFiles.js +0 -58
- package/src/internal/toolbar/eventsource/connectCompileServerEventSource.js +0 -74
- package/src/internal/toolbar/eventsource/toolbar.eventsource.js +0 -239
|
@@ -1,95 +1,6 @@
|
|
|
1
|
-
import { fetchExploringJson } from "@jsenv/core/src/internal/exploring/fetchExploringJson.js"
|
|
1
|
+
import { fetchExploringJson } from "@jsenv/core/src/internal/dev_server/exploring/fetchExploringJson.js"
|
|
2
2
|
import { setAttributes, setStyles } from "./util/dom.js"
|
|
3
3
|
|
|
4
|
-
/*
|
|
5
|
-
We must connect to livereload server asap so that if a file is modified
|
|
6
|
-
while page is loading we are notified of it.
|
|
7
|
-
|
|
8
|
-
Otherwise it's possible that a file is loaded and used by browser then its modified before
|
|
9
|
-
livereload connection is established.
|
|
10
|
-
|
|
11
|
-
When toolbar is loaded it will open an other connection to server sent events and close this one.
|
|
12
|
-
*/
|
|
13
|
-
const connectLivereload = () => {
|
|
14
|
-
const { EventSource } = window
|
|
15
|
-
if (typeof EventSource !== "function") {
|
|
16
|
-
return () => {}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const getLivereloadPreference = () => {
|
|
20
|
-
return localStorage.hasOwnProperty("livereload")
|
|
21
|
-
? JSON.parse(localStorage.getItem("livereload"))
|
|
22
|
-
: true
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const url = document.location.href
|
|
26
|
-
let isOpen = false
|
|
27
|
-
let lastEventId
|
|
28
|
-
const latestChangeMap = {}
|
|
29
|
-
|
|
30
|
-
const events = {
|
|
31
|
-
"file-modified": ({ data }) => {
|
|
32
|
-
latestChangeMap[data] = "modified"
|
|
33
|
-
if (getLivereloadPreference()) {
|
|
34
|
-
window.location.reload(true)
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
"file-removed": ({ data }) => {
|
|
38
|
-
latestChangeMap[data] = "removed"
|
|
39
|
-
if (getLivereloadPreference()) {
|
|
40
|
-
window.location.reload(true)
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
"file-added": ({ data }) => {
|
|
44
|
-
latestChangeMap[data] = "added"
|
|
45
|
-
if (getLivereloadPreference()) {
|
|
46
|
-
window.location.reload(true)
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const eventSourceOrigin = new URL(url).origin
|
|
52
|
-
const eventSource = new EventSource(url, {
|
|
53
|
-
withCredentials: true,
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
const disconnect = () => {
|
|
57
|
-
eventSource.close()
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
eventSource.onopen = () => {
|
|
61
|
-
isOpen = true
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
eventSource.onerror = (errorEvent) => {
|
|
65
|
-
if (errorEvent.target.readyState === EventSource.CLOSED) {
|
|
66
|
-
isOpen = false
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
Object.keys(events).forEach((eventName) => {
|
|
71
|
-
eventSource.addEventListener(eventName, (e) => {
|
|
72
|
-
if (e.origin === eventSourceOrigin) {
|
|
73
|
-
if (e.lastEventId) {
|
|
74
|
-
lastEventId = e.lastEventId
|
|
75
|
-
}
|
|
76
|
-
events[eventName](e)
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
return () => {
|
|
82
|
-
return {
|
|
83
|
-
isOpen,
|
|
84
|
-
latestChangeMap,
|
|
85
|
-
lastEventId,
|
|
86
|
-
disconnect,
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// eslint-disable-next-line camelcase
|
|
91
|
-
window.__jsenv_eventsource__ = connectLivereload()
|
|
92
|
-
|
|
93
4
|
const injectToolbar = async () => {
|
|
94
5
|
await new Promise((resolve) => {
|
|
95
6
|
if (window.requestIdleCallback) {
|
|
@@ -129,7 +40,7 @@ const injectToolbar = async () => {
|
|
|
129
40
|
})
|
|
130
41
|
const iframeLoadedPromise = iframeToLoadedPromise(iframe)
|
|
131
42
|
const jsenvToolbarHtmlServerUrl = resolveUrl(
|
|
132
|
-
"./src/internal/toolbar/toolbar.html",
|
|
43
|
+
"./src/internal/dev_server/toolbar/toolbar.html",
|
|
133
44
|
jsenvDirectoryServerUrl,
|
|
134
45
|
)
|
|
135
46
|
// set iframe src BEFORE putting it into the DOM (prevent firefox adding an history entry)
|
|
@@ -165,7 +76,7 @@ const injectToolbar = async () => {
|
|
|
165
76
|
|
|
166
77
|
const div = document.createElement("div")
|
|
167
78
|
const jsenvLogoUrl = resolveUrl(
|
|
168
|
-
"./src/internal/toolbar/jsenv-logo.svg",
|
|
79
|
+
"./src/internal/dev_server/toolbar/jsenv-logo.svg",
|
|
169
80
|
jsenvDirectoryServerUrl,
|
|
170
81
|
)
|
|
171
82
|
const jsenvLogoSvgSrc = jsenvLogoUrl
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsenvCoreDirectoryUrl } from "@jsenv/core/src/internal/jsenvCoreDirectoryUrl.js"
|
|
2
|
+
|
|
3
|
+
const injectorSourceRelativeUrl =
|
|
4
|
+
"./src/internal/dev_server/toolbar/toolbar.injector.js"
|
|
5
|
+
const injectorBuildRelativeUrl = "./jsenv_toolbar_injector.js"
|
|
6
|
+
const injectorBuildUrl = new URL(
|
|
7
|
+
"./dist/jsenv_toolbar_injector.js",
|
|
8
|
+
jsenvCoreDirectoryUrl,
|
|
9
|
+
).href
|
|
10
|
+
export const toolbarInjectorFileInfo = {
|
|
11
|
+
sourceRelativeUrl: injectorSourceRelativeUrl,
|
|
12
|
+
buildRelativeUrl: injectorBuildRelativeUrl,
|
|
13
|
+
buildUrl: injectorBuildUrl,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const htmlSourceUrl = new URL(
|
|
17
|
+
"./src/internal/dev_server/toolbar/toolbar.html",
|
|
18
|
+
jsenvCoreDirectoryUrl,
|
|
19
|
+
).href
|
|
20
|
+
export const toolbarHtmlFileInfo = {
|
|
21
|
+
sourceUrl: htmlSourceUrl,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const jsSourceRelativeUrl = "./src/internal/dev_server/toolbar/toolbar.main.js"
|
|
25
|
+
const jsBuildRelativeUrl = "./jsenv_toolbar.js"
|
|
26
|
+
const jsSourceUrl = new URL(
|
|
27
|
+
"./src/internal/dev_server/toolbar/toolbar.main.js",
|
|
28
|
+
jsenvCoreDirectoryUrl,
|
|
29
|
+
).href
|
|
30
|
+
const jsBuildUrl = new URL("./dist/jsenv_toolbar.js", jsenvCoreDirectoryUrl)
|
|
31
|
+
.href
|
|
32
|
+
export const toolbarJsFileInfo = {
|
|
33
|
+
sourceRelativeUrl: jsSourceRelativeUrl,
|
|
34
|
+
buildRelativeUrl: jsBuildRelativeUrl,
|
|
35
|
+
sourceUrl: jsSourceUrl,
|
|
36
|
+
buildUrl: jsBuildUrl,
|
|
37
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { memoize } from "
|
|
1
|
+
import { memoize } from "../../../memoize.js"
|
|
2
2
|
|
|
3
3
|
const fetchPolyfill = async (...args) => {
|
|
4
4
|
const { fetchUsingXHR } = await loadPolyfill()
|
|
@@ -6,7 +6,7 @@ const fetchPolyfill = async (...args) => {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
const loadPolyfill = memoize(() =>
|
|
9
|
-
import("
|
|
9
|
+
import("../../../browser-utils/fetchUsingXHR.js"),
|
|
10
10
|
)
|
|
11
11
|
|
|
12
12
|
export const fetchUrl =
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -48,64 +48,6 @@ export const sourcemapMappingFileInfo = {
|
|
|
48
48
|
url: fileSystemPathToUrl(require.resolve("source-map/lib/mappings.wasm")),
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
// Exploring redirection
|
|
52
|
-
// (auto redirection to a compile group depending on browser capabilities)
|
|
53
|
-
export const jsenvExploringRedirectorHtmlFileInfo = {
|
|
54
|
-
url: resolveUrl(
|
|
55
|
-
"./src/internal/exploring/exploring.redirector.html",
|
|
56
|
-
jsenvCoreDirectoryUrl,
|
|
57
|
-
),
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export const jsenvExploringRedirectorJsFileInfo = {
|
|
61
|
-
jsenvRelativeUrl: "./src/internal/exploring/exploring.redirector.js",
|
|
62
|
-
jsenvBuildRelativeUrl: "./jsenv_exploring_redirector.js",
|
|
63
|
-
url: resolveUrl(
|
|
64
|
-
"./src/internal/exploring/exploring.redirector.js",
|
|
65
|
-
jsenvCoreDirectoryUrl,
|
|
66
|
-
),
|
|
67
|
-
jsenvBuildUrl: resolveUrl(
|
|
68
|
-
"./dist/jsenv_exploring_redirector.js",
|
|
69
|
-
jsenvCoreDirectoryUrl,
|
|
70
|
-
),
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Exploring index and toolbar
|
|
74
|
-
export const jsenvExploringIndexJsFileInfo = {
|
|
75
|
-
jsenvRelativeUrl: "./src/internal/exploring/exploring.js",
|
|
76
|
-
jsenvBuildRelativeUrl: "./jsenv_exploring_index.js",
|
|
77
|
-
jsenvBuildUrl: resolveUrl(
|
|
78
|
-
"./dist/jsenv_exploring_index.js",
|
|
79
|
-
jsenvCoreDirectoryUrl,
|
|
80
|
-
),
|
|
81
|
-
}
|
|
82
|
-
export const jsenvExploringIndexHtmlFileInfo = {
|
|
83
|
-
url: resolveUrl(
|
|
84
|
-
"./src/internal/exploring/exploring.html",
|
|
85
|
-
jsenvCoreDirectoryUrl,
|
|
86
|
-
),
|
|
87
|
-
}
|
|
88
|
-
export const jsenvToolbarHtmlFileInfo = {
|
|
89
|
-
url: resolveUrl("./src/internal/toolbar/toolbar.html", jsenvCoreDirectoryUrl),
|
|
90
|
-
}
|
|
91
|
-
export const jsenvToolbarInjectorFileInfo = {
|
|
92
|
-
jsenvRelativeUrl: "./src/internal/toolbar/toolbar.injector.js",
|
|
93
|
-
jsenvBuildRelativeUrl: "./jsenv_toolbar_injector.js",
|
|
94
|
-
jsenvBuildUrl: resolveUrl(
|
|
95
|
-
"./dist/jsenv_toolbar_injector.js",
|
|
96
|
-
jsenvCoreDirectoryUrl,
|
|
97
|
-
),
|
|
98
|
-
}
|
|
99
|
-
export const jsenvToolbarJsFileInfo = {
|
|
100
|
-
jsenvRelativeUrl: "./src/internal/toolbar/toolbar.main.js",
|
|
101
|
-
jsenvBuildRelativeUrl: "./jsenv_toolbar.js",
|
|
102
|
-
url: resolveUrl(
|
|
103
|
-
"./src/internal/toolbar/toolbar.main.js",
|
|
104
|
-
jsenvCoreDirectoryUrl,
|
|
105
|
-
),
|
|
106
|
-
jsenvBuildUrl: resolveUrl("./dist/jsenv_toolbar.js", jsenvCoreDirectoryUrl),
|
|
107
|
-
}
|
|
108
|
-
|
|
109
51
|
export const jsenvSystemJsFileInfo = {
|
|
110
52
|
url: resolveUrl("./src/internal/runtime/s.js", jsenvCoreDirectoryUrl),
|
|
111
53
|
jsenvRelativeUrl: "./src/internal/runtime/s.js",
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { connectEventSource } from "./connectEventSource.js"
|
|
2
|
-
import { jsenvLogger } from "../util/jsenvLogger.js"
|
|
3
|
-
|
|
4
|
-
export const connectCompileServerEventSource = (
|
|
5
|
-
fileRelativeUrl,
|
|
6
|
-
{
|
|
7
|
-
onFileModified,
|
|
8
|
-
onFileRemoved,
|
|
9
|
-
onConnecting,
|
|
10
|
-
onConnectionCancelled,
|
|
11
|
-
onConnectionFailed,
|
|
12
|
-
onConnected,
|
|
13
|
-
lastEventId,
|
|
14
|
-
},
|
|
15
|
-
) => {
|
|
16
|
-
const eventSourceUrl = `${window.origin}/${fileRelativeUrl}`
|
|
17
|
-
|
|
18
|
-
let cancel = () => {}
|
|
19
|
-
|
|
20
|
-
const connect = () => {
|
|
21
|
-
return new Promise((resolve) => {
|
|
22
|
-
cancel = connectEventSource(
|
|
23
|
-
eventSourceUrl,
|
|
24
|
-
{
|
|
25
|
-
"file-modified": ({ data }) => {
|
|
26
|
-
jsenvLogger.debug(`${data} modified`)
|
|
27
|
-
onFileModified(data)
|
|
28
|
-
},
|
|
29
|
-
"file-removed": ({ data }) => {
|
|
30
|
-
jsenvLogger.debug(`${data} removed`)
|
|
31
|
-
onFileRemoved(data)
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
connecting: ({ cancel }) => {
|
|
36
|
-
jsenvLogger.debug(`connecting to ${eventSourceUrl}`)
|
|
37
|
-
onConnecting({
|
|
38
|
-
cancel: () => {
|
|
39
|
-
cancel()
|
|
40
|
-
},
|
|
41
|
-
})
|
|
42
|
-
},
|
|
43
|
-
connected: ({ cancel }) => {
|
|
44
|
-
jsenvLogger.debug(`connected to ${eventSourceUrl}`)
|
|
45
|
-
resolve(true)
|
|
46
|
-
onConnected({
|
|
47
|
-
cancel: () => {
|
|
48
|
-
cancel()
|
|
49
|
-
},
|
|
50
|
-
})
|
|
51
|
-
},
|
|
52
|
-
cancelled: ({ connect }) => {
|
|
53
|
-
jsenvLogger.debug(`disconnected from ${eventSourceUrl}`)
|
|
54
|
-
resolve(false)
|
|
55
|
-
onConnectionCancelled({ connect })
|
|
56
|
-
},
|
|
57
|
-
failed: ({ connect }) => {
|
|
58
|
-
jsenvLogger.debug(`disconnected from ${eventSourceUrl}`)
|
|
59
|
-
resolve(false)
|
|
60
|
-
onConnectionFailed({ connect })
|
|
61
|
-
},
|
|
62
|
-
retryMaxAttempt: Infinity,
|
|
63
|
-
retryAllocatedMs: 20 * 1000,
|
|
64
|
-
lastEventId,
|
|
65
|
-
},
|
|
66
|
-
)
|
|
67
|
-
})
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
connect,
|
|
72
|
-
disconnect: () => cancel(),
|
|
73
|
-
}
|
|
74
|
-
}
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
import { removeForceHideElement } from "../util/dom.js"
|
|
2
|
-
import { createPromiseAndHooks } from "../util/util.js"
|
|
3
|
-
import { createPreference } from "../util/preferences.js"
|
|
4
|
-
import { enableVariant } from "../variant/variant.js"
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
toggleTooltip,
|
|
8
|
-
removeAutoShowTooltip,
|
|
9
|
-
autoShowTooltip,
|
|
10
|
-
} from "../tooltip/tooltip.js"
|
|
11
|
-
import { connectCompileServerEventSource } from "./connectCompileServerEventSource.js"
|
|
12
|
-
|
|
13
|
-
const livereloadingPreference = createPreference("livereloading")
|
|
14
|
-
let eventSourceState = "default"
|
|
15
|
-
let livereloadingAvailableOnServer = false
|
|
16
|
-
|
|
17
|
-
export const initToolbarEventSource = ({
|
|
18
|
-
executedFileRelativeUrl,
|
|
19
|
-
livereloading,
|
|
20
|
-
}) => {
|
|
21
|
-
const getLivereloadCallback = (originalFileProjectRelativeUrl) => {
|
|
22
|
-
const callbacks = window.parent.__jsenv__.livereloadingCallbacks
|
|
23
|
-
return callbacks[originalFileProjectRelativeUrl]
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
removeForceHideElement(document.querySelector("#eventsource-indicator"))
|
|
27
|
-
connectEventSource({ executedFileRelativeUrl, getLivereloadCallback })
|
|
28
|
-
livereloadingAvailableOnServer = livereloading
|
|
29
|
-
if (!livereloadingAvailableOnServer) {
|
|
30
|
-
disableLivereloadSetting()
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const livereloadCheckbox = document.querySelector("#toggle-livereload")
|
|
34
|
-
livereloadCheckbox.checked = shouldLivereload()
|
|
35
|
-
livereloadCheckbox.onchange = () => {
|
|
36
|
-
livereloadingPreference.set(livereloadCheckbox.checked)
|
|
37
|
-
updateEventSourceIndicator()
|
|
38
|
-
}
|
|
39
|
-
updateEventSourceIndicator()
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const shouldLivereload = () => {
|
|
43
|
-
return livereloadingAvailableOnServer && getLivereloadingPreference()
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const disableLivereloadSetting = () => {
|
|
47
|
-
document
|
|
48
|
-
.querySelector(".settings-livereload")
|
|
49
|
-
.setAttribute("data-disabled", "true")
|
|
50
|
-
document
|
|
51
|
-
.querySelector(".settings-livereload")
|
|
52
|
-
.setAttribute("title", `Livereload not available: disabled by server`)
|
|
53
|
-
document.querySelector("#toggle-livereload").disabled = true
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const parentEventSource = window.parent.__jsenv_eventsource__()
|
|
57
|
-
const latestChangeMap = parentEventSource.latestChangeMap
|
|
58
|
-
let eventSourceHooks = {}
|
|
59
|
-
let eventSourceConnection
|
|
60
|
-
let connectionReadyPromise
|
|
61
|
-
|
|
62
|
-
const handleFileChange = ({ file, eventType, livereloadCallback }) => {
|
|
63
|
-
latestChangeMap[file] = eventType
|
|
64
|
-
updateEventSourceIndicator()
|
|
65
|
-
|
|
66
|
-
if (shouldLivereload()) {
|
|
67
|
-
if (livereloadCallback) {
|
|
68
|
-
livereloadCallback({
|
|
69
|
-
file,
|
|
70
|
-
latestChangeMap,
|
|
71
|
-
reloadPage,
|
|
72
|
-
})
|
|
73
|
-
} else if (
|
|
74
|
-
file.endsWith(".css") ||
|
|
75
|
-
file.endsWith(".scss") ||
|
|
76
|
-
file.endsWith(".sass")
|
|
77
|
-
) {
|
|
78
|
-
reloadAllCss()
|
|
79
|
-
delete latestChangeMap[file]
|
|
80
|
-
updateEventSourceIndicator()
|
|
81
|
-
} else {
|
|
82
|
-
reloadPage()
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const reloadAllCss = () => {
|
|
88
|
-
const links = Array.from(window.parent.document.getElementsByTagName("link"))
|
|
89
|
-
links.forEach((link) => {
|
|
90
|
-
if (link.rel === "stylesheet") {
|
|
91
|
-
const url = new URL(link.href)
|
|
92
|
-
url.searchParams.set("t", Date.now())
|
|
93
|
-
link.href = String(url)
|
|
94
|
-
}
|
|
95
|
-
})
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const reloadPage = () => {
|
|
99
|
-
window.parent.location.reload(true)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const reloadChanges = () => {
|
|
103
|
-
const fullReloadRequired = Object.keys(latestChangeMap).some(
|
|
104
|
-
(key) => !key.endsWith(".css"),
|
|
105
|
-
)
|
|
106
|
-
if (fullReloadRequired) {
|
|
107
|
-
reloadPage()
|
|
108
|
-
return
|
|
109
|
-
}
|
|
110
|
-
const cssReloadRequired = Object.keys(latestChangeMap).some((key) =>
|
|
111
|
-
key.endsWith(".css"),
|
|
112
|
-
)
|
|
113
|
-
if (cssReloadRequired) {
|
|
114
|
-
reloadAllCss()
|
|
115
|
-
Object.keys(latestChangeMap).forEach((key) => {
|
|
116
|
-
if (key.endsWith(".css")) {
|
|
117
|
-
delete latestChangeMap[key]
|
|
118
|
-
}
|
|
119
|
-
updateEventSourceIndicator()
|
|
120
|
-
})
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const connectEventSource = ({
|
|
125
|
-
executedFileRelativeUrl,
|
|
126
|
-
getLivereloadCallback,
|
|
127
|
-
}) => {
|
|
128
|
-
updateEventSourceIndicator()
|
|
129
|
-
connectionReadyPromise = createPromiseAndHooks()
|
|
130
|
-
|
|
131
|
-
eventSourceConnection = connectCompileServerEventSource(
|
|
132
|
-
executedFileRelativeUrl,
|
|
133
|
-
{
|
|
134
|
-
onFileModified: (file) => {
|
|
135
|
-
handleFileChange({
|
|
136
|
-
file,
|
|
137
|
-
eventType: "modified",
|
|
138
|
-
livereloadCallback: getLivereloadCallback(file),
|
|
139
|
-
})
|
|
140
|
-
},
|
|
141
|
-
onFileRemoved: (file) => {
|
|
142
|
-
handleFileChange({
|
|
143
|
-
file,
|
|
144
|
-
eventType: "removed",
|
|
145
|
-
livereloadCallback: getLivereloadCallback(file),
|
|
146
|
-
})
|
|
147
|
-
},
|
|
148
|
-
onFileAdded: (file) => {
|
|
149
|
-
handleFileChange({
|
|
150
|
-
file,
|
|
151
|
-
eventType: "added",
|
|
152
|
-
livereloadCallback: getLivereloadCallback(file),
|
|
153
|
-
})
|
|
154
|
-
},
|
|
155
|
-
onConnecting: ({ cancel }) => {
|
|
156
|
-
eventSourceState = "connecting"
|
|
157
|
-
eventSourceHooks = { abort: cancel }
|
|
158
|
-
updateEventSourceIndicator()
|
|
159
|
-
},
|
|
160
|
-
onConnectionCancelled: ({ connect }) => {
|
|
161
|
-
eventSourceState = "disabled"
|
|
162
|
-
eventSourceHooks = { connect }
|
|
163
|
-
updateEventSourceIndicator()
|
|
164
|
-
},
|
|
165
|
-
onConnectionFailed: ({ connect }) => {
|
|
166
|
-
eventSourceState = "failed"
|
|
167
|
-
eventSourceHooks = { reconnect: connect }
|
|
168
|
-
updateEventSourceIndicator()
|
|
169
|
-
},
|
|
170
|
-
onConnected: ({ cancel }) => {
|
|
171
|
-
eventSourceState = "connected"
|
|
172
|
-
eventSourceHooks = { disconnect: cancel }
|
|
173
|
-
updateEventSourceIndicator()
|
|
174
|
-
connectionReadyPromise.resolve()
|
|
175
|
-
parentEventSource.disconnect()
|
|
176
|
-
},
|
|
177
|
-
lastEventId: parentEventSource.lastEventId,
|
|
178
|
-
},
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
eventSourceConnection.connect()
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const getLivereloadingPreference = () => {
|
|
185
|
-
return livereloadingPreference.has() ? livereloadingPreference.get() : true
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export const disconnectEventSource = () => {
|
|
189
|
-
if (eventSourceConnection) {
|
|
190
|
-
eventSourceConnection.disconnect()
|
|
191
|
-
eventSourceConnection = undefined
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export const waitEventSourceReady = () => connectionReadyPromise
|
|
196
|
-
|
|
197
|
-
const updateEventSourceIndicator = () => {
|
|
198
|
-
const { connect, abort, reconnect } = eventSourceHooks
|
|
199
|
-
|
|
200
|
-
const eventSourceIndicator = document.querySelector("#eventsource-indicator")
|
|
201
|
-
const changeCount = Object.keys(latestChangeMap).length
|
|
202
|
-
enableVariant(eventSourceIndicator, {
|
|
203
|
-
eventsource: eventSourceState,
|
|
204
|
-
livereload: shouldLivereload() ? "on" : "off",
|
|
205
|
-
changes: changeCount > 0 ? "yes" : "no",
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
const variantNode = document.querySelector(
|
|
209
|
-
"#eventsource-indicator > [data-when-active]",
|
|
210
|
-
)
|
|
211
|
-
variantNode.querySelector("button").onclick = () => {
|
|
212
|
-
toggleTooltip(eventSourceIndicator)
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (eventSourceState === "disabled") {
|
|
216
|
-
variantNode.querySelector("a").onclick = connect
|
|
217
|
-
} else if (eventSourceState === "connecting") {
|
|
218
|
-
variantNode.querySelector("a").onclick = abort
|
|
219
|
-
} else if (eventSourceState === "connected") {
|
|
220
|
-
removeAutoShowTooltip(eventSourceIndicator)
|
|
221
|
-
if (changeCount) {
|
|
222
|
-
const changeLink = variantNode.querySelector(".eventsource-changes-link")
|
|
223
|
-
changeLink.innerHTML = changeCount
|
|
224
|
-
changeLink.onclick = () => {
|
|
225
|
-
console.log(
|
|
226
|
-
JSON.stringify(latestChangeMap, null, " "),
|
|
227
|
-
latestChangeMap,
|
|
228
|
-
)
|
|
229
|
-
// eslint-disable-next-line no-alert
|
|
230
|
-
window.parent.alert(JSON.stringify(latestChangeMap, null, " "))
|
|
231
|
-
}
|
|
232
|
-
variantNode.querySelector(".eventsource-reload-link").onclick =
|
|
233
|
-
reloadChanges
|
|
234
|
-
}
|
|
235
|
-
} else if (eventSourceState === "failed") {
|
|
236
|
-
autoShowTooltip(eventSourceIndicator)
|
|
237
|
-
variantNode.querySelector("a").onclick = reconnect
|
|
238
|
-
}
|
|
239
|
-
}
|