@jsenv/core 24.0.2 → 24.2.2
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 +1388 -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/{LICENSE → license} +0 -0
- package/package.json +2 -3
- package/src/buildProject.js +2 -0
- package/src/dev_server.js +108 -57
- package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +1 -2
- package/src/internal/compiling/compileFile.js +51 -23
- package/src/internal/compiling/createCompiledFileService.js +8 -0
- 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 +10 -1
- 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} +4 -2
- 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
package/src/dev_server.js
CHANGED
|
@@ -15,16 +15,21 @@ import {
|
|
|
15
15
|
computeOutDirectoryRelativeUrl,
|
|
16
16
|
} from "./internal/compiling/startCompileServer.js"
|
|
17
17
|
import { jsenvExplorableConfig } from "./jsenvExplorableConfig.js"
|
|
18
|
+
import {
|
|
19
|
+
redirectorHtmlFileInfo,
|
|
20
|
+
redirectorJsFileInfo,
|
|
21
|
+
} from "./internal/dev_server/redirector/redirector_file_info.js"
|
|
22
|
+
import {
|
|
23
|
+
exploringIndexHtmlFileInfo,
|
|
24
|
+
exploringIndexJsFileInfo,
|
|
25
|
+
} from "@jsenv/core/src/internal/dev_server/exploring/exploring_file_info.js"
|
|
26
|
+
import { toolbarJsFileInfo } from "@jsenv/core/src/internal/dev_server/toolbar/toolbar_file_info.js"
|
|
18
27
|
import {
|
|
19
28
|
sourcemapMainFileInfo,
|
|
20
29
|
sourcemapMappingFileInfo,
|
|
21
|
-
jsenvExploringRedirectorHtmlFileInfo,
|
|
22
|
-
jsenvExploringRedirectorJsFileInfo,
|
|
23
|
-
jsenvExploringIndexHtmlFileInfo,
|
|
24
|
-
jsenvExploringIndexJsFileInfo,
|
|
25
|
-
jsenvToolbarJsFileInfo,
|
|
26
30
|
} from "./internal/jsenvInternalFiles.js"
|
|
27
31
|
import { jsenvRuntimeSupportDuringDev } from "./jsenvRuntimeSupportDuringDev.js"
|
|
32
|
+
import { eventSourceClientFileInfo } from "./internal/dev_server/event_source_client/event_source_client_file_info.js"
|
|
28
33
|
|
|
29
34
|
export const startDevServer = async ({
|
|
30
35
|
signal = new AbortController().signal,
|
|
@@ -41,7 +46,7 @@ export const startDevServer = async ({
|
|
|
41
46
|
projectDirectoryUrl,
|
|
42
47
|
explorableConfig = jsenvExplorableConfig,
|
|
43
48
|
mainFileRelativeUrl = urlToRelativeUrl(
|
|
44
|
-
|
|
49
|
+
exploringIndexHtmlFileInfo.sourceUrl,
|
|
45
50
|
projectDirectoryUrl,
|
|
46
51
|
),
|
|
47
52
|
jsenvDirectoryRelativeUrl,
|
|
@@ -59,6 +64,7 @@ export const startDevServer = async ({
|
|
|
59
64
|
sourcemapMethod,
|
|
60
65
|
customCompilers,
|
|
61
66
|
livereloadWatchConfig,
|
|
67
|
+
livereloadLogLevel,
|
|
62
68
|
jsenvDirectoryClean,
|
|
63
69
|
}) => {
|
|
64
70
|
projectDirectoryUrl = assertProjectDirectoryUrl({ projectDirectoryUrl })
|
|
@@ -70,23 +76,6 @@ export const startDevServer = async ({
|
|
|
70
76
|
outDirectoryName,
|
|
71
77
|
})
|
|
72
78
|
|
|
73
|
-
const redirectFiles = createRedirectFilesService({
|
|
74
|
-
projectDirectoryUrl,
|
|
75
|
-
outDirectoryRelativeUrl,
|
|
76
|
-
mainFileRelativeUrl,
|
|
77
|
-
})
|
|
78
|
-
const serveExploringData = createExploringDataService({
|
|
79
|
-
projectDirectoryUrl,
|
|
80
|
-
outDirectoryRelativeUrl,
|
|
81
|
-
explorableConfig,
|
|
82
|
-
livereloading,
|
|
83
|
-
})
|
|
84
|
-
const serveExplorableListAsJson = createExplorableListAsJsonService({
|
|
85
|
-
projectDirectoryUrl,
|
|
86
|
-
outDirectoryRelativeUrl,
|
|
87
|
-
explorableConfig,
|
|
88
|
-
})
|
|
89
|
-
|
|
90
79
|
const compileServer = await startCompileServer({
|
|
91
80
|
signal,
|
|
92
81
|
handleSIGINT,
|
|
@@ -101,13 +90,35 @@ export const startDevServer = async ({
|
|
|
101
90
|
plugins,
|
|
102
91
|
customServices: {
|
|
103
92
|
...customServices,
|
|
104
|
-
"jsenv:redirector":
|
|
105
|
-
|
|
106
|
-
|
|
93
|
+
"jsenv:redirector": createRedirectorService({
|
|
94
|
+
projectDirectoryUrl,
|
|
95
|
+
mainFileRelativeUrl,
|
|
96
|
+
}),
|
|
97
|
+
"jsenv:event_source_client": createEventSourceClientService({
|
|
98
|
+
projectDirectoryUrl,
|
|
99
|
+
}),
|
|
100
|
+
"jsenv:exploring_index": createExploringIndexService({
|
|
101
|
+
projectDirectoryUrl,
|
|
102
|
+
}),
|
|
103
|
+
"jsenv:exploring_json": createExploringJsonService({
|
|
104
|
+
projectDirectoryUrl,
|
|
105
|
+
outDirectoryRelativeUrl,
|
|
106
|
+
explorableConfig,
|
|
107
|
+
livereloading,
|
|
108
|
+
}),
|
|
109
|
+
"jsenv:explorables_json": createExplorableJsonService({
|
|
110
|
+
projectDirectoryUrl,
|
|
111
|
+
outDirectoryRelativeUrl,
|
|
112
|
+
explorableConfig,
|
|
113
|
+
}),
|
|
114
|
+
"jsenv:toolbar": createToolbarService({
|
|
115
|
+
projectDirectoryUrl,
|
|
116
|
+
}),
|
|
107
117
|
},
|
|
108
118
|
|
|
109
119
|
projectDirectoryUrl,
|
|
110
120
|
livereloadSSE: livereloading,
|
|
121
|
+
jsenvEventSourceClientInjection: true,
|
|
111
122
|
jsenvToolbarInjection: jsenvToolbar,
|
|
112
123
|
jsenvDirectoryRelativeUrl,
|
|
113
124
|
outDirectoryName,
|
|
@@ -120,78 +131,99 @@ export const startDevServer = async ({
|
|
|
120
131
|
babelPluginMap,
|
|
121
132
|
runtimeSupport: runtimeSupportDuringDev,
|
|
122
133
|
livereloadWatchConfig,
|
|
134
|
+
livereloadLogLevel,
|
|
123
135
|
jsenvDirectoryClean,
|
|
124
136
|
})
|
|
125
137
|
|
|
126
138
|
return compileServer
|
|
127
139
|
}
|
|
128
140
|
|
|
129
|
-
const
|
|
141
|
+
const createRedirectorService = ({
|
|
130
142
|
projectDirectoryUrl,
|
|
131
143
|
mainFileRelativeUrl,
|
|
132
144
|
}) => {
|
|
133
|
-
const
|
|
134
|
-
|
|
145
|
+
const jsenvRedirectorHtmlRelativeUrlForProject = urlToRelativeUrl(
|
|
146
|
+
redirectorHtmlFileInfo.sourceUrl,
|
|
135
147
|
projectDirectoryUrl,
|
|
136
148
|
)
|
|
137
|
-
const
|
|
138
|
-
|
|
149
|
+
const jsenvRedirectorJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
150
|
+
redirectorJsFileInfo.buildUrl,
|
|
139
151
|
projectDirectoryUrl,
|
|
140
152
|
)
|
|
141
|
-
const jsenvExploringJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
142
|
-
jsenvExploringIndexJsFileInfo.jsenvBuildUrl,
|
|
143
|
-
projectDirectoryUrl,
|
|
144
|
-
)
|
|
145
|
-
const jsenvToolbarJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
146
|
-
jsenvToolbarJsFileInfo.jsenvBuildUrl,
|
|
147
|
-
projectDirectoryUrl,
|
|
148
|
-
)
|
|
149
|
-
|
|
150
153
|
return setupRoutes({
|
|
151
154
|
"/": (request) => {
|
|
152
155
|
const redirectTarget = mainFileRelativeUrl
|
|
153
|
-
const jsenvExploringRedirectorHtmlServerUrl = `${request.origin}/${jsenvExploringRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`
|
|
154
156
|
return {
|
|
155
157
|
status: 307,
|
|
156
158
|
headers: {
|
|
157
|
-
location:
|
|
159
|
+
location: `${request.origin}/${jsenvRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`,
|
|
158
160
|
},
|
|
159
161
|
}
|
|
160
162
|
},
|
|
161
163
|
"/.jsenv/redirect/:rest*": (request) => {
|
|
162
164
|
const redirectTarget = request.ressource.slice("/.jsenv/redirect/".length)
|
|
163
|
-
const jsenvExploringRedirectorHtmlServerUrl = `${request.origin}/${jsenvExploringRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`
|
|
164
165
|
return {
|
|
165
166
|
status: 307,
|
|
166
167
|
headers: {
|
|
167
|
-
location:
|
|
168
|
+
location: `${
|
|
169
|
+
request.origin
|
|
170
|
+
}/${jsenvRedirectorHtmlRelativeUrlForProject}?redirect=${encodeURIComponent(
|
|
171
|
+
redirectTarget,
|
|
172
|
+
)}`,
|
|
168
173
|
},
|
|
169
174
|
}
|
|
170
175
|
},
|
|
171
|
-
"/.jsenv/
|
|
172
|
-
const jsenvExploringRedirectorBuildServerUrl = `${request.origin}/${jsenvExploringRedirectorJsBuildRelativeUrlForProject}`
|
|
176
|
+
"/.jsenv/redirector.js": (request) => {
|
|
173
177
|
return {
|
|
174
178
|
status: 307,
|
|
175
179
|
headers: {
|
|
176
|
-
location:
|
|
180
|
+
location: `${request.origin}/${jsenvRedirectorJsBuildRelativeUrlForProject}`,
|
|
177
181
|
},
|
|
178
182
|
}
|
|
179
183
|
},
|
|
180
|
-
|
|
181
|
-
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const createEventSourceClientService = ({ projectDirectoryUrl }) => {
|
|
188
|
+
const eventSourceClientBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
189
|
+
eventSourceClientFileInfo.buildUrl,
|
|
190
|
+
projectDirectoryUrl,
|
|
191
|
+
)
|
|
192
|
+
return setupRoutes({
|
|
193
|
+
"/.jsenv/event_source_client.js": (request) => {
|
|
182
194
|
return {
|
|
183
195
|
status: 307,
|
|
184
196
|
headers: {
|
|
185
|
-
location:
|
|
197
|
+
location: `${request.origin}/${eventSourceClientBuildRelativeUrlForProject}`,
|
|
186
198
|
},
|
|
187
199
|
}
|
|
188
200
|
},
|
|
189
|
-
|
|
190
|
-
|
|
201
|
+
// unfortunately browser resolves sourcemap to url before redirection (not after).
|
|
202
|
+
// It means browser tries to load source map from "/.jsenv/jsenv-toolbar.js.map"
|
|
203
|
+
// we could also inline sourcemap but it's not yet possible
|
|
204
|
+
// inside buildProject
|
|
205
|
+
"/.jsenv/event_source_client.js.map": (request) => {
|
|
191
206
|
return {
|
|
192
207
|
status: 307,
|
|
193
208
|
headers: {
|
|
194
|
-
location:
|
|
209
|
+
location: `${request.origin}/${eventSourceClientBuildRelativeUrlForProject}.map`,
|
|
210
|
+
},
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
})
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const createExploringIndexService = ({ projectDirectoryUrl }) => {
|
|
217
|
+
const jsenvExploringJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
218
|
+
exploringIndexJsFileInfo.buildUrl,
|
|
219
|
+
projectDirectoryUrl,
|
|
220
|
+
)
|
|
221
|
+
return setupRoutes({
|
|
222
|
+
"/.jsenv/exploring.index.js": (request) => {
|
|
223
|
+
return {
|
|
224
|
+
status: 307,
|
|
225
|
+
headers: {
|
|
226
|
+
location: `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}`,
|
|
195
227
|
},
|
|
196
228
|
}
|
|
197
229
|
},
|
|
@@ -207,18 +239,37 @@ const createRedirectFilesService = ({
|
|
|
207
239
|
},
|
|
208
240
|
}
|
|
209
241
|
},
|
|
242
|
+
})
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const createToolbarService = ({ projectDirectoryUrl }) => {
|
|
246
|
+
const toolbarJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
247
|
+
toolbarJsFileInfo.buildUrl,
|
|
248
|
+
projectDirectoryUrl,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
return setupRoutes({
|
|
252
|
+
"/.jsenv/toolbar.main.js": (request) => {
|
|
253
|
+
const jsenvToolbarJsBuildServerUrl = `${request.origin}/${toolbarJsBuildRelativeUrlForProject}`
|
|
254
|
+
return {
|
|
255
|
+
status: 307,
|
|
256
|
+
headers: {
|
|
257
|
+
location: jsenvToolbarJsBuildServerUrl,
|
|
258
|
+
},
|
|
259
|
+
}
|
|
260
|
+
},
|
|
210
261
|
"/.jsenv/jsenv_toolbar.js.map": (request) => {
|
|
211
262
|
return {
|
|
212
263
|
status: 307,
|
|
213
264
|
headers: {
|
|
214
|
-
location: `${request.origin}/${
|
|
265
|
+
location: `${request.origin}/${toolbarJsBuildRelativeUrlForProject}.map`,
|
|
215
266
|
},
|
|
216
267
|
}
|
|
217
268
|
},
|
|
218
269
|
})
|
|
219
270
|
}
|
|
220
271
|
|
|
221
|
-
const
|
|
272
|
+
const createExploringJsonService = ({
|
|
222
273
|
projectDirectoryUrl,
|
|
223
274
|
outDirectoryRelativeUrl,
|
|
224
275
|
explorableConfig,
|
|
@@ -237,7 +288,7 @@ const createExploringDataService = ({
|
|
|
237
288
|
projectDirectoryUrl,
|
|
238
289
|
),
|
|
239
290
|
exploringHtmlFileRelativeUrl: urlToRelativeUrl(
|
|
240
|
-
|
|
291
|
+
exploringIndexHtmlFileInfo.sourceUrl,
|
|
241
292
|
projectDirectoryUrl,
|
|
242
293
|
),
|
|
243
294
|
sourcemapMainFileRelativeUrl: urlToRelativeUrl(
|
|
@@ -266,7 +317,7 @@ const createExploringDataService = ({
|
|
|
266
317
|
}
|
|
267
318
|
}
|
|
268
319
|
|
|
269
|
-
const
|
|
320
|
+
const createExplorableJsonService = ({
|
|
270
321
|
projectDirectoryUrl,
|
|
271
322
|
outDirectoryRelativeUrl,
|
|
272
323
|
explorableConfig,
|
|
@@ -127,8 +127,7 @@ const computeCompileReport = async ({
|
|
|
127
127
|
logger.warn(`WARNING: meta.sources is empty for ${compiledFileUrl}`)
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
const metaIsValid = cacheValidity.meta.isValid
|
|
131
|
-
|
|
130
|
+
const metaIsValid = cacheValidity.meta ? cacheValidity.meta.isValid : false
|
|
132
131
|
const [compileTiming, compileResult] = await timeFunction("compile", () =>
|
|
133
132
|
callCompile({
|
|
134
133
|
logger,
|
|
@@ -19,6 +19,7 @@ export const compileFile = async ({
|
|
|
19
19
|
projectFileRequestedCallback = () => {},
|
|
20
20
|
request,
|
|
21
21
|
pushResponse,
|
|
22
|
+
importmapInfos,
|
|
22
23
|
compile,
|
|
23
24
|
compileCacheStrategy,
|
|
24
25
|
compileCacheSourcesValidation,
|
|
@@ -106,30 +107,29 @@ export const compileFile = async ({
|
|
|
106
107
|
)
|
|
107
108
|
})
|
|
108
109
|
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Until we implement import map resolution pushing ressource for js imports is disabled
|
|
115
|
-
compileResult.contentType !== "application/javascript"
|
|
116
|
-
) {
|
|
117
|
-
compileResult.dependencies.forEach((dependency) => {
|
|
118
|
-
const requestUrl = resolveUrl(request.ressource, request.origin)
|
|
119
|
-
const dependencyUrl = resolveUrl(dependency, requestUrl)
|
|
120
|
-
if (!urlIsInsideOf(dependencyUrl, request.origin)) {
|
|
121
|
-
// ignore external urls
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
if (dependencyUrl.startsWith("data:")) {
|
|
125
|
-
return
|
|
126
|
-
}
|
|
127
|
-
const dependencyRelativeUrl = urlToRelativeUrl(
|
|
128
|
-
dependencyUrl,
|
|
129
|
-
request.origin,
|
|
130
|
-
)
|
|
131
|
-
pushResponse({ path: `/${dependencyRelativeUrl}` })
|
|
110
|
+
if (request.http2) {
|
|
111
|
+
const dependencyResolver = getDependencyResolver({
|
|
112
|
+
compileResult,
|
|
113
|
+
importmapInfos,
|
|
114
|
+
request,
|
|
132
115
|
})
|
|
116
|
+
if (dependencyResolver) {
|
|
117
|
+
compileResult.dependencies.forEach((dependency) => {
|
|
118
|
+
const dependencyUrl = dependencyResolver.resolve(dependency)
|
|
119
|
+
if (!urlIsInsideOf(dependencyUrl, request.origin)) {
|
|
120
|
+
// ignore external urls
|
|
121
|
+
return
|
|
122
|
+
}
|
|
123
|
+
if (dependencyUrl.startsWith("data:")) {
|
|
124
|
+
return
|
|
125
|
+
}
|
|
126
|
+
const dependencyRelativeUrl = urlToRelativeUrl(
|
|
127
|
+
dependencyUrl,
|
|
128
|
+
request.origin,
|
|
129
|
+
)
|
|
130
|
+
pushResponse({ path: `/${dependencyRelativeUrl}` })
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
// when a compiled version of the source file was just created or updated
|
|
@@ -229,3 +229,31 @@ export const compileFile = async ({
|
|
|
229
229
|
return convertFileSystemErrorToResponseProperties(error)
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
+
|
|
233
|
+
const getDependencyResolver = ({ compileResult, importmapInfos, request }) => {
|
|
234
|
+
const importmapKeys = Object.keys(importmapInfos)
|
|
235
|
+
const requestUrl = resolveUrl(request.ressource, request.origin)
|
|
236
|
+
|
|
237
|
+
if (
|
|
238
|
+
compileResult.contentType === "application/javascript" &&
|
|
239
|
+
// we cannot trust importmapKeys because when html is restored from cache
|
|
240
|
+
// it would be empty
|
|
241
|
+
importmapKeys.length > 0
|
|
242
|
+
) {
|
|
243
|
+
// js resolution is special, we cannot just do resolveUrl of the import specifier
|
|
244
|
+
// because there can be importmap (bare specifier, import without extension, custom remapping, ...)
|
|
245
|
+
// And we would push 404 to the browser
|
|
246
|
+
// BUT I tried to push everything to the browser and it was a big fail:
|
|
247
|
+
// server is trying to push streams but browser rejects most push streams
|
|
248
|
+
// either because main file is already fetched or an other file request the same ressource
|
|
249
|
+
return null
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
type: "url_resolution",
|
|
254
|
+
resolve: (dependency) => {
|
|
255
|
+
const dependencyUrl = resolveUrl(dependency, requestUrl)
|
|
256
|
+
return dependencyUrl
|
|
257
|
+
},
|
|
258
|
+
}
|
|
259
|
+
}
|
|
@@ -48,6 +48,7 @@ export const createCompiledFileService = ({
|
|
|
48
48
|
groupMap,
|
|
49
49
|
customCompilers,
|
|
50
50
|
|
|
51
|
+
jsenvEventSourceClientInjection,
|
|
51
52
|
jsenvToolbarInjection,
|
|
52
53
|
|
|
53
54
|
projectFileRequestedCallback,
|
|
@@ -80,6 +81,8 @@ export const createCompiledFileService = ({
|
|
|
80
81
|
projectDirectoryUrl,
|
|
81
82
|
)
|
|
82
83
|
|
|
84
|
+
const importmapInfos = {}
|
|
85
|
+
|
|
83
86
|
return (request, { pushResponse, redirectRequest }) => {
|
|
84
87
|
const { origin, ressource } = request
|
|
85
88
|
// we use "ressourceToPathname" to remove eventual query param from the url
|
|
@@ -167,6 +170,7 @@ export const createCompiledFileService = ({
|
|
|
167
170
|
projectFileRequestedCallback,
|
|
168
171
|
request,
|
|
169
172
|
pushResponse,
|
|
173
|
+
importmapInfos,
|
|
170
174
|
compile: ({ code }) => {
|
|
171
175
|
return compiler({
|
|
172
176
|
logger,
|
|
@@ -194,7 +198,11 @@ export const createCompiledFileService = ({
|
|
|
194
198
|
|
|
195
199
|
sourcemapMethod,
|
|
196
200
|
sourcemapExcludeSources,
|
|
201
|
+
jsenvEventSourceClientInjection,
|
|
197
202
|
jsenvToolbarInjection,
|
|
203
|
+
onHtmlImportmapInfo: ({ htmlUrl, importmapInfo }) => {
|
|
204
|
+
importmapInfos[htmlUrl] = importmapInfo
|
|
205
|
+
},
|
|
198
206
|
})
|
|
199
207
|
},
|
|
200
208
|
})
|
|
@@ -22,11 +22,13 @@ import { moveImportMap } from "@jsenv/importmap"
|
|
|
22
22
|
import { createDetailedMessage } from "@jsenv/logger"
|
|
23
23
|
|
|
24
24
|
import { fetchUrl } from "@jsenv/core/src/internal/fetchUrl.js"
|
|
25
|
+
import { jsenvBrowserSystemFileInfo } from "@jsenv/core/src/internal/jsenvInternalFiles.js"
|
|
26
|
+
import { redirectorHtmlFileInfo } from "@jsenv/core/src/internal/dev_server/redirector/redirector_file_info.js"
|
|
27
|
+
import { eventSourceClientFileInfo } from "@jsenv/core/src/internal/dev_server/event_source_client/event_source_client_file_info.js"
|
|
25
28
|
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
} from "@jsenv/core/src/internal/jsenvInternalFiles.js"
|
|
29
|
+
toolbarInjectorFileInfo,
|
|
30
|
+
toolbarHtmlFileInfo,
|
|
31
|
+
} from "@jsenv/core/src/internal/dev_server/toolbar/toolbar_file_info.js"
|
|
30
32
|
import { stringifyDataUrl } from "@jsenv/core/src/internal/dataUrl.utils.js"
|
|
31
33
|
import {
|
|
32
34
|
parseHtmlString,
|
|
@@ -45,8 +47,10 @@ import {
|
|
|
45
47
|
export const createTransformHtmlSourceFileService = ({
|
|
46
48
|
logger,
|
|
47
49
|
projectDirectoryUrl,
|
|
50
|
+
projectFileRequestedCallback,
|
|
48
51
|
inlineImportMapIntoHTML,
|
|
49
52
|
jsenvScriptInjection,
|
|
53
|
+
jsenvEventSourceClientInjection,
|
|
50
54
|
jsenvToolbarInjection,
|
|
51
55
|
}) => {
|
|
52
56
|
/**
|
|
@@ -93,6 +97,7 @@ export const createTransformHtmlSourceFileService = ({
|
|
|
93
97
|
}
|
|
94
98
|
throw e
|
|
95
99
|
}
|
|
100
|
+
projectFileRequestedCallback(relativeUrl, request)
|
|
96
101
|
htmlInlineScriptMap.forEach((inlineScript, inlineScriptUrl) => {
|
|
97
102
|
if (inlineScript.htmlFileUrl === fileUrl) {
|
|
98
103
|
htmlInlineScriptMap.delete(inlineScriptUrl)
|
|
@@ -107,6 +112,7 @@ export const createTransformHtmlSourceFileService = ({
|
|
|
107
112
|
pushResponse,
|
|
108
113
|
inlineImportMapIntoHTML,
|
|
109
114
|
jsenvScriptInjection,
|
|
115
|
+
jsenvEventSourceClientInjection,
|
|
110
116
|
jsenvToolbarInjection,
|
|
111
117
|
onInlineModuleScript: ({ scriptContent, scriptIdentifier }) => {
|
|
112
118
|
const inlineScriptUrl = resolveUrl(scriptIdentifier, fileUrl)
|
|
@@ -138,8 +144,11 @@ const transformHTMLSourceFile = async ({
|
|
|
138
144
|
inlineImportMapIntoHTML,
|
|
139
145
|
jsenvScriptInjection,
|
|
140
146
|
jsenvToolbarInjection,
|
|
147
|
+
jsenvEventSourceClientInjection,
|
|
141
148
|
onInlineModuleScript = () => {},
|
|
142
149
|
}) => {
|
|
150
|
+
fileUrl = urlWithoutSearch(fileUrl)
|
|
151
|
+
|
|
143
152
|
const htmlAst = parseHtmlString(fileContent)
|
|
144
153
|
if (inlineImportMapIntoHTML) {
|
|
145
154
|
await inlineImportmapScripts({
|
|
@@ -154,23 +163,42 @@ const transformHTMLSourceFile = async ({
|
|
|
154
163
|
jsenvBrowserSystemFileInfo.jsenvBuildUrl,
|
|
155
164
|
projectDirectoryUrl,
|
|
156
165
|
)
|
|
157
|
-
const
|
|
158
|
-
|
|
166
|
+
const eventSourceClientBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
167
|
+
eventSourceClientFileInfo.buildUrl,
|
|
168
|
+
projectDirectoryUrl,
|
|
169
|
+
)
|
|
170
|
+
const toolbarInjectorBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
171
|
+
toolbarInjectorFileInfo.buildUrl,
|
|
159
172
|
projectDirectoryUrl,
|
|
160
173
|
)
|
|
161
174
|
manipulateHtmlAst(htmlAst, {
|
|
162
175
|
scriptInjections: [
|
|
163
|
-
...(fileUrl !==
|
|
176
|
+
...(fileUrl !== toolbarHtmlFileInfo.sourceUrl &&
|
|
177
|
+
fileUrl !== redirectorHtmlFileInfo.sourceUrl &&
|
|
178
|
+
jsenvScriptInjection
|
|
164
179
|
? [
|
|
165
180
|
{
|
|
166
181
|
src: `/${jsenvBrowserBuildUrlRelativeToProject}`,
|
|
167
182
|
},
|
|
168
183
|
]
|
|
169
184
|
: []),
|
|
170
|
-
...(fileUrl !==
|
|
185
|
+
...(fileUrl !== toolbarHtmlFileInfo.sourceUrl &&
|
|
186
|
+
fileUrl !== redirectorHtmlFileInfo.sourceUrl &&
|
|
187
|
+
jsenvEventSourceClientInjection
|
|
188
|
+
? [
|
|
189
|
+
{
|
|
190
|
+
src: `/${eventSourceClientBuildRelativeUrlForProject}`,
|
|
191
|
+
},
|
|
192
|
+
]
|
|
193
|
+
: []),
|
|
194
|
+
...(fileUrl !== toolbarHtmlFileInfo.sourceUrl &&
|
|
195
|
+
fileUrl !== redirectorHtmlFileInfo.sourceUrl &&
|
|
196
|
+
jsenvToolbarInjection
|
|
171
197
|
? [
|
|
172
198
|
{
|
|
173
|
-
src: `/${
|
|
199
|
+
src: `/${toolbarInjectorBuildRelativeUrlForProject}`,
|
|
200
|
+
defer: "",
|
|
201
|
+
async: "",
|
|
174
202
|
},
|
|
175
203
|
]
|
|
176
204
|
: []),
|
|
@@ -401,3 +429,9 @@ const getJsenvForceInlineAttribute = (htmlNode) => {
|
|
|
401
429
|
)
|
|
402
430
|
return jsenvForceInlineAttribute
|
|
403
431
|
}
|
|
432
|
+
|
|
433
|
+
const urlWithoutSearch = (url) => {
|
|
434
|
+
const urlObject = new URL(url)
|
|
435
|
+
urlObject.search = ""
|
|
436
|
+
return urlObject.href
|
|
437
|
+
}
|