Skip to content

Commit

Permalink
Merge remote-tracking branch 'vectorjohn/master'
Browse files Browse the repository at this point in the history
- Merge in the changes that vectorjohn made in a parallel PR (filtering
functions at the plugin level)
- Use lodash's pickBy to simplify some logic
- Fix an issue with mixed export syntax (export vs module.exports)
- Removed redundant tests

Fixes #198
  • Loading branch information
Sean Dawson committed Feb 9, 2020
2 parents aef5a0d + 6cd5e45 commit 3d0734d
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 137 deletions.
26 changes: 14 additions & 12 deletions src/Serverless.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
declare namespace Serverless {

interface Instance {
cli: {
log(str: string): void
Expand All @@ -8,18 +9,7 @@ declare namespace Serverless {
servicePath: string
}

service: {
provider: {
name: string
runtime?: string
}
functions: {
[key: string]: Serverless.Function
}
package: Serverless.Package
getAllFunctions(): string[]
}

service: Service
pluginManager: PluginManager
}

Expand All @@ -42,6 +32,18 @@ declare namespace Serverless {
individually?: boolean
}

type FunctionMap = Record<string, Serverless.Function>

interface Service {
provider: {
name: string
runtime?: string
}
functions: FunctionMap
package: Serverless.Package
getAllFunctions(): string[]
}

interface PluginManager {
spawn(command: string): Promise<void>
}
Expand Down
22 changes: 12 additions & 10 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,21 @@ export class TypeScriptPlugin {
const { options } = this
const { service } = this.serverless

if (options.function) {
return {
[options.function]: service.functions[this.options.function]
}
}

return service.functions
const allFunctions = options.function ? {
[options.function]: service.functions[this.options.function]
} : 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
return resolvedRuntime === undefined ? true : resolvedRuntime.match(/^node/)
})
}

get rootFileNames() {
return typescript.extractFileNames(
this.originalServicePath,
this.serverless.service.provider.name,
this.serverless.service.provider.runtime,
this.functions
)
Expand Down Expand Up @@ -235,7 +237,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,
Expand Down Expand Up @@ -276,4 +278,4 @@ export class TypeScriptPlugin {
}
}

module.exports = TypeScriptPlugin
export default TypeScriptPlugin
8 changes: 1 addition & 7 deletions src/typescript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function makeDefaultTypescriptConfig() {
return defaultTypescriptConfig
}

export function extractFileNames(cwd: string, provider: string, globalRuntime?: string, functions?: { [key: string]: Serverless.Function }): string[] {
export function extractFileNames(cwd: string, provider: string, functions?: { [key: string]: Serverless.Function }): string[] {
// The Google provider will use the entrypoint not from the definition of the
// handler function, but instead from the package.json:main field, or via a
// index.js file. This check reads the current package.json in the same way
Expand Down Expand Up @@ -46,13 +46,7 @@ export function extractFileNames(cwd: string, provider: string, globalRuntime?:
}
}

const runtimeIsNode = (runtime: string) => runtime.toLowerCase().startsWith('node')
const shouldProcessFunction = (fn: Serverless.Function) =>
(fn.runtime !== undefined && runtimeIsNode(fn.runtime)) ||
(fn.runtime === undefined && (globalRuntime === undefined || runtimeIsNode(globalRuntime)))

return _.values(functions)
.filter(shouldProcessFunction)
.map(fn => fn.handler)
.map(h => {
const fnName = _.last(h.split('.'))
Expand Down
110 changes: 110 additions & 0 deletions tests/index.functions.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import TypeScriptPlugin from '../src'

const createInstance = (functions: Serverless.FunctionMap, globalRuntime?: string): Serverless.Instance => ({
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: Serverless.FunctionMap = {
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',
],
)
})
})
})
105 changes: 0 additions & 105 deletions tests/typescript.extractFileName.test.ts

This file was deleted.

6 changes: 3 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 3d0734d

Please sign in to comment.