Skip to content

Commit f9dd70d

Browse files
authored
Merge pull request #90 from doubleedesign/feature/styled-components-integration
feat: styled-components support
2 parents 38c9723 + 2968bb2 commit f9dd70d

3 files changed

Lines changed: 47 additions & 16 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default `import styled from 'styled-components';
2+
3+
export const TemplateNameWrapper = styled.div\`
4+
\`;
5+
`;

src/utils/generateComponentUtils.js

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { aiComponentGenerator } from '../services/openAiService.js';
1111
import componentJsTemplate from '../templates/component/componentJsTemplate.js';
1212
import componentTsTemplate from '../templates/component/componentTsTemplate.js';
1313
import componentCssTemplate from '../templates/component/componentCssTemplate.js';
14+
import componentStyledTemplate from '../templates/component/componentStyledTemplate.js';
1415
import componentLazyTemplate from '../templates/component/componentLazyTemplate.js';
1516
import componentTsLazyTemplate from '../templates/component/componentTsLazyTemplate.js';
1617
import componentStoryTemplate from '../templates/component/componentStoryTemplate.js';
@@ -81,7 +82,7 @@ Please make sure you're pointing to the right custom template path in your gener
8182
}
8283

8384
function componentTemplateGenerator({ cmd, componentName, cliConfigFile }) {
84-
const { cssPreprocessor, testLibrary, usesCssModule, usesTypeScript } = cliConfigFile;
85+
const { usesStyledComponents, cssPreprocessor, testLibrary, usesCssModule, usesTypeScript } = cliConfigFile;
8586
const { customTemplates } = cliConfigFile.component[cmd.type];
8687
let template = null;
8788
let filename = null;
@@ -113,16 +114,27 @@ function componentTemplateGenerator({ cmd, componentName, cliConfigFile }) {
113114
// --- If it has a corresponding stylesheet
114115

115116
if (cmd.withStyle) {
116-
const module = usesCssModule ? '.module' : '';
117-
const cssPath = `${componentName}${module}.${cssPreprocessor}`;
117+
if (cliConfigFile.usesStyledComponents) {
118+
const cssPath = `${componentName}.styled`;
119+
template = template.replace(
120+
`import styles from './TemplateName.module.css'`,
121+
`import { TemplateNameWrapper } from './${cssPath}'`
122+
);
123+
template = template.replace(` className={styles.TemplateName}`, '');
124+
template = template.replace(` <div`, '<TemplateNameWrapper');
125+
template = template.replace(` </div>`, '</TemplateNameWrapper>');
126+
} else {
127+
const module = usesCssModule ? '.module' : '';
128+
const cssPath = `${componentName}${module}.${cssPreprocessor}`;
118129

119-
// --- If the css module is true make sure to update the template accordingly
130+
// --- If the css module is true make sure to update the template accordingly
120131

121-
if (module.length) {
122-
template = template.replace(`'./TemplateName.module.css'`, `'./${cssPath}'`);
123-
} else {
124-
template = template.replace(`{styles.TemplateName}`, `"${componentName}"`);
125-
template = template.replace(`styles from './TemplateName.module.css'`, `'./${cssPath}'`);
132+
if (module.length) {
133+
template = template.replace(`'./TemplateName.module.css'`, `'./${cssPath}'`);
134+
} else {
135+
template = template.replace(`{styles.TemplateName}`, `"${componentName}"`);
136+
template = template.replace(`styles from './TemplateName.module.css'`, `'./${cssPath}'`);
137+
}
126138
}
127139
} else {
128140
// --- If no stylesheet, remove className attribute and style import from jsTemplate
@@ -157,14 +169,19 @@ function componentStyleTemplateGenerator({ cliConfigFile, cmd, componentName })
157169
template = customTemplate;
158170
filename = customTemplateFilename;
159171
} else {
160-
const { cssPreprocessor, usesCssModule } = cliConfigFile;
161-
const module = usesCssModule ? '.module' : '';
162-
const cssFilename = `${componentName}${module}.${cssPreprocessor}`;
172+
const { usesTypeScript, usesStyledComponents, cssPreprocessor, usesCssModule } = cliConfigFile;
173+
if (usesStyledComponents) {
174+
filename = usesTypeScript ? `${componentName}.styled.ts` : `${componentName}.styled.js`;
175+
template = componentStyledTemplate;
176+
} else {
177+
const module = usesCssModule ? '.module' : '';
178+
const cssFilename = `${componentName}${module}.${cssPreprocessor}`;
163179

164-
// --- Else use GRC built-in style template
180+
// --- Else use GRC built-in style template
165181

166-
template = componentCssTemplate;
167-
filename = cssFilename;
182+
template = componentCssTemplate;
183+
filename = cssFilename;
184+
}
168185
}
169186

170187
return {

src/utils/grcConfigUtils.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,19 @@ const projectLevelQuestions = [
2020
},
2121
{
2222
type: 'confirm',
23+
name: 'usesStyledComponents',
24+
message: 'Does this project use styled-components?',
25+
},
26+
{
27+
type: 'confirm',
28+
when: (answers) => !answers['usesStyledComponents'],
2329
name: 'usesCssModule',
2430
message: 'Does this project use CSS modules?',
2531
},
2632
{
2733
type: 'list',
2834
name: 'cssPreprocessor',
35+
when: (answers) => !answers['usesStyledComponents'],
2936
message: 'Does this project use a CSS Preprocessor?',
3037
choices: ['css', 'scss', 'less', 'styl'],
3138
},
@@ -184,7 +191,9 @@ export async function getCLIConfigFile() {
184191
*/
185192

186193
const missingConfigQuestions = grcConfigQuestions.filter(
187-
(question) => !deepKeys(currentConfigFile).includes(question.name)
194+
(question) =>
195+
!deepKeys(currentConfigFile).includes(question.name) &&
196+
(question.when ? question.when(currentConfigFile) : true)
188197
);
189198

190199
if (missingConfigQuestions.length) {

0 commit comments

Comments
 (0)