EasyPost / easypost-node

EasyPost Shipping API Client Library for Node
https://easypost.com/docs/api
MIT License
139 stars 54 forks source link

[Bug]: Cannot instantiate new EasyPostClient in Nextjs 13 #439

Open oliviergabison opened 6 months ago

oliviergabison commented 6 months ago

Software Version

7.2.0

Language Version

20.10.0

Operating System

Mac OS 13.3.1

What happened?

  1. Imported easypost-node library
  2. Attempt to create new EasyPostClient via const client = new EasyPostClient(process.env.EASYPOST_API_KEY!);
  3. Upon building, error is thrown that .TypeError: a is not a function
  4. After commenting out the code, the app builds fine

What was expected?

To be able to build the app while using EasyPostClient

Sample Code

const client = new EasyPostClient(process.env.EASYPOST_API_KEY!);

Relevant logs

No response

nwithan8 commented 6 months ago

Hello @oliviergabison , thanks for reaching out and reporting this! We are currently investigating the issue, and will keep you updated.

nwithan8 commented 6 months ago

Hello @oliviergabison , just wanted to update you on our findings so far.

We've been able to recreate your issue trying to import the library into a Next.js 13 project, and have discovered the issue lies in the easypost-node > superagent > formidable > hexoid dependency chain. Specifically, formidable does not seem to be importing hexoid properly.

In our research, we came across another library that seems to be facing a similar issue, if any of the conversation there might be able to help you get unblocked: https://github.com/pubnub/javascript/issues/352. In the meantime, we'll continue investigating if there's anything we need/can fix with our library specifically.

Thanks again for reporting this!

jonknyc commented 2 months ago

I'm running into this as well

ralexmatthews commented 2 months ago

Ok, I think I finally found the issue. It is definitely a common issue with formidable + webpack

That last pull request actually provides a solution though. In the diff, in the Next.js config, you can see they create a webpack override for it. I did that as well, and it fixed the issue for me.

  1. Install webpack, npm i --save-dev webpack
  2. Change you next.config.js to include this:
    
    import webpack from "webpack";

/* @type {import('next').NextConfig} / const nextConfig = { webpack: (config) => { config.plugins.push( new webpack.NormalModuleReplacementPlugin( /^hexoid$/, "hexoid/dist/index.js" ) ); return config; }, };

export default nextConfig;

Justintime50 commented 1 month ago

@oliviergabison @jonknyc, did the override suggestion above help in your cases?

jonknyc commented 1 month ago

@oliviergabison @jonknyc, did the override suggestion above help in your cases?

I ended up just calling the API with fetch, instead of using the SDK.

e.g.

const response = await fetch("https://api.easypost.com/v2/trackers", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.EASYPOST_API_KEY}`,
    },
    body: JSON.stringify({
      tracker: {
        carrier,
        tracking_code: trackingCode,
      },
    }),
  })