From f5e852b2d4a4ac6e5944c19b318896f6eb1eb29f Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 10 Feb 2024 23:21:31 +0900 Subject: [PATCH] chore: bump to bebop@next --- .env | 2 +- examples/typescript/minimal/bebop.json | 21 ++- examples/typescript/minimal/package.json | 16 +-- examples/typescript/minimal/shared/index.ts | 150 ++++++++++++++++++-- typescript/package.json | 10 +- typescript/packages/cf-router/package.json | 4 +- typescript/packages/client/package.json | 4 +- typescript/packages/common/package.json | 4 +- typescript/packages/common/src/index.ts | 3 + typescript/packages/common/src/logger.ts | 4 +- typescript/packages/common/src/time.test.ts | 14 ++ typescript/packages/common/src/time.ts | 45 ++++++ typescript/packages/common/src/utils.ts | 8 ++ typescript/packages/common/src/version.ts | 2 +- typescript/packages/node-http/package.json | 4 +- typescript/packages/server/package.json | 4 +- typescript/yarn.lock | 16 +-- 17 files changed, 254 insertions(+), 57 deletions(-) create mode 100644 typescript/packages/common/src/time.test.ts create mode 100644 typescript/packages/common/src/time.ts diff --git a/.env b/.env index 31e0a0c..4296b3e 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -VERSION=0.0.10 \ No newline at end of file +VERSION=0.0.11-alpha diff --git a/examples/typescript/minimal/bebop.json b/examples/typescript/minimal/bebop.json index 6bc9167..b095f34 100644 --- a/examples/typescript/minimal/bebop.json +++ b/examples/typescript/minimal/bebop.json @@ -1,14 +1,9 @@ { - "inputFiles": [ - "./shared/greeter.bop" - ], - "exclude": [ - "node_modules" - ], - "generators": [ - { - "alias": "ts", - "outFile": "./shared/index.ts" - } - ] -} \ No newline at end of file + "include": ["**/*.bop"], + "exclude": ["node_modules"], + "generators": { + "ts": { + "outFile": "./shared/index.ts" + } + } +} diff --git a/examples/typescript/minimal/package.json b/examples/typescript/minimal/package.json index afff745..c8bf123 100644 --- a/examples/typescript/minimal/package.json +++ b/examples/typescript/minimal/package.json @@ -4,11 +4,11 @@ "version": "0.0.1", "type": "module", "scripts": { - "build:server": "bebopc && tsup ./server/index.ts --out-dir ./dist/server/", - "dev:server": "bebopc && tsx watch server", - "dev:client": "bebopc && wait-port 3000 && tsx watch client", + "build:server": "bebopc build && tsup ./server/index.ts --out-dir ./dist/server/", + "dev:server": "bebopc build && tsx watch server", + "dev:client": "bebopc build && wait-port 3000 && tsx watch client", "dev:browser": "yarn webpack serve --mode development --open --hot", - "start:server": "bebopc && node ./dist/server/index.cjs", + "start:server": "bebopc build && node ./dist/server/index.cjs", "build:browser": "webpack --mode production" }, "workspaces": [ @@ -19,15 +19,15 @@ ], "devDependencies": { "@types/node": "^18.7.20", - "bebop-tools": "^2.8.5", + "bebop-tools": "^3.0.3-beta.2", "tsup": "^6.7.0", "tsx": "^3.12.7", "typescript": "^4.8.3", "wait-port": "^1.0.4" }, "dependencies": { - "@tempojs/client": "^0.0.10", - "@tempojs/node-http-router": "^0.0.10", - "bebop": "^2.8.5" + "@tempojs/client": "^0.0.11-alpha", + "@tempojs/node-http-router": "^0.0.11-alpha", + "bebop": "3.0.3-beta.2" } } diff --git a/examples/typescript/minimal/shared/index.ts b/examples/typescript/minimal/shared/index.ts index 21850b4..31a345c 100644 --- a/examples/typescript/minimal/shared/index.ts +++ b/examples/typescript/minimal/shared/index.ts @@ -4,21 +4,39 @@ // // // bebopc version: -// 2.7.0 +// 3.0.3-beta.1 // // // bebopc source: -// https://github.com/RainwayApp/bebop +// https://github.com/betwixt-labs/bebop // // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -import { BebopView, BebopRuntimeError, BebopRecord } from "bebop"; +import { BebopView, BebopRuntimeError, BebopRecord, BebopJson, BebopTypeGuard, Guid, GuidMap } from "bebop"; import { Metadata, MethodType } from "@tempojs/common"; import { BaseClient, MethodInfo, CallOptions } from "@tempojs/client"; import { ServiceRegistry, BaseService, ServerContext, BebopMethodAny, BebopMethod } from "@tempojs/server"; +export const BEBOP_SCHEMA = new Uint8Array([ +3, 2, 0, 0, 0, 72, 101, 108, 108, 111, 82, 101, 113, 117, +101, 115, 116, 0, 1, 0, 0, 4, 0, 0, 0, 0, 1, 110, 97, 109, +101, 0, 245, 255, 255, 255, 0, 72, 101, 108, 108, 111, 82, +101, 115, 112, 111, 110, 115, 101, 0, 1, 0, 0, 4, 0, 0, 0, +0, 1, 115, 101, 114, 118, 105, 99, 101, 77, 101, 115, 115, +97, 103, 101, 0, 245, 255, 255, 255, 0, 1, 0, 0, 0, 71, +114, 101, 101, 116, 101, 114, 0, 0, 4, 0, 0, 0, 115, 97, +121, 72, 101, 108, 108, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, +0, 85, 246, 254, 77, 115, 97, 121, 72, 101, 108, 108, 111, +67, 108, 105, 101, 110, 116, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, +0, 196, 25, 111, 204, 115, 97, 121, 72, 101, 108, 108, +111, 83, 101, 114, 118, 101, 114, 0, 0, 1, 0, 0, 0, 0, 1, +0, 0, 0, 84, 166, 66, 202, 115, 97, 121, 72, 101, 108, +108, 111, 68, 117, 112, 108, 101, 120, 0, 0, 3, 0, 0, 0, +0, 1, 0, 0, 0, 66, 158, 17, 152 +]); + /** * `HelloRequest` is a struct representing a request to the Greeter service. */ @@ -26,16 +44,62 @@ export interface IHelloRequest extends BebopRecord { /** * The name to be used in the greeting, of type string. */ - name: string; + readonly name: string; } export class HelloRequest implements IHelloRequest { - public name: string; + public readonly name: string; constructor(record: IHelloRequest) { this.name = record.name; } + /** + * Serializes the current instance into a JSON-Over-Bebop string + */ + public toJSON(): string { + return HelloRequest.encodeToJSON(this); + } + + /** + * Serializes the specified object into a JSON-Over-Bebop string + */ + public static encodeToJSON(record: IHelloRequest): string { + return JSON.stringify(record, BebopJson.replacer); + } + + /** + * Validates that the runtime types of members in the current instance are correct. + */ + public validateTypes(): void { + HelloRequest.validateCompatibility(this); + } + + /** + * Validates that the specified dynamic object can become an instance of {@link HelloRequest}. + */ + public static validateCompatibility(record: IHelloRequest): void { + BebopTypeGuard.ensureString(record.name) + } + + /** + * Unsafely creates an instance of {@link HelloRequest} from the specified dynamic object. No type checking is performed. + */ + public static unsafeCast(record: any): IHelloRequest { + return new HelloRequest(record); + } + + /** + * Creates a new {@link HelloRequest} instance from a JSON-Over-Bebop string. Type checking is performed. + */ + public static fromJSON(json: string): IHelloRequest { + if (typeof json !== 'string' || json.trim().length === 0) { + throw new BebopRuntimeError(`HelloRequest.fromJSON: expected string`); + } + const parsed = JSON.parse(json, BebopJson.reviver); + HelloRequest.validateCompatibility(parsed); + return HelloRequest.unsafeCast(parsed); + } public encode(): Uint8Array { return HelloRequest.encode(this); } @@ -66,7 +130,7 @@ export class HelloRequest implements IHelloRequest { let message: IHelloRequest = { name: field0, }; - return new this(message); + return new HelloRequest(message); } } @@ -77,16 +141,62 @@ export interface IHelloResponse extends BebopRecord { /** * The greeting message generated by the service, of type string. */ - serviceMessage: string; + readonly serviceMessage: string; } export class HelloResponse implements IHelloResponse { - public serviceMessage: string; + public readonly serviceMessage: string; constructor(record: IHelloResponse) { this.serviceMessage = record.serviceMessage; } + /** + * Serializes the current instance into a JSON-Over-Bebop string + */ + public toJSON(): string { + return HelloResponse.encodeToJSON(this); + } + + /** + * Serializes the specified object into a JSON-Over-Bebop string + */ + public static encodeToJSON(record: IHelloResponse): string { + return JSON.stringify(record, BebopJson.replacer); + } + + /** + * Validates that the runtime types of members in the current instance are correct. + */ + public validateTypes(): void { + HelloResponse.validateCompatibility(this); + } + + /** + * Validates that the specified dynamic object can become an instance of {@link HelloResponse}. + */ + public static validateCompatibility(record: IHelloResponse): void { + BebopTypeGuard.ensureString(record.serviceMessage) + } + + /** + * Unsafely creates an instance of {@link HelloResponse} from the specified dynamic object. No type checking is performed. + */ + public static unsafeCast(record: any): IHelloResponse { + return new HelloResponse(record); + } + + /** + * Creates a new {@link HelloResponse} instance from a JSON-Over-Bebop string. Type checking is performed. + */ + public static fromJSON(json: string): IHelloResponse { + if (typeof json !== 'string' || json.trim().length === 0) { + throw new BebopRuntimeError(`HelloResponse.fromJSON: expected string`); + } + const parsed = JSON.parse(json, BebopJson.reviver); + HelloResponse.validateCompatibility(parsed); + return HelloResponse.unsafeCast(parsed); + } public encode(): Uint8Array { return HelloResponse.encode(this); } @@ -117,7 +227,7 @@ export class HelloResponse implements IHelloResponse { let message: IHelloResponse = { serviceMessage: field0, }; - return new this(message); + return new HelloResponse(message); } } @@ -178,6 +288,8 @@ export class TempoServiceRegistry extends ServiceRegistry { invoke: service.sayHello, serialize: HelloResponse.encode, deserialize: HelloRequest.decode, + toJSON: HelloResponse.encodeToJSON, + fromJSON: HelloRequest.fromJSON, type: MethodType.Unary, } as BebopMethod); if (this.methods.has(3429833156)) { @@ -190,6 +302,8 @@ export class TempoServiceRegistry extends ServiceRegistry { invoke: service.sayHelloClient, serialize: HelloResponse.encode, deserialize: HelloRequest.decode, + toJSON: HelloResponse.encodeToJSON, + fromJSON: HelloRequest.fromJSON, type: MethodType.ClientStream, } as BebopMethod); if (this.methods.has(3393365588)) { @@ -202,6 +316,8 @@ export class TempoServiceRegistry extends ServiceRegistry { invoke: service.sayHelloServer, serialize: HelloResponse.encode, deserialize: HelloRequest.decode, + toJSON: HelloResponse.encodeToJSON, + fromJSON: HelloRequest.fromJSON, type: MethodType.ServerStream, } as BebopMethod); if (this.methods.has(2551291458)) { @@ -214,6 +330,8 @@ export class TempoServiceRegistry extends ServiceRegistry { invoke: service.sayHelloDuplex, serialize: HelloResponse.encode, deserialize: HelloRequest.decode, + toJSON: HelloResponse.encodeToJSON, + fromJSON: HelloRequest.fromJSON, type: MethodType.DuplexStream, } as BebopMethod); } @@ -231,10 +349,13 @@ export interface IGreeterClient { */ sayHello(request: IHelloRequest): Promise; sayHello(request: IHelloRequest, metadata: Metadata): Promise; + sayHelloClient(request: () => AsyncGenerator): Promise; sayHelloClient(request: () => AsyncGenerator, metadata: Metadata): Promise; + sayHelloServer(request: IHelloRequest): Promise>; sayHelloServer(request: IHelloRequest, metadata: Metadata): Promise>; + sayHelloDuplex(request: () => AsyncGenerator): Promise>; sayHelloDuplex(request: () => AsyncGenerator, metadata: Metadata): Promise>; } @@ -249,6 +370,8 @@ export class GreeterClient extends BaseClient implements IGreeterClient { id: 1308554837, serialize: HelloRequest.encode, deserialize: HelloResponse.decode, + toJSON: HelloRequest.encodeToJSON, + fromJSON: HelloResponse.fromJSON, type: MethodType.Unary, } /** @@ -265,8 +388,11 @@ export class GreeterClient extends BaseClient implements IGreeterClient { id: 3429833156, serialize: HelloRequest.encode, deserialize: HelloResponse.decode, + toJSON: HelloRequest.encodeToJSON, + fromJSON: HelloResponse.fromJSON, type: MethodType.ClientStream, } + async sayHelloClient(request: () => AsyncGenerator): Promise; async sayHelloClient(request: () => AsyncGenerator, options: CallOptions): Promise; async sayHelloClient(request: () => AsyncGenerator, options?: CallOptions): Promise { @@ -278,8 +404,11 @@ export class GreeterClient extends BaseClient implements IGreeterClient { id: 3393365588, serialize: HelloRequest.encode, deserialize: HelloResponse.decode, + toJSON: HelloRequest.encodeToJSON, + fromJSON: HelloResponse.fromJSON, type: MethodType.ServerStream, } + async sayHelloServer(request: IHelloRequest): Promise>; async sayHelloServer(request: IHelloRequest, options: CallOptions): Promise>; async sayHelloServer(request: IHelloRequest, options?: CallOptions): Promise> { @@ -291,8 +420,11 @@ export class GreeterClient extends BaseClient implements IGreeterClient { id: 2551291458, serialize: HelloRequest.encode, deserialize: HelloResponse.decode, + toJSON: HelloRequest.encodeToJSON, + fromJSON: HelloResponse.fromJSON, type: MethodType.DuplexStream, } + async sayHelloDuplex(request: () => AsyncGenerator): Promise>; async sayHelloDuplex(request: () => AsyncGenerator, options: CallOptions): Promise>; async sayHelloDuplex(request: () => AsyncGenerator, options?: CallOptions): Promise> { diff --git a/typescript/package.json b/typescript/package.json index 3712783..c55ce30 100644 --- a/typescript/package.json +++ b/typescript/package.json @@ -1,6 +1,6 @@ { "name": "tempojs", - "version": "0.0.10", + "version": "0.0.11-alpha", "description": "something", "private": true, "workspaces": [ @@ -22,12 +22,12 @@ "prettier": "^2.8.0", "ts-node": "^10.9.1", "tsup": "^6.7.0", - "typescript": "^5.0.4", + "typescript": "^5.3.3", "vitest": "^0.30.1" }, "dependencies": { - "@tempojs/client": "^0.0.10", - "@tempojs/common": "^0.0.10", - "@tempojs/server": "^0.0.10" + "@tempojs/client": "^0.0.11-alpha", + "@tempojs/common": "^0.0.11-alpha", + "@tempojs/server": "^0.0.11-alpha" } } diff --git a/typescript/packages/cf-router/package.json b/typescript/packages/cf-router/package.json index 563907f..f0c5bd1 100644 --- a/typescript/packages/cf-router/package.json +++ b/typescript/packages/cf-router/package.json @@ -1,6 +1,6 @@ { "name": "@tempojs/cloudflare-worker-router", - "version": "0.0.10", + "version": "0.0.11-alpha", "description": "", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -19,7 +19,7 @@ "author": "andrew", "license": "", "dependencies": { - "@tempojs/server": "^0.0.10" + "@tempojs/server": "^0.0.11-alpha" }, "devDependencies": { "@cloudflare/workers-types": "^4.20221111.1" diff --git a/typescript/packages/client/package.json b/typescript/packages/client/package.json index 7e620ff..8e494c5 100644 --- a/typescript/packages/client/package.json +++ b/typescript/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@tempojs/client", - "version": "0.0.10", + "version": "0.0.11-alpha", "description": "xrpc client", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -16,6 +16,6 @@ "test": "vitest" }, "dependencies": { - "@tempojs/common": "^0.0.10" + "@tempojs/common": "^0.0.11-alpha" } } diff --git a/typescript/packages/common/package.json b/typescript/packages/common/package.json index 56397f6..c7b207f 100644 --- a/typescript/packages/common/package.json +++ b/typescript/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@tempojs/common", - "version": "0.0.10", + "version": "0.0.11-alpha", "description": "tempo common", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -13,7 +13,7 @@ } }, "dependencies": { - "bebop": "^2.8.5" + "bebop": "^3.0.3-beta.2" }, "scripts": { "test": "vitest" diff --git a/typescript/packages/common/src/index.ts b/typescript/packages/common/src/index.ts index 9ec6cb2..7d16338 100644 --- a/typescript/packages/common/src/index.ts +++ b/typescript/packages/common/src/index.ts @@ -12,6 +12,7 @@ import { MethodType } from './flags'; import { HookRegistry } from './hook'; import { Base64 } from './base64'; +import { Clock, EndTimer } from './time'; export { TempoStatusCode, @@ -33,4 +34,6 @@ export { HookRegistry, Base64, BebopContentType, + Clock, + EndTimer, }; diff --git a/typescript/packages/common/src/logger.ts b/typescript/packages/common/src/logger.ts index 42d89fc..e58d6ec 100644 --- a/typescript/packages/common/src/logger.ts +++ b/typescript/packages/common/src/logger.ts @@ -226,8 +226,8 @@ export abstract class TempoLogger { * ``` */ export class ConsoleLogger extends TempoLogger { - constructor(sourceName: string, logLevel: TempoLogLevel = TempoLogLevel.Debug) { - super(sourceName, logLevel); + constructor(sourceName: string, logLevel: TempoLogLevel = TempoLogLevel.Debug, parent?: TempoLogger) { + super(sourceName, logLevel, parent); } /** diff --git a/typescript/packages/common/src/time.test.ts b/typescript/packages/common/src/time.test.ts new file mode 100644 index 0000000..32cd93c --- /dev/null +++ b/typescript/packages/common/src/time.test.ts @@ -0,0 +1,14 @@ +import { Clock } from './time'; +import { describe, it, expect } from 'vitest'; + +describe('Timer Module', () => { + it('startTimer should return a function that calculates elapsed time', async () => { + const endTimer = Clock.startTimer(); + await new Promise((resolve) => setTimeout(resolve, 100)); + const elapsed = endTimer(); + // it should have been at least 100ms, but we allow some leeway + expect(elapsed).toBeGreaterThanOrEqual(90); + // it should not have taken more than 150ms + expect(elapsed).toBeLessThan(150); + }); +}); diff --git a/typescript/packages/common/src/time.ts b/typescript/packages/common/src/time.ts new file mode 100644 index 0000000..f8fa7b0 --- /dev/null +++ b/typescript/packages/common/src/time.ts @@ -0,0 +1,45 @@ +import { ExecutionEnvironment } from './utils'; + +// Determine the most precise timing function available +const hasPerformanceNow = + typeof performance !== 'undefined' && 'now' in performance && typeof performance.now === 'function'; +const useProcessHrTime = !hasPerformanceNow && ExecutionEnvironment.isNode; +const useDateNow = !hasPerformanceNow && !useProcessHrTime; +export type EndTimer = () => number; +// Universal timing method +// The now and startTimer functions remain the same +const internal_now = hasPerformanceNow + ? performance.now.bind(performance) + : useProcessHrTime + ? process.hrtime.bind(process) + : Date.now; + +export const Clock = { + /** + * Returns a function that calculates the elapsed time since the startTimer function was called. + * The timing function used is determined by the most precise timing function available. + * @returns {EndTimer} A function that returns the elapsed time in milliseconds. + */ + startTimer: (): EndTimer => { + const startTime = internal_now() as unknown; + return () => { + if (useDateNow || hasPerformanceNow) { + return (internal_now() as number) - (startTime as number); + } else if (useProcessHrTime) { + const hrTime = process.hrtime(startTime as [number, number]); + return hrTime[0] * 1000 + hrTime[1] / 1e6; // convert to milliseconds + } + return -1; + }; + }, + /** + * Returns the current Unix timestamp with high resolution. + * The timing function used is performance.now() and performance.timeOrigin. + * @returns {number} The current Unix timestamp in seconds. + */ + highResUnixTimestamp: (): number => { + const timeOrigin = performance.timeOrigin; + const now = performance.now(); + return (timeOrigin + now) / 1000; // in seconds + }, +}; diff --git a/typescript/packages/common/src/utils.ts b/typescript/packages/common/src/utils.ts index dedab93..f90059a 100644 --- a/typescript/packages/common/src/utils.ts +++ b/typescript/packages/common/src/utils.ts @@ -50,6 +50,10 @@ export const ExecutionEnvironment = { * True if the current environment is Bun, otherwise false. */ isBun: typeof Bun !== 'undefined' && typeof Bun.version !== 'undefined', + /** + * True if the current environment is Cloudflare Workers, otherwise false. + */ + isCloudflareWorker: typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers', }; /** @@ -138,6 +142,10 @@ export const TempoUtil = { return 'bun'; } else if (ExecutionEnvironment.isJsDom) { return 'jsdom'; + } else if (ExecutionEnvironment.isDeno) { + return 'deno'; + } else if (ExecutionEnvironment.isCloudflareWorker) { + return 'workerd'; } return 'unknown'; }, diff --git a/typescript/packages/common/src/version.ts b/typescript/packages/common/src/version.ts index f404e8a..fd31037 100644 --- a/typescript/packages/common/src/version.ts +++ b/typescript/packages/common/src/version.ts @@ -1 +1 @@ -export const TempoVersion = '0.0.10'; +export const TempoVersion = '0.0.11-alpha'; diff --git a/typescript/packages/node-http/package.json b/typescript/packages/node-http/package.json index 22f71e7..da8301d 100644 --- a/typescript/packages/node-http/package.json +++ b/typescript/packages/node-http/package.json @@ -1,6 +1,6 @@ { "name": "@tempojs/node-http-router", - "version": "0.0.10", + "version": "0.0.11-alpha", "description": "tempo node http", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -19,6 +19,6 @@ "@types/node": "^14.14.31" }, "dependencies": { - "@tempojs/server": "^0.0.10" + "@tempojs/server": "^0.0.11-alpha" } } diff --git a/typescript/packages/server/package.json b/typescript/packages/server/package.json index c0045e0..c6bcca6 100644 --- a/typescript/packages/server/package.json +++ b/typescript/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@tempojs/server", - "version": "0.0.10", + "version": "0.0.11-alpha", "description": "tempo server", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -16,6 +16,6 @@ "test": "vitest" }, "dependencies": { - "@tempojs/common": "^0.0.10" + "@tempojs/common": "^0.0.11-alpha" } } diff --git a/typescript/yarn.lock b/typescript/yarn.lock index 1d5fffc..0eb49ee 100644 --- a/typescript/yarn.lock +++ b/typescript/yarn.lock @@ -552,10 +552,10 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bebop@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/bebop/-/bebop-2.8.5.tgz#5ccabc44100d9ba309698567e4dee44d15e6dc06" - integrity sha512-mWctvJeE7DLIHItjdbuBotpOisim4ZXz7nOiEbbnIZCO2fFie+9T0GSc00jGPOdi9sm0XppecsLl5KSyNf0RKw== +bebop@^3.0.3-beta.2: + version "3.0.3-beta.2" + resolved "https://registry.yarnpkg.com/bebop/-/bebop-3.0.3-beta.2.tgz#a4a5ddbc881965044fff2416180d54c9703a4f93" + integrity sha512-0iry/8PbC1t4iHcGcZKposKuXZkYxhRNmAz0yHjzkWmrZ8Ko7kDF8hUGpUuK5ulRLhbt7BV9EKKmNpYxBiSl0g== benchmark@^2.1.4: version "2.1.4" @@ -1909,10 +1909,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^5.0.4: - version "5.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" - integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== ufo@^1.1.2: version "1.1.2"