From 24da26e7cfc7dfa5b4a2e347de70d4fea3048952 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 11 Nov 2019 23:17:59 +0100 Subject: [PATCH] [@now/build-utils] Add support for `includeFiles` and `excludeFiles` to Functions (#3285) Add support for `includeFiles` and `excludeFiles` to Functions. [PRODUCT-27] [PRODUCT-27]: https://zeit.atlassian.net/browse/PRODUCT-27 --- .../now-build-utils/src/detect-builders.ts | 23 ++++++ packages/now-build-utils/src/types.ts | 2 + packages/now-build-utils/test/unit.test.js | 79 +++++++++++++++++++ packages/now-cli/src/index.js | 2 +- 4 files changed, 105 insertions(+), 1 deletion(-) diff --git a/packages/now-build-utils/src/detect-builders.ts b/packages/now-build-utils/src/detect-builders.ts index 3f89394d0..b3691a466 100644 --- a/packages/now-build-utils/src/detect-builders.ts +++ b/packages/now-build-utils/src/detect-builders.ts @@ -83,6 +83,11 @@ function getApiFunctionBuilder( }); } + const { includeFiles, excludeFiles } = fn; + + if (includeFiles) Object.assign(config, { includeFiles }); + if (excludeFiles) Object.assign(config, { excludeFiles }); + return use ? { use, src, config } : prevBuilder; } @@ -308,6 +313,24 @@ function validateFunctions(files: string[], { functions = {} }: Options) { }; } } + + if (func.includeFiles !== undefined) { + if (typeof func.includeFiles !== 'string') { + return { + code: 'invalid_function_property', + message: `The property \`includeFiles\` must be a string.` + }; + } + } + + if (func.excludeFiles !== undefined) { + if (typeof func.excludeFiles !== 'string') { + return { + code: 'invalid_function_property', + message: `The property \`excludeFiles\` must be a string.` + }; + } + } } return null; diff --git a/packages/now-build-utils/src/types.ts b/packages/now-build-utils/src/types.ts index 686af68ad..d7c17abf7 100644 --- a/packages/now-build-utils/src/types.ts +++ b/packages/now-build-utils/src/types.ts @@ -316,5 +316,7 @@ export interface BuilderFunctions { memory?: number; maxDuration?: number; runtime?: string; + includeFiles?: string; + excludeFiles?: string; }; } diff --git a/packages/now-build-utils/test/unit.test.js b/packages/now-build-utils/test/unit.test.js index 6e76f611f..7159bbb47 100644 --- a/packages/now-build-utils/test/unit.test.js +++ b/packages/now-build-utils/test/unit.test.js @@ -634,6 +634,85 @@ describe('Test `detectBuilders`', () => { expect(errors).toBeDefined(); expect(errors[0].code).toBe('invalid_function_runtime'); }); + + it('Must include includeFiles config property', async () => { + const functions = { + 'api/test.js': { includeFiles: 'text/include.txt' } + } + const files = ['api/test.js']; + + const { builders, errors } = await detectBuilders(files, null, { functions }); + + expect(errors).toBe(null); + expect(builders).not.toBe(null); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].config).toMatchObject({ + functions, + zeroConfig: true, + includeFiles: 'text/include.txt' + }); + }); + + it('Must include excludeFiles config property', async () => { + const functions = { + 'api/test.js': { excludeFiles: 'text/exclude.txt' } + } + const files = ['api/test.js']; + + const { builders, errors } = await detectBuilders(files, null, { functions }); + + expect(errors).toBe(null); + expect(builders).not.toBe(null); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].config).toMatchObject({ + functions, + zeroConfig: true, + excludeFiles: 'text/exclude.txt' + }); + }); + + it('Must include excludeFiles and includeFiles config property', async () => { + const functions = { + 'api/test.js': { excludeFiles: 'text/exclude.txt', includeFiles: 'text/include.txt' } + } + const files = ['api/test.js']; + + const { builders, errors } = await detectBuilders(files, null, { functions }); + + expect(errors).toBe(null); + expect(builders).not.toBe(null); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].config).toMatchObject({ + functions, + zeroConfig: true, + excludeFiles: 'text/exclude.txt', + includeFiles: 'text/include.txt' + }); + }); + + it('Must fail for includeFiles config property', async () => { + const functions = { + 'api/test.js': { includeFiles: { test: 1 } } + } + const files = ['api/test.js']; + + const { errors } = await detectBuilders(files, null, { functions }); + + expect(errors).not.toBe(null); + expect(errors[0].code).toBe('invalid_function_property'); + }); + + it('Must fail for excludeFiles config property', async () => { + const functions = { + 'api/test.js': { excludeFiles: { test: 1 } } + } + const files = ['api/test.js']; + + const { errors } = await detectBuilders(files, null, { functions }); + + expect(errors).not.toBe(null); + expect(errors[0].code).toBe('invalid_function_property'); + }); }); it('Test `detectRoutes`', async () => { diff --git a/packages/now-cli/src/index.js b/packages/now-cli/src/index.js index 6a7dde94a..40d386c34 100644 --- a/packages/now-cli/src/index.js +++ b/packages/now-cli/src/index.js @@ -29,8 +29,8 @@ import getUser from './util/get-user.ts'; import Client from './util/client.ts'; import NowTeams from './util/teams'; import cmd from './util/output/cmd'; -import highlight from './util/output/highlight'; import { handleError } from './util/error'; +import highlight from './util/output/highlight'; import reportError from './util/report-error'; import getConfig from './util/get-config'; import * as ERRORS from './util/errors-ts';