From 1684a8e807c426393355116b9e1ce9010ffdcb36 Mon Sep 17 00:00:00 2001 From: Teun Verhaert Date: Mon, 20 Jan 2025 19:30:47 +0100 Subject: [PATCH] fix: fix sizeRem not transforming negative values (#1432) Co-authored-by: teunverhaert --- .changeset/cool-bears-glow.md | 5 +++ __tests__/common/transforms.test.js | 50 +++++++++++++++++++++++++++++ lib/common/transforms.js | 2 +- 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 .changeset/cool-bears-glow.md diff --git a/.changeset/cool-bears-glow.md b/.changeset/cool-bears-glow.md new file mode 100644 index 000000000..d23112fda --- /dev/null +++ b/.changeset/cool-bears-glow.md @@ -0,0 +1,5 @@ +--- +'style-dictionary': patch +--- + +Fix sizeRem to allow negative values diff --git a/__tests__/common/transforms.test.js b/__tests__/common/transforms.test.js index 99a9fe25f..c9f01d32a 100644 --- a/__tests__/common/transforms.test.js +++ b/__tests__/common/transforms.test.js @@ -790,6 +790,16 @@ describe('common', () => { ); expect(value).to.equal('10px'); }); + it('should work for negative values', () => { + const value = transforms[sizePx].transform( + { + value: '-10', + }, + {}, + {}, + ); + expect(value).to.equal('-10px'); + }); it('should throw an error if prop value is Nan', () => { expect(() => transforms[sizeDp].transform({ value: 'a' }, {}, {})).to.throw(); }); @@ -957,6 +967,46 @@ describe('common', () => { ); expect(value).to.equal('1rem'); }); + it('should work for negative values with unit', () => { + const value = transforms[sizeRem].transform( + { + value: '-1rem', + }, + {}, + {}, + ); + expect(value).to.equal('-1rem'); + }); + it('should work for negative values', () => { + const value = transforms[sizeRem].transform( + { + value: '-1', + }, + {}, + {}, + ); + expect(value).to.equal('-1rem'); + }); + it('should work for positive values', () => { + const value = transforms[sizeRem].transform( + { + value: '+1', + }, + {}, + {}, + ); + expect(value).to.equal('1rem'); + }); + it('should work for floating values', () => { + const value = transforms[sizeRem].transform( + { + value: '.5', + }, + {}, + {}, + ); + expect(value).to.equal('0.5rem'); + }); ['0', 0].forEach((value) => { it('zero value is returned without a unit and remains same type', () => { expect( diff --git a/lib/common/transforms.js b/lib/common/transforms.js index 4bb0fa34f..5131992b4 100644 --- a/lib/common/transforms.js +++ b/lib/common/transforms.js @@ -829,7 +829,7 @@ export default { transform: function (token, _, options) { const nonParsed = options.usesDtcg ? token.$value : token.value; // if the dimension already has a unit (non-digit / . period character) - if (`${nonParsed}`.match(/[^0-9.]/g)) { + if (`${nonParsed}`.match(/^[^0-9.-]+$/)) { return nonParsed; } const parsedVal = parseFloat(nonParsed);