Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ReferenceError on a bundle made by rollup #421

Closed
coderaiser opened this issue Jul 8, 2022 · 6 comments · Fixed by #2312
Closed

ReferenceError on a bundle made by rollup #421

coderaiser opened this issue Jul 8, 2022 · 6 comments · Fixed by #2312
Labels
bug Something isn't working transpiler parser || printer

Comments

@coderaiser
Copy link

I made a bundle of 🐊Putout that works on node.js and deno, but when I run with bun, I have an error:

coderaiser@localcmd:~/putout-bundle$ bun bundle/putout.js
58736 | 		        .build("expression")
58737 | 		        .field("expression", def("Expression"));
58738 | 		}
58739 | 		exports.default = default_1;
58740 | 		module.exports = exports["default"];
58741 | } (jsx, jsx.exports));
      ^
 ReferenceError: Can't find variable: jsx
      at requireJsx (/Users/coderaiser/putout-bundle/bundle/putout.js:58741:3)
      at /Users/coderaiser/putout-bundle/bundle/putout.js:59884:43
      at requireMain (/Users/coderaiser/putout-bundle/bundle/putout.js:59920:42)
      at /Users/coderaiser/putout-bundle/bundle/putout.js:76015:34
      at /Users/coderaiser/putout-bundle/bundle/putout.js:76073:6

When I extracted this function into a file jsx.js:

var jsx = {exports: {}};

var hasRequiredJsx;

function requireJsx () {
	if (hasRequiredJsx) return jsx.exports;
	hasRequiredJsx = 1;
	(function (module, exports) {
		Object.defineProperty(exports, "__esModule", { value: true });
		var tslib_1 = require$$0$8;
		var es_proposals_1 = (0, tslib_1.__importDefault)(requireEsProposals());
		var types_1 = (0, tslib_1.__importDefault)(requireTypes());
		var shared_1 = (0, tslib_1.__importDefault)(requireShared());
		function default_1(fork) {
		    fork.use(es_proposals_1.default);
		    var types = fork.use(types_1.default);
		    var def = types.Type.def;
		    var or = types.Type.or;
		    var defaults = fork.use(shared_1.default).defaults;
		    def("JSXAttribute")
		        .bases("Node")
		        .build("name", "value")
		        .field("name", or(def("JSXIdentifier"), def("JSXNamespacedName")))
		        .field("value", or(def("Literal"), // attr="value"
		    def("JSXExpressionContainer"), // attr={value}
		    def("JSXElement"), // attr=<div />
		    def("JSXFragment"), // attr=<></>
		    null // attr= or just attr
		    ), defaults["null"]);
		    def("JSXIdentifier")
		        .bases("Identifier")
		        .build("name")
		        .field("name", String);
		    def("JSXNamespacedName")
		        .bases("Node")
		        .build("namespace", "name")
		        .field("namespace", def("JSXIdentifier"))
		        .field("name", def("JSXIdentifier"));
		    def("JSXMemberExpression")
		        .bases("MemberExpression")
		        .build("object", "property")
		        .field("object", or(def("JSXIdentifier"), def("JSXMemberExpression")))
		        .field("property", def("JSXIdentifier"))
		        .field("computed", Boolean, defaults.false);
		    var JSXElementName = or(def("JSXIdentifier"), def("JSXNamespacedName"), def("JSXMemberExpression"));
		    def("JSXSpreadAttribute")
		        .bases("Node")
		        .build("argument")
		        .field("argument", def("Expression"));
		    var JSXAttributes = [or(def("JSXAttribute"), def("JSXSpreadAttribute"))];
		    def("JSXExpressionContainer")
		        .bases("Expression")
		        .build("expression")
		        .field("expression", or(def("Expression"), def("JSXEmptyExpression")));
		    var JSXChildren = [or(def("JSXText"), def("JSXExpressionContainer"), def("JSXSpreadChild"), def("JSXElement"), def("JSXFragment"), def("Literal") // Legacy: Esprima should return JSXText instead.
		        )];
		    def("JSXElement")
		        .bases("Expression")
		        .build("openingElement", "closingElement", "children")
		        .field("openingElement", def("JSXOpeningElement"))
		        .field("closingElement", or(def("JSXClosingElement"), null), defaults["null"])
		        .field("children", JSXChildren, defaults.emptyArray)
		        .field("name", JSXElementName, function () {
		        // Little-known fact: the `this` object inside a default function
		        // is none other than the partially-built object itself, and any
		        // fields initialized directly from builder function arguments
		        // (like openingElement, closingElement, and children) are
		        // guaranteed to be available.
		        return this.openingElement.name;
		    }, true) // hidden from traversal
		        .field("selfClosing", Boolean, function () {
		        return this.openingElement.selfClosing;
		    }, true) // hidden from traversal
		        .field("attributes", JSXAttributes, function () {
		        return this.openingElement.attributes;
		    }, true); // hidden from traversal
		    def("JSXOpeningElement")
		        .bases("Node")
		        .build("name", "attributes", "selfClosing")
		        .field("name", JSXElementName)
		        .field("attributes", JSXAttributes, defaults.emptyArray)
		        .field("selfClosing", Boolean, defaults["false"]);
		    def("JSXClosingElement")
		        .bases("Node")
		        .build("name")
		        .field("name", JSXElementName);
		    def("JSXFragment")
		        .bases("Expression")
		        .build("openingFragment", "closingFragment", "children")
		        .field("openingFragment", def("JSXOpeningFragment"))
		        .field("closingFragment", def("JSXClosingFragment"))
		        .field("children", JSXChildren, defaults.emptyArray);
		    def("JSXOpeningFragment")
		        .bases("Node")
		        .build();
		    def("JSXClosingFragment")
		        .bases("Node")
		        .build();
		    def("JSXText")
		        .bases("Literal")
		        .build("value", "raw")
		        .field("value", String)
		        .field("raw", String, function () {
		        return this.value;
		    });
		    def("JSXEmptyExpression")
		        .bases("Node")
		        .build();
		    def("JSXSpreadChild")
		        .bases("Node")
		        .build("expression")
		        .field("expression", def("Expression"));
		}
		exports.default = default_1;
		module.exports = exports["default"];
} (jsx, jsx.exports));
	return jsx.exports;
}

And run with bun jsx.js everything works fine, so maybe the reason is TO MANY VARIABLES in global scope, or something like this.

@Jarred-Sumner Jarred-Sumner added bug Something isn't working transpiler parser || printer labels Jul 8, 2022
@Jarred-Sumner
Copy link
Collaborator

Jarred-Sumner commented Jul 8, 2022

This is probably a symbol collision issue in bun's transpiler

If you change the file extension to .mjs or .cjs, does it still happen? Bun enables the JSX transform by default in .js files, but does not in any of the other non-jsx file extensions

@coderaiser
Copy link
Author

Yes it works with .mjs extension!

Bun enables the JSX transform by default in .js files, but does not in any of the other non-jsx file extensions

The thing is there is no JSX syntax in the bundle, it has @babel/parser included to have ability to parse files, since 🐊Putout is a code transformer.

@zolomatok
Copy link

I ran into the same error trying to use Pug which also imports Babel's parser.

Running...

import * as pug from 'pug'
let html = pug.compile('p Bun!')

... produces:

11657 |     throw error;
11658 |   }
11659 | }
11660 | const mixinPlugins = {
11661 |   estree,
11662 |   jsx,
      ^
 ReferenceError: Can't find variable: jsx
      at /Users/zolo/project/blog/node_modules/@babel/parser/lib/index.js:11662:2
      at bun:wrap:1:16430
      at /Users/zolo/project/blog/node_modules/constantinople/lib/index.js:3:23
      at bun:wrap:1:16430
      at /Users/zolo/project/blog/node_modules/pug-filters/lib/handle-filters.js:4:29
      at bun:wrap:1:16430
      at /Users/zolo/project/blog/node_modules/pug-filters/index.js:4:32
      at bun:wrap:1:16430
      at /Users/zolo/project/blog/node_modules/pug/lib/index.js:19:22
      at bun:wrap:1:16430
      at /Users/zolo/project/blog/server.ts:1:0

@coderaiser
Copy link
Author

Any progress on this?

@zolomatok
Copy link

I'd also love an update on this.

@zolomatok
Copy link

zolomatok commented Jan 12, 2023

@coderaiser Seems to have been solved in one of the latest releases.
I had the same problem with pug and I don't anymore.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working transpiler parser || printer
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants