@apia/testing 3.0.1 → 3.0.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
@@ -1,8 +1,38 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { EventEmitter } from '@apia/util';
3
- import { CSSProperties, FC } from 'react';
4
- import { TestComponent } from './TestComponent.js';
5
- import { TestsLogger } from './TestsLogger.js';
3
+ import * as react from 'react';
4
+ import { FC, CSSProperties } from 'react';
5
+
6
+ declare class TestComponent<T extends Record<string, unknown>> extends EventEmitter<{
7
+ update: {
8
+ id: string;
9
+ props: Partial<T>;
10
+ };
11
+ updated: string;
12
+ }> {
13
+ #private;
14
+ private name;
15
+ private test;
16
+ id: string;
17
+ Component: react.ForwardRefExoticComponent<react.RefAttributes<object>>;
18
+ constructor(name: string, test: Test, component: FC<T>, initialProps: T);
19
+ unmount: () => void;
20
+ updateProps(newProps: Partial<T>): Promise<void>;
21
+ }
22
+
23
+ type TLogType = 'error' | 'info' | 'success' | 'title' | 'warn';
24
+ declare abstract class TestsLogger {
25
+ abstract error(message: string): void;
26
+ abstract info(message: string): void;
27
+ abstract report(): void;
28
+ abstract success(message: string): void;
29
+ abstract title(message: string): void;
30
+ abstract warn(message: string): void;
31
+ /**
32
+ * Establece qué niveles se muestran y qué niveles no.
33
+ */
34
+ abstract setDebugLevels(levels: Partial<Record<TLogType, boolean>>): void;
35
+ }
6
36
 
7
37
  type TRunOptions = Partial<{
8
38
  /**
package/dist/index.js CHANGED
@@ -1,9 +1,212 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { EventEmitter, useMount } from '@apia/util';
3
- import { useState } from 'react';
4
- import { TestComponent } from './TestComponent.js';
5
- import { ConsoleTestsLogger } from './TestsLogger.js';
6
- export { TestsLogger } from './TestsLogger.js';
3
+ import { forwardRef, useState, useEffect } from 'react';
4
+
5
+ var __defProp$2 = Object.defineProperty;
6
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __publicField$2 = (obj, key, value) => {
8
+ __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
9
+ return value;
10
+ };
11
+ var __accessCheck$2 = (obj, member, msg) => {
12
+ if (!member.has(obj))
13
+ throw TypeError("Cannot " + msg);
14
+ };
15
+ var __privateGet$2 = (obj, member, getter) => {
16
+ __accessCheck$2(obj, member, "read from private field");
17
+ return getter ? getter.call(obj) : member.get(obj);
18
+ };
19
+ var __privateAdd$2 = (obj, member, value) => {
20
+ if (member.has(obj))
21
+ throw TypeError("Cannot add the same private member more than once");
22
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
23
+ };
24
+ var __privateSet$2 = (obj, member, value, setter) => {
25
+ __accessCheck$2(obj, member, "write to private field");
26
+ setter ? setter.call(obj, value) : member.set(obj, value);
27
+ return value;
28
+ };
29
+ var _component, _props;
30
+ let maxId = 0;
31
+ let maxUpdateId = 0;
32
+ class TestComponent extends EventEmitter {
33
+ constructor(name, test, component, initialProps) {
34
+ super();
35
+ this.name = name;
36
+ this.test = test;
37
+ __privateAdd$2(this, _component, void 0);
38
+ __privateAdd$2(this, _props, void 0);
39
+ __publicField$2(this, "id", `component__${maxId++}`);
40
+ __publicField$2(this, "Component", forwardRef((_, ref) => {
41
+ const [props, setProps] = useState(__privateGet$2(this, _props));
42
+ const [lastUpdateId, setLastUpdateId] = useState("");
43
+ const Render = __privateGet$2(this, _component);
44
+ useMount(() => {
45
+ const suscription = this.on("update", (ev) => {
46
+ setProps((current) => ({ ...current, ...ev.props }));
47
+ setLastUpdateId(ev.id);
48
+ });
49
+ ref({});
50
+ return suscription;
51
+ });
52
+ useEffect(() => {
53
+ setTimeout(() => {
54
+ this.emit("updated", lastUpdateId);
55
+ }, 0);
56
+ }, [lastUpdateId]);
57
+ return /* @__PURE__ */ jsx("div", { id: this.name, children: /* @__PURE__ */ jsx(Render, { ...props }) });
58
+ }));
59
+ __publicField$2(this, "unmount", () => {
60
+ this.test.unmount(this);
61
+ });
62
+ __privateSet$2(this, _component, component);
63
+ __privateSet$2(this, _props, initialProps);
64
+ }
65
+ updateProps(newProps) {
66
+ return new Promise((resolve) => {
67
+ const updateId = `update${maxUpdateId++}`;
68
+ const unsuscribe = this.on("updated", (ev) => {
69
+ if (ev === updateId) {
70
+ unsuscribe();
71
+ resolve();
72
+ }
73
+ });
74
+ setTimeout(() => {
75
+ this.emit("update", { id: updateId, props: newProps });
76
+ }, 0);
77
+ });
78
+ }
79
+ }
80
+ _component = new WeakMap();
81
+ _props = new WeakMap();
82
+
83
+ var __defProp$1 = Object.defineProperty;
84
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
85
+ var __publicField$1 = (obj, key, value) => {
86
+ __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
87
+ return value;
88
+ };
89
+ var __accessCheck$1 = (obj, member, msg) => {
90
+ if (!member.has(obj))
91
+ throw TypeError("Cannot " + msg);
92
+ };
93
+ var __privateGet$1 = (obj, member, getter) => {
94
+ __accessCheck$1(obj, member, "read from private field");
95
+ return getter ? getter.call(obj) : member.get(obj);
96
+ };
97
+ var __privateAdd$1 = (obj, member, value) => {
98
+ if (member.has(obj))
99
+ throw TypeError("Cannot add the same private member more than once");
100
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
101
+ };
102
+ var __privateSet$1 = (obj, member, value, setter) => {
103
+ __accessCheck$1(obj, member, "write to private field");
104
+ setter ? setter.call(obj, value) : member.set(obj, value);
105
+ return value;
106
+ };
107
+ var _reports, _levels, _log;
108
+ class TestsLogger {
109
+ }
110
+ class ConsoleTestsLogger extends TestsLogger {
111
+ constructor() {
112
+ super();
113
+ __publicField$1(this, "colors", {
114
+ error: "#f77",
115
+ info: "lightblue",
116
+ success: "lightgreen",
117
+ title: "white",
118
+ warn: "yellow"
119
+ });
120
+ __privateAdd$1(this, _reports, []);
121
+ __privateAdd$1(this, _levels, {
122
+ error: true,
123
+ info: true,
124
+ success: true,
125
+ title: true,
126
+ warn: true
127
+ });
128
+ __privateAdd$1(this, _log, (type, message) => {
129
+ const color = this.colors[type];
130
+ const messages = __privateGet$1(this, _reports)[__privateGet$1(this, _reports).length - 1].messages;
131
+ if (!messages[type])
132
+ messages[type] = [];
133
+ messages[type]?.push(message);
134
+ console.info(
135
+ `%c[${type}]%c: ${message}`,
136
+ `color: ${color}`,
137
+ "color: white"
138
+ );
139
+ });
140
+ __publicField$1(this, "reset", () => {
141
+ __privateSet$1(this, _reports, [
142
+ {
143
+ title: "Test without title, use method it to set test title.",
144
+ messages: {}
145
+ }
146
+ ]);
147
+ });
148
+ this.reset();
149
+ }
150
+ error(message) {
151
+ if (__privateGet$1(this, _levels).error) {
152
+ console.error(message);
153
+ __privateGet$1(this, _log).call(this, "error", message);
154
+ }
155
+ }
156
+ info(message) {
157
+ if (__privateGet$1(this, _levels).info)
158
+ __privateGet$1(this, _log).call(this, "info", message);
159
+ }
160
+ success(message) {
161
+ if (__privateGet$1(this, _levels).success)
162
+ __privateGet$1(this, _log).call(this, "success", message);
163
+ }
164
+ report() {
165
+ for (const report of __privateGet$1(this, _reports)) {
166
+ const errors = report.messages.error?.length ?? 0;
167
+ const warns = report.messages.warn?.length ?? 0;
168
+ const successes = report.messages.success?.length ?? 0;
169
+ if (successes === warns && warns === errors && errors === 0) {
170
+ if (report.title !== "Test without title, use method it to set test title.")
171
+ console.log(
172
+ `%cFor ${report.title}, no cases made.`,
173
+ "font-weight: bold; padding: 10px"
174
+ );
175
+ continue;
176
+ }
177
+ console.log(`%cFor ${report.title}`, "font-weight: bold; padding: 10px");
178
+ console.log(
179
+ `%c${successes} tests succeed.`,
180
+ `color: ${this.colors.success}`
181
+ );
182
+ console.log(`%c${warns} warnings sent.`, `color: ${this.colors.warn}`);
183
+ console.log(`%c${errors} errors found.`, `color: ${this.colors.error}`);
184
+ }
185
+ this.reset();
186
+ }
187
+ title(title) {
188
+ __privateGet$1(this, _reports).push({ title, messages: {} });
189
+ if (__privateGet$1(this, _levels).title) {
190
+ const color = this.colors.title;
191
+ console.info(
192
+ `%c${title}`,
193
+ `color: ${color}; font-weight: bold; padding: 10px`
194
+ );
195
+ }
196
+ }
197
+ warn(message) {
198
+ if (__privateGet$1(this, _levels).warn) {
199
+ console.warn(message);
200
+ __privateGet$1(this, _log).call(this, "warn", message);
201
+ }
202
+ }
203
+ setDebugLevels(levels) {
204
+ __privateSet$1(this, _levels, { ...__privateGet$1(this, _levels), ...levels });
205
+ }
206
+ }
207
+ _reports = new WeakMap();
208
+ _levels = new WeakMap();
209
+ _log = new WeakMap();
7
210
 
8
211
  var __defProp = Object.defineProperty;
9
212
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -229,5 +432,5 @@ _ref = new WeakMap();
229
432
  _running = new WeakMap();
230
433
  _run = new WeakMap();
231
434
 
232
- export { Test, TestComponent };
435
+ export { Test, TestComponent, TestsLogger };
233
436
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { EventEmitter, useMount } from '@apia/util';\nimport { CSSProperties, FC, useState } from 'react';\nimport { TestComponent } from './TestComponent';\nimport { ConsoleTestsLogger, TestsLogger } from './TestsLogger';\n\ntype TTask = {\n name: string;\n cb: () => Promise<boolean> | boolean;\n};\n\ntype TRunOptions = Partial<{\n /**\n * Delay al inicio\n */\n delay: number;\n /**\n * Cantidad de veces a ejecutar\n */\n n: number;\n /**\n * Demora entre reintentos\n */\n ms: number;\n /**\n * Omitir mensajes\n */\n silence: boolean;\n}>;\n\nexport class Test extends EventEmitter<{\n componentsListUpdated: boolean;\n componentMounted: string;\n}> {\n #components: TestComponent<any>[] = [];\n #ref: HTMLElement | null = null;\n\n logger: TestsLogger = new ConsoleTestsLogger();\n\n Component = ({ style }: { style: CSSProperties }) => {\n const [components, setComponents] = useState(this.#components);\n\n useMount(() => {\n return this.on('componentsListUpdated', () => {\n setComponents([...this.#components]);\n });\n });\n\n return (\n <div ref={(el) => (this.#ref = el)} style={{ display: 'none', ...style }}>\n {components.map((current) => (\n <current.Component\n ref={(el) => {\n if (el) this.emit('componentMounted', current.id);\n }}\n key={current.id}\n />\n ))}\n </div>\n );\n };\n\n /**\n * Devuelve el elemento html sobre el cual se están montando los tests\n */\n get root() {\n return this.#ref;\n }\n\n /**\n * Hace foco sobre un elemento del DOM y resuelve cuando puede hacer foco o\n * rompe cuando no puede hacer después de 5 intentos.\n */\n focus = (\n selector: string,\n check?: (element: HTMLElement) => boolean,\n options?: TRunOptions,\n ) => {\n const actualOptions = Object.assign({ delay: 0, ms: 250, n: 5 }, options);\n\n return new Promise<HTMLElement | null>((resolve) => {\n setTimeout(() => {\n let tries = actualOptions.n;\n const interval = setInterval(() => {\n this.logger.info(`Trying to focus with selector ${selector}`);\n tries--;\n const element = this.root?.querySelector<HTMLElement>(selector);\n\n if (element) {\n element.focus();\n\n if (check ? check(element) : element === document.activeElement) {\n clearInterval(interval);\n resolve(element);\n }\n }\n\n if (tries === 0) {\n clearInterval(interval);\n resolve(null);\n }\n }, actualOptions.ms);\n }, actualOptions.delay);\n });\n };\n\n /**\n * Anuncia un nuevo grupo de tests\n */\n it = (text: string) => {\n this.logger.title(text);\n };\n\n /**\n * Monta un componente para usarlo en el testing\n */\n mount = <T extends Record<string, unknown>>(\n name: string,\n component: FC<T>,\n initialProps: T,\n ) => {\n return new Promise<TestComponent<T>>((resolve) => {\n const newComponent = new TestComponent(\n name,\n this,\n component,\n initialProps,\n );\n this.#components.push(newComponent);\n this.emit('componentsListUpdated', true);\n const unsuscribe = this.on('componentMounted', (ev) => {\n if (ev === newComponent.id) {\n unsuscribe();\n resolve(newComponent);\n }\n });\n });\n };\n\n report = () => {\n this.logger.report();\n };\n\n #running = false;\n\n /**\n * Corre una tarea que va a intentar hasta n veces cada ms milisegundos antes\n * de resolver como fallo.\n *\n * @parameter options\n */\n should = async (\n name: string,\n cb: () => boolean | Promise<boolean>,\n options?: Omit<TRunOptions, 'silence'>,\n ) => {\n await this.wait('', () => !this.#running, { silence: true, n: 300 });\n\n this.#running = true;\n const actualOptions = Object.assign({ delay: 0, ms: 250, n: 5 }, options);\n\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n let tries = actualOptions.n;\n\n const tryAgain = () => {\n window.requestAnimationFrame(() => {\n this.#run({ name, cb })\n .then((result) => {\n if (!result && tries-- > 0) {\n setTimeout(() => {\n tryAgain();\n }, actualOptions.ms);\n this.logger.warn(`[RETRY ${5 - tries}] ${name}`);\n } else if (result) {\n this.logger.success(`${name}`);\n resolve();\n this.#running = false;\n } else {\n this.logger.error(name);\n resolve();\n this.#running = false;\n }\n })\n .catch(() => {\n if (tries-- > 0) {\n setTimeout(() => {\n tryAgain();\n }, actualOptions.ms);\n this.logger.warn(`[RETRY ${5 - tries}] ${name}`);\n } else {\n this.logger.error(`[CATCH] ${name}`);\n resolve();\n this.#running = false;\n }\n });\n });\n };\n\n tryAgain();\n }, actualOptions.delay);\n });\n };\n\n unmount = (component: TestComponent<any>) => {\n this.#components = this.#components.filter(\n (current) => current !== component,\n );\n this.emit('componentsListUpdated', true);\n };\n\n /**\n * Espera por una condición a suceder, intentando n veces cada ms\n * milisegundos. La diferencia principal con should es que este método no se\n * ocupa de si un test pasa o falla, sino simplemente que trata de cumplir una\n * condición. Es especialmente útil para intentar hacer foco o esperar algún\n * evento en un futuro cercano.\n */\n wait = async (\n name: string,\n cb: () => boolean | Promise<boolean>,\n options?: TRunOptions,\n ) => {\n const actualOptions = Object.assign({ delay: 0, ms: 250, n: 5 }, options);\n\n return new Promise((resolve) => {\n setTimeout(() => {\n let tries = actualOptions.n;\n\n if (!actualOptions.silence) this.logger.info(`[WAITING] ${name}`);\n\n const tryAgain = () => {\n window.requestAnimationFrame(() => {\n if (tries-- > 0) {\n void (async () => {\n const result = await cb();\n if (!result) {\n setTimeout(() => {\n tryAgain();\n }, actualOptions.ms);\n } else {\n resolve(true);\n }\n })();\n } else {\n resolve(false);\n }\n });\n };\n\n tryAgain();\n }, actualOptions.delay);\n });\n };\n\n #run = async (task: TTask) => {\n try {\n const taskResult = await task.cb();\n\n if (taskResult) {\n return true;\n } else {\n return false;\n }\n } catch (e) {\n this.logger.error(String(e));\n return false;\n }\n };\n}\n\nexport { TestComponent, TestsLogger };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/TestComponent.tsx","../src/TestsLogger.ts","../src/index.tsx"],"sourcesContent":["import { FC, RefCallback, forwardRef, useEffect, useState } from 'react';\nimport { EventEmitter, useMount } from '@apia/util';\nimport { Test } from '.';\n\nlet maxId = 0;\nlet maxUpdateId = 0;\n\nexport class TestComponent<\n T extends Record<string, unknown>,\n> extends EventEmitter<{\n update: { id: string; props: Partial<T> };\n updated: string;\n}> {\n #component: FC<T>;\n #props: T;\n\n id = `component__${maxId++}`;\n\n Component = forwardRef<object>((_, ref) => {\n const [props, setProps] = useState(this.#props);\n const [lastUpdateId, setLastUpdateId] = useState('');\n\n const Render = this.#component;\n\n useMount(() => {\n const suscription = this.on('update', (ev) => {\n setProps((current) => ({ ...current, ...ev.props }));\n setLastUpdateId(ev.id);\n });\n\n (ref as RefCallback<object>)({});\n\n return suscription;\n });\n\n useEffect(() => {\n setTimeout(() => {\n this.emit('updated', lastUpdateId);\n }, 0);\n }, [lastUpdateId]);\n\n return (\n <div id={this.name}>\n <Render {...props} />\n </div>\n );\n });\n\n constructor(\n private name: string,\n private test: Test,\n component: FC<T>,\n initialProps: T,\n ) {\n super();\n\n this.#component = component;\n this.#props = initialProps;\n }\n\n unmount = () => {\n this.test.unmount(this);\n };\n\n updateProps(newProps: Partial<T>) {\n return new Promise<void>((resolve) => {\n const updateId = `update${maxUpdateId++}`;\n const unsuscribe = this.on('updated', (ev) => {\n if (ev === updateId) {\n unsuscribe();\n resolve();\n }\n });\n setTimeout(() => {\n this.emit('update', { id: updateId, props: newProps });\n }, 0);\n });\n }\n}\n","export type TLogType = 'error' | 'info' | 'success' | 'title' | 'warn';\n\nexport abstract class TestsLogger {\n abstract error(message: string): void;\n abstract info(message: string): void;\n abstract report(): void;\n abstract success(message: string): void;\n abstract title(message: string): void;\n abstract warn(message: string): void;\n\n /**\n * Establece qué niveles se muestran y qué niveles no.\n */\n abstract setDebugLevels(levels: Partial<Record<TLogType, boolean>>): void;\n}\n\nexport class ConsoleTestsLogger extends TestsLogger {\n colors = {\n error: '#f77',\n info: 'lightblue',\n success: 'lightgreen',\n title: 'white',\n warn: 'yellow',\n };\n\n #reports: {\n title: string;\n messages: Partial<Record<keyof TestsLogger, string[]>>;\n }[] = [];\n\n #levels = {\n error: true,\n info: true,\n success: true,\n title: true,\n warn: true,\n };\n\n #log = (type: TLogType, message: string) => {\n const color = this.colors[type];\n\n const messages = this.#reports[this.#reports.length - 1].messages;\n if (!messages[type]) messages[type] = [];\n messages[type]?.push(message);\n\n console.info(\n `%c[${type}]%c: ${message}`,\n `color: ${color}`,\n 'color: white',\n );\n };\n\n constructor() {\n super();\n\n this.reset();\n }\n\n error(message: string): void {\n if (this.#levels.error) {\n console.error(message);\n this.#log('error', message);\n }\n }\n\n info(message: string): void {\n if (this.#levels.info) this.#log('info', message);\n }\n\n success(message: string): void {\n if (this.#levels.success) this.#log('success', message);\n }\n\n report() {\n for (const report of this.#reports) {\n const errors = report.messages.error?.length ?? 0;\n const warns = report.messages.warn?.length ?? 0;\n const successes = report.messages.success?.length ?? 0;\n\n if (successes === warns && warns === errors && errors === 0) {\n if (\n report.title !==\n 'Test without title, use method it to set test title.'\n )\n console.log(\n `%cFor ${report.title}, no cases made.`,\n 'font-weight: bold; padding: 10px',\n );\n continue;\n }\n\n console.log(`%cFor ${report.title}`, 'font-weight: bold; padding: 10px');\n console.log(\n `%c${successes} tests succeed.`,\n `color: ${this.colors.success}`,\n );\n console.log(`%c${warns} warnings sent.`, `color: ${this.colors.warn}`);\n console.log(`%c${errors} errors found.`, `color: ${this.colors.error}`);\n }\n\n this.reset();\n }\n\n reset = () => {\n this.#reports = [\n {\n title: 'Test without title, use method it to set test title.',\n messages: {},\n },\n ];\n };\n\n title(title: string): void {\n this.#reports.push({ title, messages: {} });\n\n if (this.#levels.title) {\n const color = this.colors.title;\n\n console.info(\n `%c${title}`,\n `color: ${color}; font-weight: bold; padding: 10px`,\n );\n }\n }\n\n warn(message: string): void {\n if (this.#levels.warn) {\n console.warn(message);\n this.#log('warn', message);\n }\n }\n\n setDebugLevels(levels: Partial<Record<TLogType, boolean>>): void {\n this.#levels = { ...this.#levels, ...levels };\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { EventEmitter, useMount } from '@apia/util';\nimport { CSSProperties, FC, useState } from 'react';\nimport { TestComponent } from './TestComponent';\nimport { ConsoleTestsLogger, TestsLogger } from './TestsLogger';\n\ntype TTask = {\n name: string;\n cb: () => Promise<boolean> | boolean;\n};\n\ntype TRunOptions = Partial<{\n /**\n * Delay al inicio\n */\n delay: number;\n /**\n * Cantidad de veces a ejecutar\n */\n n: number;\n /**\n * Demora entre reintentos\n */\n ms: number;\n /**\n * Omitir mensajes\n */\n silence: boolean;\n}>;\n\nexport class Test extends EventEmitter<{\n componentsListUpdated: boolean;\n componentMounted: string;\n}> {\n #components: TestComponent<any>[] = [];\n #ref: HTMLElement | null = null;\n\n logger: TestsLogger = new ConsoleTestsLogger();\n\n Component = ({ style }: { style: CSSProperties }) => {\n const [components, setComponents] = useState(this.#components);\n\n useMount(() => {\n return this.on('componentsListUpdated', () => {\n setComponents([...this.#components]);\n });\n });\n\n return (\n <div ref={(el) => (this.#ref = el)} style={{ display: 'none', ...style }}>\n {components.map((current) => (\n <current.Component\n ref={(el) => {\n if (el) this.emit('componentMounted', current.id);\n }}\n key={current.id}\n />\n ))}\n </div>\n );\n };\n\n /**\n * Devuelve el elemento html sobre el cual se están montando los tests\n */\n get root() {\n return this.#ref;\n }\n\n /**\n * Hace foco sobre un elemento del DOM y resuelve cuando puede hacer foco o\n * rompe cuando no puede hacer después de 5 intentos.\n */\n focus = (\n selector: string,\n check?: (element: HTMLElement) => boolean,\n options?: TRunOptions,\n ) => {\n const actualOptions = Object.assign({ delay: 0, ms: 250, n: 5 }, options);\n\n return new Promise<HTMLElement | null>((resolve) => {\n setTimeout(() => {\n let tries = actualOptions.n;\n const interval = setInterval(() => {\n this.logger.info(`Trying to focus with selector ${selector}`);\n tries--;\n const element = this.root?.querySelector<HTMLElement>(selector);\n\n if (element) {\n element.focus();\n\n if (check ? check(element) : element === document.activeElement) {\n clearInterval(interval);\n resolve(element);\n }\n }\n\n if (tries === 0) {\n clearInterval(interval);\n resolve(null);\n }\n }, actualOptions.ms);\n }, actualOptions.delay);\n });\n };\n\n /**\n * Anuncia un nuevo grupo de tests\n */\n it = (text: string) => {\n this.logger.title(text);\n };\n\n /**\n * Monta un componente para usarlo en el testing\n */\n mount = <T extends Record<string, unknown>>(\n name: string,\n component: FC<T>,\n initialProps: T,\n ) => {\n return new Promise<TestComponent<T>>((resolve) => {\n const newComponent = new TestComponent(\n name,\n this,\n component,\n initialProps,\n );\n this.#components.push(newComponent);\n this.emit('componentsListUpdated', true);\n const unsuscribe = this.on('componentMounted', (ev) => {\n if (ev === newComponent.id) {\n unsuscribe();\n resolve(newComponent);\n }\n });\n });\n };\n\n report = () => {\n this.logger.report();\n };\n\n #running = false;\n\n /**\n * Corre una tarea que va a intentar hasta n veces cada ms milisegundos antes\n * de resolver como fallo.\n *\n * @parameter options\n */\n should = async (\n name: string,\n cb: () => boolean | Promise<boolean>,\n options?: Omit<TRunOptions, 'silence'>,\n ) => {\n await this.wait('', () => !this.#running, { silence: true, n: 300 });\n\n this.#running = true;\n const actualOptions = Object.assign({ delay: 0, ms: 250, n: 5 }, options);\n\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n let tries = actualOptions.n;\n\n const tryAgain = () => {\n window.requestAnimationFrame(() => {\n this.#run({ name, cb })\n .then((result) => {\n if (!result && tries-- > 0) {\n setTimeout(() => {\n tryAgain();\n }, actualOptions.ms);\n this.logger.warn(`[RETRY ${5 - tries}] ${name}`);\n } else if (result) {\n this.logger.success(`${name}`);\n resolve();\n this.#running = false;\n } else {\n this.logger.error(name);\n resolve();\n this.#running = false;\n }\n })\n .catch(() => {\n if (tries-- > 0) {\n setTimeout(() => {\n tryAgain();\n }, actualOptions.ms);\n this.logger.warn(`[RETRY ${5 - tries}] ${name}`);\n } else {\n this.logger.error(`[CATCH] ${name}`);\n resolve();\n this.#running = false;\n }\n });\n });\n };\n\n tryAgain();\n }, actualOptions.delay);\n });\n };\n\n unmount = (component: TestComponent<any>) => {\n this.#components = this.#components.filter(\n (current) => current !== component,\n );\n this.emit('componentsListUpdated', true);\n };\n\n /**\n * Espera por una condición a suceder, intentando n veces cada ms\n * milisegundos. La diferencia principal con should es que este método no se\n * ocupa de si un test pasa o falla, sino simplemente que trata de cumplir una\n * condición. Es especialmente útil para intentar hacer foco o esperar algún\n * evento en un futuro cercano.\n */\n wait = async (\n name: string,\n cb: () => boolean | Promise<boolean>,\n options?: TRunOptions,\n ) => {\n const actualOptions = Object.assign({ delay: 0, ms: 250, n: 5 }, options);\n\n return new Promise((resolve) => {\n setTimeout(() => {\n let tries = actualOptions.n;\n\n if (!actualOptions.silence) this.logger.info(`[WAITING] ${name}`);\n\n const tryAgain = () => {\n window.requestAnimationFrame(() => {\n if (tries-- > 0) {\n void (async () => {\n const result = await cb();\n if (!result) {\n setTimeout(() => {\n tryAgain();\n }, actualOptions.ms);\n } else {\n resolve(true);\n }\n })();\n } else {\n resolve(false);\n }\n });\n };\n\n tryAgain();\n }, actualOptions.delay);\n });\n };\n\n #run = async (task: TTask) => {\n try {\n const taskResult = await task.cb();\n\n if (taskResult) {\n return true;\n } else {\n return false;\n }\n } catch (e) {\n this.logger.error(String(e));\n return false;\n }\n };\n}\n\nexport { TestComponent, TestsLogger };\n"],"names":["__privateAdd","__publicField","__privateGet","__privateSet"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apia/testing",
3
- "version": "3.0.1",
3
+ "version": "3.0.6",
4
4
  "sideEffects": false,
5
5
  "author": "Alexis Leite <alexisleite@live.com>",
6
6
  "main": "dist/index.js",
@@ -13,7 +13,7 @@
13
13
  "libWatch": "rollup --watch --config ../../config/rollup.common.mjs --environment MODE:development,ENTRY:index.tsx,WATCH:true"
14
14
  },
15
15
  "dependencies": {
16
- "@apia/util": "^3.0.1"
16
+ "@apia/util": "^3.0.6"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/react": "^18.2.43",
@@ -30,5 +30,5 @@
30
30
  "access": "public",
31
31
  "registry": "https://registry.npmjs.org/"
32
32
  },
33
- "gitHead": "1fc338a96b6dc90632052f9bd032992f6aedb6a6"
33
+ "gitHead": "964a51f08ff5c0da7568511abe73b48a67f70dc5"
34
34
  }
@@ -1,24 +0,0 @@
1
- import * as react from 'react';
2
- import { FC } from 'react';
3
- import { EventEmitter } from '@apia/util';
4
- import { Test } from './index.js';
5
-
6
- declare class TestComponent<T extends Record<string, unknown>> extends EventEmitter<{
7
- update: {
8
- id: string;
9
- props: Partial<T>;
10
- };
11
- updated: string;
12
- }> {
13
- #private;
14
- private name;
15
- private test;
16
- id: string;
17
- Component: react.ForwardRefExoticComponent<react.RefAttributes<object>>;
18
- constructor(name: string, test: Test, component: FC<T>, initialProps: T);
19
- unmount: () => void;
20
- updateProps(newProps: Partial<T>): Promise<void>;
21
- }
22
-
23
- export { TestComponent };
24
- //# sourceMappingURL=TestComponent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestComponent.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,84 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { forwardRef, useState, useEffect } from 'react';
3
- import { EventEmitter, useMount } from '@apia/util';
4
-
5
- var __defProp = Object.defineProperty;
6
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
- var __publicField = (obj, key, value) => {
8
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
- return value;
10
- };
11
- var __accessCheck = (obj, member, msg) => {
12
- if (!member.has(obj))
13
- throw TypeError("Cannot " + msg);
14
- };
15
- var __privateGet = (obj, member, getter) => {
16
- __accessCheck(obj, member, "read from private field");
17
- return getter ? getter.call(obj) : member.get(obj);
18
- };
19
- var __privateAdd = (obj, member, value) => {
20
- if (member.has(obj))
21
- throw TypeError("Cannot add the same private member more than once");
22
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
23
- };
24
- var __privateSet = (obj, member, value, setter) => {
25
- __accessCheck(obj, member, "write to private field");
26
- setter ? setter.call(obj, value) : member.set(obj, value);
27
- return value;
28
- };
29
- var _component, _props;
30
- let maxId = 0;
31
- let maxUpdateId = 0;
32
- class TestComponent extends EventEmitter {
33
- constructor(name, test, component, initialProps) {
34
- super();
35
- this.name = name;
36
- this.test = test;
37
- __privateAdd(this, _component, void 0);
38
- __privateAdd(this, _props, void 0);
39
- __publicField(this, "id", `component__${maxId++}`);
40
- __publicField(this, "Component", forwardRef((_, ref) => {
41
- const [props, setProps] = useState(__privateGet(this, _props));
42
- const [lastUpdateId, setLastUpdateId] = useState("");
43
- const Render = __privateGet(this, _component);
44
- useMount(() => {
45
- const suscription = this.on("update", (ev) => {
46
- setProps((current) => ({ ...current, ...ev.props }));
47
- setLastUpdateId(ev.id);
48
- });
49
- ref({});
50
- return suscription;
51
- });
52
- useEffect(() => {
53
- setTimeout(() => {
54
- this.emit("updated", lastUpdateId);
55
- }, 0);
56
- }, [lastUpdateId]);
57
- return /* @__PURE__ */ jsx("div", { id: this.name, children: /* @__PURE__ */ jsx(Render, { ...props }) });
58
- }));
59
- __publicField(this, "unmount", () => {
60
- this.test.unmount(this);
61
- });
62
- __privateSet(this, _component, component);
63
- __privateSet(this, _props, initialProps);
64
- }
65
- updateProps(newProps) {
66
- return new Promise((resolve) => {
67
- const updateId = `update${maxUpdateId++}`;
68
- const unsuscribe = this.on("updated", (ev) => {
69
- if (ev === updateId) {
70
- unsuscribe();
71
- resolve();
72
- }
73
- });
74
- setTimeout(() => {
75
- this.emit("update", { id: updateId, props: newProps });
76
- }, 0);
77
- });
78
- }
79
- }
80
- _component = new WeakMap();
81
- _props = new WeakMap();
82
-
83
- export { TestComponent };
84
- //# sourceMappingURL=TestComponent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestComponent.js","sources":["../src/TestComponent.tsx"],"sourcesContent":["import { FC, RefCallback, forwardRef, useEffect, useState } from 'react';\nimport { EventEmitter, useMount } from '@apia/util';\nimport { Test } from '.';\n\nlet maxId = 0;\nlet maxUpdateId = 0;\n\nexport class TestComponent<\n T extends Record<string, unknown>,\n> extends EventEmitter<{\n update: { id: string; props: Partial<T> };\n updated: string;\n}> {\n #component: FC<T>;\n #props: T;\n\n id = `component__${maxId++}`;\n\n Component = forwardRef<object>((_, ref) => {\n const [props, setProps] = useState(this.#props);\n const [lastUpdateId, setLastUpdateId] = useState('');\n\n const Render = this.#component;\n\n useMount(() => {\n const suscription = this.on('update', (ev) => {\n setProps((current) => ({ ...current, ...ev.props }));\n setLastUpdateId(ev.id);\n });\n\n (ref as RefCallback<object>)({});\n\n return suscription;\n });\n\n useEffect(() => {\n setTimeout(() => {\n this.emit('updated', lastUpdateId);\n }, 0);\n }, [lastUpdateId]);\n\n return (\n <div id={this.name}>\n <Render {...props} />\n </div>\n );\n });\n\n constructor(\n private name: string,\n private test: Test,\n component: FC<T>,\n initialProps: T,\n ) {\n super();\n\n this.#component = component;\n this.#props = initialProps;\n }\n\n unmount = () => {\n this.test.unmount(this);\n };\n\n updateProps(newProps: Partial<T>) {\n return new Promise<void>((resolve) => {\n const updateId = `update${maxUpdateId++}`;\n const unsuscribe = this.on('updated', (ev) => {\n if (ev === updateId) {\n unsuscribe();\n resolve();\n }\n });\n setTimeout(() => {\n this.emit('update', { id: updateId, props: newProps });\n }, 0);\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,UAAA,EAAA,MAAA,CAAA;AAIA,IAAI,KAAQ,GAAA,CAAA,CAAA;AACZ,IAAI,WAAc,GAAA,CAAA,CAAA;AAEX,MAAM,sBAEH,YAGP,CAAA;AAAA,EAoCD,WACU,CAAA,IAAA,EACA,IACR,EAAA,SAAA,EACA,YACA,EAAA;AACA,IAAM,KAAA,EAAA,CAAA;AALE,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AArCV,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAK,cAAc,KAAO,EAAA,CAAA,CAAA,CAAA,CAAA;AAE1B,IAAY,aAAA,CAAA,IAAA,EAAA,WAAA,EAAA,UAAA,CAAmB,CAAC,CAAA,EAAG,GAAQ,KAAA;AACzC,MAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAS,mBAAK,MAAM,CAAA,CAAA,CAAA;AAC9C,MAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,EAAE,CAAA,CAAA;AAEnD,MAAA,MAAM,SAAS,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAEpB,MAAA,QAAA,CAAS,MAAM;AACb,QAAA,MAAM,WAAc,GAAA,IAAA,CAAK,EAAG,CAAA,QAAA,EAAU,CAAC,EAAO,KAAA;AAC5C,UAAS,QAAA,CAAA,CAAC,aAAa,EAAE,GAAG,SAAS,GAAG,EAAA,CAAG,OAAQ,CAAA,CAAA,CAAA;AACnD,UAAA,eAAA,CAAgB,GAAG,EAAE,CAAA,CAAA;AAAA,SACtB,CAAA,CAAA;AAED,QAAC,GAAA,CAA4B,EAAE,CAAA,CAAA;AAE/B,QAAO,OAAA,WAAA,CAAA;AAAA,OACR,CAAA,CAAA;AAED,MAAA,SAAA,CAAU,MAAM;AACd,QAAA,UAAA,CAAW,MAAM;AACf,UAAK,IAAA,CAAA,IAAA,CAAK,WAAW,YAAY,CAAA,CAAA;AAAA,WAChC,CAAC,CAAA,CAAA;AAAA,OACN,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,MACE,uBAAA,GAAA,CAAC,SAAI,EAAI,EAAA,IAAA,CAAK,MACZ,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAQ,GAAG,KAAA,EAAO,CACrB,EAAA,CAAA,CAAA;AAAA,KAEH,CAAA,CAAA,CAAA;AAcD,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAU,MAAM;AACd,MAAK,IAAA,CAAA,IAAA,CAAK,QAAQ,IAAI,CAAA,CAAA;AAAA,KACxB,CAAA,CAAA;AANE,IAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,SAAA,CAAA,CAAA;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,YAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EAMA,YAAY,QAAsB,EAAA;AAChC,IAAO,OAAA,IAAI,OAAc,CAAA,CAAC,OAAY,KAAA;AACpC,MAAM,MAAA,QAAA,GAAW,SAAS,WAAa,EAAA,CAAA,CAAA,CAAA;AACvC,MAAA,MAAM,UAAa,GAAA,IAAA,CAAK,EAAG,CAAA,SAAA,EAAW,CAAC,EAAO,KAAA;AAC5C,QAAA,IAAI,OAAO,QAAU,EAAA;AACnB,UAAW,UAAA,EAAA,CAAA;AACX,UAAQ,OAAA,EAAA,CAAA;AAAA,SACV;AAAA,OACD,CAAA,CAAA;AACD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,KAAK,QAAU,EAAA,EAAE,IAAI,QAAU,EAAA,KAAA,EAAO,UAAU,CAAA,CAAA;AAAA,SACpD,CAAC,CAAA,CAAA;AAAA,KACL,CAAA,CAAA;AAAA,GACH;AACF,CAAA;AAjEE,UAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,MAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1,16 +0,0 @@
1
- type TLogType = 'error' | 'info' | 'success' | 'title' | 'warn';
2
- declare abstract class TestsLogger {
3
- abstract error(message: string): void;
4
- abstract info(message: string): void;
5
- abstract report(): void;
6
- abstract success(message: string): void;
7
- abstract title(message: string): void;
8
- abstract warn(message: string): void;
9
- /**
10
- * Establece qué niveles se muestran y qué niveles no.
11
- */
12
- abstract setDebugLevels(levels: Partial<Record<TLogType, boolean>>): void;
13
- }
14
-
15
- export { type TLogType, TestsLogger };
16
- //# sourceMappingURL=TestsLogger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestsLogger.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,130 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
4
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- return value;
6
- };
7
- var __accessCheck = (obj, member, msg) => {
8
- if (!member.has(obj))
9
- throw TypeError("Cannot " + msg);
10
- };
11
- var __privateGet = (obj, member, getter) => {
12
- __accessCheck(obj, member, "read from private field");
13
- return getter ? getter.call(obj) : member.get(obj);
14
- };
15
- var __privateAdd = (obj, member, value) => {
16
- if (member.has(obj))
17
- throw TypeError("Cannot add the same private member more than once");
18
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
19
- };
20
- var __privateSet = (obj, member, value, setter) => {
21
- __accessCheck(obj, member, "write to private field");
22
- setter ? setter.call(obj, value) : member.set(obj, value);
23
- return value;
24
- };
25
- var _reports, _levels, _log;
26
- class TestsLogger {
27
- }
28
- class ConsoleTestsLogger extends TestsLogger {
29
- constructor() {
30
- super();
31
- __publicField(this, "colors", {
32
- error: "#f77",
33
- info: "lightblue",
34
- success: "lightgreen",
35
- title: "white",
36
- warn: "yellow"
37
- });
38
- __privateAdd(this, _reports, []);
39
- __privateAdd(this, _levels, {
40
- error: true,
41
- info: true,
42
- success: true,
43
- title: true,
44
- warn: true
45
- });
46
- __privateAdd(this, _log, (type, message) => {
47
- const color = this.colors[type];
48
- const messages = __privateGet(this, _reports)[__privateGet(this, _reports).length - 1].messages;
49
- if (!messages[type])
50
- messages[type] = [];
51
- messages[type]?.push(message);
52
- console.info(
53
- `%c[${type}]%c: ${message}`,
54
- `color: ${color}`,
55
- "color: white"
56
- );
57
- });
58
- __publicField(this, "reset", () => {
59
- __privateSet(this, _reports, [
60
- {
61
- title: "Test without title, use method it to set test title.",
62
- messages: {}
63
- }
64
- ]);
65
- });
66
- this.reset();
67
- }
68
- error(message) {
69
- if (__privateGet(this, _levels).error) {
70
- console.error(message);
71
- __privateGet(this, _log).call(this, "error", message);
72
- }
73
- }
74
- info(message) {
75
- if (__privateGet(this, _levels).info)
76
- __privateGet(this, _log).call(this, "info", message);
77
- }
78
- success(message) {
79
- if (__privateGet(this, _levels).success)
80
- __privateGet(this, _log).call(this, "success", message);
81
- }
82
- report() {
83
- for (const report of __privateGet(this, _reports)) {
84
- const errors = report.messages.error?.length ?? 0;
85
- const warns = report.messages.warn?.length ?? 0;
86
- const successes = report.messages.success?.length ?? 0;
87
- if (successes === warns && warns === errors && errors === 0) {
88
- if (report.title !== "Test without title, use method it to set test title.")
89
- console.log(
90
- `%cFor ${report.title}, no cases made.`,
91
- "font-weight: bold; padding: 10px"
92
- );
93
- continue;
94
- }
95
- console.log(`%cFor ${report.title}`, "font-weight: bold; padding: 10px");
96
- console.log(
97
- `%c${successes} tests succeed.`,
98
- `color: ${this.colors.success}`
99
- );
100
- console.log(`%c${warns} warnings sent.`, `color: ${this.colors.warn}`);
101
- console.log(`%c${errors} errors found.`, `color: ${this.colors.error}`);
102
- }
103
- this.reset();
104
- }
105
- title(title) {
106
- __privateGet(this, _reports).push({ title, messages: {} });
107
- if (__privateGet(this, _levels).title) {
108
- const color = this.colors.title;
109
- console.info(
110
- `%c${title}`,
111
- `color: ${color}; font-weight: bold; padding: 10px`
112
- );
113
- }
114
- }
115
- warn(message) {
116
- if (__privateGet(this, _levels).warn) {
117
- console.warn(message);
118
- __privateGet(this, _log).call(this, "warn", message);
119
- }
120
- }
121
- setDebugLevels(levels) {
122
- __privateSet(this, _levels, { ...__privateGet(this, _levels), ...levels });
123
- }
124
- }
125
- _reports = new WeakMap();
126
- _levels = new WeakMap();
127
- _log = new WeakMap();
128
-
129
- export { ConsoleTestsLogger, TestsLogger };
130
- //# sourceMappingURL=TestsLogger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TestsLogger.js","sources":["../src/TestsLogger.ts"],"sourcesContent":["export type TLogType = 'error' | 'info' | 'success' | 'title' | 'warn';\n\nexport abstract class TestsLogger {\n abstract error(message: string): void;\n abstract info(message: string): void;\n abstract report(): void;\n abstract success(message: string): void;\n abstract title(message: string): void;\n abstract warn(message: string): void;\n\n /**\n * Establece qué niveles se muestran y qué niveles no.\n */\n abstract setDebugLevels(levels: Partial<Record<TLogType, boolean>>): void;\n}\n\nexport class ConsoleTestsLogger extends TestsLogger {\n colors = {\n error: '#f77',\n info: 'lightblue',\n success: 'lightgreen',\n title: 'white',\n warn: 'yellow',\n };\n\n #reports: {\n title: string;\n messages: Partial<Record<keyof TestsLogger, string[]>>;\n }[] = [];\n\n #levels = {\n error: true,\n info: true,\n success: true,\n title: true,\n warn: true,\n };\n\n #log = (type: TLogType, message: string) => {\n const color = this.colors[type];\n\n const messages = this.#reports[this.#reports.length - 1].messages;\n if (!messages[type]) messages[type] = [];\n messages[type]?.push(message);\n\n console.info(\n `%c[${type}]%c: ${message}`,\n `color: ${color}`,\n 'color: white',\n );\n };\n\n constructor() {\n super();\n\n this.reset();\n }\n\n error(message: string): void {\n if (this.#levels.error) {\n console.error(message);\n this.#log('error', message);\n }\n }\n\n info(message: string): void {\n if (this.#levels.info) this.#log('info', message);\n }\n\n success(message: string): void {\n if (this.#levels.success) this.#log('success', message);\n }\n\n report() {\n for (const report of this.#reports) {\n const errors = report.messages.error?.length ?? 0;\n const warns = report.messages.warn?.length ?? 0;\n const successes = report.messages.success?.length ?? 0;\n\n if (successes === warns && warns === errors && errors === 0) {\n if (\n report.title !==\n 'Test without title, use method it to set test title.'\n )\n console.log(\n `%cFor ${report.title}, no cases made.`,\n 'font-weight: bold; padding: 10px',\n );\n continue;\n }\n\n console.log(`%cFor ${report.title}`, 'font-weight: bold; padding: 10px');\n console.log(\n `%c${successes} tests succeed.`,\n `color: ${this.colors.success}`,\n );\n console.log(`%c${warns} warnings sent.`, `color: ${this.colors.warn}`);\n console.log(`%c${errors} errors found.`, `color: ${this.colors.error}`);\n }\n\n this.reset();\n }\n\n reset = () => {\n this.#reports = [\n {\n title: 'Test without title, use method it to set test title.',\n messages: {},\n },\n ];\n };\n\n title(title: string): void {\n this.#reports.push({ title, messages: {} });\n\n if (this.#levels.title) {\n const color = this.colors.title;\n\n console.info(\n `%c${title}`,\n `color: ${color}; font-weight: bold; padding: 10px`,\n );\n }\n }\n\n warn(message: string): void {\n if (this.#levels.warn) {\n console.warn(message);\n this.#log('warn', message);\n }\n }\n\n setDebugLevels(levels: Partial<Record<TLogType, boolean>>): void {\n this.#levels = { ...this.#levels, ...levels };\n }\n}\n"],"names":[],"mappings":"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"}