UNPKG

tstosc

Version:

A transpiler that convert TypeScript to SuperCollider's SCLang.

127 lines (124 loc) 4.13 kB
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 };