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,163 @@
1
+ /**
2
+ * CSS Rule Name Formatter for Bernova CSS Framework
3
+ *
4
+ * Handles CSS class name generation, registration, and formatting.
5
+ * Manages component-variant relationships and maintains class name registry.
6
+ */
7
+
8
+ const { formattedStatKey } = require('../utils');
9
+
10
+ /**
11
+ * Registers component and variant information in the CSS class registry
12
+ * Manages hierarchical component structure with variants and base classes
13
+ *
14
+ * @param {Object} register - CSS class registry to update
15
+ * @param {string} component - Component name to register
16
+ * @param {string} variant - Optional variant name for the component
17
+ * @param {string} mainComponent - Main parent component name
18
+ * @param {boolean} hasStyles - Whether component has actual CSS styles
19
+ * @param {string} prefix - CSS class prefix for namespacing
20
+ */
21
+ const setRegister = ({
22
+ register,
23
+ component,
24
+ variant,
25
+ mainComponent,
26
+ hasStyles,
27
+ prefix,
28
+ }) => {
29
+ // Initialize main component in register if not exists
30
+ if (!(mainComponent in register)) {
31
+ register[mainComponent] = {};
32
+ }
33
+
34
+ // Register base component (only if it has styles)
35
+ if (!(component in register[mainComponent])) {
36
+ register[mainComponent][component] = !!hasStyles && `${prefix}${component}`;
37
+ }
38
+
39
+ // Handle variant registration
40
+ if (!!variant) {
41
+ const v = `$_${formattedStatKey(variant)}`;
42
+
43
+ // Initialize variant section
44
+ if (!(v in register[mainComponent])) {
45
+ register[mainComponent][v] = {};
46
+ }
47
+
48
+ // Register component with variant
49
+ if (!(component in register[mainComponent][v])) {
50
+ const regWithoutVariant = !!register[mainComponent][component];
51
+ register[mainComponent][v][component] = regWithoutVariant
52
+ ? `${prefix}${component} ${prefix}${component}--${variant}` // Base + variant classes
53
+ : `${prefix}${component}--${variant}`; // Variant only
54
+ }
55
+ }
56
+ };
57
+
58
+ const getRuleNameSlices = ({ parentRule, key, prefix }) => {
59
+ //? extract the component from the parentRule
60
+ const [mainComponent, rest] = parentRule.split('--');
61
+ //? format the key to lower case and remove any brackets
62
+ const variant = rest && rest.length && rest.replace(/\[.*?\]/g, '');
63
+ //? format the key to lower case
64
+ const lowerKey = !!key && key.length && key.toLocaleLowerCase();
65
+
66
+ return {
67
+ mainComponent,
68
+ variant,
69
+ lowerKey,
70
+ };
71
+ };
72
+
73
+ const setForeignRegister = ({ ruleName, foreignRegister, register }) => {
74
+ const { mainComponent, variant } = getRuleNameSlices({
75
+ parentRule: ruleName,
76
+ });
77
+ if (!(mainComponent in register)) {
78
+ register[mainComponent] = {};
79
+ }
80
+ if (!!variant) {
81
+ const v = `$_${formattedStatKey(variant)}`;
82
+ if (!(v in register[mainComponent])) {
83
+ register[mainComponent][v] = {};
84
+ }
85
+ register[mainComponent][v] = {
86
+ ...register[mainComponent][v],
87
+ ...foreignRegister,
88
+ };
89
+ } else {
90
+ register[mainComponent] = {
91
+ ...register[mainComponent],
92
+ ...foreignRegister,
93
+ };
94
+ }
95
+ };
96
+
97
+ const formatRuleName = ({
98
+ key = '',
99
+ parentRule,
100
+ theRule,
101
+ hasStyles,
102
+ prefix,
103
+ register = {},
104
+ }) => {
105
+ let className = '';
106
+ // Use theRule directly if provided (for pseudo-classes, selectors, etc.)
107
+ if (theRule) {
108
+ className = theRule;
109
+
110
+ // Generate base className from key if no parent rule exists
111
+ } else if (!parentRule) {
112
+ const cleanKey = key.toLocaleLowerCase().replace(/\[.*?\]/g, '');
113
+ className = `${prefix}${cleanKey}`;
114
+
115
+ if (key.length) {
116
+ setRegister({
117
+ register,
118
+ component: cleanKey,
119
+ mainComponent: cleanKey,
120
+ hasStyles,
121
+ prefix,
122
+ });
123
+ }
124
+ } else {
125
+ // Handle component with parent rule (nested components, variants)
126
+ const { mainComponent, variant, lowerKey } = getRuleNameSlices({
127
+ parentRule,
128
+ key,
129
+ });
130
+ const componentRegistered = mainComponent.replace(prefix, '');
131
+ const keyTarget = key.startsWith('_');
132
+
133
+ if (keyTarget) {
134
+ className = !!variant
135
+ ? `${mainComponent}_${lowerKey}--${variant}`
136
+ : `${mainComponent}_${lowerKey}`;
137
+
138
+ setRegister({
139
+ register,
140
+ mainComponent: componentRegistered,
141
+ component: `${componentRegistered}_${lowerKey}`,
142
+ variant,
143
+ hasStyles,
144
+ prefix,
145
+ });
146
+ } else if (lowerKey) {
147
+ className = `${mainComponent}--${lowerKey}`;
148
+
149
+ setRegister({
150
+ register,
151
+ mainComponent: componentRegistered,
152
+ component: componentRegistered,
153
+ variant: lowerKey,
154
+ hasStyles,
155
+ prefix,
156
+ });
157
+ }
158
+ }
159
+
160
+ return className;
161
+ };
162
+
163
+ module.exports = { formatRuleName, setForeignRegister };
@@ -0,0 +1,44 @@
1
+ const { cssProps } = require('../../../../constants/cssProps.js');
2
+
3
+ /**
4
+ * Extracts CSS values from an object and formats them as CSS properties.
5
+ * Accepts both real CSS properties and custom properties defined in cssProps.
6
+ *
7
+ * @param {Object} styles - The object containing CSS values.
8
+ * @returns {string} The formatted CSS properties.
9
+ */
10
+ const extractValues = ({ styles, dynamicValues }) => {
11
+ return Object.entries(styles)
12
+ .filter(([key]) => cssProps[key])
13
+ .map(([key, value]) => {
14
+ //* replace the js key for css property
15
+ const cssProperty = cssProps[key];
16
+ //* handle dynamic values
17
+ //? Count how many times '$' appears in the value
18
+ //? the length is always 1 more than the count of '$', becase the first values is a empty string
19
+ const varsFinded = String(value).split('$').length - 1;
20
+ const validValue = (() => {
21
+ if (!!dynamicValues && varsFinded > 0) {
22
+ return String(value)
23
+ .split(' ')
24
+ .reduce((acc, curr, idx) => {
25
+ if (curr in dynamicValues) {
26
+ if (idx > 0) {
27
+ acc += ' ';
28
+ }
29
+ acc += dynamicValues[curr];
30
+ }
31
+ return acc;
32
+ }, '');
33
+ }
34
+ return value;
35
+ })();
36
+
37
+ return cssProperty === cssProps.$content
38
+ ? `${cssProperty}: '${validValue}';`
39
+ : `${cssProperty}: ${validValue};`;
40
+ })
41
+ .join(' ');
42
+ };
43
+
44
+ module.exports = { extractValues };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Statistical Key Formatter for Bernova Analytics
3
+ *
4
+ * Normalizes CSS class names and component keys for statistical tracking.
5
+ * Removes special prefixes and standardizes separators to underscores.
6
+ */
7
+
8
+ /**
9
+ * Formats a statistical key by normalizing separators and removing prefixes
10
+ * Used for consistent analytics and tracking across the CSS generation process
11
+ *
12
+ * @param {string} key - The key to format and normalize
13
+ * @returns {string} Normalized key with standardized separators
14
+ * @example
15
+ * formattedStatKey('$_component--name') → 'component_name'
16
+ * formattedStatKey('my-class__name') → 'my_class_name'
17
+ */
18
+ const formattedStatKey = (key) => {
19
+ let k = key;
20
+
21
+ // Remove library-specific prefix
22
+ if (k.includes('$_')) {
23
+ k = k.replace('$_', '');
24
+ }
25
+
26
+ // Normalize all separators to underscores
27
+ if (k.includes(' ', '_')) {
28
+ k = k.replace(' ', '_');
29
+ }
30
+ if (k.includes('__')) {
31
+ k = k.replace('__', '_');
32
+ }
33
+ if (k.includes('--')) {
34
+ k = k.replace('--', '_');
35
+ }
36
+ if (k.includes('-')) {
37
+ k = k.replace('-', '_');
38
+ }
39
+
40
+ return k;
41
+ };
42
+
43
+ module.exports = { formattedStatKey };
@@ -0,0 +1,15 @@
1
+ const { extractValues } = require('./extractValues.utils');
2
+ const { processCssWithPostcss } = require('./processCss.utils');
3
+ const { separateStyles } = require('./separateStyles.utils');
4
+ const {
5
+ validatePreviouslyExists,
6
+ } = require('./validatePreviouslyExists.utils');
7
+ const { formattedStatKey } = require('./formattedStatKey.utils');
8
+
9
+ module.exports = {
10
+ extractValues,
11
+ processCssWithPostcss,
12
+ separateStyles,
13
+ validatePreviouslyExists,
14
+ formattedStatKey,
15
+ };
@@ -0,0 +1,93 @@
1
+ const postcss = require('postcss');
2
+ const autoprefixer = require('autoprefixer');
3
+ const cssnano = require('cssnano');
4
+ const postcssPresetEnv = require('postcss-preset-env');
5
+ // const combineMediaQuery = require('postcss-combine-media-query'); // <- this plugin is not used in the provided code
6
+ const fontMagician = require('postcss-font-magician');
7
+ const path = require('path');
8
+
9
+ /**
10
+ * Processes CSS with PostCSS using the configuration in postcss.config.js.
11
+ *
12
+ * @param {string} css - The CSS to process.
13
+ * @param {boolean} [minified=false] - Whether to minify the CSS.
14
+ * @param {string} [prefix=''] - The prefix to add to :root and all classes.
15
+ * @param {Object} fonts - The fonts configuration.
16
+ * @returns {Promise<string>} The processed CSS.
17
+ */
18
+ const processCssWithPostcss = async (
19
+ css,
20
+ minified = false,
21
+ prefix = '',
22
+ fonts = {}
23
+ ) => {
24
+ const plugins = [
25
+ postcssPresetEnv({
26
+ stage: 0,
27
+ autoprefixer: { grid: true },
28
+ features: {
29
+ 'custom-properties': false, // <- Disable CSS variable resolution
30
+ },
31
+ }),
32
+ autoprefixer({
33
+ overrideBrowserslist: [
34
+ '> 1%',
35
+ 'last 2 versions',
36
+ 'Firefox ESR',
37
+ 'not dead',
38
+ ],
39
+ }),
40
+ // combineMediaQuery,
41
+ fontMagician({
42
+ variants: fonts?.google?.reduce((acc, font) => {
43
+ acc[font.name] = font.weights.reduce((weights, weight) => {
44
+ weights[weight] = [];
45
+ return weights;
46
+ }, {});
47
+ return acc;
48
+ }, {}),
49
+ foundries: ['google', 'local'],
50
+ custom: fonts?.local?.reduce((acc, font) => {
51
+ acc[font.name] = {
52
+ variants: Object.keys(font.files).reduce((variants, weight) => {
53
+ variants[weight] = {
54
+ normal: {
55
+ url: {
56
+ ttf: path.join('fonts', path.basename(font.files[weight])),
57
+ },
58
+ },
59
+ };
60
+ return variants;
61
+ }, {}),
62
+ };
63
+ return acc;
64
+ }, {}),
65
+ }),
66
+ ];
67
+
68
+ if (minified) {
69
+ plugins.push(
70
+ cssnano({
71
+ preset: 'default',
72
+ })
73
+ );
74
+ }
75
+
76
+ if (prefix) {
77
+ css = css.replace(/:root/g, `[data-theme='${prefix}']`);
78
+ css = css.replace(/\.([a-zA-Z_][\w-]*)/g, (match, p1) => {
79
+ if (css.includes(`@font-face`) || css.includes(`@import`)) {
80
+ return match;
81
+ }
82
+ return `[data-theme='${prefix}'] .${p1}`;
83
+ });
84
+ }
85
+
86
+ const result = await postcss(plugins).process(css, {
87
+ from: undefined,
88
+ });
89
+
90
+ return result.css;
91
+ };
92
+
93
+ module.exports = { processCssWithPostcss };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Style Separation Utility for Bernova CSS Framework
3
+ *
4
+ * Separates CSS object properties into different categories:
5
+ * - Standard CSS properties (styles)
6
+ * - Library-specific properties (lib) - starting with $
7
+ * - Other properties (nested objects, pseudo-classes, etc.)
8
+ */
9
+
10
+ const { cssProps } = require('../../../../constants/index.js');
11
+
12
+ /**
13
+ * Separates a CSS object into different property categories
14
+ *
15
+ * @param {Object} css - CSS object to categorize
16
+ * @returns {Object} Separated properties: { styles, lib, other }
17
+ * @example
18
+ * separateStyles({
19
+ * color: 'red', // → styles
20
+ * $dynamic: 'value', // → lib
21
+ * hover: { color: 'blue' } // → other
22
+ * })
23
+ */
24
+ const separateStyles = (css) => {
25
+ const styles = {}; // Standard CSS properties
26
+ const other = {}; // Nested objects (pseudo-classes, selectors, etc.)
27
+ const lib = {}; // Library-specific properties (starting with $)
28
+
29
+ // Categorize each property based on its type and prefix
30
+ Object.entries(css).forEach(([key, value]) => {
31
+ if (key in cssProps) {
32
+ styles[key] = value; // Standard CSS properties
33
+ } else if (key.startsWith('$') && !!value) {
34
+ lib[key] = value; // Library-specific properties
35
+ } else {
36
+ other[key] = value; // Everything else (nested objects)
37
+ }
38
+ });
39
+
40
+ return { styles, lib, other };
41
+ };
42
+
43
+ module.exports = { separateStyles };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * CSS File Validation Utility for Bernova
3
+ *
4
+ * Validates and handles existing CSS files during compilation.
5
+ * Supports partial compilation by preserving existing sections
6
+ * when generating foundation-only or component-only builds.
7
+ */
8
+
9
+ const fs = require('fs').promises;
10
+ const path = require('path');
11
+ const { compilerTypeValid } = require('../../../../constants');
12
+ const {
13
+ extractDocFragment,
14
+ } = require('../../../extractDocFragment/extractDocFragment.utils');
15
+
16
+ /**
17
+ * Validates if CSS files exist and handles partial compilation preservation
18
+ *
19
+ * @param {Object} params - Validation parameters
20
+ * @param {string} params.stylesDir - Directory where CSS files are stored
21
+ * @param {string} params.compilerType - Type of compilation (full, foundationOnly, componentOnly)
22
+ * @param {string} params.name - Base name for CSS files
23
+ * @returns {Object} Directory paths and existing CSS data
24
+ */
25
+ const validatePreviouslyExists = async ({ stylesDir, compilerType, name }) => {
26
+ const dirs = {
27
+ cssDir: path.resolve(stylesDir, `${name}.css`),
28
+ cssMinifiedDir: path.resolve(stylesDir, `${name}.min.css`),
29
+ oldData: '',
30
+ };
31
+ try {
32
+ await fs.access(stylesDir);
33
+ try {
34
+ await fs.access(dirs.cssDir);
35
+ if (!compilerType || compilerType === compilerTypeValid.full) {
36
+ return dirs;
37
+ }
38
+ const oldCss = await fs.readFile(dirs.cssDir, 'utf8');
39
+ const section = (() => {
40
+ switch (compilerType) {
41
+ case compilerTypeValid.foundationOnly:
42
+ return 'Components';
43
+ case compilerTypeValid.componentOnly:
44
+ return 'Foundations';
45
+ default:
46
+ return '';
47
+ }
48
+ })();
49
+ dirs.oldData = extractDocFragment({ section, doc: oldCss });
50
+ } catch {
51
+ return dirs;
52
+ }
53
+ } catch {
54
+ await fs.mkdir(stylesDir, { recursive: true });
55
+ return dirs;
56
+ }
57
+
58
+ return dirs;
59
+ };
60
+
61
+ module.exports = { validatePreviouslyExists };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * CSS Documentation Generator for Bernova
3
+ *
4
+ * Combines foundation and component CSS into a single document with proper
5
+ * sectioning and comments. Handles different compilation modes and preserves
6
+ * existing data when doing partial compilation.
7
+ */
8
+
9
+ const { compilerTypeValid } = require('../../constants');
10
+
11
+ /**
12
+ * Generates final CSS document by combining foundations and components
13
+ * Adds section comments and handles partial compilation modes
14
+ *
15
+ * @param {Object} params - Generation parameters
16
+ * @param {string} params.compilerType - Type of compilation being performed
17
+ * @param {string} params.stylesCss - Generated component/theme CSS
18
+ * @param {string} params.foundationsCss - Generated foundation CSS (variables, reset)
19
+ * @param {string} params.oldData - Existing CSS data to preserve (optional)
20
+ * @returns {string} Complete CSS document with sections and comments
21
+ */
22
+ const generateCssDoc = ({
23
+ compilerType,
24
+ stylesCss,
25
+ foundationsCss,
26
+ oldData = '',
27
+ }) => {
28
+ // Determine what sections to include based on compilation type
29
+ const createFoundations = compilerType !== compilerTypeValid.componentOnly;
30
+ const createComponents = compilerType !== compilerTypeValid.foundationOnly;
31
+
32
+ // Generate foundations section (CSS variables, reset, base styles)
33
+ const foundations = createFoundations
34
+ ? `/* === BERNOVA FOUNDATIONS === */\n${foundationsCss}\n/* === END FOUNDATIONS === */\n\n`
35
+ : oldData;
36
+
37
+ // Generate components section (component styles, utilities, media queries)
38
+ const components = createComponents
39
+ ? `/* === BERNOVA COMPONENTS === */\n${stylesCss}\n/* === END COMPONENTS === */\n`
40
+ : oldData;
41
+
42
+ // Combine sections into final CSS document
43
+ const cssDocument = `${foundations}${components}`;
44
+ return cssDocument;
45
+ };
46
+
47
+ module.exports = { generateCssDoc };