Skip to content

Commit 4d30601

Browse files
authored
Merge pull request #51 from buggregator/issue/#44-fix-ray-emty-string-broken-event
Issue/#44 fix ray emty string broken event
2 parents f1b16d4 + f1f6161 commit 4d30601

File tree

6 files changed

+260
-16
lines changed

6 files changed

+260
-16
lines changed

components/RayDumpPreview/RayDumpLaravelPreview.stories.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Meta, Story } from "@storybook/vue3";
22
import RayDumpPreview from '~/components/RayDumpPreview/RayDumpPreview.vue';
33
import { normalizeRayDumpEvent } from "~/utils/normalize-event";
44
import rayQueryEventMock from '~/mocks/ray-laravel-query.json'
5+
import rayQuery2EventMock from '~/mocks/ray-laravel-query-no-bindings.json'
56
import rayEloquentEventMock from '~/mocks/ray-laravel-eloquent.json'
67
import rayViewsEventMock from '~/mocks/ray-laravel-views.json'
78
import rayEventsEventMock from '~/mocks/ray-laravel-events.json'
@@ -25,6 +26,9 @@ const Template: Story = (args) => ({
2526
export const Query = Template.bind({});
2627
Query.args = {event: normalizeRayDumpEvent(rayQueryEventMock),};
2728

29+
export const Query2 = Template.bind({});
30+
Query2.args = {event: normalizeRayDumpEvent(rayQuery2EventMock),};
31+
2832
export const Eloquent = Template.bind({});
2933
Eloquent.args = {event: normalizeRayDumpEvent(rayEloquentEventMock),};
3034

components/RayDumpPreview/RayDumpPreview.stories.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import rayTableEventMock from '~/mocks/ray-table.json'
1919
import rayTextEventMock from '~/mocks/ray-text.json'
2020
import rayTraceEventMock from '~/mocks/ray-trace.json'
2121
import rayLockEventMock from '~/mocks/ray-lock.json'
22+
import rayIssue44EventMock from '~/mocks/ray-github-issue-44.json'
2223

2324
export default {
2425
title: "RayDump/RayDumpPreview/Common",
@@ -89,3 +90,6 @@ Caller.args = {event: normalizeRayDumpEvent(rayCallerEventMock),};
8990

9091
export const Lock = Template.bind({});
9192
Lock.args = {event: normalizeRayDumpEvent(rayLockEventMock),};
93+
94+
export const Issue44 = Template.bind({});
95+
Issue44.args = {event: normalizeRayDumpEvent(rayIssue44EventMock),};

components/RayDumpPreview/RayTypesPreview/QueryPayload.vue

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
<template>
22
<div class="ray-type-query">
3-
<CodeSnippet language="sql" class="event-ray__query-snippet" :code="formattedSql" />
3+
<CodeSnippet
4+
language="sql"
5+
class="event-ray__query-snippet"
6+
:code="formattedSql"
7+
/>
48
<EventTable class="event-ray__query-table">
59
<EventTableRow title="Connection name">
610
{{ payload.content.connection_name }}
711
</EventTableRow>
8-
<EventTableRow title="Time">
9-
{{ payload.content.time }}ms
10-
</EventTableRow>
12+
<EventTableRow title="Time"> {{ payload.content.time }}ms </EventTableRow>
1113
</EventTable>
1214
</div>
1315
</template>
1416

1517
<script lang="ts">
16-
import {defineComponent, PropType} from "vue";
17-
import {RayPayload} from "~/config/types";
18+
import { defineComponent, PropType } from "vue";
19+
import { RayPayload } from "~/config/types";
1820
import EventTable from "~/components/EventTable/EventTable.vue";
1921
import EventTableRow from "~/components/EventTableRow/EventTableRow.vue";
2022
import CodeSnippet from "~/components/CodeSnippet/CodeSnippet.vue";
@@ -23,7 +25,7 @@ export default defineComponent({
2325
components: {
2426
EventTableRow,
2527
EventTable,
26-
CodeSnippet
28+
CodeSnippet,
2729
},
2830
props: {
2931
payload: {
@@ -33,10 +35,11 @@ export default defineComponent({
3335
},
3436
computed: {
3537
formattedSql() {
36-
return this.payload.content.bindings.reduce((sql, currentValue) => {
37-
return sql.replace(/\?/, `'${currentValue}'`)
38-
}, this.payload.content.sql)
39-
}
38+
return (this.payload.content?.bindings || []).reduce(
39+
(result, binding) => result.replace(/\?/, `'${binding}'`),
40+
this.payload.content?.sql || ""
41+
);
42+
},
4043
},
4144
});
4245
</script>

config/types.ts

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,29 +162,84 @@ export interface VarDump {
162162
}
163163
}
164164

165+
interface RayContentFrame {
166+
file_name: string,
167+
line_number: number,
168+
class: string | null,
169+
method: string,
170+
vendor_frame: boolean,
171+
snippet?: { line_number: number, text: string }[]
172+
}
165173
export interface RayContent {
166174
content: string,
167175
label: string,
168176
}
169177

178+
export interface RayContentCarbone {
179+
formatted: string,
180+
timestamp: number,
181+
timezone: string
182+
}
183+
170184
export interface RayContentArray {
171-
values: [string | number | boolean]
185+
values: string[] | number[] | boolean[]
186+
}
187+
188+
export interface RayContentException {
189+
class?: string,
190+
message?: string,
191+
frames: RayContentFrame[]
172192
}
193+
export interface RayContentSQL {
194+
sql: string,
195+
bindings: string[],
196+
connection_name: string
197+
time: number
198+
}
199+
export interface RayContentEloquent {
200+
class_name: string,
201+
attributes: string
202+
}
203+
export interface RayContentViews {
204+
view_path: string,
205+
view_path_relative_to_project_root: string,
206+
data: string
207+
}
208+
export interface RayContentJobs {
209+
event_name: string,
210+
job: string,
211+
exception: string | null
212+
}
213+
173214

174215
export interface RayPayload {
175216
type: string,
176-
origin: {
217+
origin?: {
177218
file: string,
178219
line_number: number,
179220
hostname: string,
180221
},
181-
content: RayContentArray | RayContent
222+
content: RayContentException
223+
| RayContentArray
224+
| RayContent
225+
| RayContentCarbone
226+
| RayContentSQL
227+
| RayContentEloquent
228+
| RayContentViews
229+
| RayContentJobs
230+
| { frame: RayContentFrame }
231+
| { value: string }
232+
| { color: string }
233+
| { label: string }
234+
| { name: string }
235+
| { size: string }
236+
| never[]
182237
}
183238

184239
export interface RayDump {
185240
uuid: string,
186241
payloads: RayPayload[],
187-
meta: {
242+
meta?: {
188243
php_version: string,
189244
php_version_id: number,
190245
project_name: string,
@@ -320,7 +375,7 @@ export interface ServerEvent<T> {
320375
type: TEventType | string,
321376
payload: T,
322377
project_id: string | null,
323-
timestamp: number
378+
timestamp?: number // unavailable for some ray dump events
324379
}
325380

326381
export interface NormalizedEvent {

mocks/ray-github-issue-44.json

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
{
2+
"project_id": null,
3+
"uuid": "b3ee69b0-60e1-4fc0-add5-2c5677dd2b8c",
4+
"type": "ray",
5+
"payload": {
6+
"uuid": "b3ee69b0-60e1-4fc0-add5-2c5677dd2b8c",
7+
"payloads": [
8+
{
9+
"type": "exception",
10+
"content": {
11+
"class": "Illuminate\\Encryption\\MissingAppKeyException",
12+
"message": "No application encryption key has been specified.",
13+
"frames": [
14+
{
15+
"file_name": "/var/www/modules/ApiV1/Routes/api.php",
16+
"line_number": 7,
17+
"class": "Illuminate\\Routing\\RouteFileRegistrar",
18+
"method": " {closure}",
19+
"vendor_frame": false,
20+
"snippet": [
21+
{
22+
"line_number": 1,
23+
"text": "<?php"
24+
},
25+
{
26+
"line_number": 2,
27+
"text": ""
28+
},
29+
{
30+
"line_number": 3,
31+
"text": "use Illuminate\\Http\\Request;"
32+
},
33+
{
34+
"line_number": 4,
35+
"text": "use Illuminate\\Support\\Facades\\Route;"
36+
},
37+
{
38+
"line_number": 5,
39+
"text": ""
40+
},
41+
{
42+
"line_number": 6,
43+
"text": "Route::get('test', static function (Request $request) {"
44+
},
45+
{
46+
"line_number": 7,
47+
"text": "ROUTES FROM LARAVEL PASSPORT"
48+
}
49+
]
50+
},
51+
{
52+
"file_name": "/var/www/vendor/laravel/framework/src/Illuminate/Routing/CallableDispatcher.php",
53+
"line_number": 40,
54+
"class": "Illuminate\\Routing\\CallableDispatcher",
55+
"method": "dispatch",
56+
"vendor_frame": false,
57+
"snippet": [
58+
{
59+
"line_number": 34,
60+
"text": " @param \\Illuminate\\Routing\\Route $route"
61+
},
62+
{
63+
"line_number": 35,
64+
"text": " * @param callable Scallable"
65+
},
66+
{
67+
"line_number": 36,
68+
"text": " @return mixed"
69+
},
70+
{
71+
"line_number": 37,
72+
"text": " */"
73+
},
74+
{
75+
"line_number": 38,
76+
"text": " public function dispatch(Route $route, Scallable)"
77+
},
78+
{
79+
"line_number": 39,
80+
"text": " {"
81+
},
82+
{
83+
"line_number": 40,
84+
"text": " return Scallable(...array_values($this->resolveParameters($route, Scallable)));"
85+
},
86+
{
87+
"line_number": 41,
88+
"text": " }"
89+
},
90+
{
91+
"line_number": 42,
92+
"text": ""
93+
},
94+
{
95+
"line_number": 43,
96+
"text": " /**"
97+
},
98+
{
99+
"line_number": 44,
100+
"text": " Resolve the parameters for the callable."
101+
},
102+
{
103+
"line_number": 45,
104+
"text": " *"
105+
}
106+
]
107+
},
108+
{
109+
"file_name": "/var/www/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
110+
"line_number": 237,
111+
"class": "Illuminate\\Routing\\Route",
112+
"method": "runCallable",
113+
"vendor_frame": false,
114+
"snippet": [
115+
{
116+
"line_number": 231,
117+
"text": "Scallable = $this->action['uses'];"
118+
},
119+
{
120+
"line_number": 232,
121+
"text": ""
122+
},
123+
{
124+
"line_number": 233,
125+
"text": "Scallable = unserialize($this->action['uses'])->getClosure();"
126+
},
127+
{
128+
"line_number": 235,
129+
"text": ">container[CallableDispatcher::class]->dispatch($this, Scallable);"
130+
},
131+
{
132+
"line_number": 238,
133+
"text": " Determine if the route action is a serialized Closure."
134+
},
135+
{
136+
"line_number": 242,
137+
"text": " *"
138+
}
139+
]
140+
}
141+
]
142+
}
143+
}
144+
]
145+
}
146+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"uuid": "da076402-6f98-4ada-bae2-d77d405cf427",
3+
"type": "ray",
4+
"payload": {
5+
"uuid": "fb7bf182-3c9b-4898-9e9b-5fcbd9f555bd",
6+
"payloads": [
7+
{
8+
"type": "executed_query",
9+
"content": {
10+
"sql": "select * from \"users\" where \"email\" = ? limit 1",
11+
"connection_name": "sqlite",
12+
"time": 0.38
13+
},
14+
"origin": {
15+
"file": "/root/repos/buggreagtor/examples/app/Modules/Ray/RayLaravel.php",
16+
"line_number": 20,
17+
"hostname": "ButschsterLpp"
18+
}
19+
}
20+
],
21+
"meta": {
22+
"php_version": "8.2.5",
23+
"php_version_id": 80205,
24+
"project_name": "",
25+
"laravel_version": "9.52.4",
26+
"laravel_ray_package_version": "1.32.2.0",
27+
"ray_package_version": "1.36.2.0"
28+
}
29+
},
30+
"timestamp": 1673266869,
31+
"project_id": null
32+
}

0 commit comments

Comments
 (0)