@fastly/js-compute
Version:
JavaScript SDK and CLI for building JavaScript applications on [Fastly Compute](https://www.fastly.com/products/edge-compute/serverless).
263 lines (262 loc) • 9.56 kB
JavaScript
import { fileURLToPath } from 'node:url';
import { dirname, join, isAbsolute } from 'node:path';
import { tooManyEngines, unknownArgument } from './printHelp.js';
import { EnvParser } from './env.js';
export async function parseInputs(cliInputs) {
const __dirname = dirname(fileURLToPath(import.meta.url));
let enableHttpCache = false;
let enableExperimentalHighResolutionTimeMethods = false;
let enableAOT = false;
let customEngineSet = false;
let moduleMode = false;
let bundle = true;
let wasmEngine = join(__dirname, '../fastly.wasm');
let aotCache = join(__dirname, '../fastly-ics.wevalcache');
let customInputSet = false;
let input = join(process.cwd(), 'bin/index.js');
let customOutputSet = false;
let output = join(process.cwd(), 'bin/main.wasm');
let enableStackTraces = false;
let excludeSources = false;
let debugIntermediateFilesDir = undefined;
let wevalBin = undefined;
let cliInput;
const envParser = new EnvParser();
loop: while ((cliInput = cliInputs.shift())) {
switch (cliInput) {
case '--': {
break loop;
}
case '--env': {
let value = cliInputs.shift();
if (!value) {
console.error('Error: --env requires a KEY=VALUE pair');
process.exit(1);
}
// If value ends with comma, it's a continuation
while (value.endsWith(',') &&
cliInputs.length > 0 &&
!cliInputs[0].startsWith('-')) {
value = value + cliInputs.shift();
}
envParser.parse(value);
break;
}
case '--enable-experimental-high-resolution-time-methods': {
enableExperimentalHighResolutionTimeMethods = true;
break;
}
case '--module-mode': {
moduleMode = true;
bundle = false;
break;
}
case '--enable-http-cache': {
enableHttpCache = true;
break;
}
case '--enable-experimental-top-level-await': {
moduleMode = true;
bundle = true;
break;
}
case '--enable-aot': {
enableAOT = true;
break;
}
case '--enable-experimental-aot': {
console.error('Warning: --enable-experimental-aot flag is now --enable-aot. The old flag continues\n' +
'to work for now, but please update your build invocation!');
enableAOT = true;
break;
}
case '-V':
case '--version': {
return 'version';
}
case '-h':
case '--help': {
return 'help';
}
case '--starlingmonkey': {
break;
}
case '--debug-build': {
wasmEngine = join(__dirname, '../fastly.debug.wasm');
console.log('Building with the debug engine');
break;
}
case '--disable-starlingmonkey': {
console.error('The legacy js-compute-runtime.wasm engine requires an older version of the JS SDK');
process.exit(1);
}
case '--engine-wasm': {
if (customEngineSet) {
tooManyEngines();
}
const value = cliInputs.shift();
if (value == null) {
console.error('Error: --engine-wasm requires a value');
process.exit(1);
}
customEngineSet = true;
if (isAbsolute(value)) {
wasmEngine = value;
}
else {
wasmEngine = join(process.cwd(), value);
}
break;
}
case '--weval-bin': {
const value = cliInputs.shift();
if (value == null) {
console.error('Error: --weval-bin requires a value');
process.exit(1);
}
if (isAbsolute(value)) {
wevalBin = value;
}
else {
wevalBin = join(process.cwd(), value);
}
break;
}
case '--aot-cache': {
const value = cliInputs.shift();
if (value == null) {
console.error('Error: --aot-cache requires a value');
process.exit(1);
}
if (isAbsolute(value)) {
aotCache = value;
}
else {
aotCache = join(process.cwd(), value);
}
break;
}
case '--enable-stack-traces': {
enableStackTraces = true;
break;
}
case '--exclude-sources': {
excludeSources = true;
break;
}
case '--debug-intermediate-files': {
const value = cliInputs.shift();
if (value == null) {
console.error('Error: --debug-intermediate-files requires a value');
process.exit(1);
}
if (isAbsolute(value)) {
debugIntermediateFilesDir = value;
}
else {
debugIntermediateFilesDir = join(process.cwd(), value);
}
break;
}
default: {
if (cliInput.startsWith('--engine-wasm=')) {
if (customEngineSet) {
tooManyEngines();
}
const value = cliInput.replace(/--engine-wasm=+/, '');
customEngineSet = true;
if (isAbsolute(value)) {
wasmEngine = value;
}
else {
wasmEngine = join(process.cwd(), value);
}
break;
}
else if (cliInput.startsWith('--env=')) {
const value = cliInput.replace(/--env=/, '');
envParser.parse(value);
break;
}
else if (cliInput.startsWith('--weval-bin=')) {
const value = cliInput.replace(/--weval-bin=/, '');
if (isAbsolute(value)) {
wevalBin = value;
}
else {
wevalBin = join(process.cwd(), value);
}
break;
}
else if (cliInput.startsWith('--aot-cache=')) {
const value = cliInput.replace(/--aot-cache=/, '');
if (isAbsolute(value)) {
aotCache = value;
}
else {
aotCache = join(process.cwd(), value);
}
break;
}
else if (cliInput.startsWith('--debug-intermediate-files=')) {
const value = cliInput.replace(/--debug-intermediate-files=/, '');
if (isAbsolute(value)) {
debugIntermediateFilesDir = value;
}
else {
debugIntermediateFilesDir = join(process.cwd(), value);
}
break;
}
else if (cliInput.startsWith('-')) {
unknownArgument(cliInput);
}
else {
if (!customInputSet) {
customInputSet = true;
if (isAbsolute(cliInput)) {
input = cliInput;
}
else {
input = join(process.cwd(), cliInput);
}
}
else if (!customOutputSet) {
customOutputSet = true;
if (isAbsolute(cliInput)) {
output = cliInput;
}
else {
output = join(process.cwd(), cliInput);
}
}
else {
unknownArgument(cliInput);
}
}
}
}
}
if (!customEngineSet && enableAOT) {
wasmEngine = join(__dirname, '../fastly-weval.wasm');
}
if (wevalBin && !enableAOT) {
console.error('Warning: --weval-bin has no effect without --enable-aot, as weval is only used for AOT compilation');
}
return {
enableExperimentalHighResolutionTimeMethods,
enableHttpCache,
moduleMode,
bundle,
enableAOT,
aotCache,
enableStackTraces,
excludeSources,
debugIntermediateFilesDir,
input,
output,
wasmEngine,
wevalBin,
env: envParser.getEnv(),
};
}