@azure/static-web-apps-cli
Version:
Azure Static Web Apps CLI
119 lines • 4.22 kB
JavaScript
import path from "node:path";
import fs from "node:fs";
import { logger } from "./logger.js";
/**
* Parse process.argv and retrieve a specific flag value.
* Usage:
* ```
* // ./server --port 4242
* let port = argv<number>('--port');
* ```
*
* @param flag the flag name to retrieve from argv, e.g.: --port
* @returns {T} the value of the corresponding flag:
* - if flag is --key=value or --key value, returns value as type `T`.
* - if flag is --key, return a boolean (true if the flag is present, false if not).
* - if flag is not present, return null.
*
*/
export function argv(flag) {
const flags = process.argv;
for (let index = 0; index < flags.length; index++) {
const entry = flags[index];
// ex: --key=value
if (entry.startsWith("--")) {
if (entry.includes("=")) {
// ex: [--key, value]
const [key, value] = entry.split("=");
if (flag === key.trim()) {
// ex: --key=value --> value
// ex: --key= --> null
return (!!value ? value.trim() : null);
}
}
// ex: --key value
// ex: --key
else if (flag === entry.trim()) {
const nextEntry = flags[index + 1]?.trim();
// ex: --key
if (nextEntry === undefined || nextEntry?.startsWith("--")) {
return true;
}
// ex: --key value
else if (!!nextEntry) {
return nextEntry;
}
}
else {
// flag wasn't found
return false;
}
}
}
return null;
}
/**
* Registers a handler when process exits and executre a callback function.
* @param callback The callback function to execute.
*/
export function registerProcessExit(callback) {
let terminated = false;
const wrapper = () => {
if (!terminated) {
terminated = true;
callback();
}
};
process.on("SIGINT", wrapper);
process.on("SIGTERM", wrapper);
process.on("exit", wrapper);
}
/**
* Parses and returns a valid script command line to be run before SWA starts. Also accepts shortcut npx, npm and yarn scripts in the form of npx:module, npm:script or yarn:script.
* @param startupScript A file or npx/npm/yarn scripts to be exectued.
* @param options The SWA CLI configuration flags.
* @returns
*/
export function createStartupScriptCommand(startupScript, options) {
if (startupScript.includes(":")) {
const [npmOrYarnBin, ...npmOrYarnScript] = startupScript.split(":");
if (["npm", "yarn"].includes(npmOrYarnBin)) {
return `${npmOrYarnBin} run ${npmOrYarnScript.join(":")} --if-present`;
}
else if (["npx"].includes(npmOrYarnBin)) {
return `${npmOrYarnBin} ${npmOrYarnScript.join(":")}`;
}
else if (npmOrYarnBin.startsWith("npm run") && npmOrYarnScript.length === 1) {
return `${npmOrYarnBin}:${npmOrYarnScript} --if-present`;
}
}
else {
if (!path.isAbsolute(startupScript)) {
const { appLocation } = options;
const cwd = appLocation || process.cwd();
const absoluteStartupScript = path.resolve(cwd, startupScript);
if (fs.existsSync(absoluteStartupScript)) {
startupScript = absoluteStartupScript;
}
}
return startupScript;
}
return null;
}
/**
* Parses the string devserver-timeout and returns an integer
* @param time devserver-timeout flag as string
* @returns parses the string and returns an integer
*/
export function parseServerTimeout(time) {
// The argument 10 implies to convert the given string to base-10(decimal)
const timeValue = parseInt(time, 10);
if (isNaN(timeValue)) {
logger.error(`--devserver-timeout should be a number expressed in seconds. Got "${time}".`, true);
}
else if (timeValue < 0) {
logger.error(`--devserver-timeout should be a positive number`);
}
return timeValue;
}
//# sourceMappingURL=cli.js.map