UNPKG

@follow-app/client-sdk

Version:

TypeScript client SDK for Follow RSS Server API

1,532 lines (1,531 loc) 112 kB
import { ACHIEVEMENTS_TYPES, FEATURE_NAMES, FeatureName, FeedViewType, FeedViewType as FeedViewType$1, SETTINGS_TABS, UserRole, UserRole as UserRole$1 } from "@folo-services/constants"; import { ExceptionCodeMap } from "@folo-services/exceptions"; import { ActionItem, ActionItem as ActionItem$1, ActionsModel, ActionsModel as ActionsModel$1, AiTaskOptions, AttachmentsModel, ExtraModel, MediaModel, SettingsModel as SettingsModel$1, TaskSchedule, TaskSchedule as TaskSchedule$1, UIMessageParts, aiTokens, collectionsOpenAPISchema, entries, entriesOpenAPISchema, featureFlags, feedAnalytics, feedAnalyticsOpenAPISchema, feeds, inboxesEntriesInsertOpenAPISchema, inboxesEntriesOpenAPISchema, languageSchema, listAnalyticsOpenAPISchema, lists, listsSubscriptions, listsSubscriptionsOpenAPISchema, messaging, rsshub, rsshubUsage, settings, subscriptions, subscriptionsOpenAPISchema, transactions, userFeatureOverrides, users, wallets } from "@folo-services/drizzle"; import z$1, { z } from "zod"; import { FeedOpenApiSchema, InboxOpenApiSchema, ListOpenApiSchema, StatusConfigs, StatusConfigs as StatusConfigs$1 } from "@folo-services/shared"; //#region src/types/api.d.ts /** * Standard Follow API response wrapper */ interface FollowAPIResponse<T = any> { code: number; data: T; message?: string; } /** * Error response from Follow API */ interface FollowAPIErrorResponse { code: number; message: string; data?: any; } /** * Generic type for requests that only contain an id parameter */ interface IdRequest { id: string; } /** * Generic type for requests that only contain a feedId parameter */ interface FeedIdRequest { feedId: string; } /** * Generic type for requests that only contain a listId parameter */ interface ListIdRequest { listId: string; } /** * Generic type for requests that only contain a userId parameter */ interface UserIdRequest { userId: string; } /** * Generic type for requests that only contain an entryId parameter */ interface EntryIdRequest { entryId: string; } /** * HTTP methods supported by the client */ type HTTPMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; /** * Request content types */ type RequestContentType = "json" | "formData" | "text" | "blob" | "arrayBuffer"; /** * Response content types */ type ResponseContentType = "json" | "text" | "blob" | "arrayBuffer" | "stream" | "raw"; /** * Request options for API calls */ interface RequestOptions { method?: HTTPMethod; headers?: Record<string, string>; body?: unknown; query?: Record<string, string | number | boolean | string[]>; timeout?: number; signal?: AbortSignal; requestType?: RequestContentType; asRaw?: boolean; } /** * Client configuration options */ interface ClientConfig { baseURL: string; timeout?: number; headers?: Record<string, string>; credentials?: RequestCredentials; fetch?: typeof fetch; } /** * Pagination parameters */ interface PaginationParams { page?: number; limit?: number; before?: string; after?: string; } /** * Pagination response */ interface PaginationResponse<T> { data: T[]; pagination: { page: number; limit: number; total: number; hasMore: boolean; }; } //#endregion //#region src/types/date-serialization.d.ts /** * Utility types for handling Date to ISO string serialization in HTTP JSON responses */ type DateISOString = string; /** * Recursively converts Date types to DateISOString for JSON serialization * This handles the fact that Date objects are serialized as ISO strings in HTTP JSON responses */ type DateToString<T> = T extends Date ? DateISOString : T extends (infer U)[] ? DateToString<U>[] : T extends Array<infer U> ? Array<DateToString<U>> : T extends Record<string, any> ? T extends ((...args: any[]) => any) ? T : { [K in keyof T]: DateToString<T[K]> } : T; /** * Converts Drizzle InferSelectModel Date types to DateISOString for HTTP responses * Use this for types that will be sent over HTTP as JSON */ type SerializedModel<T> = DateToString<T>; /** * Converts Drizzle InferInsertModel Date types to DateISOString for HTTP requests * Use this for types that will be received from HTTP as JSON */ type SerializedInsertModel<T> = DateToString<T>; /** * Helper type for API responses that contain serialized models */ type ApiResponse<T> = SerializedModel<T>; /** * Helper type for API requests that contain serialized models */ type ApiRequest<T> = SerializedInsertModel<T>; //#endregion //#region src/types/errors.d.ts /** * Base error class for all Follow API errors */ declare class FollowAPIError extends Error { status: number; code?: string | undefined; data?: any | undefined; constructor(message: string, status: number, code?: string | undefined, data?: any | undefined); } declare class NetworkError extends Error { constructor(message: string); } /** * Authentication error for Follow API */ declare class FollowAuthError extends FollowAPIError { constructor(message?: string, data?: any); } /** * Validation error for Follow API requests */ declare class FollowValidationError extends FollowAPIError { validationErrors: any[]; constructor(message: string, validationErrors: any[]); } /** * Network timeout error */ declare class FollowTimeoutError extends FollowAPIError { constructor(message?: string); } //#endregion //#region src/types/response.d.ts /** * Standard API response structure for Follow Server * All API responses follow this consistent format */ interface ResponseStruct<T = any> { /** * Response code * 0 = success * Non-zero = error code (matches ExceptionCodes) */ code: number; /** * Response message * Usually contains error message when code !== 0 */ message?: string; /** * Response data payload * Contains actual response data when code === 0 */ data?: T; } /** * Successful API response with data */ interface StructuredSuccessResponse<T = any> extends ResponseStruct<T> { code: 0; data: T; } type PlainSuccessResponse<T = any> = { code: 0; } & T; type ExtractResponseData<T> = T extends ResponseStruct<infer U> ? U : never; /** * Error API response */ interface ErrorResponse extends ResponseStruct<never> { code: number; message: string; data?: any; } /** * Paginated response structure */ interface PaginatedData<T = any> { items: T[]; total: number; page?: number; limit?: number; hasMore?: boolean; } /** * Paginated API response */ type PaginatedResponse<T = any> = StructuredSuccessResponse<PaginatedData<T>>; /** * Empty success response (for operations that don't return data) */ type EmptyResponse = StructuredSuccessResponse<null>; //#endregion //#region src/types/schemas.d.ts /** * Shared schemas and common types for the Follow Client SDK */ /** * Two-factor authentication types * Based on the core application's TwoFactorObjectSchema */ interface TwoFactorAuth { /** 6-digit TOTP code for two-factor authentication */ TOTPCode?: string; } //#endregion //#region src/client/interceptors.d.ts /** * Base context object shared by all interceptors */ interface BaseInterceptorContext { url: string; options: RequestOptions; } /** * Context object passed to request interceptors */ interface RequestInterceptorContext extends BaseInterceptorContext {} /** * Context object passed to response interceptors */ interface ResponseInterceptorContext extends BaseInterceptorContext { response: Response; } /** * Context object passed to error interceptors */ interface ErrorInterceptorContext extends BaseInterceptorContext { response: Response | null; error: Error; } /** * Request interceptor function type */ type RequestInterceptor = (ctx: RequestInterceptorContext) => Promise<{ url: string; options: RequestOptions; }> | { url: string; options: RequestOptions; }; /** * Response interceptor function type */ type ResponseInterceptor = (ctx: ResponseInterceptorContext) => Promise<Response> | Response; /** * Error interceptor function type */ type ErrorInterceptor = (ctx: ErrorInterceptorContext) => Promise<Error | void> | Error | void; //#endregion //#region src/shared/define-module.d.ts /** * Route definition with type annotations */ interface RouteDefinition<TInput = any, TResponse = any> { method: HTTPMethod; path: string; params?: readonly string[]; /** Fields that should be sent as query parameters */ query?: readonly string[]; /** Fields that should be sent as request body */ body?: readonly string[]; input?: TInput; response?: TResponse; requestType?: RequestContentType; asRaw?: boolean; } /** * Nested routes structure - supports any depth of nesting */ type NestedRoutes = { [key: string]: RouteDefinition | NestedRoutes; }; /** * Module definition interface */ interface ModuleDefinition<TRoutes extends NestedRoutes> { name: string; prefix?: string; routes: TRoutes; api: ModuleAPI<TRoutes>; } /** * Fetch options for route requests */ interface FetchOptions { headers?: Record<string, string>; timeout?: number; signal?: AbortSignal; } /** * Check if arguments are required */ type IsRequired<TInput> = [TInput] extends [never] ? false : {} extends TInput ? false : true; /** * Route function with proper argument requirements */ type RouteFunction<TInput, TResponse> = IsRequired<TInput> extends true ? (args: TInput, options?: FetchOptions) => Promise<TResponse> : (args?: TInput, options?: FetchOptions) => Promise<TResponse>; /** * Generate API types from route structure */ type ModuleAPI<TRoutes> = { [K in keyof TRoutes]: TRoutes[K] extends RouteDefinition<infer TInput, infer TResponse> ? RouteFunction<TInput, TResponse> : TRoutes[K] extends NestedRoutes ? ModuleAPI<TRoutes[K]> : never }; //#endregion //#region src/modules/actions/types.d.ts type ActionsGetResponse = StructuredSuccessResponse<ActionsModel$1 | null>; interface ActionsPutRequest { rules: ActionItem$1[]; } type ActionsPutResponse = EmptyResponse; type SupportedLanguages = z$1.infer<typeof languageSchema>; type ActionId = Exclude<keyof ActionItem$1["result"], "disabled" | "blockRules">; type ActionFilterItem = Partial<Exclude<ActionItem$1["condition"][number], { length: number; }>>; type ActionFeedField = Exclude<ActionFilterItem["field"], undefined>; type ActionOperation = Exclude<ActionFilterItem["operator"], undefined>; type ActionConditionIndex = { ruleIndex: number; groupIndex: number; conditionIndex: number; }; //#endregion //#region src/modules/actions/index.d.ts /** * Actions module definition - User automation rules */ declare const actionsModule: ModuleDefinition<{ get: RouteDefinition<never, ActionsGetResponse>; put: RouteDefinition<ActionsPutRequest, EmptyResponse>; }>; type ActionsAPI = typeof actionsModule.api; //#endregion //#region ../../node_modules/drizzle-orm/entity.d.ts declare const entityKind: unique symbol; //#endregion //#region ../../node_modules/drizzle-orm/casing.d.ts declare class CasingCache { static readonly [entityKind]: string; private cachedTables; private convert; constructor(casing?: Casing); getColumnCasing(column: Column): string; private cacheTable; clearCache(): void; } //#endregion //#region ../../node_modules/drizzle-orm/subquery.d.ts interface Subquery<TAlias extends string = string, TSelectedFields extends Record<string, unknown> = Record<string, unknown>> extends SQLWrapper {} declare class Subquery<TAlias extends string = string, TSelectedFields extends Record<string, unknown> = Record<string, unknown>> implements SQLWrapper { static readonly [entityKind]: string; _: { brand: 'Subquery'; sql: SQL; selectedFields: TSelectedFields; alias: TAlias; isWith: boolean; usedTables?: string[]; }; constructor(sql: SQL, fields: TSelectedFields, alias: string, isWith?: boolean, usedTables?: string[]); } //#endregion //#region ../../node_modules/drizzle-orm/table.d.ts interface TableConfig<TColumn extends Column = Column<any>> { name: string; schema: string | undefined; columns: Record<string, TColumn>; dialect: string; } interface Table<T extends TableConfig = TableConfig> extends SQLWrapper {} declare class Table<T extends TableConfig = TableConfig> implements SQLWrapper { static readonly [entityKind]: string; readonly _: { readonly brand: 'Table'; readonly config: T; readonly name: T['name']; readonly schema: T['schema']; readonly columns: T['columns']; readonly inferSelect: InferSelectModel<Table<T>>; readonly inferInsert: InferInsertModel<Table<T>>; }; readonly $inferSelect: InferSelectModel<Table<T>>; readonly $inferInsert: InferInsertModel<Table<T>>; constructor(name: string, schema: string | undefined, baseName: string); } type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> = TDBColumNames extends true ? TColumn['_']['name'] : TName; type InferModelFromColumns<TColumns extends Record<string, Column>, TInferMode extends 'select' | 'insert' = 'select', TConfig extends { dbColumnNames: boolean; override?: boolean; } = { dbColumnNames: false; override: false; }> = Simplify<TInferMode extends 'insert' ? { [Key in keyof TColumns & string as RequiredKeyOnly<MapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>, TColumns[Key]>]: GetColumnData<TColumns[Key], 'query'> } & { [Key in keyof TColumns & string as OptionalKeyOnly<MapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>, TColumns[Key], TConfig['override']>]?: GetColumnData<TColumns[Key], 'query'> | undefined } : { [Key in keyof TColumns & string as MapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>]: GetColumnData<TColumns[Key], 'query'> }>; type InferSelectModel<TTable extends Table, TConfig extends { dbColumnNames: boolean; } = { dbColumnNames: false; }> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>; type InferInsertModel<TTable extends Table, TConfig extends { dbColumnNames: boolean; override?: boolean; } = { dbColumnNames: false; override: false; }> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>; //#endregion //#region ../../node_modules/drizzle-orm/operations.d.ts type RequiredKeyOnly<TKey extends string, T extends Column> = T extends AnyColumn<{ notNull: true; hasDefault: false; }> ? TKey : never; type OptionalKeyOnly<TKey extends string, T extends Column, OverrideT extends boolean | undefined = false> = TKey extends RequiredKeyOnly<TKey, T> ? never : T extends { _: { generated: undefined; }; } ? (T extends { _: { identity: undefined; }; } ? TKey : T['_']['identity'] extends 'always' ? OverrideT extends true ? TKey : never : TKey) : never; //#endregion //#region ../../node_modules/drizzle-orm/query-builders/select.types.d.ts type JoinNullability = 'nullable' | 'not-null'; type ApplyNullability<T, TNullability extends JoinNullability> = TNullability extends 'nullable' ? T | null : TNullability extends 'null' ? null : T; type ApplyNotNullMapToJoins<TResult, TNullabilityMap extends Record<string, JoinNullability>> = { [TTableName in keyof TResult & keyof TNullabilityMap & string]: ApplyNullability<TResult[TTableName], TNullabilityMap[TTableName]> } & {}; type SelectMode = 'partial' | 'single' | 'multiple'; type SelectResult<TResult, TSelectMode extends SelectMode, TNullabilityMap extends Record<string, JoinNullability>> = TSelectMode extends 'partial' ? SelectPartialResult<TResult, TNullabilityMap> : TSelectMode extends 'single' ? SelectResultFields<TResult> : ApplyNotNullMapToJoins<SelectResultFields<TResult>, TNullabilityMap>; type SelectPartialResult<TFields, TNullability extends Record<string, JoinNullability>> = TNullability extends TNullability ? { [Key in keyof TFields]: TFields[Key] extends infer TField ? TField extends Table ? TField['_']['name'] extends keyof TNullability ? ApplyNullability<SelectResultFields<TField['_']['columns']>, TNullability[TField['_']['name']]> : never : TField extends Column ? TField['_']['tableName'] extends keyof TNullability ? ApplyNullability<SelectResultField<TField>, TNullability[TField['_']['tableName']]> : never : TField extends SQL | SQL.Aliased ? SelectResultField<TField> : TField extends Subquery ? FromSingleKeyObject<TField['_']['selectedFields'], TField['_']['selectedFields'] extends { [key: string]: infer TValue; } ? SelectResultField<TValue> : never, 'You can only select one column in the subquery'> : TField extends Record<string, any> ? TField[keyof TField] extends AnyColumn<{ tableName: infer TTableName extends string; }> | SQL | SQL.Aliased ? Not<IsUnion<TTableName>> extends true ? ApplyNullability<SelectResultFields<TField>, TNullability[TTableName]> : SelectPartialResult<TField, TNullability> : never : never : never } : never; type SelectResultField<T, TDeep extends boolean = true> = T extends DrizzleTypeError<any> ? T : T extends Table ? Equal<TDeep, true> extends true ? SelectResultField<T['_']['columns'], false> : never : T extends Column<any> ? GetColumnData<T> : T extends SQL | SQL.Aliased ? T['_']['type'] : T extends Record<string, any> ? SelectResultFields<T, true> : never; type SelectResultFields<TSelectedFields, TDeep extends boolean = true> = Simplify<{ [Key in keyof TSelectedFields]: SelectResultField<TSelectedFields[Key], TDeep> }>; //#endregion //#region ../../node_modules/drizzle-orm/sql/sql.d.ts /** * This class is used to indicate a primitive param value that is used in `sql` tag. * It is only used on type level and is never instantiated at runtime. * If you see a value of this type in the code, its runtime value is actually the primitive param value. */ declare class FakePrimitiveParam { static readonly [entityKind]: string; } interface BuildQueryConfig { casing: CasingCache; escapeName(name: string): string; escapeParam(num: number, value: unknown): string; escapeString(str: string): string; prepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue; paramStartIndex?: { value: number; }; inlineParams?: boolean; invokeSource?: 'indexes' | undefined; } type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none'; interface Query { sql: string; params: unknown[]; } interface QueryWithTypings extends Query { typings?: QueryTypingsValue[]; } /** * Any value that implements the `getSQL` method. The implementations include: * - `Table` * - `Column` * - `View` * - `Subquery` * - `SQL` * - `SQL.Aliased` * - `Placeholder` * - `Param` */ interface SQLWrapper { getSQL(): SQL; shouldOmitSQLParens?(): boolean; } declare class StringChunk implements SQLWrapper { static readonly [entityKind]: string; readonly value: string[]; constructor(value: string | string[]); getSQL(): SQL<unknown>; } declare class SQL<T = unknown> implements SQLWrapper { readonly queryChunks: SQLChunk[]; static readonly [entityKind]: string; _: { brand: 'SQL'; type: T; }; private shouldInlineParams; constructor(queryChunks: SQLChunk[]); append(query: SQL): this; toQuery(config: BuildQueryConfig): QueryWithTypings; buildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query; private mapInlineParam; getSQL(): SQL; as(alias: string): SQL.Aliased<T>; /** * @deprecated * Use ``sql<DataType>`query`.as(alias)`` instead. */ as<TData>(): SQL<TData>; /** * @deprecated * Use ``sql<DataType>`query`.as(alias)`` instead. */ as<TData>(alias: string): SQL.Aliased<TData>; mapWith<TDecoder extends DriverValueDecoder<any, any> | DriverValueDecoder<any, any>['mapFromDriverValue']>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>>; inlineParams(): this; /** * This method is used to conditionally include a part of the query. * * @param condition - Condition to check * @returns itself if the condition is `true`, otherwise `undefined` */ if(condition: any | undefined): this | undefined; } type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends DriverValueDecoder<infer TData, any> | DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData : never; /** * Any DB name (table, column, index etc.) */ declare class Name implements SQLWrapper { readonly value: string; static readonly [entityKind]: string; protected brand: 'Name'; constructor(value: string); getSQL(): SQL<unknown>; } /** * Any DB name (table, column, index etc.) * @deprecated Use `sql.identifier` instead. */ declare function name(value: string): Name; interface DriverValueDecoder<TData, TDriverParam> { mapFromDriverValue(value: TDriverParam): TData; } interface DriverValueEncoder<TData, TDriverParam> { mapToDriverValue(value: TData): TDriverParam | SQL; } interface DriverValueMapper<TData, TDriverParam> extends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam> {} /** Parameter value that is optionally bound to an encoder (for example, a column). */ declare class Param$1<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper { readonly value: TDataType; readonly encoder: DriverValueEncoder<TDataType, TDriverParamType>; static readonly [entityKind]: string; protected brand: 'BoundParamValue'; /** * @param value - Parameter value * @param encoder - Encoder to convert the value to a driver parameter */ constructor(value: TDataType, encoder?: DriverValueEncoder<TDataType, TDriverParamType>); getSQL(): SQL<unknown>; } /** * Anything that can be passed to the `` sql`...` `` tagged function. */ type SQLChunk = StringChunk | SQLChunk[] | SQLWrapper | SQL | Table | View | Subquery | AnyColumn | Param$1 | Name | undefined | FakePrimitiveParam | Placeholder; declare namespace SQL { class Aliased<T = unknown> implements SQLWrapper { readonly sql: SQL; readonly fieldAlias: string; static readonly [entityKind]: string; _: { brand: 'SQL.Aliased'; type: T; }; constructor(sql: SQL, fieldAlias: string); getSQL(): SQL; } } declare class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper { readonly name: TName; static readonly [entityKind]: string; protected: TValue; constructor(name: TName); getSQL(): SQL; } type ColumnsSelection = Record<string, unknown>; declare abstract class View<TName extends string = string, TExisting extends boolean = boolean, TSelection extends ColumnsSelection = ColumnsSelection> implements SQLWrapper { static readonly [entityKind]: string; _: { brand: 'View'; viewBrand: string; name: TName; existing: TExisting; selectedFields: TSelection; }; readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>; constructor({ name, schema, selectedFields, query }: { name: TName; schema: string | undefined; selectedFields: ColumnsSelection; query: SQL | undefined; }); getSQL(): SQL<unknown>; } type InferSelectViewModel<TView extends View> = Equal<TView['_']['selectedFields'], { [x: string]: unknown; }> extends true ? { [x: string]: unknown; } : SelectResult<TView['_']['selectedFields'], 'single', Record<TView['_']['name'], 'not-null'>>; //#endregion //#region ../../node_modules/drizzle-orm/utils.d.ts type Update<T, TUpdate> = { [K in Exclude<keyof T, keyof TUpdate>]: T[K] } & TUpdate; type Simplify<T> = { [K in keyof T]: T[K] } & {}; type Not<T extends boolean> = T extends true ? false : true; type IsNever<T> = [T] extends [never] ? true : false; type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false : true; type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never : IsUnion<K> extends true ? DrizzleTypeError<TError> : Result; type Assume<T, U> = T extends U ? T : U; type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false; interface DrizzleTypeError<T extends string> { $drizzleTypeError: T; } type Casing = 'snake_case' | 'camelCase'; //#endregion //#region ../../node_modules/drizzle-orm/pg-core/sequence.d.ts type PgSequenceOptions = { increment?: number | string; minValue?: number | string; maxValue?: number | string; startWith?: number | string; cache?: number | string; cycle?: boolean; }; //#endregion //#region ../../node_modules/drizzle-orm/column-builder.d.ts type ColumnDataType = 'string' | 'number' | 'boolean' | 'array' | 'json' | 'date' | 'bigint' | 'custom' | 'buffer' | 'dateDuration' | 'duration' | 'relDuration' | 'localTime' | 'localDate' | 'localDateTime'; type GeneratedStorageMode = 'virtual' | 'stored'; type GeneratedType = 'always' | 'byDefault'; type GeneratedColumnConfig<TDataType> = { as: TDataType | SQL | (() => SQL); type?: GeneratedType; mode?: GeneratedStorageMode; }; type GeneratedIdentityConfig = { sequenceName?: string; sequenceOptions?: PgSequenceOptions; type: 'always' | 'byDefault'; }; interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> { name: string; dataType: TDataType; columnType: TColumnType; data: unknown; driverParam: unknown; enumValues: string[] | undefined; } type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = { name: string; keyAsName: boolean; notNull: boolean; default: TData | SQL | undefined; defaultFn: (() => TData | SQL) | undefined; onUpdateFn: (() => TData | SQL) | undefined; hasDefault: boolean; primaryKey: boolean; isUnique: boolean; uniqueName: string | undefined; uniqueType: string | undefined; dataType: string; columnType: string; generated: GeneratedColumnConfig<TData> | undefined; generatedIdentity: GeneratedIdentityConfig | undefined; } & TRuntimeConfig; //#endregion //#region ../../node_modules/drizzle-orm/column.d.ts interface ColumnBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> extends ColumnBuilderBaseConfig<TDataType, TColumnType> { tableName: string; notNull: boolean; hasDefault: boolean; isPrimaryKey: boolean; isAutoincrement: boolean; hasRuntimeDefault: boolean; } type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & { brand: 'Column'; tableName: T['tableName']; name: T['name']; dataType: T['dataType']; columnType: T['columnType']; data: T['data']; driverParam: T['driverParam']; notNull: T['notNull']; hasDefault: T['hasDefault']; isPrimaryKey: T['isPrimaryKey']; isAutoincrement: T['isAutoincrement']; hasRuntimeDefault: T['hasRuntimeDefault']; enumValues: T['enumValues']; baseColumn: T extends { baseColumn: infer U; } ? U : unknown; generated: GeneratedColumnConfig<T['data']> | undefined; identity: undefined | 'always' | 'byDefault'; } & TTypeConfig; type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<TData, TRuntimeConfig>; interface Column<T extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>, TRuntimeConfig extends object = object, TTypeConfig extends object = object> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {} declare abstract class Column<T extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>, TRuntimeConfig extends object = object, TTypeConfig extends object = object> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper { readonly table: Table; static readonly [entityKind]: string; readonly _: ColumnTypeConfig<T, TTypeConfig>; readonly name: string; readonly keyAsName: boolean; readonly primary: boolean; readonly notNull: boolean; readonly default: T['data'] | SQL | undefined; readonly defaultFn: (() => T['data'] | SQL) | undefined; readonly onUpdateFn: (() => T['data'] | SQL) | undefined; readonly hasDefault: boolean; readonly isUnique: boolean; readonly uniqueName: string | undefined; readonly uniqueType: string | undefined; readonly dataType: T['dataType']; readonly columnType: T['columnType']; readonly enumValues: T['enumValues']; readonly generated: GeneratedColumnConfig<T['data']> | undefined; readonly generatedIdentity: GeneratedIdentityConfig | undefined; protected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>; constructor(table: Table, config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>); abstract getSQLType(): string; mapFromDriverValue(value: unknown): unknown; mapToDriverValue(value: unknown): unknown; } type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<Required<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>>; type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> = TInferMode extends 'raw' ? TColumn['_']['data'] : TColumn['_']['notNull'] extends true ? TColumn['_']['data'] : TColumn['_']['data'] | null; //#endregion //#region src/modules/admin/types.d.ts type FeatureFlagModel = SerializedModel<InferSelectModel<typeof featureFlags>>; type FeatureFlagInsert = SerializedInsertModel<InferInsertModel<typeof featureFlags>>; type UserFeatureOverrideModel = SerializedModel<InferSelectModel<typeof userFeatureOverrides>>; type UserFeatureOverrideInsert = SerializedInsertModel<InferInsertModel<typeof userFeatureOverrides>>; declare const ROLLOUT_TYPES: readonly ["whitelist", "percentage"]; type RolloutType = (typeof ROLLOUT_TYPES)[number]; type RolloutValue = 0 | 1; type MessageResponse = StructuredSuccessResponse<{ message: string; }>; type FeatureFlagResponse = StructuredSuccessResponse<FeatureFlagModel>; type FeatureFlagListResponse = StructuredSuccessResponse<FeatureFlagModel[]>; interface FeatureFlagUpdateRequest { description?: string; enabled?: boolean; rolloutType?: RolloutType; rolloutValue?: RolloutValue; rolloutPercentage?: number; rolloutSeed?: string; } interface UserOverrideRequest { userId: string; forceEnabled: boolean; reason?: string; expiresAt?: string; } type FeatureStatsResponse = StructuredSuccessResponse<{ totalUsers: number; enabledUsers: number; overrideUsers: number; rolloutType: string; rolloutPercentage: number; enabledOverrides: number; disabledOverrides: number; enabled: boolean; enabledByRollout: number; enabledByOverride: number; disabledUsers: number; }>; interface AffectedUsersQuery { page?: number; limit?: number; filter?: "all" | "enabled" | "disabled" | "override"; search?: string; } interface AffectedUser { id: string; name: string | null; email: string; handle: string | null; image: string | null; createdAt: string; status: "enabled" | "disabled"; reason: "rollout" | "override"; overrideReason: string | null; overrideExpiresAt: string | null; overrideCreatedBy: string | null; } type AffectedUsersResponse = StructuredSuccessResponse<{ users: AffectedUser[]; pagination: { page: number; limit: number; total: number; totalPages: number; }; }>; interface FeatureFlagUpdateInput { name: string; description?: string; enabled?: boolean; rolloutType?: RolloutType; rolloutValue?: RolloutValue; rolloutPercentage?: number; rolloutSeed?: string; } interface UserOverrideInput { name: string; userId: string; forceEnabled: boolean; reason?: string; expiresAt?: string; } interface RemoveOverrideInput { name: string; userId: string; } interface FeatureStatsInput { name: string; } interface AffectedUsersInput { name: string; page?: number; limit?: number; filter?: "all" | "enabled" | "disabled" | "override"; search?: string; } interface CleanRequest { type: string; feedId?: string; nsfw?: boolean; } type CleanResponse = EmptyResponse; interface MintRequest { userId: string; amount: number; key: string; comment?: string; } type MintResponse = StructuredSuccessResponse<string>; //#endregion //#region src/modules/admin/index.d.ts /** * Admin module definition with nested routes */ declare const adminModule: ModuleDefinition<{ featureFlags: { list: RouteDefinition<never, FeatureFlagListResponse>; update: RouteDefinition<FeatureFlagUpdateInput, FeatureFlagResponse>; override: RouteDefinition<UserOverrideInput, MessageResponse>; removeOverride: RouteDefinition<RemoveOverrideInput, MessageResponse>; stats: RouteDefinition<FeatureStatsInput, FeatureStatsResponse>; affectedUsers: RouteDefinition<AffectedUsersInput, AffectedUsersResponse>; }; clean: { execute: RouteDefinition<CleanRequest, EmptyResponse>; }; mint: { execute: RouteDefinition<MintRequest, MintResponse>; }; }>; type AdminAPI = typeof adminModule.api; //#endregion //#region src/modules/auth/types.d.ts type AuthUser = SerializedModel<InferSelectModel<typeof users>>; interface AuthSession { expiresAt: string; createdAt: string; updatedAt: string; userId: string; id: string; } type AuthSessionResponse = PlainSuccessResponse<{ session: AuthSession | null; user: AuthUser | null; role: UserRole$1; roleEndAt?: string; feedSubscriptionLimit: number | null; rsshubSubscriptionLimit: number | null; }>; //#endregion //#region src/modules/auth/index.d.ts /** * Authentication module definition with Better Auth integration * * This module provides client SDK interfaces for all Better Auth endpoints. * The endpoints follow Better Auth's standard path conventions under /better-auth prefix. */ declare const authModule: ModuleDefinition<{ getSession: RouteDefinition<void, AuthSessionResponse>; }>; type AuthAPI = typeof authModule.api; //#endregion //#region src/modules/ai/types.d.ts type LanguageSchema = z.infer<typeof languageSchema>; interface ChatMessage { role: string; content: string; } interface ChatContext { mainEntryId?: string; referEntryIds?: string[]; referFeedIds?: string[]; } interface ChatRequest { messages: ChatMessage[]; model?: "openai/gpt-5-mini" | (string & {}); context?: ChatContext; } type ChatResponse = Response; interface SummaryRequest { id: string; language?: LanguageSchema; target?: "content" | "readabilityContent"; } type SummaryResponse = StructuredSuccessResponse<string | null>; type EntryStringKey = "title" | "description" | "content" | "readabilityContent"; interface TranslationRequest { id: string; language: LanguageSchema; fields: string; part?: string; } interface TranslationData { title?: string; description?: string; content?: string; readabilityContent?: string; } type TranslationResponse = StructuredSuccessResponse<TranslationData | null>; interface TranslationBatchRequest { ids: string[]; language: LanguageSchema; fields: string; part?: string; mode?: "bilingual" | "translation-only"; } interface TranslationBatchStreamChunk { id: string; data: TranslationData; } type StreamingJsonResponse<T> = Response & { body: ReadableStream<T>; }; type TranslationBatchResponse = StreamingJsonResponse<TranslationBatchStreamChunk>; type TextToSpeechSource = "auto" | "content" | "readabilityContent" | "summary"; interface TextToSpeechRequest { entryId?: string; text?: string; voice?: string; source?: TextToSpeechSource; } type TextToSpeechResponse = Response; interface TitleRequest { chatId?: string; messages: ChatMessage[]; } interface TitleResponse { title: string; remainingTokens?: number; } interface TitleErrorResponse { error: string; } interface DailyRequest { startDate: string; view: "0" | "1"; } type DailyResponse = StructuredSuccessResponse<string>; interface UsageRequest {} type UsageResponse = StructuredSuccessResponse<{ total: number; used: number; remaining: number; resetAt: Date; }>; interface RateLimit { maxTokens: number; currentTokens: number; remainingTokens: number; windowDuration: number; windowResetTime: number; usageRate?: number; projectedLimitTime?: number | null; warningLevel?: string; } interface AttachmentLimits { maxFiles: number; remainingFiles: number; windowDuration: number; windowResetTime: number; } interface TokenUsage { total: number; used: number; remaining: number; resetAt: Date; } interface FreeQuota { shouldCheckDailyLimit: boolean; remainingRequests: number; remainingMonthlyRequests: number; role: string; dailyLimit: number; monthlyLimit: number; } interface TokenUsageHistory { id: string; createdAt: Date; changes: number; comment: string | null; } interface ConfigResponse { defaultModel: string; availableModels: string[]; availableModelsMenu: { label: string; value?: string; paidLevel?: string; }[]; rateLimit: RateLimit; attachmentLimits: AttachmentLimits; usage: TokenUsage; freeQuota: FreeQuota; } interface AIMemoryRecord { id: string; userId: string; memory: string; importance: number; tags: string[] | null; source: string | null; metadata: Record<string, unknown> | null; createdAt: Date; updatedAt: Date; lastAccessedAt: Date | null; expiresAt: Date | null; } interface AIMemoryListResponse { data: AIMemoryRecord[]; nextBefore?: Date; } interface AIMemoryCreateRequest { memory: string; importance?: number; tags?: string[]; source?: string; metadata?: Record<string, unknown>; expiresAt?: Date; } interface AIMemoryUpdateRequest { memoryId: string; memory?: string; importance?: number; tags?: string[] | null; source?: string | null; metadata?: Record<string, unknown> | null; expiresAt?: Date | null; } interface AIMemoryListQuery { limit?: number; before?: Date; importanceGte?: number; importanceLte?: number; } //#endregion //#region src/modules/ai/index.d.ts /** * AI module definition with nested AI-powered features */ declare const aiModule: ModuleDefinition<{ chat: RouteDefinition<ChatRequest, Response>; summary: RouteDefinition<SummaryRequest, SummaryResponse>; translation: RouteDefinition<TranslationRequest, TranslationResponse>; translationBatch: RouteDefinition<TranslationBatchRequest, TranslationBatchResponse>; tts: RouteDefinition<TextToSpeechRequest, Response>; summaryTitle: RouteDefinition<TitleRequest, TitleResponse>; daily: RouteDefinition<DailyRequest, DailyResponse>; config: RouteDefinition<never, ConfigResponse>; memory: { list: RouteDefinition<AIMemoryListQuery, AIMemoryListResponse>; create: RouteDefinition<AIMemoryCreateRequest, AIMemoryRecord>; update: RouteDefinition<AIMemoryUpdateRequest, AIMemoryRecord>; delete: RouteDefinition<{ memoryId: string; }, { success: boolean; }>; }; }>; type AIAPI = typeof aiModule.api; //#endregion //#region src/modules/ai-analytics/types.d.ts interface AnalyticsRequest { days?: string; } interface UsagePattern { operationType: string; totalTokens: number; operationCount: number; percentage: number; avgTokensPerOperation: number; } interface DailyPattern { date: string; totalTokens: number; operationCount: number; peakHour: number | null; } interface ModelPattern { model: string; totalTokens: number; operationCount: number; percentage: number; avgEfficiency: number; } interface AnalyticsData { patterns: { daily: DailyPattern[]; byOperation: UsagePattern[]; byModel: ModelPattern[]; }; usageHistory: typeof aiTokens.$inferSelect[]; } type AnalyticsResponse = AnalyticsData; //#endregion //#region src/modules/ai-analytics/index.d.ts /** * AI Analytics module definition for usage analytics and insights */ declare const aiAnalyticsModule: ModuleDefinition<{ get: RouteDefinition<AnalyticsRequest, AnalyticsData>; }>; type AIAnalyticsAPI = typeof aiAnalyticsModule.api; //#endregion //#region src/modules/ai-chat-sessions/types.d.ts interface ChatIdRequest { chatId: string; } interface AIChatSession { chatId: string; userId: string; title: string; createdAt: DateISOString; updatedAt: DateISOString; lastSeenAt: DateISOString; } interface AIChatMessage { id: string; chatId: string; role: "user" | "assistant" | "system"; messageParts: UIMessageParts; metadata?: unknown; status: "pending" | "completed" | "error"; createdAt: DateISOString; finishedAt: DateISOString | null; } interface ChatMetadata { tokenUsage?: { promptTokens: number; completionTokens: number; totalTokens: number; }; finishReason?: string; model?: string; [key: string]: any; } interface GetSessionRequest extends ChatIdRequest {} interface ListSessionsQuery { limit?: number; before?: DateISOString; } interface UpdateSessionRequest extends ChatIdRequest { title: string; } interface DeleteSessionRequest extends ChatIdRequest {} interface GetMessagesQuery extends ChatIdRequest { limit?: number; before?: DateISOString; } interface MarkSeenRequest extends ChatIdRequest { lastSeenAt?: DateISOString; } interface GetUnreadQuery { limit?: number; } type SessionResponse = StructuredSuccessResponse<AIChatSession>; type ListSessionsResponse = StructuredSuccessResponse<AIChatSession[]> & { total: number; nextBefore?: DateISOString; }; type GetMessagesResponse = StructuredSuccessResponse<{ chatSession: AIChatSession | null; messages: AIChatMessage[]; nextBefore?: DateISOString; }>; type GetUnreadResponse = StructuredSuccessResponse<string[]>; //#endregion //#region src/modules/ai-chat-sessions/index.d.ts /** * AI Chat Sessions module - comprehensive chat session management * Base path: /ai/chat-sessions */ declare const aiChatSessionsModule: ModuleDefinition<{ list: RouteDefinition<ListSessionsQuery, ListSessionsResponse>; get: RouteDefinition<GetSessionRequest, SessionResponse>; update: RouteDefinition<UpdateSessionRequest, SessionResponse>; delete: RouteDefinition<DeleteSessionRequest, { success: boolean; }>; messages: { get: RouteDefinition<GetMessagesQuery, GetMessagesResponse>; }; markSeen: RouteDefinition<MarkSeenRequest, SessionResponse>; unread: RouteDefinition<GetUnreadQuery, GetUnreadResponse>; }>; type AIChatSessionsAPI = typeof aiChatSessionsModule.api; //#endregion //#region src/modules/ai-task/types.d.ts interface AITask { id: string; name: string; prompt: string; isEnabled: boolean; schedule: TaskSchedule$1; createdAt: DateISOString; updatedAt: DateISOString; lastRunAt: DateISOString | null; nextRunAt: DateISOString | null; runCount: number; lastResult: string | null; lastError: string | null; options: AiTaskOptions; } interface CreateTaskRequest { name: string; prompt: string; isEnabled?: boolean; schedule: TaskSchedule$1; options: AiTaskOptions; } interface UpdateTaskRequest { id: string; name?: string; prompt?: string; isEnabled?: boolean; schedule?: TaskSchedule$1; options?: AiTaskOptions; } type TaskListResponse = StructuredSuccessResponse<AITask[]>; type TaskGetResponse = StructuredSuccessResponse<AITask>; type TaskCreateResponse = StructuredSuccessResponse<AITask>; type TaskUpdateResponse = StructuredSuccessResponse<AITask>; type TaskDeleteResponse = EmptyResponse; type TaskTestRunResponse = StructuredSuccessResponse<{ taskId: string; sessionId?: string; result?: string; error?: string; }>; //#endregion //#region src/modules/ai-task/index.d.ts /** * AI Task module - standalone module for managing AI scheduled tasks * Base path: /ai/task */ declare const aiTaskModule: ModuleDefinition<{ list: RouteDefinition<never, TaskListResponse>; get: RouteDefinition<{ id: string; }, TaskGetResponse>; create: RouteDefinition<CreateTaskRequest, TaskCreateResponse>; update: RouteDefinition<UpdateTaskRequest, TaskUpdateResponse>; delete: RouteDefinition<{ id: string; }, EmptyResponse>; testRun: RouteDefinition<{ id: string; }, TaskTestRunResponse>; }>; type AITaskAPI = typeof aiTaskModule.api; //#endregion //#region src/modules/categories/types.d.ts interface CategoriesGetQuery { view?: string; } type CategoriesGetResponse = StructuredSuccessResponse<string[]>; interface CategoryPatchRequest { feedIdList: string[]; category: string; } type CategoryPatchResponse = EmptyResponse; interface CategoryDeleteRequest { feedIdList: string[]; deleteSubscriptions: boolean; } type CategoryDeleteResponse = EmptyResponse; //#endregion //#region src/modules/categories/index.d.ts /** * Categories module definition - Subscription categorization */ declare const categoriesModule: ModuleDefinition<{ get: RouteDefinition<CategoriesGetQuery, CategoriesGetResponse>; update: RouteDefinition<CategoryPatchRequest, EmptyResponse>; delete: RouteDefinition<CategoryDeleteRequest, EmptyResponse>; }>; type CategoriesAPI = typeof categoriesModule.api; //#endregion //#region src/modules/collections/types.d.ts interface CollectionCheckQuery extends EntryIdRequest {} type CollectionCheckResponse = StructuredSuccessResponse<boolean>; interface CollectionCreateRequest extends EntryIdRequest { view?: number; } type CollectionCreateResponse = EmptyResponse; interface CollectionDeleteRequest extends EntryIdRequest {} type CollectionDeleteResponse = EmptyResponse; //#endregion //#region src/modules/collections/index.d.ts /** * Collections module definition - Content collections management */ declare const collectionsModule: ModuleDefinition<{ get: RouteDefinition<CollectionCheckQuery, CollectionCheckResponse>; post: RouteDefinition<CollectionCreateRequest, EmptyResponse>; delete: RouteDefinition<CollectionDeleteRequest, EmptyResponse>; }>; type CollectionsAPI = typeof collectionsModule.api; //#endregion //#region src/modules/data/types.d.ts type GoogleAnalyticsRequest = Record<string, any>; type GoogleAnalyticsResponse = null; //#endregion //#region src/modules/data/index.d.ts /** * Data module for Google Analytics data collection */ declare const dataModule: ModuleDefinition<{ sendAnalytics: RouteDefinition<GoogleAnalyticsRequest, null>; }>; type DataAPI = typeof dataModule.api; //#endregion //#region src/modules/discover/types.d.ts interface DiscoverRequest { keyword: string; target?: "feeds" | "lists"; } interface FeedDiscoveryResult { type: "feed"; id: string; url: string; title: string | null; description: string | null; siteUrl: string | null; image: string | null; ownerUserId?: string; owner?: { id: string; name: string; handle: string; avatar: string | null; }; } interface ListDiscoveryResult { type: "list"; id: string; title: string; description: string | null; image: string | null; view: number; fee: number; ownerUserId: string; } interface EntryData { id: string; title: string | null; content: string | null; description: string | null; publishedAt: string; url: string | null; author: string | null; feedId: string; media?: MediaModel[] | null; authorUrl: string | null; authorAvatar: string | null; insertedAt: string; categories?: string[]; attachments?: AttachmentsModel[]; extra?: ExtraModel; language?: string | null; } type FeedAnalytics$1 = SerializedModel<InferSelectModel<typeof feedAnalytics>>; interface DiscoveryItem { feed?: FeedDiscoveryResult; list?: ListDiscoveryResult; docs?: string; entries?: EntryData[]; subscriptionCount?: number; updatesPerWeek?: number; analytics?: FeedAnalytics$1; } type DiscoverResponse = StructuredSuccessResponse<DiscoveryItem[]>; interface RSSHubQuery { category?: string; namespace?: string; lang?: string; categories?: string; } interface RSSHubRouteMetadata { path: string; categories: string[]; example: string; parameters: Record<string, string>; name: string; maintainers: string[]; location: string; description: string; view?: number; } interface RSSHubNamespace { routes: Record<string, RSSHubRouteMetadata>; name: string; url: string; description: string; lang: string; } type RSSHubResponse = StructuredSuccessResponse<Record<string, RSSHubNamespace>>; interface RSSHubRouteQuery { route: string; } interface RSSHubRouteData { route: RSSHubRouteMetadata; prefix: string; name: string; description: string; url: string; } type RSSHubRouteResponse = StructuredSuccessResponse<RSSHubRouteData>; type RSSHubAnalyticsQuery = Record<string, never>; interface RSSHubRouteAnalytics { subscriptionCount: number; topFeeds: FeedDiscoveryResult[]; } type RSSHubAnalyticsResponse = StructuredSuccessResponse<Record<string, RSSHubRouteAnalytics>>; //#endregion //#region src/modules/discover/index.d.ts /** * Discover module definition - Feed and list discovery */ declare const discoverModule: ModuleDefinition<{ discover: RouteDefinition<DiscoverRequest, DiscoverResponse>; rsshub: RouteDefinition<RSSHubQuery, RSSHubResponse>; rsshubRoute: RouteDefinition<RSSHubRouteQuery, RSSHubRouteResponse>; rsshubAnalytics: RouteDefinition<RSSHubAnalyticsQuery, RSSHubAnalyticsResponse>; }>; type DiscoverAPI = typeof discoverModule.api; //#endregion //#region src/types/utils.d.ts type Prettify<T> = { [K in keyof T]: T[K] } & {}; //#endregion //#region src/modules/entries/types.d.ts type FeedOpenApiSchema$2 = SerializedModel<FeedOpenApiSchema>; type InboxOpenApiSchema$1 = SerializedModel<InboxOpenApiSchema>; type EntryModel = SerializedModel<InferSelectModel<typeof entries>>; type EntryInsert = SerializedInsertModel<InferInsertModel<typeof entries>>; type UserModel = SerializedModel<InferSelectModel<typeof users>>; interface EntryMedia { url: string; type: "photo" | "video"; preview_image_url?: string; width?: number; height?: number; blurhash?: string; } interface EntryAttachment { url: string; title?: string; duration_in_seconds?: number; mime_type?: string; size_in_bytes?: number; } interface EntryGetQuery extends IdRequest {} interface EntryTagSummary { schemaOrgCategory: string | null; mediaTopics: string[]; } type EntryOpenAPISchema = Prettify<S