evanw / esbuild

An extremely fast bundler for the web
https://esbuild.github.io/
MIT License
37.93k stars 1.13k forks source link

`OnLoad` in custom plugin is called for disabled modules #3629

Open alan-agius4 opened 7 months ago

alan-agius4 commented 7 months ago

OnLoad in custom plugin is called for disabled modules, this causes the module not to no longer be "empty".

Reproduction entry.js

import url from 'url';
console.log("urlTest", url);

package.json

{
  "name": "test",
  "version": "0.0.0",
  "browser": {
    "url": false
  },
  "dependencies": {
    "url": "0.11.3"
  }
}
require("esbuild").build({
  bundle: true,
  outdir: "dist",
  entryPoints: ["./entry.js"],
  plugins: [
    {
      name: "plugin",
      setup(build) {
        build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, (args) => {
          return {
            contents: `console.log('foo')`,
            loader: "js",
          };
        });
      },
    },
  ],
});

Actual

"use strict";
(() => {
  // entry.js
  console.log("foo");
})();

Expected

If a module is disabled, the OnLoad won't be triggered. Another option is to include a context indicator in the onLoad arguments, signaling that the module is disabled. This way, the custom loader can decide whether or not to return data.

"use strict";
(() => {
  var __create = Object.create;
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __getProtoOf = Object.getPrototypeOf;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __commonJS = (cb, mod) => function __require() {
    return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
  };
  var __copyProps = (to, from, except, desc) => {
    if (from && typeof from === "object" || typeof from === "function") {
      for (let key of __getOwnPropNames(from))
        if (!__hasOwnProp.call(to, key) && key !== except)
          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
    }
    return to;
  };
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
    // If the importer is in node compatibility mode or this is not an ESM
    // file that has been converted to a CommonJS file using a Babel-
    // compatible transform (i.e. "__esModule" has not been set), then set
    // "default" to the CommonJS "module.exports" for node compatibility.
    isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
    mod
  ));

  // (disabled):node_modules/url/url.js
  var require_url = __commonJS({
    "(disabled):node_modules/url/url.js"() {
    }
  });

  // entry.js
  var import_url = __toESM(require_url());
  console.log("urlTest", import_url.default);
})();

Esbuild version: 0.20.0

JonasSchoenwald commented 1 month ago

What is the status of this ticket?

This is causing problems with the new angular17+ esbuild system and various packages