create-rspeedy
Version:
Create Rspeedy-powered ReactLynx apps with one command
113 lines (112 loc) • 3.49 kB
JavaScript
import { createRequire } from "node:module";
import node_path from "node:path";
import { fileURLToPath } from "node:url";
import { checkCancel, copyFolder, create, select as external_create_rstack_select } from "create-rstack";
const src_dirname = node_path.dirname(fileURLToPath(import.meta.url));
const src_require = createRequire(import.meta.url);
const { devDependencies: devDependencies } = src_require('../package.json');
const composeTemplateName = ({ template, lang })=>`${template}-${lang}`;
const TEMPLATES = [
{
template: 'react',
lang: 'ts'
},
{
template: 'react',
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)) {
if ('react' === pair[0]) return `react-${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'
}
]
}));
return composeTemplateName({
template: 'react',
lang: language
});
}
create({
root: node_path.resolve(src_dirname, '..'),
name: 'rspeedy',
templates: TEMPLATES.map(({ template, lang })=>composeTemplateName({
template,
lang
})),
version: devDependencies,
getTemplateName: getTemplateName,
extraTools: [
{
value: 'vitest-rltl',
label: 'Vitest',
order: 'pre',
when: (templateName)=>'react-js' === templateName || 'react-ts' === templateName,
action: ({ distFolder, addAgentsMdSearchDirs })=>{
const from = node_path.resolve(src_dirname, '..', 'template-react-vitest-rltl');
copyFolder({
from,
to: distFolder,
isMergePackageJson: true
});
addAgentsMdSearchDirs(from);
}
},
{
value: 'rstest-rltl',
label: 'Rstest',
order: 'pre',
when: (templateName)=>'react-js' === templateName || 'react-ts' === templateName,
action: ({ distFolder, addAgentsMdSearchDirs })=>{
const from = node_path.resolve(src_dirname, '..', 'template-react-rstest-rltl');
copyFolder({
from,
to: distFolder,
isMergePackageJson: true
});
addAgentsMdSearchDirs(from);
}
}
],
extraSkills: [
{
label: 'Lynx DevTool',
source: 'lynx-community/skills',
value: 'lynx-devtool'
}
],
mapESLintTemplate (templateName) {
const lang = templateName.split('-').at(-1);
if ('js' !== lang && 'ts' !== lang) return null;
switch(lang){
case 'js':
return 'react-js';
case 'ts':
return 'react-ts';
default:
return null;
}
}
});