bernova 1.4.0 → 1.5.0

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.
@@ -17,226 +17,261 @@ const fs = require('fs').promises;
17
17
  const path = require('path');
18
18
  const { writeDoc } = require('../writeDoc/writeDoc.utils');
19
19
  const { compilerTypeValid } = require('../../constants');
20
- const {
21
- extractDocFragment,
22
- } = require('../extractDocFragment/extractDocFragment.utils');
20
+ const { simplifyName } = require('../simplifyName/simplifyName.utils');
23
21
 
24
22
  /**
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
23
+ * Return the content wrapped in an anonymous object
24
+ * to avoid polluting the global scope
25
+ *
26
+ * @param {string} content - string content
27
+ * @returns {string} - wrapped content
34
28
  */
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
- );
29
+ const anonimousWrapper = (content) => {
30
+ return `export default {${content}}`;
31
+ }
72
32
 
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
- }
33
+ /**
34
+ * Return the content wrapper in a typescript interface
35
+ * @param {string} content - string content
36
+ * @param {string} iName - interface`s name
37
+ * @return {string} - wrapped content
38
+ */
39
+ const interfaceWrapper = (content, iName) => {
40
+ return `export interface ${iName} {${content}}\n`;
41
+ }
91
42
 
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
- });
43
+ /**
44
+ * Write a js file required for the provider`s stats
45
+ *
46
+ * @param {object} param
47
+ * @param {string} param.dir - main root dir
48
+ * @param {string} param.content - file content
49
+ * @param {string} param.fileName - file name
50
+ * @param {string} param.theme - related theme name
51
+ * @param {string | null} param.declare - typescript declare file name
52
+ * @return {void}
53
+ */
54
+ const createStatFragment = async ({ dir, content, fileName, theme, declare = null}) => {
55
+ const fileContent = declare ? interfaceWrapper(content, declare) : anonimousWrapper(content);
56
+ const relativePath = `stats/${theme}/${fileName}`;
57
+ const filePath = path.resolve(dir, relativePath);
58
+ await writeDoc(filePath, fileContent, relativePath);
59
+ }
124
60
 
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
61
+ /**
62
+ * Generate every js file required for the provide`s stats
63
+ *
64
+ * @interface IProviderDocs {
65
+ * [themeName: string]: {
66
+ * cssPath: string,
67
+ * variables?: { doc: string, declare: string },
68
+ * classNames?: { doc: string, declare: string },
69
+ * availableComp?: { doc: string, declare: string },
70
+ * globalStyles?: { doc: string, declare: string },
71
+ * mediaQueries?: { doc: string, declare: string }
72
+ * beforeFiles?: string[],
73
+ * afterFiles?: string[],
74
+ * }
75
+ * }
76
+ *
77
+ * @param {object} param
78
+ * @param {string} param.dir - main root dir
79
+ * @param {IProviderDocs} param.providerDoc - provider stats info
80
+ * @param {boolean} param.declarationHelp - prop to handler the create typescript declaration files
81
+ * @param {'foundationOnly' | 'componentOnly' | 'full'} - prop to prevent rewrite unnecessary files
82
+ */
83
+ const buildStatsDoc = async ({ providerDocs, declarationHelp, compilerType, dir }) => {
84
+ const allThemes = Object.entries(providerDocs);
85
+ const allThemesNames = [];
86
+ for (const [theme, values] of allThemes) {
87
+ //? register theme name
88
+ allThemesNames.push(theme);
89
+ //? write foreign css path
148
90
  const beforeFilesExists = values.beforeFiles?.length > 0;
149
91
  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`;
92
+ const beforeKeyValue = beforeFilesExists ? `before:${values.beforeFiles}` : '';
93
+ const afterKeyValue = afterFilesExists ? `after:${values.afterFiles}` : '';
94
+ const foreignsExists = beforeFilesExists || afterFilesExists;
95
+ let foreignKeyValue = foreignsExists ? 'foreign:{' : '';
96
+ foreignKeyValue += beforeKeyValue;
97
+ foreignKeyValue += beforeKeyValue.length && afterKeyValue.length ? ',' : '';
98
+ foreignKeyValue += afterKeyValue;
99
+ foreignKeyValue += foreignsExists ? '}' : '';
100
+ //? write css path
101
+ const cssThemeContent = 'cssPath' in values ? `'${theme}':{css:'${values.cssPath}',${foreignKeyValue}}` : '';
102
+ await createStatFragment({ dir, content: cssThemeContent, fileName: 'cssTheme.js', theme });
162
103
  if (declarationHelp) {
163
- acc.declare.cssThemes += ` '${theme}': { css: string; foreign?: { before?: string[]; after?: string[]; }; };\n`;
104
+ const foreignDeclare = 'foreign?:{before?:string[],after?:string[]}';
105
+ const cssThemeDeclareContent = 'cssPath' in values ? `'${theme}':{css:string,${foreignDeclare}}` : '';
106
+ const declareThemeName = `${simplifyName(theme)}CssTheme`;
107
+ await createStatFragment({
108
+ dir,
109
+ content: cssThemeDeclareContent,
110
+ fileName: 'cssTheme.d.ts',
111
+ theme,
112
+ declare: declareThemeName
113
+ })
164
114
  }
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`;
115
+ if (compilerType !== compilerTypeValid.foundationOnly) {
116
+ //? write css class names [js file]
117
+ const cssClassNamesContent = 'classNames' in values ? `'${theme}':{${values.classNames.doc}}` : '';
118
+ await createStatFragment({ dir, content: cssClassNamesContent, fileName: 'cssClassNames.js', theme });
119
+ //? write css available components [js file]
120
+ const cssAvCompContent = 'availableComp' in values ? `'${theme}':{${values.availableComp.doc}}` : '';
121
+ await createStatFragment({ dir, content: cssAvCompContent, fileName: 'cssAvailableComponents.js', theme });
176
122
  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`;
123
+ //? write css class names [typescript declaration file]
124
+ const cssClNmDeclareContent = 'classNames' in values ? `'${theme}':{${values.classNames.declare}}` : '';
125
+ const declareCssClNm = `${simplifyName(theme)}CssClassNames`;
126
+ await createStatFragment({
127
+ dir,
128
+ content: cssClNmDeclareContent,
129
+ fileName: 'cssClassNames.d.ts',
130
+ theme,
131
+ declare: declareCssClNm
132
+ })
133
+ //? write css available components [typescript declaration file]
134
+ const cssAvCompDeclareContent = 'availableComp' in values ? `'${theme}':{${values.availableComp.declare}}` : '';
135
+ const declareCssAvComp = `${simplifyName(theme)}CssAvailableComponents`;
136
+ await createStatFragment({
137
+ dir,
138
+ content: cssAvCompDeclareContent,
139
+ fileName: 'cssAvailableComponents.d.ts',
140
+ theme,
141
+ declare: declareCssAvComp
142
+ })
186
143
  }
187
144
  }
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`;
145
+ if (compilerType !== compilerTypeValid.componentOnly) {
146
+ //? write css variables [js file]
147
+ const cssVarContent = 'variables' in values ? `'${theme}':{${values.variables.doc}}` : '';
148
+ await createStatFragment({ dir, content: cssVarContent, fileName: 'cssVars.js', theme });
149
+ //? write css global styles [js file]
150
+ const cssGlobalStylesContent = 'globalStyles' in values ? `'${theme}':{${values.globalStyles.doc}}` : '';
151
+ await createStatFragment({ dir, content: cssGlobalStylesContent, fileName: 'cssGlobalStyles.js', theme });
152
+ //? write css media queries [js file]
153
+ const cssMediaQueriesContent = 'mediaQueries' in values ? `'${theme}':{${values.mediaQueries.doc}}` : '';
154
+ await createStatFragment({ dir, content: cssMediaQueriesContent, fileName: 'cssMediaQueries.js', theme });
196
155
  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`;
156
+ //? write css variables [typescript declaration file]
157
+ const cssVarDeclareContent = 'variables' in values ? `'${theme}':{${values.variables.declare}}` : '';
158
+ const declareCssVar = `${simplifyName(theme)}CssVars`;
159
+ await createStatFragment({
160
+ dir,
161
+ content: cssVarDeclareContent,
162
+ fileName: 'cssVars.d.ts',
163
+ theme,
164
+ declare: declareCssVar
165
+ })
166
+ //? write css global styles [typescript declaration file]
167
+ const cssGlobalStylesDeclareContent = 'globalStyles' in values ? `'${theme}':{${values.globalStyles.declare}}` : '';
168
+ const declareCssGlobalStyles = `${simplifyName(theme)}CssGlobalStyles`;
169
+ await createStatFragment({
170
+ dir,
171
+ content: cssGlobalStylesDeclareContent,
172
+ fileName: 'cssGlobalStyles.d.ts',
173
+ theme,
174
+ declare: declareCssGlobalStyles
175
+ })
176
+ //? write css media queries [typescript declaration file]
177
+ const cssMediaQueriesDeclareContent = 'mediaQueries' in values ? `'${theme}':{${values.mediaQueries.declare}}` : '';
178
+ const declareCssMediaQueries = `${simplifyName(theme)}CssMediaQueries`;
179
+ await createStatFragment({
180
+ dir,
181
+ content: cssMediaQueriesDeclareContent,
182
+ fileName: 'cssMediaQueries.d.ts',
183
+ theme,
184
+ declare: declareCssMediaQueries
185
+ })
203
186
  }
204
187
  }
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
- : '';
188
+ }
189
+ const statsPieces = {
190
+ toImport: '',
191
+ cssThemes: 'export const cssThemes = {',
192
+ cssVars: 'export const cssVars = {',
193
+ cssClassNames: 'export const cssClasses = {',
194
+ cssAvailableComponents: 'export const cssAvailableComponents = {',
195
+ cssGlobalStyles: 'export const cssGlobalStyles = {',
196
+ cssMediaQueries: 'export const cssMediaQueries = {',
197
+ };
198
+ const statsDPieces = {
199
+ toImport: '',
200
+ cssThemes: 'export declare const cssThemes: ',
201
+ cssVars: 'export declare const cssVars: ',
202
+ cssClassNames: 'export declare const cssClasses: ',
203
+ cssAvailableComponents: 'export declare const cssAvailableComponents: ',
204
+ cssGlobalStyles: 'export declare const cssGlobalStyles: ',
205
+ cssMediaQueries: 'export declare const cssMediaQueries: ',
206
+ };
207
+ allThemesNames.forEach((theme, idx) => {
208
+ const simplifiedName = simplifyName(theme);
209
+ statsPieces.toImport += `import ${simplifiedName}CssTheme from './${theme}/cssTheme.js';\n`;
210
+ statsPieces.toImport += `import ${simplifiedName}CssVars from './${theme}/cssVars.js';\n`;
211
+ statsPieces.toImport += `import ${simplifiedName}CssClassNames from './${theme}/cssClassNames.js';\n`;
212
+ statsPieces.toImport += `import ${simplifiedName}CssAvailableComponents from './${theme}/cssAvailableComponents.js';\n`;
213
+ statsPieces.toImport += `import ${simplifiedName}CssGlobalStyles from './${theme}/cssGlobalStyles.js';\n`;
214
+ statsPieces.toImport += `import ${simplifiedName}CssMediaQueries from './${theme}/cssMediaQueries.js';\n`;
215
+ statsPieces.cssThemes += `...${simplifiedName}CssTheme,`;
216
+ statsPieces.cssVars += `...${simplifiedName}CssVars,`;
217
+ statsPieces.cssClassNames += `...${simplifiedName}CssClassNames,`;
218
+ statsPieces.cssAvailableComponents += `...${simplifiedName}CssAvailableComponents,`;
219
+ statsPieces.cssGlobalStyles += `...${simplifiedName}CssGlobalStyles,`;
220
+ statsPieces.cssMediaQueries += `...${simplifiedName}CssMediaQueries,`;
221
+ if (declarationHelp) {
222
+ statsDPieces.toImport += `import type { ${simplifiedName}CssTheme } from './${theme}/cssTheme.d.ts';\n`;
223
+ statsDPieces.toImport += `import type { ${simplifiedName}CssVars } from './${theme}/cssVars.d.ts';\n`;
224
+ statsDPieces.toImport += `import type { ${simplifiedName}CssClassNames } from './${theme}/cssClassNames.d.ts';\n`;
225
+ statsDPieces.toImport += `import type { ${simplifiedName}CssAvailableComponents } from './${theme}/cssAvailableComponents.d.ts';\n`;
226
+ statsDPieces.toImport += `import type { ${simplifiedName}CssGlobalStyles } from './${theme}/cssGlobalStyles.d.ts';\n`;
227
+ statsDPieces.toImport += `import type { ${simplifiedName}CssMediaQueries } from './${theme}/cssMediaQueries.d.ts';\n`;
228
+ if (idx > 0) {
229
+ statsDPieces.cssThemes += ' & ';
230
+ statsDPieces.cssVars += ' & ';
231
+ statsDPieces.cssClassNames += ' & ';
232
+ statsDPieces.cssAvailableComponents += ' & ';
233
+ statsDPieces.cssGlobalStyles += ' & ';
234
+ statsDPieces.cssMediaQueries += ' & ';
234
235
  }
235
- }
236
- return acc;
237
- }, initialState);
238
- };
236
+ statsDPieces.cssThemes += `${simplifiedName}CssTheme`;
237
+ statsDPieces.cssVars += `${simplifiedName}CssVars`;
238
+ statsDPieces.cssClassNames += `${simplifiedName}CssClassNames`;
239
+ statsDPieces.cssAvailableComponents += `${simplifiedName}CssAvailableComponents`;
240
+ statsDPieces.cssGlobalStyles += `${simplifiedName}CssGlobalStyles`;
241
+ statsDPieces.cssMediaQueries += `${simplifiedName}CssMediaQueries`;
242
+ }
243
+ });
244
+ statsPieces.cssThemes += '}';
245
+ statsPieces.cssVars += '}';
246
+ statsPieces.cssClassNames += '}';
247
+ statsPieces.cssAvailableComponents += '}';
248
+ statsPieces.cssGlobalStyles += '}';
249
+ statsPieces.cssMediaQueries += '}';
250
+ const statsFileTemplate = `${statsPieces.toImport}\n${statsPieces.cssThemes}\n${statsPieces.cssVars}\n${statsPieces.cssClassNames}\n${statsPieces.cssAvailableComponents}\n${statsPieces.cssGlobalStyles}\n${statsPieces.cssMediaQueries}\n`;
251
+ await writeDoc(path.join(dir, 'stats/stats.js'), statsFileTemplate, 'stats.js');
252
+ if (declarationHelp) {
253
+ statsDPieces.cssThemes += ';';
254
+ statsDPieces.cssVars += ';';
255
+ statsDPieces.cssClassNames += ';';
256
+ statsDPieces.cssAvailableComponents += ';';
257
+ statsDPieces.cssGlobalStyles += ';';
258
+ statsDPieces.cssMediaQueries += ';';
259
+ const statsDFileTemplate = `${statsDPieces.toImport}\n${statsDPieces.cssThemes}\n${statsDPieces.cssVars}\n${statsDPieces.cssClassNames}\n${statsDPieces.cssAvailableComponents}\n${statsDPieces.cssGlobalStyles}\n${statsDPieces.cssMediaQueries}\n`;
260
+ await writeDoc(path.join(dir, 'stats/stats.d.ts'), statsDFileTemplate, 'stats.d.ts');
261
+ }
262
+ }
239
263
 
264
+ /**
265
+ * Create the Bernova provider file and the stats document
266
+ *
267
+ * @param {object} param
268
+ * @param {string} param.dir destination directory
269
+ * @param {object} param.providerDocs provider documentation
270
+ * @param {boolean} param.declarationHelp enable typescript declaration files
271
+ * @param {string} param.providerName provider name
272
+ * @param {string} param.compilerType compiler type
273
+ * @return {void}
274
+ */
240
275
  const generateProvider = async ({
241
276
  dir,
242
277
  providerDocs,
@@ -244,16 +279,8 @@ const generateProvider = async ({
244
279
  providerName,
245
280
  compilerType,
246
281
  }) => {
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');
282
+ //? write stats and dependencies documents
283
+ await buildStatsDoc({ providerDocs, declarationHelp, compilerType, dir });
257
284
  //? write provider
258
285
  const providerDir = path.resolve(__dirname, './template/providerTemplate.js');
259
286
  let template = await fs.readFile(providerDir, 'utf8');
@@ -262,9 +289,6 @@ const generateProvider = async ({
262
289
  await writeDoc(`${dir}/${providerName}.js`, template, `${providerName}.js`);
263
290
 
264
291
  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
292
  //? write provider declare document
269
293
  const providerDirDeclare = path.resolve(
270
294
  __dirname,