Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

util: add colorText method #43371

Closed
wants to merge 7 commits into from
Closed

Conversation

hemanth
Copy link
Contributor

@hemanth hemanth commented Jun 10, 2022

This is with reference to the comment in #42770

A few things to finalize before completing this draft PR:

  • Are we Ok to have such a method?
  • Given that is it CLI only the name sounds fine?
  • Can it be part of the console API?

//cc @nodejs/util

@nodejs-github-bot nodejs-github-bot added needs-ci PRs that need a full CI run. util Issues and PRs related to the built-in util module. labels Jun 10, 2022
@hemanth hemanth force-pushed the util-format-text branch from 26f5680 to 7556c9e Compare June 10, 2022 16:58
lib/util.js Outdated Show resolved Hide resolved
@ljharb
Copy link
Member

ljharb commented Jun 10, 2022

Name sounds good to me; i don't think it should be in console at all.

Is there any way to have tests that actually verify that the expected colors show up on supported platforms?

Copy link
Contributor

@cjihrig cjihrig left a comment

Choose a reason for hiding this comment

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

Left some preliminary comments.

Is there any way to have tests that actually verify that the expected colors show up on supported platforms?

test/parallel/test-util-format.js and test/parallel/test-util-inspect.js might be good places to look for examples.

Also cc @BridgeAR who might be interested since this overlaps with the color support in util.inspect().

lib/util.js Outdated Show resolved Hide resolved
lib/util.js Outdated Show resolved Hide resolved
function colorText(format, text) {
validateString(format, 'format');
validateString(text, 'text');
const formatCodes = inspect.colors[format];
Copy link
Contributor

Choose a reason for hiding this comment

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

If this is going to be public API, we should probably provide some additional validation for supported formats.

Copy link
Contributor Author

@hemanth hemanth Jun 11, 2022

Choose a reason for hiding this comment

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

additional validation

like?

Copy link
Contributor

Choose a reason for hiding this comment

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

I was thinking we could validate that format is actually something supported by inspect.colors, but feel free to ignore if you want.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If they pass anything apart as of now, we are just returning the text as in, do you feel it makes sense to check if the format is supported by inspect.colors and throw an error for non-supported inputs?

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, that's what I originally meant.

Copy link
Member

Choose a reason for hiding this comment

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

Is inspect.colors mutable and exposed to users?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

^ yes!

lib/util.js Outdated Show resolved Hide resolved
test/parallel/test-util-colorText.js Outdated Show resolved Hide resolved
test/parallel/test-util-colorText.js Outdated Show resolved Hide resolved
@hemanth hemanth changed the title WIP: Adding colorText method to util. util: [WIP] Adding colorText method to util. Jun 11, 2022
@hemanth hemanth force-pushed the util-format-text branch 3 times, most recently from 9c94ffe to 9ac1a84 Compare June 12, 2022 06:03
@hemanth hemanth changed the title util: [WIP] Adding colorText method to util. util: Adding colorText method to util Jun 13, 2022
@Trott
Copy link
Member

Trott commented Jun 13, 2022

Micro-nit on the commit message: The verb in the first line of the commit message should be imperative. In other words, add rather than adding. This is something that someone can fix when landing, and also no one (not even me) is actually going to care if it slips through as adding rather than add. But if you want to make that change, that would make it comply with our contributor guidelines doc.

@hemanth hemanth force-pushed the util-format-text branch from 9ac1a84 to 7cd400f Compare June 13, 2022 22:11
@hemanth
Copy link
Contributor Author

hemanth commented Jun 13, 2022

Thanks for the clarification @Trott. I had that doubt, fixed it.

@Trott Trott added the request-ci Add this label to start a Jenkins CI on a PR. label Jun 14, 2022
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jun 14, 2022
@nodejs-github-bot
Copy link
Collaborator

@hemanth
Copy link
Contributor Author

hemanth commented Jun 14, 2022

We should also add this to the docs right?

@cjihrig
Copy link
Contributor

cjihrig commented Jun 14, 2022

Yes, this would require a docs update.

@hemanth hemanth force-pushed the util-format-text branch from 01a77c8 to ccfdcee Compare June 14, 2022 23:32
@hemanth
Copy link
Contributor Author

hemanth commented Jun 17, 2022

Is this ready enough?

@hemanth hemanth changed the title util: Adding colorText method to util util: add colorText method Jun 20, 2022
@hemanth hemanth requested a review from cjihrig June 20, 2022 15:48
@hemanth hemanth requested a review from aduh95 June 20, 2022 15:48
Copy link
Contributor

@cjihrig cjihrig left a comment

Choose a reason for hiding this comment

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

Left a few comments. It would be good for others to weigh in on things like the overall API design and whether or not we should make this experimental first.

doc/api/util.md Outdated Show resolved Hide resolved
doc/api/util.md Outdated
added: v18.3.0
-->

* `format` {string} `format` one of the color format from `util.inspect.colors`
Copy link
Contributor

Choose a reason for hiding this comment

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

We should probably link util.inspect.colors to https://nodejs.org/api/util.html#customizing-utilinspect-colors.

doc/api/util.md Outdated Show resolved Hide resolved
doc/api/util.md Outdated Show resolved Hide resolved
doc/api/util.md Outdated Show resolved Hide resolved
Takes `format` and `text` and retuns the colored text form

```js
const util = require('node:util');
Copy link
Contributor

Choose a reason for hiding this comment

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

Can you remove this line. Otherwise we'll need to show the same example code for CJS and ESM.

const util = require('node:util');

console.log(util.colorText('red', 'This text shall be in red color'));
// ^ '\u001b[31mThis text shall be in red color\u001b[39m'
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// ^ '\u001b[31mThis text shall be in red color\u001b[39m'
// ^ '\u001b[31mThis text shall be colored red\u001b[39m'

Copy link
Member

Choose a reason for hiding this comment

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

s/shall be/is?

function colorText(format, text) {
validateString(format, 'format');
validateString(text, 'text');
const formatCodes = inspect.colors[format];
Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, that's what I originally meant.

Comment on lines +26 to +31
assert.throws(() => {
util.colorText('red', undefined);
}, {
code: 'ERR_INVALID_ARG_TYPE',
message: 'The "text" argument must be of type string. Received undefined'
});
Copy link
Contributor

Choose a reason for hiding this comment

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

Wouldn't this already be tested on line 20 when invalidOption is undefined?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Right, this should rather be util.colorText(undefined, undefined);

doc/api/util.md Outdated Show resolved Hide resolved
const util = require('node:util');

console.log(util.colorText('red', 'This text shall be in red color'));
// ^ '\u001b[31mThis text shall be in red color\u001b[39m'
Copy link
Member

Choose a reason for hiding this comment

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

s/shall be/is?

function colorText(format, text) {
validateString(format, 'format');
validateString(text, 'text');
const formatCodes = inspect.colors[format];
Copy link
Member

Choose a reason for hiding this comment

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

Is inspect.colors mutable and exposed to users?

hemanth and others added 5 commits June 20, 2022 21:52
Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
Co-authored-by: Jordan Harband <ljharb@gmail.com>
Copy link
Member

@BridgeAR BridgeAR left a comment

Choose a reason for hiding this comment

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

I am hesitant to add new formatting functionalities to util (console does not seem ideal either). I just opened a something similar API: #43523. It does a bit more by also allowing nested colors, this functionality here does not do that (e.g., colorText('green', 'green ' + colorText('red', 'red') + ' green') would end up being colored: green red defaultColor instead of green red green).

@jasnell
Copy link
Member

jasnell commented Jun 27, 2022

Let's throw this into the TSC agenda as part of the discussion for #43523

@jasnell jasnell added the tsc-agenda Issues and PRs to discuss during the meetings of the TSC. label Jun 27, 2022
@mcollina mcollina removed the tsc-agenda Issues and PRs to discuss during the meetings of the TSC. label Jul 13, 2022
@mcollina
Copy link
Member

Dropping it from the tsc-agenda until #43382 is resolved.

@mcollina mcollina added the blocked PRs that are blocked by other issues or PRs. label Jul 13, 2022
added: REPLACEME
-->

* `format` {string} A color format defined in `util.inspect.colors`.
Copy link
Contributor

Choose a reason for hiding this comment

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

Accepting string | string[] would be really helpful to e.g. make text both a certain color and underline/italic/bold/... at the same time

@mcollina
Copy link
Member

mcollina commented Mar 7, 2024

Superseded by #51850

@mcollina mcollina closed this Mar 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
blocked PRs that are blocked by other issues or PRs. needs-ci PRs that need a full CI run. util Issues and PRs related to the built-in util module.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants