Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hawk.so/javascript",
"version": "3.1.0",
"version": "3.2.0",
"description": "JavaScript errors tracking for Hawk.so",
"files": [
"dist"
Expand Down
50 changes: 48 additions & 2 deletions src/integrations/vue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,27 @@ export class VueIntegration {
/**
* Extract additional useful information from the Vue app
*
* @param vm - vue VM
* @param vm - component instance
* @param info - a Vue-specific error info, e.g. which lifecycle hook the error was found in.
*/
private spoilAddons(vm: { [key: string]: unknown }, info: string): VueIntegrationAddons {
const isVue3 = vm.$ !== undefined;

if (isVue3) {
return this.spoilAddonsFromVue3(vm, info);
} else {
return this.spoilAddonsFromVue2(vm, info);
}
}

/**
* Extract additional useful information from the Vue 2 app
*
* @param vm - component instance
* @param info - which lifecycle hook the error was found in.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private spoilAddons(vm: { [key: string]: any }, info: string): VueIntegrationAddons {
private spoilAddonsFromVue2(vm: { [key: string]: any }, info: string): VueIntegrationAddons {
const addons: VueIntegrationAddons = {
lifecycle: info,
component: null,
Expand Down Expand Up @@ -130,6 +146,36 @@ export class VueIntegration {
return addons;
}

/**
* Extract additional useful information from the Vue 3 app
*
* @param vm - component instance
* @param info - which lifecycle hook the error was found in.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private spoilAddonsFromVue3(vm: { [key: string]: any }, info: string): VueIntegrationAddons {
const addons: VueIntegrationAddons = {
lifecycle: info,
component: null,
};

/**
* Extract the component name
*/
if (vm.$options !== undefined) {
addons['component'] = `<${vm.$options.__name || vm.$options.name || vm.$options._componentTag || 'Anonymous'}>`;
}

/**
* Fill props
*/
if (Object.keys(vm.$props).length) {
addons['props'] = vm.$props;
}

return addons;
}

/**
* Write error to the console
*
Expand Down