create-rspeedy-canary
Version:
Create Rspeedy-powered ReactLynx apps with one command
86 lines (85 loc) • 2.54 kB
JavaScript
import { createRequire } from "node:module";
import external_node_path_default from "node:path";
import { fileURLToPath } from "node:url";
import { checkCancel, create, multiselect, select as external_create_rstack_select } from "create-rstack";
const src_dirname = external_node_path_default.dirname(fileURLToPath(import.meta.url));
const src_require = createRequire(import.meta.url);
const { devDependencies } = src_require('../package.json');
const composeTemplateName = ({ template, tools, lang })=>{
const toolsKeys = (tools ? Object.keys(tools) : []).sort();
const toolsStr = toolsKeys.length > 0 ? `-${toolsKeys.join('-')}` : '';
return `${template}${toolsStr}-${lang}`;
};
const TEMPLATES = [
{
template: 'react',
tools: {},
lang: 'ts'
},
{
template: 'react',
tools: {},
lang: 'js'
}
];
async function getTemplateName({ template }) {
if ('string' == typeof template) {
const pair = template.split('-');
const lang = pair[pair.length - 1];
if (lang && [
'js',
'ts'
].includes(lang)) return template;
return `${template}-ts`;
}
const language = checkCancel(await external_create_rstack_select({
message: 'Select language',
options: [
{
value: 'ts',
label: 'TypeScript',
hint: 'recommended'
},
{
value: 'js',
label: 'JavaScript'
}
]
}));
const tools = checkCancel(await multiselect({
message: 'Select development tools (Use <space> to select, <enter> to continue)',
required: false,
options: [
{
value: 'vitest-rltl',
label: 'Add ReactLynx Testing Library for unit testing'
}
],
initialValues: [
'vitest-rltl'
]
}));
return composeTemplateName({
template: 'react',
lang: language,
tools: Object.fromEntries(tools.map((tool)=>[
tool,
tool
]))
});
}
create({
root: external_node_path_default.resolve(src_dirname, '..'),
name: 'rspeedy',
templates: TEMPLATES.map(({ template, tools, lang })=>composeTemplateName({
template,
lang,
tools
})),
version: devDependencies,
getTemplateName,
mapESLintTemplate () {
return null;
}
});