From 7a18a5dfdc58dbe275451179a13b843ba8ffeb99 Mon Sep 17 00:00:00 2001 From: Daymon <17409137+daymxn@users.noreply.github.com> Date: Sat, 31 Aug 2024 19:31:55 -0500 Subject: [PATCH] Prepare for release (#3) Final changes for the initial release --------- Co-authored-by: Daymon --- .changeset/README.md | 8 + .changeset/config.json | 11 + .eslintrc | 1 - .github/workflows/deploy.yaml | 3 + .github/workflows/test-deploy.yaml | 28 - CONTRIBUTING.md | 55 +- README.md | 68 +- api-extractor.json | 3 +- api/rlog.api.md | 175 ++ example/README.md | 3 + include/RuntimeLib.lua | 49 +- package-lock.json | 1574 ++++++++++++++++- package.json | 27 +- src/configuration/index.ts | 2 +- src/context/log-context.ts | 4 +- src/index.ts | 2 +- src/rlog.ts | 2 +- src/sinks/roblox-console-sink.ts | 3 +- src/tests/rlog.spec.ts | 17 +- wiki/docs/api/index.md | 2 +- wiki/docs/api/rlog.logcontext.use.md | 2 +- wiki/docs/api/rlog.logcontext.withconfig.md | 2 +- wiki/docs/api/rlog.md | 4 +- wiki/docs/api/rlog.rlog.md | 2 +- ...og.serializationconfig.deepencodetables.md | 2 +- wiki/docs/basics/enrichers.mdx | 103 +- wiki/docs/basics/log-entries.mdx | 38 +- wiki/docs/basics/log-levels.mdx | 130 +- wiki/docs/basics/serialization.mdx | 110 +- wiki/docs/fast-breakdown.mdx | 145 +- wiki/docs/quick-start.mdx | 52 +- wiki/docusaurus.config.ts | 2 +- 32 files changed, 2196 insertions(+), 433 deletions(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json delete mode 100644 .github/workflows/test-deploy.yaml create mode 100644 api/rlog.api.md create mode 100644 example/README.md diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..af58b66 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.2/schema.json", + "changelog": "@changesets/changelog-git", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.eslintrc b/.eslintrc index 6cf67b6..4a83166 100644 --- a/.eslintrc +++ b/.eslintrc @@ -14,7 +14,6 @@ "plugin:@typescript-eslint/recommended", "plugin:roblox-ts/recommended", "plugin:prettier/recommended", - "plugin:react-hooks/recommended" ], "overrides": [{ "files": [ "scripts/**/*" ], diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 5d70ff3..ece76da 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -4,6 +4,9 @@ on: push: branches: - main + paths: + - "wiki/**" + - "api/**" defaults: run: diff --git a/.github/workflows/test-deploy.yaml b/.github/workflows/test-deploy.yaml deleted file mode 100644 index b6f341e..0000000 --- a/.github/workflows/test-deploy.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# name: Test deployment - -# on: -# pull_request: -# branches: -# - main - -# defaults: -# run: -# working-directory: ./wiki - -# jobs: -# test-deploy: -# name: Test deployment -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v4 -# with: -# fetch-depth: 0 -# - uses: actions/setup-node@v4 -# with: -# node-version: 18 -# cache: npm - -# - name: Install dependencies -# run: npm ci -# - name: Test build website -# run: npm run build \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f0aad00..df95e37 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ some things you should know. ## Getting started -Make sure you've given both the [Wiki](https://rlog.daymxn.com/rlog/docs/category/guides) and the [API Reference](https://rlog.daymxn.com/rlog/docs/api) a read before moving forward, such that you understand the design behind **rLog**. +Make sure you've given both the [Wiki](https://rlog.daymxn.com/docs/category/guides) and the [API Reference](https://rlog.daymxn.com/docs/api) a read before moving forward, such that you understand the design behind **rLog**. ### Building @@ -77,3 +77,56 @@ Code in this repo is formatted according to eslint and prettier. You can use the ```sh npm run format ``` + +### Changesets + +We use [changesets](https://github.com/changesets/changesets) for our release notes and version bumping. + +When submitting a change that should be apart of a release, you +can run the `change` script. + +```sh +npm run change +``` + +It will prompt you with options for setting the message and version type. + +#### Additional Commands + +Output [to stdout] a summary of the pending changes for a release. + +```sh +npm run change:status +``` + +Export the pending changes to a `changes.json` file at the root directory. + +```sh +npm run change:export +``` + +### Releasing + +To invoke a release, you'll need to pull the `main` branch +and run the `release:version` command. + +```sh +npm run release:version +``` + +This will automatically bump the releasing projects. + +After merging these changes back into `main`, you can move forward +with the actual publishing. + +```sh +npm run release +``` + +This will publish the releasing projects to npm, with the generated changelogs. + +The last step will be pushing the release tags back to the repo. + +```sh +npm run release:tags +``` diff --git a/README.md b/README.md index f54fd81..bcbfcb0 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@
-> Context based Server-Side logging solution for ROBLOX projects. +> Context-based server-side logging solution for ROBLOX projects. -![GitHub release (latest by date)](https://img.shields.io/github/v/release/daymxn/vidos?style=flat-square) -![GitHub last commit (branch)](https://img.shields.io/github/last-commit/daymxn/vidos/main?style=flat-square) -![GitHub issues](https://img.shields.io/github/issues/daymxn/vidos?style=flat-square) -![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/daymxn/vidos?style=flat-square) -![GitHub](https://img.shields.io/github/license/daymxn/vidos?style=flat-square) +![GitHub release (latest by date)](https://img.shields.io/github/v/release/daymxn/rlog?style=flat-square) +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/daymxn/rlog/main?style=flat-square) +![GitHub issues](https://img.shields.io/github/issues/daymxn/rlog?style=flat-square) +![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/daymxn/rlog?style=flat-square) +![GitHub](https://img.shields.io/github/license/daymxn/rlog?style=flat-square) --- @@ -66,42 +66,35 @@ pnpm add @rbxts/rlog yarn add @rbxts/rlog ``` -### Wally - -```toml -[dependencies] -Reflex = "daymxn/rlog@1.0.0" -``` - ## Overview -rLog is a context based server-side logging framework for ROBLOX, designed to help organize and structure your logging process. +rLog is a Context-based server-side logging framework for ROBLOX, designed to help organize and structure your logging process. -Utilizing [Correlation IDs](https://microsoft.github.io/code-with-engineering-playbook/observability/correlation-id/) via rLog's `LogContext`, you can create logging infrastructure that mirrors more entrprise-like systems; faciliating easier debugging and external auditing. +Utilizing [Correlation IDs](https://microsoft.github.io/code-with-engineering-playbook/observability/correlation-id/) via rLog's `LogContext`, you can create logging infrastructure that mirrors more enterprise-like systems; facilitating easier debugging and external auditing. ## Documentation -[Quick Start](https://rlog.daymxn.com/rlog/docs/quick-start) +[Quick Start](https://rlog.daymxn.com/docs/quick-start) -[API Reference](https://rlog.daymxn.com/rlog/docs/api) +[API Reference](https://rlog.daymxn.com/docs/api) -[Fast Breakdown](https://rlog.daymxn.com/rlog/docs/fast-breakdown) +[Fast Breakdown](https://rlog.daymxn.com/docs/fast-breakdown) -[Basic Guides](https://rlog.daymxn.com/rlog/docs/category/guides) +[Basic Guides](https://rlog.daymxn.com/docs/category/guides) -[Advanced Guides](https://rlog.daymxn.com/rlog/docs/category/advanced-guides) +[Advanced Guides](https://rlog.daymxn.com/docs/category/advanced-guides) ## Features ### Basic Logging -- Log data to the console according under different severity levels. +- Log data to the console according to different severity levels. - Utilize tags (or prefixes) for individual logging instances. ### Serialization -- Attach data to your log entries that gets serialized before being sent; ensuring the data is properly visable. -- Support for deeply nested roblox data-types that don't typically translate well (eg; CFrames). +- Attach data to your log entries that gets serialized before being sent; ensuring the data is properly visible. +- Support for deeply nested roblox data types that don't typically translate well (e.g., CFrames). - Support for encoding custom classes and functions. - Customizable class serialization. @@ -112,13 +105,13 @@ Utilizing [Correlation IDs](https://microsoft.github.io/code-with-engineering-pl - Automatically generate unique IDs when needed. - Optionally configure a custom method for providing your own ID generation. - Share configuration settings between context consumers, optionally unique to each invocation. -- Optionally "suspend" logs until they're needed (ie; a `WARNING` or `ERROR` occurs.); facilitating verbose logs for easier debugging without taking up resources until they're needed. +- Optionally "suspend" logs until they're needed (i.e., a `WARNING` or `ERROR` occurs.); facilitating verbose logs for easier debugging without taking up resources until they're needed. ### Source Context - Attach data to your logs to identify which *file* the log was sent from. - Attach data to your logs to identify what *line number* in the file the log was sent from. -- Attach data to your logs to identify which *function* the log was sent from, or optionally the *nearest* named function on the stack (in the case of anonymous functions) +- Attach data to your logs to identify which *function* the log was sent from, or optionally the *nearest* named function on the stack (in the case of anonymous functions). - In the case of anonymous functions, identify the nearest *named* function from where the log was sent. ### Sinks @@ -130,14 +123,14 @@ Utilizing [Correlation IDs](https://microsoft.github.io/code-with-engineering-pl - Define callbacks that can conditionally decide to filter logs from reaching any output. - Define callbacks that can send logs to external services for storage and auditing. -- Recursively define callbacks through a heirachy of logger instances and configurations; allowing you to provide callbacks for individual flows. -- Define dynamic callbacks that change according to arguments (eg; the player). +- Recursively define callbacks through a hierarchy of logger instances and configurations; allowing you to provide callbacks for individual flows. +- Define dynamic callbacks that change according to arguments (e.g., the player). ### Enrichers - Define callbacks that can conditionally mutate or add data to logs. -- Recursively define callbacks through a heirachy of logger instances and configurations; allowing you to provide callbacks for individual flows. -- Define dynamic callbacks that change according to arguments (eg; the type of data being sent). +- Recursively define callbacks through a hierarchy of logger instances and configurations; allowing you to provide callbacks for individual flows. +- Define dynamic callbacks that change according to arguments (e.g., the type of data being sent). ### Configuration @@ -149,23 +142,24 @@ Utilizing [Correlation IDs](https://microsoft.github.io/code-with-engineering-pl So you're ready to get started with **rLog**! -You can either checkout our [Quick Start](https://rlog.daymxn.com/rlog/docs/quick-start) guide, read through our list of [Basic Guides](https://rlog.daymxn.com/rlog/docs/category/guides), or jump straight into our [API Reference](https://rlog.daymxn.com/rlog/docs/api). +You can either checkout our [Quick Start](https://rlog.daymxn.com/docs/quick-start) guide, read through our list of [Basic Guides](https://rlog.daymxn.com/docs/category/guides), or jump straight into our [API Reference](https://rlog.daymxn.com/docs/api). > [!TIP] -> If you're already familiar with logging libraries, you can give our [Fast Breakdown](https://rlog.daymxn.com/rlog/docs/fast-breakdown) a read to get a quick overview of what rLog provides, and where it differs from others. +> If you're already familiar with logging libraries, you can give our [Fast Breakdown](https://rlog.daymxn.com/docs/fast-breakdown) a read to get a quick overview of what rLog provides, and where it differs from others. ## Roadmap -- Remove deps/eslint/tsconfig settings that aren't needed -- Update shields to point to rLog once repo is public -- Double check that are links are working properly - -- Seperate provided sinks into a sub package +- Add social preview to github repo after going public +- Add publishing for wally +- Add docs for lua usage +- Separate provided sinks into a sub package - Support google cloud console logging - Migrate tests to individual files +- Implement workflow for test coverage +- Implement tests for provided workflows - Implement more refined serialization/assertions lib - Add workflow for checking API diff and version bumping according to semver -- Add note in contributing about changelog, version bumping, and checking the api diff +- Add note in contributing about checking the api diff ## Contributing diff --git a/api-extractor.json b/api-extractor.json index b57e283..4237ef2 100644 --- a/api-extractor.json +++ b/api-extractor.json @@ -6,7 +6,8 @@ "enumMemberOrder": "preserve", "compiler": {}, "apiReport": { - "enabled": false + "enabled": true, + "reportFolder": "/api" }, "docModel": { "enabled": true, diff --git a/api/rlog.api.md b/api/rlog.api.md new file mode 100644 index 0000000..970e6a1 --- /dev/null +++ b/api/rlog.api.md @@ -0,0 +1,175 @@ +## API Report File for "@rbxts/rlog" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +/// + +// @public +export type ContextCallback = (context: LogContext) => R; + +// @public +export function fileTagEnricher(entry: LogEntry): LogEntry; + +// @public +export type FormatMethodCallback = (entry: LogEntry) => LuaTuple; + +// @public +export function functionTagEnricher(entry: LogEntry): LogEntry; + +// @public +export class LogContext { + constructor(correlation_id: string, config: RLogConfig); + // (undocumented) + readonly config: RLogConfig; + // (undocumented) + readonly correlation_id: string; + IsDead(): boolean; + static start(config?: PartialRLogConfig): LogContext; + stop(): void; + use(config?: PartialRLogConfig): RLog; + withConfig(config: PartialRLogConfig): LogContext; +} + +// @public +export type LogData = Record; + +// @public +export type LogEnricherCallback = (entry: LogEntry) => LogEntry; + +// @public +export interface LogEntry { + config: Writable; + context?: LogContext; + data: LogData; + encoded_data: LogData; + level: LogLevel; + message: string; + source_metadata: SourceMetadata; + timestamp: number; +} + +// @public +export enum LogLevel { + DEBUG = 1, + ERROR = 4, + INFO = 2, + VERBOSE = 0, + WARNING = 3 +} + +// @public +export type LogSinkCallback = (entry: LogEntry) => boolean | void; + +// @public +export type OutputMethodCallback = (entry: LogEntry, messages: LuaTuple) => void; + +// @public +export type PartialRLogConfig = Partial> & { + readonly serialization?: Partial; +}; + +// @public +class RLog { + constructor(config?: PartialRLogConfig, context?: LogContext, inheritDefault?: boolean); + constructor(params: RLogConstructorParameters); + clone(): RLog; + clone(params: RLogConstructorParameters): RLog; + // @internal (undocumented) + _config: RLogConfig; + readonly context: LogContext | undefined; + d(message: string, data?: LogData): void; + debug(message: string, data?: LogData): void; + static readonly default: RLog; + e(message: string, data?: LogData): void; + error(message: string, data?: LogData): void; + static ForceContextFlush(): void; + i(message: string, data?: LogData): void; + info(message: string, data?: LogData): void; + log(level: LogLevel, message: string, data?: LogData): void; + static ResetDefaultConfig(): void; + static SetDefaultConfig(config: PartialRLogConfig): void; + static UpdateDefaultConfig(config: PartialRLogConfig): void; + v(message: string, data?: LogData): void; + verbose(message: string, data?: LogData): void; + w(message: string, data?: LogData): void; + warn(message: string, data?: LogData): void; + warning(message: string, data?: LogData): void; + withConfig(config: PartialRLogConfig): RLog; + withLogContext(context: LogContext): RLog; + withMinLogLevel(minLevel: LogLevel): RLog; + withTag(tag: string): RLog; +} +export { RLog } +export { RLog as rLog } +export { RLog as rlog } + +// @public +export interface RLogConfig { + readonly contextBypass: boolean; + readonly correlationGenerator?: () => string; + readonly enrichers?: LogEnricherCallback[]; + readonly minLogLevel: LogLevel; + readonly serialization: SerializationConfig; + readonly sinks?: LogSinkCallback[]; + readonly suspendContext: boolean; + readonly tag?: string; +} + +// @public +export interface RLogConstructorParameters { + // (undocumented) + config?: PartialRLogConfig; + // (undocumented) + context?: LogContext; + // (undocumented) + inheritDefault?: boolean; +} + +// @public +export const rLogger: RLog; + +// @public +export function robloxConsoleSink(params?: RobloxConsoleSinkConfig): (entry: LogEntry) => void; + +// @public +export interface RobloxConsoleSinkConfig { + readonly disable?: boolean; + readonly formatMethod?: FormatMethodCallback; + readonly minLogLevel?: LogLevel; + readonly outputMethod?: OutputMethodCallback; +} + +// @public +export interface SerializationConfig { + readonly deepEncodeTables: boolean; + readonly encodeFunctions: boolean; + readonly encodeMethod: string; + readonly encodeRobloxTypes: boolean; +} + +// @public +export interface SourceMetadata { + file_path: string; + function_name?: string; + line_number: number; + nearest_function_name?: string; +} + +// @public +export function sourceMetadataEnricher(entry: LogEntry): LogEntry; + +// @public +export function withLogContext(config: PartialRLogConfig, callback: ContextCallback): R; + +// @public +export function withLogContext(callback: ContextCallback): R; + +// @public +export function withLogContextAsync(config: PartialRLogConfig, callback: ContextCallback>): Promise; + +// @public +export function withLogContextAsync(callback: ContextCallback>): Promise; + +``` diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..b6796aa --- /dev/null +++ b/example/README.md @@ -0,0 +1,3 @@ +# Example Project + +I haven't gotten around to doing this lol... diff --git a/include/RuntimeLib.lua b/include/RuntimeLib.lua index ce51044..1236bfa 100644 --- a/include/RuntimeLib.lua +++ b/include/RuntimeLib.lua @@ -184,27 +184,56 @@ TS.TRY_RETURN = 1 TS.TRY_BREAK = 2 TS.TRY_CONTINUE = 3 -function TS.try(func, catch, finally) - local err, traceback - local success, exitType, returns = xpcall( - func, - function(errInner) - err = errInner - traceback = debug.traceback() +function TS.try(try, catch, finally) + -- execute try + local trySuccess, exitTypeOrTryError, returns = pcall(try) + local exitType, tryError + if trySuccess then + exitType = exitTypeOrTryError + else + tryError = exitTypeOrTryError + end + + local catchSuccess = true + local catchError + + -- if try block failed, and catch block exists, execute catch + if not trySuccess and catch then + local newExitTypeOrCatchError, newReturns + catchSuccess, newExitTypeOrCatchError, newReturns = pcall(catch, tryError) + local newExitType + if catchSuccess then + newExitType = newExitTypeOrCatchError + else + catchError = newExitTypeOrCatchError end - ) - if not success and catch then - local newExitType, newReturns = catch(err, traceback) + if newExitType then exitType, returns = newExitType, newReturns end end + + -- execute finally if finally then local newExitType, newReturns = finally() if newExitType then exitType, returns = newExitType, newReturns end end + + -- if exit type is a control flow, do not rethrow errors + if exitType ~= TS.TRY_RETURN and exitType ~= TS.TRY_BREAK and exitType ~= TS.TRY_CONTINUE then + -- if catch block threw an error, rethrow it + if not catchSuccess then + error(catchError, 2) + end + + -- if try block threw an error and there was no catch block, rethrow it + if not trySuccess and not catch then + error(tryError, 2) + end + end + return exitType, returns end diff --git a/package-lock.json b/package-lock.json index 0a09afe..84039d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@rbxts/t": "^3.1.1" }, "devDependencies": { + "@changesets/cli": "^2.27.7", "@rbxts/compiler-types": "^2.3.0-types.1", "@rbxts/testez": "https://github.com/daymxn/testez#patch-1", "@rbxts/types": "^1.0.795", @@ -25,16 +26,862 @@ "@typescript-eslint/parser": "^7.1.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-header": "^3.1.1", "eslint-plugin-headers": "^1.1.2", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-roblox-ts": "^0.0.36", "npm-run-all2": "^6.2.2", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^3.2.4", - "roblox-ts": "^2.3.0", + "roblox-ts": ">=2.3.0-dev-30dae68", "typescript": "^5.4.2" + }, + "peerDependencies": { + "roblox-ts": ">=2.3.0-dev-0338e9d" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.4.tgz", + "integrity": "sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/config": "^3.0.2", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.0", + "@changesets/should-skip-package": "^0.1.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.3.tgz", + "integrity": "sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.1", + "@changesets/should-skip-package": "^0.1.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", + "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.0.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.7.tgz", + "integrity": "sha512-6lr8JltiiXPIjDeYg4iM2MeePP6VN/JkmqBsVA5XRiy01hGS3y629LtSDvKcycj/w/5Eur1rEwby/MjcYS+e2A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^7.0.4", + "@changesets/assemble-release-plan": "^6.0.3", + "@changesets/changelog-git": "^0.2.0", + "@changesets/config": "^3.0.2", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.1", + "@changesets/get-release-plan": "^4.0.3", + "@changesets/git": "^3.0.0", + "@changesets/logger": "^0.1.0", + "@changesets/pre": "^2.0.0", + "@changesets/read": "^0.6.0", + "@changesets/should-skip-package": "^0.1.0", + "@changesets/types": "^6.0.0", + "@changesets/write": "^0.3.1", + "@manypkg/get-packages": "^1.1.3", + "@types/semver": "^7.5.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "ci-info": "^3.7.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "mri": "^1.2.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/cli/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/config": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.2.tgz", + "integrity": "sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==", + "dev": true, + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.1", + "@changesets/logger": "^0.1.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.2" + } + }, + "node_modules/@changesets/config/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/config/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/config/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.1.tgz", + "integrity": "sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/get-dependents-graph/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.3.tgz", + "integrity": "sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/assemble-release-plan": "^6.0.3", + "@changesets/config": "^3.0.2", + "@changesets/pre": "^2.0.0", + "@changesets/read": "^0.6.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true + }, + "node_modules/@changesets/git": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz", + "integrity": "sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.2", + "spawndamnit": "^2.0.0" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz", + "integrity": "sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==", + "dev": true, + "dependencies": { + "chalk": "^2.1.0" + } + }, + "node_modules/@changesets/logger/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/logger/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/logger/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/logger/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/logger/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/logger/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/logger/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", + "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.0.0", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz", + "integrity": "sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/pre/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/pre/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/pre/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz", + "integrity": "sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/git": "^3.0.0", + "@changesets/logger": "^0.1.0", + "@changesets/parse": "^0.4.0", + "@changesets/types": "^6.0.0", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0" + } + }, + "node_modules/@changesets/read/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/read/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/read/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/read/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/read/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/read/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.0.tgz", + "integrity": "sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/types": "^6.0.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", + "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", + "dev": true + }, + "node_modules/@changesets/write": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.1.tgz", + "integrity": "sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/types": "^6.0.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@changesets/write/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@changesets/write/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -172,6 +1019,160 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/get-packages/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -271,9 +1272,9 @@ "dev": true }, "node_modules/@roblox-ts/luau-ast": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@roblox-ts/luau-ast/-/luau-ast-1.0.11.tgz", - "integrity": "sha512-+maoLYpqY0HK8ugLFHS3qz0phMyDaN3i21jjW75T2ZaqJg84heKDUo98iXClvnx3mUDhW10IxqH+cYJ2iftYhQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@roblox-ts/luau-ast/-/luau-ast-2.0.0.tgz", + "integrity": "sha512-cmMi093IdwBOLVxwuordhM8AmtbyTIyRpsTbB0D/JauidW4SXsQRQowSwWjHo4QP0DRJBXvOIlxtqEQi50uNzQ==", "dev": true }, "node_modules/@roblox-ts/path-translator": { @@ -749,6 +1750,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -807,6 +1817,18 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -865,6 +1887,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -901,6 +1929,21 @@ "node": ">= 6" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -976,6 +2019,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1006,6 +2058,19 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -1094,15 +2159,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-header": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", - "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", - "dev": true, - "peerDependencies": { - "eslint": ">=7.7.0" - } - }, "node_modules/eslint-plugin-headers": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/eslint-plugin-headers/-/eslint-plugin-headers-1.1.2.tgz", @@ -1140,21 +2196,9 @@ "@types/eslint": { "optional": true }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-plugin-roblox-ts": { @@ -1247,6 +2291,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -1289,6 +2346,26 @@ "node": ">=0.10.0" } }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1396,6 +2473,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -1591,6 +2678,24 @@ "node": ">= 0.4" } }, + "node_modules/human-id": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", + "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -1717,6 +2822,27 @@ "node": ">=8" } }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1805,6 +2931,43 @@ "node": ">= 0.8.0" } }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1826,6 +2989,22 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -1872,6 +3051,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1965,6 +3153,33 @@ "node": ">= 0.8.0" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -1995,6 +3210,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2073,6 +3306,94 @@ "node": ">=0.10" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/preferred-pm": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.4.tgz", + "integrity": "sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2129,6 +3450,12 @@ } } }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2171,6 +3498,43 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2183,6 +3547,12 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2254,19 +3624,19 @@ } }, "node_modules/roblox-ts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/roblox-ts/-/roblox-ts-2.3.0.tgz", - "integrity": "sha512-swz+3sxHcB1ww5iUkwxzPFqrbWYmjD9uDriLhta5MAShvRFW4Vdku/aBSU4KiLqtVWYvYo32G+5bXg1Pw2yvIA==", + "version": "2.3.0-dev-30dae68", + "resolved": "https://registry.npmjs.org/roblox-ts/-/roblox-ts-2.3.0-dev-30dae68.tgz", + "integrity": "sha512-sD5H2u5YdbR0PmhZbUuUmaYEljzPEJjasZy4fzusTt18BtQG+6EN65Tdr457UaOm7PsCNRnwc/wZPHdzR4vbwA==", "dev": true, "dependencies": { - "@roblox-ts/luau-ast": "^1.0.11", - "@roblox-ts/path-translator": "^1.0.0", - "@roblox-ts/rojo-resolver": "^1.0.6", + "@roblox-ts/luau-ast": "=2.0.0", + "@roblox-ts/path-translator": "=1.0.0", + "@roblox-ts/rojo-resolver": "=1.0.6", "chokidar": "^3.6.0", "fs-extra": "^11.2.0", "kleur": "^4.1.5", "resolve": "^1.22.6", - "typescript": "=5.2.2", + "typescript": "=5.5.3", "yargs": "^17.7.2" }, "bin": { @@ -2274,9 +3644,9 @@ } }, "node_modules/roblox-ts/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -2309,6 +3679,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -2351,6 +3727,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2360,6 +3742,66 @@ "node": ">=8" } }, + "node_modules/spawndamnit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", + "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/spawndamnit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/spawndamnit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawndamnit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawndamnit/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2386,6 +3828,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2438,12 +3889,36 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2571,6 +4046,19 @@ "node": ">= 8" } }, + "node_modules/which-pm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.2.0.tgz", + "integrity": "sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==", + "dev": true, + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -2612,6 +4100,12 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 316f679..c5cb333 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,32 @@ { "name": "@rbxts/rlog", "version": "0.8.0", - "description": "Context based Server-Side logging solution for ROBLOX projects.", + "description": "Context-based server-side logging solution for ROBLOX projects.", "main": "out/init.lua", "scripts": { - "build": "rbxtsc --noInclude", - "dev": "rbxtsc -w --type game --rojo test.project.json --noInclude", - "watch": "rbxtsc -w --noInclude", + "build": "rbxtsc", + "dev": "rbxtsc -w --type game --rojo test.project.json", + "watch": "rbxtsc -w", "scripts:build": "npx tsc --project ./scripts/tsconfig.scripts.json", "scripts:watch": "npm run scripts:build -- -w", "api:build": "npm run build", "api:extract": "api-extractor run --local --verbose", + "api:update": "npx run-s api:build api:extract", "api:docs:generate": "api-documenter markdown -i ./temp -o ./temp/api", "api:docs:fix": "npx tsx ./scripts/src/fix-api-reference.ts ./temp/api ./temp/fixed", "api:docs:export": "npx tsx ./scripts/src/export-api-reference.ts ./temp/fixed ./wiki/docs/api", "api:docs": "npx run-s api:docs:*", - "api": "npx run-s api:build api:extract api:docs", + "api": "npx run-s api:update api:docs", "format": "npx eslint --fix", "lint": "npm run format", + "lock": "npm i --package-lock-only", + "change": "npx changeset add", + "change:status": "npx changeset status", + "change:export": "npx changeset status --output changes.json", + "change:publish": "npx changeset publish", + "release:version": "npx changeset version", + "release:tags": "git push --follow-tags", + "release": "npx run-s build change:publish", "prepublishOnly": "npm run build" }, "keywords": [ @@ -48,6 +57,7 @@ "access": "public" }, "devDependencies": { + "@changesets/cli": "^2.27.7", "@rbxts/compiler-types": "^2.3.0-types.1", "@rbxts/testez": "https://github.com/daymxn/testez#patch-1", "@rbxts/types": "^1.0.795", @@ -57,15 +67,13 @@ "@typescript-eslint/parser": "^7.1.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-header": "^3.1.1", "eslint-plugin-headers": "^1.1.2", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-roblox-ts": "^0.0.36", "npm-run-all2": "^6.2.2", "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^3.2.4", - "roblox-ts": "^2.3.0", + "roblox-ts": ">=2.3.0-dev-30dae68", "typescript": "^5.4.2" }, "dependencies": { @@ -74,5 +82,8 @@ "@rbxts/services": "^1.5.4", "@rbxts/string-utils": "^1.0.3", "@rbxts/t": "^3.1.1" + }, + "peerDependencies": { + "roblox-ts": ">=2.3.0-dev-0338e9d" } } diff --git a/src/configuration/index.ts b/src/configuration/index.ts index a11d3f6..66cdaf2 100644 --- a/src/configuration/index.ts +++ b/src/configuration/index.ts @@ -94,7 +94,7 @@ export interface SerializationConfig { * @remarks * * When disabled, tables will not be recursively encoded, which may cause you - * to miss out on certain data types being properly translated (eg; roblox data types). + * to miss out on certain data types being properly translated (e.g., roblox data types). * * This will occur even if you have {@link SerializationConfig.encodeRobloxTypes | encodeRobloxTypes} * enabled. diff --git a/src/context/log-context.ts b/src/context/log-context.ts index 6625cc6..94caa08 100644 --- a/src/context/log-context.ts +++ b/src/context/log-context.ts @@ -84,7 +84,7 @@ export class LogContext { * * @returns A new {@link LogContext} instance. * - * @throws If the context is dead (ie; if {@link LogContext.stop | stop} was called already) + * @throws If the context is dead (i.e., if {@link LogContext.stop | stop} was called already) * * @example * ```ts @@ -114,7 +114,7 @@ export class LogContext { * * @see {@link LogContext.stop | stop} * - * @throws If the context is dead (ie; if {@link LogContext.stop | stop} was called already) + * @throws If the context is dead (i.e., if {@link LogContext.stop | stop} was called already) * * @example * ```ts diff --git a/src/index.ts b/src/index.ts index 6351fe9..405c5d9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ /* eslint-disable headers/header-format */ /** - * Context based Server-Side logging framework for ROBLOX projects. + * Context-based server-side logging framework for ROBLOX projects. * * @remarks * Exports the {@link RLog} class as the primary entry point. diff --git a/src/rlog.ts b/src/rlog.ts index e5276e9..082e89f 100644 --- a/src/rlog.ts +++ b/src/rlog.ts @@ -61,7 +61,7 @@ function extractSourceMetadata(): SourceMetadata { } /** - * Class for Server-Side Roblox Logging. + * Class for server-side Roblox Logging. * * @remarks * diff --git a/src/sinks/roblox-console-sink.ts b/src/sinks/roblox-console-sink.ts index 03a30bf..26c31a7 100644 --- a/src/sinks/roblox-console-sink.ts +++ b/src/sinks/roblox-console-sink.ts @@ -116,7 +116,6 @@ export interface RobloxConsoleSinkConfig { * * @public */ -// TODO()- since this returns a method, it doesn't pass the unique test on config merge; causing duplication. export function robloxConsoleSink(params: RobloxConsoleSinkConfig = {}) { const { formatMethod, outputMethod, minLogLevel, disable } = params; @@ -130,6 +129,8 @@ export function robloxConsoleSink(params: RobloxConsoleSinkConfig = {}) { const output = formatEntry(entry); outputEntry(entry, output); + + return true; }; } diff --git a/src/tests/rlog.spec.ts b/src/tests/rlog.spec.ts index 2a48619..92796bc 100644 --- a/src/tests/rlog.spec.ts +++ b/src/tests/rlog.spec.ts @@ -22,7 +22,8 @@ import { includes, startsWith } from "@rbxts/string-utils"; import { t } from "@rbxts/t"; import { LogData, LogEntry, LogLevel, SourceMetadata } from "../common"; import { LogContext, LogContextManager, withLogContext } from "../context"; -import { rlog } from "../rlog"; +import { rLog, rlog } from "../rlog"; +import { robloxConsoleSink } from "../sinks"; import { bind, check } from "./matchers"; // TODO(): maybe split into separate files? @@ -632,4 +633,18 @@ export = () => { expect(messagesAfterStop.size()).to.equal(3); }); }); + + describe("roblox console sink", () => { + it("should not duplicate logs", () => { + const logger = new rLog({ + sinks: [robloxConsoleSink()], + }); + + logger.debug("Message"); + + const messages = getMessages(); + + expect(messages.size()).to.equal(1); + }); + }); }; diff --git a/wiki/docs/api/index.md b/wiki/docs/api/index.md index 5f61393..0298b83 100644 --- a/wiki/docs/api/index.md +++ b/wiki/docs/api/index.md @@ -28,7 +28,7 @@ Description -Context based Server-Side logging framework for ROBLOX projects. +Context-based server-side logging framework for ROBLOX projects. diff --git a/wiki/docs/api/rlog.logcontext.use.md b/wiki/docs/api/rlog.logcontext.use.md index bbbf047..838846a 100644 --- a/wiki/docs/api/rlog.logcontext.use.md +++ b/wiki/docs/api/rlog.logcontext.use.md @@ -59,7 +59,7 @@ A new [RLog](./rlog.rlog.md) instance. ## Exceptions -If the context is dead (ie; if [stop](./rlog.logcontext.stop.md) was called already) +If the context is dead (i.e., if [stop](./rlog.logcontext.stop.md) was called already) ## Remarks diff --git a/wiki/docs/api/rlog.logcontext.withconfig.md b/wiki/docs/api/rlog.logcontext.withconfig.md index 27a03cd..3abb052 100644 --- a/wiki/docs/api/rlog.logcontext.withconfig.md +++ b/wiki/docs/api/rlog.logcontext.withconfig.md @@ -59,7 +59,7 @@ A new [LogContext](./rlog.logcontext.md) instance. ## Exceptions -If the context is dead (ie; if [stop](./rlog.logcontext.stop.md) was called already) +If the context is dead (i.e., if [stop](./rlog.logcontext.stop.md) was called already) ## Remarks diff --git a/wiki/docs/api/rlog.md b/wiki/docs/api/rlog.md index b2f9092..d176545 100644 --- a/wiki/docs/api/rlog.md +++ b/wiki/docs/api/rlog.md @@ -7,7 +7,7 @@ hide_title: true ## rlog package -Context based Server-Side logging framework for ROBLOX projects. +Context-based server-side logging framework for ROBLOX projects. ## Remarks @@ -44,7 +44,7 @@ Context for a collection of log entries. -Class for Server-Side Roblox Logging. +Class for server-side Roblox Logging. diff --git a/wiki/docs/api/rlog.rlog.md b/wiki/docs/api/rlog.rlog.md index d0f8400..f88158f 100644 --- a/wiki/docs/api/rlog.rlog.md +++ b/wiki/docs/api/rlog.rlog.md @@ -8,7 +8,7 @@ hide_title: true ## RLog class -Class for Server-Side Roblox Logging. +Class for server-side Roblox Logging. **Signature:** diff --git a/wiki/docs/api/rlog.serializationconfig.deepencodetables.md b/wiki/docs/api/rlog.serializationconfig.deepencodetables.md index 5e3304d..83d825d 100644 --- a/wiki/docs/api/rlog.serializationconfig.deepencodetables.md +++ b/wiki/docs/api/rlog.serializationconfig.deepencodetables.md @@ -18,7 +18,7 @@ readonly deepEncodeTables: boolean; ## Remarks -When disabled, tables will not be recursively encoded, which may cause you to miss out on certain data types being properly translated (eg; roblox data types). +When disabled, tables will not be recursively encoded, which may cause you to miss out on certain data types being properly translated (e.g., roblox data types). This will occur even if you have [encodeRobloxTypes](./rlog.serializationconfig.encoderobloxtypes.md) enabled. diff --git a/wiki/docs/basics/enrichers.mdx b/wiki/docs/basics/enrichers.mdx index 36e4e77..127605c 100644 --- a/wiki/docs/basics/enrichers.mdx +++ b/wiki/docs/basics/enrichers.mdx @@ -9,11 +9,11 @@ to add custom information to each log entry or modify existing data. :::info what you'll learn -- What enrichers are -- How to apply enrichers to your logging setup -- How the order of enrichers affects output -- How to create your own enrichers -- What enrichers **rLog** provides out of the box +- What enrichers are +- How to apply enrichers to your logging setup +- How the order of enrichers affects output +- How to create your own enrichers +- What enrichers **rLog** provides out of the box ::: @@ -30,8 +30,8 @@ Here's a basic example of an enricher that adds a timestamp to each log entry. import { LogEnricherCallback, LogEntry } from "@rbxts/rlog"; export const timestampEnricher: LogEnricherCallback = (entry: LogEntry) => { - entry.encoded_data["timestamp"] = DateTime.now(); - return entry; + entry.encoded_data["timestamp"] = DateTime.now(); + return entry; }; ``` @@ -66,8 +66,8 @@ This allows for complex transformations and data enrichment flows. import { LogEnricherCallback, LogEntry } from "@rbxts/rlog"; export const timestampEnricher: LogEnricherCallback = (entry: LogEntry) => { - entry.encoded_data["timestamp"] = DateTime.now(); - return entry; + entry.encoded_data["timestamp"] = DateTime.now(); + return entry; }; ``` @@ -75,12 +75,12 @@ export const timestampEnricher: LogEnricherCallback = (entry: LogEntry) => { import { LogEnricherCallback, LogEntry } from "@rbxts/rlog"; export const transformTimestampEnricher: LogEnricherCallback = (entry: LogEntry) => { - if (typeIs(entry.encoded_data["timestamp"], "number")) { - const ms = DateTime.fromUnixTimestampMillis(entry.encoded_data.timestamp); - const formattedTimestamp = ms.FormatLocalTime("LL", "en-us"); - entry.encoded_data.timestamp = formattedTimestamp; - } - return entry; + if (typeIs(entry.encoded_data["timestamp"], "number")) { + const ms = DateTime.fromUnixTimestampMillis(entry.encoded_data.timestamp); + const formattedTimestamp = ms.FormatLocalTime("LL", "en-us"); + entry.encoded_data.timestamp = formattedTimestamp; + } + return entry; }; ``` @@ -109,9 +109,9 @@ Since you have access to the entire `LogEntry`, you can make these decisions on import { LogEnricherCallback, LogEntry, LogLevel, rLog } from "@rbxts/rlog"; export const timestampEnricher: LogEnricherCallback = (entry: LogEntry) => { - // just return the instance without changing anything - if (entry.Level < LogLevel.WARNING) return entry; - // ... + // just return the instance without changing anything + if (entry.Level < LogLevel.WARNING) return entry; + // ... }; ``` @@ -125,12 +125,12 @@ You might want to add information like a User ID or Session ID to every log entr ```ts function enricherForPlayer(player: Player): LogEnricherCallback { - const uid = tostring(player.UserId); + const uid = tostring(player.UserId); - return (entry) => { - entry.encoded_data.userId = uid; - return entry; - }; + return (entry) => { + entry.encoded_data.userId = uid; + return entry; + }; } ``` @@ -140,8 +140,8 @@ Enrichers can also be used to add data that changes dynamically, such as request ```ts const transactionEnricher: LogEnricherCallback = (entry) => { - entry.encoded_data.transactionId = generateTransactionId(); - return entry; + entry.encoded_data.transactionId = generateTransactionId(); + return entry; }; ``` @@ -153,11 +153,11 @@ For example, you might only want to add certain metadata for error logs. ```ts const errorTraceEnricher: LogEnricherCallback = (entry) => { - if (entry.level === LogLevel.ERROR) { - entry.encoded_data.trace = debug.traceback(entry.message); - } + if (entry.level === LogLevel.ERROR) { + entry.encoded_data.trace = debug.traceback(entry.message); + } - return entry; + return entry; }; ``` @@ -167,26 +167,26 @@ You might want to avoid accidentally leaking certain data to your cloud provider ```ts const scrubApiKeysEnricher: LogEnricherCallback = (entry) => { - entry.encoded_data["api_key"] = undefined; + entry.encoded_data["api_key"] = undefined; - return entry; + return entry; }; ``` ## Best Practices -- **Keep Enrichers Simple**: Enrichers should be straightforward and focus on a single task, like adding a specific - piece of metadata. +- **Keep Enrichers Simple**: Enrichers should be straightforward and focus on a single task, like adding a specific + piece of metadata. -- **Order Enrichers Wisely**: Think about the order in which you apply enrichers. The output of one enricher _will_ - affect the next. +- **Order Enrichers Wisely**: Think about the order in which you apply enrichers. The output of one enricher _will_ + affect the next. -- **Avoid Heavy Operations**: Since enrichers run for every log entry, avoid performing heavy computations inside them - to prevent slowing down your application. +- **Avoid Heavy Operations**: Since enrichers run for every log entry, avoid performing heavy computations inside them + to prevent slowing down your application. -- **Avoid yielding**: If your enricher is running for every log entry, yielding inside an enricher will cause the flow - of your program to stop in that thread. In some situations this is desirable- but you generally want your enrichers to - be simple and non blocking. +- **Avoid yielding**: If your enricher is running for every log entry, yielding inside an enricher will cause the flow + of your program to stop in that thread. In some situations this is desirable- but you generally want your enrichers + to be simple and non blocking. ## Provided Enrichers {#provided-enrichers} @@ -194,8 +194,9 @@ const scrubApiKeysEnricher: LogEnricherCallback = (entry) => { :::tip -If you believe you have a common use case that isn't covered by these, feel free to open an issue on the [GitHub](#), or -[Create a PR](#) to add it yourself! +If you believe you have a common use case that isn't covered by these, feel free to open an issue on the +[GitHub](https://github.com/daymxn/rLog/issues/new), or [Create a PR](https://github.com/daymxn/rLog/compare) to add it +yourself! ::: @@ -207,8 +208,8 @@ Uses the name of the nearest function as the tag, if the tag is empty. import { rLog } from "@rbxts/rlog"; export function doAction() { - const logger = new rLog(); - logger.i("Hello world!"); + const logger = new rLog(); + logger.i("Hello world!"); } ``` @@ -233,8 +234,8 @@ Uses the path of the file as the tag, if the tag is empty. import { rLog } from "@rbxts/rlog"; export function doAction() { - const logger = new rLog(); - logger.i("Hello world!"); + const logger = new rLog(); + logger.i("Hello world!"); } ``` @@ -267,8 +268,8 @@ The metadata is attached under the `source_metadata` key in `encoded_data`. import { rLog } from "@rbxts/rlog"; export function doAction() { - const logger = new rLog(); - logger.i("Hello world!"); + const logger = new rLog(); + logger.i("Hello world!"); } ``` @@ -299,6 +300,6 @@ doAction(); Let's recap what we've learned about Enrichers: -- **Enrichers** are callbacks that can add new or change existing data on a log entry. -- You can add **multiple** enrichers to an instance, but they're invoked in the order they're added. -- Enrichers can decide to **not** operate on data by returning it as is. +- **Enrichers** are callbacks that can add new or change existing data on a log entry. +- You can add **multiple** enrichers to an instance, but they're invoked in the order they're added. +- Enrichers can decide to **not** operate on data by returning it as is. diff --git a/wiki/docs/basics/log-entries.mdx b/wiki/docs/basics/log-entries.mdx index a94b69d..5784038 100644 --- a/wiki/docs/basics/log-entries.mdx +++ b/wiki/docs/basics/log-entries.mdx @@ -9,9 +9,9 @@ log. :::info what you'll learn -- What log entries are -- The different components of a log -- How data is attached to logs +- What log entries are +- The different components of a log +- How data is attached to logs ::: @@ -22,14 +22,14 @@ information attached to them. ```ts export type LogEntry = { - level: LogLevel; - message: string; - data: LogData; - encoded_data: LogData; - config: Writable; - context?: LogContext; - timestamp: number; - source_metadata: SourceMetadata; + level: LogLevel; + message: string; + data: LogData; + encoded_data: LogData; + config: Writable; + context?: LogContext; + timestamp: number; + source_metadata: SourceMetadata; }; ``` @@ -121,7 +121,7 @@ guide. #### Correlation ID -`correlation_id` is a unique string attached to logs to identify entries that run across different `RLog` instances, but +`correlation_id` is a unique string attached to logs to identify entries that run across different `rLog` instances, but represent the same "flow". These are provided via Log Context. @@ -143,10 +143,10 @@ You'll learn more about Correlation IDs aswell in the [Log Context](./log-contex ```ts export type SourceMetadata = { - function_name?: string; - nearest_function_name?: string; - file_path: string; - line_number: number; + function_name?: string; + nearest_function_name?: string; + file_path: string; + line_number: number; }; ``` @@ -156,6 +156,6 @@ You'll learn more about Source Metadata in the [Source Metadata](/advanced/sourc Let's recap what we've learned about log entries: -- They carry all the **metadata** associated with log messages -- They keep track of **when** logs were sent, and **who** sent them -- They allow logs to carry additional **user provided** data +- They carry all the **metadata** associated with log messages +- They keep track of **when** logs were sent, and **who** sent them +- They allow logs to carry additional **user provided** data diff --git a/wiki/docs/basics/log-levels.mdx b/wiki/docs/basics/log-levels.mdx index f8a050a..f713ebb 100644 --- a/wiki/docs/basics/log-levels.mdx +++ b/wiki/docs/basics/log-levels.mdx @@ -8,10 +8,10 @@ Logs can have a different severity level attached to them, indicating at a quick :::info what you'll learn -- What log levels are -- How log levels are used -- The various helper methods to create different log messages -- How to apply a minimum log level to your logging setup +- What log levels are +- How log levels are used +- The various helper methods to create different log messages +- How to apply a minimum log level to your logging setup ::: @@ -19,11 +19,11 @@ Logs can have a different severity level attached to them, indicating at a quick Within **rLog**, there are five possible severity levels you can use: -- Verbose -- Debug -- Info -- Warn -- Error +- Verbose +- Debug +- Info +- Warn +- Error The levels escalate in order of importance, `Verbose` being the least important, and `Error` being the most important. @@ -49,9 +49,9 @@ const logger = new rLog(); logger.verbose("Application started"); function processOrder(orderId: string, userId: string) { - // All the logging methods have short hand aliases you can use as well - // highlight-next-line - logger.v("Fetching details for order", { order: orderId, user: userId }); + // All the logging methods have short hand aliases you can use as well + // highlight-next-line + logger.v("Fetching details for order", { order: orderId, user: userId }); } processOrder("12345", "user789"); @@ -81,12 +81,12 @@ const logger = new rLog(); logger.verbose("Application started"); function processOrder(orderId: string, userId: string) { - logger.v("Fetching details for order", { order: orderId, user: userId }); + logger.v("Fetching details for order", { order: orderId, user: userId }); - const orderDetails = { items: ["item1", "item2"], total: 100 }; + const orderDetails = { items: ["item1", "item2"], total: 100 }; - // highlight-next-line - logger.d(`Retrieved order details`, { details: orderDetails }); + // highlight-next-line + logger.d(`Retrieved order details`, { details: orderDetails }); } processOrder("12345", "user789"); @@ -119,17 +119,17 @@ const logger = new rLog(); logger.verbose("Application started"); function processOrder(orderId: string, userId: string) { - // highlight-next-line - logger.i("Processing order"); + // highlight-next-line + logger.i("Processing order"); - logger.v("Fetching details for order", { order: orderId, user: userId }); + logger.v("Fetching details for order", { order: orderId, user: userId }); - const orderDetails = { items: ["item1", "item2"], total: 100 }; + const orderDetails = { items: ["item1", "item2"], total: 100 }; - logger.d(`Retrieved order details`, { details: orderDetails }); + logger.d(`Retrieved order details`, { details: orderDetails }); - // highlight-next-line - logger.i("Order complete"); + // highlight-next-line + logger.i("Order complete"); } processOrder("12345", "user789"); @@ -173,29 +173,29 @@ const logger = new rLog(); logger.verbose("Application started"); function processOrder(orderId: string, userId: string) { - logger.i("Processing order"); + logger.i("Processing order"); - logger.v("Fetching details for order", { order: orderId, user: userId }); + logger.v("Fetching details for order", { order: orderId, user: userId }); - const orderDetails = { items: ["item1", "item2"], total: 1 }; + const orderDetails = { items: ["item1", "item2"], total: 1 }; - logger.d(`Retrieved order details`, { details: orderDetails }); + logger.d(`Retrieved order details`, { details: orderDetails }); - if (orderDetails.total < 10) { - // highlight-next-line - logger.w("Order has a suspiciously low total"); - } + if (orderDetails.total < 10) { + // highlight-next-line + logger.w("Order has a suspiciously low total"); + } - logger.v("Sending order for payment"); + logger.v("Sending order for payment"); - const paymentSuccessful = sendPayment(order, userId, orderDetails); + const paymentSuccessful = sendPayment(order, userId, orderDetails); - if (!paymentSuccessful) { - // highlight-next-line - logger.w("Payment for order failed"); - } + if (!paymentSuccessful) { + // highlight-next-line + logger.w("Payment for order failed"); + } - logger.i("Order complete"); + logger.i("Order complete"); } processOrder("12345", "user789"); @@ -238,35 +238,35 @@ const logger = new rLog(); logger.verbose("Application started"); function processOrder(orderId: string, userId: string) { - try { - logger.i("Processing order"); + try { + logger.i("Processing order"); - logger.v("Fetching details for order", { order: orderId, user: userId }); + logger.v("Fetching details for order", { order: orderId, user: userId }); - const orderDetails = { items: ["item1", "item2"], total: 1 }; + const orderDetails = { items: ["item1", "item2"], total: 1 }; - logger.d(`Retrieved order details`, { details: orderDetails }); + logger.d(`Retrieved order details`, { details: orderDetails }); - if (orderDetails.total < 10) { - logger.w("Order has a suspiciously low total"); - } + if (orderDetails.total < 10) { + logger.w("Order has a suspiciously low total"); + } - logger.v("Sending order for payment"); + logger.v("Sending order for payment"); - const paymentSuccessful = sendPayment(order, userId, orderDetails); + const paymentSuccessful = sendPayment(order, userId, orderDetails); - if (!paymentSuccessful) { - logger.w("Payment for order failed"); - } + if (!paymentSuccessful) { + logger.w("Payment for order failed"); + } - logger.i("Order complete"); - } catch (e) { - // highlight-start - logger.e("An unexpected error occurred", { - reason: e.message, - }); - //highlight-end - } + logger.i("Order complete"); + } catch (e) { + // highlight-start + logger.e("An unexpected error occurred", { + reason: e.message, + }); + //highlight-end + } } processOrder("12345", 789); @@ -331,7 +331,7 @@ console. ### Helper Method -The second way to configure this is via the `withMinLogLevel` method on `RLog` instances. +The second way to configure this is via the `withMinLogLevel` method on `rLog` instances. ```ts // returns a copy of this logger, but with the `minLogLevel` set to `DEBUG` @@ -347,8 +347,8 @@ functional setups. Let's recap what we've learned about log levels: -- They respresent the **severity** or **importance** of a log -- They're the **first** part of a log message -- They have an **increasing** level of importance -- You can set a **minimum** level to output -- Levels above `INFO` are sent through the `warn` console in roblox +- They respresent the **severity** or **importance** of a log +- They're the **first** part of a log message +- They have an **increasing** level of importance +- You can set a **minimum** level to output +- Levels above `INFO` are sent through the `warn` console in roblox diff --git a/wiki/docs/basics/serialization.mdx b/wiki/docs/basics/serialization.mdx index 69d7ea4..2f731ea 100644 --- a/wiki/docs/basics/serialization.mdx +++ b/wiki/docs/basics/serialization.mdx @@ -12,10 +12,10 @@ issues. :::info what you'll learn -- How **rLog** handles automatic serialization -- How to pass data as part of your log entries -- How to customize serialization using `SerializationConfig` -- Best practices for managing serialized data +- How **rLog** handles automatic serialization +- How to pass data as part of your log entries +- How to customize serialization using `SerializationConfig` +- Best practices for managing serialized data ::: @@ -38,7 +38,7 @@ import { Players } from "@rbxts/services"; const logger = new rLog(); Players.PlayerAdded.Connect((player) => { - logger.i("Player joined", { id: player.UserId, name: player.Name }); + logger.i("Player joined", { id: player.UserId, name: player.Name }); }); ``` @@ -63,7 +63,7 @@ objects and Roblox-specific data types. ### Roblox Types -A lot of Roblox data-types don't properly encode to string or JSON, especially when nested in tables. +A lot of Roblox data types don't properly encode to string or JSON, especially when nested in tables. **rLog** will manually encode these types, so you don't have to worry about data missing in your logs. @@ -73,13 +73,13 @@ import { rLog } from "@rbxts/rlog"; const logger = new rLog(); logger.d("User purchase complete", { - purchase_id: "121141", - details: { - item: "Nuke", - result: Enum.ProductPurchaseDecision.PurchaseGranted, - position: new Vector3(10, 15, 20), - rotation: new CFrame(), - }, + purchase_id: "121141", + details: { + item: "Nuke", + result: Enum.ProductPurchaseDecision.PurchaseGranted, + position: new Vector3(10, 15, 20), + rotation: new CFrame(), + }, }); ``` @@ -143,11 +143,11 @@ encoded. import { rLog } from "@rbxts/rlog"; const event = { - source: { - position: new Vector2(1, 1), - distance: 100, - }, - target: new Vector2(2, 2), + source: { + position: new Vector2(1, 1), + distance: 100, + }, + target: new Vector2(2, 2), }; const logger = new rLog({ serialization: { deepEncodeTables: false } }); @@ -187,7 +187,7 @@ is automatically generated by **rbxts** for typescript classes, with a value of import { rLog } from "@rbxts/rlog"; class Person { - constructor(public name: string) {} + constructor(public name: string) {} } const logger = new rLog(); @@ -218,11 +218,11 @@ The first (and easiest) way is by providing your own `toString` override on the import { rLog } from "@rbxts/rlog"; class Person { - constructor(public name: string) {} + constructor(public name: string) {} - public toString() { - return this.name; - } + public toString() { + return this.name; + } } const logger = new rLog(); @@ -251,11 +251,11 @@ In the case that your `encodeMethod` is not found on an instance, **rLog** will import { rLog } from "@rbxts/rlog"; class Person { - constructor(public name: string) {} + constructor(public name: string) {} - public encode() { - return this.name; - } + public encode() { + return this.name; + } } const logger = new rLog({ serialization: { encodeMethod: "encode" } }); @@ -285,8 +285,8 @@ Meaning you can also return tables, numbers, or even booleans- if a string isn't A not so common use-case is functions. -By default, rLog does _not_ encode functions in the output. But, this behavior can sometimes be desirable (eg; if you're -inspecting run-time types). +By default, rLog does _not_ encode functions in the output. But, this behavior can sometimes be desirable (e.g., if +you're inspecting run-time types). You can enable this behavior with the `encodeFunctions` config option. @@ -294,12 +294,12 @@ You can enable this behavior with the `encodeFunctions` config option. import { rLog } from "@rbxts/rlog"; function CreatePlayer(name: string) { - return { - name: name, - eatFood: () => { - // ... - }, - }; + return { + name: name, + eatFood: () => { + // ... + }, + }; } const logger = new rLog({ serialization: { encodeFunctions: true } }); @@ -334,7 +334,7 @@ Thankfully, **rLog** fixes that. While **rLog** will catch surface level self pointers, it does _not_ catch deep self pointers. This is done for performance reasons. If you have deeply nested self pointers, you may want to provide a -[custom encoding method](#) to fix it. +[custom encoding method](#custom-encoding) to fix it. ::: @@ -342,17 +342,17 @@ This is done for performance reasons. If you have deeply nested self pointers, y import { rLog } from "@rbxts/rlog"; class Person { - constructor( - public name: string, - public parent?: Person, - ) {} - - public encode() { - return { - name: this.name, - parent: this.parent, - }; - } + constructor( + public name: string, + public parent?: Person, + ) {} + + public encode() { + return { + name: this.name, + parent: this.parent, + }; + } } const logger = new rLog({ serialization: { encodeMethod: "encode" } }); @@ -380,16 +380,16 @@ logger.debug("Person created", { me: person }); ## Best Practices -- **Provide metadata when possible**: While there's definitely such a thing as cognitive overload when it comes to logs, - that can usually be fixed with proper filtering. It's generally a better idea to provide metadata for logs where - possible- even in small amounts. You'll be thanking yourself when it comes time to do some deep debugging. -- **Attach IDs to logs**: Any sort of identifying information can be a great help when debugging issues. So you should - try to make sure IDs like Player IDs, Asset IDs, etc., are included in your logs. +- **Provide metadata when possible**: While there's definitely such a thing as cognitive overload when it comes to + logs, that can usually be fixed with proper filtering. It's generally a better idea to provide metadata for logs + where possible- even in small amounts. You'll be thanking yourself when it comes time to do some deep debugging. +- **Attach IDs to logs**: Any sort of identifying information can be a great help when debugging issues. So you should + try to make sure IDs like Player IDs, Asset IDs, etc., are included in your logs. ## Summary Let's recap what we've learned about Serialization: -- Serialization occurs **automatically** for ROBLOX data-types and complex data structures. -- You can **configure** your serialization with `SerializationConfig` settings. -- You can setup **custom** serialization for classes and in-house data structures. +- Serialization occurs **automatically** for ROBLOX data types and complex data structures. +- You can **configure** your serialization with `SerializationConfig` settings. +- You can setup **custom** serialization for classes and in-house data structures. diff --git a/wiki/docs/fast-breakdown.mdx b/wiki/docs/fast-breakdown.mdx index d4716ca..518b860 100644 --- a/wiki/docs/fast-breakdown.mdx +++ b/wiki/docs/fast-breakdown.mdx @@ -7,8 +7,8 @@ We'll run through all the core components of **rLog** at a mid-high level, so yo ## Instance creation -`rLog` provides a default ("global") instance that you can use, but the intended usage is to create individual instances -per file or flow. +**rLog** provides a default ("global") instance that you can use, but the intended usage is to create individual +instances per file or flow. ```ts import { rLog, rLogger } from "@rbxts/rlog"; @@ -20,7 +20,7 @@ rLogger.info("Hello world!"); const logger = new rLog(); ``` -There are also alias exports that you can use in place of `rLog`, for stylistic purposes. +There are also alias exports that you can use in place of **rLog**, for stylistic purposes. ```ts import { RLog, rLog, rlog } from "@rbxts/rlog"; @@ -38,11 +38,11 @@ There are currently five types of levels. ```ts export enum LogLevel { - VERBOSE, - DEBUG, - INFO, - WARNING, - ERROR, + VERBOSE, + DEBUG, + INFO, + WARNING, + ERROR, } ``` @@ -97,8 +97,8 @@ logger.e(); ## Configuration -**rLog** has a moderate number of configurable options available via the [RLogConfig](#) and [SerializationConfig](#) -types. +**rLog** has a moderate number of configurable options available via the [RLogConfig](api/rlog.rlogconfig) and +[SerializationConfig](api/rlog.serializationconfig) types. You can apply these in a few different ways. @@ -111,7 +111,7 @@ they all inherit upwards. import { rLog, LogLevel } from "@rbxts/rlog"; const config = { - minLogLevel: LogLevel.DEBUG, + minLogLevel: LogLevel.DEBUG, }; // Sets the default config, replacing any present values @@ -147,10 +147,10 @@ But there are also helper methods for many of the common settings that you can c ```ts const logger = new rLog() - .withConfig(myConfig) - .withMinLogLevel(LogLevel.DEBUG) - .withTag("Main") - .withContext(customContext); + .withConfig(myConfig) + .withMinLogLevel(LogLevel.DEBUG) + .withTag("Main") + .withContext(customContext); ``` :::warning @@ -194,18 +194,18 @@ import { rLog } from "@rbxts/rlog"; const logger = new rLog(); logger.debug("User purchase made", { - user: { - id: 123, - purchase: { - id: 15, - details: { - item: "Nuke", - result: Enum.ProductPurchaseDecision.PurchaseGranted, - position: new Vector3(10, 15, 20), - rotation: new CFrame(), - }, - }, - }, + user: { + id: 123, + purchase: { + id: 15, + details: { + item: "Nuke", + result: Enum.ProductPurchaseDecision.PurchaseGranted, + position: new Vector3(10, 15, 20), + rotation: new CFrame(), + }, + }, + }, }); ``` @@ -247,7 +247,7 @@ is automatically generated by **rbxts** for typescript classes, with a value of import { rLog } from "@rbxts/rlog"; class Person { - constructor(public name: string) {} + constructor(public name: string) {} } const logger = new rLog(); @@ -269,11 +269,11 @@ While you can override this behavior by providing your own `toString` method on import { rLog } from "@rbxts/rlog"; class Person { - constructor(public name: string) {} + constructor(public name: string) {} - public encode() { - return this.name; - } + public encode() { + return this.name; + } } const logger = new rLog({ serialization: { encodeMethod: "encode" } }); @@ -312,9 +312,9 @@ You can learn more about those in the [Provided Enrichers](./basics/enrichers#pr import { rLog } from "@rbxts/rlog"; function addTimestamp(entry: LogEntry): LogEntry { - entry.encoded_data["timestamp"] = DateTime.now(); + entry.encoded_data["timestamp"] = DateTime.now(); - return entry; + return entry; } const logger = new rLog({ enrichers: [addTimestamp] }); @@ -355,7 +355,7 @@ import { rLog } from "@rbxts/rlog"; import { adminList } from "./constants"; function removeAdminCalls(entry: LogEntry) { - return entry.tag === "ADMIN" && !adminList.include(entry.encoded_data.player); + return entry.tag === "ADMIN" && !adminList.include(entry.encoded_data.player); } const logger = new rLog({ sinks: [removeAdminCalls] }); @@ -371,11 +371,11 @@ import { queueLogRequest } from "./log-database"; const debug = RunService.IsStudio(); function logToDatabase(entry: LogEntry) { - const endpoint = debug ? "qa" : "prod"; + const endpoint = debug ? "qa" : "prod"; - queueLogRequest(entry, endpoint); + queueLogRequest(entry, endpoint); - return !debug; // only allow messages through while we're in studio + return !debug; // only allow messages through while we're in studio } const logger = new rLog({ sinks: [logToDatabase] }); @@ -404,11 +404,11 @@ import { rLog, LogContext } from "@rbxts/rlog"; const config = { tag: "Datastore" }; export function AddMoney(context: LogContext, player: Player, money: number) { - const logger = context.use(config); + const logger = context.use(config); - logger.i("Adding money to player save"); - // ... - logger.i("Money added"); + logger.i("Adding money to player save"); + // ... + logger.i("Money added"); } ``` @@ -419,13 +419,13 @@ import { AddMoney } from "./datastore"; const config = { tag: "PlayerActions" }; export function GiveMoney(context: LogContext, player: Player, money: number) { - const logger = context.use(config); + const logger = context.use(config); - logger.i("Giving player money", { player: player, money: money }); + logger.i("Giving player money", { player: player, money: money }); - AddMoney(context, player, money); + AddMoney(context, player, money); - logger.i("Money given to player"); + logger.i("Money given to player"); } ``` @@ -435,11 +435,11 @@ import { GiveMoney } from "./player-actions"; import { remotes } from "./remotes"; remotes.giveMoney.connect((player: Player, money: number) => { - const context = LogContext.start(); + const context = LogContext.start(); - GiveMoney(context, player, money); + GiveMoney(context, player, money); - context.stop(); + context.stop(); }); ``` @@ -472,10 +472,10 @@ import { GiveMoney } from "./player-actions"; import { remotes } from "./remotes"; remotes.giveMoney.connect((player: Player, money: number) => { - // automatically starts and stops the context - withLogContext((context) => { - GiveMoney(context, player, money); - }); + // automatically starts and stops the context + withLogContext((context) => { + GiveMoney(context, player, money); + }); }); ``` @@ -494,12 +494,12 @@ rLog.UpdateDefaultConfig({ minLogLevel: WARNING }); const config = { contextBypass: true, suspendContext: true }; withContext((context) => { - const logger = context.use(config); + const logger = context.use(config); - logger.d("Some extra data"); - logger.i("Doing stuff"); - logger.w("Something happened"); - logger.i("Done"); + logger.d("Some extra data"); + logger.i("Doing stuff"); + logger.w("Something happened"); + logger.i("Done"); }); ``` @@ -520,7 +520,7 @@ withContext((context) => { Since a `WARNING` message was sent through the context before it stopped, the rest of the messages in the context that usually wouldn't have been sent were also sent. -This can be a huge help in avoiding extra verbose logs until you actually need them (ie; when debugging). +This can be a huge help in avoiding extra verbose logs until you actually need them (i.e., when debugging). ### Correlation IDs @@ -535,11 +535,11 @@ import { rLog, LogContext } from "@rbxts/rlog"; const config = { tag: "Datastore" }; export function AddMoney(context: LogContext, player: Player, money: number) { - const logger = context.use(config); + const logger = context.use(config); - logger.i("Adding money to player save"); - // ... - logger.i("Money added"); + logger.i("Adding money to player save"); + // ... + logger.i("Money added"); } ``` @@ -550,13 +550,13 @@ import { AddMoney } from "./datastore"; const config = { tag: "PlayerActions" }; export function GiveMoney(context: LogContext, player: Player, money: number) { - const logger = context.use(config); + const logger = context.use(config); - logger.i("Giving player money", { player: player, money: money }); + logger.i("Giving player money", { player: player, money: money }); - AddMoney(context, player, money); + AddMoney(context, player, money); - logger.i("Money given to player"); + logger.i("Money given to player"); } ``` @@ -566,9 +566,9 @@ import { GiveMoney } from "./player-actions"; import { remotes } from "./remotes"; remotes.giveMoney.connect((player: Player, money: number) => { - withLogContext((context) => { - GiveMoney(context, player, money); - }); + withLogContext((context) => { + GiveMoney(context, player, money); + }); }); ``` @@ -596,9 +596,10 @@ With Correlation IDs, you can retrieve the logs of a particular run without the ## Learning more -If you have any pending questions or want to learn more, you can read through our [API reference](#), which includes +If you have any pending questions or want to learn more, you can read through our [API reference](api), which includes documentation for the entire public API. Alternatively, you can sift through our [comprehensive wiki/guide](category/guides). -Or if you're more of a practical learner, take a look at our [example](#) to see how **rLog** can be used in practice. +Or if you're more of a practical learner, take a look at our [example](https://github.com/daymxn/rlog/tree/main/example) +to see how **rLog** can be used in practice. diff --git a/wiki/docs/quick-start.mdx b/wiki/docs/quick-start.mdx index e83d957..80e6ff0 100644 --- a/wiki/docs/quick-start.mdx +++ b/wiki/docs/quick-start.mdx @@ -3,14 +3,14 @@ import TabItem from "@theme/TabItem"; # Quick Start -**rLog** is a context based server-side logging framework for ROBLOX, designed to help organize and structure your +**rLog** is a Context-based server-side logging framework for ROBLOX, designed to help organize and structure your logging process. This guide will walk you through the basics of getting started, in just a few steps. ## Installation -First, install `rlog` with your preferred package manager: +First, install **rLog** with your preferred package manager: @@ -33,14 +33,6 @@ pnpm add @rbxts/rlog yarn add @rbxts/rlog ``` - - - -```toml title="wally.toml" -[dependencies] -Reflex = "daymxn/rlog@1.0.0" -``` - @@ -85,8 +77,8 @@ By passing a table as the second parameter to your logging method, you can optio ```ts logger.info("Hello world!", { - user: "Daymon", - action: "start", + user: "Daymon", + action: "start", }); ``` @@ -106,8 +98,8 @@ The table you pass is automatically encoded, and even supports ROBLOX data types ```ts logger.info("Hello world!", { - position: new Vector3(1, 5, 10), - rotation: new CFrame(), + position: new Vector3(1, 5, 10), + rotation: new CFrame(), }); ``` @@ -131,17 +123,17 @@ import { rLog, LogLevel } from "@rbxts/rlog"; // Advanced setup with custom serialization and enrichers const logger = new rLog({ - minLogLevel: LogLevel.WARNING, - tag: "Main", - enrichers: [ - (entry) => { - entry.encoded_data.timestamp = DateTime.now().ToIsoDate(); - return entry; - }, - ], - serialization: { - encodeFunctions: true, - }, + minLogLevel: LogLevel.WARNING, + tag: "Main", + enrichers: [ + (entry) => { + entry.encoded_data.timestamp = DateTime.now().ToIsoDate(); + return entry; + }, + ], + serialization: { + encodeFunctions: true, + }, }); ``` @@ -149,8 +141,8 @@ const logger = new rLog({ If you're wanting to learn more, feel free to check out any of the following resources: -- [Fast Breakdown](fast-breakdown) -- [API Reference](#) -- [Basic Guides](basics/log-entries) -- [Advanced Guides](advanced/source-metadata) -- [Setting up Google Cloud Logging](advanced/google-cloud-logging) +- [Fast Breakdown](fast-breakdown) +- [API Reference](api) +- [Basic Guides](basics/log-entries) +- [Advanced Guides](advanced/source-metadata) +- [Setting up Google Cloud Logging](advanced/google-cloud-logging) diff --git a/wiki/docusaurus.config.ts b/wiki/docusaurus.config.ts index 8513226..2ba2988 100644 --- a/wiki/docusaurus.config.ts +++ b/wiki/docusaurus.config.ts @@ -5,7 +5,7 @@ import { themes as prismThemes } from "prism-react-renderer"; const config: Config = { title: "rLog", - tagline: "Context based Server-Side logging for ROBLOX.", + tagline: "Context-based server-side logging for ROBLOX.", favicon: "img/favicon.ico", url: "https://rlog.daymxn.com", baseUrl: "/",