module definition does not comply with ES6 modules and type definitions
Closed this issue · 11 comments
The way to import moize should be
import moize from "moize";
Instead one have to import it as
import * as moize from "moize"
Since the last two lines of the moize module are
exports.default = moize;
module.exports = exports['default'];
Instead of simply
exports.default = moize;
This does not comply with ES6 modules since a default import
should return an object with a default
property containing the default export
value instead of returning directly the exported value
I'm not quite understanding the problem ... how does this surface? The way you describe how it should be imported is the way that is recommended, and the way you say you have to import it will not actually work since multiple exports to not exist... Each type (moize.simple
, for example) is a property on the moize function, not a separate export.
Can you put together a codebin example that showcases the problem?
I'm writing the codebin, I think the problem lies on the babel-plugin-add-module-exports
, since the correct way to export a default export is exports.default = mydefault
and the plugin restores a babel 5 hack that was fixed on babel 6
Please check the thread babel/babel#2212
Another fix would be to change the typescript typings. at the end of the index.d.ts
replace
export default moize
with
export = moize
Oh yes that creates the code you're talking about, I'm just not understanding the problem you describe with the result. Then implementing it in a variety of contexts, in has worked for me.
EDIT: Also, what you are describing is only true of the lib
folder, which has the modules transpiled back to CommonJS. If you want to use the pure ES6 module syntax, use the export from the es
folder ... this does not transpile the modules. This should be automatically triggered by build systems that support module
declaration on package.json
instead of main
, but if not you can just do:
import moize from 'moize/es';
I made a simple repository showing the problem
https://github.com/RafaelSalguero/moizeDefaultExportProblem/tree/master
It looks like babel inserts the _interopRequireDefault
as a fix for the old babel-5 export hack. Typescript does not implement this hack thus babel 5 modules are not compatible with typescript. This explanation is detailed on the microsoft/TypeScript#5565
Have you attempted what I recommended above? Importing instead from the es
folder instead?
import moize from 'moize/es';
This does not have the same export override as that in the lib
folder.
I made the test and node throws an error since import its not supported on node yet. This fails on the simple repository.
SyntaxError: Unexpected token import
at createScript (vm.js:74:10)
at Object.runInThisContext (vm.js:116:10)
at Module._compile (module.js:537:28)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Module.require (module.js:517:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (C:\Users\rafael\Desktop\moize import\index.js:3:14)
So just so that I understand the context that you are having this problem in:
- You are using
moize
in a nodejs (non-browser) environment - You are using typescript (which requires the
export default
syntax instead of themodule.exports
syntax)
Is this correct? If so ... how can you consume any commonjs module? I don't use typescript, so I don't understand why it is assuming a default
property would exist (because that seems like it would break any commonjs module that uses the module.exports
syntax)?
EDIT: This issue has been discussed at length here: microsoft/TypeScript#2719
A possibility may be to provide an additional default
property on the moize
function that references itself:
moize.default = moize;
It feels janky, but it was one of the recommended courses of action and would solve this problem without breaking the current behavior. I'll experiment with this.
So I just created a PR (feel free to take a look), but like I said I don't use TS (the typings were provided by the community) so this is mainly educated guesswork. If this doesn't do the trick, I may need to lean on you or the community at large for a PR to provide a more proper resolution.
It look fine to me, I'll give it a test and summit another PR in case of any problem. Thanks!
Cool, I'll merge and release tonight once I get home.
Fix released as 4.0.4
, let me know if you have any more issues.