geolib
geolib copied to clipboard
Cannot importing using Node.js native ESM
When trying to import this library with the native support for ESM that's available in Node.js 12, 14, and 16 I'm running into the following problem:
import { isPointInPolygon } from 'geolib';
^^^^^^^^^^^^^^^^
SyntaxError: Named export 'isPointInPolygon' not found. The requested module 'geolib' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:
import pkg from 'geolib';
const { isPointInPolygon } = pkg;
at ModuleJob._instantiate (node:internal/modules/esm/module_job:124:21)
at async ModuleJob.run (node:internal/modules/esm/module_job:179:5)
at async Loader.import (node:internal/modules/esm/loader:178:24)
at async Object.loadESM (node:internal/process/esm_loader:68:5)
at async handleMainPromise (node:internal/modules/run_main:63:12)
According to the readme it seems like this should work:
I think that the problem is that the package.json is missing the exports key which describes how the module should be loaded by the native Node.js ESM.
This is documented here: https://nodejs.org/api/packages.html#packages_package_entry_points
Basically, I think that something like this should be added:
"exports": {
".": "./es/index.js"
}
I will try this and submit a PR if it works 🚀
@manuelbieh another approach would be to release a breaking change that drops CommonJS altogether. That would be my recommendation!
Many packages are moving to this since all current versions of Node.js supports ESM now 🚀
You can read about Sindres approach (which I, and many other maintainers are also using) here: https://github.com/sindresorhus/meta/discussions/15
It is as simple as:
yarn add --dev esbuild- Update typescript to latest version
- Update tsconfig.json
yarn tscyarn esbuild dist/tsc/*.js --outdir=dist/tsc --minify --allow-overwrite- Remove babel/webpack etc. :) less boilerplate
tsconfig.json:
{
"compilerOptions": {
"target": "es2017",
"lib": [
"es2018",
"dom"
],
"outDir": "dist/tsc",
"rootDir": "src/",
"allowJs": false,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": false,
"declaration": true,
"declarationDir": "dist/types",
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"strictNullChecks": true
},
"include": [
"src/**/*.ts",
"src/**/*.d.ts"
],
"exclude": [
"node_modules",
"**/*.test.ts"
]
}
Some update?