@jsenv/core 40.2.1 → 40.3.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.
@@ -1,6 +1,6 @@
1
1
  import { WebSocketResponse, pickContentType, ServerEvents, jsenvServiceCORS, jsenvAccessControlAllowedHeaders, composeTwoResponses, serveDirectory, jsenvServiceErrorHandler, startServer } from "@jsenv/server";
2
2
  import { convertFileSystemErrorToResponseProperties } from "@jsenv/server/src/internal/convertFileSystemErrorToResponseProperties.js";
3
- import { lookupPackageDirectory, registerDirectoryLifecycle, urlToRelativeUrl, moveUrl, urlIsInsideOf, ensureWindowsDriveLetter, createDetailedMessage, stringifyUrlSite, generateContentFrame, validateResponseIntegrity, setUrlFilename, getCallerPosition, urlToBasename, urlToExtension, asSpecifierWithoutSearch, asUrlWithoutSearch, injectQueryParamsIntoSpecifier, bufferToEtag, isFileSystemPath, urlToPathname, setUrlBasename, urlToFileSystemPath, writeFileSync, createLogger, URL_META, applyNodeEsmResolution, RUNTIME_COMPAT, normalizeUrl, ANSI, CONTENT_TYPE, DATA_URL, normalizeImportMap, composeTwoImportMaps, resolveImport, JS_QUOTES, defaultLookupPackageScope, defaultReadPackageJson, readCustomConditionsFromProcessArgs, readEntryStatSync, urlToFilename, ensurePathnameTrailingSlash, compareFileUrls, applyFileSystemMagicResolution, getExtensionsToTry, setUrlExtension, jsenvPluginTranspilation, memoizeByFirstArgument, assertAndNormalizeDirectoryUrl, createTaskLog } from "../jsenv_core_packages.js";
3
+ import { lookupPackageDirectory, registerDirectoryLifecycle, urlToRelativeUrl, moveUrl, urlIsInsideOf, ensureWindowsDriveLetter, createDetailedMessage, stringifyUrlSite, generateContentFrame, validateResponseIntegrity, setUrlFilename, getCallerPosition, urlToBasename, urlToExtension, asSpecifierWithoutSearch, asUrlWithoutSearch, injectQueryParamsIntoSpecifier, bufferToEtag, isFileSystemPath, urlToPathname, setUrlBasename, urlToFileSystemPath, writeFileSync, createLogger, URL_META, applyNodeEsmResolution, RUNTIME_COMPAT, normalizeUrl, ANSI, CONTENT_TYPE, errorToHTML, DATA_URL, normalizeImportMap, composeTwoImportMaps, resolveImport, JS_QUOTES, defaultLookupPackageScope, defaultReadPackageJson, readCustomConditionsFromProcessArgs, readEntryStatSync, urlToFilename, ensurePathnameTrailingSlash, compareFileUrls, applyFileSystemMagicResolution, getExtensionsToTry, setUrlExtension, updateJsonFileSync, isSpecifierForNodeBuiltin, jsenvPluginTranspilation, memoizeByFirstArgument, assertAndNormalizeDirectoryUrl, createTaskLog, readPackageAtOrNull } from "../jsenv_core_packages.js";
4
4
  import { readFileSync, existsSync, readdirSync, lstatSync, realpathSync } from "node:fs";
5
5
  import { pathToFileURL } from "node:url";
6
6
  import { generateSourcemapFileUrl, createMagicSource, composeTwoSourcemaps, generateSourcemapDataUrl, SOURCEMAP } from "@jsenv/sourcemap";
@@ -740,7 +740,14 @@ const createDependencies = (ownerUrlInfo) => {
740
740
  ...props,
741
741
  });
742
742
  const reference = originalReference.resolve();
743
- reference.finalize();
743
+ if (reference.urlInfo) {
744
+ return reference;
745
+ }
746
+ const kitchen = ownerUrlInfo.kitchen;
747
+ const urlInfo = kitchen.graph.reuseOrCreateUrlInfo(reference);
748
+ reference.urlInfo = urlInfo;
749
+ addDependency(reference);
750
+ ownerUrlInfo.context.finalizeReference(reference);
744
751
  return reference;
745
752
  };
746
753
 
@@ -1056,6 +1063,7 @@ const createReference = ({
1056
1063
  implicitReferenceSet: new Set(),
1057
1064
  isWeak,
1058
1065
  hasVersioningEffect,
1066
+ urlInfoEffectSet: new Set(),
1059
1067
  version,
1060
1068
  injected,
1061
1069
  timing: {},
@@ -1089,17 +1097,6 @@ const createReference = ({
1089
1097
  return referenceRedirected;
1090
1098
  };
1091
1099
 
1092
- reference.finalize = () => {
1093
- if (reference.urlInfo) {
1094
- return;
1095
- }
1096
- const kitchen = ownerUrlInfo.kitchen;
1097
- const urlInfo = kitchen.graph.reuseOrCreateUrlInfo(reference);
1098
- reference.urlInfo = urlInfo;
1099
- addDependency(reference);
1100
- ownerUrlInfo.context.finalizeReference(reference);
1101
- };
1102
-
1103
1100
  // "formatReference" can be async BUT this is an exception
1104
1101
  // for most cases it will be sync. We want to favor the sync signature to keep things simpler
1105
1102
  // The only case where it needs to be async is when
@@ -1462,6 +1459,10 @@ const applyReferenceEffectsOnUrlInfo = (reference) => {
1462
1459
  referencedUrlInfo.entryUrlInfo = reference.isEntryPoint
1463
1460
  ? referencedUrlInfo
1464
1461
  : reference.ownerUrlInfo.entryUrlInfo;
1462
+
1463
+ for (const urlInfoEffect of reference.urlInfoEffectSet) {
1464
+ urlInfoEffect(referencedUrlInfo);
1465
+ }
1465
1466
  };
1466
1467
 
1467
1468
  const GRAPH_VISITOR = {};
@@ -1873,6 +1874,7 @@ const createUrlInfo = (url, context) => {
1873
1874
  contentAst: undefined,
1874
1875
  contentLength: undefined,
1875
1876
  contentFinalized: false,
1877
+ contentSideEffects: [],
1876
1878
 
1877
1879
  sourcemap: null,
1878
1880
  sourcemapIsWrong: false,
@@ -1902,6 +1904,26 @@ const createUrlInfo = (url, context) => {
1902
1904
  urlInfo.pathname = new URL(url).pathname;
1903
1905
  urlInfo.searchParams = new URL(url).searchParams;
1904
1906
 
1907
+ Object.defineProperty(urlInfo, "packageDirectoryUrl", {
1908
+ enumerable: true,
1909
+ configurable: true,
1910
+ get: () => context.packageDirectory.find(url),
1911
+ });
1912
+ Object.defineProperty(urlInfo, "packageJSON", {
1913
+ enumerable: true,
1914
+ configurable: true,
1915
+ get: () => {
1916
+ const packageDirectoryUrl = context.packageDirectory.find(url);
1917
+ return packageDirectoryUrl
1918
+ ? context.packageDirectory.read(packageDirectoryUrl)
1919
+ : null;
1920
+ },
1921
+ });
1922
+ Object.defineProperty(urlInfo, "packageName", {
1923
+ enumerable: true,
1924
+ configurable: true,
1925
+ get: () => urlInfo.packageJSON?.name,
1926
+ });
1905
1927
  urlInfo.dependencies = createDependencies(urlInfo);
1906
1928
  urlInfo.isUsed = () => {
1907
1929
  if (urlInfo.isRoot) {
@@ -2694,6 +2716,7 @@ const createKitchen = ({
2694
2716
  sourcemapsSourcesContent,
2695
2717
  outDirectoryUrl,
2696
2718
  initialContext = {},
2719
+ packageDirectory,
2697
2720
  }) => {
2698
2721
  const logger = createLogger({ logLevel });
2699
2722
 
@@ -2708,6 +2731,7 @@ const createKitchen = ({
2708
2731
  logger,
2709
2732
  rootDirectoryUrl,
2710
2733
  mainFilePath,
2734
+ packageDirectory,
2711
2735
  dev,
2712
2736
  build,
2713
2737
  runtimeCompat,
@@ -2724,6 +2748,8 @@ const createKitchen = ({
2724
2748
  conditions: packageConditions,
2725
2749
  parentUrl: importer,
2726
2750
  specifier,
2751
+ lookupPackageScope: packageDirectory.find,
2752
+ readPackageJson: packageDirectory.read,
2727
2753
  });
2728
2754
  return { url, packageDirectoryUrl, packageJson };
2729
2755
  },
@@ -2744,6 +2770,9 @@ const createKitchen = ({
2744
2770
  rootDirectoryUrl,
2745
2771
  kitchen,
2746
2772
  });
2773
+ graph.urlInfoCreatedEventEmitter.on((urlInfoCreated) => {
2774
+ pluginController.callHooks("urlInfoCreated", urlInfoCreated, () => {});
2775
+ });
2747
2776
  kitchen.graph = graph;
2748
2777
 
2749
2778
  const urlInfoTransformer = createUrlInfoTransformer({
@@ -2996,6 +3025,7 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
2996
3025
  isEntryPoint,
2997
3026
  isDynamicEntryPoint,
2998
3027
  filenameHint,
3028
+ contentSideEffects,
2999
3029
  } = fetchUrlContentReturnValue;
3000
3030
  if (content === undefined) {
3001
3031
  content = body;
@@ -3028,6 +3058,9 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
3028
3058
  if (typeof isDynamicEntryPoint === "boolean") {
3029
3059
  urlInfo.isDynamicEntryPoint = isDynamicEntryPoint;
3030
3060
  }
3061
+ if (contentSideEffects) {
3062
+ urlInfo.contentSideEffects = contentSideEffects;
3063
+ }
3031
3064
  assertFetchedContentCompliance({
3032
3065
  urlInfo,
3033
3066
  content,
@@ -3444,19 +3477,11 @@ const generateHtmlForSyntaxError = (
3444
3477
  urlWithLineAndColumn,
3445
3478
  )}')`,
3446
3479
  errorLinkText: `${htmlRelativeUrl}:${line}:${column}`,
3447
- syntaxError: escapeHtml(htmlErrorContentFrame),
3480
+ syntaxErrorHTML: errorToHTML(htmlErrorContentFrame),
3448
3481
  };
3449
3482
  const html = replacePlaceholders$1(htmlForSyntaxError, replacers);
3450
3483
  return html;
3451
3484
  };
3452
- const escapeHtml = (string) => {
3453
- return string
3454
- .replace(/&/g, "&")
3455
- .replace(/</g, "&lt;")
3456
- .replace(/>/g, "&gt;")
3457
- .replace(/"/g, "&quot;")
3458
- .replace(/'/g, "&#039;");
3459
- };
3460
3485
  const replacePlaceholders$1 = (html, replacers) => {
3461
3486
  return html.replace(/\$\{(\w+)\}/g, (match, name) => {
3462
3487
  const replacer = replacers[name];
@@ -3758,15 +3783,18 @@ const HOOK_NAMES = [
3758
3783
  "redirectReference",
3759
3784
  "transformReferenceSearchParams",
3760
3785
  "formatReference",
3786
+ "urlInfoCreated",
3761
3787
  "fetchUrlContent",
3762
3788
  "transformUrlContent",
3763
3789
  "finalizeUrlContent",
3764
3790
  "bundle", // is called only during build
3765
- "optimizeUrlContent", // is called only during build
3791
+ "optimizeBuildUrlContent", // is called only during build
3766
3792
  "cooked",
3767
3793
  "augmentResponse", // is called only during dev/tests
3768
3794
  "destroy",
3769
3795
  "effect",
3796
+ "refineBuildUrlContent", // called only during build
3797
+ "refineBuild", // called only during build
3770
3798
  ];
3771
3799
 
3772
3800
  const testAppliesDuring = (plugin, kitchen) => {
@@ -3877,7 +3905,7 @@ const returnValueAssertions = [
3877
3905
  "fetchUrlContent",
3878
3906
  "transformUrlContent",
3879
3907
  "finalizeUrlContent",
3880
- "optimizeUrlContent",
3908
+ "optimizeBuildUrlContent",
3881
3909
  ],
3882
3910
  assertion: (valueReturned, urlInfo, { hook }) => {
3883
3911
  if (typeof valueReturned === "string" || Buffer.isBuffer(valueReturned)) {
@@ -5741,6 +5769,7 @@ const jsenvPluginDirectoryListing = ({
5741
5769
  urlMocks = false,
5742
5770
  autoreload = true,
5743
5771
  directoryContentMagicName,
5772
+ packageDirectory,
5744
5773
  rootDirectoryUrl,
5745
5774
  mainFilePath,
5746
5775
  sourceFilesConfig,
@@ -5826,6 +5855,7 @@ const jsenvPluginDirectoryListing = ({
5826
5855
  directoryContentMagicName,
5827
5856
  rootDirectoryUrl,
5828
5857
  mainFilePath,
5858
+ packageDirectory,
5829
5859
  enoent,
5830
5860
  }),
5831
5861
  },
@@ -5912,6 +5942,7 @@ const generateDirectoryListingInjection = (
5912
5942
  {
5913
5943
  rootDirectoryUrl,
5914
5944
  mainFilePath,
5945
+ packageDirectory,
5915
5946
  request,
5916
5947
  urlMocks,
5917
5948
  directoryContentMagicName,
@@ -5930,14 +5961,13 @@ const generateDirectoryListingInjection = (
5930
5961
  firstExistingDirectoryUrl,
5931
5962
  });
5932
5963
  package_workspaces: {
5933
- const packageDirectoryUrl = lookupPackageDirectory(serverRootDirectoryUrl);
5934
- if (!packageDirectoryUrl) {
5964
+ if (!packageDirectory.url) {
5935
5965
  break package_workspaces;
5936
5966
  }
5937
- if (String(packageDirectoryUrl) === String(serverRootDirectoryUrl)) {
5967
+ if (String(packageDirectory.url) === String(serverRootDirectoryUrl)) {
5938
5968
  break package_workspaces;
5939
5969
  }
5940
- rootDirectoryUrl = packageDirectoryUrl;
5970
+ rootDirectoryUrl = packageDirectory.url;
5941
5971
  // if (String(firstExistingDirectoryUrl) === String(serverRootDirectoryUrl)) {
5942
5972
  // let packageContent;
5943
5973
  // try {
@@ -6268,6 +6298,7 @@ const jsenvPluginProtocolFile = ({
6268
6298
  directoryListing,
6269
6299
  rootDirectoryUrl,
6270
6300
  mainFilePath,
6301
+ packageDirectory,
6271
6302
  sourceFilesConfig,
6272
6303
  }) => {
6273
6304
  return [
@@ -6331,6 +6362,7 @@ const jsenvPluginProtocolFile = ({
6331
6362
  directoryContentMagicName,
6332
6363
  rootDirectoryUrl,
6333
6364
  mainFilePath,
6365
+ packageDirectory,
6334
6366
  sourceFilesConfig,
6335
6367
  }),
6336
6368
  ]
@@ -8211,6 +8243,216 @@ const jsenvPluginAutoreloadOnServerRestart = () => {
8211
8243
  };
8212
8244
  };
8213
8245
 
8246
+ /**
8247
+ * Lorsqu'on bundle un package ayant pas le field sideEffects
8248
+ * alors on fini potentiellement par dire
8249
+ * sideEffect: false
8250
+ * sur le package racine alors qu'on en sait rien
8251
+ * on pourrait mettre un package.json dans dist dans ce cas
8252
+ * qui ne déclare pas le field side effect afin
8253
+ * d'override le package.json du project qui lui dit qu'il ny en a pas
8254
+ *
8255
+ * On part du principe pour le moment que c'est la respo du package racine de déclarer cela
8256
+ *
8257
+ */
8258
+
8259
+
8260
+ const jsenvPluginPackageSideEffects = ({ packageDirectory }) => {
8261
+ if (!packageDirectory.url) {
8262
+ return [];
8263
+ }
8264
+ const packageJson = packageDirectory.read(packageDirectory.url);
8265
+ if (!packageJson) {
8266
+ return [];
8267
+ }
8268
+ const { sideEffects } = packageJson;
8269
+ if (sideEffects !== false && !Array.isArray(sideEffects)) {
8270
+ return [];
8271
+ }
8272
+
8273
+ const sideEffectFileUrlSet = new Set();
8274
+ const packageJsonFileUrl = new URL("./package.json", packageDirectory.url)
8275
+ .href;
8276
+
8277
+ const normalizeSideEffectFileUrl = (url) => {
8278
+ const urlRelativeToPackage = urlToRelativeUrl(url, packageDirectory.url);
8279
+ return urlRelativeToPackage[0] === "."
8280
+ ? urlRelativeToPackage
8281
+ : `./${urlRelativeToPackage}`;
8282
+ };
8283
+
8284
+ const sideEffectBuildFileUrls = [];
8285
+
8286
+ const packageSideEffectsCacheMap = new Map();
8287
+ const readSideEffectInfoFromClosestPackage = (urlInfo) => {
8288
+ const closestPackageDirectoryUrl = urlInfo.packageDirectoryUrl;
8289
+ const closestPackageJSON = urlInfo.packageJSON;
8290
+ if (!closestPackageJSON) {
8291
+ return undefined;
8292
+ }
8293
+ const fromCache = packageSideEffectsCacheMap.get(
8294
+ closestPackageDirectoryUrl,
8295
+ );
8296
+ if (fromCache) {
8297
+ return fromCache.value;
8298
+ }
8299
+ try {
8300
+ return storePackageSideEffect(
8301
+ closestPackageDirectoryUrl,
8302
+ closestPackageJSON,
8303
+ );
8304
+ } catch {
8305
+ return storePackageSideEffect(closestPackageDirectoryUrl, null);
8306
+ }
8307
+ };
8308
+ const storePackageSideEffect = (packageDirectoryUrl, packageJSON) => {
8309
+ if (!packageJSON) {
8310
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, { value: undefined });
8311
+ return undefined;
8312
+ }
8313
+ const value = packageJSON.sideEffects;
8314
+ if (Array.isArray(value)) {
8315
+ const noSideEffect = {
8316
+ has: false,
8317
+ reason: "not listed in package.json side effects",
8318
+ packageDirectoryUrl,
8319
+ };
8320
+ const hasSideEffect = {
8321
+ has: true,
8322
+ reason: "listed in package.json side effects",
8323
+ packageDirectoryUrl,
8324
+ };
8325
+ const sideEffectPatterns = {};
8326
+ for (const v of value) {
8327
+ sideEffectPatterns[v] = v;
8328
+ }
8329
+ const associations = URL_META.resolveAssociations(
8330
+ { sideEffects: sideEffectPatterns },
8331
+ packageDirectoryUrl,
8332
+ );
8333
+ const getSideEffectInfo = (urlInfo) => {
8334
+ const meta = URL_META.applyAssociations({
8335
+ url: urlInfo.url,
8336
+ associations,
8337
+ });
8338
+ const sideEffectKey = meta.sideEffects;
8339
+ if (sideEffectKey) {
8340
+ return {
8341
+ ...hasSideEffect,
8342
+ reason: `"${sideEffectKey}" listed in package.json side effects`,
8343
+ };
8344
+ }
8345
+ return noSideEffect;
8346
+ };
8347
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
8348
+ value: getSideEffectInfo,
8349
+ });
8350
+ return getSideEffectInfo;
8351
+ }
8352
+ if (value === false) {
8353
+ const noSideEffect = {
8354
+ has: false,
8355
+ reason: "package.json side effects is false",
8356
+ packageDirectoryUrl,
8357
+ };
8358
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
8359
+ value: noSideEffect,
8360
+ });
8361
+ return noSideEffect;
8362
+ }
8363
+ const hasSideEffect = {
8364
+ has: true,
8365
+ reason: "package.json side effects is true",
8366
+ packageDirectoryUrl,
8367
+ };
8368
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
8369
+ value: hasSideEffect,
8370
+ });
8371
+ return hasSideEffect;
8372
+ };
8373
+ const getSideEffectInfoFromClosestPackage = (urlInfo) => {
8374
+ const sideEffectInfoFromClosestPackage =
8375
+ readSideEffectInfoFromClosestPackage(urlInfo);
8376
+ if (sideEffectInfoFromClosestPackage === undefined) {
8377
+ return null;
8378
+ }
8379
+ if (typeof sideEffectInfoFromClosestPackage === "function") {
8380
+ return sideEffectInfoFromClosestPackage(urlInfo);
8381
+ }
8382
+ return sideEffectInfoFromClosestPackage;
8383
+ };
8384
+
8385
+ return {
8386
+ name: "jsenv:package_side_effects",
8387
+ appliesDuring: "build",
8388
+ urlInfoCreated: (urlInfo) => {
8389
+ const url = urlInfo.url;
8390
+ if (isSpecifierForNodeBuiltin(url)) {
8391
+ urlInfo.contentSideEffects.push({
8392
+ sideEffect: "no",
8393
+ reason: "node builtin module",
8394
+ });
8395
+ return;
8396
+ }
8397
+ if (url.startsWith("file:")) {
8398
+ const sideEffectFromClosestPackage =
8399
+ getSideEffectInfoFromClosestPackage(urlInfo);
8400
+ if (sideEffectFromClosestPackage) {
8401
+ // if (sideEffectFromClosestPackage.has) {
8402
+ // console.log(`have side effect: ${url}`);
8403
+ // } else {
8404
+ // console.log(`no side effect: ${url}`);
8405
+ // }
8406
+ urlInfo.contentSideEffects.push(sideEffectFromClosestPackage);
8407
+ }
8408
+ return;
8409
+ }
8410
+ },
8411
+ refineBuildUrlContent: (buildUrlInfo, { buildUrl }) => {
8412
+ for (const sideEffect of buildUrlInfo.contentSideEffects) {
8413
+ if (sideEffect.has) {
8414
+ sideEffectBuildFileUrls.push(buildUrl);
8415
+ return;
8416
+ }
8417
+ }
8418
+ },
8419
+ refineBuild: () => {
8420
+ if (sideEffectBuildFileUrls.length === 0) {
8421
+ return;
8422
+ }
8423
+ let sideEffectsToAdd = [];
8424
+ if (sideEffects === false) {
8425
+ sideEffectsToAdd = sideEffectBuildFileUrls;
8426
+ } else if (Array.isArray(sideEffects)) {
8427
+ for (const sideEffectFileRelativeUrl of sideEffects) {
8428
+ const sideEffectFileUrl = new URL(
8429
+ sideEffectFileRelativeUrl,
8430
+ packageDirectory.url,
8431
+ ).href;
8432
+ sideEffectFileUrlSet.add(sideEffectFileUrl);
8433
+ }
8434
+ for (const url of sideEffectBuildFileUrls) {
8435
+ if (sideEffectFileUrlSet.has(url)) {
8436
+ continue;
8437
+ }
8438
+ sideEffectsToAdd.push(url);
8439
+ }
8440
+ }
8441
+ if (sideEffectsToAdd.length === 0) {
8442
+ return;
8443
+ }
8444
+
8445
+ const finalSideEffects = Array.isArray(sideEffects) ? sideEffects : [];
8446
+ for (const sideEffectBuildUrl of sideEffectBuildFileUrls) {
8447
+ finalSideEffects.push(normalizeSideEffectFileUrl(sideEffectBuildUrl));
8448
+ }
8449
+ updateJsonFileSync(packageJsonFileUrl, {
8450
+ sideEffects: finalSideEffects,
8451
+ });
8452
+ },
8453
+ };
8454
+ };
8455
+
8214
8456
  // tslint:disable:ordered-imports
8215
8457
 
8216
8458
 
@@ -8218,6 +8460,7 @@ const getCorePlugins = ({
8218
8460
  rootDirectoryUrl,
8219
8461
  mainFilePath,
8220
8462
  runtimeCompat,
8463
+ packageDirectory,
8221
8464
  sourceFilesConfig,
8222
8465
 
8223
8466
  referenceAnalysis = {},
@@ -8238,6 +8481,7 @@ const getCorePlugins = ({
8238
8481
  cacheControl,
8239
8482
  scenarioPlaceholders = true,
8240
8483
  ribbon = true,
8484
+ packageSideEffects = false,
8241
8485
  } = {}) => {
8242
8486
  if (cacheControl === true) {
8243
8487
  cacheControl = {};
@@ -8278,6 +8522,7 @@ const getCorePlugins = ({
8278
8522
  directoryListing,
8279
8523
  rootDirectoryUrl,
8280
8524
  mainFilePath,
8525
+ packageDirectory,
8281
8526
  sourceFilesConfig,
8282
8527
  }),
8283
8528
  {
@@ -8321,6 +8566,9 @@ const getCorePlugins = ({
8321
8566
  ...(ribbon ? [jsenvPluginRibbon({ rootDirectoryUrl, ...ribbon })] : []),
8322
8567
  jsenvPluginCleanHTML(),
8323
8568
  jsenvPluginChromeDevtoolsJson(),
8569
+ ...(packageSideEffects
8570
+ ? [jsenvPluginPackageSideEffects({ packageDirectory })]
8571
+ : []),
8324
8572
  ];
8325
8573
  };
8326
8574
 
@@ -8655,10 +8903,17 @@ const startDevServer = async ({
8655
8903
  );
8656
8904
  serverStopCallbackSet.add(stopWatchingSourceFiles);
8657
8905
 
8906
+ const packageDirectory = {
8907
+ url: lookupPackageDirectory(sourceDirectoryUrl),
8908
+ find: lookupPackageDirectory,
8909
+ read: readPackageAtOrNull,
8910
+ };
8911
+
8658
8912
  const devServerPluginStore = createPluginStore([
8659
8913
  jsenvPluginServerEvents({ clientAutoreload }),
8660
8914
  ...plugins,
8661
8915
  ...getCorePlugins({
8916
+ packageDirectory,
8662
8917
  rootDirectoryUrl: sourceDirectoryUrl,
8663
8918
  mainFilePath: sourceMainFilePath,
8664
8919
  runtimeCompat,
@@ -8721,6 +8976,7 @@ const startDevServer = async ({
8721
8976
  outDirectoryUrl: outDirectoryUrl
8722
8977
  ? new URL(`${runtimeName}@${runtimeVersion}/`, outDirectoryUrl)
8723
8978
  : undefined,
8979
+ packageDirectory,
8724
8980
  });
8725
8981
  kitchen.graph.urlInfoCreatedEventEmitter.on((urlInfoCreated) => {
8726
8982
  const { watch } = URL_META.applyAssociations({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "40.2.1",
3
+ "version": "40.3.1",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -50,7 +50,10 @@
50
50
  "sideEffects": [
51
51
  "./src/kitchen/client/inline_content.js",
52
52
  "./dist/client/inline_content/inline_content.js",
53
- "./tests/"
53
+ "./dist/client/directory_listing/jsenv_core_node_modules.js",
54
+ "./dist/jsenv_core_node_modules.js",
55
+ "./dist/client/new_stylesheet/new_stylesheet.js",
56
+ "./dist/client/inline_content/inline_content.js"
54
57
  ],
55
58
  "scripts": {
56
59
  "eslint": "npx eslint .",
@@ -79,21 +82,21 @@
79
82
  "dependencies": {
80
83
  "@financial-times/polyfill-useragent-normaliser": "1.10.2",
81
84
  "@jsenv/abort": "4.3.1",
82
- "@jsenv/ast": "6.6.7",
83
- "@jsenv/filesystem": "4.14.6",
84
- "@jsenv/humanize": "1.4.0",
85
+ "@jsenv/ast": "6.6.9",
86
+ "@jsenv/filesystem": "4.15.0",
87
+ "@jsenv/humanize": "1.5.0",
85
88
  "@jsenv/importmap": "1.2.2",
86
89
  "@jsenv/integrity": "0.0.2",
87
- "@jsenv/js-module-fallback": "1.4.5",
90
+ "@jsenv/js-module-fallback": "1.4.7",
88
91
  "@jsenv/node-esm-resolution": "1.2.0",
89
- "@jsenv/plugin-bundling": "2.8.8",
90
- "@jsenv/plugin-minification": "1.6.2",
91
- "@jsenv/plugin-supervisor": "1.6.12",
92
- "@jsenv/plugin-transpilation": "1.5.9",
93
- "@jsenv/server": "16.0.7",
94
- "@jsenv/sourcemap": "1.3.4",
92
+ "@jsenv/plugin-bundling": "2.9.3",
93
+ "@jsenv/plugin-minification": "1.6.3",
94
+ "@jsenv/plugin-supervisor": "1.6.13",
95
+ "@jsenv/plugin-transpilation": "1.5.14",
96
+ "@jsenv/server": "16.0.8",
97
+ "@jsenv/sourcemap": "1.3.5",
95
98
  "@jsenv/url-meta": "8.5.6",
96
- "@jsenv/urls": "2.7.1",
99
+ "@jsenv/urls": "2.7.2",
97
100
  "@jsenv/utils": "2.3.0"
98
101
  },
99
102
  "devDependencies": {
@@ -116,13 +119,13 @@
116
119
  "@jsenv/terminal-table": "workspace:*",
117
120
  "@jsenv/os-metrics": "workspace:*",
118
121
  "@jsenv/runtime-compat": "workspace:*",
119
- "@playwright/browser-chromium": "1.51.0",
120
- "@playwright/browser-firefox": "1.51.0",
121
- "@playwright/browser-webkit": "1.51.0",
122
+ "@playwright/browser-chromium": "1.51.1",
123
+ "@playwright/browser-firefox": "1.51.1",
124
+ "@playwright/browser-webkit": "1.51.1",
122
125
  "babel-plugin-transform-async-to-promises": "0.8.18",
123
- "eslint": "9.22.0",
126
+ "eslint": "9.24.0",
124
127
  "open": "10.1.0",
125
- "playwright": "1.51.0",
128
+ "playwright": "1.51.1",
126
129
  "prettier": "3.5.3",
127
130
  "prettier-plugin-organize-imports": "4.1.0",
128
131
  "strip-ansi": "7.1.0"