serverless-plugin-typescript icon indicating copy to clipboard operation
serverless-plugin-typescript copied to clipboard

Local import as symblink in node_module not added in .dist/node_module

Open MaximeLozach opened this issue 3 years ago • 4 comments

Hi,

I have some import in my project that depends on local commons module shared between my different functions. I don't want to put them on public npm and don't have some kind of nexus. I import my local common module like this :

"dependencies": {
  "database": "file:../../libs/database",
  "lambda-utils": "file:../../libs/lambda-utils",
  "s3-utils": "file:../../libs/s3-utils",
  ...
}

Until now I was with plain JS and I had no issue with serverless. My node_module seems to be well imported with the symlink of my local modules. I now try to integrate TS, and so I added your plugin. But when I deploy, at runtime I've got error as my import to my local module can't be found.

{
    "errorType": "Error",
    "errorMessage": "Cannot find package 'database' imported from /var/task/src/functions/get-report-detail.js",
    "code": "ERR_MODULE_NOT_FOUND",
    "stack": [
        "Error [ERR_MODULE_NOT_FOUND]: Cannot find package database' imported from /var/task/src/functions/get-report-detail.js",
        "    at new NodeError (internal/errors.js:322:7)",
        "    at packageResolve (internal/modules/esm/resolve.js:732:9)",
        "    at moduleResolve (internal/modules/esm/resolve.js:773:18)",
        "    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:887:11)",
        "    at Loader.resolve (internal/modules/esm/loader.js:89:40)",
        "    at Loader.getModuleJob (internal/modules/esm/loader.js:242:28)",
        "    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:76:40)",
        "    at link (internal/modules/esm/module_job.js:75:36)",
        "    at process.runNextTicks [as _tickCallback] (internal/process/task_queues.js:60:5)",
        "    at /var/runtime/deasync.js:23:15"
    ]
}

In S3 where the code is store for my function, I can see that .dist/node_module is missing my local module.

MaximeLozach avatar May 23 '22 14:05 MaximeLozach

@MaximeLozach Did you ever get this resolved? I'm running into this same issue. Seems this plugin doesn't work with symlinked node_modules packages.

chinanderm avatar Dec 07 '22 00:12 chinanderm

Well not really. We use the registry of gitlab to push our lib as artifact that get imported via npm. The mecanism is the same as public artifact so their is no problem now for us. But is still think my issue is a problem for project that can't for some reason, put their package on private/public repository.

MaximeLozach avatar Dec 07 '22 07:12 MaximeLozach

Same issue. I have a local symlinked package that is not included in the build package.

wernc23 avatar Jan 13 '23 02:01 wernc23

I ended up forking the package and using the dereference feature of fs.copySync to copy the symlinked dependencies.

fs.copySync(
  path.resolve('node_modules'),
  path.resolve(path.join(BUILD_FOLDER, 'node_modules')),    
    {
      dereference: true,
    }
 )

Ironically, my forked version ended up being symlinked.

chinanderm avatar Jan 13 '23 02:01 chinanderm