Skip to content

Commit

Permalink
refactor: Seclude ServerlessError into lib/serverless-error.js
Browse files Browse the repository at this point in the history
  • Loading branch information
medikoo committed Jan 11, 2021
1 parent b61621a commit 87790e5
Show file tree
Hide file tree
Showing 16 changed files with 68 additions and 72 deletions.
2 changes: 1 addition & 1 deletion lib/Serverless.js
Expand Up @@ -14,7 +14,7 @@ const Utils = require('./classes/Utils');
const Service = require('./classes/Service');
const Variables = require('./classes/Variables');
const ConfigSchemaHandler = require('./classes/ConfigSchemaHandler');
const ServerlessError = require('./classes/Error').ServerlessError;
const ServerlessError = require('./serverless-error');
const version = require('./../package.json').version;
const isStandaloneExecutable = require('./utils/isStandaloneExecutable');
const resolveCliInput = require('./utils/resolveCliInput');
Expand Down
14 changes: 1 addition & 13 deletions lib/classes/Error.js
@@ -1,6 +1,7 @@
'use strict';

const chalk = require('chalk');
const ServerlessError = require('../serverless-error');

const consoleLog = (message) => {
console.log(message); // eslint-disable-line no-console
Expand All @@ -23,19 +24,6 @@ const writeMessage = (title, message) => {
consoleLog(' ');
};

class ServerlessError extends Error {
constructor(message, code) {
super(message);
this.code = code;
Error.captureStackTrace(this, this.constructor); // Not needed in Node.js v8+
}
}
Object.defineProperty(ServerlessError.prototype, 'name', {
value: ServerlessError.name,
configurable: true,
writable: true,
});

module.exports.ServerlessError = ServerlessError;

// Deprecated - use ServerlessError instead
Expand Down
2 changes: 1 addition & 1 deletion lib/loadEnv.js
Expand Up @@ -2,7 +2,7 @@

const dotenv = require('dotenv');
const path = require('path');
const ServerlessError = require('./classes/Error').ServerlessError;
const ServerlessError = require('./serverless-error');

const isMissingFileError = (error) => error.code === 'ENOENT';

Expand Down
Expand Up @@ -2,7 +2,7 @@

const _ = require('lodash');
const BbPromise = require('bluebird');
const ServerlessError = require('../../../../../../../../classes/Error').ServerlessError;
const ServerlessError = require('../../../../../../../../serverless-error');

const defaultApiGatewayLogFormat = [
'requestId: $context.requestId',
Expand Down
Expand Up @@ -2,7 +2,7 @@

const BbPromise = require('bluebird');
const ensureApiGatewayCloudWatchRole = require('../../lib/ensureApiGatewayCloudWatchRole');
const ServerlessError = require('../../../../../../../classes/Error').ServerlessError;
const ServerlessError = require('../../../../../../../serverless-error');

const defaultLogLevel = 'INFO';
const validLogLevels = new Set(['INFO', 'ERROR']);
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/aws/utils/resolveCfImportValue.js
@@ -1,6 +1,6 @@
'use strict';

const ServerlessError = require('../../../classes/Error').ServerlessError;
const ServerlessError = require('../../../serverless-error');

function resolveCfImportValue(provider, name, sdkParams = {}) {
return provider.request('CloudFormation', 'listExports', sdkParams).then((result) => {
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/aws/utils/resolveCfRefValue.js
@@ -1,6 +1,6 @@
'use strict';

const ServerlessError = require('../../../classes/Error').ServerlessError;
const ServerlessError = require('../../../serverless-error');

function resolveCfRefValue(provider, resourceLogicalId, sdkParams = {}) {
return provider
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/create/create.js
Expand Up @@ -5,7 +5,7 @@ const path = require('path');
const fse = require('fs-extra');
const untildify = require('untildify');

const ServerlessError = require('../../classes/Error').ServerlessError;
const ServerlessError = require('../../serverless-error');
const createFromTemplate = require('../../utils/createFromTemplate');
const download = require('../../utils/downloadTemplateFromRepo');
const renameService = require('../../utils/renameService').renameService;
Expand Down
16 changes: 16 additions & 0 deletions lib/serverless-error.js
@@ -0,0 +1,16 @@
'use strict';

class ServerlessError extends Error {
constructor(message, code) {
super(message);
this.code = code;
}
}

Object.defineProperty(ServerlessError.prototype, 'name', {
value: ServerlessError.name,
configurable: true,
writable: true,
});

module.exports = ServerlessError;
2 changes: 1 addition & 1 deletion lib/utils/downloadTemplateFromRepo.js
Expand Up @@ -10,7 +10,7 @@ const qs = require('querystring');
const fetch = require('node-fetch');
const spawn = require('child-process-ext/spawn');
const renameService = require('./renameService').renameService;
const ServerlessError = require('../classes/Error').ServerlessError;
const ServerlessError = require('../serverless-error');
const copyDirContentsSync = require('./fs/copyDirContentsSync');
const dirExistsSync = require('./fs/dirExistsSync');
const log = require('./log/serverlessLog');
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/getServerlessConfigFile.js
Expand Up @@ -8,7 +8,7 @@ const memoizee = require('memoizee');
const spawn = require('child-process-ext/spawn');
const fileExists = require('./fs/fileExists');
const readFile = require('./fs/readFile');
const ServerlessError = require('../classes/Error').ServerlessError;
const ServerlessError = require('../serverless-error');

const getConfigFilePath = async (servicePath, options = {}) => {
if (options.config) {
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/renameService.js
Expand Up @@ -6,7 +6,7 @@ const fse = require('fs-extra');
const fileExistsSync = require('./fs/fileExistsSync');
const readFileSync = require('./fs/readFileSync');
const writeFileSync = require('./fs/writeFileSync');
const ServerlessError = require('../classes/Error').ServerlessError;
const ServerlessError = require('../serverless-error');

function renameYmlService(name, ymlServiceFile) {
const serverlessYml = fse
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/resolveCliInput.js
Expand Up @@ -2,7 +2,7 @@

const _ = require('lodash');
const yargsParser = require('yargs-parser');
const ServerlessError = require('../classes/Error').ServerlessError;
const ServerlessError = require('../serverless-error');

const yargsOptions = {
boolean: ['help', 'version', 'verbose'],
Expand Down
47 changes: 0 additions & 47 deletions test/unit/lib/classes/Error.test.js
Expand Up @@ -2,55 +2,8 @@

const expect = require('chai').expect;
const sandbox = require('sinon');
const ServerlessError = require('../../../../lib/classes/Error').ServerlessError;
const logWarning = require('../../../../lib/classes/Error').logWarning;

describe('ServerlessError', () => {
describe('#constructor()', () => {
it('should store message', () => {
const error = new ServerlessError('a message', 'a status code');
expect(error.message).to.be.equal('a message');
});

it('should store name', () => {
const error = new ServerlessError('a message', 'a status code');
expect(error.name).to.be.equal('ServerlessError');
});

it('should store status code', () => {
const error = new ServerlessError('a message', 'ERROR_CODE');
expect(error.code).to.be.equal('ERROR_CODE');
});

it('message should always resolve as string', () => {
const error = new ServerlessError({});
expect(typeof error.message).to.be.equal('string');
});

it('should have stack trace', () => {
let expectedError;
function testStackFrame() {
expectedError = new ServerlessError('a message', 'a status code');
throw expectedError;
}

let thrownError;
try {
testStackFrame();
} catch (e) {
thrownError = e;
}

expect(thrownError).to.exist; // eslint-disable-line no-unused-expressions
expect(thrownError).to.deep.equal(expectedError);
expect(thrownError.stack).to.exist; // eslint-disable-line no-unused-expressions
expect(thrownError.stack).to.have.string('testStackFrame');
expect(thrownError.stack).to.not.have.string('new ServerlessError');
expect(thrownError.stack).to.not.have.string('Error.js');
});
});
});

describe('#logWarning()', () => {
let consoleLogSpy;

Expand Down
2 changes: 1 addition & 1 deletion test/unit/lib/loadEnv.test.js
Expand Up @@ -7,7 +7,7 @@ const overrideEnv = require('process-utils/override-env');
const fs = require('fs');
const loadEnv = require('../../../lib/loadEnv');
const dotenv = require('dotenv');
const ServerlessError = require('../../../lib/classes/Error').ServerlessError;
const ServerlessError = require('../../../lib/serverless-error');

chai.use(require('chai-as-promised'));
const expect = require('chai').expect;
Expand Down
39 changes: 39 additions & 0 deletions test/unit/lib/serverless-error.test.js
@@ -0,0 +1,39 @@
'use strict';

const { expect } = require('chai');

const ServerlessError = require('../../../lib/serverless-error');

describe('test/unit/lib/serverless-error.test.js', () => {
it('should store message', () => {
const error = new ServerlessError('Some message');
expect(error.message).to.be.equal('Some message');
});

it('should expose constructor name', () => {
const error = new ServerlessError('Some message');
expect(error.name).to.be.equal('ServerlessError');
});

it('should store code', () => {
const error = new ServerlessError('Some message', 'ERROR_CODE');
expect(error.code).to.be.equal('ERROR_CODE');
});

it('message should always resolve as string', () => {
const error = new ServerlessError({});
expect(typeof error.message).to.be.equal('string');
});

it('should have stack trace', () => {
function testStackFrame() {
throw new ServerlessError('Some message');
}

try {
testStackFrame();
} catch (error) {
expect(error.stack).to.have.string('testStackFrame');
}
});
});

0 comments on commit 87790e5

Please sign in to comment.