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,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 };
|