Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor(exporter-variables-scss): Typography generator function use one object #1662

Closed
wants to merge 42 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
fbbbe67
Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 19, 2024
6b46c95
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 19, 2024
9b587a3
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 19, 2024
4985061
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 19, 2024
25db5dc
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 19, 2024
6ff0767
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
934d070
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
f857f5c
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
55d7aac
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
6388823
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
c395507
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
1cb681c
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
a53ebc7
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
3145b2f
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
70586a3
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
36f9e2e
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
3d84625
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
993cb30
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
d71c455
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
f8bc3ad
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
e89b22b
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 20, 2024
300c0ff
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
93698b7
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
b641adc
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
72e47b6
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
5d81e8f
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
07dc855
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
43e5c99
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 23, 2024
e862bca
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 24, 2024
59d8094
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 24, 2024
29a3e55
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
6d8fa8a
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
91c08c5
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
e584daf
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
17f0ac9
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
5668687
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
ec69ef6
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
3de0729
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
74ffbad
fixup! Feat(variables-scss): Export to javascript #DS-1437
curdaj Sep 25, 2024
a808560
Chore(exporter-variables-scss): Enable unit test watch mode
literat Sep 26, 2024
8d85cf0
Refactor(exporter-variables-scss): Typography generator function use …
literat Sep 26, 2024
6cebe77
fixup! Refactor(exporter-variables-scss): Typography generator functi…
literat Sep 26, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 46 additions & 18 deletions exporters/variables-scss/generated/exporter.cjs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion exporters/variables-scss/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"lint": "eslint ./",
"lint:fix": "yarn lint --fix",
"test": "npm-run-all lint test:unit:coverage types",
"test:unit": "jest || true",
"test:unit": "jest",
"test:unit:watch": "yarn test:unit --watchAll",
"test:unit:coverage": "yarn test:unit --coverage",
"types": "true"
Expand Down
31 changes: 14 additions & 17 deletions exporters/variables-scss/src/config/fileConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,64 +3,61 @@ import { TokenType } from '@supernovaio/sdk-exporters';
export type FileData = {
fileName: string;
tokenTypes: TokenType[];
groupNames: string[];
withCssObject?: boolean;
groupNames?: string[];
excludeGroupNames?: string[] | null;
hasStylesObject?: boolean;
hasParentPrefix?: boolean;
sortByNumValue?: boolean;
};

export const nonThemedFilesData: FileData[] = [
{
fileName: '_borders.scss',
fileName: 'borders',
tokenTypes: [TokenType.dimension],
groupNames: ['Border'],
withCssObject: false,
hasStylesObject: false,
sortByNumValue: true,
},
{
fileName: '_other.scss',
fileName: 'other',
tokenTypes: [TokenType.dimension, TokenType.string],
groupNames: ['Grid', 'Container', 'Breakpoint'],
excludeGroupNames: ['Border', 'Radius', 'Spacing'],
sortByNumValue: true,
},
{
fileName: '_radii.scss',
fileName: 'radii',
tokenTypes: [TokenType.dimension],
groupNames: ['Radius'],
hasParentPrefix: false,
sortByNumValue: true,
},
{
fileName: '_spacing.scss',
fileName: 'spacing',
tokenTypes: [TokenType.dimension],
groupNames: ['Spacing'],
hasParentPrefix: false,
sortByNumValue: true,
},
{
fileName: '_shadows.scss',
fileName: 'shadows',
tokenTypes: [TokenType.shadow],
groupNames: [''],
hasParentPrefix: false,
},
{
fileName: '_gradients.scss',
fileName: 'gradients',
tokenTypes: [TokenType.gradient],
groupNames: [''],
hasParentPrefix: true,
},
{
fileName: '_typography.scss',
fileName: 'typography',
tokenTypes: [TokenType.typography],
groupNames: [''],
withCssObject: true,
hasParentPrefix: false,
},
];

export const themedFilesData: FileData[] = [
{
fileName: '_colors.scss',
fileName: 'colors',
tokenTypes: [TokenType.color],
groupNames: [''],
},
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const invariantTokenAlias: { [key: string]: string } = {
'radius-full': 'full',
};

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import fs from 'fs';
import path from 'path';
import { indentAndFormat } from '../stylesFormatter';

const mockedUnformattedCSS = fs.readFileSync(
path.join(__dirname, '../../../tests/fixtures/unformattedExample.scss'),
'utf-8',
);

const mockedFormattedCSS = fs.readFileSync(
path.join(__dirname, '../../../tests/fixtures/formattedExample.scss'),
'utf-8',
);

const mockedFormattedJS = fs.readFileSync(path.join(__dirname, '../../../tests/fixtures/formattedExample.ts'), 'utf-8');

const mockedUnformattedJS = `export const gridSpacingDesktop = '32px';

export const gridColumns = '12';

export const grids = {
spacing: {
desktop: gridSpacingDesktop,
},
columns: gridColumns,
};
`;

describe('indentAndFormat', () => {
it('should correctly indent and format CSS output', () => {
expect(indentAndFormat(mockedUnformattedCSS, false)).toBe(mockedFormattedCSS);
});

it('should correctly indent and format JS output', () => {
expect(indentAndFormat(mockedUnformattedJS, true)).toBe(mockedFormattedJS);
});
});
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const INDENTATION = ' ';
export const SCSS_INDENTATION = ' ';
export const JS_INDENTATION = ' ';

export const removeExtraBlankLines = (css: string): string => {
return css.replace(/\n{3,}/g, '\n\n');
Expand All @@ -8,20 +9,23 @@ export const formatLinesAtEndOfTheFile = (css: string): string => {
return css.replace(/\n{2,}$/, '\n');
};

export const formatCSS = (css: string): string => {
export const indentAndFormat = (css: string, hasJsOutput: boolean): string => {
const INDENTATION = hasJsOutput ? JS_INDENTATION : SCSS_INDENTATION;
let indentationLevel = 0;
let formattedCSS = '';

const lines = css.split('\n');
const openBracket = hasJsOutput ? '{' : '(';
const closeBracket = hasJsOutput ? '}' : ')';

for (const line of lines) {
// Check if both '(' and ')' are on the same line
if (line.includes('(') && line.includes(')')) {
// Check if both openBracket and closeBracket are on the same line
if (line.includes(openBracket) && line.includes(closeBracket)) {
formattedCSS += `${INDENTATION.repeat(indentationLevel)}${line}\n`;
} else if (line.includes('(')) {
} else if (line.includes(openBracket)) {
formattedCSS += `${INDENTATION.repeat(indentationLevel)}${line}\n`;
indentationLevel += 1;
} else if (line.includes(')')) {
} else if (line.includes(closeBracket)) {
indentationLevel -= 1;
formattedCSS += `${INDENTATION.repeat(indentationLevel)}${line}\n`;
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,40 @@
import fs from 'fs';
import path from 'path';
import { Token, TokenGroup, TokenType } from '@supernovaio/sdk-exporters';
import { generateFileContent, addDisclaimer, filterTokensByTypeAndGroup } from '../contentGenerator';
import {
exampleMockedGroups,
exampleMockedTokens,
exampleTypographyMockedTokens,
} from '../../../tests/fixtures/mockedExampleTokens';
generateFileContent,
addDisclaimer,
filterTokensByTypeAndGroup,
generateScssObjectOutput,
generateJsObjectOutput,
getGroups,
} from '../contentGenerator';
import { exampleDimensionAndStringTokens } from '../../../tests/fixtures/exampleDimensionAndStringTokens';
import { FileData } from '../../config/fileConfig';
import { exampleTypographyTokens } from '../../../tests/fixtures/exampleTypographyTokens';
import { exampleGroups } from '../../../tests/fixtures/exampleGroups';

const mockedExpectedResult = fs.readFileSync(
path.join(__dirname, '../../../tests/fixtures/exampleFileContent.scss'),
'utf-8',
);
const mappedTokens: Map<string, Token> = new Map([]);
const tokenGroups: Array<TokenGroup> = exampleMockedGroups;
const tokenGroups: Array<TokenGroup> = exampleGroups;

describe('contentGenerator', () => {
describe('generateFileContent', () => {
it('should generate file content', () => {
const tokens = Array.from(exampleMockedTokens.values());
const tokens = Array.from(exampleDimensionAndStringTokens.values());
const fileData: FileData = {
fileName: 'testFile',
tokenTypes: [TokenType.dimension, TokenType.string],
groupNames: ['Grid', 'String'],
withCssObject: true,
hasStylesObject: true,
hasParentPrefix: true,
sortByNumValue: false,
};

const fileContent = generateFileContent(tokens, mappedTokens, tokenGroups, fileData);
const fileContent = generateFileContent(tokens, mappedTokens, tokenGroups, fileData, false);

expect(fileContent).toStrictEqual({ content: mockedExpectedResult });
});
Expand Down Expand Up @@ -63,19 +68,19 @@ describe('contentGenerator', () => {
const dataTypographyProviderItems = {
type: TokenType.typography,
group: 'Heading',
tokenIdentifier: 'typographyHeadingRef1',
tokenIdentifier: 'typographyRef1',
};

it.each(dataProviderItems)('should filter $description', ({ type, group, tokenIdentifier }) => {
const tokens = Array.from(exampleMockedTokens.values());
const expectedTokens = [exampleMockedTokens.get(tokenIdentifier) as Token];
const tokens = Array.from(exampleDimensionAndStringTokens.values());
const expectedTokens = [exampleDimensionAndStringTokens.get(tokenIdentifier) as Token];

expect(filterTokensByTypeAndGroup(tokens, type, group)).toStrictEqual(expectedTokens);
});

it(`should filter ${dataTypographyProviderItems.type} token type and ${dataTypographyProviderItems.group} group and exclude tokens with "-Underline"`, () => {
const tokens = Array.from(exampleTypographyMockedTokens.values());
const expectedTokens = [exampleTypographyMockedTokens.get(dataTypographyProviderItems.tokenIdentifier) as Token];
const tokens = Array.from(exampleTypographyTokens.values());
const expectedTokens = [exampleTypographyTokens.get(dataTypographyProviderItems.tokenIdentifier) as Token];

const filteredTokens = filterTokensByTypeAndGroup(
tokens,
Expand All @@ -86,4 +91,82 @@ describe('contentGenerator', () => {
expect(filteredTokens).toStrictEqual(expectedTokens);
});
});

describe('generateScssObjectOutput', () => {
it('should generate SCSS object output', () => {
const stylesObject = {
$grids: { columns: '$grid-columns', spacing: { desktop: '$grid-spacing-desktop' } },
};
const expectedResult = `$grids: (
columns: $grid-columns,
spacing: (
desktop: $grid-spacing-desktop,
),
) !default;\n\n`;

const scssOutput = generateScssObjectOutput(stylesObject);

expect(scssOutput).toBe(expectedResult);
});
});

describe('generateJsObjectOutput', () => {
it('should generate JS object output', () => {
const stylesObject = {
grids: { columns: 'gridColumns', spacing: { desktop: 'gridSpacingDesktop' } },
};
const expectedResult = `export const grids = {
columns: gridColumns,
spacing: {
desktop: gridSpacingDesktop,
},
};\n\n`;

const jsOutput = generateJsObjectOutput(stylesObject);

expect(jsOutput).toBe(expectedResult);
});
});

describe('getGroups', () => {
it('should return group names', () => {
const tokens = Array.from(exampleDimensionAndStringTokens.values());
const excludeGroupNames = ['String'];
const groupNames = ['Grid'];

const groups = getGroups(tokens, excludeGroupNames, groupNames);

expect(groups).toStrictEqual(['Grid']);
});

it('should return group names without excluded group names', () => {
const tokens = Array.from(exampleDimensionAndStringTokens.values());
const excludeGroupNames = ['String', 'Grid'];
const groupNames = ['Grid'];

const groups = getGroups(tokens, excludeGroupNames, groupNames);

expect(groups).toStrictEqual([]);
});

it('should return group names with no excluded group names', () => {
const tokens = Array.from(exampleDimensionAndStringTokens.values());
const excludeGroupNames = null;
const groupNames = ['Grid', 'String'];

const groups = getGroups(tokens, excludeGroupNames, groupNames);

expect(groups).toStrictEqual(['Grid', 'String']);
});

it('should not return group names', () => {
const tokens = Array.from(exampleDimensionAndStringTokens.values());
const excludeGroupNames = ['Grid', 'String'];
const groupNames = [''];

const groups = getGroups(tokens, excludeGroupNames, groupNames);

expect(groups).toStrictEqual([]);
});
});
});
Loading
Loading