Skip to content

Commit 76b0b6a

Browse files
authored
feat(start): expose functions-folder and assets-folder options (#139)
1 parent 27d1d0e commit 76b0b6a

File tree

5 files changed

+62
-13
lines changed

5 files changed

+62
-13
lines changed

src/commands/start.ts

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
import { Argv } from 'yargs';
21
import inquirer from 'inquirer';
2+
import { Argv } from 'yargs';
33
import checkNodejsVersion from '../checks/nodejs-version';
44
import checkProjectStructure from '../checks/project-structure';
55
import { getConfigFromCli, StartCliFlags } from '../config/start';
66
import { printRouteInfo } from '../printers/start';
77
import { createServer } from '../runtime/server';
88
import { startInspector } from '../runtime/utils/inspector';
9-
import { getDebugFunction, setLogLevelByName } from '../utils/logger';
9+
import { getDebugFunction, logger, setLogLevelByName } from '../utils/logger';
1010
import { ExternalCliOptions, sharedCliOptions } from './shared';
1111
import { CliInfo } from './types';
1212
import { getFullCommand } from './utils';
13-
import { logger } from '../utils/logger';
1413

1514
const debug = getDebugFunction('twilio-run:start');
1615

@@ -46,7 +45,15 @@ export async function handler(
4645
const config = await getConfigFromCli(argv, cliInfo, externalCliOptions);
4746

4847
const command = getFullCommand(argv);
49-
await checkProjectStructure(config.baseDir, command);
48+
const directories = {
49+
assetsDirectories: config.assetsFolderName
50+
? [config.assetsFolderName]
51+
: undefined,
52+
functionsDirectories: config.functionsFolderName
53+
? [config.functionsFolderName]
54+
: undefined,
55+
};
56+
await checkProjectStructure(config.baseDir, command, false, directories);
5057

5158
debug('Determined configuration: %p', config);
5259
process.title = config.appName;
@@ -163,6 +170,14 @@ export const cliInfo: CliInfo = {
163170
describe:
164171
'Enables legacy mode, it will prefix your asset paths with /assets',
165172
},
173+
'assets-folder': {
174+
type: 'string',
175+
describe: 'Specific folder name to be used for static assets',
176+
},
177+
'functions-folder': {
178+
type: 'string',
179+
describe: 'Specific folder name to be used for static functions',
180+
},
166181
},
167182
};
168183

src/config/start.ts

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export type StartCliConfig = {
3434
logs: boolean;
3535
legacyMode: boolean;
3636
appName: string;
37+
assetsFolderName?: string;
38+
functionsFolderName?: string;
3739
};
3840

3941
export type StartCliFlags = Arguments<
@@ -50,6 +52,8 @@ export type StartCliFlags = Arguments<
5052
inspect?: string;
5153
inspectBrk?: string;
5254
legacyMode: boolean;
55+
assetsFolder?: string;
56+
functionsFolder?: string;
5357
}
5458
>;
5559

@@ -168,6 +172,8 @@ export async function getConfigFromCli(
168172
config.logs = cli.logs;
169173
config.legacyMode = cli.legacyMode;
170174
config.appName = 'twilio-run';
175+
config.assetsFolderName = cli.assetsFolder;
176+
config.functionsFolderName = cli.functionsFolder;
171177

172178
return config;
173179
}

src/printers/start.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ServerlessResourceConfig } from '@twilio-labs/serverless-api';
2+
import { SearchConfig } from '@twilio-labs/serverless-api/dist/utils';
23
import boxen from 'boxen';
34
import chalk from 'chalk';
45
import logSymbols from 'log-symbols';
@@ -146,7 +147,19 @@ function printPrettyRouteInfo(
146147
}
147148

148149
export async function printRouteInfo(config: StartCliConfig): Promise<void> {
149-
const { functions, assets } = await getFunctionsAndAssets(config.baseDir);
150+
const searchConfig: SearchConfig = {
151+
functionsFolderNames: config.functionsFolderName
152+
? [config.functionsFolderName]
153+
: undefined,
154+
assetsFolderNames: config.assetsFolderName
155+
? [config.assetsFolderName]
156+
: undefined,
157+
};
158+
159+
const { functions, assets } = await getFunctionsAndAssets(
160+
config.baseDir,
161+
searchConfig
162+
);
150163

151164
let output;
152165
if (shouldPrettyPrint) {

src/runtime/internal/runtime-paths.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@ import {
22
fsHelpers,
33
ServerlessResourceConfigWithFilePath,
44
} from '@twilio-labs/serverless-api';
5+
import { SearchConfig } from '@twilio-labs/serverless-api/dist/utils';
56

67
export type RouteInfo = {
78
functions: ServerlessResourceConfigWithFilePath[];
89
assets: ServerlessResourceConfigWithFilePath[];
910
};
1011

1112
export async function getFunctionsAndAssets(
12-
baseDir: string
13+
baseDir: string,
14+
config?: SearchConfig
1315
): Promise<RouteInfo> {
1416
let { functions, assets } = await fsHelpers.getListOfFunctionsAndAssets(
15-
baseDir
17+
baseDir,
18+
config
1619
);
1720
return { functions, assets };
1821
}

src/runtime/server.ts

+18-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
import { SearchConfig } from '@twilio-labs/serverless-api/dist/utils';
12
import { ServerlessFunctionSignature } from '@twilio-labs/serverless-runtime-types/types';
23
import bodyParser from 'body-parser';
4+
import chokidar from 'chokidar';
35
import express, {
46
Express,
57
NextFunction,
68
Request as ExpressRequest,
79
Response as ExpressResponse,
810
} from 'express';
911
import userAgentMiddleware from 'express-useragent';
10-
import nocache from 'nocache';
11-
import { printRouteInfo } from '../printers/start';
12-
import chokidar from 'chokidar';
1312
import debounce from 'lodash.debounce';
13+
import nocache from 'nocache';
1414
import path from 'path';
1515
import { StartCliConfig } from '../config/start';
16+
import { printRouteInfo } from '../printers/start';
1617
import { wrapErrorInHtml } from '../utils/error-html';
1718
import { getDebugFunction } from '../utils/logger';
1819
import { createLogger } from './internal/request-logger';
@@ -85,7 +86,18 @@ export async function createServer(
8586
});
8687
}
8788

88-
let routes = await getFunctionsAndAssets(config.baseDir);
89+
const searchConfig: SearchConfig = {};
90+
91+
if (config.functionsFolderName) {
92+
searchConfig.functionsFolderNames = [config.functionsFolderName];
93+
console.log(searchConfig);
94+
}
95+
96+
if (config.assetsFolderName) {
97+
searchConfig.assetsFolderNames = [config.assetsFolderName];
98+
}
99+
100+
let routes = await getFunctionsAndAssets(config.baseDir, searchConfig);
89101
let routeMap = setRoutes(routes);
90102

91103
if (config.live) {
@@ -95,12 +107,12 @@ export async function createServer(
95107
path.join(config.baseDir, '/(assets|static)/**/*'),
96108
],
97109
{
98-
ignoreInitial: true
110+
ignoreInitial: true,
99111
}
100112
);
101113

102114
const reloadRoutes = async () => {
103-
routes = await getFunctionsAndAssets(config.baseDir);
115+
routes = await getFunctionsAndAssets(config.baseDir, searchConfig);
104116
routeMap = setRoutes(routes);
105117

106118
await printRouteInfo(config);

0 commit comments

Comments
 (0)