@atlassian/clientside-extensions-debug 2.4.0-69e0f9e-kugbhrvw
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/LICENSE.txt +30 -0
- package/README.md +7 -0
- package/dist/cjs/debug-state-env.test.js +63 -0
- package/dist/cjs/debug-state-env.test.js.map +1 -0
- package/dist/cjs/debug-state.js +155 -0
- package/dist/cjs/debug-state.js.map +1 -0
- package/dist/cjs/debug-state.test.js +66 -0
- package/dist/cjs/debug-state.test.js.map +1 -0
- package/dist/cjs/debug-subjects.js +42 -0
- package/dist/cjs/debug-subjects.js.map +1 -0
- package/dist/cjs/debug-subjects.test.js +35 -0
- package/dist/cjs/debug-subjects.test.js.map +1 -0
- package/dist/cjs/debug.js +23 -0
- package/dist/cjs/debug.js.map +1 -0
- package/dist/cjs/debug.test.js +75 -0
- package/dist/cjs/debug.test.js.map +1 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logger/console.js +64 -0
- package/dist/cjs/logger/console.js.map +1 -0
- package/dist/cjs/logger/console.test.js +200 -0
- package/dist/cjs/logger/console.test.js.map +1 -0
- package/dist/cjs/logger/default-logger.js +48 -0
- package/dist/cjs/logger/default-logger.js.map +1 -0
- package/dist/cjs/logger/logger.js +16 -0
- package/dist/cjs/logger/logger.js.map +1 -0
- package/dist/esm/debug-state-env.test.js +42 -0
- package/dist/esm/debug-state-env.test.js.map +1 -0
- package/dist/esm/debug-state.js +152 -0
- package/dist/esm/debug-state.js.map +1 -0
- package/dist/esm/debug-state.test.js +63 -0
- package/dist/esm/debug-state.test.js.map +1 -0
- package/dist/esm/debug-subjects.js +39 -0
- package/dist/esm/debug-subjects.js.map +1 -0
- package/dist/esm/debug-subjects.test.js +33 -0
- package/dist/esm/debug-subjects.test.js.map +1 -0
- package/dist/esm/debug.js +20 -0
- package/dist/esm/debug.js.map +1 -0
- package/dist/esm/debug.test.js +73 -0
- package/dist/esm/debug.test.js.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger/console.js +61 -0
- package/dist/esm/logger/console.js.map +1 -0
- package/dist/esm/logger/console.test.js +198 -0
- package/dist/esm/logger/console.test.js.map +1 -0
- package/dist/esm/logger/default-logger.js +46 -0
- package/dist/esm/logger/default-logger.js.map +1 -0
- package/dist/esm/logger/logger.js +14 -0
- package/dist/esm/logger/logger.js.map +1 -0
- package/dist/types/debug-state-env.test.d.ts +2 -0
- package/dist/types/debug-state-env.test.d.ts.map +1 -0
- package/dist/types/debug-state.d.ts +41 -0
- package/dist/types/debug-state.d.ts.map +1 -0
- package/dist/types/debug-state.test.d.ts +2 -0
- package/dist/types/debug-state.test.d.ts.map +1 -0
- package/dist/types/debug-subjects.d.ts +25 -0
- package/dist/types/debug-subjects.d.ts.map +1 -0
- package/dist/types/debug-subjects.test.d.ts +2 -0
- package/dist/types/debug-subjects.test.d.ts.map +1 -0
- package/dist/types/debug.d.ts +3 -0
- package/dist/types/debug.d.ts.map +1 -0
- package/dist/types/debug.test.d.ts +2 -0
- package/dist/types/debug.test.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger/console.d.ts +3 -0
- package/dist/types/logger/console.d.ts.map +1 -0
- package/dist/types/logger/console.test.d.ts +2 -0
- package/dist/types/logger/console.test.d.ts.map +1 -0
- package/dist/types/logger/default-logger.d.ts +25 -0
- package/dist/types/logger/default-logger.d.ts.map +1 -0
- package/dist/types/logger/logger.d.ts +20 -0
- package/dist/types/logger/logger.d.ts.map +1 -0
- package/lib/__mocks__/debug-state.mock.ts +7 -0
- package/lib/__mocks__/debug-subjects.mock.ts +4 -0
- package/lib/debug-state-env.test.ts +53 -0
- package/lib/debug-state.test.ts +87 -0
- package/lib/debug-state.ts +198 -0
- package/lib/debug-subjects.test.ts +40 -0
- package/lib/debug-subjects.ts +78 -0
- package/lib/debug.test.ts +95 -0
- package/lib/debug.ts +24 -0
- package/lib/index.ts +23 -0
- package/lib/logger/console.test.ts +240 -0
- package/lib/logger/console.ts +73 -0
- package/lib/logger/default-logger.ts +67 -0
- package/lib/logger/logger.ts +26 -0
- package/package.json +80 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* eslint-disable no-underscore-dangle, jest/no-standalone-expect */
|
|
2
|
+
import cases from 'jest-in-case';
|
|
3
|
+
import { isDebugEnabled, isDiscoveryEnabled, isLoggingEnabled, isValidationEnabled, getLogLevel, setLogLevel } from './debug-state';
|
|
4
|
+
import { LogLevel } from './logger/logger';
|
|
5
|
+
describe('debug utils', () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
window.____c_p_d = false;
|
|
8
|
+
});
|
|
9
|
+
cases('should be active if respective flag is set to TRUE', (opts) => {
|
|
10
|
+
expect(opts.isUtil()).toBe(false);
|
|
11
|
+
// switch flag to TRUE
|
|
12
|
+
window.____c_p_d = { [opts.key]: true };
|
|
13
|
+
expect(opts.isUtil()).toBe(true);
|
|
14
|
+
// switch ALL false
|
|
15
|
+
window.____c_p_d = false;
|
|
16
|
+
expect(opts.isUtil()).toBe(false);
|
|
17
|
+
// switch ALL true
|
|
18
|
+
window.____c_p_d = true;
|
|
19
|
+
expect(opts.isUtil()).toBe(true);
|
|
20
|
+
}, {
|
|
21
|
+
isDebugEnabled: { isUtil: isDebugEnabled, key: 'debug' },
|
|
22
|
+
isLoggingEnabled: { isUtil: isLoggingEnabled, key: 'logging' },
|
|
23
|
+
isValidationEnabled: { isUtil: isValidationEnabled, key: 'validation' },
|
|
24
|
+
isDiscoveryEnabled: { isUtil: isDiscoveryEnabled, key: 'discovery' },
|
|
25
|
+
});
|
|
26
|
+
describe('log levels', () => {
|
|
27
|
+
let prevDebugState;
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
prevDebugState = window.____c_p_d;
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
window.____c_p_d = prevDebugState;
|
|
33
|
+
});
|
|
34
|
+
it('should allow to change the default log level using utils', () => {
|
|
35
|
+
expect(getLogLevel()).toBe(LogLevel.info);
|
|
36
|
+
setLogLevel(LogLevel.debug);
|
|
37
|
+
expect(getLogLevel()).toBe(LogLevel.debug);
|
|
38
|
+
});
|
|
39
|
+
it('should allow to change log level using global variable', () => {
|
|
40
|
+
// Change with enum
|
|
41
|
+
window.____c_p_d.logLevel = LogLevel.error;
|
|
42
|
+
expect(getLogLevel()).toBe(LogLevel.error);
|
|
43
|
+
// Change with string value
|
|
44
|
+
window.____c_p_d.logLevel = 'warn';
|
|
45
|
+
expect(getLogLevel()).toBe(LogLevel.warn);
|
|
46
|
+
});
|
|
47
|
+
it('should fallback to a default "INFO" level when using unsupported runtime value', () => {
|
|
48
|
+
window.____c_p_d.logLevel = 'show-me-all-the-things';
|
|
49
|
+
expect(getLogLevel()).toBe(LogLevel.info);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('compatibility mode', () => {
|
|
53
|
+
it('should fallback to a default "INFO" level when "logLevel" property is missing e.g. CSE < 2.1.0', () => {
|
|
54
|
+
Object.defineProperty(window, '____c_p_d', {
|
|
55
|
+
value: {},
|
|
56
|
+
configurable: true,
|
|
57
|
+
writable: true,
|
|
58
|
+
});
|
|
59
|
+
expect(getLogLevel()).toBe(LogLevel.info);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=debug-state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-state.test.js","sourceRoot":"","sources":["../../lib/debug-state.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-underscore-dangle, jest/no-standalone-expect */\nimport cases from 'jest-in-case';\nimport type { ExposedClientExtensionDebug } from './debug-state';\nimport { isDebugEnabled, isDiscoveryEnabled, isLoggingEnabled, isValidationEnabled, getLogLevel, setLogLevel } from './debug-state';\nimport { LogLevel } from './logger/logger';\n\ndescribe('debug utils', () => {\n beforeEach(() => {\n (window.____c_p_d as unknown) = false;\n });\n\n cases(\n 'should be active if respective flag is set to TRUE',\n (opts) => {\n expect(opts.isUtil()).toBe(false);\n\n // switch flag to TRUE\n (window.____c_p_d as unknown) = { [opts.key]: true };\n\n expect(opts.isUtil()).toBe(true);\n\n // switch ALL false\n (window.____c_p_d as unknown) = false;\n\n expect(opts.isUtil()).toBe(false);\n\n // switch ALL true\n (window.____c_p_d as unknown) = true;\n\n expect(opts.isUtil()).toBe(true);\n },\n {\n isDebugEnabled: { isUtil: isDebugEnabled, key: 'debug' },\n isLoggingEnabled: { isUtil: isLoggingEnabled, key: 'logging' },\n isValidationEnabled: { isUtil: isValidationEnabled, key: 'validation' },\n isDiscoveryEnabled: { isUtil: isDiscoveryEnabled, key: 'discovery' },\n },\n );\n\n describe('log levels', () => {\n let prevDebugState: ExposedClientExtensionDebug;\n\n beforeEach(() => {\n prevDebugState = window.____c_p_d;\n });\n\n afterEach(() => {\n window.____c_p_d = prevDebugState;\n });\n\n it('should allow to change the default log level using utils', () => {\n expect(getLogLevel()).toBe(LogLevel.info);\n\n setLogLevel(LogLevel.debug);\n\n expect(getLogLevel()).toBe(LogLevel.debug);\n });\n\n it('should allow to change log level using global variable', () => {\n // Change with enum\n (window.____c_p_d.logLevel as LogLevel) = LogLevel.error;\n expect(getLogLevel()).toBe(LogLevel.error);\n\n // Change with string value\n (window.____c_p_d.logLevel as string) = 'warn';\n expect(getLogLevel()).toBe(LogLevel.warn);\n });\n\n it('should fallback to a default \"INFO\" level when using unsupported runtime value', () => {\n (window.____c_p_d.logLevel as string) = 'show-me-all-the-things';\n\n expect(getLogLevel()).toBe(LogLevel.info);\n });\n });\n\n describe('compatibility mode', () => {\n it('should fallback to a default \"INFO\" level when \"logLevel\" property is missing e.g. CSE < 2.1.0', () => {\n Object.defineProperty(window, '____c_p_d', {\n value: {},\n configurable: true,\n writable: true,\n });\n\n expect(getLogLevel()).toBe(LogLevel.info);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const defineSubjectGlobal = () => {
|
|
2
|
+
// initialize as boolean
|
|
3
|
+
const subjectGlobal = Object.create(null);
|
|
4
|
+
const properties = {
|
|
5
|
+
__initialized: { value: true, writable: false },
|
|
6
|
+
subjects: {
|
|
7
|
+
value: subjectGlobal,
|
|
8
|
+
writable: false,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperties(subjectGlobal, properties);
|
|
12
|
+
window.____c_p_s = subjectGlobal;
|
|
13
|
+
};
|
|
14
|
+
if (!('____c_p_s' in window) || !window.____c_p_s.__initialized) {
|
|
15
|
+
defineSubjectGlobal();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Registers a debug subject as singleton
|
|
19
|
+
*
|
|
20
|
+
* @param key
|
|
21
|
+
* @param subjectFactory
|
|
22
|
+
*/
|
|
23
|
+
export const registerDebugSubject = (key, subjectFactory) => {
|
|
24
|
+
const debugSubjects = window.____c_p_s.subjects;
|
|
25
|
+
// good old singletons - ensure we do not register the same subject twice.
|
|
26
|
+
// we also can't fail as multiple instances might try to access the same, so instead we return the previously registered one.
|
|
27
|
+
if (!(key in debugSubjects)) {
|
|
28
|
+
debugSubjects[key] = subjectFactory();
|
|
29
|
+
}
|
|
30
|
+
return debugSubjects[key];
|
|
31
|
+
};
|
|
32
|
+
export const observeDebugSubject = (key, observer) => {
|
|
33
|
+
const debugSubjects = window.____c_p_s.subjects;
|
|
34
|
+
if (!(key in debugSubjects)) {
|
|
35
|
+
throw new Error(`No subject registered for key: "${key}"`);
|
|
36
|
+
}
|
|
37
|
+
return debugSubjects[key].subscribe(observer);
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=debug-subjects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-subjects.js","sourceRoot":"","sources":["../../lib/debug-subjects.ts"],"names":[],"mappings":"AAyBA,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC7B,wBAAwB;IACxB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAmC;QAC/C,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC/C,QAAQ,EAAE;YACN,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,KAAK;SAClB;KACJ,CAAC;IAEF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAEnD,MAAM,CAAC,SAAS,GAAG,aAAa,CAAC;AACrC,CAAC,CAAC;AAEF,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE;IAC7D,mBAAmB,EAAE,CAAC;CACzB;AAID;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,GAAkB,EAClB,cAAiC,EACtB,EAAE;IACb,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,QAAyC,CAAC;IAEjF,0EAA0E;IAC1E,6HAA6H;IAC7H,IAAI,CAAC,CAAC,GAAG,IAAI,aAAa,CAAC,EAAE;QACzB,aAAa,CAAC,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC;KACzC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAc,GAAkB,EAAE,QAA+B,EAAE,EAAE;IACpG,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,QAAkD,CAAC;IAE1F,IAAI,CAAC,CAAC,GAAG,IAAI,aAAa,CAAC,EAAE;QACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,GAAG,CAAC,CAAC;KAC9D;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC,CAAC","sourcesContent":["/* eslint-disable no-underscore-dangle */\nimport type { Observer, Subject } from '@atlassian/clientside-extensions-base';\n\ntype ExposedClientExtensionSubjects = {\n __initialized: PropertyDescriptor;\n subjects: PropertyDescriptor;\n};\n\nexport const enum DebugSubjects {\n Logger = 'logger',\n State = 'state',\n}\n\ntype DebugSubjectsMap<Subject> = {\n [key in DebugSubjects]: Subject;\n};\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Window {\n // Due to historical name changes the \"p\" still represents the old \"plugin\" nomenclature\n ____c_p_s: ExposedClientExtensionSubjects;\n }\n}\n\nconst defineSubjectGlobal = () => {\n // initialize as boolean\n const subjectGlobal = Object.create(null);\n\n const properties: ExposedClientExtensionSubjects = {\n __initialized: { value: true, writable: false },\n subjects: {\n value: subjectGlobal,\n writable: false,\n },\n };\n\n Object.defineProperties(subjectGlobal, properties);\n\n window.____c_p_s = subjectGlobal;\n};\n\nif (!('____c_p_s' in window) || !window.____c_p_s.__initialized) {\n defineSubjectGlobal();\n}\n\ntype UnpackPayloadType<SubjectType> = SubjectType extends Subject<infer U> ? U : never;\n\n/**\n * Registers a debug subject as singleton\n *\n * @param key\n * @param subjectFactory\n */\nexport const registerDebugSubject = <SubjectType extends Subject<PayloadType>, PayloadType = UnpackPayloadType<SubjectType>>(\n key: DebugSubjects,\n subjectFactory: () => SubjectType,\n): SubjectType => {\n const debugSubjects = window.____c_p_s.subjects as DebugSubjectsMap<SubjectType>;\n\n // good old singletons - ensure we do not register the same subject twice.\n // we also can't fail as multiple instances might try to access the same, so instead we return the previously registered one.\n if (!(key in debugSubjects)) {\n debugSubjects[key] = subjectFactory();\n }\n\n return debugSubjects[key];\n};\n\nexport const observeDebugSubject = <PayloadType>(key: DebugSubjects, observer: Observer<PayloadType>) => {\n const debugSubjects = window.____c_p_s.subjects as DebugSubjectsMap<Subject<PayloadType>>;\n\n if (!(key in debugSubjects)) {\n throw new Error(`No subject registered for key: \"${key}\"`);\n }\n\n return debugSubjects[key].subscribe(observer);\n};\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Subject } from '@atlassian/clientside-extensions-base';
|
|
2
|
+
import { observeDebugSubject, registerDebugSubject } from './debug-subjects';
|
|
3
|
+
describe('debug-subject', () => {
|
|
4
|
+
const debugFactory = () => new Subject();
|
|
5
|
+
describe('registerDebugSubject', () => {
|
|
6
|
+
it('should create an register a subject under a given namespace', () => {
|
|
7
|
+
const subject = registerDebugSubject("logger" /* Logger */, debugFactory);
|
|
8
|
+
expect(subject).toBeInstanceOf(Subject);
|
|
9
|
+
});
|
|
10
|
+
it('should not create a new instance for a previously registered key', () => {
|
|
11
|
+
const subject = registerDebugSubject("state" /* State */, debugFactory);
|
|
12
|
+
const sameSubject = registerDebugSubject("state" /* State */, debugFactory);
|
|
13
|
+
expect(subject).toBe(sameSubject);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('observeDebugSubject', () => {
|
|
17
|
+
it('should throw if the subject does not exist yet', () => {
|
|
18
|
+
// @ts-expect-error We are using a wrong subject key here
|
|
19
|
+
const unregisteredSubject = () => observeDebugSubject('Foo', () => { });
|
|
20
|
+
expect(unregisteredSubject).toThrow(`No subject registered for key: "Foo"`);
|
|
21
|
+
});
|
|
22
|
+
it('should subscribe to a previously registered subject', () => {
|
|
23
|
+
const SUBJECT = "state" /* State */;
|
|
24
|
+
const TEST_PAYLOAD = 'some payload';
|
|
25
|
+
const observer = jest.fn();
|
|
26
|
+
const subject = registerDebugSubject(SUBJECT, debugFactory);
|
|
27
|
+
observeDebugSubject(SUBJECT, observer);
|
|
28
|
+
subject.notify(TEST_PAYLOAD);
|
|
29
|
+
expect(observer).toBeCalledWith(TEST_PAYLOAD);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=debug-subjects.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-subjects.test.js","sourceRoot":"","sources":["../../lib/debug-subjects.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAiB,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE5F,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,MAAM,YAAY,GAAG,GAAoB,EAAE,CAAC,IAAI,OAAO,EAAU,CAAC;IAElE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACnE,MAAM,OAAO,GAAG,oBAAoB,wBAAuB,YAAY,CAAC,CAAC;YACzE,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YACxE,MAAM,OAAO,GAAG,oBAAoB,sBAAsB,YAAY,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG,oBAAoB,sBAAsB,YAAY,CAAC,CAAC;YAC5E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACtD,yDAAyD;YACzD,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEvE,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC3D,MAAM,OAAO,sBAAsB,CAAC;YACpC,MAAM,YAAY,GAAG,cAAc,CAAC;YAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5D,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEvC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["import { Subject } from '@atlassian/clientside-extensions-base';\nimport { DebugSubjects, observeDebugSubject, registerDebugSubject } from './debug-subjects';\n\ndescribe('debug-subject', () => {\n const debugFactory = (): Subject<string> => new Subject<string>();\n\n describe('registerDebugSubject', () => {\n it('should create an register a subject under a given namespace', () => {\n const subject = registerDebugSubject(DebugSubjects.Logger, debugFactory);\n expect(subject).toBeInstanceOf(Subject);\n });\n\n it('should not create a new instance for a previously registered key', () => {\n const subject = registerDebugSubject(DebugSubjects.State, debugFactory);\n const sameSubject = registerDebugSubject(DebugSubjects.State, debugFactory);\n expect(subject).toBe(sameSubject);\n });\n });\n\n describe('observeDebugSubject', () => {\n it('should throw if the subject does not exist yet', () => {\n // @ts-expect-error We are using a wrong subject key here\n const unregisteredSubject = () => observeDebugSubject('Foo', () => {});\n\n expect(unregisteredSubject).toThrow(`No subject registered for key: \"Foo\"`);\n });\n\n it('should subscribe to a previously registered subject', () => {\n const SUBJECT = DebugSubjects.State;\n const TEST_PAYLOAD = 'some payload';\n\n const observer = jest.fn();\n const subject = registerDebugSubject(SUBJECT, debugFactory);\n observeDebugSubject(SUBJECT, observer);\n\n subject.notify(TEST_PAYLOAD);\n expect(observer).toBeCalledWith(TEST_PAYLOAD);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { isDebugEnabled, isLoggingEnabled } from './debug-state';
|
|
2
|
+
import { _loggerSubject, LogLevel } from './logger/logger';
|
|
3
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
4
|
+
export const onDebug = (callback) => {
|
|
5
|
+
// Return early if both debug and logging is disabled
|
|
6
|
+
if (!isDebugEnabled() || !isLoggingEnabled()) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
let payload;
|
|
10
|
+
try {
|
|
11
|
+
payload = callback(LogLevel);
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
// eslint-disable-next-line no-empty
|
|
15
|
+
}
|
|
16
|
+
if (payload) {
|
|
17
|
+
_loggerSubject.notify(payload);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../lib/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,wDAAwD;AACxD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,QAAwB,EAAE,EAAE;IAChD,qDAAqD;IACrD,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;QAC1C,OAAO;KACV;IAED,IAAI,OAAkC,CAAC;IAEvC,IAAI;QACA,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAChC;IAAC,OAAO,CAAC,EAAE;QACR,oCAAoC;KACvC;IAED,IAAI,OAAO,EAAE;QACT,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAClC;AACL,CAAC,CAAC","sourcesContent":["import { isDebugEnabled, isLoggingEnabled } from './debug-state';\n\nimport type { LoggerCallback, LoggerPayload } from './logger/logger';\nimport { _loggerSubject, LogLevel } from './logger/logger';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const onDebug = (callback: LoggerCallback) => {\n // Return early if both debug and logging is disabled\n if (!isDebugEnabled() || !isLoggingEnabled()) {\n return;\n }\n\n let payload: LoggerPayload | undefined;\n\n try {\n payload = callback(LogLevel);\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n\n if (payload) {\n _loggerSubject.notify(payload);\n }\n};\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { mocked } from 'ts-jest/utils';
|
|
2
|
+
import { getLogLevel, isDebugEnabled, isLoggingEnabled } from './debug-state';
|
|
3
|
+
import { onDebug } from './debug';
|
|
4
|
+
import { LogLevel } from './logger/logger';
|
|
5
|
+
import { observeLogger } from './logger/default-logger';
|
|
6
|
+
jest.mock('./debug-state');
|
|
7
|
+
describe('onDebug util', () => {
|
|
8
|
+
const orgConsole = global.console;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
mocked(isDebugEnabled).mockReturnValue(false);
|
|
11
|
+
mocked(isLoggingEnabled).mockReturnValue(false);
|
|
12
|
+
mocked(getLogLevel).mockReturnValue(LogLevel.debug);
|
|
13
|
+
// Silent down console
|
|
14
|
+
global.console = {
|
|
15
|
+
...orgConsole,
|
|
16
|
+
error: jest.fn(),
|
|
17
|
+
log: jest.fn(),
|
|
18
|
+
groupCollapsed: jest.fn(),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
mocked(isDebugEnabled).mockClear();
|
|
23
|
+
mocked(isLoggingEnabled).mockClear();
|
|
24
|
+
mocked(getLogLevel).mockClear();
|
|
25
|
+
global.console = orgConsole;
|
|
26
|
+
});
|
|
27
|
+
it('should only execute the given callback when debug and logging is enabled', () => {
|
|
28
|
+
const debugCallbackSpy = jest.fn();
|
|
29
|
+
// disable
|
|
30
|
+
mocked(isDebugEnabled).mockReturnValue(false);
|
|
31
|
+
mocked(isLoggingEnabled).mockReturnValue(false);
|
|
32
|
+
onDebug(debugCallbackSpy);
|
|
33
|
+
expect(debugCallbackSpy).not.toHaveBeenCalled();
|
|
34
|
+
// enable
|
|
35
|
+
mocked(isDebugEnabled).mockReturnValue(true);
|
|
36
|
+
mocked(isLoggingEnabled).mockReturnValue(true);
|
|
37
|
+
onDebug(debugCallbackSpy);
|
|
38
|
+
expect(debugCallbackSpy).toHaveBeenCalled();
|
|
39
|
+
});
|
|
40
|
+
it('should not notify the observer when logging is disabled', () => {
|
|
41
|
+
const payload = {
|
|
42
|
+
message: 'foo',
|
|
43
|
+
level: LogLevel.error,
|
|
44
|
+
};
|
|
45
|
+
const loggerCallback = jest.fn(() => payload);
|
|
46
|
+
const loggerObserver = jest.fn();
|
|
47
|
+
// need to enable debug in order to run the debugCallback
|
|
48
|
+
mocked(isDebugEnabled).mockReturnValue(true);
|
|
49
|
+
// disable
|
|
50
|
+
mocked(isLoggingEnabled).mockReturnValue(false);
|
|
51
|
+
observeLogger(loggerObserver);
|
|
52
|
+
onDebug(loggerCallback);
|
|
53
|
+
expect(loggerCallback).not.toHaveBeenCalled();
|
|
54
|
+
expect(loggerObserver).not.toHaveBeenCalled();
|
|
55
|
+
// enable
|
|
56
|
+
mocked(isLoggingEnabled).mockReturnValue(true);
|
|
57
|
+
onDebug(loggerCallback);
|
|
58
|
+
expect(loggerCallback).toHaveBeenCalledTimes(1);
|
|
59
|
+
expect(loggerObserver).toHaveBeenCalledWith(payload);
|
|
60
|
+
});
|
|
61
|
+
it('should not throw an error when logger callback fails', () => {
|
|
62
|
+
mocked(isDebugEnabled).mockReturnValue(true);
|
|
63
|
+
mocked(isLoggingEnabled).mockReturnValue(true);
|
|
64
|
+
const callOnDebug = () => {
|
|
65
|
+
const loggerCallback = () => {
|
|
66
|
+
throw new Error('ups');
|
|
67
|
+
};
|
|
68
|
+
onDebug(loggerCallback);
|
|
69
|
+
};
|
|
70
|
+
expect(callOnDebug).not.toThrow();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=debug.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.test.js","sourceRoot":"","sources":["../../lib/debug.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { mocked } from 'ts-jest/utils';\nimport { getLogLevel, isDebugEnabled, isLoggingEnabled } from './debug-state';\nimport { onDebug } from './debug';\nimport { LogLevel } from './logger/logger';\nimport { observeLogger } from './logger/default-logger';\n\njest.mock('./debug-state');\n\ndescribe('onDebug util', () => {\n const orgConsole = global.console;\n\n beforeEach(() => {\n mocked(isDebugEnabled).mockReturnValue(false);\n mocked(isLoggingEnabled).mockReturnValue(false);\n mocked(getLogLevel).mockReturnValue(LogLevel.debug);\n\n // Silent down console\n global.console = {\n ...orgConsole,\n error: jest.fn(),\n log: jest.fn(),\n groupCollapsed: jest.fn(),\n };\n });\n\n afterEach(() => {\n mocked(isDebugEnabled).mockClear();\n mocked(isLoggingEnabled).mockClear();\n mocked(getLogLevel).mockClear();\n\n global.console = orgConsole;\n });\n\n it('should only execute the given callback when debug and logging is enabled', () => {\n const debugCallbackSpy = jest.fn();\n\n // disable\n mocked(isDebugEnabled).mockReturnValue(false);\n mocked(isLoggingEnabled).mockReturnValue(false);\n\n onDebug(debugCallbackSpy);\n\n expect(debugCallbackSpy).not.toHaveBeenCalled();\n\n // enable\n mocked(isDebugEnabled).mockReturnValue(true);\n mocked(isLoggingEnabled).mockReturnValue(true);\n\n onDebug(debugCallbackSpy);\n\n expect(debugCallbackSpy).toHaveBeenCalled();\n });\n\n it('should not notify the observer when logging is disabled', () => {\n const payload = {\n message: 'foo',\n level: LogLevel.error,\n };\n const loggerCallback = jest.fn(() => payload);\n const loggerObserver = jest.fn();\n\n // need to enable debug in order to run the debugCallback\n mocked(isDebugEnabled).mockReturnValue(true);\n // disable\n mocked(isLoggingEnabled).mockReturnValue(false);\n\n observeLogger(loggerObserver);\n onDebug(loggerCallback);\n\n expect(loggerCallback).not.toHaveBeenCalled();\n expect(loggerObserver).not.toHaveBeenCalled();\n\n // enable\n mocked(isLoggingEnabled).mockReturnValue(true);\n onDebug(loggerCallback);\n\n expect(loggerCallback).toHaveBeenCalledTimes(1);\n expect(loggerObserver).toHaveBeenCalledWith(payload);\n });\n\n it('should not throw an error when logger callback fails', () => {\n mocked(isDebugEnabled).mockReturnValue(true);\n mocked(isLoggingEnabled).mockReturnValue(true);\n\n const callOnDebug = () => {\n const loggerCallback = () => {\n throw new Error('ups');\n };\n\n onDebug(loggerCallback);\n };\n\n expect(callOnDebug).not.toThrow();\n });\n});\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { onDebug } from './debug';
|
|
2
|
+
export { LogLevel } from './logger/logger';
|
|
3
|
+
export {
|
|
4
|
+
/** @deprecated in 2.1.0 */ observeLogger,
|
|
5
|
+
/** @since in 2.1.0 */ setLogger, _deregisterDefaultLogger, } from './logger/default-logger';
|
|
6
|
+
export { /** @since in 2.1.0 */ consoleLogger } from './logger/console';
|
|
7
|
+
export { isDebugEnabled, isLoggingEnabled, isDiscoveryEnabled, isValidationEnabled, setDebugEnabled, setLoggingEnabled, setDiscoveryEnabled, setValidationEnabled, observeStateChange, } from './debug-state';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO;AACH,2BAA2B,CAAC,aAAa;AACzC,sBAAsB,CAAC,SAAS,EAChC,wBAAwB,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,sBAAsB,CAAC,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EACH,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACrB,MAAM,eAAe,CAAC","sourcesContent":["export { onDebug } from './debug';\nexport type { LoggerPayload } from './logger/logger';\nexport { LogLevel } from './logger/logger';\n\nexport {\n /** @deprecated in 2.1.0 */ observeLogger,\n /** @since in 2.1.0 */ setLogger,\n _deregisterDefaultLogger,\n} from './logger/default-logger';\n\nexport { /** @since in 2.1.0 */ consoleLogger } from './logger/console';\n\nexport {\n isDebugEnabled,\n isLoggingEnabled,\n isDiscoveryEnabled,\n isValidationEnabled,\n setDebugEnabled,\n setLoggingEnabled,\n setDiscoveryEnabled,\n setValidationEnabled,\n observeStateChange,\n} from './debug-state';\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { LogLevel } from './logger';
|
|
2
|
+
import { getLogLevel } from '../debug-state';
|
|
3
|
+
const getLoggingFromLevel = (level) => {
|
|
4
|
+
switch (level) {
|
|
5
|
+
case LogLevel.error:
|
|
6
|
+
return 'error';
|
|
7
|
+
case LogLevel.debug:
|
|
8
|
+
return 'debug';
|
|
9
|
+
case LogLevel.info:
|
|
10
|
+
return 'info';
|
|
11
|
+
case LogLevel.warn:
|
|
12
|
+
case LogLevel.deprecation:
|
|
13
|
+
return 'warn';
|
|
14
|
+
default:
|
|
15
|
+
return 'debug';
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
// Naive implementation but we can't use bitwise operators :(
|
|
19
|
+
const debugLevels = Object.values(LogLevel);
|
|
20
|
+
const errorLevels = debugLevels.filter((level) => level !== LogLevel.debug);
|
|
21
|
+
const warnLevels = errorLevels.filter((level) => level !== LogLevel.error);
|
|
22
|
+
const deprecationLevels = warnLevels.filter((level) => level !== LogLevel.warn);
|
|
23
|
+
const infoLevels = deprecationLevels.filter((level) => level !== LogLevel.deprecation);
|
|
24
|
+
const levelsMap = {
|
|
25
|
+
[LogLevel.debug]: debugLevels,
|
|
26
|
+
[LogLevel.error]: errorLevels,
|
|
27
|
+
[LogLevel.warn]: warnLevels,
|
|
28
|
+
[LogLevel.deprecation]: deprecationLevels,
|
|
29
|
+
[LogLevel.info]: infoLevels,
|
|
30
|
+
};
|
|
31
|
+
function shouldDisplayLog(logLevel, eventLogLevel) {
|
|
32
|
+
if (logLevel === LogLevel.debug) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
const levels = levelsMap[logLevel];
|
|
36
|
+
return Array.isArray(levels) ? levels.includes(eventLogLevel) : false;
|
|
37
|
+
}
|
|
38
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
39
|
+
export const consoleLogger = (payload) => {
|
|
40
|
+
const eventLogLevel = payload.level;
|
|
41
|
+
const logLevel = getLogLevel();
|
|
42
|
+
if (!shouldDisplayLog(logLevel, eventLogLevel)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const consoleKey = getLoggingFromLevel(eventLogLevel);
|
|
46
|
+
const deprecationWarning = payload.level === LogLevel.deprecation
|
|
47
|
+
? `⚠️⚠️⚠️ DEPRECATION WARNING ⚠️⚠️⚠️
|
|
48
|
+
`
|
|
49
|
+
: '';
|
|
50
|
+
console[consoleKey](`${deprecationWarning}[Atlassian Client-side Extensions]: ${payload.message}`);
|
|
51
|
+
// Verbose logging
|
|
52
|
+
if (logLevel === LogLevel.debug) {
|
|
53
|
+
console.groupCollapsed(' <click here for more details about above message>');
|
|
54
|
+
console.log({
|
|
55
|
+
components: payload.components,
|
|
56
|
+
meta: payload.meta,
|
|
57
|
+
});
|
|
58
|
+
console.groupEnd();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../lib/logger/console.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LoggerPayload } from './logger';\nimport { LogLevel } from './logger';\nimport { getLogLevel } from '../debug-state';\n\nconst getLoggingFromLevel = (level: LogLevel): keyof typeof console => {\n switch (level) {\n case LogLevel.error:\n return 'error';\n case LogLevel.debug:\n return 'debug';\n case LogLevel.info:\n return 'info';\n case LogLevel.warn:\n case LogLevel.deprecation:\n return 'warn';\n default:\n return 'debug';\n }\n};\n\n// Naive implementation but we can't use bitwise operators :(\nconst debugLevels = Object.values(LogLevel);\nconst errorLevels = debugLevels.filter((level) => level !== LogLevel.debug);\nconst warnLevels = errorLevels.filter((level) => level !== LogLevel.error);\nconst deprecationLevels = warnLevels.filter((level) => level !== LogLevel.warn);\nconst infoLevels = deprecationLevels.filter((level) => level !== LogLevel.deprecation);\n\nconst levelsMap: { [key: string]: string[] } = {\n [LogLevel.debug]: debugLevels,\n [LogLevel.error]: errorLevels,\n [LogLevel.warn]: warnLevels,\n [LogLevel.deprecation]: deprecationLevels,\n [LogLevel.info]: infoLevels,\n};\n\nfunction shouldDisplayLog(logLevel: LogLevel, eventLogLevel: LogLevel) {\n if (logLevel === LogLevel.debug) {\n return true;\n }\n\n const levels = levelsMap[logLevel];\n\n return Array.isArray(levels) ? levels.includes(eventLogLevel) : false;\n}\n\n// eslint-disable-next-line import/prefer-default-export\nexport const consoleLogger = (payload: LoggerPayload) => {\n const eventLogLevel = payload.level;\n const logLevel = getLogLevel();\n\n if (!shouldDisplayLog(logLevel, eventLogLevel)) {\n return;\n }\n\n const consoleKey = getLoggingFromLevel(eventLogLevel);\n const deprecationWarning =\n payload.level === LogLevel.deprecation\n ? `⚠️⚠️⚠️ DEPRECATION WARNING ⚠️⚠️⚠️\n`\n : '';\n\n console[consoleKey](`${deprecationWarning}[Atlassian Client-side Extensions]: ${payload.message}`);\n\n // Verbose logging\n if (logLevel === LogLevel.debug) {\n console.groupCollapsed(' <click here for more details about above message>');\n console.log({\n components: payload.components,\n meta: payload.meta,\n });\n console.groupEnd();\n }\n};\n"]}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { mocked } from 'ts-jest/utils';
|
|
2
|
+
import { LogLevel } from './logger';
|
|
3
|
+
import { consoleLogger } from './console';
|
|
4
|
+
import { getLogLevel } from '../debug-state';
|
|
5
|
+
jest.mock('../debug-state');
|
|
6
|
+
describe('console logger', () => {
|
|
7
|
+
const orgConsole = global.console;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
global.console = {
|
|
10
|
+
...orgConsole,
|
|
11
|
+
log: jest.fn(),
|
|
12
|
+
error: jest.fn(),
|
|
13
|
+
debug: jest.fn(),
|
|
14
|
+
info: jest.fn(),
|
|
15
|
+
warn: jest.fn(),
|
|
16
|
+
groupCollapsed: jest.fn(),
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
mocked(getLogLevel).mockClear();
|
|
21
|
+
global.console = orgConsole;
|
|
22
|
+
});
|
|
23
|
+
const getEventPayload = (level) => ({
|
|
24
|
+
level,
|
|
25
|
+
message: 'Hello!',
|
|
26
|
+
});
|
|
27
|
+
describe('"DEBUG" level', () => {
|
|
28
|
+
it.each([
|
|
29
|
+
// prettier-ignore-start
|
|
30
|
+
[LogLevel.debug],
|
|
31
|
+
])('should display "DEBUG" log when log level is set to "%s"', (logLevel) => {
|
|
32
|
+
// given
|
|
33
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
34
|
+
const event = getEventPayload(LogLevel.debug);
|
|
35
|
+
// when
|
|
36
|
+
consoleLogger(event);
|
|
37
|
+
// then
|
|
38
|
+
expect(global.console.debug).toHaveBeenCalledWith(expect.stringContaining('Hello!'));
|
|
39
|
+
expect(global.console.groupCollapsed).toHaveBeenCalled();
|
|
40
|
+
});
|
|
41
|
+
it.each([
|
|
42
|
+
// prettier-ignore-start
|
|
43
|
+
[LogLevel.error],
|
|
44
|
+
[LogLevel.warn],
|
|
45
|
+
[LogLevel.deprecation],
|
|
46
|
+
[LogLevel.info],
|
|
47
|
+
])('should not display "DEBUG" log when log level is set to "%s"', (logLevel) => {
|
|
48
|
+
// given
|
|
49
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
50
|
+
const event = getEventPayload(LogLevel.debug);
|
|
51
|
+
// when
|
|
52
|
+
consoleLogger(event);
|
|
53
|
+
// then
|
|
54
|
+
expect(global.console.debug).not.toHaveBeenCalled();
|
|
55
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('"ERROR" level', () => {
|
|
59
|
+
it.each([
|
|
60
|
+
// prettier-ignore-start
|
|
61
|
+
[LogLevel.debug],
|
|
62
|
+
[LogLevel.error],
|
|
63
|
+
])('should display "ERROR" log when log level is set to "%s"', (logLevel) => {
|
|
64
|
+
// given
|
|
65
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
66
|
+
const event = getEventPayload(LogLevel.error);
|
|
67
|
+
// when
|
|
68
|
+
consoleLogger(event);
|
|
69
|
+
// then
|
|
70
|
+
expect(global.console.error).toHaveBeenCalledWith(expect.stringContaining('Hello!'));
|
|
71
|
+
if (logLevel === LogLevel.debug) {
|
|
72
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
73
|
+
expect(global.console.groupCollapsed).toHaveBeenCalled();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
77
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
it.each([
|
|
81
|
+
// prettier-ignore-start
|
|
82
|
+
[LogLevel.warn],
|
|
83
|
+
[LogLevel.deprecation],
|
|
84
|
+
[LogLevel.info],
|
|
85
|
+
])('should not display "ERROR" log when log level is set to "%s"', (logLevel) => {
|
|
86
|
+
// given
|
|
87
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
88
|
+
const event = getEventPayload(LogLevel.error);
|
|
89
|
+
// when
|
|
90
|
+
consoleLogger(event);
|
|
91
|
+
// then
|
|
92
|
+
expect(global.console.error).not.toHaveBeenCalled();
|
|
93
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('"WARN" level', () => {
|
|
97
|
+
it.each([
|
|
98
|
+
// prettier-ignore-start
|
|
99
|
+
[LogLevel.debug],
|
|
100
|
+
[LogLevel.error],
|
|
101
|
+
[LogLevel.warn],
|
|
102
|
+
])('should display "WARN" log when log level is set to "%s"', (logLevel) => {
|
|
103
|
+
// given
|
|
104
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
105
|
+
const event = getEventPayload(LogLevel.warn);
|
|
106
|
+
// when
|
|
107
|
+
consoleLogger(event);
|
|
108
|
+
// then
|
|
109
|
+
expect(global.console.warn).toHaveBeenCalledWith(expect.stringContaining('Hello!'));
|
|
110
|
+
if (logLevel === LogLevel.debug) {
|
|
111
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
112
|
+
expect(global.console.groupCollapsed).toHaveBeenCalled();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
116
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
it.each([
|
|
120
|
+
// prettier-ignore-start
|
|
121
|
+
[LogLevel.deprecation],
|
|
122
|
+
[LogLevel.info],
|
|
123
|
+
])('should not display "WARN" log when log level is set to "%s"', (logLevel) => {
|
|
124
|
+
// given
|
|
125
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
126
|
+
const event = getEventPayload(LogLevel.warn);
|
|
127
|
+
// when
|
|
128
|
+
consoleLogger(event);
|
|
129
|
+
// then
|
|
130
|
+
expect(global.console.warn).not.toHaveBeenCalled();
|
|
131
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('"DEPRECATION" level', () => {
|
|
135
|
+
it.each([
|
|
136
|
+
// prettier-ignore-start
|
|
137
|
+
[LogLevel.debug],
|
|
138
|
+
[LogLevel.error],
|
|
139
|
+
[LogLevel.warn],
|
|
140
|
+
])('should display "DEPRECATION" log when log level is set to "%s"', (logLevel) => {
|
|
141
|
+
// given
|
|
142
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
143
|
+
const event = getEventPayload(LogLevel.deprecation);
|
|
144
|
+
// when
|
|
145
|
+
consoleLogger(event);
|
|
146
|
+
// then
|
|
147
|
+
expect(global.console.warn).toHaveBeenCalledWith(expect.stringContaining('Hello!'));
|
|
148
|
+
if (logLevel === LogLevel.debug) {
|
|
149
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
150
|
+
expect(global.console.groupCollapsed).toHaveBeenCalled();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
154
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
it.each([
|
|
158
|
+
// prettier-ignore-start
|
|
159
|
+
[LogLevel.info],
|
|
160
|
+
])('should not display "DEPRECATION" log when log level is set to "%s"', (logLevel) => {
|
|
161
|
+
// given
|
|
162
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
163
|
+
const event = getEventPayload(LogLevel.deprecation);
|
|
164
|
+
// when
|
|
165
|
+
consoleLogger(event);
|
|
166
|
+
// then
|
|
167
|
+
expect(global.console.warn).not.toHaveBeenCalled();
|
|
168
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe('"INFO" level', () => {
|
|
172
|
+
it.each([
|
|
173
|
+
// prettier-ignore-start
|
|
174
|
+
[LogLevel.debug],
|
|
175
|
+
[LogLevel.error],
|
|
176
|
+
[LogLevel.warn],
|
|
177
|
+
[LogLevel.deprecation],
|
|
178
|
+
[LogLevel.info],
|
|
179
|
+
])('should display "INFO" log when log level is set to "%s"', (logLevel) => {
|
|
180
|
+
// given
|
|
181
|
+
mocked(getLogLevel).mockReturnValue(logLevel);
|
|
182
|
+
const event = getEventPayload(LogLevel.info);
|
|
183
|
+
// when
|
|
184
|
+
consoleLogger(event);
|
|
185
|
+
// then
|
|
186
|
+
expect(global.console.info).toHaveBeenCalledWith(expect.stringContaining('Hello!'));
|
|
187
|
+
if (logLevel === LogLevel.debug) {
|
|
188
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
189
|
+
expect(global.console.groupCollapsed).toHaveBeenCalled();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
193
|
+
expect(global.console.groupCollapsed).not.toHaveBeenCalled();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=console.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.test.js","sourceRoot":"","sources":["../../../lib/logger/console.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { mocked } from 'ts-jest/utils';\nimport type { LoggerPayload } from './logger';\nimport { LogLevel } from './logger';\nimport { consoleLogger } from './console';\nimport { getLogLevel } from '../debug-state';\n\njest.mock('../debug-state');\n\ndescribe('console logger', () => {\n const orgConsole = global.console;\n\n beforeEach(() => {\n global.console = {\n ...orgConsole,\n log: jest.fn(),\n error: jest.fn(),\n debug: jest.fn(),\n info: jest.fn(),\n warn: jest.fn(),\n groupCollapsed: jest.fn(),\n };\n });\n\n afterEach(() => {\n mocked(getLogLevel).mockClear();\n\n global.console = orgConsole;\n });\n\n const getEventPayload = (level: LogLevel): LoggerPayload => ({\n level,\n message: 'Hello!',\n });\n\n describe('\"DEBUG\" level', () => {\n it.each([\n // prettier-ignore-start\n [LogLevel.debug],\n // prettier-ignore-end\n ])('should display \"DEBUG\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.debug);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.debug).toHaveBeenCalledWith(expect.stringContaining('Hello!'));\n expect(global.console.groupCollapsed).toHaveBeenCalled();\n });\n\n it.each([\n // prettier-ignore-start\n [LogLevel.error],\n [LogLevel.warn],\n [LogLevel.deprecation],\n [LogLevel.info],\n // prettier-ignore-end\n ])('should not display \"DEBUG\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.debug);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.debug).not.toHaveBeenCalled();\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n });\n });\n\n describe('\"ERROR\" level', () => {\n it.each([\n // prettier-ignore-start\n [LogLevel.debug],\n [LogLevel.error],\n // prettier-ignore-end\n ])('should display \"ERROR\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.error);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.error).toHaveBeenCalledWith(expect.stringContaining('Hello!'));\n\n if (logLevel === LogLevel.debug) {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).toHaveBeenCalled();\n } else {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n }\n });\n\n it.each([\n // prettier-ignore-start\n [LogLevel.warn],\n [LogLevel.deprecation],\n [LogLevel.info],\n // prettier-ignore-end\n ])('should not display \"ERROR\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.error);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.error).not.toHaveBeenCalled();\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n });\n });\n\n describe('\"WARN\" level', () => {\n it.each([\n // prettier-ignore-start\n [LogLevel.debug],\n [LogLevel.error],\n [LogLevel.warn],\n // prettier-ignore-end\n ])('should display \"WARN\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.warn);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.warn).toHaveBeenCalledWith(expect.stringContaining('Hello!'));\n\n if (logLevel === LogLevel.debug) {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).toHaveBeenCalled();\n } else {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n }\n });\n\n it.each([\n // prettier-ignore-start\n [LogLevel.deprecation],\n [LogLevel.info],\n // prettier-ignore-end\n ])('should not display \"WARN\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.warn);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.warn).not.toHaveBeenCalled();\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n });\n });\n\n describe('\"DEPRECATION\" level', () => {\n it.each([\n // prettier-ignore-start\n [LogLevel.debug],\n [LogLevel.error],\n [LogLevel.warn],\n // prettier-ignore-end\n ])('should display \"DEPRECATION\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.deprecation);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.warn).toHaveBeenCalledWith(expect.stringContaining('Hello!'));\n\n if (logLevel === LogLevel.debug) {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).toHaveBeenCalled();\n } else {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n }\n });\n\n it.each([\n // prettier-ignore-start\n [LogLevel.info],\n // prettier-ignore-end\n ])('should not display \"DEPRECATION\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.deprecation);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.warn).not.toHaveBeenCalled();\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n });\n });\n\n describe('\"INFO\" level', () => {\n it.each([\n // prettier-ignore-start\n [LogLevel.debug],\n [LogLevel.error],\n [LogLevel.warn],\n [LogLevel.deprecation],\n [LogLevel.info],\n // prettier-ignore-end\n ])('should display \"INFO\" log when log level is set to \"%s\"', (logLevel: LogLevel) => {\n // given\n mocked(getLogLevel).mockReturnValue(logLevel);\n const event = getEventPayload(LogLevel.info);\n\n // when\n consoleLogger(event);\n\n // then\n expect(global.console.info).toHaveBeenCalledWith(expect.stringContaining('Hello!'));\n\n if (logLevel === LogLevel.debug) {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).toHaveBeenCalled();\n } else {\n // eslint-disable-next-line jest/no-conditional-expect\n expect(global.console.groupCollapsed).not.toHaveBeenCalled();\n }\n });\n });\n});\n"]}
|