@autofleet/rabbit 3.2.19-beta.4 → 3.2.19-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -58,7 +58,6 @@ declare class RabbitMq implements IAfRabbitMq {
58
58
  DISCONNECT_MSG: string;
59
59
  RECONNECT_MSG: string;
60
60
  channel: ChannelWrapper | null;
61
- publishChannelSetupPromise: Promise<ChannelWrapper> | null;
62
61
  blockReconnect: boolean | null | undefined;
63
62
  connection: AmqpConnectionManager | null | undefined;
64
63
  em: EventEmitter;
@@ -92,7 +91,7 @@ declare class RabbitMq implements IAfRabbitMq {
92
91
  private consumeFromRabbit;
93
92
  consumeFromExchange(queue: string, exchange: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any>;
94
93
  publish(exchange: string, content: any, customHeaders?: any): Promise<boolean>;
95
- sendToQueue(queue: string, content: any, options?: any, customHeaders?: any): Promise<boolean | undefined>;
94
+ sendToQueue(queue: string, content: any, options?: any, customHeaders?: any, isBlocking?: boolean): Promise<boolean | undefined>;
96
95
  isConnected(): Promise<boolean>;
97
96
  gracefulShutdown(signal: string): Promise<void>;
98
97
  }
package/dist/index.js CHANGED
@@ -117,7 +117,6 @@ class RabbitMq {
117
117
  };
118
118
  this.em = new events_1.EventEmitter();
119
119
  this.channel = null;
120
- this.publishChannelSetupPromise = null;
121
120
  this.connection = null;
122
121
  this.creatingConnection = false;
123
122
  this.exchanges = {};
@@ -242,25 +241,22 @@ class RabbitMq {
242
241
  }
243
242
  }
244
243
  async assertChannel({ force = false } = {}) {
245
- if (!this.publishChannelSetupPromise) {
246
- this.publishChannelSetupPromise = new Promise(async (resolve, reject) => {
247
- if (this.channel && !force) {
248
- return resolve(this.channel);
249
- }
250
- try {
251
- const channel = await this.getNewChannel({});
252
- channel.on('error', (err) => {
253
- logger_1.default.error('rabbit: channel error', { err });
254
- });
255
- this.channel = channel;
256
- resolve(channel);
257
- }
258
- catch (e) {
259
- reject(e);
260
- }
261
- });
262
- }
263
- return this.publishChannelSetupPromise;
244
+ return new Promise(async (resolve, reject) => {
245
+ if (this.channel && !force) {
246
+ return resolve(this.channel);
247
+ }
248
+ try {
249
+ const channel = await this.getNewChannel({});
250
+ channel.on('error', (err) => {
251
+ logger_1.default.error('rabbit: channel error', { err });
252
+ });
253
+ this.channel = channel;
254
+ resolve(channel);
255
+ }
256
+ catch (e) {
257
+ reject(e);
258
+ }
259
+ });
264
260
  }
265
261
  async assertExchange(exchangeName, options) {
266
262
  const channel = await this.assertChannel();
@@ -472,31 +468,25 @@ class RabbitMq {
472
468
  await channel.publish(exchange, '', Buffer.from(JSON.stringify(content)), RabbitMq.getPublishOptions(customHeaders));
473
469
  });
474
470
  }
475
- async sendToQueue(queue, content, options, customHeaders) {
476
- try {
477
- await this.assertChannel();
478
- }
479
- catch (e) {
480
- logger_1.default.error(`rabbit sendToQueue: failed to send assert channel when sending to queue ${queue}`, { e });
481
- throw e;
482
- }
483
- try {
484
- RabbitMq.validateName('queue', queue);
485
- await this.assertQueue(queue, options);
486
- }
487
- catch (e) {
488
- logger_1.default.error(`rabbit sendToQueue: failed to assert queue ${queue}`, { e });
489
- throw e;
490
- }
491
- try {
492
- const res = await this.channel?.sendToQueue(queue, Buffer.from(JSON.stringify(content)), RabbitMq.getPublishOptions(customHeaders));
493
- debug(`rabbit: sending to queue ${queue}`, { res });
494
- return res;
495
- }
496
- catch (e) {
497
- logger_1.default.error(`rabbit sendToQueue: failed to send to queue ${queue}`, { e });
498
- throw e;
471
+ async sendToQueue(queue, content, options, customHeaders, isBlocking) {
472
+ const callback = async () => {
473
+ try {
474
+ RabbitMq.validateName('queue', queue);
475
+ await this.assertChannel();
476
+ await this.assertQueue(queue, options);
477
+ const res = await this.channel?.sendToQueue(queue, Buffer.from(JSON.stringify(content)), RabbitMq.getPublishOptions(customHeaders));
478
+ debug(`rabbit: sending to queue ${queue}`, { res });
479
+ return res;
480
+ }
481
+ catch (e) {
482
+ logger_1.default.error(`rabbit: failed to send to queue ${queue}`, { e });
483
+ throw e;
484
+ }
485
+ };
486
+ if (isBlocking) {
487
+ return callback();
499
488
  }
489
+ return (0, utils_1.wrapSetImmediate)(callback);
500
490
  }
501
491
  async isConnected() {
502
492
  const connection = await this.getConnection();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/rabbit",
3
- "version": "3.2.19-beta.4",
3
+ "version": "3.2.19-beta.6",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/index.ts CHANGED
@@ -36,13 +36,13 @@ import {
36
36
  QueuesCache,
37
37
  RedisLockType,
38
38
  ExchangesCache, CONSUMER_DEFAULT_OPTIONS, QueueSetupPromisesDictionary,
39
+ ConnectionRole,
39
40
  } from './lib/types';
40
41
 
41
42
  // const debug = nodeDebug('af-rabbitmq')
42
43
  const debug = logger.debug.bind(logger);
43
44
 
44
45
  const PUBLISH_TIMEOUT = 1000 * 10;
45
-
46
46
  export interface IAfRabbitMq {
47
47
  ack: any;
48
48
  nack: any;
@@ -82,11 +82,13 @@ type newChannelOpts = {
82
82
  name?: string;
83
83
  onClose?: null | ((args: any | null) => void);
84
84
  options?: CreateChannelOpts | undefined;
85
+ connectionRole: ConnectionRole,
85
86
  };
86
87
 
87
88
  type assertChannelOpts = {
88
89
  channelName?: string;
89
90
  force?: boolean;
91
+ connectionRole: ConnectionRole;
90
92
  }
91
93
 
92
94
  type AfConsumer = {
@@ -145,11 +147,15 @@ class RabbitMq implements IAfRabbitMq {
145
147
 
146
148
  blockReconnect: boolean | null | undefined
147
149
 
148
- connection: AmqpConnectionManager | null | undefined
150
+ consumeConnection: AmqpConnectionManager | null | undefined;
151
+
152
+ publishConnection: AmqpConnectionManager | null | undefined;
149
153
 
150
154
  em: EventEmitter;
151
155
 
152
- creatingConnection: boolean;
156
+ creatingConsumeConnection: boolean;
157
+
158
+ creatingPublishConnection: boolean;
153
159
 
154
160
  exchanges: ExchangesCache;
155
161
 
@@ -172,8 +178,10 @@ class RabbitMq implements IAfRabbitMq {
172
178
  this.em = new EventEmitter();
173
179
  this.channel = null;
174
180
  this.publishChannelSetupPromise = null;
175
- this.connection = null;
176
- this.creatingConnection = false;
181
+ this.consumeConnection = null;
182
+ this.publishConnection = null;
183
+ this.creatingPublishConnection = false;
184
+ this.creatingConsumeConnection = false;
177
185
  this.exchanges = {};
178
186
  this.queues = {};
179
187
  this.queueSetupPromises = {};
@@ -270,16 +278,21 @@ class RabbitMq implements IAfRabbitMq {
270
278
  }
271
279
  }
272
280
 
273
- async getConnection() {
281
+ geConnectionByRole = (connectionRole: ConnectionRole) => (connectionRole === ConnectionRole.Consumer
282
+ ? { connectionByRole: this.consumeConnection, creatingConnectionByRole: this.creatingConsumeConnection }
283
+ : { connectionByRole: this.publishConnection, creatingConnectionByRole: this.creatingPublishConnection });
284
+
285
+ async getConnection(connectionRole: ConnectionRole) {
274
286
  return new Promise<AmqpConnectionManager>(async (resolve, reject) => {
287
+ let { connectionByRole, creatingConnectionByRole } = this.geConnectionByRole(connectionRole);
275
288
  if (this.blockReconnect) {
276
289
  debug('rabbit: block reconnect');
277
290
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
278
291
  // @ts-ignore
279
292
  return resolve();
280
293
  }
281
- if (this.connection !== null) {
282
- if (this.options?.disableReconnect || this.connection?.isConnected()) {
294
+ if (connectionByRole !== null) {
295
+ if (this.options?.disableReconnect || connectionByRole?.isConnected()) {
283
296
  debug('rabbit: connection - is connected');
284
297
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
285
298
  // @ts-ignore
@@ -287,13 +300,13 @@ class RabbitMq implements IAfRabbitMq {
287
300
  }
288
301
  debug('rabbit: connection - reconnecting');
289
302
  }
290
- if (this.creatingConnection) {
303
+ if (creatingConnectionByRole) {
291
304
  debug('rabbit: creating connection emi');
292
305
  this.em.once(CONNECTION_CREATED_CONST, resolve);
293
306
  this.em.once(CONNECTION_FAILED_CONST, reject);
294
307
  return;
295
308
  }
296
- this.creatingConnection = true;
309
+ creatingConnectionByRole = true;
297
310
  let isResolved = false;
298
311
 
299
312
  // It is import to use it as a function and not as a variable
@@ -310,12 +323,12 @@ class RabbitMq implements IAfRabbitMq {
310
323
  };
311
324
 
312
325
  const defaultUrls = findServers();
313
- const connection: AmqpConnectionManager = await connect(defaultUrls, {
326
+ const newConnection: AmqpConnectionManager = await connect(defaultUrls, {
314
327
  findServers,
315
328
  });
316
329
 
317
- this.connection = connection;
318
- this.connection.on('error', (err) => {
330
+ connectionByRole = newConnection;
331
+ connectionByRole.on('error', (err) => {
319
332
  logger.error('rabbit: connection error', { err });
320
333
  if (!isResolved) {
321
334
  isResolved = true;
@@ -324,7 +337,7 @@ class RabbitMq implements IAfRabbitMq {
324
337
  }
325
338
  });
326
339
 
327
- this.connection.on('connectFailed', (err) => {
340
+ connectionByRole.on('connectFailed', (err) => {
328
341
  this.consumersTags = [];
329
342
  logger.error('rabbit: connection connectFailed', { err });
330
343
  if (!isResolved) {
@@ -334,7 +347,7 @@ class RabbitMq implements IAfRabbitMq {
334
347
  }
335
348
  });
336
349
 
337
- this.connection.on('disconnect', ({ err }) => {
350
+ connectionByRole.on('disconnect', ({ err }) => {
338
351
  this.consumersTags = [];
339
352
  debug('rabbit: connection closed');
340
353
  if (this.options?.disableReconnect) {
@@ -344,20 +357,22 @@ class RabbitMq implements IAfRabbitMq {
344
357
  logger.error(`${this.RECONNECT_MSG}${err && ` - ${err}`}`);
345
358
  }
346
359
  });
347
- this.connection.once('connect', async () => {
360
+ connectionByRole.once('connect', async () => {
348
361
  debug('rabbit: connection established');
349
- this.creatingConnection = false;
350
- this.em.emit(CONNECTION_CREATED_CONST, connection);
362
+ creatingConnectionByRole = false;
363
+ this.em.emit(CONNECTION_CREATED_CONST, connectionByRole);
351
364
  isResolved = true;
352
- resolve(connection);
365
+ resolve(connectionByRole);
353
366
  });
354
367
  });
355
368
  }
356
369
 
357
- async getNewChannel({ name = rand().toString(), onClose = null, options = {} }: newChannelOpts = {}) {
370
+ async getNewChannel({
371
+ name = rand().toString(), onClose = null, options = {}, connectionRole,
372
+ }: newChannelOpts = { connectionRole: ConnectionRole.Consumer }): Promise<ChannelWrapper> {
358
373
  let connection!: AmqpConnectionManager;
359
374
  try {
360
- connection = await this.getConnection();
375
+ connection = await this.getConnection(connectionRole);
361
376
  } catch (e) {
362
377
  logger.error(`rabbit: error on get connection for new channel ${name} `, { e });
363
378
  throw e;
@@ -377,7 +392,7 @@ class RabbitMq implements IAfRabbitMq {
377
392
  }
378
393
  }
379
394
 
380
- async assertChannel({ force = false } : assertChannelOpts = {}): Promise<ChannelWrapper> {
395
+ async assertChannel({ force = false, connectionRole }: assertChannelOpts = { connectionRole: ConnectionRole.Consumer }): Promise<ChannelWrapper> {
381
396
  if (!this.publishChannelSetupPromise) {
382
397
  this.publishChannelSetupPromise = new Promise<ChannelWrapper>(async (resolve, reject) => {
383
398
  if (this.channel && !force) {
@@ -385,7 +400,7 @@ class RabbitMq implements IAfRabbitMq {
385
400
  }
386
401
 
387
402
  try {
388
- const channel = await this.getNewChannel({});
403
+ const channel = await this.getNewChannel({ connectionRole });
389
404
  channel.on('error', (err) => {
390
405
  logger.error('rabbit: channel error', { err });
391
406
  });
@@ -400,7 +415,7 @@ class RabbitMq implements IAfRabbitMq {
400
415
  }
401
416
 
402
417
  async assertExchange(exchangeName: string, options?: any) {
403
- const channel: ChannelWrapper = await this.assertChannel();
418
+ const channel: ChannelWrapper = await this.assertChannel({ connectionRole: options.connectionRole });
404
419
  if (this.exchanges[exchangeName]) {
405
420
  return this.exchanges[exchangeName];
406
421
  }
@@ -409,35 +424,36 @@ class RabbitMq implements IAfRabbitMq {
409
424
  return exchange;
410
425
  }
411
426
 
412
- async getQueueLength(queue: string) {
427
+ async getQueueLength(queue: string, connectionRole: ConnectionRole) {
413
428
  RabbitMq.validateName('queue', queue);
429
+ const { connectionByRole } = this.geConnectionByRole(connectionRole);
414
430
  const { channel } = this;
415
431
  if (!channel) {
416
432
  throw new Error('channel is not defined');
417
433
  }
418
- debug('rabbit: getting queue length', { queue, connected: this.connection?.isConnected() });
434
+ debug('rabbit: getting queue length', { queue, connected: connectionByRole?.isConnected() });
419
435
  return channel?.checkQueue(queue);
420
436
  }
421
437
 
422
- private async deleteQueue(queue: string) {
438
+ private async deleteQueue(queue: string, connectionRole: ConnectionRole) {
423
439
  RabbitMq.validateName('queue', queue);
424
- const channel: ChannelWrapper = await this.assertChannel();
440
+ const channel: ChannelWrapper = await this.assertChannel({ connectionRole });
425
441
  logger.info('rabbit: deleting queue', { queue });
426
442
  const deleteQueueRes = await channel.deleteQueue(queue);
427
443
  debug('queue deleted', deleteQueueRes);
428
444
  return deleteQueueRes;
429
445
  }
430
446
 
431
- async bindQueue(queue: string, exchange: string) {
432
- const channel: ChannelWrapper = await this.assertChannel();
447
+ async bindQueue(queue: string, exchange: string, connectionRole: ConnectionRole) {
448
+ const channel: ChannelWrapper = await this.assertChannel({ connectionRole });
433
449
  await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.bindQueue(queue, exchange, ''));
434
450
  return channel.bindQueue(queue, exchange, '');
435
451
  }
436
452
 
437
- async setupQueue(queueName: string, options?: Options.AssertQueue): Promise<Replies.AssertQueue> {
453
+ async setupQueue(queueName: string, connectionRole: ConnectionRole, options?: Options.AssertQueue): Promise<Replies.AssertQueue> {
438
454
  let queue: Replies.AssertQueue;
439
455
  try {
440
- const channel: ChannelWrapper = await this.assertChannel();
456
+ const channel: ChannelWrapper = await this.assertChannel({ connectionRole });
441
457
  debug('assertQueue->channel.addSetup', { queueName });
442
458
  await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.assertQueue(queueName, options));
443
459
  debug('assertQueue->channel.assertQueue', { queueName });
@@ -446,8 +462,8 @@ class RabbitMq implements IAfRabbitMq {
446
462
  logger.error('rabbit: assertQueue error', { queueName, options, error: e });
447
463
  if (!this.options?.dontRetryAssert) {
448
464
  debug('retrying assertQueue', { queueName });
449
- const channel = await this.assertChannel({ force: true });
450
- await this.deleteQueue(queueName);
465
+ const channel = await this.assertChannel({ force: true, connectionRole });
466
+ await this.deleteQueue(queueName, connectionRole);
451
467
 
452
468
  debug('retrying assertQueue->channel.addSetup', { queueName });
453
469
  await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.assertQueue(queueName, options));
@@ -462,7 +478,7 @@ class RabbitMq implements IAfRabbitMq {
462
478
  return queue;
463
479
  }
464
480
 
465
- async assertQueue(queueName: string, options?: Options.AssertQueue) {
481
+ async assertQueue(queueName: string, connectionRole: ConnectionRole, options?: Options.AssertQueue) {
466
482
  RabbitMq.validateName('queue', queueName);
467
483
  if (this.queues[queueName]) {
468
484
  delete this.queueSetupPromises[queueName];
@@ -473,7 +489,7 @@ class RabbitMq implements IAfRabbitMq {
473
489
  return this.queueSetupPromises[queueName];
474
490
  }
475
491
 
476
- this.queueSetupPromises[queueName] = this.setupQueue(queueName, options);
492
+ this.queueSetupPromises[queueName] = this.setupQueue(queueName, connectionRole, options);
477
493
  return this.queueSetupPromises[queueName];
478
494
  }
479
495
 
@@ -527,7 +543,7 @@ class RabbitMq implements IAfRabbitMq {
527
543
  }
528
544
  logger.info(`rabbit: Consuming with lock from queue ${queue} with lockTimeout: ${lockTimeout}ms`);
529
545
  }
530
- const channel = await this.getNewChannel({});
546
+ const channel = await this.getNewChannel({ connectionRole: ConnectionRole.Consumer });
531
547
  return channel.addSetup(async (confirmChannel: ConfirmChannel) => {
532
548
  await confirmChannel.assertQueue(queue, options ? { messageTtl: options.messageTtl } : undefined);
533
549
  await confirmChannel.prefetch(limit, true);
@@ -619,7 +635,7 @@ class RabbitMq implements IAfRabbitMq {
619
635
  RabbitMq.validateName('queue', queue);
620
636
  const { limit, deadMessageTtl } = optionsWithDefaults;
621
637
  await this.saveConsumer(queue, callback, options);
622
- const channel: ChannelWrapper = await this.getNewChannel({ name: `consume-exchange-${exchange}-queue-${queue}` });
638
+ const channel: ChannelWrapper = await this.getNewChannel({ name: `consume - exchange - ${exchange} -queue - ${queue}`, connectionRole: ConnectionRole.Consumer });
623
639
 
624
640
  return channel.addSetup(async (c: ConfirmChannel) => {
625
641
  const assertExchange = await assertExchangeFanout(c, exchange);
@@ -640,8 +656,8 @@ class RabbitMq implements IAfRabbitMq {
640
656
  async publish(exchange: string, content: any, customHeaders?: any) : Promise<boolean> {
641
657
  return wrapSetImmediate(async () => {
642
658
  RabbitMq.validateName('exchange', exchange);
643
- const channel: ChannelWrapper = await this.assertChannel();
644
- await this.assertExchange(exchange);
659
+ const channel: ChannelWrapper = await this.assertChannel({ connectionRole: ConnectionRole.Publisher });
660
+ await this.assertExchange(exchange, { connectionRole: ConnectionRole.Publisher });
645
661
  await channel.publish(exchange, '',
646
662
  Buffer.from(JSON.stringify(content)),
647
663
  RabbitMq.getPublishOptions(customHeaders));
@@ -655,7 +671,7 @@ class RabbitMq implements IAfRabbitMq {
655
671
  customHeaders?: any,
656
672
  ): Promise<boolean | undefined> {
657
673
  try {
658
- await this.assertChannel();
674
+ await this.assertChannel({ connectionRole: ConnectionRole.Publisher });
659
675
  } catch (e) {
660
676
  logger.error(`rabbit sendToQueue: failed to send assert channel when sending to queue ${queue}`, { e });
661
677
  throw e;
@@ -663,7 +679,7 @@ class RabbitMq implements IAfRabbitMq {
663
679
 
664
680
  try {
665
681
  RabbitMq.validateName('queue', queue);
666
- await this.assertQueue(queue, options);
682
+ await this.assertQueue(queue, ConnectionRole.Publisher, options);
667
683
  } catch (e) {
668
684
  logger.error(`rabbit sendToQueue: failed to assert queue ${queue}`, { e });
669
685
  throw e;
@@ -676,13 +692,14 @@ class RabbitMq implements IAfRabbitMq {
676
692
  debug(`rabbit: sending to queue ${queue}`, { res });
677
693
  return res;
678
694
  } catch (e) {
679
- logger.error(`rabbit sendToQueue: failed to send to queue ${queue}`, { e });
695
+ const isConnected = await this.isConnected(ConnectionRole.Publisher);
696
+ logger.error(`rabbit sendToQueue: failed to send to queue ${queue}, isConnected: ${isConnected}`, { e });
680
697
  throw e;
681
698
  }
682
699
  }
683
700
 
684
- async isConnected() : Promise<boolean> {
685
- const connection = await this.getConnection();
701
+ async isConnected(connectionRole: ConnectionRole): Promise<boolean> {
702
+ const connection = await this.getConnection(connectionRole);
686
703
  const isConnected = connection.isConnected();
687
704
  if (!isConnected) {
688
705
  logger.error('rabbit: isConnected - false');
package/src/lib/types.ts CHANGED
@@ -55,3 +55,5 @@ export const CONSUMER_DEFAULT_OPTIONS: Options.Consume = {
55
55
  [HA_PROMOTE_ON_SHUTDOWN]: 'always',
56
56
  },
57
57
  };
58
+
59
+ export type ConnectionRole = 'consumer' | 'publisher';
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <coverage generated="1675584950929" clover="3.2.0">
3
- <project timestamp="1675584950929" name="All files">
4
- <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0" elements="0" coveredelements="0" complexity="0" loc="0" ncloc="0" packages="0" files="0" classes="0">
5
- </metrics>
6
- </project>
7
- </coverage>
@@ -1 +0,0 @@
1
- {}
@@ -1,212 +0,0 @@
1
- body, html {
2
- margin:0; padding: 0;
3
- height: 100%;
4
- }
5
- body {
6
- font-family: Helvetica Neue, Helvetica, Arial;
7
- font-size: 14px;
8
- color:#333;
9
- }
10
- .small { font-size: 12px; }
11
- *, *:after, *:before {
12
- -webkit-box-sizing:border-box;
13
- -moz-box-sizing:border-box;
14
- box-sizing:border-box;
15
- }
16
- h1 { font-size: 20px; margin: 0;}
17
- h2 { font-size: 14px; }
18
- pre {
19
- font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
- margin: 0;
21
- padding: 0;
22
- -moz-tab-size: 2;
23
- -o-tab-size: 2;
24
- tab-size: 2;
25
- }
26
- a { color:#0074D9; text-decoration:none; }
27
- a:hover { text-decoration:underline; }
28
- .strong { font-weight: bold; }
29
- .space-top1 { padding: 10px 0 0 0; }
30
- .pad2y { padding: 20px 0; }
31
- .pad1y { padding: 10px 0; }
32
- .pad2x { padding: 0 20px; }
33
- .pad2 { padding: 20px; }
34
- .pad1 { padding: 10px; }
35
- .space-left2 { padding-left:55px; }
36
- .space-right2 { padding-right:20px; }
37
- .center { text-align:center; }
38
- .clearfix { display:block; }
39
- .clearfix:after {
40
- content:'';
41
- display:block;
42
- height:0;
43
- clear:both;
44
- visibility:hidden;
45
- }
46
- .fl { float: left; }
47
- @media only screen and (max-width:640px) {
48
- .col3 { width:100%; max-width:100%; }
49
- .hide-mobile { display:none!important; }
50
- }
51
-
52
- .quiet {
53
- color: #7f7f7f;
54
- color: rgba(0,0,0,0.5);
55
- }
56
- .quiet a { opacity: 0.7; }
57
-
58
- .fraction {
59
- font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
- font-size: 10px;
61
- color: #555;
62
- background: #E8E8E8;
63
- padding: 4px 5px;
64
- border-radius: 3px;
65
- vertical-align: middle;
66
- }
67
-
68
- div.path a:link, div.path a:visited { color: #333; }
69
- table.coverage {
70
- border-collapse: collapse;
71
- margin: 10px 0 0 0;
72
- padding: 0;
73
- }
74
-
75
- table.coverage td {
76
- margin: 0;
77
- padding: 0;
78
- vertical-align: top;
79
- }
80
- table.coverage td.line-count {
81
- text-align: right;
82
- padding: 0 5px 0 20px;
83
- }
84
- table.coverage td.line-coverage {
85
- text-align: right;
86
- padding-right: 10px;
87
- min-width:20px;
88
- }
89
-
90
- table.coverage td span.cline-any {
91
- display: inline-block;
92
- padding: 0 5px;
93
- width: 100%;
94
- }
95
- .missing-if-branch {
96
- display: inline-block;
97
- margin-right: 5px;
98
- border-radius: 3px;
99
- position: relative;
100
- padding: 0 4px;
101
- background: #333;
102
- color: yellow;
103
- }
104
-
105
- .skip-if-branch {
106
- display: none;
107
- margin-right: 10px;
108
- position: relative;
109
- padding: 0 4px;
110
- background: #ccc;
111
- color: white;
112
- }
113
- .missing-if-branch .typ, .skip-if-branch .typ {
114
- color: inherit !important;
115
- }
116
- .coverage-summary {
117
- border-collapse: collapse;
118
- width: 100%;
119
- }
120
- .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
- .keyline-all { border: 1px solid #ddd; }
122
- .coverage-summary td, .coverage-summary th { padding: 10px; }
123
- .coverage-summary tbody { border: 1px solid #bbb; }
124
- .coverage-summary td { border-right: 1px solid #bbb; }
125
- .coverage-summary td:last-child { border-right: none; }
126
- .coverage-summary th {
127
- text-align: left;
128
- font-weight: normal;
129
- white-space: nowrap;
130
- }
131
- .coverage-summary th.file { border-right: none !important; }
132
- .coverage-summary th.pct { }
133
- .coverage-summary th.pic,
134
- .coverage-summary th.abs,
135
- .coverage-summary td.pct,
136
- .coverage-summary td.abs { text-align: right; }
137
- .coverage-summary td.file { white-space: nowrap; }
138
- .coverage-summary td.pic { min-width: 120px !important; }
139
- .coverage-summary tfoot td { }
140
-
141
- .coverage-summary .sorter {
142
- height: 10px;
143
- width: 7px;
144
- display: inline-block;
145
- margin-left: 0.5em;
146
- background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
- }
148
- .coverage-summary .sorted .sorter {
149
- background-position: 0 -20px;
150
- }
151
- .coverage-summary .sorted-desc .sorter {
152
- background-position: 0 -10px;
153
- }
154
- .status-line { height: 10px; }
155
- /* dark red */
156
- .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
157
- .low .chart { border:1px solid #C21F39 }
158
- /* medium red */
159
- .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
160
- /* light red */
161
- .low, .cline-no { background:#FCE1E5 }
162
- /* light green */
163
- .high, .cline-yes { background:rgb(230,245,208) }
164
- /* medium green */
165
- .cstat-yes { background:rgb(161,215,106) }
166
- /* dark green */
167
- .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
168
- .high .chart { border:1px solid rgb(77,146,33) }
169
-
170
-
171
- .medium .chart { border:1px solid #666; }
172
- .medium .cover-fill { background: #666; }
173
-
174
- .cbranch-no { background: yellow !important; color: #111; }
175
-
176
- .cstat-skip { background: #ddd; color: #111; }
177
- .fstat-skip { background: #ddd; color: #111 !important; }
178
- .cbranch-skip { background: #ddd !important; color: #111; }
179
-
180
- span.cline-neutral { background: #eaeaea; }
181
- .medium { background: #eaeaea; }
182
-
183
- .cover-fill, .cover-empty {
184
- display:inline-block;
185
- height: 12px;
186
- }
187
- .chart {
188
- line-height: 0;
189
- }
190
- .cover-empty {
191
- background: white;
192
- }
193
- .cover-full {
194
- border-right: none !important;
195
- }
196
- pre.prettyprint {
197
- border: none !important;
198
- padding: 0 !important;
199
- margin: 0 !important;
200
- }
201
- .com { color: #999 !important; }
202
- .ignore-none { color: #999; font-weight: normal; }
203
-
204
- .wrapper {
205
- min-height: 100%;
206
- height: auto !important;
207
- height: 100%;
208
- margin: 0 auto -48px;
209
- }
210
- .footer, .push {
211
- height: 48px;
212
- }
@@ -1,60 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <title>Code coverage report for All files</title>
5
- <meta charset="utf-8" />
6
- <link rel="stylesheet" href="prettify.css" />
7
- <link rel="stylesheet" href="base.css" />
8
- <meta name="viewport" content="width=device-width, initial-scale=1">
9
- <style type='text/css'>
10
- .coverage-summary .sorter {
11
- background-image: url(sort-arrow-sprite.png);
12
- }
13
- </style>
14
- </head>
15
- <body>
16
- <div class='wrapper'>
17
- <div class='pad1'>
18
- <h1>
19
- All files
20
- </h1>
21
- <div class='clearfix'>
22
- </div>
23
- </div>
24
- <div class='status-line medium'></div>
25
- <div class="pad1">
26
- <table class="coverage-summary">
27
- <thead>
28
- <tr>
29
- <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
30
- <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
31
- <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
32
- <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
33
- <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
34
- <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
35
- <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
36
- <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
37
- <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
38
- <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
39
- </tr>
40
- </thead>
41
- <tbody></tbody>
42
- </table>
43
- </div><div class='push'></div><!-- for sticky footer -->
44
- </div><!-- /wrapper -->
45
- <div class='footer quiet pad2 space-top1 center small'>
46
- Code coverage
47
- generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Feb 05 2023 10:15:50 GMT+0200 (Israel Standard Time)
48
- </div>
49
- </div>
50
- <script src="prettify.js"></script>
51
- <script>
52
- window.onload = function () {
53
- if (typeof prettyPrint === 'function') {
54
- prettyPrint();
55
- }
56
- };
57
- </script>
58
- <script src="sorter.js"></script>
59
- </body>
60
- </html>
@@ -1 +0,0 @@
1
- .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
@@ -1 +0,0 @@
1
- window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
@@ -1,158 +0,0 @@
1
- var addSorting = (function () {
2
- "use strict";
3
- var cols,
4
- currentSort = {
5
- index: 0,
6
- desc: false
7
- };
8
-
9
- // returns the summary table element
10
- function getTable() { return document.querySelector('.coverage-summary'); }
11
- // returns the thead element of the summary table
12
- function getTableHeader() { return getTable().querySelector('thead tr'); }
13
- // returns the tbody element of the summary table
14
- function getTableBody() { return getTable().querySelector('tbody'); }
15
- // returns the th element for nth column
16
- function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
17
-
18
- // loads all columns
19
- function loadColumns() {
20
- var colNodes = getTableHeader().querySelectorAll('th'),
21
- colNode,
22
- cols = [],
23
- col,
24
- i;
25
-
26
- for (i = 0; i < colNodes.length; i += 1) {
27
- colNode = colNodes[i];
28
- col = {
29
- key: colNode.getAttribute('data-col'),
30
- sortable: !colNode.getAttribute('data-nosort'),
31
- type: colNode.getAttribute('data-type') || 'string'
32
- };
33
- cols.push(col);
34
- if (col.sortable) {
35
- col.defaultDescSort = col.type === 'number';
36
- colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
37
- }
38
- }
39
- return cols;
40
- }
41
- // attaches a data attribute to every tr element with an object
42
- // of data values keyed by column name
43
- function loadRowData(tableRow) {
44
- var tableCols = tableRow.querySelectorAll('td'),
45
- colNode,
46
- col,
47
- data = {},
48
- i,
49
- val;
50
- for (i = 0; i < tableCols.length; i += 1) {
51
- colNode = tableCols[i];
52
- col = cols[i];
53
- val = colNode.getAttribute('data-value');
54
- if (col.type === 'number') {
55
- val = Number(val);
56
- }
57
- data[col.key] = val;
58
- }
59
- return data;
60
- }
61
- // loads all row data
62
- function loadData() {
63
- var rows = getTableBody().querySelectorAll('tr'),
64
- i;
65
-
66
- for (i = 0; i < rows.length; i += 1) {
67
- rows[i].data = loadRowData(rows[i]);
68
- }
69
- }
70
- // sorts the table using the data for the ith column
71
- function sortByIndex(index, desc) {
72
- var key = cols[index].key,
73
- sorter = function (a, b) {
74
- a = a.data[key];
75
- b = b.data[key];
76
- return a < b ? -1 : a > b ? 1 : 0;
77
- },
78
- finalSorter = sorter,
79
- tableBody = document.querySelector('.coverage-summary tbody'),
80
- rowNodes = tableBody.querySelectorAll('tr'),
81
- rows = [],
82
- i;
83
-
84
- if (desc) {
85
- finalSorter = function (a, b) {
86
- return -1 * sorter(a, b);
87
- };
88
- }
89
-
90
- for (i = 0; i < rowNodes.length; i += 1) {
91
- rows.push(rowNodes[i]);
92
- tableBody.removeChild(rowNodes[i]);
93
- }
94
-
95
- rows.sort(finalSorter);
96
-
97
- for (i = 0; i < rows.length; i += 1) {
98
- tableBody.appendChild(rows[i]);
99
- }
100
- }
101
- // removes sort indicators for current column being sorted
102
- function removeSortIndicators() {
103
- var col = getNthColumn(currentSort.index),
104
- cls = col.className;
105
-
106
- cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
107
- col.className = cls;
108
- }
109
- // adds sort indicators for current column being sorted
110
- function addSortIndicators() {
111
- getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
112
- }
113
- // adds event listeners for all sorter widgets
114
- function enableUI() {
115
- var i,
116
- el,
117
- ithSorter = function ithSorter(i) {
118
- var col = cols[i];
119
-
120
- return function () {
121
- var desc = col.defaultDescSort;
122
-
123
- if (currentSort.index === i) {
124
- desc = !currentSort.desc;
125
- }
126
- sortByIndex(i, desc);
127
- removeSortIndicators();
128
- currentSort.index = i;
129
- currentSort.desc = desc;
130
- addSortIndicators();
131
- };
132
- };
133
- for (i =0 ; i < cols.length; i += 1) {
134
- if (cols[i].sortable) {
135
- // add the click event handler on the th so users
136
- // dont have to click on those tiny arrows
137
- el = getNthColumn(i).querySelector('.sorter').parentElement;
138
- if (el.addEventListener) {
139
- el.addEventListener('click', ithSorter(i));
140
- } else {
141
- el.attachEvent('onclick', ithSorter(i));
142
- }
143
- }
144
- }
145
- }
146
- // adds sorting functionality to the UI
147
- return function () {
148
- if (!getTable()) {
149
- return;
150
- }
151
- cols = loadColumns();
152
- loadData(cols);
153
- addSortIndicators();
154
- enableUI();
155
- };
156
- })();
157
-
158
- window.addEventListener('load', addSorting);
File without changes