@jsenv/core 40.2.1 → 40.3.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.
@@ -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, isSpecifierForNodeBuiltin, updateJsonFileSync, 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,230 @@ 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 normalizeSideEffectFileUrl = (url) => {
8274
+ const urlRelativeToPackage = urlToRelativeUrl(url, packageDirectory.url);
8275
+ return urlRelativeToPackage[0] === "."
8276
+ ? urlRelativeToPackage
8277
+ : `./${urlRelativeToPackage}`;
8278
+ };
8279
+
8280
+ const updatePackageSideEffects = (sideEffectBuildFileUrls) => {
8281
+ const packageJsonFileUrl = new URL("./package.json", packageDirectory.url)
8282
+ .href;
8283
+ const sideEffectRelativeUrlArray = [];
8284
+ for (const sideEffectBuildUrl of sideEffectBuildFileUrls) {
8285
+ sideEffectRelativeUrlArray.push(
8286
+ normalizeSideEffectFileUrl(sideEffectBuildUrl),
8287
+ );
8288
+ }
8289
+ updateJsonFileSync(packageJsonFileUrl, {
8290
+ sideEffects: sideEffectRelativeUrlArray,
8291
+ });
8292
+ };
8293
+
8294
+ const sideEffectBuildFileUrls = [];
8295
+
8296
+ const packageSideEffectsCacheMap = new Map();
8297
+ const readSideEffectInfoFromClosestPackage = (urlInfo) => {
8298
+ const closestPackageDirectoryUrl = urlInfo.packageDirectoryUrl;
8299
+ const closestPackageJSON = urlInfo.packageJSON;
8300
+ if (!closestPackageJSON) {
8301
+ return undefined;
8302
+ }
8303
+ const fromCache = packageSideEffectsCacheMap.get(
8304
+ closestPackageDirectoryUrl,
8305
+ );
8306
+ if (fromCache) {
8307
+ return fromCache.value;
8308
+ }
8309
+ try {
8310
+ return storePackageSideEffect(
8311
+ closestPackageDirectoryUrl,
8312
+ closestPackageJSON,
8313
+ );
8314
+ } catch {
8315
+ return storePackageSideEffect(closestPackageDirectoryUrl, null);
8316
+ }
8317
+ };
8318
+ const storePackageSideEffect = (packageDirectoryUrl, packageJSON) => {
8319
+ if (!packageJSON) {
8320
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, { value: undefined });
8321
+ return undefined;
8322
+ }
8323
+ const value = packageJSON.sideEffects;
8324
+ if (Array.isArray(value)) {
8325
+ const noSideEffect = {
8326
+ has: false,
8327
+ reason: "not listed in package.json side effects",
8328
+ packageDirectoryUrl,
8329
+ };
8330
+ const hasSideEffect = {
8331
+ has: true,
8332
+ reason: "listed in package.json side effects",
8333
+ packageDirectoryUrl,
8334
+ };
8335
+ const sideEffectPatterns = {};
8336
+ for (const v of value) {
8337
+ sideEffectPatterns[v] = v;
8338
+ }
8339
+ const associations = URL_META.resolveAssociations(
8340
+ { sideEffects: sideEffectPatterns },
8341
+ packageDirectoryUrl,
8342
+ );
8343
+ const getSideEffectInfo = (urlInfo) => {
8344
+ const meta = URL_META.applyAssociations({
8345
+ url: urlInfo.url,
8346
+ associations,
8347
+ });
8348
+ const sideEffectKey = meta.sideEffects;
8349
+ if (sideEffectKey) {
8350
+ return {
8351
+ ...hasSideEffect,
8352
+ reason: `"${sideEffectKey}" listed in package.json side effects`,
8353
+ };
8354
+ }
8355
+ return noSideEffect;
8356
+ };
8357
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
8358
+ value: getSideEffectInfo,
8359
+ });
8360
+ return getSideEffectInfo;
8361
+ }
8362
+ if (value === false) {
8363
+ const noSideEffect = {
8364
+ has: false,
8365
+ reason: "package.json side effects is false",
8366
+ packageDirectoryUrl,
8367
+ };
8368
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
8369
+ value: noSideEffect,
8370
+ });
8371
+ return noSideEffect;
8372
+ }
8373
+ const hasSideEffect = {
8374
+ has: true,
8375
+ reason: "package.json side effects is true",
8376
+ packageDirectoryUrl,
8377
+ };
8378
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
8379
+ value: hasSideEffect,
8380
+ });
8381
+ return hasSideEffect;
8382
+ };
8383
+ const getSideEffectInfoFromClosestPackage = (urlInfo) => {
8384
+ const sideEffectInfoFromClosestPackage =
8385
+ readSideEffectInfoFromClosestPackage(urlInfo);
8386
+ if (sideEffectInfoFromClosestPackage === undefined) {
8387
+ return null;
8388
+ }
8389
+ if (typeof sideEffectInfoFromClosestPackage === "function") {
8390
+ return sideEffectInfoFromClosestPackage(urlInfo);
8391
+ }
8392
+ return sideEffectInfoFromClosestPackage;
8393
+ };
8394
+
8395
+ return {
8396
+ name: "jsenv:package_side_effects",
8397
+ appliesDuring: "build",
8398
+ urlInfoCreated: (urlInfo) => {
8399
+ const url = urlInfo.url;
8400
+ if (isSpecifierForNodeBuiltin(url)) {
8401
+ urlInfo.contentSideEffects.push({
8402
+ sideEffect: "no",
8403
+ reason: "node builtin module",
8404
+ });
8405
+ return;
8406
+ }
8407
+ if (url.startsWith("file:")) {
8408
+ const sideEffectFromClosestPackage =
8409
+ getSideEffectInfoFromClosestPackage(urlInfo);
8410
+ if (sideEffectFromClosestPackage) {
8411
+ // if (sideEffectFromClosestPackage.has) {
8412
+ // console.log(`have side effect: ${url}`);
8413
+ // } else {
8414
+ // console.log(`no side effect: ${url}`);
8415
+ // }
8416
+ urlInfo.contentSideEffects.push(sideEffectFromClosestPackage);
8417
+ }
8418
+ return;
8419
+ }
8420
+ },
8421
+ refineBuildUrlContent: (buildUrlInfo, { buildUrl }) => {
8422
+ for (const sideEffect of buildUrlInfo.contentSideEffects) {
8423
+ if (sideEffect.has) {
8424
+ sideEffectBuildFileUrls.push(buildUrl);
8425
+ return;
8426
+ }
8427
+ }
8428
+ },
8429
+ refineBuild: (kitchen) => {
8430
+ if (sideEffectBuildFileUrls.length === 0) {
8431
+ return;
8432
+ }
8433
+ if (sideEffects === false) {
8434
+ updatePackageSideEffects(sideEffectBuildFileUrls);
8435
+ return;
8436
+ }
8437
+ const { buildDirectoryUrl } = kitchen.context;
8438
+ const sideEffectFileUrlSet = new Set();
8439
+ if (Array.isArray(sideEffects)) {
8440
+ let packageNeedsUpdate = false;
8441
+ for (const sideEffectFileRelativeUrl of sideEffects) {
8442
+ const sideEffectFileUrl = new URL(
8443
+ sideEffectFileRelativeUrl,
8444
+ packageDirectory.url,
8445
+ ).href;
8446
+ if (
8447
+ urlIsInsideOf(sideEffectFileUrl, buildDirectoryUrl) &&
8448
+ !sideEffectBuildFileUrls.includes(sideEffectFileUrl)
8449
+ ) {
8450
+ packageNeedsUpdate = true;
8451
+ } else {
8452
+ sideEffectFileUrlSet.add(sideEffectFileUrl);
8453
+ }
8454
+ }
8455
+ for (const sideEffectBuildUrl of sideEffectBuildFileUrls) {
8456
+ if (sideEffectFileUrlSet.has(sideEffectBuildUrl)) {
8457
+ continue;
8458
+ }
8459
+ packageNeedsUpdate = true;
8460
+ sideEffectFileUrlSet.add(sideEffectBuildUrl);
8461
+ }
8462
+ if (packageNeedsUpdate) {
8463
+ updatePackageSideEffects(sideEffectFileUrlSet);
8464
+ }
8465
+ }
8466
+ },
8467
+ };
8468
+ };
8469
+
8214
8470
  // tslint:disable:ordered-imports
8215
8471
 
8216
8472
 
@@ -8218,6 +8474,7 @@ const getCorePlugins = ({
8218
8474
  rootDirectoryUrl,
8219
8475
  mainFilePath,
8220
8476
  runtimeCompat,
8477
+ packageDirectory,
8221
8478
  sourceFilesConfig,
8222
8479
 
8223
8480
  referenceAnalysis = {},
@@ -8238,6 +8495,7 @@ const getCorePlugins = ({
8238
8495
  cacheControl,
8239
8496
  scenarioPlaceholders = true,
8240
8497
  ribbon = true,
8498
+ packageSideEffects = false,
8241
8499
  } = {}) => {
8242
8500
  if (cacheControl === true) {
8243
8501
  cacheControl = {};
@@ -8278,6 +8536,7 @@ const getCorePlugins = ({
8278
8536
  directoryListing,
8279
8537
  rootDirectoryUrl,
8280
8538
  mainFilePath,
8539
+ packageDirectory,
8281
8540
  sourceFilesConfig,
8282
8541
  }),
8283
8542
  {
@@ -8321,6 +8580,9 @@ const getCorePlugins = ({
8321
8580
  ...(ribbon ? [jsenvPluginRibbon({ rootDirectoryUrl, ...ribbon })] : []),
8322
8581
  jsenvPluginCleanHTML(),
8323
8582
  jsenvPluginChromeDevtoolsJson(),
8583
+ ...(packageSideEffects
8584
+ ? [jsenvPluginPackageSideEffects({ packageDirectory })]
8585
+ : []),
8324
8586
  ];
8325
8587
  };
8326
8588
 
@@ -8655,10 +8917,17 @@ const startDevServer = async ({
8655
8917
  );
8656
8918
  serverStopCallbackSet.add(stopWatchingSourceFiles);
8657
8919
 
8920
+ const packageDirectory = {
8921
+ url: lookupPackageDirectory(sourceDirectoryUrl),
8922
+ find: lookupPackageDirectory,
8923
+ read: readPackageAtOrNull,
8924
+ };
8925
+
8658
8926
  const devServerPluginStore = createPluginStore([
8659
8927
  jsenvPluginServerEvents({ clientAutoreload }),
8660
8928
  ...plugins,
8661
8929
  ...getCorePlugins({
8930
+ packageDirectory,
8662
8931
  rootDirectoryUrl: sourceDirectoryUrl,
8663
8932
  mainFilePath: sourceMainFilePath,
8664
8933
  runtimeCompat,
@@ -8721,6 +8990,7 @@ const startDevServer = async ({
8721
8990
  outDirectoryUrl: outDirectoryUrl
8722
8991
  ? new URL(`${runtimeName}@${runtimeVersion}/`, outDirectoryUrl)
8723
8992
  : undefined,
8993
+ packageDirectory,
8724
8994
  });
8725
8995
  kitchen.graph.urlInfoCreatedEventEmitter.on((urlInfoCreated) => {
8726
8996
  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.2",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -50,7 +50,8 @@
50
50
  "sideEffects": [
51
51
  "./src/kitchen/client/inline_content.js",
52
52
  "./dist/client/inline_content/inline_content.js",
53
- "./tests/"
53
+ "./dist/jsenv_core_node_modules.js",
54
+ "./dist/client/new_stylesheet/new_stylesheet.js"
54
55
  ],
55
56
  "scripts": {
56
57
  "eslint": "npx eslint .",
@@ -79,21 +80,21 @@
79
80
  "dependencies": {
80
81
  "@financial-times/polyfill-useragent-normaliser": "1.10.2",
81
82
  "@jsenv/abort": "4.3.1",
82
- "@jsenv/ast": "6.6.7",
83
- "@jsenv/filesystem": "4.14.6",
84
- "@jsenv/humanize": "1.4.0",
83
+ "@jsenv/ast": "6.6.9",
84
+ "@jsenv/filesystem": "4.15.0",
85
+ "@jsenv/humanize": "1.5.0",
85
86
  "@jsenv/importmap": "1.2.2",
86
87
  "@jsenv/integrity": "0.0.2",
87
- "@jsenv/js-module-fallback": "1.4.5",
88
+ "@jsenv/js-module-fallback": "1.4.7",
88
89
  "@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",
90
+ "@jsenv/plugin-bundling": "2.9.3",
91
+ "@jsenv/plugin-minification": "1.6.3",
92
+ "@jsenv/plugin-supervisor": "1.6.13",
93
+ "@jsenv/plugin-transpilation": "1.5.14",
94
+ "@jsenv/server": "16.0.8",
95
+ "@jsenv/sourcemap": "1.3.5",
95
96
  "@jsenv/url-meta": "8.5.6",
96
- "@jsenv/urls": "2.7.1",
97
+ "@jsenv/urls": "2.7.2",
97
98
  "@jsenv/utils": "2.3.0"
98
99
  },
99
100
  "devDependencies": {
@@ -116,15 +117,15 @@
116
117
  "@jsenv/terminal-table": "workspace:*",
117
118
  "@jsenv/os-metrics": "workspace:*",
118
119
  "@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",
120
+ "@playwright/browser-chromium": "1.51.1",
121
+ "@playwright/browser-firefox": "1.51.1",
122
+ "@playwright/browser-webkit": "1.51.1",
122
123
  "babel-plugin-transform-async-to-promises": "0.8.18",
123
- "eslint": "9.22.0",
124
+ "eslint": "9.24.0",
124
125
  "open": "10.1.0",
125
- "playwright": "1.51.0",
126
+ "playwright": "1.51.1",
126
127
  "prettier": "3.5.3",
127
128
  "prettier-plugin-organize-imports": "4.1.0",
128
129
  "strip-ansi": "7.1.0"
129
130
  }
130
- }
131
+ }