diff --git a/spec/v2/params.spec.ts b/spec/v2/params.spec.ts index d5d4d35f2..9885276cd 100644 --- a/spec/v2/params.spec.ts +++ b/spec/v2/params.spec.ts @@ -17,16 +17,16 @@ describe('params', () => { delete process.env[TEST_PARAM]; }); - const VALUE_TESTS: { + const VALUE_TESTS: Array<{ method: (name: string, options: ParamOptions) => Param; - tests: { + tests: Array<{ title: string; env?: string; options?: ParamOptions; expect?: any; throws?: boolean; - }[]; - }[] = [ + }>; + }> = [ { method: defineString, tests: [ diff --git a/spec/v2/providers/https.spec.ts b/spec/v2/providers/https.spec.ts index 6bc4030e8..62f4757cb 100644 --- a/spec/v2/providers/https.spec.ts +++ b/spec/v2/providers/https.spec.ts @@ -332,4 +332,21 @@ describe('onCall', () => { expect(response.body).to.be.deep.equal({ result: 42 }); expect(response.headers).to.deep.equal(expectedResponseHeaders); }); + + // These tests pass if the code transpiles + it('allows desirable syntax', () => { + https.onCall( + (request: https.CallableRequest) => `hello, ${request.data}!` + ); + https.onCall( + (request: https.CallableRequest) => `hello, ${request.data}!` + ); + https.onCall( + (request: https.CallableRequest) => `hello, ${request.data}!` + ); + https.onCall( + (request: https.CallableRequest) => `Hello, ${request.data}` + ); + https.onCall((request: https.CallableRequest) => `Hello, ${request.data}`); + }); }); diff --git a/spec/v2/providers/pubsub.spec.ts b/spec/v2/providers/pubsub.spec.ts index f1669de7f..4fc338614 100644 --- a/spec/v2/providers/pubsub.spec.ts +++ b/spec/v2/providers/pubsub.spec.ts @@ -111,4 +111,24 @@ describe('onMessagePublished', () => { expect(json).to.deep.equal({ hello: 'world' }); }); + + // These tests pass if the transpiler works + it('allows desirable syntax', () => { + pubsub.onMessagePublished( + 'topic', + (event: CloudEvent>) => {} + ); + pubsub.onMessagePublished( + 'topic', + (event: CloudEvent) => {} + ); + pubsub.onMessagePublished( + 'topic', + (event: CloudEvent>) => {} + ); + pubsub.onMessagePublished( + 'topic', + (event: CloudEvent) => {} + ); + }); }); diff --git a/src/common/providers/https.ts b/src/common/providers/https.ts index e2f73f7a5..372e4fdbf 100644 --- a/src/common/providers/https.ts +++ b/src/common/providers/https.ts @@ -138,7 +138,7 @@ export interface CallableContext { /** * The request used to call a callable function. */ -export interface CallableRequest { +export interface CallableRequest { /** * The parameters used by a client when calling this function. */ diff --git a/src/v2/index.ts b/src/v2/index.ts index 9a6b327d6..679df995a 100644 --- a/src/v2/index.ts +++ b/src/v2/index.ts @@ -21,9 +21,9 @@ // SOFTWARE. import * as logger from '../logger'; +import * as params from './params'; import * as https from './providers/https'; import * as pubsub from './providers/pubsub'; -import * as params from './params'; export { https, pubsub, logger, params }; diff --git a/src/v2/options.ts b/src/v2/options.ts index fd93bef86..372e49566 100644 --- a/src/v2/options.ts +++ b/src/v2/options.ts @@ -24,11 +24,11 @@ import { durationFromSeconds, serviceAccountFromShorthand, } from '../common/encoding'; +import { convertIfPresent, copyIfPresent } from '../common/encoding'; import * as logger from '../logger'; -import { copyIfPresent, convertIfPresent } from '../common/encoding'; -import { ParamSpec } from './params/types'; -import { declaredParams } from './params'; import { TriggerAnnotation } from './core'; +import { declaredParams } from './params'; +import { ParamSpec } from './params/types'; /** * List of all regions supported by Cloud Functions v2 diff --git a/src/v2/providers/https.ts b/src/v2/providers/https.ts index b31a1207c..0e70c4176 100644 --- a/src/v2/providers/https.ts +++ b/src/v2/providers/https.ts @@ -28,7 +28,7 @@ import * as options from '../options'; export type Request = common.Request; -export type CallableRequest = common.CallableRequest; +export type CallableRequest = common.CallableRequest; export type FunctionsErrorCode = common.FunctionsErrorCode; export type HttpsError = common.HttpsError; @@ -40,33 +40,43 @@ export interface HttpsOptions extends Omit { cors?: string | boolean; } -export type HttpsHandler = ( - request: Request, - response: express.Response -) => void | Promise; -export type CallableHandler = ( - request: CallableRequest -) => Return; - -export type HttpsFunction = HttpsHandler & { __trigger: unknown }; -export interface CallableFunction extends HttpsHandler { - __trigger: unknown; +export type HttpsFunction = (( + req: Request, + res: express.Response +) => void | Promise) & { __trigger: unknown }; +export interface CallableFunction extends HttpsFunction { run(data: CallableRequest): Return; } export function onRequest( opts: HttpsOptions, - handler: HttpsHandler + handler: ( + request: Request, + response: express.Response + ) => void | Promise +): HttpsFunction; +export function onRequest( + handler: ( + request: Request, + response: express.Response + ) => void | Promise ): HttpsFunction; -export function onRequest(handler: HttpsHandler): HttpsFunction; export function onRequest( - optsOrHandler: HttpsOptions | HttpsHandler, - handler?: HttpsHandler + optsOrHandler: + | HttpsOptions + | ((request: Request, response: express.Response) => void | Promise), + handler?: ( + request: Request, + response: express.Response + ) => void | Promise ): HttpsFunction { let opts: HttpsOptions; if (arguments.length === 1) { opts = {}; - handler = optsOrHandler as HttpsHandler; + handler = optsOrHandler as ( + request: Request, + response: express.Response + ) => void | Promise; } else { opts = optsOrHandler as HttpsOptions; } @@ -111,19 +121,19 @@ export function onRequest( export function onCall>( opts: HttpsOptions, - handler: CallableHandler + handler: (request: CallableRequest) => Return ): CallableFunction; export function onCall>( - handler: CallableHandler + handler: (request: CallableRequest) => Return ): CallableFunction; export function onCall>( - optsOrHandler: HttpsOptions | CallableHandler, - handler?: CallableHandler + optsOrHandler: HttpsOptions | ((request: CallableRequest) => Return), + handler?: (request: CallableRequest) => Return ): CallableFunction { let opts: HttpsOptions; if (arguments.length == 1) { opts = {}; - handler = optsOrHandler as CallableHandler; + handler = optsOrHandler as (request: CallableRequest) => Return; } else { opts = optsOrHandler as HttpsOptions; } diff --git a/src/v2/providers/pubsub.ts b/src/v2/providers/pubsub.ts index 43ad15d57..cca25b294 100644 --- a/src/v2/providers/pubsub.ts +++ b/src/v2/providers/pubsub.ts @@ -85,7 +85,7 @@ export class Message { } /** The interface published in a Pub/Sub publish subscription. */ -export interface MessagePublishedData { +export interface MessagePublishedData { readonly message: Message; readonly subscription: string; } @@ -96,18 +96,18 @@ export interface PubSubOptions extends options.EventHandlerOptions { } /** Handle a message being published to a Pub/Sub topic. */ -export function onMessagePublished( +export function onMessagePublished( topic: string, handler: (event: CloudEvent>) => any | Promise ): CloudFunction>; /** Handle a message being published to a Pub/Sub topic. */ -export function onMessagePublished( +export function onMessagePublished( options: PubSubOptions, handler: (event: CloudEvent>) => any | Promise ): CloudFunction>; -export function onMessagePublished( +export function onMessagePublished( topicOrOptions: string | PubSubOptions, handler: (event: CloudEvent>) => any | Promise ): CloudFunction> {