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/.github/workflows/ci.yml b/.github/workflows/ci.yml index de14b5e..a819949 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,34 @@ 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 }} - version: v0.17.1 - args: --check ./packages + + - 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 }} + + - name: Install dependencies + shell: bash + run: sh bin/install-packages.sh + + - name: Run tests + shell: bash + run: lune run test --ci + env: + ROBLOX_OC_API_KEY: ${{ secrets.ROBLOX_OC_API_KEY }} diff --git a/.gitignore b/.gitignore index ef1a689..341240e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ -deps/ -temp/ -build/ +Packages/ +DevPackages/ dsn.lua globalTypes.d.lua +.env.luau +sourcemap.json +.secrets *.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 0000000..e710721 Binary files /dev/null and b/.lune/.DS_Store differ diff --git a/.lune/.luaurc b/.lune/.luaurc new file mode 100644 index 0000000..1aaca0e --- /dev/null +++ b/.lune/.luaurc @@ -0,0 +1,8 @@ +{ + "languageMode": "strict", + "aliases": { + "lune": "~/.lune/.typedefs/0.9.4/", + "root": "../", + "test": "./test" + } +} diff --git a/.lune/test/bin/run-tests.luau b/.lune/test/bin/run-tests.luau new file mode 100644 index 0000000..06db4b0 --- /dev/null +++ b/.lune/test/bin/run-tests.luau @@ -0,0 +1,24 @@ +local ReplicatedStorage = game:GetService("ReplicatedStorage") + +local Packages = ReplicatedStorage.Packages +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__, + passWithNoTests = true, +}, PACKAGE_ROOTS):awaitStatus() + +if status == "Rejected" then + error(result) +end + +return nil diff --git a/.lune/test/init.luau b/.lune/test/init.luau new file mode 100644 index 0000000..987623a --- /dev/null +++ b/.lune/test/init.luau @@ -0,0 +1,75 @@ +local fs = require("@lune/fs") +local process = require("@lune/process") + +local buildUploadPlaceAsync = require("@test/utility/buildUploadPlaceAsync") +local executeLuauTaskAsync = require("@test/utility/executeLuauTaskAsync") + +local function loadEnvFile() + local envFile = require("@root/.env") + return envFile +end + +local function getApiKey(): string + local keyInEnv = process.env.ROBLOX_OC_API_KEY + if keyInEnv then + return keyInEnv + end + + local success, envFile = pcall(loadEnvFile) + if not success then + error( + "No environment variable set for ROBLOX_OC_API_KEY. Please set it in the environment or in the .env.luau file." + ) + end + + return envFile.ROBLOX_OC_API_KEY +end + +local function loadTestConfig() + local testConfig = require("@root/test-config") + return testConfig +end + +local function hasArg(requiredArg: string) + for _, arg in process.args do + if arg == requiredArg then + return true + end + end + return false +end + +local function main() + local apiKey = getApiKey() + local testConfig = loadTestConfig() + + local verbose = hasArg("--verbose") + local ci = hasArg("--ci") + + local jestScript = fs.readFile(".lune/test/bin/run-tests.luau") + jestScript = jestScript:gsub("_G.__VERBOSE__", if verbose then "true" else "false") + jestScript = jestScript:gsub("_G.__CI__", if ci then "true" else "false") + + local uploadResult = buildUploadPlaceAsync({ + universeId = testConfig.universeId, + placeId = testConfig.placeId, + apiKey = apiKey, + filePath = testConfig.testPlaceFile, + rojoProjectFile = testConfig.rojoProjectFile, + }) + + if uploadResult then + executeLuauTaskAsync({ + universeId = testConfig.universeId, + placeId = testConfig.placeId, + placeVersion = uploadResult.versionNumber, + apiKey = apiKey, + script = jestScript, + }) + end + + -- Explicitly exit because Lune sucks at async tasks + process.exit(0) +end + +main() diff --git a/.lune/test/types.luau b/.lune/test/types.luau new file mode 100644 index 0000000..37729d0 --- /dev/null +++ b/.lune/test/types.luau @@ -0,0 +1,88 @@ +type Array = { 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..f5897f5 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": "test.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..e1f95ce --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,41 @@ +// 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": { + "sourcemap": { + "rojoProjectFile": "test.project.json" + }, + "completion": { + "imports": { + "enabled": true, + "separateGroupsWithLine": true, + "suggestRequires": false, + "suggestServices": true + } + } + } + } + } + } +} diff --git a/bin/analyze.sh b/bin/analyze.sh new file mode 100644 index 0000000..ac5aad4 --- /dev/null +++ b/bin/analyze.sh @@ -0,0 +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 \ + --definitions globalTypes.d.lua --settings .vscode/settings.json \ + --ignore=DevPackages/** --ignore=Packages/** modules/ 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/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/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/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/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/packages/core/src/api.lua b/modules/core/src/api.luau similarity index 100% rename from packages/core/src/api.lua rename to modules/core/src/api.luau diff --git a/packages/core/src/baseclient.lua b/modules/core/src/baseclient.luau similarity index 100% rename from packages/core/src/baseclient.lua rename to modules/core/src/baseclient.luau diff --git a/packages/core/src/checkin.lua b/modules/core/src/checkin.luau similarity index 100% rename from packages/core/src/checkin.lua rename to modules/core/src/checkin.luau diff --git a/packages/core/src/constants.lua b/modules/core/src/constants.luau similarity index 100% rename from packages/core/src/constants.lua rename to modules/core/src/constants.luau diff --git a/packages/core/src/envelope.lua b/modules/core/src/envelope.luau similarity index 100% rename from packages/core/src/envelope.lua rename to modules/core/src/envelope.luau diff --git a/packages/core/src/exports.lua b/modules/core/src/exports.luau similarity index 100% rename from packages/core/src/exports.lua rename to modules/core/src/exports.luau diff --git a/packages/core/src/hub.lua b/modules/core/src/hub.luau similarity index 99% rename from packages/core/src/hub.lua rename to modules/core/src/hub.luau index 6f019ad..2576f71 100644 --- a/packages/core/src/hub.lua +++ 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/packages/core/src/init.lua b/modules/core/src/init.luau similarity index 100% rename from packages/core/src/init.lua rename to modules/core/src/init.luau diff --git a/packages/core/src/integration.lua b/modules/core/src/integration.luau similarity index 100% rename from packages/core/src/integration.lua rename to modules/core/src/integration.luau diff --git a/packages/core/src/integrations/inboundfilter.lua b/modules/core/src/integrations/inboundfilter.luau similarity index 100% rename from packages/core/src/integrations/inboundfilter.lua rename to modules/core/src/integrations/inboundfilter.luau diff --git a/packages/core/src/integrations/init.lua b/modules/core/src/integrations/init.luau similarity index 100% rename from packages/core/src/integrations/init.lua rename to modules/core/src/integrations/init.luau 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/packages/core/src/scope.lua b/modules/core/src/scope.luau similarity index 100% rename from packages/core/src/scope.lua rename to modules/core/src/scope.luau diff --git a/packages/core/src/sdk.lua b/modules/core/src/sdk.luau similarity index 100% rename from packages/core/src/sdk.lua rename to modules/core/src/sdk.luau diff --git a/packages/core/src/session.lua b/modules/core/src/session.luau similarity index 100% rename from packages/core/src/session.lua rename to modules/core/src/session.luau diff --git a/packages/core/src/sessionflusher.lua b/modules/core/src/sessionflusher.luau similarity index 100% rename from packages/core/src/sessionflusher.lua rename to modules/core/src/sessionflusher.luau diff --git a/packages/core/src/tracing/dynamicSamplingContext.lua b/modules/core/src/tracing/dynamicSamplingContext.luau similarity index 100% rename from packages/core/src/tracing/dynamicSamplingContext.lua rename to modules/core/src/tracing/dynamicSamplingContext.luau diff --git a/packages/core/src/transports/base.lua b/modules/core/src/transports/base.luau similarity index 100% rename from packages/core/src/transports/base.lua rename to modules/core/src/transports/base.luau diff --git a/packages/core/src/utils/hasTracingEnabled.lua b/modules/core/src/utils/hasTracingEnabled.luau similarity index 100% rename from packages/core/src/utils/hasTracingEnabled.lua rename to modules/core/src/utils/hasTracingEnabled.luau diff --git a/packages/core/src/utils/prepareEvent.lua b/modules/core/src/utils/prepareEvent.luau similarity index 100% rename from packages/core/src/utils/prepareEvent.lua rename to modules/core/src/utils/prepareEvent.luau diff --git a/packages/core/src/version.lua b/modules/core/src/version.luau similarity index 100% rename from packages/core/src/version.lua rename to modules/core/src/version.luau 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.luau similarity index 100% rename from packages/roblox/src/client.lua rename to modules/roblox/src/client.luau diff --git a/packages/roblox/src/eventbuilder.lua b/modules/roblox/src/eventbuilder.luau similarity index 100% rename from packages/roblox/src/eventbuilder.lua rename to modules/roblox/src/eventbuilder.luau diff --git a/packages/roblox/src/helpers.lua b/modules/roblox/src/helpers.luau similarity index 100% rename from packages/roblox/src/helpers.lua rename to modules/roblox/src/helpers.luau diff --git a/packages/roblox/src/init.lua b/modules/roblox/src/init.luau similarity index 99% rename from packages/roblox/src/init.lua rename to modules/roblox/src/init.luau index c11e5ab..c2b0941 100644 --- a/packages/roblox/src/init.lua +++ 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/packages/roblox/src/integrations/dedupe.lua b/modules/roblox/src/integrations/dedupe.luau similarity index 100% rename from packages/roblox/src/integrations/dedupe.lua rename to modules/roblox/src/integrations/dedupe.luau diff --git a/packages/roblox/src/integrations/globalhandlers.lua b/modules/roblox/src/integrations/globalhandlers.luau similarity index 100% rename from packages/roblox/src/integrations/globalhandlers.lua rename to modules/roblox/src/integrations/globalhandlers.luau diff --git a/packages/roblox/src/integrations/inapp.lua b/modules/roblox/src/integrations/inapp.luau similarity index 100% rename from packages/roblox/src/integrations/inapp.lua rename to modules/roblox/src/integrations/inapp.luau diff --git a/packages/roblox/src/integrations/init.lua b/modules/roblox/src/integrations/init.luau similarity index 100% rename from packages/roblox/src/integrations/init.lua rename to modules/roblox/src/integrations/init.luau 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/packages/roblox/src/stackparser.lua b/modules/roblox/src/stackparser.luau similarity index 100% rename from packages/roblox/src/stackparser.lua rename to modules/roblox/src/stackparser.luau diff --git a/packages/roblox/src/transports/httpservice.lua b/modules/roblox/src/transports/httpservice.luau similarity index 100% rename from packages/roblox/src/transports/httpservice.lua rename to modules/roblox/src/transports/httpservice.luau diff --git a/packages/roblox/src/transports/init.lua b/modules/roblox/src/transports/init.luau similarity index 100% rename from packages/roblox/src/transports/init.lua rename to modules/roblox/src/transports/init.luau diff --git a/packages/roblox/src/transports/types.lua b/modules/roblox/src/transports/types.luau similarity index 100% rename from packages/roblox/src/transports/types.lua rename to modules/roblox/src/transports/types.luau diff --git a/packages/roblox/src/types.lua b/modules/roblox/src/types.luau similarity index 100% rename from packages/roblox/src/types.lua rename to modules/roblox/src/types.luau diff --git a/packages/roblox/src/userfeedback.lua b/modules/roblox/src/userfeedback.luau similarity index 100% rename from packages/roblox/src/userfeedback.lua rename to modules/roblox/src/userfeedback.luau 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.luau similarity index 100% rename from packages/types/src/_recursiveModules.lua rename to modules/types/src/_recursiveModules.luau diff --git a/packages/types/src/attachment.lua b/modules/types/src/attachment.luau similarity index 100% rename from packages/types/src/attachment.lua rename to modules/types/src/attachment.luau diff --git a/packages/types/src/breadcrumb.lua b/modules/types/src/breadcrumb.luau similarity index 100% rename from packages/types/src/breadcrumb.lua rename to modules/types/src/breadcrumb.luau diff --git a/packages/types/src/checkin.lua b/modules/types/src/checkin.luau similarity index 100% rename from packages/types/src/checkin.lua rename to modules/types/src/checkin.luau diff --git a/packages/types/src/clientreport.lua b/modules/types/src/clientreport.luau similarity index 100% rename from packages/types/src/clientreport.lua rename to modules/types/src/clientreport.luau diff --git a/packages/types/src/context.lua b/modules/types/src/context.luau similarity index 100% rename from packages/types/src/context.lua rename to modules/types/src/context.luau diff --git a/packages/types/src/datacategory.lua b/modules/types/src/datacategory.luau similarity index 100% rename from packages/types/src/datacategory.lua rename to modules/types/src/datacategory.luau diff --git a/packages/types/src/debugMeta.lua b/modules/types/src/debugMeta.luau similarity index 100% rename from packages/types/src/debugMeta.lua rename to modules/types/src/debugMeta.luau diff --git a/packages/types/src/dsn.lua b/modules/types/src/dsn.luau similarity index 100% rename from packages/types/src/dsn.lua rename to modules/types/src/dsn.luau diff --git a/packages/types/src/error.lua b/modules/types/src/error.luau similarity index 100% rename from packages/types/src/error.lua rename to modules/types/src/error.luau diff --git a/packages/types/src/exception.lua b/modules/types/src/exception.luau similarity index 100% rename from packages/types/src/exception.lua rename to modules/types/src/exception.luau diff --git a/packages/types/src/extra.lua b/modules/types/src/extra.luau similarity index 100% rename from packages/types/src/extra.lua rename to modules/types/src/extra.luau diff --git a/packages/types/src/init.lua b/modules/types/src/init.luau similarity index 100% rename from packages/types/src/init.lua rename to modules/types/src/init.luau diff --git a/packages/types/src/instrument.lua b/modules/types/src/instrument.luau similarity index 100% rename from packages/types/src/instrument.lua rename to modules/types/src/instrument.luau diff --git a/packages/types/src/instrumenter.lua b/modules/types/src/instrumenter.luau similarity index 100% rename from packages/types/src/instrumenter.lua rename to modules/types/src/instrumenter.luau 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/packages/types/src/measurement.lua b/modules/types/src/measurement.luau similarity index 100% rename from packages/types/src/measurement.lua rename to modules/types/src/measurement.luau diff --git a/packages/types/src/mechanism.lua b/modules/types/src/mechanism.luau similarity index 100% rename from packages/types/src/mechanism.lua rename to modules/types/src/mechanism.luau diff --git a/packages/types/src/misc.lua b/modules/types/src/misc.luau similarity index 100% rename from packages/types/src/misc.lua rename to modules/types/src/misc.luau diff --git a/packages/types/src/package.lua b/modules/types/src/package.luau similarity index 100% rename from packages/types/src/package.lua rename to modules/types/src/package.luau diff --git a/packages/types/src/promise.lua b/modules/types/src/promise.luau similarity index 100% rename from packages/types/src/promise.lua rename to modules/types/src/promise.luau diff --git a/packages/types/src/sdkinfo.lua b/modules/types/src/sdkinfo.luau similarity index 100% rename from packages/types/src/sdkinfo.lua rename to modules/types/src/sdkinfo.luau diff --git a/packages/types/src/sdkmetadata.lua b/modules/types/src/sdkmetadata.luau similarity index 100% rename from packages/types/src/sdkmetadata.lua rename to modules/types/src/sdkmetadata.luau diff --git a/packages/types/src/session.lua b/modules/types/src/session.luau similarity index 100% rename from packages/types/src/session.lua rename to modules/types/src/session.luau diff --git a/packages/types/src/severity.lua b/modules/types/src/severity.luau similarity index 100% rename from packages/types/src/severity.lua rename to modules/types/src/severity.luau diff --git a/packages/types/src/stackframe.lua b/modules/types/src/stackframe.luau similarity index 100% rename from packages/types/src/stackframe.lua rename to modules/types/src/stackframe.luau diff --git a/packages/types/src/stacktrace.lua b/modules/types/src/stacktrace.luau similarity index 100% rename from packages/types/src/stacktrace.lua rename to modules/types/src/stacktrace.luau diff --git a/packages/types/src/textencoder.lua b/modules/types/src/textencoder.luau similarity index 100% rename from packages/types/src/textencoder.lua rename to modules/types/src/textencoder.luau diff --git a/packages/types/src/thread.lua b/modules/types/src/thread.luau similarity index 100% rename from packages/types/src/thread.lua rename to modules/types/src/thread.luau diff --git a/packages/types/src/user.lua b/modules/types/src/user.luau similarity index 100% rename from packages/types/src/user.lua rename to modules/types/src/user.luau 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.luau similarity index 100% rename from packages/utils/src/_syncpromise.lua rename to modules/utils/src/_syncpromise.luau diff --git a/packages/utils/src/dsn.lua b/modules/utils/src/dsn.luau similarity index 100% rename from packages/utils/src/dsn.lua rename to modules/utils/src/dsn.luau diff --git a/packages/utils/src/envelope.lua b/modules/utils/src/envelope.luau similarity index 100% rename from packages/utils/src/envelope.lua rename to modules/utils/src/envelope.luau diff --git a/packages/utils/src/error.lua b/modules/utils/src/error.luau similarity index 100% rename from packages/utils/src/error.lua rename to modules/utils/src/error.luau diff --git a/packages/utils/src/global.lua b/modules/utils/src/global.luau similarity index 100% rename from packages/utils/src/global.lua rename to modules/utils/src/global.luau diff --git a/packages/utils/src/init.lua b/modules/utils/src/init.luau similarity index 100% rename from packages/utils/src/init.lua rename to modules/utils/src/init.luau diff --git a/packages/utils/src/is.lua b/modules/utils/src/is.luau similarity index 100% rename from packages/utils/src/is.lua rename to modules/utils/src/is.luau 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/packages/utils/src/logger.lua b/modules/utils/src/logger.luau similarity index 100% rename from packages/utils/src/logger.lua rename to modules/utils/src/logger.luau diff --git a/packages/utils/src/memo.lua b/modules/utils/src/memo.luau similarity index 100% rename from packages/utils/src/memo.lua rename to modules/utils/src/memo.luau diff --git a/packages/utils/src/misc.lua b/modules/utils/src/misc.luau similarity index 100% rename from packages/utils/src/misc.lua rename to modules/utils/src/misc.luau diff --git a/packages/utils/src/normalize.lua b/modules/utils/src/normalize.luau similarity index 100% rename from packages/utils/src/normalize.lua rename to modules/utils/src/normalize.luau diff --git a/packages/utils/src/object.lua b/modules/utils/src/object.luau similarity index 100% rename from packages/utils/src/object.lua rename to modules/utils/src/object.luau diff --git a/packages/utils/src/promisebuffer.lua b/modules/utils/src/promisebuffer.luau similarity index 100% rename from packages/utils/src/promisebuffer.lua rename to modules/utils/src/promisebuffer.luau diff --git a/packages/utils/src/ratelimit.lua b/modules/utils/src/ratelimit.luau similarity index 100% rename from packages/utils/src/ratelimit.lua rename to modules/utils/src/ratelimit.luau diff --git a/packages/utils/src/stacktrace.lua b/modules/utils/src/stacktrace.luau similarity index 100% rename from packages/utils/src/stacktrace.lua rename to modules/utils/src/stacktrace.luau diff --git a/packages/utils/src/string.lua b/modules/utils/src/string.luau similarity index 100% rename from packages/utils/src/string.lua rename to modules/utils/src/string.luau diff --git a/packages/utils/src/time.lua b/modules/utils/src/time.luau similarity index 100% rename from packages/utils/src/time.lua rename to modules/utils/src/time.luau diff --git a/packages/utils/src/vendor/prettyformat/collections.lua b/modules/utils/src/vendor/prettyformat/collections.luau similarity index 100% rename from packages/utils/src/vendor/prettyformat/collections.lua rename to modules/utils/src/vendor/prettyformat/collections.luau diff --git a/packages/utils/src/vendor/prettyformat/init.lua b/modules/utils/src/vendor/prettyformat/init.luau similarity index 100% rename from packages/utils/src/vendor/prettyformat/init.lua rename to modules/utils/src/vendor/prettyformat/init.luau diff --git a/packages/utils/src/vendor/prettyformat/types.lua b/modules/utils/src/vendor/prettyformat/types.luau similarity index 100% rename from packages/utils/src/vendor/prettyformat/types.lua rename to modules/utils/src/vendor/prettyformat/types.luau 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" 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", +} diff --git a/test.project.json b/test.project.json new file mode 100644 index 0000000..bce47da --- /dev/null +++ b/test.project.json @@ -0,0 +1,31 @@ +{ + "name": "sentry-lua", + "tree": { + "$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" + } + } + }, + "ServerScriptService": { + "$properties": { + "LoadStringEnabled": true + } + } + } +} 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"