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.
Files changed (125) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1778 -0
  3. package/dist/bin/bernova.js +2 -0
  4. package/dist/bin/buildstyle.js +2 -0
  5. package/dist/bin/createConfigFile.js +2 -0
  6. package/dist/bin/declareCssType.js +1 -0
  7. package/dist/index.js +1 -0
  8. package/dist/src/app.js +1 -0
  9. package/dist/src/constants/compilerType.js +1 -0
  10. package/dist/src/constants/cssAdvancedSelectors.js +1 -0
  11. package/dist/src/constants/cssProps.js +1 -0
  12. package/dist/src/constants/cssPseudoClasses.js +1 -0
  13. package/dist/src/constants/cssPseudoElements.js +1 -0
  14. package/dist/src/constants/index.js +1 -0
  15. package/dist/src/constants/resetCss.js +1 -0
  16. package/dist/src/index.d.ts +31 -0
  17. package/dist/src/index.js +1 -0
  18. package/dist/src/lib/compileConfig.js +1 -0
  19. package/dist/src/lib/compileThemes.js +1 -0
  20. package/dist/src/lib/copyLocalFonts/copyLocalFonts.utils.js +1 -0
  21. package/dist/src/lib/copyLocalFonts/generateCssFonts.utils.js +1 -0
  22. package/dist/src/lib/extractDocFragment/extractDocFragment.utils.js +1 -0
  23. package/dist/src/lib/fileExists/fileExists.utils.js +1 -0
  24. package/dist/src/lib/generateBaseCss/generateBaseCss.utils.js +1 -0
  25. package/dist/src/lib/generateCss/generateCSS.utils.js +1 -0
  26. package/dist/src/lib/generateCss/helpers/advanceselector/advancedSelectorHandler.utils.js +1 -0
  27. package/dist/src/lib/generateCss/helpers/attribute/attributeHandler.utils.js +1 -0
  28. package/dist/src/lib/generateCss/helpers/classnames/formatClassName.utils.js +1 -0
  29. package/dist/src/lib/generateCss/helpers/classnames/handlerRegister.utils.js +1 -0
  30. package/dist/src/lib/generateCss/helpers/cssVars/generateVars.utils.js +1 -0
  31. package/dist/src/lib/generateCss/helpers/dynamicValues/dynamicValues.utils.js +1 -0
  32. package/dist/src/lib/generateCss/helpers/dynamicValues/processDynamic.utils.js +1 -0
  33. package/dist/src/lib/generateCss/helpers/filterGenerateCss.utils.js +1 -0
  34. package/dist/src/lib/generateCss/helpers/foreign/foreignHandler.utils.js +1 -0
  35. package/dist/src/lib/generateCss/helpers/generateCssStyles.utils.js +1 -0
  36. package/dist/src/lib/generateCss/helpers/index.js +1 -0
  37. package/dist/src/lib/generateCss/helpers/mediaqueries/generateMediaQueries.utils.js +1 -0
  38. package/dist/src/lib/generateCss/helpers/mediaqueries/mediaQueriesHandler.utils.js +1 -0
  39. package/dist/src/lib/generateCss/helpers/other/declareCssType.utils.js +1 -0
  40. package/dist/src/lib/generateCss/helpers/other/generateGlobalStyles.utils.js +1 -0
  41. package/dist/src/lib/generateCss/helpers/pseudo/pseudoHandler.utils.js +1 -0
  42. package/dist/src/lib/generateCss/helpers/rulename/formatRuleName.utils.js +1 -0
  43. package/dist/src/lib/generateCss/helpers/utils/extractValues.utils.js +1 -0
  44. package/dist/src/lib/generateCss/helpers/utils/formattedStatKey.utils.js +1 -0
  45. package/dist/src/lib/generateCss/helpers/utils/index.js +1 -0
  46. package/dist/src/lib/generateCss/helpers/utils/processCss.utils.js +1 -0
  47. package/dist/src/lib/generateCss/helpers/utils/separateStyles.utils.js +1 -0
  48. package/dist/src/lib/generateCss/helpers/utils/validatePreviouslyExists.utils.js +1 -0
  49. package/dist/src/lib/generateCssDoc/generateCssDoc.util.js +1 -0
  50. package/dist/src/lib/generateProvider/generateProvider.utils.js +1 -0
  51. package/dist/src/lib/generateProvider/template/providerTemplate.d.ts +60 -0
  52. package/dist/src/lib/generateProvider/template/providerTemplate.js +1 -0
  53. package/dist/src/lib/generateThemeRegister/generateThemeRegister.utils.js +1 -0
  54. package/dist/src/lib/generateTools/generateTools.utils.js +1 -0
  55. package/dist/src/lib/generateTypesTools/generateTypesTools.utils.js +1 -0
  56. package/dist/src/lib/handlerForeignThemes/handlerForeignThemes.utils.js +1 -0
  57. package/dist/src/lib/index.js +1 -0
  58. package/dist/src/lib/processMediaConfig/processMediaConfig.util.js +1 -0
  59. package/dist/src/lib/readFile/readFile.utils.js +1 -0
  60. package/dist/src/lib/simplifyName/simplifyName.utils.js +1 -0
  61. package/dist/src/lib/typingStyles/index.js +1 -0
  62. package/dist/src/lib/typingStyles/typingStyles.utils.js +1 -0
  63. package/dist/src/lib/writeDoc/writeDoc.utils.js +1 -0
  64. package/package.json +80 -0
  65. package/src/app.js +176 -0
  66. package/src/constants/__tests__/compilerType.test.js +20 -0
  67. package/src/constants/__tests__/cssAdvancedSelectors.test.js +38 -0
  68. package/src/constants/__tests__/cssProps.test.js +331 -0
  69. package/src/constants/__tests__/cssPseudoClasses.test.js +48 -0
  70. package/src/constants/compilerType.js +14 -0
  71. package/src/constants/cssAdvancedSelectors.js +32 -0
  72. package/src/constants/cssProps.js +325 -0
  73. package/src/constants/cssPseudoClasses.js +138 -0
  74. package/src/constants/cssPseudoElements.js +83 -0
  75. package/src/constants/index.js +15 -0
  76. package/src/constants/resetCss.js +171 -0
  77. package/src/index.d.ts +31 -0
  78. package/src/index.js +20 -0
  79. package/src/lib/compileConfig.js +59 -0
  80. package/src/lib/compileThemes.js +118 -0
  81. package/src/lib/copyLocalFonts/copyLocalFonts.utils.js +42 -0
  82. package/src/lib/copyLocalFonts/generateCssFonts.utils.js +56 -0
  83. package/src/lib/extractDocFragment/extractDocFragment.utils.js +25 -0
  84. package/src/lib/fileExists/fileExists.utils.js +31 -0
  85. package/src/lib/generateBaseCss/generateBaseCss.utils.js +51 -0
  86. package/src/lib/generateCss/generateCSS.utils.js +42 -0
  87. package/src/lib/generateCss/helpers/advanceselector/advancedSelectorHandler.utils.js +22 -0
  88. package/src/lib/generateCss/helpers/attribute/attributeHandler.utils.js +47 -0
  89. package/src/lib/generateCss/helpers/classnames/formatClassName.utils.js +28 -0
  90. package/src/lib/generateCss/helpers/classnames/handlerRegister.utils.js +124 -0
  91. package/src/lib/generateCss/helpers/cssVars/generateVars.utils.js +73 -0
  92. package/src/lib/generateCss/helpers/dynamicValues/dynamicValues.utils.js +72 -0
  93. package/src/lib/generateCss/helpers/dynamicValues/processDynamic.utils.js +10 -0
  94. package/src/lib/generateCss/helpers/filterGenerateCss.utils.js +73 -0
  95. package/src/lib/generateCss/helpers/foreign/foreignHandler.utils.js +85 -0
  96. package/src/lib/generateCss/helpers/generateCssStyles.utils.js +249 -0
  97. package/src/lib/generateCss/helpers/index.js +53 -0
  98. package/src/lib/generateCss/helpers/mediaqueries/generateMediaQueries.utils.js +9 -0
  99. package/src/lib/generateCss/helpers/mediaqueries/mediaQueriesHandler.utils.js +181 -0
  100. package/src/lib/generateCss/helpers/other/declareCssType.utils.js +120 -0
  101. package/src/lib/generateCss/helpers/other/generateGlobalStyles.utils.js +30 -0
  102. package/src/lib/generateCss/helpers/pseudo/pseudoHandler.utils.js +56 -0
  103. package/src/lib/generateCss/helpers/rulename/formatRuleName.utils.js +163 -0
  104. package/src/lib/generateCss/helpers/utils/extractValues.utils.js +44 -0
  105. package/src/lib/generateCss/helpers/utils/formattedStatKey.utils.js +43 -0
  106. package/src/lib/generateCss/helpers/utils/index.js +15 -0
  107. package/src/lib/generateCss/helpers/utils/processCss.utils.js +93 -0
  108. package/src/lib/generateCss/helpers/utils/separateStyles.utils.js +43 -0
  109. package/src/lib/generateCss/helpers/utils/validatePreviouslyExists.utils.js +61 -0
  110. package/src/lib/generateCssDoc/generateCssDoc.util.js +47 -0
  111. package/src/lib/generateProvider/generateProvider.utils.js +283 -0
  112. package/src/lib/generateProvider/template/providerTemplate.d.ts +60 -0
  113. package/src/lib/generateProvider/template/providerTemplate.js +160 -0
  114. package/src/lib/generateThemeRegister/generateThemeRegister.utils.js +136 -0
  115. package/src/lib/generateTools/generateTools.utils.js +181 -0
  116. package/src/lib/generateTypesTools/generateTypesTools.utils.js +59 -0
  117. package/src/lib/handlerForeignThemes/handlerForeignThemes.utils.js +96 -0
  118. package/src/lib/index.js +61 -0
  119. package/src/lib/processMediaConfig/processMediaConfig.util.js +32 -0
  120. package/src/lib/readFile/readFile.utils.js +110 -0
  121. package/src/lib/simplifyName/__tests__/simplifyName.utils.test.js +87 -0
  122. package/src/lib/simplifyName/simplifyName.utils.js +28 -0
  123. package/src/lib/typingStyles/index.js +3 -0
  124. package/src/lib/typingStyles/typingStyles.utils.js +144 -0
  125. 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 };