[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-10164":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},10164,"signale","klaudiosinani\u002Fsignale","klaudiosinani","Highly configurable logging library","https:\u002F\u002Fklaudiosinani.com\u002Fsignale",null,"JavaScript",9174,234,72,29,0,1,3,8,4,67.41,"MIT License",false,"master",true,[27,28,29,30,31,32],"cli","console","library","log","logger","nodejs","2026-06-12 04:00:49","\u003Ch1 align=\"center\">\n  Signale\n\u003C\u002Fh1>\n\n\u003Ch4 align=\"center\">\n  Highly configurable logging library\n\u003C\u002Fh4>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Header\" src=\"media\u002Fheader.png\" width=\"88%\">\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fsignale\">\n    \u003Cimg alt=\"NPM Downloads\" src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdt\u002Fsignale.svg\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n  \u003Cbr>\n  \u003Csup>\u003Cb>Sponsored by:\u003C\u002Fb>\u003C\u002Fsup>\n  \u003Cbr>\n  \u003Ca href=\"https:\u002F\u002Fbetterstack.com\">\n    \u003Cdiv>\n      \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FSeldaek\u002Fmonolog\u002Fassets\u002F183678\u002F7de58ce0-2fa2-45c0-b3e8-e60cebb3c4cf\" width=\"200\" alt=\"Better Stack\">\n    \u003C\u002Fdiv>\n    \u003Csup>\n      Spot, Resolve, and Prevent Downtime.\n    \u003C\u002Fsup>\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\n## Description\n\nHackable and configurable to the core, signale can be used for logging purposes, status reporting, as well as for handling the output rendering process of other node modules and applications.\n\nRead this document in: [Albanian - Shqip](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fblob\u002Fmaster\u002Fdocs\u002Freadme.AL.md), [简体中文 - Simplified Chinese](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fblob\u002Fmaster\u002Fdocs\u002Freadme.zh_CN.md), [German - Deutsch](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fblob\u002Fmaster\u002Fdocs\u002Freadme.DE.md).\n\nYou can now support the development process through [GitHub Sponsors](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fklaudiosinani).\n\nVisit the [contributing guidelines](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fblob\u002Fmaster\u002Fcontributing.md#translating-documentation) to learn more on how to translate this document into more languages.\n\n## Highlights\n\n- 19 out-of-the-box loggers\n- Hackable to the core\n- Clean and beautiful output\n- Integrated timers\n- Custom pluggable loggers\n- TypeScript support\n- Interactive and regular modes\n- Secrets & sensitive information filtering\n- Filename, date and timestamp support\n- Scoped loggers and timers\n- Scaled logging levels mechanism\n- String interpolation support\n- Multiple configurable writable streams\n- Simple and minimal syntax\n- Globally configurable through `package.json`\n- Overridable configuration per file and logger\n\n## Contents\n\n- [Description](#description)\n- [Highlights](#highlights)\n- [Install](#install)\n- [Usage](#usage)\n- [Configuration](#configuration)\n- [API](#api)\n- [Development](#development)\n- [Related](#related)\n- [Who's Using It?](#whos-using-it)\n- [Team](#team)\n- [Sponsors](#sponsors)\n- [License](#license)\n\n## Install\n\n### Yarn\n\n```bash\nyarn add signale\n```\n\n### NPM\n\n```bash\nnpm install signale\n```\n\n## Usage\n\n### Default Loggers\n\nImport signale and start using any of the default loggers.\n\n\u003Cdetails>\n\u003Csummary>View all of the available loggers.\u003C\u002Fsummary>\n\n\u003Cbr\u002F>\n\n- `await`\n- `complete`\n- `error`\n- `debug`\n- `fatal`\n- `fav`\n- `info`\n- `note`\n- `pause`\n- `pending`\n- `star`\n- `start`\n- `success`\n- `wait`\n- `warn`\n- `watch`\n- `log`\n\n\u003C\u002Fdetails>\n\n\u003Cbr\u002F>\n\n```js\nconst signale = require('signale');\n\nsignale.success('Operation successful');\nsignale.debug('Hello', 'from', 'L59');\nsignale.pending('Write release notes for %s', '1.2.0');\nsignale.fatal(new Error('Unable to acquire lock'));\nsignale.watch('Recursively watching build directory...');\nsignale.complete({prefix: '[task]', message: 'Fix issue #59', suffix: '(@klaudiosinani)'});\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Default Loggers\" src=\"media\u002Fdefault-loggers.png\" width=\"65%\">\n\u003C\u002Fdiv>\n\n### Custom Loggers\n\nTo create a custom logger define an `options` object yielding a `types` field with the logger data and pass it as argument to a new signale instance.\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  disabled: false,\n  interactive: false,\n  logLevel: 'info',\n  scope: 'custom',\n  secrets: [],\n  stream: process.stdout,\n  types: {\n    remind: {\n      badge: '**',\n      color: 'yellow',\n      label: 'reminder',\n      logLevel: 'info'\n    },\n    santa: {\n      badge: '🎅',\n      color: 'red',\n      label: 'santa',\n      logLevel: 'info'\n    }\n  }\n};\n\nconst custom = new Signale(options);\ncustom.remind('Improve documentation.');\ncustom.santa('Hoho! You have an unused variable on L45.');\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Custom Loggers\" src=\"media\u002Fcustom-loggers.png\" width=\"70%\">\n\u003C\u002Fdiv>\n\nHere is an example where we override the default `error` and `success` loggers.\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  types: {\n    error: {\n      badge: '!!',\n      label: 'fatal error'\n    },\n    success: {\n      badge: '++',\n      label: 'huge success'\n    }\n  }\n};\n\nconst signale = new Signale();\nsignale.error('Default Error Log');\nsignale.success('Default Success Log');\n\nconst custom = new Signale(options);\ncustom.error('Custom Error Log');\ncustom.success('Custom Success Log');\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Default Loggers\" src=\"media\u002Foverride-defaults.png\" width=\"65%\">\n\u003C\u002Fdiv>\n\nThe `options` object can hold any of the following attributes: `disabled`, `interactive`, `logLevel`, `secrets`, `stream`, `scope` and `types`. \n\n##### `disabled`\n\n- Type: `Boolean`\n- Default: `false`\n\nDisables the logging functionality of all loggers belonging to the created instance.\n\n##### `interactive`\n\n- Type: `Boolean`\n- Default: `false`\n\nSwitches all loggers belonging to the created instance into the interactive mode.\n\n##### `logLevel`\n\n- Type: `String`\n- Default: `'info'`\n\nSets the general logging level of the created instance. Can be one of the following:\n\n- `'info'` - Displays all messages from all loggers.\n- `'timer'` -  Displays messages only from the `time`, `timeEnd`, `debug`, `warn`, `error` & `fatal` loggers.\n- `'debug'` - Displays messages only from the `debug`, `warn`, `error` & `fatal` loggers.\n- `'warn'` - Displays messages only from the `warn`, `error` & `fatal` loggers.\n- `'error'` - Displays messages only from the `error` & `fatal` loggers.\n\n##### `secrets`\n\n- Type: `(String|Number)[]`\n- Default: `[]`\n\nAn array holding secrets\u002Fsensitive-information to be removed from the body and metadata of to-be-logged messages and replaced with the default `'[secure]'` string.\n\n##### `stream`\n\n- Type: `stream.Writable|stream.Writable[]`\n- Default: `process.stdout`\n\nDestination to which the data is written, can be a single valid [Writable stream](https:\u002F\u002Fnodejs.org\u002Fapi\u002Fstream.html#stream_writable_streams) or an array holding multiple valid Writable streams.\n\n##### `scope`\n\n- Type: `String|String[]`\n\nName of the scope the logger is reporting from.\n\n##### `types`\n\n- Type: `Object`\n\nHolds the configuration of the custom and default loggers.\n\nAdditionally, the configuration object of each custom\u002Fdefault logger type, defined in the `types` option, can hold any of the following attributes: `badge`, `label`, `color`, `logLevel` & `stream`. \n\n##### `badge`\n\n- Type: `String`\n\nThe icon corresponding to the logger.\n\n##### `label`\n\n- Type: `String`\n\nThe label used to identify the type of the logger.\n\n##### `color`\n\n- Type: `String`\n\nThe color of the label, can be any of the foreground colors supported by [chalk](https:\u002F\u002Fgithub.com\u002Fchalk\u002Fchalk#colors).\n\n##### `logLevel`\n\n- Type: `String`\n- Default: `'info'`\n\nThe log level corresponding to the logger. Messages originating from the logger are displayed only if the log level is greater or equal to the above described general logging level `logLevel` of the `Signale` instance.\n\n##### `stream`\n\n- Type: `stream.Writable|stream.Writable[]`\n- Default: `process.stdout`\n\nDestination to which the data is written, can be a single valid [Writable stream](https:\u002F\u002Fnodejs.org\u002Fapi\u002Fstream.html#stream_writable_streams) or an array holding multiple valid Writable streams.\n\n### Scoped Loggers\n\nTo create a scoped logger from scratch, define the `scope` field inside the `options` object and pass it as argument to a new signale instance.\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  scope: 'global scope'\n};\n\nconst global = new Signale(options);\nglobal.success('Successful Operation');\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Scope Vanilla\" src=\"media\u002Fscope-vanilla.png\" width=\"65%\">\n\u003C\u002Fdiv>\n\nTo create a scoped logger based on an already existing one, use the `scope()` function, which will return a new signale instance, inheriting all custom loggers, timers, secrets, streams, configuration, log level, interactive mode & disabled statuses from the initial one.\n\n```js\nconst signale = require('signale');\n\nconst global = signale.scope('global scope');\nglobal.success('Hello from the global scope');\n\nfunction foo() {\n  const outer = global.scope('outer', 'scope');\n  outer.success('Hello from the outer scope');\n  \n  setTimeout(() => {\n    const inner = outer.scope('inner', 'scope'); \n    inner.success('Hello from the inner scope');\n  }, 500);\n}\n\nfoo();\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Scope Existing\" src=\"media\u002Fscope-existing.png\" width=\"65%\">\n\u003C\u002Fdiv>\n\n### Interactive Loggers\n\nTo initialize an interactive logger, create a new signale instance with the [`interactive`](#interactive) attribute set to `true`. While into the interactive mode, previously logged messages originating from an interactive logger, will be overridden only by new ones originating from the same or a different interactive logger. Note that regular messages originating from regular loggers are not overridden by the interactive ones.\n\n```js\nconst {Signale} = require('signale');\n\nconst interactive = new Signale({interactive: true, scope: 'interactive'});\n\ninteractive.await('[%d\u002F4] - Process A', 1);\n\nsetTimeout(() => {\n  interactive.success('[%d\u002F4] - Process A', 2);\n  setTimeout(() => {\n    interactive.await('[%d\u002F4] - Process B', 3);\n    setTimeout(() => {\n      interactive.error('[%d\u002F4] - Process B', 4);\n      setTimeout(() => {}, 1000);\n    }, 1000);\n  }, 1000);\n}, 1000);\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Interactive Mode\" src=\"media\u002Finteractive-mode.gif\" width=\"65%\">\n\u003C\u002Fdiv>\n\n### Writable Streams\n\nBy default, all signale instances log their messages to the `process.stdout` stream. This can be modified, to match your own preference, through the [`stream`](#stream) property, where you can define a single or multiple valid Writable streams, which will be used by all logger types to log your data. Additionally, it is possible to define one or more Writable streams exclusively for a specific logger type, thus write data independently from the rest logger types.\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  stream: process.stderr, \u002F\u002F All loggers will now write to `process.stderr`\n  types: {\n    error: {\n      \u002F\u002F Only `error` will write to both `process.stdout` & `process.stderr`\n      stream: [process.stdout, process.stderr]\n    }\n  }\n};\n\nconst signale = new Signale(options);\nsignale.success('Message will appear on `process.stderr`');\nsignale.error('Message will appear on both `process.stdout` & `process.stderr`');\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Writable Streams\" src=\"media\u002Fwritable-streams.png\" width=\"73%\">\n\u003C\u002Fdiv>\n\n### Secrets Filtering\n\nBy utilizing the `secrets` option, secrets and other sensitive information can be filtered out from the body as well as the metadata, i.e. scope names etc, of to-be-logged messages. The option is part of the configuration object passed to a `Signale` instance on its initialization, and is of type `Array\u003CString|Number>`. The array can hold multiple secrets, all of which are removed, if present, from the to-be-logged messages and are replaced with the default `'[secure]'` string. Additionally, when the unary `signale.scope(name)` function is used, the returned `Signale` instance inherits all the secrets belonging to its parent. The secrets checking process is performed in a **case-sensitive** manner. Also, the unary [`signale.addSecrets()`](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale#signaleaddsecretssecrets) and the nullary [`signale.clearSecrets()`](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale#signaleclearsecrets) functions are available through the API for adding and clearing secrets respectively.\n\nIt is **critical** and **highly recommended** to **not type directly secrets in your code**, thus the following example serves **only** as a simple & easily reproducible usage demonstration.\n\n```js\nconst {Signale} = require('signale');\n\n\u002F\u002F In reality secrets could be securely fetched\u002Fdecrypted through a dedicated API \nconst [USERNAME, TOKEN] = ['klaudiosinani', 'token'];\n\nconst logger1 = new Signale({\n  secrets: [USERNAME, TOKEN]\n});\n\nlogger1.log('$ exporting USERNAME=%s', USERNAME);\nlogger1.log('$ exporting TOKEN=%s', TOKEN);\n\n\u002F\u002F `logger2` inherits all secrets from its parent `logger1`\nconst logger2 = logger1.scope('parent');\n\nlogger2.log('$ exporting USERNAME=%s', USERNAME);\nlogger2.log('$ exporting TOKEN=%s', TOKEN);\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Secrets Filtering\" src=\"media\u002Ffilter-secrets.png\" width=\"73%\">\n\u003C\u002Fdiv>\n\n### Timers\n\nTimer are managed by the `time()` and `timeEnd()` functions. A unique label can be used to identify a timer on initialization, though if none is provided the timer will be assigned one automatically. In addition, calling the `timeEnd()` function without a specified label will have as effect the termination of the most recently initialized timer, that was created without providing a label.\n\n```js\nconst signale = require('signale');\n\nsignale.time('test');\nsignale.time();\nsignale.time();\n\nsetTimeout(() => {\n  signale.timeEnd();\n  signale.timeEnd();\n  signale.timeEnd('test');\n}, 500);\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Timers\" src=\"media\u002Ftimers.png\" width=\"60%\">\n\u003C\u002Fdiv>\n\n## Configuration\n\n### Global\n\nTo enable global configuration define the options under the `signale` namespace in your `package.json`.\n\nThe following illustrates all the available options with their respective default values.\n\n```json\n{\n  \"signale\": {\n    \"displayScope\": true,\n    \"displayBadge\": true,\n    \"displayDate\": false,\n    \"displayFilename\": false,\n    \"displayLabel\": true,\n    \"displayTimestamp\": false,\n    \"underlineLabel\": true,\n    \"underlineMessage\": false,\n    \"underlinePrefix\": false,\n    \"underlineSuffix\": false,\n    \"uppercaseLabel\": false\n  }\n}\n```\n\n\u003Cdetails>\n\u003Csummary>View all of the available options in detail.\u003C\u002Fsummary>\n\n##### `displayScope`\n\n- Type: `Boolean`\n- Default: `true`\n\nDisplay the scope name of the logger. \n\n##### `displayBadge`\n\n- Type: `Boolean`\n- Default: `true`\n\nDisplay the badge of the logger.\n\n##### `displayDate`\n\n- Type: `Boolean`\n- Default: `false`\n\nDisplay the current local date in `YYYY-MM-DD` format. \n\n##### `displayFilename`\n\n- Type: `Boolean`\n- Default: `false`\n\nDisplay the name of the file that the logger is reporting from.\n\n##### `displayLabel`\n\n- Type: `Boolean`\n- Default: `true`\n\nDisplay the label of the logger.\n\n##### `displayTimestamp`\n\n- Type: `Boolean`\n- Default: `false`\n\nDisplay the current local time in `HH:MM:SS` format.\n\n##### `underlineLabel`\n\n- Type: `Boolean`\n- Default: `true`\n\nUnderline the logger label.\n\n##### `underlineMessage`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnderline the logger message.\n\n##### `underlinePrefix`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnderline the logger prefix.\n\n##### `underlineSuffix`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnderline the logger suffix.\n\n##### `uppercaseLabel`\n\n- Type: `Boolean`\n- Default: `false`\n\nDisplay the label of the logger in uppercase.\n\n\u003C\u002Fdetails>\n\n### Local\n\nTo enable local configuration call the `config()` function on your signale instance. Local configurations will always override any pre-existing configuration inherited from `package.json`.\n\nIn the following example, loggers in the `foo.js` file will run under their own configuration, overriding the `package.json` one.\n\n```js\n\u002F\u002F foo.js\nconst signale = require('signale');\n\n\u002F\u002F Overrides any existing `package.json` config\nsignale.config({\n  displayFilename: true,\n  displayTimestamp: true,\n  displayDate: false\n}); \n\nsignale.success('Hello from the Global scope');\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Local Config\" src=\"media\u002Flocal-config.png\" width=\"65%\">\n\u003C\u002Fdiv>\n\nAlso, scoped loggers can have their own independent configuration, overriding the one inherited by the parent instance or `package.json`. \n\n```js\n\u002F\u002F foo.js\nconst signale = require('signale');\n\nsignale.config({\n  displayFilename: true,\n  displayTimestamp: true,\n  displayDate: false\n});\n\nsignale.success('Hello from the Global scope');\n\nfunction foo() {\n  \u002F\u002F `fooLogger` inherits the config of `signale`\n  const fooLogger = signale.scope('foo scope');\n\n  \u002F\u002F Overrides both `signale` and `package.json` configs\n  fooLogger.config({\n    displayFilename: true,\n    displayTimestamp: false,\n    displayDate: true\n  });\n\n  fooLogger.success('Hello from the Local scope');\n}\n\nfoo();\n```\n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"Scope Config\" src=\"media\u002Fscope-config.png\" width=\"65%\">\n\u003C\u002Fdiv>\n\n## API\n\n#### signale.`\u003Clogger>(message[, message]|messageObj|errorObj)`\n\n##### **`logger`**\n\n- Type: `Function`\n\nCan be any default or custom logger.\n\n##### **`message`**\n\n- Type: `String`\n\nCan be one or more comma delimited strings.\n\n```js\nconst signale = require('signale');\n\nsignale.success('Successful operation');\n\u002F\u002F=> ✔  success  Successful operation\n\nsignale.success('Successful', 'operation');\n\u002F\u002F=> ✔  success  Successful operation\n\nsignale.success('Successful %s', 'operation');\n\u002F\u002F=> ✔  success  Successful operation\n```\n\n##### **`errorObj`**\n\n- Type: `Error Object`\n\nCan be any error object.\n\n```js\nconst signale = require('signale');\n\nsignale.error(new Error('Unsuccessful operation'));\n\u002F\u002F=> ✖  error  Error: Unsuccessful operation\n\u002F\u002F        at Module._compile (module.js:660:30)\n\u002F\u002F        at Object.Module._extensions..js (module.js:671:10)\n\u002F\u002F        ...\n```\n\n##### **`messageObj`**\n\n- Type: `Object`\n\nCan be an object holding the `prefix`, `message` and `suffix` attributes, with `prefix` and `suffix` always prepended and appended respectively to the logged `message`.\n\n```js\nconst signale = require('signale');\n\nsignale.complete({prefix: '[task]', message: 'Fix issue #59', suffix: '(@klaudiosinani)'});\n\u002F\u002F=> [task] ☒  complete  Fix issue #59 (@klaudiosinani)\n\nsignale.complete({prefix: '[task]', message: ['Fix issue #%d', 59], suffix: '(@klaudiosinani)'});\n\u002F\u002F=> [task] ☒  complete  Fix issue #59 (@klaudiosinani)\n```\n\n#### signale.`scope(name[, name])`\n\nDefines the scope name of the logger.\n\n##### **`name`**\n\n- Type: `String`\n\nCan be one or more comma delimited strings.\n\n```js\nconst signale = require('signale');\n\nconst foo = signale.scope('foo'); \nconst fooBar = signale.scope('foo', 'bar');\n\nfoo.success('foo');\n\u002F\u002F=> [foo] › ✔  success  foo\n\nfooBar.success('foo bar');\n\u002F\u002F=> [foo] [bar] › ✔  success  foo bar\n```\n\n#### signale.`unscope()`\n\nClears the scope name of the logger.\n\n```js\nconst signale = require('signale');\n\nconst foo = signale.scope('foo'); \n\nfoo.success('foo');\n\u002F\u002F=> [foo] › ✔  success  foo\n\nfoo.unscope();\n\nfoo.success('foo');\n\u002F\u002F=> ✔  success  foo\n```\n\n#### signale.`config(settingsObj)`\n\nSets the configuration of an instance overriding any existing global or local configuration.\n\n##### **`settingsObj`**\n\n- Type: `Object`\n\nCan hold any of the documented [options](#global).\n\n```js\n\u002F\u002F foo.js\nconst signale = require('signale');\n\nsignale.config({\n  displayFilename: true,\n  displayTimestamp: true,\n  displayDate: true\n});\n\nsignale.success('Successful operations');\n\u002F\u002F=> [2018-5-15] [11:12:38] [foo.js] › ✔  success  Successful operations\n```\n\n#### signale.`time([, label])`\n\n- Return Type: `String`\n\nSets a timers and accepts an optional label. If none provided the timer will receive a unique label automatically.\n\nReturns a string corresponding to the timer label. \n\n##### **`label`**\n\n- Type: `String`\n\nLabel corresponding to the timer. Each timer must have its own unique label.\n\n```js\nconst signale = require('signale');\n\nsignale.time();\n\u002F\u002F=> ▶  timer_0  Initialized timer...\n\nsignale.time();\n\u002F\u002F=> ▶  timer_1  Initialized timer...\n\nsignale.time('label');\n\u002F\u002F=> ▶  label    Initialized timer...\n```\n\n#### signale.`timeEnd([, label])`\n\n- Return Type: `Object`\n\nDeactivates the timer to which the given label corresponds. If no label is provided the most recent timer, that was created without providing a label, will be deactivated.\n\nReturns an object `{label, span}` holding the timer label and the total running time.\n\n##### **`label`**\n\n- Type: `String`\n\nLabel corresponding to the timer, each timer has its own unique label.\n\n```js\nconst signale = require('signale');\n\nsignale.time();\n\u002F\u002F=> ▶  timer_0  Initialized timer...\n\nsignale.time();\n\u002F\u002F=> ▶  timer_1  Initialized timer...\n\nsignale.time('label');\n\u002F\u002F=> ▶  label    Initialized timer...\n\nsignale.timeEnd();\n\u002F\u002F=> ◼  timer_1  Timer run for: 2ms\n\nsignale.timeEnd();\n\u002F\u002F=> ◼  timer_0  Timer run for: 2ms\n\nsignale.timeEnd('label');\n\u002F\u002F=> ◼  label    Timer run for: 2ms\n```\n\n#### signale.`disable()`\n\nDisables the logging functionality of all loggers belonging to a specific instance.\n\n```js\nconst signale = require('signale');\n\nsignale.success('foo');\n\u002F\u002F=> ✔  success  foo\n\nsignale.disable();\n\nsignale.success('foo');\n\u002F\u002F=>\n```\n\n#### signale.`enable()`\n\nEnables the logging functionality of all loggers belonging to a specific instance.\n\n```js\nconst signale = require('signale');\n\nsignale.disable();\n\nsignale.success('foo');\n\u002F\u002F=>\n\nsignale.enable();\n\nsignale.success('foo');\n\u002F\u002F=> ✔  success  foo\n```\n\n#### signale.`isEnabled()`\n\nChecks whether the logging functionality of a specific instance is enabled.\n\n```js\nconst signale = require('signale');\n\nsignale.success('foo');\n\u002F\u002F=> ✔  success  foo\n\nsignale.isEnabled();\n\u002F\u002F => true\n\nsignale.disable();\n\nsignale.success('foo');\n\u002F\u002F=>\n\nsignale.isEnabled();\n\u002F\u002F => false\n```\n\n#### signale.`addSecrets(secrets)`\n\nAdds new secrets\u002Fsensitive-information to the targeted Signale instance.\n\n##### **`secrets`**\n\n- Type: `(String|Number)[]`\n\nArray holding the secrets\u002Fsensitive-information to be filtered out.\n\n```js\nconst signale = require('signale');\n\nsignale.log('$ exporting USERNAME=%s', 'klaudiosinani');\n\u002F\u002F=> $ exporting USERNAME=klaudiosinani\n\nsignale.addSecrets(['klaudiosinani']);\n\nsignale.log('$ exporting USERNAME=%s', 'klaudiosinani');\n\u002F\u002F=> $ exporting USERNAME=[secure]\n```\n\n#### signale.`clearSecrets()`\n\nRemoves all secrets\u002Fsensitive-information from the targeted Signale instance.\n\n```js\nconst signale = require('signale');\n\nsignale.addSecrets(['klaudiosinani']);\n\nsignale.log('$ exporting USERNAME=%s', 'klaudiosinani');\n\u002F\u002F=> $ exporting USERNAME=[secure]\n\nsignale.clearSecrets();\n\nsignale.log('$ exporting USERNAME=%s', 'klaudiosinani');\n\u002F\u002F=> $ exporting USERNAME=klaudiosinani\n```\n\n## Development\n\nFor more info on how to contribute to the project, please read the [contributing guidelines](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fblob\u002Fmaster\u002Fcontributing.md).\n\n- Fork the repository and clone it to your machine\n- Navigate to your local fork: `cd signale`\n- Install the project dependencies: `npm install` or `yarn install`\n- Lint code for errors: `npm test` or `yarn test`\n\n## Related\n\n- [qoa](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fqoa) - Minimal interactive command-line prompts\n- [taskbook](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Ftaskbook) - Tasks, boards & notes for the command-line habitat\n- [hyperocean](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fhyperocean) - Deep oceanic blue Hyper terminal theme\n\n## Who's Using It?\n\n- [Boostnote](https:\u002F\u002Fgithub.com\u002FBoostIO\u002FBoostnote)\n- [Docz](https:\u002F\u002Fgithub.com\u002Fpedronauck\u002Fdocz)\n- [Remix by Ethereum](https:\u002F\u002Fgithub.com\u002Fethereum\u002Fremix)\n- [Semantic Release](https:\u002F\u002Fgithub.com\u002Fsemantic-release\u002Fsemantic-release)\n- [Shower](https:\u002F\u002Fgithub.com\u002Fshower\u002Fshower)\n- [Taskbook](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Ftaskbook)\n- [Vant](https:\u002F\u002Fgithub.com\u002Fyouzan\u002Fvant)\n\nView in detail all the packages and repositories that are using Signale [here](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fnetwork\u002Fdependents).\n\n## Team\n\n- Klaudio Sinani [(@klaudiosinani)](https:\u002F\u002Fgithub.com\u002Fklaudiosinani)\n- Mario Sinani [(@mariosinani)](https:\u002F\u002Fgithub.com\u002Fmariosinani)\n\n## Sponsors\n\nA big thank you to all the people and companies supporting our Open Source work:\n\n- [Better Stack: Spot, Resolve, and Prevent Downtime.](https:\u002F\u002Fbetterstack.com\u002F)\n\n\n## License\n\n[MIT](https:\u002F\u002Fgithub.com\u002Fklaudiosinani\u002Fsignale\u002Fblob\u002Fmaster\u002Flicense.md)\n","Signale 是一个高度可配置的日志库，主要用于Node.js应用中的日志记录与状态报告。它提供了19种开箱即用的日志类型、集成计时器、自定义插件式日志记录器等核心功能，并支持TypeScript及多种输出格式定制。此外，Signale还具备敏感信息过滤、文件名和时间戳支持等功能，使得日志更加安全且易于管理。其简洁的API设计和全局配置选项使其成为开发人员在构建需要复杂日志处理能力的应用程序时的理想选择，特别适用于需要高度灵活性和美观输出的场景中。",2,"2026-06-11 03:26:57","top_topic"]