calvinmetcalf / shapefile-js

Convert a Shapefile to GeoJSON. Not many caveats.
http://calvinmetcalf.github.io/shapefile-js/
714 stars 228 forks source link

Error with require() for ES Module in Node.js Environment #208

Open cfdavidpetter opened 2 months ago

cfdavidpetter commented 2 months ago

Issue Description:

When using the shpjs library in a Node.js environment (specifically version 21.1.0), an error occurs related to the use of require() for ES modules, resulting in the following error:

const shapefile = __importStar(require("shpjs"));

Error [ERR_REQUIRE_ESM]: require() of ES Module /app/node_modules/shpjs/lib/index.js from /app/dist/shared/infra/Shapefile.js not supported.
Instead change the require of index.js in /app/dist/shared/infra/Shapefile.js to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/app/dist/shared/infra/Shapefile.js:27:32) {
  code: 'ERR_REQUIRE_ESM'
}

Steps to Reproduce:

  1. Use the shpjs library in a Node.js environment (version 21.1.0).
  2. Attempt to import and use the library in a CommonJS module.
  3. Encounter the ERR_REQUIRE_ESM error when the module is loaded.

Expected Behavior:

The shpjs library should be usable in Node.js environments without encountering errors related to ES module syntax.

Environment:

Node.js version: 21.1.0 Operating System: Docker FROM node:21.1.0

Additional Information:

This issue was resolved by updating to version 4.0.4 of the shpjs library. However, it would be beneficial to ensure compatibility with older versions of Node.js or provide guidance on the supported Node.js versions in the library documentation.

calvinmetcalf commented 2 months ago

What version were you using when you got the error?

cfdavidpetter commented 2 months ago

"shpjs": "5.0.0",

calvinmetcalf commented 2 months ago

you're already using typescript, just import it like an es module

Plitzer commented 1 month ago

This should definitely be addressed. I can't use this in an AWS Lambda function for this exact reason.

Building from typescript results in a js file that always has require('shpjs') even if you use a dynamic import()

calvinmetcalf commented 1 month ago

import is the way the wind is blowing in node, I resisted it too but gave in. You can either use dynamic import or just use the old 4.x version.