solidjs / vite-plugin-solid

A simple integration to run solid-js with vite
440 stars 51 forks source link

Object destructuring inside namespaces causes other exports to disappear #113

Open AFatNiBBa opened 1 year ago

AFatNiBBa commented 1 year ago

I have a file containing the following code:

namespace B {
    export function c() { }
}

export namespace A {
    export const { c } = B; 
    export function a() { }
    export function b() { }
}

console.log(A);

When building it with vite it gets turned to this:

(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
    typeof define === 'function' && define.amd ? define(['exports'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.alfa = {}));
})(this, (function (exports) { 'use strict';

    var B;
    ((B2) => {
      function c() {
      }
      B2.c = c;
    })(B || (B = {}));
    exports.A = void 0;
    ((A2) => {
      ({ c: A2.c } = B);
      function a() {
      }
      A2.a = a;
      function b() {
      }
      A2.b = b;
    })(exports.A || (exports.A = {}));
    console.log(exports.A);

    Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

}));

And if I run it, it logs { c: [Function: c], a: [Function: a], b: [Function: b] }. If I use vite-plugin-solid AND the file is a .tsx, the build result is the following:

(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
    typeof define === 'function' && define.amd ? define(['exports'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.alfa = {}));
})(this, (function (exports) { 'use strict';

    let B;
    (function (_B) {
      function c() {}
      _B.c = c;
    })(B || (B = {}));
    exports.A = void 0;
    (function (_A) {
      const {
        c
      } = B;
      _A.c = c;
      function b() {}
      _A.b = b;
    })(exports.A || (exports.A = {}));
    console.log(exports.A);

    Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
}));

And it outputs { c: [Function: c], b: [Function: b] } when ran. Why does "A.a" gets removed from the namespace? Moreover, why does changing the code like this works?

namespace B {
    export function c() { }
}

export namespace A {
    export function a() { }
    export function b() { }
    export const { c } = B; // ← Moved on the bottom of the namespace
}

console.log(A);