detox 20.0.1 → 20.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1-javadoc.jar → 20.0.2/detox-20.0.2-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1-sources.jar → 20.0.2/detox-20.0.2-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1.aar → 20.0.2/detox-20.0.2.aar} +0 -0
  12. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1.aar.md5 → 20.0.2/detox-20.0.2.aar.md5} +0 -0
  13. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1.aar.sha1 → 20.0.2/detox-20.0.2.aar.sha1} +0 -0
  14. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1.aar.sha256 → 20.0.2/detox-20.0.2.aar.sha256} +0 -0
  15. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1.aar.sha512 → 20.0.2/detox-20.0.2.aar.sha512} +0 -0
  16. package/Detox-android/com/wix/detox/{20.0.1/detox-20.0.1.pom → 20.0.2/detox-20.0.2.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.2/detox-20.0.2.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/local-cli/cli.js +6 -3
  29. package/local-cli/testCommand/TestRunnerCommand.js +25 -12
  30. package/local-cli/testCommand/TestRunnerError.js +17 -0
  31. package/local-cli/testCommand/TestRunnerError.test.js +25 -0
  32. package/package.json +2 -3
  33. package/src/artifacts/utils/temporaryPath.js +32 -2
  34. package/src/errors/DetoxError.js +5 -1
  35. package/src/logger/DetoxLogger.js +34 -5
  36. package/src/logger/utils/BunyanLogger.js +39 -0
  37. package/src/logger/utils/CategoryThreadDispatcher.js +2 -1
  38. package/src/logger/utils/DetoxLogFinalizer.js +73 -51
  39. package/src/logger/utils/MessageStack.js +17 -6
  40. package/src/logger/utils/customConsoleLogger.js +18 -2
  41. package/src/logger/utils/getMainCategory.js +5 -0
  42. package/src/logger/utils/streams/BunyanTransformer.js +72 -0
  43. package/src/logger/utils/streams/ChromeTraceTransformer.js +127 -0
  44. package/src/logger/utils/streams/DetoxJSONLParser.js +31 -0
  45. package/src/logger/utils/streams/JSONLStringer.js +55 -0
  46. package/src/logger/utils/streams/index.js +7 -0
  47. package/src/logger/utils/streams/transformers.js +39 -0
  48. package/src/realms/DetoxContext.js +2 -1
  49. package/src/realms/DetoxPrimaryContext.js +9 -2
  50. package/src/utils/pathUtils.js +11 -0
  51. package/src/utils/shellUtils.js +17 -0
  52. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.md5 +0 -1
  53. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.sha1 +0 -1
  54. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.sha256 +0 -1
  55. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-javadoc.jar.sha512 +0 -1
  56. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.md5 +0 -1
  57. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.sha1 +0 -1
  58. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.sha256 +0 -1
  59. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1-sources.jar.sha512 +0 -1
  60. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.md5 +0 -1
  61. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.sha1 +0 -1
  62. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.sha256 +0 -1
  63. package/Detox-android/com/wix/detox/20.0.1/detox-20.0.1.pom.sha512 +0 -1
  64. package/src/logger/utils/streamUtils.js +0 -248
@@ -0,0 +1 @@
1
+ 514cd58d623830ff11b1b7b32035b2f5
@@ -0,0 +1 @@
1
+ 9cd358d37b6a4abeaf910f3cba214f0e9e0e5550
@@ -0,0 +1 @@
1
+ d26c25b365a5848bcab24a07c1dcd5cb4e55e221b641642cca3007889187af5e
@@ -0,0 +1 @@
1
+ 5759ed953a4d0854ef67219e01102a2ec30da9a685cf997c1e9aaa0e138a3160d7acf68bac3c61ed93169b96122e9631413415ac3ef0a23099b07f4f0ad7e877
@@ -0,0 +1 @@
1
+ 3d3ff582ffc1e63d8439b6c1c870d072
@@ -0,0 +1 @@
1
+ a6b2b9706eefba7a98ee96bfd74c9e6c0953c560
@@ -0,0 +1 @@
1
+ f226e31a8f73581be7a622873f1648ad7ff3689fb69c6803b162891d6432a222
@@ -0,0 +1 @@
1
+ 3f161dca3fbcb2dc70b4994ea2e0889b7c259688188d8831fa05f54b9d1a4ec5ac1cd9e05296e1d6928a3cb95afc3871006855b6081593c0be96469bf46ff9eb
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>20.0.1</version>
6
+ <version>20.0.2</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ 4f7a1a7399a5af7b35c036d2fc0718cb
@@ -0,0 +1 @@
1
+ dac8c057b62ac30f745c079966af8414dcb091f3
@@ -0,0 +1 @@
1
+ b5fd933f8d07b16518b57ba0eb8e1b81408705c6a14300c98b2b6db643dc7a07
@@ -0,0 +1 @@
1
+ 6396385afa4de70131d6db2911f0044aab4f739cb1e8b7b212473ff8ddcd356e928a489dbca9cd978b190f7d5134466afc1a58d2fd6a85664e0979fe13f80b86
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.0.1</latest>
7
- <release>20.0.1</release>
6
+ <latest>20.0.2</latest>
7
+ <release>20.0.2</release>
8
8
  <versions>
9
- <version>20.0.1</version>
9
+ <version>20.0.2</version>
10
10
  </versions>
11
- <lastUpdated>20221111055618</lastUpdated>
11
+ <lastUpdated>20221116093316</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- b10b964ebde575bc8cd48e900c601087
1
+ 05e0bb75beb5d6a3094aebcdba7b4563
@@ -1 +1 @@
1
- 29a7266179c86ab0b4da09c52ca781715d1e04f2
1
+ 88cff9cd55696025d566b3eb466acd91f27ecd64
@@ -1 +1 @@
1
- a8733cc3277fc22d461b93edd646b02ff17c2117162959aead78483c9eb5ca5b
1
+ 1d14b7cac08e76b539d975cb4149bbcf827557ef2359a1cb39ec524fd06fcd2b
@@ -1 +1 @@
1
- f3766e7ecae1daa097dddd3ebf51751098e07208bce6403920f49aad7504fc41f35b87d7c0d84d01bf82a9090cfd6a33d04ec35f7bf0c726d42d7b1d550fedd0
1
+ c42f63528cf78b14e8d23dc1543fd2ed09f67c9f83fd39763c945093780dd63cef41d8ffcaa6da7b758b2e88725d8a45ad8df7e9f92e120ec88e5b0172868f54
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
package/local-cli/cli.js CHANGED
@@ -28,9 +28,12 @@ yargs
28
28
  .wrap(yargs.terminalWidth() * 0.9)
29
29
  .fail(function(msg, err, program) {
30
30
  if (err) {
31
- logger.error(DetoxError.format(err));
32
- // eslint-disable-next-line no-console
33
- process.stderr.write('\n');
31
+ const message = DetoxError.format(err);
32
+ if (message) {
33
+ logger.error(message);
34
+ process.stderr.write('\n');
35
+ }
36
+
34
37
  // @ts-ignore
35
38
  _.attempt(() => fs.unlinkSync(logger.file));
36
39
  // eslint-disable-next-line no-process-exit
@@ -6,9 +6,11 @@ const unparse = require('yargs-unparser');
6
6
 
7
7
  const detox = require('../../internals');
8
8
  const log = detox.log.child({ cat: ['lifecycle', 'cli'] });
9
- const { DetoxRuntimeError } = require('../../src/errors');
10
9
  const { printEnvironmentVariables, prependNodeModulesBinToPATH } = require('../../src/utils/envUtils');
11
- const { escapeSpaces } = require('../../src/utils/shellUtils');
10
+ const { toSimplePath } = require('../../src/utils/pathUtils');
11
+ const { escapeSpaces, useForwardSlashes } = require('../../src/utils/shellUtils');
12
+
13
+ const TestRunnerError = require('./TestRunnerError');
12
14
 
13
15
  class TestRunnerCommand {
14
16
  /*
@@ -57,8 +59,9 @@ class TestRunnerCommand {
57
59
  if (--runsLeft > 0) {
58
60
  // @ts-ignore
59
61
  detox.session.testSessionIndex++; // it is always the primary context, so we can update it
60
- this._argv._ = testFilesToRetry;
61
- this._logRelaunchError();
62
+
63
+ this._argv._ = testFilesToRetry.map(useForwardSlashes);
64
+ this._logRelaunchError(testFilesToRetry);
62
65
  }
63
66
  }
64
67
  } while (launchError && runsLeft > 0);
@@ -114,7 +117,7 @@ class TestRunnerCommand {
114
117
  const fullCommand = this._buildSpawnArguments().map(escapeSpaces);
115
118
  const fullCommandWithHint = printEnvironmentVariables(this._envHint) + fullCommand.join(' ');
116
119
 
117
- log.info({ env: this._envHint }, fullCommandWithHint);
120
+ log.info.begin({ env: this._envHint }, fullCommandWithHint);
118
121
 
119
122
  return new Promise((resolve, reject) => {
120
123
  cp.spawn(fullCommand[0], fullCommand.slice(1), {
@@ -128,10 +131,20 @@ class TestRunnerCommand {
128
131
  .value()
129
132
  })
130
133
  .on('error', /* istanbul ignore next */ (err) => reject(err))
131
- .on('exit', (code) => code === 0
132
- ? resolve()
133
- : reject(new DetoxRuntimeError(`Command failed with exit code = ${code}:\n${fullCommandWithHint}`)
134
- ));
134
+ .on('exit', (code, signal) => {
135
+ if (code === 0) {
136
+ log.trace.end({ success: true });
137
+ resolve();
138
+ } else {
139
+ const error = new TestRunnerError({
140
+ command: fullCommandWithHint,
141
+ code,
142
+ signal,
143
+ });
144
+ log.error.end({ success: false, code, signal }, error.message);
145
+ reject(error);
146
+ }
147
+ });
135
148
  });
136
149
  }
137
150
 
@@ -148,9 +161,9 @@ class TestRunnerCommand {
148
161
  ].map(String);
149
162
  }
150
163
 
151
- _logRelaunchError() {
152
- const list = this._argv._.map((file, index) => {
153
- return ` ${index + 1}. ${file}`;
164
+ _logRelaunchError(filePaths) {
165
+ const list = filePaths.map((file, index) => {
166
+ return ` ${index + 1}. ${toSimplePath(file)}`;
154
167
  }).join('\n');
155
168
 
156
169
  log.error(
@@ -0,0 +1,17 @@
1
+ const { DetoxError } = require('../../src/errors');
2
+
3
+ class TestRunnerError extends DetoxError {
4
+ constructor({ command, code, signal }) {
5
+ super(`Command failed with exit code = ${code}:\n${command}`);
6
+
7
+ this.code = code;
8
+ this.signal = signal;
9
+ this.name = 'TestRunnerError';
10
+ }
11
+
12
+ format() {
13
+ return '';
14
+ }
15
+ }
16
+
17
+ module.exports = TestRunnerError;
@@ -0,0 +1,25 @@
1
+ const { DetoxError } = require('../../src/errors');
2
+
3
+ const TestRunnerError = require('./TestRunnerError');
4
+
5
+ describe('TestRunnerError', () => {
6
+ let error;
7
+
8
+ beforeAll(() => {
9
+ error = new TestRunnerError({ command: 'foo', code: 1, signal: null });
10
+ });
11
+
12
+ it('should format an error message', () => {
13
+ expect(`${error}`).toMatch(/Command failed with exit code = 1:\nfoo/);
14
+ });
15
+
16
+ it('should assign properties (code, signal)', () => {
17
+ expect(error.code).toBe(1);
18
+ expect(error.signal).toBe(null);
19
+ });
20
+
21
+ it('should be formatted to an empty string', () => {
22
+ // So that the try-catch block in cli.js will not print it for the second time
23
+ expect(DetoxError.format(error)).toBe('');
24
+ });
25
+ });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "detox",
3
3
  "description": "E2E tests and automation for mobile",
4
- "version": "20.0.1",
4
+ "version": "20.0.2",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -61,7 +61,6 @@
61
61
  "caf": "^15.0.1",
62
62
  "chalk": "^2.4.2",
63
63
  "child-process-promise": "^2.2.0",
64
- "duplexify": "^4.1.2",
65
64
  "find-up": "^4.1.0",
66
65
  "fs-extra": "^4.0.2",
67
66
  "funpermaproxy": "^1.1.0",
@@ -190,5 +189,5 @@
190
189
  }
191
190
  }
192
191
  },
193
- "gitHead": "c790d107c8da0082aa2730453012e1078b22db10"
192
+ "gitHead": "caef3fd2ce6fe7ad2a8267102ee521153abbcbb2"
194
193
  }
@@ -1,14 +1,42 @@
1
1
  const path = require('path');
2
+ const { promisify } = require('util');
2
3
 
4
+ const glob = require('glob');
3
5
  const tempfile = require('tempfile');
4
6
 
7
+ const { useForwardSlashes } = require('../../utils/shellUtils');
8
+
9
+ const globSync = glob.sync;
10
+ const globAsync = promisify(glob);
11
+
12
+ function getRoot() {
13
+ return path.dirname(tempfile());
14
+ }
15
+
16
+ function createGlobber(ext) {
17
+ const fullExt = `.detox.${ext}`;
18
+
19
+ return {
20
+ sync: (pattern) => {
21
+ const cwd = getRoot();
22
+ const files = globSync(useForwardSlashes(pattern + fullExt), { cwd });
23
+ return files.map(f => path.join(cwd, f));
24
+ },
25
+ async: async (pattern) => {
26
+ const cwd = getRoot();
27
+ const files = await globAsync(useForwardSlashes(pattern + fullExt), { cwd });
28
+ return files.map(f => path.join(cwd, f));
29
+ },
30
+ };
31
+ }
32
+
5
33
  function createTempFileBuilderFn(fileExtension) {
6
34
  /**
7
35
  * @param {string} [basename]
8
36
  */
9
37
  return (basename) => {
10
38
  return basename
11
- ? path.join(path.dirname(tempfile()), `${basename}.detox.${fileExtension}`)
39
+ ? path.join(getRoot(), `${basename}.detox.${fileExtension}`)
12
40
  : tempfile(`.detox.${fileExtension}`);
13
41
  };
14
42
  }
@@ -23,5 +51,7 @@ module.exports = {
23
51
  dtxrec: createTempFileBuilderFn('dtxrec'),
24
52
  viewhierarchy: createTempFileBuilderFn('viewhierarchy'),
25
53
  },
26
- mask: () => path.join(tempfile(), '..') + path.sep + '*.detox.*',
54
+ find: {
55
+ jsonl: createGlobber('jsonl'),
56
+ },
27
57
  };
@@ -8,6 +8,10 @@ class DetoxError extends Error {
8
8
  this.name = 'DetoxError';
9
9
  }
10
10
 
11
+ format() {
12
+ return this.message;
13
+ }
14
+
11
15
  static get reportIssue() {
12
16
  return 'Please report this issue on our GitHub tracker:\nhttps://github.com/wix/Detox/issues';
13
17
  }
@@ -32,7 +36,7 @@ class DetoxError extends Error {
32
36
  */
33
37
  static format(err, inspectOptions = { depth: 1 }) {
34
38
  if (err instanceof DetoxError) {
35
- return err.message;
39
+ return err.format();
36
40
  }
37
41
 
38
42
  if (_.isError(err) && /^Command failed:/.test(err.message)) {
@@ -19,11 +19,12 @@ const sanitizeBunyanContext = require('./utils/sanitizeBunyanContext');
19
19
  * @property {CategoryThreadDispatcher} [dispatcher]
20
20
  * @property {BunyanLogger} [bunyan]
21
21
  * @property {MessageStack} [messageStack]
22
+ * @property {boolean} [unsafeMode] Disables sanitization of user input, used for integration tests.
22
23
  */
23
24
 
24
25
  class DetoxLogger {
25
26
  /**
26
- * @param {Pick<SharedLoggerConfig, 'file' | 'userConfig'>} sharedConfig
27
+ * @param {SharedLoggerConfig} sharedConfig
27
28
  * @param {object} [context]
28
29
  */
29
30
  constructor(sharedConfig, context) {
@@ -91,7 +92,7 @@ class DetoxLogger {
91
92
  * @returns {DetoxLogger}
92
93
  */
93
94
  child(overrides) {
94
- const merged = this._mergeContexts(this._context, sanitizeBunyanContext(overrides));
95
+ const merged = this._mergeContexts(this._context, this._sanitizeContext(overrides));
95
96
  return new DetoxLogger(this._sharedConfig, merged);
96
97
  }
97
98
 
@@ -119,6 +120,25 @@ class DetoxLogger {
119
120
  this.overrideConsole();
120
121
  }
121
122
 
123
+ /**
124
+ * Closes the file descriptors to make sure that the temporary
125
+ * JSONL files are flushed and contain the last error messages.
126
+ * This safety measure is especially important for Windows OS.
127
+ *
128
+ * @async
129
+ * @internal
130
+ */
131
+ async close() {
132
+ if (this._context) {
133
+ throw new DetoxInternalError(
134
+ 'Trying to close file streams from a non-root logger.\n' +
135
+ 'If you are not fiddling with Detox internals on purpose, yet you see this error, then...'
136
+ );
137
+ }
138
+
139
+ await this._sharedConfig.bunyan.closeFileStreams();
140
+ }
141
+
122
142
  /**
123
143
  * @internal
124
144
  */
@@ -192,7 +212,7 @@ class DetoxLogger {
192
212
 
193
213
  /** @private */
194
214
  _beginInternal(level, context, msg) {
195
- this._sharedConfig.messageStack.push(context.tid, msg);
215
+ this._sharedConfig.messageStack.push(context, msg);
196
216
  this._sharedConfig.bunyan.logger[level](context, ...msg);
197
217
  }
198
218
 
@@ -204,7 +224,7 @@ class DetoxLogger {
204
224
 
205
225
  /** @private */
206
226
  _endInternal(level, context, msg) {
207
- const beginMsg = this._sharedConfig.messageStack.pop(context.tid);
227
+ const beginMsg = this._sharedConfig.messageStack.pop(context);
208
228
  if (msg.length === 0) {
209
229
  msg = beginMsg;
210
230
  }
@@ -272,12 +292,21 @@ class DetoxLogger {
272
292
  const context = this._mergeContexts(
273
293
  this._context,
274
294
  boundContext,
275
- sanitizeBunyanContext(userContext),
295
+ this._sanitizeContext(userContext),
276
296
  );
277
297
 
278
298
  return { context, msg };
279
299
  }
280
300
 
301
+ /** @private */
302
+ _sanitizeContext(context) {
303
+ if (this._sharedConfig.unsafeMode) {
304
+ return context;
305
+ }
306
+
307
+ return sanitizeBunyanContext(context);
308
+ }
309
+
281
310
  /** @internal */
282
311
  static defaultOptions({ level }) {
283
312
  const ph = level === 'trace' || level === 'debug'
@@ -71,6 +71,45 @@ class BunyanLogger {
71
71
 
72
72
  return this;
73
73
  }
74
+
75
+ async closeFileStreams() {
76
+ const { _closeStream } = BunyanLogger;
77
+ const internalBunyanStreams = this._bunyan['streams'];
78
+ const openFileStreams = _.filter(internalBunyanStreams, this._isOpenFileStream);
79
+ _.remove(internalBunyanStreams, openFileStreams);
80
+
81
+ await Promise.all(openFileStreams.map(_closeStream));
82
+ }
83
+
84
+ /** @private */
85
+ _isOpenFileStream = (bunyanStream) => {
86
+ switch (bunyanStream.type) {
87
+ case 'file':
88
+ return bunyanStream.path && !bunyanStream.stream.destroyed;
89
+ case 'raw':
90
+ /* istanbul ignore next */
91
+ const stream = bunyanStream.stream === this._debugStream.stream
92
+ ? bunyanStream.stream._out
93
+ : bunyanStream.stream;
94
+
95
+ /* istanbul ignore next */
96
+ return stream.fd !== undefined && !stream.closed;
97
+ }
98
+ };
99
+
100
+ /** @private */
101
+ static _closeStream(bunyanStream) {
102
+ return new Promise((resolve, reject) => {
103
+ bunyanStream.stream.end((err) => {
104
+ /* istanbul ignore next */
105
+ if (err) {
106
+ reject(err);
107
+ } else {
108
+ resolve();
109
+ }
110
+ });
111
+ });
112
+ }
74
113
  }
75
114
 
76
115
  module.exports = BunyanLogger;
@@ -1,4 +1,5 @@
1
1
  const ThreadDispatcher = require('./ThreadDispatcher');
2
+ const getMainCategory = require('./getMainCategory');
2
3
 
3
4
  class CategoryThreadDispatcher {
4
5
  constructor() {
@@ -24,7 +25,7 @@ class CategoryThreadDispatcher {
24
25
 
25
26
  /** @returns {ThreadDispatcher} */
26
27
  _resolveDispatcher(cat) {
27
- const mainCategory = cat ? cat.split(',', 1)[0] : 'undefined';
28
+ const mainCategory = getMainCategory(cat);
28
29
  if (!this._dispatchers[mainCategory]) {
29
30
  this._dispatchers[mainCategory] = new ThreadDispatcher(mainCategory);
30
31
  }