tstosc
Version:
A transpiler that convert TypeScript to SuperCollider's SCLang.
127 lines (124 loc) • 4.13 kB
JavaScript
import { isValidPath } from '../util/path.js';
import { error, warn } from './console.js';
import { getDefaultUserExtensionDir } from '../util/sc.js';
import path from 'path';
import fs from 'fs';
const priority_of_stop_early_global_option = [
"help",
"h",
"version",
"v"
];
const non_arg_accepting_global_option = [
...priority_of_stop_early_global_option,
"yes-to-all",
"y"
];
function seperateArgs(origin_arg) {
if (origin_arg.length == 0) {
return [[], []];
}
let result = [];
let group = [];
let should_detect_file_arg = false;
for (let current_index = 0; current_index < origin_arg.length; current_index++) {
const current_element = origin_arg[current_index];
const is_current_element_file_arg = !current_element.startsWith("-");
if (should_detect_file_arg && is_current_element_file_arg) {
result.push(group);
group = [];
}
group.push(current_element);
should_detect_file_arg = is_current_element_file_arg || non_arg_accepting_global_option.includes(
current_element.replace(/^--?/, "")
);
}
result.push(group);
if (!(result[0][0] ?? "").startsWith("-")) {
return [[], result];
} else {
return [result[0], result.slice(1)];
}
}
function parseArgs(global_arg, positional_args) {
const global_arg_key = Object.keys(global_arg);
{
const early_stop_index = priority_of_stop_early_global_option.findIndex((a) => global_arg_key.includes(a));
if (early_stop_index >= 0) {
const command = priority_of_stop_early_global_option[early_stop_index];
return {
type: "query_info",
command,
arg: global_arg[command]
};
}
}
if (global_arg_key.length <= 1 && positional_args.length == 0) {
return { type: "no_intention" };
}
{
for (const arg of ["out-dir", "user-extension-dir", "project-name"]) {
if (global_arg[arg] != void 0 && global_arg[arg].length == 0) {
return { type: "unknown_or_error", hint: error(`Error: Please specify a path for "${arg}".`) };
}
}
}
const global__output_dir = path.resolve(global_arg["out-dir"] ?? process.cwd());
if (!isValidPath(global__output_dir)) {
return {
type: "unknown_or_error",
hint: error(
`Error: Global option "--out-dir" ("-d") is not valid path: "${global__output_dir}".`
)
};
}
const global__user_extension_dir = path.resolve(global_arg["user-extension-dir"] ?? getDefaultUserExtensionDir());
if (!isValidPath(global__user_extension_dir)) {
return {
type: "unknown_or_error",
hint: error(
`Error: Global option "--user-extension-dir" ("-u") is not valid path: "${global__user_extension_dir}".`
)
};
}
const global__project_name = global_arg["project-name"] ?? "user_project";
{
const non_exist_files = positional_args.filter((a) => !fs.existsSync(a["_"]));
if (non_exist_files.length > 0) {
return {
type: "unknown_or_error",
hint: error(`Error: Input file not exist: "${non_exist_files.map((f) => f["_"]).join(", ")}".`)
};
}
}
let result = {
type: "transpile",
global: {
output_dir: global__output_dir,
user_extension_dir: global__user_extension_dir,
project_name: global__project_name,
yes_to_all: global_arg["yes-to-all"] ?? false,
flatten: global_arg["flatten"] ?? false
},
files: positional_args.map(
(a) => {
const input_path = a["_"];
return {
input_path,
output_name: a["out"] ?? `${path.basename(a["_"], ".ts")}.scd`,
output_dir: global_arg["flatten"] ? path.resolve(a["out-dir"] ?? global__output_dir) : path.resolve(
a["out-dir"] ?? path.join(global__output_dir, path.relative(process.cwd(), path.dirname(input_path)))
)
};
}
)
};
if (result.files.length == 0) {
return {
type: "unknown_or_error",
hint: warn("Warn: No files are specified to be transpiled.")
};
}
return result;
}
export { non_arg_accepting_global_option, parseArgs, priority_of_stop_early_global_option, seperateArgs };