@jsenv/core 38.3.11 → 38.4.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.
Files changed (118) hide show
  1. package/README.md +17 -18
  2. package/dist/babel_helpers/AsyncGenerator/AsyncGenerator.js +3 -3
  3. package/dist/babel_helpers/AwaitValue/AwaitValue.js +2 -2
  4. package/dist/babel_helpers/{overloadYield/overloadYield.js → OverloadYield/OverloadYield.js} +1 -1
  5. package/dist/babel_helpers/applyDecoratedDescriptor/applyDecoratedDescriptor.js +23 -14
  6. package/dist/babel_helpers/applyDecs/applyDecs.js +32 -21
  7. package/dist/babel_helpers/applyDecs2203/applyDecs2203.js +549 -549
  8. package/dist/babel_helpers/applyDecs2203R/applyDecs2203R.js +27 -15
  9. package/dist/babel_helpers/applyDecs2301/applyDecs2301.js +29 -18
  10. package/dist/babel_helpers/applyDecs2305/applyDecs2305.js +362 -541
  11. package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +4 -4
  12. package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +2 -2
  13. package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +3 -3
  14. package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +5 -3
  15. package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +2 -2
  16. package/dist/babel_helpers/asyncIterator/asyncIterator.js +1 -1
  17. package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +17 -17
  18. package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +2 -2
  19. package/dist/babel_helpers/callSuper/callSuper.js +25 -0
  20. package/dist/babel_helpers/checkInRHS/checkInRHS.js +10 -8
  21. package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +9 -6
  22. package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +2 -2
  23. package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +3 -3
  24. package/dist/babel_helpers/classCallCheck/classCallCheck.js +1 -1
  25. package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -2
  26. package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +7 -2
  27. package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +9 -3
  28. package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +3 -1
  29. package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +4 -4
  30. package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +4 -4
  31. package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +2 -2
  32. package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +2 -2
  33. package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +5 -5
  34. package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +2 -2
  35. package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +1 -1
  36. package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +11 -7
  37. package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +7 -7
  38. package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +8 -4
  39. package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +1 -1
  40. package/dist/babel_helpers/construct/construct.js +18 -14
  41. package/dist/babel_helpers/createClass/createClass.js +1 -1
  42. package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +21 -20
  43. package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +10 -9
  44. package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +11 -11
  45. package/dist/babel_helpers/createSuper/createSuper.js +11 -11
  46. package/dist/babel_helpers/decorate/decorate.js +255 -170
  47. package/dist/babel_helpers/defaults/defaults.js +5 -5
  48. package/dist/babel_helpers/defineAccessor/defineAccessor.js +1 -1
  49. package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +11 -11
  50. package/dist/babel_helpers/defineProperty/defineProperty.js +4 -4
  51. package/dist/babel_helpers/dispose/dispose.js +39 -39
  52. package/dist/babel_helpers/extends/extends.js +4 -4
  53. package/dist/babel_helpers/get/get.js +2 -2
  54. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +1 -1
  55. package/dist/babel_helpers/identity/identity.js +1 -1
  56. package/dist/babel_helpers/importDeferProxy/importDeferProxy.js +27 -27
  57. package/dist/babel_helpers/inherits/inherits.js +4 -4
  58. package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +4 -4
  59. package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +5 -3
  60. package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +1 -1
  61. package/dist/babel_helpers/instanceof/instanceof.js +7 -3
  62. package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +1 -1
  63. package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +3 -1
  64. package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +1 -1
  65. package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +12 -14
  66. package/dist/babel_helpers/iterableToArray/iterableToArray.js +1 -1
  67. package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +1 -1
  68. package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +1 -1
  69. package/dist/babel_helpers/jsx/jsx.js +1 -1
  70. package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +4 -4
  71. package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +1 -1
  72. package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +2 -2
  73. package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +2 -2
  74. package/dist/babel_helpers/nullishReceiverError/nullishReceiverError.js +1 -1
  75. package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +1 -1
  76. package/dist/babel_helpers/objectSpread/objectSpread.js +8 -8
  77. package/dist/babel_helpers/objectSpread2/objectSpread2.js +5 -3
  78. package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +12 -12
  79. package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +10 -10
  80. package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +7 -5
  81. package/dist/babel_helpers/readOnlyError/readOnlyError.js +1 -1
  82. package/dist/babel_helpers/regeneratorRuntime/regeneratorRuntime.js +1 -1
  83. package/dist/babel_helpers/set/set.js +22 -19
  84. package/dist/babel_helpers/setFunctionName/setFunctionName.js +18 -0
  85. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +7 -6
  86. package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +4 -4
  87. package/dist/babel_helpers/slicedToArray/slicedToArray.js +5 -5
  88. package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +5 -5
  89. package/dist/babel_helpers/superPropBase/superPropBase.js +4 -4
  90. package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +2 -2
  91. package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +3 -3
  92. package/dist/babel_helpers/tdz/tdz.js +1 -1
  93. package/dist/babel_helpers/temporalRef/temporalRef.js +3 -3
  94. package/dist/babel_helpers/toArray/toArray.js +5 -5
  95. package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +5 -5
  96. package/dist/babel_helpers/toPrimitive/toPrimitive.js +11 -7
  97. package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +8 -4
  98. package/dist/babel_helpers/typeof/typeof.js +6 -5
  99. package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +7 -7
  100. package/dist/babel_helpers/using/using.js +20 -20
  101. package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +3 -3
  102. package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +12 -12
  103. package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +5 -3
  104. package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +1 -1
  105. package/dist/js/ribbon.js +1 -1
  106. package/dist/js/ws.js +234 -146
  107. package/dist/jsenv_core.js +1365 -1211
  108. package/package.json +26 -22
  109. package/src/build/build.js +22 -14
  110. package/src/dev/start_dev_server.js +8 -21
  111. package/src/kitchen/errors.js +29 -24
  112. package/src/kitchen/kitchen.js +1 -1
  113. package/src/kitchen/url_graph/references.js +8 -0
  114. package/src/kitchen/url_graph/url_graph_report.js +5 -3
  115. package/src/plugins/plugins.js +2 -2
  116. package/src/plugins/protocol_file/jsenv_plugin_protocol_file.js +17 -7
  117. package/src/plugins/reference_analysis/js/jsenv_plugin_js_reference_analysis.js +10 -12
  118. package/src/plugins/ribbon/client/ribbon.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "38.3.11",
3
+ "version": "38.4.1",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -53,32 +53,33 @@
53
53
  "monorepo:upgrade_versions": "node ./scripts/monorepo/upgrade_external_versions.mjs",
54
54
  "monorepo:sync_packages_versions": "node ./scripts/monorepo/sync_packages_versions.mjs",
55
55
  "monorepo:publish": "node ./scripts/monorepo/publish_packages.mjs",
56
+ "monorepo:node_modules_clear": "npm @jsenv/snapshot clear **/node_modules/",
56
57
  "performances": "node --expose-gc ./scripts/performance/generate_performance_report.mjs --log --once",
57
58
  "prettier": "prettier --write .",
58
- "playwright:install": "npx playwright install-deps && npx playwright install",
59
59
  "certificate:install": "node ./scripts/dev/install_certificate_authority.mjs",
60
60
  "prepublishOnly": "npm run build"
61
61
  },
62
62
  "dependencies": {
63
63
  "@financial-times/polyfill-useragent-normaliser": "1.10.2",
64
- "@jsenv/abort": "4.2.4",
65
- "@jsenv/ast": "6.0.1",
66
- "@jsenv/filesystem": "4.6.0",
64
+ "@jsenv/abort": "4.3.0",
65
+ "@jsenv/ast": "6.0.2",
66
+ "@jsenv/filesystem": "4.6.3",
67
67
  "@jsenv/importmap": "1.2.1",
68
+ "@jsenv/inspect": "2.0.0",
68
69
  "@jsenv/integrity": "0.0.1",
69
- "@jsenv/js-module-fallback": "1.3.9",
70
- "@jsenv/log": "3.4.3",
71
- "@jsenv/node-esm-resolution": "1.0.1",
72
- "@jsenv/plugin-bundling": "2.6.2",
70
+ "@jsenv/js-module-fallback": "1.3.10",
71
+ "@jsenv/log": "3.5.2",
72
+ "@jsenv/node-esm-resolution": "1.0.2",
73
+ "@jsenv/plugin-bundling": "2.6.4",
73
74
  "@jsenv/plugin-minification": "1.5.4",
74
- "@jsenv/plugin-supervisor": "1.4.0",
75
- "@jsenv/plugin-transpilation": "1.3.9",
76
- "@jsenv/runtime-compat": "1.2.1",
77
- "@jsenv/server": "15.1.8",
78
- "@jsenv/sourcemap": "1.2.4",
79
- "@jsenv/url-meta": "8.2.0",
80
- "@jsenv/urls": "2.2.1",
81
- "@jsenv/utils": "2.1.0"
75
+ "@jsenv/plugin-supervisor": "1.4.1",
76
+ "@jsenv/plugin-transpilation": "1.3.10",
77
+ "@jsenv/runtime-compat": "1.2.2",
78
+ "@jsenv/server": "15.2.1",
79
+ "@jsenv/sourcemap": "1.2.5",
80
+ "@jsenv/url-meta": "8.4.0",
81
+ "@jsenv/urls": "2.2.2",
82
+ "@jsenv/utils": "2.1.1"
82
83
  },
83
84
  "devDependencies": {
84
85
  "@babel/eslint-parser": "7.23.3",
@@ -94,12 +95,15 @@
94
95
  "@jsenv/snapshot": "./packages/independent/snapshot/",
95
96
  "@jsenv/test": "./packages/related/test/",
96
97
  "babel-plugin-transform-async-to-promises": "0.8.18",
97
- "eslint": "8.54.0",
98
+ "eslint": "8.56.0",
98
99
  "eslint-plugin-html": "7.1.0",
99
- "eslint-plugin-import": "2.29.0",
100
+ "eslint-plugin-import": "2.29.1",
100
101
  "eslint-plugin-react": "7.33.2",
101
- "open": "9.1.0",
102
- "playwright": "1.40.0",
103
- "prettier": "3.1.0"
102
+ "open": "10.0.3",
103
+ "playwright": "1.40.1",
104
+ "@playwright/browser-chromium": "1.40.1",
105
+ "@playwright/browser-firefox": "1.40.1",
106
+ "@playwright/browser-webkit": "1.40.1",
107
+ "prettier": "3.1.1"
104
108
  }
105
109
  }
@@ -105,7 +105,7 @@ export const build = async ({
105
105
  nodeEsmResolution,
106
106
  magicExtensions,
107
107
  magicDirectoryIndex,
108
- directoryReferenceAllowed,
108
+ directoryReferenceEffect,
109
109
  scenarioPlaceholders,
110
110
  injections,
111
111
  transpilation = {},
@@ -195,6 +195,17 @@ export const build = async ({
195
195
  }
196
196
  }
197
197
 
198
+ if (assetsDirectory && assetsDirectory[assetsDirectory.length - 1] !== "/") {
199
+ assetsDirectory = `${assetsDirectory}/`;
200
+ }
201
+ if (directoryToClean === undefined) {
202
+ if (assetsDirectory === undefined) {
203
+ directoryToClean = buildDirectoryUrl;
204
+ } else {
205
+ directoryToClean = new URL(assetsDirectory, buildDirectoryUrl).href;
206
+ }
207
+ }
208
+
198
209
  const operation = Abort.startOperation();
199
210
  operation.addAbortSignal(signal);
200
211
  if (handleSIGINT) {
@@ -208,17 +219,6 @@ export const build = async ({
208
219
  });
209
220
  }
210
221
 
211
- if (assetsDirectory && assetsDirectory[assetsDirectory.length - 1] !== "/") {
212
- assetsDirectory = `${assetsDirectory}/`;
213
- }
214
- if (directoryToClean === undefined) {
215
- if (assetsDirectory === undefined) {
216
- directoryToClean = buildDirectoryUrl;
217
- } else {
218
- directoryToClean = new URL(assetsDirectory, buildDirectoryUrl).href;
219
- }
220
- }
221
-
222
222
  const runBuild = async ({ signal, logLevel }) => {
223
223
  const logger = createLogger({ logLevel });
224
224
  const createBuildTask = (label) => {
@@ -291,7 +291,7 @@ build ${entryPointKeys.length} entry points`);
291
291
  nodeEsmResolution,
292
292
  magicExtensions,
293
293
  magicDirectoryIndex,
294
- directoryReferenceAllowed,
294
+ directoryReferenceEffect,
295
295
  injections,
296
296
  transpilation: {
297
297
  babelHelpersAsImport: !explicitJsModuleConversion,
@@ -661,7 +661,15 @@ build ${entryPointKeys.length} entry points`);
661
661
  };
662
662
 
663
663
  if (!watch) {
664
- return runBuild({ signal: operation.signal, logLevel });
664
+ try {
665
+ const result = await runBuild({
666
+ signal: operation.signal,
667
+ logLevel,
668
+ });
669
+ return result;
670
+ } finally {
671
+ await operation.end();
672
+ }
665
673
  }
666
674
 
667
675
  let resolveFirstBuild;
@@ -4,7 +4,6 @@ import {
4
4
  assertAndNormalizeDirectoryUrl,
5
5
  bufferToEtag,
6
6
  } from "@jsenv/filesystem";
7
- import { Abort, raceProcessTeardownEvents } from "@jsenv/abort";
8
7
  import { createLogger, createTaskLog } from "@jsenv/log";
9
8
  import {
10
9
  jsenvAccessControlAllowedHeaders,
@@ -123,25 +122,13 @@ export const startDevServer = async ({
123
122
  }
124
123
 
125
124
  const logger = createLogger({ logLevel });
126
- const operation = Abort.startOperation();
127
- operation.addAbortSignal(signal);
128
- if (handleSIGINT) {
129
- operation.addAbortSource((abort) => {
130
- return raceProcessTeardownEvents(
131
- {
132
- SIGINT: true,
133
- },
134
- abort,
135
- );
136
- });
137
- }
138
125
  const startDevServerTask = createTaskLog("start dev server", {
139
126
  disabled: !logger.levels.info,
140
127
  });
141
128
 
142
- const serverStopCallbacks = [];
129
+ const serverStopCallbackSet = new Set();
143
130
  const serverEventsDispatcher = createServerEventsDispatcher();
144
- serverStopCallbacks.push(() => {
131
+ serverStopCallbackSet.add(() => {
145
132
  serverEventsDispatcher.destroy();
146
133
  });
147
134
  const kitchenCache = new Map();
@@ -216,7 +203,7 @@ export const startDevServer = async ({
216
203
  cooldownBetweenFileEvents: clientAutoreload.cooldownBetweenFileEvents,
217
204
  },
218
205
  );
219
- serverStopCallbacks.push(stopWatchingSourceFiles);
206
+ serverStopCallbackSet.add(stopWatchingSourceFiles);
220
207
 
221
208
  const getOrCreateKitchen = (request) => {
222
209
  const { runtimeName, runtimeVersion } = parseUserAgentHeader(
@@ -341,7 +328,7 @@ export const startDevServer = async ({
341
328
  },
342
329
  );
343
330
 
344
- serverStopCallbacks.push(() => {
331
+ serverStopCallbackSet.add(() => {
345
332
  kitchen.pluginController.callHooks("destroy", kitchen.context);
346
333
  });
347
334
  server_events: {
@@ -505,7 +492,7 @@ export const startDevServer = async ({
505
492
  if (urlInfo.content !== undefined) {
506
493
  kitchen.context.logger.error(`Error while handling ${request.url}:
507
494
  ${originalError.reasonCode || originalError.code}
508
- ${e.traceMessage}`);
495
+ ${e.trace?.message}`);
509
496
  return {
510
497
  url: reference.url,
511
498
  status: 200,
@@ -638,10 +625,10 @@ ${e.traceMessage}`);
638
625
  });
639
626
  server.stoppedPromise.then((reason) => {
640
627
  onStop();
641
- serverStopCallbacks.forEach((serverStopCallback) => {
628
+ for (const serverStopCallback of serverStopCallbackSet) {
642
629
  serverStopCallback(reason);
643
- });
644
- serverStopCallbacks.length = 0;
630
+ }
631
+ serverStopCallbackSet.clear();
645
632
  });
646
633
  startDevServerTask.done();
647
634
  if (hostname) {
@@ -1,6 +1,7 @@
1
1
  import { pathToFileURL } from "node:url";
2
2
  import { createDetailedMessage } from "@jsenv/log";
3
3
  import { stringifyUrlSite } from "@jsenv/urls";
4
+ import { inspectFileContent } from "@jsenv/inspect";
4
5
 
5
6
  export const createResolveUrlError = ({
6
7
  pluginController,
@@ -68,15 +69,9 @@ export const createFetchUrlContentError = ({
68
69
  fetchError.reason = reason;
69
70
  fetchError.url = urlInfo.url;
70
71
  if (code === "PARSE_ERROR") {
71
- fetchError.traceUrl = error.traceUrl;
72
- fetchError.traceLine = error.traceLine;
73
- fetchError.traceColumn = error.traceColumn;
74
- fetchError.traceMessage = error.traceMessage;
72
+ fetchError.trace = error.trace;
75
73
  } else {
76
- fetchError.traceUrl = urlInfo.firstReference.trace.url;
77
- fetchError.traceLine = urlInfo.firstReference.trace.line;
78
- fetchError.traceColumn = urlInfo.firstReference.trace.column;
79
- fetchError.traceMessage = urlInfo.firstReference.trace.message;
74
+ fetchError.trace = urlInfo.firstReference.trace;
80
75
  }
81
76
  fetchError.asResponse = error.asResponse;
82
77
  return fetchError;
@@ -111,7 +106,7 @@ export const createFetchUrlContentError = ({
111
106
  "code": "PARSE_ERROR",
112
107
  "reason": error.reasonCode,
113
108
  ...(error.cause ? { "parse error message": error.cause.message } : {}),
114
- "parse error trace": error.traceMessage,
109
+ "parse error trace": error.trace?.message,
115
110
  });
116
111
  }
117
112
  return createFailedToFetchUrlContentError({
@@ -150,33 +145,43 @@ export const createTransformUrlContentError = ({
150
145
  transformError.reason = reason;
151
146
  transformError.stack = error.stack;
152
147
  transformError.url = urlInfo.url;
153
- transformError.traceUrl = urlInfo.firstReference.trace.url;
154
- transformError.traceLine = urlInfo.firstReference.trace.line;
155
- transformError.traceColumn = urlInfo.firstReference.trace.column;
156
- transformError.traceMessage = urlInfo.firstReference.trace.message;
148
+ transformError.trace = urlInfo.firstReference.trace;
157
149
  if (code === "PARSE_ERROR") {
158
150
  transformError.reason = `parse error on ${urlInfo.type}`;
159
151
  transformError.cause = error;
160
152
  if (urlInfo.isInline) {
161
- transformError.traceLine =
153
+ transformError.trace.line =
162
154
  urlInfo.firstReference.trace.line + error.line - 1;
163
- transformError.traceColumn =
155
+ transformError.trace.column =
164
156
  urlInfo.firstReference.trace.column + error.column;
165
- transformError.traceMessage = stringifyUrlSite({
157
+ transformError.trace.codeFrame = inspectFileContent({
158
+ line: transformError.trace.line,
159
+ column: transformError.trace.column,
160
+ content: urlInfo.inlineUrlSite.content,
161
+ });
162
+ transformError.trace.message = stringifyUrlSite({
166
163
  url: urlInfo.inlineUrlSite.url,
167
- line: transformError.traceLine,
168
- column: transformError.traceColumn,
164
+ line: transformError.trace.line,
165
+ column: transformError.trace.column,
169
166
  content: urlInfo.inlineUrlSite.content,
170
167
  });
171
168
  } else {
172
- transformError.traceLine = error.line;
173
- transformError.traceColumn = error.column;
174
- transformError.traceMessage = stringifyUrlSite({
169
+ transformError.trace = {
175
170
  url: urlInfo.url,
176
- line: error.line - 1,
171
+ line: error.line,
177
172
  column: error.column,
178
- content: urlInfo.content,
179
- });
173
+ codeFrame: inspectFileContent({
174
+ line: error.line - 1,
175
+ column: error.column,
176
+ content: urlInfo.content,
177
+ }),
178
+ message: stringifyUrlSite({
179
+ url: urlInfo.url,
180
+ line: error.line - 1,
181
+ column: error.column,
182
+ content: urlInfo.content,
183
+ }),
184
+ };
180
185
  }
181
186
  }
182
187
  transformError.asResponse = error.asResponse;
@@ -487,7 +487,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
487
487
  ) {
488
488
  const errorInfo =
489
489
  e.code === "PARSE_ERROR" && e.cause
490
- ? `${e.cause.reasonCode}\n${e.traceMessage}`
490
+ ? `${e.cause.reasonCode}\n${e.trace?.message}`
491
491
  : e.stack;
492
492
  // When something like <style> or <script> contains syntax error
493
493
  // the HTML in itself it still valid
@@ -5,6 +5,7 @@ import {
5
5
  urlToExtension,
6
6
  } from "@jsenv/urls";
7
7
  import { generateUrlForInlineContent } from "@jsenv/ast";
8
+ import { inspectFileContent } from "@jsenv/inspect";
8
9
 
9
10
  import { isWebWorkerEntryPointReference } from "../web_workers.js";
10
11
  import { prependContent } from "../prepend_content.js";
@@ -619,6 +620,13 @@ const applyDependencyRemovalEffects = (reference) => {
619
620
 
620
621
  const traceFromUrlSite = (urlSite) => {
621
622
  return {
623
+ codeFrame: urlSite.content
624
+ ? inspectFileContent({
625
+ content: urlSite.content,
626
+ line: urlSite.line,
627
+ column: urlSite.column,
628
+ })
629
+ : "",
622
630
  message: stringifyUrlSite(urlSite),
623
631
  url: urlSite.url,
624
632
  line: urlSite.line,
@@ -1,4 +1,6 @@
1
- import { ANSI, byteAsFileSize, distributePercentages } from "@jsenv/log";
1
+ import { inspectFileSize, distributePercentages } from "@jsenv/inspect";
2
+ import { ANSI } from "@jsenv/log";
3
+
2
4
  import { GRAPH_VISITOR } from "./url_graph_visitor.js";
3
5
 
4
6
  export const createUrlGraphSummary = (
@@ -166,7 +168,7 @@ const determineCategory = (urlInfo) => {
166
168
  const createRepartitionMessage = ({ html, css, js, json, other, total }) => {
167
169
  const addPart = (name, { count, size, percentage }) => {
168
170
  parts.push(
169
- `${ANSI.color(`${name}:`, ANSI.GREY)} ${count} (${byteAsFileSize(
171
+ `${ANSI.color(`${name}:`, ANSI.GREY)} ${count} (${inspectFileSize(
170
172
  size,
171
173
  )} / ${percentage} %)`,
172
174
  );
@@ -177,7 +179,7 @@ const createRepartitionMessage = ({ html, css, js, json, other, total }) => {
177
179
  // parts.push(
178
180
  // `${ANSI.color(`sourcemaps:`, ANSI.GREY)} ${
179
181
  // sourcemaps.count
180
- // } (${byteAsFileSize(sourcemaps.size)})`,
182
+ // } (${inspectFileSize(sourcemaps.size)})`,
181
183
  // )
182
184
  // }
183
185
  if (html.count) {
@@ -29,7 +29,7 @@ export const getCorePlugins = ({
29
29
  nodeEsmResolution = {},
30
30
  magicExtensions,
31
31
  magicDirectoryIndex,
32
- directoryReferenceAllowed,
32
+ directoryReferenceEffect,
33
33
  supervisor,
34
34
  injections,
35
35
  transpilation = true,
@@ -64,7 +64,7 @@ export const getCorePlugins = ({
64
64
  - All the rest uses web standard url resolution
65
65
  */
66
66
  jsenvPluginProtocolFile({
67
- directoryReferenceAllowed,
67
+ directoryReferenceEffect,
68
68
  magicExtensions,
69
69
  magicDirectoryIndex,
70
70
  }),
@@ -17,7 +17,7 @@ export const jsenvPluginProtocolFile = ({
17
17
  magicExtensions = ["inherit", ".js"],
18
18
  magicDirectoryIndex = true,
19
19
  preserveSymlinks = false,
20
- directoryReferenceAllowed = false,
20
+ directoryReferenceEffect = "error",
21
21
  }) => {
22
22
  return [
23
23
  {
@@ -98,17 +98,27 @@ export const jsenvPluginProtocolFile = ({
98
98
  }
99
99
  reference.leadsToADirectory = stat && stat.isDirectory();
100
100
  if (reference.leadsToADirectory) {
101
- const directoryAllowed =
101
+ let actionForDirectory;
102
+ if (
102
103
  reference.type === "http_request" ||
103
- reference.type === "filesystem" ||
104
- (typeof directoryReferenceAllowed === "function" &&
105
- directoryReferenceAllowed(reference)) ||
106
- directoryReferenceAllowed;
107
- if (!directoryAllowed) {
104
+ reference.type === "filesystem"
105
+ ) {
106
+ actionForDirectory = "copy";
107
+ } else if (typeof directoryReferenceEffect === "string") {
108
+ actionForDirectory = directoryReferenceEffect;
109
+ } else if (typeof directoryReferenceEffect === "function") {
110
+ actionForDirectory = directoryReferenceEffect(reference);
111
+ } else {
112
+ actionForDirectory = "error";
113
+ }
114
+ if (actionForDirectory === "error") {
108
115
  const error = new Error("Reference leads to a directory");
109
116
  error.code = "DIRECTORY_REFERENCE_NOT_ALLOWED";
110
117
  throw error;
111
118
  }
119
+ if (actionForDirectory === "preserve") {
120
+ return `ignore:${url}${search}${hash}`;
121
+ }
112
122
  }
113
123
  const urlRaw = preserveSymlinks ? url : resolveSymlink(url);
114
124
  const resolvedUrl = `${urlRaw}${search}${hash}`;
@@ -11,18 +11,20 @@ export const jsenvPluginJsReferenceAnalysis = ({ inlineContent }) => {
11
11
  name: "jsenv:js_reference_analysis",
12
12
  appliesDuring: "*",
13
13
  transformUrlContent: {
14
- js_classic: (urlInfo) =>
15
- parseAndTransformJsReferences(urlInfo, {
14
+ js_classic: (urlInfo) => {
15
+ return parseAndTransformJsReferences(urlInfo, {
16
16
  inlineContent,
17
17
  canUseTemplateLiterals:
18
18
  urlInfo.context.isSupportedOnCurrentClients("template_literals"),
19
- }),
20
- js_module: (urlInfo) =>
21
- parseAndTransformJsReferences(urlInfo, {
19
+ });
20
+ },
21
+ js_module: (urlInfo) => {
22
+ return parseAndTransformJsReferences(urlInfo, {
22
23
  inlineContent,
23
24
  canUseTemplateLiterals:
24
25
  urlInfo.context.isSupportedOnCurrentClients("template_literals"),
25
- }),
26
+ });
27
+ },
26
28
  },
27
29
  },
28
30
  ];
@@ -151,13 +153,9 @@ const parseAndTransformJsReferences = async (
151
153
  if (parallelActions.length > 0) {
152
154
  await Promise.all(parallelActions.map((action) => action()));
153
155
  }
154
- if (sequentialActions.length > 0) {
155
- await sequentialActions.reduce(async (previous, action) => {
156
- await previous;
157
- await action();
158
- }, Promise.resolve());
156
+ for (const sequentialAction of sequentialActions) {
157
+ await sequentialAction();
159
158
  }
160
-
161
159
  const { content, sourcemap } = magicSource.toContentAndSourcemap();
162
160
  return { content, sourcemap };
163
161
  };
@@ -1,7 +1,7 @@
1
1
  export const injectRibbon = ({ text }) => {
2
2
  const css = /* css */ `
3
3
  #jsenv_ribbon_container {
4
- position: absolute;
4
+ position: fixed;
5
5
  z-index: 1001;
6
6
  top: 0;
7
7
  right: 0;