Skip to content

Commit 6b37bd5

Browse files
authored
feat(create-rslib): add rslint template mapping (#1624)
1 parent cfb56df commit 6b37bd5

2 files changed

Lines changed: 122 additions & 15 deletions

File tree

packages/create-rslib/src/index.ts

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
copyFolder,
1010
create,
1111
type ESLintTemplateName,
12+
type RslintTemplateName,
1213
select,
1314
} from 'create-rstack';
1415
import { parseTemplateName } from './parseTemplateName';
@@ -60,25 +61,49 @@ async function getTemplateName({ template }: Argv) {
6061
}
6162

6263
function mapESLintTemplate(templateName: string): ESLintTemplateName {
63-
const language = templateName.split('-').pop();
64-
return `vanilla-${language}` as ESLintTemplateName;
64+
switch (templateName) {
65+
case 'react-js':
66+
case 'react-ts':
67+
case 'vue-js':
68+
case 'vue-ts':
69+
return templateName;
70+
default: {
71+
const language = templateName.split('-').pop();
72+
return `vanilla-${language}` as ESLintTemplateName;
73+
}
74+
}
6575
}
6676

67-
function mapTestingToolTemplate(templateName: string): string {
68-
if (templateName.startsWith('react-')) {
69-
return templateName;
70-
}
71-
if (templateName.startsWith('vue-')) {
72-
return templateName;
73-
}
74-
if (templateName.startsWith('node-dual-')) {
75-
return templateName.replace('node-dual-', 'node-');
77+
function mapRslintTemplate(templateName: string): RslintTemplateName {
78+
switch (templateName) {
79+
case 'react-js':
80+
case 'react-ts':
81+
return templateName;
82+
default: {
83+
const language = templateName.split('-').pop();
84+
return `vanilla-${language}` as RslintTemplateName;
85+
}
7686
}
77-
if (templateName.startsWith('node-esm-')) {
78-
return templateName.replace('node-esm-', 'node-');
87+
}
88+
89+
function mapTestingToolTemplate(templateName: string): string {
90+
switch (templateName) {
91+
case 'react-js':
92+
case 'react-ts':
93+
case 'vue-js':
94+
case 'vue-ts':
95+
return templateName;
96+
case 'node-dual-js':
97+
case 'node-esm-js':
98+
return 'node-js';
99+
case 'node-dual-ts':
100+
case 'node-esm-ts':
101+
return 'node-ts';
102+
default: {
103+
const language = templateName.split('-').pop();
104+
return `node-${language}`;
105+
}
79106
}
80-
const language = templateName.split('-').pop();
81-
return `node-${language}`;
82107
}
83108

84109
function getPackageName(distFolder: string): string {
@@ -108,6 +133,7 @@ create({
108133
templates: TEMPLATES,
109134
getTemplateName,
110135
mapESLintTemplate,
136+
mapRslintTemplate,
111137
extraTools: [
112138
{
113139
value: 'rspress',

packages/create-rslib/test/index.test.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,87 @@ describe('linter and formatter', () => {
155155
clean();
156156
});
157157

158+
test('should create React project with eslint as expected', async () => {
159+
const { dir, pkgJson, clean } = createAndValidate(
160+
__dirname,
161+
createCase('react', 'ts'),
162+
{
163+
name: 'test-temp-react-eslint',
164+
tools: ['eslint'],
165+
clean: false,
166+
},
167+
);
168+
expect(pkgJson.devDependencies.eslint).toBeTruthy();
169+
expect(pkgJson.devDependencies['eslint-plugin-react-hooks']).toBeTruthy();
170+
expect(pkgJson.devDependencies['eslint-plugin-react-refresh']).toBeTruthy();
171+
172+
const configContent = readFileSync(join(dir, 'eslint.config.mjs'), 'utf-8');
173+
expect(configContent).toContain(
174+
"reactHooks.configs.flat['recommended-latest']",
175+
);
176+
expect(configContent).toContain('reactRefresh.configs.recommended');
177+
clean();
178+
});
179+
180+
test('should create Vue project with eslint as expected', async () => {
181+
const { dir, pkgJson, clean } = createAndValidate(
182+
__dirname,
183+
createCase('vue', 'ts'),
184+
{
185+
name: 'test-temp-vue-eslint',
186+
tools: ['eslint'],
187+
clean: false,
188+
},
189+
);
190+
expect(pkgJson.devDependencies.eslint).toBeTruthy();
191+
expect(pkgJson.devDependencies['eslint-plugin-vue']).toBeTruthy();
192+
expect(
193+
pkgJson.devDependencies['@vue/eslint-config-typescript'],
194+
).toBeTruthy();
195+
196+
const configContent = readFileSync(join(dir, 'eslint.config.mjs'), 'utf-8');
197+
expect(configContent).toContain("pluginVue.configs['flat/essential']");
198+
expect(configContent).toContain('vueTsConfigs.recommended');
199+
clean();
200+
});
201+
202+
test('should create React project with rslint as expected', async () => {
203+
const { dir, pkgJson, clean } = createAndValidate(
204+
__dirname,
205+
createCase('react', 'ts'),
206+
{
207+
name: 'test-temp-react-rslint',
208+
tools: ['rslint'],
209+
clean: false,
210+
},
211+
);
212+
expect(pkgJson.devDependencies['@rslint/core']).toBeTruthy();
213+
214+
const configContent = readFileSync(join(dir, 'rslint.config.ts'), 'utf-8');
215+
expect(configContent).toContain('reactPlugin.configs.recommended');
216+
expect(configContent).toContain('ts.configs.recommended');
217+
clean();
218+
});
219+
220+
test('should create Vue project with vanilla rslint as expected', async () => {
221+
const { dir, pkgJson, clean } = createAndValidate(
222+
__dirname,
223+
createCase('vue', 'js'),
224+
{
225+
name: 'test-temp-vue-rslint',
226+
tools: ['rslint'],
227+
clean: false,
228+
},
229+
);
230+
expect(pkgJson.devDependencies['@rslint/core']).toBeTruthy();
231+
232+
const configContent = readFileSync(join(dir, 'rslint.config.ts'), 'utf-8');
233+
expect(configContent).toContain('js.configs.recommended');
234+
expect(configContent).not.toContain('ts.configs.recommended');
235+
expect(configContent).not.toContain('reactPlugin');
236+
clean();
237+
});
238+
158239
test('should create project with prettier as expected', async () => {
159240
const { dir, pkgJson, clean } = createAndValidate(
160241
__dirname,

0 commit comments

Comments
 (0)