@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.
Files changed (68) hide show
  1. package/dist/jsenv_event_source_client.js +338 -0
  2. package/dist/jsenv_event_source_client.js.map +126 -0
  3. package/dist/jsenv_exploring_index.js.map +7 -7
  4. package/dist/jsenv_redirector.js +1386 -0
  5. package/dist/jsenv_redirector.js.map +384 -0
  6. package/dist/jsenv_toolbar.js +37 -504
  7. package/dist/jsenv_toolbar.js.map +37 -112
  8. package/dist/jsenv_toolbar_injector.js +31 -126
  9. package/dist/jsenv_toolbar_injector.js.map +11 -30
  10. package/package.json +1 -1
  11. package/src/buildProject.js +2 -0
  12. package/src/dev_server.js +108 -70
  13. package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +1 -2
  14. package/src/internal/compiling/compileFile.js +51 -23
  15. package/src/internal/compiling/createCompiledFileService.js +22 -10
  16. package/src/internal/compiling/html_source_file_service.js +43 -9
  17. package/src/internal/compiling/jsenvCompilerForHtml.js +146 -107
  18. package/src/internal/compiling/startCompileServer.js +60 -44
  19. package/src/internal/dev_server/event_source_client/event_source_client.js +63 -0
  20. package/src/internal/dev_server/event_source_client/event_source_client_file_info.js +17 -0
  21. package/src/internal/{toolbar/eventsource/connectEventSource.js → dev_server/event_source_client/event_source_connection.js} +47 -78
  22. package/src/internal/dev_server/event_source_client/file_changes.js +82 -0
  23. package/src/internal/dev_server/event_source_client/livereload_preference.js +13 -0
  24. package/src/internal/{exploring → dev_server/exploring}/exploring.css +0 -0
  25. package/src/internal/{exploring → dev_server/exploring}/exploring.html +1 -1
  26. package/src/internal/{exploring → dev_server/exploring}/exploring.js +0 -0
  27. package/src/internal/dev_server/exploring/exploring_file_info.js +21 -0
  28. package/src/internal/{exploring → dev_server/exploring}/fetchExploringJson.js +1 -1
  29. package/src/internal/{exploring/exploring.redirector.html → dev_server/redirector/redirector.html} +1 -1
  30. package/src/internal/{exploring/exploring.redirector.js → dev_server/redirector/redirector.js} +1 -1
  31. package/src/internal/dev_server/redirector/redirector_file_info.js +24 -0
  32. package/src/internal/{toolbar → dev_server/toolbar}/animation/toolbar.animation.js +0 -0
  33. package/src/internal/{toolbar → dev_server/toolbar}/backtolist/toolbar.backtolist.js +0 -0
  34. package/src/internal/{toolbar → dev_server/toolbar}/compilation/compilation.css +0 -0
  35. package/src/internal/{toolbar → dev_server/toolbar}/compilation/toolbar.compilation.js +1 -1
  36. package/src/internal/{toolbar → dev_server/toolbar}/eventsource/eventsource.css +0 -0
  37. package/src/internal/dev_server/toolbar/eventsource/toolbar.eventsource.js +83 -0
  38. package/src/internal/{toolbar → dev_server/toolbar}/execution/execution.css +0 -0
  39. package/src/internal/{toolbar → dev_server/toolbar}/execution/toolbar.execution.js +0 -0
  40. package/src/internal/{toolbar → dev_server/toolbar}/focus/focus.css +0 -0
  41. package/src/internal/{toolbar → dev_server/toolbar}/focus/toolbar.focus.js +0 -0
  42. package/src/internal/{toolbar → dev_server/toolbar}/jsenv-logo.svg +0 -0
  43. package/src/internal/{toolbar → dev_server/toolbar}/notification/toolbar.notification.js +0 -0
  44. package/src/internal/{toolbar → dev_server/toolbar}/responsive/overflow-menu.css +0 -0
  45. package/src/internal/{toolbar → dev_server/toolbar}/responsive/toolbar.responsive.js +0 -0
  46. package/src/internal/{toolbar → dev_server/toolbar}/settings/settings.css +0 -0
  47. package/src/internal/{toolbar → dev_server/toolbar}/settings/toolbar.settings.js +0 -0
  48. package/src/internal/{toolbar → dev_server/toolbar}/theme/jsenv-theme.css +0 -0
  49. package/src/internal/{toolbar → dev_server/toolbar}/theme/light-theme.css +0 -0
  50. package/src/internal/{toolbar → dev_server/toolbar}/theme/toolbar.theme.js +0 -0
  51. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.html +4 -37
  52. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.injector.js +3 -92
  53. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.css +0 -0
  54. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.js +0 -0
  55. package/src/internal/dev_server/toolbar/toolbar_file_info.js +37 -0
  56. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.css +0 -0
  57. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.js +0 -0
  58. package/src/internal/{toolbar → dev_server/toolbar}/util/animation.js +0 -0
  59. package/src/internal/{toolbar → dev_server/toolbar}/util/dom.js +0 -0
  60. package/src/internal/{toolbar → dev_server/toolbar}/util/fetching.js +2 -2
  61. package/src/internal/{toolbar → dev_server/toolbar}/util/jsenvLogger.js +0 -0
  62. package/src/internal/{toolbar → dev_server/toolbar}/util/preferences.js +0 -0
  63. package/src/internal/{toolbar → dev_server/toolbar}/util/responsive.js +0 -0
  64. package/src/internal/{toolbar → dev_server/toolbar}/util/util.js +0 -0
  65. package/src/internal/{toolbar → dev_server/toolbar}/variant/variant.js +0 -0
  66. package/src/internal/jsenvInternalFiles.js +0 -58
  67. package/src/internal/toolbar/eventsource/connectCompileServerEventSource.js +0 -74
  68. 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
- jsenvExploringIndexHtmlFileInfo.url,
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": redirectFiles,
105
- "jsenv:exploring-data": serveExploringData,
106
- "jsenv:explorables": serveExplorableListAsJson,
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 createRedirectFilesService = ({
141
+ const createRedirectorService = ({
130
142
  projectDirectoryUrl,
131
143
  mainFileRelativeUrl,
132
144
  }) => {
133
- const jsenvExploringRedirectorHtmlRelativeUrlForProject = urlToRelativeUrl(
134
- jsenvExploringRedirectorHtmlFileInfo.url,
145
+ const jsenvRedirectorHtmlRelativeUrlForProject = urlToRelativeUrl(
146
+ redirectorHtmlFileInfo.sourceUrl,
135
147
  projectDirectoryUrl,
136
148
  )
137
- const jsenvExploringRedirectorJsBuildRelativeUrlForProject = urlToRelativeUrl(
138
- jsenvExploringRedirectorJsFileInfo.jsenvBuildUrl,
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: jsenvExploringRedirectorHtmlServerUrl,
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: jsenvExploringRedirectorHtmlServerUrl,
168
+ location: `${request.origin}/${jsenvRedirectorHtmlRelativeUrlForProject}?redirect=${redirectTarget}`,
181
169
  },
182
170
  }
183
171
  },
184
- "/.jsenv/exploring.redirector.js": (request) => {
185
- const jsenvExploringRedirectorBuildServerUrl = `${request.origin}/${jsenvExploringRedirectorJsBuildRelativeUrlForProject}`
172
+ "/.jsenv/redirector.js": (request) => {
186
173
  return {
187
174
  status: 307,
188
175
  headers: {
189
- location: jsenvExploringRedirectorBuildServerUrl,
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: jsenvExploringJsBuildServerUrl,
222
+ location: `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}`,
199
223
  },
200
224
  }
201
225
  },
202
- [jsenvExploringIndexSourcemapInfo.pathForBrowser]: (request) => {
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}${jsenvExploringIndexSourcemapInfo.pathForServer}`,
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}/${jsenvToolbarJsBuildRelativeUrlForProject}`
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
- [jsenvToolbarSourcemapInfo.pathForBrowser]: (request) => {
257
+ "/.jsenv/jsenv_toolbar.js.map": (request) => {
220
258
  return {
221
259
  status: 307,
222
260
  headers: {
223
- location: `${request.origin}${jsenvToolbarSourcemapInfo.pathForServer}`,
261
+ location: `${request.origin}/${toolbarJsBuildRelativeUrlForProject}.map`,
224
262
  },
225
263
  }
226
264
  },
227
265
  })
228
266
  }
229
267
 
230
- const createExploringDataService = ({
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
- jsenvExploringIndexHtmlFileInfo.url,
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 createExplorableListAsJsonService = ({
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
- request.http2 &&
111
- // js resolution is special, we cannot just do resolveUrl of the import specifier
112
- // because there can be importmap (bare specifier, import without extension, custom remapping, ...)
113
- // And we would push 404 to the browser
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 customResult = await customCompiler(params)
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 customResult
255
+ return customCompilerReturnValue
248
256
  }
249
- const jsenvResult = await jsenvCompilerAfterCustomCompilation({
257
+ const jsenvCompilerReturnValue = await jsenvCompilerAfterCustomCompilation({
250
258
  ...params,
251
- code: customResult.compiledSource,
252
- map: customResult.sourcemap,
259
+ code: customCompilerReturnValue.compiledSource,
260
+ map: customCompilerReturnValue.sourcemap,
253
261
  })
254
262
  return {
255
- ...customResult,
256
- ...jsenvResult,
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
- const extensionToForce = contentTypeExtensions[contentType]
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
- jsenvToolbarHtmlFileInfo,
27
- jsenvBrowserSystemFileInfo,
28
- jsenvToolbarInjectorFileInfo,
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 jsenvToolbarInjectorBuildRelativeUrlForProject = urlToRelativeUrl(
158
- jsenvToolbarInjectorFileInfo.jsenvBuildUrl,
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 !== jsenvToolbarHtmlFileInfo.url && jsenvScriptInjection
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 !== jsenvToolbarHtmlFileInfo.url && jsenvToolbarInjection
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: `/${jsenvToolbarInjectorBuildRelativeUrlForProject}`,
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
+ }