rollbar / rollbar.js

Error tracking and logging from Javascript to Rollbar

Home Page:https://docs.rollbar.com/docs/javascript

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Rollbar.init() not accept "module" option field when use locals

yamotuki opened this issue · comments

Problem

I wanted to use "Locals".

I called init function with bellow options.

Rollbar.init({
      accessToken: token,
      captureUncaught: true,
      locals: {
        locals: require('rollbar/src/server/locals'),
        depth: 2,
        uncaughtOnly: false,
        enabled: true
      }
    }
)

Then I get errors.

TypeError 
Locals is not a constructor

node_modules/rollbar/src/server/rollbar.js:71:
initLocals
node_modules/rollbar/src/server/rollbar.js:47:
new Rollbar
node_modules/rollbar/src/server/rollbar.js:79:
Function.module.exports../node_modules/rollbar/src/server/rollbar.js.Rollbar.init
app/plugins/rollbar.ts:22:
module.exports../app/plugins/rollbar.ts.__webpack_exports__.default
.nuxt/index.js:252:
createApp
.nuxt/server.js:97:
module.exports../.nuxt/server.js.__webpack_export

The reason is that options have not "module" field. Because type not accept "module".

index.d.ts descrive as bellow.

    class Locals {}
    export type LocalsType = typeof Locals;
    export type LocalsOptions = LocalsType | LocalsSettings;
    export interface LocalsSettings {
        locals: LocalsType,
        enabled?: boolean;
        uncaughtOnly?: boolean;
        depth?: number;
        maxProperties?: number;
        maxArray?: number;
    }

Workaround

I found that the code with follows options can be excuted.

{
      accessToken: token,
      captureUncaught: true,
      locals: {
        locals: require('rollbar/src/server/locals'),
        depth: 2,
        uncaughtOnly: false,
        enabled: true,
        // @ts-ignore
        module: require('rollbar/src/server/locals')
      }

suggestion for resolution

rollbar/src/server/rollbar.js:65 should be changed.

This is current code.

  var Locals;
  if (typeof localsOptions === 'function') {
    Locals = localsOptions;
    localsOptions = null; // use defaults
  } else if (_.isType(localsOptions, 'object')) {
    Locals = localsOptions.module;
    delete localsOptions.module;
  } else {
    logger.error('options.locals or options.locals.module must be a Locals module');
    return null;
  }
  return new Locals(localsOptions, logger);

suggestion code

  var Locals;
  if (typeof localsOptions === 'function') {
    Locals = localsOptions;
    localsOptions = null; // use defaults
  } else if (_.isType(localsOptions, 'object')) {
    if (localsOptions.module) {
      Locals = localsOptions.module;
      delete localsOptions.module;
    } else if (localsOptions.locals) {
      Locals = localsOptions.locals;
      delete localsOptions.locals;
    }
  } else {
    logger.error('options.locals or options.locals.module must be a Locals module');
    return null;
  }
  return new Locals(localsOptions, logger);

If Needed, I can create pull request.

This is an issue with the type declaration.