Skip to content

Individually packaging with multi-modules entry does not work #397

Open
@geovanisouza92

Description

@geovanisouza92

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 handler
  • entryFile receives entry without extension
  • entryFile is used to pick the right entry function from allEntryFunctions
  • allEntryFunctions is generated from the entries, where handlerFile is generated from function handlers on serverless.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)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions