@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
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,95 +131,122 @@ 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
|
-
// unfortunately browser resolves sourcemap to url before redirection (not after).
|
|
151
|
-
// It means browser tries to load source map from "/.jsenv/jsenv-toolbar.js.map"
|
|
152
|
-
// we could also inline sourcemap but it's not yet possible
|
|
153
|
-
// inside buildProject
|
|
154
|
-
const jsenvExploringIndexSourcemapInfo = {
|
|
155
|
-
pathForBrowser: `/.jsenv/jsenv_exploring_index.js.map`,
|
|
156
|
-
pathForServer: `/${jsenvExploringJsBuildRelativeUrlForProject}.map`,
|
|
157
|
-
}
|
|
158
|
-
const jsenvToolbarSourcemapInfo = {
|
|
159
|
-
pathForBrowser: `/.jsenv/jsenv_toolbar.js.map`,
|
|
160
|
-
pathForServer: `/${jsenvToolbarJsBuildRelativeUrlForProject}.map`,
|
|
161
|
-
}
|
|
162
|
-
|
|
163
153
|
return setupRoutes({
|
|
164
154
|
"/": (request) => {
|
|
165
155
|
const redirectTarget = mainFileRelativeUrl
|
|
166
|
-
const jsenvExploringRedirectorHtmlServerUrl = `${request.origin}/${jsenvExploringRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`
|
|
167
156
|
return {
|
|
168
157
|
status: 307,
|
|
169
158
|
headers: {
|
|
170
|
-
location:
|
|
159
|
+
location: `${request.origin}/${jsenvRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`,
|
|
171
160
|
},
|
|
172
161
|
}
|
|
173
162
|
},
|
|
174
163
|
"/.jsenv/redirect/:rest*": (request) => {
|
|
175
164
|
const redirectTarget = request.ressource.slice("/.jsenv/redirect/".length)
|
|
176
|
-
const jsenvExploringRedirectorHtmlServerUrl = `${request.origin}/${jsenvExploringRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`
|
|
177
165
|
return {
|
|
178
166
|
status: 307,
|
|
179
167
|
headers: {
|
|
180
|
-
location:
|
|
168
|
+
location: `${request.origin}/${jsenvRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`,
|
|
181
169
|
},
|
|
182
170
|
}
|
|
183
171
|
},
|
|
184
|
-
"/.jsenv/
|
|
185
|
-
const jsenvExploringRedirectorBuildServerUrl = `${request.origin}/${jsenvExploringRedirectorJsBuildRelativeUrlForProject}`
|
|
172
|
+
"/.jsenv/redirector.js": (request) => {
|
|
186
173
|
return {
|
|
187
174
|
status: 307,
|
|
188
175
|
headers: {
|
|
189
|
-
location:
|
|
176
|
+
location: `${request.origin}/${jsenvRedirectorJsBuildRelativeUrlForProject}`,
|
|
190
177
|
},
|
|
191
178
|
}
|
|
192
179
|
},
|
|
180
|
+
})
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const createEventSourceClientService = ({ projectDirectoryUrl }) => {
|
|
184
|
+
const eventSourceClientBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
185
|
+
eventSourceClientFileInfo.buildUrl,
|
|
186
|
+
projectDirectoryUrl,
|
|
187
|
+
)
|
|
188
|
+
return setupRoutes({
|
|
189
|
+
"/.jsenv/event_source_client.js": (request) => {
|
|
190
|
+
return {
|
|
191
|
+
status: 307,
|
|
192
|
+
headers: {
|
|
193
|
+
location: `${request.origin}/${eventSourceClientBuildRelativeUrlForProject}`,
|
|
194
|
+
},
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
// unfortunately browser resolves sourcemap to url before redirection (not after).
|
|
198
|
+
// It means browser tries to load source map from "/.jsenv/jsenv-toolbar.js.map"
|
|
199
|
+
// we could also inline sourcemap but it's not yet possible
|
|
200
|
+
// inside buildProject
|
|
201
|
+
"/.jsenv/event_source_client.js.map": (request) => {
|
|
202
|
+
return {
|
|
203
|
+
status: 307,
|
|
204
|
+
headers: {
|
|
205
|
+
location: `${request.origin}/${eventSourceClientBuildRelativeUrlForProject}.map`,
|
|
206
|
+
},
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const createExploringIndexService = ({ projectDirectoryUrl }) => {
|
|
213
|
+
const jsenvExploringJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
214
|
+
exploringIndexJsFileInfo.buildUrl,
|
|
215
|
+
projectDirectoryUrl,
|
|
216
|
+
)
|
|
217
|
+
return setupRoutes({
|
|
193
218
|
"/.jsenv/exploring.index.js": (request) => {
|
|
194
|
-
const jsenvExploringJsBuildServerUrl = `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}`
|
|
195
219
|
return {
|
|
196
220
|
status: 307,
|
|
197
221
|
headers: {
|
|
198
|
-
location:
|
|
222
|
+
location: `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}`,
|
|
199
223
|
},
|
|
200
224
|
}
|
|
201
225
|
},
|
|
202
|
-
|
|
226
|
+
// unfortunately browser resolves sourcemap to url before redirection (not after).
|
|
227
|
+
// It means browser tries to load source map from "/.jsenv/jsenv-toolbar.js.map"
|
|
228
|
+
// we could also inline sourcemap but it's not yet possible
|
|
229
|
+
// inside buildProject
|
|
230
|
+
"/.jsenv/jsenv_exploring_index.js.map": (request) => {
|
|
203
231
|
return {
|
|
204
232
|
status: 307,
|
|
205
233
|
headers: {
|
|
206
|
-
location: `${request.origin}
|
|
234
|
+
location: `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}.map`,
|
|
207
235
|
},
|
|
208
236
|
}
|
|
209
237
|
},
|
|
238
|
+
})
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const createToolbarService = ({ projectDirectoryUrl }) => {
|
|
242
|
+
const toolbarJsBuildRelativeUrlForProject = urlToRelativeUrl(
|
|
243
|
+
toolbarJsFileInfo.buildUrl,
|
|
244
|
+
projectDirectoryUrl,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
return setupRoutes({
|
|
210
248
|
"/.jsenv/toolbar.main.js": (request) => {
|
|
211
|
-
const jsenvToolbarJsBuildServerUrl = `${request.origin}/${
|
|
249
|
+
const jsenvToolbarJsBuildServerUrl = `${request.origin}/${toolbarJsBuildRelativeUrlForProject}`
|
|
212
250
|
return {
|
|
213
251
|
status: 307,
|
|
214
252
|
headers: {
|
|
@@ -216,18 +254,18 @@ const createRedirectFilesService = ({
|
|
|
216
254
|
},
|
|
217
255
|
}
|
|
218
256
|
},
|
|
219
|
-
|
|
257
|
+
"/.jsenv/jsenv_toolbar.js.map": (request) => {
|
|
220
258
|
return {
|
|
221
259
|
status: 307,
|
|
222
260
|
headers: {
|
|
223
|
-
location: `${request.origin}
|
|
261
|
+
location: `${request.origin}/${toolbarJsBuildRelativeUrlForProject}.map`,
|
|
224
262
|
},
|
|
225
263
|
}
|
|
226
264
|
},
|
|
227
265
|
})
|
|
228
266
|
}
|
|
229
267
|
|
|
230
|
-
const
|
|
268
|
+
const createExploringJsonService = ({
|
|
231
269
|
projectDirectoryUrl,
|
|
232
270
|
outDirectoryRelativeUrl,
|
|
233
271
|
explorableConfig,
|
|
@@ -246,7 +284,7 @@ const createExploringDataService = ({
|
|
|
246
284
|
projectDirectoryUrl,
|
|
247
285
|
),
|
|
248
286
|
exploringHtmlFileRelativeUrl: urlToRelativeUrl(
|
|
249
|
-
|
|
287
|
+
exploringIndexHtmlFileInfo.sourceUrl,
|
|
250
288
|
projectDirectoryUrl,
|
|
251
289
|
),
|
|
252
290
|
sourcemapMainFileRelativeUrl: urlToRelativeUrl(
|
|
@@ -275,7 +313,7 @@ const createExploringDataService = ({
|
|
|
275
313
|
}
|
|
276
314
|
}
|
|
277
315
|
|
|
278
|
-
const
|
|
316
|
+
const createExplorableJsonService = ({
|
|
279
317
|
projectDirectoryUrl,
|
|
280
318
|
outDirectoryRelativeUrl,
|
|
281
319
|
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
|
})
|
|
@@ -234,36 +242,40 @@ const getCompiler = ({ originalFileUrl, compileMeta }) => {
|
|
|
234
242
|
// there is a custom compiler and potentially a jsenv compiler
|
|
235
243
|
return async (params) => {
|
|
236
244
|
// do custom compilation first
|
|
237
|
-
const
|
|
245
|
+
const customCompilerReturnValue = await customCompiler(params)
|
|
238
246
|
// then check if jsenv compiler should apply
|
|
239
247
|
// to the new result contentType
|
|
240
248
|
const jsenvCompilerAfterCustomCompilation =
|
|
241
249
|
getJsenvCompilerAfterCustomCompilation({
|
|
242
250
|
url: originalFileUrl,
|
|
243
|
-
contentType: customResult.contentType,
|
|
244
251
|
compileMeta,
|
|
252
|
+
customCompilerReturnValue,
|
|
245
253
|
})
|
|
246
254
|
if (!jsenvCompilerAfterCustomCompilation) {
|
|
247
|
-
return
|
|
255
|
+
return customCompilerReturnValue
|
|
248
256
|
}
|
|
249
|
-
const
|
|
257
|
+
const jsenvCompilerReturnValue = await jsenvCompilerAfterCustomCompilation({
|
|
250
258
|
...params,
|
|
251
|
-
code:
|
|
252
|
-
map:
|
|
259
|
+
code: customCompilerReturnValue.compiledSource,
|
|
260
|
+
map: customCompilerReturnValue.sourcemap,
|
|
253
261
|
})
|
|
254
262
|
return {
|
|
255
|
-
...
|
|
256
|
-
...
|
|
263
|
+
...customCompilerReturnValue,
|
|
264
|
+
...jsenvCompilerReturnValue,
|
|
257
265
|
}
|
|
258
266
|
}
|
|
259
267
|
}
|
|
260
268
|
|
|
261
269
|
const getJsenvCompilerAfterCustomCompilation = ({
|
|
262
270
|
url,
|
|
263
|
-
contentType,
|
|
264
271
|
compileMeta,
|
|
272
|
+
customCompilerReturnValue,
|
|
265
273
|
}) => {
|
|
266
|
-
|
|
274
|
+
if (customCompilerReturnValue.isBuild) {
|
|
275
|
+
return null
|
|
276
|
+
}
|
|
277
|
+
const extensionToForce =
|
|
278
|
+
contentTypeExtensions[customCompilerReturnValue.contentType]
|
|
267
279
|
const urlForcingExtension = extensionToForce
|
|
268
280
|
? setUrlExtension(url, extensionToForce)
|
|
269
281
|
: url
|
|
@@ -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
|
+
}
|