From 231694bc7d97e37d4a6cc4a203cfe5393c34d406 Mon Sep 17 00:00:00 2001 From: evermake Date: Wed, 13 May 2026 15:06:40 +0500 Subject: [PATCH 01/16] feat: migrate codebase to Effect v4 --- package.json | 8 ++-- pnpm-lock.yaml | 74 ++++++++++++++++++++------------- src/Bot.ts | 2 +- src/BotApi.ts | 38 +++++++---------- src/BotApiError.ts | 35 +++++++--------- src/BotApiTransport.ts | 14 +++---- src/BotApiUrl.ts | 2 +- src/Content.ts | 74 ++++++++++++++++----------------- src/Dialog.ts | 14 +++---- src/File.ts | 10 ++--- src/Markup.ts | 4 +- src/Reply.ts | 4 +- src/Send.ts | 56 ++++++++++++------------- src/internal/botApi.ts | 2 +- src/internal/botApiTransport.ts | 9 ++-- src/internal/file.ts | 2 +- src/internal/runner.ts | 4 +- test/BotApi.test.ts | 32 +++++--------- 18 files changed, 182 insertions(+), 202 deletions(-) diff --git a/package.json b/package.json index 4f3aa3b..bb42bdf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@grom.js/effect-tg", "type": "module", - "version": "0.17.1", + "version": "1.0.0-beta.1", "packageManager": "pnpm@10.25.0", "description": "Effectful library for crafting Telegram bots.", "author": { @@ -44,20 +44,18 @@ "release": "bumpp" }, "peerDependencies": { - "@effect/platform": "^0.96.0", "@grom.js/tgx": "^1.0.0", - "effect": "^3.0.0" + "effect": "^4.0.0-beta.64" }, "devDependencies": { "@antfu/eslint-config": "7.7.3", "@effect/language-service": "0.85.1", - "@effect/platform": "0.96.1", "@grom.js/bot-api-spec": "0.10.1", "@grom.js/tgx": "1.4.3", "@types/node": "22.19.18", "@vitest/coverage-v8": "4.1.5", "bumpp": "11.1.0", - "effect": "3.21.2", + "effect": "4.0.0-beta.64", "eslint": "9.39.4", "eslint-plugin-format": "2.0.1", "knip": "6.12.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4c0141..fd22680 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: '@effect/language-service': specifier: 0.85.1 version: 0.85.1 - '@effect/platform': - specifier: 0.96.1 - version: 0.96.1(effect@3.21.2) '@grom.js/bot-api-spec': specifier: 0.10.1 version: 0.10.1 @@ -33,8 +30,8 @@ importers: specifier: 11.1.0 version: 11.1.0 effect: - specifier: 3.21.2 - version: 3.21.2 + specifier: 4.0.0-beta.64 + version: 4.0.0-beta.64 eslint: specifier: 9.39.4 version: 9.39.4(jiti@2.7.0) @@ -182,11 +179,6 @@ packages: resolution: {integrity: sha512-EXnJjIy6zQ3nUO/MZ+ynWUb8B895KZPotd1++oTs9JjDkplwM7cb6zo8Zq2zU6piwq+KflO7amXbEfj1UMpHkw==} hasBin: true - '@effect/platform@0.96.1': - resolution: {integrity: sha512-cjB1QZZYEP8JXCFNGvBLVi0T6YUBQTmOVEUA3SDbiQ6RUO+p6CE3eyD2vMWmrz5nE8yY5QSAuOV9v0boEcUv+A==} - peerDependencies: - effect: ^3.21.2 - '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -1405,8 +1397,8 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - effect@3.21.2: - resolution: {integrity: sha512-rXd2FGDM8KdjSIrc+mqEELo7ScW7xTVxEf1iInmPSpIde9/nyGuFM710cjTo7/EreGXiUX2MOonPpprbz2XHCg==} + effect@4.0.0-beta.64: + resolution: {integrity: sha512-xI332I9guVLsqvLg7aO62IuWq9LiCMs+u5dhr4JDyND2ndYXAk5eaR8KMqtYLoJg1Ie28VQToYPM+xBLEBU3pQ==} electron-to-chromium@1.5.250: resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} @@ -1669,9 +1661,9 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - fast-check@3.23.2: - resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} - engines: {node: '>=8.0.0'} + fast-check@4.7.0: + resolution: {integrity: sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==} + engines: {node: '>=12.17.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1804,6 +1796,10 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + is-builtin-module@5.0.0: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} @@ -1879,6 +1875,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + kubernetes-types@1.30.0: + resolution: {integrity: sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2220,8 +2219,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@8.4.0: + resolution: {integrity: sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==} quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -2382,6 +2381,10 @@ packages: resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + toml@4.1.1: + resolution: {integrity: sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==} + engines: {node: '>=20'} + ts-api-utils@2.4.0: resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} @@ -2448,6 +2451,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@13.0.2: + resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} + hasBin: true + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2690,13 +2697,6 @@ snapshots: '@effect/language-service@0.85.1': {} - '@effect/platform@0.96.1(effect@3.21.2)': - dependencies: - effect: 3.21.2 - find-my-way-ts: 0.1.6 - msgpackr: 1.11.12 - multipasta: 0.2.7 - '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -3711,10 +3711,18 @@ snapshots: diff-sequences@29.6.3: {} - effect@3.21.2: + effect@4.0.0-beta.64: dependencies: '@standard-schema/spec': 1.1.0 - fast-check: 3.23.2 + fast-check: 4.7.0 + find-my-way-ts: 0.1.6 + ini: 6.0.0 + kubernetes-types: 1.30.0 + msgpackr: 1.11.12 + multipasta: 0.2.7 + toml: 4.1.1 + uuid: 13.0.2 + yaml: 2.8.4 electron-to-chromium@1.5.250: {} @@ -4080,9 +4088,9 @@ snapshots: exsolve@1.0.8: {} - fast-check@3.23.2: + fast-check@4.7.0: dependencies: - pure-rand: 6.1.0 + pure-rand: 8.4.0 fast-deep-equal@3.1.3: {} @@ -4184,6 +4192,8 @@ snapshots: indent-string@5.0.0: {} + ini@6.0.0: {} + is-builtin-module@5.0.0: dependencies: builtin-modules: 5.0.0 @@ -4258,6 +4268,8 @@ snapshots: yaml: 2.8.3 zod: 4.1.13 + kubernetes-types@1.30.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -4842,7 +4854,7 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.1.0: {} + pure-rand@8.4.0: {} quansync@0.2.11: {} @@ -5005,6 +5017,8 @@ snapshots: dependencies: eslint-visitor-keys: 5.0.0 + toml@4.1.1: {} + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -5078,6 +5092,8 @@ snapshots: util-deprecate@1.0.2: {} + uuid@13.0.2: {} + vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4): dependencies: esbuild: 0.27.2 diff --git a/src/Bot.ts b/src/Bot.ts index e8f214e..33abca9 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -6,7 +6,7 @@ export type Bot = Effect.Effect export interface Update extends Readonly {} -export const Update: Context.Tag = Context.GenericTag('@grom.js/effect-tg/Bot/Update') +export const Update: Context.Service = Context.Service('@grom.js/effect-tg/Bot/Update') export interface Middleware { (self: Bot): Bot diff --git a/src/BotApi.ts b/src/BotApi.ts index 12e2fe1..3c0c085 100644 --- a/src/BotApi.ts +++ b/src/BotApi.ts @@ -1,5 +1,4 @@ import type * as Config from 'effect/Config' -import type * as ConfigError from 'effect/ConfigError' import type * as BotApiError from './BotApiError.ts' import type { MethodParams, @@ -7,12 +6,12 @@ import type { BotApi as Service, Types, } from './internal/botApi.gen.ts' -import * as HttpClient from '@effect/platform/HttpClient' import * as Context from 'effect/Context' import * as Effect from 'effect/Effect' import * as Function from 'effect/Function' import * as Layer from 'effect/Layer' import * as Redacted from 'effect/Redacted' +import * as HttpClient from 'effect/unstable/http/HttpClient' import * as BotApiTransport from './BotApiTransport.ts' import * as BotApiUrl from './BotApiUrl.ts' import * as internal from './internal/botApi.ts' @@ -21,7 +20,7 @@ export type { MethodParams, MethodResults, Types } export interface BotApi extends Readonly {} -export const BotApi: Context.Tag = Context.GenericTag('@grom.js/effect-tg/BotApi') +export const BotApi: Context.Service = Context.Service('@grom.js/effect-tg/BotApi') export interface BotApiMethod { (...args: MethodArgs): Effect.Effect< @@ -41,9 +40,7 @@ export const callMethod: ( > = ( method: string, params: unknown = undefined, -) => BotApi.pipe( - Effect.flatMap(api => (api as any)[method](params)), -) as any +) => BotApi.use(api => (api as any)[method](params)) as any export const make: (args: { transport: BotApiTransport.BotApiTransport @@ -55,10 +52,7 @@ export const layer: Layer.Layer< BotApiTransport.BotApiTransport > = Layer.effect( BotApi, - Effect.andThen( - BotApiTransport.BotApiTransport, - transport => internal.make({ transport }), - ), + BotApiTransport.BotApiTransport.useSync(transport => internal.make({ transport })), ) type MethodArgs = @@ -95,7 +89,7 @@ export const layerConfig = (options: { * - Integrating with monitoring or debugging tools */ readonly transformTransport?: (transport: BotApiTransport.BotApiTransport) => BotApiTransport.BotApiTransport -}): Layer.Layer => { +}): Layer.Layer => { const { token, environment = 'prod', @@ -105,19 +99,15 @@ export const layerConfig = (options: { layer, Layer.effect( BotApiTransport.BotApiTransport, - Effect.all([ - HttpClient.HttpClient, - token.pipe( - Effect.map(token => ( - environment === 'prod' - ? BotApiUrl.makeProd(Redacted.value(token)) - : BotApiUrl.makeTest(Redacted.value(token)) - )), - ), - ]).pipe( - Effect.map(([httpClient, botApiUrl]) => BotApiTransport.make({ httpClient, botApiUrl })), - Effect.map(transformTransport ?? Function.identity), - ), + Effect.gen(function* () { + const httpClient = yield* HttpClient.HttpClient + const tokenValue = yield* token + const botApiUrl = environment === 'prod' + ? BotApiUrl.makeProd(Redacted.value(tokenValue)) + : BotApiUrl.makeTest(Redacted.value(tokenValue)) + const transport = BotApiTransport.make({ httpClient, botApiUrl }) + return (transformTransport ?? Function.identity)(transport) + }), ), ) } diff --git a/src/BotApiError.ts b/src/BotApiError.ts index d73a51f..475eb02 100644 --- a/src/BotApiError.ts +++ b/src/BotApiError.ts @@ -1,9 +1,8 @@ -import type * as HttpBody from '@effect/platform/HttpBody' -import type * as HttpClientError from '@effect/platform/HttpClientError' +import type * as HttpBody from 'effect/unstable/http/HttpBody' +import type * as HttpClientError from 'effect/unstable/http/HttpClientError' import type * as BotApiTransport from './BotApiTransport.ts' -import { TypeIdError } from '@effect/platform/Error' +import * as Data from 'effect/Data' import * as Duration from 'effect/Duration' -import * as Match from 'effect/Match' import * as Option from 'effect/Option' import * as Predicate from 'effect/Predicate' import * as Dialog from './Dialog.ts' @@ -25,57 +24,51 @@ export type BotApiError = /** * Error caused by the transport when accessing Bot API. */ -export class TransportError extends TypeIdError(TypeId, 'TransportError')<{ +export class TransportError extends Data.TaggedError('TransportError')<{ readonly cause: | HttpClientError.HttpClientError | HttpBody.HttpBodyError }> { + readonly [TypeId]: typeof TypeId = TypeId override get message(): string { - return Match.value(this.cause).pipe( - Match.tagsExhaustive({ - RequestError: e => e.message, - ResponseError: e => e.message, - HttpBodyError: e => Match.value(e.reason).pipe( - Match.tagsExhaustive({ - SchemaError: e => e.error.message, - JsonError: e => `JsonError: ${e.error}`, - }), - ), - }), - ) + return this.cause.message } } -export class MethodFailed extends TypeIdError(TypeId, 'MethodFailed')<{ +export class MethodFailed extends Data.TaggedError('MethodFailed')<{ readonly response: FailureResponse readonly possibleReason: MethodFailureReason }> { + readonly [TypeId]: typeof TypeId = TypeId override get message() { return `(${this.response.error_code}) ${this.response.description}` } } -export class GroupUpgraded extends TypeIdError(TypeId, 'GroupUpgraded')<{ +export class GroupUpgraded extends Data.TaggedError('GroupUpgraded')<{ readonly response: FailureResponse readonly supergroup: Dialog.Supergroup }> { + readonly [TypeId]: typeof TypeId = TypeId override get message() { return `Group has been upgraded to a supergroup with ID ${this.supergroup.id}.` } } -export class RateLimited extends TypeIdError(TypeId, 'RateLimited')<{ +export class RateLimited extends Data.TaggedError('RateLimited')<{ readonly response: FailureResponse readonly retryAfter: Duration.Duration }> { + readonly [TypeId]: typeof TypeId = TypeId override get message() { return `Flood limit exceeded. Should wait for ${Duration.format(this.retryAfter)} before retrying.` } } -export class InternalServerError extends TypeIdError(TypeId, 'InternalServerError')<{ +export class InternalServerError extends Data.TaggedError('InternalServerError')<{ readonly response: FailureResponse }> { + readonly [TypeId]: typeof TypeId = TypeId override get message() { return `Internal error (${this.response.error_code}): ${this.response.description}` } diff --git a/src/BotApiTransport.ts b/src/BotApiTransport.ts index 44f288e..d7ebe8c 100644 --- a/src/BotApiTransport.ts +++ b/src/BotApiTransport.ts @@ -1,9 +1,9 @@ import type * as BotApi from './BotApi.ts' import type * as BotApiError from './BotApiError.ts' -import * as HttpClient from '@effect/platform/HttpClient' import * as Context from 'effect/Context' import * as Effect from 'effect/Effect' import * as Layer from 'effect/Layer' +import * as HttpClient from 'effect/unstable/http/HttpClient' import * as BotApiUrl from './BotApiUrl.ts' import * as internal from './internal/botApiTransport.ts' @@ -14,7 +14,7 @@ export interface BotApiTransport { ) => Effect.Effect } -export const BotApiTransport: Context.Tag = Context.GenericTag('@grom.js/effect-tg/BotApiTransport') +export const BotApiTransport: Context.Service = Context.Service('@grom.js/effect-tg/BotApiTransport') /** * @see https://core.telegram.org/bots/api#making-requests @@ -42,9 +42,9 @@ export const layer: Layer.Layer< HttpClient.HttpClient | BotApiUrl.BotApiUrl > = Layer.effect( BotApiTransport, - Effect.all([HttpClient.HttpClient, BotApiUrl.BotApiUrl]).pipe( - Effect.andThen(([httpClient, botApiUrl]) => ( - internal.make({ httpClient, botApiUrl })), - ), - ), + Effect.gen(function* () { + const httpClient = yield* HttpClient.HttpClient + const botApiUrl = yield* BotApiUrl.BotApiUrl + return internal.make({ httpClient, botApiUrl }) + }), ) diff --git a/src/BotApiUrl.ts b/src/BotApiUrl.ts index 3c3338c..00b4528 100644 --- a/src/BotApiUrl.ts +++ b/src/BotApiUrl.ts @@ -5,7 +5,7 @@ export interface BotApiUrl { readonly toFile: (filePath: string) => URL } -export const BotApiUrl: Context.Tag = Context.GenericTag('@grom.js/effect-tg/BotApiUrl') +export const BotApiUrl: Context.Service = Context.Service('@grom.js/effect-tg/BotApiUrl') export const makeProd = (token: string): BotApiUrl => ( { diff --git a/src/Content.ts b/src/Content.ts index 161d72f..eb54bdb 100644 --- a/src/Content.ts +++ b/src/Content.ts @@ -203,7 +203,7 @@ export const text = ( ): Text => ({ _tag: 'Text', text, - linkPreview: Option.fromNullable(options?.linkPreview), + linkPreview: Option.fromNullishOr(options?.linkPreview), }) export const photo = ( @@ -216,7 +216,7 @@ export const photo = ( ): Photo => ({ _tag: 'Photo', file, - caption: Option.fromNullable(options.caption), + caption: Option.fromNullishOr(options.caption), layout: options.layout ?? 'caption-below', spoiler: options.spoiler ?? false, }) @@ -233,11 +233,11 @@ export const audio = ( ): Audio => ({ _tag: 'Audio', file, - caption: Option.fromNullable(options.caption), - duration: Option.fromNullable(options.duration), - performer: Option.fromNullable(options.performer), - title: Option.fromNullable(options.title), - thumbnail: Option.fromNullable(options.thumbnail), + caption: Option.fromNullishOr(options.caption), + duration: Option.fromNullishOr(options.duration), + performer: Option.fromNullishOr(options.performer), + title: Option.fromNullishOr(options.title), + thumbnail: Option.fromNullishOr(options.thumbnail), }) export const document = ( @@ -250,8 +250,8 @@ export const document = ( ): Document => ({ _tag: 'Document', file, - caption: Option.fromNullable(options.caption), - thumbnail: Option.fromNullable(options.thumbnail), + caption: Option.fromNullishOr(options.caption), + thumbnail: Option.fromNullishOr(options.thumbnail), contentTypeDetection: options.contentTypeDetection ?? false, }) @@ -272,15 +272,15 @@ export const video = ( ): Video => ({ _tag: 'Video', file, - caption: Option.fromNullable(options.caption), + caption: Option.fromNullishOr(options.caption), layout: options.layout ?? 'caption-below', spoiler: options.spoiler ?? false, - duration: Option.fromNullable(options.duration), - width: Option.fromNullable(options.width), - height: Option.fromNullable(options.height), - thumbnail: Option.fromNullable(options.thumbnail), - cover: Option.fromNullable(options.cover), - startAt: Option.fromNullable(options.startAt), + duration: Option.fromNullishOr(options.duration), + width: Option.fromNullishOr(options.width), + height: Option.fromNullishOr(options.height), + thumbnail: Option.fromNullishOr(options.thumbnail), + cover: Option.fromNullishOr(options.cover), + startAt: Option.fromNullishOr(options.startAt), supportsStreaming: options.supportsStreaming ?? false, }) @@ -298,13 +298,13 @@ export const animation = ( ): Animation => ({ _tag: 'Animation', file, - caption: Option.fromNullable(options.caption), + caption: Option.fromNullishOr(options.caption), layout: options.layout ?? 'caption-below', spoiler: options.spoiler ?? false, - duration: Option.fromNullable(options.duration), - width: Option.fromNullable(options.width), - height: Option.fromNullable(options.height), - thumbnail: Option.fromNullable(options.thumbnail), + duration: Option.fromNullishOr(options.duration), + width: Option.fromNullishOr(options.width), + height: Option.fromNullishOr(options.height), + thumbnail: Option.fromNullishOr(options.thumbnail), }) export const voice = ( @@ -316,8 +316,8 @@ export const voice = ( ): Voice => ({ _tag: 'Voice', file, - caption: Option.fromNullable(options.caption), - duration: Option.fromNullable(options.duration), + caption: Option.fromNullishOr(options.caption), + duration: Option.fromNullishOr(options.duration), }) export const videoNote = ( @@ -330,9 +330,9 @@ export const videoNote = ( ): VideoNote => ({ _tag: 'VideoNote', file, - duration: Option.fromNullable(options.duration), - diameter: Option.fromNullable(options.diameter), - thumbnail: Option.fromNullable(options.thumbnail), + duration: Option.fromNullishOr(options.duration), + diameter: Option.fromNullishOr(options.diameter), + thumbnail: Option.fromNullishOr(options.thumbnail), }) export const location = (options: { @@ -343,7 +343,7 @@ export const location = (options: { _tag: 'Location', latitude: options.latitude, longitude: options.longitude, - uncertaintyRadius: Option.fromNullable(options.uncertaintyRadius), + uncertaintyRadius: Option.fromNullishOr(options.uncertaintyRadius), livePeriod: Option.none(), heading: Option.none(), proximityAlertRadius: Option.none(), @@ -360,10 +360,10 @@ export const liveLocation = (options: { _tag: 'Location', latitude: options.latitude, longitude: options.longitude, - uncertaintyRadius: Option.fromNullable(options.uncertaintyRadius), + uncertaintyRadius: Option.fromNullishOr(options.uncertaintyRadius), livePeriod: Option.some(options.livePeriod), - heading: Option.fromNullable(options.heading), - proximityAlertRadius: Option.fromNullable(options.proximityAlertRadius), + heading: Option.fromNullishOr(options.heading), + proximityAlertRadius: Option.fromNullishOr(options.proximityAlertRadius), }) export const venue = (options: { @@ -381,10 +381,10 @@ export const venue = (options: { longitude: options.longitude, title: options.title, address: options.address, - foursquareId: Option.fromNullable(options.foursquareId), - foursquareType: Option.fromNullable(options.foursquareType), - googlePlaceId: Option.fromNullable(options.googlePlaceId), - googlePlaceType: Option.fromNullable(options.googlePlaceType), + foursquareId: Option.fromNullishOr(options.foursquareId), + foursquareType: Option.fromNullishOr(options.foursquareType), + googlePlaceId: Option.fromNullishOr(options.googlePlaceId), + googlePlaceType: Option.fromNullishOr(options.googlePlaceType), }) export const contact = (options: { @@ -396,8 +396,8 @@ export const contact = (options: { _tag: 'Contact', phoneNumber: options.phoneNumber, firstName: options.firstName, - lastName: Option.fromNullable(options.lastName), - vcard: Option.fromNullable(options.vcard), + lastName: Option.fromNullishOr(options.lastName), + vcard: Option.fromNullishOr(options.vcard), }) export const dice = (emoji: Dice['emoji']): Dice => ({ _tag: 'Dice', emoji }) @@ -405,4 +405,4 @@ export const dice = (emoji: Dice['emoji']): Dice => ({ _tag: 'Dice', emoji }) export const sticker = ( file: File.FileId | File.External | File.InputFile, emoji?: string, -): Sticker => ({ _tag: 'Sticker', file, emoji: Option.fromNullable(emoji) }) +): Sticker => ({ _tag: 'Sticker', file, emoji: Option.fromNullishOr(emoji) }) diff --git a/src/Dialog.ts b/src/Dialog.ts index 401e97b..fc40b66 100644 --- a/src/Dialog.ts +++ b/src/Dialog.ts @@ -85,34 +85,30 @@ export const dialogId: (peer: Peer) => DialogId = Match.type().pipe( * @see {@link https://core.telegram.org/api/bots/ids Telegram API • Bot API dialog IDs} */ export type DialogId = number & Brand.Brand<'@grom.js/effect-tg/DialogId'> -export const DialogId: Brand.Brand.Constructor = Brand.refined( +export const DialogId: Brand.Constructor = Brand.make( n => Option.isSome(internal.decodeDialogId(n)), - n => Brand.error(`Invalid dialog ID: ${n}`), ) export type UserId = number & Brand.Brand<'@grom.js/effect-tg/UserId'> -export const UserId: Brand.Brand.Constructor = Brand.refined( +export const UserId: Brand.Constructor = Brand.make( n => Option.isSome(internal.encodePeerId('user', n)), - n => Brand.error(`Invalid user ID: ${n}`), ) export type GroupId = number & Brand.Brand<'@grom.js/effect-tg/GroupId'> -export const GroupId: Brand.Brand.Constructor = Brand.refined( +export const GroupId: Brand.Constructor = Brand.make( n => Option.isSome(internal.encodePeerId('group', n)), - n => Brand.error(`Invalid group ID: ${n}`), ) export type ChannelId = number & Brand.Brand<'@grom.js/effect-tg/ChannelId'> -export const ChannelId: Brand.Brand.Constructor = Brand.refined( +export const ChannelId: Brand.Constructor = Brand.make( n => Option.isSome(internal.encodePeerId('channel', n)), - n => Brand.error(`Invalid channel or supergroup ID: ${n}`), ) /** @alias ChannelId */ export type SupergroupId = ChannelId /** @alias ChannelId */ -export const SupergroupId: Brand.Brand.Constructor = ChannelId +export const SupergroupId: Brand.Constructor = ChannelId // ============================================================================= // Dialog ID <-> Peer ID diff --git a/src/File.ts b/src/File.ts index 74c163d..3103972 100644 --- a/src/File.ts +++ b/src/File.ts @@ -1,8 +1,8 @@ -import type * as HttpClient from '@effect/platform/HttpClient' -import type * as HttpClientError from '@effect/platform/HttpClientError' -import type * as HttpClientResponse from '@effect/platform/HttpClientResponse' import type * as Effect from 'effect/Effect' import type * as Stream from 'effect/Stream' +import type * as HttpClient from 'effect/unstable/http/HttpClient' +import type * as HttpClientError from 'effect/unstable/http/HttpClientError' +import type * as HttpClientResponse from 'effect/unstable/http/HttpClientResponse' import type * as BotApi from './BotApi.ts' import type * as BotApiError from './BotApiError.ts' import type * as BotApiUrl from './BotApiUrl.ts' @@ -11,10 +11,10 @@ import * as Predicate from 'effect/Predicate' import * as internal from './internal/file.ts' export type FileId = string & Brand.Brand<'FileId'> -export const FileId: Brand.Brand.Constructor = Brand.nominal() +export const FileId: Brand.Constructor = Brand.nominal() export type External = URL & Brand.Brand<'External'> -export const External: Brand.Brand.Constructor = Brand.nominal() +export const External: Brand.Constructor = Brand.nominal() // ============================================================================= // InputFile diff --git a/src/Markup.ts b/src/Markup.ts index cc25296..a0dd1d3 100644 --- a/src/Markup.ts +++ b/src/Markup.ts @@ -66,7 +66,7 @@ export const replyKeyboard = ( resizable: options?.resizable ?? false, oneTime: options?.oneTime ?? false, selective: options?.selective ?? false, - inputPlaceholder: Option.fromNullable(options?.inputPlaceholder), + inputPlaceholder: Option.fromNullishOr(options?.inputPlaceholder), }) export const replyKeyboardRemove = (options?: { @@ -82,7 +82,7 @@ export const forceReply = (options?: { }): ForceReply => ({ _tag: 'ForceReply', selective: options?.selective ?? false, - inputPlaceholder: Option.fromNullable(options?.inputPlaceholder), + inputPlaceholder: Option.fromNullishOr(options?.inputPlaceholder), }) // ============================================================================= diff --git a/src/Reply.ts b/src/Reply.ts index c04e651..65ccce5 100644 --- a/src/Reply.ts +++ b/src/Reply.ts @@ -19,7 +19,7 @@ export const make = (args: { dialog: args.dialog, messageId: args.messageId, optional: args.optional ?? false, - taskId: Option.fromNullable(args.taskId), + taskId: Option.fromNullishOr(args.taskId), }) export const toMessage = ( @@ -32,5 +32,5 @@ export const toMessage = ( dialog: Dialog.DialogId(message.chat.id), messageId: message.message_id, optional: options?.optional ?? false, - taskId: Option.fromNullable(options?.taskId), + taskId: Option.fromNullishOr(options?.taskId), }) diff --git a/src/Send.ts b/src/Send.ts index e6aa6cb..e61f1aa 100644 --- a/src/Send.ts +++ b/src/Send.ts @@ -9,7 +9,6 @@ import type * as Dialog from './Dialog.ts' import type * as Markup from './Markup.ts' import type * as Reply from './Reply.ts' import * as Context from 'effect/Context' -import * as Data from 'effect/Data' import * as Effect from 'effect/Effect' import * as Effectable from 'effect/Effectable' import * as Function from 'effect/Function' @@ -47,7 +46,7 @@ export interface TargetDialog { readonly dialog: Dialog.Dialog | Dialog.DialogId } -export const TargetDialog: Context.Tag = Context.GenericTag('@grom.js/effect-tg/Send/TargetDialog') +export const TargetDialog: Context.Service = Context.Service('@grom.js/effect-tg/Send/TargetDialog') /** * Provides the target dialog for sending messages. @@ -88,15 +87,11 @@ export interface MessageToSend extends readonly options?: Options } -const MessageToSendProto = { - ...Inspectable.BaseProto, - ...Effectable.CommitPrototype, - - [MessageToSendTypeId]: MessageToSendTypeId, - - commit(this: MessageToSend) { +const MessageToSendEffectProto = Effectable.Prototype({ + label: '@grom.js/effect-tg/Send/MessageToSend', + evaluate(this: MessageToSend, _fiber) { return Effect.flatMap( - TargetDialog, + TargetDialog.asEffect(), ({ dialog }) => sendMessage({ dialog, content: this.content, @@ -106,17 +101,26 @@ const MessageToSendProto = { }), ) }, +}) + +const MessageToSendProto = Object.assign( + Object.create(MessageToSendEffectProto), + { + ...Inspectable.BaseProto, - toJSON(this: MessageToSend) { - return { - _id: this[MessageToSendTypeId].description, - content: this.content, - markup: this.markup, - reply: this.reply, - options: this.options, - } + [MessageToSendTypeId]: MessageToSendTypeId, + + toJSON(this: MessageToSend) { + return { + _id: this[MessageToSendTypeId].description, + content: this.content, + markup: this.markup, + reply: this.reply, + options: this.options, + } + }, }, -} +) /** * Creates a message prepared to be sent with the specified content @@ -200,17 +204,11 @@ export const withoutReply: ( /** * Options for sending a message. */ -export class Options extends Data.Class<{ - disableNotification?: boolean - protectContent?: boolean - allowPaidBroadcast?: boolean -}> {} - -export const options = (args: { +export interface Options { disableNotification?: boolean protectContent?: boolean allowPaidBroadcast?: boolean -}): Options => new Options(args) +} /** * Modifies the options for sending a message by merging with existing options. @@ -229,10 +227,10 @@ export const withOptions: { ): MessageToSend => message(self.content, { markup: self.markup, reply: self.reply, - options: new Options({ + options: { ...self.options, ...options, - }), + }, })) /** diff --git a/src/internal/botApi.ts b/src/internal/botApi.ts index 96cd4c6..8518860 100644 --- a/src/internal/botApi.ts +++ b/src/internal/botApi.ts @@ -19,7 +19,7 @@ export const make = ({ transport }: { if (response.ok) { return response.result } - return yield* Effect.fail(BotApiError.fromResponse(response)) + return yield* BotApiError.fromResponse(response) }, ) }, diff --git a/src/internal/botApiTransport.ts b/src/internal/botApiTransport.ts index cce60e2..9aedf48 100644 --- a/src/internal/botApiTransport.ts +++ b/src/internal/botApiTransport.ts @@ -1,10 +1,9 @@ -import type * as HttpClient from '@effect/platform/HttpClient' +import type * as HttpClient from 'effect/unstable/http/HttpClient' import type * as BotApiTransport from '../BotApiTransport.ts' import type * as BotApiUrl from '../BotApiUrl.ts' -import * as HttpBody from '@effect/platform/HttpBody' -import * as Chunk from 'effect/Chunk' import * as Effect from 'effect/Effect' import * as Stream from 'effect/Stream' +import * as HttpBody from 'effect/unstable/http/HttpBody' import * as BotApiError from '../BotApiError.ts' import * as File from '../File.ts' @@ -96,7 +95,7 @@ const makeHttpBody = Effect.fnUntraced(function* (params: unknown) { // TODO: Make sure current implementation constructs blob efficiently. for (const { attachId, file } of files) { const chunks = yield* Stream.runCollect(file.stream) - const bytes = new Uint8Array(Chunk.toReadonlyArray(chunks).flatMap(chunk => [...chunk])) + const bytes = new Uint8Array(chunks.flatMap(chunk => [...chunk])) const blob = new Blob([bytes], { type: file.mimeType ?? 'application/octet-stream' }) formData.append(attachId, blob, file.filename) } @@ -117,7 +116,7 @@ export const make = ({ // We trust Bot API and don't want to introduce overhead with validation. return (yield* response.json) as BotApiTransport.BotApiResponse }).pipe( - Effect.catchAll(cause => ( + Effect.catch(cause => ( Effect.fail(new BotApiError.TransportError({ cause })) )), ) diff --git a/src/internal/file.ts b/src/internal/file.ts index 234cc5a..66fde5c 100644 --- a/src/internal/file.ts +++ b/src/internal/file.ts @@ -1,6 +1,6 @@ import type * as File from '../File.ts' -import * as HttpClient from '@effect/platform/HttpClient' import * as Effect from 'effect/Effect' +import * as HttpClient from 'effect/unstable/http/HttpClient' import * as BotApi from '../BotApi.ts' import * as BotApiUrl from '../BotApiUrl.ts' diff --git a/src/internal/runner.ts b/src/internal/runner.ts index b6f45cd..be4108a 100644 --- a/src/internal/runner.ts +++ b/src/internal/runner.ts @@ -27,7 +27,7 @@ export const makeSimple = (options?: { while: e => Match.value(e).pipe( Match.tag('InternalServerError', () => true), Match.tag('TransportError', e => Match.value(e.cause).pipe( - Match.tag('RequestError', e => e.reason === 'Transport'), + Match.tag('HttpClientError', e => e.reason._tag === 'TransportError'), Match.orElse(() => false), )), Match.orElse(() => false), @@ -41,7 +41,7 @@ export const makeSimple = (options?: { if (updates.length > 0) { const update = updates[0]! yield* Effect.provideService(bot, Bot.Update, update).pipe( - Effect.catchAll(error => ( + Effect.catch(error => ( Effect.logError('Error in bot:', error) )), ) diff --git a/test/BotApi.test.ts b/test/BotApi.test.ts index 472f55e..e3a5574 100644 --- a/test/BotApi.test.ts +++ b/test/BotApi.test.ts @@ -1,12 +1,11 @@ -import type * as HttpClientRequest from '@effect/platform/HttpClientRequest' -import * as HttpClient from '@effect/platform/HttpClient' -import * as HttpClientResponse from '@effect/platform/HttpClientResponse' import * as Config from 'effect/Config' import * as ConfigProvider from 'effect/ConfigProvider' import * as Effect from 'effect/Effect' import * as Exit from 'effect/Exit' import * as Layer from 'effect/Layer' import * as Redacted from 'effect/Redacted' +import * as HttpClient from 'effect/unstable/http/HttpClient' +import * as HttpClientResponse from 'effect/unstable/http/HttpClientResponse' import { describe, expect, it } from 'vitest' import { BotApi } from '../src/index.ts' @@ -18,14 +17,9 @@ describe('BotApi.layerConfig', () => { new Response(JSON.stringify(body)), ) - const makeTestClient = ( - handler: (request: HttpClientRequest.HttpClientRequest) => Effect.Effect, - ): HttpClient.HttpClient => - HttpClient.make(handler) - it('should use provided token config', async () => { let capturedUrl: URL | undefined - const mockClient = makeTestClient((request) => { + const mockClient = HttpClient.make((request) => { capturedUrl = new URL(request.url) return Effect.succeed(mockResponse({ ok: true, result: {} })) }) @@ -36,18 +30,14 @@ describe('BotApi.layerConfig', () => { await program.pipe( Effect.provide(BotApi.layerConfig({ token: Config.redacted('BOT_TOKEN') })), Effect.provide(Layer.succeed(HttpClient.HttpClient, mockClient)), - Effect.withConfigProvider( - ConfigProvider.fromMap( - new Map([['BOT_TOKEN', 'test-token-123']]), - ), - ), + Effect.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({ BOT_TOKEN: 'test-token-123' }))), Effect.runPromise, ) expect(capturedUrl?.href).toBe('https://api.telegram.org/bottest-token-123/getMe') }) it('should fail with ConfigError when token is missing', async () => { - const mockClient = makeTestClient(() => + const mockClient = HttpClient.make(() => Effect.succeed(mockResponse({ ok: true, result: {} })), ) const program = Effect.gen(function* () { @@ -57,7 +47,7 @@ describe('BotApi.layerConfig', () => { const exit = await program.pipe( Effect.provide(BotApi.layerConfig({ token: Config.redacted('MISSING_TOKEN') })), Effect.provide(Layer.succeed(HttpClient.HttpClient, mockClient)), - Effect.withConfigProvider(ConfigProvider.fromMap(new Map())), + Effect.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({}))), Effect.exit, Effect.runPromise, ) @@ -66,7 +56,7 @@ describe('BotApi.layerConfig', () => { it('should use prod environment by default', async () => { let capturedUrl: URL | undefined - const mockClient = makeTestClient((request) => { + const mockClient = HttpClient.make((request) => { capturedUrl = new URL(request.url) return Effect.succeed(mockResponse({ ok: true, result: {} })) }) @@ -84,7 +74,7 @@ describe('BotApi.layerConfig', () => { it('should use test environment when specified', async () => { let capturedUrl: URL | undefined - const mockClient = makeTestClient((request) => { + const mockClient = HttpClient.make((request) => { capturedUrl = new URL(request.url) return Effect.succeed(mockResponse({ ok: true, result: {} })) }) @@ -105,7 +95,7 @@ describe('BotApi.layerConfig', () => { it('should apply transport transformation', async () => { const methodCalls: string[] = [] - const mockClient = makeTestClient(() => + const mockClient = HttpClient.make(() => Effect.succeed(mockResponse({ ok: true, result: {} })), ) const program = Effect.gen(function* () { @@ -132,7 +122,7 @@ describe('BotApi.layerConfig', () => { }) it('should allow modifying responses', async () => { - const mockClient = makeTestClient(() => + const mockClient = HttpClient.make(() => Effect.succeed( mockResponse({ ok: true, @@ -173,7 +163,7 @@ describe('BotApi.layerConfig', () => { it('should work with all options combined', async () => { let capturedUrl: URL | undefined const methodCalls: string[] = [] - const mockClient = makeTestClient((request) => { + const mockClient = HttpClient.make((request) => { capturedUrl = new URL(request.url) return Effect.succeed(mockResponse({ ok: true, result: {} })) }) From 56da28ce8df4be549bfb46fb8393735a297f024b Mon Sep 17 00:00:00 2001 From: evermake Date: Fri, 15 May 2026 10:32:08 +0300 Subject: [PATCH 02/16] ci: set --prerelease for beta tags --- .github/workflows/release.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1923518..26b3c64 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,6 +41,11 @@ jobs: with: node-version: lts/* registry-url: https://registry.npmjs.org/ - - run: npx changelogithub + - run: | + if echo "${{ github.ref_name }}" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then + npx changelogithub + else + npx changelogithub --prerelease + fi env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} From 17794fe89c118ef0f2b2c4639ed9300f368a00ed Mon Sep 17 00:00:00 2001 From: evermake Date: Fri, 15 May 2026 12:21:32 +0300 Subject: [PATCH 03/16] chore: release v1.0.0-beta.1 From 62bb3c623a313d2dcdfbd6f686831ae2fc17b5e5 Mon Sep 17 00:00:00 2001 From: evermake Date: Fri, 15 May 2026 12:26:22 +0300 Subject: [PATCH 04/16] ci: fix npm publishing command for beta releases --- .github/workflows/release.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 26b3c64..5834cf7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,14 @@ jobs: - run: npm install -g npm@latest - run: pnpm install --frozen-lockfile - run: pnpm run build - - run: pnpm publish --access=public --provenance --no-git-checks + - run: | + VERSION="${{ github.ref_name }}" + if echo "$VERSION" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then + pnpm publish --access=public --provenance --no-git-checks + else + TAG=$(echo "$VERSION" | sed 's/^v[0-9]*\.[0-9]*\.[0-9]*-//' | sed 's/\..*//') + pnpm publish --access=public --provenance --no-git-checks --tag "$TAG" + fi changelog: runs-on: ubuntu-latest From 1434e38e1f9a629b50a8faf126ecd1cae470adec Mon Sep 17 00:00:00 2001 From: evermake Date: Fri, 15 May 2026 12:26:28 +0300 Subject: [PATCH 05/16] chore: release v1.0.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb42bdf..241faba 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@grom.js/effect-tg", "type": "module", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "packageManager": "pnpm@10.25.0", "description": "Effectful library for crafting Telegram bots.", "author": { From 0b3e3b97df17530833a58d416656a99ef76e5763 Mon Sep 17 00:00:00 2001 From: evermake Date: Sat, 20 Jun 2026 16:30:03 +0500 Subject: [PATCH 06/16] chore: update deps --- package.json | 16 +- pnpm-lock.yaml | 811 ++++++++++++++++++++++++------------------------- src/Send.ts | 2 +- 3 files changed, 410 insertions(+), 419 deletions(-) diff --git a/package.json b/package.json index 241faba..f1c9c75 100644 --- a/package.json +++ b/package.json @@ -49,19 +49,19 @@ }, "devDependencies": { "@antfu/eslint-config": "7.7.3", - "@effect/language-service": "0.85.1", + "@effect/language-service": "0.86.2", "@grom.js/bot-api-spec": "0.10.1", "@grom.js/tgx": "1.4.3", - "@types/node": "22.19.18", - "@vitest/coverage-v8": "4.1.5", + "@types/node": "22.20.0", + "@vitest/coverage-v8": "4.1.9", "bumpp": "11.1.0", - "effect": "4.0.0-beta.64", + "effect": "4.0.0-beta.85", "eslint": "9.39.4", "eslint-plugin-format": "2.0.1", - "knip": "6.12.1", - "taze": "19.11.0", - "ts-morph": "27.0.2", + "knip": "6.17.1", + "taze": "19.14.1", + "ts-morph": "28.0.0", "typescript": "5.9.3", - "vitest": "4.1.5" + "vitest": "4.1.9" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd22680..3402ff6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: devDependencies: '@antfu/eslint-config': specifier: 7.7.3 - version: 7.7.3(@typescript-eslint/rule-tester@8.56.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3))(@typescript-eslint/utils@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@vue/compiler-sfc@3.5.24)(eslint-plugin-format@2.0.1(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.5) + version: 7.7.3(@typescript-eslint/rule-tester@8.56.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3))(@typescript-eslint/utils@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@vue/compiler-sfc@3.5.24)(eslint-plugin-format@2.0.1(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.9) '@effect/language-service': - specifier: 0.85.1 - version: 0.85.1 + specifier: 0.86.2 + version: 0.86.2 '@grom.js/bot-api-spec': specifier: 0.10.1 version: 0.10.1 @@ -21,17 +21,17 @@ importers: specifier: 1.4.3 version: 1.4.3 '@types/node': - specifier: 22.19.18 - version: 22.19.18 + specifier: 22.20.0 + version: 22.20.0 '@vitest/coverage-v8': - specifier: 4.1.5 - version: 4.1.5(vitest@4.1.5) + specifier: 4.1.9 + version: 4.1.9(vitest@4.1.9) bumpp: specifier: 11.1.0 version: 11.1.0 effect: - specifier: 4.0.0-beta.64 - version: 4.0.0-beta.64 + specifier: 4.0.0-beta.85 + version: 4.0.0-beta.85 eslint: specifier: 9.39.4 version: 9.39.4(jiti@2.7.0) @@ -39,20 +39,20 @@ importers: specifier: 2.0.1 version: 2.0.1(eslint@9.39.4(jiti@2.7.0)) knip: - specifier: 6.12.1 - version: 6.12.1 + specifier: 6.17.1 + version: 6.17.1 taze: - specifier: 19.11.0 - version: 19.11.0 + specifier: 19.14.1 + version: 19.14.1 ts-morph: - specifier: 27.0.2 - version: 27.0.2 + specifier: 28.0.0 + version: 28.0.0 typescript: specifier: 5.9.3 version: 5.9.3 vitest: - specifier: 4.1.5 - version: 4.1.5(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4)) + specifier: 4.1.9 + version: 4.1.9(@types/node@22.20.0)(@vitest/coverage-v8@4.1.9)(vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0)) packages: @@ -123,8 +123,8 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@antfu/ni@30.0.0': - resolution: {integrity: sha512-DqBVB3XqXH4VsDpER7iLlEtayMC98iXrY7kwBzp1v6LGc/6U6+qnN3+X0bcPK63LMXJCRG2D/XDq7dvtKDGogg==} + '@antfu/ni@30.1.0': + resolution: {integrity: sha512-3VuAbPjgY52rQNn4wABaXMhBU2Oq91uy6L8nX49eJ35OLI68CyckGU+HZxcaHix4ymuGM2nFL1D6sLpgODK5xw==} engines: {node: '>=20.19.0'} hasBin: true @@ -175,28 +175,28 @@ packages: oxlint: optional: true - '@effect/language-service@0.85.1': - resolution: {integrity: sha512-EXnJjIy6zQ3nUO/MZ+ynWUb8B895KZPotd1++oTs9JjDkplwM7cb6zo8Zq2zU6piwq+KflO7amXbEfj1UMpHkw==} + '@effect/language-service@0.86.2': + resolution: {integrity: sha512-SaPln+8srOqDJDUwNTDmP5e+IYpEDr9+1epGznnsLqu8xvo6VnxyWARdeLpqvZJlb0Pgy9ca7ppqvvdWbHPXAg==} hasBin: true '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.11.0': + resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/runtime@1.11.0': + resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@es-joy/jsdoccomment@0.84.0': resolution: {integrity: sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -461,14 +461,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -479,268 +471,266 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} cpu: [arm64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} cpu: [x64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} cpu: [arm64] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} cpu: [arm] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} cpu: [x64] os: [linux] - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} cpu: [x64] os: [win32] - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.5': + resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@oxc-parser/binding-android-arm-eabi@0.128.0': - resolution: {integrity: sha512-aca6ZvzmCBUGOANQRiRQRZuRKYI3ENhcit6GisnknOOmcezfQc7xJ4dxlPU7MV7mOvrC7RNR1u3LAD7xyaiCxA==} + '@oxc-parser/binding-android-arm-eabi@0.135.0': + resolution: {integrity: sha512-sHeZItACNcA5WRAWqF6ixriR4GkZDyY10gVgnZU7pXku1DjHFATSqnwZM809jl0gXPHxb6fKzYQCK7bNK5cACQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.128.0': - resolution: {integrity: sha512-BbeDmuohoJ7Rz/it5wnkj69i/OsCPS3Z51nLEzwO/Y6YshtC4JU+15oNwhY8v4LRKRYclRc7ggOikwrsJ/eOEQ==} + '@oxc-parser/binding-android-arm64@0.135.0': + resolution: {integrity: sha512-wPte+SzgzWWFgMSF8YZDNM+tBXtJg0AXBi7+tU3yS2z1f2Af9kRLZLKuJojADmuD/cZexmnMHHC3SDItTW77Iw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.128.0': - resolution: {integrity: sha512-tRUHPt80417QmvNpoSslJT1VY8NUbWdrWR+L14Zn+RbOTcaqB8E6PYE/ZGN8jjWBzqporiA/H4MfO50ew/NCNA==} + '@oxc-parser/binding-darwin-arm64@0.135.0': + resolution: {integrity: sha512-BmKz3lHIsqVos+9aPcdYCT9MG3APoUyM43KlEFhJMWNVDOGG8FKyiFz81Bc+mGz2o0hpuQ3PfXLfVWJrKXjo2g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.128.0': - resolution: {integrity: sha512-rWI2Hb1Nt3U/vKsjyNvZzDC8i/l144U20DKjhzaTmwIhIiSRGeroPWWiImwypmKLqrw8GuIixbWJkpGWLbkzrQ==} + '@oxc-parser/binding-darwin-x64@0.135.0': + resolution: {integrity: sha512-dM8BS+8+Br1fNvmh2QZbGiHaYttwLebRa6J4Uz9vuFzMNmvsdRYwf7993ptOaV0JTrR63AaoVLjX7nhWbijxjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.128.0': - resolution: {integrity: sha512-hhpdVMaNCLgQxjgNPeeFzSeJMmZPc5lKfv0NGSI3egZq9EdnEGqeC8JsYsQjK7PoQgbvZ17xlj0SO5ziH5Obkg==} + '@oxc-parser/binding-freebsd-x64@0.135.0': + resolution: {integrity: sha512-xlZnvvJdR9bGu2pOhvR5hMuKPHCE6Sa9owK5A484mzjHdm75VRV5nCs5w/jkmGODMMTFc+KN7EnZqEieM813kw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.128.0': - resolution: {integrity: sha512-093zNw0zZ/e/obML+rhlSdmnzR0mVZluPcAkxunEc5E3F0yBVsFn24Y1ILfsEte11Ud041qn/gp2OJ1jxNqUng==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.135.0': + resolution: {integrity: sha512-PSR8LmBK/H/PQRiN8g7RebQgZX/ntVCrdT/JBfNxE5ezdHG1s2i4rbazsRJYD83TTI1MmgTpC0MGL42PLtskQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.128.0': - resolution: {integrity: sha512-fq7DmKmfC+dvD97IXrgbph6Jzwe0EDu+PYMofmzZ6fv5X1k9vtaqLpDGMuICO9MmUnyKAQmVl+wIv2RNy4Dz8g==} + '@oxc-parser/binding-linux-arm-musleabihf@0.135.0': + resolution: {integrity: sha512-I85GJXzfUsigkkk7Ngdz95C217M4FdUi1Z2HrX5UyPmURobwQZ7m2bbUvwFkz4VGZd+lymFGKHvDZ3RQC9qOzA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.128.0': - resolution: {integrity: sha512-Xvm48jJah8TlIrURIjNOP/gNiGe6aKvCB+r06VliflFo8Kq7VOLE8PxtgShJzZIqubrgdMdYfvuPPozn7F6MbQ==} + '@oxc-parser/binding-linux-arm64-gnu@0.135.0': + resolution: {integrity: sha512-zqEY0npz0g0aGZj/8a5BclunjVDytsBQHYtIC10Gd26HcrLwbVF6YDbqRQjunMGYdSo97u6xOBl05aTDI2diDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-musl@0.128.0': - resolution: {integrity: sha512-M7iwBGmYJTx+pKOYFjI0buop4gJvlmcVzFGaXPt21DKpQkbQZG1f63Yg7LloIYT/t9yLxCw0Lhfx/RFlAlMSjA==} + '@oxc-parser/binding-linux-arm64-musl@0.135.0': + resolution: {integrity: sha512-mWAfprP819gQ2qYst1RxgTI8b/z0b29OpoKfRflIXLHde2dZLihQD4g47Onuvtpo5GPIkMYPRlX9QoeZfs/GnQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-ppc64-gnu@0.128.0': - resolution: {integrity: sha512-21LGNIZb1Pcfk5/EGsqabrxv4yqQOWis1407JJrClS7XpFCrbvr74YAB1V+m54cYbwvO6UWwQqS4WecxiyfCRg==} + '@oxc-parser/binding-linux-ppc64-gnu@0.135.0': + resolution: {integrity: sha512-gri8c2AOmJKJwOux2KTHFBfUaXoJURuVMKhmKEi/2hTF55cQteTDV2XNfTiE5oCC+Tnem1Y4/MWzcyDadtsSag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxc-parser/binding-linux-riscv64-gnu@0.128.0': - resolution: {integrity: sha512-gyHjOTFpg9bTTYjxPmQirvufb89+VdZwVfcMtAUyPr6F5H8ZswvCQshK4qOW+Q+2Xyb33hduRgY/eFHJQjU/vQ==} + '@oxc-parser/binding-linux-riscv64-gnu@0.135.0': + resolution: {integrity: sha512-Y2tkupCG5wo0SxH2rMLG4d4Kmv6DaM3sBp+GuM5lox0S8Za6VxKgQrY2Mut088QQxKkEE89n/4CCCgmw2o0e3Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-riscv64-musl@0.128.0': - resolution: {integrity: sha512-X6Q2oKUrP5GyDd2xniuEBLk6aFQCZ97W2+aVXGgJXdjx5t4/oFuA9ri0wLOUrBIX+qdSuK581snMBio4z910eA==} + '@oxc-parser/binding-linux-riscv64-musl@0.135.0': + resolution: {integrity: sha512-xDRJq6i6WTynjeP+ISbDpyH4p9BaJ0wuQcL0lCSDkt9qOXC9dmwpOu1VG/TlwmPI3KpYntmO9nJCuc3TMTsNBA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-s390x-gnu@0.128.0': - resolution: {integrity: sha512-BdzTmqxfxoYkpgokoLaSnOX6T+R3/goL42klre2tnG+kHbG2TXS0VN+P5BPofH1axdKOHy5ei4ENZrjmCOt2lA==} + '@oxc-parser/binding-linux-s390x-gnu@0.135.0': + resolution: {integrity: sha512-V4MoUuiCRNvihxhIufRxvK+ka013V4joTSK0FAGA1KEjLuNprfH6N/Qw2uxQEVIFuNYMhD/hV6xJ/ptbzlKdHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@oxc-parser/binding-linux-x64-gnu@0.128.0': - resolution: {integrity: sha512-OO1nW2Q7sSYYvJZpDHdvyFSdRaVcQqRijZSSmWVMqFxPYy8cEF45zJ9fcdIYuzIT3jYq6YRhEFm/VMWNWhE22Q==} + '@oxc-parser/binding-linux-x64-gnu@0.135.0': + resolution: {integrity: sha512-JCFZ7zM7KXOKoPAbK/ZB4wY0M1jxRECiem2UQuiXLjzGqS9+hno7mtX+qyK2F7HWK2xPhyJb+frpcOtk5DKOtg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxc-parser/binding-linux-x64-musl@0.128.0': - resolution: {integrity: sha512-4NehAe404MRdoZVS9DW8C5XbJwbXIc/KfVlYdpi5vE4081zc9Y0YzKVqyOYj/Puye7/Do+ohaONBFWlEHYl9hw==} + '@oxc-parser/binding-linux-x64-musl@0.135.0': + resolution: {integrity: sha512-9jSVS1b3hOV7sdKH4aA2DFfnTz0RgQd0v2BefR+LYbH8yIlmSM22JJZbAAjVeVXmFgUAk3zJQ1tpE/Nd+Vi2YQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxc-parser/binding-openharmony-arm64@0.128.0': - resolution: {integrity: sha512-kVbqgW9xLL8bh8oc7aYOJilRKXE5G33+tE0jan+duo/9OriaFRpijcCwT2waWs2oqYROYq0GlE7/p3ywoshVeg==} + '@oxc-parser/binding-openharmony-arm64@0.135.0': + resolution: {integrity: sha512-M857ZLBSdn1Uy/SJJz5zh0qGu67B4P9omCgXGBU2LLqTzraX6ZjVNaKq5yW1PDw/LgJXDXR/dbZfgmB310f11Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.128.0': - resolution: {integrity: sha512-L38ojghJYHmgiz6fJd7jwLB/ESDBpB02NdFxh+smqVM6P2anCEvHn0jhaSrt5eVNR1Ak8+moOeftUlofeyvniA==} + '@oxc-parser/binding-wasm32-wasi@0.135.0': + resolution: {integrity: sha512-2w6DVcntQZX9U5RhXtgiWb3FLWFB5EcwI1U8yr3htOCJUJjagN4BFUHz/Y/d9ZsumndZ6ByxxWEtbUZNE1bfFw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.128.0': - resolution: {integrity: sha512-xgvO35GyHBtjlQ5AEpaYr7Rll1rvY7zqIhT6ty8E3ezBW2J1SFLjIDEvI/tcgDg6oaseDAqVcM+jU1HuCekgZw==} + '@oxc-parser/binding-win32-arm64-msvc@0.135.0': + resolution: {integrity: sha512-rX1U8+IH2Z37EJjDXKa1iifvUQAdba+vZ4Ewj1iaG5eA/QaSybzclCOwtWa0/5BuUQnnK/T2JHUEFrwhL6Ck2Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.128.0': - resolution: {integrity: sha512-OY+3eM2SN72prHKRB22mPz8o5A/7dJ+f5DFLBVvggyZhEaNDAH9IB+ElMjmOkOIwf5MDCUAowCK7pAncNxzpBA==} + '@oxc-parser/binding-win32-ia32-msvc@0.135.0': + resolution: {integrity: sha512-9FAisBbH1QICGAjlJobiuKGd/jOuVmyqniWdQMwTa5SkCl6hhuotBCJf1n46B0flYbSOR5TzfV9HZCWSyb3c/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.128.0': - resolution: {integrity: sha512-NE9ny+cPUCCObXa0IKLfj0tCdPd7pe/dz9ZpkxpUOymB3miNeMPybdlYYTBSGJUalMWeBM85/4JcCErCNTqOXw==} + '@oxc-parser/binding-win32-x64-msvc@0.135.0': + resolution: {integrity: sha512-wYF+A2AzJ2n7ul6q+Z2G/ia0S2+8cUp0AgWZzoFvF4WmUcl1P7p+o6se1Gdr5wGnWuF0iAMIkGddrjCarNr2yA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.128.0': - resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.135.0': + resolution: {integrity: sha512-wR+xRdFkUBMvcAjBJ2q2kcZM6d+DKu2NgoOyxZgYwZdLhmiv6+rnO8PZ/P68kMiZtIKm+pW7zyEJ4kSOs0vo+Q==} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': - resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} + '@oxc-resolver/binding-android-arm-eabi@11.21.3': + resolution: {integrity: sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.19.1': - resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} + '@oxc-resolver/binding-android-arm64@11.21.3': + resolution: {integrity: sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.19.1': - resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} + '@oxc-resolver/binding-darwin-arm64@11.21.3': + resolution: {integrity: sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.19.1': - resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} + '@oxc-resolver/binding-darwin-x64@11.21.3': + resolution: {integrity: sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.19.1': - resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} + '@oxc-resolver/binding-freebsd-x64@11.21.3': + resolution: {integrity: sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': - resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3': + resolution: {integrity: sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': - resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.3': + resolution: {integrity: sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': - resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} + '@oxc-resolver/binding-linux-arm64-gnu@11.21.3': + resolution: {integrity: sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': - resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} + '@oxc-resolver/binding-linux-arm64-musl@11.21.3': + resolution: {integrity: sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': - resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.3': + resolution: {integrity: sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==} cpu: [ppc64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': - resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.3': + resolution: {integrity: sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': - resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} + '@oxc-resolver/binding-linux-riscv64-musl@11.21.3': + resolution: {integrity: sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': - resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} + '@oxc-resolver/binding-linux-s390x-gnu@11.21.3': + resolution: {integrity: sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': - resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} + '@oxc-resolver/binding-linux-x64-gnu@11.21.3': + resolution: {integrity: sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@11.19.1': - resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} + '@oxc-resolver/binding-linux-x64-musl@11.21.3': + resolution: {integrity: sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-openharmony-arm64@11.19.1': - resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} + '@oxc-resolver/binding-openharmony-arm64@11.21.3': + resolution: {integrity: sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.19.1': - resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} + '@oxc-resolver/binding-wasm32-wasi@11.21.3': + resolution: {integrity: sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': - resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} + '@oxc-resolver/binding-win32-arm64-msvc@11.21.3': + resolution: {integrity: sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': - resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} - cpu: [ia32] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': - resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} + '@oxc-resolver/binding-win32-x64-msvc@11.21.3': + resolution: {integrity: sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==} cpu: [x64] os: [win32] @@ -1003,12 +993,15 @@ packages: peerDependencies: eslint: ^9.0.0 || ^10.0.0 - '@ts-morph/common@0.28.1': - resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + '@ts-morph/common@0.29.0': + resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1030,8 +1023,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.19.18': - resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} + '@types/node@22.20.0': + resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1145,11 +1138,11 @@ packages: resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.1.5': - resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} + '@vitest/coverage-v8@4.1.9': + resolution: {integrity: sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==} peerDependencies: - '@vitest/browser': 4.1.5 - vitest: 4.1.5 + '@vitest/browser': 4.1.9 + vitest: 4.1.9 peerDependenciesMeta: '@vitest/browser': optional: true @@ -1170,11 +1163,11 @@ packages: vitest: optional: true - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1184,20 +1177,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} '@vue/compiler-core@3.5.24': resolution: {integrity: sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==} @@ -1397,8 +1390,8 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - effect@4.0.0-beta.64: - resolution: {integrity: sha512-xI332I9guVLsqvLg7aO62IuWq9LiCMs+u5dhr4JDyND2ndYXAk5eaR8KMqtYLoJg1Ie28VQToYPM+xBLEBU3pQ==} + effect@4.0.0-beta.85: + resolution: {integrity: sha512-Cjv9YQyv4CiIccmRAQIWAoeESCpCpiuHYY8zb5vqiYs3Ac2yE5RQAnKq7z4Ir/3VJYZb8kxh6rS8czDDnpTdkQ==} electron-to-chromium@1.5.250: resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} @@ -1661,8 +1654,8 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - fast-check@4.7.0: - resolution: {integrity: sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==} + fast-check@4.8.0: + resolution: {integrity: sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==} engines: {node: '>=12.17.0'} fast-deep-equal@3.1.3: @@ -1796,9 +1789,9 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - ini@6.0.0: - resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} - engines: {node: ^20.17.0 || >=22.9.0} + ini@7.0.0: + resolution: {integrity: sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} is-builtin-module@5.0.0: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} @@ -1870,8 +1863,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@6.12.1: - resolution: {integrity: sha512-9JRZB1mENe8xNMpP4jJRiFXkRVBHTWzD7YtiLywkO7aKXCefbvI+hA0YDl7H7dPvJt7gcVolgxKgABJQ31NL3w==} + knip@6.17.1: + resolution: {integrity: sha512-HcQsZSQ4Ymhuay4BVzJtM5pFZNDSomYYqcNCZOSITPQh9g18a09DqziWAxSt2G+BH9wGlG+0ZjWpEnaFlnKseQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2041,10 +2034,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} - engines: {node: 20 || >=22} - minimatch@10.2.4: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} @@ -2052,9 +2041,6 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -2064,12 +2050,12 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} hasBin: true - msgpackr@1.11.12: - resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==} + msgpackr@2.0.4: + resolution: {integrity: sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA==} multipasta@0.2.7: resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==} @@ -2119,12 +2105,12 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxc-parser@0.128.0: - resolution: {integrity: sha512-XkOw3eiIxAgQ19WRew/Bq9wc5Ga/guaWIzDBzq80z1PyuDNGvWBpPby9k6YGwV8A8uMw+Nlq3xqlzuDYmUFYUw==} + oxc-parser@0.135.0: + resolution: {integrity: sha512-/DaPStu0s2zzNSRRniKyTPM6Z/o+DapOp2JYNKDL8AsgaBGPK2IdZyB87SQjVH+xeQPz+Qr9mrjglfkYgtbVRA==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-resolver@11.19.1: - resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} + oxc-resolver@11.21.3: + resolution: {integrity: sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==} oxfmt@0.35.0: resolution: {integrity: sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==} @@ -2194,6 +2180,9 @@ packages: pnpm-workspace-yaml@1.6.0: resolution: {integrity: sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw==} + pnpm-workspace-yaml@1.6.1: + resolution: {integrity: sha512-yTeZntGWi8m9WNuhoVsP0DpFc4sC1U0+rr/qR6Zi9n2g3sxXY+JfccjXjjruNz96tM8I09yaJUA86doRnNLkbg==} + postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} @@ -2338,8 +2327,8 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - taze@19.11.0: - resolution: {integrity: sha512-BlfH8Z6JdoIsrUptnz4P4YuEqdYsa/bSNNDOMhTlsHZ7Bbg1/0NyYh6uPkoRREjrt/kVovV+HYdi1ilHxvChfw==} + taze@19.14.1: + resolution: {integrity: sha512-+wf/IqGReU68vBE/iJ7JCuV5QeD6zQBp9MI6YphN7bT2vf/YIHd0oVA4AJiX3uANI1hQY58MrVmDwLv0x/q3BA==} hasBin: true tinybench@2.9.0: @@ -2349,14 +2338,14 @@ packages: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} - engines: {node: '>=18'} - tinyexec@1.1.2: resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -2365,6 +2354,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} @@ -2396,8 +2389,8 @@ packages: peerDependencies: typescript: '>=4.0.0' - ts-morph@27.0.2: - resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + ts-morph@28.0.0: + resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2414,8 +2407,8 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - unbash@3.0.0: - resolution: {integrity: sha512-FeFPZ/WFT0mbRCuydiZzpPFlrYN8ZUpphQKoq4EeElVIYjYyGzPMxQR/simUwCOJIyVhpFk4RbtyO7RuMpMnHA==} + unbash@4.0.1: + resolution: {integrity: sha512-1ajSo3813sDoVIHx4inJdUS4l5L2ic5cFiddemPiyjb/PZEoBAhFwHtbaEdRDFxbAKy7FCG7s5ww3/uCFawuIA==} engines: {node: '>=14'} unconfig-core@7.5.0: @@ -2451,8 +2444,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@13.0.2: - resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true vite@7.3.1: @@ -2495,20 +2488,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2573,13 +2566,13 @@ packages: engines: {node: '>= 14.6'} hasBin: true - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + yaml@2.8.4: + resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} engines: {node: '>= 14.6'} hasBin: true - yaml@2.8.4: - resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -2595,7 +2588,7 @@ packages: snapshots: - '@antfu/eslint-config@7.7.3(@typescript-eslint/rule-tester@8.56.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3))(@typescript-eslint/utils@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@vue/compiler-sfc@3.5.24)(eslint-plugin-format@2.0.1(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.5)': + '@antfu/eslint-config@7.7.3(@typescript-eslint/rule-tester@8.56.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3))(@typescript-eslint/utils@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@vue/compiler-sfc@3.5.24)(eslint-plugin-format@2.0.1(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.9)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 1.1.0 @@ -2605,7 +2598,7 @@ snapshots: '@stylistic/eslint-plugin': 5.10.0(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.6.13(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.5) + '@vitest/eslint-plugin': 1.6.13(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.9) ansis: 4.2.0 cac: 7.0.0 eslint: 9.39.4(jiti@2.7.0) @@ -2652,12 +2645,12 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.0.2 - '@antfu/ni@30.0.0': + '@antfu/ni@30.1.0': dependencies: fzf: 0.5.2 package-manager-detector: 1.6.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.2.4 + tinyglobby: 0.2.16 '@babel/helper-string-parser@7.27.1': {} @@ -2695,7 +2688,7 @@ snapshots: optionalDependencies: eslint: 9.39.4(jiti@2.7.0) - '@effect/language-service@0.85.1': {} + '@effect/language-service@0.86.2': {} '@emnapi/core@1.10.0': dependencies: @@ -2703,9 +2696,9 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/core@1.7.1': + '@emnapi/core@1.11.0': dependencies: - '@emnapi/wasi-threads': 1.1.0 + '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true @@ -2714,17 +2707,17 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.11.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.1': + '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 optional: true @@ -2925,12 +2918,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -2940,29 +2927,22 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@napi-rs/wasm-runtime@1.1.1': - dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 - '@tybys/wasm-util': 0.10.1 + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': optional: true '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -2972,134 +2952,140 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@ota-meshi/ast-token-store@0.3.0': {} - '@oxc-parser/binding-android-arm-eabi@0.128.0': + '@oxc-parser/binding-android-arm-eabi@0.135.0': optional: true - '@oxc-parser/binding-android-arm64@0.128.0': + '@oxc-parser/binding-android-arm64@0.135.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.128.0': + '@oxc-parser/binding-darwin-arm64@0.135.0': optional: true - '@oxc-parser/binding-darwin-x64@0.128.0': + '@oxc-parser/binding-darwin-x64@0.135.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.128.0': + '@oxc-parser/binding-freebsd-x64@0.135.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.128.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.135.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.128.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.135.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.128.0': + '@oxc-parser/binding-linux-arm64-gnu@0.135.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.128.0': + '@oxc-parser/binding-linux-arm64-musl@0.135.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.128.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.135.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.128.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.135.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.128.0': + '@oxc-parser/binding-linux-riscv64-musl@0.135.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.128.0': + '@oxc-parser/binding-linux-s390x-gnu@0.135.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.128.0': + '@oxc-parser/binding-linux-x64-gnu@0.135.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.128.0': + '@oxc-parser/binding-linux-x64-musl@0.135.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.128.0': + '@oxc-parser/binding-openharmony-arm64@0.135.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.128.0': + '@oxc-parser/binding-wasm32-wasi@0.135.0': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.128.0': + '@oxc-parser/binding-win32-arm64-msvc@0.135.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.128.0': + '@oxc-parser/binding-win32-ia32-msvc@0.135.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.128.0': + '@oxc-parser/binding-win32-x64-msvc@0.135.0': optional: true - '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.135.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': + '@oxc-resolver/binding-android-arm-eabi@11.21.3': optional: true - '@oxc-resolver/binding-android-arm64@11.19.1': + '@oxc-resolver/binding-android-arm64@11.21.3': optional: true - '@oxc-resolver/binding-darwin-arm64@11.19.1': + '@oxc-resolver/binding-darwin-arm64@11.21.3': optional: true - '@oxc-resolver/binding-darwin-x64@11.19.1': + '@oxc-resolver/binding-darwin-x64@11.21.3': optional: true - '@oxc-resolver/binding-freebsd-x64@11.19.1': + '@oxc-resolver/binding-freebsd-x64@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': + '@oxc-resolver/binding-linux-arm64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': + '@oxc-resolver/binding-linux-arm64-musl@11.21.3': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + '@oxc-resolver/binding-linux-riscv64-musl@11.21.3': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + '@oxc-resolver/binding-linux-s390x-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + '@oxc-resolver/binding-linux-x64-gnu@11.21.3': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.19.1': + '@oxc-resolver/binding-linux-x64-musl@11.21.3': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.19.1': + '@oxc-resolver/binding-openharmony-arm64@11.21.3': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1': + '@oxc-resolver/binding-wasm32-wasi@11.21.3': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': + '@oxc-resolver/binding-win32-arm64-msvc@11.21.3': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': + '@oxc-resolver/binding-win32-x64-msvc@11.21.3': optional: true '@oxfmt/binding-android-arm-eabi@0.35.0': @@ -3254,17 +3240,22 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.3 - '@ts-morph/common@0.28.1': + '@ts-morph/common@0.29.0': dependencies: - minimatch: 10.1.1 + minimatch: 10.2.4 path-browserify: 1.0.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -3286,7 +3277,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.19.18': + '@types/node@22.20.0': dependencies: undici-types: 6.21.0 @@ -3460,10 +3451,10 @@ snapshots: '@typescript-eslint/types': 8.57.2 eslint-visitor-keys: 5.0.0 - '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': + '@vitest/coverage-v8@4.1.9(vitest@4.1.9)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.9 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -3472,9 +3463,9 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4)) + vitest: 4.1.9(@types/node@22.20.0)(@vitest/coverage-v8@4.1.9)(vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0)) - '@vitest/eslint-plugin@1.6.13(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.5)': + '@vitest/eslint-plugin@1.6.13(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)(vitest@4.1.9)': dependencies: '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/utils': 8.56.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) @@ -3482,48 +3473,48 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) typescript: 5.9.3 - vitest: 4.1.5(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4)) + vitest: 4.1.9(@types/node@22.20.0)(@vitest/coverage-v8@4.1.9)(vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4))': + '@vitest/mocker@4.1.9(vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4) + vite: 7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.9': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.9': {} - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.9 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -3711,18 +3702,18 @@ snapshots: diff-sequences@29.6.3: {} - effect@4.0.0-beta.64: + effect@4.0.0-beta.85: dependencies: '@standard-schema/spec': 1.1.0 - fast-check: 4.7.0 + fast-check: 4.8.0 find-my-way-ts: 0.1.6 - ini: 6.0.0 + ini: 7.0.0 kubernetes-types: 1.30.0 - msgpackr: 1.11.12 + msgpackr: 2.0.4 multipasta: 0.2.7 toml: 4.1.1 - uuid: 13.0.2 - yaml: 2.8.4 + uuid: 14.0.0 + yaml: 2.9.0 electron-to-chromium@1.5.250: {} @@ -4088,7 +4079,7 @@ snapshots: exsolve@1.0.8: {} - fast-check@4.7.0: + fast-check@4.8.0: dependencies: pure-rand: 8.4.0 @@ -4192,7 +4183,7 @@ snapshots: indent-string@5.0.0: {} - ini@6.0.0: {} + ini@7.0.0: {} is-builtin-module@5.0.0: dependencies: @@ -4251,21 +4242,20 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@6.12.1: + knip@6.17.1: dependencies: fdir: 6.5.0(picomatch@4.0.4) formatly: 0.3.0 get-tsconfig: 4.14.0 jiti: 2.7.0 - minimist: 1.2.8 - oxc-parser: 0.128.0 - oxc-resolver: 11.19.1 + oxc-parser: 0.135.0 + oxc-resolver: 11.21.3 picomatch: 4.0.4 smol-toml: 1.6.1 strip-json-comments: 5.0.3 - tinyglobby: 0.2.16 - unbash: 3.0.0 - yaml: 2.8.3 + tinyglobby: 0.2.17 + unbash: 4.0.1 + yaml: 2.9.0 zod: 4.1.13 kubernetes-types@1.30.0: {} @@ -4620,10 +4610,6 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.1.1: - dependencies: - '@isaacs/brace-expansion': 5.0.0 - minimatch@10.2.4: dependencies: brace-expansion: 5.0.4 @@ -4632,8 +4618,6 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimist@1.2.8: {} - mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -4645,21 +4629,21 @@ snapshots: ms@2.1.3: {} - msgpackr-extract@3.0.3: + msgpackr-extract@3.0.4: dependencies: node-gyp-build-optional-packages: 5.2.2 optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 optional: true - msgpackr@1.11.12: + msgpackr@2.0.4: optionalDependencies: - msgpackr-extract: 3.0.3 + msgpackr-extract: 3.0.4 multipasta@0.2.7: {} @@ -4707,53 +4691,52 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxc-parser@0.128.0: + oxc-parser@0.135.0: dependencies: - '@oxc-project/types': 0.128.0 + '@oxc-project/types': 0.135.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.128.0 - '@oxc-parser/binding-android-arm64': 0.128.0 - '@oxc-parser/binding-darwin-arm64': 0.128.0 - '@oxc-parser/binding-darwin-x64': 0.128.0 - '@oxc-parser/binding-freebsd-x64': 0.128.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.128.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.128.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.128.0 - '@oxc-parser/binding-linux-arm64-musl': 0.128.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.128.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.128.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.128.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.128.0 - '@oxc-parser/binding-linux-x64-gnu': 0.128.0 - '@oxc-parser/binding-linux-x64-musl': 0.128.0 - '@oxc-parser/binding-openharmony-arm64': 0.128.0 - '@oxc-parser/binding-wasm32-wasi': 0.128.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.128.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.128.0 - '@oxc-parser/binding-win32-x64-msvc': 0.128.0 - - oxc-resolver@11.19.1: + '@oxc-parser/binding-android-arm-eabi': 0.135.0 + '@oxc-parser/binding-android-arm64': 0.135.0 + '@oxc-parser/binding-darwin-arm64': 0.135.0 + '@oxc-parser/binding-darwin-x64': 0.135.0 + '@oxc-parser/binding-freebsd-x64': 0.135.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.135.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.135.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.135.0 + '@oxc-parser/binding-linux-arm64-musl': 0.135.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.135.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.135.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.135.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.135.0 + '@oxc-parser/binding-linux-x64-gnu': 0.135.0 + '@oxc-parser/binding-linux-x64-musl': 0.135.0 + '@oxc-parser/binding-openharmony-arm64': 0.135.0 + '@oxc-parser/binding-wasm32-wasi': 0.135.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.135.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.135.0 + '@oxc-parser/binding-win32-x64-msvc': 0.135.0 + + oxc-resolver@11.21.3: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.19.1 - '@oxc-resolver/binding-android-arm64': 11.19.1 - '@oxc-resolver/binding-darwin-arm64': 11.19.1 - '@oxc-resolver/binding-darwin-x64': 11.19.1 - '@oxc-resolver/binding-freebsd-x64': 11.19.1 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.19.1 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.19.1 - '@oxc-resolver/binding-linux-arm64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-arm64-musl': 11.19.1 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-riscv64-musl': 11.19.1 - '@oxc-resolver/binding-linux-s390x-gnu': 11.19.1 - '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-x64-musl': 11.19.1 - '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1 - '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 - '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 - '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 + '@oxc-resolver/binding-android-arm-eabi': 11.21.3 + '@oxc-resolver/binding-android-arm64': 11.21.3 + '@oxc-resolver/binding-darwin-arm64': 11.21.3 + '@oxc-resolver/binding-darwin-x64': 11.21.3 + '@oxc-resolver/binding-freebsd-x64': 11.21.3 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.3 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.3 + '@oxc-resolver/binding-linux-arm64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-arm64-musl': 11.21.3 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-riscv64-musl': 11.21.3 + '@oxc-resolver/binding-linux-s390x-gnu': 11.21.3 + '@oxc-resolver/binding-linux-x64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-x64-musl': 11.21.3 + '@oxc-resolver/binding-openharmony-arm64': 11.21.3 + '@oxc-resolver/binding-wasm32-wasi': 11.21.3 + '@oxc-resolver/binding-win32-arm64-msvc': 11.21.3 + '@oxc-resolver/binding-win32-x64-msvc': 11.21.3 oxfmt@0.35.0: dependencies: @@ -4833,6 +4816,10 @@ snapshots: dependencies: yaml: 2.8.2 + pnpm-workspace-yaml@1.6.1: + dependencies: + yaml: 2.9.0 + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 @@ -4970,30 +4957,29 @@ snapshots: tapable@2.3.0: {} - taze@19.11.0: + taze@19.14.1: dependencies: - '@antfu/ni': 30.0.0 + '@antfu/ni': 30.1.0 '@henrygd/queue': 1.2.0 cac: 7.0.0 - find-up-simple: 1.0.1 ofetch: 1.5.1 package-manager-detector: 1.6.0 pathe: 2.0.3 - pnpm-workspace-yaml: 1.6.0 + pnpm-workspace-yaml: 1.6.1 restore-cursor: 5.1.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.2.4 + tinyglobby: 0.2.16 unconfig: 7.5.0 - yaml: 2.8.3 + yaml: 2.9.0 tinybench@2.9.0: {} tinyexec@1.0.2: {} - tinyexec@1.0.4: {} - tinyexec@1.1.2: {} + tinyexec@1.2.4: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -5004,6 +4990,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinypool@2.1.0: {} tinyrainbow@3.1.0: {} @@ -5028,9 +5019,9 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 - ts-morph@27.0.2: + ts-morph@28.0.0: dependencies: - '@ts-morph/common': 0.28.1 + '@ts-morph/common': 0.29.0 code-block-writer: 13.0.3 tslib@2.8.1: @@ -5044,7 +5035,7 @@ snapshots: ufo@1.6.1: {} - unbash@3.0.0: {} + unbash@4.0.1: {} unconfig-core@7.5.0: dependencies: @@ -5092,9 +5083,9 @@ snapshots: util-deprecate@1.0.2: {} - uuid@13.0.2: {} + uuid@14.0.0: {} - vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4): + vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.4) @@ -5103,36 +5094,36 @@ snapshots: rollup: 4.57.0 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 22.19.18 + '@types/node': 22.20.0 fsevents: 2.3.3 jiti: 2.7.0 - yaml: 2.8.4 + yaml: 2.9.0 - vitest@4.1.5(@types/node@22.19.18)(@vitest/coverage-v8@4.1.5)(vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4)): + vitest@4.1.9(@types/node@22.20.0)(@vitest/coverage-v8@4.1.9)(vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@22.19.18)(jiti@2.7.0)(yaml@2.8.4) + vite: 7.3.1(@types/node@22.20.0)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.18 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@types/node': 22.20.0 + '@vitest/coverage-v8': 4.1.9(vitest@4.1.9) transitivePeerDependencies: - msw @@ -5170,10 +5161,10 @@ snapshots: yaml@2.8.2: {} - yaml@2.8.3: {} - yaml@2.8.4: {} + yaml@2.9.0: {} + yocto-queue@0.1.0: {} zod@4.1.13: {} diff --git a/src/Send.ts b/src/Send.ts index e61f1aa..39ac661 100644 --- a/src/Send.ts +++ b/src/Send.ts @@ -91,7 +91,7 @@ const MessageToSendEffectProto = Effectable.Prototype({ label: '@grom.js/effect-tg/Send/MessageToSend', evaluate(this: MessageToSend, _fiber) { return Effect.flatMap( - TargetDialog.asEffect(), + TargetDialog, ({ dialog }) => sendMessage({ dialog, content: this.content, From 6cac850ed04a00f5ccda1a8d485d0a375956caf2 Mon Sep 17 00:00:00 2001 From: evermake Date: Sat, 20 Jun 2026 16:31:53 +0500 Subject: [PATCH 07/16] feat: Bot API v10.1 --- package.json | 2 +- pnpm-lock.yaml | 12 +- src/internal/botApi.gen.ts | 976 +++++++++++++++++++++++++++++++------ 3 files changed, 822 insertions(+), 168 deletions(-) diff --git a/package.json b/package.json index f1c9c75..cb6723a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "devDependencies": { "@antfu/eslint-config": "7.7.3", "@effect/language-service": "0.86.2", - "@grom.js/bot-api-spec": "0.10.1", + "@grom.js/bot-api-spec": "0.11.1", "@grom.js/tgx": "1.4.3", "@types/node": "22.20.0", "@vitest/coverage-v8": "4.1.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3402ff6..d12b8d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: 0.86.2 version: 0.86.2 '@grom.js/bot-api-spec': - specifier: 0.10.1 - version: 0.10.1 + specifier: 0.11.1 + version: 0.11.1 '@grom.js/tgx': specifier: 1.4.3 version: 1.4.3 @@ -434,8 +434,8 @@ packages: resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@grom.js/bot-api-spec@0.10.1': - resolution: {integrity: sha512-eLR0vX3ZDWiRKkbT5PmNxH5n9UxpV6C8LDLej6p2sOstVIJ0pNYBR17zF5cFSj4WjgS6In2WXCP5y3bwhgacow==} + '@grom.js/bot-api-spec@0.11.1': + resolution: {integrity: sha512-JN8yIhJr/HN9RlmuVCAWrKeQp3VamMin/azw2imR8pScAYT0KeIhXR2kPoGdzZXLTxadfrDE4ER4onzarjXBTA==} engines: {node: '>=22.18'} '@grom.js/tgx@1.4.3': @@ -2899,7 +2899,7 @@ snapshots: '@eslint/core': 1.1.0 levn: 0.4.1 - '@grom.js/bot-api-spec@0.10.1': {} + '@grom.js/bot-api-spec@0.11.1': {} '@grom.js/tgx@1.4.3': dependencies: @@ -5092,7 +5092,7 @@ snapshots: picomatch: 4.0.4 postcss: 8.5.6 rollup: 4.57.0 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 22.20.0 fsevents: 2.3.3 diff --git a/src/internal/botApi.gen.ts b/src/internal/botApi.gen.ts index 1e2b173..b9f49c7 100644 --- a/src/internal/botApi.gen.ts +++ b/src/internal/botApi.gen.ts @@ -146,6 +146,10 @@ export interface BotApi { approveChatJoinRequest: BotApiMethod<'approveChatJoinRequest'> /** Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the _can\_invite\_users_ administrator right. Returns _True_ on success. */ declineChatJoinRequest: BotApiMethod<'declineChatJoinRequest'> + /** Use this method to process a received chat join request query. Returns _True_ on success. */ + answerChatJoinRequestQuery: BotApiMethod<'answerChatJoinRequestQuery'> + /** Use this method to process a received chat join request query by showing a Mini App to the user before deciding the outcome. Returns _True_ on success. */ + sendChatJoinRequestWebApp: BotApiMethod<'sendChatJoinRequestWebApp'> /** Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns _True_ on success. */ setChatPhoto: BotApiMethod<'setChatPhoto'> /** Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns _True_ on success. */ @@ -312,11 +316,11 @@ export interface BotApi { savePreparedInlineMessage: BotApiMethod<'savePreparedInlineMessage'> /** Stores a keyboard button that can be used by a user within a Mini App. Returns a [PreparedKeyboardButton](https://core.telegram.org/bots/api#preparedkeyboardbutton) object. */ savePreparedKeyboardButton: BotApiMethod<'savePreparedKeyboardButton'> - /** Use this method to edit text and [game](https://core.telegram.org/bots/api#games) messages. On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise _True_ is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. */ + /** Use this method to edit text, rich and [game](https://core.telegram.org/bots/api#games) messages. On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise _True_ is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. */ editMessageText: BotApiMethod<'editMessageText'> /** Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise _True_ is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. */ editMessageCaption: BotApiMethod<'editMessageCaption'> - /** Use this method to edit animation, audio, document, live photo, photo, or video messages, or to add media to text messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file\_id or specify a URL. On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise _True_ is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. */ + /** Use this method to edit animation, audio, document, live photo, photo, or video messages, or to replace a text or a rich message with a media. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo, a live photo, or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file\_id or specify a URL. On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise _True_ is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. */ editMessageMedia: BotApiMethod<'editMessageMedia'> /** Use this method to edit live location messages. A location can be edited until its _live\_period_ expires or editing is explicitly disabled by a call to [stopMessageLiveLocation](https://core.telegram.org/bots/api#stopmessagelivelocation). On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise _True_ is returned. */ editMessageLiveLocation: BotApiMethod<'editMessageLiveLocation'> @@ -394,6 +398,10 @@ export interface BotApi { setCustomEmojiStickerSetThumbnail: BotApiMethod<'setCustomEmojiStickerSetThumbnail'> /** Use this method to delete a sticker set that was created by the bot. Returns _True_ on success. */ deleteStickerSet: BotApiMethod<'deleteStickerSet'> + /** Use this method to send rich messages. If the message contains a block with a media element, then the bot must have the right to send the media to the chat. On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned. */ + sendRichMessage: BotApiMethod<'sendRichMessage'> + /** Use this method to stream a partial rich message to a user while the message is being generated. Note that the streamed draft is ephemeral and acts as a temporary 30-second preview - once the output is finalized, you **must** call [sendRichMessage](https://core.telegram.org/bots/api#sendrichmessage) with the complete message to persist it in the user's chat. Returns _True_ on success. */ + sendRichMessageDraft: BotApiMethod<'sendRichMessageDraft'> /** * Use this method to send answers to an inline query. On success, _True_ is returned. * @@ -471,13 +479,13 @@ export declare namespace Types { chosen_inline_result?: Types.ChosenInlineResult | undefined /** New incoming callback query */ callback_query?: Types.CallbackQuery | undefined - /** New incoming shipping query. Only for invoices with flexible price */ + /** New incoming shipping query. Only for invoices with flexible price. */ shipping_query?: Types.ShippingQuery | undefined - /** New incoming pre-checkout query. Contains full information about checkout */ + /** New incoming pre-checkout query. Contains full information about checkout. */ pre_checkout_query?: Types.PreCheckoutQuery | undefined /** A user purchased paid media with a non-empty payload sent by the bot in a non-channel chat */ purchased_paid_media?: Types.PaidMediaPurchased | undefined - /** New poll state. Bots receive only updates about manually stopped polls and polls, which are sent by the bot */ + /** New poll state. Bots receive only updates about manually stopped polls and polls, which are sent by the bot. */ poll?: Types.Poll | undefined /** A user changed their answer in a non-anonymous poll. Bots receive new votes only in polls that were sent by the bot itself. */ poll_answer?: Types.PollAnswer | undefined @@ -513,7 +521,7 @@ export declare namespace Types { last_synchronization_error_date?: number | undefined /** The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery */ max_connections?: number | undefined - /** A list of update types the bot is subscribed to. Defaults to all update types except _chat\_member_ */ + /** A list of update types the bot is subscribed to. Defaults to all update types except _chat\_member_, _message\_reaction_, and _message\_reaction\_count_. */ allowed_updates?: Array | undefined } @@ -553,6 +561,8 @@ export declare namespace Types { allows_users_to_create_topics?: boolean | undefined /** _True_, if other bots can be created to be controlled by the bot. Returned only in [getMe](https://core.telegram.org/bots/api#getme). */ can_manage_bots?: boolean | undefined + /** _True_, if the bot supports join request queries and can be assigned to process them. Returned only in [getMe](https://core.telegram.org/bots/api#getme). */ + supports_join_request_queries?: boolean | undefined } /** This object represents a chat. */ @@ -677,19 +687,21 @@ export declare namespace Types { first_profile_audio?: Types.Audio | undefined /** The color scheme based on a unique gift that must be used for the chat's name, message replies and link previews */ unique_gift_colors?: Types.UniqueGiftColors | undefined - /** The number of Telegram Stars a general user have to pay to send a message to the chat */ + /** The number of Telegram Stars a general user has to pay to send a message to the chat */ paid_message_star_count?: number | undefined + /** The bot that processes join request queries in the chat. The field is only available to chat administrators. */ + guard_bot?: Types.User | undefined } /** This object represents a message. */ export interface Message { - /** Unique message identifier inside this chat. In specific instances (e.g., message containing a video sent to a big chat), the server might automatically schedule a message instead of sending it immediately. In such cases, this field will be 0 and the relevant message will be unusable until it is actually sent */ + /** Unique message identifier inside this chat. In specific instances (e.g., message containing a video sent to a big chat), the server might automatically schedule a message instead of sending it immediately. In such cases, this field will be 0 and the relevant message will be unusable until it is actually sent. */ message_id: number /** Unique identifier of a message thread or forum topic to which the message belongs; for supergroups and private chats only */ message_thread_id?: number | undefined /** Information about the direct messages chat topic that contains the message */ direct_messages_topic?: Types.DirectMessagesTopic | undefined - /** Sender of the message; may be empty for messages sent to channels. For backward compatibility, if the message was sent on behalf of a chat, the field contains a fake sender user in non-channel chats */ + /** Sender of the message; may be empty for messages sent to channels. For backward compatibility, if the message was sent on behalf of a chat, the field contains a fake sender user in non-channel chats. */ from?: Types.User | undefined /** Sender of the message when sent on behalf of a chat. For example, the supergroup itself for messages sent by its anonymous administrators or a linked channel for messages automatically forwarded to the channel's discussion group. For backward compatibility, if the message was sent on behalf of a chat, the field _from_ contains a fake sender user in non-channel chats. */ sender_chat?: Types.Chat | undefined @@ -755,13 +767,15 @@ export declare namespace Types { suggested_post_info?: Types.SuggestedPostInfo | undefined /** Unique identifier of the message effect added to the message */ effect_id?: string | undefined - /** Message is an animation, information about the animation. For backward compatibility, when this field is set, the _document_ field will also be set */ + /** Message is a rich formatted message */ + rich_message?: Types.RichMessage | undefined + /** Message is an animation, information about the animation. For backward compatibility, when this field is set, the _document_ field will also be set. */ animation?: Types.Animation | undefined /** Message is an audio file, information about the file */ audio?: Types.Audio | undefined /** Message is a general file, information about the file */ document?: Types.Document | undefined - /** Message is a live photo, information about the live photo. For backward compatibility, when this field is set, the _photo_ field will also be set */ + /** Message is a live photo, information about the live photo. For backward compatibility, when this field is set, the _photo_ field will also be set. */ live_photo?: Types.LivePhoto | undefined /** Message contains paid media; information about the paid media */ paid_media?: Types.PaidMediaInfo | undefined @@ -795,7 +809,7 @@ export declare namespace Types { game?: Types.Game | undefined /** Message is a native poll, information about the poll */ poll?: Types.Poll | undefined - /** Message is a venue, information about the venue. For backward compatibility, when this field is set, the _location_ field will also be set */ + /** Message is a venue, information about the venue. For backward compatibility, when this field is set, the _location_ field will also be set. */ venue?: Types.Venue | undefined /** Message is a shared location, information about the location */ location?: Types.Location | undefined @@ -915,7 +929,7 @@ export declare namespace Types { /** This object represents a unique message identifier. */ export interface MessageId { - /** Unique message identifier. In specific instances (e.g., message containing a video sent to a big chat), the server might automatically schedule a message instead of sending it immediately. In such cases, this field will be 0 and the relevant message will be unusable until it is actually sent */ + /** Unique message identifier. In specific instances (e.g., message containing a video sent to a big chat), the server might automatically schedule a message instead of sending it immediately. In such cases, this field will be 0 and the relevant message will be unusable until it is actually sent. */ message_id: number } @@ -939,7 +953,7 @@ export declare namespace Types { /** This object represents one special entity in a text message. For example, hashtags, usernames, URLs, etc. */ export interface MessageEntity { - /** Type of the entity. Currently, can be “mention” (`@username`), “hashtag” (`#hashtag` or `#hashtag@chatusername`), “cashtag” (`$USD` or `$USD@chatusername`), “bot\_command” (`/start@jobs_bot`), “url” (`https://telegram.org`), “email” (`do-not-reply@telegram.org`), “phone\_number” (`+1-212-555-0123`), “bold” (**bold text**), “italic” (_italic text_), “underline” (underlined text), “strikethrough” (strikethrough text), “spoiler” (spoiler message), “blockquote” (block quotation), “expandable\_blockquote” (collapsed-by-default block quotation), “code” (monowidth string), “pre” (monowidth block), “text\_link” (for clickable text URLs), “text\_mention” (for users [without usernames](https://telegram.org/blog/edit#new-mentions)), “custom\_emoji” (for inline custom emoji stickers), or “date\_time” (for formatted date and time) */ + /** Type of the entity. Currently, can be “mention” (`@username`), “hashtag” (`#hashtag` or `#hashtag@chatusername`), “cashtag” (`$USD` or `$USD@chatusername`), “bot\_command” (`/start@jobs_bot`), “url” (`https://telegram.org`), “email” (`do-not-reply@telegram.org`), “phone\_number” (`+1-212-555-0123`), “bold” (**bold text**), “italic” (_italic text_), “underline” (underlined text), “strikethrough” (strikethrough text), “spoiler” (spoiler message), “blockquote” (block quotation), “expandable\_blockquote” (collapsed-by-default block quotation), “code” (monowidth string), “pre” (monowidth block), “text\_link” (for clickable text URLs), “text\_mention” (for users [without usernames](https://telegram.org/blog/edit#new-mentions)), “custom\_emoji” (for inline custom emoji stickers), or “date\_time” (for formatted date and time). */ type: 'mention' | 'hashtag' | 'cashtag' | 'bot_command' | 'url' | 'email' | 'phone_number' | 'bold' | 'italic' | 'underline' | 'strikethrough' | 'spoiler' | 'blockquote' | 'expandable_blockquote' | 'code' | 'pre' | 'text_link' | 'text_mention' | 'custom_emoji' | 'date_time' /** Offset in [UTF-16 code units](https://core.telegram.org/api/entities#entity-length) to the start of the entity */ offset: number @@ -951,7 +965,7 @@ export declare namespace Types { user?: Types.User | undefined /** For “pre” only, the programming language of the entity text */ language?: string | undefined - /** For “custom\_emoji” only, unique identifier of the custom emoji. Use [getCustomEmojiStickers](https://core.telegram.org/bots/api#getcustomemojistickers) to get full information about the sticker */ + /** For “custom\_emoji” only, unique identifier of the custom emoji. Use [getCustomEmojiStickers](https://core.telegram.org/bots/api#getcustomemojistickers) to get full information about the sticker. */ custom_emoji_id?: string | undefined /** For “date\_time” only, the Unix time associated with the entity */ unix_time?: number | undefined @@ -1299,7 +1313,7 @@ export declare namespace Types { */ export type PaidMedia = Types.PaidMediaLivePhoto | Types.PaidMediaPhoto | Types.PaidMediaPreview | Types.PaidMediaVideo - /** */ + /** The paid media is a [live photo](https://core.telegram.org/bots/api#livephoto). */ export interface PaidMediaLivePhoto { /** Type of the paid media, always “live\_photo” */ type: string @@ -1357,6 +1371,12 @@ export declare namespace Types { value: number } + /** Represents an HTTP link. */ + export interface Link { + /** URL of the link */ + url: string + } + /** At most **one** of the optional fields can be present in any given object. */ export interface PollMedia { /** Media is an animation, information about the animation */ @@ -1365,6 +1385,8 @@ export declare namespace Types { audio?: Types.Audio | undefined /** Media is a general file, information about the file; currently, can't be received in a poll option */ document?: Types.Document | undefined + /** The HTTP link attached to the poll option */ + link?: Types.Link | undefined /** Media is a live photo, information about the live photo */ live_photo?: Types.LivePhoto | undefined /** Media is a shared location, information about the location */ @@ -1396,6 +1418,7 @@ export declare namespace Types { * This object represents the content of a poll option to be sent. It should be one of * * - [InputMediaAnimation](https://core.telegram.org/bots/api#inputmediaanimation) + * - [InputMediaLink](https://core.telegram.org/bots/api#inputmedialink) * - [InputMediaLivePhoto](https://core.telegram.org/bots/api#inputmedialivephoto) * - [InputMediaLocation](https://core.telegram.org/bots/api#inputmedialocation) * - [InputMediaPhoto](https://core.telegram.org/bots/api#inputmediaphoto) @@ -1403,7 +1426,7 @@ export declare namespace Types { * - [InputMediaVenue](https://core.telegram.org/bots/api#inputmediavenue) * - [InputMediaVideo](https://core.telegram.org/bots/api#inputmediavideo) */ - export type InputPollOptionMedia = Types.InputMediaAnimation | Types.InputMediaLivePhoto | Types.InputMediaLocation | Types.InputMediaPhoto | Types.InputMediaSticker | Types.InputMediaVenue | Types.InputMediaVideo + export type InputPollOptionMedia = Types.InputMediaAnimation | Types.InputMediaLink | Types.InputMediaLivePhoto | Types.InputMediaLocation | Types.InputMediaPhoto | Types.InputMediaSticker | Types.InputMediaVenue | Types.InputMediaVideo /** This object contains information about one answer option in a poll. */ export interface PollOption { @@ -1429,9 +1452,9 @@ export declare namespace Types { export interface InputPollOption { /** Option text, 1-100 characters */ text: string - /** Mode for parsing entities in the text. See [formatting options](https://core.telegram.org/bots/api#formatting-options) for more details. Currently, only custom emoji entities are allowed */ + /** Mode for parsing entities in the text. See [formatting options](https://core.telegram.org/bots/api#formatting-options) for more details. Currently, only custom emoji entities are allowed. */ text_parse_mode?: 'HTML' | 'MarkdownV2' | 'Markdown' | undefined - /** An array of special entities that appear in the poll option text. It can be specified instead of _text\_parse\_mode_ */ + /** An array of special entities that appear in the poll option text. It can be specified instead of _text\_parse\_mode_. */ text_entities?: Array | undefined /** Media added to the poll option */ media?: Types.InputPollOptionMedia | undefined @@ -1475,7 +1498,7 @@ export declare namespace Types { allows_revoting: boolean /** _True_ if voting is limited to users who have been members of the chat where the poll was originally sent for more than 24 hours */ members_only: boolean - /** A list of two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes indicating the countries from which users can vote in the poll. If omitted, then users from any country can participate in the poll. */ + /** A list of two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes indicating the countries from which users can vote in the poll. The country code “FT” is used for users with anonymous numbers. If omitted, then users from any country can participate in the poll. */ country_codes?: Array | undefined /** Array of 0-based identifiers of the correct answer options. Available only for polls in quiz mode which are closed or were sent (not forwarded) by the bot or to the private chat with the bot. */ correct_option_ids?: Array | undefined @@ -1591,7 +1614,7 @@ export declare namespace Types { /** This object represents a venue. */ export interface Venue { - /** Venue location. Can't be a live location */ + /** Venue location. Can't be a live location. */ location: Types.Location /** Name of the venue */ title: string @@ -1756,7 +1779,7 @@ export declare namespace Types { fill: Types.BackgroundFill /** Intensity of the pattern when it is shown above the filled background; 0-100 */ intensity: number - /** _True_, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only */ + /** _True_, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only. */ is_inverted?: true | undefined /** _True_, if the background moves slightly when the device is tilted */ is_moving?: true | undefined @@ -1830,7 +1853,7 @@ export declare namespace Types { export interface UsersShared { /** Identifier of the request */ request_id: number - /** Information about users shared with the bot. */ + /** Information about users shared with the bot */ users: Array } @@ -1840,9 +1863,9 @@ export declare namespace Types { request_id: number /** Identifier of the shared chat. The bot may not have access to the chat and could be unable to use this identifier, unless the chat is already known to the bot by some other means. */ chat_id: number - /** Title of the chat, if the title was requested by the bot. */ + /** Title of the chat, if the title was requested by the bot */ title?: string | undefined - /** Username of the chat, if the username was requested by the bot and available. */ + /** Username of the chat, if the username was requested by the bot and available */ username?: string | undefined /** Available sizes of the chat photo, if the photo was requested by the bot */ photo?: Array | undefined @@ -1924,7 +1947,7 @@ export declare namespace Types { export interface SuggestedPostPaid { /** Message containing the suggested post. Note that the [Message](https://core.telegram.org/bots/api#message) object in this field will not contain the _reply\_to\_message_ field even if it itself is a reply. */ suggested_post_message?: Types.Message | undefined - /** Currency in which the payment was made. Currently, one of “XTR” for Telegram Stars or “TON” for toncoins */ + /** Currency in which the payment was made. Currently, one of “XTR” for Telegram Stars or “TON” for toncoins. */ currency: 'XTR' | 'TON' /** The amount of the currency that was received by the channel in nanotoncoins; for payments in toncoins only */ amount?: number | undefined @@ -2012,7 +2035,7 @@ export declare namespace Types { export interface LinkPreviewOptions { /** _True_, if the link preview is disabled */ is_disabled?: boolean | undefined - /** URL to use for the link preview. If empty, then the first URL found in the message text will be used */ + /** URL to use for the link preview. If empty, then the first URL found in the message text will be used. */ url?: string | undefined /** _True_, if the media in the link preview is supposed to be shrunk; ignored if the URL isn't explicitly specified or media size change isn't supported for the preview */ prefer_small_media?: boolean | undefined @@ -2024,7 +2047,7 @@ export declare namespace Types { /** Describes the price of a suggested post. */ export interface SuggestedPostPrice { - /** Currency in which the post will be paid. Currently, must be one of “XTR” for Telegram Stars or “TON” for toncoins */ + /** Currency in which the post will be paid. Currently, must be one of “XTR” for Telegram Stars or “TON” for toncoins. */ currency: 'XTR' | 'TON' /** The amount of the currency that will be paid for the post in the _smallest units_ of the currency, i.e. Telegram Stars or nanotoncoins. Currently, price in Telegram Stars must be between 5 and 100000, and price in nanotoncoins must be between 10000000 and 10000000000000. */ amount: number @@ -2052,7 +2075,7 @@ export declare namespace Types { export interface DirectMessagesTopic { /** Unique identifier of the topic. */ topic_id: number - /** Information about the user that created the topic. Currently, it is always present */ + /** Information about the user that created the topic. Currently, it is always present. */ user?: Types.User | undefined } @@ -2116,7 +2139,7 @@ export declare namespace Types { /** This object represents one button of the reply keyboard. At most one of the fields other than _text_, _icon\_custom\_emoji\_id_, and _style_ must be used to specify the type of the button. For simple text buttons, _String_ can be used instead of this object to specify the button text. */ export interface KeyboardButton { - /** Text of the button. If none of the fields other than _text_, _icon\_custom\_emoji\_id_, and _style_ are used, it will be sent as a message when the button is pressed */ + /** Text of the button. If none of the fields other than _text_, _icon\_custom\_emoji\_id_, and _style_ are used, it will be sent as a message when the button is pressed. */ text: string /** Unique identifier of the custom emoji shown before the text of the button. Can only be used by bots that purchased additional usernames on [Fragment](https://fragment.com/) or in the messages directly sent by the bot to private, group and supergroup chats if the owner of the bot has a Telegram Premium subscription. */ icon_custom_emoji_id?: string | undefined @@ -2140,7 +2163,7 @@ export declare namespace Types { /** This object defines the criteria used to request suitable users. Information about the selected users will be shared with the bot when the corresponding button is pressed. [More about requesting users »](https://core.telegram.org/bots/features#chat-and-user-selection) */ export interface KeyboardButtonRequestUsers { - /** Signed 32-bit identifier of the request that will be received back in the [UsersShared](https://core.telegram.org/bots/api#usersshared) object. Must be unique within the message */ + /** Signed 32-bit identifier of the request that will be received back in the [UsersShared](https://core.telegram.org/bots/api#usersshared) object. Must be unique within the message. */ request_id: number /** Pass _True_ to request bots, pass _False_ to request regular users. If not specified, no additional restrictions are applied. */ user_is_bot?: boolean | undefined @@ -2158,9 +2181,9 @@ export declare namespace Types { /** This object defines the criteria used to request a suitable chat. Information about the selected chat will be shared with the bot when the corresponding button is pressed. The bot will be granted requested rights in the chat if appropriate. [More about requesting chats »](https://core.telegram.org/bots/features#chat-and-user-selection). */ export interface KeyboardButtonRequestChat { - /** Signed 32-bit identifier of the request, which will be received back in the [ChatShared](https://core.telegram.org/bots/api#chatshared) object. Must be unique within the message */ + /** Signed 32-bit identifier of the request, which will be received back in the [ChatShared](https://core.telegram.org/bots/api#chatshared) object. Must be unique within the message. */ request_id: number - /** Pass _True_ to request a channel chat, pass _False_ to request a group or a supergroup chat. */ + /** Pass _True_ to request a channel chat, pass _False_ to request a group or a supergroup chat */ chat_is_channel: boolean /** Pass _True_ to request a forum supergroup, pass _False_ to request a non-forum chat. If not specified, no additional restrictions are applied. */ chat_is_forum?: boolean | undefined @@ -2184,7 +2207,7 @@ export declare namespace Types { /** This object defines the parameters for the creation of a managed bot. Information about the created bot will be shared with the bot using the update _managed\_bot_ and a [Message](https://core.telegram.org/bots/api#message) with the field _managed\_bot\_created_. */ export interface KeyboardButtonRequestManagedBot { - /** Signed 32-bit identifier of the request. Must be unique within the message */ + /** Signed 32-bit identifier of the request. Must be unique within the message. */ request_id: number /** Suggested name for the bot */ suggested_name?: string | undefined @@ -2242,7 +2265,7 @@ export declare namespace Types { switch_inline_query_current_chat?: string | undefined /** If set, pressing the button will prompt the user to select one of their chats of the specified type, open that chat and insert the bot's username and the specified inline query in the input field. Not supported for messages sent in channel direct messages chats and on behalf of a business account. */ switch_inline_query_chosen_chat?: Types.SwitchInlineQueryChosenChat | undefined - /** Description of the button that copies the specified text to the clipboard. */ + /** Description of the button that copies the specified text to the clipboard */ copy_text?: Types.CopyTextButton | undefined /** * Description of the game that will be launched when the user presses the button. @@ -2274,17 +2297,17 @@ export declare namespace Types { * **NOTE:** You **must** always check the hash of the received data to verify the authentication and the integrity of the data as described in [Checking authorization](https://core.telegram.org/widgets/login#checking-authorization). */ url: string - /** New text of the button in forwarded messages. */ + /** New text of the button in forwarded messages */ forward_text?: string | undefined /** Username of a bot, which will be used for user authorization. See [Setting up a bot](https://core.telegram.org/widgets/login#setting-up-a-bot) for more details. If not specified, the current bot's username will be assumed. The _url_'s domain must be the same as the domain linked with the bot. See [Linking your domain to the bot](https://core.telegram.org/widgets/login#linking-your-domain-to-the-bot) for more details. */ bot_username?: string | undefined - /** Pass _True_ to request the permission for your bot to send messages to the user. */ + /** Pass _True_ to request the permission for your bot to send messages to the user */ request_write_access?: boolean | undefined } /** This object represents an inline button that switches the current user to inline mode in a chosen chat, with an optional default inline query. */ export interface SwitchInlineQueryChosenChat { - /** The default inline query to be inserted in the input field. If left empty, only the bot's username will be inserted */ + /** The default inline query to be inserted in the input field. If left empty, only the bot's username will be inserted. */ query?: string | undefined /** _True_, if private chats with users can be chosen */ allow_user_chats?: boolean | undefined @@ -2314,7 +2337,7 @@ export declare namespace Types { from: Types.User /** Message sent by the bot with the callback button that originated the query */ message?: Types.MaybeInaccessibleMessage | undefined - /** Identifier of the message sent via the bot in inline mode, that originated the query. */ + /** Identifier of the message sent via the bot in inline mode, that originated the query */ inline_message_id?: string | undefined /** Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in [games](https://core.telegram.org/bots/api#games). */ chat_instance: string @@ -2431,7 +2454,7 @@ export declare namespace Types { old_chat_member: Types.ChatMember /** New information about the chat member */ new_chat_member: Types.ChatMember - /** Chat invite link, which was used by the user to join the chat; for joining by invite link events only. */ + /** Chat invite link, which was used by the user to join the chat; for joining by invite link events only */ invite_link?: Types.ChatInviteLink | undefined /** _True_, if the user joined the chat after sending a direct join request without using an invite link and being approved by an administrator */ via_join_request?: boolean | undefined @@ -2531,7 +2554,7 @@ export declare namespace Types { user: Types.User /** _True_, if the user is a member of the chat at the moment of the request */ is_member: boolean - /** _True_, if the user is allowed to send text messages, contacts, giveaways, giveaway winners, invoices, locations and venues */ + /** _True_, if the user is allowed to send text messages, rich messages, contacts, giveaways, giveaway winners, invoices, locations and venues */ can_send_messages: boolean /** _True_, if the user is allowed to send audios */ can_send_audios: boolean @@ -2563,7 +2586,7 @@ export declare namespace Types { can_pin_messages: boolean /** _True_, if the user is allowed to create forum topics */ can_manage_topics: boolean - /** Date when restrictions will be lifted for this user; Unix time. If 0, then the user is restricted forever */ + /** Date when restrictions will be lifted for this user; Unix time. If 0, then the user is restricted forever. */ until_date: number } @@ -2581,7 +2604,7 @@ export declare namespace Types { status: 'kicked' /** Information about the user */ user: Types.User - /** Date when restrictions will be lifted for this user; Unix time. If 0, then the user is banned forever */ + /** Date when restrictions will be lifted for this user; Unix time. If 0, then the user is banned forever. */ until_date: number } @@ -2595,15 +2618,17 @@ export declare namespace Types { user_chat_id: number /** Date the request was sent in Unix time */ date: number - /** Bio of the user. */ + /** Bio of the user */ bio?: string | undefined /** Chat invite link that was used by the user to send the join request */ invite_link?: Types.ChatInviteLink | undefined + /** Identifier of the join request query. If present, then the bot must call [sendChatJoinRequestWebApp](https://core.telegram.org/bots/api#sendchatjoinrequestwebapp) or directly call [answerChatJoinRequestQuery](https://core.telegram.org/bots/api#answerchatjoinrequestquery) within 10 seconds. */ + query_id?: string | undefined } /** Describes actions that a non-administrator user is allowed to take in a chat. */ export interface ChatPermissions { - /** _True_, if the user is allowed to send text messages, contacts, giveaways, giveaway winners, invoices, locations and venues */ + /** _True_, if the user is allowed to send text messages, rich messages, contacts, giveaways, giveaway winners, invoices, locations and venues */ can_send_messages?: boolean | undefined /** _True_, if the user is allowed to send audios */ can_send_audios?: boolean | undefined @@ -2627,13 +2652,13 @@ export declare namespace Types { can_react_to_messages?: boolean | undefined /** _True_, if the user is allowed to edit their own tag. If omitted, defaults to the value of _can\_pin\_messages_. */ can_edit_tag?: boolean | undefined - /** _True_, if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups */ + /** _True_, if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups. */ can_change_info?: boolean | undefined /** _True_, if the user is allowed to invite new users to the chat */ can_invite_users?: boolean | undefined - /** _True_, if the user is allowed to pin messages. Ignored in public supergroups */ + /** _True_, if the user is allowed to pin messages. Ignored in public supergroups. */ can_pin_messages?: boolean | undefined - /** _True_, if the user is allowed to create forum topics. If omitted defaults to the value of can\_pin\_messages */ + /** _True_, if the user is allowed to create forum topics. If omitted defaults to the value of can\_pin\_messages. */ can_manage_topics?: boolean | undefined } @@ -2813,7 +2838,7 @@ export declare namespace Types { export interface ReactionTypeEmoji { /** Type of the reaction, always “emoji” */ type: 'emoji' - /** Reaction emoji. Currently, it can be one of "![❤](//telegram.org/img/emoji/40/E29DA4.png)", "![👍](//telegram.org/img/emoji/40/F09F918D.png)", "![👎](//telegram.org/img/emoji/40/F09F918E.png)", "![🔥](//telegram.org/img/emoji/40/F09F94A5.png)", "![🥰](//telegram.org/img/emoji/40/F09FA5B0.png)", "![👏](//telegram.org/img/emoji/40/F09F918F.png)", "![😁](//telegram.org/img/emoji/40/F09F9881.png)", "![🤔](//telegram.org/img/emoji/40/F09FA494.png)", "![🤯](//telegram.org/img/emoji/40/F09FA4AF.png)", "![😱](//telegram.org/img/emoji/40/F09F98B1.png)", "![🤬](//telegram.org/img/emoji/40/F09FA4AC.png)", "![😢](//telegram.org/img/emoji/40/F09F98A2.png)", "![🎉](//telegram.org/img/emoji/40/F09F8E89.png)", "![🤩](//telegram.org/img/emoji/40/F09FA4A9.png)", "![🤮](//telegram.org/img/emoji/40/F09FA4AE.png)", "![💩](//telegram.org/img/emoji/40/F09F92A9.png)", "![🙏](//telegram.org/img/emoji/40/F09F998F.png)", "![👌](//telegram.org/img/emoji/40/F09F918C.png)", "![🕊](//telegram.org/img/emoji/40/F09F958A.png)", "![🤡](//telegram.org/img/emoji/40/F09FA4A1.png)", "![🥱](//telegram.org/img/emoji/40/F09FA5B1.png)", "![🥴](//telegram.org/img/emoji/40/F09FA5B4.png)", "![😍](//telegram.org/img/emoji/40/F09F988D.png)", "![🐳](//telegram.org/img/emoji/40/F09F90B3.png)", "![❤‍🔥](//telegram.org/img/emoji/40/E29DA4E2808DF09F94A5.png)", "![🌚](//telegram.org/img/emoji/40/F09F8C9A.png)", "![🌭](//telegram.org/img/emoji/40/F09F8CAD.png)", "![💯](//telegram.org/img/emoji/40/F09F92AF.png)", "![🤣](//telegram.org/img/emoji/40/F09FA4A3.png)", "![⚡](//telegram.org/img/emoji/40/E29AA1.png)", "![🍌](//telegram.org/img/emoji/40/F09F8D8C.png)", "![🏆](//telegram.org/img/emoji/40/F09F8F86.png)", "![💔](//telegram.org/img/emoji/40/F09F9294.png)", "![🤨](//telegram.org/img/emoji/40/F09FA4A8.png)", "![😐](//telegram.org/img/emoji/40/F09F9890.png)", "![🍓](//telegram.org/img/emoji/40/F09F8D93.png)", "![🍾](//telegram.org/img/emoji/40/F09F8DBE.png)", "![💋](//telegram.org/img/emoji/40/F09F928B.png)", "![🖕](//telegram.org/img/emoji/40/F09F9695.png)", "![😈](//telegram.org/img/emoji/40/F09F9888.png)", "![😴](//telegram.org/img/emoji/40/F09F98B4.png)", "![😭](//telegram.org/img/emoji/40/F09F98AD.png)", "![🤓](//telegram.org/img/emoji/40/F09FA493.png)", "![👻](//telegram.org/img/emoji/40/F09F91BB.png)", "![👨‍💻](//telegram.org/img/emoji/40/F09F91A8E2808DF09F92BB.png)", "![👀](//telegram.org/img/emoji/40/F09F9180.png)", "![🎃](//telegram.org/img/emoji/40/F09F8E83.png)", "![🙈](//telegram.org/img/emoji/40/F09F9988.png)", "![😇](//telegram.org/img/emoji/40/F09F9887.png)", "![😨](//telegram.org/img/emoji/40/F09F98A8.png)", "![🤝](//telegram.org/img/emoji/40/F09FA49D.png)", "![✍](//telegram.org/img/emoji/40/E29C8D.png)", "![🤗](//telegram.org/img/emoji/40/F09FA497.png)", "![🫡](//telegram.org/img/emoji/40/F09FABA1.png)", "![🎅](//telegram.org/img/emoji/40/F09F8E85.png)", "![🎄](//telegram.org/img/emoji/40/F09F8E84.png)", "![☃](//telegram.org/img/emoji/40/E29883.png)", "![💅](//telegram.org/img/emoji/40/F09F9285.png)", "![🤪](//telegram.org/img/emoji/40/F09FA4AA.png)", "![🗿](//telegram.org/img/emoji/40/F09F97BF.png)", "![🆒](//telegram.org/img/emoji/40/F09F8692.png)", "![💘](//telegram.org/img/emoji/40/F09F9298.png)", "![🙉](//telegram.org/img/emoji/40/F09F9989.png)", "![🦄](//telegram.org/img/emoji/40/F09FA684.png)", "![😘](//telegram.org/img/emoji/40/F09F9898.png)", "![💊](//telegram.org/img/emoji/40/F09F928A.png)", "![🙊](//telegram.org/img/emoji/40/F09F998A.png)", "![😎](//telegram.org/img/emoji/40/F09F988E.png)", "![👾](//telegram.org/img/emoji/40/F09F91BE.png)", "![🤷‍♂](//telegram.org/img/emoji/40/F09FA4B7E2808DE29982.png)", "![🤷](//telegram.org/img/emoji/40/F09FA4B7.png)", "![🤷‍♀](//telegram.org/img/emoji/40/F09FA4B7E2808DE29980.png)", "![😡](//telegram.org/img/emoji/40/F09F98A1.png)" */ + /** Reaction emoji. Currently, it can be one of "![❤](//telegram.org/img/emoji/40/E29DA4.png)", "![👍](//telegram.org/img/emoji/40/F09F918D.png)", "![👎](//telegram.org/img/emoji/40/F09F918E.png)", "![🔥](//telegram.org/img/emoji/40/F09F94A5.png)", "![🥰](//telegram.org/img/emoji/40/F09FA5B0.png)", "![👏](//telegram.org/img/emoji/40/F09F918F.png)", "![😁](//telegram.org/img/emoji/40/F09F9881.png)", "![🤔](//telegram.org/img/emoji/40/F09FA494.png)", "![🤯](//telegram.org/img/emoji/40/F09FA4AF.png)", "![😱](//telegram.org/img/emoji/40/F09F98B1.png)", "![🤬](//telegram.org/img/emoji/40/F09FA4AC.png)", "![😢](//telegram.org/img/emoji/40/F09F98A2.png)", "![🎉](//telegram.org/img/emoji/40/F09F8E89.png)", "![🤩](//telegram.org/img/emoji/40/F09FA4A9.png)", "![🤮](//telegram.org/img/emoji/40/F09FA4AE.png)", "![💩](//telegram.org/img/emoji/40/F09F92A9.png)", "![🙏](//telegram.org/img/emoji/40/F09F998F.png)", "![👌](//telegram.org/img/emoji/40/F09F918C.png)", "![🕊](//telegram.org/img/emoji/40/F09F958A.png)", "![🤡](//telegram.org/img/emoji/40/F09FA4A1.png)", "![🥱](//telegram.org/img/emoji/40/F09FA5B1.png)", "![🥴](//telegram.org/img/emoji/40/F09FA5B4.png)", "![😍](//telegram.org/img/emoji/40/F09F988D.png)", "![🐳](//telegram.org/img/emoji/40/F09F90B3.png)", "![❤‍🔥](//telegram.org/img/emoji/40/E29DA4E2808DF09F94A5.png)", "![🌚](//telegram.org/img/emoji/40/F09F8C9A.png)", "![🌭](//telegram.org/img/emoji/40/F09F8CAD.png)", "![💯](//telegram.org/img/emoji/40/F09F92AF.png)", "![🤣](//telegram.org/img/emoji/40/F09FA4A3.png)", "![⚡](//telegram.org/img/emoji/40/E29AA1.png)", "![🍌](//telegram.org/img/emoji/40/F09F8D8C.png)", "![🏆](//telegram.org/img/emoji/40/F09F8F86.png)", "![💔](//telegram.org/img/emoji/40/F09F9294.png)", "![🤨](//telegram.org/img/emoji/40/F09FA4A8.png)", "![😐](//telegram.org/img/emoji/40/F09F9890.png)", "![🍓](//telegram.org/img/emoji/40/F09F8D93.png)", "![🍾](//telegram.org/img/emoji/40/F09F8DBE.png)", "![💋](//telegram.org/img/emoji/40/F09F928B.png)", "![🖕](//telegram.org/img/emoji/40/F09F9695.png)", "![😈](//telegram.org/img/emoji/40/F09F9888.png)", "![😴](//telegram.org/img/emoji/40/F09F98B4.png)", "![😭](//telegram.org/img/emoji/40/F09F98AD.png)", "![🤓](//telegram.org/img/emoji/40/F09FA493.png)", "![👻](//telegram.org/img/emoji/40/F09F91BB.png)", "![👨‍💻](//telegram.org/img/emoji/40/F09F91A8E2808DF09F92BB.png)", "![👀](//telegram.org/img/emoji/40/F09F9180.png)", "![🎃](//telegram.org/img/emoji/40/F09F8E83.png)", "![🙈](//telegram.org/img/emoji/40/F09F9988.png)", "![😇](//telegram.org/img/emoji/40/F09F9887.png)", "![😨](//telegram.org/img/emoji/40/F09F98A8.png)", "![🤝](//telegram.org/img/emoji/40/F09FA49D.png)", "![✍](//telegram.org/img/emoji/40/E29C8D.png)", "![🤗](//telegram.org/img/emoji/40/F09FA497.png)", "![🫡](//telegram.org/img/emoji/40/F09FABA1.png)", "![🎅](//telegram.org/img/emoji/40/F09F8E85.png)", "![🎄](//telegram.org/img/emoji/40/F09F8E84.png)", "![☃](//telegram.org/img/emoji/40/E29883.png)", "![💅](//telegram.org/img/emoji/40/F09F9285.png)", "![🤪](//telegram.org/img/emoji/40/F09FA4AA.png)", "![🗿](//telegram.org/img/emoji/40/F09F97BF.png)", "![🆒](//telegram.org/img/emoji/40/F09F8692.png)", "![💘](//telegram.org/img/emoji/40/F09F9298.png)", "![🙉](//telegram.org/img/emoji/40/F09F9989.png)", "![🦄](//telegram.org/img/emoji/40/F09FA684.png)", "![😘](//telegram.org/img/emoji/40/F09F9898.png)", "![💊](//telegram.org/img/emoji/40/F09F928A.png)", "![🙊](//telegram.org/img/emoji/40/F09F998A.png)", "![😎](//telegram.org/img/emoji/40/F09F988E.png)", "![👾](//telegram.org/img/emoji/40/F09F91BE.png)", "![🤷‍♂](//telegram.org/img/emoji/40/F09FA4B7E2808DE29982.png)", "![🤷](//telegram.org/img/emoji/40/F09FA4B7.png)", "![🤷‍♀](//telegram.org/img/emoji/40/F09FA4B7E2808DE29980.png)", "![😡](//telegram.org/img/emoji/40/F09F98A1.png)". */ emoji: string } @@ -2995,7 +3020,7 @@ export declare namespace Types { gift_id: string /** Human-readable name of the regular gift from which this unique gift was upgraded */ base_name: string - /** Unique name of the gift. This name can be used in `https://t.me/nft/...` links and story areas */ + /** Unique name of the gift. This name can be used in `https://t.me/nft/...` links and story areas. */ name: string /** Unique number of the upgraded gift among gifts upgraded from the same regular gift */ number: number @@ -3037,7 +3062,7 @@ export declare namespace Types { entities?: Array | undefined /** _True_, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them */ is_private?: true | undefined - /** Unique number reserved for this gift when upgraded. See the _number_ field in [UniqueGift](https://core.telegram.org/bots/api#uniquegift) */ + /** Unique number reserved for this gift when upgraded. See the _number_ field in [UniqueGift](https://core.telegram.org/bots/api#uniquegift). */ unique_gift_number?: number | undefined } @@ -3045,7 +3070,7 @@ export declare namespace Types { export interface UniqueGiftInfo { /** Information about the gift */ gift: Types.UniqueGift - /** Origin of the gift. Currently, either “upgrade” for gifts upgraded from regular gifts, “transfer” for gifts transferred from other users or channels, “resale” for gifts bought from other users, “gifted\_upgrade” for upgrades purchased after the gift was sent, or “offer” for gifts bought or sold through gift purchase offers */ + /** Origin of the gift. Currently, either “upgrade” for gifts upgraded from regular gifts, “transfer” for gifts transferred from other users or channels, “resale” for gifts bought from other users, “gifted\_upgrade” for upgrades purchased after the gift was sent, or “offer” for gifts bought or sold through gift purchase offers. */ origin: 'upgrade' | 'transfer' | 'resale' | 'gifted_upgrade' | 'offer' /** For gifts bought from other users, the currency in which the payment for the gift was done. Currently, one of “XTR” for Telegram Stars or “TON” for toncoins. */ last_resale_currency?: 'XTR' | 'TON' | undefined @@ -3055,7 +3080,7 @@ export declare namespace Types { owned_gift_id?: string | undefined /** Number of Telegram Stars that must be paid to transfer the gift; omitted if the bot cannot transfer the gift */ transfer_star_count?: number | undefined - /** Point in time (Unix timestamp) when the gift can be transferred. If it is in the past, then the gift can be transferred now */ + /** Point in time (Unix timestamp) when the gift can be transferred. If it is in the past, then the gift can be transferred now. */ next_transfer_date?: number | undefined } @@ -3097,7 +3122,7 @@ export declare namespace Types { prepaid_upgrade_star_count?: number | undefined /** _True_, if the gift's upgrade was purchased after the gift was sent; for gifts received on behalf of business accounts only */ is_upgrade_separate?: true | undefined - /** Unique number reserved for this gift when upgraded. See the _number_ field in [UniqueGift](https://core.telegram.org/bots/api#uniquegift) */ + /** Unique number reserved for this gift when upgraded. See the _number_ field in [UniqueGift](https://core.telegram.org/bots/api#uniquegift). */ unique_gift_number?: number | undefined } @@ -3119,7 +3144,7 @@ export declare namespace Types { can_be_transferred?: true | undefined /** Number of Telegram Stars that must be paid to transfer the gift; omitted if the bot cannot transfer the gift */ transfer_star_count?: number | undefined - /** Point in time (Unix timestamp) when the gift can be transferred. If it is in the past, then the gift can be transferred now */ + /** Point in time (Unix timestamp) when the gift can be transferred. If it is in the past, then the gift can be transferred now. */ next_transfer_date?: number | undefined } @@ -3129,7 +3154,7 @@ export declare namespace Types { total_count: number /** The list of gifts */ gifts: Array - /** Offset for the next request. If empty, then there are no more results */ + /** Offset for the next request. If empty, then there are no more results. */ next_offset?: string | undefined } @@ -3167,7 +3192,7 @@ export declare namespace Types { export interface BotCommand { /** Text of the command; 1-32 characters. Can contain only lowercase English letters, digits and underscores. */ command: string - /** Description of the command; 1-256 characters. */ + /** Description of the command; 1-256 characters */ description: string } @@ -3448,7 +3473,7 @@ export declare namespace Types { export interface PreparedInlineMessage { /** Unique identifier of the prepared message */ id: string - /** Expiration date of the prepared message, in Unix time. Expired prepared messages can no longer be used */ + /** Expiration date of the prepared message, in Unix time. Expired prepared messages can no longer be used. */ expiration_date: number } @@ -3480,7 +3505,7 @@ export declare namespace Types { /** Represents an animation file (GIF or H.264/MPEG-4 AVC video without sound) to be sent. */ export interface InputMediaAnimation { - /** Type of the result, must be _animation_ */ + /** Type of the media, must be _animation_ */ type: 'animation' /** File to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files) */ media: string @@ -3506,7 +3531,7 @@ export declare namespace Types { /** Represents an audio file to be treated as music to be sent. */ export interface InputMediaAudio { - /** Type of the result, must be _audio_ */ + /** Type of the media, must be _audio_ */ type: 'audio' /** File to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files) */ media: string @@ -3528,7 +3553,7 @@ export declare namespace Types { /** Represents a general file to be sent. */ export interface InputMediaDocument { - /** Type of the result, must be _document_ */ + /** Type of the media, must be _document_ */ type: 'document' /** File to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files) */ media: string @@ -3544,9 +3569,17 @@ export declare namespace Types { disable_content_type_detection?: boolean | undefined } + /** Represents an HTTP link to be sent. */ + export interface InputMediaLink { + /** Type of the media, must be _link_ */ + type: string + /** HTTP URL of the link */ + url: string + } + /** Represents a live photo to be sent. */ export interface InputMediaLivePhoto { - /** Type of the result, must be _live\_photo_ */ + /** Type of the media, must be _live\_photo_ */ type: string /** Video of the live photo to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended) or pass “attach://” to upload a new one using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files). Sending live photos by a URL is currently unsupported. */ media: string @@ -3566,7 +3599,7 @@ export declare namespace Types { /** Represents a location to be sent. */ export interface InputMediaLocation { - /** Type of the result, must be _location_ */ + /** Type of the media, must be _location_ */ type: string /** Latitude of the location */ latitude: number @@ -3578,7 +3611,7 @@ export declare namespace Types { /** Represents a photo to be sent. */ export interface InputMediaPhoto { - /** Type of the result, must be _photo_ */ + /** Type of the media, must be _photo_ */ type: 'photo' /** File to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files) */ media: string @@ -3596,7 +3629,7 @@ export declare namespace Types { /** Represents a sticker file to be sent. */ export interface InputMediaSticker { - /** Type of the result, must be _sticker_ */ + /** Type of the media, must be _sticker_ */ type: string /** File to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a .WEBP sticker from the Internet, or pass “attach://” to upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files) */ media: string @@ -3606,7 +3639,7 @@ export declare namespace Types { /** Represents a venue to be sent. */ export interface InputMediaVenue { - /** Type of the result, must be _venue_ */ + /** Type of the media, must be _venue_ */ type: string /** Latitude of the location */ latitude: number @@ -3628,7 +3661,7 @@ export declare namespace Types { /** Represents a video to be sent. */ export interface InputMediaVideo { - /** Type of the result, must be _video_ */ + /** Type of the media, must be _video_ */ type: 'video' /** File to send. Pass a file\_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass “attach://” to upload a new one using multipart/form-data under name. [More information on Sending Files »](https://core.telegram.org/bots/api#sending-files) */ media: string @@ -3837,6 +3870,566 @@ export declare namespace Types { keywords?: Array | undefined } + /** Rich formatted message. */ + export interface RichMessage { + /** Content of the message */ + blocks: Array + /** _True_, if the rich message must be shown right-to-left */ + is_rtl?: boolean | undefined + } + + /** Describes a rich message to be sent. Exactly **one** of the fields _html_ or _markdown_ must be used. */ + export interface InputRichMessage { + /** Content of the rich message to send described using HTML formatting. See [rich message formatting options](https://core.telegram.org/bots/api#rich-message-formatting-options) for more details. */ + html?: string | undefined + /** Content of the rich message to send described using Markdown formatting. See [rich message formatting options](https://core.telegram.org/bots/api#rich-message-formatting-options) for more details. */ + markdown?: string | undefined + /** Pass _True_ if the rich message must be shown right-to-left */ + is_rtl?: boolean | undefined + /** Pass _True_ to skip automatic detection of entities (e.g., URLs, email addresses, username mentions, hashtags, cashtags, bot commands, or phone numbers) in the text */ + skip_entity_detection?: boolean | undefined + } + + /** + * This object represents a rich formatted text. Currently, it can be either a String for plain text, an Array of [RichText](https://core.telegram.org/bots/api#richtext), or any of the following types: + * + * - [RichTextBold](https://core.telegram.org/bots/api#richtextbold) + * - [RichTextItalic](https://core.telegram.org/bots/api#richtextitalic) + * - [RichTextUnderline](https://core.telegram.org/bots/api#richtextunderline) + * - [RichTextStrikethrough](https://core.telegram.org/bots/api#richtextstrikethrough) + * - [RichTextSpoiler](https://core.telegram.org/bots/api#richtextspoiler) + * - [RichTextDateTime](https://core.telegram.org/bots/api#richtextdatetime) + * - [RichTextTextMention](https://core.telegram.org/bots/api#richtexttextmention) + * - [RichTextSubscript](https://core.telegram.org/bots/api#richtextsubscript) + * - [RichTextSuperscript](https://core.telegram.org/bots/api#richtextsuperscript) + * - [RichTextMarked](https://core.telegram.org/bots/api#richtextmarked) + * - [RichTextCode](https://core.telegram.org/bots/api#richtextcode) + * - [RichTextCustomEmoji](https://core.telegram.org/bots/api#richtextcustomemoji) + * - [RichTextMathematicalExpression](https://core.telegram.org/bots/api#richtextmathematicalexpression) + * - [RichTextUrl](https://core.telegram.org/bots/api#richtexturl) + * - [RichTextEmailAddress](https://core.telegram.org/bots/api#richtextemailaddress) + * - [RichTextPhoneNumber](https://core.telegram.org/bots/api#richtextphonenumber) + * - [RichTextBankCardNumber](https://core.telegram.org/bots/api#richtextbankcardnumber) + * - [RichTextMention](https://core.telegram.org/bots/api#richtextmention) + * - [RichTextHashtag](https://core.telegram.org/bots/api#richtexthashtag) + * - [RichTextCashtag](https://core.telegram.org/bots/api#richtextcashtag) + * - [RichTextBotCommand](https://core.telegram.org/bots/api#richtextbotcommand) + * - [RichTextAnchor](https://core.telegram.org/bots/api#richtextanchor) + * - [RichTextAnchorLink](https://core.telegram.org/bots/api#richtextanchorlink) + * - [RichTextReference](https://core.telegram.org/bots/api#richtextreference) + * - [RichTextReferenceLink](https://core.telegram.org/bots/api#richtextreferencelink) + */ + export type RichText = string | Array | Types.RichTextBold | Types.RichTextItalic | Types.RichTextUnderline | Types.RichTextStrikethrough | Types.RichTextSpoiler | Types.RichTextDateTime | Types.RichTextTextMention | Types.RichTextSubscript | Types.RichTextSuperscript | Types.RichTextMarked | Types.RichTextCode | Types.RichTextCustomEmoji | Types.RichTextMathematicalExpression | Types.RichTextUrl | Types.RichTextEmailAddress | Types.RichTextPhoneNumber | Types.RichTextBankCardNumber | Types.RichTextMention | Types.RichTextHashtag | Types.RichTextCashtag | Types.RichTextBotCommand | Types.RichTextAnchor | Types.RichTextAnchorLink | Types.RichTextReference | Types.RichTextReferenceLink + + /** A bold text. */ + export interface RichTextBold { + /** Type of the rich text, always “bold” */ + type: 'bold' + /** The text */ + text: Types.RichText + } + + /** An italicized text. */ + export interface RichTextItalic { + /** Type of the rich text, always “italic” */ + type: 'italic' + /** The text */ + text: Types.RichText + } + + /** An underlined text. */ + export interface RichTextUnderline { + /** Type of the rich text, always “underline” */ + type: 'underline' + /** The text */ + text: Types.RichText + } + + /** A strikethrough text. */ + export interface RichTextStrikethrough { + /** Type of the rich text, always “strikethrough” */ + type: 'strikethrough' + /** The text */ + text: Types.RichText + } + + /** A text covered by a spoiler. */ + export interface RichTextSpoiler { + /** Type of the rich text, always “spoiler” */ + type: 'spoiler' + /** The text */ + text: Types.RichText + } + + /** Formatted date and time. */ + export interface RichTextDateTime { + /** Type of the rich text, always “date\_time” */ + type: 'date_time' + /** The text */ + text: Types.RichText + /** The Unix time associated with the entity */ + unix_time: number + /** The string that defines the formatting of the date and time. See [date-time entity formatting](https://core.telegram.org/bots/api#date-time-entity-formatting) for more details. */ + date_time_format: string + } + + /** A mention of a Telegram user by their identifier. */ + export interface RichTextTextMention { + /** Type of the rich text, always “text\_mention” */ + type: 'text_mention' + /** The text */ + text: Types.RichText + /** The mentioned user */ + user: Types.User + } + + /** A subscript text. */ + export interface RichTextSubscript { + /** Type of the rich text, always “subscript” */ + type: 'subscript' + /** The text */ + text: Types.RichText + } + + /** A superscript text. */ + export interface RichTextSuperscript { + /** Type of the rich text, always “superscript” */ + type: 'superscript' + /** The text */ + text: Types.RichText + } + + /** A marked text. */ + export interface RichTextMarked { + /** Type of the rich text, always “marked” */ + type: 'marked' + /** The text */ + text: Types.RichText + } + + /** A monowidth text. */ + export interface RichTextCode { + /** Type of the rich text, always “code” */ + type: 'code' + /** The text */ + text: Types.RichText + } + + /** A custom emoji. */ + export interface RichTextCustomEmoji { + /** Type of the rich text, always “custom\_emoji” */ + type: 'custom_emoji' + /** Unique identifier of the custom emoji. Use [getCustomEmojiStickers](https://core.telegram.org/bots/api#getcustomemojistickers) to get full information about the sticker. */ + custom_emoji_id: string + /** Alternative emoji for the custom emoji */ + alternative_text: string + } + + /** A mathematical expression. */ + export interface RichTextMathematicalExpression { + /** Type of the rich text, always “mathematical\_expression” */ + type: 'mathematical_expression' + /** The expression in LaTeX format */ + expression: string + } + + /** A text with a link. */ + export interface RichTextUrl { + /** Type of the rich text, always “url” */ + type: 'url' + /** The text */ + text: Types.RichText + /** URL of the link */ + url: string + } + + /** A text with an email address. */ + export interface RichTextEmailAddress { + /** Type of the rich text, always “email\_address” */ + type: 'email_address' + /** The text */ + text: Types.RichText + /** The email address */ + email_address: string + } + + /** A text with a phone number. */ + export interface RichTextPhoneNumber { + /** Type of the rich text, always “phone\_number” */ + type: 'phone_number' + /** The text */ + text: Types.RichText + /** The phone number */ + phone_number: string + } + + /** A text with a bank card number. */ + export interface RichTextBankCardNumber { + /** Type of the rich text, always “bank\_card\_number” */ + type: 'bank_card_number' + /** The text */ + text: Types.RichText + /** The bank card number */ + bank_card_number: string + } + + /** A mention by a username. */ + export interface RichTextMention { + /** Type of the rich text, always “mention” */ + type: 'mention' + /** The text */ + text: Types.RichText + /** The username */ + username: string + } + + /** A hashtag. */ + export interface RichTextHashtag { + /** Type of the rich text, always “hashtag” */ + type: 'hashtag' + /** The text */ + text: Types.RichText + /** The hashtag */ + hashtag: string + } + + /** A cashtag. */ + export interface RichTextCashtag { + /** Type of the rich text, always “cashtag” */ + type: 'cashtag' + /** The text */ + text: Types.RichText + /** The cashtag */ + cashtag: string + } + + /** A bot command. */ + export interface RichTextBotCommand { + /** Type of the rich text, always “bot\_command” */ + type: 'bot_command' + /** The text */ + text: Types.RichText + /** The bot command */ + bot_command: string + } + + /** An anchor. */ + export interface RichTextAnchor { + /** Type of the rich text, always “anchor” */ + type: 'anchor' + /** The name of the anchor */ + name: string + } + + /** A link to an anchor. */ + export interface RichTextAnchorLink { + /** Type of the rich text, always “anchor\_link” */ + type: 'anchor_link' + /** The link text */ + text: Types.RichText + /** The name of the anchor. If the name is empty, then the link brings back to the top of the message. */ + anchor_name: string + } + + /** A reference. */ + export interface RichTextReference { + /** Type of the rich text, always “reference” */ + type: 'reference' + /** Text of the reference */ + text: Types.RichText + /** The name of the reference */ + name: string + } + + /** A link to a reference. */ + export interface RichTextReferenceLink { + /** Type of the rich text, always “reference\_link” */ + type: 'reference_link' + /** The link text */ + text: Types.RichText + /** The name of the reference */ + reference_name: string + } + + /** Caption of a rich formatted block. */ + export interface RichBlockCaption { + /** Block caption */ + text: Types.RichText + /** Block credit which corresponds to the HTML tag */ + credit?: Types.RichText | undefined + } + + /** Cell in a table. */ + export interface RichBlockTableCell { + /** Text in the cell. If omitted, then the cell is invisible. */ + text?: Types.RichText | undefined + /** _True_, if the cell is a header cell */ + is_header?: true | undefined + /** The number of columns the cell spans if it is bigger than 1 */ + colspan?: number | undefined + /** The number of rows the cell spans if it is bigger than 1 */ + rowspan?: number | undefined + /** Horizontal cell content alignment. Currently, must be one of “left”, “center”, or “right”. */ + align: string + /** Vertical cell content alignment. Currently, must be one of “top”, “middle”, or “bottom”. */ + valign: string + } + + /** An item of a list. */ + export interface RichBlockListItem { + /** Label of the item */ + label: string + /** The content of the item */ + blocks: Array + /** _True_, if the item has a checkbox */ + has_checkbox?: true | undefined + /** _True_, if the item has a checked checkbox */ + is_checked?: true | undefined + /** For ordered lists, the numeric value of the item label */ + value?: number | undefined + /** For ordered lists, the type of the item label; must be one of “a” for lowercase letters, “A” for uppercase letters, “i” for lowercase Roman numerals, “I” for uppercase Roman numerals, or “1” for decimal numbers */ + type?: 'a' | 'A' | 'i' | 'I' | '1' | undefined + } + + /** + * This object represents a block in a rich formatted message. Currently, it can be any of the following types: + * + * - [RichBlockParagraph](https://core.telegram.org/bots/api#richblockparagraph) + * - [RichBlockSectionHeading](https://core.telegram.org/bots/api#richblocksectionheading) + * - [RichBlockPreformatted](https://core.telegram.org/bots/api#richblockpreformatted) + * - [RichBlockFooter](https://core.telegram.org/bots/api#richblockfooter) + * - [RichBlockDivider](https://core.telegram.org/bots/api#richblockdivider) + * - [RichBlockMathematicalExpression](https://core.telegram.org/bots/api#richblockmathematicalexpression) + * - [RichBlockAnchor](https://core.telegram.org/bots/api#richblockanchor) + * - [RichBlockList](https://core.telegram.org/bots/api#richblocklist) + * - [RichBlockBlockQuotation](https://core.telegram.org/bots/api#richblockblockquotation) + * - [RichBlockPullQuotation](https://core.telegram.org/bots/api#richblockpullquotation) + * - [RichBlockCollage](https://core.telegram.org/bots/api#richblockcollage) + * - [RichBlockSlideshow](https://core.telegram.org/bots/api#richblockslideshow) + * - [RichBlockTable](https://core.telegram.org/bots/api#richblocktable) + * - [RichBlockDetails](https://core.telegram.org/bots/api#richblockdetails) + * - [RichBlockMap](https://core.telegram.org/bots/api#richblockmap) + * - [RichBlockAnimation](https://core.telegram.org/bots/api#richblockanimation) + * - [RichBlockAudio](https://core.telegram.org/bots/api#richblockaudio) + * - [RichBlockPhoto](https://core.telegram.org/bots/api#richblockphoto) + * - [RichBlockVideo](https://core.telegram.org/bots/api#richblockvideo) + * - [RichBlockVoiceNote](https://core.telegram.org/bots/api#richblockvoicenote) + * - [RichBlockThinking](https://core.telegram.org/bots/api#richblockthinking) + */ + export type RichBlock = Types.RichBlockParagraph | Types.RichBlockSectionHeading | Types.RichBlockPreformatted | Types.RichBlockFooter | Types.RichBlockDivider | Types.RichBlockMathematicalExpression | Types.RichBlockAnchor | Types.RichBlockList | Types.RichBlockBlockQuotation | Types.RichBlockPullQuotation | Types.RichBlockCollage | Types.RichBlockSlideshow | Types.RichBlockTable | Types.RichBlockDetails | Types.RichBlockMap | Types.RichBlockAnimation | Types.RichBlockAudio | Types.RichBlockPhoto | Types.RichBlockVideo | Types.RichBlockVoiceNote | Types.RichBlockThinking + + /** A text paragraph, corresponding to the HTML tag `

`. */ + export interface RichBlockParagraph { + /** Type of the block, always “paragraph” */ + type: 'paragraph' + /** Text of the block */ + text: Types.RichText + } + + /** A section heading, corresponding to the HTML tags `

`, `

`, `

`, `

`, `

`, or `
`. */ + export interface RichBlockSectionHeading { + /** Type of the block, always “heading” */ + type: 'heading' + /** Text of the block */ + text: Types.RichText + /** Relative size of the text font; 1-6, 1 is the largest, 6 is the smallest */ + size: number + } + + /** A preformatted text block, corresponding to the nested HTML tags `
` and ``. */
+  export interface RichBlockPreformatted {
+    /** Type of the block, always “pre” */
+    type: 'pre'
+    /** Text of the block */
+    text: Types.RichText
+    /** The programming language of the text */
+    language?: string | undefined
+  }
+
+  /** A footer, corresponding to the HTML tag `