@jsenv/core 30.3.0 → 30.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/dist/main.js CHANGED
@@ -16,7 +16,7 @@ import { Readable, Stream, Writable } from "node:stream";
16
16
  import { Http2ServerResponse } from "node:http2";
17
17
  import { lookup } from "node:dns";
18
18
  import { SOURCEMAP, generateSourcemapFileUrl, composeTwoSourcemaps, generateSourcemapDataUrl, createMagicSource, getOriginalPosition } from "@jsenv/sourcemap";
19
- import { parseHtmlString, stringifyHtmlAst, getHtmlNodeAttribute, visitHtmlNodes, analyzeScriptNode, setHtmlNodeAttributes, parseSrcSet, getHtmlNodePosition, getHtmlNodeAttributePosition, applyPostCss, postCssPluginUrlVisitor, parseJsUrls, getHtmlNodeText, setHtmlNodeText, applyBabelPlugins, injectScriptNodeAsEarlyAsPossible, createHtmlNode, findHtmlNode, removeHtmlNode, removeHtmlNodeText, injectJsImport, analyzeLinkNode, injectHtmlNode, insertHtmlNodeAfter } from "@jsenv/ast";
19
+ import { parseHtmlString, stringifyHtmlAst, getHtmlNodeAttribute, visitHtmlNodes, analyzeScriptNode, setHtmlNodeAttributes, parseSrcSet, getHtmlNodePosition, getHtmlNodeAttributePosition, parseCssUrls, parseJsUrls, getHtmlNodeText, setHtmlNodeText, applyBabelPlugins, injectScriptNodeAsEarlyAsPossible, createHtmlNode, findHtmlNode, removeHtmlNode, removeHtmlNodeText, injectJsImport, analyzeLinkNode, injectHtmlNode, insertHtmlNodeAfter } from "@jsenv/ast";
20
20
  import { createRequire } from "node:module";
21
21
  import babelParser from "@babel/parser";
22
22
  import { bundleJsModules } from "@jsenv/plugin-bundling";
@@ -9668,21 +9668,22 @@ const parseAndTransformHtmlUrls = async (urlInfo, context) => {
9668
9668
  url,
9669
9669
  htmlAst
9670
9670
  });
9671
- const actions = [];
9672
9671
  const mutations = [];
9673
- mentions.forEach(({
9674
- type,
9675
- subtype,
9676
- expectedType,
9677
- line,
9678
- column,
9679
- originalLine,
9680
- originalColumn,
9681
- node,
9682
- attributeName,
9683
- debug,
9684
- specifier
9685
- }) => {
9672
+ const actions = [];
9673
+ for (const mention of mentions) {
9674
+ const {
9675
+ type,
9676
+ subtype,
9677
+ expectedType,
9678
+ line,
9679
+ column,
9680
+ originalLine,
9681
+ originalColumn,
9682
+ node,
9683
+ attributeName,
9684
+ debug,
9685
+ specifier
9686
+ } = mention;
9686
9687
  const {
9687
9688
  crossorigin,
9688
9689
  integrity
@@ -9704,13 +9705,13 @@ const parseAndTransformHtmlUrls = async (urlInfo, context) => {
9704
9705
  });
9705
9706
  actions.push(async () => {
9706
9707
  await context.referenceUtils.readGeneratedSpecifier(reference);
9707
- });
9708
- mutations.push(() => {
9709
- setHtmlNodeAttributes(node, {
9710
- [attributeName]: reference.generatedSpecifier
9708
+ mutations.push(() => {
9709
+ setHtmlNodeAttributes(node, {
9710
+ [attributeName]: reference.generatedSpecifier
9711
+ });
9711
9712
  });
9712
9713
  });
9713
- });
9714
+ }
9714
9715
  if (actions.length > 0) {
9715
9716
  await Promise.all(actions.map(action => action()));
9716
9717
  }
@@ -9958,40 +9959,33 @@ const decideLinkExpectedType = (linkMention, mentions) => {
9958
9959
  * https://github.com/parcel-bundler/parcel/blob/v2/packages/transformers/css/src/CSSTransformer.js
9959
9960
  */
9960
9961
  const parseAndTransformCssUrls = async (urlInfo, context) => {
9962
+ const cssUrls = await parseCssUrls({
9963
+ css: urlInfo.content,
9964
+ url: urlInfo.originalUrl
9965
+ });
9961
9966
  const actions = [];
9962
9967
  const magicSource = createMagicSource(urlInfo.content);
9963
- await applyPostCss({
9964
- sourcemaps: false,
9965
- plugins: [postCssPluginUrlVisitor({
9966
- urlVisitor: ({
9967
- type,
9968
- specifier,
9969
- specifierStart,
9970
- specifierEnd,
9971
- specifierLine,
9972
- specifierColumn
9973
- }) => {
9974
- const [reference] = context.referenceUtils.found({
9975
- type: `css_${type}`,
9976
- specifier,
9977
- specifierStart,
9978
- specifierEnd,
9979
- specifierLine,
9980
- specifierColumn
9981
- });
9982
- actions.push(async () => {
9983
- magicSource.replace({
9984
- start: specifierStart,
9985
- end: specifierEnd,
9986
- replacement: await context.referenceUtils.readGeneratedSpecifier(reference)
9987
- });
9988
- });
9989
- }
9990
- })],
9991
- url: urlInfo.originalUrl,
9992
- content: urlInfo.content
9993
- });
9994
- await Promise.all(actions.map(action => action()));
9968
+ for (const cssUrl of cssUrls) {
9969
+ const [reference] = context.referenceUtils.found({
9970
+ type: cssUrl.type,
9971
+ specifier: cssUrl.specifier,
9972
+ specifierStart: cssUrl.start,
9973
+ specifierEnd: cssUrl.end,
9974
+ specifierLine: cssUrl.line,
9975
+ specifierColumn: cssUrl.column
9976
+ });
9977
+ actions.push(async () => {
9978
+ const replacement = await context.referenceUtils.readGeneratedSpecifier(reference);
9979
+ magicSource.replace({
9980
+ start: cssUrl.start,
9981
+ end: cssUrl.end,
9982
+ replacement
9983
+ });
9984
+ });
9985
+ }
9986
+ if (actions.length > 0) {
9987
+ await Promise.all(actions.map(action => action()));
9988
+ }
9995
9989
  return magicSource.toContentAndSourcemap();
9996
9990
  };
9997
9991
 
@@ -10004,7 +9998,7 @@ const parseAndTransformJsUrls = async (urlInfo, context) => {
10004
9998
  });
10005
9999
  const actions = [];
10006
10000
  const magicSource = createMagicSource(urlInfo.content);
10007
- jsMentions.forEach(jsMention => {
10001
+ for (const jsMention of jsMentions) {
10008
10002
  if (jsMention.subtype === "import_static" || jsMention.subtype === "import_dynamic") {
10009
10003
  urlInfo.data.usesImport = true;
10010
10004
  }
@@ -10015,10 +10009,10 @@ const parseAndTransformJsUrls = async (urlInfo, context) => {
10015
10009
  expectedType: jsMention.expectedType,
10016
10010
  expectedSubtype: jsMention.expectedSubtype || urlInfo.subtype,
10017
10011
  specifier: jsMention.specifier,
10018
- specifierStart: jsMention.specifierStart,
10019
- specifierEnd: jsMention.specifierEnd,
10020
- specifierLine: jsMention.specifierLine,
10021
- specifierColumn: jsMention.specifierColumn,
10012
+ specifierStart: jsMention.start,
10013
+ specifierEnd: jsMention.end,
10014
+ specifierLine: jsMention.line,
10015
+ specifierColumn: jsMention.column,
10022
10016
  data: jsMention.data,
10023
10017
  baseUrl: {
10024
10018
  "StringLiteral": jsMention.baseUrl,
@@ -10035,16 +10029,18 @@ const parseAndTransformJsUrls = async (urlInfo, context) => {
10035
10029
  actions.push(async () => {
10036
10030
  const replacement = await context.referenceUtils.readGeneratedSpecifier(reference);
10037
10031
  magicSource.replace({
10038
- start: jsMention.specifierStart,
10039
- end: jsMention.specifierEnd,
10032
+ start: jsMention.start,
10033
+ end: jsMention.end,
10040
10034
  replacement
10041
10035
  });
10042
10036
  if (reference.mutation) {
10043
10037
  reference.mutation(magicSource);
10044
10038
  }
10045
10039
  });
10046
- });
10047
- await Promise.all(actions.map(action => action()));
10040
+ }
10041
+ if (actions.length > 0) {
10042
+ await Promise.all(actions.map(action => action()));
10043
+ }
10048
10044
  const {
10049
10045
  content,
10050
10046
  sourcemap
@@ -21209,10 +21205,25 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21209
21205
  disabled: logger.levels.debug || !logger.levels.info
21210
21206
  });
21211
21207
  try {
21212
- const canUseImportmap = finalEntryUrls.every(finalEntryUrl => {
21208
+ const canUseImportmap = versioningViaImportmap && finalEntryUrls.every(finalEntryUrl => {
21213
21209
  const finalEntryUrlInfo = finalGraph.getUrlInfo(finalEntryUrl);
21214
21210
  return finalEntryUrlInfo.type === "html";
21215
21211
  }) && finalGraphKitchen.kitchenContext.isSupportedOnCurrentClients("importmap");
21212
+ const workerReferenceSet = new Set();
21213
+ const isReferencedByWorker = (reference, graph) => {
21214
+ if (workerReferenceSet.has(reference)) {
21215
+ return true;
21216
+ }
21217
+ const urlInfo = graph.getUrlInfo(reference.url);
21218
+ const dependentWorker = graph.findDependent(urlInfo, dependentUrlInfo => {
21219
+ return isWebWorkerUrlInfo(dependentUrlInfo);
21220
+ });
21221
+ if (dependentWorker) {
21222
+ workerReferenceSet.add(reference);
21223
+ return true;
21224
+ }
21225
+ return Boolean(dependentWorker);
21226
+ };
21216
21227
  const preferWithoutVersioning = reference => {
21217
21228
  const parentUrlInfo = finalGraph.getUrlInfo(reference.parentUrl);
21218
21229
  if (parentUrlInfo.jsQuote) {
@@ -21471,6 +21482,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21471
21482
  });
21472
21483
  });
21473
21484
  await versioningUrlGraphLoader.getAllLoadDonePromise(buildOperation);
21485
+ workerReferenceSet.clear();
21474
21486
  const actions = [];
21475
21487
  const visitors = [];
21476
21488
  if (versionMappingsOnImportmap.size) {
@@ -21719,6 +21731,9 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21719
21731
  const getBuildRelativeUrl = url => {
21720
21732
  const urlObject = new URL(url);
21721
21733
  urlObject.searchParams.delete("as_js_classic");
21734
+ urlObject.searchParams.delete("as_css_module");
21735
+ urlObject.searchParams.delete("as_json_module");
21736
+ urlObject.searchParams.delete("as_text_module");
21722
21737
  url = urlObject.href;
21723
21738
  const buildRelativeUrl = urlToRelativeUrl(url, buildDirectoryUrl);
21724
21739
  return buildRelativeUrl;
@@ -21942,13 +21957,6 @@ const canUseVersionedUrl = urlInfo => {
21942
21957
  }
21943
21958
  return urlInfo.type !== "webmanifest";
21944
21959
  };
21945
- const isReferencedByWorker = (reference, graph) => {
21946
- const urlInfo = graph.getUrlInfo(reference.url);
21947
- const dependentWorker = graph.findDependent(urlInfo, dependentUrlInfo => {
21948
- return isWebWorkerUrlInfo(dependentUrlInfo);
21949
- });
21950
- return Boolean(dependentWorker);
21951
- };
21952
21960
 
21953
21961
  // https://nodejs.org/api/worker_threads.html
21954
21962
  const createReloadableWorker = (workerFileUrl, options = {}) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "30.3.0",
3
+ "version": "30.3.2",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -67,7 +67,7 @@
67
67
  "@c88/v8-coverage": "0.1.1",
68
68
  "@financial-times/polyfill-useragent-normaliser": "1.10.2",
69
69
  "@jsenv/abort": "4.2.4",
70
- "@jsenv/ast": "2.0.1",
70
+ "@jsenv/ast": "3.0.0",
71
71
  "@jsenv/babel-plugins": "1.1.2",
72
72
  "@jsenv/plugin-bundling": "1.1.1",
73
73
  "@jsenv/filesystem": "4.1.9",
@@ -100,18 +100,18 @@
100
100
  "@babel/plugin-syntax-import-assertions": "7.20.0",
101
101
  "@jsenv/assert": "./packages/assert/",
102
102
  "@jsenv/eslint-config": "./packages/eslint-config/",
103
- "@jsenv/file-size-impact": "13.0.2",
104
- "@jsenv/https-local": "3.0.5",
103
+ "@jsenv/file-size-impact": "14.0.0",
104
+ "@jsenv/https-local": "3.0.6",
105
105
  "@jsenv/package-workspace": "0.5.1",
106
106
  "@jsenv/plugin-minification": "./packages/jsenv-plugin-minification/",
107
107
  "@jsenv/plugin-globals": "./packages/jsenv-plugin-globals/",
108
108
  "@jsenv/plugin-placeholders": "./packages/jsenv-plugin-placeholders/",
109
109
  "@jsenv/performance-impact": "4.1.0",
110
- "eslint": "8.31.0",
110
+ "eslint": "8.32.0",
111
111
  "eslint-plugin-html": "7.1.0",
112
- "eslint-plugin-import": "2.26.0",
113
- "eslint-plugin-react": "7.31.11",
112
+ "eslint-plugin-import": "2.27.5",
113
+ "eslint-plugin-react": "7.32.1",
114
114
  "playwright": "1.29.2",
115
- "prettier": "2.8.2"
115
+ "prettier": "2.8.3"
116
116
  }
117
117
  }
@@ -910,6 +910,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
910
910
  })
911
911
  try {
912
912
  const canUseImportmap =
913
+ versioningViaImportmap &&
913
914
  finalEntryUrls.every((finalEntryUrl) => {
914
915
  const finalEntryUrlInfo = finalGraph.getUrlInfo(finalEntryUrl)
915
916
  return finalEntryUrlInfo.type === "html"
@@ -917,6 +918,24 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
917
918
  finalGraphKitchen.kitchenContext.isSupportedOnCurrentClients(
918
919
  "importmap",
919
920
  )
921
+ const workerReferenceSet = new Set()
922
+ const isReferencedByWorker = (reference, graph) => {
923
+ if (workerReferenceSet.has(reference)) {
924
+ return true
925
+ }
926
+ const urlInfo = graph.getUrlInfo(reference.url)
927
+ const dependentWorker = graph.findDependent(
928
+ urlInfo,
929
+ (dependentUrlInfo) => {
930
+ return isWebWorkerUrlInfo(dependentUrlInfo)
931
+ },
932
+ )
933
+ if (dependentWorker) {
934
+ workerReferenceSet.add(reference)
935
+ return true
936
+ }
937
+ return Boolean(dependentWorker)
938
+ }
920
939
  const preferWithoutVersioning = (reference) => {
921
940
  const parentUrlInfo = finalGraph.getUrlInfo(reference.parentUrl)
922
941
  if (parentUrlInfo.jsQuote) {
@@ -1221,6 +1240,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1221
1240
  })
1222
1241
  })
1223
1242
  await versioningUrlGraphLoader.getAllLoadDonePromise(buildOperation)
1243
+ workerReferenceSet.clear()
1224
1244
  const actions = []
1225
1245
  const visitors = []
1226
1246
  if (versionMappingsOnImportmap.size) {
@@ -1519,6 +1539,9 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1519
1539
  const getBuildRelativeUrl = (url) => {
1520
1540
  const urlObject = new URL(url)
1521
1541
  urlObject.searchParams.delete("as_js_classic")
1542
+ urlObject.searchParams.delete("as_css_module")
1543
+ urlObject.searchParams.delete("as_json_module")
1544
+ urlObject.searchParams.delete("as_text_module")
1522
1545
  url = urlObject.href
1523
1546
  const buildRelativeUrl = urlToRelativeUrl(url, buildDirectoryUrl)
1524
1547
  return buildRelativeUrl
@@ -1737,11 +1760,3 @@ const canUseVersionedUrl = (urlInfo) => {
1737
1760
  }
1738
1761
  return urlInfo.type !== "webmanifest"
1739
1762
  }
1740
-
1741
- const isReferencedByWorker = (reference, graph) => {
1742
- const urlInfo = graph.getUrlInfo(reference.url)
1743
- const dependentWorker = graph.findDependent(urlInfo, (dependentUrlInfo) => {
1744
- return isWebWorkerUrlInfo(dependentUrlInfo)
1745
- })
1746
- return Boolean(dependentWorker)
1747
- }
@@ -2,47 +2,38 @@
2
2
  * https://github.com/parcel-bundler/parcel/blob/v2/packages/transformers/css/src/CSSTransformer.js
3
3
  */
4
4
 
5
+ import { parseCssUrls } from "@jsenv/ast"
5
6
  import { createMagicSource } from "@jsenv/sourcemap"
6
- import { applyPostCss, postCssPluginUrlVisitor } from "@jsenv/ast"
7
7
 
8
8
  export const parseAndTransformCssUrls = async (urlInfo, context) => {
9
- const actions = []
10
- const magicSource = createMagicSource(urlInfo.content)
11
- await applyPostCss({
12
- sourcemaps: false,
13
- plugins: [
14
- postCssPluginUrlVisitor({
15
- urlVisitor: ({
16
- type,
17
- specifier,
18
- specifierStart,
19
- specifierEnd,
20
- specifierLine,
21
- specifierColumn,
22
- }) => {
23
- const [reference] = context.referenceUtils.found({
24
- type: `css_${type}`,
25
- specifier,
26
- specifierStart,
27
- specifierEnd,
28
- specifierLine,
29
- specifierColumn,
30
- })
31
- actions.push(async () => {
32
- magicSource.replace({
33
- start: specifierStart,
34
- end: specifierEnd,
35
- replacement: await context.referenceUtils.readGeneratedSpecifier(
36
- reference,
37
- ),
38
- })
39
- })
40
- },
41
- }),
42
- ],
9
+ const cssUrls = await parseCssUrls({
10
+ css: urlInfo.content,
43
11
  url: urlInfo.originalUrl,
44
- content: urlInfo.content,
45
12
  })
46
- await Promise.all(actions.map((action) => action()))
13
+ const actions = []
14
+ const magicSource = createMagicSource(urlInfo.content)
15
+ for (const cssUrl of cssUrls) {
16
+ const [reference] = context.referenceUtils.found({
17
+ type: cssUrl.type,
18
+ specifier: cssUrl.specifier,
19
+ specifierStart: cssUrl.start,
20
+ specifierEnd: cssUrl.end,
21
+ specifierLine: cssUrl.line,
22
+ specifierColumn: cssUrl.column,
23
+ })
24
+ actions.push(async () => {
25
+ const replacement = await context.referenceUtils.readGeneratedSpecifier(
26
+ reference,
27
+ )
28
+ magicSource.replace({
29
+ start: cssUrl.start,
30
+ end: cssUrl.end,
31
+ replacement,
32
+ })
33
+ })
34
+ }
35
+ if (actions.length > 0) {
36
+ await Promise.all(actions.map((action) => action()))
37
+ }
47
38
  return magicSource.toContentAndSourcemap()
48
39
  }
@@ -20,10 +20,10 @@ export const parseAndTransformHtmlUrls = async (urlInfo, context) => {
20
20
  url,
21
21
  htmlAst,
22
22
  })
23
- const actions = []
24
23
  const mutations = []
25
- mentions.forEach(
26
- ({
24
+ const actions = []
25
+ for (const mention of mentions) {
26
+ const {
27
27
  type,
28
28
  subtype,
29
29
  expectedType,
@@ -35,39 +35,38 @@ export const parseAndTransformHtmlUrls = async (urlInfo, context) => {
35
35
  attributeName,
36
36
  debug,
37
37
  specifier,
38
- }) => {
39
- const { crossorigin, integrity } = readFetchMetas(node)
40
- const isResourceHint = [
41
- "preconnect",
42
- "dns-prefetch",
43
- "prefetch",
44
- "preload",
45
- "modulepreload",
46
- ].includes(subtype)
47
- const [reference] = context.referenceUtils.found({
48
- type,
49
- subtype,
50
- expectedType,
51
- originalLine,
52
- originalColumn,
53
- specifier,
54
- specifierLine: line,
55
- specifierColumn: column,
56
- isResourceHint,
57
- crossorigin,
58
- integrity,
59
- debug,
60
- })
61
- actions.push(async () => {
62
- await context.referenceUtils.readGeneratedSpecifier(reference)
63
- })
38
+ } = mention
39
+ const { crossorigin, integrity } = readFetchMetas(node)
40
+ const isResourceHint = [
41
+ "preconnect",
42
+ "dns-prefetch",
43
+ "prefetch",
44
+ "preload",
45
+ "modulepreload",
46
+ ].includes(subtype)
47
+ const [reference] = context.referenceUtils.found({
48
+ type,
49
+ subtype,
50
+ expectedType,
51
+ originalLine,
52
+ originalColumn,
53
+ specifier,
54
+ specifierLine: line,
55
+ specifierColumn: column,
56
+ isResourceHint,
57
+ crossorigin,
58
+ integrity,
59
+ debug,
60
+ })
61
+ actions.push(async () => {
62
+ await context.referenceUtils.readGeneratedSpecifier(reference)
64
63
  mutations.push(() => {
65
64
  setHtmlNodeAttributes(node, {
66
65
  [attributeName]: reference.generatedSpecifier,
67
66
  })
68
67
  })
69
- },
70
- )
68
+ })
69
+ }
71
70
  if (actions.length > 0) {
72
71
  await Promise.all(actions.map((action) => action()))
73
72
  }
@@ -12,7 +12,7 @@ export const parseAndTransformJsUrls = async (urlInfo, context) => {
12
12
  })
13
13
  const actions = []
14
14
  const magicSource = createMagicSource(urlInfo.content)
15
- jsMentions.forEach((jsMention) => {
15
+ for (const jsMention of jsMentions) {
16
16
  if (
17
17
  jsMention.subtype === "import_static" ||
18
18
  jsMention.subtype === "import_dynamic"
@@ -26,10 +26,10 @@ export const parseAndTransformJsUrls = async (urlInfo, context) => {
26
26
  expectedType: jsMention.expectedType,
27
27
  expectedSubtype: jsMention.expectedSubtype || urlInfo.subtype,
28
28
  specifier: jsMention.specifier,
29
- specifierStart: jsMention.specifierStart,
30
- specifierEnd: jsMention.specifierEnd,
31
- specifierLine: jsMention.specifierLine,
32
- specifierColumn: jsMention.specifierColumn,
29
+ specifierStart: jsMention.start,
30
+ specifierEnd: jsMention.end,
31
+ specifierLine: jsMention.line,
32
+ specifierColumn: jsMention.column,
33
33
  data: jsMention.data,
34
34
  baseUrl: {
35
35
  "StringLiteral": jsMention.baseUrl,
@@ -48,16 +48,18 @@ export const parseAndTransformJsUrls = async (urlInfo, context) => {
48
48
  reference,
49
49
  )
50
50
  magicSource.replace({
51
- start: jsMention.specifierStart,
52
- end: jsMention.specifierEnd,
51
+ start: jsMention.start,
52
+ end: jsMention.end,
53
53
  replacement,
54
54
  })
55
55
  if (reference.mutation) {
56
56
  reference.mutation(magicSource)
57
57
  }
58
58
  })
59
- })
60
- await Promise.all(actions.map((action) => action()))
59
+ }
60
+ if (actions.length > 0) {
61
+ await Promise.all(actions.map((action) => action()))
62
+ }
61
63
  const { content, sourcemap } = magicSource.toContentAndSourcemap()
62
64
  return { content, sourcemap }
63
65
  }