Open
Description
This is a Bug Report
Description
I'm customizing entries on webpack to inject common funcionality, like source-map support and tracing modules. If I package functions individually, it does not work.
I tracked the issue to this line where the entry value is an array, and the path module is applied incorrectly.
If I understood correctly:
entry
receives the relative filename of each handlerentryFile
receivesentry
without extensionentryFile
is used to pick the right entry function fromallEntryFunctions
allEntryFunctions
is generated from the entries, wherehandlerFile
is generated from function handlers onserverless.yml
.
So, we could just use the key
that is the entrypoints based on serverless "handler" configurations, and the problem will be solved.
For bug reports:
- What went wrong?
When I enabled individual packaging and use multiple modules for each entry, it throw the error "Path must be a string. Received [ './source-map-install.js', (redacted) ]"
- What did you expect should have happened?
The commands sls invoke local
and sls webpack
working fine.
- What was the config you used?
serverless.yml
service:
name: (redacted)
plugins:
- serverless-webpack
- serverless-offline
provider:
name: aws
runtime: nodejs6.10
functions:
ping:
handler: src/functions/ping.handler
events:
- http:
method: get
path: ping
# (there are more functions here redacted)
router:
handler: src/functions/router.handler
events:
- http:
method: post
path: /new
api:
handler: src/functions/api.handler
events:
- http:
method: post
path: /api
custom:
stage: ${opt:stage, self:provider.stage}
serverless-offline:
port: 4000
stage: ${self:custom.stage}
package:
individually: true
webpack.config.js
const path = require("path");
const slsw = require("serverless-webpack");
const { stage } = slsw.lib.serverless.service.custom;
const tracingModule = stage === "dev" ? "./src/tracing/jaeger/index.ts" : "./src/tracing/xray/index.ts";
const entries = Object.keys(slsw.lib.entries).reduce((entries, key) => {
entries[key] = ["./source-map-install.js", tracingModule, slsw.lib.entries[key]];
return entries;
}, {});
module.exports = {
entry: entries,
devtool: "source-map",
externals: ["aws-sdk"],
resolve: {
extensions: [".js", ".jsx", ".json", ".ts", ".tsx"],
},
output: {
libraryTarget: "commonjs",
path: path.join(__dirname, ".webpack"),
filename: "[name].js",
},
target: "node",
module: {
loaders: [{ test: /\.ts(x?)$/, loader: "ts-loader" }],
},
};
- What stacktrace or error message from your provider did you see?
Stack Trace --------------------------------------------
TypeError: Path must be a string. Received [ './source-map-install.js', (redacted) ]
at assertPath (path.js:28:11)
at Object.relative (path.js:1252:5)
at entryFunctions._.flatMap ((redacted)/packages/functions/node_modules/serverless-webpack/lib/validate.js:154:28)
at (redacted)/packages/functions/node_modules/lodash/lodash.js:3563:27
at (redacted)/packages/functions/node_modules/lodash/lodash.js:4925:15
at baseForOwn ((redacted)/packages/functions/node_modules/lodash/lodash.js:3010:24)
at (redacted)/packages/functions/node_modules/lodash/lodash.js:4894:18
at baseMap ((redacted)/packages/functions/node_modules/lodash/lodash.js:3562:7)
at map ((redacted)/packages/functions/node_modules/lodash/lodash.js:9554:14)
at Function.flatMap ((redacted)/packages/functions/node_modules/lodash/lodash.js:9257:26)
at ServerlessWebpack.validate ((redacted)/packages/functions/node_modules/serverless-webpack/lib/validate.js:153:31)
From previous event:
at Object.webpack:validate:validate [as hook] ((redacted)/packages/functions/node_modules/serverless-webpack/index.js:119:10)
at BbPromise.reduce ((redacted)/packages/functions/node_modules/serverless/lib/classes/PluginManager.js:372:55)
From previous event:
at PluginManager.invoke ((redacted)/packages/functions/node_modules/serverless/lib/classes/PluginManager.js:372:22)
at PluginManager.spawn ((redacted)/packages/functions/node_modules/serverless/lib/classes/PluginManager.js:390:17)
at ServerlessWebpack.BbPromise.bind.then ((redacted)/packages/functions/node_modules/serverless-webpack/index.js:111:51)
From previous event:
at Object.webpack:webpack [as hook] ((redacted)/packages/functions/node_modules/serverless-webpack/index.js:111:10)
at BbPromise.reduce ((redacted)/packages/functions/node_modules/serverless/lib/classes/PluginManager.js:372:55)
From previous event:
at PluginManager.invoke ((redacted)/packages/functions/node_modules/serverless/lib/classes/PluginManager.js:372:22)
at PluginManager.run ((redacted)/packages/functions/node_modules/serverless/lib/classes/PluginManager.js:403:17)
at variables.populateService.then ((redacted)/packages/functions/node_modules/serverless/lib/Serverless.js:102:33)
at runCallback (timers.js:794:20)
at tryOnImmediate (timers.js:752:5)
at processImmediate [as _immediateCallback] (timers.js:729:5)
From previous event:
at Serverless.run ((redacted)/packages/functions/node_modules/serverless/lib/Serverless.js:89:74)
at serverless.init.then ((redacted)/packages/functions/node_modules/serverless/bin/serverless:42:50)
at <anonymous>
Additional Data
- Serverless-Webpack Version you're using: 4.0.0
- Webpack version you're using: 3.6.0
- Serverless Framework Version you're using: 1.27.2
- Operating System: Windows Subsystem for Linux on Windows 10
- Stack Trace (if available): (above)