@jsenv/core 40.2.0 → 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.
- package/dist/build/build.js +355 -133
- package/dist/client/directory_listing/jsenv_core_node_modules.js +2 -2
- package/dist/client/html_syntax_error/html_syntax_error.html +1 -1
- package/dist/jsenv_core_packages.js +282 -129
- package/dist/start_dev_server/start_dev_server.js +284 -28
- package/package.json +21 -18
- package/src/build/build.js +70 -76
- package/src/build/build_specifier_manager.js +10 -29
- package/src/dev/start_dev_server.js +9 -0
- package/src/kitchen/kitchen.js +11 -0
- package/src/kitchen/url_graph/references.js +13 -13
- package/src/kitchen/url_graph/url_graph.js +21 -1
- package/src/plugins/html_syntax_error_fallback/client/html_syntax_error.html +1 -1
- package/src/plugins/html_syntax_error_fallback/jsenv_plugin_html_syntax_error_fallback.js +2 -10
- package/src/plugins/package_side_effects/jsenv_plugin_package_side_effects.js +213 -0
- package/src/plugins/plugin_controller.js +5 -2
- package/src/plugins/plugins.js +7 -0
- package/src/plugins/protocol_file/jsenv_plugin_directory_listing.js +6 -5
- package/src/plugins/protocol_file/jsenv_plugin_protocol_file.js +2 -0
|
@@ -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.
|
|
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
|
-
|
|
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, "<")
|
|
3456
|
-
.replace(/>/g, ">")
|
|
3457
|
-
.replace(/"/g, """)
|
|
3458
|
-
.replace(/'/g, "'");
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
|
|
5934
|
-
if (!packageDirectoryUrl) {
|
|
5964
|
+
if (!packageDirectory.url) {
|
|
5935
5965
|
break package_workspaces;
|
|
5936
5966
|
}
|
|
5937
|
-
if (String(
|
|
5967
|
+
if (String(packageDirectory.url) === String(serverRootDirectoryUrl)) {
|
|
5938
5968
|
break package_workspaces;
|
|
5939
5969
|
}
|
|
5940
|
-
rootDirectoryUrl =
|
|
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.
|
|
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
|
-
"./
|
|
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.
|
|
83
|
-
"@jsenv/filesystem": "4.
|
|
84
|
-
"@jsenv/humanize": "1.
|
|
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.
|
|
90
|
+
"@jsenv/js-module-fallback": "1.4.7",
|
|
88
91
|
"@jsenv/node-esm-resolution": "1.2.0",
|
|
89
|
-
"@jsenv/plugin-bundling": "2.
|
|
90
|
-
"@jsenv/plugin-minification": "1.6.
|
|
91
|
-
"@jsenv/plugin-supervisor": "1.6.
|
|
92
|
-
"@jsenv/plugin-transpilation": "1.5.
|
|
93
|
-
"@jsenv/server": "16.0.
|
|
94
|
-
"@jsenv/sourcemap": "1.3.
|
|
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.
|
|
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.
|
|
120
|
-
"@playwright/browser-firefox": "1.51.
|
|
121
|
-
"@playwright/browser-webkit": "1.51.
|
|
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.
|
|
126
|
+
"eslint": "9.24.0",
|
|
124
127
|
"open": "10.1.0",
|
|
125
|
-
"playwright": "1.51.
|
|
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"
|