@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.
Files changed (69) 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 +1388 -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/{LICENSE → license} +0 -0
  11. package/package.json +2 -3
  12. package/src/buildProject.js +2 -0
  13. package/src/dev_server.js +108 -57
  14. package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +1 -2
  15. package/src/internal/compiling/compileFile.js +51 -23
  16. package/src/internal/compiling/createCompiledFileService.js +8 -0
  17. package/src/internal/compiling/html_source_file_service.js +43 -9
  18. package/src/internal/compiling/jsenvCompilerForHtml.js +146 -107
  19. package/src/internal/compiling/startCompileServer.js +10 -1
  20. package/src/internal/dev_server/event_source_client/event_source_client.js +63 -0
  21. package/src/internal/dev_server/event_source_client/event_source_client_file_info.js +17 -0
  22. package/src/internal/{toolbar/eventsource/connectEventSource.js → dev_server/event_source_client/event_source_connection.js} +47 -78
  23. package/src/internal/dev_server/event_source_client/file_changes.js +82 -0
  24. package/src/internal/dev_server/event_source_client/livereload_preference.js +13 -0
  25. package/src/internal/{exploring → dev_server/exploring}/exploring.css +0 -0
  26. package/src/internal/{exploring → dev_server/exploring}/exploring.html +1 -1
  27. package/src/internal/{exploring → dev_server/exploring}/exploring.js +0 -0
  28. package/src/internal/dev_server/exploring/exploring_file_info.js +21 -0
  29. package/src/internal/{exploring → dev_server/exploring}/fetchExploringJson.js +1 -1
  30. package/src/internal/{exploring/exploring.redirector.html → dev_server/redirector/redirector.html} +1 -1
  31. package/src/internal/{exploring/exploring.redirector.js → dev_server/redirector/redirector.js} +4 -2
  32. package/src/internal/dev_server/redirector/redirector_file_info.js +24 -0
  33. package/src/internal/{toolbar → dev_server/toolbar}/animation/toolbar.animation.js +0 -0
  34. package/src/internal/{toolbar → dev_server/toolbar}/backtolist/toolbar.backtolist.js +0 -0
  35. package/src/internal/{toolbar → dev_server/toolbar}/compilation/compilation.css +0 -0
  36. package/src/internal/{toolbar → dev_server/toolbar}/compilation/toolbar.compilation.js +1 -1
  37. package/src/internal/{toolbar → dev_server/toolbar}/eventsource/eventsource.css +0 -0
  38. package/src/internal/dev_server/toolbar/eventsource/toolbar.eventsource.js +83 -0
  39. package/src/internal/{toolbar → dev_server/toolbar}/execution/execution.css +0 -0
  40. package/src/internal/{toolbar → dev_server/toolbar}/execution/toolbar.execution.js +0 -0
  41. package/src/internal/{toolbar → dev_server/toolbar}/focus/focus.css +0 -0
  42. package/src/internal/{toolbar → dev_server/toolbar}/focus/toolbar.focus.js +0 -0
  43. package/src/internal/{toolbar → dev_server/toolbar}/jsenv-logo.svg +0 -0
  44. package/src/internal/{toolbar → dev_server/toolbar}/notification/toolbar.notification.js +0 -0
  45. package/src/internal/{toolbar → dev_server/toolbar}/responsive/overflow-menu.css +0 -0
  46. package/src/internal/{toolbar → dev_server/toolbar}/responsive/toolbar.responsive.js +0 -0
  47. package/src/internal/{toolbar → dev_server/toolbar}/settings/settings.css +0 -0
  48. package/src/internal/{toolbar → dev_server/toolbar}/settings/toolbar.settings.js +0 -0
  49. package/src/internal/{toolbar → dev_server/toolbar}/theme/jsenv-theme.css +0 -0
  50. package/src/internal/{toolbar → dev_server/toolbar}/theme/light-theme.css +0 -0
  51. package/src/internal/{toolbar → dev_server/toolbar}/theme/toolbar.theme.js +0 -0
  52. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.html +4 -37
  53. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.injector.js +3 -92
  54. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.css +0 -0
  55. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.js +0 -0
  56. package/src/internal/dev_server/toolbar/toolbar_file_info.js +37 -0
  57. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.css +0 -0
  58. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.js +0 -0
  59. package/src/internal/{toolbar → dev_server/toolbar}/util/animation.js +0 -0
  60. package/src/internal/{toolbar → dev_server/toolbar}/util/dom.js +0 -0
  61. package/src/internal/{toolbar → dev_server/toolbar}/util/fetching.js +2 -2
  62. package/src/internal/{toolbar → dev_server/toolbar}/util/jsenvLogger.js +0 -0
  63. package/src/internal/{toolbar → dev_server/toolbar}/util/preferences.js +0 -0
  64. package/src/internal/{toolbar → dev_server/toolbar}/util/responsive.js +0 -0
  65. package/src/internal/{toolbar → dev_server/toolbar}/util/util.js +0 -0
  66. package/src/internal/{toolbar → dev_server/toolbar}/variant/variant.js +0 -0
  67. package/src/internal/jsenvInternalFiles.js +0 -58
  68. package/src/internal/toolbar/eventsource/connectCompileServerEventSource.js +0 -74
  69. 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,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 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
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: jsenvExploringRedirectorHtmlServerUrl,
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: jsenvExploringRedirectorHtmlServerUrl,
168
+ location: `${
169
+ request.origin
170
+ }/${jsenvRedirectorHtmlRelativeUrlForProject}?redirect=${encodeURIComponent(
171
+ redirectTarget,
172
+ )}`,
168
173
  },
169
174
  }
170
175
  },
171
- "/.jsenv/exploring.redirector.js": (request) => {
172
- const jsenvExploringRedirectorBuildServerUrl = `${request.origin}/${jsenvExploringRedirectorJsBuildRelativeUrlForProject}`
176
+ "/.jsenv/redirector.js": (request) => {
173
177
  return {
174
178
  status: 307,
175
179
  headers: {
176
- location: jsenvExploringRedirectorBuildServerUrl,
180
+ location: `${request.origin}/${jsenvRedirectorJsBuildRelativeUrlForProject}`,
177
181
  },
178
182
  }
179
183
  },
180
- "/.jsenv/exploring.index.js": (request) => {
181
- const jsenvExploringJsBuildServerUrl = `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}`
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: jsenvExploringJsBuildServerUrl,
197
+ location: `${request.origin}/${eventSourceClientBuildRelativeUrlForProject}`,
186
198
  },
187
199
  }
188
200
  },
189
- "/.jsenv/toolbar.main.js": (request) => {
190
- const jsenvToolbarJsBuildServerUrl = `${request.origin}/${jsenvToolbarJsBuildRelativeUrlForProject}`
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: jsenvToolbarJsBuildServerUrl,
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}/${jsenvToolbarJsBuildRelativeUrlForProject}.map`,
265
+ location: `${request.origin}/${toolbarJsBuildRelativeUrlForProject}.map`,
215
266
  },
216
267
  }
217
268
  },
218
269
  })
219
270
  }
220
271
 
221
- const createExploringDataService = ({
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
- jsenvExploringIndexHtmlFileInfo.url,
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 createExplorableListAsJsonService = ({
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
- 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
  })
@@ -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
+ }