{"id":24869934,"url":"https://github.com/vitalishapovalov/log","last_synced_at":"2025-10-15T14:31:12.589Z","repository":{"id":37879143,"uuid":"195213500","full_name":"vitalishapovalov/Log","owner":"vitalishapovalov","description":"Declarative javascript logging","archived":false,"fork":false,"pushed_at":"2023-03-01T07:57:13.000Z","size":2849,"stargazers_count":18,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-15T13:17:49.073Z","etag":null,"topics":["declarative-logging","developer-tools","logger","logging","logs","typescript","utilities","utility-library"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vitalishapovalov.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-04T09:39:44.000Z","updated_at":"2023-03-14T00:09:47.000Z","dependencies_parsed_at":"2023-02-02T02:31:36.358Z","dependency_job_id":null,"html_url":"https://github.com/vitalishapovalov/Log","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitalishapovalov%2FLog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitalishapovalov%2FLog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitalishapovalov%2FLog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitalishapovalov%2FLog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vitalishapovalov","download_url":"https://codeload.github.com/vitalishapovalov/Log/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236615473,"owners_count":19177564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["declarative-logging","developer-tools","logger","logging","logs","typescript","utilities","utility-library"],"created_at":"2025-02-01T03:36:10.183Z","updated_at":"2025-10-15T14:31:07.149Z","avatar_url":"https://github.com/vitalishapovalov.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Automated, styled, declarative javascript debugging (logging)\n\n[![npm version](https://badge.fury.io/js/%40js-utilities%2Flog.svg)](https://badge.fury.io/js/%40js-utilities%2Flog)\n![license](https://img.shields.io/github/license/vitalishapovalov/js-utilities.svg)\n[![Build Status](https://travis-ci.org/vitalishapovalov/log.svg?branch=master)](https://travis-ci.org/vitalishapovalov/log)\n\nAn utility to automatically log object properties access/set/delete etc., descriptor modification, function calls and a lot [more](#options) in a human-readable way.\n\nIn Browser\n\n![browser output](https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/1.png)\n\nIn Node.js\n\n![node.js output](https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/2.png)\n\nCan be used to inject [logger](#instance-logger), has `Light` and `Dark` predefined themes\n\n![instance logger](https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/3-4.png)\n\n## Table of Contents\n\n* [Installation](#installation)\n* [Usage](#usage)\n  * [Decorator](#decorator)\n    * [Class](#class)\n    * [Method/Getter/Setter](#method/getter/setter)\n    * [Property](#property)\n    * [Parameter](#parameter)\n  * [Function](#function)\n    * [Objects](#objects)\n    * [Functions](#functions)\n  * [Instance logger](#instance-logger)\n    * [Providing \u0026 Interface](#providing--interface)\n    * [Styling](#styling)\n    * [Logger usage](#logger-usage)\n  * [Frameworks](#frameworks)\n    * [React](#react)\n    * [Nest](#nest)\n    * [Vue](#vue)\n    * [Angular](#angular)\n    * [Other](#other)\n    * [Framework config](#framework-config)\n  * [Options](#options)\n* [Requirements](#requirements)\n\n## Installation\n\n```bash\nnpm i -S @js-utilities/log\n```\n\n## Usage\n\n### Decorator\n\nBefore using `@Log` as decorator, make sure that `decorators` are supported in your build:\n\n* JavaScript\n\nDecorators are not part of ECMAScript 2016 (aka 7). Decorators are currently in [Stage 2 Draft](https://tc39.es/proposal-decorators/) out of the total 4 stages a feature goes through before being finalized and becoming part of the language.\nSo, to use it, you should transform your code with transpilers (e.g. [Babel](https://babeljs.io/) and [proposal-decorators](https://babeljs.io/docs/en/babel-plugin-proposal-decorators) plugin)\n\n* TypeScript\n\nDecorators are available as an experimental feature of TypeScript. Official instruction [here](https://www.typescriptlang.org/docs/handbook/decorators.html).\n\n`@Log` decorator can be used in different ways:\n\n```typescript\n// package will automatically detect wether you need browser or node version\nimport { Log } from \"@js-utilities/log\";\n\n// default, no options provided\n@Log\nclass MyClass {}\n\n// with options\n@Log({ logExecutionTime: true })\nclass MyClass {}\n\n// shorthand for @Log({ name: \"MyLogger\" })\n@Log(\"MyLogger\")\nclass MyClass {}\n```\n\nIf you want to explicitly import browser / node version:\n\n```typescript\n// browser\nimport { Log } from \"@js-utilities/log/dist/browser\";\n\n// node\nimport { Log } from \"@js-utilities/log/dist/node\";\n```\n\n#### Class\n\nWhen used as a class decorator, will log:\n\n* all methods, getters and setters calls\n\n* properties accessing / setting\n\nHere you can define which properties to log, setup log of prototype getting/setting, constructing, defining and deleting properties and a lot [more](#options).\n\nExample with property set:\n\n```javascript\nimport { Log } from \"@js-utilities/log\";\n\n@Log\nclass MyClass {}\n\nnew MyClass().myProp = \"value\";\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/5.png\" alt=\"console output\" width=\"350\" /\u003e\n\nAlso, it can be used as a decorator, but without decorators syntax:\n\n```typescript\nimport { Log } from \"@js-utilities/log\";\n\n// with options\nexport default Log({ provideLogger: true })(class MyClass {});\n\n// without options\nexport default Log(class MyClass {});\n```\n\n#### Method/Getter/Setter\n\nWhen used as a method/getter/setter or a `static` method/getter/setter decorator, will log all of the calls.\n\n```javascript\nimport { Log } from \"@js-utilities/log\";\n\nclass MyClass {\n  @Log\n  myMethod() {\n    return [\"string1\", \"string2\"];\n  }\n}\n\nnew MyClass().myMethod();\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/6.png\" alt=\"console output\" width=\"350\" /\u003e\n\nAlso, can be used to override already declared options of owner class.\n\nFor example:\n\nDisable specific method logging:\n\n```typescript\n@Log\nclass MyClass {\n    \n  @Log({ log: false })\n  get prop() {\n    return [\"string1\", \"string2\"];\n  }\n}\n```\n\nOverriding `name` option for specific method:\n\n```typescript\n@Log\nclass MyClass {\n    \n  @Log(\"Special name\")\n  myMethod() {\n    return [\"string1\", \"string2\"];\n  }\n}\n```\n\nAlso, if class owner has `@Log` declaration, method logger will use class's options and merge them with method's `@Log` declaration options. Not for static method/getter/setter.\n\n```typescript\n@Log({ logTimeStamp: true })\nclass MyClass {\n    \n  @Log({ logExecutionTime: true })\n  myMethod() {\n    return [\"string1\", \"string2\"];\n  }\n}\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/7.png\" alt=\"console output\" width=\"350\" /\u003e\n\nIf method return value type is `Promise`, logger will resolve it's value and log it, instead of promise object. Execution time will also be re-calculated.\n\n#### Property\n\nCan be used on a property, but due to some limitations, only along with class decorator.\n\nSame as in [method/get/set](#method/get/set), property decorator can used to override log options for the specific property.\n\n```typescript\nimport { Log } from \"@js-utilities/log\";\n\n@Log({ logTimeStamp: true })\nclass MyClass {\n    \n  @Log({\n    name: \"'prop' with initial value 2000\",\n    logTimeStamp: false,\n  })\n  prop = 1000;\n}\n\nnew MyClass().prop = 2000;\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/8.png\" alt=\"console output\" width=\"350\" /\u003e\n\n#### Parameter\n\nFor the moment, the only reason to use `@Log` as parameter decorator is to extend specific param log output.\n\nNormally, to avoid logs polluting, Arrays and Objects will be printed as `Array` and `Object` correspondingly.\n\nTo log array/object entries, decorate it with `@Log` and provide max amount of entries to print `@Log(2)`.\n\n```typescript\nimport { Log } from \"@js-utilities/log\";\n\nclass MyClass {\n    \n  @Log\n  myMethod(@Log(2) arr1, arr2) {\n      return null;\n  }\n}\n\nnew MyClass().myMethod([\"val1\", 100, 200], [\"val2\"]);\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/9.png\" alt=\"console output\" width=\"350\" /\u003e\n\n### Function\n\nIf you need to log an already instantiated class or a plain object or a function - you need `log` function.\n\n`log` function accepts 2 arguments: entity to log and options (optional)\n\n```typescript\nimport { log } from \"@js-utilities/log\";\n\n// default, no options provided\nconst logObject = log({ param: \"value\" });\n\n// with options\nconst logObject = log({ param: \"value\" }, { logTimeStamp: true });\n\n// shorthand for log(entity, { name: \"MyLogger\" })\nconst logObject = log({ param: \"value\" }, \"MyLogger\");\n```\n\n#### Objects\n\nWorks the same way as for [class](#class), except for some options. Some of them are pointless (`logConstructor`, `logSubclass`):\n\n```typescript\nimport { log } from \"@js-utilities/log\";\n\nconst object = {\n    myMethod() {\n        return \"value\";\n    }\n};\n\nconst logObject = log(object, {\n    name: \"MyObject\",\n    logExecutionTime: true\n});\n\nlogObject.myMethod();\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/10.png\" alt=\"console output\" width=\"350\" /\u003e\n\n#### Functions\n\n`log` with functions used the same as for [objects](#objects):\n\n```typescript\nimport { log } from \"@js-utilities/log\";\n\nconst logObject = log(function (arg) { return null; }, \"MyFunction\");\n\nlogObject({ param: \"value\" });\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/11.png\" alt=\"console output\" width=\"350\" /\u003e\n\n### Instance logger\n\n#### Providing \u0026 Interface\n\nIf there is a need to use log-like styling imperatively, you can access special `logger` object:\n\n1) via [class](#class) `@Log` decorator\n\n2) via `log` function\n\nYou can enable it with `provideLogger` option set to true. You can configure provided logger via `loggerOptions` option.\n\n`logger` interface:\n\n```typescript\ninterface InstanceMessageLogger {\n    log(msg: string, ...args: any[]): void;\n    info(msg: string, ...args: any[]): void;\n    warn(msg: string, ...args: any[]): void;\n    error(msg: string, ...args: any[]): void;\n}\n```\n\n`loggerOptions` option:\n\n```typescript\ntype InstanceMessageLoggerOptions = {\n    logName?: boolean;\n    logTimeStamp?: boolean;\n    logMs?: boolean;\n    logSuffix?: boolean | string;\n}\n```\n\n#### Styling\n\nFor styling in browser [template-colors-web](https://github.com/icodeforlove/template-colors-web) is used, and [chalk](https://github.com/chalk/chalk) is used for node.js.\n\nLogger will style your message based on provided options theme.\n\nAlso, it will parse and paint some values in corresponding theme color:\n\n* `$string()`\n\n* `$number()`\n\n#### Logger usage\n\nExample:\n\n```typescript\nimport { Log } from \"@js-utilities/log\";\n\n@Log({ provideLogger: true })\nclass MyClass {\n    myMethod() {\n        this.logger.warn(\"styling $string(string), $number(1000)\");\n    }\n}\n\nnew MyClass().myMethod();\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/12.png\" alt=\"console output\" width=\"350\" /\u003e\n\n##### Usage in TypeScript\n\nIn TypeScript, you should declare `logger` before using:\n\n```typescript\nimport { Log, InstanceMessageLogger } from \"@js-utilities/log\";\n\n@Log({ provideLogger: true })\nclass MyClass {\n    readonly logger!: InstanceMessageLogger;\n}\n```\n\n### Frameworks\n\nUsually, framework entities (e.g. React/Angular components) do a lot of work under the hood of an object that we don't need to know about.\n\nLogging them will pollute console with unwanted information. But we don't know how to distinct tech. properties/hooks.\n\nSo we need to explicitly define which properties should be logged and which should be logged in a special way.\n\nFrameworks are detected on-the-fly, but can be forced by providing framework name in logger options. Even if provided with empty object.\n\nList of framework, which are detected and filtered by `Log`:\n\n* [React 0.14+](https://github.com/facebook/react/)\n* [Nest 6+](https://docs.nestjs.com/)\n* [Vue 2+](https://vuejs.org)\n* [Angular 7+](https://angular.io/)\n\n#### React\n\n```typescript\nimport * as React from \"react\";\nimport { Log } from \"@js-utilities/log\";\n\n@Log({\n    react: { logHooks: true }\n})\nclass MyComponent extends React.Component {\n    render() {\n        return null;\n    }\n}\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/13.png\" alt=\"console output\" width=\"350\" /\u003e\n\n#### Nest\n\n##### On-class usage:\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { Log } from \"@js-utilities/log\";\n\n@Log({ nest: { logHooks: true } })\n@Module({\n  imports: [],\n})\nexport class AppModule {\n  configure() {\n    return {};\n  }\n}\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/14.png\" alt=\"console output\" width=\"350\" /\u003e\n\n##### HTTP methods\n\n```typescript\nimport { Controller, Get } from '@nestjs/common';\nimport { Log } from \"@js-utilities/log\";\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n  constructor(private readonly appService: AppService) {}\n\n  @Get(\"hello\")\n  @Log({\n    logTimeStamp: true,\n    logExecutionTime: true,\n  })\n  async getHello(): Promise\u003cstring\u003e {\n    await this.appService.asyncAction();\n    return this.appService.getHello();\n  }\n}\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/15.png\" alt=\"console output\" width=\"350\" /\u003e\n\n#### Vue\n\n##### On-object usage\n\nIt is important to define `vue` in provided logger options when using with `log` function, at least with empty object as a value.\nIt's needed to distinct common objects from vue components.\n\n```vue\n\u003cscript\u003e\nimport { log } from \"@js-utilities/log\";\n\nexport default log({\n  name: 'HelloWorld',\n  props: { msg: String }\n}, {\n  vue: { logHooks: true }\n});\n\u003c/script\u003e\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/16.png\" alt=\"console output\" width=\"350\" /\u003e\n\n##### On-class usage\n\n```vue\n\u003cscript lang=\"ts\"\u003e\nimport { Log } from '@js-utilities/log';\nimport { Component, Vue } from 'vue-property-decorator';\n\n@Log\n@Component\nexport default class HelloWorld extends Vue {\n\n  @Log\n  protected mounted() {\n    this.method();\n  }\n\n  private method() {\n    return 'Mounted!';\n  }\n}\n\u003c/script\u003e\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/17.png\" alt=\"console output\" width=\"400\" /\u003e\n\n#### Angular\n\nEnsure that you have `reflect-metadata` polyfill and `\"emitDecoratorMetadata\": true` set in `tsconfig.json`.\n\n```typescript\nimport { Component } from '@angular/core';\nimport { Log } from \"@js-utilities/log\";\n\n@Log({\n  angular: { logHooks: true }\n})\n@Component({\n  selector: 'app-root',\n  templateUrl: './app.component.html',\n  styleUrls: ['./app.component.scss']\n})\nexport class AppComponent {\n  prop: string;\n  ngOnInit() {\n    this.prop = \"value\";\n  }\n}\n```\n\nConsole output:\n\n\u003cimg src=\"https://raw.githubusercontent.com/vitalishapovalov/js-utilities/master/docs/18.png\" alt=\"console output\" width=\"350\" /\u003e\n\n#### Other\n\nTo avoid console polluting with other frameworks / libraries, disable all props logging and enable only wanted ones explicitly:\n\n```typescript\nimport { Log } from \"@js-utilities/log\";\n\n@Log({ logProperties: [\"myProp\"] })\nclass MyClass extends FrameworkEntity {\n    myProp = \"value\";\n}\n```\n\n#### Framework config\n\nFramework configuration description:\n\n```typescript\ntype FrameworkConfig = {\n    \n    /**\n     * Technical properties to log (e.g. \"updater\", \"_reactInternalFiber\", \"__file\").\n     * \n     * @default undefined\n     */\n    logTechnical?: boolean | string[];\n    \n    /**\n     * State to log (e.g. \"state\").\n     * \n     * @default undefined\n     */\n    logState?: boolean | string[];\n    \n    /**\n     * Props to log (e.g. \"props\").\n     * \n     * @default undefined\n     */\n    logProps?: boolean | string[];\n    \n    /**\n     * Hooks to log (e.g. \"render\", \"shouldComponentUpdate\", \"onModuleInit\").\n     * \n     * @default undefined\n     */\n    logHooks?: boolean | string[];\n    \n    /**\n     * Refs to log (e.g. \"refs\").\n     * \n     * @default undefined\n     */\n    logRefs?: boolean | string[];\n    \n    /**\n     * Context to log (e.g. \"context\").\n     * \n     * @default undefined\n     */\n    logContext?: boolean | string[];\n    \n    /**\n     * Other framework properties to log (e.g. \"setState\", \"forceUpdate\", \"intercept\").\n     * \n     * @default undefined\n     */\n    logOther?: boolean | string[];\n    \n    /**\n     * Default log depth for framework properties.\n     * \n     * @default 1\n     */\n    argsLogDepth?: number;\n}\n```\n\n### Options\n\nLog library is highly-configurable and there are a lot of options available:\n\n```typescript\ntype LoggerOptions = {\n    \n    /**\n     * Name of the logger.\n     * All messages will be prepended with this field's value.\n     *\n     * @default function or class name\n     */\n    name?: string | number;\n\n    /**\n     * Flag for enabling/disabling Logger name logging.\n     *\n     * @default true\n     */\n    logName?: boolean;\n\n    /**\n     * Console method which will be used to output messages.\n     *\n     * @default \"log\"\n     */\n    consoleMethod?: \"log\" | \"group\" | \"groupCollapsed\" | \"groupEnd\" | \"warn\" | \"info\";\n\n    /**\n     * Logger theme. If object will be provided, \"dark\" will be used as main theme\n     * and overridden with provided object properties.\n     *\n     * @default \"dark\"\n     */\n    theme?: \"dark\" | \"light\" | LoggerTheme;\n\n    /**\n     * InstanceMessageLogger description can be found in Instance logger section of readme.\n     *\n     * @default false\n     */\n    provideLogger?: boolean;\n\n    /**\n     * InstanceMessageLogger description can be found in Instance logger section of readme.\n     *\n     * @default { logTimeStamp: true, logSuffix: true }\n     */\n    loggerOptions?: InstanceMessageLoggerOptions;\n    \n    /**\n     * Will be invoked on every log, right before writing to console.\n     * Can prevent log by returning \"false\".\n     *\n     * @param {LogData} logData   collected data of proxy trap\n     *\n     * @return {Boolean} log decorated message to console or no\n     */\n    logInterceptor?(logData: LogData): boolean;\n\n    /**\n     * Flag for enabling/disabling logging.\n     *\n     * @default true\n     */\n    log?: boolean;\n\n    /**\n     * The same as \"logProperties\", but for all types of the property manipulation.\n     * (e.g. \"prop\" in class, delete class[\"prop\"], getOwnPropertyDescriptor)\n     *\n     * @default false\n     */\n    logPropertiesFull?: boolean | PropertyKey[];\n\n    /**\n     * Some object just can't fit into well-looking console output,\n     * so you can force logger to log full objects separately\n     * right after the log message.\n     *\n     * @default false\n     */\n    logExtensibleObjects?: boolean;\n\n    /**\n     * Option to control \"toString()\", \"valueOf()\" and other well-known calls.\n     *\n     * @default false\n     */\n    logWellKnownSymbols?: boolean | Symbol[];\n\n    /**\n     * Option to control \"hasOwnProperty\" and other Object.prototype calls.\n     *\n     * @default false\n     */\n    logProtoMethods?: boolean | string[];\n\n    /**\n     * Will append execution time (of method call etc.) raw to every log message.\n     * In browser: Performance API, in Node.js - \"perf_hooks\" core module.\n     *\n     * @default false\n     */\n    logExecutionTime?: boolean;\n\n    /**\n     * Add timestamp for each log message.\n     *\n     * @default true\n     */\n    logTimeStamp?: boolean;\n\n    /**\n     * Alternative for @Log parameter decorator.\n     * Array of depth log for each argument.\n     *\n     * If you want to set log depth 5 only for the second parameter:\n     * argsLogDepth: [null, 5]\n     *\n     * @default []\n     */\n    argsLogDepth?: (number | null | undefined)[];\n\n    /**\n     * Log class constructing.\n     *\n     * @default false\n     */\n    logConstructor?: boolean;\n\n    /**\n     * Log getPrototypeOf calls to the class.\n     *\n     * @default false\n     */\n    logGetPrototypeOf?: boolean;\n\n    /**\n     * Log setPrototypeOf calls to the class.\n     *\n     * @default false\n     */\n    logSetPrototypeOf?: boolean;\n\n    /**\n     * Log isExtensible calls to the class.\n     *\n     * @default false\n     */\n    logIsExtensible?: boolean;\n\n    /**\n     * Log preventExtensions calls to the class.\n     *\n     * @default false\n     */\n    logPreventExtensions?: boolean;\n\n    /**\n     * A list of properties (or boolean to affect all of them),\n     * whose accessing/setting/calling will be logged.\n     *\n     * @default true\n     */\n    logProperties?: boolean | PropertyKey[];\n\n    /**\n     * A list of properties (or boolean to affect all of them),\n     * whose getOwnPropertyDescriptor calls will be logged.\n     *\n     * @default false\n     */\n    logGetOwnPropertyDescriptor?: boolean | PropertyKey[];\n\n    /**\n     * A list of properties (or boolean to affect all of them),\n     * whose \"prop in Obj\" checks will be logged.\n     *\n     * @default false\n     */\n    logInOperator?: boolean | PropertyKey[];\n\n    /**\n     * A list of properties (or boolean to affect all of them),\n     * whose \"delete prop\" executions will be logged.\n     *\n     * @default false\n     */\n    logDeleteProperty?: boolean | PropertyKey[];\n\n    /**\n     * A list of properties (or boolean to affect all of them),\n     * whose defineProperty calls will be logged.\n     *\n     * @default false\n     */\n    logDefineProperty?: boolean | PropertyKey[];\n\n    /**\n     * A list of properties (or boolean to affect all of them),\n     * whose defineProperty calls will be logged.\n     *\n     * @default false\n     */\n    logOwnKeys?: boolean;\n\n    /**\n     * Log entity invocation (usually a function, but also\n     * might be a class extending Function).\n     *\n     * @default true\n     */\n    logInvocation?: boolean;\n}\n```\n\n## Environment requirements\n\n* `Proxy` support\n* `Reflect` support\n\n## License\n\n[MIT License](https://github.com/vitalishapovalov/js-utilities/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvitalishapovalov%2Flog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvitalishapovalov%2Flog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvitalishapovalov%2Flog/lists"}