@jsenv/core 29.4.2 → 29.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +117 -109
- package/package.json +2 -1
- package/src/build/build.js +91 -72
- package/src/build/version_generator.js +14 -18
- package/src/kitchen/url_graph/sort_by_dependencies.js +3 -2
package/dist/main.js
CHANGED
|
@@ -8922,34 +8922,6 @@ const parseJsUrls = async ({
|
|
|
8922
8922
|
return jsUrls;
|
|
8923
8923
|
};
|
|
8924
8924
|
|
|
8925
|
-
const sortByDependencies = nodes => {
|
|
8926
|
-
const visited = [];
|
|
8927
|
-
const sorted = [];
|
|
8928
|
-
const circular = [];
|
|
8929
|
-
const visit = url => {
|
|
8930
|
-
const isSorted = sorted.includes(url);
|
|
8931
|
-
if (isSorted) {
|
|
8932
|
-
return;
|
|
8933
|
-
}
|
|
8934
|
-
const isVisited = visited.includes(url);
|
|
8935
|
-
if (isVisited) {
|
|
8936
|
-
circular.push(url);
|
|
8937
|
-
sorted.push(url);
|
|
8938
|
-
} else {
|
|
8939
|
-
visited.push(url);
|
|
8940
|
-
nodes[url].dependencies.forEach(dependencyUrl => {
|
|
8941
|
-
visit(dependencyUrl);
|
|
8942
|
-
});
|
|
8943
|
-
sorted.push(url);
|
|
8944
|
-
}
|
|
8945
|
-
};
|
|
8946
|
-
Object.keys(nodes).forEach(url => {
|
|
8947
|
-
visit(url);
|
|
8948
|
-
});
|
|
8949
|
-
sorted.circular = circular;
|
|
8950
|
-
return sorted;
|
|
8951
|
-
};
|
|
8952
|
-
|
|
8953
8925
|
const urlSpecifierEncoding = {
|
|
8954
8926
|
encode: reference => {
|
|
8955
8927
|
const {
|
|
@@ -21389,6 +21361,35 @@ const jsenvPluginNodeRuntime = ({
|
|
|
21389
21361
|
};
|
|
21390
21362
|
};
|
|
21391
21363
|
|
|
21364
|
+
const sortByDependencies = nodes => {
|
|
21365
|
+
const visited = [];
|
|
21366
|
+
const sorted = [];
|
|
21367
|
+
const circular = [];
|
|
21368
|
+
const visit = url => {
|
|
21369
|
+
const isSorted = sorted.includes(url);
|
|
21370
|
+
if (isSorted) {
|
|
21371
|
+
return;
|
|
21372
|
+
}
|
|
21373
|
+
const isVisited = visited.includes(url);
|
|
21374
|
+
if (isVisited) {
|
|
21375
|
+
if (!circular.includes(url)) {
|
|
21376
|
+
circular.push(url);
|
|
21377
|
+
}
|
|
21378
|
+
} else {
|
|
21379
|
+
visited.push(url);
|
|
21380
|
+
nodes[url].dependencies.forEach(dependencyUrl => {
|
|
21381
|
+
visit(dependencyUrl);
|
|
21382
|
+
});
|
|
21383
|
+
sorted.push(url);
|
|
21384
|
+
}
|
|
21385
|
+
};
|
|
21386
|
+
Object.keys(nodes).forEach(url => {
|
|
21387
|
+
visit(url);
|
|
21388
|
+
});
|
|
21389
|
+
sorted.circular = circular;
|
|
21390
|
+
return sorted;
|
|
21391
|
+
};
|
|
21392
|
+
|
|
21392
21393
|
/*
|
|
21393
21394
|
* Each @import found in css is replaced by the file content
|
|
21394
21395
|
* - There is no need to worry about urls (such as background-image: url())
|
|
@@ -22801,19 +22802,17 @@ ${globalName}.__v__ = function (specifier) {
|
|
|
22801
22802
|
// https://github.com/rollup/rollup/blob/5a5391971d695c808eed0c5d7d2c6ccb594fc689/src/Chunk.ts#L870
|
|
22802
22803
|
const createVersionGenerator = () => {
|
|
22803
22804
|
const hash = createHash("sha256");
|
|
22804
|
-
const augmentWithContent = ({
|
|
22805
|
-
content,
|
|
22806
|
-
contentType = "application/octet-stream",
|
|
22807
|
-
lineBreakNormalization = false
|
|
22808
|
-
}) => {
|
|
22809
|
-
hash.update(lineBreakNormalization && CONTENT_TYPE.isTextual(contentType) ? normalizeLineBreaks(content) : content);
|
|
22810
|
-
};
|
|
22811
|
-
const augmentWithDependencyVersion = version => {
|
|
22812
|
-
hash.update(version);
|
|
22813
|
-
};
|
|
22814
22805
|
return {
|
|
22815
|
-
augmentWithContent
|
|
22816
|
-
|
|
22806
|
+
augmentWithContent: ({
|
|
22807
|
+
content,
|
|
22808
|
+
contentType = "application/octet-stream",
|
|
22809
|
+
lineBreakNormalization = false
|
|
22810
|
+
}) => {
|
|
22811
|
+
hash.update(lineBreakNormalization && CONTENT_TYPE.isTextual(contentType) ? normalizeLineBreaks(content) : content);
|
|
22812
|
+
},
|
|
22813
|
+
augment: value => {
|
|
22814
|
+
hash.update(value);
|
|
22815
|
+
},
|
|
22817
22816
|
generate: () => {
|
|
22818
22817
|
return hash.digest("hex").slice(0, 8);
|
|
22819
22818
|
}
|
|
@@ -23550,6 +23549,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23550
23549
|
buildTask.done();
|
|
23551
23550
|
}
|
|
23552
23551
|
}
|
|
23552
|
+
const versionMap = new Map();
|
|
23553
|
+
const versionedUrlMap = new Map();
|
|
23553
23554
|
{
|
|
23554
23555
|
inject_version_in_urls: {
|
|
23555
23556
|
if (!versioning) {
|
|
@@ -23559,12 +23560,13 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23559
23560
|
disabled: logger.levels.debug || !logger.levels.info
|
|
23560
23561
|
});
|
|
23561
23562
|
try {
|
|
23562
|
-
|
|
23563
|
-
|
|
23564
|
-
|
|
23563
|
+
// see also https://github.com/rollup/rollup/pull/4543
|
|
23564
|
+
const contentVersionMap = new Map();
|
|
23565
|
+
const hashCallbacks = [];
|
|
23566
|
+
GRAPH.forEach(finalGraph, urlInfo => {
|
|
23567
|
+
if (urlInfo.url.startsWith("data:")) {
|
|
23565
23568
|
return;
|
|
23566
23569
|
}
|
|
23567
|
-
const urlInfo = finalGraph.getUrlInfo(url);
|
|
23568
23570
|
if (urlInfo.type === "sourcemap") {
|
|
23569
23571
|
return;
|
|
23570
23572
|
}
|
|
@@ -23584,7 +23586,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23584
23586
|
if (!urlInfo.shouldHandle) {
|
|
23585
23587
|
return;
|
|
23586
23588
|
}
|
|
23587
|
-
if (
|
|
23589
|
+
if (urlInfo.dependents.size === 0 && !urlInfo.isEntryPoint) {
|
|
23588
23590
|
return;
|
|
23589
23591
|
}
|
|
23590
23592
|
const urlContent = urlInfo.type === "html" ? stringifyHtmlAst(parseHtmlString(urlInfo.content, {
|
|
@@ -23592,55 +23594,78 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23592
23594
|
}), {
|
|
23593
23595
|
cleanupJsenvAttributes: true
|
|
23594
23596
|
}) : urlInfo.content;
|
|
23595
|
-
const
|
|
23596
|
-
|
|
23597
|
+
const contentVersionGenerator = createVersionGenerator();
|
|
23598
|
+
contentVersionGenerator.augmentWithContent({
|
|
23597
23599
|
content: urlContent,
|
|
23598
23600
|
contentType: urlInfo.contentType,
|
|
23599
23601
|
lineBreakNormalization
|
|
23600
23602
|
});
|
|
23601
|
-
|
|
23602
|
-
|
|
23603
|
-
|
|
23604
|
-
|
|
23605
|
-
|
|
23606
|
-
|
|
23607
|
-
|
|
23608
|
-
|
|
23609
|
-
|
|
23610
|
-
|
|
23611
|
-
|
|
23612
|
-
|
|
23613
|
-
|
|
23614
|
-
|
|
23615
|
-
|
|
23603
|
+
const contentVersion = contentVersionGenerator.generate();
|
|
23604
|
+
contentVersionMap.set(urlInfo.url, contentVersion);
|
|
23605
|
+
const versionMutations = [];
|
|
23606
|
+
const seen = new Set();
|
|
23607
|
+
const visitReferences = urlInfo => {
|
|
23608
|
+
urlInfo.references.forEach(reference => {
|
|
23609
|
+
if (seen.has(reference)) return;
|
|
23610
|
+
seen.add(reference);
|
|
23611
|
+
const referencedUrlInfo = finalGraph.getUrlInfo(reference.url);
|
|
23612
|
+
versionMutations.push(() => {
|
|
23613
|
+
const dependencyContentVersion = contentVersionMap.get(reference.url);
|
|
23614
|
+
if (!dependencyContentVersion) {
|
|
23615
|
+
// no content generated for this dependency
|
|
23616
|
+
// (inline, data:, sourcemap, shouldHandle is false, ...)
|
|
23617
|
+
return null;
|
|
23618
|
+
}
|
|
23619
|
+
const parentUrlInfo = finalGraph.getUrlInfo(reference.parentUrl);
|
|
23620
|
+
if (parentUrlInfo.jsQuote) {
|
|
23621
|
+
// __v__() makes versioning dynamic: no need to take into account
|
|
23622
|
+
return null;
|
|
23623
|
+
}
|
|
23624
|
+
if (reference.type === "js_url_specifier" || reference.subtype === "import_dynamic") {
|
|
23625
|
+
// __v__() makes versioning dynamic: no need to take into account
|
|
23626
|
+
return null;
|
|
23627
|
+
}
|
|
23628
|
+
return dependencyContentVersion;
|
|
23629
|
+
});
|
|
23630
|
+
visitReferences(referencedUrlInfo);
|
|
23631
|
+
});
|
|
23632
|
+
};
|
|
23633
|
+
visitReferences(urlInfo);
|
|
23634
|
+
hashCallbacks.push(() => {
|
|
23635
|
+
let version;
|
|
23636
|
+
if (versionMutations.length === 0) {
|
|
23637
|
+
version = contentVersion;
|
|
23616
23638
|
} else {
|
|
23617
|
-
|
|
23618
|
-
|
|
23619
|
-
|
|
23620
|
-
|
|
23621
|
-
|
|
23622
|
-
|
|
23623
|
-
|
|
23624
|
-
lineBreakNormalization
|
|
23639
|
+
const versionGenerator = createVersionGenerator();
|
|
23640
|
+
versionGenerator.augment(contentVersion);
|
|
23641
|
+
versionMutations.forEach(versionMutation => {
|
|
23642
|
+
const value = versionMutation();
|
|
23643
|
+
if (value) {
|
|
23644
|
+
versionGenerator.augment(value);
|
|
23645
|
+
}
|
|
23625
23646
|
});
|
|
23647
|
+
version = versionGenerator.generate();
|
|
23626
23648
|
}
|
|
23649
|
+
versionMap.set(urlInfo.url, version);
|
|
23650
|
+
const buildUrlObject = new URL(urlInfo.url);
|
|
23651
|
+
// remove ?as_js_classic as
|
|
23652
|
+
// this information is already hold into ".nomodule"
|
|
23653
|
+
buildUrlObject.searchParams.delete("as_js_classic");
|
|
23654
|
+
buildUrlObject.searchParams.delete("as_js_classic_library");
|
|
23655
|
+
buildUrlObject.searchParams.delete("as_json_module");
|
|
23656
|
+
buildUrlObject.searchParams.delete("as_css_module");
|
|
23657
|
+
buildUrlObject.searchParams.delete("as_text_module");
|
|
23658
|
+
const buildUrl = buildUrlObject.href;
|
|
23659
|
+
finalRedirections.set(urlInfo.url, buildUrl);
|
|
23660
|
+
versionedUrlMap.set(urlInfo.url, normalizeUrl(injectVersionIntoBuildUrl({
|
|
23661
|
+
buildUrl,
|
|
23662
|
+
version,
|
|
23663
|
+
versioningMethod
|
|
23664
|
+
})));
|
|
23627
23665
|
});
|
|
23628
|
-
|
|
23629
|
-
|
|
23630
|
-
|
|
23631
|
-
// this information is already hold into ".nomodule"
|
|
23632
|
-
buildUrlObject.searchParams.delete("as_js_classic");
|
|
23633
|
-
buildUrlObject.searchParams.delete("as_js_classic_library");
|
|
23634
|
-
buildUrlObject.searchParams.delete("as_json_module");
|
|
23635
|
-
buildUrlObject.searchParams.delete("as_css_module");
|
|
23636
|
-
buildUrlObject.searchParams.delete("as_text_module");
|
|
23637
|
-
const buildUrl = buildUrlObject.href;
|
|
23638
|
-
finalRedirections.set(urlInfo.url, buildUrl);
|
|
23639
|
-
urlInfo.data.versionedUrl = normalizeUrl(injectVersionIntoBuildUrl({
|
|
23640
|
-
buildUrl,
|
|
23641
|
-
version: urlInfo.data.version,
|
|
23642
|
-
versioningMethod
|
|
23643
|
-
}));
|
|
23666
|
+
});
|
|
23667
|
+
hashCallbacks.forEach(callback => {
|
|
23668
|
+
callback();
|
|
23644
23669
|
});
|
|
23645
23670
|
const versionMappings = {};
|
|
23646
23671
|
const usedVersionMappings = new Set();
|
|
@@ -23702,7 +23727,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23702
23727
|
if (!referencedUrlInfo.shouldHandle) {
|
|
23703
23728
|
return null;
|
|
23704
23729
|
}
|
|
23705
|
-
const versionedUrl =
|
|
23730
|
+
const versionedUrl = versionedUrlMap.get(reference.url);
|
|
23706
23731
|
if (!versionedUrl) {
|
|
23707
23732
|
// happens for sourcemap
|
|
23708
23733
|
return `${baseUrl}${urlToRelativeUrl(referencedUrlInfo.url, buildDirectoryUrl)}`;
|
|
@@ -23849,8 +23874,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23849
23874
|
const buildSpecifierBeforeRedirect = findKey(buildUrls, buildUrlFormatted);
|
|
23850
23875
|
mutations.push(() => {
|
|
23851
23876
|
setHtmlNodeAttributes(node, {
|
|
23852
|
-
href: buildSpecifierBeforeRedirect
|
|
23853
|
-
crossorigin: undefined
|
|
23877
|
+
href: buildSpecifierBeforeRedirect
|
|
23854
23878
|
});
|
|
23855
23879
|
});
|
|
23856
23880
|
};
|
|
@@ -23910,34 +23934,18 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23910
23934
|
if (!urlInfo.url.startsWith("file:")) {
|
|
23911
23935
|
return;
|
|
23912
23936
|
}
|
|
23913
|
-
|
|
23914
|
-
if (!versionedUrl) {
|
|
23937
|
+
if (!canUseVersionedUrl(urlInfo)) {
|
|
23915
23938
|
// when url is not versioned we compute a "version" for that url anyway
|
|
23916
23939
|
// so that service worker source still changes and navigator
|
|
23917
23940
|
// detect there is a change
|
|
23918
|
-
const versionGenerator = createVersionGenerator();
|
|
23919
|
-
versionGenerator.augmentWithContent({
|
|
23920
|
-
content: urlInfo.content,
|
|
23921
|
-
contentType: urlInfo.contentType,
|
|
23922
|
-
lineBreakNormalization
|
|
23923
|
-
});
|
|
23924
|
-
const version = versionGenerator.generate();
|
|
23925
|
-
urlInfo.data.version = version;
|
|
23926
|
-
const specifier = findKey(buildUrls, urlInfo.url);
|
|
23927
|
-
serviceWorkerUrls[specifier] = {
|
|
23928
|
-
versioned: false,
|
|
23929
|
-
version
|
|
23930
|
-
};
|
|
23931
|
-
return;
|
|
23932
|
-
}
|
|
23933
|
-
if (!canUseVersionedUrl(urlInfo)) {
|
|
23934
23941
|
const specifier = findKey(buildUrls, urlInfo.url);
|
|
23935
23942
|
serviceWorkerUrls[specifier] = {
|
|
23936
23943
|
versioned: false,
|
|
23937
|
-
version: urlInfo.
|
|
23944
|
+
version: versionMap.get(urlInfo.url)
|
|
23938
23945
|
};
|
|
23939
23946
|
return;
|
|
23940
23947
|
}
|
|
23948
|
+
const versionedUrl = versionedUrlMap.get(urlInfo.url);
|
|
23941
23949
|
const versionedSpecifier = findKey(buildUrls, versionedUrl);
|
|
23942
23950
|
serviceWorkerUrls[versionedSpecifier] = {
|
|
23943
23951
|
versioned: true
|
|
@@ -23981,7 +23989,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
23981
23989
|
const buildRelativeUrl = urlToRelativeUrl(urlInfo.url, buildDirectoryUrl);
|
|
23982
23990
|
buildInlineContents[buildRelativeUrl] = urlInfo.content;
|
|
23983
23991
|
} else {
|
|
23984
|
-
const versionedUrl = urlInfo.
|
|
23992
|
+
const versionedUrl = versionedUrlMap.get(urlInfo.url);
|
|
23985
23993
|
if (versionedUrl && canUseVersionedUrl(urlInfo)) {
|
|
23986
23994
|
const buildRelativeUrl = urlToRelativeUrl(urlInfo.url, buildDirectoryUrl);
|
|
23987
23995
|
const versionedBuildRelativeUrl = urlToRelativeUrl(versionedUrl, buildDirectoryUrl);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/core",
|
|
3
|
-
"version": "29.4.
|
|
3
|
+
"version": "29.4.4",
|
|
4
4
|
"description": "Tool to develop, test and build js projects",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"eslint": "npx eslint . --ext=.js,.mjs,.cjs,.html",
|
|
44
44
|
"dev": "node --conditions=development ./scripts/dev/dev.mjs",
|
|
45
45
|
"test": "node --conditions=development ./scripts/test/test.mjs",
|
|
46
|
+
"test:resource_hints": "npm run test -- --only-resource-hints",
|
|
46
47
|
"test:workspace": "npm run test --workspaces --if-present -- --workspace",
|
|
47
48
|
"build": "node --conditions=development ./scripts/build/build.mjs",
|
|
48
49
|
"workspace:versions": "node ./scripts/publish/workspace_versions.mjs",
|
package/src/build/build.js
CHANGED
|
@@ -50,7 +50,6 @@ import {
|
|
|
50
50
|
removeHtmlNode,
|
|
51
51
|
} from "@jsenv/ast"
|
|
52
52
|
|
|
53
|
-
import { sortByDependencies } from "../kitchen/url_graph/sort_by_dependencies.js"
|
|
54
53
|
import { createUrlGraph } from "../kitchen/url_graph.js"
|
|
55
54
|
import { createKitchen } from "../kitchen/kitchen.js"
|
|
56
55
|
import { createUrlGraphLoader } from "../kitchen/url_graph/url_graph_loader.js"
|
|
@@ -851,6 +850,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
851
850
|
}
|
|
852
851
|
}
|
|
853
852
|
|
|
853
|
+
const versionMap = new Map()
|
|
854
|
+
const versionedUrlMap = new Map()
|
|
854
855
|
refine: {
|
|
855
856
|
inject_version_in_urls: {
|
|
856
857
|
if (!versioning) {
|
|
@@ -860,12 +861,13 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
860
861
|
disabled: logger.levels.debug || !logger.levels.info,
|
|
861
862
|
})
|
|
862
863
|
try {
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
864
|
+
// see also https://github.com/rollup/rollup/pull/4543
|
|
865
|
+
const contentVersionMap = new Map()
|
|
866
|
+
const hashCallbacks = []
|
|
867
|
+
GRAPH.forEach(finalGraph, (urlInfo) => {
|
|
868
|
+
if (urlInfo.url.startsWith("data:")) {
|
|
866
869
|
return
|
|
867
870
|
}
|
|
868
|
-
const urlInfo = finalGraph.getUrlInfo(url)
|
|
869
871
|
if (urlInfo.type === "sourcemap") {
|
|
870
872
|
return
|
|
871
873
|
}
|
|
@@ -885,7 +887,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
885
887
|
if (!urlInfo.shouldHandle) {
|
|
886
888
|
return
|
|
887
889
|
}
|
|
888
|
-
if (
|
|
890
|
+
if (urlInfo.dependents.size === 0 && !urlInfo.isEntryPoint) {
|
|
889
891
|
return
|
|
890
892
|
}
|
|
891
893
|
const urlContent =
|
|
@@ -897,62 +899,93 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
897
899
|
{ cleanupJsenvAttributes: true },
|
|
898
900
|
)
|
|
899
901
|
: urlInfo.content
|
|
900
|
-
const
|
|
901
|
-
|
|
902
|
+
const contentVersionGenerator = createVersionGenerator()
|
|
903
|
+
contentVersionGenerator.augmentWithContent({
|
|
902
904
|
content: urlContent,
|
|
903
905
|
contentType: urlInfo.contentType,
|
|
904
906
|
lineBreakNormalization,
|
|
905
907
|
})
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
908
|
+
const contentVersion = contentVersionGenerator.generate()
|
|
909
|
+
contentVersionMap.set(urlInfo.url, contentVersion)
|
|
910
|
+
const versionMutations = []
|
|
911
|
+
const seen = new Set()
|
|
912
|
+
const visitReferences = (urlInfo) => {
|
|
913
|
+
urlInfo.references.forEach((reference) => {
|
|
914
|
+
if (seen.has(reference)) return
|
|
915
|
+
seen.add(reference)
|
|
916
|
+
const referencedUrlInfo = finalGraph.getUrlInfo(reference.url)
|
|
917
|
+
versionMutations.push(() => {
|
|
918
|
+
const dependencyContentVersion = contentVersionMap.get(
|
|
919
|
+
reference.url,
|
|
920
|
+
)
|
|
921
|
+
if (!dependencyContentVersion) {
|
|
922
|
+
// no content generated for this dependency
|
|
923
|
+
// (inline, data:, sourcemap, shouldHandle is false, ...)
|
|
924
|
+
return null
|
|
925
|
+
}
|
|
926
|
+
const parentUrlInfo = finalGraph.getUrlInfo(
|
|
927
|
+
reference.parentUrl,
|
|
928
|
+
)
|
|
929
|
+
if (parentUrlInfo.jsQuote) {
|
|
930
|
+
// __v__() makes versioning dynamic: no need to take into account
|
|
931
|
+
return null
|
|
932
|
+
}
|
|
933
|
+
if (
|
|
934
|
+
reference.type === "js_url_specifier" ||
|
|
935
|
+
reference.subtype === "import_dynamic"
|
|
936
|
+
) {
|
|
937
|
+
// __v__() makes versioning dynamic: no need to take into account
|
|
938
|
+
return null
|
|
939
|
+
}
|
|
940
|
+
return dependencyContentVersion
|
|
941
|
+
})
|
|
942
|
+
visitReferences(referencedUrlInfo)
|
|
943
|
+
})
|
|
944
|
+
}
|
|
945
|
+
visitReferences(urlInfo)
|
|
946
|
+
|
|
947
|
+
hashCallbacks.push(() => {
|
|
948
|
+
let version
|
|
949
|
+
if (versionMutations.length === 0) {
|
|
950
|
+
version = contentVersion
|
|
924
951
|
} else {
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
lineBreakNormalization,
|
|
952
|
+
const versionGenerator = createVersionGenerator()
|
|
953
|
+
versionGenerator.augment(contentVersion)
|
|
954
|
+
versionMutations.forEach((versionMutation) => {
|
|
955
|
+
const value = versionMutation()
|
|
956
|
+
if (value) {
|
|
957
|
+
versionGenerator.augment(value)
|
|
958
|
+
}
|
|
933
959
|
})
|
|
960
|
+
version = versionGenerator.generate()
|
|
934
961
|
}
|
|
962
|
+
versionMap.set(urlInfo.url, version)
|
|
963
|
+
const buildUrlObject = new URL(urlInfo.url)
|
|
964
|
+
// remove ?as_js_classic as
|
|
965
|
+
// this information is already hold into ".nomodule"
|
|
966
|
+
buildUrlObject.searchParams.delete("as_js_classic")
|
|
967
|
+
buildUrlObject.searchParams.delete("as_js_classic_library")
|
|
968
|
+
buildUrlObject.searchParams.delete("as_json_module")
|
|
969
|
+
buildUrlObject.searchParams.delete("as_css_module")
|
|
970
|
+
buildUrlObject.searchParams.delete("as_text_module")
|
|
971
|
+
const buildUrl = buildUrlObject.href
|
|
972
|
+
finalRedirections.set(urlInfo.url, buildUrl)
|
|
973
|
+
versionedUrlMap.set(
|
|
974
|
+
urlInfo.url,
|
|
975
|
+
normalizeUrl(
|
|
976
|
+
injectVersionIntoBuildUrl({
|
|
977
|
+
buildUrl,
|
|
978
|
+
version,
|
|
979
|
+
versioningMethod,
|
|
980
|
+
}),
|
|
981
|
+
),
|
|
982
|
+
)
|
|
935
983
|
})
|
|
936
|
-
urlInfo.data.version = versionGenerator.generate()
|
|
937
|
-
|
|
938
|
-
const buildUrlObject = new URL(urlInfo.url)
|
|
939
|
-
// remove ?as_js_classic as
|
|
940
|
-
// this information is already hold into ".nomodule"
|
|
941
|
-
buildUrlObject.searchParams.delete("as_js_classic")
|
|
942
|
-
buildUrlObject.searchParams.delete("as_js_classic_library")
|
|
943
|
-
buildUrlObject.searchParams.delete("as_json_module")
|
|
944
|
-
buildUrlObject.searchParams.delete("as_css_module")
|
|
945
|
-
buildUrlObject.searchParams.delete("as_text_module")
|
|
946
|
-
const buildUrl = buildUrlObject.href
|
|
947
|
-
finalRedirections.set(urlInfo.url, buildUrl)
|
|
948
|
-
urlInfo.data.versionedUrl = normalizeUrl(
|
|
949
|
-
injectVersionIntoBuildUrl({
|
|
950
|
-
buildUrl,
|
|
951
|
-
version: urlInfo.data.version,
|
|
952
|
-
versioningMethod,
|
|
953
|
-
}),
|
|
954
|
-
)
|
|
955
984
|
})
|
|
985
|
+
hashCallbacks.forEach((callback) => {
|
|
986
|
+
callback()
|
|
987
|
+
})
|
|
988
|
+
|
|
956
989
|
const versionMappings = {}
|
|
957
990
|
const usedVersionMappings = new Set()
|
|
958
991
|
const versioningKitchen = createKitchen({
|
|
@@ -1019,7 +1052,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
1019
1052
|
if (!referencedUrlInfo.shouldHandle) {
|
|
1020
1053
|
return null
|
|
1021
1054
|
}
|
|
1022
|
-
const versionedUrl =
|
|
1055
|
+
const versionedUrl = versionedUrlMap.get(reference.url)
|
|
1023
1056
|
if (!versionedUrl) {
|
|
1024
1057
|
// happens for sourcemap
|
|
1025
1058
|
return `${baseUrl}${urlToRelativeUrl(
|
|
@@ -1212,7 +1245,6 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
1212
1245
|
mutations.push(() => {
|
|
1213
1246
|
setHtmlNodeAttributes(node, {
|
|
1214
1247
|
href: buildSpecifierBeforeRedirect,
|
|
1215
|
-
crossorigin: undefined,
|
|
1216
1248
|
})
|
|
1217
1249
|
})
|
|
1218
1250
|
}
|
|
@@ -1285,31 +1317,18 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
1285
1317
|
if (!urlInfo.url.startsWith("file:")) {
|
|
1286
1318
|
return
|
|
1287
1319
|
}
|
|
1288
|
-
|
|
1289
|
-
if (!versionedUrl) {
|
|
1320
|
+
if (!canUseVersionedUrl(urlInfo)) {
|
|
1290
1321
|
// when url is not versioned we compute a "version" for that url anyway
|
|
1291
1322
|
// so that service worker source still changes and navigator
|
|
1292
1323
|
// detect there is a change
|
|
1293
|
-
const versionGenerator = createVersionGenerator()
|
|
1294
|
-
versionGenerator.augmentWithContent({
|
|
1295
|
-
content: urlInfo.content,
|
|
1296
|
-
contentType: urlInfo.contentType,
|
|
1297
|
-
lineBreakNormalization,
|
|
1298
|
-
})
|
|
1299
|
-
const version = versionGenerator.generate()
|
|
1300
|
-
urlInfo.data.version = version
|
|
1301
|
-
const specifier = findKey(buildUrls, urlInfo.url)
|
|
1302
|
-
serviceWorkerUrls[specifier] = { versioned: false, version }
|
|
1303
|
-
return
|
|
1304
|
-
}
|
|
1305
|
-
if (!canUseVersionedUrl(urlInfo)) {
|
|
1306
1324
|
const specifier = findKey(buildUrls, urlInfo.url)
|
|
1307
1325
|
serviceWorkerUrls[specifier] = {
|
|
1308
1326
|
versioned: false,
|
|
1309
|
-
version: urlInfo.
|
|
1327
|
+
version: versionMap.get(urlInfo.url),
|
|
1310
1328
|
}
|
|
1311
1329
|
return
|
|
1312
1330
|
}
|
|
1331
|
+
const versionedUrl = versionedUrlMap.get(urlInfo.url)
|
|
1313
1332
|
const versionedSpecifier = findKey(buildUrls, versionedUrl)
|
|
1314
1333
|
serviceWorkerUrls[versionedSpecifier] = { versioned: true }
|
|
1315
1334
|
})
|
|
@@ -1366,7 +1385,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
|
|
|
1366
1385
|
)
|
|
1367
1386
|
buildInlineContents[buildRelativeUrl] = urlInfo.content
|
|
1368
1387
|
} else {
|
|
1369
|
-
const versionedUrl = urlInfo.
|
|
1388
|
+
const versionedUrl = versionedUrlMap.get(urlInfo.url)
|
|
1370
1389
|
if (versionedUrl && canUseVersionedUrl(urlInfo)) {
|
|
1371
1390
|
const buildRelativeUrl = urlToRelativeUrl(
|
|
1372
1391
|
urlInfo.url,
|
|
@@ -7,25 +7,21 @@ import { CONTENT_TYPE } from "@jsenv/utils/src/content_type/content_type.js"
|
|
|
7
7
|
export const createVersionGenerator = () => {
|
|
8
8
|
const hash = createHash("sha256")
|
|
9
9
|
|
|
10
|
-
const augmentWithContent = ({
|
|
11
|
-
content,
|
|
12
|
-
contentType = "application/octet-stream",
|
|
13
|
-
lineBreakNormalization = false,
|
|
14
|
-
}) => {
|
|
15
|
-
hash.update(
|
|
16
|
-
lineBreakNormalization && CONTENT_TYPE.isTextual(contentType)
|
|
17
|
-
? normalizeLineBreaks(content)
|
|
18
|
-
: content,
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const augmentWithDependencyVersion = (version) => {
|
|
23
|
-
hash.update(version)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
10
|
return {
|
|
27
|
-
augmentWithContent
|
|
28
|
-
|
|
11
|
+
augmentWithContent: ({
|
|
12
|
+
content,
|
|
13
|
+
contentType = "application/octet-stream",
|
|
14
|
+
lineBreakNormalization = false,
|
|
15
|
+
}) => {
|
|
16
|
+
hash.update(
|
|
17
|
+
lineBreakNormalization && CONTENT_TYPE.isTextual(contentType)
|
|
18
|
+
? normalizeLineBreaks(content)
|
|
19
|
+
: content,
|
|
20
|
+
)
|
|
21
|
+
},
|
|
22
|
+
augment: (value) => {
|
|
23
|
+
hash.update(value)
|
|
24
|
+
},
|
|
29
25
|
generate: () => {
|
|
30
26
|
return hash.digest("hex").slice(0, 8)
|
|
31
27
|
},
|
|
@@ -9,8 +9,9 @@ export const sortByDependencies = (nodes) => {
|
|
|
9
9
|
}
|
|
10
10
|
const isVisited = visited.includes(url)
|
|
11
11
|
if (isVisited) {
|
|
12
|
-
circular.
|
|
13
|
-
|
|
12
|
+
if (!circular.includes(url)) {
|
|
13
|
+
circular.push(url)
|
|
14
|
+
}
|
|
14
15
|
} else {
|
|
15
16
|
visited.push(url)
|
|
16
17
|
nodes[url].dependencies.forEach((dependencyUrl) => {
|