tstosc
Version:
A transpiler that convert TypeScript to SuperCollider's SCLang.
128 lines (121 loc) • 6.13 kB
JavaScript
;
var ansis = require('ansis');
var console_cjs = require('./console.cjs');
var util_cjs = require('../util/util.cjs');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var ansis__default = /*#__PURE__*/_interopDefault(ansis);
const lang_flag = Intl.DateTimeFormat().resolvedOptions().locale;
const space_number_between_option_and_brief = 2;
function showHelp(about = "") {
function getHelp() {
switch (lang_flag.split(/[-_]/)[0]) {
case "en":
return getEnHelpText(about);
default:
return getHelpTextDefaultLanguage(about);
}
}
console.log(getHelp());
}
function showBriefHelp() {
console.log(getBriefHelp());
}
function getBriefHelp() {
switch (lang_flag.split(/[-_]/)[0]) {
case "en":
return getEnBriefHelpText();
default:
return getBriefHelpTextDefaultLanguage();
}
}
const getHelpTextDefaultLanguage = getEnHelpText;
const getBriefHelpTextDefaultLanguage = getEnBriefHelpText;
function getEnFullHelpTextFrom(help_text_dict) {
const description_of_tstosc = "" + console_cjs.bold("What is `tstosc` ?") + `
A transpiler that translate TypeScipt to SuperCollider's builtin language "SCLang".
`;
const caution_for_arg_order = "" + console_cjs.bold("Caution for Argument's Order") + "\n`tstosc` has " + console_cjs.italic("global option") + " and " + console_cjs.italic("positional option") + ". Global option comes after `tstosc`, and before the first file name/path argument. Positional option comes after file name/path, and being effective only on it. Here is the example on that:\n" + [
console_cjs.cmd("tstosc"),
console_cjs.param("--global-option"),
console_cjs.fileArg("a.ts"),
console_cjs.param("--for-a-ts"),
console_cjs.fileArg("b.ts"),
console_cjs.param("--for-b-ts")
].join(" ") + "\n\n";
const how_to_see_detail_of_option = "" + console_cjs.bold("For Detailed Help on Option") + "\nPlease run `" + [console_cjs.cmd("tstosc"), console_cjs.param("-h"), console_cjs.fileArg("option-to-search")].join(" ") + "`, do not add dashes before the option that you want to search.\n\n";
const [option_and_brief__global, option_and_brief__positional] = util_cjs.bifilter(
[...help_text_dict.keys()].map(
(a) => {
const info = help_text_dict.get(a);
return [
console_cjs.param(`--${a}`) + console_cjs.dim(", ") + info.alias.map((a2) => console_cjs.param(a2.length > 1 ? `--${a2}` : `-${a2}`)).join(", "),
info.brief ?? info.description,
info.is_global
];
}
),
/** Divide by whether `is_global` is true. */
(e) => e[2]
);
const option_line_max_len = Math.max(
Math.max(...[...option_and_brief__global, ...option_and_brief__positional].map((e) => e[0].ansi_length)),
30
// At least give 30 to column size, to make it look better.
);
const brief_max_len = console_cjs.console_width - option_line_max_len - space_number_between_option_and_brief;
function createOptionHelpTextList(option_and_brief) {
return option_and_brief.map(
([option, brief]) => {
const cut_brief = console_cjs.wrapText(brief, brief_max_len).split("\n");
const remaining_brief = cut_brief.slice(1);
return (
// First line.
option.padANSIStart(option_line_max_len) + " ".repeat(space_number_between_option_and_brief) + cut_brief[0] + // Second and following line, if exists.
(remaining_brief.length > 0 ? "\n" + remaining_brief.map((b) => " ".repeat(option_line_max_len + space_number_between_option_and_brief) + b).join("\n") : "")
);
}
).join("\n");
}
const list_of_global_options_help_text = console_cjs.wrapText(console_cjs.bold("List of Global Option")) + "\n" + createOptionHelpTextList(option_and_brief__global) + "\n";
const list_of_positional_options_help_text = console_cjs.wrapText(console_cjs.bold("List of Positional Option")) + "\n" + createOptionHelpTextList(option_and_brief__positional) + "\n";
return console_cjs.wrapText(description_of_tstosc) + console_cjs.wrapText(caution_for_arg_order) + console_cjs.wrapText(how_to_see_detail_of_option) + list_of_global_options_help_text + "\n" + list_of_positional_options_help_text;
}
function findByAlias(help_text_dict, alias) {
for (const value of help_text_dict.values()) {
if (value.alias.includes(alias)) {
return value;
}
}
}
function getSpecifiedHelpTextFrom(help_text_dict, about) {
const info = help_text_dict.get(about) ?? findByAlias(help_text_dict, about);
if (info == void 0) {
return console_cjs.error(`Error: Option "${about}" does not exist.`);
}
return "" + console_cjs.bold(`--${about}`) + ", " + info.alias.map((a) => console_cjs.bold(a.length > 1 ? `--${a}` : `-${a}`)).join(", ") + "\n" + info.description;
}
function getEnHelpText(about = "") {
const help_text_dict = /* @__PURE__ */ new Map([
["version", {
is_global: true,
alias: ["v"],
description: "Print the current version of tstosc."
}],
["help", {
is_global: true,
alias: ["h"],
description: "Print help text (can specify the command to query)."
}],
["out-dir", {
is_global: true,
alias: ["d"],
description: "The output dir of the files. If not specified, `cwd`."
}]
]);
return about == "" ? getEnFullHelpTextFrom(help_text_dict) : getSpecifiedHelpTextFrom(help_text_dict, about);
}
function getEnBriefHelpText() {
return "" + ansis__default.default.bold.open + "Basic Usage" + ansis__default.default.reset.close + "\nSimply put the TypeScript file name/path after this command, like this:\n" + console_cjs.cmd("tstosc") + " " + console_cjs.fileArg("program.ts") + "\n" + ("A SCLang file " + console_cjs.fileArg("program.scd") + " will be generated at current working directory.\n\n") + ansis__default.default.bold.open + "Detailed Options" + ansis__default.default.reset.close + "\n" + ("Please run `" + console_cjs.cmd("tstosc") + " " + console_cjs.param("--help") + "` for more information.");
}
exports.showBriefHelp = showBriefHelp;
exports.showHelp = showHelp;