UNPKG

marzban-sdk

Version:

Fully typed client SDK for the Marzban API, supporting both browser and Node.js environments.

1,357 lines (1,312 loc) 130 kB
'use strict'; var z = require('zod/v4'); var axios = require('axios'); var axiosRetry = require('axios-retry'); var chalk = require('chalk'); var crypto = require('crypto'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var z__default = /*#__PURE__*/_interopDefault(z); var axios__default = /*#__PURE__*/_interopDefault(axios); var axiosRetry__default = /*#__PURE__*/_interopDefault(axiosRetry); var chalk__default = /*#__PURE__*/_interopDefault(chalk); var crypto__default = /*#__PURE__*/_interopDefault(crypto); // src/config/config.ts var logLevelSchema = z__default.default.enum(["debug", "info", "warn", "error"]); var loggerOptionsSchema = z__default.default.object({ level: logLevelSchema.optional(), timestamp: z__default.default.boolean().optional() }); var loggerMethodSchema = z__default.default.custom((v) => typeof v === "function"); var loggerErrorMethodSchema = z__default.default.custom( (v) => typeof v === "function" ); var loggerObjectSchema = z__default.default.object({ debug: loggerMethodSchema, info: loggerMethodSchema, warn: loggerMethodSchema, error: loggerErrorMethodSchema }); var loggerConfigSchema = z__default.default.union([z__default.default.literal(false), loggerOptionsSchema, loggerObjectSchema]); var webhookSchema = z__default.default.object({ secret: z__default.default.string().optional() }); // src/config/config.ts var configSchema = z.z.object({ baseUrl: z.z.url(), username: z.z.string(), password: z.z.string(), timeout: z.z.number().int().positive().default(0).optional(), retries: z.z.number().int().nonnegative().default(3).optional(), token: z.z.string().optional(), authenticateOnInit: z.z.boolean().default(true).optional(), logger: loggerConfigSchema.optional(), webhook: webhookSchema.optional() }); // src/core/errors/codes.ts var ERROR_CODES = { CONFIG_INVALID: { code: "CONFIG_INVALID", message: "Invalid SDK configuration" }, NETWORK_HTTP_ERROR: { code: "NETWORK_HTTP_ERROR", message: "HTTP request failed" }, AUTH_TOKEN_FAILED: { code: "AUTH_TOKEN_FAILED", message: "Failed to retrieve access token" }, AUTH_FAILED: { code: "AUTH_FAILED", message: "Authentication failed" }, LOGGER_INVALID: { code: "LOGGER_INVALID", message: "Invalid logger option: must be false, LoggerOptions, or Logger instance" }, WEBHOOK_SIGNATURE_ERROR: { code: "WEBHOOK_SIGNATURE_ERROR", message: "Invalid webhook signature" }, WEBHOOK_VALIDATION_ERROR: { code: "WEBHOOK_VALIDATION_ERROR", message: "Invalid webhook payload" } }; // src/core/errors/sdk.error.ts var SdkError = class _SdkError extends Error { constructor(options, details) { super(options.message); this.name = new.target.name; this.code = options.code; this.details = details; Object.setPrototypeOf(this, new.target.prototype); if (Error.captureStackTrace) { Error.captureStackTrace(this, new.target); } } static fromCode(code, details) { const entry = Object.values(ERROR_CODES).find((e) => e.code === code); const format = entry ?? { code, message: code }; return new _SdkError(format, details); } toJSON() { return { name: this.name, code: this.code, message: this.message, details: this.details }; } }; // src/core/errors/categories/auth.error.ts var AuthError = class extends SdkError { constructor(details) { super(ERROR_CODES.AUTH_FAILED, details); } }; var AuthTokenError = class extends SdkError { constructor(details) { super(ERROR_CODES.AUTH_TOKEN_FAILED, details); } }; // src/core/errors/categories/configuration.error.ts var ConfigurationError = class extends SdkError { constructor(details) { super(ERROR_CODES.CONFIG_INVALID, details); } }; // src/core/errors/categories/http.error.ts var HttpError = class extends SdkError { constructor(details) { super(ERROR_CODES.NETWORK_HTTP_ERROR, details); } }; // src/core/errors/categories/webhook.error.ts var WebhookSignatureError = class extends SdkError { constructor(details) { super(ERROR_CODES.WEBHOOK_SIGNATURE_ERROR, details); } }; var WebhookValidationError = class extends SdkError { constructor(details) { super(ERROR_CODES.WEBHOOK_VALIDATION_ERROR, details); } }; // src/core/errors/guards/auth.guard.ts var isAuthError = (error) => { return error instanceof AuthError; }; // src/core/errors/guards/configuration.guard.ts var isConfigurationError = (error) => { return error instanceof ConfigurationError; }; // src/core/errors/guards/sdk.guard.ts var isSdkError = (error) => { return error instanceof SdkError; }; // src/config/validate.ts function validateConfig(config) { const { data, success, error } = configSchema.safeParse(config); if (!success) { throw new ConfigurationError(error.issues); } return data; } // src/core/http/interceptors/auth.interceptors.ts var setupAuthInterceptors = (client2, authService, config, logger) => { logger.debug("Setting up authentication request interceptor", "AuthInterceptor"); client2.interceptors.request.use( async (requestConfig) => { await authService.waitForCurrentAuth(); const accessToken = authService.accessToken; if (accessToken) { requestConfig.headers.authorization = `Bearer ${accessToken}`; logger.debug("Authorization header added to request", "AuthInterceptor"); } else { logger.warn("No access token available for request", "AuthInterceptor"); } return requestConfig; }, (error) => { logger.error("Request interceptor error", error, "AuthInterceptor"); if (error instanceof SdkError) return Promise.reject(error); return Promise.reject(new HttpError(error)); } ); logger.debug("Setting up authentication response interceptor", "AuthInterceptor"); client2.interceptors.response.use( (response) => response, async (error) => { const retryConfig = error?.config; if (error?.response?.status === 401 && !retryConfig?.sent) { logger.warn("Received 401 Unauthorized, attempting to re-authenticate", "AuthInterceptor"); retryConfig.sent = true; try { await authService.authenticate(config.username, config.password); const accessToken = authService.accessToken; if (accessToken) { retryConfig.headers.authorization = `Bearer ${accessToken}`; logger.info("Re-authentication successful, retrying request", "AuthInterceptor"); return client2(retryConfig); } logger.error("Re-authentication failed: No access token received", null, "AuthInterceptor"); return Promise.reject(new HttpError("No access token after re-authentication")); } catch (err) { logger.error("Re-authentication failed", err, "AuthInterceptor"); if (err instanceof SdkError) return Promise.reject(err); return Promise.reject(new HttpError(err)); } } if (error instanceof SdkError) return Promise.reject(error); return Promise.reject(new HttpError(error)); } ); }; // src/core/http/client.ts function createClientFromAxios(instance) { return async (requestConfig) => { const promise = instance.request(requestConfig).catch((e) => { throw e; }); return promise; }; } var configureHttpClient = (baseUrl, authService, config, logger) => { logger.info(`Configuring HTTP client with base URL: ${baseUrl}`, "HttpClient"); logger.debug(`HTTP client configuration: timeout=${config.timeout}s, retries=${config.retries}`, "HttpClient"); const instanceAxios = axios__default.default.create({ baseURL: baseUrl }); const instancePublic = axios__default.default.create({ baseURL: baseUrl }); logger.debug("Setting up authentication interceptors", "HttpClient"); setupAuthInterceptors(instanceAxios, authService, config, logger); logger.debug(`Configuring retry logic: ${config?.retries ?? 3} retries with exponential backoff`, "HttpClient"); axiosRetry__default.default(instanceAxios, { retries: config?.retries ?? 3, retryDelay: (retryCount) => { const delay = retryCount * 1e3; logger.debug(`Retry attempt ${retryCount}, delay: ${delay}ms`, "HttpClient"); return delay; } }); axiosRetry__default.default(instancePublic, { retries: config?.retries ?? 3, retryDelay: (retryCount) => { const delay = retryCount * 1e3; logger.debug(`Public instance retry attempt ${retryCount}, delay: ${delay}ms`, "HttpClient"); return delay; } }); logger.info("HTTP client configuration completed successfully", "HttpClient"); return { client: createClientFromAxios(instanceAxios), getPublicInstance: () => instancePublic, publicClient: createClientFromAxios(instancePublic) }; }; var client = () => { throw new Error("The http layer instance is not specified. You must use a pre-configured configureHttpClient layer"); }; var client_default = client; var forbiddenSchema = z.z.object({ detail: z.z.optional(z.z.string().default("You are not allowed to ...")) }); var validationErrorSchema = z.z.object({ loc: z.z.array(z.z.union([z.z.int(), z.z.string()])), msg: z.z.string(), type: z.z.string() }); // src/gen/schemas/HTTPValidationErrorSchema.ts var HTTPValidationErrorSchema = z.z.object({ get detail() { return z.z.array(validationErrorSchema).optional(); } }); var notFoundSchema = z.z.object({ detail: z.z.optional(z.z.string().default("Entity {} not found")) }); var unauthorizedSchema = z.z.object({ detail: z.z.optional(z.z.string().default("Not authenticated")) }); // src/gen/schemas/AdminSchema/activateAllDisabledUsersSchema.ts var activateAllDisabledUsersPathParamsSchema = z.z.object({ username: z.z.string() }); var activateAllDisabledUsers200Schema = z.z.any(); var activateAllDisabledUsers401Schema = z.z.lazy( () => unauthorizedSchema ); var activateAllDisabledUsers403Schema = z.z.lazy( () => forbiddenSchema ); var activateAllDisabledUsers404Schema = z.z.lazy( () => notFoundSchema ); var activateAllDisabledUsers422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var activateAllDisabledUsersMutationResponseSchema = z.z.lazy( () => activateAllDisabledUsers200Schema ); var bodyAdminTokenApiAdminTokenPostSchema = z.z.object({ grant_type: z.z.optional(z.z.union([z.z.string().regex(/password/), z.z.null()])), username: z.z.string(), password: z.z.string(), scope: z.z.optional(z.z.string().default("")), client_id: z.z.optional(z.z.union([z.z.string(), z.z.null()])), client_secret: z.z.optional(z.z.union([z.z.string(), z.z.null()])) }); var tokenSchema = z.z.object({ access_token: z.z.string(), token_type: z.z.optional(z.z.string().default("bearer")) }); // src/gen/schemas/AdminSchema/adminTokenSchema.ts var adminToken200Schema = z.z.lazy(() => tokenSchema); var adminToken401Schema = z.z.lazy(() => unauthorizedSchema); var adminToken422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var adminTokenMutationRequestSchema = z.z.lazy( () => bodyAdminTokenApiAdminTokenPostSchema ); var adminTokenMutationResponseSchema = z.z.lazy( () => adminToken200Schema ); var adminCreateSchema = z.z.object({ username: z.z.string(), is_sudo: z.z.boolean(), telegram_id: z.z.optional(z.z.union([z.z.int(), z.z.null()])), discord_webhook: z.z.optional(z.z.union([z.z.string(), z.z.null()])), users_usage: z.z.optional(z.z.union([z.z.int(), z.z.null()])), password: z.z.string() }); var adminSchema = z.z.object({ username: z.z.string(), is_sudo: z.z.boolean(), telegram_id: z.z.optional(z.z.union([z.z.int(), z.z.null()])), discord_webhook: z.z.optional(z.z.union([z.z.string(), z.z.null()])), users_usage: z.z.optional(z.z.union([z.z.int(), z.z.null()])) }); var conflictSchema = z.z.object({ detail: z.z.optional(z.z.string().default("Entity already exists")) }); // src/gen/schemas/AdminSchema/createAdminSchema.ts var createAdmin200Schema = z.z.lazy(() => adminSchema); var createAdmin401Schema = z.z.lazy(() => unauthorizedSchema); var createAdmin403Schema = z.z.lazy(() => forbiddenSchema); var createAdmin409Schema = z.z.lazy(() => conflictSchema); var createAdmin422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var createAdminMutationRequestSchema = z.z.lazy( () => adminCreateSchema ); var createAdminMutationResponseSchema = z.z.lazy( () => createAdmin200Schema ); var disableAllActiveUsersPathParamsSchema = z.z.object({ username: z.z.string() }); var disableAllActiveUsers200Schema = z.z.any(); var disableAllActiveUsers401Schema = z.z.lazy( () => unauthorizedSchema ); var disableAllActiveUsers403Schema = z.z.lazy( () => forbiddenSchema ); var disableAllActiveUsers404Schema = z.z.lazy( () => notFoundSchema ); var disableAllActiveUsers422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var disableAllActiveUsersMutationResponseSchema = z.z.lazy( () => disableAllActiveUsers200Schema ); var getAdminsQueryParamsSchema = z.z.object({ offset: z.z.optional(z.z.union([z.z.coerce.number().int(), z.z.null()])), limit: z.z.optional(z.z.union([z.z.coerce.number().int(), z.z.null()])), username: z.z.optional(z.z.union([z.z.string(), z.z.null()])) }).optional(); var getAdmins200Schema = z.z.array(z.z.lazy(() => adminSchema)); var getAdmins401Schema = z.z.lazy(() => unauthorizedSchema); var getAdmins403Schema = z.z.lazy(() => forbiddenSchema); var getAdmins422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var getAdminsQueryResponseSchema = z.z.lazy( () => getAdmins200Schema ); var getAdminUsagePathParamsSchema = z.z.object({ username: z.z.string() }); var getAdminUsage200Schema = z.z.int(); var getAdminUsage401Schema = z.z.lazy(() => unauthorizedSchema); var getAdminUsage403Schema = z.z.lazy(() => forbiddenSchema); var getAdminUsage422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var getAdminUsageQueryResponseSchema = z.z.lazy( () => getAdminUsage200Schema ); var getCurrentAdmin200Schema = z.z.lazy(() => adminSchema); var getCurrentAdmin401Schema = z.z.lazy(() => unauthorizedSchema); var getCurrentAdminQueryResponseSchema = z.z.lazy( () => getCurrentAdmin200Schema ); var adminModifySchema = z.z.object({ password: z.z.optional(z.z.union([z.z.string(), z.z.null()])), is_sudo: z.z.boolean(), telegram_id: z.z.optional(z.z.union([z.z.int(), z.z.null()])), discord_webhook: z.z.optional(z.z.union([z.z.string(), z.z.null()])) }); // src/gen/schemas/AdminSchema/modifyAdminSchema.ts var modifyAdminPathParamsSchema = z.z.object({ username: z.z.string() }); var modifyAdmin200Schema = z.z.lazy(() => adminSchema); var modifyAdmin401Schema = z.z.lazy(() => unauthorizedSchema); var modifyAdmin403Schema = z.z.lazy(() => forbiddenSchema); var modifyAdmin422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var modifyAdminMutationRequestSchema = z.z.lazy( () => adminModifySchema ); var modifyAdminMutationResponseSchema = z.z.lazy( () => modifyAdmin200Schema ); var removeAdminPathParamsSchema = z.z.object({ username: z.z.string() }); var removeAdmin200Schema = z.z.any(); var removeAdmin401Schema = z.z.lazy(() => unauthorizedSchema); var removeAdmin403Schema = z.z.lazy(() => forbiddenSchema); var removeAdmin422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var removeAdminMutationResponseSchema = z.z.lazy( () => removeAdmin200Schema ); var resetAdminUsagePathParamsSchema = z.z.object({ username: z.z.string() }); var resetAdminUsage200Schema = z.z.lazy(() => adminSchema); var resetAdminUsage401Schema = z.z.lazy(() => unauthorizedSchema); var resetAdminUsage403Schema = z.z.lazy(() => forbiddenSchema); var resetAdminUsage422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var resetAdminUsageMutationResponseSchema = z.z.lazy( () => resetAdminUsage200Schema ); // src/gen/api/AdminApi/adminApi.ts var adminApi = class { #client; constructor(config = {}) { this.#client = config.client || client_default; } /** * @description Authenticate an admin and issue a token. * @summary Admin Token * {@link /api/admin/token} */ async adminToken(data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = adminTokenMutationRequestSchema.parse(data); const res = await request({ method: "POST", url: `/api/admin/token`, data: requestData, ...requestConfig, headers: { "Content-Type": "application/x-www-form-urlencoded", ...requestConfig.headers } }); return adminTokenMutationResponseSchema.parse(res.data); } /** * @description Retrieve the current authenticated admin. * @summary Get Current Admin * {@link /api/admin} */ async getCurrentAdmin(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/admin`, ...requestConfig }); return getCurrentAdminQueryResponseSchema.parse(res.data); } /** * @description Create a new admin if the current admin has sudo privileges. * @summary Create Admin * {@link /api/admin} */ async createAdmin(data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = createAdminMutationRequestSchema.parse(data); const res = await request({ method: "POST", url: `/api/admin`, data: requestData, ...requestConfig }); return createAdminMutationResponseSchema.parse(res.data); } /** * @description Modify an existing admin's details. * @summary Modify Admin * {@link /api/admin/:username} */ async modifyAdmin(username, data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = modifyAdminMutationRequestSchema.parse(data); const res = await request({ method: "PUT", url: `/api/admin/${username}`, data: requestData, ...requestConfig }); return modifyAdminMutationResponseSchema.parse(res.data); } /** * @description Remove an admin from the database. * @summary Remove Admin * {@link /api/admin/:username} */ async removeAdmin(username, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "DELETE", url: `/api/admin/${username}`, ...requestConfig }); return removeAdminMutationResponseSchema.parse(res.data); } /** * @description Fetch a list of admins with optional filters for pagination and username. * @summary Get Admins * {@link /api/admins} */ async getAdmins(params, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/admins`, params, ...requestConfig }); return getAdminsQueryResponseSchema.parse(res.data); } /** * @description Disable all active users under a specific admin * @summary Disable All Active Users * {@link /api/admin/:username/users/disable} */ async disableAllActiveUsers(username, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "POST", url: `/api/admin/${username}/users/disable`, ...requestConfig }); return disableAllActiveUsersMutationResponseSchema.parse(res.data); } /** * @description Activate all disabled users under a specific admin * @summary Activate All Disabled Users * {@link /api/admin/:username/users/activate} */ async activateAllDisabledUsers(username, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "POST", url: `/api/admin/${username}/users/activate`, ...requestConfig }); return activateAllDisabledUsersMutationResponseSchema.parse(res.data); } /** * @description Resets usage of admin. * @summary Reset Admin Usage * {@link /api/admin/usage/reset/:username} */ async resetAdminUsage(username, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "POST", url: `/api/admin/usage/reset/${username}`, ...requestConfig }); return resetAdminUsageMutationResponseSchema.parse(res.data); } /** * @description Retrieve the usage of given admin. * @summary Get Admin Usage * {@link /api/admin/usage/:username} */ async getAdminUsage(username, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/admin/usage/${username}`, ...requestConfig }); return getAdminUsageQueryResponseSchema.parse(res.data); } }; var getCoreConfig200Schema = z.z.object({}); var getCoreConfig401Schema = z.z.lazy(() => unauthorizedSchema); var getCoreConfig403Schema = z.z.lazy(() => forbiddenSchema); var getCoreConfigQueryResponseSchema = z.z.lazy( () => getCoreConfig200Schema ); var coreStatsSchema = z.z.object({ version: z.z.string(), started: z.z.boolean(), logs_websocket: z.z.string() }); // src/gen/schemas/CoreSchema/getCoreStatsSchema.ts var getCoreStats200Schema = z.z.lazy(() => coreStatsSchema); var getCoreStats401Schema = z.z.lazy(() => unauthorizedSchema); var getCoreStatsQueryResponseSchema = z.z.lazy( () => getCoreStats200Schema ); var modifyCoreConfig200Schema = z.z.object({}); var modifyCoreConfig401Schema = z.z.lazy(() => unauthorizedSchema); var modifyCoreConfig403Schema = z.z.lazy(() => forbiddenSchema); var modifyCoreConfig422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var modifyCoreConfigMutationRequestSchema = z.z.object( {} ); var modifyCoreConfigMutationResponseSchema = z.z.lazy( () => modifyCoreConfig200Schema ); var restartCore200Schema = z.z.any(); var restartCore401Schema = z.z.lazy(() => unauthorizedSchema); var restartCore403Schema = z.z.lazy(() => forbiddenSchema); var restartCoreMutationResponseSchema = z.z.lazy( () => restartCore200Schema ); // src/gen/api/CoreApi/coreApi.ts var coreApi = class { #client; constructor(config = {}) { this.#client = config.client || client_default; } /** * @description Retrieve core statistics such as version and uptime. * @summary Get Core Stats * {@link /api/core} */ async getCoreStats(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/core`, ...requestConfig }); return getCoreStatsQueryResponseSchema.parse(res.data); } /** * @description Restart the core and all connected nodes. * @summary Restart Core * {@link /api/core/restart} */ async restartCore(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "POST", url: `/api/core/restart`, ...requestConfig }); return restartCoreMutationResponseSchema.parse(res.data); } /** * @description Get the current core configuration. * @summary Get Core Config * {@link /api/core/config} */ async getCoreConfig(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/core/config`, ...requestConfig }); return getCoreConfigQueryResponseSchema.parse(res.data); } /** * @description Modify the core configuration and restart the core. * @summary Modify Core Config * {@link /api/core/config} */ async modifyCoreConfig(data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = modifyCoreConfigMutationRequestSchema.parse(data); const res = await request({ method: "PUT", url: `/api/core/config`, data: requestData, ...requestConfig }); return modifyCoreConfigMutationResponseSchema.parse(res.data); } }; var nodeCreateSchema = z.z.object({ name: z.z.string(), address: z.z.string(), port: z.z.optional(z.z.int().default(62050)), api_port: z.z.optional(z.z.int().default(62051)), usage_coefficient: z.z.optional(z.z.number().gt(0).default(1)), add_as_new_host: z.z.optional(z.z.boolean().default(true)) }); var nodeStatusSchema = z.z.enum([ "connected", "connecting", "error", "disabled" ]); // src/gen/schemas/nodeResponseSchema.ts var nodeResponseSchema = z.z.object({ name: z.z.string(), address: z.z.string(), port: z.z.optional(z.z.int().default(62050)), api_port: z.z.optional(z.z.int().default(62051)), usage_coefficient: z.z.optional(z.z.number().gt(0).default(1)), id: z.z.int(), xray_version: z.z.optional(z.z.union([z.z.string(), z.z.null()])), get status() { return nodeStatusSchema; }, message: z.z.optional(z.z.union([z.z.string(), z.z.null()])) }); // src/gen/schemas/NodeSchema/addNodeSchema.ts var addNode200Schema = z.z.lazy(() => nodeResponseSchema); var addNode401Schema = z.z.lazy(() => unauthorizedSchema); var addNode403Schema = z.z.lazy(() => forbiddenSchema); var addNode409Schema = z.z.lazy(() => conflictSchema); var addNode422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var addNodeMutationRequestSchema = z.z.lazy( () => nodeCreateSchema ); var addNodeMutationResponseSchema = z.z.lazy( () => addNode200Schema ); var getNodePathParamsSchema = z.z.object({ node_id: z.z.coerce.number().int() }); var getNode200Schema = z.z.lazy(() => nodeResponseSchema); var getNode401Schema = z.z.lazy(() => unauthorizedSchema); var getNode403Schema = z.z.lazy(() => forbiddenSchema); var getNode422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var getNodeQueryResponseSchema = z.z.lazy(() => getNode200Schema); var nodeSettingsSchema = z.z.object({ min_node_version: z.z.optional(z.z.string().default("v0.2.0")), certificate: z.z.string() }); // src/gen/schemas/NodeSchema/getNodeSettingsSchema.ts var getNodeSettings200Schema = z.z.lazy(() => nodeSettingsSchema); var getNodeSettings401Schema = z.z.lazy(() => unauthorizedSchema); var getNodeSettings403Schema = z.z.lazy(() => forbiddenSchema); var getNodeSettingsQueryResponseSchema = z.z.lazy( () => getNodeSettings200Schema ); var getNodes200Schema = z.z.array(z.z.lazy(() => nodeResponseSchema)); var getNodes401Schema = z.z.lazy(() => unauthorizedSchema); var getNodes403Schema = z.z.lazy(() => forbiddenSchema); var getNodesQueryResponseSchema = z.z.lazy( () => getNodes200Schema ); var nodeUsageResponseSchema = z.z.object({ node_id: z.z.optional(z.z.union([z.z.int(), z.z.null()])), node_name: z.z.string(), uplink: z.z.int(), downlink: z.z.int() }); // src/gen/schemas/nodesUsageResponseSchema.ts var nodesUsageResponseSchema = z.z.object({ get usages() { return z.z.array(nodeUsageResponseSchema); } }); // src/gen/schemas/NodeSchema/getUsageSchema.ts var getUsageQueryParamsSchema = z.z.object({ start: z.z.string().default(""), end: z.z.string().default("") }); var getUsage200Schema = z.z.lazy(() => nodesUsageResponseSchema); var getUsage401Schema = z.z.lazy(() => unauthorizedSchema); var getUsage403Schema = z.z.lazy(() => forbiddenSchema); var getUsage422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var getUsageQueryResponseSchema = z.z.lazy( () => getUsage200Schema ); var nodeModifySchema = z.z.object({ name: z.z.union([z.z.string(), z.z.null()]).nullish(), address: z.z.union([z.z.string(), z.z.null()]).nullish(), port: z.z.union([z.z.int(), z.z.null()]).nullish(), api_port: z.z.union([z.z.int(), z.z.null()]).nullish(), usage_coefficient: z.z.union([z.z.number(), z.z.null()]).nullish(), get status() { return z.z.union([nodeStatusSchema, z.z.null()]).nullish(); } }); // src/gen/schemas/NodeSchema/modifyNodeSchema.ts var modifyNodePathParamsSchema = z.z.object({ node_id: z.z.coerce.number().int() }); var modifyNode200Schema = z.z.lazy(() => nodeResponseSchema); var modifyNode401Schema = z.z.lazy(() => unauthorizedSchema); var modifyNode403Schema = z.z.lazy(() => forbiddenSchema); var modifyNode422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var modifyNodeMutationRequestSchema = z.z.lazy( () => nodeModifySchema ); var modifyNodeMutationResponseSchema = z.z.lazy( () => modifyNode200Schema ); var reconnectNodePathParamsSchema = z.z.object({ node_id: z.z.coerce.number().int() }); var reconnectNode200Schema = z.z.any(); var reconnectNode401Schema = z.z.lazy(() => unauthorizedSchema); var reconnectNode403Schema = z.z.lazy(() => forbiddenSchema); var reconnectNode422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var reconnectNodeMutationResponseSchema = z.z.lazy( () => reconnectNode200Schema ); var removeNodePathParamsSchema = z.z.object({ node_id: z.z.coerce.number().int() }); var removeNode200Schema = z.z.any(); var removeNode401Schema = z.z.lazy(() => unauthorizedSchema); var removeNode403Schema = z.z.lazy(() => forbiddenSchema); var removeNode422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var removeNodeMutationResponseSchema = z.z.lazy( () => removeNode200Schema ); // src/gen/api/NodeApi/nodeApi.ts var nodeApi = class { #client; constructor(config = {}) { this.#client = config.client || client_default; } /** * @description Retrieve the current node settings, including TLS certificate. * @summary Get Node Settings * {@link /api/node/settings} */ async getNodeSettings(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/node/settings`, ...requestConfig }); return getNodeSettingsQueryResponseSchema.parse(res.data); } /** * @description Add a new node to the database and optionally add it as a host. * @summary Add Node * {@link /api/node} */ async addNode(data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = addNodeMutationRequestSchema.parse(data); const res = await request({ method: "POST", url: `/api/node`, data: requestData, ...requestConfig }); return addNodeMutationResponseSchema.parse(res.data); } /** * @description Retrieve details of a specific node by its ID. * @summary Get Node * {@link /api/node/:node_id} */ async getNode(nodeId, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request( { method: "GET", url: `/api/node/${nodeId}`, ...requestConfig } ); return getNodeQueryResponseSchema.parse(res.data); } /** * @description Update a node's details. Only accessible to sudo admins. * @summary Modify Node * {@link /api/node/:node_id} */ async modifyNode(nodeId, data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = modifyNodeMutationRequestSchema.parse(data); const res = await request({ method: "PUT", url: `/api/node/${nodeId}`, data: requestData, ...requestConfig }); return modifyNodeMutationResponseSchema.parse(res.data); } /** * @description Delete a node and remove it from xray in the background. * @summary Remove Node * {@link /api/node/:node_id} */ async removeNode(nodeId, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "DELETE", url: `/api/node/${nodeId}`, ...requestConfig }); return removeNodeMutationResponseSchema.parse(res.data); } /** * @description Retrieve a list of all nodes. Accessible only to sudo admins. * @summary Get Nodes * {@link /api/nodes} */ async getNodes(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/nodes`, ...requestConfig }); return getNodesQueryResponseSchema.parse(res.data); } /** * @description Trigger a reconnection for the specified node. Only accessible to sudo admins. * @summary Reconnect Node * {@link /api/node/:node_id/reconnect} */ async reconnectNode(nodeId, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "POST", url: `/api/node/${nodeId}/reconnect`, ...requestConfig }); return reconnectNodeMutationResponseSchema.parse(res.data); } /** * @description Retrieve usage statistics for nodes within a specified date range. * @summary Get Usage * {@link /api/nodes/usage} */ async getUsage(params, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/nodes/usage`, params, ...requestConfig }); return getUsageQueryResponseSchema.parse(res.data); } }; var userGetUsagePathParamsSchema = z.z.object({ token: z.z.string() }); var userGetUsageQueryParamsSchema = z.z.object({ start: z.z.string().default(""), end: z.z.string().default("") }); var userGetUsage200Schema = z.z.any(); var userGetUsage422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var userGetUsageQueryResponseSchema = z.z.lazy( () => userGetUsage200Schema ); var nextPlanModelSchema = z.z.object({ data_limit: z.z.optional(z.z.union([z.z.int(), z.z.null()])), expire: z.z.optional(z.z.union([z.z.int(), z.z.null()])), add_remaining_traffic: z.z.optional(z.z.boolean().default(false)), fire_on_either: z.z.optional(z.z.boolean().default(true)) }); var userDataLimitResetStrategySchema = z.z.enum([ "no_reset", "day", "week", "month", "year" ]); var userStatusSchema = z.z.enum([ "active", "disabled", "limited", "expired", "on_hold" ]); // src/gen/schemas/subscriptionUserResponseSchema.ts var subscriptionUserResponseSchema = z.z.object({ proxies: z.z.object({}), expire: z.z.union([z.z.int(), z.z.null()]).nullish(), data_limit: z.z.optional(z.z.union([z.z.int(), z.z.null()]).describe("data_limit can be 0 or greater")), get data_limit_reset_strategy() { return userDataLimitResetStrategySchema.optional(); }, sub_updated_at: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), sub_last_user_agent: z.z.union([z.z.string(), z.z.null()]).nullish(), online_at: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), on_hold_expire_duration: z.z.union([z.z.int(), z.z.null()]).nullish(), on_hold_timeout: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), get next_plan() { return z.z.union([nextPlanModelSchema, z.z.null()]).nullish(); }, username: z.z.string(), get status() { return userStatusSchema; }, used_traffic: z.z.int(), lifetime_used_traffic: z.z.optional(z.z.int().default(0)), created_at: z.z.iso.datetime({ local: true }), links: z.z.optional(z.z.array(z.z.string())), subscription_url: z.z.optional(z.z.string().default("")) }); // src/gen/schemas/SubscriptionSchema/userSubscriptionInfoSchema.ts var userSubscriptionInfoPathParamsSchema = z.z.object({ token: z.z.string() }); var userSubscriptionInfo200Schema = z.z.lazy( () => subscriptionUserResponseSchema ); var userSubscriptionInfo422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var userSubscriptionInfoQueryResponseSchema = z.z.lazy( () => userSubscriptionInfo200Schema ); var userSubscriptionPathParamsSchema = z.z.object({ token: z.z.string() }); var userSubscriptionHeaderParamsSchema = z.z.object({ "user-agent": z.z.string().default("") }); var userSubscription200Schema = z.z.any(); var userSubscription422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var userSubscriptionQueryResponseSchema = z.z.lazy( () => userSubscription200Schema ); var userSubscriptionWithClientTypePathParamsSchema = z.z.object({ client_type: z.z.string().regex(/sing-box|clash-meta|clash|outline|v2ray|v2ray-json/), token: z.z.string() }); var userSubscriptionWithClientTypeHeaderParamsSchema = z.z.object({ "user-agent": z.z.string().default("") }); var userSubscriptionWithClientType200Schema = z.z.any(); var userSubscriptionWithClientType422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var userSubscriptionWithClientTypeQueryResponseSchema = z.z.lazy( () => userSubscriptionWithClientType200Schema ); // src/gen/api/SubscriptionApi/subscriptionApi.ts var subscriptionApi = class { #client; constructor(config = {}) { this.#client = config.client || client_default; } /** * @description Provides a subscription link based on the user agent (Clash, V2Ray, etc.). * @summary User Subscription * {@link /sub/:token/} */ async userSubscription(token, headers, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/sub/${token}/`, ...requestConfig, headers: { ...headers, ...requestConfig.headers } }); return userSubscriptionQueryResponseSchema.parse(res.data); } /** * @description Retrieves detailed information about the user's subscription. * @summary User Subscription Info * {@link /sub/:token/info} */ async userSubscriptionInfo(token, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request( { method: "GET", url: `/sub/${token}/info`, ...requestConfig } ); return userSubscriptionInfoQueryResponseSchema.parse(res.data); } /** * @description Fetches the usage statistics for the user within a specified date range. * @summary User Get Usage * {@link /sub/:token/usage} */ async userGetUsage(token, params, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/sub/${token}/usage`, params, ...requestConfig }); return userGetUsageQueryResponseSchema.parse(res.data); } /** * @description Provides a subscription link based on the specified client type (e.g., Clash, V2Ray). * @summary User Subscription With Client Type * {@link /sub/:token/:client_type} */ async userSubscriptionWithClientType(clientType, token, headers, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/sub/${token}/${clientType}`, ...requestConfig, headers: { ...headers, ...requestConfig.headers } }); return userSubscriptionWithClientTypeQueryResponseSchema.parse(res.data); } }; var proxyHostALPNSchema = z.z.enum([ "", "h3", "h2", "http/1.1", "h3,h2,http/1.1", "h3,h2", "h2,http/1.1" ]); var proxyHostFingerprintSchema = z.z.enum([ "", "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized" ]); var proxyHostSecuritySchema = z.z.enum([ "inbound_default", "none", "tls" ]); // src/gen/schemas/proxyHostSchema.ts var proxyHostSchema = z.z.object({ remark: z.z.string(), address: z.z.string(), port: z.z.union([z.z.int(), z.z.null()]).nullish(), sni: z.z.union([z.z.string(), z.z.null()]).nullish(), host: z.z.union([z.z.string(), z.z.null()]).nullish(), path: z.z.union([z.z.string(), z.z.null()]).nullish(), get security() { return proxyHostSecuritySchema.optional(); }, get alpn() { return proxyHostALPNSchema.optional(); }, get fingerprint() { return proxyHostFingerprintSchema.optional(); }, allowinsecure: z.z.optional(z.z.union([z.z.boolean(), z.z.null()])), is_disabled: z.z.optional(z.z.union([z.z.boolean(), z.z.null()])), mux_enable: z.z.optional(z.z.union([z.z.boolean(), z.z.null()])), fragment_setting: z.z.union([z.z.string(), z.z.null()]).nullish(), noise_setting: z.z.union([z.z.string(), z.z.null()]).nullish(), random_user_agent: z.z.optional(z.z.union([z.z.boolean(), z.z.null()])), use_sni_as_host: z.z.optional(z.z.union([z.z.boolean(), z.z.null()])) }); // src/gen/schemas/SystemSchema/getHostsSchema.ts var getHosts200Schema = z.z.object({}).catchall(z.z.array(z.z.lazy(() => proxyHostSchema))); var getHosts401Schema = z.z.lazy(() => unauthorizedSchema); var getHosts403Schema = z.z.lazy(() => forbiddenSchema); var getHostsQueryResponseSchema = z.z.lazy( () => getHosts200Schema ); var proxyTypesSchema = z.z.enum(["vmess", "vless", "trojan", "shadowsocks"]); // src/gen/schemas/proxyInboundSchema.ts var proxyInboundSchema = z.z.object({ tag: z.z.string(), get protocol() { return proxyTypesSchema; }, network: z.z.string(), tls: z.z.string(), port: z.z.union([z.z.int(), z.z.string()]) }); // src/gen/schemas/SystemSchema/getInboundsSchema.ts var getInbounds200Schema = z.z.object({}).catchall(z.z.array(z.z.lazy(() => proxyInboundSchema))); var getInbounds401Schema = z.z.lazy(() => unauthorizedSchema); var getInboundsQueryResponseSchema = z.z.lazy( () => getInbounds200Schema ); var systemStatsSchema = z.z.object({ version: z.z.string(), mem_total: z.z.int(), mem_used: z.z.int(), cpu_cores: z.z.int(), cpu_usage: z.z.number(), total_user: z.z.int(), online_users: z.z.int(), users_active: z.z.int(), users_on_hold: z.z.int(), users_disabled: z.z.int(), users_expired: z.z.int(), users_limited: z.z.int(), incoming_bandwidth: z.z.int(), outgoing_bandwidth: z.z.int(), incoming_bandwidth_speed: z.z.int(), outgoing_bandwidth_speed: z.z.int() }); // src/gen/schemas/SystemSchema/getSystemStatsSchema.ts var getSystemStats200Schema = z.z.lazy(() => systemStatsSchema); var getSystemStats401Schema = z.z.lazy(() => unauthorizedSchema); var getSystemStatsQueryResponseSchema = z.z.lazy( () => getSystemStats200Schema ); var modifyHosts200Schema = z.z.object({}).catchall(z.z.array(z.z.lazy(() => proxyHostSchema))); var modifyHosts401Schema = z.z.lazy(() => unauthorizedSchema); var modifyHosts403Schema = z.z.lazy(() => forbiddenSchema); var modifyHosts422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var modifyHostsMutationRequestSchema = z.z.object({}).catchall(z.z.array(z.z.lazy(() => proxyHostSchema))); var modifyHostsMutationResponseSchema = z.z.lazy( () => modifyHosts200Schema ); // src/gen/api/SystemApi/systemApi.ts var systemApi = class { #client; constructor(config = {}) { this.#client = config.client || client_default; } /** * @description Fetch system stats including memory, CPU, and user metrics. * @summary Get System Stats * {@link /api/system} */ async getSystemStats(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/system`, ...requestConfig }); return getSystemStatsQueryResponseSchema.parse(res.data); } /** * @description Retrieve inbound configurations grouped by protocol. * @summary Get Inbounds * {@link /api/inbounds} */ async getInbounds(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/inbounds`, ...requestConfig }); return getInboundsQueryResponseSchema.parse(res.data); } /** * @description Get a list of proxy hosts grouped by inbound tag. * @summary Get Hosts * {@link /api/hosts} */ async getHosts(config = {}) { const { client: request = this.#client, ...requestConfig } = config; const res = await request({ method: "GET", url: `/api/hosts`, ...requestConfig }); return getHostsQueryResponseSchema.parse(res.data); } /** * @description Modify proxy hosts and update the configuration. * @summary Modify Hosts * {@link /api/hosts} */ async modifyHosts(data, config = {}) { const { client: request = this.#client, ...requestConfig } = config; const requestData = modifyHostsMutationRequestSchema.parse(data); const res = await request({ method: "PUT", url: `/api/hosts`, data: requestData, ...requestConfig }); return modifyHostsMutationResponseSchema.parse(res.data); } }; var userResponseSchema = z.z.object({ proxies: z.z.object({}), expire: z.z.union([z.z.int(), z.z.null()]).nullish(), data_limit: z.z.optional(z.z.union([z.z.int(), z.z.null()]).describe("data_limit can be 0 or greater")), get data_limit_reset_strategy() { return userDataLimitResetStrategySchema.optional(); }, inbounds: z.z.optional(z.z.object({}).catchall(z.z.array(z.z.string())).default({})), note: z.z.union([z.z.string(), z.z.null()]).nullish(), sub_updated_at: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), sub_last_user_agent: z.z.union([z.z.string(), z.z.null()]).nullish(), online_at: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), on_hold_expire_duration: z.z.union([z.z.int(), z.z.null()]).nullish(), on_hold_timeout: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), auto_delete_in_days: z.z.union([z.z.int(), z.z.null()]).nullish(), get next_plan() { return z.z.union([nextPlanModelSchema, z.z.null()]).nullish(); }, username: z.z.string(), get status() { return userStatusSchema; }, used_traffic: z.z.int(), lifetime_used_traffic: z.z.optional(z.z.int().default(0)), created_at: z.z.iso.datetime({ local: true }), links: z.z.optional(z.z.array(z.z.string())), subscription_url: z.z.optional(z.z.string().default("")), excluded_inbounds: z.z.optional(z.z.object({}).catchall(z.z.array(z.z.string())).default({})), get admin() { return z.z.union([adminSchema, z.z.null()]).optional(); } }); // src/gen/schemas/UserSchema/activeNextPlanSchema.ts var activeNextPlanPathParamsSchema = z.z.object({ username: z.z.string() }); var activeNextPlan200Schema = z.z.lazy(() => userResponseSchema); var activeNextPlan401Schema = z.z.lazy(() => unauthorizedSchema); var activeNextPlan403Schema = z.z.lazy(() => forbiddenSchema); var activeNextPlan404Schema = z.z.lazy(() => notFoundSchema); var activeNextPlan422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var activeNextPlanMutationResponseSchema = z.z.lazy( () => activeNextPlan200Schema ); var HTTPExceptionSchema = z.z.object({ detail: z.z.string() }); var proxySettingsSchema = z.z.object({}); var userStatusCreateSchema = z.z.enum(["active", "on_hold"]); // src/gen/schemas/userCreateSchema.ts var userCreateSchema = z.z.object({ proxies: z.z.optional( z.z.object({}).catchall(z.z.lazy(() => proxySettingsSchema)).default({}) ), expire: z.z.union([z.z.int(), z.z.null()]).nullish(), data_limit: z.z.optional(z.z.union([z.z.int(), z.z.null()]).describe("data_limit can be 0 or greater")), get data_limit_reset_strategy() { return userDataLimitResetStrategySchema.optional(); }, inbounds: z.z.optional(z.z.object({}).catchall(z.z.array(z.z.string())).default({})), note: z.z.union([z.z.string(), z.z.null()]).nullish(), sub_updated_at: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), sub_last_user_agent: z.z.union([z.z.string(), z.z.null()]).nullish(), online_at: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), on_hold_expire_duration: z.z.union([z.z.int(), z.z.null()]).nullish(), on_hold_timeout: z.z.union([z.z.iso.datetime({ local: true }), z.z.null()]).nullish(), auto_delete_in_days: z.z.union([z.z.int(), z.z.null()]).nullish(), get next_plan() { return z.z.union([nextPlanModelSchema, z.z.null()]).nullish(); }, username: z.z.string(), get status() { return userStatusCreateSchema.optional(); } }); // src/gen/schemas/UserSchema/addUserSchema.ts var addUser200Schema = z.z.lazy(() => userResponseSchema); var addUser400Schema = z.z.lazy(() => HTTPExceptionSchema); var addUser401Schema = z.z.lazy(() => unauthorizedSchema); var addUser409Schema = z.z.lazy(() => conflictSchema); var addUser422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var addUserMutationRequestSchema = z.z.lazy( () => userCreateSchema ); var addUserMutationResponseSchema = z.z.lazy( () => addUser200Schema ); var deleteExpiredUsersQueryParamsSchema = z.z.object({ expired_after: z.z.optional(z.z.union([z.z.iso.datetime({ local: true }), z.z.null()])), expired_before: z.z.optional(z.z.union([z.z.iso.datetime({ local: true }), z.z.null()])) }).optional(); var deleteExpiredUsers200Schema = z.z.array(z.z.string()); var deleteExpiredUsers401Schema = z.z.lazy( () => unauthorizedSchema ); var deleteExpiredUsers422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var deleteExpiredUsersMutationResponseSchema = z.z.lazy( () => deleteExpiredUsers200Schema ); var getExpiredUsersQueryParamsSchema = z.z.object({ expired_after: z.z.optional(z.z.union([z.z.iso.datetime({ local: true }), z.z.null()])), expired_before: z.z.optional(z.z.union([z.z.iso.datetime({ local: true }), z.z.null()])) }).optional(); var getExpiredUsers200Schema = z.z.array(z.z.string()); var getExpiredUsers401Schema = z.z.lazy(() => unauthorizedSchema); var getExpiredUsers422Schema = z.z.lazy( () => HTTPValidationErrorSchema ); var getExpiredUsersQueryResponseSchema = z.z.lazy( () => getExpiredUsers200Schema ); var getUserPathParamsSchema = z.z.object({ username: z.z.string() }); var getUser200Schema = z.z.lazy(() => userResponseSchema); var getUser401Schema = z.z.lazy(() => unauthorizedSchema); var getUser403Schema = z.z.lazy(() => forbiddenSchema); var getUser404Schema = z.z.lazy(() => notFoundSchema); var getUser422Schema = z.z.lazy(() => HTTPValidationErrorSchema); var getUserQueryResponseSchema = z.z.lazy(() => getUser200Schema); var usersResponseSchema = z.z.object({ get users() { return z.z.array(userResponseSchema); }, total: z.z.int() }); // src/gen/schemas/UserSchema/getUsersSchema.ts var getUsersQueryParamsSchema = z.z.object({ offset: z.z.optional(z.z.coerce.number().int()), limit: z.z.optional(z.z.coerce.number().int()), username: z.z.optional(z.z.array(z.z.string())), search: z.z.optional(z.z.union([z.z