diff --git a/src/commands/start.ts b/src/commands/start.ts index 00d933a5..7aa9b20d 100644 --- a/src/commands/start.ts +++ b/src/commands/start.ts @@ -1,16 +1,15 @@ -import { Argv } from 'yargs'; import inquirer from 'inquirer'; +import { Argv } from 'yargs'; import checkNodejsVersion from '../checks/nodejs-version'; import checkProjectStructure from '../checks/project-structure'; import { getConfigFromCli, StartCliFlags } from '../config/start'; import { printRouteInfo } from '../printers/start'; import { createServer } from '../runtime/server'; import { startInspector } from '../runtime/utils/inspector'; -import { getDebugFunction, setLogLevelByName } from '../utils/logger'; +import { getDebugFunction, logger, setLogLevelByName } from '../utils/logger'; import { ExternalCliOptions, sharedCliOptions } from './shared'; import { CliInfo } from './types'; import { getFullCommand } from './utils'; -import { logger } from '../utils/logger'; const debug = getDebugFunction('twilio-run:start'); @@ -46,7 +45,15 @@ export async function handler( const config = await getConfigFromCli(argv, cliInfo, externalCliOptions); const command = getFullCommand(argv); - await checkProjectStructure(config.baseDir, command); + const directories = { + assetsDirectories: config.assetsFolderName + ? [config.assetsFolderName] + : undefined, + functionsDirectories: config.functionsFolderName + ? [config.functionsFolderName] + : undefined, + }; + await checkProjectStructure(config.baseDir, command, false, directories); debug('Determined configuration: %p', config); process.title = config.appName; @@ -163,6 +170,14 @@ export const cliInfo: CliInfo = { describe: 'Enables legacy mode, it will prefix your asset paths with /assets', }, + 'assets-folder': { + type: 'string', + describe: 'Specific folder name to be used for static assets', + }, + 'functions-folder': { + type: 'string', + describe: 'Specific folder name to be used for static functions', + }, }, }; diff --git a/src/config/start.ts b/src/config/start.ts index d0e6cb83..2b764c94 100644 --- a/src/config/start.ts +++ b/src/config/start.ts @@ -34,6 +34,8 @@ export type StartCliConfig = { logs: boolean; legacyMode: boolean; appName: string; + assetsFolderName?: string; + functionsFolderName?: string; }; export type StartCliFlags = Arguments< @@ -50,6 +52,8 @@ export type StartCliFlags = Arguments< inspect?: string; inspectBrk?: string; legacyMode: boolean; + assetsFolder?: string; + functionsFolder?: string; } >; @@ -168,6 +172,8 @@ export async function getConfigFromCli( config.logs = cli.logs; config.legacyMode = cli.legacyMode; config.appName = 'twilio-run'; + config.assetsFolderName = cli.assetsFolder; + config.functionsFolderName = cli.functionsFolder; return config; } diff --git a/src/printers/start.ts b/src/printers/start.ts index 6998d586..0767880e 100644 --- a/src/printers/start.ts +++ b/src/printers/start.ts @@ -1,4 +1,5 @@ import { ServerlessResourceConfig } from '@twilio-labs/serverless-api'; +import { SearchConfig } from '@twilio-labs/serverless-api/dist/utils'; import boxen from 'boxen'; import chalk from 'chalk'; import logSymbols from 'log-symbols'; @@ -146,7 +147,19 @@ function printPrettyRouteInfo( } export async function printRouteInfo(config: StartCliConfig): Promise { - const { functions, assets } = await getFunctionsAndAssets(config.baseDir); + const searchConfig: SearchConfig = { + functionsFolderNames: config.functionsFolderName + ? [config.functionsFolderName] + : undefined, + assetsFolderNames: config.assetsFolderName + ? [config.assetsFolderName] + : undefined, + }; + + const { functions, assets } = await getFunctionsAndAssets( + config.baseDir, + searchConfig + ); let output; if (shouldPrettyPrint) { diff --git a/src/runtime/internal/runtime-paths.ts b/src/runtime/internal/runtime-paths.ts index 6b7671b5..f86a89c0 100644 --- a/src/runtime/internal/runtime-paths.ts +++ b/src/runtime/internal/runtime-paths.ts @@ -2,6 +2,7 @@ import { fsHelpers, ServerlessResourceConfigWithFilePath, } from '@twilio-labs/serverless-api'; +import { SearchConfig } from '@twilio-labs/serverless-api/dist/utils'; export type RouteInfo = { functions: ServerlessResourceConfigWithFilePath[]; @@ -9,10 +10,12 @@ export type RouteInfo = { }; export async function getFunctionsAndAssets( - baseDir: string + baseDir: string, + config?: SearchConfig ): Promise { let { functions, assets } = await fsHelpers.getListOfFunctionsAndAssets( - baseDir + baseDir, + config ); return { functions, assets }; } diff --git a/src/runtime/server.ts b/src/runtime/server.ts index f075d1ac..469495ee 100644 --- a/src/runtime/server.ts +++ b/src/runtime/server.ts @@ -1,5 +1,7 @@ +import { SearchConfig } from '@twilio-labs/serverless-api/dist/utils'; import { ServerlessFunctionSignature } from '@twilio-labs/serverless-runtime-types/types'; import bodyParser from 'body-parser'; +import chokidar from 'chokidar'; import express, { Express, NextFunction, @@ -7,12 +9,11 @@ import express, { Response as ExpressResponse, } from 'express'; import userAgentMiddleware from 'express-useragent'; -import nocache from 'nocache'; -import { printRouteInfo } from '../printers/start'; -import chokidar from 'chokidar'; import debounce from 'lodash.debounce'; +import nocache from 'nocache'; import path from 'path'; import { StartCliConfig } from '../config/start'; +import { printRouteInfo } from '../printers/start'; import { wrapErrorInHtml } from '../utils/error-html'; import { getDebugFunction } from '../utils/logger'; import { createLogger } from './internal/request-logger'; @@ -85,7 +86,18 @@ export async function createServer( }); } - let routes = await getFunctionsAndAssets(config.baseDir); + const searchConfig: SearchConfig = {}; + + if (config.functionsFolderName) { + searchConfig.functionsFolderNames = [config.functionsFolderName]; + console.log(searchConfig); + } + + if (config.assetsFolderName) { + searchConfig.assetsFolderNames = [config.assetsFolderName]; + } + + let routes = await getFunctionsAndAssets(config.baseDir, searchConfig); let routeMap = setRoutes(routes); if (config.live) { @@ -95,12 +107,12 @@ export async function createServer( path.join(config.baseDir, '/(assets|static)/**/*'), ], { - ignoreInitial: true + ignoreInitial: true, } ); const reloadRoutes = async () => { - routes = await getFunctionsAndAssets(config.baseDir); + routes = await getFunctionsAndAssets(config.baseDir, searchConfig); routeMap = setRoutes(routes); await printRouteInfo(config);