@jsenv/core 27.0.0-alpha.75 → 27.0.0-alpha.78

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/dist/main.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { parentPort } from "node:worker_threads";
2
2
  import { registerFileLifecycle, readFileSync as readFileSync$1, bufferToEtag, writeFileSync, ensureWindowsDriveLetter, collectFiles, assertAndNormalizeDirectoryUrl, registerDirectoryLifecycle, writeFile, ensureEmptyDirectory, writeDirectory } from "@jsenv/filesystem";
3
- import { createDetailedMessage, createLogger, loggerToLevels } from "@jsenv/logger";
4
- import { createTaskLog, ANSI, msAsDuration, msAsEllapsedTime, byteAsMemoryUsage, UNICODE, createLog, startSpinner, distributePercentages, byteAsFileSize } from "@jsenv/log";
3
+ import { createDetailedMessage, createLogger, createTaskLog, loggerToLevels, ANSI, msAsDuration, msAsEllapsedTime, byteAsMemoryUsage, UNICODE, createLog, startSpinner, distributePercentages, byteAsFileSize } from "@jsenv/log";
5
4
  import { urlToRelativeUrl, generateInlineContentUrl, ensurePathnameTrailingSlash, urlIsInsideOf, urlToFilename, urlToExtension, DATA_URL, injectQueryParams, injectQueryParamsIntoSpecifier, fileSystemPathToUrl, urlToFileSystemPath, isFileSystemPath, normalizeUrl, stringifyUrlSite, setUrlFilename, moveUrl, getCallerPosition, resolveUrl, resolveDirectoryUrl, asUrlWithoutSearch, asUrlUntilPathname, urlToBasename } from "@jsenv/urls";
6
5
  import { initReloadableProcess } from "@jsenv/utils/process_reload/process_reload.js";
7
6
  import { URL_META } from "@jsenv/url-meta";
@@ -969,7 +968,9 @@ const jsenvPluginNodeEsmResolver = ({
969
968
  fetchUrlContent: urlInfo => {
970
969
  if (urlInfo.url.startsWith("file:///@ignore/")) {
971
970
  return {
972
- content: "export default {}"
971
+ content: "export default {}",
972
+ contentType: "text/javascript",
973
+ type: "js_module"
973
974
  };
974
975
  }
975
976
 
@@ -1232,17 +1233,9 @@ const jsenvPluginFileUrls = ({
1232
1233
 
1233
1234
  const fileBuffer = readFileSync(urlObject);
1234
1235
  const contentType = CONTENT_TYPE.fromUrlExtension(urlInfo.url);
1235
-
1236
- if (CONTENT_TYPE.isTextual(contentType)) {
1237
- return {
1238
- contentType,
1239
- content: String(fileBuffer)
1240
- };
1241
- }
1242
-
1243
1236
  return {
1244
- contentType,
1245
- content: fileBuffer
1237
+ content: CONTENT_TYPE.isTextual(contentType) ? String(fileBuffer) : fileBuffer,
1238
+ contentType
1246
1239
  };
1247
1240
  }
1248
1241
  }];
@@ -1791,12 +1784,12 @@ const jsenvPluginDataUrls = () => {
1791
1784
  } = DATA_URL.parse(urlInfo.url);
1792
1785
  urlInfo.data.base64Flag = base64Flag;
1793
1786
  return {
1794
- contentType,
1795
1787
  content: contentFromUrlData({
1796
1788
  contentType,
1797
1789
  base64Flag,
1798
1790
  urlData
1799
- })
1791
+ }),
1792
+ contentType
1800
1793
  };
1801
1794
  },
1802
1795
  formatUrl: (reference, context) => {
@@ -1819,7 +1812,7 @@ const jsenvPluginDataUrls = () => {
1819
1812
  }
1820
1813
 
1821
1814
  const specifier = DATA_URL.stringify({
1822
- contentType: urlInfo.contentType,
1815
+ contentType: urlInfo.headers["content-type"],
1823
1816
  base64Flag: urlInfo.data.base64Flag,
1824
1817
  data: urlInfo.data.base64Flag ? dataToBase64(urlInfo.content) : String(urlInfo.content)
1825
1818
  });
@@ -1918,10 +1911,10 @@ const jsenvPluginInlineUrls = () => {
1918
1911
  }
1919
1912
 
1920
1913
  return {
1921
- contentType: urlInfo.contentType,
1922
1914
  // we want to fetch the original content otherwise we might re-cook
1923
1915
  // content already cooked
1924
- content: urlInfo.originalContent
1916
+ content: urlInfo.originalContent,
1917
+ contentType: urlInfo.contentType
1925
1918
  };
1926
1919
  }
1927
1920
  };
@@ -2571,14 +2564,14 @@ const jsenvPluginAsModules = () => {
2571
2564
 
2572
2565
  const jsonText = JSON.stringify(originalUrlInfo.content.trim());
2573
2566
  return {
2574
- originalUrl: originalUrlInfo.originalUrl,
2575
- originalContent: originalUrlInfo.originalContent,
2576
- type: "js_module",
2577
- contentType: "text/javascript",
2578
2567
  // here we could `export default ${jsonText}`:
2579
2568
  // but js engine are optimized to recognize JSON.parse
2580
2569
  // and use a faster parsing strategy
2581
- content: `export default JSON.parse(${jsonText})`
2570
+ content: `export default JSON.parse(${jsonText})`,
2571
+ contentType: "text/javascript",
2572
+ type: "js_module",
2573
+ originalUrl: originalUrlInfo.originalUrl,
2574
+ originalContent: originalUrlInfo.originalContent
2582
2575
  };
2583
2576
  }
2584
2577
  };
@@ -2604,16 +2597,16 @@ const jsenvPluginAsModules = () => {
2604
2597
  canUseTemplateString: true
2605
2598
  });
2606
2599
  return {
2607
- originalUrl: originalUrlInfo.originalUrl,
2608
- originalContent: originalUrlInfo.originalContent,
2609
- type: "js_module",
2610
- contentType: "text/javascript",
2611
2600
  content: `import { InlineContent } from ${JSON.stringify(inlineContentClientFileUrl)}
2612
2601
 
2613
2602
  const inlineContent = new InlineContent(${cssText}, { type: "text/css" })
2614
2603
  const stylesheet = new CSSStyleSheet()
2615
2604
  stylesheet.replaceSync(inlineContent.text)
2616
- export default stylesheet`
2605
+ export default stylesheet`,
2606
+ contentType: "text/javascript",
2607
+ type: "js_module",
2608
+ originalUrl: originalUrlInfo.originalUrl,
2609
+ originalContent: originalUrlInfo.originalContent
2617
2610
  };
2618
2611
  }
2619
2612
  };
@@ -2639,14 +2632,14 @@ const jsenvPluginAsModules = () => {
2639
2632
  canUseTemplateString: true
2640
2633
  });
2641
2634
  return {
2642
- originalUrl: originalUrlInfo.originalUrl,
2643
- originalContent: originalUrlInfo.originalContent,
2644
- type: "js_module",
2645
- contentType: "text/javascript",
2646
2635
  content: `import { InlineContent } from ${JSON.stringify(inlineContentClientFileUrl)}
2647
2636
 
2648
2637
  const inlineContent = new InlineContent(${textPlain}, { type: "text/plain" })
2649
- export default inlineContent.text`
2638
+ export default inlineContent.text`,
2639
+ contentType: "text/javascript",
2640
+ type: "js_module",
2641
+ originalUrl: originalUrlInfo.originalUrl,
2642
+ originalContent: originalUrlInfo.originalContent
2650
2643
  };
2651
2644
  }
2652
2645
  };
@@ -3130,11 +3123,11 @@ const jsenvPluginAsJsClassicConversion = ({
3130
3123
  });
3131
3124
  urlInfo.data.jsClassicFormat = jsClassicFormat;
3132
3125
  return {
3126
+ content,
3127
+ contentType: "text/javascript",
3128
+ type: "js_classic",
3133
3129
  originalUrl: originalUrlInfo.originalUrl,
3134
3130
  originalContent: originalUrlInfo.originalContent,
3135
- type: "js_classic",
3136
- contentType: "text/javascript",
3137
- content,
3138
3131
  sourcemap
3139
3132
  };
3140
3133
  }
@@ -6295,7 +6288,7 @@ const createUrlInfo = url => {
6295
6288
  sourcemap: null,
6296
6289
  sourcemapReference: null,
6297
6290
  timing: {},
6298
- responseHeaders: {}
6291
+ headers: {}
6299
6292
  };
6300
6293
  };
6301
6294
 
@@ -6593,14 +6586,15 @@ const returnValueAssertions = [{
6593
6586
  if (typeof valueReturned === "object") {
6594
6587
  const {
6595
6588
  shouldHandle,
6596
- content
6589
+ content,
6590
+ body
6597
6591
  } = valueReturned;
6598
6592
 
6599
6593
  if (shouldHandle === false) {
6600
6594
  return undefined;
6601
6595
  }
6602
6596
 
6603
- if (typeof content !== "string" && !Buffer.isBuffer(content)) {
6597
+ if (typeof content !== "string" && !Buffer.isBuffer(content) && !body) {
6604
6598
  throw new Error(`Unexpected "content" returned by plugin: it must be a string or a buffer; got ${content}`);
6605
6599
  }
6606
6600
 
@@ -7224,17 +7218,35 @@ const createKitchen = ({
7224
7218
  return;
7225
7219
  }
7226
7220
 
7227
- const {
7221
+ let {
7222
+ content,
7223
+ contentType,
7228
7224
  data,
7229
7225
  type,
7230
7226
  subtype,
7231
- contentType = "application/octet-stream",
7232
7227
  originalUrl,
7233
7228
  originalContent,
7234
- content,
7235
7229
  sourcemap,
7236
- filename
7230
+ filename,
7231
+ status = 200,
7232
+ headers = {},
7233
+ body
7237
7234
  } = fetchUrlContentReturnValue;
7235
+
7236
+ if (status !== 200) {
7237
+ throw new Error(`unexpected status, ${status}`);
7238
+ }
7239
+
7240
+ if (content === undefined) {
7241
+ content = body;
7242
+ }
7243
+
7244
+ if (contentType === undefined) {
7245
+ contentType = headers["content-type"] || "application/octet-stream";
7246
+ }
7247
+
7248
+ urlInfo.contentType = contentType;
7249
+ urlInfo.headers = headers;
7238
7250
  urlInfo.type = type || reference.expectedType || inferUrlInfoType({
7239
7251
  url: urlInfo.url,
7240
7252
  contentType
@@ -7243,8 +7255,7 @@ const createKitchen = ({
7243
7255
  url: urlInfo.url,
7244
7256
  type: urlInfo.type,
7245
7257
  subtype: urlInfo.subtype
7246
- });
7247
- urlInfo.contentType = contentType; // during build urls info are reused and load returns originalUrl/originalContent
7258
+ }); // during build urls info are reused and load returns originalUrl/originalContent
7248
7259
 
7249
7260
  urlInfo.originalUrl = originalUrl || urlInfo.originalUrl;
7250
7261
  urlInfo.originalContent = originalContent === undefined ? content : originalContent;
@@ -7299,9 +7310,7 @@ const createKitchen = ({
7299
7310
  } = dishContext;
7300
7311
 
7301
7312
  context.cook = (urlInfo, nestedDishContext) => {
7302
- return cookDuringCook(urlInfo, {
7303
- outDirectoryUrl: dishContext.outDirectoryUrl,
7304
- clientRuntimeCompat: dishContext.clientRuntimeCompat,
7313
+ return cookDuringCook(urlInfo, { ...dishContext,
7305
7314
  ...nestedDishContext
7306
7315
  });
7307
7316
  };
@@ -7969,7 +7978,7 @@ const createFileService = ({
7969
7978
  status: 304,
7970
7979
  headers: {
7971
7980
  "cache-control": `private,max-age=0,must-revalidate`,
7972
- ...urlInfo.responseHeaders
7981
+ ...urlInfo.headers
7973
7982
  }
7974
7983
  };
7975
7984
  }
@@ -7984,7 +7993,6 @@ const createFileService = ({
7984
7993
  urlInfo.type = null;
7985
7994
  urlInfo.subtype = null;
7986
7995
  urlInfo.timing = {};
7987
- urlInfo.responseHeaders = {};
7988
7996
  }
7989
7997
 
7990
7998
  const {
@@ -8000,10 +8008,7 @@ const createFileService = ({
8000
8008
  outDirectoryUrl: scenario === "dev" ? `${rootDirectoryUrl}.jsenv/${runtimeName}@${runtimeVersion}/` : `${rootDirectoryUrl}.jsenv/${scenario}/${runtimeName}@${runtimeVersion}/`
8001
8009
  });
8002
8010
  let {
8003
- response,
8004
- contentType,
8005
- content,
8006
- contentEtag
8011
+ response
8007
8012
  } = urlInfo;
8008
8013
 
8009
8014
  if (response) {
@@ -8014,13 +8019,13 @@ const createFileService = ({
8014
8019
  url: reference.url,
8015
8020
  status: 200,
8016
8021
  headers: {
8017
- "content-type": contentType,
8018
- "content-length": Buffer.byteLength(content),
8022
+ "content-length": Buffer.byteLength(urlInfo.content),
8019
8023
  "cache-control": `private,max-age=0,must-revalidate`,
8020
- "eTag": contentEtag,
8021
- ...urlInfo.responseHeaders
8024
+ "eTag": urlInfo.contentEtag,
8025
+ ...urlInfo.headers,
8026
+ "content-type": urlInfo.contentType
8022
8027
  },
8023
- body: content,
8028
+ body: urlInfo.content,
8024
8029
  timing: urlInfo.timing
8025
8030
  };
8026
8031
  kitchen.pluginController.callHooks("augmentResponse", {
@@ -12902,10 +12907,10 @@ const applyUrlVersioning = async ({
12902
12907
  const rawUrlInfo = rawGraph.getUrlInfo(rawUrls[versionedUrlInfo.url]);
12903
12908
  const finalUrlInfo = finalGraph.getUrlInfo(versionedUrlInfo.url);
12904
12909
  return {
12905
- originalContent: rawUrlInfo ? rawUrlInfo.originalContent : undefined,
12906
- sourcemap: finalUrlInfo ? finalUrlInfo.sourcemap : undefined,
12910
+ content: versionedUrlInfo.content,
12907
12911
  contentType: versionedUrlInfo.contentType,
12908
- content: versionedUrlInfo.content
12912
+ originalContent: rawUrlInfo ? rawUrlInfo.originalContent : undefined,
12913
+ sourcemap: finalUrlInfo ? finalUrlInfo.sourcemap : undefined
12909
12914
  };
12910
12915
  }
12911
12916
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "27.0.0-alpha.75",
3
+ "version": "27.0.0-alpha.78",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -66,19 +66,18 @@
66
66
  "@babel/plugin-transform-modules-umd": "7.16.7",
67
67
  "@c88/v8-coverage": "0.1.1",
68
68
  "@financial-times/polyfill-useragent-normaliser": "2.0.1",
69
- "@jsenv/abort": "4.1.2",
69
+ "@jsenv/abort": "4.2.2",
70
70
  "@jsenv/babel-plugins": "1.0.3",
71
- "@jsenv/filesystem": "4.0.5",
71
+ "@jsenv/filesystem": "4.0.8",
72
72
  "@jsenv/importmap": "1.2.0",
73
73
  "@jsenv/integrity": "0.0.1",
74
- "@jsenv/log": "1.6.3",
75
- "@jsenv/logger": "4.1.1",
74
+ "@jsenv/log": "2.0.0",
76
75
  "@jsenv/node-esm-resolution": "0.0.10",
77
76
  "@jsenv/server": "12.6.3",
78
77
  "@jsenv/uneval": "1.6.0",
79
- "@jsenv/utils": "1.8.8",
78
+ "@jsenv/utils": "1.8.11",
80
79
  "@jsenv/url-meta": "7.0.0",
81
- "@jsenv/urls": "1.2.2",
80
+ "@jsenv/urls": "1.2.4",
82
81
  "construct-style-sheets-polyfill": "3.1.0",
83
82
  "cssnano": "5.1.7",
84
83
  "cssnano-preset-default": "5.2.7",
@@ -25,9 +25,7 @@ import {
25
25
  registerDirectoryLifecycle,
26
26
  } from "@jsenv/filesystem"
27
27
  import { Abort, raceProcessTeardownEvents } from "@jsenv/abort"
28
- import { createLogger, loggerToLevels } from "@jsenv/logger"
29
-
30
- import { createTaskLog } from "@jsenv/log"
28
+ import { createLogger, loggerToLevels, createTaskLog } from "@jsenv/log"
31
29
  import { createVersionGenerator } from "@jsenv/utils/versioning/version_generator.js"
32
30
  import { generateSourcemapUrl } from "@jsenv/utils/sourcemap/sourcemap_utils.js"
33
31
  import {
@@ -1184,12 +1182,12 @@ const applyUrlVersioning = async ({
1184
1182
  )
1185
1183
  const finalUrlInfo = finalGraph.getUrlInfo(versionedUrlInfo.url)
1186
1184
  return {
1185
+ content: versionedUrlInfo.content,
1186
+ contentType: versionedUrlInfo.contentType,
1187
1187
  originalContent: rawUrlInfo
1188
1188
  ? rawUrlInfo.originalContent
1189
1189
  : undefined,
1190
1190
  sourcemap: finalUrlInfo ? finalUrlInfo.sourcemap : undefined,
1191
- contentType: versionedUrlInfo.contentType,
1192
- content: versionedUrlInfo.content,
1193
1191
  }
1194
1192
  }
1195
1193
  return versionedUrlInfo
@@ -23,13 +23,12 @@ import {
23
23
  fetchFileSystem,
24
24
  composeServices,
25
25
  } from "@jsenv/server"
26
+
26
27
  import {
27
28
  assertAndNormalizeDirectoryUrl,
28
29
  registerDirectoryLifecycle,
29
30
  } from "@jsenv/filesystem"
30
- import { createLogger, loggerToLevels } from "@jsenv/logger"
31
-
32
- import { createTaskLog } from "@jsenv/log"
31
+ import { createLogger, loggerToLevels, createTaskLog } from "@jsenv/log"
33
32
  import { getCallerPosition } from "@jsenv/urls"
34
33
  import { initReloadableProcess } from "@jsenv/utils/process_reload/process_reload.js"
35
34
 
@@ -1,11 +1,10 @@
1
1
  import { parentPort } from "node:worker_threads"
2
+
2
3
  import {
3
4
  assertAndNormalizeDirectoryUrl,
4
5
  registerDirectoryLifecycle,
5
6
  } from "@jsenv/filesystem"
6
- import { createLogger, loggerToLevels } from "@jsenv/logger"
7
-
8
- import { createTaskLog } from "@jsenv/log"
7
+ import { createLogger, loggerToLevels, createTaskLog } from "@jsenv/log"
9
8
  import { getCallerPosition } from "@jsenv/urls"
10
9
  import { initReloadableProcess } from "@jsenv/utils/process_reload/process_reload.js"
11
10
  import { getCorePlugins } from "@jsenv/core/src/plugins/plugins.js"
@@ -1,8 +1,7 @@
1
1
  import { Abort, raceProcessTeardownEvents } from "@jsenv/abort"
2
2
 
3
3
  import { assertAndNormalizeDirectoryUrl } from "@jsenv/filesystem"
4
- import { createLogger } from "@jsenv/logger"
5
-
4
+ import { createLogger } from "@jsenv/log"
6
5
  import { getCorePlugins } from "@jsenv/core/src/plugins/plugins.js"
7
6
  import { createUrlGraph } from "@jsenv/core/src/omega/url_graph.js"
8
7
  import { createKitchen } from "@jsenv/core/src/omega/kitchen.js"
@@ -1,5 +1,6 @@
1
1
  import { Script } from "node:vm"
2
- import { createDetailedMessage } from "@jsenv/logger"
2
+
3
+ import { createDetailedMessage } from "@jsenv/log"
3
4
  import {
4
5
  Abort,
5
6
  createCallbackListNotifiedOnce,
@@ -7,7 +8,6 @@ import {
7
8
  raceCallbacks,
8
9
  } from "@jsenv/abort"
9
10
  import { moveUrl } from "@jsenv/urls"
10
-
11
11
  import { memoize } from "@jsenv/utils/memoize/memoize.js"
12
12
  import { filterV8Coverage } from "@jsenv/utils/coverage/v8_coverage_from_directory.js"
13
13
  import { composeTwoFileByFileIstanbulCoverages } from "@jsenv/utils/coverage/istanbul_coverage_composition.js"
@@ -1,6 +1,6 @@
1
1
  import { findFreePort } from "@jsenv/server"
2
- import { createDetailedMessage } from "@jsenv/logger"
3
2
 
3
+ import { createDetailedMessage } from "@jsenv/log"
4
4
  import { ExecOptions } from "./exec_options.js"
5
5
 
6
6
  export const createChildExecOptions = async ({
@@ -1,6 +1,4 @@
1
1
  import { fork } from "node:child_process"
2
- import { urlToFileSystemPath } from "@jsenv/urls"
3
- import { createDetailedMessage } from "@jsenv/logger"
4
2
  import {
5
3
  Abort,
6
4
  raceCallbacks,
@@ -8,6 +6,8 @@ import {
8
6
  } from "@jsenv/abort"
9
7
  import { uneval } from "@jsenv/uneval"
10
8
 
9
+ import { urlToFileSystemPath } from "@jsenv/urls"
10
+ import { createDetailedMessage } from "@jsenv/log"
11
11
  import { memoize } from "@jsenv/utils/memoize/memoize.js"
12
12
  import { createChildExecOptions } from "./child_exec_options.js"
13
13
  import { ExecOptions } from "./exec_options.js"
@@ -1,4 +1,4 @@
1
- import { createDetailedMessage } from "@jsenv/logger"
1
+ import { createDetailedMessage } from "@jsenv/log"
2
2
 
3
3
  export const createResolveUrlError = ({
4
4
  pluginController,
@@ -7,10 +7,8 @@ import {
7
7
  setUrlFilename,
8
8
  } from "@jsenv/urls"
9
9
  import { writeFileSync, ensureWindowsDriveLetter } from "@jsenv/filesystem"
10
- import { createDetailedMessage } from "@jsenv/logger"
11
-
10
+ import { createDetailedMessage } from "@jsenv/log"
12
11
  import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
13
-
14
12
  import { createPluginController } from "../plugins/plugin_controller.js"
15
13
  import { urlSpecifierEncoding } from "./url_specifier_encoding.js"
16
14
  import { createUrlInfoTransformer } from "./url_graph/url_info_transformations.js"
@@ -272,24 +270,36 @@ export const createKitchen = ({
272
270
  )
273
271
  return
274
272
  }
275
- const {
273
+ let {
274
+ content,
275
+ contentType,
276
276
  data,
277
277
  type,
278
278
  subtype,
279
- contentType = "application/octet-stream",
280
279
  originalUrl,
281
280
  originalContent,
282
- content,
283
281
  sourcemap,
284
282
  filename,
283
+
284
+ status = 200,
285
+ headers = {},
286
+ body,
285
287
  } = fetchUrlContentReturnValue
288
+ if (status !== 200) {
289
+ throw new Error(`unexpected status, ${status}`)
290
+ }
291
+ if (content === undefined) {
292
+ content = body
293
+ }
294
+ if (contentType === undefined) {
295
+ contentType = headers["content-type"] || "application/octet-stream"
296
+ }
297
+ urlInfo.contentType = contentType
298
+ urlInfo.headers = headers
286
299
  urlInfo.type =
287
300
  type ||
288
301
  reference.expectedType ||
289
- inferUrlInfoType({
290
- url: urlInfo.url,
291
- contentType,
292
- })
302
+ inferUrlInfoType({ url: urlInfo.url, contentType })
293
303
  urlInfo.subtype =
294
304
  subtype ||
295
305
  reference.expectedSubtype ||
@@ -298,7 +308,6 @@ export const createKitchen = ({
298
308
  type: urlInfo.type,
299
309
  subtype: urlInfo.subtype,
300
310
  })
301
- urlInfo.contentType = contentType
302
311
  // during build urls info are reused and load returns originalUrl/originalContent
303
312
  urlInfo.originalUrl = originalUrl || urlInfo.originalUrl
304
313
  urlInfo.originalContent =
@@ -345,8 +354,7 @@ export const createKitchen = ({
345
354
  const { cookDuringCook = cook } = dishContext
346
355
  context.cook = (urlInfo, nestedDishContext) => {
347
356
  return cookDuringCook(urlInfo, {
348
- outDirectoryUrl: dishContext.outDirectoryUrl,
349
- clientRuntimeCompat: dishContext.clientRuntimeCompat,
357
+ ...dishContext,
350
358
  ...nestedDishContext,
351
359
  })
352
360
  }
@@ -66,7 +66,7 @@ export const createFileService = ({
66
66
  status: 304,
67
67
  headers: {
68
68
  "cache-control": `private,max-age=0,must-revalidate`,
69
- ...urlInfo.responseHeaders,
69
+ ...urlInfo.headers,
70
70
  },
71
71
  }
72
72
  }
@@ -84,7 +84,6 @@ export const createFileService = ({
84
84
  urlInfo.type = null
85
85
  urlInfo.subtype = null
86
86
  urlInfo.timing = {}
87
- urlInfo.responseHeaders = {}
88
87
  }
89
88
  const { runtimeName, runtimeVersion } = parseUserAgentHeader(
90
89
  request.headers["user-agent"],
@@ -100,7 +99,7 @@ export const createFileService = ({
100
99
  ? `${rootDirectoryUrl}.jsenv/${runtimeName}@${runtimeVersion}/`
101
100
  : `${rootDirectoryUrl}.jsenv/${scenario}/${runtimeName}@${runtimeVersion}/`,
102
101
  })
103
- let { response, contentType, content, contentEtag } = urlInfo
102
+ let { response } = urlInfo
104
103
  if (response) {
105
104
  return response
106
105
  }
@@ -108,13 +107,13 @@ export const createFileService = ({
108
107
  url: reference.url,
109
108
  status: 200,
110
109
  headers: {
111
- "content-type": contentType,
112
- "content-length": Buffer.byteLength(content),
110
+ "content-length": Buffer.byteLength(urlInfo.content),
113
111
  "cache-control": `private,max-age=0,must-revalidate`,
114
- "eTag": contentEtag,
115
- ...urlInfo.responseHeaders,
112
+ "eTag": urlInfo.contentEtag,
113
+ ...urlInfo.headers,
114
+ "content-type": urlInfo.contentType,
116
115
  },
117
- body: content,
116
+ body: urlInfo.content,
118
117
  timing: urlInfo.timing,
119
118
  }
120
119
  kitchen.pluginController.callHooks(
@@ -196,6 +196,6 @@ const createUrlInfo = (url) => {
196
196
  sourcemap: null,
197
197
  sourcemapReference: null,
198
198
  timing: {},
199
- responseHeaders: {},
199
+ headers: {},
200
200
  }
201
201
  }
@@ -1,8 +1,8 @@
1
1
  import { pathToFileURL } from "node:url"
2
+
2
3
  import { URL_META } from "@jsenv/url-meta"
3
4
  import { isFileSystemPath } from "@jsenv/urls"
4
- import { createDetailedMessage } from "@jsenv/logger"
5
-
5
+ import { createDetailedMessage } from "@jsenv/log"
6
6
  import { babelHelperNameFromUrl } from "@jsenv/babel-plugins"
7
7
  import { applyRollupPlugins } from "@jsenv/utils/js_ast/apply_rollup_plugins.js"
8
8
  import { sourcemapConverter } from "@jsenv/utils/sourcemap/sourcemap_converter.js"
@@ -178,15 +178,11 @@ export const jsenvPluginFileUrls = ({
178
178
  }
179
179
  const fileBuffer = readFileSync(urlObject)
180
180
  const contentType = CONTENT_TYPE.fromUrlExtension(urlInfo.url)
181
- if (CONTENT_TYPE.isTextual(contentType)) {
182
- return {
183
- contentType,
184
- content: String(fileBuffer),
185
- }
186
- }
187
181
  return {
182
+ content: CONTENT_TYPE.isTextual(contentType)
183
+ ? String(fileBuffer)
184
+ : fileBuffer,
188
185
  contentType,
189
- content: fileBuffer,
190
186
  }
191
187
  },
192
188
  },
@@ -22,8 +22,8 @@ export const jsenvPluginDataUrls = () => {
22
22
  } = DATA_URL.parse(urlInfo.url)
23
23
  urlInfo.data.base64Flag = base64Flag
24
24
  return {
25
- contentType,
26
25
  content: contentFromUrlData({ contentType, base64Flag, urlData }),
26
+ contentType,
27
27
  }
28
28
  },
29
29
  formatUrl: (reference, context) => {
@@ -40,7 +40,7 @@ export const jsenvPluginDataUrls = () => {
40
40
  return reference.generatedUrl
41
41
  }
42
42
  const specifier = DATA_URL.stringify({
43
- contentType: urlInfo.contentType,
43
+ contentType: urlInfo.headers["content-type"],
44
44
  base64Flag: urlInfo.data.base64Flag,
45
45
  data: urlInfo.data.base64Flag
46
46
  ? dataToBase64(urlInfo.content)
@@ -26,10 +26,10 @@ const jsenvPluginInlineUrls = () => {
26
26
  return null
27
27
  }
28
28
  return {
29
- contentType: urlInfo.contentType,
30
29
  // we want to fetch the original content otherwise we might re-cook
31
30
  // content already cooked
32
31
  content: urlInfo.originalContent,
32
+ contentType: urlInfo.contentType,
33
33
  }
34
34
  },
35
35
  }
@@ -110,6 +110,8 @@ const jsenvPluginNodeEsmResolver = ({
110
110
  if (urlInfo.url.startsWith("file:///@ignore/")) {
111
111
  return {
112
112
  content: "export default {}",
113
+ contentType: "text/javascript",
114
+ type: "js_module",
113
115
  }
114
116
  }
115
117
  return null
@@ -266,11 +266,11 @@ const returnValueAssertions = [
266
266
  return { content: valueReturned }
267
267
  }
268
268
  if (typeof valueReturned === "object") {
269
- const { shouldHandle, content } = valueReturned
269
+ const { shouldHandle, content, body } = valueReturned
270
270
  if (shouldHandle === false) {
271
271
  return undefined
272
272
  }
273
- if (typeof content !== "string" && !Buffer.isBuffer(content)) {
273
+ if (typeof content !== "string" && !Buffer.isBuffer(content) && !body) {
274
274
  throw new Error(
275
275
  `Unexpected "content" returned by plugin: it must be a string or a buffer; got ${content}`,
276
276
  )
@@ -123,11 +123,11 @@ const jsenvPluginAsJsClassicConversion = ({
123
123
  })
124
124
  urlInfo.data.jsClassicFormat = jsClassicFormat
125
125
  return {
126
+ content,
127
+ contentType: "text/javascript",
128
+ type: "js_classic",
126
129
  originalUrl: originalUrlInfo.originalUrl,
127
130
  originalContent: originalUrlInfo.originalContent,
128
- type: "js_classic",
129
- contentType: "text/javascript",
130
- content,
131
131
  sourcemap,
132
132
  }
133
133
  },
@@ -98,14 +98,14 @@ const jsenvPluginAsModules = () => {
98
98
  }
99
99
  const jsonText = JSON.stringify(originalUrlInfo.content.trim())
100
100
  return {
101
- originalUrl: originalUrlInfo.originalUrl,
102
- originalContent: originalUrlInfo.originalContent,
103
- type: "js_module",
104
- contentType: "text/javascript",
105
101
  // here we could `export default ${jsonText}`:
106
102
  // but js engine are optimized to recognize JSON.parse
107
103
  // and use a faster parsing strategy
108
104
  content: `export default JSON.parse(${jsonText})`,
105
+ contentType: "text/javascript",
106
+ type: "js_module",
107
+ originalUrl: originalUrlInfo.originalUrl,
108
+ originalContent: originalUrlInfo.originalContent,
109
109
  }
110
110
  },
111
111
  }
@@ -130,10 +130,6 @@ const jsenvPluginAsModules = () => {
130
130
  canUseTemplateString: true,
131
131
  })
132
132
  return {
133
- originalUrl: originalUrlInfo.originalUrl,
134
- originalContent: originalUrlInfo.originalContent,
135
- type: "js_module",
136
- contentType: "text/javascript",
137
133
  content: `import { InlineContent } from ${JSON.stringify(
138
134
  inlineContentClientFileUrl,
139
135
  )}
@@ -142,6 +138,10 @@ const jsenvPluginAsModules = () => {
142
138
  const stylesheet = new CSSStyleSheet()
143
139
  stylesheet.replaceSync(inlineContent.text)
144
140
  export default stylesheet`,
141
+ contentType: "text/javascript",
142
+ type: "js_module",
143
+ originalUrl: originalUrlInfo.originalUrl,
144
+ originalContent: originalUrlInfo.originalContent,
145
145
  }
146
146
  },
147
147
  }
@@ -166,16 +166,16 @@ const jsenvPluginAsModules = () => {
166
166
  canUseTemplateString: true,
167
167
  })
168
168
  return {
169
- originalUrl: originalUrlInfo.originalUrl,
170
- originalContent: originalUrlInfo.originalContent,
171
- type: "js_module",
172
- contentType: "text/javascript",
173
169
  content: `import { InlineContent } from ${JSON.stringify(
174
170
  inlineContentClientFileUrl,
175
171
  )}
176
172
 
177
173
  const inlineContent = new InlineContent(${textPlain}, { type: "text/plain" })
178
174
  export default inlineContent.text`,
175
+ contentType: "text/javascript",
176
+ type: "js_module",
177
+ originalUrl: originalUrlInfo.originalUrl,
178
+ originalContent: originalUrlInfo.originalContent,
179
179
  }
180
180
  },
181
181
  }
@@ -3,10 +3,15 @@ import { memoryUsage } from "node:process"
3
3
  import wrapAnsi from "wrap-ansi"
4
4
  import stripAnsi from "strip-ansi"
5
5
  import cuid from "cuid"
6
+
6
7
  import { URL_META } from "@jsenv/url-meta"
7
8
  import { urlToFileSystemPath } from "@jsenv/urls"
8
- import { createDetailedMessage, loggerToLevels } from "@jsenv/logger"
9
- import { createLog, startSpinner } from "@jsenv/log"
9
+ import {
10
+ createDetailedMessage,
11
+ loggerToLevels,
12
+ createLog,
13
+ startSpinner,
14
+ } from "@jsenv/log"
10
15
  import { Abort, raceProcessTeardownEvents } from "@jsenv/abort"
11
16
  import {
12
17
  writeDirectory,
@@ -4,7 +4,7 @@ import {
4
4
  ensureEmptyDirectory,
5
5
  assertAndNormalizeDirectoryUrl,
6
6
  } from "@jsenv/filesystem"
7
- import { createLogger, createDetailedMessage } from "@jsenv/logger"
7
+ import { createLogger, createDetailedMessage } from "@jsenv/log"
8
8
 
9
9
  import { generateCoverageJsonFile } from "@jsenv/utils/coverage/coverage_reporter_json_file.js"
10
10
  import { generateCoverageHtmlDirectory } from "@jsenv/utils/coverage/coverage_reporter_html_directory.js"
@@ -1,5 +1,5 @@
1
1
  import { collectFiles } from "@jsenv/filesystem"
2
- import { createDetailedMessage } from "@jsenv/logger"
2
+ import { createDetailedMessage } from "@jsenv/log"
3
3
 
4
4
  export const generateExecutionSteps = async (
5
5
  plan,