@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "24.0.0",
3
+ "version": "24.0.1",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "repository": {
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
- [jsenvExploringIndexSourcemapInfo.pathForBrowser]: (request) => {
189
+ "/.jsenv/toolbar.main.js": (request) => {
190
+ const jsenvToolbarJsBuildServerUrl = `${request.origin}/${jsenvToolbarJsBuildRelativeUrlForProject}`
203
191
  return {
204
192
  status: 307,
205
193
  headers: {
206
- location: `${request.origin}${jsenvExploringIndexSourcemapInfo.pathForServer}`,
194
+ location: jsenvToolbarJsBuildServerUrl,
207
195
  },
208
196
  }
209
197
  },
210
- "/.jsenv/toolbar.main.js": (request) => {
211
- const jsenvToolbarJsBuildServerUrl = `${request.origin}/${jsenvToolbarJsBuildRelativeUrlForProject}`
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: jsenvToolbarJsBuildServerUrl,
206
+ location: `${request.origin}/${jsenvExploringJsBuildRelativeUrlForProject}.map`,
216
207
  },
217
208
  }
218
209
  },
219
- [jsenvToolbarSourcemapInfo.pathForBrowser]: (request) => {
210
+ "/.jsenv/jsenv_toolbar.js.map": (request) => {
220
211
  return {
221
212
  status: 307,
222
213
  headers: {
223
- location: `${request.origin}${jsenvToolbarSourcemapInfo.pathForServer}`,
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 customResult = await customCompiler(params)
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 customResult
247
+ return customCompilerReturnValue
248
248
  }
249
- const jsenvResult = await jsenvCompilerAfterCustomCompilation({
249
+ const jsenvCompilerReturnValue = await jsenvCompilerAfterCustomCompilation({
250
250
  ...params,
251
- code: customResult.compiledSource,
252
- map: customResult.sourcemap,
251
+ code: customCompilerReturnValue.compiledSource,
252
+ map: customCompilerReturnValue.sourcemap,
253
253
  })
254
254
  return {
255
- ...customResult,
256
- ...jsenvResult,
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
- const extensionToForce = contentTypeExtensions[contentType]
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
- "service:sse": serveSSEForLivereload,
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
- "service:sse": (request) => {
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 getDependencySet = (mainRelativeUrl) => {
631
- if (trackerMap.has(mainRelativeUrl)) {
632
- return trackerMap.get(mainRelativeUrl)
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
- const dependencySet = new Set()
635
- dependencySet.add(mainRelativeUrl)
636
- trackerMap.set(mainRelativeUrl, dependencySet)
637
- return dependencySet
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(({ relativeUrl: mainRelativeUrl }) => {
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 (!mainRelativeUrl.endsWith(".html")) {
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
- const dependencySet = new Set()
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 (dependencySet.has(relativeUrl)) {
677
+ if (isDependencyOf(relativeUrl, rootRelativeUrl)) {
658
678
  return
659
679
  }
660
-
661
680
  const dependencyReport = reportDependency(
662
681
  relativeUrl,
663
- mainRelativeUrl,
682
+ rootRelativeUrl,
664
683
  request,
665
684
  )
666
685
  if (dependencyReport.dependency === false) {
667
686
  livereloadLogger.debug(
668
- `${relativeUrl} not a dependency of ${mainRelativeUrl} because ${dependencyReport.reason}`,
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 ${mainRelativeUrl} because ${dependencyReport.reason}`,
692
+ `${relativeUrl} is a dependency of ${rootRelativeUrl} because ${dependencyReport.reason}`,
675
693
  )
676
- dependencySet.add(relativeUrl)
694
+ markAsDependencyOf(relativeUrl, rootRelativeUrl)
677
695
  },
678
696
  )
679
- const removeMainRemovedCallback = projectFileRemoved.add((relativeUrl) => {
680
- if (relativeUrl === mainRelativeUrl) {
681
- removeDependencyRequestedCallback()
682
- removeMainRemovedCallback()
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
- const dependencySet = getDependencySet(mainRelativeUrl)
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
- const dependencySet = getDependencySet(mainRelativeUrl)
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
- const dependencySet = getDependencySet(mainRelativeUrl)
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 { ressource } = request
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(