curlconverter / curlconverter

Transpile curl commands into Python, JavaScript and 27 other languages
https://curlconverter.com
MIT License
7.17k stars 867 forks source link

As Library Usage Error - Next JS Server Side #640

Open mym0404 opened 2 months ago

mym0404 commented 2 months ago

Version: 4.9.0

I want to use this library in Next JS Server Side(router handler).

But loading wasm binding process seems to be broken.

Log says failed to find build/Release/tree_sitter_bash_binding.

In my node_modules, the binding file exists like this.

image

image

Is there any suggestion or is it bug really?

/Users/mj/.nvm/versions/node/v18.19.0/bin/yarn run dev
   ▲ Next.js 14.1.2
   - Local:        http://localhost:3000
   - Environments: .env.development.local, .env
   - Experiments (use at your own risk):
     · instrumentationHook

 ✓ Compiled /instrumentation in 195ms (20 modules)
 ✓ Ready in 1980ms
 ○ Compiling /curl-convert ...
 ✓ Compiled /curl-convert in 5.7s (3857 modules)
 ○ Compiling /api/curl-convert ...
 ✓ Compiled /api/curl-convert in 2s (2218 modules)
 ⚠ ./node_modules/@curlconverter/tree-sitter-bash/bindings/node/index.js
Module not found: Can't resolve '../../build/Release/tree_sitter_bash_binding' in '/Users/mj/Desktop/suited/node_modules/@curlconverter/tree-sitter-bash/bindings/node'

Import trace for requested module:
./node_modules/@curlconverter/tree-sitter-bash/bindings/node/index.js
./node_modules/curlconverter/dist/src/shell/Parser.js
./node_modules/curlconverter/dist/src/shell/tokenizer.js
./node_modules/curlconverter/dist/src/parse.js
./node_modules/curlconverter/dist/src/generators/csharp.js
./node_modules/curlconverter/dist/src/index.js
./src/app/api/curl-convert/route.ts

./node_modules/@curlconverter/tree-sitter-bash/bindings/node/index.js
Module not found: Can't resolve '../../build/Debug/tree_sitter_bash_binding' in '/Users/mj/Desktop/suited/node_modules/@curlconverter/tree-sitter-bash/bindings/node'

Import trace for requested module:
./node_modules/@curlconverter/tree-sitter-bash/bindings/node/index.js
./node_modules/curlconverter/dist/src/shell/Parser.js
./node_modules/curlconverter/dist/src/shell/tokenizer.js
./node_modules/curlconverter/dist/src/parse.js
./node_modules/curlconverter/dist/src/generators/csharp.js
./node_modules/curlconverter/dist/src/index.js
./src/app/api/curl-convert/route.ts

./node_modules/tree-sitter/index.js
Module not found: Can't resolve './build/Release/tree_sitter_runtime_binding' in '/Users/mj/Desktop/suited/node_modules/tree-sitter'

Import trace for requested module:
./node_modules/tree-sitter/index.js
./node_modules/curlconverter/dist/src/shell/Parser.js
./node_modules/curlconverter/dist/src/shell/tokenizer.js
./node_modules/curlconverter/dist/src/parse.js
./node_modules/curlconverter/dist/src/generators/csharp.js
./node_modules/curlconverter/dist/src/index.js
./src/app/api/curl-convert/route.ts

./node_modules/tree-sitter/index.js
Module not found: Can't resolve './build/Debug/tree_sitter_runtime_binding' in '/Users/mj/Desktop/suited/node_modules/tree-sitter'

Import trace for requested module:
./node_modules/tree-sitter/index.js
./node_modules/curlconverter/dist/src/shell/Parser.js
./node_modules/curlconverter/dist/src/shell/tokenizer.js
./node_modules/curlconverter/dist/src/parse.js
./node_modules/curlconverter/dist/src/generators/csharp.js
./node_modules/curlconverter/dist/src/index.js
./src/app/api/curl-convert/route.ts

Also, I was understand Server Side(node js) env doesn't require any webpack wasm copy process. Isn't it?

My next.config.mjs

const nextConfig = (phase, { defaultConfig }) => {
  /** @type {import('next').NextConfig} */
  const config = {
    ... others
  };

  if (phase === PHASE_PRODUCTION_SERVER || phase === PHASE_DEVELOPMENT_SERVER) {
    return {
      ...config,
      webpack: (config) => {
        config.module = {
          ...config.module,
          rules: [...config.module.rules, { test: /\.node$/, use: 'node-loader' }],
        };

        // config.resolve.fallback = {
        //   ...config.resolve.fallback,
        //   path: require.resolve('path-browserify'),
        //   fs: false,
        //   stream: require.resolve('stream-browserify'),
        //   util: require.resolve('util/'),
        //   url: require.resolve('url/'),
        //   querystring: require.resolve('querystring-es3'),
        //   string_decoder: require.resolve('string_decoder/'),
        //   buffer: require.resolve('buffer/'),
        // };

        config.experiments = {
          ...config.experiments,
          topLevelAwait: true,
        };

        // config.plugins = [
        //   ...config.plugins,
        //   new CopyPlugin({
        //     patterns: [
        //       'node_modules/web-tree-sitter/tree-sitter.wasm',
        //       'node_modules/curlconverter/dist/tree-sitter-bash.wasm',
        //     ],
        //   }),
        // ];

        return config;
      },
    };
  }

  return config;
};
agniokas commented 2 days ago

Hi, I am facing similar issue when i try to run my app in dynamic env. The issue doesn't exist while running it locally. Have you found any solution yet to this @mym0404?

⨯ Error: Error loading shared library /app/node_modules/tree-sitter/build/Release/tree_sitter_runtime_binding.node: Exec format error at Module._extensions..node (node:internal/modules/cjs/loader:1460:18) at Module.load (node:internal/modules/cjs/loader:1203:32) at Module._load (node:internal/modules/cjs/loader:1019:12) at Module.require (node:internal/modules/cjs/loader:1231:19) at mod.require (/app/node_modules/next/dist/server/require-hook.js:65:28) at require (node:internal/modules/helpers:177:18) at Object. (/app/node_modules/tree-sitter/index.js:3:13) at Module._compile (node:internal/modules/cjs/loader:1364:14) at Module._extensions..js (node:internal/modules/cjs/loader:1422:10) at Module.load (node:internal/modules/cjs/loader:1203:32) { code: 'ERR_DLOPEN_FAILED' }