-- Compiled with roblox-ts v1.2.7 local TS = _G[script] local LogLevel = TS.import(script, TS.getModule(script, "@rbxts", "log").out).LogLevel local _message_templates = TS.import(script, TS.getModule(script, "@rbxts", "message-templates").out) local MessageTemplateParser = _message_templates.MessageTemplateParser local PlainTextMessageTemplateRenderer = _message_templates.PlainTextMessageTemplateRenderer local Roact = TS.import(script, TS.getModule(script, "@rbxts", "roact").src) local ZirconStructuredMessageTemplateRenderer = TS.import(script, script.Parent.Parent, "Format", "ZirconStructuredMessageTemplate").ZirconStructuredMessageTemplateRenderer local _ThemeContext = TS.import(script, script.Parent.Parent, "UIKit", "ThemeContext") local ThemeContext = _ThemeContext.default local getRichTextColor3 = _ThemeContext.getRichTextColor3 local italicize = _ThemeContext.italicize local _flipper = TS.import(script, TS.getModule(script, "@rbxts", "flipper").src) local Flipper = _flipper local Instant = _flipper.Instant local Padding = TS.import(script, script.Parent, "Padding").default local formatRichText = TS.import(script, script.Parent.Parent, "Format").formatRichText local connect = TS.import(script, TS.getModule(script, "@rbxts", "roact-rodux").src).connect local function sanitise(input) return (string.gsub(input, "[<>]", { [">"] = ">", ["<"] = "<", })) end local keys = { "Template", "Level", "Timestamp" } local function getNonEventProps(logEvent) local props = {} for key, value in pairs(logEvent) do if not (table.find(keys, key) ~= nil) then local _arg0 = { key, value } -- ▼ Array.push ▼ props[#props + 1] = _arg0 -- ▲ Array.push ▲ end end return props end local StructuredLogMessageComponent do StructuredLogMessageComponent = Roact.Component:extend("StructuredLogMessageComponent") function StructuredLogMessageComponent:init(props) self.state = { viewDetails = false, minHeight = 25, } self.height, self.setHeight = Roact.createBinding(self.state.minHeight) self.heightMotor = Flipper.SingleMotor.new(self.height:getValue()) self.heightMotor:onStep(function(value) return self.setHeight(value) end) end function StructuredLogMessageComponent:didMount() local logEvent = self.props.LogEvent local tokens = MessageTemplateParser.GetTokens(logEvent.Template) local plainText = PlainTextMessageTemplateRenderer.new(tokens) local result = plainText:Render(logEvent) self:setState({ minHeight = #string.split(result, "\n") * 25, }) end function StructuredLogMessageComponent:didUpdate(_, prevState) if prevState.minHeight ~= self.state.minHeight then self.heightMotor:setGoal(Instant.new(self.state.minHeight)) end end function StructuredLogMessageComponent:willUnmount() self.heightMotor:destroy() end function StructuredLogMessageComponent:render() local _binding = self.props local LogEvent = _binding.LogEvent local Context = _binding.Context local _binding_1 = LogEvent local Template = _binding_1.Template local Timestamp = _binding_1.Timestamp local Level = _binding_1.Level local SourceContext = _binding_1.SourceContext local messages = {} local tokens = MessageTemplateParser.GetTokens(sanitise(Template)) local evtProps = getNonEventProps(self.props.LogEvent) return Roact.createElement(ThemeContext.Consumer, { render = function(theme) local highlightRenderer = ZirconStructuredMessageTemplateRenderer.new(tokens, theme) local _exp = string.split(highlightRenderer:Render(LogEvent), "\n") local _arg0 = function(f, i) return i > 0 and string.rep(" ", 6) .. f or f end -- ▼ ReadonlyArray.map ▼ local _newValue = table.create(#_exp) for _k, _v in ipairs(_exp) do _newValue[_k] = _arg0(_v, _k - 1, _exp) end -- ▲ ReadonlyArray.map ▲ local text = table.concat(_newValue, "\n") if Level == LogLevel.Information then local _arg0_1 = getRichTextColor3(theme, "Cyan", "INFO ") -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ local _arg0_2 = getRichTextColor3(theme, "White", text) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_2 -- ▲ Array.push ▲ elseif Level == LogLevel.Debugging then local _arg0_1 = getRichTextColor3(theme, "Green", "DEBUG") -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ local _arg0_2 = getRichTextColor3(theme, "White", text) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_2 -- ▲ Array.push ▲ elseif Level == LogLevel.Verbose then local _arg0_1 = getRichTextColor3(theme, "Grey", "VERBOSE") -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ local _arg0_2 = getRichTextColor3(theme, "White", text) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_2 -- ▲ Array.push ▲ elseif Level == LogLevel.Warning then local _arg0_1 = getRichTextColor3(theme, "Yellow", "WARN ") -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ local _arg0_2 = getRichTextColor3(theme, "White", text) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_2 -- ▲ Array.push ▲ elseif Level == LogLevel.Error then local _arg0_1 = getRichTextColor3(theme, "Red", "ERROR ") -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ local _arg0_2 = getRichTextColor3(theme, "Yellow", text) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_2 -- ▲ Array.push ▲ elseif Level == LogLevel.Fatal then local _arg0_1 = getRichTextColor3(theme, "Red", "FATAL ") -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ local _arg0_2 = getRichTextColor3(theme, "Red", text) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_2 -- ▲ Array.push ▲ end if SourceContext ~= nil and self.props.showTagsInOutput then local _arg0_1 = "- " .. italicize(getRichTextColor3(theme, "Grey", tostring(LogEvent.SourceContext))) -- ▼ Array.push ▼ messages[#messages + 1] = _arg0_1 -- ▲ Array.push ▲ end local _attributes = { AutoButtonColor = self.props.logDetailsPaneEnabled, Size = self.height:map(function(v) return UDim2.new(1, 0, 0, v) end), BackgroundTransparency = 0.5, BackgroundColor3 = theme.SecondaryBackgroundColor3, BorderSizePixel = 0, [Roact.Event.MouseButton1Click] = function() if not self.props.logDetailsPaneEnabled then return nil end if self.state.viewDetails then self.heightMotor:setGoal(Flipper.Spring.new(self.state.minHeight)) else self.heightMotor:setGoal(Flipper.Spring.new(self.state.minHeight + #evtProps * 30 + 5)) end self:setState({ viewDetails = not self.state.viewDetails, }) end, } local _children = { Roact.createElement("Frame", { Size = UDim2.new(0, 5, 1, 0), BackgroundColor3 = Context == 0 and theme.ServerContextColor or theme.ClientContextColor, BorderSizePixel = 0, }), Roact.createElement("TextLabel", { RichText = true, Position = UDim2.new(0, 10, 0, 0), Size = UDim2.new(1, -15, 0, self.state.minHeight), Text = table.concat(messages, " "), BackgroundTransparency = 1, Font = theme.ConsoleFont, TextColor3 = theme.PrimaryTextColor3, TextXAlignment = "Left", TextSize = 20, }), } local _length = #_children local _condition = self.props.logDetailsPaneEnabled and self.state.viewDetails if _condition then local _arg0_1 = function(_param) local key = _param[1] local value = _param[2] return Roact.createElement("Frame", { BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 25), BorderSizePixel = 0, }, { Roact.createElement(Padding, { Padding = { Horizontal = 5, }, }), Roact.createElement("UIListLayout", { FillDirection = "Horizontal", Padding = UDim.new(0, 10), }), Roact.createElement("TextLabel", { Text = key, Font = theme.ConsoleFont, TextSize = 16, BackgroundTransparency = 1, Size = UDim2.new(0.25, 0, 1, 0), TextColor3 = theme.PrimaryTextColor3, TextXAlignment = "Left", }), Roact.createElement("TextLabel", { Text = formatRichText(value, nil, theme), Font = theme.ConsoleFont, TextSize = 16, RichText = true, BackgroundTransparency = 1, Size = UDim2.new(0.75, 0, 1, 0), TextColor3 = theme.PrimaryTextColor3, TextXAlignment = "Left", }), }) end -- ▼ ReadonlyArray.map ▼ local _newValue_1 = table.create(#evtProps) for _k, _v in ipairs(evtProps) do _newValue_1[_k] = _arg0_1(_v, _k - 1, evtProps) end -- ▲ ReadonlyArray.map ▲ _condition = _newValue_1 end local _attributes_1 = { Position = UDim2.new(0, 30, 0, self.state.minHeight), ClipsDescendants = true, BorderSizePixel = 0, BackgroundTransparency = 1, Size = self.height:map(function(v) return UDim2.new(1, -35, 0, v - 25) end), } local _children_1 = { Roact.createElement("UIListLayout", { Padding = UDim.new(0, 5), }), } local _length_1 = #_children_1 if _condition then for _k, _v in ipairs(_condition) do _children_1[_length_1 + _k] = _v end end _children[_length + 1] = Roact.createElement("Frame", _attributes_1, _children_1) return Roact.createElement("ImageButton", _attributes, _children) end, }) end end local mapStateToProps = function(props) return { logDetailsPaneEnabled = props.logDetailsPaneEnabled, showTagsInOutput = props.showTagsInOutput, } end local StructuredLogMessage = connect(mapStateToProps)(StructuredLogMessageComponent) return { getNonEventProps = getNonEventProps, StructuredLogMessage = StructuredLogMessage, }