tslib icon indicating copy to clipboard operation
tslib copied to clipboard

Wrong exports in tslib

Open jogibear9988 opened this issue 2 years ago • 9 comments

I think the "import" specifier in the exports section should also point to ES6 Version:

https://github.com/microsoft/tslib/blob/481d35218af580ec37a6a8f6b836b80cb1a245b3/package.json#L32

see spec: https://nodejs.org/api/packages.html#approach-1-use-an-es-module-wrapper

  Node.js implements the following conditions:
  
  "import" - matches when the package is loaded via import or import(), or via any top-level import or resolve operation by the ECMAScript module loader. Applies regardless of the module format of the target file. Always mutually exclusive with "require".
  "require" - matches when the package is loaded via require(). The referenced file should be loadable with require() although the condition matches regardless of the module format of the target file. Expected formats include CommonJS, JSON, and native addons but not ES modules as require() doesn't support them. Always mutually exclusive with "import".
  "node" - matches for any Node.js environment. Can be a CommonJS or ES module file. This condition should always come after "import" or "require".
  "node-addons" - similar to "node" and matches for any Node.js environment. This condition can be used to provide an entry point which uses native C++ addons as opposed to an entry point which is more universal and doesn't rely on native addons. This condition can be disabled via the --no-addons flag.
  "default" - the generic fallback that always matches. Can be a CommonJS or ES module file. This condition should always come last.

so there is no "module" specifier, but it is often used, I know. But if I want to import acording to spec, my site would load the one with "import" and then it would fail cause this is not usable by imports

jogibear9988 avatar Nov 20 '21 16:11 jogibear9988

fix https://github.com/microsoft/tslib/pull/162

jogibear9988 avatar Nov 20 '21 16:11 jogibear9988

tslib.es6.js predates NodeJS's support for ES Modules. If you change the "import" directive in the export map as you've proposed, NodeJS will attempt to load the file as a CommonJS module, resulting in the following error:

SyntaxError Unexpected token 'export'

The tslib.es6.js file can be used in the browser, but not in NodeJS.

We currently use "import": "./modules/index.js", as that file is in a directory with a package.json that includes { "type": "module" } so that NodeJS will treat it as an ES Module. That file simply re-exports the CommonJS tslib.js module.

From our tests, this is working as expected. What is the actual issue you are running into?

rbuckton avatar Feb 08 '22 17:02 rbuckton

My problem is, I don't use a package manager, I host directly the javascript emited from typescript, and this points to "./node_modules/tslib". Now my webserver follows the resolution strategy and rewrites the import to tslib.js, cause there is no definition of "module" for the export in the spec of nodejs

jogibear9988 avatar Feb 08 '22 18:02 jogibear9988

Maybe switching the package.json to type"module" would fix this? so the export with "main" and "require" should point to a comonJS module then, and the rest to es6?

jogibear9988 avatar Feb 08 '22 18:02 jogibear9988

We can't change the root package.json in tslib to "type": "module" without breaking tslib.js. That's the reason we have a modules folder that has its own package.json.

rbuckton avatar Feb 08 '22 18:02 rbuckton

Will #171 address your needs?

rbuckton avatar Feb 08 '22 18:02 rbuckton

I think this would work.

jogibear9988 avatar Feb 08 '22 18:02 jogibear9988

thx

jogibear9988 avatar Feb 08 '22 18:02 jogibear9988

Is there hope of getting this resolved even thought #171 has a disapproval?

As far as I know, "module" isn't one of the standard export conditions, and "import" is the condition that should point to a standard JS module.

We're hitting issues where we load tslib as a standard module, and get the error:

The requested module '../tslib' does not provide an export named 'default'

justinfagnani avatar Apr 26 '23 22:04 justinfagnani