@jsenv/core 39.1.2 → 39.2.0

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.
@@ -11558,6 +11558,7 @@ const createDependencies = (ownerUrlInfo) => {
11558
11558
  isOriginalPosition,
11559
11559
  specifierLine,
11560
11560
  specifierColumn,
11561
+ content,
11561
11562
  ...rest
11562
11563
  }) => {
11563
11564
  const parentUrl = isOriginalPosition
@@ -11578,6 +11579,7 @@ const createDependencies = (ownerUrlInfo) => {
11578
11579
  specifierLine,
11579
11580
  specifierColumn,
11580
11581
  isInline: true,
11582
+ content,
11581
11583
  ...rest,
11582
11584
  });
11583
11585
  return reference;
@@ -11905,6 +11907,12 @@ const createReference = ({
11905
11907
  ownerUrlInfo = reference.ownerUrlInfo,
11906
11908
  ...props
11907
11909
  }) => {
11910
+ const content =
11911
+ ownerUrlInfo === undefined
11912
+ ? isOriginalPosition
11913
+ ? reference.ownerUrlInfo.originalContent
11914
+ : reference.ownerUrlInfo.content
11915
+ : ownerUrlInfo.content;
11908
11916
  const trace = traceFromUrlSite({
11909
11917
  url:
11910
11918
  ownerUrlInfo === undefined
@@ -11912,12 +11920,7 @@ const createReference = ({
11912
11920
  ? reference.ownerUrlInfo.url
11913
11921
  : reference.ownerUrlInfo.generatedUrl
11914
11922
  : reference.ownerUrlInfo.url,
11915
- content:
11916
- ownerUrlInfo === undefined
11917
- ? isOriginalPosition
11918
- ? reference.ownerUrlInfo.originalContent
11919
- : reference.ownerUrlInfo.content
11920
- : ownerUrlInfo.content,
11923
+ content,
11921
11924
  line,
11922
11925
  column,
11923
11926
  });
@@ -12114,14 +12117,15 @@ const applyDependencyRemovalEffects = (reference) => {
12114
12117
  };
12115
12118
 
12116
12119
  const traceFromUrlSite = (urlSite) => {
12120
+ const codeFrame = urlSite.content
12121
+ ? generateContentFrame({
12122
+ content: urlSite.content,
12123
+ line: urlSite.line,
12124
+ column: urlSite.column,
12125
+ })
12126
+ : "";
12117
12127
  return {
12118
- codeFrame: urlSite.content
12119
- ? generateContentFrame({
12120
- content: urlSite.content,
12121
- line: urlSite.line,
12122
- column: urlSite.column,
12123
- })
12124
- : "",
12128
+ codeFrame,
12125
12129
  message: stringifyUrlSite(urlSite),
12126
12130
  url: urlSite.url,
12127
12131
  line: urlSite.line,
@@ -12131,7 +12135,7 @@ const traceFromUrlSite = (urlSite) => {
12131
12135
 
12132
12136
  const adjustUrlSite = (urlInfo, { url, line, column }) => {
12133
12137
  const isOriginal = url === urlInfo.url;
12134
- const adjust = (urlSite, urlInfo) => {
12138
+ const adjust = (urlInfo, urlSite) => {
12135
12139
  if (!urlSite.isOriginal) {
12136
12140
  return urlSite;
12137
12141
  }
@@ -12140,33 +12144,35 @@ const adjustUrlSite = (urlInfo, { url, line, column }) => {
12140
12144
  return urlSite;
12141
12145
  }
12142
12146
  const parentUrlInfo = urlInfo.graph.getUrlInfo(inlineUrlSite.url);
12143
- return adjust(
12144
- {
12145
- isOriginal: true,
12146
- url: inlineUrlSite.url,
12147
- content: inlineUrlSite.content,
12148
- line:
12149
- inlineUrlSite.line === undefined
12150
- ? urlSite.line
12151
- : inlineUrlSite.line + urlSite.line,
12152
- column:
12153
- inlineUrlSite.column === undefined
12154
- ? urlSite.column
12155
- : inlineUrlSite.column + urlSite.column,
12156
- },
12157
- parentUrlInfo,
12158
- );
12159
- };
12160
- return adjust(
12161
- {
12162
- isOriginal,
12163
- url,
12164
- content: isOriginal ? urlInfo.originalContent : urlInfo.content,
12147
+ line =
12148
+ inlineUrlSite.line === undefined
12149
+ ? urlSite.line
12150
+ : inlineUrlSite.line + urlSite.line;
12151
+ // we remove 1 to the line because imagine the following html:
12152
+ // <style>body { color: red; }</style>
12153
+ // -> content starts same line as <style> (same for <script>)
12154
+ if (urlInfo.content[0] === "\n") {
12155
+ line = line - 1;
12156
+ }
12157
+ column =
12158
+ inlineUrlSite.column === undefined
12159
+ ? urlSite.column
12160
+ : inlineUrlSite.column + urlSite.column;
12161
+ return adjust(parentUrlInfo, {
12162
+ isOriginal: true,
12163
+ url: inlineUrlSite.url,
12164
+ content: inlineUrlSite.content,
12165
12165
  line,
12166
12166
  column,
12167
- },
12168
- urlInfo,
12169
- );
12167
+ });
12168
+ };
12169
+ return adjust(urlInfo, {
12170
+ isOriginal,
12171
+ url,
12172
+ content: isOriginal ? urlInfo.originalContent : urlInfo.content,
12173
+ line,
12174
+ column,
12175
+ });
12170
12176
  };
12171
12177
 
12172
12178
  const getRedirectedReferenceProps = (reference, url) => {
@@ -13686,13 +13692,16 @@ const createResolveUrlError = ({
13686
13692
  ...details
13687
13693
  }) => {
13688
13694
  const resolveError = new Error(
13689
- createDetailedMessage$1(`Failed to resolve url reference`, {
13690
- reason,
13691
- ...details,
13692
- "specifier": `"${reference.specifier}"`,
13693
- "specifier trace": reference.trace.message,
13694
- ...detailsFromPluginController(pluginController),
13695
- }),
13695
+ createDetailedMessage$1(
13696
+ `Failed to resolve url reference
13697
+ ${reference.trace.message}
13698
+ ${reason}`,
13699
+ {
13700
+ ...detailsFromFirstReference(reference),
13701
+ ...details,
13702
+ ...detailsFromPluginController(pluginController),
13703
+ },
13704
+ ),
13696
13705
  );
13697
13706
  resolveError.name = "RESOLVE_URL_ERROR";
13698
13707
  resolveError.code = code;
@@ -13727,14 +13736,18 @@ const createFetchUrlContentError = ({
13727
13736
  reason,
13728
13737
  ...details
13729
13738
  }) => {
13739
+ const reference = urlInfo.firstReference;
13730
13740
  const fetchError = new Error(
13731
- createDetailedMessage$1(`Failed to fetch url content`, {
13732
- reason,
13733
- ...details,
13734
- "url": urlInfo.url,
13735
- "url reference trace": urlInfo.firstReference.trace.message,
13736
- ...detailsFromPluginController(pluginController),
13737
- }),
13741
+ createDetailedMessage$1(
13742
+ `Failed to fetch url content
13743
+ ${reference.trace.message}
13744
+ ${reason}`,
13745
+ {
13746
+ ...detailsFromFirstReference(reference),
13747
+ ...details,
13748
+ ...detailsFromPluginController(pluginController),
13749
+ },
13750
+ ),
13738
13751
  );
13739
13752
  fetchError.name = "FETCH_URL_CONTENT_ERROR";
13740
13753
  fetchError.code = code;
@@ -13743,7 +13756,7 @@ const createFetchUrlContentError = ({
13743
13756
  if (code === "PARSE_ERROR") {
13744
13757
  fetchError.trace = error.trace;
13745
13758
  } else {
13746
- fetchError.trace = urlInfo.firstReference.trace;
13759
+ fetchError.trace = reference.trace;
13747
13760
  }
13748
13761
  fetchError.asResponse = error.asResponse;
13749
13762
  return fetchError;
@@ -13792,73 +13805,101 @@ const createTransformUrlContentError = ({
13792
13805
  urlInfo,
13793
13806
  error,
13794
13807
  }) => {
13808
+ if (error.code === "MODULE_NOT_FOUND") {
13809
+ return error;
13810
+ }
13795
13811
  if (error.code === "DIRECTORY_REFERENCE_NOT_ALLOWED") {
13796
13812
  return error;
13797
13813
  }
13814
+ if (error.code === "PARSE_ERROR") {
13815
+ const reference = urlInfo.firstReference;
13816
+ let trace = reference.trace;
13817
+ let line = error.line;
13818
+ let column = error.column;
13819
+ if (urlInfo.isInline) {
13820
+ line = trace.line + line;
13821
+ line = line - 1;
13822
+ trace = {
13823
+ ...trace,
13824
+ line,
13825
+ column,
13826
+ codeFrame: generateContentFrame({
13827
+ line,
13828
+ column,
13829
+ content: urlInfo.inlineUrlSite.content,
13830
+ }),
13831
+ message: stringifyUrlSite({
13832
+ url: urlInfo.inlineUrlSite.url,
13833
+ line,
13834
+ column,
13835
+ content: urlInfo.inlineUrlSite.content,
13836
+ }),
13837
+ };
13838
+ } else {
13839
+ trace = {
13840
+ url: urlInfo.url,
13841
+ line,
13842
+ column: error.column,
13843
+ codeFrame: generateContentFrame({
13844
+ line,
13845
+ column: error.column,
13846
+ content: urlInfo.content,
13847
+ }),
13848
+ message: stringifyUrlSite({
13849
+ url: urlInfo.url,
13850
+ line,
13851
+ column: error.column,
13852
+ content: urlInfo.content,
13853
+ }),
13854
+ };
13855
+ }
13856
+ const transformError = new Error(
13857
+ createDetailedMessage$1(
13858
+ `parse error on "${urlInfo.type}"
13859
+ ${trace.message}
13860
+ ${error.message}`,
13861
+ {
13862
+ "first reference": `${reference.trace.url}:${reference.trace.line}:${reference.trace.column}`,
13863
+ ...detailsFromFirstReference(reference),
13864
+ ...detailsFromPluginController(pluginController),
13865
+ },
13866
+ ),
13867
+ );
13868
+ transformError.cause = error;
13869
+ transformError.name = "TRANSFORM_URL_CONTENT_ERROR";
13870
+ transformError.code = "PARSE_ERROR";
13871
+ transformError.stack = error.stack;
13872
+ transformError.reason = error.message;
13873
+ transformError.trace = trace;
13874
+ transformError.asResponse = error.asResponse;
13875
+ return transformError;
13876
+ }
13798
13877
  const createFailedToTransformError = ({
13799
13878
  code = error.code || "TRANSFORM_URL_CONTENT_ERROR",
13800
13879
  reason,
13801
13880
  ...details
13802
13881
  }) => {
13882
+ const reference = urlInfo.firstReference;
13883
+ let trace = reference.trace;
13803
13884
  const transformError = new Error(
13804
13885
  createDetailedMessage$1(
13805
- `"transformUrlContent" error on "${urlInfo.type}"`,
13886
+ `"transformUrlContent" error on "${urlInfo.type}"
13887
+ ${trace.message}
13888
+ ${reason}`,
13806
13889
  {
13807
- reason,
13890
+ ...detailsFromFirstReference(reference),
13808
13891
  ...details,
13809
- "url": urlInfo.url,
13810
- "url reference trace": urlInfo.firstReference.trace.message,
13811
13892
  ...detailsFromPluginController(pluginController),
13812
13893
  },
13813
13894
  ),
13814
13895
  );
13896
+ transformError.cause = error;
13815
13897
  transformError.name = "TRANSFORM_URL_CONTENT_ERROR";
13816
13898
  transformError.code = code;
13817
13899
  transformError.reason = reason;
13818
13900
  transformError.stack = error.stack;
13819
13901
  transformError.url = urlInfo.url;
13820
- transformError.trace = urlInfo.firstReference.trace;
13821
- if (code === "PARSE_ERROR") {
13822
- transformError.reason = `parse error on ${urlInfo.type}`;
13823
- transformError.cause = error;
13824
- let line = error.line;
13825
- if (urlInfo.type === "js_module") {
13826
- line = line - 1;
13827
- }
13828
- if (urlInfo.isInline) {
13829
- transformError.trace.line = urlInfo.firstReference.trace.line + line;
13830
- transformError.trace.column =
13831
- urlInfo.firstReference.trace.column + error.column;
13832
- transformError.trace.codeFrame = generateContentFrame({
13833
- line: transformError.trace.line,
13834
- column: transformError.trace.column,
13835
- content: urlInfo.inlineUrlSite.content,
13836
- });
13837
- transformError.trace.message = stringifyUrlSite({
13838
- url: urlInfo.inlineUrlSite.url,
13839
- line: transformError.trace.line,
13840
- column: transformError.trace.column,
13841
- content: urlInfo.inlineUrlSite.content,
13842
- });
13843
- } else {
13844
- transformError.trace = {
13845
- url: urlInfo.url,
13846
- line,
13847
- column: error.column,
13848
- codeFrame: generateContentFrame({
13849
- line,
13850
- column: error.column,
13851
- content: urlInfo.content,
13852
- }),
13853
- message: stringifyUrlSite({
13854
- url: urlInfo.url,
13855
- line,
13856
- column: error.column,
13857
- content: urlInfo.content,
13858
- }),
13859
- };
13860
- }
13861
- }
13902
+ transformError.trace = trace;
13862
13903
  transformError.asResponse = error.asResponse;
13863
13904
  return transformError;
13864
13905
  };
@@ -13870,17 +13911,20 @@ const createTransformUrlContentError = ({
13870
13911
 
13871
13912
  const createFinalizeUrlContentError = ({
13872
13913
  pluginController,
13873
-
13874
13914
  urlInfo,
13875
13915
  error,
13876
13916
  }) => {
13917
+ const reference = urlInfo.firstReference;
13877
13918
  const finalizeError = new Error(
13878
- createDetailedMessage$1(`"finalizeUrlContent" error on "${urlInfo.type}"`, {
13879
- ...detailsFromValueThrown(error),
13880
- "url": urlInfo.url,
13881
- "url reference trace": urlInfo.firstReference.trace.message,
13882
- ...detailsFromPluginController(pluginController),
13883
- }),
13919
+ createDetailedMessage$1(
13920
+ `"finalizeUrlContent" error on "${urlInfo.type}"
13921
+ ${reference.trace.message}`,
13922
+ {
13923
+ ...detailsFromFirstReference(reference),
13924
+ ...detailsFromValueThrown(error),
13925
+ ...detailsFromPluginController(pluginController),
13926
+ },
13927
+ ),
13884
13928
  );
13885
13929
  if (error && error instanceof Error) {
13886
13930
  finalizeError.cause = error;
@@ -13891,6 +13935,23 @@ const createFinalizeUrlContentError = ({
13891
13935
  return finalizeError;
13892
13936
  };
13893
13937
 
13938
+ const detailsFromFirstReference = (reference) => {
13939
+ const referenceInProject = getFirstReferenceInProject(reference);
13940
+ if (referenceInProject === reference) {
13941
+ return {};
13942
+ }
13943
+ return {
13944
+ "first reference in project": `${referenceInProject.trace.url}:${referenceInProject.trace.line}:${referenceInProject.trace.column}`,
13945
+ };
13946
+ };
13947
+ const getFirstReferenceInProject = (reference) => {
13948
+ const ownerUrlInfo = reference.ownerUrlInfo;
13949
+ if (!ownerUrlInfo.url.includes("/node_modules/")) {
13950
+ return reference;
13951
+ }
13952
+ return getFirstReferenceInProject(ownerUrlInfo.firstReference);
13953
+ };
13954
+
13894
13955
  const detailsFromPluginController = (pluginController) => {
13895
13956
  const currentPlugin = pluginController.getCurrentPlugin();
13896
13957
  if (!currentPlugin) {
@@ -13901,6 +13962,18 @@ const detailsFromPluginController = (pluginController) => {
13901
13962
 
13902
13963
  const detailsFromValueThrown = (valueThrownByPlugin) => {
13903
13964
  if (valueThrownByPlugin && valueThrownByPlugin instanceof Error) {
13965
+ if (
13966
+ valueThrownByPlugin.code === "PARSE_ERROR" ||
13967
+ valueThrownByPlugin.code === "MODULE_NOT_FOUND" ||
13968
+ valueThrownByPlugin.name === "RESOLVE_URL_ERROR" ||
13969
+ valueThrownByPlugin.name === "FETCH_URL_CONTENT_ERROR" ||
13970
+ valueThrownByPlugin.name === "TRANSFORM_URL_CONTENT_ERROR" ||
13971
+ valueThrownByPlugin.name === "FINALIZE_URL_CONTENT_ERROR"
13972
+ ) {
13973
+ return {
13974
+ "error message": valueThrownByPlugin.message,
13975
+ };
13976
+ }
13904
13977
  return {
13905
13978
  "error stack": valueThrownByPlugin.stack,
13906
13979
  };
@@ -14520,16 +14593,21 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
14520
14593
  e.code !== "DIRECTORY_REFERENCE_NOT_ALLOWED" &&
14521
14594
  errorOnInlineContentCanSkipThrow(urlInfo)
14522
14595
  ) {
14523
- const errorInfo =
14524
- e.code === "PARSE_ERROR" && e.cause
14525
- ? `${e.cause.reasonCode}\n${e.trace?.message}`
14526
- : e.stack;
14527
14596
  // When something like <style> or <script> contains syntax error
14528
14597
  // the HTML in itself it still valid
14529
14598
  // keep the syntax error and continue with the HTML
14599
+ if (e.code === "PARSE_ERROR") {
14600
+ logger.error(`parse error on "${urlInfo.type}"
14601
+ ${e.trace?.message}
14602
+ ${e.reason}
14603
+ --- declared in ---
14604
+ ${urlInfo.firstReference.trace.message}`);
14605
+ return;
14606
+ }
14530
14607
  logger.error(
14531
- `Error while cooking ${urlInfo.type} declared in ${urlInfo.firstReference.trace.message}:
14532
- ${errorInfo}`,
14608
+ `Error while cooking ${urlInfo.type}
14609
+ ${urlInfo.firstReference.trace.message}
14610
+ ${e.stack}`,
14533
14611
  );
14534
14612
  return;
14535
14613
  }
@@ -16101,10 +16179,7 @@ const jsenvPluginHtmlReferenceAnalysis = ({
16101
16179
  type,
16102
16180
  expectedType,
16103
16181
  isOriginalPosition: isOriginal,
16104
- // we remove 1 to the line because imagine the following html:
16105
- // <style>body { color: red; }</style>
16106
- // -> content starts same line as <style> (same for <script>)
16107
- specifierLine: line - 1,
16182
+ specifierLine: line,
16108
16183
  specifierColumn: column,
16109
16184
  specifier: inlineContentUrl,
16110
16185
  contentType,
@@ -16223,7 +16298,7 @@ const jsenvPluginHtmlReferenceAnalysis = ({
16223
16298
  },
16224
16299
  );
16225
16300
  const importmapReferenceInlined = importmapReference.inline({
16226
- line: line - 1,
16301
+ line,
16227
16302
  column,
16228
16303
  isOriginal,
16229
16304
  specifier: importmapInlineUrl,
@@ -18777,7 +18852,7 @@ const jsenvPluginInliningIntoHtml = () => {
18777
18852
  url: linkReference.url,
18778
18853
  });
18779
18854
  const linkReferenceInlined = linkReference.inline({
18780
- line: line - 1,
18855
+ line,
18781
18856
  column,
18782
18857
  isOriginal,
18783
18858
  specifier: linkInlineUrl,
@@ -18829,7 +18904,7 @@ const jsenvPluginInliningIntoHtml = () => {
18829
18904
  url: scriptReference.url,
18830
18905
  });
18831
18906
  const scriptReferenceInlined = scriptReference.inline({
18832
- line: line - 1,
18907
+ line,
18833
18908
  column,
18834
18909
  isOriginal,
18835
18910
  specifier: scriptInlineUrl,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "39.1.2",
3
+ "version": "39.2.0",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -44,21 +44,21 @@
44
44
  ],
45
45
  "scripts": {
46
46
  "eslint": "npx eslint . --ext=.js,.mjs,.cjs,.html",
47
- "dev": "node --conditions=development ./scripts/dev/dev.mjs",
48
47
  "test": "node --conditions=development ./scripts/test/test.mjs",
49
- "test:workspace": "npm run test --workspaces --if-present -- --workspace",
50
- "test:ci": "CI=1 npm run test",
51
- "test:workspace:ci": "CI=1 npm run test:workspace",
52
- "test:only_dev_server_errors": "node --conditions=development ./tests/dev_server/errors/dev_errors_snapshots.test.mjs",
53
48
  "build": "node --conditions=development ./scripts/build/build.mjs",
54
- "build:file_size": "node ./scripts/build/build_file_size.mjs --log",
55
- "build:workspace": "npm run build --workspaces --if-present --conditions=developement",
56
- "monorepo:upgrade_versions": "node ./scripts/monorepo/upgrade_external_versions.mjs",
49
+ "workspace:test": "npm run test --workspaces --if-present -- --workspace",
50
+ "workspace:build": "npm run build --workspaces --if-present --conditions=developement",
57
51
  "monorepo:sync_packages_versions": "node ./scripts/monorepo/sync_packages_versions.mjs",
58
52
  "monorepo:publish": "node ./scripts/monorepo/publish_packages.mjs",
53
+ "monorepo:upgrade_versions": "node ./scripts/monorepo/upgrade_external_versions.mjs",
59
54
  "monorepo:node_modules_clear": "npx @jsenv/snapshot clear **/node_modules/",
55
+ "build:file_size": "node ./scripts/build/build_file_size.mjs --log",
60
56
  "performances": "node --expose-gc ./scripts/performance/generate_performance_report.mjs --log --once",
61
57
  "prettier": "prettier --write .",
58
+ "test:ci": "CI=1 npm run test",
59
+ "test:only_dev_server_errors": "node --conditions=development ./tests/dev_server/errors/dev_errors_snapshots.test.mjs",
60
+ "workspace:test:ci": "CI=1 npm run test:workspace",
61
+ "dev": "node --conditions=development ./scripts/dev/dev.mjs",
62
62
  "certificate:install": "node ./scripts/dev/install_certificate_authority.mjs",
63
63
  "prepublishOnly": "npm run build"
64
64
  },
@@ -73,8 +73,8 @@
73
73
  "@jsenv/js-module-fallback": "1.3.23",
74
74
  "@jsenv/node-esm-resolution": "1.0.2",
75
75
  "@jsenv/plugin-bundling": "2.6.16",
76
- "@jsenv/plugin-minification": "1.5.4",
77
- "@jsenv/plugin-supervisor": "1.5.2",
76
+ "@jsenv/plugin-minification": "1.5.5",
77
+ "@jsenv/plugin-supervisor": "1.5.3",
78
78
  "@jsenv/plugin-transpilation": "1.4.6",
79
79
  "@jsenv/runtime-compat": "1.3.0",
80
80
  "@jsenv/server": "15.2.13",
@@ -98,18 +98,18 @@
98
98
  "@jsenv/plugin-as-js-classic": "./packages/related/plugin-as-js-classic/",
99
99
  "@jsenv/snapshot": "./packages/independent/snapshot/",
100
100
  "@jsenv/test": "./packages/related/test/",
101
- "@playwright/browser-chromium": "1.45.1",
102
- "@playwright/browser-firefox": "1.45.1",
103
- "@playwright/browser-webkit": "1.45.1",
101
+ "@playwright/browser-chromium": "1.45.2",
102
+ "@playwright/browser-firefox": "1.45.2",
103
+ "@playwright/browser-webkit": "1.45.2",
104
104
  "babel-plugin-transform-async-to-promises": "0.8.18",
105
105
  "eslint": "8.56.0",
106
106
  "eslint-plugin-html": "8.1.1",
107
107
  "eslint-plugin-import": "2.29.1",
108
- "eslint-plugin-react": "7.34.3",
108
+ "eslint-plugin-react": "7.34.4",
109
109
  "eslint-plugin-regexp": "2.6.0",
110
110
  "marked": "13.0.2",
111
111
  "open": "10.1.0",
112
- "playwright": "1.45.1",
113
- "prettier": "3.3.2"
112
+ "playwright": "1.45.2",
113
+ "prettier": "3.3.3"
114
114
  }
115
115
  }
@@ -13,13 +13,16 @@ export const createResolveUrlError = ({
13
13
  ...details
14
14
  }) => {
15
15
  const resolveError = new Error(
16
- createDetailedMessage(`Failed to resolve url reference`, {
17
- reason,
18
- ...details,
19
- "specifier": `"${reference.specifier}"`,
20
- "specifier trace": reference.trace.message,
21
- ...detailsFromPluginController(pluginController),
22
- }),
16
+ createDetailedMessage(
17
+ `Failed to resolve url reference
18
+ ${reference.trace.message}
19
+ ${reason}`,
20
+ {
21
+ ...detailsFromFirstReference(reference),
22
+ ...details,
23
+ ...detailsFromPluginController(pluginController),
24
+ },
25
+ ),
23
26
  );
24
27
  resolveError.name = "RESOLVE_URL_ERROR";
25
28
  resolveError.code = code;
@@ -54,14 +57,18 @@ export const createFetchUrlContentError = ({
54
57
  reason,
55
58
  ...details
56
59
  }) => {
60
+ const reference = urlInfo.firstReference;
57
61
  const fetchError = new Error(
58
- createDetailedMessage(`Failed to fetch url content`, {
59
- reason,
60
- ...details,
61
- "url": urlInfo.url,
62
- "url reference trace": urlInfo.firstReference.trace.message,
63
- ...detailsFromPluginController(pluginController),
64
- }),
62
+ createDetailedMessage(
63
+ `Failed to fetch url content
64
+ ${reference.trace.message}
65
+ ${reason}`,
66
+ {
67
+ ...detailsFromFirstReference(reference),
68
+ ...details,
69
+ ...detailsFromPluginController(pluginController),
70
+ },
71
+ ),
65
72
  );
66
73
  fetchError.name = "FETCH_URL_CONTENT_ERROR";
67
74
  fetchError.code = code;
@@ -70,7 +77,7 @@ export const createFetchUrlContentError = ({
70
77
  if (code === "PARSE_ERROR") {
71
78
  fetchError.trace = error.trace;
72
79
  } else {
73
- fetchError.trace = urlInfo.firstReference.trace;
80
+ fetchError.trace = reference.trace;
74
81
  }
75
82
  fetchError.asResponse = error.asResponse;
76
83
  return fetchError;
@@ -119,73 +126,101 @@ export const createTransformUrlContentError = ({
119
126
  urlInfo,
120
127
  error,
121
128
  }) => {
129
+ if (error.code === "MODULE_NOT_FOUND") {
130
+ return error;
131
+ }
122
132
  if (error.code === "DIRECTORY_REFERENCE_NOT_ALLOWED") {
123
133
  return error;
124
134
  }
135
+ if (error.code === "PARSE_ERROR") {
136
+ const reference = urlInfo.firstReference;
137
+ let trace = reference.trace;
138
+ let line = error.line;
139
+ let column = error.column;
140
+ if (urlInfo.isInline) {
141
+ line = trace.line + line;
142
+ line = line - 1;
143
+ trace = {
144
+ ...trace,
145
+ line,
146
+ column,
147
+ codeFrame: generateContentFrame({
148
+ line,
149
+ column,
150
+ content: urlInfo.inlineUrlSite.content,
151
+ }),
152
+ message: stringifyUrlSite({
153
+ url: urlInfo.inlineUrlSite.url,
154
+ line,
155
+ column,
156
+ content: urlInfo.inlineUrlSite.content,
157
+ }),
158
+ };
159
+ } else {
160
+ trace = {
161
+ url: urlInfo.url,
162
+ line,
163
+ column: error.column,
164
+ codeFrame: generateContentFrame({
165
+ line,
166
+ column: error.column,
167
+ content: urlInfo.content,
168
+ }),
169
+ message: stringifyUrlSite({
170
+ url: urlInfo.url,
171
+ line,
172
+ column: error.column,
173
+ content: urlInfo.content,
174
+ }),
175
+ };
176
+ }
177
+ const transformError = new Error(
178
+ createDetailedMessage(
179
+ `parse error on "${urlInfo.type}"
180
+ ${trace.message}
181
+ ${error.message}`,
182
+ {
183
+ "first reference": `${reference.trace.url}:${reference.trace.line}:${reference.trace.column}`,
184
+ ...detailsFromFirstReference(reference),
185
+ ...detailsFromPluginController(pluginController),
186
+ },
187
+ ),
188
+ );
189
+ transformError.cause = error;
190
+ transformError.name = "TRANSFORM_URL_CONTENT_ERROR";
191
+ transformError.code = "PARSE_ERROR";
192
+ transformError.stack = error.stack;
193
+ transformError.reason = error.message;
194
+ transformError.trace = trace;
195
+ transformError.asResponse = error.asResponse;
196
+ return transformError;
197
+ }
125
198
  const createFailedToTransformError = ({
126
199
  code = error.code || "TRANSFORM_URL_CONTENT_ERROR",
127
200
  reason,
128
201
  ...details
129
202
  }) => {
203
+ const reference = urlInfo.firstReference;
204
+ let trace = reference.trace;
130
205
  const transformError = new Error(
131
206
  createDetailedMessage(
132
- `"transformUrlContent" error on "${urlInfo.type}"`,
207
+ `"transformUrlContent" error on "${urlInfo.type}"
208
+ ${trace.message}
209
+ ${reason}`,
133
210
  {
134
- reason,
211
+ ...detailsFromFirstReference(reference),
135
212
  ...details,
136
- "url": urlInfo.url,
137
- "url reference trace": urlInfo.firstReference.trace.message,
138
213
  ...detailsFromPluginController(pluginController),
139
214
  },
140
215
  ),
141
216
  );
217
+ transformError.cause = error;
142
218
  transformError.name = "TRANSFORM_URL_CONTENT_ERROR";
143
219
  transformError.code = code;
144
220
  transformError.reason = reason;
145
221
  transformError.stack = error.stack;
146
222
  transformError.url = urlInfo.url;
147
- transformError.trace = urlInfo.firstReference.trace;
148
- if (code === "PARSE_ERROR") {
149
- transformError.reason = `parse error on ${urlInfo.type}`;
150
- transformError.cause = error;
151
- let line = error.line;
152
- if (urlInfo.type === "js_module") {
153
- line = line - 1;
154
- }
155
- if (urlInfo.isInline) {
156
- transformError.trace.line = urlInfo.firstReference.trace.line + line;
157
- transformError.trace.column =
158
- urlInfo.firstReference.trace.column + error.column;
159
- transformError.trace.codeFrame = generateContentFrame({
160
- line: transformError.trace.line,
161
- column: transformError.trace.column,
162
- content: urlInfo.inlineUrlSite.content,
163
- });
164
- transformError.trace.message = stringifyUrlSite({
165
- url: urlInfo.inlineUrlSite.url,
166
- line: transformError.trace.line,
167
- column: transformError.trace.column,
168
- content: urlInfo.inlineUrlSite.content,
169
- });
170
- } else {
171
- transformError.trace = {
172
- url: urlInfo.url,
173
- line,
174
- column: error.column,
175
- codeFrame: generateContentFrame({
176
- line,
177
- column: error.column,
178
- content: urlInfo.content,
179
- }),
180
- message: stringifyUrlSite({
181
- url: urlInfo.url,
182
- line,
183
- column: error.column,
184
- content: urlInfo.content,
185
- }),
186
- };
187
- }
188
- }
223
+ transformError.trace = trace;
189
224
  transformError.asResponse = error.asResponse;
190
225
  return transformError;
191
226
  };
@@ -197,17 +232,20 @@ export const createTransformUrlContentError = ({
197
232
 
198
233
  export const createFinalizeUrlContentError = ({
199
234
  pluginController,
200
-
201
235
  urlInfo,
202
236
  error,
203
237
  }) => {
238
+ const reference = urlInfo.firstReference;
204
239
  const finalizeError = new Error(
205
- createDetailedMessage(`"finalizeUrlContent" error on "${urlInfo.type}"`, {
206
- ...detailsFromValueThrown(error),
207
- "url": urlInfo.url,
208
- "url reference trace": urlInfo.firstReference.trace.message,
209
- ...detailsFromPluginController(pluginController),
210
- }),
240
+ createDetailedMessage(
241
+ `"finalizeUrlContent" error on "${urlInfo.type}"
242
+ ${reference.trace.message}`,
243
+ {
244
+ ...detailsFromFirstReference(reference),
245
+ ...detailsFromValueThrown(error),
246
+ ...detailsFromPluginController(pluginController),
247
+ },
248
+ ),
211
249
  );
212
250
  if (error && error instanceof Error) {
213
251
  finalizeError.cause = error;
@@ -218,6 +256,23 @@ export const createFinalizeUrlContentError = ({
218
256
  return finalizeError;
219
257
  };
220
258
 
259
+ const detailsFromFirstReference = (reference) => {
260
+ const referenceInProject = getFirstReferenceInProject(reference);
261
+ if (referenceInProject === reference) {
262
+ return {};
263
+ }
264
+ return {
265
+ "first reference in project": `${referenceInProject.trace.url}:${referenceInProject.trace.line}:${referenceInProject.trace.column}`,
266
+ };
267
+ };
268
+ const getFirstReferenceInProject = (reference) => {
269
+ const ownerUrlInfo = reference.ownerUrlInfo;
270
+ if (!ownerUrlInfo.url.includes("/node_modules/")) {
271
+ return reference;
272
+ }
273
+ return getFirstReferenceInProject(ownerUrlInfo.firstReference);
274
+ };
275
+
221
276
  const detailsFromPluginController = (pluginController) => {
222
277
  const currentPlugin = pluginController.getCurrentPlugin();
223
278
  if (!currentPlugin) {
@@ -228,6 +283,18 @@ const detailsFromPluginController = (pluginController) => {
228
283
 
229
284
  const detailsFromValueThrown = (valueThrownByPlugin) => {
230
285
  if (valueThrownByPlugin && valueThrownByPlugin instanceof Error) {
286
+ if (
287
+ valueThrownByPlugin.code === "PARSE_ERROR" ||
288
+ valueThrownByPlugin.code === "MODULE_NOT_FOUND" ||
289
+ valueThrownByPlugin.name === "RESOLVE_URL_ERROR" ||
290
+ valueThrownByPlugin.name === "FETCH_URL_CONTENT_ERROR" ||
291
+ valueThrownByPlugin.name === "TRANSFORM_URL_CONTENT_ERROR" ||
292
+ valueThrownByPlugin.name === "FINALIZE_URL_CONTENT_ERROR"
293
+ ) {
294
+ return {
295
+ "error message": valueThrownByPlugin.message,
296
+ };
297
+ }
231
298
  return {
232
299
  "error stack": valueThrownByPlugin.stack,
233
300
  };
@@ -487,16 +487,21 @@ ${ANSI.color(normalizedReturnValue, ANSI.YELLOW)}
487
487
  e.code !== "DIRECTORY_REFERENCE_NOT_ALLOWED" &&
488
488
  errorOnInlineContentCanSkipThrow(urlInfo)
489
489
  ) {
490
- const errorInfo =
491
- e.code === "PARSE_ERROR" && e.cause
492
- ? `${e.cause.reasonCode}\n${e.trace?.message}`
493
- : e.stack;
494
490
  // When something like <style> or <script> contains syntax error
495
491
  // the HTML in itself it still valid
496
492
  // keep the syntax error and continue with the HTML
493
+ if (e.code === "PARSE_ERROR") {
494
+ logger.error(`parse error on "${urlInfo.type}"
495
+ ${e.trace?.message}
496
+ ${e.reason}
497
+ --- declared in ---
498
+ ${urlInfo.firstReference.trace.message}`);
499
+ return;
500
+ }
497
501
  logger.error(
498
- `Error while cooking ${urlInfo.type} declared in ${urlInfo.firstReference.trace.message}:
499
- ${errorInfo}`,
502
+ `Error while cooking ${urlInfo.type}
503
+ ${urlInfo.firstReference.trace.message}
504
+ ${e.stack}`,
500
505
  );
501
506
  return;
502
507
  }
@@ -64,6 +64,7 @@ export const createDependencies = (ownerUrlInfo) => {
64
64
  isOriginalPosition,
65
65
  specifierLine,
66
66
  specifierColumn,
67
+ content,
67
68
  ...rest
68
69
  }) => {
69
70
  const parentUrl = isOriginalPosition
@@ -84,6 +85,7 @@ export const createDependencies = (ownerUrlInfo) => {
84
85
  specifierLine,
85
86
  specifierColumn,
86
87
  isInline: true,
88
+ content,
87
89
  ...rest,
88
90
  });
89
91
  return reference;
@@ -411,6 +413,12 @@ const createReference = ({
411
413
  ownerUrlInfo = reference.ownerUrlInfo,
412
414
  ...props
413
415
  }) => {
416
+ const content =
417
+ ownerUrlInfo === undefined
418
+ ? isOriginalPosition
419
+ ? reference.ownerUrlInfo.originalContent
420
+ : reference.ownerUrlInfo.content
421
+ : ownerUrlInfo.content;
414
422
  const trace = traceFromUrlSite({
415
423
  url:
416
424
  ownerUrlInfo === undefined
@@ -418,12 +426,7 @@ const createReference = ({
418
426
  ? reference.ownerUrlInfo.url
419
427
  : reference.ownerUrlInfo.generatedUrl
420
428
  : reference.ownerUrlInfo.url,
421
- content:
422
- ownerUrlInfo === undefined
423
- ? isOriginalPosition
424
- ? reference.ownerUrlInfo.originalContent
425
- : reference.ownerUrlInfo.content
426
- : ownerUrlInfo.content,
429
+ content,
427
430
  line,
428
431
  column,
429
432
  });
@@ -620,14 +623,15 @@ const applyDependencyRemovalEffects = (reference) => {
620
623
  };
621
624
 
622
625
  const traceFromUrlSite = (urlSite) => {
626
+ const codeFrame = urlSite.content
627
+ ? generateContentFrame({
628
+ content: urlSite.content,
629
+ line: urlSite.line,
630
+ column: urlSite.column,
631
+ })
632
+ : "";
623
633
  return {
624
- codeFrame: urlSite.content
625
- ? generateContentFrame({
626
- content: urlSite.content,
627
- line: urlSite.line,
628
- column: urlSite.column,
629
- })
630
- : "",
634
+ codeFrame,
631
635
  message: stringifyUrlSite(urlSite),
632
636
  url: urlSite.url,
633
637
  line: urlSite.line,
@@ -637,7 +641,7 @@ const traceFromUrlSite = (urlSite) => {
637
641
 
638
642
  const adjustUrlSite = (urlInfo, { url, line, column }) => {
639
643
  const isOriginal = url === urlInfo.url;
640
- const adjust = (urlSite, urlInfo) => {
644
+ const adjust = (urlInfo, urlSite) => {
641
645
  if (!urlSite.isOriginal) {
642
646
  return urlSite;
643
647
  }
@@ -646,33 +650,35 @@ const adjustUrlSite = (urlInfo, { url, line, column }) => {
646
650
  return urlSite;
647
651
  }
648
652
  const parentUrlInfo = urlInfo.graph.getUrlInfo(inlineUrlSite.url);
649
- return adjust(
650
- {
651
- isOriginal: true,
652
- url: inlineUrlSite.url,
653
- content: inlineUrlSite.content,
654
- line:
655
- inlineUrlSite.line === undefined
656
- ? urlSite.line
657
- : inlineUrlSite.line + urlSite.line,
658
- column:
659
- inlineUrlSite.column === undefined
660
- ? urlSite.column
661
- : inlineUrlSite.column + urlSite.column,
662
- },
663
- parentUrlInfo,
664
- );
665
- };
666
- return adjust(
667
- {
668
- isOriginal,
669
- url,
670
- content: isOriginal ? urlInfo.originalContent : urlInfo.content,
653
+ line =
654
+ inlineUrlSite.line === undefined
655
+ ? urlSite.line
656
+ : inlineUrlSite.line + urlSite.line;
657
+ // we remove 1 to the line because imagine the following html:
658
+ // <style>body { color: red; }</style>
659
+ // -> content starts same line as <style> (same for <script>)
660
+ if (urlInfo.content[0] === "\n") {
661
+ line = line - 1;
662
+ }
663
+ column =
664
+ inlineUrlSite.column === undefined
665
+ ? urlSite.column
666
+ : inlineUrlSite.column + urlSite.column;
667
+ return adjust(parentUrlInfo, {
668
+ isOriginal: true,
669
+ url: inlineUrlSite.url,
670
+ content: inlineUrlSite.content,
671
671
  line,
672
672
  column,
673
- },
674
- urlInfo,
675
- );
673
+ });
674
+ };
675
+ return adjust(urlInfo, {
676
+ isOriginal,
677
+ url,
678
+ content: isOriginal ? urlInfo.originalContent : urlInfo.content,
679
+ line,
680
+ column,
681
+ });
676
682
  };
677
683
 
678
684
  const getRedirectedReferenceProps = (reference, url) => {
@@ -47,7 +47,7 @@ export const jsenvPluginInliningIntoHtml = () => {
47
47
  url: linkReference.url,
48
48
  });
49
49
  const linkReferenceInlined = linkReference.inline({
50
- line: line - 1,
50
+ line,
51
51
  column,
52
52
  isOriginal,
53
53
  specifier: linkInlineUrl,
@@ -99,7 +99,7 @@ export const jsenvPluginInliningIntoHtml = () => {
99
99
  url: scriptReference.url,
100
100
  });
101
101
  const scriptReferenceInlined = scriptReference.inline({
102
- line: line - 1,
102
+ line,
103
103
  column,
104
104
  isOriginal,
105
105
  specifier: scriptInlineUrl,
@@ -264,10 +264,7 @@ export const jsenvPluginHtmlReferenceAnalysis = ({
264
264
  type,
265
265
  expectedType,
266
266
  isOriginalPosition: isOriginal,
267
- // we remove 1 to the line because imagine the following html:
268
- // <style>body { color: red; }</style>
269
- // -> content starts same line as <style> (same for <script>)
270
- specifierLine: line - 1,
267
+ specifierLine: line,
271
268
  specifierColumn: column,
272
269
  specifier: inlineContentUrl,
273
270
  contentType,
@@ -386,7 +383,7 @@ export const jsenvPluginHtmlReferenceAnalysis = ({
386
383
  },
387
384
  );
388
385
  const importmapReferenceInlined = importmapReference.inline({
389
- line: line - 1,
386
+ line,
390
387
  column,
391
388
  isOriginal,
392
389
  specifier: importmapInlineUrl,