From 6c4220b358368ed584bc6cd136847a433ce0016d Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 01:10:10 +0100 Subject: [PATCH 01/11] feat: setup testing scripts --- .env.example.luau | 3 + .gitignore | 1 + .justfile | 29 ---- .lune/.DS_Store | Bin 0 -> 6148 bytes .lune/.luaurc | 8 + .lune/test/bin/run-tests.luau | 15 ++ .lune/test/init.luau | 75 +++++++++ .lune/test/types.luau | 88 ++++++++++ .lune/test/utility/buildUploadPlaceAsync.luau | 105 ++++++++++++ .lune/test/utility/createBar.luau | 60 +++++++ .lune/test/utility/createSpinner.luau | 65 +++++++ .lune/test/utility/executeLuauTaskAsync.luau | 159 ++++++++++++++++++ .lune/test/utility/richPrint.luau | 15 ++ .vscode/settings.json | 8 +- .zed/settings.json | 38 +++++ test-config.luau | 7 + 16 files changed, 644 insertions(+), 32 deletions(-) create mode 100644 .env.example.luau delete mode 100644 .justfile create mode 100644 .lune/.DS_Store create mode 100644 .lune/.luaurc create mode 100644 .lune/test/bin/run-tests.luau create mode 100644 .lune/test/init.luau create mode 100644 .lune/test/types.luau create mode 100644 .lune/test/utility/buildUploadPlaceAsync.luau create mode 100644 .lune/test/utility/createBar.luau create mode 100644 .lune/test/utility/createSpinner.luau create mode 100644 .lune/test/utility/executeLuauTaskAsync.luau create mode 100644 .lune/test/utility/richPrint.luau create mode 100644 .zed/settings.json create mode 100644 test-config.luau diff --git a/.env.example.luau b/.env.example.luau new file mode 100644 index 0000000..95a7540 --- /dev/null +++ b/.env.example.luau @@ -0,0 +1,3 @@ +return { + ROBLOX_OC_API_KEY = "API_KEY_HERE", +} diff --git a/.gitignore b/.gitignore index ef1a689..553eb36 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build/ dsn.lua globalTypes.d.lua +.env.luau *.rbxm *.rbxl diff --git a/.justfile b/.justfile deleted file mode 100644 index cb12492..0000000 --- a/.justfile +++ /dev/null @@ -1,29 +0,0 @@ -analyze: sourcemap - curl -O https://raw.githubusercontent.com/JohnnyMorganz/luau-lsp/main/scripts/globalTypes.d.lua - luau-lsp analyze --definitions=globalTypes.d.lua --base-luaurc=.luaurc --sourcemap=sourcemap.json --settings=.vscode/settings.json --flag:LuauTinyControlFlowAnalysis=true --no-strict-dm-types packages/ - -# Installs packages and proxies their type information with `wally-package-types` tool -# In addition, the packages/ directory is temporarily renamed so that it isn't removed by Wally -install-packages: - rm -rf deps/ - mv packages/ temp/ - - wally install - - mv Packages deps/ - mv temp/ packages/ - - rojo sourcemap example.project.json --output sourcemap.json - wally-package-types --sourcemap sourcemap.json deps/ - - echo "{ \"languageMode\": \"nocheck\" }" > deps/_Index/evaera_promise@4.0.0/promise/.luaurc - -build: - rojo build --output SentrySdk.rbxm - -build-example: sourcemap - rojo build --output example/SentryExample.rbxl example.project.json - -sourcemap: - echo "{}" > sourcemap.json - rojo sourcemap --output sourcemap.json example.project.json diff --git a/.lune/.DS_Store b/.lune/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e710721f23ba2b2d4e38d215061d69cd664c9d08 GIT binary patch literal 6148 zcmeHK-AcnS6i!@q8AIrW!Y%{e4%|?O;7ytH1+3_W%4})TVr|CS*^4pgwZ4!~;`4Y; zl8VE5E8@<913Kp}R6<@zUoTN!!^m^}nqv33BHAPdj#jXFKO1}t-Sw0M=*JxcRm4>w*gqKNN zj@_M8l@&pf#Zz67L@}h?TqRkg%AuNNQLbx!6A&%Y8oQnOe9#|s<>8>W=*s!=5$Xs1 z#iAv4_x4ZD$B*e#rd|x89Qf9`${)W%uB#^Xoi9Vt^PR28e<6Wx$>Z zqP@Np(8`GcV&De`aDR}{5Iu{PLA`ZAhu3F}JBTQt<68nzTJ$Vd1|b5%O(~!$<@Sle zO*#0b&GRf)22DBRdS)2M&RjoUxSk#SQl~TS8Kj;VAO@BhXc*JQ^ZyKfnU# = { T } + +export type LuauExecutionSessionTask_State = + "STATE_UNSPECIFIED" + | "QUEUED" + | "PROCESSING" + | "CANCELLED" + | "COMPLETE" + | "FAILED" + +--- Present when the task execution fails. Contains details about the error that +--- caused the failure. +export type LuauExecutionSessionTask_Error = { + --- An error code indicating the category of the error. + code: "ERROR_CODE_UNSPECIFIED" + | "SCRIPT_ERROR" + | "DEADLINE_EXCEEDED" + | "OUTPUT_SIZE_LIMIT_EXCEEDED" + | "INTERNAL_ERROR", + --- An error message containing more details about the error. + message: string, +} + +--- Present when the task execution succeeds. Contains the output of the +--- execution. +export type LuauExecutionSessionTask_Output = { + --- Return values from the script that was run. Return values that are not + --- JSON serializable (such as Data Model Instances) will be returned as + --- nulls. + results: Array, +} + +--[[ + A `LuauExecutionSessionTask` ("task" for short) executes a given Luau script + in the context of a specific version of a place. + + The script may access and update the data model of the place, including + invoking any module scripts. However, data model changes are local to the + task and cannot be persisted. + + The script can also invoke engine APIs that read and/or modify data stored + in the cloud, such as those for DataStores. Exercise caution when using such + APIs. +]] +export type LuauExecutionSessionTask_Request = { + --- The script to be run as part of this task. + script: string, +} + +export type LuauExecutionSessionTask = LuauExecutionSessionTask_Request & { + --- The resource path of the luau execution session task. + path: string, + --- Time when this task was created. This string is formatted as a + --- Timestamp. + createTime: string, + --- Time when this task's state last changed. This string is formatted as a + --- Timestamp. + updateTime: string, + --- The user that created the API key that was used to create this task. + user: string, + --- The task's state. See the State enum for information about each possible + --- value. + state: LuauExecutionSessionTask_State, + + error: LuauExecutionSessionTask_Error?, + output: LuauExecutionSessionTask_Output?, +} + +--[[ + Represents a chunk of log messages generated by a `LuauExecutionSessionTask`. + + The amount of logs that is retained is limited. See the documentation of the + `LuauExecutionSessionTask` resource for more details. + + Logs have the same retention time as the parent task. +]] +export type LuauExecutionSessionTaskLog = { + luauExecutionSessionTaskLogs: Array<{ + --- The resource path of the luau execution session task log. + path: string, + --- A list of log messages generated by the task execution. Each call to the + --- Luau `print()` function from the task's script's code results in a + --- single list item here, even if the message itself contains newlines. + messages: Array, + }>, +} + +return nil diff --git a/.lune/test/utility/buildUploadPlaceAsync.luau b/.lune/test/utility/buildUploadPlaceAsync.luau new file mode 100644 index 0000000..8f15533 --- /dev/null +++ b/.lune/test/utility/buildUploadPlaceAsync.luau @@ -0,0 +1,105 @@ +local fs = require("@lune/fs") +local net = require("@lune/net") +local process = require("@lune/process") +local serde = require("@lune/serde") + +local createSpinner = require("./createSpinner") +local richPrint = require("./richPrint") + +export type BuildUploadPlaceOptions = { + universeId: number, + placeId: number, + apiKey: string, + filePath: string, + rojoProjectFile: string, +} + +export type BuildUploadPlaceResult = { + versionNumber: number, +} + +local function buildUploadPlaceAsync(options: BuildUploadPlaceOptions): BuildUploadPlaceResult? + local universeId = options.universeId + local placeId = options.placeId + local apiKey = options.apiKey + local filePath = options.filePath + local rojoProjectFile = options.rojoProjectFile + + local function buildPlaceAsync(): boolean + local spinner = createSpinner() + spinner.setText("Building place file...") + spinner.start() + + local result = process.exec("rojo", { + "build", + rojoProjectFile, + "--output", + filePath, + }) + + spinner.stop() + + if result.ok then + return true + else + richPrint("red", "bold", "Failed to build place file") + print(result.stderr) + return false + end + end + + local function uploadPlaceAsync(): (boolean, number?) + local spinner = createSpinner() + spinner.setText("Uploading place file...") + spinner.start() + + local readSuccess, placeFile = pcall(fs.readFile, filePath) + if not readSuccess then + spinner.stop() + richPrint("red", "bold", "Failed to read place file") + return false + end + + local res = net.request({ + url = `https://apis.roblox.com/universes/v1/{universeId}/places/{placeId}/versions`, + method = "POST", + body = placeFile, + query = { + versionType = "Published", + }, + headers = { + ["x-api-key"] = apiKey, + ["Content-Type"] = "application/octet-stream", + ["Accept"] = "application/json", + }, + }) + + spinner.stop() + + local decodedBody = serde.decode("json", res.body) + if res.ok then + return true, decodedBody.versionNumber + else + richPrint("red", "bold", "Failed to upload place file") + print(decodedBody) + + return false + end + end + + local buildSuccess = buildPlaceAsync() + if not buildSuccess then + return nil + end + + local uploadSuccess, versionNumber = uploadPlaceAsync() + if not uploadSuccess then + return nil + end + + return { + versionNumber = versionNumber :: number, + } +end + +return buildUploadPlaceAsync diff --git a/.lune/test/utility/createBar.luau b/.lune/test/utility/createBar.luau new file mode 100644 index 0000000..daadc7d --- /dev/null +++ b/.lune/test/utility/createBar.luau @@ -0,0 +1,60 @@ +local stdio = require("@lune/stdio") + +local CLEAR_LINE = "\x1b[2K\r" +local BAR_CHARS = { " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉" } + +function createBar(percent: number?, text: string?) + local bar = { + percent = math.clamp(percent or 0, 0, 1), + length = 10, + text = tostring(text or ""), + } + + function bar.setLength(newLength: number) + bar.length = math.clamp(newLength, 2, 100) + end + + function bar.setPercent(newPercent: number) + bar.percent = math.clamp(newPercent, 0, 1) + end + + function bar.setText(newText: string) + bar.text = tostring(newText) + end + + function bar.render() + local wholeWidth = math.floor(bar.percent * bar.length) + local remainderWidth = (bar.percent * bar.length) % 1 + local partWidth = math.floor(remainderWidth * 8) + local partChar = if wholeWidth >= bar.length then "" else BAR_CHARS[partWidth + 1] + + local barText = "[" + .. string.rep("█", wholeWidth) + .. partChar + .. string.rep(" ", bar.length - wholeWidth - 1) + .. "]" + + stdio.write( + CLEAR_LINE + .. stdio.style("dim") + .. stdio.color("green") + .. barText + .. stdio.style("bold") + .. string.format(" %.1f%% ", bar.percent * 100) + .. stdio.style("reset") + .. stdio.color("reset") + .. bar.text + or "" + ) + end + + function bar.clear() + stdio.write(CLEAR_LINE) + bar.percent = 0 + bar.text = "" + end + + return bar +end + +return createBar diff --git a/.lune/test/utility/createSpinner.luau b/.lune/test/utility/createSpinner.luau new file mode 100644 index 0000000..bd0566a --- /dev/null +++ b/.lune/test/utility/createSpinner.luau @@ -0,0 +1,65 @@ +local stdio = require("@lune/stdio") +local task = require("@lune/task") + +local CLEAR_LINE = "\x1b[2K\r" +local SPINNER_FRAMES = { "◜", "◝", "◞", "◟" } + +local function createSpinner() + local spinner = { + animating = false, + animateThread = nil :: thread?, + text = "", + frame = 1, + } + + function spinner.setText(newText: string) + spinner.text = tostring(newText) + end + + function spinner.start() + if spinner.animateThread then + return + end + + spinner.animating = true + spinner.frame = 1 + spinner.animateThread = task.spawn(function() + while spinner.animating do + stdio.write( + CLEAR_LINE + .. stdio.style("bold") + .. stdio.color("green") + .. SPINNER_FRAMES[spinner.frame] + .. stdio.style("reset") + .. stdio.color("reset") + .. " " + .. spinner.text + ) + + spinner.frame += 1 + if spinner.frame > #SPINNER_FRAMES then + spinner.frame = 1 + end + + task.wait(1 / 20) + end + end) + end + + function spinner.stop() + spinner.animating = false + if spinner.animateThread then + task.cancel(spinner.animateThread) + spinner.animateThread = nil + end + + spinner.text = "" + spinner.frame = 1 + + stdio.write(CLEAR_LINE) + end + + return spinner +end + +return createSpinner diff --git a/.lune/test/utility/executeLuauTaskAsync.luau b/.lune/test/utility/executeLuauTaskAsync.luau new file mode 100644 index 0000000..c850420 --- /dev/null +++ b/.lune/test/utility/executeLuauTaskAsync.luau @@ -0,0 +1,159 @@ +local net = require("@lune/net") +local serde = require("@lune/serde") +local stdio = require("@lune/stdio") +local task = require("@lune/task") + +local createSpinner = require("./createSpinner") +local richPrint = require("./richPrint") + +local types = require("../types") +type LuauExecutionSessionTask = types.LuauExecutionSessionTask +type LuauExecutionSessionTaskLog = types.LuauExecutionSessionTaskLog + +type Array = { T } + +local BASE_URL = "https://apis.roblox.com" + +export type ExecuteTaskOptions = { + universeId: number, + placeId: number, + placeVersion: number, + + apiKey: string, + + script: string, +} + +local function executeLuauTaskAsync(options: ExecuteTaskOptions) + local universeId = options.universeId + local placeId = options.placeId + local placeVersion = options.placeVersion + local apiKey = options.apiKey + local script = options.script + + local executionTask: LuauExecutionSessionTask? = nil + + local function createTaskAsync(): boolean + local spinner = createSpinner() + spinner.setText("Creating execution task...") + spinner.start() + + local res = net.request({ + url = `{BASE_URL}/cloud/v2/universes/{universeId}/places/{placeId}/versions/{placeVersion}/luau-execution-session-tasks`, + method = "POST", + body = serde.encode("json", { + script = script, + }), + headers = { + ["x-api-key"] = apiKey, + ["Content-Type"] = "application/json", + ["Accept"] = "application/json", + }, + }) + + spinner.stop() + + local decodedBody = serde.decode("json", res.body) + if res.ok then + executionTask = decodedBody + return true + else + richPrint("red", "bold", `Failed to create execution task ({res.statusMessage})`) + print(decodedBody) + return false + end + end + + local function pollForTaskCompletionAsync(): boolean + if executionTask == nil then + error("Execution task is nil") + end + + local spinner = createSpinner() + spinner.setText("Waiting for task to complete...") + spinner.start() + + while true do + local res = net.request({ + url = `{BASE_URL}/cloud/v2/{executionTask.path}`, + method = "GET", + headers = { + ["x-api-key"] = apiKey, + ["Accept"] = "application/json", + }, + }) + + local decodedBody = serde.decode("json", res.body) + if not res.ok then + spinner.stop() + richPrint("red", "bold", `Execution task failed`) + print(decodedBody) + return false + end + + executionTask = decodedBody + if executionTask.state ~= "PROCESSING" then + spinner.stop() + return true + end + + task.wait(1) + end + + spinner.stop() + end + + local function getTaskLogsAsync(): Array + if executionTask == nil then + error("Execution task is nil") + end + + local spinner = createSpinner() + spinner.setText("Fetching task logs...") + spinner.start() + + local res = net.request({ + url = `{BASE_URL}/cloud/v2/{executionTask.path}/logs`, + method = "GET", + headers = { + ["x-api-key"] = apiKey, + ["Accept"] = "application/json", + }, + }) + + spinner.stop() + + local decodedBody: LuauExecutionSessionTaskLog = serde.decode("json", res.body) + if not res.ok then + richPrint("red", "bold", `Failed to fetch task logs ({res.statusMessage})`) + print(decodedBody) + return {} + end + + local logs: Array = {} + for _, log in decodedBody.luauExecutionSessionTaskLogs do + for _, message in ipairs(log.messages) do + table.insert(logs, message) + end + end + + return logs + end + + local createTaskSuccess = createTaskAsync() + if not createTaskSuccess then + return + end + + local pollTaskSuccess = pollForTaskCompletionAsync() + if not pollTaskSuccess then + return + end + + local logs = getTaskLogsAsync() + for _, message in logs do + stdio.write(message .. `\n`) + end +end + +return executeLuauTaskAsync diff --git a/.lune/test/utility/richPrint.luau b/.lune/test/utility/richPrint.luau new file mode 100644 index 0000000..571967f --- /dev/null +++ b/.lune/test/utility/richPrint.luau @@ -0,0 +1,15 @@ +local stdio = require("@lune/stdio") + +local function richPrint(color: stdio.Color, style: stdio.Style, ...) + -- stylua: ignore + stdio.write( + stdio.color(color) + .. stdio.style(style) + .. (...) + .. "\n" + .. stdio.color("reset") + .. stdio.style("reset") + ) +end + +return richPrint diff --git a/.vscode/settings.json b/.vscode/settings.json index 8922e50..97f2bc5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,7 @@ { - "luau-lsp.types.roblox": true, - "luau-lsp.sourcemap.enabled": true, - "luau-lsp.sourcemap.rojoProjectFile": "example.project.json" + "luau-lsp.sourcemap.rojoProjectFile": "default.project.json", + "luau-lsp.completion.imports.enabled": true, + "luau-lsp.completion.imports.suggestServices": true, + "luau-lsp.completion.imports.suggestRequires": false, + "luau-lsp.completion.imports.separateGroupsWithLine": true } diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..4577bd9 --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,38 @@ +// Folder-specific settings +// +// For a full list of overridable settings, and general information on folder-specific settings, +// see the documentation: https://zed.dev/docs/configuring-zed#settings-files +{ + "languages": { + "Luau": { + "hard_tabs": true, + "tab_size": 4 + } + }, + "file_types": { + "Luau": ["*.lua"], + "JSONC": [".luaurc"], + "TOML": ["rotriever.lock"] + }, + "diagnostics": { + "lsp_pull_diagnostics": { + "enabled": false + } + }, + "lsp": { + "luau-lsp": { + "settings": { + "luau-lsp": { + "completion": { + "imports": { + "enabled": true, + "separateGroupsWithLine": true, + "suggestRequires": false, + "suggestServices": true + } + } + } + } + } + } +} diff --git a/test-config.luau b/test-config.luau new file mode 100644 index 0000000..4944efc --- /dev/null +++ b/test-config.luau @@ -0,0 +1,7 @@ +return { + placeId = 98877362830092, + universeId = 7864706368, + + testPlaceFile = "test-place.rbxl", + rojoProjectFile = "test.project.json", +} From 7d87d2e1399398dddfeed083d2cbea672cacee54 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 01:11:17 +0100 Subject: [PATCH 02/11] chore: rename packages/ to modules/ --- {packages => modules}/core/README.md | 0 .../core/default.project.json | 0 {packages => modules}/core/src/api.lua | 0 {packages => modules}/core/src/baseclient.lua | 0 {packages => modules}/core/src/checkin.lua | 0 {packages => modules}/core/src/constants.lua | 0 {packages => modules}/core/src/envelope.lua | 0 {packages => modules}/core/src/exports.lua | 0 {packages => modules}/core/src/hub.lua | 0 {packages => modules}/core/src/init.lua | 0 .../core/src/integration.lua | 0 .../core/src/integrations/inboundfilter.lua | 0 .../core/src/integrations/init.lua | 0 {packages => modules}/core/src/scope.lua | 0 {packages => modules}/core/src/sdk.lua | 0 {packages => modules}/core/src/session.lua | 0 .../core/src/sessionflusher.lua | 0 .../src/tracing/dynamicSamplingContext.lua | 0 .../core/src/transports/base.lua | 0 .../core/src/utils/hasTracingEnabled.lua | 0 .../core/src/utils/prepareEvent.lua | 0 {packages => modules}/core/src/version.lua | 0 {packages => modules}/roblox/README.md | 0 .../roblox/default.project.json | 0 {packages => modules}/roblox/src/client.lua | 0 .../roblox/src/eventbuilder.lua | 0 {packages => modules}/roblox/src/helpers.lua | 0 {packages => modules}/roblox/src/init.lua | 0 .../roblox/src/integrations/dedupe.lua | 0 .../src/integrations/globalhandlers.lua | 0 .../roblox/src/integrations/inapp.lua | 0 .../roblox/src/integrations/init.lua | 0 .../roblox/src/stackparser.lua | 0 .../roblox/src/transports/httpservice.lua | 0 .../roblox/src/transports/init.lua | 0 .../roblox/src/transports/types.lua | 0 {packages => modules}/roblox/src/types.lua | 0 .../roblox/src/userfeedback.lua | 0 {packages => modules}/types/README.md | 0 .../types/default.project.json | 0 .../types/src/_recursiveModules.lua | 0 .../types/src/attachment.lua | 0 .../types/src/breadcrumb.lua | 0 {packages => modules}/types/src/checkin.lua | 0 .../types/src/clientreport.lua | 0 {packages => modules}/types/src/context.lua | 0 .../types/src/datacategory.lua | 0 {packages => modules}/types/src/debugMeta.lua | 0 {packages => modules}/types/src/error.lua | 0 {packages => modules}/types/src/exception.lua | 0 {packages => modules}/types/src/extra.lua | 0 {packages => modules}/types/src/init.lua | 0 .../types/src/instrument.lua | 0 .../types/src/instrumenter.lua | 0 .../types/src/measurement.lua | 0 {packages => modules}/types/src/mechanism.lua | 0 {packages => modules}/types/src/misc.lua | 0 {packages => modules}/types/src/package.lua | 0 {packages => modules}/types/src/promise.lua | 0 {packages => modules}/types/src/sdkinfo.lua | 0 .../types/src/sdkmetadata.lua | 0 {packages => modules}/types/src/session.lua | 0 {packages => modules}/types/src/severity.lua | 0 .../types/src/stackframe.lua | 0 .../types/src/stacktrace.lua | 0 .../types/src/textencoder.lua | 0 {packages => modules}/types/src/thread.lua | 0 {packages => modules}/types/src/user.lua | 0 {packages => modules}/utils/README.md | 0 .../utils/default.project.json | 0 .../utils/src/_syncpromise.lua | 0 {packages => modules}/utils/src/envelope.lua | 0 {packages => modules}/utils/src/error.lua | 0 {packages => modules}/utils/src/global.lua | 0 {packages => modules}/utils/src/init.lua | 0 {packages => modules}/utils/src/is.lua | 0 {packages => modules}/utils/src/logger.lua | 0 {packages => modules}/utils/src/memo.lua | 0 {packages => modules}/utils/src/misc.lua | 0 {packages => modules}/utils/src/normalize.lua | 0 {packages => modules}/utils/src/object.lua | 0 .../utils/src/promisebuffer.lua | 0 {packages => modules}/utils/src/ratelimit.lua | 0 .../utils/src/stacktrace.lua | 0 {packages => modules}/utils/src/string.lua | 0 {packages => modules}/utils/src/time.lua | 0 .../src/vendor/prettyformat/collections.lua | 0 .../utils/src/vendor/prettyformat/init.lua | 0 .../utils/src/vendor/prettyformat/types.lua | 0 packages/types/src/dsn.lua | 27 --- packages/utils/src/dsn.lua | 160 ------------------ 91 files changed, 187 deletions(-) rename {packages => modules}/core/README.md (100%) rename {packages => modules}/core/default.project.json (100%) rename {packages => modules}/core/src/api.lua (100%) rename {packages => modules}/core/src/baseclient.lua (100%) rename {packages => modules}/core/src/checkin.lua (100%) rename {packages => modules}/core/src/constants.lua (100%) rename {packages => modules}/core/src/envelope.lua (100%) rename {packages => modules}/core/src/exports.lua (100%) rename {packages => modules}/core/src/hub.lua (100%) rename {packages => modules}/core/src/init.lua (100%) rename {packages => modules}/core/src/integration.lua (100%) rename {packages => modules}/core/src/integrations/inboundfilter.lua (100%) rename {packages => modules}/core/src/integrations/init.lua (100%) rename {packages => modules}/core/src/scope.lua (100%) rename {packages => modules}/core/src/sdk.lua (100%) rename {packages => modules}/core/src/session.lua (100%) rename {packages => modules}/core/src/sessionflusher.lua (100%) rename {packages => modules}/core/src/tracing/dynamicSamplingContext.lua (100%) rename {packages => modules}/core/src/transports/base.lua (100%) rename {packages => modules}/core/src/utils/hasTracingEnabled.lua (100%) rename {packages => modules}/core/src/utils/prepareEvent.lua (100%) rename {packages => modules}/core/src/version.lua (100%) rename {packages => modules}/roblox/README.md (100%) rename {packages => modules}/roblox/default.project.json (100%) rename {packages => modules}/roblox/src/client.lua (100%) rename {packages => modules}/roblox/src/eventbuilder.lua (100%) rename {packages => modules}/roblox/src/helpers.lua (100%) rename {packages => modules}/roblox/src/init.lua (100%) rename {packages => modules}/roblox/src/integrations/dedupe.lua (100%) rename {packages => modules}/roblox/src/integrations/globalhandlers.lua (100%) rename {packages => modules}/roblox/src/integrations/inapp.lua (100%) rename {packages => modules}/roblox/src/integrations/init.lua (100%) rename {packages => modules}/roblox/src/stackparser.lua (100%) rename {packages => modules}/roblox/src/transports/httpservice.lua (100%) rename {packages => modules}/roblox/src/transports/init.lua (100%) rename {packages => modules}/roblox/src/transports/types.lua (100%) rename {packages => modules}/roblox/src/types.lua (100%) rename {packages => modules}/roblox/src/userfeedback.lua (100%) rename {packages => modules}/types/README.md (100%) rename {packages => modules}/types/default.project.json (100%) rename {packages => modules}/types/src/_recursiveModules.lua (100%) rename {packages => modules}/types/src/attachment.lua (100%) rename {packages => modules}/types/src/breadcrumb.lua (100%) rename {packages => modules}/types/src/checkin.lua (100%) rename {packages => modules}/types/src/clientreport.lua (100%) rename {packages => modules}/types/src/context.lua (100%) rename {packages => modules}/types/src/datacategory.lua (100%) rename {packages => modules}/types/src/debugMeta.lua (100%) rename {packages => modules}/types/src/error.lua (100%) rename {packages => modules}/types/src/exception.lua (100%) rename {packages => modules}/types/src/extra.lua (100%) rename {packages => modules}/types/src/init.lua (100%) rename {packages => modules}/types/src/instrument.lua (100%) rename {packages => modules}/types/src/instrumenter.lua (100%) rename {packages => modules}/types/src/measurement.lua (100%) rename {packages => modules}/types/src/mechanism.lua (100%) rename {packages => modules}/types/src/misc.lua (100%) rename {packages => modules}/types/src/package.lua (100%) rename {packages => modules}/types/src/promise.lua (100%) rename {packages => modules}/types/src/sdkinfo.lua (100%) rename {packages => modules}/types/src/sdkmetadata.lua (100%) rename {packages => modules}/types/src/session.lua (100%) rename {packages => modules}/types/src/severity.lua (100%) rename {packages => modules}/types/src/stackframe.lua (100%) rename {packages => modules}/types/src/stacktrace.lua (100%) rename {packages => modules}/types/src/textencoder.lua (100%) rename {packages => modules}/types/src/thread.lua (100%) rename {packages => modules}/types/src/user.lua (100%) rename {packages => modules}/utils/README.md (100%) rename {packages => modules}/utils/default.project.json (100%) rename {packages => modules}/utils/src/_syncpromise.lua (100%) rename {packages => modules}/utils/src/envelope.lua (100%) rename {packages => modules}/utils/src/error.lua (100%) rename {packages => modules}/utils/src/global.lua (100%) rename {packages => modules}/utils/src/init.lua (100%) rename {packages => modules}/utils/src/is.lua (100%) rename {packages => modules}/utils/src/logger.lua (100%) rename {packages => modules}/utils/src/memo.lua (100%) rename {packages => modules}/utils/src/misc.lua (100%) rename {packages => modules}/utils/src/normalize.lua (100%) rename {packages => modules}/utils/src/object.lua (100%) rename {packages => modules}/utils/src/promisebuffer.lua (100%) rename {packages => modules}/utils/src/ratelimit.lua (100%) rename {packages => modules}/utils/src/stacktrace.lua (100%) rename {packages => modules}/utils/src/string.lua (100%) rename {packages => modules}/utils/src/time.lua (100%) rename {packages => modules}/utils/src/vendor/prettyformat/collections.lua (100%) rename {packages => modules}/utils/src/vendor/prettyformat/init.lua (100%) rename {packages => modules}/utils/src/vendor/prettyformat/types.lua (100%) delete mode 100644 packages/types/src/dsn.lua delete mode 100644 packages/utils/src/dsn.lua diff --git a/packages/core/README.md b/modules/core/README.md similarity index 100% rename from packages/core/README.md rename to modules/core/README.md diff --git a/packages/core/default.project.json b/modules/core/default.project.json similarity index 100% rename from packages/core/default.project.json rename to modules/core/default.project.json diff --git a/packages/core/src/api.lua b/modules/core/src/api.lua similarity index 100% rename from packages/core/src/api.lua rename to modules/core/src/api.lua diff --git a/packages/core/src/baseclient.lua b/modules/core/src/baseclient.lua similarity index 100% rename from packages/core/src/baseclient.lua rename to modules/core/src/baseclient.lua diff --git a/packages/core/src/checkin.lua b/modules/core/src/checkin.lua similarity index 100% rename from packages/core/src/checkin.lua rename to modules/core/src/checkin.lua diff --git a/packages/core/src/constants.lua b/modules/core/src/constants.lua similarity index 100% rename from packages/core/src/constants.lua rename to modules/core/src/constants.lua diff --git a/packages/core/src/envelope.lua b/modules/core/src/envelope.lua similarity index 100% rename from packages/core/src/envelope.lua rename to modules/core/src/envelope.lua diff --git a/packages/core/src/exports.lua b/modules/core/src/exports.lua similarity index 100% rename from packages/core/src/exports.lua rename to modules/core/src/exports.lua diff --git a/packages/core/src/hub.lua b/modules/core/src/hub.lua similarity index 100% rename from packages/core/src/hub.lua rename to modules/core/src/hub.lua diff --git a/packages/core/src/init.lua b/modules/core/src/init.lua similarity index 100% rename from packages/core/src/init.lua rename to modules/core/src/init.lua diff --git a/packages/core/src/integration.lua b/modules/core/src/integration.lua similarity index 100% rename from packages/core/src/integration.lua rename to modules/core/src/integration.lua diff --git a/packages/core/src/integrations/inboundfilter.lua b/modules/core/src/integrations/inboundfilter.lua similarity index 100% rename from packages/core/src/integrations/inboundfilter.lua rename to modules/core/src/integrations/inboundfilter.lua diff --git a/packages/core/src/integrations/init.lua b/modules/core/src/integrations/init.lua similarity index 100% rename from packages/core/src/integrations/init.lua rename to modules/core/src/integrations/init.lua diff --git a/packages/core/src/scope.lua b/modules/core/src/scope.lua similarity index 100% rename from packages/core/src/scope.lua rename to modules/core/src/scope.lua diff --git a/packages/core/src/sdk.lua b/modules/core/src/sdk.lua similarity index 100% rename from packages/core/src/sdk.lua rename to modules/core/src/sdk.lua diff --git a/packages/core/src/session.lua b/modules/core/src/session.lua similarity index 100% rename from packages/core/src/session.lua rename to modules/core/src/session.lua diff --git a/packages/core/src/sessionflusher.lua b/modules/core/src/sessionflusher.lua similarity index 100% rename from packages/core/src/sessionflusher.lua rename to modules/core/src/sessionflusher.lua diff --git a/packages/core/src/tracing/dynamicSamplingContext.lua b/modules/core/src/tracing/dynamicSamplingContext.lua similarity index 100% rename from packages/core/src/tracing/dynamicSamplingContext.lua rename to modules/core/src/tracing/dynamicSamplingContext.lua diff --git a/packages/core/src/transports/base.lua b/modules/core/src/transports/base.lua similarity index 100% rename from packages/core/src/transports/base.lua rename to modules/core/src/transports/base.lua diff --git a/packages/core/src/utils/hasTracingEnabled.lua b/modules/core/src/utils/hasTracingEnabled.lua similarity index 100% rename from packages/core/src/utils/hasTracingEnabled.lua rename to modules/core/src/utils/hasTracingEnabled.lua diff --git a/packages/core/src/utils/prepareEvent.lua b/modules/core/src/utils/prepareEvent.lua similarity index 100% rename from packages/core/src/utils/prepareEvent.lua rename to modules/core/src/utils/prepareEvent.lua diff --git a/packages/core/src/version.lua b/modules/core/src/version.lua similarity index 100% rename from packages/core/src/version.lua rename to modules/core/src/version.lua diff --git a/packages/roblox/README.md b/modules/roblox/README.md similarity index 100% rename from packages/roblox/README.md rename to modules/roblox/README.md diff --git a/packages/roblox/default.project.json b/modules/roblox/default.project.json similarity index 100% rename from packages/roblox/default.project.json rename to modules/roblox/default.project.json diff --git a/packages/roblox/src/client.lua b/modules/roblox/src/client.lua similarity index 100% rename from packages/roblox/src/client.lua rename to modules/roblox/src/client.lua diff --git a/packages/roblox/src/eventbuilder.lua b/modules/roblox/src/eventbuilder.lua similarity index 100% rename from packages/roblox/src/eventbuilder.lua rename to modules/roblox/src/eventbuilder.lua diff --git a/packages/roblox/src/helpers.lua b/modules/roblox/src/helpers.lua similarity index 100% rename from packages/roblox/src/helpers.lua rename to modules/roblox/src/helpers.lua diff --git a/packages/roblox/src/init.lua b/modules/roblox/src/init.lua similarity index 100% rename from packages/roblox/src/init.lua rename to modules/roblox/src/init.lua diff --git a/packages/roblox/src/integrations/dedupe.lua b/modules/roblox/src/integrations/dedupe.lua similarity index 100% rename from packages/roblox/src/integrations/dedupe.lua rename to modules/roblox/src/integrations/dedupe.lua diff --git a/packages/roblox/src/integrations/globalhandlers.lua b/modules/roblox/src/integrations/globalhandlers.lua similarity index 100% rename from packages/roblox/src/integrations/globalhandlers.lua rename to modules/roblox/src/integrations/globalhandlers.lua diff --git a/packages/roblox/src/integrations/inapp.lua b/modules/roblox/src/integrations/inapp.lua similarity index 100% rename from packages/roblox/src/integrations/inapp.lua rename to modules/roblox/src/integrations/inapp.lua diff --git a/packages/roblox/src/integrations/init.lua b/modules/roblox/src/integrations/init.lua similarity index 100% rename from packages/roblox/src/integrations/init.lua rename to modules/roblox/src/integrations/init.lua diff --git a/packages/roblox/src/stackparser.lua b/modules/roblox/src/stackparser.lua similarity index 100% rename from packages/roblox/src/stackparser.lua rename to modules/roblox/src/stackparser.lua diff --git a/packages/roblox/src/transports/httpservice.lua b/modules/roblox/src/transports/httpservice.lua similarity index 100% rename from packages/roblox/src/transports/httpservice.lua rename to modules/roblox/src/transports/httpservice.lua diff --git a/packages/roblox/src/transports/init.lua b/modules/roblox/src/transports/init.lua similarity index 100% rename from packages/roblox/src/transports/init.lua rename to modules/roblox/src/transports/init.lua diff --git a/packages/roblox/src/transports/types.lua b/modules/roblox/src/transports/types.lua similarity index 100% rename from packages/roblox/src/transports/types.lua rename to modules/roblox/src/transports/types.lua diff --git a/packages/roblox/src/types.lua b/modules/roblox/src/types.lua similarity index 100% rename from packages/roblox/src/types.lua rename to modules/roblox/src/types.lua diff --git a/packages/roblox/src/userfeedback.lua b/modules/roblox/src/userfeedback.lua similarity index 100% rename from packages/roblox/src/userfeedback.lua rename to modules/roblox/src/userfeedback.lua diff --git a/packages/types/README.md b/modules/types/README.md similarity index 100% rename from packages/types/README.md rename to modules/types/README.md diff --git a/packages/types/default.project.json b/modules/types/default.project.json similarity index 100% rename from packages/types/default.project.json rename to modules/types/default.project.json diff --git a/packages/types/src/_recursiveModules.lua b/modules/types/src/_recursiveModules.lua similarity index 100% rename from packages/types/src/_recursiveModules.lua rename to modules/types/src/_recursiveModules.lua diff --git a/packages/types/src/attachment.lua b/modules/types/src/attachment.lua similarity index 100% rename from packages/types/src/attachment.lua rename to modules/types/src/attachment.lua diff --git a/packages/types/src/breadcrumb.lua b/modules/types/src/breadcrumb.lua similarity index 100% rename from packages/types/src/breadcrumb.lua rename to modules/types/src/breadcrumb.lua diff --git a/packages/types/src/checkin.lua b/modules/types/src/checkin.lua similarity index 100% rename from packages/types/src/checkin.lua rename to modules/types/src/checkin.lua diff --git a/packages/types/src/clientreport.lua b/modules/types/src/clientreport.lua similarity index 100% rename from packages/types/src/clientreport.lua rename to modules/types/src/clientreport.lua diff --git a/packages/types/src/context.lua b/modules/types/src/context.lua similarity index 100% rename from packages/types/src/context.lua rename to modules/types/src/context.lua diff --git a/packages/types/src/datacategory.lua b/modules/types/src/datacategory.lua similarity index 100% rename from packages/types/src/datacategory.lua rename to modules/types/src/datacategory.lua diff --git a/packages/types/src/debugMeta.lua b/modules/types/src/debugMeta.lua similarity index 100% rename from packages/types/src/debugMeta.lua rename to modules/types/src/debugMeta.lua diff --git a/packages/types/src/error.lua b/modules/types/src/error.lua similarity index 100% rename from packages/types/src/error.lua rename to modules/types/src/error.lua diff --git a/packages/types/src/exception.lua b/modules/types/src/exception.lua similarity index 100% rename from packages/types/src/exception.lua rename to modules/types/src/exception.lua diff --git a/packages/types/src/extra.lua b/modules/types/src/extra.lua similarity index 100% rename from packages/types/src/extra.lua rename to modules/types/src/extra.lua diff --git a/packages/types/src/init.lua b/modules/types/src/init.lua similarity index 100% rename from packages/types/src/init.lua rename to modules/types/src/init.lua diff --git a/packages/types/src/instrument.lua b/modules/types/src/instrument.lua similarity index 100% rename from packages/types/src/instrument.lua rename to modules/types/src/instrument.lua diff --git a/packages/types/src/instrumenter.lua b/modules/types/src/instrumenter.lua similarity index 100% rename from packages/types/src/instrumenter.lua rename to modules/types/src/instrumenter.lua diff --git a/packages/types/src/measurement.lua b/modules/types/src/measurement.lua similarity index 100% rename from packages/types/src/measurement.lua rename to modules/types/src/measurement.lua diff --git a/packages/types/src/mechanism.lua b/modules/types/src/mechanism.lua similarity index 100% rename from packages/types/src/mechanism.lua rename to modules/types/src/mechanism.lua diff --git a/packages/types/src/misc.lua b/modules/types/src/misc.lua similarity index 100% rename from packages/types/src/misc.lua rename to modules/types/src/misc.lua diff --git a/packages/types/src/package.lua b/modules/types/src/package.lua similarity index 100% rename from packages/types/src/package.lua rename to modules/types/src/package.lua diff --git a/packages/types/src/promise.lua b/modules/types/src/promise.lua similarity index 100% rename from packages/types/src/promise.lua rename to modules/types/src/promise.lua diff --git a/packages/types/src/sdkinfo.lua b/modules/types/src/sdkinfo.lua similarity index 100% rename from packages/types/src/sdkinfo.lua rename to modules/types/src/sdkinfo.lua diff --git a/packages/types/src/sdkmetadata.lua b/modules/types/src/sdkmetadata.lua similarity index 100% rename from packages/types/src/sdkmetadata.lua rename to modules/types/src/sdkmetadata.lua diff --git a/packages/types/src/session.lua b/modules/types/src/session.lua similarity index 100% rename from packages/types/src/session.lua rename to modules/types/src/session.lua diff --git a/packages/types/src/severity.lua b/modules/types/src/severity.lua similarity index 100% rename from packages/types/src/severity.lua rename to modules/types/src/severity.lua diff --git a/packages/types/src/stackframe.lua b/modules/types/src/stackframe.lua similarity index 100% rename from packages/types/src/stackframe.lua rename to modules/types/src/stackframe.lua diff --git a/packages/types/src/stacktrace.lua b/modules/types/src/stacktrace.lua similarity index 100% rename from packages/types/src/stacktrace.lua rename to modules/types/src/stacktrace.lua diff --git a/packages/types/src/textencoder.lua b/modules/types/src/textencoder.lua similarity index 100% rename from packages/types/src/textencoder.lua rename to modules/types/src/textencoder.lua diff --git a/packages/types/src/thread.lua b/modules/types/src/thread.lua similarity index 100% rename from packages/types/src/thread.lua rename to modules/types/src/thread.lua diff --git a/packages/types/src/user.lua b/modules/types/src/user.lua similarity index 100% rename from packages/types/src/user.lua rename to modules/types/src/user.lua diff --git a/packages/utils/README.md b/modules/utils/README.md similarity index 100% rename from packages/utils/README.md rename to modules/utils/README.md diff --git a/packages/utils/default.project.json b/modules/utils/default.project.json similarity index 100% rename from packages/utils/default.project.json rename to modules/utils/default.project.json diff --git a/packages/utils/src/_syncpromise.lua b/modules/utils/src/_syncpromise.lua similarity index 100% rename from packages/utils/src/_syncpromise.lua rename to modules/utils/src/_syncpromise.lua diff --git a/packages/utils/src/envelope.lua b/modules/utils/src/envelope.lua similarity index 100% rename from packages/utils/src/envelope.lua rename to modules/utils/src/envelope.lua diff --git a/packages/utils/src/error.lua b/modules/utils/src/error.lua similarity index 100% rename from packages/utils/src/error.lua rename to modules/utils/src/error.lua diff --git a/packages/utils/src/global.lua b/modules/utils/src/global.lua similarity index 100% rename from packages/utils/src/global.lua rename to modules/utils/src/global.lua diff --git a/packages/utils/src/init.lua b/modules/utils/src/init.lua similarity index 100% rename from packages/utils/src/init.lua rename to modules/utils/src/init.lua diff --git a/packages/utils/src/is.lua b/modules/utils/src/is.lua similarity index 100% rename from packages/utils/src/is.lua rename to modules/utils/src/is.lua diff --git a/packages/utils/src/logger.lua b/modules/utils/src/logger.lua similarity index 100% rename from packages/utils/src/logger.lua rename to modules/utils/src/logger.lua diff --git a/packages/utils/src/memo.lua b/modules/utils/src/memo.lua similarity index 100% rename from packages/utils/src/memo.lua rename to modules/utils/src/memo.lua diff --git a/packages/utils/src/misc.lua b/modules/utils/src/misc.lua similarity index 100% rename from packages/utils/src/misc.lua rename to modules/utils/src/misc.lua diff --git a/packages/utils/src/normalize.lua b/modules/utils/src/normalize.lua similarity index 100% rename from packages/utils/src/normalize.lua rename to modules/utils/src/normalize.lua diff --git a/packages/utils/src/object.lua b/modules/utils/src/object.lua similarity index 100% rename from packages/utils/src/object.lua rename to modules/utils/src/object.lua diff --git a/packages/utils/src/promisebuffer.lua b/modules/utils/src/promisebuffer.lua similarity index 100% rename from packages/utils/src/promisebuffer.lua rename to modules/utils/src/promisebuffer.lua diff --git a/packages/utils/src/ratelimit.lua b/modules/utils/src/ratelimit.lua similarity index 100% rename from packages/utils/src/ratelimit.lua rename to modules/utils/src/ratelimit.lua diff --git a/packages/utils/src/stacktrace.lua b/modules/utils/src/stacktrace.lua similarity index 100% rename from packages/utils/src/stacktrace.lua rename to modules/utils/src/stacktrace.lua diff --git a/packages/utils/src/string.lua b/modules/utils/src/string.lua similarity index 100% rename from packages/utils/src/string.lua rename to modules/utils/src/string.lua diff --git a/packages/utils/src/time.lua b/modules/utils/src/time.lua similarity index 100% rename from packages/utils/src/time.lua rename to modules/utils/src/time.lua diff --git a/packages/utils/src/vendor/prettyformat/collections.lua b/modules/utils/src/vendor/prettyformat/collections.lua similarity index 100% rename from packages/utils/src/vendor/prettyformat/collections.lua rename to modules/utils/src/vendor/prettyformat/collections.lua diff --git a/packages/utils/src/vendor/prettyformat/init.lua b/modules/utils/src/vendor/prettyformat/init.lua similarity index 100% rename from packages/utils/src/vendor/prettyformat/init.lua rename to modules/utils/src/vendor/prettyformat/init.lua diff --git a/packages/utils/src/vendor/prettyformat/types.lua b/modules/utils/src/vendor/prettyformat/types.lua similarity index 100% rename from packages/utils/src/vendor/prettyformat/types.lua rename to modules/utils/src/vendor/prettyformat/types.lua diff --git a/packages/types/src/dsn.lua b/packages/types/src/dsn.lua deleted file mode 100644 index 50189e3..0000000 --- a/packages/types/src/dsn.lua +++ /dev/null @@ -1,27 +0,0 @@ --- upstream: https://github.com/getsentry/sentry-javascript/blob/540adac9ec81803f86a3a7f5b34ebbc1ad2a8d23/packages/types/src/dsn.ts - ---- Supported Sentry transport protocols in a Dsn. -export type DsnProtocol = "http" | "https" - ---- Primitive components of a Dsn. -export type DsnComponents = { - --- Protocol used to connect to Sentry. - protocol: DsnProtocol, - --- Public authorization key. - publicKey: string?, - --- Private authorization key (deprecated, optional). - pass: string?, - --- Hostname of the Sentry instance. - host: string, - --- Port of the Sentry instance. - port: string?, - --- Sub path/ - path: string?, - --- Project ID - projectId: string, -} - ---- Anything that can be parsed into a Dsn. -export type DsnLike = string | DsnComponents - -return {} diff --git a/packages/utils/src/dsn.lua b/packages/utils/src/dsn.lua deleted file mode 100644 index ea69492..0000000 --- a/packages/utils/src/dsn.lua +++ /dev/null @@ -1,160 +0,0 @@ --- upstream: https://github.com/getsentry/sentry-javascript/blob/540adac9ec81803f86a3a7f5b34ebbc1ad2a8d23/packages/utils/src/dsn.ts - -local PackageRoot = script.Parent -local Packages = PackageRoot.Parent - -local Types = require(Packages.SentryTypes) -type DsnComponents = Types.DsnComponents -type DsnLike = Types.DsnLike -type DsnProtocol = Types.DsnProtocol - -local RegExp = require(Packages.RegExp) -local logger = require(PackageRoot.logger).logger -local console = require(Packages.LuauPolyfill).console - ---- Regular expression used to parse a Dsn. -local DSN_REGEX = RegExp( - [[^(?:(?\w+):)\/\/(?:(?\w+)(?::(?\w+)?)?@)(?[\w.-]+)(?::(?\d+))?\/(?.+)]] -) - -local function isValidProtocol(protocol: string?): boolean - return protocol == "http" or protocol == "https" -end - -local DsnUtils = {} - ---- Renders the string representation of this Dsn. ---- ---- By default, this will render the public representation without the password ---- component. To get the deprecated private representation, set `withPassword` ---- to true. ---- ---- @param withPassword When set to true, the password will be included. -function DsnUtils.dsnToString(dsn: DsnComponents, withPassword_: boolean?): string - local withPassword = if withPassword_ == nil then false else withPassword_ - - return ( - `{dsn.protocol}://{dsn.publicKey}{if withPassword and dsn.pass ~= "" then `:{dsn.pass}` else ""}` - .. `@{dsn.host}{if dsn.port then `:{dsn.port}` else ""}/{if dsn.path then `{dsn.path}/` else dsn.path}{dsn.projectId}` - ) -end - -function DsnUtils.dsnFromComponents(components: DsnComponents): DsnComponents - return { - protocol = components.protocol, - publicKey = components.publicKey or "", - pass = components.pass or "", - host = components.host, - port = components.port or "", - path = components.path or "", - projectId = components.projectId, - } -end - ---- Parses a Dsn from a given string. ---- ---- @param str A Dsn as string ---- @returns Dsn as DsnComponents or undefined if @param str is not a valid DSN string -local function dsnFromString(str: string): DsnComponents | nil - local match = DSN_REGEX:exec(str) - - if not match then - -- This should be logged to the console - console.error(`Invalid Sentry Dsn: {str}`) - return nil - end - - local protocol, publicKey, pass, host, port, lastPath - - -- Determine if 'pass' and 'port' are present - if tonumber(match[4]) then - -- pass is missing but port is present - protocol, publicKey, host, port, lastPath = match[2], match[3], match[4], match[5], match[7] - pass = "" - elseif not tonumber(match[5]) then - -- both pass and port are missing - protocol, publicKey, host, lastPath = match[2], match[3], match[5], match[7] - pass, port = "", "" - else - -- both are present - protocol, publicKey, pass, host, port, lastPath = match[2], match[3], match[4], match[5], match[6], match[7] - end - - local path = "" - local projectId = lastPath - - local split = string.split(projectId, "/") - if #split > 1 then - path = table.concat(split, "/", 1, #split - 1) - projectId = split[#split] - end - - if projectId then - local projectMatch = string.match(projectId, "^%d+") - if projectMatch then - projectId = projectMatch - end - end - - return DsnUtils.dsnFromComponents({ - host = host, - pass = pass, - path = path, - projectId = projectId, - port = port, - protocol = protocol, - publicKey = publicKey, - }) -end - -local function validateDsn(dsn: DsnComponents): boolean - if not _G.__SENTRY_DEV__ then - return true - end - - local port, projectId, protocol = dsn.port, dsn.projectId, dsn.protocol - - local requiredComponents = { "protocol", "publicKey", "host", "projectId" } - local hasMissingRequiredComponent = false - - for _, component in ipairs(requiredComponents) do - if not dsn[component] then - logger.error("Invalid Sentry Dsn: " .. component .. " missing") - hasMissingRequiredComponent = true - break - end - end - - if hasMissingRequiredComponent then - return false - end - - if not string.match(projectId, "^%d+$") then - logger.error("Invalid Sentry Dsn: Invalid projectId " .. projectId) - return false - end - - if not isValidProtocol(protocol) then - logger.error("Invalid Sentry Dsn: Invalid protocol " .. protocol :: any) - return false - end - - if port and port ~= "" and not tonumber(port) then - logger.error("Invalid Sentry Dsn: Invalid port " .. port) - return false - end - - return true -end - ---- Creates a valid Sentry Dsn object, identifying a Sentry instance and project. ---- @returns a valid DsnComponents object or `undefined` if @param from is an invalid DSN source -function DsnUtils.makeDsn(from: DsnLike): DsnComponents | nil - local components = if type(from) == "string" then dsnFromString(from) else DsnUtils.dsnFromComponents(from) - if not components or not validateDsn(components) then - return nil - end - return components -end - -return DsnUtils From 5e61edae30c2d15bb7ca7d41e65442cfec56a95f Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 01:12:52 +0100 Subject: [PATCH 03/11] chore: add test.project.json --- default.project.json | 18 ------------------ example.project.json | 36 ------------------------------------ test.project.json | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+), 54 deletions(-) delete mode 100644 default.project.json delete mode 100644 example.project.json create mode 100644 test.project.json diff --git a/default.project.json b/default.project.json deleted file mode 100644 index 5448448..0000000 --- a/default.project.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "sentry-lua", - "tree": { - "$className": "Folder", - "SentryCore": { - "$path": "packages/core/default.project.json" - }, - "SentryRoblox": { - "$path": "packages/roblox/default.project.json" - }, - "SentryTypes": { - "$path": "packages/types/default.project.json" - }, - "SentryUtils": { - "$path": "packages/utils/default.project.json" - } - } -} \ No newline at end of file diff --git a/example.project.json b/example.project.json deleted file mode 100644 index aa1fcd5..0000000 --- a/example.project.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "sentry-example", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "Packages": { - "$path": "deps", - "SentryCore": { - "$path": "packages/core/default.project.json" - }, - "Sentry": { - "$path": "packages/roblox/default.project.json" - }, - "SentryTypes": { - "$path": "packages/types/default.project.json" - }, - "SentryUtils": { - "$path": "packages/utils/default.project.json" - } - }, - "Sourcemap": { - "$path": "sourcemap.json" - } - }, - "ServerScriptService": { - "SentryExample": { - "$path": "example/src/" - } - }, - "HttpService": { - "$properties": { - "HttpEnabled": true - } - } - } -} \ No newline at end of file diff --git a/test.project.json b/test.project.json new file mode 100644 index 0000000..43cb92d --- /dev/null +++ b/test.project.json @@ -0,0 +1,18 @@ +{ + "name": "sentry-lua", + "tree": { + "$path": "Packages", + "SentryCore": { + "$path": "modules/core/default.project.json" + }, + "SentryRoblox": { + "$path": "modules/roblox/default.project.json" + }, + "SentryTypes": { + "$path": "modules/types/default.project.json" + }, + "SentryUtils": { + "$path": "modules/utils/default.project.json" + } + } +} From 9ab657a59a3f00b6f2736e4012bf870705ba85b5 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 01:27:39 +0100 Subject: [PATCH 04/11] feat: get test suite running --- .gitignore | 6 +++--- .lune/test/bin/run-tests.luau | 19 ++++++++++++----- .vscode/settings.json | 2 +- .zed/settings.json | 3 +++ bin/install-packages.sh | 4 ++++ modules/core/src/jest.config.luau | 3 +++ modules/roblox/src/jest.config.luau | 3 +++ modules/types/src/jest.config.luau | 3 +++ modules/utils/src/jest.config.luau | 3 +++ test.project.json | 32 ++++++++++++++++++----------- wally.toml | 7 +++++++ 11 files changed, 64 insertions(+), 21 deletions(-) create mode 100644 bin/install-packages.sh create mode 100644 modules/core/src/jest.config.luau create mode 100644 modules/roblox/src/jest.config.luau create mode 100644 modules/types/src/jest.config.luau create mode 100644 modules/utils/src/jest.config.luau diff --git a/.gitignore b/.gitignore index 553eb36..834d658 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ -deps/ -temp/ -build/ +Packages/ +DevPackages/ dsn.lua globalTypes.d.lua .env.luau +sourcemap.json *.rbxm *.rbxl diff --git a/.lune/test/bin/run-tests.luau b/.lune/test/bin/run-tests.luau index 87b083d..06db4b0 100644 --- a/.lune/test/bin/run-tests.luau +++ b/.lune/test/bin/run-tests.luau @@ -1,15 +1,24 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local Packages = ReplicatedStorage.Packages -local Jest = require(Packages._Workspace.TestPlace.Jest) +local DevPackages = ReplicatedStorage.DevPackages +local Jest = require(DevPackages.Jest) + +local PACKAGE_ROOTS = { + Packages.SentryCore, + Packages.SentryRoblox, + Packages.SentryTypes, + Packages.SentryUtils, +} local status, result = Jest.runCLI(ReplicatedStorage, { - verbose = _G.__VERBOSE__, - ci = _G.__CI__, -}, { ReplicatedStorage.TestRunner }):awaitStatus() + verbose = _G.__VERBOSE__, + ci = _G.__CI__, + passWithNoTests = true, +}, PACKAGE_ROOTS):awaitStatus() if status == "Rejected" then - error(result) + error(result) end return nil diff --git a/.vscode/settings.json b/.vscode/settings.json index 97f2bc5..f5897f5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "luau-lsp.sourcemap.rojoProjectFile": "default.project.json", + "luau-lsp.sourcemap.rojoProjectFile": "test.project.json", "luau-lsp.completion.imports.enabled": true, "luau-lsp.completion.imports.suggestServices": true, "luau-lsp.completion.imports.suggestRequires": false, diff --git a/.zed/settings.json b/.zed/settings.json index 4577bd9..e1f95ce 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -23,6 +23,9 @@ "luau-lsp": { "settings": { "luau-lsp": { + "sourcemap": { + "rojoProjectFile": "test.project.json" + }, "completion": { "imports": { "enabled": true, diff --git a/bin/install-packages.sh b/bin/install-packages.sh new file mode 100644 index 0000000..85352d0 --- /dev/null +++ b/bin/install-packages.sh @@ -0,0 +1,4 @@ +wally install +rojo sourcemap test.project.json > sourcemap.json +wally-package-types --sourcemap sourcemap.json Packages/ +wally-package-types --sourcemap sourcemap.json DevPackages/ diff --git a/modules/core/src/jest.config.luau b/modules/core/src/jest.config.luau new file mode 100644 index 0000000..4b28690 --- /dev/null +++ b/modules/core/src/jest.config.luau @@ -0,0 +1,3 @@ +return { + displayName = "Core", +} diff --git a/modules/roblox/src/jest.config.luau b/modules/roblox/src/jest.config.luau new file mode 100644 index 0000000..0130f46 --- /dev/null +++ b/modules/roblox/src/jest.config.luau @@ -0,0 +1,3 @@ +return { + displayName = "Roblox", +} diff --git a/modules/types/src/jest.config.luau b/modules/types/src/jest.config.luau new file mode 100644 index 0000000..7901a1b --- /dev/null +++ b/modules/types/src/jest.config.luau @@ -0,0 +1,3 @@ +return { + displayName = "Types", +} diff --git a/modules/utils/src/jest.config.luau b/modules/utils/src/jest.config.luau new file mode 100644 index 0000000..8f6a975 --- /dev/null +++ b/modules/utils/src/jest.config.luau @@ -0,0 +1,3 @@ +return { + displayName = "Utils", +} diff --git a/test.project.json b/test.project.json index 43cb92d..27afef7 100644 --- a/test.project.json +++ b/test.project.json @@ -1,18 +1,26 @@ { "name": "sentry-lua", "tree": { - "$path": "Packages", - "SentryCore": { - "$path": "modules/core/default.project.json" - }, - "SentryRoblox": { - "$path": "modules/roblox/default.project.json" - }, - "SentryTypes": { - "$path": "modules/types/default.project.json" - }, - "SentryUtils": { - "$path": "modules/utils/default.project.json" + "$className": "DataModel", + "ReplicatedStorage": { + "DevPackages": { + "$path": "DevPackages" + }, + "Packages": { + "$path": "Packages", + "SentryCore": { + "$path": "modules/core/default.project.json" + }, + "SentryRoblox": { + "$path": "modules/roblox/default.project.json" + }, + "SentryTypes": { + "$path": "modules/types/default.project.json" + }, + "SentryUtils": { + "$path": "modules/utils/default.project.json" + } + } } } } diff --git a/wally.toml b/wally.toml index e4a86d4..76c38da 100644 --- a/wally.toml +++ b/wally.toml @@ -7,7 +7,14 @@ version = "0.1.0" registry = "https://github.com/UpliftGames/wally-index" realm = "shared" +[place] +shared-packages = "game.ReplicatedStorage.Packages" + [dependencies] LuauPolyfill = "jsdotlua/luau-polyfill@1.2.3" RegExp = "jsdotlua/regex@1.0.2" Promise = "evaera/promise@4.0.0" + +[dev-dependencies] +Jest = "jsdotlua/jest@3.10.0" +JestGlobals = "jsdotlua/jest-globals@3.10.0" From aa37867457d4f356be11bd636e9a6d30f6f69673 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 01:30:38 +0100 Subject: [PATCH 05/11] feat: add sample test case --- modules/core/src/__tests__/math.test.luau | 14 ++++++++++++++ test.project.json | 5 +++++ 2 files changed, 19 insertions(+) create mode 100644 modules/core/src/__tests__/math.test.luau diff --git a/modules/core/src/__tests__/math.test.luau b/modules/core/src/__tests__/math.test.luau new file mode 100644 index 0000000..2ed1b36 --- /dev/null +++ b/modules/core/src/__tests__/math.test.luau @@ -0,0 +1,14 @@ +local ReplicatedStorage = game:GetService("ReplicatedStorage") + +local DevPackages = ReplicatedStorage.DevPackages +local JestGlobals = require(DevPackages.JestGlobals) + +local describe = JestGlobals.describe +local it = JestGlobals.it +local expect = JestGlobals.expect + +describe("math", function() + it("should add two numbers", function() + expect(1 + 2).toBe(3) + end) +end) diff --git a/test.project.json b/test.project.json index 27afef7..bce47da 100644 --- a/test.project.json +++ b/test.project.json @@ -21,6 +21,11 @@ "$path": "modules/utils/default.project.json" } } + }, + "ServerScriptService": { + "$properties": { + "LoadStringEnabled": true + } } } } From dd2f2b45c7777f3323f47fc2d756e0807f0c4f23 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 01:40:13 +0100 Subject: [PATCH 06/11] chore: rename .lua files to .luau --- example/src/dsn.example.lua | 2 - example/src/init.server.lua | 55 ------ modules/core/src/{api.lua => api.luau} | 0 .../src/{baseclient.lua => baseclient.luau} | 0 .../core/src/{checkin.lua => checkin.luau} | 0 .../src/{constants.lua => constants.luau} | 0 .../core/src/{envelope.lua => envelope.luau} | 0 .../core/src/{exports.lua => exports.luau} | 0 modules/core/src/{hub.lua => hub.luau} | 0 modules/core/src/{init.lua => init.luau} | 0 .../src/{integration.lua => integration.luau} | 0 .../{inboundfilter.lua => inboundfilter.luau} | 0 .../src/integrations/{init.lua => init.luau} | 0 modules/core/src/{scope.lua => scope.luau} | 0 modules/core/src/{sdk.lua => sdk.luau} | 0 .../core/src/{session.lua => session.luau} | 0 ...sessionflusher.lua => sessionflusher.luau} | 0 ...ontext.lua => dynamicSamplingContext.luau} | 0 .../src/transports/{base.lua => base.luau} | 0 ...cingEnabled.lua => hasTracingEnabled.luau} | 0 .../{prepareEvent.lua => prepareEvent.luau} | 0 .../core/src/{version.lua => version.luau} | 0 .../roblox/src/{client.lua => client.luau} | 0 .../{eventbuilder.lua => eventbuilder.luau} | 0 .../roblox/src/{helpers.lua => helpers.luau} | 0 modules/roblox/src/{init.lua => init.luau} | 0 .../integrations/{dedupe.lua => dedupe.luau} | 0 ...globalhandlers.lua => globalhandlers.luau} | 0 .../integrations/{inapp.lua => inapp.luau} | 0 .../src/integrations/{init.lua => init.luau} | 0 .../src/{stackparser.lua => stackparser.luau} | 0 .../{httpservice.lua => httpservice.luau} | 0 .../src/transports/{init.lua => init.luau} | 0 .../src/transports/{types.lua => types.luau} | 0 modules/roblox/src/{types.lua => types.luau} | 0 .../{userfeedback.lua => userfeedback.luau} | 0 ...siveModules.lua => _recursiveModules.luau} | 0 .../src/{attachment.lua => attachment.luau} | 0 .../src/{breadcrumb.lua => breadcrumb.luau} | 0 .../types/src/{checkin.lua => checkin.luau} | 0 .../{clientreport.lua => clientreport.luau} | 0 .../types/src/{context.lua => context.luau} | 0 .../{datacategory.lua => datacategory.luau} | 0 .../src/{debugMeta.lua => debugMeta.luau} | 0 modules/types/src/dsn.luau | 27 +++ modules/types/src/{error.lua => error.luau} | 0 .../src/{exception.lua => exception.luau} | 0 modules/types/src/{extra.lua => extra.luau} | 0 modules/types/src/{init.lua => init.luau} | 0 .../src/{instrument.lua => instrument.luau} | 0 .../{instrumenter.lua => instrumenter.luau} | 0 .../src/{measurement.lua => measurement.luau} | 0 .../src/{mechanism.lua => mechanism.luau} | 0 modules/types/src/{misc.lua => misc.luau} | 0 .../types/src/{package.lua => package.luau} | 0 .../types/src/{promise.lua => promise.luau} | 0 .../types/src/{sdkinfo.lua => sdkinfo.luau} | 0 .../src/{sdkmetadata.lua => sdkmetadata.luau} | 0 .../types/src/{session.lua => session.luau} | 0 .../types/src/{severity.lua => severity.luau} | 0 .../src/{stackframe.lua => stackframe.luau} | 0 .../src/{stacktrace.lua => stacktrace.luau} | 0 .../src/{textencoder.lua => textencoder.luau} | 0 modules/types/src/{thread.lua => thread.luau} | 0 modules/types/src/{user.lua => user.luau} | 0 .../{_syncpromise.lua => _syncpromise.luau} | 0 modules/utils/src/dsn.luau | 160 ++++++++++++++++++ .../utils/src/{envelope.lua => envelope.luau} | 0 modules/utils/src/{error.lua => error.luau} | 0 modules/utils/src/{global.lua => global.luau} | 0 modules/utils/src/{init.lua => init.luau} | 0 modules/utils/src/{is.lua => is.luau} | 0 modules/utils/src/{logger.lua => logger.luau} | 0 modules/utils/src/{memo.lua => memo.luau} | 0 modules/utils/src/{misc.lua => misc.luau} | 0 .../src/{normalize.lua => normalize.luau} | 0 modules/utils/src/{object.lua => object.luau} | 0 .../{promisebuffer.lua => promisebuffer.luau} | 0 .../src/{ratelimit.lua => ratelimit.luau} | 0 .../src/{stacktrace.lua => stacktrace.luau} | 0 modules/utils/src/{string.lua => string.luau} | 0 modules/utils/src/{time.lua => time.luau} | 0 .../{collections.lua => collections.luau} | 0 .../prettyformat/{init.lua => init.luau} | 0 .../prettyformat/{types.lua => types.luau} | 0 85 files changed, 187 insertions(+), 57 deletions(-) delete mode 100644 example/src/dsn.example.lua delete mode 100644 example/src/init.server.lua rename modules/core/src/{api.lua => api.luau} (100%) rename modules/core/src/{baseclient.lua => baseclient.luau} (100%) rename modules/core/src/{checkin.lua => checkin.luau} (100%) rename modules/core/src/{constants.lua => constants.luau} (100%) rename modules/core/src/{envelope.lua => envelope.luau} (100%) rename modules/core/src/{exports.lua => exports.luau} (100%) rename modules/core/src/{hub.lua => hub.luau} (100%) rename modules/core/src/{init.lua => init.luau} (100%) rename modules/core/src/{integration.lua => integration.luau} (100%) rename modules/core/src/integrations/{inboundfilter.lua => inboundfilter.luau} (100%) rename modules/core/src/integrations/{init.lua => init.luau} (100%) rename modules/core/src/{scope.lua => scope.luau} (100%) rename modules/core/src/{sdk.lua => sdk.luau} (100%) rename modules/core/src/{session.lua => session.luau} (100%) rename modules/core/src/{sessionflusher.lua => sessionflusher.luau} (100%) rename modules/core/src/tracing/{dynamicSamplingContext.lua => dynamicSamplingContext.luau} (100%) rename modules/core/src/transports/{base.lua => base.luau} (100%) rename modules/core/src/utils/{hasTracingEnabled.lua => hasTracingEnabled.luau} (100%) rename modules/core/src/utils/{prepareEvent.lua => prepareEvent.luau} (100%) rename modules/core/src/{version.lua => version.luau} (100%) rename modules/roblox/src/{client.lua => client.luau} (100%) rename modules/roblox/src/{eventbuilder.lua => eventbuilder.luau} (100%) rename modules/roblox/src/{helpers.lua => helpers.luau} (100%) rename modules/roblox/src/{init.lua => init.luau} (100%) rename modules/roblox/src/integrations/{dedupe.lua => dedupe.luau} (100%) rename modules/roblox/src/integrations/{globalhandlers.lua => globalhandlers.luau} (100%) rename modules/roblox/src/integrations/{inapp.lua => inapp.luau} (100%) rename modules/roblox/src/integrations/{init.lua => init.luau} (100%) rename modules/roblox/src/{stackparser.lua => stackparser.luau} (100%) rename modules/roblox/src/transports/{httpservice.lua => httpservice.luau} (100%) rename modules/roblox/src/transports/{init.lua => init.luau} (100%) rename modules/roblox/src/transports/{types.lua => types.luau} (100%) rename modules/roblox/src/{types.lua => types.luau} (100%) rename modules/roblox/src/{userfeedback.lua => userfeedback.luau} (100%) rename modules/types/src/{_recursiveModules.lua => _recursiveModules.luau} (100%) rename modules/types/src/{attachment.lua => attachment.luau} (100%) rename modules/types/src/{breadcrumb.lua => breadcrumb.luau} (100%) rename modules/types/src/{checkin.lua => checkin.luau} (100%) rename modules/types/src/{clientreport.lua => clientreport.luau} (100%) rename modules/types/src/{context.lua => context.luau} (100%) rename modules/types/src/{datacategory.lua => datacategory.luau} (100%) rename modules/types/src/{debugMeta.lua => debugMeta.luau} (100%) create mode 100644 modules/types/src/dsn.luau rename modules/types/src/{error.lua => error.luau} (100%) rename modules/types/src/{exception.lua => exception.luau} (100%) rename modules/types/src/{extra.lua => extra.luau} (100%) rename modules/types/src/{init.lua => init.luau} (100%) rename modules/types/src/{instrument.lua => instrument.luau} (100%) rename modules/types/src/{instrumenter.lua => instrumenter.luau} (100%) rename modules/types/src/{measurement.lua => measurement.luau} (100%) rename modules/types/src/{mechanism.lua => mechanism.luau} (100%) rename modules/types/src/{misc.lua => misc.luau} (100%) rename modules/types/src/{package.lua => package.luau} (100%) rename modules/types/src/{promise.lua => promise.luau} (100%) rename modules/types/src/{sdkinfo.lua => sdkinfo.luau} (100%) rename modules/types/src/{sdkmetadata.lua => sdkmetadata.luau} (100%) rename modules/types/src/{session.lua => session.luau} (100%) rename modules/types/src/{severity.lua => severity.luau} (100%) rename modules/types/src/{stackframe.lua => stackframe.luau} (100%) rename modules/types/src/{stacktrace.lua => stacktrace.luau} (100%) rename modules/types/src/{textencoder.lua => textencoder.luau} (100%) rename modules/types/src/{thread.lua => thread.luau} (100%) rename modules/types/src/{user.lua => user.luau} (100%) rename modules/utils/src/{_syncpromise.lua => _syncpromise.luau} (100%) create mode 100644 modules/utils/src/dsn.luau rename modules/utils/src/{envelope.lua => envelope.luau} (100%) rename modules/utils/src/{error.lua => error.luau} (100%) rename modules/utils/src/{global.lua => global.luau} (100%) rename modules/utils/src/{init.lua => init.luau} (100%) rename modules/utils/src/{is.lua => is.luau} (100%) rename modules/utils/src/{logger.lua => logger.luau} (100%) rename modules/utils/src/{memo.lua => memo.luau} (100%) rename modules/utils/src/{misc.lua => misc.luau} (100%) rename modules/utils/src/{normalize.lua => normalize.luau} (100%) rename modules/utils/src/{object.lua => object.luau} (100%) rename modules/utils/src/{promisebuffer.lua => promisebuffer.luau} (100%) rename modules/utils/src/{ratelimit.lua => ratelimit.luau} (100%) rename modules/utils/src/{stacktrace.lua => stacktrace.luau} (100%) rename modules/utils/src/{string.lua => string.luau} (100%) rename modules/utils/src/{time.lua => time.luau} (100%) rename modules/utils/src/vendor/prettyformat/{collections.lua => collections.luau} (100%) rename modules/utils/src/vendor/prettyformat/{init.lua => init.luau} (100%) rename modules/utils/src/vendor/prettyformat/{types.lua => types.luau} (100%) diff --git a/example/src/dsn.example.lua b/example/src/dsn.example.lua deleted file mode 100644 index fbe7981..0000000 --- a/example/src/dsn.example.lua +++ /dev/null @@ -1,2 +0,0 @@ --- Replace string below with your Sentry DSN -return "https://xxxxxxxxxx@xxxxxxxxxx.ingest.sentry.io/xxxxxxxxxx" diff --git a/example/src/init.server.lua b/example/src/init.server.lua deleted file mode 100644 index 43af926..0000000 --- a/example/src/init.server.lua +++ /dev/null @@ -1,55 +0,0 @@ --- Enables debug logic across all Sentry packages. Must be set before first requiring any Sentry package. -_G.__SENTRY_DEV__ = true - -local ReplicatedStorage = game:GetService("ReplicatedStorage") - -local Packages = ReplicatedStorage.Packages -local Error = require(Packages.LuauPolyfill).Error -local Promise = require(Packages.Promise) -local Sentry = require(Packages.Sentry) - -local Sourcemap = require(ReplicatedStorage.Sourcemap) - -Sentry.init({ - -- note: DSN exported to ignored module for security. See `dsn.example.lua`. - dsn = require(script.dsn) :: any, - tracesSampleRate = 1.0, - attachStacktrace = true, - projectSourcemap = Sourcemap :: any, -}) - -Sentry.configureScope(function(scope) - scope:setUser({ id = "75380482", username = "grilme99" }) -end) - -wait(2) - --- error("Some error that caused a crash!") --- Promise.new(function() --- error("Oops! This promise errored!!!") --- end) - -Sentry.addBreadcrumb({ - message = "My Breadcrumb", -}) - -pcall(function() - local function erroringFunction(_foo: string, _bar: string) - error("Attempt to index a nil value") -- Example error - end - - Sentry.wrap(erroringFunction, "a", "b") -end) - -task.wait(2) - -local lastEvent = Sentry.lastEventId() -print("last event:", lastEvent) -print("sending user feedback") - -local client = Sentry.getCurrentHub():getClient() -client:captureUserFeedback({ - event_id = lastEvent, - name = "grilme99", - comments = "All of my UI disappeared and I had to rejoin to fix the error", -}) diff --git a/modules/core/src/api.lua b/modules/core/src/api.luau similarity index 100% rename from modules/core/src/api.lua rename to modules/core/src/api.luau diff --git a/modules/core/src/baseclient.lua b/modules/core/src/baseclient.luau similarity index 100% rename from modules/core/src/baseclient.lua rename to modules/core/src/baseclient.luau diff --git a/modules/core/src/checkin.lua b/modules/core/src/checkin.luau similarity index 100% rename from modules/core/src/checkin.lua rename to modules/core/src/checkin.luau diff --git a/modules/core/src/constants.lua b/modules/core/src/constants.luau similarity index 100% rename from modules/core/src/constants.lua rename to modules/core/src/constants.luau diff --git a/modules/core/src/envelope.lua b/modules/core/src/envelope.luau similarity index 100% rename from modules/core/src/envelope.lua rename to modules/core/src/envelope.luau diff --git a/modules/core/src/exports.lua b/modules/core/src/exports.luau similarity index 100% rename from modules/core/src/exports.lua rename to modules/core/src/exports.luau diff --git a/modules/core/src/hub.lua b/modules/core/src/hub.luau similarity index 100% rename from modules/core/src/hub.lua rename to modules/core/src/hub.luau diff --git a/modules/core/src/init.lua b/modules/core/src/init.luau similarity index 100% rename from modules/core/src/init.lua rename to modules/core/src/init.luau diff --git a/modules/core/src/integration.lua b/modules/core/src/integration.luau similarity index 100% rename from modules/core/src/integration.lua rename to modules/core/src/integration.luau diff --git a/modules/core/src/integrations/inboundfilter.lua b/modules/core/src/integrations/inboundfilter.luau similarity index 100% rename from modules/core/src/integrations/inboundfilter.lua rename to modules/core/src/integrations/inboundfilter.luau diff --git a/modules/core/src/integrations/init.lua b/modules/core/src/integrations/init.luau similarity index 100% rename from modules/core/src/integrations/init.lua rename to modules/core/src/integrations/init.luau diff --git a/modules/core/src/scope.lua b/modules/core/src/scope.luau similarity index 100% rename from modules/core/src/scope.lua rename to modules/core/src/scope.luau diff --git a/modules/core/src/sdk.lua b/modules/core/src/sdk.luau similarity index 100% rename from modules/core/src/sdk.lua rename to modules/core/src/sdk.luau diff --git a/modules/core/src/session.lua b/modules/core/src/session.luau similarity index 100% rename from modules/core/src/session.lua rename to modules/core/src/session.luau diff --git a/modules/core/src/sessionflusher.lua b/modules/core/src/sessionflusher.luau similarity index 100% rename from modules/core/src/sessionflusher.lua rename to modules/core/src/sessionflusher.luau diff --git a/modules/core/src/tracing/dynamicSamplingContext.lua b/modules/core/src/tracing/dynamicSamplingContext.luau similarity index 100% rename from modules/core/src/tracing/dynamicSamplingContext.lua rename to modules/core/src/tracing/dynamicSamplingContext.luau diff --git a/modules/core/src/transports/base.lua b/modules/core/src/transports/base.luau similarity index 100% rename from modules/core/src/transports/base.lua rename to modules/core/src/transports/base.luau diff --git a/modules/core/src/utils/hasTracingEnabled.lua b/modules/core/src/utils/hasTracingEnabled.luau similarity index 100% rename from modules/core/src/utils/hasTracingEnabled.lua rename to modules/core/src/utils/hasTracingEnabled.luau diff --git a/modules/core/src/utils/prepareEvent.lua b/modules/core/src/utils/prepareEvent.luau similarity index 100% rename from modules/core/src/utils/prepareEvent.lua rename to modules/core/src/utils/prepareEvent.luau diff --git a/modules/core/src/version.lua b/modules/core/src/version.luau similarity index 100% rename from modules/core/src/version.lua rename to modules/core/src/version.luau diff --git a/modules/roblox/src/client.lua b/modules/roblox/src/client.luau similarity index 100% rename from modules/roblox/src/client.lua rename to modules/roblox/src/client.luau diff --git a/modules/roblox/src/eventbuilder.lua b/modules/roblox/src/eventbuilder.luau similarity index 100% rename from modules/roblox/src/eventbuilder.lua rename to modules/roblox/src/eventbuilder.luau diff --git a/modules/roblox/src/helpers.lua b/modules/roblox/src/helpers.luau similarity index 100% rename from modules/roblox/src/helpers.lua rename to modules/roblox/src/helpers.luau diff --git a/modules/roblox/src/init.lua b/modules/roblox/src/init.luau similarity index 100% rename from modules/roblox/src/init.lua rename to modules/roblox/src/init.luau diff --git a/modules/roblox/src/integrations/dedupe.lua b/modules/roblox/src/integrations/dedupe.luau similarity index 100% rename from modules/roblox/src/integrations/dedupe.lua rename to modules/roblox/src/integrations/dedupe.luau diff --git a/modules/roblox/src/integrations/globalhandlers.lua b/modules/roblox/src/integrations/globalhandlers.luau similarity index 100% rename from modules/roblox/src/integrations/globalhandlers.lua rename to modules/roblox/src/integrations/globalhandlers.luau diff --git a/modules/roblox/src/integrations/inapp.lua b/modules/roblox/src/integrations/inapp.luau similarity index 100% rename from modules/roblox/src/integrations/inapp.lua rename to modules/roblox/src/integrations/inapp.luau diff --git a/modules/roblox/src/integrations/init.lua b/modules/roblox/src/integrations/init.luau similarity index 100% rename from modules/roblox/src/integrations/init.lua rename to modules/roblox/src/integrations/init.luau diff --git a/modules/roblox/src/stackparser.lua b/modules/roblox/src/stackparser.luau similarity index 100% rename from modules/roblox/src/stackparser.lua rename to modules/roblox/src/stackparser.luau diff --git a/modules/roblox/src/transports/httpservice.lua b/modules/roblox/src/transports/httpservice.luau similarity index 100% rename from modules/roblox/src/transports/httpservice.lua rename to modules/roblox/src/transports/httpservice.luau diff --git a/modules/roblox/src/transports/init.lua b/modules/roblox/src/transports/init.luau similarity index 100% rename from modules/roblox/src/transports/init.lua rename to modules/roblox/src/transports/init.luau diff --git a/modules/roblox/src/transports/types.lua b/modules/roblox/src/transports/types.luau similarity index 100% rename from modules/roblox/src/transports/types.lua rename to modules/roblox/src/transports/types.luau diff --git a/modules/roblox/src/types.lua b/modules/roblox/src/types.luau similarity index 100% rename from modules/roblox/src/types.lua rename to modules/roblox/src/types.luau diff --git a/modules/roblox/src/userfeedback.lua b/modules/roblox/src/userfeedback.luau similarity index 100% rename from modules/roblox/src/userfeedback.lua rename to modules/roblox/src/userfeedback.luau diff --git a/modules/types/src/_recursiveModules.lua b/modules/types/src/_recursiveModules.luau similarity index 100% rename from modules/types/src/_recursiveModules.lua rename to modules/types/src/_recursiveModules.luau diff --git a/modules/types/src/attachment.lua b/modules/types/src/attachment.luau similarity index 100% rename from modules/types/src/attachment.lua rename to modules/types/src/attachment.luau diff --git a/modules/types/src/breadcrumb.lua b/modules/types/src/breadcrumb.luau similarity index 100% rename from modules/types/src/breadcrumb.lua rename to modules/types/src/breadcrumb.luau diff --git a/modules/types/src/checkin.lua b/modules/types/src/checkin.luau similarity index 100% rename from modules/types/src/checkin.lua rename to modules/types/src/checkin.luau diff --git a/modules/types/src/clientreport.lua b/modules/types/src/clientreport.luau similarity index 100% rename from modules/types/src/clientreport.lua rename to modules/types/src/clientreport.luau diff --git a/modules/types/src/context.lua b/modules/types/src/context.luau similarity index 100% rename from modules/types/src/context.lua rename to modules/types/src/context.luau diff --git a/modules/types/src/datacategory.lua b/modules/types/src/datacategory.luau similarity index 100% rename from modules/types/src/datacategory.lua rename to modules/types/src/datacategory.luau diff --git a/modules/types/src/debugMeta.lua b/modules/types/src/debugMeta.luau similarity index 100% rename from modules/types/src/debugMeta.lua rename to modules/types/src/debugMeta.luau diff --git a/modules/types/src/dsn.luau b/modules/types/src/dsn.luau new file mode 100644 index 0000000..50189e3 --- /dev/null +++ b/modules/types/src/dsn.luau @@ -0,0 +1,27 @@ +-- upstream: https://github.com/getsentry/sentry-javascript/blob/540adac9ec81803f86a3a7f5b34ebbc1ad2a8d23/packages/types/src/dsn.ts + +--- Supported Sentry transport protocols in a Dsn. +export type DsnProtocol = "http" | "https" + +--- Primitive components of a Dsn. +export type DsnComponents = { + --- Protocol used to connect to Sentry. + protocol: DsnProtocol, + --- Public authorization key. + publicKey: string?, + --- Private authorization key (deprecated, optional). + pass: string?, + --- Hostname of the Sentry instance. + host: string, + --- Port of the Sentry instance. + port: string?, + --- Sub path/ + path: string?, + --- Project ID + projectId: string, +} + +--- Anything that can be parsed into a Dsn. +export type DsnLike = string | DsnComponents + +return {} diff --git a/modules/types/src/error.lua b/modules/types/src/error.luau similarity index 100% rename from modules/types/src/error.lua rename to modules/types/src/error.luau diff --git a/modules/types/src/exception.lua b/modules/types/src/exception.luau similarity index 100% rename from modules/types/src/exception.lua rename to modules/types/src/exception.luau diff --git a/modules/types/src/extra.lua b/modules/types/src/extra.luau similarity index 100% rename from modules/types/src/extra.lua rename to modules/types/src/extra.luau diff --git a/modules/types/src/init.lua b/modules/types/src/init.luau similarity index 100% rename from modules/types/src/init.lua rename to modules/types/src/init.luau diff --git a/modules/types/src/instrument.lua b/modules/types/src/instrument.luau similarity index 100% rename from modules/types/src/instrument.lua rename to modules/types/src/instrument.luau diff --git a/modules/types/src/instrumenter.lua b/modules/types/src/instrumenter.luau similarity index 100% rename from modules/types/src/instrumenter.lua rename to modules/types/src/instrumenter.luau diff --git a/modules/types/src/measurement.lua b/modules/types/src/measurement.luau similarity index 100% rename from modules/types/src/measurement.lua rename to modules/types/src/measurement.luau diff --git a/modules/types/src/mechanism.lua b/modules/types/src/mechanism.luau similarity index 100% rename from modules/types/src/mechanism.lua rename to modules/types/src/mechanism.luau diff --git a/modules/types/src/misc.lua b/modules/types/src/misc.luau similarity index 100% rename from modules/types/src/misc.lua rename to modules/types/src/misc.luau diff --git a/modules/types/src/package.lua b/modules/types/src/package.luau similarity index 100% rename from modules/types/src/package.lua rename to modules/types/src/package.luau diff --git a/modules/types/src/promise.lua b/modules/types/src/promise.luau similarity index 100% rename from modules/types/src/promise.lua rename to modules/types/src/promise.luau diff --git a/modules/types/src/sdkinfo.lua b/modules/types/src/sdkinfo.luau similarity index 100% rename from modules/types/src/sdkinfo.lua rename to modules/types/src/sdkinfo.luau diff --git a/modules/types/src/sdkmetadata.lua b/modules/types/src/sdkmetadata.luau similarity index 100% rename from modules/types/src/sdkmetadata.lua rename to modules/types/src/sdkmetadata.luau diff --git a/modules/types/src/session.lua b/modules/types/src/session.luau similarity index 100% rename from modules/types/src/session.lua rename to modules/types/src/session.luau diff --git a/modules/types/src/severity.lua b/modules/types/src/severity.luau similarity index 100% rename from modules/types/src/severity.lua rename to modules/types/src/severity.luau diff --git a/modules/types/src/stackframe.lua b/modules/types/src/stackframe.luau similarity index 100% rename from modules/types/src/stackframe.lua rename to modules/types/src/stackframe.luau diff --git a/modules/types/src/stacktrace.lua b/modules/types/src/stacktrace.luau similarity index 100% rename from modules/types/src/stacktrace.lua rename to modules/types/src/stacktrace.luau diff --git a/modules/types/src/textencoder.lua b/modules/types/src/textencoder.luau similarity index 100% rename from modules/types/src/textencoder.lua rename to modules/types/src/textencoder.luau diff --git a/modules/types/src/thread.lua b/modules/types/src/thread.luau similarity index 100% rename from modules/types/src/thread.lua rename to modules/types/src/thread.luau diff --git a/modules/types/src/user.lua b/modules/types/src/user.luau similarity index 100% rename from modules/types/src/user.lua rename to modules/types/src/user.luau diff --git a/modules/utils/src/_syncpromise.lua b/modules/utils/src/_syncpromise.luau similarity index 100% rename from modules/utils/src/_syncpromise.lua rename to modules/utils/src/_syncpromise.luau diff --git a/modules/utils/src/dsn.luau b/modules/utils/src/dsn.luau new file mode 100644 index 0000000..ea69492 --- /dev/null +++ b/modules/utils/src/dsn.luau @@ -0,0 +1,160 @@ +-- upstream: https://github.com/getsentry/sentry-javascript/blob/540adac9ec81803f86a3a7f5b34ebbc1ad2a8d23/packages/utils/src/dsn.ts + +local PackageRoot = script.Parent +local Packages = PackageRoot.Parent + +local Types = require(Packages.SentryTypes) +type DsnComponents = Types.DsnComponents +type DsnLike = Types.DsnLike +type DsnProtocol = Types.DsnProtocol + +local RegExp = require(Packages.RegExp) +local logger = require(PackageRoot.logger).logger +local console = require(Packages.LuauPolyfill).console + +--- Regular expression used to parse a Dsn. +local DSN_REGEX = RegExp( + [[^(?:(?\w+):)\/\/(?:(?\w+)(?::(?\w+)?)?@)(?[\w.-]+)(?::(?\d+))?\/(?.+)]] +) + +local function isValidProtocol(protocol: string?): boolean + return protocol == "http" or protocol == "https" +end + +local DsnUtils = {} + +--- Renders the string representation of this Dsn. +--- +--- By default, this will render the public representation without the password +--- component. To get the deprecated private representation, set `withPassword` +--- to true. +--- +--- @param withPassword When set to true, the password will be included. +function DsnUtils.dsnToString(dsn: DsnComponents, withPassword_: boolean?): string + local withPassword = if withPassword_ == nil then false else withPassword_ + + return ( + `{dsn.protocol}://{dsn.publicKey}{if withPassword and dsn.pass ~= "" then `:{dsn.pass}` else ""}` + .. `@{dsn.host}{if dsn.port then `:{dsn.port}` else ""}/{if dsn.path then `{dsn.path}/` else dsn.path}{dsn.projectId}` + ) +end + +function DsnUtils.dsnFromComponents(components: DsnComponents): DsnComponents + return { + protocol = components.protocol, + publicKey = components.publicKey or "", + pass = components.pass or "", + host = components.host, + port = components.port or "", + path = components.path or "", + projectId = components.projectId, + } +end + +--- Parses a Dsn from a given string. +--- +--- @param str A Dsn as string +--- @returns Dsn as DsnComponents or undefined if @param str is not a valid DSN string +local function dsnFromString(str: string): DsnComponents | nil + local match = DSN_REGEX:exec(str) + + if not match then + -- This should be logged to the console + console.error(`Invalid Sentry Dsn: {str}`) + return nil + end + + local protocol, publicKey, pass, host, port, lastPath + + -- Determine if 'pass' and 'port' are present + if tonumber(match[4]) then + -- pass is missing but port is present + protocol, publicKey, host, port, lastPath = match[2], match[3], match[4], match[5], match[7] + pass = "" + elseif not tonumber(match[5]) then + -- both pass and port are missing + protocol, publicKey, host, lastPath = match[2], match[3], match[5], match[7] + pass, port = "", "" + else + -- both are present + protocol, publicKey, pass, host, port, lastPath = match[2], match[3], match[4], match[5], match[6], match[7] + end + + local path = "" + local projectId = lastPath + + local split = string.split(projectId, "/") + if #split > 1 then + path = table.concat(split, "/", 1, #split - 1) + projectId = split[#split] + end + + if projectId then + local projectMatch = string.match(projectId, "^%d+") + if projectMatch then + projectId = projectMatch + end + end + + return DsnUtils.dsnFromComponents({ + host = host, + pass = pass, + path = path, + projectId = projectId, + port = port, + protocol = protocol, + publicKey = publicKey, + }) +end + +local function validateDsn(dsn: DsnComponents): boolean + if not _G.__SENTRY_DEV__ then + return true + end + + local port, projectId, protocol = dsn.port, dsn.projectId, dsn.protocol + + local requiredComponents = { "protocol", "publicKey", "host", "projectId" } + local hasMissingRequiredComponent = false + + for _, component in ipairs(requiredComponents) do + if not dsn[component] then + logger.error("Invalid Sentry Dsn: " .. component .. " missing") + hasMissingRequiredComponent = true + break + end + end + + if hasMissingRequiredComponent then + return false + end + + if not string.match(projectId, "^%d+$") then + logger.error("Invalid Sentry Dsn: Invalid projectId " .. projectId) + return false + end + + if not isValidProtocol(protocol) then + logger.error("Invalid Sentry Dsn: Invalid protocol " .. protocol :: any) + return false + end + + if port and port ~= "" and not tonumber(port) then + logger.error("Invalid Sentry Dsn: Invalid port " .. port) + return false + end + + return true +end + +--- Creates a valid Sentry Dsn object, identifying a Sentry instance and project. +--- @returns a valid DsnComponents object or `undefined` if @param from is an invalid DSN source +function DsnUtils.makeDsn(from: DsnLike): DsnComponents | nil + local components = if type(from) == "string" then dsnFromString(from) else DsnUtils.dsnFromComponents(from) + if not components or not validateDsn(components) then + return nil + end + return components +end + +return DsnUtils diff --git a/modules/utils/src/envelope.lua b/modules/utils/src/envelope.luau similarity index 100% rename from modules/utils/src/envelope.lua rename to modules/utils/src/envelope.luau diff --git a/modules/utils/src/error.lua b/modules/utils/src/error.luau similarity index 100% rename from modules/utils/src/error.lua rename to modules/utils/src/error.luau diff --git a/modules/utils/src/global.lua b/modules/utils/src/global.luau similarity index 100% rename from modules/utils/src/global.lua rename to modules/utils/src/global.luau diff --git a/modules/utils/src/init.lua b/modules/utils/src/init.luau similarity index 100% rename from modules/utils/src/init.lua rename to modules/utils/src/init.luau diff --git a/modules/utils/src/is.lua b/modules/utils/src/is.luau similarity index 100% rename from modules/utils/src/is.lua rename to modules/utils/src/is.luau diff --git a/modules/utils/src/logger.lua b/modules/utils/src/logger.luau similarity index 100% rename from modules/utils/src/logger.lua rename to modules/utils/src/logger.luau diff --git a/modules/utils/src/memo.lua b/modules/utils/src/memo.luau similarity index 100% rename from modules/utils/src/memo.lua rename to modules/utils/src/memo.luau diff --git a/modules/utils/src/misc.lua b/modules/utils/src/misc.luau similarity index 100% rename from modules/utils/src/misc.lua rename to modules/utils/src/misc.luau diff --git a/modules/utils/src/normalize.lua b/modules/utils/src/normalize.luau similarity index 100% rename from modules/utils/src/normalize.lua rename to modules/utils/src/normalize.luau diff --git a/modules/utils/src/object.lua b/modules/utils/src/object.luau similarity index 100% rename from modules/utils/src/object.lua rename to modules/utils/src/object.luau diff --git a/modules/utils/src/promisebuffer.lua b/modules/utils/src/promisebuffer.luau similarity index 100% rename from modules/utils/src/promisebuffer.lua rename to modules/utils/src/promisebuffer.luau diff --git a/modules/utils/src/ratelimit.lua b/modules/utils/src/ratelimit.luau similarity index 100% rename from modules/utils/src/ratelimit.lua rename to modules/utils/src/ratelimit.luau diff --git a/modules/utils/src/stacktrace.lua b/modules/utils/src/stacktrace.luau similarity index 100% rename from modules/utils/src/stacktrace.lua rename to modules/utils/src/stacktrace.luau diff --git a/modules/utils/src/string.lua b/modules/utils/src/string.luau similarity index 100% rename from modules/utils/src/string.lua rename to modules/utils/src/string.luau diff --git a/modules/utils/src/time.lua b/modules/utils/src/time.luau similarity index 100% rename from modules/utils/src/time.lua rename to modules/utils/src/time.luau diff --git a/modules/utils/src/vendor/prettyformat/collections.lua b/modules/utils/src/vendor/prettyformat/collections.luau similarity index 100% rename from modules/utils/src/vendor/prettyformat/collections.lua rename to modules/utils/src/vendor/prettyformat/collections.luau diff --git a/modules/utils/src/vendor/prettyformat/init.lua b/modules/utils/src/vendor/prettyformat/init.luau similarity index 100% rename from modules/utils/src/vendor/prettyformat/init.lua rename to modules/utils/src/vendor/prettyformat/init.luau diff --git a/modules/utils/src/vendor/prettyformat/types.lua b/modules/utils/src/vendor/prettyformat/types.luau similarity index 100% rename from modules/utils/src/vendor/prettyformat/types.lua rename to modules/utils/src/vendor/prettyformat/types.luau From f5d8c3e1862a3c8d5848408e7a19d8bc37015f8d Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 02:20:11 +0100 Subject: [PATCH 07/11] ci: update to latest tools and add test runner --- .github/workflows/ci.yml | 51 +++++++++++++++++++++++++----------- .gitignore | 1 + bin/analyze.sh | 4 +++ modules/core/src/hub.luau | 4 +-- modules/roblox/src/init.luau | 2 -- selene.toml | 2 +- stylua.toml | 2 ++ 7 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 bin/analyze.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index de14b5e..a8350d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,19 +17,19 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Install Aftman - uses: ok-nick/setup-aftman@v0 - - - name: Install Just - uses: extractions/setup-just@v1 + - name: Setup Rokit + uses: CompeyDev/setup-rokit@v0.1.2 + with: + cache: true + token: ${{ secrets.GITHUB_TOKEN }} - name: Install dependencies shell: bash - run: just install-packages + run: sh bin/install-packages.sh - name: Analyze shell: bash - run: just analyze + run: sh bin/analyze.sh lint: name: Lint @@ -38,12 +38,14 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Install Aftman - uses: ok-nick/setup-aftman@v0 + - name: Setup Rokit + uses: CompeyDev/setup-rokit@v0.1.2 + with: + cache: true + token: ${{ secrets.GITHUB_TOKEN }} - name: Lint - run: | - selene ./packages + run: selene modules/ style: name: Styling @@ -52,9 +54,28 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Check code style - uses: JohnnyMorganz/stylua-action@v2 + - name: Setup Rokit + uses: CompeyDev/setup-rokit@v0.1.2 + with: + cache: true + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Check style + run: stylua --check modules/ + + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Rokit + uses: CompeyDev/setup-rokit@v0.1.2 with: + cache: true token: ${{ secrets.GITHUB_TOKEN }} - version: v0.17.1 - args: --check ./packages + + - name: Run tests + shell: bash + run: lune run test --ci diff --git a/.gitignore b/.gitignore index 834d658..341240e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ dsn.lua globalTypes.d.lua .env.luau sourcemap.json +.secrets *.rbxm *.rbxl diff --git a/bin/analyze.sh b/bin/analyze.sh new file mode 100644 index 0000000..7aac9ab --- /dev/null +++ b/bin/analyze.sh @@ -0,0 +1,4 @@ +curl -O https://raw.githubusercontent.com/JohnnyMorganz/luau-lsp/main/scripts/globalTypes.d.lua +rojo sourcemap test.project.json > sourcemap.json + +luau-lsp analyze --sourcemap sourcemap.json --platform roblox --settings .vscode/settings.json diff --git a/modules/core/src/hub.luau b/modules/core/src/hub.luau index 6f019ad..2576f71 100644 --- a/modules/core/src/hub.luau +++ b/modules/core/src/hub.luau @@ -147,7 +147,7 @@ local function setHubOnCarrier(carrier: Carrier, hub: Hub): boolean if not carrier then return false end - carrier.__SENTRY__ = carrier.__SENTRY__ or {}; + carrier.__SENTRY__ = carrier.__SENTRY__ or {} (carrier.__SENTRY__ :: any).hub = hub return true end @@ -235,7 +235,7 @@ HubExports.ensureHubOnCarrier = ensureHubOnCarrier local function setAsyncContextStrategy(strategy: AsyncContextStrategy | nil) -- Get main carrier (global for every environment) local registry = getMainCarrier() - registry.__SENTRY__ = registry.__SENTRY__ or {}; + registry.__SENTRY__ = registry.__SENTRY__ or {} (registry.__SENTRY__ :: any).acs = strategy end HubExports.setAsyncContextStrategy = setAsyncContextStrategy diff --git a/modules/roblox/src/init.luau b/modules/roblox/src/init.luau index c11e5ab..c2b0941 100644 --- a/modules/roblox/src/init.luau +++ b/modules/roblox/src/init.luau @@ -8,8 +8,6 @@ local Object = LuauPolyfill.Object local Promise = require(Packages.Promise) -local SentryCore = require(Packages.SentryCore) - local RobloxSdk = {} local Types = require(Packages.SentryTypes) diff --git a/selene.toml b/selene.toml index d07e2a6..35b4083 100644 --- a/selene.toml +++ b/selene.toml @@ -4,4 +4,4 @@ std = "luau" # This is covered by the LSP and gets in the way undefined_variable = "allow" # We use `_G.__SENTRY_DEV__` as a compile-time flag to remove debug code with Darklua. -global_usage = "allow" \ No newline at end of file +global_usage = "allow" diff --git a/stylua.toml b/stylua.toml index ca341eb..dcdf504 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,3 +1,5 @@ +syntax = "Luau" + column_width = 120 line_endings = "Unix" indent_type = "Spaces" From 50d356d386979b01b552e27dc4eac7174153f537 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 02:21:41 +0100 Subject: [PATCH 08/11] ci: fix --- bin/analyze.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/analyze.sh b/bin/analyze.sh index 7aac9ab..beaaeec 100644 --- a/bin/analyze.sh +++ b/bin/analyze.sh @@ -1,4 +1,4 @@ curl -O https://raw.githubusercontent.com/JohnnyMorganz/luau-lsp/main/scripts/globalTypes.d.lua rojo sourcemap test.project.json > sourcemap.json -luau-lsp analyze --sourcemap sourcemap.json --platform roblox --settings .vscode/settings.json +luau-lsp analyze --sourcemap sourcemap.json --platform roblox --settings .vscode/settings.json modules/ From 18515d3f30601334c979ca2e4b0f88941d3fffd6 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 02:42:46 +0100 Subject: [PATCH 09/11] ci: fix analysis --- bin/analyze.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/analyze.sh b/bin/analyze.sh index beaaeec..ac5aad4 100644 --- a/bin/analyze.sh +++ b/bin/analyze.sh @@ -1,4 +1,6 @@ curl -O https://raw.githubusercontent.com/JohnnyMorganz/luau-lsp/main/scripts/globalTypes.d.lua rojo sourcemap test.project.json > sourcemap.json -luau-lsp analyze --sourcemap sourcemap.json --platform roblox --settings .vscode/settings.json modules/ +luau-lsp analyze --sourcemap sourcemap.json --platform roblox \ + --definitions globalTypes.d.lua --settings .vscode/settings.json \ + --ignore=DevPackages/** --ignore=Packages/** modules/ From d71583bd3847d3a42870342c02882b3fc48f278c Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 02:47:19 +0100 Subject: [PATCH 10/11] ci: pass ROBLOX_OC_API_KEY to task --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8350d8..934c5d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -79,3 +79,5 @@ jobs: - name: Run tests shell: bash run: lune run test --ci + env: + ROBLOX_OC_API_KEY: ${{ secrets.ROBLOX_OC_API_KEY }} From 246ce58e0bd8cc0a6be611339a3b9d0da98ac074 Mon Sep 17 00:00:00 2001 From: Brooke Date: Sat, 5 Jul 2025 02:49:58 +0100 Subject: [PATCH 11/11] ci: install deps before running tests --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 934c5d7..a819949 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,10 @@ jobs: cache: true token: ${{ secrets.GITHUB_TOKEN }} + - name: Install dependencies + shell: bash + run: sh bin/install-packages.sh + - name: Run tests shell: bash run: lune run test --ci