feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values - #2029

Merged
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master
Jun 22, 2024
Merged

feat(isRgbColor): add allowSpaces option to allow/disallow spaces between color values#2029
rubiin merged 21 commits into
validatorjs:masterfrom
a-h-i:master

Conversation

@a-h-i

@a-h-ia-h-i commented Aug 15, 2022

Copy link
Copy Markdown
Contributor

isRgbColor now behaves in a similar manner to HSL, and ignores spaces. fixes#2028

Stripped spaces in isRgbColor function

Checklist

  • PR contains only changes related; no stray files, etc.
  • README updated (where applicable)
  • Tests written (where applicable)

@codecov

codecovBot commented Aug 15, 2022

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (83d6ffd) to head (97c1f70).
Report is 2 commits behind head on master.

❗ Current head 97c1f70 differs from pull request most recent head bfca688. Consider uploading reports for the commit bfca688 to get more accurate results

Additional details and impacted files
@@ Coverage Diff @@## master #2029 +/- ##
==========================================
Coverage 100.00% 100.00% ==========================================
Files 108 104 -4 Lines 2482 2215 -267 Branches 627 481 -146 ==========================================
- Hits 2482 2215 -267 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

WikiRik
WikiRik previously approved these changes Aug 15, 2022
Comment threadtest/validators.js
Comment on lines +4280 to 4281
'rgba(255, 255, 255, 0.5)',
],

@braaarbraaarAug 16, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worthwhile to add a test case like this for clarity's sake:

Suggested change
'rgba(255, 255, 255, 0.5)',
],
'rgba(255, 255, 255, 0.5)',
'r g b( 0, 251, 222 )',
],

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed so that it does not ignore spaces between rgb at start, and added the test cases

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 16, 2022 12:24
Comment threadsrc/lib/isRgbColor.js
const rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
const rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
const rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
const startsWithRgb = /^rgba?/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you add this? Isn't it already checked in the first section of the other regexes?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see. It's because the newly added test is invalid. Why is that?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so that we can check that it does not haves spaces between r g b and a only for the rest of the string

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured 'r g b( 0, 251, 222 )' failing validation but 'rgb( 0, 251, 222 )' passing is more inline with what an rgb color string is

braaar
braaar previously approved these changes Aug 17, 2022

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threadtest/validators.js
@braaar

braaar commented Aug 17, 2022

Copy link
Copy Markdown
Contributor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

Comment threadtest/validators.js Outdated
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Could it be useful to have a strict mode for this validator? I can picture a case where someone needs an RGB string formatted without spaces (or up to 1 space after commas between the numbers, perhaps). For those people this change would not only be a breaking change, but it would make the validator useless.

Strictness has come up a few times before, and there is an ongoing process with the ISO8601 validator which stems from people expecting different levels of strictness (the ISO8601 standard includes a lot of different formats, but people often want only one specific timestamp format).

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

@braaar

Copy link
Copy Markdown
Contributor

it's possible to add a boolean parameter and switch between old and new behaviour. My intent was just to resolve the issue faced in #2028

I think that is the safest approach. If we want to avoid breaking changes, the function should take an options object that defaults to { strict = true } which does not allow whitespace, and you have to set it to false to allow whitespaces.

Personally I would lean towards having it default to false and just do a major version bump. It just makes more sense that it is lax by default and you have to actively make it stricter. In that case you should write a clear descriptor of what the breaking change entails. I suggest changing the title of the PR to fix!: allow whitespace between color values in isRgbColor, add strict mode.

@WikiRik

Copy link
Copy Markdown
Member

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

@a-h-i
a-h-i requested a review from WikiRikAugust 18, 2022 23:09
@braaar

Copy link
Copy Markdown
Contributor

I agree that we want the default to be false, but I think we can go forward with this PR with strict = true and add a TODO that for the next major release we want to change that behaviour

Perhaps it is more elegant to make a PR for that right away and state in the title that it should be merged for the next major version. It's easy to forget TODOs deep in the source code.

@WikiRik

Copy link
Copy Markdown
Member

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

@a-h-i

Copy link
Copy Markdown
ContributorAuthor

Making a second PR right after this is merged to keep for the next major release would indeed be better. Good point!

So is this PR good to go?

Comment threadsrc/lib/isRgbColor.js Outdated
const startsWithRgb = /^rgba?/;

export default function isRgbColor(str, includePercentValues = true) {
export default function isRgbColor(str, includePercentValues = true, strict = true) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would use an options object here instead of individual arguments.

I think something should be done so that the function will be backwards compatible. There are examples of this somewhere in this repo, but I don't remember exactly where I've seen it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should indeed make includePercentValues backwards compatible if we move to an options object (which has my preference as well, see #1874 ). An example for this is;

if(typeof(options)==='object'){
min=options.min||0;
max=options.max;
}else{// backwards compatibility: isLength(str, min [, max])
min=arguments[1]||0;
max=arguments[2];
}

@a-h-ia-h-iAug 19, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is something like 301e707 what you had in mind? 🙂

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want to present both ways of providing options in the readme. Just describe the object parameter. The backwards compatibility is just there to avoid breaking changes for existing codebases. I don't think we should actively promote the old (inferior) way.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar updated readme

@a-h-i
a-h-i requested review from WikiRik and braaar and removed request for WikiRik and braaarAugust 21, 2022 05:56
Comment threadsrc/lib/isRgbColor.js Outdated
options.includePercentValues : true;
} else {
// backward compaitable behaviour
// Defaults

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can make the object the default behaviour, as long as the backwards compatible behaviour keeps working this would not be a breaking change. But I'm interested what @braaar and @rubiin have to say about this

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, we should have the object as the default behaviour. That makes the most sense to me.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@a-h-i I still think it's worthwhile to flip the logic here and put the object in the else clause

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@braaar changed in 9d0d3b3

@braaarbraaar left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a clearer explanation

Comment threadREADME.md Outdated
a-h-iand others added 12 commits May 14, 2024 22:39
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@profnandaa rebased and resolved merge conflicts

@profnandaaprofnandaa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks for your contrib! 🎉

@profnandaaprofnandaa removed the mc-to-land Just merge-conflict standing between the PR and landing. label May 15, 2024
@a-h-i

Copy link
Copy Markdown
ContributorAuthor

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@WikiRik

Copy link
Copy Markdown
Member

@WikiRik hey, sorry for the ping, I was wondering does it require another review? A bit unclear on the process from here

@profnandaa will merge this one soon and then it should end up in the next release

@profnandaa

Copy link
Copy Markdown
Member

@rubiin -- can take a look at this again? looks like it was good to go?

@rubiin
rubiin merged commit f81d857 into validatorjs:masterJun 22, 2024
@WikiRikWikiRik mentioned this pull request Mar 20, 2025
superfortune-passion pushed a commit to superfortune-passion/validator.js that referenced this pull request May 31, 2026
…etween color values (validatorjs#2029)
Co-authored-by: Brage Sekse Aarset <brage.aarset@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

isRgbColor does not ignore spaces between params

5 participants

@a-h-i@braaar@WikiRik@profnandaa@rubiin