diff --git a/exporters/variables-scss/src/generators/contentGenerator.ts b/exporters/variables-scss/src/generators/contentGenerator.ts index 6a7098848c..6480f7632d 100644 --- a/exporters/variables-scss/src/generators/contentGenerator.ts +++ b/exporters/variables-scss/src/generators/contentGenerator.ts @@ -1,9 +1,9 @@ import { Token, TokenGroup, TokenType } from '@supernovaio/sdk-exporters'; -import { generateStylesFromTokens } from './stylesGenerator'; -import { StylesObjectType, generateStylesObjectFromTokens } from './stylesObjectGenerator'; +import { FileData } from '../config/fileConfig'; import { indentAndFormat } from '../formatters/stylesFormatter'; import { convertToJs, convertToScss, deepMergeObjects } from '../helpers/objectHelper'; -import { FileData } from '../config/fileConfig'; +import { generateStylesFromTokens } from './stylesGenerator'; +import { StylesObjectType, generateStylesObjectFromTokens } from './stylesObjectGenerator'; // Add disclaimer to the top of the content export const addDisclaimer = (content: string): string => { @@ -20,24 +20,36 @@ export const filterTokensByTypeAndGroup = (tokens: Token[], type: TokenType, gro }); }; -export const generateJsObjectOutput = (stylesObject: StylesObjectType): string => { - const entries = Object.entries(stylesObject); +const addEmptyLineBetweenTokenGroups = (index: number, length: number): string => { + return index !== length - 1 ? '\n\n' : '\n'; +}; - return entries - .map(([key, obj], index) => { - return `export const ${key} = {\n${convertToJs(obj as StylesObjectType)}\n};${index !== entries.length - 1 ? '\n\n' : '\n'}`; - }) - .join(''); +type ExportTemplateCallback = (entriesLength: number) => (entry: [string, unknown], index: number) => string; + +const jsExportTemplate: ExportTemplateCallback = (entriesLength) => { + return ([key, obj], index) => { + return `export const ${key} = {\n${convertToJs(obj as StylesObjectType)}\n};${addEmptyLineBetweenTokenGroups(index, entriesLength)}`; + }; }; -export const generateScssObjectOutput = (stylesObject: StylesObjectType): string => { +const scssExportTemplate: ExportTemplateCallback = (entriesLength) => { + return ([key, obj], index) => { + return `${key}: (\n${convertToScss(obj as StylesObjectType)}\n) !default;${addEmptyLineBetweenTokenGroups(index, entriesLength)}`; + }; +}; + +const generateObjectOutput = (stylesObject: StylesObjectType, callback: ExportTemplateCallback) => { const entries = Object.entries(stylesObject); - return entries - .map(([key, obj], index) => { - return `${key}: (\n${convertToScss(obj as StylesObjectType)}\n) !default;${index !== entries.length - 1 ? '\n\n' : '\n'}`; - }) - .join(''); + return entries.map(callback(entries.length)).join(''); +}; + +export const generateJsObjectOutput = (stylesObject: StylesObjectType): string => { + return generateObjectOutput(stylesObject, jsExportTemplate); +}; + +export const generateScssObjectOutput = (stylesObject: StylesObjectType): string => { + return generateObjectOutput(stylesObject, scssExportTemplate); }; export const getGroups = (tokens: Token[], excludeGroupNames: string[] | null, groupNames: string[]): string[] => {