question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Auto-adjust userscript sourcemap comment

See original GitHub issue
  • The bug is also present in the latest beta. Warning! Do an export in Violentmonkey settings before testing.

  • I have searched for existing issues that already reported this problem and found none

Describe the bug userscript sourcemap is mapping wrong variable

To Reproduce install it, then open https://i.songe.li/, press F12 and check console

// ==UserScript==
// @name               example
// @name:ja            hentai
// @name:zh            测试_
// @namespace          https://github.com/lisonge
// @version            1.0.1
// @author             lisonge
// @description        default description zh
// @description:zh     描述
// @description:en     description
// @description:ja     説明z
// @description:zh-CN  描述
// @license            MIT
// @icon               https://vitejs.dev/logo.svg
// @homepage           https://github.com/lisonge/vite-plugin-monkey#readme
// @homepageURL        https://github.com/lisonge/vite-plugin-monkey#readme
// @source             https://github.com/lisonge/vite-plugin-monkey.git
// @supportURL         https://github.com/lisonge/vite-plugin-monkey/issues
// @include            /^https:\/\/i\.songe\.li\/.*/
// @match              https://i.songe.li/
// @require            https://cdn.jsdelivr.net/npm/blueimp-md5@2.19.0
// @resource           element-plus/dist/index.css  https://cdn.jsdelivr.net/npm/element-plus@2.2.17/dist/index.css
// @grant              GM_cookie
// @grant              GM_getResourceText
// @grant              unsafeWindow
// ==/UserScript==

(e=>{const o=document.createElement("style");o.dataset.source="vite-plugin-monkey",o.innerText=e,document.head.appendChild(o)})(":root{font-family:Inter,Avenir,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}");

(function(md52, client) {
  var _a;
  "use strict";
  const _interopDefaultLegacy = (e) => e && typeof e === "object" && "default" in e ? e : { default: e };
  const md5__default = /* @__PURE__ */ _interopDefaultLegacy(md52);
  const style = "";
  const cssLoader = (e) => {
    const t = GM_getResourceText(e), o = document.createElement("style");
    return o.innerText = t, document.head.append(o), t;
  };
  cssLoader("element-plus/dist/index.css");
  const v1 = 1;
  console.log("test");
  console.log({ v1 });
  console.log(`md5('114514')=${md5__default.default("114514")}`);
  console.log("document.readyState", document.readyState);
  console.log(client.monkeyWindow);
  if (client.unsafeWindow == window) {
    console.log("scope->host");
  } else {
    console.log("scope->monkey");
  }
  (_a = client.GM_cookie) == null ? void 0 : _a.list({}, (cookies, error) => {
    if (error) {
      console.log(error);
    } else {
      const [cookie] = cookies;
      if (cookie) {
        console.log(cookie);
      }
    }
  });
})(md5, (window.monkeyWindow = window, window));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS51c2VyLmpzIiwic291cmNlcyI6WyJDOi9Vc2Vycy9saXNvbmdlLy52c2NvZGUvdGVzdC50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB2MSA9IDE7XHJcbmNvbnNvbGUubG9nKCd0ZXN0Jyk7XHJcbiIsImltcG9ydCAnLi9zdHlsZS5jc3MnO1xuLy8gaW1wb3J0IHBuZ1VybCBmcm9tICcuL2Fzc2V0L3Rlc3QucG5nJztcbi8vIGltcG9ydCBzdmdVcmwgZnJvbSAnLi9hc3NldC9mYXZpY29uLnN2Zyc7XG5pbXBvcnQgbWQ1IGZyb20gJ2JsdWVpbXAtbWQ1Jztcbi8vIGltcG9ydCAnZWxlbWVudC1wbHVzL2Rpc3QvaW5kZXguY3NzJztcbmltcG9ydCAnZWxlbWVudC1wbHVzL2Rpc3QvaW5kZXguY3NzJztcblxuLy8gY29uc29sZS5sb2coeyBjc3MgfSk7XG5pbXBvcnQgeyB2MSB9IGZyb20gJ0Q6L1VzZXIvRG9jdW1lbnRzL2xpc29uZ2UvLnZzY29kZS90ZXN0JztcbmNvbnNvbGUubG9nKHsgdjEgfSk7XG5cbmNvbnNvbGUubG9nKGBtZDUoJzExNDUxNCcpPSR7bWQ1KCcxMTQ1MTQnKX1gKTsgLy9jNGQwMzhiNGJlZDA5ZmRiMTQ3MWVmNTFlYzNhMzJjZFxuY29uc29sZS5sb2coJ2RvY3VtZW50LnJlYWR5U3RhdGUnLCBkb2N1bWVudC5yZWFkeVN0YXRlKTsgLy8gaW50ZXJhY3RpdmVcblxuaW1wb3J0IHtcbiAgR01fY29va2llLFxuICB1bnNhZmVXaW5kb3csXG4gIG1vbmtleVdpbmRvdyxcbiAgR01fYWRkRWxlbWVudCxcbiAgR01faW5mbyxcbn0gZnJvbSAnJCc7XG5cbmNvbnNvbGUubG9nKG1vbmtleVdpbmRvdyk7XG5cbi8vIHRhbXBlcm1vbmtleSBvbmx5XG4vLyBHTV9hZGRFbGVtZW50ICYmIEdNX2FkZEVsZW1lbnQoJ2RpdicsIHsgaW5uZXJIVE1MOiAnaGVsbG8nIH0pO1xuXG5pZiAodW5zYWZlV2luZG93ID09IHdpbmRvdykge1xuICBjb25zb2xlLmxvZygnc2NvcGUtPmhvc3QnKTtcbn0gZWxzZSB7XG4gIGNvbnNvbGUubG9nKCdzY29wZS0+bW9ua2V5Jyk7XG59XG5cbi8vIHRhbXBlcm1vbmtleSBvbmx5XG5HTV9jb29raWU/Lmxpc3Qoe30sIChjb29raWVzLCBlcnJvcikgPT4ge1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW2Nvb2tpZV0gPSBjb29raWVzO1xuICAgIGlmIChjb29raWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvb2tpZSk7XG4gICAgICAvLyB7XG4gICAgICAvLyAgIFwiZG9tYWluXCI6IFwiaS5zb25nZS5saVwiLFxuICAgICAgLy8gICBcImh0dHBPbmx5XCI6IGZhbHNlLFxuICAgICAgLy8gICBcInNlY3VyZVwiOiBmYWxzZSxcbiAgICAgIC8vICAgXCJuYW1lXCI6IFwia1wiLFxuICAgICAgLy8gICBcInBhdGhcIjogXCIvXCIsXG4gICAgICAvLyAgIFwic2FtZVNpdGVcIjogXCJ1bnNwZWNpZmllZFwiLFxuICAgICAgLy8gICBcInZhbHVlXCI6IFwidlwiLFxuICAgICAgLy8gICBcInNlc3Npb25cIjogdHJ1ZSxcbiAgICAgIC8vICAgXCJob3N0T25seVwiOiB0cnVlXG4gICAgICAvLyB9XG4gICAgfVxuICB9XG59KTtcblxuLy8tLS0tLS0tLS10ZXN0IGNvZGUgZm9ybWF0LS0tLS0tLS1cbi8vIGltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tICcuL2Zvcm1hdCc7XG4vLyBjb25zb2xlLmxvZygnZm9ybWF0IHRzeCBjb2RlJyk7XG4vLyBjb25zdCB0c3hDb2RlID0gYGNvbnN0IEFwcD0oKT0+e3JldHVybig8ZGl2IGNsYXNzPXtzdHlsZXMuQXBwfT5cbi8vIDxoZWFkZXIgY2xhc3M9e3N0eWxlcy5oZWFkZXJ9PlxuLy8gPGltZyBzcmM9e2xvZ299IGNsYXNzPXtzdHlsZXMubG9nb30gYWx0PVwibG9nb1wiIC8+XG4vLyA8cD5cbi8vIEVkaXQgPGNvZGU+c3JjL0FwcC50c3g8L2NvZGU+IGFuZCBzYXZlIHRvIHJlbG9hZC5cbi8vIDwvcD5cbi8vIDxhXG4vLyBjbGFzcz17c3R5bGVzLmxpbmt9XG4vLyBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL3NvbGlkanMvc29saWRcIlxuLy8gdGFyZ2V0PVwiX2JsYW5rXCJcbi8vIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuLy8gPlxuLy8gTGVhcm4gU29saWRcbi8vIDwvYT5cbi8vIDwvaGVhZGVyPlxuLy8gPC9kaXY+XG4vLyApO1xuLy8gfTtgO1xuLy8gY29uc29sZS5sb2coZm9ybWF0Q29kZSh0c3hDb2RlLCAndHN4JykpO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iXSwibmFtZXMiOlsibWQ1IiwibW9ua2V5V2luZG93IiwidW5zYWZlV2luZG93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sUUFBTSxLQUFLO0FBQ2xCLFVBQVEsSUFBSSxNQUFNO0FDUWxCLFVBQVEsSUFBSSxFQUFFLEdBQUEsQ0FBSTtBQUVsQixVQUFRLElBQUksaUJBQWlCQSxhQUFJLFFBQUEsUUFBUSxHQUFHO0FBQzVDLFVBQVEsSUFBSSx1QkFBdUIsU0FBUyxVQUFVO0FBVXRELFVBQVEsSUFBSUMsT0FBQUEsWUFBWTtBQUt4QixNQUFJQyxPQUFBQSxnQkFBZ0IsUUFBUTtBQUMxQixZQUFRLElBQUksYUFBYTtBQUFBLEVBQzNCLE9BQU87QUFDTCxZQUFRLElBQUksZUFBZTtBQUFBLEVBQzdCO0FBR0EsZUFBQSxjQUFBLG1CQUFXLEtBQUssQ0FBQSxHQUFJLENBQUMsU0FBUyxVQUFVO0FBQ3RDLFFBQUksT0FBTztBQUNULGNBQVEsSUFBSSxLQUFLO0FBQUEsSUFBQSxPQUNaO0FBQ0MsWUFBQSxDQUFDLE1BQU0sSUFBSTtBQUNqQixVQUFJLFFBQVE7QUFDVixnQkFBUSxJQUFJLE1BQU07QUFBQSxNQVlwQjtBQUFBLElBQ0Y7QUFBQSxFQUNGOzsiLCJzb3VyY2VSb290IjoiL2h0dHBzOi8vZ2l0aHViLmNvbS9saXNvbmdlL2V4YW1wbGUvIn0=

Expected behavior userscript sourcemap is mapping correct variable

Actual behavior userscript sourcemap is mapping wrong variable

image

Environment:

  • chrome@Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36
  • Violentmonkey BETA@2.13.2.5

hello, I am developing dist.user.js sourcemap for vite-plugin-monkey

but I find Violentmonkey use wrapper function wrap userscript to run, It causes the code to offset N line backwards

and when use @require url, It also causes the code to offset N line backwards

so sourcemap will not map correct position

now I add sourcemap offset config for vite-plugin-monkey vite-plugin-monkey/src/node/types.ts#L308-L314 image

but the developer must know the number of lines of code offset in advance

and I find that the number of offset that Violentmonkey causes is different from the number of offset that Tampermonkey causes

This breaks the unity, It’s very inconvenient

so I hope Violentmonkey can automatically modify the inline sourcemap of userscript

it is very simple to modify sourcemap if you just set offset line

let userscriptCode = `xxx`;
let sourceMappingURL: string = findSourceMap(userscriptCode);
const sourceMap = JSON.parse(await (await fetch(sourceMappingURL)).text());

const wrapperOffset: number = N1;
const requireOffset: number = N2;
const othersOffset: number = N3;

// your offset line
sourceMap.mappings =
  ';'.repeat(wrapperOffset + requireOffset + othersOffset) + sourceMap.mappings;

sourceMappingURL = toB64DataUrl(sourceMap);
userscriptCode = replaceSourceMap(userscriptCode, sourceMappingURL);

so are you willing to support automatically modify sourcemap?

Issue Analytics

  • State:closed
  • Created a year ago
  • Comments:7 (5 by maintainers)

github_iconTop GitHub Comments

1reaction
tophfcommented, Oct 16, 2022

If you ever decide to convince the userscript engines we’re open to the idea.

Let the userscript developers do this themselves

That’s a good practical solution for now.

0reactions
lisongecommented, Oct 16, 2022

you’ll have to convince every userscript engine

I am lazy

Let the developer set the offset for userscript engine that they are using by themselves

Let the userscript developers do this themselves

Now my plugin does not seem to need additional feature modification about sourcemap

Read more comments on GitHub >

github_iconTop Results From Across the Web

Remove Comments From SourceMaps · Issue #49331 - GitHub
I have the following tsconfig "removeComments": true, "sourceMap": true, However the sourcemaps still contains comments.
Read more >
Use a source map — Firefox Source Docs documentation
A source map is a file that maps from the transformed source to the original ... include a comment in the transformed file,...
Read more >
Introduction to JavaScript Source Maps - Chrome Developers
Source maps are a way to map a combined/minified file back to an unbuilt state. When you build for production, along with minifying...
Read more >
Source Map Revision 3 Proposal
The original source map format (v1) was created by Joseph Schorr for use by Closure Inspector to enable source level debugging of optimized...
Read more >
4 Reasons Why Your Source Maps are Broken - Sentry Blog
To do that, browser agents expect your bundled JavaScript files to contain either a sourceMappingURL comment or return a SourceMap HTTP ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found