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,283 @@
1
+ /**
2
+ * Provider Generation Module for Bernova
3
+ *
4
+ * Generates JavaScript/TypeScript provider utilities that allow applications
5
+ * to consume Bernova-generated CSS classes, variables, and theme data.
6
+ *
7
+ * Creates:
8
+ * - CSS class name mappings
9
+ * - CSS variable exports
10
+ * - Theme switching utilities
11
+ * - TypeScript declarations
12
+ * - Development statistics
13
+ */
14
+
15
+ const f = require('fs');
16
+ const fs = require('fs').promises;
17
+ const path = require('path');
18
+ const { writeDoc } = require('../writeDoc/writeDoc.utils');
19
+ const { compilerTypeValid } = require('../../constants');
20
+ const {
21
+ extractDocFragment,
22
+ } = require('../extractDocFragment/extractDocFragment.utils');
23
+
24
+ /**
25
+ * Builds statistics document with theme data and CSS information
26
+ * Handles incremental builds by preserving data from previous compilations
27
+ *
28
+ * @param {Object} params - Build parameters
29
+ * @param {Object} params.providerDocs - Theme documentation data
30
+ * @param {boolean} params.declarationHelp - Whether to generate TypeScript declarations
31
+ * @param {string} params.compilerType - Type of compilation being performed
32
+ * @param {string} params.dir - Output directory for provider files
33
+ * @returns {Promise<Object>} Generated documentation structure
34
+ */
35
+ const buildStatsDoc = async ({
36
+ providerDocs,
37
+ declarationHelp,
38
+ compilerType,
39
+ dir,
40
+ }) => {
41
+ const initialState = {
42
+ doc: {
43
+ cssThemes: '/* CssThemes */\nexport const cssThemes = {\n',
44
+ cssVars: '/* CssVars */\nexport const cssVars = {\n',
45
+ cssClasses: '/* CssClasses */\nexport const cssClasses = {\n',
46
+ cssAvailableComponents:
47
+ '/* CssAvailableComponents */\nexport const cssAvailableComponents = {\n',
48
+ cssGlobalStyles:
49
+ '/* CssGlobalStyles */\nexport const cssGlobalStyles = {\n',
50
+ cssMediaQueries:
51
+ '/* CssMediaQueries */\nexport const cssMediaQueries = {\n',
52
+ },
53
+ declare: {
54
+ cssThemes: '/* CssThemes */\nexport declare const cssThemes: {\n',
55
+ cssVars: '/* CssVars */\nexport interface CssVars {\n',
56
+ cssClasses: '/* CssClasses */\nexport interface CssClasses {\n',
57
+ cssAvailableComponents:
58
+ '/* CssAvailableComponents */\nexport interface CssAvailableComponents {\n',
59
+ cssGlobalStyles:
60
+ '/* CssGlobalStyles */\nexport interface CssGlobalStyles {\n',
61
+ cssMediaQueries:
62
+ '/* CssMediaQueries */\nexport interface CssMediaQueries {\n',
63
+ },
64
+ };
65
+ const hasPreviouslyConfig = f.existsSync(dir);
66
+ if (hasPreviouslyConfig) {
67
+ //* recover the stats document previously generated
68
+ const stats = await fs.readFile(
69
+ path.resolve(dir, 'stats/stats.js'),
70
+ 'utf8'
71
+ );
72
+
73
+ //* extract the css variables
74
+ if (compilerType === compilerTypeValid.componentOnly) {
75
+ //? extract the css variables
76
+ const cssVars = extractDocFragment({ section: 'CssVars', doc: stats });
77
+ //? extract the global styles
78
+ const cssGlobalStyles = extractDocFragment({
79
+ section: 'CssGlobalStyles',
80
+ doc: stats,
81
+ });
82
+ const cssMediaQueries = extractDocFragment({
83
+ section: 'CssMediaQueries',
84
+ doc: stats,
85
+ });
86
+
87
+ initialState.doc.cssVars = `/* CssVars */\n${cssVars}\n/* CssVars */\n`;
88
+ initialState.doc.cssGlobalStyles = `/* CssGlobalStyles */\n${cssGlobalStyles}\n/* CssGlobalStyles */\n`;
89
+ initialState.doc.cssMediaQueries = `/* CssMediaQueries */\n${cssMediaQueries}\n/* CssMediaQueries */\n`;
90
+ }
91
+
92
+ //* extract the css class names
93
+ if (compilerType === compilerTypeValid.foundationOnly) {
94
+ const cssClasses = extractDocFragment({
95
+ section: 'CssClasses',
96
+ doc: stats,
97
+ });
98
+ const cssAvailableComponents = extractDocFragment({
99
+ section: 'CssAvailableComponents',
100
+ doc: stats,
101
+ });
102
+ initialState.doc.cssClasses = `/* CssClasses */\n${cssClasses}\n/* CssClasses */\n`;
103
+ initialState.doc.cssAvailableComponents = `/* CssAvailableComponents */\n${cssAvailableComponents}\n/* CssAvailableComponents */\n`;
104
+ }
105
+ //? extract the declarations
106
+ if (declarationHelp) {
107
+ const statsDeclare = await fs.readFile(
108
+ path.resolve(dir, 'stats/stats.d.ts'),
109
+ 'utf8'
110
+ );
111
+ if (compilerType === compilerTypeValid.componentOnly) {
112
+ const cssVarsDeclare = extractDocFragment({
113
+ section: 'CssVars',
114
+ doc: statsDeclare,
115
+ });
116
+ const cssGlobalStylesDeclare = extractDocFragment({
117
+ section: 'CssGlobalStyles',
118
+ doc: statsDeclare,
119
+ });
120
+ const cssMediaQueriesDeclare = extractDocFragment({
121
+ section: 'CssMediaQueries',
122
+ doc: statsDeclare,
123
+ });
124
+
125
+ initialState.declare.cssVars = `/* CssVars */\n${cssVarsDeclare}\n/* CssVars */\n`;
126
+ initialState.declare.cssGlobalStyles = `/* CssGlobalStyles */\n${cssGlobalStylesDeclare}\n/* CssGlobalStyles */\n`;
127
+ initialState.declare.cssMediaQueries = `/* CssMediaQueries */\n${cssMediaQueriesDeclare}\n/* CssMediaQueries */\n`;
128
+ }
129
+ if (compilerType === compilerTypeValid.foundationOnly) {
130
+ const cssClassesDeclare = extractDocFragment({
131
+ section: 'CssClasses',
132
+ doc: statsDeclare,
133
+ });
134
+ const cssAvailableComponentsDeclare = extractDocFragment({
135
+ section: 'CssAvailableComponents',
136
+ doc: statsDeclare,
137
+ });
138
+ initialState.declare.cssClasses = `/* CssClasses */\n${cssClassesDeclare}\n/* CssClasses */\n`;
139
+ initialState.declare.cssAvailableComponents = `/* CssAvailableComponents */\n${cssAvailableComponentsDeclare}\n/* CssAvailableComponents */\n`;
140
+ }
141
+ }
142
+ }
143
+ const providerEntries = Object.entries(providerDocs);
144
+ const compilerVars = compilerType !== compilerTypeValid.componentOnly;
145
+ const compilerClasses = compilerType !== compilerTypeValid.foundationOnly;
146
+ return providerEntries.reduce((acc, [theme, values], idx) => {
147
+ //? check if there are foreign styles docs
148
+ const beforeFilesExists = values.beforeFiles?.length > 0;
149
+ const afterFilesExists = values.afterFiles?.length > 0;
150
+ const beforeKeyValue = beforeFilesExists
151
+ ? ` before: ${values.beforeFiles}, `
152
+ : '';
153
+ const afterKeyValue = afterFilesExists
154
+ ? ` after: ${values.afterFiles}, `
155
+ : '';
156
+ const foreignKeyValue =
157
+ beforeFilesExists || afterFilesExists
158
+ ? ` foreign: {${beforeKeyValue}${afterKeyValue}},`
159
+ : '';
160
+ //? add the theme css path
161
+ acc.doc.cssThemes += ` '${theme}': { css: '${values.cssPath}',${foreignKeyValue} },\n`;
162
+ if (declarationHelp) {
163
+ acc.declare.cssThemes += ` '${theme}': { css: string; foreign?: { before?: string[]; after?: string[]; }; };\n`;
164
+ }
165
+ //? add the css variables
166
+ if (compilerVars) {
167
+ acc.doc.cssVars += ` '${theme}': {\n${
168
+ values.variables?.doc || ''
169
+ } },\n`;
170
+ acc.doc.cssGlobalStyles += ` '${theme}': {\n${
171
+ values.globalStyles?.doc || ''
172
+ } },\n`;
173
+ acc.doc.cssMediaQueries += ` '${theme}': {\n${
174
+ values.mediaQueries?.doc || ''
175
+ } },\n`;
176
+ if (declarationHelp) {
177
+ acc.declare.cssVars += ` '${theme}': {\n${
178
+ values.variables?.declare || ''
179
+ } },\n`;
180
+ acc.declare.cssGlobalStyles += ` '${theme}': {\n${
181
+ values.globalStyles?.declare || ''
182
+ } },\n`;
183
+ acc.declare.cssMediaQueries += ` '${theme}': {\n${
184
+ values.mediaQueries?.declare || ''
185
+ } },\n`;
186
+ }
187
+ }
188
+ //? add the css class names amd available components
189
+ if (compilerClasses) {
190
+ acc.doc.cssClasses += ` '${theme}': {\n${
191
+ values.classNames?.doc || ''
192
+ } },\n`;
193
+ acc.doc.cssAvailableComponents += ` '${theme}': {\n${
194
+ values.availableComp?.doc || ''
195
+ } },\n`;
196
+ if (declarationHelp) {
197
+ acc.declare.cssClasses += ` '${theme}': {\n${
198
+ values.classNames?.declare || ''
199
+ } },\n`;
200
+ acc.declare.cssAvailableComponents += ` '${theme}': {\n${
201
+ values.availableComp?.declare || ''
202
+ } },\n`;
203
+ }
204
+ }
205
+ if (idx === providerEntries.length - 1) {
206
+ acc.doc.cssThemes += '}\n/* CssThemes */\n';
207
+ acc.doc.cssVars += compilerVars ? '}\n/* CssVars */\n' : '';
208
+ acc.doc.cssGlobalStyles += compilerVars
209
+ ? '}\n/* CssGlobalStyles */\n'
210
+ : '';
211
+ acc.doc.cssMediaQueries += compilerVars
212
+ ? '}\n/* CssMediaQueries */\n'
213
+ : '';
214
+
215
+ acc.doc.cssClasses += compilerClasses ? '}\n/* CssClasses */\n' : '';
216
+ acc.doc.cssAvailableComponents += compilerClasses
217
+ ? '}\n/* CssAvailableComponents */\n'
218
+ : '';
219
+ if (declarationHelp) {
220
+ acc.declare.cssThemes += '}\n/* CssThemes */\n';
221
+ acc.declare.cssVars += compilerVars ? '}\n/* CssVars */\n' : '';
222
+ acc.declare.cssGlobalStyles += compilerVars
223
+ ? '}\n/* CssGlobalStyles */\n'
224
+ : '';
225
+ acc.declare.cssMediaQueries += compilerVars
226
+ ? '}\n/* CssMediaQueries */\n'
227
+ : '';
228
+ acc.declare.cssClasses += compilerClasses
229
+ ? '}\n/* CssClasses */\n'
230
+ : '';
231
+ acc.declare.cssAvailableComponents += compilerClasses
232
+ ? '}\n/* CssAvailableComponents */\n'
233
+ : '';
234
+ }
235
+ }
236
+ return acc;
237
+ }, initialState);
238
+ };
239
+
240
+ const generateProvider = async ({
241
+ dir,
242
+ providerDocs,
243
+ declarationHelp,
244
+ providerName,
245
+ compilerType,
246
+ }) => {
247
+ const { doc, declare } = await buildStatsDoc({
248
+ providerDocs,
249
+ declarationHelp,
250
+ compilerType,
251
+ dir,
252
+ });
253
+
254
+ //? write stats document
255
+ const docsTemplate = `${doc.cssThemes}\n${doc.cssVars}\n${doc.cssClasses}\n${doc.cssAvailableComponents}\n${doc.cssGlobalStyles}\n${doc.cssMediaQueries}\n`;
256
+ await writeDoc(`${dir}/stats/stats.js`, docsTemplate, 'stats.js');
257
+ //? write provider
258
+ const providerDir = path.resolve(__dirname, './template/providerTemplate.js');
259
+ let template = await fs.readFile(providerDir, 'utf8');
260
+ //* customize provider name
261
+ template = template.replace(/\$_Provider_\$/g, providerName);
262
+ await writeDoc(`${dir}/${providerName}.js`, template, `${providerName}.js`);
263
+
264
+ if (declarationHelp) {
265
+ //? write stats declare document
266
+ const declareTemplate = `${declare.cssThemes}\n${declare.cssVars}\n${declare.cssClasses}\n${declare.cssAvailableComponents}\n${declare.cssGlobalStyles}\n${declare.cssMediaQueries}\nexport declare const cssVars: CssVars;\nexport declare const cssClasses: CssClasses;\nexport declare const cssAvailableComponents: CssAvailableComponents;\nexport declare const cssGlobalStyles: CssGlobalStyles;\nexport declare const cssMediaQueries: CssMediaQueries;\n`;
267
+ await writeDoc(`${dir}/stats/stats.d.ts`, declareTemplate, 'stats.d.ts');
268
+ //? write provider declare document
269
+ const providerDirDeclare = path.resolve(
270
+ __dirname,
271
+ './template/providerTemplate.d.ts'
272
+ );
273
+ let templateDeclare = await fs.readFile(providerDirDeclare, 'utf8');
274
+ templateDeclare = templateDeclare.replace(/\$_Provider_\$/g, providerName);
275
+ await writeDoc(
276
+ `${dir}/${providerName}.d.ts`,
277
+ templateDeclare,
278
+ `${providerName}.d.ts`
279
+ );
280
+ }
281
+ };
282
+
283
+ module.exports = { generateProvider };
@@ -0,0 +1,60 @@
1
+ import {
2
+ cssThemes,
3
+ cssClasses,
4
+ cssVars,
5
+ cssAvailableComponents,
6
+ cssGlobalStyles,
7
+ cssMediaQueries,
8
+ } from './stats/stats';
9
+
10
+ type ThemesKeys = keyof typeof cssThemes;
11
+ /* Get the types of each variable from the current theme selected */
12
+ type VarFromTheme = (typeof cssVars)[ThemesKeys];
13
+ type ClassNameFromTheme = (typeof cssClasses)[ThemesKeys];
14
+ type ComponentsFromTheme = (typeof cssAvailableComponents)[ThemesKeys];
15
+ type ComponentsKey = keyof ComponentsFromTheme;
16
+ type GlobalStylesFromThemes = (typeof cssGlobalStyles)[ThemesKeys];
17
+ type MediaQueriesFromThemes = (typeof cssMediaQueries)[ThemesKeys];
18
+ /* Get the type of non-variable keys from a component required */
19
+ type NonVariablesKeys<T> = {
20
+ [K in keyof T]: K extends `$${string}` ? never : K;
21
+ }[keyof T];
22
+ type ComponentSelected<T> = Pick<T, NonVariablesKeys<T>>;
23
+
24
+ export declare class $_Provider_$ {
25
+ private static instance: $_Provider_$;
26
+ #currentTheme: ThemesKeys;
27
+ #themes: typeof cssThemes;
28
+ #themesVariables: typeof cssVars;
29
+ #themesClassNames: typeof cssClasses;
30
+ #themesComponents: typeof cssAvailableComponents;
31
+ #themesGlobalStyles: typeof cssGlobalStyles;
32
+ #themesMediaQueries: typeof cssMediaQueries;
33
+ #linkId: string;
34
+ #jsInCss: boolean;
35
+ #linkBuilder: (url: string, id: string) => void;
36
+ #handlerThemes: (data: {
37
+ css: string;
38
+ foreign?: { high?: string[]; low?: string[] };
39
+ }) => void;
40
+ #cleanUpLinks: () => void;
41
+
42
+ constructor(options?: { linkId?: string; jsInCss?: boolean });
43
+
44
+ get themeSelected(): string | null;
45
+ get allThemesNames(): string[];
46
+ get allThemes(): Record<string, string>;
47
+ get variables(): VarFromTheme;
48
+ get classNames(): ClassNameFromTheme;
49
+ get components(): ComponentsFromTheme;
50
+ get globalStyles(): GlobalStylesFromThemes;
51
+ get mediaQueries(): MediaQueriesFromThemes;
52
+
53
+ set themeSelected(themeName: string);
54
+
55
+ getComponentStyles<T extends ComponentsKey>(params: {
56
+ variant?: string;
57
+ component: T;
58
+ additionalClassNames?: Partial<ComponentSelected<ClassNameFromTheme[T]>>;
59
+ }): ComponentSelected<ClassNameFromTheme[T]>;
60
+ }
@@ -0,0 +1,160 @@
1
+ import {
2
+ cssThemes,
3
+ cssClasses,
4
+ cssVars,
5
+ cssAvailableComponents,
6
+ cssGlobalStyles,
7
+ cssMediaQueries,
8
+ } from './stats/stats';
9
+
10
+ export class $_Provider_$ {
11
+ #currentTheme;
12
+ #themes;
13
+ #themesVariables;
14
+ #themesClassNames;
15
+ #themesComponents;
16
+ #themesGlobalStyles;
17
+ #themesMediaQueries;
18
+ #linkId;
19
+ #jsInCss;
20
+ #linkBuilder = (url, id) => {
21
+ if (typeof document === 'undefined') return;
22
+ let linkElement = document.getElementById(id);
23
+ if (!linkElement) {
24
+ linkElement = document.createElement('link');
25
+ linkElement.id = id;
26
+ linkElement.rel = 'stylesheet';
27
+ document.head.appendChild(linkElement);
28
+ }
29
+ linkElement.href = url;
30
+ };
31
+ #handlerThemes = (data) => {
32
+ const { css, foreign } = data;
33
+ const beforeFiles = foreign?.before || [];
34
+ const afterFiles = foreign?.after || [];
35
+ //* set the lower priority foreign themes
36
+ beforeFiles.forEach((url, idx) => {
37
+ const id = `${this.#linkId}-foreign-before-${idx + 1}`;
38
+ this.#linkBuilder(url, id);
39
+ });
40
+ //* set main theme
41
+ this.#linkBuilder(css, this.#linkId);
42
+ //* set the higher priority foreign themes
43
+ afterFiles.forEach((url, idx) => {
44
+ const id = `${this.#linkId}-foreign-after-${idx + 1}`;
45
+ this.#linkBuilder(url, id);
46
+ });
47
+ };
48
+ #cleanUpLinks = () => {
49
+ if (typeof document === 'undefined') return;
50
+ const links = document.querySelectorAll(`link[id^="${this.#linkId}"]`);
51
+ links.forEach((link) => link.remove());
52
+ };
53
+
54
+ constructor({ linkId, jsInCss } = {}) {
55
+ this.#themes = cssThemes;
56
+ this.#themesVariables = cssVars;
57
+ this.#themesClassNames = cssClasses;
58
+ this.#themesComponents = cssAvailableComponents;
59
+ this.#themesGlobalStyles = cssGlobalStyles;
60
+ this.#themesMediaQueries = cssMediaQueries;
61
+ this.#linkId = linkId || 'kb-styled-link';
62
+ this.#currentTheme = Object.keys(cssThemes)[0];
63
+ this.#jsInCss = !!jsInCss;
64
+ this.getComponentStyles = this.getComponentStyles.bind(this);
65
+
66
+ if (
67
+ typeof window !== 'undefined' &&
68
+ typeof document !== 'undefined' &&
69
+ this.#jsInCss
70
+ ) {
71
+ this.#cleanUpLinks();
72
+ this.#handlerThemes(this.#themes[this.#currentTheme]);
73
+ }
74
+ }
75
+ // ? getters and setters
76
+ //* theme selected
77
+ get themeSelected() {
78
+ return this.#currentTheme;
79
+ }
80
+ set themeSelected(themeName) {
81
+ if (themeName in this.#themes) {
82
+ if (this.#jsInCss) {
83
+ this.#cleanUpLinks();
84
+ this.#handlerThemes(this.#themes[themeName]);
85
+ }
86
+ this.#currentTheme = themeName;
87
+ } else {
88
+ throw new Error(`${themeName} is not exists`);
89
+ }
90
+ }
91
+ //* themes
92
+ get allThemesNames() {
93
+ return Object.keys(this.#themes);
94
+ }
95
+ get allThemes() {
96
+ return this.#themes;
97
+ }
98
+ //* variables
99
+ get variables() {
100
+ return this.#themesVariables[this.#currentTheme];
101
+ }
102
+ //* classNames
103
+ get classNames() {
104
+ return this.#themesClassNames[this.#currentTheme];
105
+ }
106
+ //* components
107
+ get components() {
108
+ return this.#themesComponents[this.#currentTheme];
109
+ }
110
+ //* global styles
111
+ get globalStyles() {
112
+ return this.#themesGlobalStyles[this.#currentTheme];
113
+ }
114
+ //* media queries
115
+ get mediaQueries() {
116
+ return this.#themesMediaQueries[this.#currentTheme];
117
+ }
118
+ //? methods
119
+ getComponentStyles({ variant, component, additionalClassNames }) {
120
+ const THEME = this.#themesClassNames[this.#currentTheme];
121
+ const upperComponent = component.toLocaleUpperCase();
122
+ const COMPONENT = THEME[upperComponent];
123
+
124
+ if (!COMPONENT) return {};
125
+
126
+ const structure = {};
127
+ const startV = '$_';
128
+ const componentVariant = (() => {
129
+ if (!!variant) {
130
+ const lowerVariant = variant.toLocaleLowerCase().replace(/-/g, '_');
131
+ return `${startV}${lowerVariant}`;
132
+ } else {
133
+ return false;
134
+ }
135
+ })();
136
+ if (componentVariant && componentVariant in COMPONENT) {
137
+ const variantFragment = COMPONENT[componentVariant];
138
+ Object.entries(variantFragment).forEach(([key, value]) => {
139
+ if (!(key in structure)) {
140
+ structure[key] = value;
141
+ }
142
+ });
143
+ }
144
+ Object.entries(COMPONENT).forEach(([key, value]) => {
145
+ if (key.startsWith(startV)) return;
146
+ if (!(key in structure)) {
147
+ structure[key] = value;
148
+ }
149
+ });
150
+ if (!!additionalClassNames && Object.keys(additionalClassNames).length) {
151
+ Object.entries(additionalClassNames).forEach(([key, value]) => {
152
+ if (!(key in structure)) {
153
+ structure[key] = '';
154
+ }
155
+ structure[key] += ` ${value}`;
156
+ });
157
+ }
158
+ return structure;
159
+ }
160
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Theme Register Generator for Bernova CSS Framework
3
+ *
4
+ * Manages the registration and organization of CSS variables, styles, and components
5
+ * into structured documentation for provider and tool generation.
6
+ */
7
+
8
+ /**
9
+ * Registers CSS custom properties (variables) from root and foreign themes
10
+ * Consolidates variable documentation for provider generation
11
+ *
12
+ * @param {Object} rootDocs - Root CSS variables documentation
13
+ * @param {Object} foreignVars - Foreign theme variables documentation
14
+ * @param {Object} register - Theme register to update with variables
15
+ */
16
+ const registerCssVariables = ({ rootDocs, foreignVars, register }) => {
17
+ // Check if documentation exists for root or foreign variables
18
+ const rootDocsExists =
19
+ rootDocs?.doc?.length > 0 && rootDocs?.declare?.length > 0;
20
+ const foreignVarExists =
21
+ foreignVars?.doc?.length > 0 && foreignVars?.declare?.length > 0;
22
+
23
+ // Initialize variables section if any documentation exists
24
+ if (rootDocsExists || foreignVarExists) {
25
+ register.variables = { doc: '', declare: '' };
26
+ }
27
+
28
+ // Add root variables documentation
29
+ if (rootDocsExists) {
30
+ register.variables.doc += rootDocs.doc;
31
+ register.variables.declare += rootDocs.declare;
32
+ }
33
+
34
+ // Add foreign variables documentation
35
+ if (foreignVarExists) {
36
+ register.variables.doc += foreignVars.doc;
37
+ register.variables.declare += foreignVars.declare;
38
+ }
39
+ };
40
+
41
+ /**
42
+ * Registers CSS class names and component styles for theme documentation
43
+ * Consolidates component styles from local and foreign themes
44
+ *
45
+ * @param {Object} stylesDocs - Local component styles documentation
46
+ * @param {Object} foreignStyles - Foreign theme styles documentation
47
+ * @param {Object} register - Theme register to update with styles
48
+ */
49
+ const registerCssStyles = ({ stylesDocs, foreignStyles, register }) => {
50
+ // Check existence of various style documentation types
51
+ const availableCompExists = stylesDocs?.comp?.object?.length > 0;
52
+ const stylesDocsExists =
53
+ stylesDocs?.prov?.doc?.length > 0 && stylesDocs?.prov?.declare?.length > 0;
54
+ const foreignStylesExists =
55
+ foreignStyles?.doc?.length > 0 && foreignStyles?.declare?.length > 0;
56
+
57
+ // Initialize classNames section if any style documentation exists
58
+ if (stylesDocsExists || foreignStylesExists) {
59
+ register.classNames = { doc: '', declare: '' };
60
+ }
61
+
62
+ // Add local styles documentation
63
+ if (stylesDocsExists) {
64
+ register.classNames.doc += stylesDocs.prov.doc;
65
+ register.classNames.declare += stylesDocs.prov.declare;
66
+ }
67
+ if (foreignStylesExists) {
68
+ register.classNames.doc += foreignStyles.doc;
69
+ register.classNames.declare += foreignStyles.declare;
70
+ }
71
+ if (availableCompExists) {
72
+ register.availableComp = {
73
+ doc: stylesDocs.comp.object,
74
+ declare: stylesDocs.comp.object,
75
+ };
76
+ }
77
+ };
78
+
79
+ const registerCssGlobalDocs = ({ globalDocs, register }) => {
80
+ if (globalDocs?.doc?.length > 0 && globalDocs?.declare?.length > 0) {
81
+ register.globalStyles = globalDocs;
82
+ }
83
+ };
84
+
85
+ const registerCssMedia = ({ mediaDocs, register }) => {
86
+ if (mediaDocs?.length > 0) {
87
+ register.mediaQueries = {
88
+ doc: mediaDocs,
89
+ declare: mediaDocs,
90
+ };
91
+ }
92
+ };
93
+
94
+ const registerBeforeAfterFiles = ({
95
+ foreignBeforeFiles,
96
+ foreignAfterFiles,
97
+ register,
98
+ }) => {
99
+ if (foreignBeforeFiles?.length > 0) {
100
+ register.beforeFiles = foreignBeforeFiles;
101
+ }
102
+ if (foreignAfterFiles?.length > 0) {
103
+ register.afterFiles = foreignAfterFiles;
104
+ }
105
+ };
106
+
107
+ const generateThemeRegister = ({
108
+ cssPath,
109
+ rootDocs,
110
+ stylesDocs,
111
+ globalDocs,
112
+ mediaDocs,
113
+ foreignStyles,
114
+ foreignVars,
115
+ foreignBeforeFiles,
116
+ foreignAfterFiles,
117
+ }) => {
118
+ const register = { cssPath };
119
+ //* register css variables (include foreign vars)
120
+ registerCssVariables({ rootDocs, foreignVars, register });
121
+ //* register css class names and available components (include foreign styles)
122
+ registerCssStyles({ stylesDocs, foreignStyles, register });
123
+ //* register global styles docs
124
+ registerCssGlobalDocs({ globalDocs, register });
125
+ //* register media queries docs
126
+ registerCssMedia({ mediaDocs, register });
127
+ //* register lower and higher files
128
+ registerBeforeAfterFiles({
129
+ foreignBeforeFiles,
130
+ foreignAfterFiles,
131
+ register,
132
+ });
133
+ return register;
134
+ };
135
+
136
+ module.exports = { generateThemeRegister };