Skip to content

Commit c0bf2ca

Browse files
authored
feat: new logger implementation (#646)
1 parent 7dc768e commit c0bf2ca

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+568
-140
lines changed

demo/components/Playground.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import {type CSSProperties, memo, useCallback, useEffect, useState} from 'react';
1+
import {type CSSProperties, memo, useCallback, useEffect, useMemo, useState} from 'react';
22

33
import {defaultOptions} from '@diplodoc/transform/lib/sanitize';
44
import {Button, DropdownMenu} from '@gravity-ui/uikit';
55

66
import {
77
type DirectiveSyntaxValue,
88
type FileUploadHandler,
9+
Logger2,
910
type MarkdownEditorMode,
1011
MarkdownEditorView,
1112
type MarkdownEditorViewProps,
@@ -29,6 +30,7 @@ import {getSanitizeYfmHtmlBlock} from '../../src/extensions/additional/YfmHtmlBl
2930
import type {CodeEditor} from '../../src/markup';
3031
import type {ToolbarsPreset} from '../../src/modules/toolbars/types';
3132
import {getPlugins} from '../defaults/md-plugins';
33+
import {useLogs} from '../hooks/useLogs';
3234
import useYfmHtmlBlockStyles from '../hooks/useYfmHtmlBlockStyles';
3335
import {randomDelay} from '../utils/delay';
3436
import {parseInsertedUrlAsImage} from '../utils/imageUrl';
@@ -86,9 +88,12 @@ export type PlaygroundProps = {
8688
>;
8789

8890
logger.setLogger({
89-
metrics: console.info,
90-
action: (data) => console.info(`Action: ${data.action}`, data),
91-
...console,
91+
log: (...data) => console.log('[Deprecated logger]', ...data),
92+
info: (...data) => console.info('[Deprecated logger]', ...data),
93+
warn: (...data) => console.warn('[Deprecated logger]', ...data),
94+
error: (...data) => console.error('[Deprecated logger]', ...data),
95+
metrics: (...data) => console.info('[Deprecated logger]', ...data),
96+
action: (data) => console.info(`[Deprecated logger] Action: ${data.action}`, data),
9297
});
9398

9499
export const Playground = memo<PlaygroundProps>((props) => {
@@ -142,8 +147,12 @@ export const Playground = memo<PlaygroundProps>((props) => {
142147
[sanitizeHtml],
143148
);
144149

150+
const logger = useMemo(() => new Logger2().nested({env: 'playground'}), []);
151+
useLogs(logger);
152+
145153
const mdEditor = useMarkdownEditor(
146154
{
155+
logger,
147156
preset: 'full',
148157
wysiwygConfig: {
149158
placeholderOptions: placeholderOptions,

demo/hooks/useLogs.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import {useMemo} from 'react';
2+
3+
import type {Logger2} from '../../src';
4+
5+
export function useLogs(logger: Logger2.LogReceiver) {
6+
useMemo(() => {
7+
logger.on('log', (data) => console.log('Log:', data.msg, data));
8+
logger.on('warn', (data) => console.warn('Warn:', data.msg, data));
9+
logger.on('error', (data) => console.error('Error:', data.error, data));
10+
logger.on('event', (data) => console.info('Event:', data.event, data));
11+
logger.on('action', (data) => console.info('Action:', data.action, data));
12+
logger.on('metrics', (data) => console.info('Metrics:', data.component, data));
13+
}, [logger]);
14+
}

demo/stories/ghost/Ghost.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
import cloneDeep from 'lodash/cloneDeep';
22

3-
import {MarkdownEditorView, logger, markupToolbarConfigs, useMarkdownEditor} from '../../../src';
3+
import {MarkdownEditorView, markupToolbarConfigs, useMarkdownEditor} from '../../../src';
44
import {PlaygroundLayout} from '../../components/PlaygroundLayout';
5+
import {useLogs} from '../../hooks/useLogs';
56

67
import {initialMdContent} from './content';
78
import {ghostPopupExtension, ghostPopupToolbarItem} from './ghostExtension';
89

9-
logger.setLogger({
10-
metrics: console.info,
11-
action: (data) => console.info(`Action: ${data.action}`, data),
12-
...console,
13-
});
14-
1510
const mToolbarConfig = cloneDeep(markupToolbarConfigs.mToolbarConfig);
1611
mToolbarConfig.unshift([ghostPopupToolbarItem]);
1712

@@ -21,6 +16,8 @@ export const Ghost = () => {
2116
markupConfig: {extensions: [ghostPopupExtension]},
2217
});
2318

19+
useLogs(editor.logger);
20+
2421
return (
2522
<PlaygroundLayout
2623
editor={editor}

demo/stories/gpt/GPT.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import cloneDeep from 'lodash/cloneDeep';
55
import {
66
MarkdownEditorView,
77
gptExtension,
8-
logger,
98
mGptExtension,
109
mGptToolbarItem,
1110
markupToolbarConfigs,
@@ -14,16 +13,11 @@ import {
1413
wysiwygToolbarConfigs,
1514
} from '../../../src';
1615
import {PlaygroundLayout} from '../../components/PlaygroundLayout';
16+
import {useLogs} from '../../hooks/useLogs';
1717

1818
import {initialMdContent} from './content';
1919
import {gptWidgetProps} from './gptWidgetOptions';
2020

21-
logger.setLogger({
22-
metrics: console.info,
23-
action: (data) => console.info(`Action: ${data.action}`, data),
24-
...console,
25-
});
26-
2721
const wToolbarConfig = cloneDeep(wysiwygToolbarConfigs.wToolbarConfig);
2822
wToolbarConfig.unshift([wGptItemData]);
2923

@@ -62,6 +56,8 @@ export const GPT = memo(() => {
6256
},
6357
});
6458

59+
useLogs(editor.logger);
60+
6561
return (
6662
<PlaygroundLayout
6763
editor={editor}

demo/stories/presets/Preset.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
MarkdownEditorView,
77
type MarkupString,
88
type RenderPreview,
9-
logger,
109
useMarkdownEditor,
1110
} from '../../../src';
1211
import type {ToolbarsPreset} from '../../../src/modules/toolbars/types';
@@ -17,6 +16,7 @@ import {WysiwygSelection} from '../../components/PMSelection';
1716
import {WysiwygDevTools} from '../../components/ProseMirrorDevTools';
1817
import {SplitModePreview} from '../../components/SplitModePreview';
1918
import {plugins} from '../../defaults/md-plugins';
19+
import {useLogs} from '../../hooks/useLogs';
2020
import {block} from '../../utils/cn';
2121
import {randomDelay} from '../../utils/delay';
2222
import {parseInsertedUrlAsImage} from '../../utils/imageUrl';
@@ -43,12 +43,6 @@ export type PresetDemoProps = {
4343
toolbarsPreset?: ToolbarsPreset;
4444
};
4545

46-
logger.setLogger({
47-
metrics: console.info,
48-
action: (data) => console.info(`Action: ${data.action}`, data),
49-
...console,
50-
});
51-
5246
export const Preset = memo<PresetDemoProps>((props) => {
5347
const {
5448
preset,
@@ -109,6 +103,8 @@ export const Preset = memo<PresetDemoProps>((props) => {
109103
},
110104
});
111105

106+
useLogs(mdEditor.logger);
107+
112108
useEffect(() => {
113109
function onChange() {
114110
setMdRaw(mdEditor.getValue());

src/bundle/Editor.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import type {TransformFn} from '../core/markdown/ProseMirrorTransformer';
1515
import type {DynamicModifiers} from '../core/types/dynamicModifiers';
1616
import type {ReactRenderStorage, RenderStorage} from '../extensions';
1717
import {i18n} from '../i18n/bundle';
18-
import {logger} from '../logger';
18+
import {type Logger2, globalLogger} from '../logger';
1919
import {createCodemirror} from '../markup';
2020
import {getAutocompleteConfig} from '../markup/codemirror/autocomplete';
2121
import {type CodeEditor, Editor as MarkupEditor} from '../markup/editor';
@@ -61,6 +61,7 @@ interface EventMapInt extends EventMap {
6161
}
6262

6363
export interface Editor extends Receiver<EventMap>, CommonEditor {
64+
readonly logger: Logger2.LogReceiver;
6465
readonly currentMode: EditorMode;
6566
readonly toolbarVisible: boolean;
6667

@@ -79,6 +80,7 @@ export interface EditorInt
7980
Receiver<EventMapInt>,
8081
ActionStorage,
8182
CodeEditor {
83+
readonly logger: Logger2.ILogger;
8284
readonly currentMode: EditorMode;
8385
readonly toolbarVisible: boolean;
8486
readonly splitModeEnabled: boolean;
@@ -126,6 +128,7 @@ export type EditorOptions = Pick<
126128
MarkdownEditorOptions,
127129
'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'
128130
> & {
131+
logger: Logger2.ILogger;
129132
renderStorage: ReactRenderStorage;
130133
preset: EditorPreset;
131134
directiveSyntax: DirectiveSyntaxContext;
@@ -134,6 +137,7 @@ export type EditorOptions = Pick<
134137

135138
/** @internal */
136139
export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorInt {
140+
#logger: Logger2.ILogger;
137141
#markup: MarkupString;
138142
#editorMode: EditorMode;
139143
#toolbarVisible: boolean;
@@ -167,6 +171,10 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
167171
return this.#wysiwygEditor?.view;
168172
}
169173

174+
get logger(): Logger2.ILogger {
175+
return this.#logger;
176+
}
177+
170178
get currentMode(): EditorMode {
171179
return this.#editorMode;
172180
}
@@ -255,6 +263,7 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
255263
this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';
256264
this.#wysiwygEditor = new WysiwygEditor({
257265
mdPreset,
266+
logger: this.logger.nested({mode: 'wysiwyg'}),
258267
initialContent: this.#markup,
259268
extensions: this.#extensions,
260269
pmTransformers: this.#pmTransformers,
@@ -275,6 +284,7 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
275284
this.#markupEditor = new MarkupEditor(
276285
createCodemirror({
277286
doc: this.#markup,
287+
logger: this.logger.nested({mode: 'markup'}),
278288
placeholder: this.#markupConfig.placeholder ?? i18n('markup_placeholder'),
279289
onCancel: () => this.emit('cancel', null),
280290
onSubmit: () => this.emit('submit', null),
@@ -326,7 +336,14 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
326336
}
327337

328338
constructor(opts: EditorOptions) {
329-
super({onError: logger.error.bind(logger)});
339+
const {logger} = opts;
340+
341+
super({
342+
onError: (error) => {
343+
logger.error(error);
344+
globalLogger.error(error);
345+
},
346+
});
330347

331348
const {
332349
md = {},
@@ -337,8 +354,11 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
337354
wysiwygConfig = {},
338355
} = opts;
339356

357+
this.#logger = logger;
340358
this.#modifiers = experimental.preserveMarkupFormatting
341-
? createDynamicModifiers(new MarkupManager())
359+
? createDynamicModifiers(
360+
new MarkupManager(this.logger.nested({module: 'markup-manager'})),
361+
)
342362
: undefined;
343363

344364
this.#editorMode = initial.mode ?? 'wysiwyg';
@@ -408,6 +428,13 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
408428
return;
409429
}
410430

431+
this.logger.event({
432+
event: 'mode-change',
433+
prevMode: this.#editorMode,
434+
nextMode: opts.mode,
435+
reason: opts.reason,
436+
});
437+
411438
this.currentMode = opts.mode;
412439
this.emit('rerender', null);
413440

src/bundle/MarkdownEditorView.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {useEnsuredForwardedRef, useKey, useUpdate} from 'react-use';
1414

1515
import {type ClassNameProps, cn} from '../classname';
1616
import {i18n} from '../i18n/bundle';
17-
import {logger} from '../logger';
17+
import {globalLogger} from '../logger';
1818
import type {ToolbarsPreset} from '../modules/toolbars/types';
1919
import {useBooleanState, useSticky} from '../react-utils';
2020
import {isMac} from '../utils';
@@ -241,7 +241,8 @@ export const MarkdownEditorView = forwardRef<HTMLDivElement, MarkdownEditorViewP
241241
return (
242242
<ErrorBoundary
243243
onError={(e) => {
244-
logger.error(e);
244+
globalLogger.error(e);
245+
editor.logger.error(e);
245246
}}
246247
fallbackRender={({error, resetErrorBoundary}) => {
247248
toaster.add({

src/bundle/MarkupEditorView.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {memo} from 'react';
22

33
import {type ClassNameProps, cn} from '../classname';
44
import {ReactRendererComponent} from '../extensions';
5-
import {logger} from '../logger';
5+
import {globalLogger} from '../logger';
66
import {useRenderTime} from '../react-utils/hooks';
77

88
import type {EditorInt} from './Editor';
@@ -44,7 +44,12 @@ export const MarkupEditorView = memo<MarkupEditorViewProps>((props) => {
4444
stickyToolbar = true,
4545
} = props;
4646
useRenderTime((time) => {
47-
logger.metrics({
47+
globalLogger.metrics({
48+
component: 'markup-editor',
49+
event: 'render',
50+
duration: time,
51+
});
52+
editor.logger.metrics({
4853
component: 'markup-editor',
4954
event: 'render',
5055
duration: time,

src/bundle/MarkupManager.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type {Node} from 'prosemirror-model';
22
import {v4} from 'uuid';
33

4+
import type {Logger2} from '../logger';
45
import {SafeEventEmitter} from '../utils';
56

67
export interface IMarkupManager {
@@ -12,11 +13,6 @@ export interface IMarkupManager {
1213
on<K extends keyof Events>(event: K, listener: (value: Events[K]) => void): void;
1314
}
1415

15-
export interface Logger {
16-
log(message: string): void;
17-
error(message: string): void;
18-
}
19-
2016
interface Events {
2117
markupChanged: {id: string; rawMarkup: string};
2218
nodeChanged: {id: string; node: Node};
@@ -28,9 +24,9 @@ export class MarkupManager extends SafeEventEmitter<Events> implements IMarkupMa
2824
private _nodes: Map<string, Node> = new Map();
2925
private _namespace: string;
3026

31-
private readonly logger?: Logger;
27+
private readonly logger: Logger2.ILogger;
3228

33-
constructor(logger?: Logger) {
29+
constructor(logger: Logger2.ILogger) {
3430
super();
3531
this.logger = logger;
3632
this._namespace = v4();
@@ -41,27 +37,27 @@ export class MarkupManager extends SafeEventEmitter<Events> implements IMarkupMa
4137
*/
4238
setMarkup(id: string, rawMarkup: string): void {
4339
if (typeof rawMarkup !== 'string') {
44-
this.logger?.error('[MarkupManager] rawMarkup must be a string');
40+
this.logger.warn('[MarkupManager] rawMarkup must be a string');
4541
return;
4642
}
4743
this._markups.set(id, rawMarkup);
4844

4945
this.emit('markupChanged', {id, rawMarkup});
50-
this.logger?.log(`[MarkupManager] Raw markup for ID ${id} set successfully`);
46+
this.logger.log(`[MarkupManager] Raw markup for ID ${id} set successfully`);
5147
}
5248

5349
/**
5450
* Set a node for a specific id
5551
*/
5652
setNode(id: string, node: Node): void {
5753
if (!node) {
58-
this.logger?.error('[MarkupManager] Node must be a valid ProseMirror Node');
54+
this.logger.warn('[MarkupManager] Node must be a valid ProseMirror Node');
5955
return;
6056
}
6157
this._nodes.set(id, node);
6258

6359
this.emit('nodeChanged', {id, node});
64-
this.logger?.log(`[MarkupManager] Node for ID ${id} set successfully`);
60+
this.logger.log(`[MarkupManager] Node for ID ${id} set successfully`);
6561
}
6662

6763
/**
@@ -90,6 +86,6 @@ export class MarkupManager extends SafeEventEmitter<Events> implements IMarkupMa
9086
this._nodes.clear();
9187

9288
this.emit('reset', {});
93-
this.logger?.log('[MarkupManager] MarkupManager has been reset');
89+
this.logger.log('[MarkupManager] MarkupManager has been reset');
9490
}
9591
}

0 commit comments

Comments
 (0)