diff --git a/.eslintrc.json b/.eslintrc.json index bd13f216..99167d11 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -78,7 +78,7 @@ ], "guard-for-in": "off", "id-blacklist": [ - "error", + "off", "any", "Number", "number", diff --git a/src/index.ts b/src/index.ts index f0b9966d..98c65ffa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import * as path from 'path' import * as fs from 'fs-extra' import * as _ from 'lodash' -import * as globby from 'globby' +import globby from 'globby' import { ServerlessTSInstance, ServerlessTSOptions, ServerlessTSFunction } from './serverlessTypes' import { extractFileNames, getTypescriptConfig, run } from './typescript' @@ -10,7 +10,7 @@ import { watchFiles } from './watchFiles' const SERVERLESS_FOLDER = '.serverless' const BUILD_FOLDER = '.build' -export class TypeScriptPlugin { +class TypeScriptPlugin { private originalServicePath: string private isWatching: boolean @@ -80,13 +80,17 @@ export class TypeScriptPlugin { const { options } = this const { service } = this.serverless - if (options.function) { - return { - [options.function]: service.functions[this.options.function] - } - } + const allFunctions = options.function ? { + [options.function]: service.functions[this.options.function] + } : service.functions - return service.functions + // Ensure we only handle runtimes that support Typescript + return _.pickBy(allFunctions, ({runtime}) => { + const resolvedRuntime = runtime || service.provider.runtime + // If runtime is not specified on the function or provider, default to previous behaviour + const regexRuntime = /^node/ + return resolvedRuntime === undefined ? true : regexRuntime.exec(resolvedRuntime) + }) } get rootFileNames(): string[] { @@ -238,7 +242,7 @@ export class TypeScriptPlugin { } if (service.package.individually) { - const functionNames = service.getAllFunctions() + const functionNames = Object.keys(this.functions) functionNames.forEach(name => { service.functions[name].package.artifact = path.join( this.originalServicePath, @@ -278,3 +282,5 @@ export class TypeScriptPlugin { }) } } + +export = TypeScriptPlugin diff --git a/src/serverlessTypes.ts b/src/serverlessTypes.ts index 2abc2fe7..8219e6e1 100644 --- a/src/serverlessTypes.ts +++ b/src/serverlessTypes.ts @@ -1,3 +1,5 @@ +export type ServerlessTSFunctionMap = Record + export interface ServerlessTSInstance { cli: { log(str: string): void @@ -12,15 +14,14 @@ export interface ServerlessTSInstance { export interface ServerlessTSService { provider: { name: string + runtime?: string } custom: { typeScript: { tsconfigFilePath: string | undefined } } - functions: { - [key: string]: ServerlessTSFunction - } + functions: ServerlessTSFunctionMap package: ServerlessTSPackage getAllFunctions(): string[] } @@ -34,6 +35,7 @@ export interface ServerlessTSOptions { export interface ServerlessTSFunction { handler: string package: ServerlessTSPackage + runtime?: string } export interface ServerlessTSPackage { diff --git a/tests/index.functions.test.ts b/tests/index.functions.test.ts new file mode 100644 index 00000000..d7ad990c --- /dev/null +++ b/tests/index.functions.test.ts @@ -0,0 +1,111 @@ +import TypeScriptPlugin from '../src' +import { ServerlessTSInstance, ServerlessTSFunctionMap } from '../src/serverlessTypes' + +const createInstance = (functions: ServerlessTSFunctionMap, globalRuntime?: string): ServerlessTSInstance => ({ + cli: { + log: jest.fn() + }, + config: { + servicePath: 'servicePath' + }, + service: { + provider: { + name: 'aws', + runtime: globalRuntime + }, + package: { + individually: true, + include: [], + exclude: [] + }, + functions, + getAllFunctions: jest.fn() + }, + pluginManager: { + spawn: jest.fn() + } +}) + +describe('functions', () => { + const functions: ServerlessTSFunctionMap = { + hello: { + handler: 'tests/assets/hello.handler', + package: { + include: [], + exclude: [] + } + }, + world: { + handler: 'tests/assets/world.handler', + runtime: 'nodejs12.x', + package: { + include: [], + exclude: [] + }, + }, + js: { + handler: 'tests/assets/jsfile.create', + package: { + include: [], + exclude: [] + } + }, + notActuallyTypescript: { + handler: 'tests/assets/jsfile.create', + package: { + include: [], + exclude: [] + }, + runtime: 'go1.x' + }, + } + + describe('when the provider runtime is Node', () => { + it('can get filter out non node based functions', () => { + const slsInstance = createInstance(functions, 'nodejs10.x') + const plugin = new TypeScriptPlugin(slsInstance, {}) + + expect( + Object.values(plugin.functions).map(fn => fn.handler), + ).toEqual( + [ + 'tests/assets/hello.handler', + 'tests/assets/world.handler', + 'tests/assets/jsfile.create', + ], + ) + }) + }) + + describe('when the provider runtime is not Node', () => { + it('can get filter out non node based functions', () => { + const slsInstance = createInstance(functions, 'python2.7') + const plugin = new TypeScriptPlugin(slsInstance, {}) + + expect( + Object.values(plugin.functions).map(fn => fn.handler), + ).toEqual( + [ + 'tests/assets/world.handler', + ], + ) + }) + }) + + describe('when the provider runtime is undefined', () => { + it('can get filter out non node based functions', () => { + const slsInstance = createInstance(functions) + const plugin = new TypeScriptPlugin(slsInstance, {}) + + expect( + Object.values(plugin.functions).map(fn => fn.handler), + ).toEqual( + [ + 'tests/assets/hello.handler', + 'tests/assets/world.handler', + 'tests/assets/jsfile.create', + ], + ) + }) + }) +}) diff --git a/tsconfig.json b/tsconfig.json index 6ba66c50..11d4e39c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "target": "es6", "declaration": true, "sourceMap": true, - "outDir": "dist" + "outDir": "dist", + "esModuleInterop": true }, "include": ["src/**/*.ts"], "exclude": [ diff --git a/yarn.lock b/yarn.lock index 735f988f..8b0ac5d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3456,9 +3456,9 @@ type-check@~0.3.2: prelude-ls "~1.1.2" typescript@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.1.tgz#b6691be11a881ffa9a05765a205cb7383f3b63c6" - integrity sha512-3NSMb2VzDQm8oBTLH6Nj55VVtUEpe/rgkIzMir0qVoLyjDZlnMBva0U6vDiV3IH+sl/Yu6oP5QwsAQtHPmDd2Q== + version "3.7.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" + integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== uglify-js@^3.1.4: version "3.5.2"