Skip to content

Commit 7fa7fa2

Browse files
authored
fix(metadata): Extract only --sds-c hooks in metadata, enhance extractVarsFromCSS() (#4599)
* add allowPattern option to extractVarsFromCSS * add and update tests
1 parent a38ae7b commit 7fa7fa2

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

scripts/__tests__/var-extract.spec.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,42 @@ describe('extractVarsFromCSS', () => {
2525
expect(styleHookName).toEqual('--sds-c-icon-color-background');
2626
expect(actual[styleHookName].fallbackValue).toEqual('');
2727
});
28+
29+
it('extracts vars only from allow pattern', () => {
30+
const actual = extractVarsFromCSS(
31+
`.foo {
32+
top: var(--slds-kx-icon-position-top, 1rem);
33+
background-color: var(--sds-c-icon-color-background, transparent);
34+
left: var(--slds-kx-icon-position-left, 1rem);
35+
}`,
36+
{ allowPattern: /^--sds-c-/ }
37+
);
38+
39+
const styleHookName = Object.keys(actual)[0];
40+
41+
expect(styleHookName).toEqual('--sds-c-icon-color-background');
42+
expect(Object.keys(actual).length).toEqual(1);
43+
expect(actual[styleHookName].fallbackValue).toEqual('transparent');
44+
expect(actual[styleHookName].category).toEqual('Color');
45+
expect(actual[styleHookName].valueType).toEqual('Color');
46+
});
47+
48+
it('extracts vars from multiple allow pattern', () => {
49+
const actual = extractVarsFromCSS(
50+
`.foo {
51+
top: var(--slds-kx-icon-position-top, 1rem);
52+
background-color: var(--sds-c-icon-color-background, transparent);
53+
left: var(--foo-icon-position-left, 1rem);
54+
}`,
55+
{ allowPattern: /^(?:--sds-c-|--slds-kx-)/ }
56+
);
57+
58+
const [styleHookName1, styleHookName2] = Object.keys(actual);
59+
60+
expect(styleHookName1).toEqual('--slds-kx-icon-position-top');
61+
expect(styleHookName2).toEqual('--sds-c-icon-color-background');
62+
expect(Object.keys(actual).length).toEqual(2);
63+
expect(actual[styleHookName1].fallbackValue).toEqual('1rem');
64+
expect(actual[styleHookName2].category).toEqual('Color');
65+
});
2866
});

scripts/var-extract.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const glob = require('fast-glob');
33
const css = require('css');
44
const { readFileSync } = require('fs-extra');
55

6+
const { filterObject } = require('../shared/utils/objects');
67
const { compileModularCSS } = require('./compile/modular-css');
78
const { propTypes } = require('./var-metadata');
89

@@ -12,6 +13,7 @@ const { propTypes } = require('./var-metadata');
1213
const extractVarsFromSLDS = (props = {}) => {
1314
const { callback, suppressOutput } = props;
1415
const cssFolderExists = fs.existsSync('./.generated/css');
16+
const varsAllowPattern = /^--sds-c/;
1517

1618
// if there's no css folder yet, generate it!
1719
if (!cssFolderExists) {
@@ -39,7 +41,9 @@ const extractVarsFromSLDS = (props = {}) => {
3941

4042
cssFiles.map(filename => {
4143
const cssContent = readFileSync(filename).toString();
42-
const fileVars = extractVarsFromCSS(cssContent);
44+
const fileVars = extractVarsFromCSS(cssContent, {
45+
allowPattern: varsAllowPattern
46+
});
4347

4448
if (Object.keys(fileVars).length > 0) {
4549
varsData = Object.assign(fileVars, varsData);
@@ -67,9 +71,10 @@ const extractVarsFromSLDS = (props = {}) => {
6771
* @param {string} cssData
6872
* @returns {object}
6973
*/
70-
const extractVarsFromCSS = cssContent => {
74+
const extractVarsFromCSS = (cssContent, options = {}) => {
7175
const ast = css.parse(cssContent);
7276
const rules = ast.stylesheet.rules.filter(rule => rule.type === 'rule');
77+
const { allowPattern } = options;
7378
let list = {};
7479

7580
rules.map(rule => {
@@ -121,7 +126,9 @@ const extractVarsFromCSS = cssContent => {
121126
}
122127
});
123128

124-
return list;
129+
return allowPattern
130+
? filterObject(list, key => RegExp(allowPattern).test(key))
131+
: list;
125132
};
126133

127134
module.exports = {

shared/utils/objects.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const filterObject = (obj, callback) =>
2+
Object.fromEntries(
3+
Object.entries(obj).filter(([key, val]) => callback(key, val))
4+
);

0 commit comments

Comments
 (0)