@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.
- package/README.md +42 -33
- package/dist/build/build.js +369 -149
- 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 +298 -28
- package/package.json +20 -19
- package/src/build/build.js +70 -92
- 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 +227 -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, 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.
|
|
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,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
|
|
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
|
-
"./
|
|
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.
|
|
83
|
-
"@jsenv/filesystem": "4.
|
|
84
|
-
"@jsenv/humanize": "1.
|
|
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.
|
|
88
|
+
"@jsenv/js-module-fallback": "1.4.7",
|
|
88
89
|
"@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.
|
|
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.
|
|
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.
|
|
120
|
-
"@playwright/browser-firefox": "1.51.
|
|
121
|
-
"@playwright/browser-webkit": "1.51.
|
|
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.
|
|
124
|
+
"eslint": "9.24.0",
|
|
124
125
|
"open": "10.1.0",
|
|
125
|
-
"playwright": "1.51.
|
|
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
|
+
}
|