bernova 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +1778 -0
- package/dist/bin/bernova.js +2 -0
- package/dist/bin/buildstyle.js +2 -0
- package/dist/bin/createConfigFile.js +2 -0
- package/dist/bin/declareCssType.js +1 -0
- package/dist/index.js +1 -0
- package/dist/src/app.js +1 -0
- package/dist/src/constants/compilerType.js +1 -0
- package/dist/src/constants/cssAdvancedSelectors.js +1 -0
- package/dist/src/constants/cssProps.js +1 -0
- package/dist/src/constants/cssPseudoClasses.js +1 -0
- package/dist/src/constants/cssPseudoElements.js +1 -0
- package/dist/src/constants/index.js +1 -0
- package/dist/src/constants/resetCss.js +1 -0
- package/dist/src/index.d.ts +31 -0
- package/dist/src/index.js +1 -0
- package/dist/src/lib/compileConfig.js +1 -0
- package/dist/src/lib/compileThemes.js +1 -0
- package/dist/src/lib/copyLocalFonts/copyLocalFonts.utils.js +1 -0
- package/dist/src/lib/copyLocalFonts/generateCssFonts.utils.js +1 -0
- package/dist/src/lib/extractDocFragment/extractDocFragment.utils.js +1 -0
- package/dist/src/lib/fileExists/fileExists.utils.js +1 -0
- package/dist/src/lib/generateBaseCss/generateBaseCss.utils.js +1 -0
- package/dist/src/lib/generateCss/generateCSS.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/advanceselector/advancedSelectorHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/attribute/attributeHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/classnames/formatClassName.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/classnames/handlerRegister.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/cssVars/generateVars.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/dynamicValues/dynamicValues.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/dynamicValues/processDynamic.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/filterGenerateCss.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/foreign/foreignHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/generateCssStyles.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/index.js +1 -0
- package/dist/src/lib/generateCss/helpers/mediaqueries/generateMediaQueries.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/mediaqueries/mediaQueriesHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/other/declareCssType.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/other/generateGlobalStyles.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/pseudo/pseudoHandler.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/rulename/formatRuleName.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/extractValues.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/formattedStatKey.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/index.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/processCss.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/separateStyles.utils.js +1 -0
- package/dist/src/lib/generateCss/helpers/utils/validatePreviouslyExists.utils.js +1 -0
- package/dist/src/lib/generateCssDoc/generateCssDoc.util.js +1 -0
- package/dist/src/lib/generateProvider/generateProvider.utils.js +1 -0
- package/dist/src/lib/generateProvider/template/providerTemplate.d.ts +60 -0
- package/dist/src/lib/generateProvider/template/providerTemplate.js +1 -0
- package/dist/src/lib/generateThemeRegister/generateThemeRegister.utils.js +1 -0
- package/dist/src/lib/generateTools/generateTools.utils.js +1 -0
- package/dist/src/lib/generateTypesTools/generateTypesTools.utils.js +1 -0
- package/dist/src/lib/handlerForeignThemes/handlerForeignThemes.utils.js +1 -0
- package/dist/src/lib/index.js +1 -0
- package/dist/src/lib/processMediaConfig/processMediaConfig.util.js +1 -0
- package/dist/src/lib/readFile/readFile.utils.js +1 -0
- package/dist/src/lib/simplifyName/simplifyName.utils.js +1 -0
- package/dist/src/lib/typingStyles/index.js +1 -0
- package/dist/src/lib/typingStyles/typingStyles.utils.js +1 -0
- package/dist/src/lib/writeDoc/writeDoc.utils.js +1 -0
- package/package.json +80 -0
- package/src/app.js +176 -0
- package/src/constants/__tests__/compilerType.test.js +20 -0
- package/src/constants/__tests__/cssAdvancedSelectors.test.js +38 -0
- package/src/constants/__tests__/cssProps.test.js +331 -0
- package/src/constants/__tests__/cssPseudoClasses.test.js +48 -0
- package/src/constants/compilerType.js +14 -0
- package/src/constants/cssAdvancedSelectors.js +32 -0
- package/src/constants/cssProps.js +325 -0
- package/src/constants/cssPseudoClasses.js +138 -0
- package/src/constants/cssPseudoElements.js +83 -0
- package/src/constants/index.js +15 -0
- package/src/constants/resetCss.js +171 -0
- package/src/index.d.ts +31 -0
- package/src/index.js +20 -0
- package/src/lib/compileConfig.js +59 -0
- package/src/lib/compileThemes.js +118 -0
- package/src/lib/copyLocalFonts/copyLocalFonts.utils.js +42 -0
- package/src/lib/copyLocalFonts/generateCssFonts.utils.js +56 -0
- package/src/lib/extractDocFragment/extractDocFragment.utils.js +25 -0
- package/src/lib/fileExists/fileExists.utils.js +31 -0
- package/src/lib/generateBaseCss/generateBaseCss.utils.js +51 -0
- package/src/lib/generateCss/generateCSS.utils.js +42 -0
- package/src/lib/generateCss/helpers/advanceselector/advancedSelectorHandler.utils.js +22 -0
- package/src/lib/generateCss/helpers/attribute/attributeHandler.utils.js +47 -0
- package/src/lib/generateCss/helpers/classnames/formatClassName.utils.js +28 -0
- package/src/lib/generateCss/helpers/classnames/handlerRegister.utils.js +124 -0
- package/src/lib/generateCss/helpers/cssVars/generateVars.utils.js +73 -0
- package/src/lib/generateCss/helpers/dynamicValues/dynamicValues.utils.js +72 -0
- package/src/lib/generateCss/helpers/dynamicValues/processDynamic.utils.js +10 -0
- package/src/lib/generateCss/helpers/filterGenerateCss.utils.js +73 -0
- package/src/lib/generateCss/helpers/foreign/foreignHandler.utils.js +85 -0
- package/src/lib/generateCss/helpers/generateCssStyles.utils.js +249 -0
- package/src/lib/generateCss/helpers/index.js +53 -0
- package/src/lib/generateCss/helpers/mediaqueries/generateMediaQueries.utils.js +9 -0
- package/src/lib/generateCss/helpers/mediaqueries/mediaQueriesHandler.utils.js +181 -0
- package/src/lib/generateCss/helpers/other/declareCssType.utils.js +120 -0
- package/src/lib/generateCss/helpers/other/generateGlobalStyles.utils.js +30 -0
- package/src/lib/generateCss/helpers/pseudo/pseudoHandler.utils.js +56 -0
- package/src/lib/generateCss/helpers/rulename/formatRuleName.utils.js +163 -0
- package/src/lib/generateCss/helpers/utils/extractValues.utils.js +44 -0
- package/src/lib/generateCss/helpers/utils/formattedStatKey.utils.js +43 -0
- package/src/lib/generateCss/helpers/utils/index.js +15 -0
- package/src/lib/generateCss/helpers/utils/processCss.utils.js +93 -0
- package/src/lib/generateCss/helpers/utils/separateStyles.utils.js +43 -0
- package/src/lib/generateCss/helpers/utils/validatePreviouslyExists.utils.js +61 -0
- package/src/lib/generateCssDoc/generateCssDoc.util.js +47 -0
- package/src/lib/generateProvider/generateProvider.utils.js +283 -0
- package/src/lib/generateProvider/template/providerTemplate.d.ts +60 -0
- package/src/lib/generateProvider/template/providerTemplate.js +160 -0
- package/src/lib/generateThemeRegister/generateThemeRegister.utils.js +136 -0
- package/src/lib/generateTools/generateTools.utils.js +181 -0
- package/src/lib/generateTypesTools/generateTypesTools.utils.js +59 -0
- package/src/lib/handlerForeignThemes/handlerForeignThemes.utils.js +96 -0
- package/src/lib/index.js +61 -0
- package/src/lib/processMediaConfig/processMediaConfig.util.js +32 -0
- package/src/lib/readFile/readFile.utils.js +110 -0
- package/src/lib/simplifyName/__tests__/simplifyName.utils.test.js +87 -0
- package/src/lib/simplifyName/simplifyName.utils.js +28 -0
- package/src/lib/typingStyles/index.js +3 -0
- package/src/lib/typingStyles/typingStyles.utils.js +144 -0
- package/src/lib/writeDoc/writeDoc.utils.js +30 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Styles Generation Module for Bernova
|
|
3
|
+
*
|
|
4
|
+
* Processes CSS-in-JS objects and generates CSS strings with support for:
|
|
5
|
+
* - Nested styles and components
|
|
6
|
+
* - Pseudo-classes and pseudo-elements
|
|
7
|
+
* - Media queries and responsive design
|
|
8
|
+
* - Advanced selectors (child, sibling, etc.)
|
|
9
|
+
* - Attribute selectors
|
|
10
|
+
* - Foreign theme integration
|
|
11
|
+
* - Dynamic value interpolation
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const {
|
|
15
|
+
formatRuleName,
|
|
16
|
+
setForeignRegister,
|
|
17
|
+
pseudoHandler,
|
|
18
|
+
foreignHandler,
|
|
19
|
+
attributeHandler,
|
|
20
|
+
advancedSelectorHandler,
|
|
21
|
+
separateStyles,
|
|
22
|
+
extractValues,
|
|
23
|
+
mediaQueriesHandler,
|
|
24
|
+
generateMediaQueries,
|
|
25
|
+
handlerRegister,
|
|
26
|
+
setDynamicRegister,
|
|
27
|
+
processDynamicProps,
|
|
28
|
+
} = require('./index.js');
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Generates CSS styles from a JavaScript object representation
|
|
32
|
+
*
|
|
33
|
+
* @param {Object} params - Generation parameters
|
|
34
|
+
* @param {Object} params.source - CSS-in-JS source object
|
|
35
|
+
* @param {Object} params.mediaConfig - Media query configuration
|
|
36
|
+
* @param {string} params.prefix - CSS class prefix for namespacing
|
|
37
|
+
* @returns {Object} Generated CSS styles and documentation
|
|
38
|
+
*/
|
|
39
|
+
const generateCssStyles = ({ source, mediaConfig, prefix }) => {
|
|
40
|
+
// Initialize generation state
|
|
41
|
+
let cssStyles = ''; // Accumulates generated CSS
|
|
42
|
+
let register = {}; // Tracks generated class names
|
|
43
|
+
const mediaRegister = {}; // Tracks media query styles
|
|
44
|
+
const prefixed = prefix ? `${prefix}-` : ''; // CSS class prefix
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Recursively processes CSS-in-JS source objects
|
|
48
|
+
* Handles nested structures, special properties, and generates CSS rules
|
|
49
|
+
*
|
|
50
|
+
* @param {Object} params - Processing parameters
|
|
51
|
+
* @param {Object} params.source - CSS object to process
|
|
52
|
+
* @param {string} params.parentRule - Parent CSS rule for nesting
|
|
53
|
+
* @param {string} params.theRule - Current rule name
|
|
54
|
+
*/
|
|
55
|
+
const processSource = ({
|
|
56
|
+
source,
|
|
57
|
+
parentRule = undefined,
|
|
58
|
+
theRule = undefined,
|
|
59
|
+
}) => {
|
|
60
|
+
const {
|
|
61
|
+
styles,
|
|
62
|
+
lib: { $dynamicValues, ...lib },
|
|
63
|
+
other,
|
|
64
|
+
} = separateStyles(source);
|
|
65
|
+
const hasStyles = Object.entries(styles).length > 0;
|
|
66
|
+
const hasOtherProps = Object.entries(other).length > 0;
|
|
67
|
+
const hasLibProps = Object.entries(lib).length > 0;
|
|
68
|
+
|
|
69
|
+
const dynamicValues = $dynamicValues
|
|
70
|
+
? processDynamicProps($dynamicValues)
|
|
71
|
+
: undefined;
|
|
72
|
+
|
|
73
|
+
const ruleName = formatRuleName({
|
|
74
|
+
theRule,
|
|
75
|
+
parentRule,
|
|
76
|
+
register,
|
|
77
|
+
hasStyles,
|
|
78
|
+
prefix: prefixed,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
if (hasStyles) {
|
|
82
|
+
cssStyles += `.${ruleName} { ${extractValues({
|
|
83
|
+
styles,
|
|
84
|
+
dynamicValues,
|
|
85
|
+
})} }\n`;
|
|
86
|
+
}
|
|
87
|
+
if (hasLibProps) {
|
|
88
|
+
const {
|
|
89
|
+
$pseudoClasses,
|
|
90
|
+
$pseudoElements,
|
|
91
|
+
$mediaQueries,
|
|
92
|
+
$attributes,
|
|
93
|
+
$advancedSelectors,
|
|
94
|
+
$foreign,
|
|
95
|
+
} = lib;
|
|
96
|
+
|
|
97
|
+
if (Object.entries(other).length) {
|
|
98
|
+
processSource({ source: other, parentRule: ruleName });
|
|
99
|
+
}
|
|
100
|
+
if ($pseudoClasses) {
|
|
101
|
+
pseudoHandler({ pseudoData: $pseudoClasses, ruleName, processSource });
|
|
102
|
+
}
|
|
103
|
+
if ($pseudoElements) {
|
|
104
|
+
pseudoHandler({ pseudoData: $pseudoElements, ruleName, processSource });
|
|
105
|
+
}
|
|
106
|
+
if ($mediaQueries && !!mediaConfig) {
|
|
107
|
+
mediaQueriesHandler({
|
|
108
|
+
config: mediaConfig,
|
|
109
|
+
mediaQueries: $mediaQueries,
|
|
110
|
+
parentRule: ruleName,
|
|
111
|
+
theRule,
|
|
112
|
+
mediaRegister,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if ($attributes) {
|
|
116
|
+
attributeHandler({ attributes: $attributes, ruleName, processSource });
|
|
117
|
+
}
|
|
118
|
+
if ($advancedSelectors) {
|
|
119
|
+
advancedSelectorHandler($advancedSelectors, ruleName, processSource);
|
|
120
|
+
}
|
|
121
|
+
if ($foreign) {
|
|
122
|
+
const foreignRegister = foreignHandler({
|
|
123
|
+
foreign: $foreign,
|
|
124
|
+
prefix: prefixed,
|
|
125
|
+
});
|
|
126
|
+
const foreignName = ruleName.replace(prefixed, '');
|
|
127
|
+
setForeignRegister({
|
|
128
|
+
ruleName: foreignName,
|
|
129
|
+
foreignRegister,
|
|
130
|
+
register,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (dynamicValues) {
|
|
134
|
+
setDynamicRegister({
|
|
135
|
+
dynamicValues,
|
|
136
|
+
register,
|
|
137
|
+
ruleName,
|
|
138
|
+
prefix: prefixed,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (hasOtherProps) {
|
|
143
|
+
for (const [key, value] of Object.entries(other)) {
|
|
144
|
+
if (typeof value === 'object') {
|
|
145
|
+
const {
|
|
146
|
+
$pseudoClasses,
|
|
147
|
+
$pseudoElements,
|
|
148
|
+
$mediaQueries,
|
|
149
|
+
$attributes,
|
|
150
|
+
$advancedSelectors,
|
|
151
|
+
$foreign,
|
|
152
|
+
$dynamicValues,
|
|
153
|
+
...css
|
|
154
|
+
} = value;
|
|
155
|
+
|
|
156
|
+
const { styles, other } = separateStyles(css);
|
|
157
|
+
const hasStyles = Object.entries(styles).length > 0;
|
|
158
|
+
|
|
159
|
+
const dynamicValues = $dynamicValues
|
|
160
|
+
? processDynamicProps($dynamicValues)
|
|
161
|
+
: undefined;
|
|
162
|
+
|
|
163
|
+
const ruleName = formatRuleName({
|
|
164
|
+
key,
|
|
165
|
+
theRule,
|
|
166
|
+
parentRule,
|
|
167
|
+
register,
|
|
168
|
+
hasStyles,
|
|
169
|
+
prefix: prefixed,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
if (hasStyles) {
|
|
173
|
+
cssStyles += `.${ruleName} { ${extractValues({
|
|
174
|
+
styles,
|
|
175
|
+
dynamicValues,
|
|
176
|
+
})} }\n`;
|
|
177
|
+
}
|
|
178
|
+
if (Object.entries(other).length) {
|
|
179
|
+
processSource({ source: other, parentRule: ruleName });
|
|
180
|
+
}
|
|
181
|
+
if ($pseudoClasses) {
|
|
182
|
+
pseudoHandler({
|
|
183
|
+
pseudoData: $pseudoClasses,
|
|
184
|
+
ruleName,
|
|
185
|
+
processSource,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
if ($pseudoElements) {
|
|
189
|
+
pseudoHandler({
|
|
190
|
+
pseudoData: $pseudoElements,
|
|
191
|
+
ruleName,
|
|
192
|
+
processSource,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if ($mediaQueries && !!mediaConfig) {
|
|
196
|
+
mediaQueriesHandler({
|
|
197
|
+
config: mediaConfig,
|
|
198
|
+
mediaQueries: $mediaQueries,
|
|
199
|
+
parentRule: ruleName,
|
|
200
|
+
theRule,
|
|
201
|
+
mediaRegister,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
if ($attributes) {
|
|
205
|
+
attributeHandler({
|
|
206
|
+
attributes: $attributes,
|
|
207
|
+
ruleName,
|
|
208
|
+
processSource,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if ($advancedSelectors) {
|
|
212
|
+
advancedSelectorHandler(
|
|
213
|
+
$advancedSelectors,
|
|
214
|
+
ruleName,
|
|
215
|
+
processSource
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
if ($foreign) {
|
|
219
|
+
const foreignRegister = foreignHandler({
|
|
220
|
+
foreign: $foreign,
|
|
221
|
+
prefix: prefixed,
|
|
222
|
+
});
|
|
223
|
+
const foreignName = ruleName.replace(prefixed, '');
|
|
224
|
+
setForeignRegister({
|
|
225
|
+
ruleName: foreignName,
|
|
226
|
+
foreignRegister,
|
|
227
|
+
register,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (dynamicValues) {
|
|
231
|
+
setDynamicRegister({
|
|
232
|
+
dynamicValues,
|
|
233
|
+
register,
|
|
234
|
+
ruleName,
|
|
235
|
+
prefix: prefixed,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
processSource({ source });
|
|
244
|
+
const stylesDocs = handlerRegister({ register, prefix });
|
|
245
|
+
const cssMediaStyles = generateMediaQueries(mediaRegister);
|
|
246
|
+
return { styles: cssStyles.concat(cssMediaStyles), stylesDocs };
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
module.exports = { generateCssStyles };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const {
|
|
2
|
+
advancedSelectorHandler,
|
|
3
|
+
} = require('./advanceselector/advancedSelectorHandler.utils');
|
|
4
|
+
const { attributeHandler } = require('./attribute/attributeHandler.utils');
|
|
5
|
+
const { formatClassName } = require('./classnames/formatClassName.utils');
|
|
6
|
+
const { generateVars } = require('./cssVars/generateVars.utils');
|
|
7
|
+
const { foreignHandler } = require('./foreign/foreignHandler.utils');
|
|
8
|
+
const {
|
|
9
|
+
generateMediaQueries,
|
|
10
|
+
} = require('./mediaqueries/generateMediaQueries.utils');
|
|
11
|
+
const {
|
|
12
|
+
mediaQueriesHandler,
|
|
13
|
+
} = require('./mediaqueries/mediaQueriesHandler.utils');
|
|
14
|
+
const { declareCssType } = require('./other/declareCssType.utils');
|
|
15
|
+
const { generateGlobalStyles } = require('./other/generateGlobalStyles.utils');
|
|
16
|
+
const { pseudoHandler } = require('./pseudo/pseudoHandler.utils');
|
|
17
|
+
const {
|
|
18
|
+
formatRuleName,
|
|
19
|
+
setForeignRegister,
|
|
20
|
+
} = require('./rulename/formatRuleName.utils');
|
|
21
|
+
const { extractValues } = require('./utils/extractValues.utils');
|
|
22
|
+
const { processCssWithPostcss } = require('./utils/processCss.utils');
|
|
23
|
+
const { separateStyles } = require('./utils/separateStyles.utils');
|
|
24
|
+
const {
|
|
25
|
+
validatePreviouslyExists,
|
|
26
|
+
} = require('./utils/validatePreviouslyExists.utils');
|
|
27
|
+
const { formattedStatKey } = require('./utils/formattedStatKey.utils');
|
|
28
|
+
const { handlerRegister } = require('./classnames/handlerRegister.utils');
|
|
29
|
+
const { setDynamicRegister } = require('./dynamicValues/dynamicValues.utils');
|
|
30
|
+
const { processDynamicProps } = require('./dynamicValues/processDynamic.utils');
|
|
31
|
+
|
|
32
|
+
module.exports = {
|
|
33
|
+
advancedSelectorHandler,
|
|
34
|
+
attributeHandler,
|
|
35
|
+
formatClassName,
|
|
36
|
+
generateVars,
|
|
37
|
+
foreignHandler,
|
|
38
|
+
generateMediaQueries,
|
|
39
|
+
mediaQueriesHandler,
|
|
40
|
+
declareCssType,
|
|
41
|
+
generateGlobalStyles,
|
|
42
|
+
pseudoHandler,
|
|
43
|
+
formatRuleName,
|
|
44
|
+
setForeignRegister,
|
|
45
|
+
extractValues,
|
|
46
|
+
processCssWithPostcss,
|
|
47
|
+
separateStyles,
|
|
48
|
+
validatePreviouslyExists,
|
|
49
|
+
formattedStatKey,
|
|
50
|
+
handlerRegister,
|
|
51
|
+
setDynamicRegister,
|
|
52
|
+
processDynamicProps,
|
|
53
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const generateMediaQueries = (mediaRegister) => {
|
|
2
|
+
let cssMediaStyles = '';
|
|
3
|
+
Object.entries(mediaRegister).forEach(([mediaName, mediaStyles]) => {
|
|
4
|
+
cssMediaStyles += `@media ${mediaName} {\n${mediaStyles}}\n`;
|
|
5
|
+
});
|
|
6
|
+
return cssMediaStyles;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
module.exports = { generateMediaQueries };
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Queries Handler for Bernova CSS Framework
|
|
3
|
+
*
|
|
4
|
+
* Processes and generates CSS media queries from JavaScript objects.
|
|
5
|
+
* Handles nested styles, pseudo-classes, and advanced selectors within media queries.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const {
|
|
9
|
+
advancedSelectorHandler,
|
|
10
|
+
} = require('../advanceselector/advancedSelectorHandler.utils');
|
|
11
|
+
const { attributeHandler } = require('../attribute/attributeHandler.utils');
|
|
12
|
+
const { formatClassName } = require('../classnames/formatClassName.utils');
|
|
13
|
+
const { pseudoHandler } = require('../pseudo/pseudoHandler.utils');
|
|
14
|
+
const { formatRuleName } = require('../rulename/formatRuleName.utils');
|
|
15
|
+
const { extractValues } = require('../utils/extractValues.utils');
|
|
16
|
+
const { separateStyles } = require('../utils/separateStyles.utils');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Handles CSS generation within media queries context
|
|
20
|
+
* Processes styles that should be applied at specific breakpoints
|
|
21
|
+
*
|
|
22
|
+
* @param {Object} mediaStyles - CSS styles object for media query
|
|
23
|
+
* @param {string} parentRule - Parent CSS rule selector
|
|
24
|
+
* @param {string} theRule - Current CSS rule being processed
|
|
25
|
+
* @returns {Object} Generated CSS and register information
|
|
26
|
+
*/
|
|
27
|
+
const handleMediaQueriesStyles = ({ mediaStyles, parentRule, theRule }) => {
|
|
28
|
+
let cssMediaStyles = '';
|
|
29
|
+
let mediaRegister = {};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Recursively processes media query styles
|
|
33
|
+
* Separates CSS properties from nested objects and generates appropriate selectors
|
|
34
|
+
*/
|
|
35
|
+
const processMediaStyles = ({
|
|
36
|
+
source,
|
|
37
|
+
parentRule = undefined,
|
|
38
|
+
theRule = undefined,
|
|
39
|
+
}) => {
|
|
40
|
+
const { styles, other } = separateStyles(source);
|
|
41
|
+
const hasStyles = Object.entries(styles).length > 0;
|
|
42
|
+
const hasOtherProps = Object.entries(other).length > 0;
|
|
43
|
+
const ruleName = formatRuleName({
|
|
44
|
+
key: parentRule,
|
|
45
|
+
theRule,
|
|
46
|
+
parentRule: undefined,
|
|
47
|
+
register: mediaRegister,
|
|
48
|
+
hasStyles,
|
|
49
|
+
prefix: '',
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
if (hasStyles) {
|
|
53
|
+
cssMediaStyles += `.${ruleName} { ${extractValues({ styles })} }\n`;
|
|
54
|
+
}
|
|
55
|
+
if (hasOtherProps) {
|
|
56
|
+
for (const [key, value] of Object.entries(other)) {
|
|
57
|
+
if (typeof value === 'object') {
|
|
58
|
+
const {
|
|
59
|
+
$pseudoClasses,
|
|
60
|
+
$pseudoElements,
|
|
61
|
+
$mediaQueries,
|
|
62
|
+
$attributes,
|
|
63
|
+
$advancedSelectors,
|
|
64
|
+
$foreign,
|
|
65
|
+
$extends,
|
|
66
|
+
$recycle,
|
|
67
|
+
$variables,
|
|
68
|
+
...css
|
|
69
|
+
} = value;
|
|
70
|
+
|
|
71
|
+
const { styles, other } = separateStyles(css);
|
|
72
|
+
const hasStyles = Object.entries(styles).length > 0;
|
|
73
|
+
const ruleName = formatRuleName({
|
|
74
|
+
key,
|
|
75
|
+
theRule,
|
|
76
|
+
parentRule,
|
|
77
|
+
register: mediaRegister,
|
|
78
|
+
hasStyles,
|
|
79
|
+
prefix: '',
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (hasStyles) {
|
|
83
|
+
cssMediaStyles += `.${ruleName} { ${extractValues({ styles })} }\n`;
|
|
84
|
+
}
|
|
85
|
+
if (Object.entries(other).length) {
|
|
86
|
+
processMediaStyles({ source: other, parentRule: ruleName });
|
|
87
|
+
}
|
|
88
|
+
if ($pseudoClasses) {
|
|
89
|
+
pseudoHandler({
|
|
90
|
+
pseudoData: $pseudoClasses,
|
|
91
|
+
ruleName,
|
|
92
|
+
processSource: processMediaStyles,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if ($pseudoElements) {
|
|
96
|
+
pseudoHandler({
|
|
97
|
+
pseudoData: $pseudoElements,
|
|
98
|
+
ruleName,
|
|
99
|
+
processSource: processMediaStyles,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if ($attributes) {
|
|
103
|
+
attributeHandler({
|
|
104
|
+
attributes: $attributes,
|
|
105
|
+
ruleName,
|
|
106
|
+
processSource: processMediaStyles,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if ($advancedSelectors) {
|
|
110
|
+
advancedSelectorHandler(
|
|
111
|
+
$advancedSelectors,
|
|
112
|
+
ruleName,
|
|
113
|
+
processMediaStyles
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
if ($foreign) {
|
|
117
|
+
const [comp, ..._] = ruleName.split('--');
|
|
118
|
+
const component = comp.length ? comp : '';
|
|
119
|
+
const mainComponent = component.includes('__')
|
|
120
|
+
? component.split('__')[0]
|
|
121
|
+
: component;
|
|
122
|
+
Object.entries($foreign).forEach(([key, value]) => {
|
|
123
|
+
const foreignComponent = `${mainComponent}-${key}`;
|
|
124
|
+
processSource({ source: value, parentRule: foreignComponent });
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
processMediaStyles({ source: mediaStyles, theRule, parentRule });
|
|
133
|
+
return cssMediaStyles;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const mediaQueriesHandler = ({
|
|
137
|
+
config,
|
|
138
|
+
mediaQueries,
|
|
139
|
+
parentRule,
|
|
140
|
+
theRule,
|
|
141
|
+
mediaRegister,
|
|
142
|
+
}) => {
|
|
143
|
+
Object.entries(mediaQueries).forEach(([media, mediaStyles]) => {
|
|
144
|
+
const relatedConfig = config.find((c) => c.name === media);
|
|
145
|
+
if (typeof mediaStyles === 'object' && Object.keys(mediaStyles).length) {
|
|
146
|
+
const { $type = '', $values, ...rest } = mediaStyles;
|
|
147
|
+
const cssMediaStyles = handleMediaQueriesStyles({
|
|
148
|
+
mediaStyles: rest,
|
|
149
|
+
parentRule,
|
|
150
|
+
theRule,
|
|
151
|
+
});
|
|
152
|
+
let _type;
|
|
153
|
+
let _values;
|
|
154
|
+
if (!!relatedConfig) {
|
|
155
|
+
const { type = '', values } = relatedConfig;
|
|
156
|
+
_type = type;
|
|
157
|
+
_values = values;
|
|
158
|
+
} else if (!!$values) {
|
|
159
|
+
_type = $type;
|
|
160
|
+
_values = $values;
|
|
161
|
+
}
|
|
162
|
+
let localValues = '';
|
|
163
|
+
Object.entries(_values).forEach(([key, value], idx) => {
|
|
164
|
+
const formattedKey = formatClassName(key);
|
|
165
|
+
if (idx > 0 || _type.length) {
|
|
166
|
+
localValues += ' and';
|
|
167
|
+
}
|
|
168
|
+
localValues += ` (${formattedKey}: ${value})`;
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
const mediaName = `${_type}${localValues}`;
|
|
172
|
+
if (!(mediaName in mediaRegister)) {
|
|
173
|
+
mediaRegister[mediaName] = cssMediaStyles;
|
|
174
|
+
} else {
|
|
175
|
+
mediaRegister[mediaName] += cssMediaStyles;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
module.exports = { mediaQueriesHandler };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const {
|
|
3
|
+
cssProps,
|
|
4
|
+
cssPseudoClasses,
|
|
5
|
+
cssPseudoElements,
|
|
6
|
+
cssAdvancedSelectors,
|
|
7
|
+
} = require('../../../../constants/index.js');
|
|
8
|
+
const { writeDoc } = require('../../../writeDoc/writeDoc.utils.js');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generates TypeScript type definitions for CSS properties, pseudo-classes, pseudo-elements,
|
|
12
|
+
* attributes, and media queries, and writes them to a file.
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} mediaQueries - An object containing media query definitions.
|
|
15
|
+
* @param {string} dir - The directory path where the generated TypeScript file will be saved.
|
|
16
|
+
* @returns {Promise<void>} A promise that resolves when the file has been written.
|
|
17
|
+
*/
|
|
18
|
+
const declareCssType = async (mediaQueries, dir) => {
|
|
19
|
+
const generateTypeDefinition = (name, content) =>
|
|
20
|
+
`type ${name} = {\n${content}\n};\n`;
|
|
21
|
+
|
|
22
|
+
const generateInterfaceContent = (obj, additionalContent = '') =>
|
|
23
|
+
Object.keys(obj)
|
|
24
|
+
.map((key) => `${key}?: ${additionalContent}`)
|
|
25
|
+
.join('\n');
|
|
26
|
+
|
|
27
|
+
const libExtendsInterface = generateTypeDefinition(
|
|
28
|
+
'LibExtendsType',
|
|
29
|
+
'$extends?: string;'
|
|
30
|
+
);
|
|
31
|
+
const libRecycleInterface = generateTypeDefinition(
|
|
32
|
+
'LibRecycleType',
|
|
33
|
+
'$recycle?: string;'
|
|
34
|
+
);
|
|
35
|
+
const foreignInterface = generateTypeDefinition(
|
|
36
|
+
'ForeignType',
|
|
37
|
+
'$foreign?: { [key: string]: { [key: string]: CssPropsType & CssPseudoJoinedType & CssAddicionalTypes } };'
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const cssPropsInterface = generateTypeDefinition(
|
|
41
|
+
'CssPropsType',
|
|
42
|
+
`LibExtendsType & LibRecycleType & ForeignType & {\n${generateInterfaceContent(
|
|
43
|
+
cssProps,
|
|
44
|
+
'string;'
|
|
45
|
+
)}\n}`
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const cssAdvancedSelectorsInterface = generateTypeDefinition(
|
|
49
|
+
'CssAdvancedSelectorsType',
|
|
50
|
+
generateInterfaceContent(
|
|
51
|
+
cssAdvancedSelectors,
|
|
52
|
+
'CssPropsType & { $target: string }'
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const cssPseudoJoined = generateTypeDefinition(
|
|
57
|
+
'CssPseudoJoinedType',
|
|
58
|
+
'$pseudoClasses?: CssPseudoClassesType;\n$pseudoElements?: CssPseudoElementsType;'
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const cssAddicionalTypes = generateTypeDefinition(
|
|
62
|
+
'CssAddicionalTypes',
|
|
63
|
+
'$advancedSelectors?: CssAdvancedSelectorsType[];\n$mediaQueries?: MediaQueriesType;\n'
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const cssPseudoClassesInterface = generateTypeDefinition(
|
|
67
|
+
'CssPseudoClassesType',
|
|
68
|
+
generateInterfaceContent(
|
|
69
|
+
cssPseudoClasses,
|
|
70
|
+
'CssPropsType & { $target?: string } & CssAddicionalTypes & { $attributes?: CssAttributesType } | CssPseudoElementsType & CssAddicionalTypes & { $attributes?: CssAttributesType } | CssPseudoClassesType & CssAddicionalTypes & { $attributes?: CssAttributesType };'
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const cssPseudoElementsInterface = generateTypeDefinition(
|
|
75
|
+
'CssPseudoElementsType',
|
|
76
|
+
generateInterfaceContent(
|
|
77
|
+
cssPseudoElements,
|
|
78
|
+
'CssPropsType & CssAddicionalTypes & { $attributes?: CssAttributesType } | CssPseudoElementsType & CssAddicionalTypes & { $attributes?: CssAttributesType } | CssPseudoClassesType & CssAddicionalTypes & { $attributes?: CssAttributesType };'
|
|
79
|
+
)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const attributesInterface = generateTypeDefinition(
|
|
83
|
+
'CssAttributesType',
|
|
84
|
+
'[key: string]: CssPropsType & CssAddicionalTypes & CssPseudoJoinedType | {\n[key: string]: CssPropsType & CssAddicionalTypes & CssPseudoJoinedType \n};'
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
let mediaQueriesInterface = '';
|
|
88
|
+
if (mediaQueries?.screen && Object.keys(mediaQueries.screen).length) {
|
|
89
|
+
const mediaScreenInterface = generateTypeDefinition(
|
|
90
|
+
'MediaScreenType',
|
|
91
|
+
generateInterfaceContent(mediaQueries.screen, 'CssPropsType;')
|
|
92
|
+
);
|
|
93
|
+
mediaQueriesInterface = `${mediaScreenInterface}type MediaQueriesType = {\n screen?: MediaScreenType;\n};\n`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const cssGeneratorInterface = `export type CssGeneratorType = CssPropsType & {\n$pseudoClasses?: CssPseudoClassesType;\n$pseudoElements?: CssPseudoElementsType;\n$mediaQueries?: MediaQueriesType;\n$attributes?: CssAttributesType;\n$advancedSelectors?: CssAdvancedSelectorsType[];\n};\n`;
|
|
97
|
+
|
|
98
|
+
const finalTypeDoc = [
|
|
99
|
+
libExtendsInterface,
|
|
100
|
+
libRecycleInterface,
|
|
101
|
+
foreignInterface,
|
|
102
|
+
cssPropsInterface,
|
|
103
|
+
cssAdvancedSelectorsInterface,
|
|
104
|
+
cssPseudoJoined,
|
|
105
|
+
cssAddicionalTypes,
|
|
106
|
+
cssPseudoClassesInterface,
|
|
107
|
+
cssPseudoElementsInterface,
|
|
108
|
+
mediaQueriesInterface,
|
|
109
|
+
attributesInterface,
|
|
110
|
+
cssGeneratorInterface,
|
|
111
|
+
].join('');
|
|
112
|
+
|
|
113
|
+
await writeDoc(
|
|
114
|
+
path.resolve(dir, 'generatorType.ts'),
|
|
115
|
+
finalTypeDoc,
|
|
116
|
+
'generatorType.ts'
|
|
117
|
+
);
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
module.exports = { declareCssType };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const { simplifyName } = require('../../../simplifyName/simplifyName.utils.js');
|
|
2
|
+
const { extractValues } = require('../utils/extractValues.utils.js');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generates globalStyles CSS styles from the provided globalStyles styles object.
|
|
6
|
+
*
|
|
7
|
+
* @param {Array} globalStyles - An array of objects containing targets and styles.
|
|
8
|
+
* @returns {string} The generated globalStyles CSS styles.
|
|
9
|
+
*/
|
|
10
|
+
const generateGlobalStyles = (globalStyles) => {
|
|
11
|
+
return globalStyles.reduce(
|
|
12
|
+
(acc, { targets, styles }) => {
|
|
13
|
+
const stylesString = extractValues({ styles });
|
|
14
|
+
acc.globalStyles += `${targets} { ${stylesString} }\n`;
|
|
15
|
+
//* Set the globalStyles register
|
|
16
|
+
const allTargets = targets.split(' ').filter((t) => t.startsWith('.'));
|
|
17
|
+
if (allTargets.length) {
|
|
18
|
+
allTargets.forEach((target) => {
|
|
19
|
+
const formattedTarget = simplifyName(target);
|
|
20
|
+
acc.globalDocs.doc += ` ${formattedTarget}: '${target}',\n`;
|
|
21
|
+
acc.globalDocs.declare += ` ${formattedTarget}: string;\n`;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return acc;
|
|
25
|
+
},
|
|
26
|
+
{ globalStyles: '', globalDocs: { doc: '', declare: '' } }
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
module.exports = { generateGlobalStyles };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const {
|
|
2
|
+
cssPseudoClasses,
|
|
3
|
+
cssPseudoElements,
|
|
4
|
+
} = require('../../../../constants/index.js');
|
|
5
|
+
const { separateStyles } = require('../utils/separateStyles.utils.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Handles pseudo-classes and pseudo-elements, and processes nested objects.
|
|
9
|
+
*
|
|
10
|
+
* @param {Object} pseudoData - The pseudo-classes and pseudo-elements to process.
|
|
11
|
+
* @param {string} ruleName - The base rule name to be used.
|
|
12
|
+
* @param {Function} processSource - A function to process nested objects.
|
|
13
|
+
*/
|
|
14
|
+
const pseudoHandler = ({ pseudoData, ruleName, processSource }) => {
|
|
15
|
+
for (const [pseudo, properties] of Object.entries(pseudoData)) {
|
|
16
|
+
//? Determine the pseudo type
|
|
17
|
+
const pseudoType = (() => {
|
|
18
|
+
if (pseudo in cssPseudoClasses) {
|
|
19
|
+
return `:${cssPseudoClasses[pseudo]}`;
|
|
20
|
+
} else if (pseudo in cssPseudoElements) {
|
|
21
|
+
return `::${cssPseudoElements[pseudo]}`;
|
|
22
|
+
}
|
|
23
|
+
return '';
|
|
24
|
+
})();
|
|
25
|
+
//? Extract special property and the rest
|
|
26
|
+
const { $target, ...props } = properties;
|
|
27
|
+
//? Build the complete rule name
|
|
28
|
+
const pseudoRule = $target ? `${pseudoType}(${$target})` : `${pseudoType}`;
|
|
29
|
+
const completeRuleName = `${ruleName}${pseudoRule}`;
|
|
30
|
+
//? Separate properties into special and regular
|
|
31
|
+
/**
|
|
32
|
+
* styles: regular CSS properties
|
|
33
|
+
* lib: special properties like $pseudoClasses, $mediaQueries, etc.
|
|
34
|
+
* other: any other properties that don't fit into styles or lib
|
|
35
|
+
*/
|
|
36
|
+
const { styles, lib, other } = separateStyles(props);
|
|
37
|
+
const processStyles =
|
|
38
|
+
Object.entries(styles).length > 0 || Object.entries(lib).length > 0;
|
|
39
|
+
const hasNestedStyles = Object.keys(other).some(
|
|
40
|
+
(oth) => oth in cssPseudoClasses || oth in cssPseudoElements
|
|
41
|
+
);
|
|
42
|
+
if (hasNestedStyles) {
|
|
43
|
+
pseudoHandler({
|
|
44
|
+
pseudoData: other,
|
|
45
|
+
ruleName: completeRuleName,
|
|
46
|
+
processSource,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (processStyles) {
|
|
50
|
+
const mergeStyles = { ...styles, ...lib };
|
|
51
|
+
processSource({ source: mergeStyles, theRule: completeRuleName });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
module.exports = { pseudoHandler };
|