Browse Source

chore: adds withoutGlobalNs() method

e22m4u 6 months ago
parent
commit
0563433ed7
5 changed files with 74 additions and 10 deletions
  1. 16 1
      README.md
  2. 11 3
      dist/cjs/index.cjs
  3. 12 0
      src/create-debugger.d.ts
  4. 20 6
      src/create-debugger.js
  5. 15 0
      src/create-debugger.spec.js

+ 16 - 1
README.md

@@ -105,7 +105,7 @@ debug3('Hello world');
 // myApp:myService Hello world
 // myApp:myService Hello world
 ```
 ```
 
 
-Использование пространства имен из переменной окружения.
+Использование пространства имен из переменной окружения `DEBUGGER_NAMESPACE`.
 
 
 ```js
 ```js
 import {createDebugger} from '@e22m4u/js-debug';
 import {createDebugger} from '@e22m4u/js-debug';
@@ -117,6 +117,21 @@ debug('Hello world');
 // myApp Hello world
 // myApp Hello world
 ```
 ```
 
 
+Исключение пространства имен из переменной окружения `DEBUGGER_NAMESPACE`.
+
+```js
+import {createDebugger} from '@e22m4u/js-debug';
+
+process.env['DEBUGGER_NAMESPACE'] = 'myApp';
+
+const debug1 = createDebugger();
+const debug2 = debug1.withoutGlobalNs();
+debug1('Hello world');
+debug2('Hello world');
+// myApp Hello world
+// Hello world
+```
+
 Расширение сегментов пространства имен.
 Расширение сегментов пространства имен.
 
 
 ```js
 ```js

+ 11 - 3
dist/cjs/index.cjs

@@ -202,6 +202,7 @@ function createDebugger(namespaceOrOptions = void 0, ...namespaceSegments) {
   }
   }
   const withCustomState = isNonArrayObject(namespaceOrOptions);
   const withCustomState = isNonArrayObject(namespaceOrOptions);
   const state = withCustomState ? namespaceOrOptions : {};
   const state = withCustomState ? namespaceOrOptions : {};
+  state.globalNsSegments = Array.isArray(state.globalNsSegments) ? state.globalNsSegments : [];
   state.nsSegments = Array.isArray(state.nsSegments) ? state.nsSegments : [];
   state.nsSegments = Array.isArray(state.nsSegments) ? state.nsSegments : [];
   state.pattern = typeof state.pattern === "string" ? state.pattern : "";
   state.pattern = typeof state.pattern === "string" ? state.pattern : "";
   state.hash = typeof state.hash === "string" ? state.hash : "";
   state.hash = typeof state.hash === "string" ? state.hash : "";
@@ -210,7 +211,7 @@ function createDebugger(namespaceOrOptions = void 0, ...namespaceSegments) {
   state.delimiter = state.delimiter && typeof state.delimiter === "string" ? state.delimiter : ":";
   state.delimiter = state.delimiter && typeof state.delimiter === "string" ? state.delimiter : ":";
   if (!withCustomState) {
   if (!withCustomState) {
     if (typeof process !== "undefined" && process.env && process.env["DEBUGGER_NAMESPACE"]) {
     if (typeof process !== "undefined" && process.env && process.env["DEBUGGER_NAMESPACE"]) {
-      state.nsSegments.push(process.env.DEBUGGER_NAMESPACE);
+      state.globalNsSegments.push(process.env.DEBUGGER_NAMESPACE);
     }
     }
     if (typeof namespaceOrOptions === "string")
     if (typeof namespaceOrOptions === "string")
       state.nsSegments.push(namespaceOrOptions);
       state.nsSegments.push(namespaceOrOptions);
@@ -229,7 +230,9 @@ function createDebugger(namespaceOrOptions = void 0, ...namespaceSegments) {
     state.pattern = localStorage.getItem("debug");
     state.pattern = localStorage.getItem("debug");
   }
   }
   const isDebuggerEnabled = /* @__PURE__ */ __name(() => {
   const isDebuggerEnabled = /* @__PURE__ */ __name(() => {
-    const nsStr = state.nsSegments.join(state.delimiter);
+    const nsStr = [...state.globalNsSegments, ...state.nsSegments].join(
+      state.delimiter
+    );
     const patterns = state.pattern.split(/[\s,]+/).filter((p) => p.length > 0);
     const patterns = state.pattern.split(/[\s,]+/).filter((p) => p.length > 0);
     if (patterns.length === 0 && state.pattern !== "*") return false;
     if (patterns.length === 0 && state.pattern !== "*") return false;
     for (const singlePattern of patterns) {
     for (const singlePattern of patterns) {
@@ -239,7 +242,7 @@ function createDebugger(namespaceOrOptions = void 0, ...namespaceSegments) {
   }, "isDebuggerEnabled");
   }, "isDebuggerEnabled");
   const getPrefix = /* @__PURE__ */ __name(() => {
   const getPrefix = /* @__PURE__ */ __name(() => {
     let tokens = [];
     let tokens = [];
-    [...state.nsSegments, state.hash].filter(Boolean).forEach((token) => {
+    [...state.globalNsSegments, ...state.nsSegments, state.hash].filter(Boolean).forEach((token) => {
       const extractedTokens = token.split(state.delimiter).filter(Boolean);
       const extractedTokens = token.split(state.delimiter).filter(Boolean);
       tokens = [...tokens, ...extractedTokens];
       tokens = [...tokens, ...extractedTokens];
     });
     });
@@ -315,6 +318,11 @@ function createDebugger(namespaceOrOptions = void 0, ...namespaceSegments) {
     stateCopy.offsetSize = offsetSize;
     stateCopy.offsetSize = offsetSize;
     return createDebugger(stateCopy);
     return createDebugger(stateCopy);
   };
   };
+  debugFn.withoutGlobalNs = function() {
+    const stateCopy = JSON.parse(JSON.stringify(state));
+    stateCopy.globalNsSegments = [];
+    return createDebugger(stateCopy);
+  };
   return debugFn;
   return debugFn;
 }
 }
 __name(createDebugger, "createDebugger");
 __name(createDebugger, "createDebugger");

+ 12 - 0
src/create-debugger.d.ts

@@ -5,6 +5,7 @@
 export interface Debugger {
 export interface Debugger {
   /**
   /**
    * Выводит отладочное сообщение или дамп данных.
    * Выводит отладочное сообщение или дамп данных.
+   *
    * @param messageOrData Строка сообщения (с опциональными
    * @param messageOrData Строка сообщения (с опциональными
    *   спецификаторами формата) или данные для дампа.
    *   спецификаторами формата) или данные для дампа.
    * @param args Дополнительные аргументы для форматирования сообщения
    * @param args Дополнительные аргументы для форматирования сообщения
@@ -15,6 +16,7 @@ export interface Debugger {
   /**
   /**
    * Создает новый экземпляр отладчика с добавленным сегментом
    * Создает новый экземпляр отладчика с добавленным сегментом
    * пространства имен.
    * пространства имен.
+   *
    * @param namespace Сегмент пространства имен для добавления.
    * @param namespace Сегмент пространства имен для добавления.
    * @param args Дополнительные сегменты пространства имен для
    * @param args Дополнительные сегменты пространства имен для
    *   добавления.
    *   добавления.
@@ -27,6 +29,7 @@ export interface Debugger {
   /**
   /**
    * Создает новый экземпляр отладчика со статическим случайным хэшем,
    * Создает новый экземпляр отладчика со статическим случайным хэшем,
    * добавляемым к префиксу.
    * добавляемым к префиксу.
+   *
    * @param hashLength Желаемая длина шестнадцатеричного хэша
    * @param hashLength Желаемая длина шестнадцатеричного хэша
    *   (по умолчанию: 4).
    *   (по умолчанию: 4).
    * @returns Новый экземпляр Debugger.
    * @returns Новый экземпляр Debugger.
@@ -37,6 +40,7 @@ export interface Debugger {
 
 
   /**
   /**
    * Создает новый экземпляр отладчика с отступом для его сообщений.
    * Создает новый экземпляр отладчика с отступом для его сообщений.
+   *
    * @param offsetSize Количество шагов отступа (положительное
    * @param offsetSize Количество шагов отступа (положительное
    *   целое число).
    *   целое число).
    * @returns Новый экземпляр Debugger.
    * @returns Новый экземпляр Debugger.
@@ -44,6 +48,14 @@ export interface Debugger {
    *   числом.
    *   числом.
    */
    */
   withOffset(offsetSize: number): Debugger;
   withOffset(offsetSize: number): Debugger;
+
+  /**
+   * Создает новый экземпляр отладчика без глобальных пространств имен
+   * (исключает пространство имен из переменной окружения DEBUGGER_NAMESPACE).
+   *
+   * @returns Новый экземпляр Debugger.
+   */
+  withoutGlobalNs(): Debugger;
 }
 }
 
 
 /**
 /**

+ 20 - 6
src/create-debugger.js

@@ -132,6 +132,9 @@ export function createDebugger(
   // для хранения текущих настроек
   // для хранения текущих настроек
   const withCustomState = isNonArrayObject(namespaceOrOptions);
   const withCustomState = isNonArrayObject(namespaceOrOptions);
   const state = withCustomState ? namespaceOrOptions : {};
   const state = withCustomState ? namespaceOrOptions : {};
+  state.globalNsSegments = Array.isArray(state.globalNsSegments)
+    ? state.globalNsSegments
+    : [];
   state.nsSegments = Array.isArray(state.nsSegments) ? state.nsSegments : [];
   state.nsSegments = Array.isArray(state.nsSegments) ? state.nsSegments : [];
   state.pattern = typeof state.pattern === 'string' ? state.pattern : '';
   state.pattern = typeof state.pattern === 'string' ? state.pattern : '';
   state.hash = typeof state.hash === 'string' ? state.hash : '';
   state.hash = typeof state.hash === 'string' ? state.hash : '';
@@ -157,7 +160,7 @@ export function createDebugger(
       process.env &&
       process.env &&
       process.env['DEBUGGER_NAMESPACE']
       process.env['DEBUGGER_NAMESPACE']
     ) {
     ) {
-      state.nsSegments.push(process.env.DEBUGGER_NAMESPACE);
+      state.globalNsSegments.push(process.env.DEBUGGER_NAMESPACE);
     }
     }
     // если первый аргумент содержит значение,
     // если первый аргумент содержит значение,
     // то оно используется как пространство имен
     // то оно используется как пространство имен
@@ -191,7 +194,9 @@ export function createDebugger(
   // формирование функции для проверки
   // формирование функции для проверки
   // активности текущего отладчика
   // активности текущего отладчика
   const isDebuggerEnabled = () => {
   const isDebuggerEnabled = () => {
-    const nsStr = state.nsSegments.join(state.delimiter);
+    const nsStr = [...state.globalNsSegments, ...state.nsSegments].join(
+      state.delimiter,
+    );
     const patterns = state.pattern.split(/[\s,]+/).filter(p => p.length > 0);
     const patterns = state.pattern.split(/[\s,]+/).filter(p => p.length > 0);
     if (patterns.length === 0 && state.pattern !== '*') return false;
     if (patterns.length === 0 && state.pattern !== '*') return false;
     for (const singlePattern of patterns) {
     for (const singlePattern of patterns) {
@@ -203,10 +208,12 @@ export function createDebugger(
   // для сообщений отладки
   // для сообщений отладки
   const getPrefix = () => {
   const getPrefix = () => {
     let tokens = [];
     let tokens = [];
-    [...state.nsSegments, state.hash].filter(Boolean).forEach(token => {
-      const extractedTokens = token.split(state.delimiter).filter(Boolean);
-      tokens = [...tokens, ...extractedTokens];
-    });
+    [...state.globalNsSegments, ...state.nsSegments, state.hash]
+      .filter(Boolean)
+      .forEach(token => {
+        const extractedTokens = token.split(state.delimiter).filter(Boolean);
+        tokens = [...tokens, ...extractedTokens];
+      });
     let res = tokens.reduce((acc, token, index) => {
     let res = tokens.reduce((acc, token, index) => {
       const isLast = tokens.length - 1 === index;
       const isLast = tokens.length - 1 === index;
       const tokenColor = pickColorCode(token);
       const tokenColor = pickColorCode(token);
@@ -290,5 +297,12 @@ export function createDebugger(
     stateCopy.offsetSize = offsetSize;
     stateCopy.offsetSize = offsetSize;
     return createDebugger(stateCopy);
     return createDebugger(stateCopy);
   };
   };
+  // создание новой функции логирования
+  // без глобальных пространств имен
+  debugFn.withoutGlobalNs = function () {
+    const stateCopy = JSON.parse(JSON.stringify(state));
+    stateCopy.globalNsSegments = [];
+    return createDebugger(stateCopy);
+  };
   return debugFn;
   return debugFn;
 }
 }

+ 15 - 0
src/create-debugger.spec.js

@@ -479,6 +479,21 @@ describe('createDebugger', function () {
         'env:test message env',
         'env:test message env',
       );
       );
     });
     });
+
+    it('should exclude namespace of DEBUGGER_NAMESPACE in withoutGlobalNs()', function () {
+      process.env.DEBUG = '*';
+      process.env.DEBUGGER_NAMESPACE = 'myApp';
+      const debug1 = createDebugger();
+      const debug2 = debug1.withoutGlobalNs();
+      debug1('message 1');
+      expect(consoleLogSpy.callCount).to.equal(1);
+      expect(stripAnsi(consoleLogSpy.getCall(0).args[0])).to.equal(
+        'myApp message 1',
+      );
+      debug2('message 2');
+      expect(consoleLogSpy.callCount).to.equal(2);
+      expect(stripAnsi(consoleLogSpy.getCall(1).args[0])).to.equal('message 2');
+    });
   });
   });
 
 
   describe('hashing', function () {
   describe('hashing', function () {