forked from frappe/books
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrenderer.ts
129 lines (112 loc) · 3.49 KB
/
renderer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import { CUSTOM_EVENTS } from 'utils/messages';
import { UnexpectedLogObject } from 'utils/types';
import { App as VueApp, createApp } from 'vue';
import App from './App.vue';
import Badge from './components/Badge.vue';
import FeatherIcon from './components/FeatherIcon.vue';
import { handleError, sendError } from './errorHandling';
import { fyo } from './initFyo';
import { outsideClickDirective } from './renderer/helpers';
import registerIpcRendererListeners from './renderer/registerIpcRendererListeners';
import router from './router';
import { stringifyCircular } from './utils';
import { setLanguageMap } from './utils/language';
// eslint-disable-next-line @typescript-eslint/no-floating-promises
(async () => {
const language = fyo.config.get('language') as string;
if (language) {
await setLanguageMap(language);
}
fyo.store.language = language || 'English';
registerIpcRendererListeners();
const { isDevelopment, platform, version } = await ipc.getEnv();
fyo.store.isDevelopment = isDevelopment;
fyo.store.appVersion = version;
fyo.store.platform = platform;
const platformName = getPlatformName(platform);
setOnWindow(isDevelopment);
const app = createApp({
template: '<App/>',
});
app.config.unwrapInjectedRef = true;
setErrorHandlers(app);
app.use(router);
app.component('App', App);
app.component('FeatherIcon', FeatherIcon);
app.component('Badge', Badge);
app.directive('on-outside-click', outsideClickDirective);
app.mixin({
computed: {
fyo() {
return fyo;
},
platform() {
return platformName;
},
},
methods: {
t: fyo.t,
T: fyo.T,
},
});
await fyo.telemetry.logOpened();
app.mount('body');
})();
function setErrorHandlers(app: VueApp) {
window.onerror = (message, source, lineno, colno, error) => {
error = error ?? new Error('triggered in window.onerror');
// eslint-disable-next-line @typescript-eslint/no-floating-promises
handleError(true, error, { message, source, lineno, colno });
};
window.onunhandledrejection = (event: PromiseRejectionEvent) => {
let error: Error;
if (event.reason instanceof Error) {
error = event.reason;
} else {
error = new Error(String(event.reason));
}
// eslint-disable-next-line no-console
handleError(true, error).catch((err) => console.error(err));
};
window.addEventListener(CUSTOM_EVENTS.LOG_UNEXPECTED, (event) => {
const details = (event as CustomEvent)?.detail as UnexpectedLogObject;
// eslint-disable-next-line @typescript-eslint/no-floating-promises
sendError(details);
});
app.config.errorHandler = (err, vm, info) => {
const more: Record<string, unknown> = {
info,
};
if (vm) {
const { fullPath, params } = vm.$route;
more.fullPath = fullPath;
more.params = stringifyCircular(params ?? {});
more.props = stringifyCircular(vm.$props ?? {}, true, true);
}
// eslint-disable-next-line @typescript-eslint/no-floating-promises
handleError(false, err as Error, more);
// eslint-disable-next-line no-console
console.error(err, vm, info);
};
}
function setOnWindow(isDevelopment: boolean) {
if (!isDevelopment) {
return;
}
// @ts-ignore
window.router = router;
// @ts-ignore
window.fyo = fyo;
}
function getPlatformName(platform: string) {
switch (platform) {
case 'win32':
return 'Windows';
case 'darwin':
return 'Mac';
case 'linux':
return 'Linux';
default:
return 'Linux';
}
}