@jsenv/core 23.2.2 → 23.4.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 (56) hide show
  1. package/{license → LICENSE} +0 -0
  2. package/package.json +13 -14
  3. package/readme.md +4 -4
  4. package/src/buildProject.js +12 -13
  5. package/src/execute.js +92 -93
  6. package/src/executeTestPlan.js +9 -8
  7. package/src/internal/browser-launcher/executeHtmlFile.js +26 -23
  8. package/src/internal/building/buildUsingRollup.js +3 -4
  9. package/src/internal/building/build_logs.js +7 -6
  10. package/src/internal/building/createJsenvRollupPlugin.js +9 -14
  11. package/src/internal/building/url_trace.js +3 -4
  12. package/src/internal/compiling/createCompiledFileService.js +21 -6
  13. package/src/internal/compiling/startCompileServer.js +55 -46
  14. package/src/internal/executing/coverage/babel_plugin_instrument.js +1 -0
  15. package/src/internal/executing/coverage/reportToCoverage.js +147 -120
  16. package/src/internal/executing/{coverage → coverage_empty}/createEmptyCoverage.js +0 -0
  17. package/src/internal/executing/coverage_empty/list_files_not_covered.js +20 -0
  18. package/src/internal/executing/{coverage → coverage_empty}/relativeUrlToEmptyCoverage.js +3 -4
  19. package/src/internal/executing/{coverage/generateCoverageHtmlDirectory.js → coverage_reporter/coverage_reporter_html_directory.js} +11 -4
  20. package/src/internal/executing/{coverage/generateCoverageJsonFile.js → coverage_reporter/coverage_reporter_json_file.js} +0 -0
  21. package/src/internal/executing/{coverage/generateCoverageTextLog.js → coverage_reporter/coverage_reporter_text_log.js} +4 -2
  22. package/src/internal/executing/{coverage → coverage_reporter}/istanbulCoverageMapFromCoverage.js +0 -0
  23. package/src/internal/executing/{coverage/normalizeIstanbulCoverage.js → coverage_utils/file_by_file_coverage.js} +9 -7
  24. package/src/internal/executing/coverage_utils/istanbul_coverage_composition.js +28 -0
  25. package/src/internal/executing/coverage_utils/v8_and_istanbul.js +38 -0
  26. package/src/internal/executing/coverage_utils/v8_coverage_composition.js +23 -0
  27. package/src/internal/executing/coverage_utils/v8_coverage_from_directory.js +65 -0
  28. package/src/internal/executing/coverage_utils/v8_coverage_to_istanbul.js +90 -0
  29. package/src/internal/executing/createSummaryLog.js +15 -15
  30. package/src/internal/executing/executeConcurrently.js +92 -32
  31. package/src/internal/executing/executePlan.js +84 -81
  32. package/src/internal/executing/executionLogs.js +14 -18
  33. package/src/internal/executing/execution_colors.js +6 -12
  34. package/src/internal/executing/launchAndExecute.js +172 -169
  35. package/src/internal/node-launcher/createControllableNodeProcess.js +26 -23
  36. package/src/launchBrowser.js +72 -69
  37. package/src/launchNode.js +11 -99
  38. package/src/startExploring.js +2 -17
  39. package/src/abort/abortable.js +0 -172
  40. package/src/abort/callback_list.js +0 -64
  41. package/src/abort/callback_race.js +0 -34
  42. package/src/abort/cleaner.js +0 -22
  43. package/src/abort/main.js +0 -32
  44. package/src/abort/process_teardown_events.js +0 -59
  45. package/src/internal/createCallbackList.js +0 -21
  46. package/src/internal/executing/coverage/composeIstanbulCoverages.js +0 -108
  47. package/src/internal/executing/coverage/composeV8Coverages.js +0 -20
  48. package/src/internal/executing/coverage/istanbulCoverageFromCoverages.js +0 -43
  49. package/src/internal/executing/coverage/istanbulCoverageFromV8Coverage.js +0 -79
  50. package/src/internal/executing/coverage/v8CoverageFromAllV8Coverages.js +0 -40
  51. package/src/internal/executing/coverage/v8CoverageFromNodeV8Directory.js +0 -67
  52. package/src/internal/executing/logUtils.js +0 -30
  53. package/src/internal/executing/writeLog.js +0 -106
  54. package/src/internal/executing/writeLog.test-manual.js +0 -62
  55. package/src/internal/logs/log_style.js +0 -40
  56. package/src/signal/signal.js +0 -65
@@ -1,4 +1,3 @@
1
- /* eslint-disable import/max-dependencies */
2
1
  import { extname } from "node:path"
3
2
  import { normalizeImportMap } from "@jsenv/importmap"
4
3
  import { isSpecifierForNodeCoreModule } from "@jsenv/importmap/src/isSpecifierForNodeCoreModule.js"
@@ -15,15 +14,14 @@ import {
15
14
  urlToMeta,
16
15
  } from "@jsenv/filesystem"
17
16
  import { createWorkersForJavaScriptModules } from "@jsenv/workers"
17
+ import { UNICODE } from "@jsenv/log"
18
18
 
19
- import { Abortable } from "@jsenv/core/src/abort/main.js"
20
19
  import { createUrlConverter } from "@jsenv/core/src/internal/url_conversion.js"
21
20
  import { createUrlFetcher } from "@jsenv/core/src/internal/building/url_fetcher.js"
22
21
  import { createUrlLoader } from "@jsenv/core/src/internal/building/url_loader.js"
23
22
  import { stringifyUrlTrace } from "@jsenv/core/src/internal/building/url_trace.js"
24
23
  import { sortObjectByPathnames } from "@jsenv/core/src/internal/building/sortObjectByPathnames.js"
25
24
  import { jsenvHelpersDirectoryInfo } from "@jsenv/core/src/internal/jsenvInternalFiles.js"
26
- import { infoSign } from "@jsenv/core/src/internal/logs/log_style.js"
27
25
  import { setUrlSearchParamsDescriptor } from "@jsenv/core/src/internal/url_utils.js"
28
26
 
29
27
  import {
@@ -753,16 +751,13 @@ export const createJsenvRollupPlugin = async ({
753
751
 
754
752
  let url = asServerUrl(rollupUrl)
755
753
 
756
- const loadResult = await Abortable.asyncCallback(
757
- buildOperation,
758
- (signal) => {
759
- return urlLoader.loadUrl(rollupUrl, {
760
- signal,
761
- logger,
762
- ressourceBuilder,
763
- })
764
- },
765
- )
754
+ const loadResult = await buildOperation.withSignal((signal) => {
755
+ return urlLoader.loadUrl(rollupUrl, {
756
+ signal,
757
+ logger,
758
+ ressourceBuilder,
759
+ })
760
+ })
766
761
 
767
762
  url = loadResult.url
768
763
  const code = loadResult.code
@@ -1368,7 +1363,7 @@ const prepareEntryPoints = async (
1368
1363
  buildDirectoryUrl,
1369
1364
  )
1370
1365
 
1371
- logger.debug(`${infoSign} load entry point ${entryProjectRelativeUrl}`)
1366
+ logger.debug(`${UNICODE.INFO} load entry point ${entryProjectRelativeUrl}`)
1372
1367
 
1373
1368
  const entryServerUrl = resolveUrl(
1374
1369
  entryProjectRelativeUrl,
@@ -4,8 +4,7 @@
4
4
  // https://github.com/babel/babel/blob/eea156b2cb8deecfcf82d52aa1b71ba4995c7d68/packages/babel-code-frame/src/index.js#L1
5
5
 
6
6
  import { urlToFileSystemPath } from "@jsenv/filesystem"
7
-
8
- import { setANSIColor, ANSI_GREY, ANSI_RED } from "../logs/log_style.js"
7
+ import { ANSI } from "@jsenv/log"
9
8
 
10
9
  export const stringifyUrlTrace = (trace) => {
11
10
  let string = ""
@@ -89,8 +88,8 @@ export const showSourceLocation = ({
89
88
  let mark = (string) => string
90
89
  let aside = (string) => string
91
90
  if (color) {
92
- mark = (string) => setANSIColor(string, ANSI_RED)
93
- aside = (string) => setANSIColor(string, ANSI_GREY)
91
+ mark = (string) => ANSI.color(string, ANSI.RED)
92
+ aside = (string) => ANSI.color(string, ANSI.GREY)
94
93
  }
95
94
 
96
95
  const lines = source.split(/\r?\n/)
@@ -1,4 +1,4 @@
1
- import { serveFile, nextService } from "@jsenv/server"
1
+ import { nextService, fetchFileSystem } from "@jsenv/server"
2
2
  import {
3
3
  resolveUrl,
4
4
  resolveDirectoryUrl,
@@ -71,7 +71,10 @@ export const createCompiledFileService = ({
71
71
 
72
72
  return (request) => {
73
73
  const { origin, ressource } = request
74
- const requestUrl = `${origin}${ressource}`
74
+ // we use "ressourceToPathname" to remove eventual query param from the url
75
+ // Without this a pattern like "**/*.js" would not match "file.js?t=1"
76
+ // This would result in file not being compiled when they should
77
+ const requestUrl = `${origin}${ressourceToPathname(ressource)}`
75
78
 
76
79
  const requestCompileInfo = serverUrlToCompileInfo(requestUrl, {
77
80
  outDirectoryRelativeUrl,
@@ -88,10 +91,13 @@ export const createCompiledFileService = ({
88
91
  // this is just to allow some files to be written inside outDirectory and read directly
89
92
  // if asked by the client (such as env.json, groupMap.json, meta.json)
90
93
  if (!compileId) {
91
- return serveFile(request, {
92
- rootDirectoryUrl: projectDirectoryUrl,
93
- etagEnabled: true,
94
- })
94
+ return fetchFileSystem(
95
+ new URL(request.ressource.slice(1), projectDirectoryUrl),
96
+ {
97
+ headers: request.headers,
98
+ etagEnabled: true,
99
+ },
100
+ )
95
101
  }
96
102
 
97
103
  const allowedCompileIds = [
@@ -273,3 +279,12 @@ const babelPluginMapFromCompileId = (
273
279
 
274
280
  return babelPluginMapForGroup
275
281
  }
282
+
283
+ const ressourceToPathname = (ressource) => {
284
+ const searchSeparatorIndex = ressource.indexOf("?")
285
+ const pathname =
286
+ searchSeparatorIndex === -1
287
+ ? ressource
288
+ : ressource.slice(0, searchSeparatorIndex)
289
+ return pathname
290
+ }
@@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"
2
2
  import {
3
3
  jsenvAccessControlAllowedHeaders,
4
4
  startServer,
5
- serveFile,
5
+ fetchFileSystem,
6
6
  createSSERoom,
7
7
  composeServicesWithTiming,
8
8
  urlToContentType,
@@ -23,13 +23,15 @@ import {
23
23
  urlIsInsideOf,
24
24
  urlToBasename,
25
25
  } from "@jsenv/filesystem"
26
+ import {
27
+ createCallbackList,
28
+ createCallbackListNotifiedOnce,
29
+ } from "@jsenv/abort"
26
30
 
27
- import { Abortable } from "@jsenv/core/src/abort/main.js"
28
31
  import { isBrowserPartOfSupportedRuntimes } from "@jsenv/core/src/internal/generateGroupMap/runtime_support.js"
29
32
  import { loadBabelPluginMapFromFile } from "./load_babel_plugin_map_from_file.js"
30
33
  import { extractSyntaxBabelPluginMap } from "./babel_plugins.js"
31
34
  import { generateGroupMap } from "../generateGroupMap/generateGroupMap.js"
32
- import { createCallbackList } from "../createCallbackList.js"
33
35
  import {
34
36
  jsenvCompileProxyFileInfo,
35
37
  sourcemapMainFileInfo,
@@ -46,6 +48,7 @@ import { createTransformHtmlSourceFileService } from "./html_source_file_service
46
48
 
47
49
  export const startCompileServer = async ({
48
50
  signal = new AbortController().signal,
51
+ handleSIGINT,
49
52
  compileServerLogLevel,
50
53
 
51
54
  projectDirectoryUrl,
@@ -215,12 +218,12 @@ export const startCompileServer = async ({
215
218
  ...babelPluginMap,
216
219
  }
217
220
 
218
- const compileServerOperation = Abortable.fromSignal(signal)
221
+ const serverStopCallbackList = createCallbackListNotifiedOnce()
219
222
 
220
223
  let projectFileRequestedCallback = () => {}
221
224
  if (livereloadSSE) {
222
225
  const sseSetup = setupServerSentEventsForLivereload({
223
- compileServerOperation,
226
+ serverStopCallbackList,
224
227
  projectDirectoryUrl,
225
228
  jsenvDirectoryRelativeUrl,
226
229
  outDirectoryRelativeUrl,
@@ -230,7 +233,7 @@ export const startCompileServer = async ({
230
233
 
231
234
  projectFileRequestedCallback = sseSetup.projectFileRequestedCallback
232
235
  const serveSSEForLivereload = createSSEForLivereloadService({
233
- compileServerOperation,
236
+ serverStopCallbackList,
234
237
  outDirectoryRelativeUrl,
235
238
  trackMainAndDependencies: sseSetup.trackMainAndDependencies,
236
239
  })
@@ -296,7 +299,6 @@ export const startCompileServer = async ({
296
299
  projectDirectoryUrl,
297
300
  }),
298
301
  "service:compiled file": createCompiledFileService({
299
- compileServerOperation,
300
302
  logger,
301
303
 
302
304
  projectDirectoryUrl,
@@ -345,9 +347,9 @@ export const startCompileServer = async ({
345
347
  }
346
348
 
347
349
  const compileServer = await startServer({
348
- signal: compileServerOperation.signal,
350
+ signal,
349
351
  stopOnExit: false,
350
- stopOnSIGINT: false,
352
+ stopOnSIGINT: handleSIGINT,
351
353
  stopOnInternalError: false,
352
354
  sendServerInternalErrorDetails: true,
353
355
  keepProcessAlive,
@@ -380,9 +382,9 @@ export const startCompileServer = async ({
380
382
  ...customServices,
381
383
  ...jsenvServices,
382
384
  }),
383
- onStop: () => {
385
+ onStop: (reason) => {
384
386
  onStop()
385
- compileServerOperation.cleaner.clean()
387
+ serverStopCallbackList.notify(reason)
386
388
  },
387
389
  })
388
390
 
@@ -559,7 +561,7 @@ const compareValueJson = (left, right) => {
559
561
  *
560
562
  */
561
563
  const setupServerSentEventsForLivereload = ({
562
- compileServerOperation,
564
+ serverStopCallbackList,
563
565
  projectDirectoryUrl,
564
566
  jsenvDirectoryRelativeUrl,
565
567
  outDirectoryRelativeUrl,
@@ -582,7 +584,7 @@ const setupServerSentEventsForLivereload = ({
582
584
  return
583
585
  }
584
586
 
585
- projectFileRequested.notify(relativeUrl, request)
587
+ projectFileRequested.notify({ relativeUrl, request })
586
588
  }
587
589
  const watchDescription = {
588
590
  ...livereloadWatchConfig,
@@ -605,7 +607,7 @@ const setupServerSentEventsForLivereload = ({
605
607
  recursive: true,
606
608
  },
607
609
  )
608
- compileServerOperation.cleaner.addCallback(unregisterDirectoryLifecyle)
610
+ serverStopCallbackList.add(unregisterDirectoryLifecyle)
609
611
 
610
612
  const getDependencySet = (mainRelativeUrl) => {
611
613
  if (trackerMap.has(mainRelativeUrl)) {
@@ -618,7 +620,7 @@ const setupServerSentEventsForLivereload = ({
618
620
  }
619
621
 
620
622
  // each time a file is requested for the first time its dependencySet is computed
621
- projectFileRequested.register((mainRelativeUrl) => {
623
+ projectFileRequested.add(({ relativeUrl: mainRelativeUrl }) => {
622
624
  // for now no use case of livereloading on node.js
623
625
  // and for browsers only html file can be main files
624
626
  // this avoid collecting dependencies of non html files that will never be used
@@ -632,8 +634,8 @@ const setupServerSentEventsForLivereload = ({
632
634
  dependencySet.add(mainRelativeUrl)
633
635
  trackerMap.set(mainRelativeUrl, dependencySet)
634
636
 
635
- const unregisterDependencyRequested = projectFileRequested.register(
636
- (relativeUrl, request) => {
637
+ const removeDependencyRequestedCallback = projectFileRequested.add(
638
+ ({ relativeUrl, request }) => {
637
639
  if (dependencySet.has(relativeUrl)) {
638
640
  return
639
641
  }
@@ -656,10 +658,10 @@ const setupServerSentEventsForLivereload = ({
656
658
  dependencySet.add(relativeUrl)
657
659
  },
658
660
  )
659
- const unregisterMainRemoved = projectFileRemoved.register((relativeUrl) => {
661
+ const removeMainRemovedCallback = projectFileRemoved.add((relativeUrl) => {
660
662
  if (relativeUrl === mainRelativeUrl) {
661
- unregisterDependencyRequested()
662
- unregisterMainRemoved()
663
+ removeDependencyRequestedCallback()
664
+ removeMainRemovedCallback()
663
665
  trackerMap.delete(mainRelativeUrl)
664
666
  }
665
667
  })
@@ -671,19 +673,19 @@ const setupServerSentEventsForLivereload = ({
671
673
  ) => {
672
674
  livereloadLogger.debug(`track ${mainRelativeUrl} and its dependencies`)
673
675
 
674
- const unregisterModified = projectFileModified.register((relativeUrl) => {
676
+ const removeModifiedCallback = projectFileModified.add((relativeUrl) => {
675
677
  const dependencySet = getDependencySet(mainRelativeUrl)
676
678
  if (dependencySet.has(relativeUrl)) {
677
679
  modified(relativeUrl)
678
680
  }
679
681
  })
680
- const unregisterRemoved = projectFileRemoved.register((relativeUrl) => {
682
+ const removeRemovedCallback = projectFileRemoved.add((relativeUrl) => {
681
683
  const dependencySet = getDependencySet(mainRelativeUrl)
682
684
  if (dependencySet.has(relativeUrl)) {
683
685
  removed(relativeUrl)
684
686
  }
685
687
  })
686
- const unregisterAdded = projectFileAdded.register((relativeUrl) => {
688
+ const removeAddedCallback = projectFileAdded.add((relativeUrl) => {
687
689
  const dependencySet = getDependencySet(mainRelativeUrl)
688
690
  if (dependencySet.has(relativeUrl)) {
689
691
  added(relativeUrl)
@@ -694,9 +696,9 @@ const setupServerSentEventsForLivereload = ({
694
696
  livereloadLogger.debug(
695
697
  `stop tracking ${mainRelativeUrl} and its dependencies.`,
696
698
  )
697
- unregisterModified()
698
- unregisterRemoved()
699
- unregisterAdded()
699
+ removeModifiedCallback()
700
+ removeRemovedCallback()
701
+ removeAddedCallback()
700
702
  }
701
703
  }
702
704
 
@@ -768,7 +770,7 @@ const setupServerSentEventsForLivereload = ({
768
770
  }
769
771
 
770
772
  const createSSEForLivereloadService = ({
771
- compileServerOperation,
773
+ serverStopCallbackList,
772
774
  outDirectoryRelativeUrl,
773
775
  trackMainAndDependencies,
774
776
  }) => {
@@ -802,13 +804,11 @@ const createSSEForLivereloadService = ({
802
804
  },
803
805
  })
804
806
 
805
- const removeSSECleanupCallback = compileServerOperation.cleaner.addCallback(
806
- () => {
807
- removeSSECleanupCallback()
808
- sseRoom.close()
809
- stopTracking()
810
- },
811
- )
807
+ const removeSSECleanupCallback = serverStopCallbackList.add(() => {
808
+ removeSSECleanupCallback()
809
+ sseRoom.close()
810
+ stopTracking()
811
+ })
812
812
  cache.push({
813
813
  mainFileRelativeUrl,
814
814
  sseRoom,
@@ -857,10 +857,13 @@ const createCompilationAssetFileService = ({ projectDirectoryUrl }) => {
857
857
  const { origin, ressource } = request
858
858
  const requestUrl = `${origin}${ressource}`
859
859
  if (urlIsCompilationAsset(requestUrl)) {
860
- return serveFile(request, {
861
- rootDirectoryUrl: projectDirectoryUrl,
862
- etagEnabled: true,
863
- })
860
+ return fetchFileSystem(
861
+ new URL(request.ressource.slice(1), projectDirectoryUrl),
862
+ {
863
+ headers: request.headers,
864
+ etagEnabled: true,
865
+ },
866
+ )
864
867
  }
865
868
  return null
866
869
  }
@@ -916,10 +919,13 @@ const createSourceFileService = ({
916
919
  const relativeUrl = ressource.slice(1)
917
920
  projectFileRequestedCallback(relativeUrl, request)
918
921
 
919
- const responsePromise = serveFile(request, {
920
- rootDirectoryUrl: projectDirectoryUrl,
921
- etagEnabled: projectFileEtagEnabled,
922
- })
922
+ const responsePromise = fetchFileSystem(
923
+ new URL(request.ressource.slice(1), projectDirectoryUrl),
924
+ {
925
+ headers: request.headers,
926
+ etagEnabled: projectFileEtagEnabled,
927
+ },
928
+ )
923
929
 
924
930
  return responsePromise
925
931
  }
@@ -1051,10 +1057,13 @@ const createOutFilesService = async ({
1051
1057
  if (!isOutRootFile(requestUrl)) {
1052
1058
  return null
1053
1059
  }
1054
- return serveFile(request, {
1055
- rootDirectoryUrl: projectDirectoryUrl,
1056
- etagEnabled: true,
1057
- })
1060
+ return fetchFileSystem(
1061
+ new URL(request.ressource.slice(1), projectDirectoryUrl),
1062
+ {
1063
+ headers: request.headers,
1064
+ etagEnabled: true,
1065
+ },
1066
+ )
1058
1067
  }
1059
1068
  }
1060
1069
  // serve from memory
@@ -3,6 +3,7 @@ import {
3
3
  normalizeStructuredMetaMap,
4
4
  urlToMeta,
5
5
  } from "@jsenv/filesystem"
6
+
6
7
  import { require } from "../../require.js"
7
8
 
8
9
  // https://github.com/istanbuljs/babel-plugin-istanbul/blob/321740f7b25d803f881466ea819d870f7ed6a254/src/index.js