@jsenv/core 24.0.0 → 24.0.1
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/package.json
CHANGED
package/src/dev_server.js
CHANGED
|
@@ -147,19 +147,6 @@ const createRedirectFilesService = ({
|
|
|
147
147
|
projectDirectoryUrl,
|
|
148
148
|
)
|
|
149
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
150
|
return setupRoutes({
|
|
164
151
|
"/": (request) => {
|
|
165
152
|
const redirectTarget = mainFileRelativeUrl
|
|
@@ -199,28 +186,32 @@ const createRedirectFilesService = ({
|
|
|
199
186
|
},
|
|
200
187
|
}
|
|
201
188
|
},
|
|
202
|
-
|
|
189
|
+
"/.jsenv/toolbar.main.js": (request) => {
|
|
190
|
+
const jsenvToolbarJsBuildServerUrl = `${request.origin}/${jsenvToolbarJsBuildRelativeUrlForProject}`
|
|
203
191
|
return {
|
|
204
192
|
status: 307,
|
|
205
193
|
headers: {
|
|
206
|
-
location:
|
|
194
|
+
location: jsenvToolbarJsBuildServerUrl,
|
|
207
195
|
},
|
|
208
196
|
}
|
|
209
197
|
},
|
|
210
|
-
|
|
211
|
-
|
|
198
|
+
// unfortunately browser resolves sourcemap to url before redirection (not after).
|
|
199
|
+
// It means browser tries to load source map from "/.jsenv/jsenv-toolbar.js.map"
|
|
200
|
+
// we could also inline sourcemap but it's not yet possible
|
|
201
|
+
// inside buildProject
|
|
202
|
+
"/.jsenv/jsenv_exploring_index.js.map": (request) => {
|
|
212
203
|
return {
|
|
213
204
|
status: 307,
|
|
214
205
|
headers: {
|
|
215
|
-
location:
|
|
206
|
+
location: `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}.map`,
|
|
216
207
|
},
|
|
217
208
|
}
|
|
218
209
|
},
|
|
219
|
-
|
|
210
|
+
"/.jsenv/jsenv_toolbar.js.map": (request) => {
|
|
220
211
|
return {
|
|
221
212
|
status: 307,
|
|
222
213
|
headers: {
|
|
223
|
-
location: `${request.origin}
|
|
214
|
+
location: `${request.origin}/${jsenvToolbarJsBuildRelativeUrlForProject}.map`,
|
|
224
215
|
},
|
|
225
216
|
}
|
|
226
217
|
},
|
|
@@ -234,36 +234,40 @@ const getCompiler = ({ originalFileUrl, compileMeta }) => {
|
|
|
234
234
|
// there is a custom compiler and potentially a jsenv compiler
|
|
235
235
|
return async (params) => {
|
|
236
236
|
// do custom compilation first
|
|
237
|
-
const
|
|
237
|
+
const customCompilerReturnValue = await customCompiler(params)
|
|
238
238
|
// then check if jsenv compiler should apply
|
|
239
239
|
// to the new result contentType
|
|
240
240
|
const jsenvCompilerAfterCustomCompilation =
|
|
241
241
|
getJsenvCompilerAfterCustomCompilation({
|
|
242
242
|
url: originalFileUrl,
|
|
243
|
-
contentType: customResult.contentType,
|
|
244
243
|
compileMeta,
|
|
244
|
+
customCompilerReturnValue,
|
|
245
245
|
})
|
|
246
246
|
if (!jsenvCompilerAfterCustomCompilation) {
|
|
247
|
-
return
|
|
247
|
+
return customCompilerReturnValue
|
|
248
248
|
}
|
|
249
|
-
const
|
|
249
|
+
const jsenvCompilerReturnValue = await jsenvCompilerAfterCustomCompilation({
|
|
250
250
|
...params,
|
|
251
|
-
code:
|
|
252
|
-
map:
|
|
251
|
+
code: customCompilerReturnValue.compiledSource,
|
|
252
|
+
map: customCompilerReturnValue.sourcemap,
|
|
253
253
|
})
|
|
254
254
|
return {
|
|
255
|
-
...
|
|
256
|
-
...
|
|
255
|
+
...customCompilerReturnValue,
|
|
256
|
+
...jsenvCompilerReturnValue,
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
}
|
|
260
260
|
|
|
261
261
|
const getJsenvCompilerAfterCustomCompilation = ({
|
|
262
262
|
url,
|
|
263
|
-
contentType,
|
|
264
263
|
compileMeta,
|
|
264
|
+
customCompilerReturnValue,
|
|
265
265
|
}) => {
|
|
266
|
-
|
|
266
|
+
if (customCompilerReturnValue.isBuild) {
|
|
267
|
+
return null
|
|
268
|
+
}
|
|
269
|
+
const extensionToForce =
|
|
270
|
+
contentTypeExtensions[customCompilerReturnValue.contentType]
|
|
267
271
|
const urlForcingExtension = extensionToForce
|
|
268
272
|
? setUrlExtension(url, extensionToForce)
|
|
269
273
|
: url
|
|
@@ -239,14 +239,14 @@ export const startCompileServer = async ({
|
|
|
239
239
|
})
|
|
240
240
|
customServices = {
|
|
241
241
|
...customServices,
|
|
242
|
-
"
|
|
242
|
+
"jsenv:sse": serveSSEForLivereload,
|
|
243
243
|
}
|
|
244
244
|
} else {
|
|
245
245
|
const roomWhenLivereloadIsDisabled = createSSERoom()
|
|
246
246
|
roomWhenLivereloadIsDisabled.open()
|
|
247
247
|
customServices = {
|
|
248
248
|
...customServices,
|
|
249
|
-
"
|
|
249
|
+
"jsenv:sse": (request) => {
|
|
250
250
|
const { accept } = request.headers
|
|
251
251
|
if (!accept || !accept.includes("text/event-stream")) {
|
|
252
252
|
return null
|
|
@@ -389,6 +389,7 @@ export const startCompileServer = async ({
|
|
|
389
389
|
...compileServer,
|
|
390
390
|
compileServerGroupMap,
|
|
391
391
|
babelPluginMap,
|
|
392
|
+
projectFileRequestedCallback,
|
|
392
393
|
}
|
|
393
394
|
}
|
|
394
395
|
|
|
@@ -627,62 +628,79 @@ const setupServerSentEventsForLivereload = ({
|
|
|
627
628
|
clearTimeout(timeout)
|
|
628
629
|
})
|
|
629
630
|
|
|
630
|
-
const
|
|
631
|
-
|
|
632
|
-
|
|
631
|
+
const startTrackingRoot = (rootFile) => {
|
|
632
|
+
stopTrackingRoot(rootFile)
|
|
633
|
+
const set = new Set()
|
|
634
|
+
set.add(rootFile)
|
|
635
|
+
const depInfo = {
|
|
636
|
+
set,
|
|
637
|
+
cleanup: [],
|
|
638
|
+
}
|
|
639
|
+
trackerMap.set(rootFile, depInfo)
|
|
640
|
+
return depInfo
|
|
641
|
+
}
|
|
642
|
+
const addStopTrackingCalback = (rootFile, callback) => {
|
|
643
|
+
trackerMap.get(rootFile).cleanup.push(callback)
|
|
644
|
+
}
|
|
645
|
+
const stopTrackingRoot = (rootFile) => {
|
|
646
|
+
const depInfo = trackerMap.get(rootFile)
|
|
647
|
+
if (depInfo) {
|
|
648
|
+
depInfo.cleanup.forEach((cb) => {
|
|
649
|
+
cb()
|
|
650
|
+
})
|
|
651
|
+
trackerMap.delete(rootFile)
|
|
633
652
|
}
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
trackerMap.set(
|
|
637
|
-
|
|
653
|
+
}
|
|
654
|
+
const isDependencyOf = (file, rootFile) => {
|
|
655
|
+
return trackerMap.get(rootFile).set.has(file)
|
|
656
|
+
}
|
|
657
|
+
const markAsDependencyOf = (file, rootFile) => {
|
|
658
|
+
trackerMap.get(rootFile).set.add(file)
|
|
638
659
|
}
|
|
639
660
|
|
|
640
661
|
// each time a file is requested for the first time its dependencySet is computed
|
|
641
|
-
projectFileRequested.add((
|
|
662
|
+
projectFileRequested.add((requestInfo) => {
|
|
663
|
+
const rootRelativeUrl = requestInfo.relativeUrl
|
|
642
664
|
// for now no use case of livereloading on node.js
|
|
643
665
|
// and for browsers only html file can be main files
|
|
644
666
|
// this avoid collecting dependencies of non html files that will never be used
|
|
645
|
-
if (!
|
|
667
|
+
if (!rootRelativeUrl.endsWith(".html")) {
|
|
646
668
|
return
|
|
647
669
|
}
|
|
648
670
|
|
|
649
671
|
// when a file is requested, always rebuild its dependency in case it has changed
|
|
650
672
|
// since the last time it was requested
|
|
651
|
-
|
|
652
|
-
dependencySet.add(mainRelativeUrl)
|
|
653
|
-
trackerMap.set(mainRelativeUrl, dependencySet)
|
|
673
|
+
startTrackingRoot(rootRelativeUrl)
|
|
654
674
|
|
|
655
675
|
const removeDependencyRequestedCallback = projectFileRequested.add(
|
|
656
676
|
({ relativeUrl, request }) => {
|
|
657
|
-
if (
|
|
677
|
+
if (isDependencyOf(relativeUrl, rootRelativeUrl)) {
|
|
658
678
|
return
|
|
659
679
|
}
|
|
660
|
-
|
|
661
680
|
const dependencyReport = reportDependency(
|
|
662
681
|
relativeUrl,
|
|
663
|
-
|
|
682
|
+
rootRelativeUrl,
|
|
664
683
|
request,
|
|
665
684
|
)
|
|
666
685
|
if (dependencyReport.dependency === false) {
|
|
667
686
|
livereloadLogger.debug(
|
|
668
|
-
`${relativeUrl} not a dependency of ${
|
|
687
|
+
`${relativeUrl} not a dependency of ${rootRelativeUrl} because ${dependencyReport.reason}`,
|
|
669
688
|
)
|
|
670
689
|
return
|
|
671
690
|
}
|
|
672
|
-
|
|
673
691
|
livereloadLogger.debug(
|
|
674
|
-
`${relativeUrl} is a dependency of ${
|
|
692
|
+
`${relativeUrl} is a dependency of ${rootRelativeUrl} because ${dependencyReport.reason}`,
|
|
675
693
|
)
|
|
676
|
-
|
|
694
|
+
markAsDependencyOf(relativeUrl, rootRelativeUrl)
|
|
677
695
|
},
|
|
678
696
|
)
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
trackerMap.delete(mainRelativeUrl)
|
|
697
|
+
addStopTrackingCalback(rootRelativeUrl, removeDependencyRequestedCallback)
|
|
698
|
+
const removeRootRemovedCallback = projectFileRemoved.add((relativeUrl) => {
|
|
699
|
+
if (relativeUrl === rootRelativeUrl) {
|
|
700
|
+
stopTrackingRoot(rootRelativeUrl)
|
|
684
701
|
}
|
|
685
702
|
})
|
|
703
|
+
addStopTrackingCalback(rootRelativeUrl, removeRootRemovedCallback)
|
|
686
704
|
})
|
|
687
705
|
|
|
688
706
|
const trackMainAndDependencies = (
|
|
@@ -692,20 +710,17 @@ const setupServerSentEventsForLivereload = ({
|
|
|
692
710
|
livereloadLogger.debug(`track ${mainRelativeUrl} and its dependencies`)
|
|
693
711
|
|
|
694
712
|
const removeModifiedCallback = projectFileModified.add((relativeUrl) => {
|
|
695
|
-
|
|
696
|
-
if (dependencySet.has(relativeUrl)) {
|
|
713
|
+
if (isDependencyOf(relativeUrl, mainRelativeUrl)) {
|
|
697
714
|
modified(relativeUrl)
|
|
698
715
|
}
|
|
699
716
|
})
|
|
700
717
|
const removeRemovedCallback = projectFileRemoved.add((relativeUrl) => {
|
|
701
|
-
|
|
702
|
-
if (dependencySet.has(relativeUrl)) {
|
|
718
|
+
if (isDependencyOf(relativeUrl, mainRelativeUrl)) {
|
|
703
719
|
removed(relativeUrl)
|
|
704
720
|
}
|
|
705
721
|
})
|
|
706
722
|
const removeAddedCallback = projectFileAdded.add((relativeUrl) => {
|
|
707
|
-
|
|
708
|
-
if (dependencySet.has(relativeUrl)) {
|
|
723
|
+
if (isDependencyOf(relativeUrl, mainRelativeUrl)) {
|
|
709
724
|
added(relativeUrl)
|
|
710
725
|
}
|
|
711
726
|
})
|
|
@@ -744,14 +759,6 @@ const setupServerSentEventsForLivereload = ({
|
|
|
744
759
|
|
|
745
760
|
const { referer } = request.headers
|
|
746
761
|
if (referer) {
|
|
747
|
-
const { origin } = request
|
|
748
|
-
// referer is likely the dev server
|
|
749
|
-
if (referer !== origin && !urlIsInsideOf(referer, origin)) {
|
|
750
|
-
return {
|
|
751
|
-
dependency: false,
|
|
752
|
-
reason: "referer is an other origin",
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
762
|
// here we know the referer is inside compileServer
|
|
756
763
|
const refererRelativeUrl = urlToOriginalRelativeUrl(
|
|
757
764
|
referer,
|
|
@@ -764,7 +771,7 @@ const setupServerSentEventsForLivereload = ({
|
|
|
764
771
|
for (const tracker of trackerMap) {
|
|
765
772
|
if (
|
|
766
773
|
tracker[0] === mainRelativeUrl &&
|
|
767
|
-
tracker[1].has(refererRelativeUrl)
|
|
774
|
+
tracker[1].set.has(refererRelativeUrl)
|
|
768
775
|
) {
|
|
769
776
|
return {
|
|
770
777
|
dependency: true,
|
|
@@ -893,8 +900,7 @@ const createSourceFileService = ({
|
|
|
893
900
|
projectFileCacheStrategy,
|
|
894
901
|
}) => {
|
|
895
902
|
return async (request) => {
|
|
896
|
-
const
|
|
897
|
-
const relativeUrl = ressource.slice(1)
|
|
903
|
+
const relativeUrl = request.pathname.slice(1)
|
|
898
904
|
projectFileRequestedCallback(relativeUrl, request)
|
|
899
905
|
|
|
900
906
|
const responsePromise = fetchFileSystem(
|