Add PORT env var to be used (#952)

* Add PORT env var to be used

* Format

* Create few-carpets-sing.md

* Update few-carpets-sing.md
This commit is contained in:
Michael Stramel 2021-08-11 16:49:06 -05:00 committed by Fred K. Schott
parent fcc56a8672
commit 939b9d01a4
2 changed files with 42 additions and 7 deletions

View file

@ -0,0 +1,5 @@
---
"astro": patch
---
Allow dev server port to be set by `PORT` environment variable

View file

@ -35,14 +35,44 @@ interface CLIState {
};
}
type TypeOf = 'string' | 'boolean' | 'number';
// Validates property types of object
const validateOptions = (opts: Record<string, any>, specs: Record<string, TypeOf | [(v: any) => unknown, TypeOf]>) =>
Object.entries(specs).reduce<Record<string, any>>((options, [k, spec]) => {
const v = opts[k];
if (typeof spec === 'string' && typeof v === spec) {
options[k] = v;
} else if (Array.isArray(spec)) {
const [coercion, test] = spec;
const result = coercion(v);
if (typeof result === test) {
options[k] = result;
}
}
return options;
}, {});
/** Determine which action the user requested */
function resolveArgs(flags: Arguments): CLIState {
const options: CLIState['options'] = {
projectRoot: typeof flags.projectRoot === 'string' ? flags.projectRoot : undefined,
site: typeof flags.site === 'string' ? flags.site : undefined,
sitemap: typeof flags.sitemap === 'boolean' ? flags.sitemap : undefined,
port: typeof flags.port === 'number' ? flags.port : undefined,
config: typeof flags.config === 'string' ? flags.config : undefined,
const { PORT } = process.env;
// Merge options (Flags take priority)
const options = {
...validateOptions(
{ port: PORT },
{
port: [parseInt, 'number'],
}
),
...validateOptions(flags, {
projectRoot: 'string',
site: 'string',
sitemap: 'boolean',
port: 'number',
config: 'string',
}),
};
if (flags.version) {
@ -101,7 +131,7 @@ function mergeCLIFlags(astroConfig: AstroConfig, flags: CLIState['options']) {
}
/** Handle `astro run` command */
async function runCommand(rawRoot: string, cmd: (a: AstroConfig, options: any) => Promise<void>, options: CLIState['options']) {
async function runCommand(rawRoot: string, cmd: (a: AstroConfig, opts: any) => Promise<void>, options: CLIState['options']) {
try {
const projectRoot = options.projectRoot || rawRoot;
const astroConfig = await loadConfig(projectRoot, options.config);