Skip to content

Deno color logging support in nodejs #133

Description

@renhiyama

Reference: https://examples.deno.land/color-logging

After months of thinking, I came up with this code that achieves color logging:

let chalk = await Import("chalk@5.2.0");
let oc = console;
function styled(type, message, ...styles) {
  // Split the message by the placeholder %c and trim the spaces
  let messageArray = message.split("%c").map((e) => e.trim());
  // Remove the first empty string
  if (messageArray[0].trim() == "") messageArray.shift();
  // Initialize an array to store the chalk objects
  let chalkArray = [];
  // Loop through the styles array and create the chalk objects
  for (let style of styles) {
    // Split the style string by semicolons and trim the spaces
    let styleArray = style.split(";").map((s) => s.trim());
    // Initialize a chalk object
    let chalkObject = chalk;
    // Loop through the style array and apply the corresponding methods to the chalk object
    for (let s of styleArray) {
      // Split the style by colon and trim the spaces
      let [property, value] = s.split(":").map((s) => s.trim());
      // Convert the property and value to lower case
      property = property.toLowerCase();
      value = value.toLowerCase();
      // Switch on the property and apply the value as a method to the chalk object
      switch (property) {
        case "color":
          chalkObject = chalkObject[value];
          break;
        case "font-weight":
          if (value === "bold") {
            chalkObject = chalkObject.bold;
          }
          break;
        case "font-style":
          if (value === "italic") {
            chalkObject = chalkObject.italic;
          }
          break;
        case "text-decoration":
          if (value === "underline") {
            chalkObject = chalkObject.underline;
          }
          break;
        default:
          // Ignore other properties
          break;
      }
    }
    // Push the chalk object to the chalk array
    chalkArray.push(chalkObject);
  }
  // Initialize a string to store the final message
  let finalMessage = "";
  // Loop through the message array and the chalk array and concatenate the styled messages
  for (let i = 0; i < messageArray.length; i++) {
    // If there is a chalk object for the current index, apply it to the message
    if (chalkArray[i]) {
      finalMessage += " " + chalkArray[i](messageArray[i]);
    } else {
      // Otherwise, just append the message
      finalMessage += " " + messageArray[i];
    }
  }
  // Log the final message
  oc[type](finalMessage.trim());
}
//Polyfill global console object with below:
globalThis.console={
 log: (...args)=>styled("log", ...args)
// Add other functions here like warn, error, info
}
//use it normally
console.log("%cHello %cWorld", "color: red", "color: blue");

The Import function is my custom function, dont worry about it and we need a chalk alternative maybe or we can just use it?
This is how it looks:
Screenshot_20230306_230104_Termux

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions