@topvisor/ui 1.4.0-TopGroupSelector.5 → 1.4.0-TopGroupSelector.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.amd.js","sources":["../../src/api/api/client/request-options.ts","../../src/api/api/utils/common.ts","../../src/api/api/client/request.ts","../../src/api/api/client/client.ts","../../src/api/api/index.ts"],"sourcesContent":["export const createRequestOptions = (requestOptions: Partial<Api.ClientRequestOptions> = {}): Api.ClientRequestOptions => {\n\trequestOptions = { ...requestOptions };\n\trequestOptions.loadingEl ??= globalThis.document?.body;\n\trequestOptions.loadingShowSpinner ??= true;\n\trequestOptions.method ??= 'POST';\n\trequestOptions.accept ??= 'application/json';\n\n\treturn requestOptions as Api.ClientRequestOptions;\n};\n","/**\n * Сгенерировать объект ответа в формате расширения OpenAPI\n *\n * @see Api.Ext\n */\nexport const genExtRes = (\n\tresult: any,\n\terrors?: Api.Ext.Schemas['ResponseError']['errors'],\n\tresponse?: Response,\n): Api.Response<any> => {\n\treturn {\n\t\tresult,\n\t\terrors,\n\t\tresponse,\n\t};\n};\n\n/**\n * Это публичное API, к которому открыт доступ по прямой ссылке через GET\n *\n * Используется для кеширования и генерации файлов через API\n */\nexport const isPublicAPI = (path: Api.PathAbstract) => {\n\treturn path.startsWith('/system_2/common/');\n};\n\n/**\n * Сгенерировать baseUrl на основе текущего домена\n */\nexport const getBaseDomainUrl = (useMainDomain = false, input: string = window.location.href, subdomain?: string) => {\n\tconst { protocol, hostname, port } = new URL(input);\n\n\t/**\n\t * localhost / IP-адреса / одноуровневые домены оставляем как есть\n\t */\n\tconst parts = hostname.split('.');\n\tconst baseHostname = !useMainDomain || parts.length <= 2 || /^[\\d.]+$/.test(hostname) || hostname === 'localhost'\n\t\t? hostname\n\t\t: parts.slice(-2).join('.');\n\n\treturn `${protocol}//${baseHostname}${port ? `:${port}` : ''}`;\n};\n","import type { Client } from './client';\nimport { createRequestOptions } from './request-options';\nimport { genExtRes } from '../utils/common';\n\n/**\n * Проверить передаются ли файлы\n */\nconst checkHasFiles = (data: Record<string, any>): boolean => {\n\treturn Object.values(data).some(value =>\n\t\tvalue instanceof FileList ||\n\t\tvalue instanceof File ||\n\t\tvalue instanceof Blob ||\n\t\tArray.isArray(value) && value.some(item => item instanceof File || item instanceof Blob),\n\t);\n};\n\nexport const createRequest = <\n\tRequestContext extends Api.ClientRequestContext<any, any, any>,\n\tFieldsNarrow extends Api.ParamsFields<RequestContext>,\n>(\n\tclient: Client<RequestContext['Paths'], RequestContext['UseExt']>,\n\tpath: RequestContext['Path'],\n\tfieldsNarrow?: FieldsNarrow,\n): Api.ClientRequest<RequestContext, FieldsNarrow> => {\n\tconst clientRequest: Api.ClientRequest<RequestContext, FieldsNarrow> = {\n\t\tinLoading: false,\n\t\tpath: path as Api.PathAbstract,\n\t\turl: client.options.baseUrl + path,\n\t\toptions: createRequestOptions(client.options.requestOptions),\n\t\tmockerOptions: undefined as Api.Mocker.Options<any, any> | undefined,\n\t\tparams: {} as any, // незаполненное свойство\n\t\tgetInLoading: () => clientRequest.inLoading,\n\n\t\tsetParams: (params) => {\n\t\t\tclientRequest.params = { ...params } as any;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tchangeParams: (params) => {\n\t\t\tObject.assign(clientRequest.params, params);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetOptions: (options) => {\n\t\t\tObject.assign(clientRequest.options, options);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetMocker: (options) => {\n\t\t\tclientRequest.mockerOptions = options;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tcall: async (fields?) => {\n\t\t\treturn clientRequest.exec(fields);\n\t\t},\n\n\t\tcallFetch: async (fetchStyle, fields?) => {\n\t\t\treturn clientRequest.exec(fields, fetchStyle);\n\t\t},\n\n\t\tcallInNewWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_blank');\n\t\t},\n\n\t\tcallInSelfWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_self');\n\t\t},\n\n\t\tgenData: (fields?, fetchStyle?) => {\n\t\t\tconst post: any = { ...clientRequest.params };\n\n\t\t\t// в старом коде fields вставлялись в params, оставлено для совместимости\n\t\t\t// delete post.fields;\n\t\t\tdelete post.fetch_style;\n\n\t\t\t// поля, указанные при запуске запроса\n\t\t\tif (fields) {\n\t\t\t\tlet fieldsPrepared = [...fields as any[]];\n\n\t\t\t\t// поля, указанные при создании запроса\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tfieldsPrepared = fieldsPrepared.filter(field => fieldsNarrow.includes(field));\n\t\t\t\t}\n\n\t\t\t\tpost.fields = fieldsPrepared;\n\t\t\t} else {\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tpost.fields = fieldsNarrow;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (fetchStyle) {\n\t\t\t\tpost.fetch_style = fetchStyle;\n\t\t\t}\n\n\t\t\treturn post;\n\t\t},\n\n\t\tabortByFingerprint: () => {\n\t\t\tif (!clientRequest.options.checkFingerprint) return;\n\n\t\t\tconst fingerprint = clientRequest.path + clientRequest.options.checkFingerprint;\n\n\t\t\tclient.abortControllers[fingerprint]?.abort(`Stopped previous request by same fingerprint: ${clientRequest.options.checkFingerprint}`);\n\n\t\t\tconst controller = new AbortController();\n\n\t\t\tclient.abortControllers[fingerprint] = controller;\n\n\t\t\treturn controller.signal;\n\t\t},\n\n\t\t/**\n\t\t * Общая функция выполнения запросов\n\t\t */\n\t\tasync exec(fields?, fetchStyle?) {\n\t\t\tconst Request = client.options.Request;\n\t\t\tconst fetch = client.options.fetch;\n\n\t\t\tconst data = clientRequest.genData(fields, fetchStyle);\n\n\t\t\tconst middlewareCtxWithoutRequest = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtxWithoutRequest);\n\n\t\t\tconst hasFiles = checkHasFiles(data);\n\t\t\tif (hasFiles && clientRequest.options.method !== 'POST') {\n\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t}\n\n\t\t\tlet url = clientRequest.url;\n\n\t\t\tlet requestInitBody: string | FormData | undefined = undefined;\n\n\t\t\tif (hasFiles) {\n\t\t\t\tif (clientRequest.options.method !== 'POST') {\n\t\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t\t}\n\n\t\t\t\tconst { formDataSerializer } = await import('../utils/lazy');\n\t\t\t\trequestInitBody = formDataSerializer(data);\n\t\t\t} else if (clientRequest.options.method !== 'POST') {\n\t\t\t\turl += '?' + await client.options.querySerializer(data);\n\t\t\t} else {\n\t\t\t\trequestInitBody = client.options.bodySerializer(data);\n\t\t\t}\n\n\t\t\t// checkFingerprint\n\t\t\tlet requestInitSignal = clientRequest.abortByFingerprint();\n\n\t\t\tif (clientRequest.mockerOptions) {\n\t\t\t\tconst { genMockResponse } = await import('../mocker/');\n\n\t\t\t\treturn await genMockResponse(clientRequest.mockerOptions, fields, data, requestInitSignal);\n\t\t\t}\n\n\t\t\tconst requestInit: RequestInit = {\n\t\t\t\t...client.options,\n\t\t\t\tmethod: clientRequest.options.method,\n\t\t\t\tbody: requestInitBody,\n\t\t\t\tsignal: requestInitSignal,\n\t\t\t};\n\n\t\t\tlet request = new Request(url, requestInit);\n\n\t\t\trequest.headers.set('x-request-id', middlewareCtxWithoutRequest.id);\n\t\t\trequest.headers.set('accept', clientRequest.options.accept);\n\n\t\t\t// при отправке данных в `FormData` `fetch()` сам укажет правильный заголовок `multipart/form-data`\n\t\t\tif (!hasFiles) {\n\t\t\t\trequest.headers.set('content-type', 'application/json');\n\t\t\t}\n\n\t\t\tconst middlewareCtx: Api.MiddlewareCallbackParams = {\n\t\t\t\t...middlewareCtxWithoutRequest,\n\t\t\t\trequest,\n\t\t\t};\n\n\t\t\tclientRequest.inLoading = true;\n\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\n\t\t\tlet response: Response | undefined = undefined;\n\n\t\t\tconst requestOrResponse = await client.middlewareOnRequest(request, middlewareCtx);\n\n\t\t\tif (requestOrResponse instanceof Response) {\n\t\t\t\tresponse = requestOrResponse;\n\t\t\t} else if (requestOrResponse instanceof Request) {\n\t\t\t\trequest = requestOrResponse;\n\t\t\t}\n\n\t\t\tif (!response) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = await fetch(request);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tresponse = await client.middlewareOnError(e, middlewareCtx);\n\t\t\t\t} finally {\n\t\t\t\t\tclientRequest.inLoading = false;\n\t\t\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresponse = await client.middlewareOnResponse(response, middlewareCtx);\n\n\t\t\tlet res: any;\n\t\t\tlet responseText: string | undefined;\n\t\t\tlet formatError: undefined | Api.FormatError = undefined;\n\n\t\t\ttry {\n\t\t\t\t// json - стандартные формат, он может быть возвращен в запросах с другим responseType, если в них произошла ошибка\n\t\t\t\tconst isJSON = response.headers.get('content-type')?.includes('application/json');\n\n\t\t\t\tresponseText = await response.text();\n\n\t\t\t\tif (this.options.accept === 'application/json' || isJSON) {\n\t\t\t\t\tres = JSON.parse(responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (client.useExt) {\n\t\t\t\t\t\tres = genExtRes(responseText, undefined, response);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tres = responseText;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError || e instanceof TypeError) {\n\t\t\t\t\tformatError = e;\n\t\t\t\t\tformatError.responseText = responseText;\n\t\t\t\t}\n\n\t\t\t\t// если в результате не пришел json, сгенерировать объект результата и добавить информацию об ответе API\n\t\t\t\tif (client.useExt && formatError) {\n\t\t\t\t\tlet errorCode = response.status;\n\t\t\t\t\tlet errorMessage = response.statusText;\n\n\t\t\t\t\tif (errorCode === 200) {\n\t\t\t\t\t\terrorCode = 10000;\n\t\t\t\t\t\terrorMessage = 'Error API response';\n\t\t\t\t\t}\n\n\t\t\t\t\tres = genExtRes(null, [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: errorCode,\n\t\t\t\t\t\t\tstring: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t], response);\n\n\t\t\t\t\tif (client.options.useApiConsole) console.error(e);\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (client.useExt) {\n\t\t\t\tres.response = response;\n\n\t\t\t\tif (res) {\n\t\t\t\t\tclientRequest.options.onApiLoaded?.(res, middlewareCtx);\n\t\t\t\t}\n\n\t\t\t\tif (res?.errors) {\n\t\t\t\t\tif (client.options.useApiConsole) console.warn(new Error('API error'), { res });\n\n\t\t\t\t\tclientRequest.options.onApiError?.(res, { ...middlewareCtx, formatError }, client.options.requestOptions?.onApiError);\n\t\t\t\t}\n\n\t\t\t\tif (res?.messages) {\n\t\t\t\t\tclientRequest.options.onApiMessage?.(res, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn res;\n\t\t},\n\t};\n\n\treturn clientRequest;\n};\n","import { createRequestOptions } from './request-options';\nimport { createRequest } from './request';\n\nexport class Client<paths extends Api.PathsAbstract, UseExt extends Api.Ext.UseExt> {\n\n\treadonly options: Readonly<Api.ClientOptions>;\n\treadonly useExt: UseExt;\n\treadonly middlewares: Api.Middleware[] = [];\n\tprivate mokerByPath = new Map<Api.Path<paths>, Api.Mocker.Options<any, any>>();\n\tabortControllers: Record<string, AbortController> = {};\n\n\tconstructor(clientOptions: Partial<Api.ClientOptions> = {}, useExt: UseExt) {\n\t\tclientOptions.requestOptions = createRequestOptions(clientOptions.requestOptions);\n\t\tclientOptions.useApiConsole ??= true;\n\n\t\tclientOptions.fetch ??= globalThis.fetch;\n\t\tclientOptions.Request ??= globalThis.Request;\n\t\tclientOptions.querySerializer ??= async (params) => {\n\t\t\tconst { querySerializer } = await import('../utils/lazy');\n\n\t\t\treturn querySerializer(params);\n\t\t};\n\t\tclientOptions.bodySerializer ??= (body) => typeof body === 'string' ? body : JSON.stringify(body);\n\n\t\tthis.options = clientOptions as Api.ClientOptions;\n\n\t\tthis.useExt = useExt;\n\t}\n\n\tgenerateUUID() {\n\t\tif (crypto?.randomUUID) {\n\t\t\treturn crypto.randomUUID();\n\t\t}\n\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n\t\t\tconst r = Math.random() * 16 | 0;\n\t\t\tconst v = c === 'x' ? r : (r & 0x3 | 0x8);\n\t\t\treturn v.toString(16);\n\t\t});\n\t}\n\n\t/**\n\t * Зарегистрировать middleware\n\t */\n\tuse(middleware: Api.Middleware) {\n\t\tthis.middlewares.push(middleware);\n\t}\n\n\t/**\n\t * Создать объект запроса\n\t *\n\t * После создания объекта он заполняется необходимыми данными и выполняет запросы к API с помощью APIRequest2.call();\n\t *\n\t * Опционально generic указывать нельзя, поэтому необходимо дублировать определение fetchStyle, [см.](https://github.com/Microsoft/TypeScript/issues/26242)\n\t *\n\t * @param path Путь метода API\n\t * @param fieldsNarrow Список получаемых полей, для методов API с моделью. Если объект запроса переиспользуется, и список полей меняется, указывайте его непосредственно при вызове `api.call()`\n\t */\n\tgen<\n\t\tPath extends Api.Path<paths>,\n\t\tFieldsNarrow extends Api.ParamsFields<Api.ClientRequestContext<paths, Path, UseExt>>\n\t>(\n\t\tpath: Path,\n\t\tfieldsNarrow?: FieldsNarrow,\n\t): Api.ClientRequest<Api.ClientRequestContext<paths, Path, UseExt>, FieldsNarrow> {\n\t\ttype RequestContext = Api.ClientRequestContext<paths, Path, UseExt>;\n\n\t\treturn createRequest<RequestContext, FieldsNarrow>(this, path, fieldsNarrow);\n\t}\n\n\t/**\n\t * Создать объект запроса, не описанного в OpenAPI\n\t */\n\tgenAny<\n\t\tParams extends Record<string, any>,\n\t\tResult = any,\n\t\tFieldsNarrow extends Api.Ext.Schemas['Fields'] | undefined = undefined\n\t>(path: Api.PathAbstract, fieldsNarrow?: FieldsNarrow): Api.ClientRequestCustom<UseExt, Params, Result> {\n\t\treturn this.gen(path as any, fieldsNarrow as any) as unknown as Api.ClientRequestCustom<UseExt, Params, Result>;\n\t}\n\n\t/**\n\t * Создать контекст выполнения запроса\n\t */\n\tgenMiddlewareCtx(\n\t\tclientRequest: Api.ClientRequest<any, any, any>,\n\t\tdata: Record<string, any>,\n\t): Omit<Api.MiddlewareCallbackParams, 'request'> {\n\t\tconst id = this.generateUUID();\n\n\t\tconst options: Api.BaseOptions = Object.freeze({\n\t\t\tbaseUrl: this.options.baseUrl,\n\t\t\tquerySerializer: this.options.querySerializer,\n\t\t\tbodySerializer: this.options.bodySerializer,\n\t\t\tRequest: this.options.Request,\n\t\t\tfetch: this.options.fetch,\n\t\t});\n\n\t\treturn {\n\t\t\tuseExt: this.useExt,\n\t\t\trequestOptions: clientRequest.options,\n\t\t\tdata,\n\t\t\tmiddlewareData: {},\n\t\t\toptions,\n\t\t\tschemaPath: clientRequest.path,\n\t\t\tid,\n\t\t};\n\t};\n\n\t/**\n\t * Обработчик middleware.onRequest\n\t *\n\t * @param request Запрос для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Request` или `Response` при модификации запроса, или undefined\n\t */\n\tasync middlewareOnRequest(\n\t\trequest: Request,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Request | Response | undefined> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onRequest?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Request) {\n\t\t\t\t\trequest = result;\n\t\t\t\t} else if (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('onRequest: must return new Request() or Response() when modifying the request');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn request;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param `error` Ошибка, переданная для обработки\n\t * @param middlewareCtx\n\t * @return Новый экземпляр `Response` при успешной обработке или выбрасывает ошибку\n\t */\n\tasync middlewareOnError(\n\t\terror: Error | unknown,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response | never> {\n\t\tlet errorAfterMiddleware = error;\n\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onError?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\terror: errorAfterMiddleware,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result instanceof Error) {\n\t\t\t\t\terrorAfterMiddleware = result;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthrow new Error('onError: must return new Response() or instance of Error');\n\t\t\t}\n\t\t}\n\n\t\tthrow errorAfterMiddleware;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param response Ответ для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Response` при модификации ответа, или undefined\n\t */\n\tasync middlewareOnResponse(\n\t\tresponse: Response,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onResponse?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\tresponse,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (!(result instanceof Response)) {\n\t\t\t\t\tthrow new Error('onResponse: must return new Response() when modifying the response');\n\t\t\t\t}\n\n\t\t\t\tresponse = result;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Установить генератор данных вместо реальных запросов к серверу для конкретного метода API\n\t */\n\tsetMocker<\n\t\tResult extends Api.Mocker.Result = Api.Mocker.Result,\n\t\tParams extends Api.Mocker.Params = Api.Mocker.Params\n\t>(\n\t\tpath: Api.Path<paths>,\n\t\tmocker: Api.Mocker.Options<Result, Params>,\n\t) {\n\t\tthis.mokerByPath.set(path, mocker);\n\n\t\t// @ts-ignore\n\t\tif (!this.genOriginal) {\n\t\t\t// @ts-ignore\n\t\t\tthis.genOriginal = this.gen.bind(this);\n\n\t\t\tthis.gen = (_path, fieldsNarrow) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst api = this.genOriginal(_path, fieldsNarrow);\n\n\t\t\t\tconst mocker = this.mokerByPath.get(_path);\n\t\t\t\tif (mocker) {\n\t\t\t\t\tapi.setMocker(mocker);\n\t\t\t\t}\n\n\t\t\t\treturn api;\n\t\t\t};\n\t\t}\n\t}\n\n}\n","import { Client } from './client/client';\n\nexport * from './utils/field';\nexport * from './utils/common';\n\nexport const postInWindow: typeof import('./utils/lazy').postInWindow = async (...args) => {\n\tconst { postInWindow } = await import('./utils/lazy');\n\n\treturn postInWindow(...args);\n};\n\nexport const dataToForm: typeof import('./utils/lazy').dataToForm = async (...args) => {\n\tconst { dataToForm } = await import('./utils/lazy');\n\n\treturn dataToForm(...args);\n};\n\n/**\n * Создать API клиент\n *\n * @see Api.Ext.UseExt\n */\nexport const createClient = <\n\tpaths extends Api.PathsAbstract,\n\tUseExt extends Api.Ext.UseExt\n>(\n\tclientOptions: Partial<Api.ClientOptions> = {},\n\tuseExt: UseExt,\n) => {\n\treturn new Client<paths, UseExt>(clientOptions, useExt);\n};\n"],"names":["createRequestOptions","requestOptions","genExtRes","result","errors","response","isPublicAPI","path","getBaseDomainUrl","useMainDomain","input","subdomain","protocol","hostname","port","baseHostname","parts","checkHasFiles","data","value","item","clientRequest","params","options","fields","fetchStyle","fieldsPrepared","field","fieldsNarrow","post","client","fingerprint","controller","Request","fetch","hasFiles","url","requestInitBody","formDataSerializer","requestInitSignal","genMockResponse","request","middlewareCtxWithoutRequest","requestOrResponse","e","res","responseText","isJSON","formatError","errorCode","errorMessage","Client","clientOptions","useExt","querySerializer","body","c","r","middleware","id","middlewareCtx","error","errorAfterMiddleware","mocker","api","mocker2","postInWindow","args","postInWindow2","dataToForm","dataToForm2","createClient"],"mappings":"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"}
1
+ {"version":3,"file":"index.amd.js","sources":["../../src/api/api/client/request-options.ts","../../src/api/api/utils/common.ts","../../src/api/api/client/request.ts","../../src/api/api/client/client.ts","../../src/api/api/index.ts"],"sourcesContent":["export const createRequestOptions = (requestOptions: Partial<Api.ClientRequestOptions> = {}): Api.ClientRequestOptions => {\n\trequestOptions = { ...requestOptions };\n\trequestOptions.loadingEl ??= globalThis.document?.body;\n\trequestOptions.loadingShowSpinner ??= true;\n\trequestOptions.method ??= 'POST';\n\trequestOptions.accept ??= 'application/json';\n\n\treturn requestOptions as Api.ClientRequestOptions;\n};\n","/**\n * Сгенерировать объект ответа в формате расширения OpenAPI\n *\n * @see Api.Ext\n */\nexport const genExtRes = (\n\tresult: any,\n\terrors?: Api.Ext.Schemas['ResponseError']['errors'],\n\tresponse?: Response,\n): Api.Response<any> => {\n\treturn {\n\t\tresult,\n\t\terrors,\n\t\tresponse,\n\t};\n};\n\n/**\n * Это публичное API, к которому открыт доступ по прямой ссылке через GET\n *\n * Используется для кеширования и генерации файлов через API\n */\nexport const isPublicAPI = (path: Api.PathAbstract) => {\n\treturn path.startsWith('/system_2/common/');\n};\n\n/**\n * Сгенерировать baseUrl на основе текущего домена\n */\nexport const getBaseDomainUrl = (useMainDomain = false, input: string = window.location.href, subdomain?: string) => {\n\tconst { protocol, hostname, port } = new URL(input);\n\n\t/**\n\t * localhost / IP-адреса / одноуровневые домены оставляем как есть\n\t */\n\tconst parts = hostname.split('.');\n\tconst baseHostname = !useMainDomain || parts.length <= 2 || /^[\\d.]+$/.test(hostname) || hostname === 'localhost'\n\t\t? hostname\n\t\t: parts.slice(-2).join('.');\n\n\treturn `${protocol}//${baseHostname}${port ? `:${port}` : ''}`;\n};\n","import type { Client } from './client';\nimport { createRequestOptions } from './request-options';\nimport { genExtRes } from '../utils/common';\n\n/**\n * Проверить передаются ли файлы\n */\nconst checkHasFiles = (data: Record<string, any>): boolean => {\n\treturn Object.values(data).some(value =>\n\t\tvalue instanceof FileList ||\n\t\tvalue instanceof File ||\n\t\tvalue instanceof Blob ||\n\t\tArray.isArray(value) && value.some(item => item instanceof File || item instanceof Blob),\n\t);\n};\n\nexport const createRequest = <\n\tRequestContext extends Api.ClientRequestContext<any, any, any>,\n\tFieldsNarrow extends Api.ParamsFields<RequestContext>,\n>(\n\tclient: Client<RequestContext['Paths'], RequestContext['UseExt']>,\n\tpath: RequestContext['Path'],\n\tfieldsNarrow?: FieldsNarrow,\n): Api.ClientRequest<RequestContext, FieldsNarrow> => {\n\tconst clientRequest: Api.ClientRequest<RequestContext, FieldsNarrow> = {\n\t\tinLoading: false,\n\t\tpath: path as Api.PathAbstract,\n\t\turl: client.options.baseUrl + path,\n\t\toptions: createRequestOptions(client.options.requestOptions),\n\t\tmockerOptions: undefined as Api.Mocker.Options<any, any> | undefined,\n\t\tparams: {} as any, // незаполненное свойство\n\t\tgetInLoading: () => clientRequest.inLoading,\n\n\t\tsetParams: (params) => {\n\t\t\tclientRequest.params = { ...params } as any;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tchangeParams: (params) => {\n\t\t\tObject.assign(clientRequest.params, params);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetOptions: (options) => {\n\t\t\tObject.assign(clientRequest.options, options);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetMocker: (options) => {\n\t\t\tclientRequest.mockerOptions = options;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tcall: async (fields?) => {\n\t\t\treturn clientRequest.exec(fields);\n\t\t},\n\n\t\tcallFetch: async (fetchStyle, fields?) => {\n\t\t\treturn clientRequest.exec(fields, fetchStyle);\n\t\t},\n\n\t\tcallInNewWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_blank');\n\t\t},\n\n\t\tcallInSelfWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_self');\n\t\t},\n\n\t\tgenData: (fields?, fetchStyle?) => {\n\t\t\tconst post: any = { ...clientRequest.params };\n\n\t\t\t// в старом коде fields вставлялись в params, оставлено для совместимости\n\t\t\t// delete post.fields;\n\t\t\tdelete post.fetch_style;\n\n\t\t\t// поля, указанные при запуске запроса\n\t\t\tif (fields) {\n\t\t\t\tlet fieldsPrepared = [...fields as any[]];\n\n\t\t\t\t// поля, указанные при создании запроса\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tfieldsPrepared = fieldsPrepared.filter(field => fieldsNarrow.includes(field));\n\t\t\t\t}\n\n\t\t\t\tpost.fields = fieldsPrepared;\n\t\t\t} else {\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tpost.fields = fieldsNarrow;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (fetchStyle) {\n\t\t\t\tpost.fetch_style = fetchStyle;\n\t\t\t}\n\n\t\t\treturn post;\n\t\t},\n\n\t\tabortByFingerprint: () => {\n\t\t\tif (!clientRequest.options.checkFingerprint) return;\n\n\t\t\tconst fingerprint = clientRequest.path + clientRequest.options.checkFingerprint;\n\n\t\t\tclient.abortControllers[fingerprint]?.abort(\n\t\t\t\tnew DOMException(`Stopped previous request by fingerprint: ${clientRequest.options.checkFingerprint}`, 'AbortError'),\n\t\t\t);\n\n\t\t\tconst controller = new AbortController();\n\n\t\t\tclient.abortControllers[fingerprint] = controller;\n\n\t\t\treturn controller.signal;\n\t\t},\n\n\t\t/**\n\t\t * Общая функция выполнения запросов\n\t\t */\n\t\tasync exec(fields?, fetchStyle?) {\n\t\t\tconst Request = client.options.Request;\n\t\t\tconst fetch = client.options.fetch;\n\n\t\t\tconst data = clientRequest.genData(fields, fetchStyle);\n\n\t\t\tconst middlewareCtxWithoutRequest = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtxWithoutRequest);\n\n\t\t\tconst hasFiles = checkHasFiles(data);\n\t\t\tif (hasFiles && clientRequest.options.method !== 'POST') {\n\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t}\n\n\t\t\tlet url = clientRequest.url;\n\n\t\t\tlet requestInitBody: string | FormData | undefined = undefined;\n\n\t\t\tif (hasFiles) {\n\t\t\t\tif (clientRequest.options.method !== 'POST') {\n\t\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t\t}\n\n\t\t\t\tconst { formDataSerializer } = await import('../utils/lazy');\n\t\t\t\trequestInitBody = formDataSerializer(data);\n\t\t\t} else if (clientRequest.options.method !== 'POST') {\n\t\t\t\turl += '?' + await client.options.querySerializer(data);\n\t\t\t} else {\n\t\t\t\trequestInitBody = client.options.bodySerializer(data);\n\t\t\t}\n\n\t\t\t// checkFingerprint\n\t\t\tlet requestInitSignal = clientRequest.abortByFingerprint();\n\n\t\t\tif (clientRequest.mockerOptions) {\n\t\t\t\tconst { genMockResponse } = await import('../mocker/');\n\n\t\t\t\treturn await genMockResponse(clientRequest.mockerOptions, fields, data, requestInitSignal);\n\t\t\t}\n\n\t\t\tconst requestInit: RequestInit = {\n\t\t\t\t...client.options,\n\t\t\t\tmethod: clientRequest.options.method,\n\t\t\t\tbody: requestInitBody,\n\t\t\t\tsignal: requestInitSignal,\n\t\t\t};\n\n\t\t\tlet request = new Request(url, requestInit);\n\n\t\t\trequest.headers.set('x-request-id', middlewareCtxWithoutRequest.id);\n\t\t\trequest.headers.set('accept', clientRequest.options.accept);\n\n\t\t\t// при отправке данных в `FormData` `fetch()` сам укажет правильный заголовок `multipart/form-data`\n\t\t\tif (!hasFiles) {\n\t\t\t\trequest.headers.set('content-type', 'application/json');\n\t\t\t}\n\n\t\t\tconst middlewareCtx: Api.MiddlewareCallbackParams = {\n\t\t\t\t...middlewareCtxWithoutRequest,\n\t\t\t\trequest,\n\t\t\t};\n\n\t\t\tclientRequest.inLoading = true;\n\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\n\t\t\tlet response: Response | undefined = undefined;\n\n\t\t\tconst requestOrResponse = await client.middlewareOnRequest(request, middlewareCtx);\n\n\t\t\tif (requestOrResponse instanceof Response) {\n\t\t\t\tresponse = requestOrResponse;\n\t\t\t} else if (requestOrResponse instanceof Request) {\n\t\t\t\trequest = requestOrResponse;\n\t\t\t}\n\n\t\t\tif (!response) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = await fetch(request);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tresponse = await client.middlewareOnError(e, middlewareCtx);\n\t\t\t\t} finally {\n\t\t\t\t\tclientRequest.inLoading = false;\n\t\t\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresponse = await client.middlewareOnResponse(response, middlewareCtx);\n\n\t\t\tlet res: any;\n\t\t\tlet responseText: string | undefined;\n\t\t\tlet formatError: undefined | Api.FormatError = undefined;\n\n\t\t\ttry {\n\t\t\t\t// json - стандартные формат, он может быть возвращен в запросах с другим responseType, если в них произошла ошибка\n\t\t\t\tconst isJSON = response.headers.get('content-type')?.includes('application/json');\n\n\t\t\t\tresponseText = await response.text();\n\n\t\t\t\tif (this.options.accept === 'application/json' || isJSON) {\n\t\t\t\t\tres = JSON.parse(responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (client.useExt) {\n\t\t\t\t\t\tres = genExtRes(responseText, undefined, response);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tres = responseText;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError || e instanceof TypeError) {\n\t\t\t\t\tformatError = e;\n\t\t\t\t\tformatError.responseText = responseText;\n\t\t\t\t}\n\n\t\t\t\t// если в результате не пришел json, сгенерировать объект результата и добавить информацию об ответе API\n\t\t\t\tif (client.useExt && formatError) {\n\t\t\t\t\tlet errorCode = response.status;\n\t\t\t\t\tlet errorMessage = response.statusText;\n\n\t\t\t\t\tif (errorCode === 200) {\n\t\t\t\t\t\terrorCode = 10000;\n\t\t\t\t\t\terrorMessage = 'Error API response';\n\t\t\t\t\t}\n\n\t\t\t\t\tres = genExtRes(null, [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: errorCode,\n\t\t\t\t\t\t\tstring: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t], response);\n\n\t\t\t\t\tif (client.options.useApiConsole) console.error(e);\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (client.useExt) {\n\t\t\t\tres.response = response;\n\n\t\t\t\tif (res) {\n\t\t\t\t\tclientRequest.options.onApiLoaded?.(res, middlewareCtx);\n\t\t\t\t}\n\n\t\t\t\tif (res?.errors) {\n\t\t\t\t\tif (client.options.useApiConsole) console.warn(new Error('API error'), { res });\n\n\t\t\t\t\tclientRequest.options.onApiError?.(res, { ...middlewareCtx, formatError }, client.options.requestOptions?.onApiError);\n\t\t\t\t}\n\n\t\t\t\tif (res?.messages) {\n\t\t\t\t\tclientRequest.options.onApiMessage?.(res, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn res;\n\t\t},\n\t};\n\n\treturn clientRequest;\n};\n","import { createRequestOptions } from './request-options';\nimport { createRequest } from './request';\n\nexport class Client<paths extends Api.PathsAbstract, UseExt extends Api.Ext.UseExt> {\n\n\treadonly options: Readonly<Api.ClientOptions>;\n\treadonly useExt: UseExt;\n\treadonly middlewares: Api.Middleware[] = [];\n\tprivate mokerByPath = new Map<Api.Path<paths>, Api.Mocker.Options<any, any>>();\n\tabortControllers: Record<string, AbortController> = {};\n\n\tconstructor(clientOptions: Partial<Api.ClientOptions> = {}, useExt: UseExt) {\n\t\tclientOptions.requestOptions = createRequestOptions(clientOptions.requestOptions);\n\t\tclientOptions.useApiConsole ??= true;\n\n\t\tclientOptions.fetch ??= globalThis.fetch;\n\t\tclientOptions.Request ??= globalThis.Request;\n\t\tclientOptions.querySerializer ??= async (params) => {\n\t\t\tconst { querySerializer } = await import('../utils/lazy');\n\n\t\t\treturn querySerializer(params);\n\t\t};\n\t\tclientOptions.bodySerializer ??= (body) => typeof body === 'string' ? body : JSON.stringify(body);\n\n\t\tthis.options = clientOptions as Api.ClientOptions;\n\n\t\tthis.useExt = useExt;\n\t}\n\n\tgenerateUUID() {\n\t\tif (crypto?.randomUUID) {\n\t\t\treturn crypto.randomUUID();\n\t\t}\n\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n\t\t\tconst r = Math.random() * 16 | 0;\n\t\t\tconst v = c === 'x' ? r : (r & 0x3 | 0x8);\n\t\t\treturn v.toString(16);\n\t\t});\n\t}\n\n\t/**\n\t * Зарегистрировать middleware\n\t */\n\tuse(middleware: Api.Middleware) {\n\t\tthis.middlewares.push(middleware);\n\t}\n\n\t/**\n\t * Создать объект запроса\n\t *\n\t * После создания объекта он заполняется необходимыми данными и выполняет запросы к API с помощью APIRequest2.call();\n\t *\n\t * Опционально generic указывать нельзя, поэтому необходимо дублировать определение fetchStyle, [см.](https://github.com/Microsoft/TypeScript/issues/26242)\n\t *\n\t * @param path Путь метода API\n\t * @param fieldsNarrow Список получаемых полей, для методов API с моделью. Если объект запроса переиспользуется, и список полей меняется, указывайте его непосредственно при вызове `api.call()`\n\t */\n\tgen<\n\t\tPath extends Api.Path<paths>,\n\t\tFieldsNarrow extends Api.ParamsFields<Api.ClientRequestContext<paths, Path, UseExt>>\n\t>(\n\t\tpath: Path,\n\t\tfieldsNarrow?: FieldsNarrow,\n\t): Api.ClientRequest<Api.ClientRequestContext<paths, Path, UseExt>, FieldsNarrow> {\n\t\ttype RequestContext = Api.ClientRequestContext<paths, Path, UseExt>;\n\n\t\treturn createRequest<RequestContext, FieldsNarrow>(this, path, fieldsNarrow);\n\t}\n\n\t/**\n\t * Создать объект запроса, не описанного в OpenAPI\n\t */\n\tgenAny<\n\t\tParams extends Record<string, any>,\n\t\tResult = any,\n\t\tFieldsNarrow extends Api.Ext.Schemas['Fields'] | undefined = undefined\n\t>(path: Api.PathAbstract, fieldsNarrow?: FieldsNarrow): Api.ClientRequestCustom<UseExt, Params, Result> {\n\t\treturn this.gen(path as any, fieldsNarrow as any) as unknown as Api.ClientRequestCustom<UseExt, Params, Result>;\n\t}\n\n\t/**\n\t * Создать контекст выполнения запроса\n\t */\n\tgenMiddlewareCtx(\n\t\tclientRequest: Api.ClientRequest<any, any, any>,\n\t\tdata: Record<string, any>,\n\t): Omit<Api.MiddlewareCallbackParams, 'request'> {\n\t\tconst id = this.generateUUID();\n\n\t\tconst options: Api.BaseOptions = Object.freeze({\n\t\t\tbaseUrl: this.options.baseUrl,\n\t\t\tquerySerializer: this.options.querySerializer,\n\t\t\tbodySerializer: this.options.bodySerializer,\n\t\t\tRequest: this.options.Request,\n\t\t\tfetch: this.options.fetch,\n\t\t});\n\n\t\treturn {\n\t\t\tuseExt: this.useExt,\n\t\t\trequestOptions: clientRequest.options,\n\t\t\tdata,\n\t\t\tmiddlewareData: {},\n\t\t\toptions,\n\t\t\tschemaPath: clientRequest.path,\n\t\t\tid,\n\t\t};\n\t};\n\n\t/**\n\t * Обработчик middleware.onRequest\n\t *\n\t * @param request Запрос для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Request` или `Response` при модификации запроса, или undefined\n\t */\n\tasync middlewareOnRequest(\n\t\trequest: Request,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Request | Response | undefined> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onRequest?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Request) {\n\t\t\t\t\trequest = result;\n\t\t\t\t} else if (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('onRequest: must return new Request() or Response() when modifying the request');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn request;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param `error` Ошибка, переданная для обработки\n\t * @param middlewareCtx\n\t * @return Новый экземпляр `Response` при успешной обработке или выбрасывает ошибку\n\t */\n\tasync middlewareOnError(\n\t\terror: Error | unknown,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response | never> {\n\t\tlet errorAfterMiddleware = error;\n\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onError?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\terror: errorAfterMiddleware,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result instanceof Error) {\n\t\t\t\t\terrorAfterMiddleware = result;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthrow new Error('onError: must return new Response() or instance of Error');\n\t\t\t}\n\t\t}\n\n\t\tthrow errorAfterMiddleware;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param response Ответ для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Response` при модификации ответа, или undefined\n\t */\n\tasync middlewareOnResponse(\n\t\tresponse: Response,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onResponse?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\tresponse,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (!(result instanceof Response)) {\n\t\t\t\t\tthrow new Error('onResponse: must return new Response() when modifying the response');\n\t\t\t\t}\n\n\t\t\t\tresponse = result;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Установить генератор данных вместо реальных запросов к серверу для конкретного метода API\n\t */\n\tsetMocker<\n\t\tResult extends Api.Mocker.Result = Api.Mocker.Result,\n\t\tParams extends Api.Mocker.Params = Api.Mocker.Params\n\t>(\n\t\tpath: Api.Path<paths>,\n\t\tmocker: Api.Mocker.Options<Result, Params>,\n\t) {\n\t\tthis.mokerByPath.set(path, mocker);\n\n\t\t// @ts-ignore\n\t\tif (!this.genOriginal) {\n\t\t\t// @ts-ignore\n\t\t\tthis.genOriginal = this.gen.bind(this);\n\n\t\t\tthis.gen = (_path, fieldsNarrow) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst api = this.genOriginal(_path, fieldsNarrow);\n\n\t\t\t\tconst mocker = this.mokerByPath.get(_path);\n\t\t\t\tif (mocker) {\n\t\t\t\t\tapi.setMocker(mocker);\n\t\t\t\t}\n\n\t\t\t\treturn api;\n\t\t\t};\n\t\t}\n\t}\n\n}\n","import { Client } from './client/client';\n\nexport * from './utils/field';\nexport * from './utils/common';\n\nexport const postInWindow: typeof import('./utils/lazy').postInWindow = async (...args) => {\n\tconst { postInWindow } = await import('./utils/lazy');\n\n\treturn postInWindow(...args);\n};\n\nexport const dataToForm: typeof import('./utils/lazy').dataToForm = async (...args) => {\n\tconst { dataToForm } = await import('./utils/lazy');\n\n\treturn dataToForm(...args);\n};\n\n/**\n * Создать API клиент\n *\n * @see Api.Ext.UseExt\n */\nexport const createClient = <\n\tpaths extends Api.PathsAbstract,\n\tUseExt extends Api.Ext.UseExt\n>(\n\tclientOptions: Partial<Api.ClientOptions> = {},\n\tuseExt: UseExt,\n) => {\n\treturn new Client<paths, UseExt>(clientOptions, useExt);\n};\n"],"names":["createRequestOptions","requestOptions","genExtRes","result","errors","response","isPublicAPI","path","getBaseDomainUrl","useMainDomain","input","subdomain","protocol","hostname","port","baseHostname","parts","checkHasFiles","data","value","item","clientRequest","params","options","fields","fetchStyle","fieldsPrepared","field","fieldsNarrow","post","client","fingerprint","controller","Request","fetch","hasFiles","url","requestInitBody","formDataSerializer","requestInitSignal","genMockResponse","request","middlewareCtxWithoutRequest","requestOrResponse","e","res","responseText","isJSON","formatError","errorCode","errorMessage","Client","clientOptions","useExt","querySerializer","body","c","r","middleware","id","middlewareCtx","error","errorAfterMiddleware","mocker","api","mocker2","postInWindow","args","postInWindow2","dataToForm","dataToForm2","createClient"],"mappings":"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"}
package/api/index.js CHANGED
@@ -3,7 +3,7 @@ const O = (o = {}) => (o = { ...o }, o.loadingEl ??= globalThis.document?.body,
3
3
  result: o,
4
4
  errors: t,
5
5
  response: s
6
- }), k = (o) => o.startsWith("/system_2/common/"), T = (o = !1, t = window.location.href, s) => {
6
+ }), k = (o) => o.startsWith("/system_2/common/"), A = (o = !1, t = window.location.href, s) => {
7
7
  const { protocol: e, hostname: r, port: n } = new URL(t), i = r.split("."), d = !o || i.length <= 2 || /^[\d.]+$/.test(r) || r === "localhost" ? r : i.slice(-2).join(".");
8
8
  return `${e}//${d}${n ? `:${n}` : ""}`;
9
9
  }, F = (o) => Object.values(o).some(
@@ -48,7 +48,9 @@ const O = (o = {}) => (o = { ...o }, o.loadingEl ??= globalThis.document?.body,
48
48
  abortByFingerprint: () => {
49
49
  if (!e.options.checkFingerprint) return;
50
50
  const r = e.path + e.options.checkFingerprint;
51
- o.abortControllers[r]?.abort(`Stopped previous request by same fingerprint: ${e.options.checkFingerprint}`);
51
+ o.abortControllers[r]?.abort(
52
+ new DOMException(`Stopped previous request by fingerprint: ${e.options.checkFingerprint}`, "AbortError")
53
+ );
52
54
  const n = new AbortController();
53
55
  return o.abortControllers[r] = n, n.signal;
54
56
  },
@@ -68,16 +70,16 @@ const O = (o = {}) => (o = { ...o }, o.loadingEl ??= globalThis.document?.body,
68
70
  const { formDataSerializer: p } = await import("../.chunks/lazy-40pjr8cZ.es.js");
69
71
  y = p(l);
70
72
  } else e.options.method !== "POST" ? R += "?" + await o.options.querySerializer(l) : y = o.options.bodySerializer(l);
71
- let q = e.abortByFingerprint();
73
+ let E = e.abortByFingerprint();
72
74
  if (e.mockerOptions) {
73
75
  const { genMockResponse: p } = await import("../.chunks/index-DkQWJkMc.es.js");
74
- return await p(e.mockerOptions, r, l, q);
76
+ return await p(e.mockerOptions, r, l, E);
75
77
  }
76
78
  const P = {
77
79
  ...o.options,
78
80
  method: e.options.method,
79
81
  body: y,
80
- signal: q
82
+ signal: E
81
83
  };
82
84
  let f = new i(R, P);
83
85
  f.headers.set("x-request-id", g.id), f.headers.set("accept", e.options.accept), x || f.headers.set("content-type", "application/json");
@@ -103,11 +105,11 @@ const O = (o = {}) => (o = { ...o }, o.loadingEl ??= globalThis.document?.body,
103
105
  h = await a.text(), this.options.accept === "application/json" || p ? c = JSON.parse(h) : o.useExt ? c = S(h, void 0, a) : c = h;
104
106
  } catch (p) {
105
107
  if ((p instanceof SyntaxError || p instanceof TypeError) && (m = p, m.responseText = h), o.useExt && m) {
106
- let b = a.status, E = a.statusText;
107
- b === 200 && (b = 1e4, E = "Error API response"), c = S(null, [
108
+ let b = a.status, q = a.statusText;
109
+ b === 200 && (b = 1e4, q = "Error API response"), c = S(null, [
108
110
  {
109
111
  code: b,
110
- string: E
112
+ string: q
111
113
  }
112
114
  ], a), o.options.useApiConsole && console.error(p);
113
115
  } else
@@ -263,7 +265,7 @@ class I {
263
265
  });
264
266
  }
265
267
  }
266
- const A = async (...o) => {
268
+ const T = async (...o) => {
267
269
  const { postInWindow: t } = await import("../.chunks/lazy-40pjr8cZ.es.js");
268
270
  return t(...o);
269
271
  }, D = async (...o) => {
@@ -276,8 +278,8 @@ export {
276
278
  S as genExtRes,
277
279
  z as genFieldFilter,
278
280
  j as genFieldOrder,
279
- T as getBaseDomainUrl,
281
+ A as getBaseDomainUrl,
280
282
  k as isPublicAPI,
281
- A as postInWindow
283
+ T as postInWindow
282
284
  };
283
285
  //# sourceMappingURL=index.js.map
package/api/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/api/api/client/request-options.ts","../../src/api/api/utils/common.ts","../../src/api/api/client/request.ts","../../src/api/api/client/client.ts","../../src/api/api/index.ts"],"sourcesContent":["export const createRequestOptions = (requestOptions: Partial<Api.ClientRequestOptions> = {}): Api.ClientRequestOptions => {\n\trequestOptions = { ...requestOptions };\n\trequestOptions.loadingEl ??= globalThis.document?.body;\n\trequestOptions.loadingShowSpinner ??= true;\n\trequestOptions.method ??= 'POST';\n\trequestOptions.accept ??= 'application/json';\n\n\treturn requestOptions as Api.ClientRequestOptions;\n};\n","/**\n * Сгенерировать объект ответа в формате расширения OpenAPI\n *\n * @see Api.Ext\n */\nexport const genExtRes = (\n\tresult: any,\n\terrors?: Api.Ext.Schemas['ResponseError']['errors'],\n\tresponse?: Response,\n): Api.Response<any> => {\n\treturn {\n\t\tresult,\n\t\terrors,\n\t\tresponse,\n\t};\n};\n\n/**\n * Это публичное API, к которому открыт доступ по прямой ссылке через GET\n *\n * Используется для кеширования и генерации файлов через API\n */\nexport const isPublicAPI = (path: Api.PathAbstract) => {\n\treturn path.startsWith('/system_2/common/');\n};\n\n/**\n * Сгенерировать baseUrl на основе текущего домена\n */\nexport const getBaseDomainUrl = (useMainDomain = false, input: string = window.location.href, subdomain?: string) => {\n\tconst { protocol, hostname, port } = new URL(input);\n\n\t/**\n\t * localhost / IP-адреса / одноуровневые домены оставляем как есть\n\t */\n\tconst parts = hostname.split('.');\n\tconst baseHostname = !useMainDomain || parts.length <= 2 || /^[\\d.]+$/.test(hostname) || hostname === 'localhost'\n\t\t? hostname\n\t\t: parts.slice(-2).join('.');\n\n\treturn `${protocol}//${baseHostname}${port ? `:${port}` : ''}`;\n};\n","import type { Client } from './client';\nimport { createRequestOptions } from './request-options';\nimport { genExtRes } from '../utils/common';\n\n/**\n * Проверить передаются ли файлы\n */\nconst checkHasFiles = (data: Record<string, any>): boolean => {\n\treturn Object.values(data).some(value =>\n\t\tvalue instanceof FileList ||\n\t\tvalue instanceof File ||\n\t\tvalue instanceof Blob ||\n\t\tArray.isArray(value) && value.some(item => item instanceof File || item instanceof Blob),\n\t);\n};\n\nexport const createRequest = <\n\tRequestContext extends Api.ClientRequestContext<any, any, any>,\n\tFieldsNarrow extends Api.ParamsFields<RequestContext>,\n>(\n\tclient: Client<RequestContext['Paths'], RequestContext['UseExt']>,\n\tpath: RequestContext['Path'],\n\tfieldsNarrow?: FieldsNarrow,\n): Api.ClientRequest<RequestContext, FieldsNarrow> => {\n\tconst clientRequest: Api.ClientRequest<RequestContext, FieldsNarrow> = {\n\t\tinLoading: false,\n\t\tpath: path as Api.PathAbstract,\n\t\turl: client.options.baseUrl + path,\n\t\toptions: createRequestOptions(client.options.requestOptions),\n\t\tmockerOptions: undefined as Api.Mocker.Options<any, any> | undefined,\n\t\tparams: {} as any, // незаполненное свойство\n\t\tgetInLoading: () => clientRequest.inLoading,\n\n\t\tsetParams: (params) => {\n\t\t\tclientRequest.params = { ...params } as any;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tchangeParams: (params) => {\n\t\t\tObject.assign(clientRequest.params, params);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetOptions: (options) => {\n\t\t\tObject.assign(clientRequest.options, options);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetMocker: (options) => {\n\t\t\tclientRequest.mockerOptions = options;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tcall: async (fields?) => {\n\t\t\treturn clientRequest.exec(fields);\n\t\t},\n\n\t\tcallFetch: async (fetchStyle, fields?) => {\n\t\t\treturn clientRequest.exec(fields, fetchStyle);\n\t\t},\n\n\t\tcallInNewWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_blank');\n\t\t},\n\n\t\tcallInSelfWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_self');\n\t\t},\n\n\t\tgenData: (fields?, fetchStyle?) => {\n\t\t\tconst post: any = { ...clientRequest.params };\n\n\t\t\t// в старом коде fields вставлялись в params, оставлено для совместимости\n\t\t\t// delete post.fields;\n\t\t\tdelete post.fetch_style;\n\n\t\t\t// поля, указанные при запуске запроса\n\t\t\tif (fields) {\n\t\t\t\tlet fieldsPrepared = [...fields as any[]];\n\n\t\t\t\t// поля, указанные при создании запроса\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tfieldsPrepared = fieldsPrepared.filter(field => fieldsNarrow.includes(field));\n\t\t\t\t}\n\n\t\t\t\tpost.fields = fieldsPrepared;\n\t\t\t} else {\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tpost.fields = fieldsNarrow;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (fetchStyle) {\n\t\t\t\tpost.fetch_style = fetchStyle;\n\t\t\t}\n\n\t\t\treturn post;\n\t\t},\n\n\t\tabortByFingerprint: () => {\n\t\t\tif (!clientRequest.options.checkFingerprint) return;\n\n\t\t\tconst fingerprint = clientRequest.path + clientRequest.options.checkFingerprint;\n\n\t\t\tclient.abortControllers[fingerprint]?.abort(`Stopped previous request by same fingerprint: ${clientRequest.options.checkFingerprint}`);\n\n\t\t\tconst controller = new AbortController();\n\n\t\t\tclient.abortControllers[fingerprint] = controller;\n\n\t\t\treturn controller.signal;\n\t\t},\n\n\t\t/**\n\t\t * Общая функция выполнения запросов\n\t\t */\n\t\tasync exec(fields?, fetchStyle?) {\n\t\t\tconst Request = client.options.Request;\n\t\t\tconst fetch = client.options.fetch;\n\n\t\t\tconst data = clientRequest.genData(fields, fetchStyle);\n\n\t\t\tconst middlewareCtxWithoutRequest = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtxWithoutRequest);\n\n\t\t\tconst hasFiles = checkHasFiles(data);\n\t\t\tif (hasFiles && clientRequest.options.method !== 'POST') {\n\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t}\n\n\t\t\tlet url = clientRequest.url;\n\n\t\t\tlet requestInitBody: string | FormData | undefined = undefined;\n\n\t\t\tif (hasFiles) {\n\t\t\t\tif (clientRequest.options.method !== 'POST') {\n\t\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t\t}\n\n\t\t\t\tconst { formDataSerializer } = await import('../utils/lazy');\n\t\t\t\trequestInitBody = formDataSerializer(data);\n\t\t\t} else if (clientRequest.options.method !== 'POST') {\n\t\t\t\turl += '?' + await client.options.querySerializer(data);\n\t\t\t} else {\n\t\t\t\trequestInitBody = client.options.bodySerializer(data);\n\t\t\t}\n\n\t\t\t// checkFingerprint\n\t\t\tlet requestInitSignal = clientRequest.abortByFingerprint();\n\n\t\t\tif (clientRequest.mockerOptions) {\n\t\t\t\tconst { genMockResponse } = await import('../mocker/');\n\n\t\t\t\treturn await genMockResponse(clientRequest.mockerOptions, fields, data, requestInitSignal);\n\t\t\t}\n\n\t\t\tconst requestInit: RequestInit = {\n\t\t\t\t...client.options,\n\t\t\t\tmethod: clientRequest.options.method,\n\t\t\t\tbody: requestInitBody,\n\t\t\t\tsignal: requestInitSignal,\n\t\t\t};\n\n\t\t\tlet request = new Request(url, requestInit);\n\n\t\t\trequest.headers.set('x-request-id', middlewareCtxWithoutRequest.id);\n\t\t\trequest.headers.set('accept', clientRequest.options.accept);\n\n\t\t\t// при отправке данных в `FormData` `fetch()` сам укажет правильный заголовок `multipart/form-data`\n\t\t\tif (!hasFiles) {\n\t\t\t\trequest.headers.set('content-type', 'application/json');\n\t\t\t}\n\n\t\t\tconst middlewareCtx: Api.MiddlewareCallbackParams = {\n\t\t\t\t...middlewareCtxWithoutRequest,\n\t\t\t\trequest,\n\t\t\t};\n\n\t\t\tclientRequest.inLoading = true;\n\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\n\t\t\tlet response: Response | undefined = undefined;\n\n\t\t\tconst requestOrResponse = await client.middlewareOnRequest(request, middlewareCtx);\n\n\t\t\tif (requestOrResponse instanceof Response) {\n\t\t\t\tresponse = requestOrResponse;\n\t\t\t} else if (requestOrResponse instanceof Request) {\n\t\t\t\trequest = requestOrResponse;\n\t\t\t}\n\n\t\t\tif (!response) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = await fetch(request);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tresponse = await client.middlewareOnError(e, middlewareCtx);\n\t\t\t\t} finally {\n\t\t\t\t\tclientRequest.inLoading = false;\n\t\t\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresponse = await client.middlewareOnResponse(response, middlewareCtx);\n\n\t\t\tlet res: any;\n\t\t\tlet responseText: string | undefined;\n\t\t\tlet formatError: undefined | Api.FormatError = undefined;\n\n\t\t\ttry {\n\t\t\t\t// json - стандартные формат, он может быть возвращен в запросах с другим responseType, если в них произошла ошибка\n\t\t\t\tconst isJSON = response.headers.get('content-type')?.includes('application/json');\n\n\t\t\t\tresponseText = await response.text();\n\n\t\t\t\tif (this.options.accept === 'application/json' || isJSON) {\n\t\t\t\t\tres = JSON.parse(responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (client.useExt) {\n\t\t\t\t\t\tres = genExtRes(responseText, undefined, response);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tres = responseText;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError || e instanceof TypeError) {\n\t\t\t\t\tformatError = e;\n\t\t\t\t\tformatError.responseText = responseText;\n\t\t\t\t}\n\n\t\t\t\t// если в результате не пришел json, сгенерировать объект результата и добавить информацию об ответе API\n\t\t\t\tif (client.useExt && formatError) {\n\t\t\t\t\tlet errorCode = response.status;\n\t\t\t\t\tlet errorMessage = response.statusText;\n\n\t\t\t\t\tif (errorCode === 200) {\n\t\t\t\t\t\terrorCode = 10000;\n\t\t\t\t\t\terrorMessage = 'Error API response';\n\t\t\t\t\t}\n\n\t\t\t\t\tres = genExtRes(null, [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: errorCode,\n\t\t\t\t\t\t\tstring: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t], response);\n\n\t\t\t\t\tif (client.options.useApiConsole) console.error(e);\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (client.useExt) {\n\t\t\t\tres.response = response;\n\n\t\t\t\tif (res) {\n\t\t\t\t\tclientRequest.options.onApiLoaded?.(res, middlewareCtx);\n\t\t\t\t}\n\n\t\t\t\tif (res?.errors) {\n\t\t\t\t\tif (client.options.useApiConsole) console.warn(new Error('API error'), { res });\n\n\t\t\t\t\tclientRequest.options.onApiError?.(res, { ...middlewareCtx, formatError }, client.options.requestOptions?.onApiError);\n\t\t\t\t}\n\n\t\t\t\tif (res?.messages) {\n\t\t\t\t\tclientRequest.options.onApiMessage?.(res, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn res;\n\t\t},\n\t};\n\n\treturn clientRequest;\n};\n","import { createRequestOptions } from './request-options';\nimport { createRequest } from './request';\n\nexport class Client<paths extends Api.PathsAbstract, UseExt extends Api.Ext.UseExt> {\n\n\treadonly options: Readonly<Api.ClientOptions>;\n\treadonly useExt: UseExt;\n\treadonly middlewares: Api.Middleware[] = [];\n\tprivate mokerByPath = new Map<Api.Path<paths>, Api.Mocker.Options<any, any>>();\n\tabortControllers: Record<string, AbortController> = {};\n\n\tconstructor(clientOptions: Partial<Api.ClientOptions> = {}, useExt: UseExt) {\n\t\tclientOptions.requestOptions = createRequestOptions(clientOptions.requestOptions);\n\t\tclientOptions.useApiConsole ??= true;\n\n\t\tclientOptions.fetch ??= globalThis.fetch;\n\t\tclientOptions.Request ??= globalThis.Request;\n\t\tclientOptions.querySerializer ??= async (params) => {\n\t\t\tconst { querySerializer } = await import('../utils/lazy');\n\n\t\t\treturn querySerializer(params);\n\t\t};\n\t\tclientOptions.bodySerializer ??= (body) => typeof body === 'string' ? body : JSON.stringify(body);\n\n\t\tthis.options = clientOptions as Api.ClientOptions;\n\n\t\tthis.useExt = useExt;\n\t}\n\n\tgenerateUUID() {\n\t\tif (crypto?.randomUUID) {\n\t\t\treturn crypto.randomUUID();\n\t\t}\n\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n\t\t\tconst r = Math.random() * 16 | 0;\n\t\t\tconst v = c === 'x' ? r : (r & 0x3 | 0x8);\n\t\t\treturn v.toString(16);\n\t\t});\n\t}\n\n\t/**\n\t * Зарегистрировать middleware\n\t */\n\tuse(middleware: Api.Middleware) {\n\t\tthis.middlewares.push(middleware);\n\t}\n\n\t/**\n\t * Создать объект запроса\n\t *\n\t * После создания объекта он заполняется необходимыми данными и выполняет запросы к API с помощью APIRequest2.call();\n\t *\n\t * Опционально generic указывать нельзя, поэтому необходимо дублировать определение fetchStyle, [см.](https://github.com/Microsoft/TypeScript/issues/26242)\n\t *\n\t * @param path Путь метода API\n\t * @param fieldsNarrow Список получаемых полей, для методов API с моделью. Если объект запроса переиспользуется, и список полей меняется, указывайте его непосредственно при вызове `api.call()`\n\t */\n\tgen<\n\t\tPath extends Api.Path<paths>,\n\t\tFieldsNarrow extends Api.ParamsFields<Api.ClientRequestContext<paths, Path, UseExt>>\n\t>(\n\t\tpath: Path,\n\t\tfieldsNarrow?: FieldsNarrow,\n\t): Api.ClientRequest<Api.ClientRequestContext<paths, Path, UseExt>, FieldsNarrow> {\n\t\ttype RequestContext = Api.ClientRequestContext<paths, Path, UseExt>;\n\n\t\treturn createRequest<RequestContext, FieldsNarrow>(this, path, fieldsNarrow);\n\t}\n\n\t/**\n\t * Создать объект запроса, не описанного в OpenAPI\n\t */\n\tgenAny<\n\t\tParams extends Record<string, any>,\n\t\tResult = any,\n\t\tFieldsNarrow extends Api.Ext.Schemas['Fields'] | undefined = undefined\n\t>(path: Api.PathAbstract, fieldsNarrow?: FieldsNarrow): Api.ClientRequestCustom<UseExt, Params, Result> {\n\t\treturn this.gen(path as any, fieldsNarrow as any) as unknown as Api.ClientRequestCustom<UseExt, Params, Result>;\n\t}\n\n\t/**\n\t * Создать контекст выполнения запроса\n\t */\n\tgenMiddlewareCtx(\n\t\tclientRequest: Api.ClientRequest<any, any, any>,\n\t\tdata: Record<string, any>,\n\t): Omit<Api.MiddlewareCallbackParams, 'request'> {\n\t\tconst id = this.generateUUID();\n\n\t\tconst options: Api.BaseOptions = Object.freeze({\n\t\t\tbaseUrl: this.options.baseUrl,\n\t\t\tquerySerializer: this.options.querySerializer,\n\t\t\tbodySerializer: this.options.bodySerializer,\n\t\t\tRequest: this.options.Request,\n\t\t\tfetch: this.options.fetch,\n\t\t});\n\n\t\treturn {\n\t\t\tuseExt: this.useExt,\n\t\t\trequestOptions: clientRequest.options,\n\t\t\tdata,\n\t\t\tmiddlewareData: {},\n\t\t\toptions,\n\t\t\tschemaPath: clientRequest.path,\n\t\t\tid,\n\t\t};\n\t};\n\n\t/**\n\t * Обработчик middleware.onRequest\n\t *\n\t * @param request Запрос для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Request` или `Response` при модификации запроса, или undefined\n\t */\n\tasync middlewareOnRequest(\n\t\trequest: Request,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Request | Response | undefined> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onRequest?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Request) {\n\t\t\t\t\trequest = result;\n\t\t\t\t} else if (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('onRequest: must return new Request() or Response() when modifying the request');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn request;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param `error` Ошибка, переданная для обработки\n\t * @param middlewareCtx\n\t * @return Новый экземпляр `Response` при успешной обработке или выбрасывает ошибку\n\t */\n\tasync middlewareOnError(\n\t\terror: Error | unknown,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response | never> {\n\t\tlet errorAfterMiddleware = error;\n\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onError?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\terror: errorAfterMiddleware,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result instanceof Error) {\n\t\t\t\t\terrorAfterMiddleware = result;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthrow new Error('onError: must return new Response() or instance of Error');\n\t\t\t}\n\t\t}\n\n\t\tthrow errorAfterMiddleware;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param response Ответ для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Response` при модификации ответа, или undefined\n\t */\n\tasync middlewareOnResponse(\n\t\tresponse: Response,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onResponse?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\tresponse,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (!(result instanceof Response)) {\n\t\t\t\t\tthrow new Error('onResponse: must return new Response() when modifying the response');\n\t\t\t\t}\n\n\t\t\t\tresponse = result;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Установить генератор данных вместо реальных запросов к серверу для конкретного метода API\n\t */\n\tsetMocker<\n\t\tResult extends Api.Mocker.Result = Api.Mocker.Result,\n\t\tParams extends Api.Mocker.Params = Api.Mocker.Params\n\t>(\n\t\tpath: Api.Path<paths>,\n\t\tmocker: Api.Mocker.Options<Result, Params>,\n\t) {\n\t\tthis.mokerByPath.set(path, mocker);\n\n\t\t// @ts-ignore\n\t\tif (!this.genOriginal) {\n\t\t\t// @ts-ignore\n\t\t\tthis.genOriginal = this.gen.bind(this);\n\n\t\t\tthis.gen = (_path, fieldsNarrow) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst api = this.genOriginal(_path, fieldsNarrow);\n\n\t\t\t\tconst mocker = this.mokerByPath.get(_path);\n\t\t\t\tif (mocker) {\n\t\t\t\t\tapi.setMocker(mocker);\n\t\t\t\t}\n\n\t\t\t\treturn api;\n\t\t\t};\n\t\t}\n\t}\n\n}\n","import { Client } from './client/client';\n\nexport * from './utils/field';\nexport * from './utils/common';\n\nexport const postInWindow: typeof import('./utils/lazy').postInWindow = async (...args) => {\n\tconst { postInWindow } = await import('./utils/lazy');\n\n\treturn postInWindow(...args);\n};\n\nexport const dataToForm: typeof import('./utils/lazy').dataToForm = async (...args) => {\n\tconst { dataToForm } = await import('./utils/lazy');\n\n\treturn dataToForm(...args);\n};\n\n/**\n * Создать API клиент\n *\n * @see Api.Ext.UseExt\n */\nexport const createClient = <\n\tpaths extends Api.PathsAbstract,\n\tUseExt extends Api.Ext.UseExt\n>(\n\tclientOptions: Partial<Api.ClientOptions> = {},\n\tuseExt: UseExt,\n) => {\n\treturn new Client<paths, UseExt>(clientOptions, useExt);\n};\n"],"names":["createRequestOptions","requestOptions","genExtRes","result","errors","response","isPublicAPI","path","getBaseDomainUrl","useMainDomain","input","subdomain","protocol","hostname","port","parts","baseHostname","checkHasFiles","data","value","item","createRequest","client","fieldsNarrow","clientRequest","params","options","fields","fetchStyle","middlewareCtx","postInWindow","post","fieldsPrepared","field","fingerprint","controller","Request","fetch","middlewareCtxWithoutRequest","hasFiles","url","requestInitBody","formDataSerializer","requestInitSignal","genMockResponse","requestInit","request","requestOrResponse","e","res","responseText","formatError","isJSON","errorCode","errorMessage","Client","clientOptions","useExt","querySerializer","body","c","r","middleware","id","error","errorAfterMiddleware","mocker","_path","api","args","dataToForm","createClient"],"mappings":";AAAO,MAAMA,IAAuB,CAACC,IAAoD,QACxFA,IAAiB,EAAE,GAAGA,EAAA,GACtBA,EAAe,cAAc,WAAW,UAAU,MAClDA,EAAe,uBAAuB,IACtCA,EAAe,WAAW,QAC1BA,EAAe,WAAW,oBAEnBA,ICFKC,IAAY,CACxBC,GACAC,GACAC,OAEO;AAAA,EACN,QAAAF;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,IASWC,IAAc,CAACC,MACpBA,EAAK,WAAW,mBAAmB,GAM9BC,IAAmB,CAACC,IAAgB,IAAOC,IAAgB,OAAO,SAAS,MAAMC,MAAuB;AACpH,QAAM,EAAE,UAAAC,GAAU,UAAAC,GAAU,MAAAC,MAAS,IAAI,IAAIJ,CAAK,GAK5CK,IAAQF,EAAS,MAAM,GAAG,GAC1BG,IAAe,CAACP,KAAiBM,EAAM,UAAU,KAAK,WAAW,KAAKF,CAAQ,KAAKA,MAAa,cACnGA,IACAE,EAAM,MAAM,EAAE,EAAE,KAAK,GAAG;AAE3B,SAAO,GAAGH,CAAQ,KAAKI,CAAY,GAAGF,IAAO,IAAIA,CAAI,KAAK,EAAE;AAC7D,GClCMG,IAAgB,CAACC,MACf,OAAO,OAAOA,CAAI,EAAE;AAAA,EAAK,OAC/BC,aAAiB,YACjBA,aAAiB,QACjBA,aAAiB,QACjB,MAAM,QAAQA,CAAK,KAAKA,EAAM,KAAK,OAAQC,aAAgB,QAAQA,aAAgB,IAAI;AAAA,GAI5EC,IAAgB,CAI5BC,GACAf,GACAgB,MACqD;AACrD,QAAMC,IAAiE;AAAA,IACtE,WAAW;AAAA,IACX,MAAAjB;AAAA,IACA,KAAKe,EAAO,QAAQ,UAAUf;AAAA,IAC9B,SAASP,EAAqBsB,EAAO,QAAQ,cAAc;AAAA,IAC3D,eAAe;AAAA,IACf,QAAQ,CAAA;AAAA;AAAA,IACR,cAAc,MAAME,EAAc;AAAA,IAElC,WAAW,CAACC,OACXD,EAAc,SAAS,EAAE,GAAGC,EAAA,GAErBD;AAAA,IAGR,cAAc,CAACC,OACd,OAAO,OAAOD,EAAc,QAAQC,CAAM,GAEnCD;AAAA,IAGR,YAAY,CAACE,OACZ,OAAO,OAAOF,EAAc,SAASE,CAAO,GAErCF;AAAA,IAGR,WAAW,CAACE,OACXF,EAAc,gBAAgBE,GAEvBF;AAAA,IAGR,MAAM,OAAOG,MACLH,EAAc,KAAKG,CAAM;AAAA,IAGjC,WAAW,OAAOC,GAAYD,MACtBH,EAAc,KAAKG,GAAQC,CAAU;AAAA,IAG7C,iBAAiB,OAAOD,MAAY;AACnC,YAAMT,IAAOM,EAAc,QAAQG,CAAM,GAEnCE,IAAgBP,EAAO,iBAAiBE,GAAeN,CAAI;AAEjE,MAAAI,EAAO,QAAQ,gBAAgBJ,GAAMW,CAAa;AAElD,YAAM,EAAE,cAAAC,EAAA,IAAiB,MAAM,OAAO,gCAAe;AACrD,MAAKA,EAAaN,EAAc,KAAKN,GAAM,QAAQ;AAAA,IACpD;AAAA,IAEA,kBAAkB,OAAOS,MAAY;AACpC,YAAMT,IAAOM,EAAc,QAAQG,CAAM,GAEnCE,IAAgBP,EAAO,iBAAiBE,GAAeN,CAAI;AAEjE,MAAAI,EAAO,QAAQ,gBAAgBJ,GAAMW,CAAa;AAElD,YAAM,EAAE,cAAAC,EAAA,IAAiB,MAAM,OAAO,gCAAe;AACrD,MAAKA,EAAaN,EAAc,KAAKN,GAAM,OAAO;AAAA,IACnD;AAAA,IAEA,SAAS,CAACS,GAASC,MAAgB;AAClC,YAAMG,IAAY,EAAE,GAAGP,EAAc,OAAA;AAOrC,UAHA,OAAOO,EAAK,aAGRJ,GAAQ;AACX,YAAIK,IAAiB,CAAC,GAAGL,CAAe;AAGxC,QAAIJ,MACHS,IAAiBA,EAAe,OAAO,CAAAC,MAASV,EAAa,SAASU,CAAK,CAAC,IAG7EF,EAAK,SAASC;AAAA,MACf;AACC,QAAIT,MACHQ,EAAK,SAASR;AAIhB,aAAIK,MACHG,EAAK,cAAcH,IAGbG;AAAA,IACR;AAAA,IAEA,oBAAoB,MAAM;AACzB,UAAI,CAACP,EAAc,QAAQ,iBAAkB;AAE7C,YAAMU,IAAcV,EAAc,OAAOA,EAAc,QAAQ;AAE/D,MAAAF,EAAO,iBAAiBY,CAAW,GAAG,MAAM,iDAAiDV,EAAc,QAAQ,gBAAgB,EAAE;AAErI,YAAMW,IAAa,IAAI,gBAAA;AAEvB,aAAAb,EAAO,iBAAiBY,CAAW,IAAIC,GAEhCA,EAAW;AAAA,IACnB;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,KAAKR,GAASC,GAAa;AAChC,YAAMQ,IAAUd,EAAO,QAAQ,SACzBe,IAAQf,EAAO,QAAQ,OAEvBJ,IAAOM,EAAc,QAAQG,GAAQC,CAAU,GAE/CU,IAA8BhB,EAAO,iBAAiBE,GAAeN,CAAI;AAE/E,MAAAI,EAAO,QAAQ,gBAAgBJ,GAAMoB,CAA2B;AAEhE,YAAMC,IAAWtB,EAAcC,CAAI;AACnC,UAAIqB,KAAYf,EAAc,QAAQ,WAAW;AAChD,cAAM,IAAI,MAAM,yCAAyC;AAG1D,UAAIgB,IAAMhB,EAAc,KAEpBiB;AAEJ,UAAIF,GAAU;AACb,YAAIf,EAAc,QAAQ,WAAW;AACpC,gBAAM,IAAI,MAAM,yCAAyC;AAG1D,cAAM,EAAE,oBAAAkB,EAAA,IAAuB,MAAM,OAAO,gCAAe;AAC3D,QAAAD,IAAkBC,EAAmBxB,CAAI;AAAA,MAC1C,MAAA,CAAWM,EAAc,QAAQ,WAAW,SAC3CgB,KAAO,MAAM,MAAMlB,EAAO,QAAQ,gBAAgBJ,CAAI,IAEtDuB,IAAkBnB,EAAO,QAAQ,eAAeJ,CAAI;AAIrD,UAAIyB,IAAoBnB,EAAc,mBAAA;AAEtC,UAAIA,EAAc,eAAe;AAChC,cAAM,EAAE,iBAAAoB,EAAA,IAAoB,MAAM,OAAO,iCAAY;AAErD,eAAO,MAAMA,EAAgBpB,EAAc,eAAeG,GAAQT,GAAMyB,CAAiB;AAAA,MAC1F;AAEA,YAAME,IAA2B;AAAA,QAChC,GAAGvB,EAAO;AAAA,QACV,QAAQE,EAAc,QAAQ;AAAA,QAC9B,MAAMiB;AAAA,QACN,QAAQE;AAAA,MAAA;AAGT,UAAIG,IAAU,IAAIV,EAAQI,GAAKK,CAAW;AAE1C,MAAAC,EAAQ,QAAQ,IAAI,gBAAgBR,EAA4B,EAAE,GAClEQ,EAAQ,QAAQ,IAAI,UAAUtB,EAAc,QAAQ,MAAM,GAGrDe,KACJO,EAAQ,QAAQ,IAAI,gBAAgB,kBAAkB;AAGvD,YAAMjB,IAA8C;AAAA,QACnD,GAAGS;AAAA,QACH,SAAAQ;AAAA,MAAA;AAGD,MAAAtB,EAAc,YAAY,IAC1BA,EAAc,QAAQ,YAAYA,EAAc,WAAWK,CAAa;AAExE,UAAIxB;AAEJ,YAAM0C,IAAoB,MAAMzB,EAAO,oBAAoBwB,GAASjB,CAAa;AAQjF,UANIkB,aAA6B,WAChC1C,IAAW0C,IACDA,aAA6BX,MACvCU,IAAUC,IAGP,CAAC1C;AACJ,YAAI;AACH,UAAAA,IAAW,MAAMgC,EAAMS,CAAO;AAAA,QAC/B,SAASE,GAAG;AACX,UAAA3C,IAAW,MAAMiB,EAAO,kBAAkB0B,GAAGnB,CAAa;AAAA,QAC3D,UAAA;AACC,UAAAL,EAAc,YAAY,IAC1BA,EAAc,QAAQ,YAAYA,EAAc,WAAWK,CAAa;AAAA,QACzE;AAGD,MAAAxB,IAAW,MAAMiB,EAAO,qBAAqBjB,GAAUwB,CAAa;AAEpE,UAAIoB,GACAC,GACAC;AAEJ,UAAI;AAEH,cAAMC,IAAS/C,EAAS,QAAQ,IAAI,cAAc,GAAG,SAAS,kBAAkB;AAEhF,QAAA6C,IAAe,MAAM7C,EAAS,KAAA,GAE1B,KAAK,QAAQ,WAAW,sBAAsB+C,IACjDH,IAAM,KAAK,MAAMC,CAAY,IAEzB5B,EAAO,SACV2B,IAAM/C,EAAUgD,GAAc,QAAW7C,CAAQ,IAEjD4C,IAAMC;AAAA,MAGT,SAASF,GAAG;AAOX,aANIA,aAAa,eAAeA,aAAa,eAC5CG,IAAcH,GACdG,EAAY,eAAeD,IAIxB5B,EAAO,UAAU6B,GAAa;AACjC,cAAIE,IAAYhD,EAAS,QACrBiD,IAAejD,EAAS;AAE5B,UAAIgD,MAAc,QACjBA,IAAY,KACZC,IAAe,uBAGhBL,IAAM/C,EAAU,MAAM;AAAA,YACrB;AAAA,cACC,MAAMmD;AAAA,cACN,QAAQC;AAAA,YAAA;AAAA,UACT,GACEjD,CAAQ,GAEPiB,EAAO,QAAQ,iBAAe,QAAQ,MAAM0B,CAAC;AAAA,QAClD;AACC,gBAAMA;AAAA,MAER;AAEA,aAAI1B,EAAO,WACV2B,EAAI,WAAW5C,GAEX4C,KACHzB,EAAc,QAAQ,cAAcyB,GAAKpB,CAAa,GAGnDoB,GAAK,WACJ3B,EAAO,QAAQ,iBAAe,QAAQ,KAAK,IAAI,MAAM,WAAW,GAAG,EAAE,KAAA2B,GAAK,GAE9EzB,EAAc,QAAQ,aAAayB,GAAK,EAAE,GAAGpB,GAAe,aAAAsB,EAAA,GAAe7B,EAAO,QAAQ,gBAAgB,UAAU,IAGjH2B,GAAK,YACRzB,EAAc,QAAQ,eAAeyB,GAAKpB,CAAa,IAIlDoB;AAAA,IACR;AAAA,EAAA;AAGD,SAAOzB;AACR;ACnSO,MAAM+B,EAAuE;AAAA,EAE1E;AAAA,EACA;AAAA,EACA,cAAgC,CAAA;AAAA,EACjC,kCAAkB,IAAA;AAAA,EAC1B,mBAAoD,CAAA;AAAA,EAEpD,YAAYC,IAA4C,CAAA,GAAIC,GAAgB;AAC3E,IAAAD,EAAc,iBAAiBxD,EAAqBwD,EAAc,cAAc,GAChFA,EAAc,kBAAkB,IAEhCA,EAAc,UAAU,WAAW,OACnCA,EAAc,YAAY,WAAW,SACrCA,EAAc,oBAAoB,OAAO/B,MAAW;AACnD,YAAM,EAAE,iBAAAiC,EAAA,IAAoB,MAAM,OAAO,gCAAe;AAExD,aAAOA,EAAgBjC,CAAM;AAAA,IAC9B,GACA+B,EAAc,mBAAmB,CAACG,MAAS,OAAOA,KAAS,WAAWA,IAAO,KAAK,UAAUA,CAAI,GAEhG,KAAK,UAAUH,GAEf,KAAK,SAASC;AAAA,EACf;AAAA,EAEA,eAAe;AACd,WAAI,QAAQ,aACJ,OAAO,WAAA,IAGR,uCAAuC,QAAQ,SAAS,CAAAG,MAAK;AACnE,YAAMC,IAAI,KAAK,OAAA,IAAW,KAAK;AAE/B,cADUD,MAAM,MAAMC,IAAKA,IAAI,IAAM,GAC5B,SAAS,EAAE;AAAA,IACrB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIC,GAA4B;AAC/B,SAAK,YAAY,KAAKA,CAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAICvD,GACAgB,GACiF;AAGjF,WAAOF,EAA4C,MAAMd,GAAMgB,CAAY;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,OAIEhB,GAAwBgB,GAA8E;AACvG,WAAO,KAAK,IAAIhB,GAAagB,CAAmB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,iBACCC,GACAN,GACgD;AAChD,UAAM6C,IAAK,KAAK,aAAA,GAEVrC,IAA2B,OAAO,OAAO;AAAA,MAC9C,SAAS,KAAK,QAAQ;AAAA,MACtB,iBAAiB,KAAK,QAAQ;AAAA,MAC9B,gBAAgB,KAAK,QAAQ;AAAA,MAC7B,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO,KAAK,QAAQ;AAAA,IAAA,CACpB;AAED,WAAO;AAAA,MACN,QAAQ,KAAK;AAAA,MACb,gBAAgBF,EAAc;AAAA,MAC9B,MAAAN;AAAA,MACA,gBAAgB,CAAA;AAAA,MAChB,SAAAQ;AAAA,MACA,YAAYF,EAAc;AAAA,MAC1B,IAAAuC;AAAA,IAAA;AAAA,EAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBACLjB,GACAjB,GAC0C;AAC1C,eAAWiC,KAAc,KAAK,aAAa;AAC1C,YAAM3D,IAAS,MAAM2D,EAAW,YAAY;AAAA,QAC3C,GAAGjC;AAAA,QACH,SAAAiB;AAAA,MAAA,CACA;AAED,UAAI3C;AACH,YAAIA,aAAkB;AACrB,UAAA2C,IAAU3C;AAAA,aACX;AAAA,cAAWA,aAAkB;AAC5B,mBAAOA;AAEP,gBAAM,IAAI,MAAM,+EAA+E;AAAA;AAAA,IAGlG;AAEA,WAAO2C;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBACLkB,GACAnC,GAC4B;AAC5B,QAAIoC,IAAuBD;AAE3B,eAAWF,KAAc,KAAK,aAAa;AAC1C,YAAM3D,IAAS,MAAM2D,EAAW,UAAU;AAAA,QACzC,GAAGjC;AAAA,QACH,OAAOoC;AAAA,MAAA,CACP;AAED,UAAI9D,GAAQ;AACX,YAAIA,aAAkB;AACrB,iBAAOA;AAGR,YAAIA,aAAkB,OAAO;AAC5B,UAAA8D,IAAuB9D;AAEvB;AAAA,QACD;AAEA,cAAM,IAAI,MAAM,0DAA0D;AAAA,MAC3E;AAAA,IACD;AAEA,UAAM8D;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBACL5D,GACAwB,GACoB;AACpB,eAAWiC,KAAc,KAAK,aAAa;AAC1C,YAAM3D,IAAS,MAAM2D,EAAW,aAAa;AAAA,QAC5C,GAAGjC;AAAA,QACH,UAAAxB;AAAA,MAAA,CACA;AAED,UAAIF,GAAQ;AACX,YAAI,EAAEA,aAAkB;AACvB,gBAAM,IAAI,MAAM,oEAAoE;AAGrF,QAAAE,IAAWF;AAAA,MACZ;AAAA,IACD;AAEA,WAAOE;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,UAICE,GACA2D,GACC;AACD,SAAK,YAAY,IAAI3D,GAAM2D,CAAM,GAG5B,KAAK,gBAET,KAAK,cAAc,KAAK,IAAI,KAAK,IAAI,GAErC,KAAK,MAAM,CAACC,GAAO5C,MAAiB;AAEnC,YAAM6C,IAAM,KAAK,YAAYD,GAAO5C,CAAY,GAE1C2C,IAAS,KAAK,YAAY,IAAIC,CAAK;AACzC,aAAID,KACHE,EAAI,UAAUF,CAAM,GAGdE;AAAA,IACR;AAAA,EAEF;AAED;ACxOO,MAAMtC,IAA2D,UAAUuC,MAAS;AAC1F,QAAM,EAAE,cAAAvC,MAAiB,MAAM,OAAO,gCAAc;AAEpD,SAAOA,EAAa,GAAGuC,CAAI;AAC5B,GAEaC,IAAuD,UAAUD,MAAS;AACtF,QAAM,EAAE,YAAAC,MAAe,MAAM,OAAO,gCAAc;AAElD,SAAOA,EAAW,GAAGD,CAAI;AAC1B,GAOaE,IAAe,CAI3Bf,IAA4C,CAAA,GAC5CC,MAEO,IAAIF,EAAsBC,GAAeC,CAAM;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/api/api/client/request-options.ts","../../src/api/api/utils/common.ts","../../src/api/api/client/request.ts","../../src/api/api/client/client.ts","../../src/api/api/index.ts"],"sourcesContent":["export const createRequestOptions = (requestOptions: Partial<Api.ClientRequestOptions> = {}): Api.ClientRequestOptions => {\n\trequestOptions = { ...requestOptions };\n\trequestOptions.loadingEl ??= globalThis.document?.body;\n\trequestOptions.loadingShowSpinner ??= true;\n\trequestOptions.method ??= 'POST';\n\trequestOptions.accept ??= 'application/json';\n\n\treturn requestOptions as Api.ClientRequestOptions;\n};\n","/**\n * Сгенерировать объект ответа в формате расширения OpenAPI\n *\n * @see Api.Ext\n */\nexport const genExtRes = (\n\tresult: any,\n\terrors?: Api.Ext.Schemas['ResponseError']['errors'],\n\tresponse?: Response,\n): Api.Response<any> => {\n\treturn {\n\t\tresult,\n\t\terrors,\n\t\tresponse,\n\t};\n};\n\n/**\n * Это публичное API, к которому открыт доступ по прямой ссылке через GET\n *\n * Используется для кеширования и генерации файлов через API\n */\nexport const isPublicAPI = (path: Api.PathAbstract) => {\n\treturn path.startsWith('/system_2/common/');\n};\n\n/**\n * Сгенерировать baseUrl на основе текущего домена\n */\nexport const getBaseDomainUrl = (useMainDomain = false, input: string = window.location.href, subdomain?: string) => {\n\tconst { protocol, hostname, port } = new URL(input);\n\n\t/**\n\t * localhost / IP-адреса / одноуровневые домены оставляем как есть\n\t */\n\tconst parts = hostname.split('.');\n\tconst baseHostname = !useMainDomain || parts.length <= 2 || /^[\\d.]+$/.test(hostname) || hostname === 'localhost'\n\t\t? hostname\n\t\t: parts.slice(-2).join('.');\n\n\treturn `${protocol}//${baseHostname}${port ? `:${port}` : ''}`;\n};\n","import type { Client } from './client';\nimport { createRequestOptions } from './request-options';\nimport { genExtRes } from '../utils/common';\n\n/**\n * Проверить передаются ли файлы\n */\nconst checkHasFiles = (data: Record<string, any>): boolean => {\n\treturn Object.values(data).some(value =>\n\t\tvalue instanceof FileList ||\n\t\tvalue instanceof File ||\n\t\tvalue instanceof Blob ||\n\t\tArray.isArray(value) && value.some(item => item instanceof File || item instanceof Blob),\n\t);\n};\n\nexport const createRequest = <\n\tRequestContext extends Api.ClientRequestContext<any, any, any>,\n\tFieldsNarrow extends Api.ParamsFields<RequestContext>,\n>(\n\tclient: Client<RequestContext['Paths'], RequestContext['UseExt']>,\n\tpath: RequestContext['Path'],\n\tfieldsNarrow?: FieldsNarrow,\n): Api.ClientRequest<RequestContext, FieldsNarrow> => {\n\tconst clientRequest: Api.ClientRequest<RequestContext, FieldsNarrow> = {\n\t\tinLoading: false,\n\t\tpath: path as Api.PathAbstract,\n\t\turl: client.options.baseUrl + path,\n\t\toptions: createRequestOptions(client.options.requestOptions),\n\t\tmockerOptions: undefined as Api.Mocker.Options<any, any> | undefined,\n\t\tparams: {} as any, // незаполненное свойство\n\t\tgetInLoading: () => clientRequest.inLoading,\n\n\t\tsetParams: (params) => {\n\t\t\tclientRequest.params = { ...params } as any;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tchangeParams: (params) => {\n\t\t\tObject.assign(clientRequest.params, params);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetOptions: (options) => {\n\t\t\tObject.assign(clientRequest.options, options);\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tsetMocker: (options) => {\n\t\t\tclientRequest.mockerOptions = options;\n\n\t\t\treturn clientRequest;\n\t\t},\n\n\t\tcall: async (fields?) => {\n\t\t\treturn clientRequest.exec(fields);\n\t\t},\n\n\t\tcallFetch: async (fetchStyle, fields?) => {\n\t\t\treturn clientRequest.exec(fields, fetchStyle);\n\t\t},\n\n\t\tcallInNewWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_blank');\n\t\t},\n\n\t\tcallInSelfWindow: async (fields?) => {\n\t\t\tconst data = clientRequest.genData(fields);\n\n\t\t\tconst middlewareCtx = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtx);\n\n\t\t\tconst { postInWindow } = await import('../utils/lazy');\n\t\t\tvoid postInWindow(clientRequest.url, data, '_self');\n\t\t},\n\n\t\tgenData: (fields?, fetchStyle?) => {\n\t\t\tconst post: any = { ...clientRequest.params };\n\n\t\t\t// в старом коде fields вставлялись в params, оставлено для совместимости\n\t\t\t// delete post.fields;\n\t\t\tdelete post.fetch_style;\n\n\t\t\t// поля, указанные при запуске запроса\n\t\t\tif (fields) {\n\t\t\t\tlet fieldsPrepared = [...fields as any[]];\n\n\t\t\t\t// поля, указанные при создании запроса\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tfieldsPrepared = fieldsPrepared.filter(field => fieldsNarrow.includes(field));\n\t\t\t\t}\n\n\t\t\t\tpost.fields = fieldsPrepared;\n\t\t\t} else {\n\t\t\t\tif (fieldsNarrow) {\n\t\t\t\t\tpost.fields = fieldsNarrow;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (fetchStyle) {\n\t\t\t\tpost.fetch_style = fetchStyle;\n\t\t\t}\n\n\t\t\treturn post;\n\t\t},\n\n\t\tabortByFingerprint: () => {\n\t\t\tif (!clientRequest.options.checkFingerprint) return;\n\n\t\t\tconst fingerprint = clientRequest.path + clientRequest.options.checkFingerprint;\n\n\t\t\tclient.abortControllers[fingerprint]?.abort(\n\t\t\t\tnew DOMException(`Stopped previous request by fingerprint: ${clientRequest.options.checkFingerprint}`, 'AbortError'),\n\t\t\t);\n\n\t\t\tconst controller = new AbortController();\n\n\t\t\tclient.abortControllers[fingerprint] = controller;\n\n\t\t\treturn controller.signal;\n\t\t},\n\n\t\t/**\n\t\t * Общая функция выполнения запросов\n\t\t */\n\t\tasync exec(fields?, fetchStyle?) {\n\t\t\tconst Request = client.options.Request;\n\t\t\tconst fetch = client.options.fetch;\n\n\t\t\tconst data = clientRequest.genData(fields, fetchStyle);\n\n\t\t\tconst middlewareCtxWithoutRequest = client.genMiddlewareCtx(clientRequest, data);\n\n\t\t\tclient.options.onPrepareData?.(data, middlewareCtxWithoutRequest);\n\n\t\t\tconst hasFiles = checkHasFiles(data);\n\t\t\tif (hasFiles && clientRequest.options.method !== 'POST') {\n\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t}\n\n\t\t\tlet url = clientRequest.url;\n\n\t\t\tlet requestInitBody: string | FormData | undefined = undefined;\n\n\t\t\tif (hasFiles) {\n\t\t\t\tif (clientRequest.options.method !== 'POST') {\n\t\t\t\t\tthrow new Error('Files can be sent only in POST requests');\n\t\t\t\t}\n\n\t\t\t\tconst { formDataSerializer } = await import('../utils/lazy');\n\t\t\t\trequestInitBody = formDataSerializer(data);\n\t\t\t} else if (clientRequest.options.method !== 'POST') {\n\t\t\t\turl += '?' + await client.options.querySerializer(data);\n\t\t\t} else {\n\t\t\t\trequestInitBody = client.options.bodySerializer(data);\n\t\t\t}\n\n\t\t\t// checkFingerprint\n\t\t\tlet requestInitSignal = clientRequest.abortByFingerprint();\n\n\t\t\tif (clientRequest.mockerOptions) {\n\t\t\t\tconst { genMockResponse } = await import('../mocker/');\n\n\t\t\t\treturn await genMockResponse(clientRequest.mockerOptions, fields, data, requestInitSignal);\n\t\t\t}\n\n\t\t\tconst requestInit: RequestInit = {\n\t\t\t\t...client.options,\n\t\t\t\tmethod: clientRequest.options.method,\n\t\t\t\tbody: requestInitBody,\n\t\t\t\tsignal: requestInitSignal,\n\t\t\t};\n\n\t\t\tlet request = new Request(url, requestInit);\n\n\t\t\trequest.headers.set('x-request-id', middlewareCtxWithoutRequest.id);\n\t\t\trequest.headers.set('accept', clientRequest.options.accept);\n\n\t\t\t// при отправке данных в `FormData` `fetch()` сам укажет правильный заголовок `multipart/form-data`\n\t\t\tif (!hasFiles) {\n\t\t\t\trequest.headers.set('content-type', 'application/json');\n\t\t\t}\n\n\t\t\tconst middlewareCtx: Api.MiddlewareCallbackParams = {\n\t\t\t\t...middlewareCtxWithoutRequest,\n\t\t\t\trequest,\n\t\t\t};\n\n\t\t\tclientRequest.inLoading = true;\n\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\n\t\t\tlet response: Response | undefined = undefined;\n\n\t\t\tconst requestOrResponse = await client.middlewareOnRequest(request, middlewareCtx);\n\n\t\t\tif (requestOrResponse instanceof Response) {\n\t\t\t\tresponse = requestOrResponse;\n\t\t\t} else if (requestOrResponse instanceof Request) {\n\t\t\t\trequest = requestOrResponse;\n\t\t\t}\n\n\t\t\tif (!response) {\n\t\t\t\ttry {\n\t\t\t\t\tresponse = await fetch(request);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tresponse = await client.middlewareOnError(e, middlewareCtx);\n\t\t\t\t} finally {\n\t\t\t\t\tclientRequest.inLoading = false;\n\t\t\t\t\tclientRequest.options.onLoading?.(clientRequest.inLoading, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresponse = await client.middlewareOnResponse(response, middlewareCtx);\n\n\t\t\tlet res: any;\n\t\t\tlet responseText: string | undefined;\n\t\t\tlet formatError: undefined | Api.FormatError = undefined;\n\n\t\t\ttry {\n\t\t\t\t// json - стандартные формат, он может быть возвращен в запросах с другим responseType, если в них произошла ошибка\n\t\t\t\tconst isJSON = response.headers.get('content-type')?.includes('application/json');\n\n\t\t\t\tresponseText = await response.text();\n\n\t\t\t\tif (this.options.accept === 'application/json' || isJSON) {\n\t\t\t\t\tres = JSON.parse(responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (client.useExt) {\n\t\t\t\t\t\tres = genExtRes(responseText, undefined, response);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tres = responseText;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError || e instanceof TypeError) {\n\t\t\t\t\tformatError = e;\n\t\t\t\t\tformatError.responseText = responseText;\n\t\t\t\t}\n\n\t\t\t\t// если в результате не пришел json, сгенерировать объект результата и добавить информацию об ответе API\n\t\t\t\tif (client.useExt && formatError) {\n\t\t\t\t\tlet errorCode = response.status;\n\t\t\t\t\tlet errorMessage = response.statusText;\n\n\t\t\t\t\tif (errorCode === 200) {\n\t\t\t\t\t\terrorCode = 10000;\n\t\t\t\t\t\terrorMessage = 'Error API response';\n\t\t\t\t\t}\n\n\t\t\t\t\tres = genExtRes(null, [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: errorCode,\n\t\t\t\t\t\t\tstring: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t], response);\n\n\t\t\t\t\tif (client.options.useApiConsole) console.error(e);\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (client.useExt) {\n\t\t\t\tres.response = response;\n\n\t\t\t\tif (res) {\n\t\t\t\t\tclientRequest.options.onApiLoaded?.(res, middlewareCtx);\n\t\t\t\t}\n\n\t\t\t\tif (res?.errors) {\n\t\t\t\t\tif (client.options.useApiConsole) console.warn(new Error('API error'), { res });\n\n\t\t\t\t\tclientRequest.options.onApiError?.(res, { ...middlewareCtx, formatError }, client.options.requestOptions?.onApiError);\n\t\t\t\t}\n\n\t\t\t\tif (res?.messages) {\n\t\t\t\t\tclientRequest.options.onApiMessage?.(res, middlewareCtx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn res;\n\t\t},\n\t};\n\n\treturn clientRequest;\n};\n","import { createRequestOptions } from './request-options';\nimport { createRequest } from './request';\n\nexport class Client<paths extends Api.PathsAbstract, UseExt extends Api.Ext.UseExt> {\n\n\treadonly options: Readonly<Api.ClientOptions>;\n\treadonly useExt: UseExt;\n\treadonly middlewares: Api.Middleware[] = [];\n\tprivate mokerByPath = new Map<Api.Path<paths>, Api.Mocker.Options<any, any>>();\n\tabortControllers: Record<string, AbortController> = {};\n\n\tconstructor(clientOptions: Partial<Api.ClientOptions> = {}, useExt: UseExt) {\n\t\tclientOptions.requestOptions = createRequestOptions(clientOptions.requestOptions);\n\t\tclientOptions.useApiConsole ??= true;\n\n\t\tclientOptions.fetch ??= globalThis.fetch;\n\t\tclientOptions.Request ??= globalThis.Request;\n\t\tclientOptions.querySerializer ??= async (params) => {\n\t\t\tconst { querySerializer } = await import('../utils/lazy');\n\n\t\t\treturn querySerializer(params);\n\t\t};\n\t\tclientOptions.bodySerializer ??= (body) => typeof body === 'string' ? body : JSON.stringify(body);\n\n\t\tthis.options = clientOptions as Api.ClientOptions;\n\n\t\tthis.useExt = useExt;\n\t}\n\n\tgenerateUUID() {\n\t\tif (crypto?.randomUUID) {\n\t\t\treturn crypto.randomUUID();\n\t\t}\n\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n\t\t\tconst r = Math.random() * 16 | 0;\n\t\t\tconst v = c === 'x' ? r : (r & 0x3 | 0x8);\n\t\t\treturn v.toString(16);\n\t\t});\n\t}\n\n\t/**\n\t * Зарегистрировать middleware\n\t */\n\tuse(middleware: Api.Middleware) {\n\t\tthis.middlewares.push(middleware);\n\t}\n\n\t/**\n\t * Создать объект запроса\n\t *\n\t * После создания объекта он заполняется необходимыми данными и выполняет запросы к API с помощью APIRequest2.call();\n\t *\n\t * Опционально generic указывать нельзя, поэтому необходимо дублировать определение fetchStyle, [см.](https://github.com/Microsoft/TypeScript/issues/26242)\n\t *\n\t * @param path Путь метода API\n\t * @param fieldsNarrow Список получаемых полей, для методов API с моделью. Если объект запроса переиспользуется, и список полей меняется, указывайте его непосредственно при вызове `api.call()`\n\t */\n\tgen<\n\t\tPath extends Api.Path<paths>,\n\t\tFieldsNarrow extends Api.ParamsFields<Api.ClientRequestContext<paths, Path, UseExt>>\n\t>(\n\t\tpath: Path,\n\t\tfieldsNarrow?: FieldsNarrow,\n\t): Api.ClientRequest<Api.ClientRequestContext<paths, Path, UseExt>, FieldsNarrow> {\n\t\ttype RequestContext = Api.ClientRequestContext<paths, Path, UseExt>;\n\n\t\treturn createRequest<RequestContext, FieldsNarrow>(this, path, fieldsNarrow);\n\t}\n\n\t/**\n\t * Создать объект запроса, не описанного в OpenAPI\n\t */\n\tgenAny<\n\t\tParams extends Record<string, any>,\n\t\tResult = any,\n\t\tFieldsNarrow extends Api.Ext.Schemas['Fields'] | undefined = undefined\n\t>(path: Api.PathAbstract, fieldsNarrow?: FieldsNarrow): Api.ClientRequestCustom<UseExt, Params, Result> {\n\t\treturn this.gen(path as any, fieldsNarrow as any) as unknown as Api.ClientRequestCustom<UseExt, Params, Result>;\n\t}\n\n\t/**\n\t * Создать контекст выполнения запроса\n\t */\n\tgenMiddlewareCtx(\n\t\tclientRequest: Api.ClientRequest<any, any, any>,\n\t\tdata: Record<string, any>,\n\t): Omit<Api.MiddlewareCallbackParams, 'request'> {\n\t\tconst id = this.generateUUID();\n\n\t\tconst options: Api.BaseOptions = Object.freeze({\n\t\t\tbaseUrl: this.options.baseUrl,\n\t\t\tquerySerializer: this.options.querySerializer,\n\t\t\tbodySerializer: this.options.bodySerializer,\n\t\t\tRequest: this.options.Request,\n\t\t\tfetch: this.options.fetch,\n\t\t});\n\n\t\treturn {\n\t\t\tuseExt: this.useExt,\n\t\t\trequestOptions: clientRequest.options,\n\t\t\tdata,\n\t\t\tmiddlewareData: {},\n\t\t\toptions,\n\t\t\tschemaPath: clientRequest.path,\n\t\t\tid,\n\t\t};\n\t};\n\n\t/**\n\t * Обработчик middleware.onRequest\n\t *\n\t * @param request Запрос для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Request` или `Response` при модификации запроса, или undefined\n\t */\n\tasync middlewareOnRequest(\n\t\trequest: Request,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Request | Response | undefined> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onRequest?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Request) {\n\t\t\t\t\trequest = result;\n\t\t\t\t} else if (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('onRequest: must return new Request() or Response() when modifying the request');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn request;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param `error` Ошибка, переданная для обработки\n\t * @param middlewareCtx\n\t * @return Новый экземпляр `Response` при успешной обработке или выбрасывает ошибку\n\t */\n\tasync middlewareOnError(\n\t\terror: Error | unknown,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response | never> {\n\t\tlet errorAfterMiddleware = error;\n\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onError?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\terror: errorAfterMiddleware,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (result instanceof Response) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result instanceof Error) {\n\t\t\t\t\terrorAfterMiddleware = result;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthrow new Error('onError: must return new Response() or instance of Error');\n\t\t\t}\n\t\t}\n\n\t\tthrow errorAfterMiddleware;\n\t}\n\n\t/**\n\t * Обработчик middleware.onResponse\n\t *\n\t * @param response Ответ для обработки\n\t * @param middlewareCtx Контекст выполнения запроса\n\t * @return Новый экземпляр `Response` при модификации ответа, или undefined\n\t */\n\tasync middlewareOnResponse(\n\t\tresponse: Response,\n\t\tmiddlewareCtx: Api.MiddlewareCallbackParams,\n\t): Promise<Response> {\n\t\tfor (const middleware of this.middlewares) {\n\t\t\tconst result = await middleware.onResponse?.({\n\t\t\t\t...middlewareCtx,\n\t\t\t\tresponse,\n\t\t\t});\n\n\t\t\tif (result) {\n\t\t\t\tif (!(result instanceof Response)) {\n\t\t\t\t\tthrow new Error('onResponse: must return new Response() when modifying the response');\n\t\t\t\t}\n\n\t\t\t\tresponse = result;\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Установить генератор данных вместо реальных запросов к серверу для конкретного метода API\n\t */\n\tsetMocker<\n\t\tResult extends Api.Mocker.Result = Api.Mocker.Result,\n\t\tParams extends Api.Mocker.Params = Api.Mocker.Params\n\t>(\n\t\tpath: Api.Path<paths>,\n\t\tmocker: Api.Mocker.Options<Result, Params>,\n\t) {\n\t\tthis.mokerByPath.set(path, mocker);\n\n\t\t// @ts-ignore\n\t\tif (!this.genOriginal) {\n\t\t\t// @ts-ignore\n\t\t\tthis.genOriginal = this.gen.bind(this);\n\n\t\t\tthis.gen = (_path, fieldsNarrow) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst api = this.genOriginal(_path, fieldsNarrow);\n\n\t\t\t\tconst mocker = this.mokerByPath.get(_path);\n\t\t\t\tif (mocker) {\n\t\t\t\t\tapi.setMocker(mocker);\n\t\t\t\t}\n\n\t\t\t\treturn api;\n\t\t\t};\n\t\t}\n\t}\n\n}\n","import { Client } from './client/client';\n\nexport * from './utils/field';\nexport * from './utils/common';\n\nexport const postInWindow: typeof import('./utils/lazy').postInWindow = async (...args) => {\n\tconst { postInWindow } = await import('./utils/lazy');\n\n\treturn postInWindow(...args);\n};\n\nexport const dataToForm: typeof import('./utils/lazy').dataToForm = async (...args) => {\n\tconst { dataToForm } = await import('./utils/lazy');\n\n\treturn dataToForm(...args);\n};\n\n/**\n * Создать API клиент\n *\n * @see Api.Ext.UseExt\n */\nexport const createClient = <\n\tpaths extends Api.PathsAbstract,\n\tUseExt extends Api.Ext.UseExt\n>(\n\tclientOptions: Partial<Api.ClientOptions> = {},\n\tuseExt: UseExt,\n) => {\n\treturn new Client<paths, UseExt>(clientOptions, useExt);\n};\n"],"names":["createRequestOptions","requestOptions","genExtRes","result","errors","response","isPublicAPI","path","getBaseDomainUrl","useMainDomain","input","subdomain","protocol","hostname","port","parts","baseHostname","checkHasFiles","data","value","item","createRequest","client","fieldsNarrow","clientRequest","params","options","fields","fetchStyle","middlewareCtx","postInWindow","post","fieldsPrepared","field","fingerprint","controller","Request","fetch","middlewareCtxWithoutRequest","hasFiles","url","requestInitBody","formDataSerializer","requestInitSignal","genMockResponse","requestInit","request","requestOrResponse","e","res","responseText","formatError","isJSON","errorCode","errorMessage","Client","clientOptions","useExt","querySerializer","body","c","r","middleware","id","error","errorAfterMiddleware","mocker","_path","api","args","dataToForm","createClient"],"mappings":"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"}
@@ -1 +1 @@
1
- .top-competitorSelector_opener.top-button{width:100%}.top-select-searcher_key[data-value="0"]:after,.top-select-searcher_key[data-value="20"]:after,.top-select-searcher_key[data-value="21"]:after{color:red}.top-select-searcher_key[data-value="1"]:after{color:var(--color-bg-primary-2)}.top-select-searcher_key[data-value="2"]:after{color:#005ff9}.top-select-searcher_key[data-value="3"]:after{color:#01509b}.top-select-searcher_key[data-value="4"]:after{color:red}.top-select-searcher_key[data-value="5"]:after{color:#008373}.top-select-searcher_key[data-value="6"]:after{color:#4800b5}.top-select-searcher_key[data-value="7"]:after{color:#c00}.top-select-searcher_key[data-value="8"]:after{color:#1badf8}.top-select-searcher_key[data-value="9"]:after{color:#00ceff}.top-regionSelector{width:340px;display:inline-flex;vertical-align:middle}.top-regionSelector>.top-select{flex-grow:1}.top-regionSelector>.top-select:focus-within{z-index:4}.top-regionSelector>.top-select>.top-select_select:hover,.top-regionSelector>.top-select>.top-select_select.top-error{z-index:1}.top-regionSelector>.top-select-searcher_key{width:140px;max-width:160px;margin-right:-1px}.top-regionSelector>.top-select-region>select{border-top-left-radius:0;border-bottom-left-radius:0}.top-regionSelector>.top-select-region{--top-icon-size: 20px;--top-icon-color: var(--color-text-primary);--top-icon2-size: 20px;--top-icon2-color: var(--color-text-primary)}.top-regionSelector>.top-select-region[data-top-icon][data-top-icon2]{--top-icon2-size: 16px}.top-regionSelector>.top-select-region[data-top-icon][data-top-icon2]:after{text-indent:-4px}.top-regionSelector>[name=compare]{border-top-left-radius:0;border-bottom-left-radius:0;flex-grow:1}.top-regionSelector>[name=compare]:after{content:"(" attr(data-count-compare-regions-indexes) ")";margin:0 0 0 6px}.top-regionSelector:not(.top-regionSelector-onlySearcher)>.top-select-searcher_key>select{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0}.top-regionSelector:not(.top-regionSelector-onlySearcher)>.top-select-searcher_key[data-value="-1"]>select{border-right:none}.top-regionSelector-onlySearcher{width:140px}.top-groupSelector_groupItem{display:flex;flex-direction:column;gap:var(--top-padding-1)}.top-groupSelector_groupItemFolderPath{width:100%;color:var(--color-text-4);font-size:12px}.top-groupSelector{display:inline-flex;gap:var(--top-padding-1)}[data-tag_id]{display:inline-flex;gap:var(--top-gap-2);align-items:center}[data-tag_id=""]{border-color:#bdc3c7!important;color:#55555f!important}[data-tag_color_id="1"]{border-color:var(--color-tag-1)!important;color:#55555f!important}[data-tag_color_id="2"]{border-color:var(--color-tag-2)!important;color:var(--color-tag-2)!important}[data-tag_color_id="3"]{border-color:var(--color-tag-3)!important;color:var(--color-tag-3)!important}[data-tag_color_id="4"]{border-color:var(--color-tag-4)!important;color:var(--color-tag-4)!important}[data-tag_color_id="5"]{border-color:var(--color-tag-5)!important;color:var(--color-tag-5)!important}[data-tag_color_id="6"]{border-color:var(--color-tag-6)!important;color:var(--color-tag-6)!important}[data-tag_color_id="7"]{border-color:var(--color-tag-7)!important;color:var(--color-tag-7)!important}[data-tag_color_id="8"]{border-color:var(--color-tag-8)!important;color:var(--color-tag-8)!important}[data-tag_color_id="9"]{border-color:var(--color-tag-9)!important;color:var(--color-tag-9)!important}[data-tag_color_id="10"]{border-color:var(--color-tag-10)!important;color:var(--color-tag-10)!important}[data-tag_id=""].top-tagSelector-active{background:#bdc3c7!important}[data-tag_color_id="1"].top-tagSelector-active{background:var(--color-tag-1)!important}[data-tag_color_id="2"].top-tagSelector-active{background:var(--color-tag-2)!important}[data-tag_color_id="3"].top-tagSelector-active{background:var(--color-tag-3)!important}[data-tag_color_id="4"].top-tagSelector-active{background:var(--color-tag-4)!important}[data-tag_color_id="5"].top-tagSelector-active{background:var(--color-tag-5)!important}[data-tag_color_id="6"].top-tagSelector-active{background:var(--color-tag-6)!important}[data-tag_color_id="7"].top-tagSelector-active{background:var(--color-tag-7)!important}[data-tag_color_id="8"].top-tagSelector-active{background:var(--color-tag-8)!important}[data-tag_color_id="9"].top-tagSelector-active{background:var(--color-tag-9)!important}[data-tag_color_id="10"].top-tagSelector-active{background:var(--color-tag-10)!important}[data-tag_id=all]{border-color:transparent!important;background:none!important}[data-tag_id=all]:before{content:"";color:var(--color-tag-all)!important;font-size:26px;min-width:calc(100% + 4px);height:calc(100% + 4px);margin-top:-18px;margin-left:-8px}.top-tagSelector-useTopButton [data-tag_id],.top-tagSelector_popup [data-tag_id]{--top-tag-selector-size: 10px;box-sizing:content-box;border-radius:100%;border:2px solid var(--color-layout-front-1);background:var(--color-layout-front-1);width:var(--top-tag-selector-size);height:var(--top-tag-selector-size);font-size:calc(var(--top-tag-selector-size) + 4px)}.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],[data-tag_id].top-tagSelector-excluded{position:relative}.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,[data-tag_id].top-tagSelector-excluded:before{content:"";width:calc(var(--top-tag-selector-size) * 2);height:1px;background:inherit;transform:rotate(-45deg);filter:brightness(80%);display:block;position:absolute;top:calc(var(--top-tag-selector-size) / 2);left:calc(0px - var(--top-tag-selector-size) / 2)}.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=all]):not(.top-tagSelector-active):before{background:#aaa}[data-tag_id].top-tagSelector-excluded:after,[data-tag_id].top-tagSelector-excluded~.top-tagSelector_tagListItemName{text-decoration:line-through}.top-popup_listItem.top-tagSelector-active{background:var(--top-popup-background-color-active)!important}.top-popup_listItem:hover [data-tag_id=all]:before{border-color:var(--top-popup-background-color-hover)}.top-popup_listItem.top-tagSelector-active [data-tag_id=all]:before,.top-popup_listItem.top-active [data-tag_id=all]:before{border-color:var(--top-popup-background-color-active)}.top-tagSelector_tagListItem.top-popup_listItem{padding-top:var(--top-padding-2)!important;padding-bottom:var(--top-padding-2)!important;gap:10px}.top-tagSelector_tagListItemName{border-radius:var(--top-radius-1);width:120px;padding:4px 2px;margin:-4px -2px;text-overflow:ellipsis;overflow:hidden;flex-grow:1}.top-tagSelector_edit{--top-icon-size: 18px;--top-icon-color: var(--color-text-3);width:20px;flex-grow:0}.top-tagSelector_edit:before{line-height:0}.top-tagSelector_edit{opacity:0}.top-tagSelector_edit:hover{--top-icon-color: var(--color-text-primary)}.top-tagSelector_tagListItem:hover .top-tagSelector_edit,.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit{cursor:pointer;opacity:1}.top-tagSelector_tagListItem-inEdit{background:var(--color-layout-front-3)!important;outline:1px dashed var(--color-line-2);outline-offset:-1px}.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName{cursor:text;background:var(--color-layout-front-1)}.top-tagSelector_tagListItem-disabled{cursor:not-allowed!important;opacity:.85}.top-tagSelector_tagListItem-disabled:hover{background:inherit}.top-tagSelector_tagListItem-disabled [data-tag_id]{opacity:.6}.top-tagSelector{cursor:pointer;min-width:0;white-space:nowrap;justify-content:left}.top-tagSelector-useTopButton{width:112px;gap:var(--top-gap-1);vertical-align:middle}.top-tagSelector.top-button.top-as-selector{width:120px}.top-tagSelector-useTopButton [data-tag_id=all]:before{margin-right:6px}.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id]:after{content:attr(title);margin-left:20px;min-width:74px;text-align:left;line-height:1.2;text-overflow:ellipsis;overflow:hidden}.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id=all]:after{margin-left:0}.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine{flex-wrap:wrap;align-content:center}.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]{--top-tag-selector-size: 8px}.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]:nth-child(5){margin-right:5px}.top-tagSelector-useTopButton.top-tagSelector-setter_several,.top-tagSelector-useTopButton.top-tagSelector-setter_several.top-as-selector{width:auto}.top-tagSelector-custom{position:relative;display:flex!important;flex-direction:column;flex-wrap:wrap;align-items:stretch!important}.top-tagSelector-custom [data-tag_id]{width:auto;min-height:20%;min-width:50%;flex:1 1 auto}.top-tagSelector_popup .top-popup{-webkit-user-select:none;user-select:none;min-width:220px!important;text-align:left}.top-tagSelector_popup .top-popup_header .top-select{flex-grow:1}
1
+ .top-competitorSelector_opener.top-button{width:100%}.top-select-searcher_key[data-value="0"]:after,.top-select-searcher_key[data-value="20"]:after,.top-select-searcher_key[data-value="21"]:after{color:red}.top-select-searcher_key[data-value="1"]:after{color:var(--color-bg-primary-2)}.top-select-searcher_key[data-value="2"]:after{color:#005ff9}.top-select-searcher_key[data-value="3"]:after{color:#01509b}.top-select-searcher_key[data-value="4"]:after{color:red}.top-select-searcher_key[data-value="5"]:after{color:#008373}.top-select-searcher_key[data-value="6"]:after{color:#4800b5}.top-select-searcher_key[data-value="7"]:after{color:#c00}.top-select-searcher_key[data-value="8"]:after{color:#1badf8}.top-select-searcher_key[data-value="9"]:after{color:#00ceff}.top-selectorRegion{width:340px;display:inline-flex;vertical-align:middle}.top-selectorRegion>.top-select{flex-grow:1}.top-selectorRegion>.top-select:focus-within{z-index:4}.top-selectorRegion>.top-select>.top-select_select:hover,.top-selectorRegion>.top-select>.top-select_select.top-error{z-index:1}.top-selectorRegion>.top-select-searcher_key{width:140px;max-width:160px;margin-right:-1px}.top-selectorRegion>.top-select-region>select{border-top-left-radius:0;border-bottom-left-radius:0}.top-selectorRegion>.top-select-region{--top-icon-size: 20px;--top-icon-color: var(--color-text-primary);--top-icon2-size: 20px;--top-icon2-color: var(--color-text-primary)}.top-selectorRegion>.top-select-region[data-top-icon][data-top-icon2]{--top-icon2-size: 16px}.top-selectorRegion>.top-select-region[data-top-icon][data-top-icon2]:after{text-indent:-4px}.top-selectorRegion>[name=compare]{border-top-left-radius:0;border-bottom-left-radius:0;flex-grow:1}.top-selectorRegion>[name=compare]:after{content:"(" attr(data-count-compare-regions-indexes) ")";margin:0 0 0 6px}.top-selectorRegion:not(.top-selectorRegion-onlySearcher)>.top-select-searcher_key>select{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0}.top-selectorRegion:not(.top-selectorRegion-onlySearcher)>.top-select-searcher_key[data-value="-1"]>select{border-right:none}.top-selectorRegion-onlySearcher{width:140px}.top-groupSelector_groupItem{display:flex;flex-direction:column;gap:var(--top-padding-1)}.top-groupSelector_groupItemFolderPath{width:100%;color:var(--color-text-4);font-size:12px}.top-groupSelector{display:inline-flex;gap:var(--top-padding-1)}[data-tag_id]{display:inline-flex;gap:var(--top-gap-2);align-items:center}[data-tag_id=""]{border-color:#bdc3c7!important;color:#55555f!important}[data-tag_color_id="1"]{border-color:var(--color-tag-1)!important;color:#55555f!important}[data-tag_color_id="2"]{border-color:var(--color-tag-2)!important;color:var(--color-tag-2)!important}[data-tag_color_id="3"]{border-color:var(--color-tag-3)!important;color:var(--color-tag-3)!important}[data-tag_color_id="4"]{border-color:var(--color-tag-4)!important;color:var(--color-tag-4)!important}[data-tag_color_id="5"]{border-color:var(--color-tag-5)!important;color:var(--color-tag-5)!important}[data-tag_color_id="6"]{border-color:var(--color-tag-6)!important;color:var(--color-tag-6)!important}[data-tag_color_id="7"]{border-color:var(--color-tag-7)!important;color:var(--color-tag-7)!important}[data-tag_color_id="8"]{border-color:var(--color-tag-8)!important;color:var(--color-tag-8)!important}[data-tag_color_id="9"]{border-color:var(--color-tag-9)!important;color:var(--color-tag-9)!important}[data-tag_color_id="10"]{border-color:var(--color-tag-10)!important;color:var(--color-tag-10)!important}[data-tag_id=""].top-tagSelector-active{background:#bdc3c7!important}[data-tag_color_id="1"].top-tagSelector-active{background:var(--color-tag-1)!important}[data-tag_color_id="2"].top-tagSelector-active{background:var(--color-tag-2)!important}[data-tag_color_id="3"].top-tagSelector-active{background:var(--color-tag-3)!important}[data-tag_color_id="4"].top-tagSelector-active{background:var(--color-tag-4)!important}[data-tag_color_id="5"].top-tagSelector-active{background:var(--color-tag-5)!important}[data-tag_color_id="6"].top-tagSelector-active{background:var(--color-tag-6)!important}[data-tag_color_id="7"].top-tagSelector-active{background:var(--color-tag-7)!important}[data-tag_color_id="8"].top-tagSelector-active{background:var(--color-tag-8)!important}[data-tag_color_id="9"].top-tagSelector-active{background:var(--color-tag-9)!important}[data-tag_color_id="10"].top-tagSelector-active{background:var(--color-tag-10)!important}[data-tag_id=all]{border-color:transparent!important;background:none!important}[data-tag_id=all]:before{content:"";color:var(--color-tag-all)!important;font-size:26px;min-width:calc(100% + 4px);height:calc(100% + 4px);margin-top:-18px;margin-left:-8px}.top-tagSelector-useTopButton [data-tag_id],.top-tagSelector_popup [data-tag_id]{--top-tag-selector-size: 10px;box-sizing:content-box;border-radius:100%;border:2px solid var(--color-layout-front-1);background:var(--color-layout-front-1);width:var(--top-tag-selector-size);height:var(--top-tag-selector-size);font-size:calc(var(--top-tag-selector-size) + 4px)}.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id],[data-tag_id].top-tagSelector-excluded{position:relative}.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:before,[data-tag_id].top-tagSelector-excluded:before{content:"";width:calc(var(--top-tag-selector-size) * 2);height:1px;background:inherit;transform:rotate(-45deg);filter:brightness(80%);display:block;position:absolute;top:calc(var(--top-tag-selector-size) / 2);left:calc(0px - var(--top-tag-selector-size) / 2)}.top-body-press_ctrl .top-tagSelector_tagListItem-canExclude:hover [data-tag_id]:not([data-tag_id=all]):not(.top-tagSelector-active):before{background:#aaa}[data-tag_id].top-tagSelector-excluded:after,[data-tag_id].top-tagSelector-excluded~.top-tagSelector_tagListItemName{text-decoration:line-through}.top-popup_listItem.top-tagSelector-active{background:var(--top-popup-background-color-active)!important}.top-popup_listItem:hover [data-tag_id=all]:before{border-color:var(--top-popup-background-color-hover)}.top-popup_listItem.top-tagSelector-active [data-tag_id=all]:before,.top-popup_listItem.top-active [data-tag_id=all]:before{border-color:var(--top-popup-background-color-active)}.top-tagSelector_tagListItem.top-popup_listItem{padding-top:var(--top-padding-2)!important;padding-bottom:var(--top-padding-2)!important;gap:10px}.top-tagSelector_tagListItemName{border-radius:var(--top-radius-1);width:120px;padding:4px 2px;margin:-4px -2px;text-overflow:ellipsis;overflow:hidden;flex-grow:1}.top-tagSelector_edit{--top-icon-size: 18px;--top-icon-color: var(--color-text-3);width:20px;flex-grow:0}.top-tagSelector_edit:before{line-height:0}.top-tagSelector_edit{opacity:0}.top-tagSelector_edit:hover{--top-icon-color: var(--color-text-primary)}.top-tagSelector_tagListItem:hover .top-tagSelector_edit,.top-tagSelector_tagListItem-inEdit .top-tagSelector_edit{cursor:pointer;opacity:1}.top-tagSelector_tagListItem-inEdit{background:var(--color-layout-front-3)!important;outline:1px dashed var(--color-line-2);outline-offset:-1px}.top-tagSelector_tagListItem-inEdit .top-tagSelector_tagListItemName{cursor:text;background:var(--color-layout-front-1)}.top-tagSelector_tagListItem-disabled{cursor:not-allowed!important;opacity:.85}.top-tagSelector_tagListItem-disabled:hover{background:inherit}.top-tagSelector_tagListItem-disabled [data-tag_id]{opacity:.6}.top-tagSelector{cursor:pointer;min-width:0;white-space:nowrap;justify-content:left}.top-tagSelector-useTopButton{width:112px;gap:var(--top-gap-1);vertical-align:middle}.top-tagSelector.top-button.top-as-selector{width:120px}.top-tagSelector-useTopButton [data-tag_id=all]:before{margin-right:6px}.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id]:after{content:attr(title);margin-left:20px;min-width:74px;text-align:left;line-height:1.2;text-overflow:ellipsis;overflow:hidden}.top-tagSelector-useTopButton.top-tagSelector-selectedOne [data-tag_id=all]:after{margin-left:0}.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine{flex-wrap:wrap;align-content:center}.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]{--top-tag-selector-size: 8px}.top-button.top-tagSelector-useTopButton.top-tagSelector-toTwoLine [data-tag_id]:nth-child(5){margin-right:5px}.top-tagSelector-useTopButton.top-tagSelector-setter_several,.top-tagSelector-useTopButton.top-tagSelector-setter_several.top-as-selector{width:auto}.top-tagSelector-custom{position:relative;display:flex!important;flex-direction:column;flex-wrap:wrap;align-items:stretch!important}.top-tagSelector-custom [data-tag_id]{width:auto;min-height:20%;min-width:50%;flex:1 1 auto}.top-tagSelector_popup .top-popup{-webkit-user-select:none;user-select:none;min-width:220px!important;text-align:left}.top-tagSelector_popup .top-popup_header .top-select{flex-grow:1}
@@ -1,2 +1,2 @@
1
- define(["require","exports","vue","../.chunks/forms--2-YQeWM.amd","../.chunks/policy.vue_vue_type_style_index_0_lang-BUIBGweg.amd"],(function(N,d,e,m,f){"use strict";if(typeof e>"u")var e=window.Vue;const y={class:"top-editArea_footer"},k=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(t,{emit:o}){const l=t,i=o,n=e.ref(l.defaultValue),r=e.ref(l.isFocused),s=e.computed(()=>n.value!==l.defaultValue),a=p=>{i("submit",p),n.value=l.defaultValue},c=()=>{if(l.forceShowCloseBtn&&!s.value){i("close");return}n.value=l.defaultValue},z=()=>{l.attachToKeyboard&&i("clickOnTitle")};return(p,u)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":t.attachToKeyboard})},[t.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:u[0]||(u[0]=v=>z())},e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-forms-focusable":!0,"top-as-input":!0,"top-error":t.isError,"top-focus":r.value})},[e.createVNode(m._sfc_main$3,{modelValue:n.value,"onUpdate:modelValue":u[1]||(u[1]=v=>n.value=v),name:t.name,placeholder:t.placeholder,rows:t.rows,minHeight:t.minHeight,expandable:t.expandable,disabled:t.disabled,readonly:t.readonly,isError:t.isError,hint:t.hint,class:"top-editArea_element",onFocus:u[2]||(u[2]=()=>r.value=!0),onBlur:u[3]||(u[3]=()=>r.value=!1),onKeyup:[e.withKeys(c,["esc"]),u[4]||(u[4]=e.withKeys(e.withModifiers(v=>a(n.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",y,[s.value||t.forceShowCloseBtn?(e.openBlock(),e.createBlock(m._sfc_main$1,{key:0,icon:p.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:c},e.createSlots({_:2},[p.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createBlock(m._sfc_main$1,{key:1,class:"top-editArea_button",icon:p.$core.state.isMobile?"":"",onClick:u[5]||(u[5]=v=>a(n.value))},e.createSlots({_:2},[p.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),B={class:"top-editInput"},h=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(t,{emit:o}){const l=t,i=e.ref(l.modelValue);e.watch(e.toRef(l.modelValue),()=>{i.value=l.modelValue});const n=o,r=()=>{n("update:modelValue",i.value)};return(s,a)=>(e.openBlock(),e.createElementBlock("div",B,[e.createVNode(m._sfc_main,e.mergeProps(t.input,{onKeydownCapture:a[0]||(a[0]=e.withKeys(e.withModifiers(c=>i.value=t.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(r,["stop"]),["enter"]),modelValue:i.value,"onUpdate:modelValue":a[1]||(a[1]=c=>i.value=c)}),null,16,["onKeydown","modelValue"]),i.value!==t.modelValue?(e.openBlock(),e.createBlock(m._sfc_main$1,e.mergeProps({key:0,icon:"",styling:"soft"},t.button,{onClick:r}),null,16)):e.createCommentVNode("",!0)]))}}),V=e.defineComponent({__name:"optionGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),l=t,i=e.ref(null);e.watch(o,()=>{const r=l.items.map(s=>s.value);Array.isArray(o.value)?o.value.find(a=>!r.includes(a))&&(o.value=o.value.filter(a=>r.includes(a))):r.includes(o.value)||(o.value=r[0]??""),i.value?.querySelector(".radioGroup_item-selected")?.scrollIntoView()},{immediate:!0});const n="optionGroup-"+Math.random();return(r,s)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:i,class:e.normalizeClass({"top-optionGroup":!0,["top-optionGroup-showIndicator_"+Number(t.showIndicator)]:!0,"top-scrollBarXHidding":!0,["top-size_"+t.size]:!!t.size,"top-error":t.isError})},[Array.isArray(o.value)?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(t.items,a=>(e.openBlock(),e.createBlock(m._sfc_main$4,{class:e.normalizeClass({"top-optionGroup_item-selected":o.value.includes(a.value),"top-optionGroup_item":!0}),modelValue:o.value,"onUpdate:modelValue":s[0]||(s[0]=c=>o.value=c),value:a.value,title:a.title,disabled:a.disabled,isError:t.isError,"data-top-icon":a.icon},e.createSlots({_:2},[a.label?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.label),1)]),key:"0"}:void 0]),1032,["class","modelValue","value","title","disabled","isError","data-top-icon"]))),256)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(t.items,a=>(e.openBlock(),e.createBlock(m._sfc_main$5,{class:e.normalizeClass({"top-optionGroup_item-selected":a.value===o.value,"top-optionGroup_item":!0}),modelValue:o.value,"onUpdate:modelValue":s[1]||(s[1]=c=>o.value=c),name:n,value:a.value,title:a.title,disabled:a.disabled,isError:t.isError,"data-top-icon":a.icon},e.createSlots({_:2},[a.label?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.label),1)]),key:"0"}:void 0]),1032,["class","modelValue","value","title","disabled","isError","data-top-icon"]))),256))],2))}}),b=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},items:{},size:{},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue");return(l,i)=>(e.openBlock(),e.createBlock(V,{class:"top-radioGroup",modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=n=>o.value=n),items:l.$props.items,size:l.$props.size,showIndicator:l.$props.showIndicator,isError:l.$props.isError},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},8,["modelValue","items","size","showIndicator","isError"]))}}),E=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue");return(l,i)=>(e.openBlock(),e.createBlock(V,{class:"top-checkboxGroup",modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=n=>o.value=n),items:l.$props.items,size:l.$props.size,showIndicator:l.$props.showIndicator,isError:l.$props.isError},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},8,["modelValue","items","size","showIndicator","isError"]))}}),w=["data-top-icon"],$={class:"top-info_text"},C={key:0,class:"top-info_value"},T=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(t){return(o,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+t.size]:!0,["top-info-styling_"+t.styling]:!0}),"data-top-icon":t.icon},[e.createElementVNode("div",$,[e.renderSlot(o.$slots,"default")]),o.$slots.additional?(e.openBlock(),e.createElementBlock("span",C,[e.renderSlot(o.$slots,"additional")])):e.createCommentVNode("",!0)],10,w))}}),g={key:0,class:"top-policy"},S={class:"top-policy_title"},I=["innerHTML"],M=e.defineComponent({__name:"policy",props:{title:{},description:{},acceptText:{}},emits:["accept"],setup(t,{emit:o}){const l=o,i=e.ref(!0),n=()=>{i.value=!1,l("accept")};return(r,s)=>i.value?(e.openBlock(),e.createElementBlock("div",g,[e.createElementVNode("div",S,e.toDisplayString(t.title),1),e.createElementVNode("div",{class:"top-policy_description",innerHTML:t.description},null,8,I),e.createVNode(e.unref(m._sfc_main$1),{size:"m",onClick:n},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.acceptText),1)]),_:1})])):e.createCommentVNode("",!0)}});d.ITEM_ID_ALL=f.ITEM_ID_ALL,d.ITEM_ID_NEW=f.ITEM_ID_NEW,d.TopMenu=f._sfc_main$1,d.TopSelector2=f._sfc_main,d.apiSetSearchParamsFilter=f.apiSetSearchParamsFilter,d.TopCheckboxGroup=E,d.TopEditArea=k,d.TopEditInput=h,d.TopInfo=T,d.TopPolicy=M,d.TopRadioGroup=b,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
1
+ define(["require","exports","vue","../.chunks/forms--2-YQeWM.amd","../.chunks/policy.vue_vue_type_style_index_0_lang-BfL6Mj6K.amd"],(function(N,d,e,m,f){"use strict";if(typeof e>"u")var e=window.Vue;const y={class:"top-editArea_footer"},k=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(t,{emit:o}){const l=t,i=o,n=e.ref(l.defaultValue),r=e.ref(l.isFocused),s=e.computed(()=>n.value!==l.defaultValue),a=p=>{i("submit",p),n.value=l.defaultValue},c=()=>{if(l.forceShowCloseBtn&&!s.value){i("close");return}n.value=l.defaultValue},z=()=>{l.attachToKeyboard&&i("clickOnTitle")};return(p,u)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":t.attachToKeyboard})},[t.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:u[0]||(u[0]=v=>z())},e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-forms-focusable":!0,"top-as-input":!0,"top-error":t.isError,"top-focus":r.value})},[e.createVNode(m._sfc_main$3,{modelValue:n.value,"onUpdate:modelValue":u[1]||(u[1]=v=>n.value=v),name:t.name,placeholder:t.placeholder,rows:t.rows,minHeight:t.minHeight,expandable:t.expandable,disabled:t.disabled,readonly:t.readonly,isError:t.isError,hint:t.hint,class:"top-editArea_element",onFocus:u[2]||(u[2]=()=>r.value=!0),onBlur:u[3]||(u[3]=()=>r.value=!1),onKeyup:[e.withKeys(c,["esc"]),u[4]||(u[4]=e.withKeys(e.withModifiers(v=>a(n.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",y,[s.value||t.forceShowCloseBtn?(e.openBlock(),e.createBlock(m._sfc_main$1,{key:0,icon:p.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:c},e.createSlots({_:2},[p.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createBlock(m._sfc_main$1,{key:1,class:"top-editArea_button",icon:p.$core.state.isMobile?"":"",onClick:u[5]||(u[5]=v=>a(n.value))},e.createSlots({_:2},[p.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),B={class:"top-editInput"},h=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(t,{emit:o}){const l=t,i=e.ref(l.modelValue);e.watch(e.toRef(l.modelValue),()=>{i.value=l.modelValue});const n=o,r=()=>{n("update:modelValue",i.value)};return(s,a)=>(e.openBlock(),e.createElementBlock("div",B,[e.createVNode(m._sfc_main,e.mergeProps(t.input,{onKeydownCapture:a[0]||(a[0]=e.withKeys(e.withModifiers(c=>i.value=t.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(r,["stop"]),["enter"]),modelValue:i.value,"onUpdate:modelValue":a[1]||(a[1]=c=>i.value=c)}),null,16,["onKeydown","modelValue"]),i.value!==t.modelValue?(e.openBlock(),e.createBlock(m._sfc_main$1,e.mergeProps({key:0,icon:"",styling:"soft"},t.button,{onClick:r}),null,16)):e.createCommentVNode("",!0)]))}}),V=e.defineComponent({__name:"optionGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),l=t,i=e.ref(null);e.watch(o,()=>{const r=l.items.map(s=>s.value);Array.isArray(o.value)?o.value.find(a=>!r.includes(a))&&(o.value=o.value.filter(a=>r.includes(a))):r.includes(o.value)||(o.value=r[0]??""),i.value?.querySelector(".radioGroup_item-selected")?.scrollIntoView()},{immediate:!0});const n="optionGroup-"+Math.random();return(r,s)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:i,class:e.normalizeClass({"top-optionGroup":!0,["top-optionGroup-showIndicator_"+Number(t.showIndicator)]:!0,"top-scrollBarXHidding":!0,["top-size_"+t.size]:!!t.size,"top-error":t.isError})},[Array.isArray(o.value)?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(t.items,a=>(e.openBlock(),e.createBlock(m._sfc_main$4,{class:e.normalizeClass({"top-optionGroup_item-selected":o.value.includes(a.value),"top-optionGroup_item":!0}),modelValue:o.value,"onUpdate:modelValue":s[0]||(s[0]=c=>o.value=c),value:a.value,title:a.title,disabled:a.disabled,isError:t.isError,"data-top-icon":a.icon},e.createSlots({_:2},[a.label?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.label),1)]),key:"0"}:void 0]),1032,["class","modelValue","value","title","disabled","isError","data-top-icon"]))),256)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(t.items,a=>(e.openBlock(),e.createBlock(m._sfc_main$5,{class:e.normalizeClass({"top-optionGroup_item-selected":a.value===o.value,"top-optionGroup_item":!0}),modelValue:o.value,"onUpdate:modelValue":s[1]||(s[1]=c=>o.value=c),name:n,value:a.value,title:a.title,disabled:a.disabled,isError:t.isError,"data-top-icon":a.icon},e.createSlots({_:2},[a.label?{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.label),1)]),key:"0"}:void 0]),1032,["class","modelValue","value","title","disabled","isError","data-top-icon"]))),256))],2))}}),b=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},items:{},size:{},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue");return(l,i)=>(e.openBlock(),e.createBlock(V,{class:"top-radioGroup",modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=n=>o.value=n),items:l.$props.items,size:l.$props.size,showIndicator:l.$props.showIndicator,isError:l.$props.isError},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},8,["modelValue","items","size","showIndicator","isError"]))}}),E=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{},showIndicator:{type:Boolean},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue");return(l,i)=>(e.openBlock(),e.createBlock(V,{class:"top-checkboxGroup",modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=n=>o.value=n),items:l.$props.items,size:l.$props.size,showIndicator:l.$props.showIndicator,isError:l.$props.isError},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},8,["modelValue","items","size","showIndicator","isError"]))}}),w=["data-top-icon"],$={class:"top-info_text"},C={key:0,class:"top-info_value"},T=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(t){return(o,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+t.size]:!0,["top-info-styling_"+t.styling]:!0}),"data-top-icon":t.icon},[e.createElementVNode("div",$,[e.renderSlot(o.$slots,"default")]),o.$slots.additional?(e.openBlock(),e.createElementBlock("span",C,[e.renderSlot(o.$slots,"additional")])):e.createCommentVNode("",!0)],10,w))}}),g={key:0,class:"top-policy"},S={class:"top-policy_title"},I=["innerHTML"],M=e.defineComponent({__name:"policy",props:{title:{},description:{},acceptText:{}},emits:["accept"],setup(t,{emit:o}){const l=o,i=e.ref(!0),n=()=>{i.value=!1,l("accept")};return(r,s)=>i.value?(e.openBlock(),e.createElementBlock("div",g,[e.createElementVNode("div",S,e.toDisplayString(t.title),1),e.createElementVNode("div",{class:"top-policy_description",innerHTML:t.description},null,8,I),e.createVNode(e.unref(m._sfc_main$1),{size:"m",onClick:n},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.acceptText),1)]),_:1})])):e.createCommentVNode("",!0)}});d.ITEM_ID_ALL=f.ITEM_ID_ALL,d.ITEM_ID_NEW=f.ITEM_ID_NEW,d.TopMenu=f._sfc_main$1,d.TopSelector2=f._sfc_main,d.apiSetSearchParamsFilter=f.apiSetSearchParamsFilter,d.TopCheckboxGroup=E,d.TopEditArea=k,d.TopEditInput=h,d.TopInfo=T,d.TopPolicy=M,d.TopRadioGroup=b,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=formsExt.amd.js.map
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as v, ref as $, computed as F, createElementBlock as c, openBlock as s, normalizeClass as V, createCommentVNode as b, createElementVNode as h, toDisplayString as m, createVNode as z, withKeys as T, withModifiers as g, createBlock as p, createSlots as w, withCtx as f, createTextVNode as E, watch as x, toRef as L, mergeProps as M, mergeModels as A, useModel as C, Fragment as G, renderList as S, renderSlot as I, unref as N } from "vue";
2
2
  import { g as U, e as B, _ as q, h as R, j as D } from "../.chunks/forms-Cwv0JCi5.es.js";
3
- import { c as ne, I as ue, a as de, _ as ce, b as me } from "../.chunks/policy.vue_vue_type_style_index_0_lang-B61ZEDWr.es.js";
3
+ import { c as ne, I as ue, a as de, _ as ce, b as me } from "../.chunks/policy.vue_vue_type_style_index_0_lang-b4Vb3SlQ.es.js";
4
4
  const O = { class: "top-editArea_footer" }, ee = /* @__PURE__ */ v({
5
5
  __name: "editArea",
6
6
  props: {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@topvisor/ui",
3
3
  "private": false,
4
- "version": "1.4.0-TopGroupSelector.5",
4
+ "version": "1.4.0-TopGroupSelector.7",
5
5
  "type": "module",
6
6
  "description": "Topvisor UI-kit Vue",
7
7
  "author": "Topvisor",
@@ -1,2 +1,2 @@
1
- define(["require","exports","../.chunks/forms--2-YQeWM.amd","../utils/dom.amd"],(function(require,exports,forms,utils_dom){"use strict";if(typeof vue>"u")var vue=window.Vue;class Worker{static noClose=!1;static vueConnectors=new Map;static options={};static getPopup(t){return utils_dom.default.storage(t,"TopPopup")}static getElPopupOpener(t){return t.closest("[data-top-popup]")}static getPopupFromOpener(t){const o=Worker.getElPopupOpener(t);return o?utils_dom.default.storage(o,"#TopPopup"):null}static getAll(){return utils_dom.default.querySelectorAllArray(document,".top-popup-wrapper")}static getAllVisible(){return utils_dom.default.querySelectorAllVisible(document,".top-popup-wrapper")}static async openByOpener(t){if(!(t instanceof HTMLElement))return;const o={};return o.popup=t.dataset.topPopup,o.id=t.dataset.topPopupId,!o.id&&o.popup&&(t.dataset.topPopupId=btoa(o.popup),o.id=t.dataset.topPopupId),t.dataset.topPopupP&&(o.p=parseInt(t.dataset.topPopupP)),t.dataset.topPopupPos&&(o.p=parseInt(t.dataset.topPopupPos)),t.dataset.topPopupNotch&&(o.notch=t.dataset.topPopupNotch==="true"||t.dataset.topPopupNotch==="1"),t.dataset.topPopupClass&&(o.class=t.dataset.topPopupClass),t.dataset.topPopupPosBy&&(o.posBy=t.dataset.topPopupPosBy),t.dataset.topPopupFront&&(o.frontSelector=t.dataset.topPopupFront),t.dataset.topPopupInvertX&&(o.invertX=t.dataset.topPopupInvertX==="true"||t.dataset.topPopupInvertX==="1"),t.dataset.topPopupOpenByHovertopPopupOpenByHover&&(o.openByHover=t.dataset.topPopupOpenByHover==="true"||t.dataset.topPopupOpenByHover==="1"),t.dataset.topPopupUseOriginal&&(o.useOriginal=t.dataset.topPopupUseOriginal==="true"||t.dataset.topPopupUseOriginal==="1"),await Worker.open(t,o)}static async open(elOpener,options){elOpener instanceof HTMLElement&&(elOpener.dataset.topPopupOpened="opened");const{TopLibPopup}=await new Promise((t,o)=>require(["../.chunks/popup-c8qgGOCv.amd"],t,o));if(forms.Core.$){const $elOpener=forms.Core.$(elOpener);if($elOpener.data("aftershow")){let afterShow=$elOpener.data("aftershow");typeof afterShow=="string"&&(afterShow=eval(afterShow.replace(/\W/g,""))),$elOpener.one("aftershow.top-menu-popup",afterShow)}if($elOpener.data("afterclose")){let afterclose=$elOpener.data("afterclose");typeof afterclose=="string"&&(afterclose=eval(afterclose.replace(/\W/g,""))),$elOpener.one("afterclose.top-menu-popup",afterclose)}}return options.isFullScreen=forms.Core.state.isMobile,new TopLibPopup(elOpener,options)}static close(t,o=!1){const e=Worker.getPopup(t);if(e){e.close();const p=e.el.contains(document.activeElement);o&&!p&&setTimeout(()=>{e.el.focus()})}}static recalcPosition(t){const o=Worker.getPopup(t);o&&o.elPopupBody instanceof HTMLElement&&o.recalcPosition()}static scrollToActive(t){if(!utils_dom.default.querySelectorVisible(t,"ul.top-popup_content > li > .top-active"))return;const e=t.querySelector("ul.top-popup_content"),p=utils_dom.default.querySelectorAllVisible(t,"ul.top-popup_content > li");t.classList.add("top-popup-wrapper-no_animate"),setTimeout(()=>t.classList.remove("top-popup-wrapper-no_animate"),100);let a=100;for(const s of p){if(s.querySelector(":scope > .top-active"))break;s instanceof HTMLElement&&(a+=s.offsetHeight)}if(e instanceof HTMLElement){const s=e.offsetHeight;a>s?e.scrollTop=a-s:e.scrollTop=0}}static decoratorBeforeOpen(t){this.options.decoratorBeforeOpen&&this.options.decoratorBeforeOpen(t)}static decoratorAfterOpen(t){this.options.decoratorAfterOpen&&this.options.decoratorAfterOpen(t)}static decoratorIsIgnoreOuterClick(t){return this.options.decoratorIsIgnoreOuterClick?this.options.decoratorIsIgnoreOuterClick(t):!1}static regVueComponent(t,o){if(Worker.vueConnectors.get(t))throw"Vue component Popup use duplicated id: "+t;Worker.vueConnectors.set(t,o)}static unregVueComponent(t){Worker.vueConnectors.delete(t)}static genElPopupOpener(t,o,...e){const p=utils_dom.default.genEl(t,{},...e);p.dataset.topPopup="#"+o.id;for(let a in o){const s="topPopup"+a.charAt(0).toUpperCase()+a.slice(1);p.dataset[s]=o[a]}return p.__TopPopupOpenerProps=o,p}}exports.TopPopupWorker=Worker,Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"})}));
1
+ define(["require","exports","../.chunks/forms--2-YQeWM.amd","../utils/dom.amd"],(function(require,exports,forms,utils_dom){"use strict";if(typeof vue>"u")var vue=window.Vue;class Worker{static noClose=!1;static vueConnectors=new Map;static options={};static getPopup(t){return utils_dom.default.storage(t,"TopPopup")}static getElPopupOpener(t){return t.closest("[data-top-popup]")}static getPopupFromOpener(t){const o=Worker.getElPopupOpener(t);return o?utils_dom.default.storage(o,"#TopPopup"):null}static getAll(){return utils_dom.default.querySelectorAllArray(document,".top-popup-wrapper")}static getAllVisible(){return utils_dom.default.querySelectorAllVisible(document,".top-popup-wrapper")}static async openByOpener(t){if(!(t instanceof HTMLElement))return;const o={};return o.popup=t.dataset.topPopup,o.id=t.dataset.topPopupId,!o.id&&o.popup&&(t.dataset.topPopupId=btoa(String.fromCharCode(...new TextEncoder().encode(o.popup))),o.id=t.dataset.topPopupId),t.dataset.topPopupP&&(o.p=parseInt(t.dataset.topPopupP)),t.dataset.topPopupPos&&(o.p=parseInt(t.dataset.topPopupPos)),t.dataset.topPopupNotch&&(o.notch=t.dataset.topPopupNotch==="true"||t.dataset.topPopupNotch==="1"),t.dataset.topPopupClass&&(o.class=t.dataset.topPopupClass),t.dataset.topPopupPosBy&&(o.posBy=t.dataset.topPopupPosBy),t.dataset.topPopupFront&&(o.frontSelector=t.dataset.topPopupFront),t.dataset.topPopupInvertX&&(o.invertX=t.dataset.topPopupInvertX==="true"||t.dataset.topPopupInvertX==="1"),t.dataset.topPopupOpenByHovertopPopupOpenByHover&&(o.openByHover=t.dataset.topPopupOpenByHover==="true"||t.dataset.topPopupOpenByHover==="1"),t.dataset.topPopupUseOriginal&&(o.useOriginal=t.dataset.topPopupUseOriginal==="true"||t.dataset.topPopupUseOriginal==="1"),await Worker.open(t,o)}static async open(elOpener,options){elOpener instanceof HTMLElement&&(elOpener.dataset.topPopupOpened="opened");const{TopLibPopup}=await new Promise((t,o)=>require(["../.chunks/popup-c8qgGOCv.amd"],t,o));if(forms.Core.$){const $elOpener=forms.Core.$(elOpener);if($elOpener.data("aftershow")){let afterShow=$elOpener.data("aftershow");typeof afterShow=="string"&&(afterShow=eval(afterShow.replace(/\W/g,""))),$elOpener.one("aftershow.top-menu-popup",afterShow)}if($elOpener.data("afterclose")){let afterclose=$elOpener.data("afterclose");typeof afterclose=="string"&&(afterclose=eval(afterclose.replace(/\W/g,""))),$elOpener.one("afterclose.top-menu-popup",afterclose)}}return options.isFullScreen=forms.Core.state.isMobile,new TopLibPopup(elOpener,options)}static close(t,o=!1){const e=Worker.getPopup(t);if(e){e.close();const p=e.el.contains(document.activeElement);o&&!p&&setTimeout(()=>{e.el.focus()})}}static recalcPosition(t){const o=Worker.getPopup(t);o&&o.elPopupBody instanceof HTMLElement&&o.recalcPosition()}static scrollToActive(t){if(!utils_dom.default.querySelectorVisible(t,"ul.top-popup_content > li > .top-active"))return;const e=t.querySelector("ul.top-popup_content"),p=utils_dom.default.querySelectorAllVisible(t,"ul.top-popup_content > li");t.classList.add("top-popup-wrapper-no_animate"),setTimeout(()=>t.classList.remove("top-popup-wrapper-no_animate"),100);let a=100;for(const s of p){if(s.querySelector(":scope > .top-active"))break;s instanceof HTMLElement&&(a+=s.offsetHeight)}if(e instanceof HTMLElement){const s=e.offsetHeight;a>s?e.scrollTop=a-s:e.scrollTop=0}}static decoratorBeforeOpen(t){this.options.decoratorBeforeOpen&&this.options.decoratorBeforeOpen(t)}static decoratorAfterOpen(t){this.options.decoratorAfterOpen&&this.options.decoratorAfterOpen(t)}static decoratorIsIgnoreOuterClick(t){return this.options.decoratorIsIgnoreOuterClick?this.options.decoratorIsIgnoreOuterClick(t):!1}static regVueComponent(t,o){if(Worker.vueConnectors.get(t))throw"Vue component Popup use duplicated id: "+t;Worker.vueConnectors.set(t,o)}static unregVueComponent(t){Worker.vueConnectors.delete(t)}static genElPopupOpener(t,o,...e){const p=utils_dom.default.genEl(t,{},...e);p.dataset.topPopup="#"+o.id;for(let a in o){const s="topPopup"+a.charAt(0).toUpperCase()+a.slice(1);p.dataset[s]=o[a]}return p.__TopPopupOpenerProps=o,p}}exports.TopPopupWorker=Worker,Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=worker.amd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.amd.js","sources":["../../src/components/popup/lib/worker.ts"],"sourcesContent":["/**\n * PopupWorker управляет работой Popup\n *\n * Должен грузить TopLibPopup только в отложенном режиме\n */\n\nimport Core from '@/core/core/core';\nimport DOM from '@/core/utils/dom';\nimport type { PopupOptions, TopLibPopup } from '@/components/popup/lib/popup';\nimport type { OpenerProps } from '@/components/popup/popup/opener/types';\n\nexport type Options = {\n\t/**\n\t * Глобальное событие, которое будет вызвано перед открытием TopPopup\n\t */\n\tdecoratorBeforeOpen?: (popup: TopLibPopup) => void,\n\n\t/**\n\t * Глобальное событие, которое будет вызвано после открытия TopPopup\n\t */\n\tdecoratorAfterOpen?: (popup: TopLibPopup) => void;\n\n\t/**\n\t * Определитель того, что клик вне Popup нужно игнорировать\n\t * @returns {boolean} - если true, то click не приведет к закрытию Popup\n\t */\n\tdecoratorIsIgnoreOuterClick?: (e: MouseEvent) => boolean\n}\n\nclass Worker {\n\n\t/**\n\t * Глобальное выключение закрытия меню, используется при различных оверлеях\n\t */\n\tstatic noClose = false;\n\n\t/**\n\t * Для взаимодействия с vue\n\t */\n\tstatic vueConnectors = new Map();\n\n\tstatic options: Options = {};\n\n\t/**\n\t * Вернуть объект компонента popup, привязанный к элементу\n\t */\n\tstatic getPopup(elPopup: HTMLElement): TopLibPopup {\n\t\treturn DOM.storage(elPopup, 'TopPopup') as TopLibPopup;\n\t}\n\n\tstatic getElPopupOpener(el: Element): HTMLElement | null {\n\t\treturn el.closest<HTMLElement>('[data-top-popup]');\n\t}\n\n\tstatic getPopupFromOpener(el: HTMLElement): TopLibPopup | null {\n\t\tconst elOpener = Worker.getElPopupOpener(el);\n\t\tif (!elOpener) return null;\n\n\t\treturn DOM.storage(elOpener, '#TopPopup');\n\t}\n\n\t/**\n\t * Вернуть все элементы с Popup\n\t */\n\tstatic getAll(): HTMLElement[] {\n\t\treturn DOM.querySelectorAllArray(document, '.top-popup-wrapper');\n\t}\n\n\t/**\n\t * Вернуть все элементы с открытыми Popup\n\t */\n\tstatic getAllVisible(): HTMLElement[] {\n\t\treturn DOM.querySelectorAllVisible(document, '.top-popup-wrapper');\n\t}\n\n\t/**\n\t * Открыть Popup от указанного elOpener\n\t * @param {HTMLElement} elOpener - элемент, который должен вызвать открытие Popup\n\t */\n\tstatic async openByOpener(elOpener: HTMLElement): Promise<TopLibPopup | undefined> {\n\t\tif (!(elOpener instanceof HTMLElement)) return;\n\n\t\tconst options: PopupOptions = {};\n\n\t\toptions.popup = elOpener.dataset.topPopup;\n\n\t\toptions.id = elOpener.dataset.topPopupId;\n\n\t\t/**\n\t\t * @deprecated в php шаблонах нет data-top-popup-id\n\t\t */\n\t\tif (!options.id && options.popup) {\n\t\t\telOpener.dataset.topPopupId = btoa(options.popup);\n\n\t\t\toptions.id = elOpener.dataset.topPopupId;\n\t\t}\n\n\t\t/**\n\t\t * @deprecated topPopupP - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupP) {\n\t\t\toptions.p = parseInt(elOpener.dataset.topPopupP);\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupPos) {\n\t\t\toptions.p = parseInt(elOpener.dataset.topPopupPos);\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupNotch) {\n\t\t\toptions.notch = elOpener.dataset.topPopupNotch === 'true' || elOpener.dataset.topPopupNotch === '1';\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupClass) {\n\t\t\toptions.class = elOpener.dataset.topPopupClass;\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupPosBy) {\n\t\t\toptions.posBy = elOpener.dataset.topPopupPosBy as PopupOptions['posBy'];\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupFront) {\n\t\t\toptions.frontSelector = elOpener.dataset.topPopupFront;\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupInvertX) {\n\t\t\toptions.invertX = elOpener.dataset.topPopupInvertX === 'true' || elOpener.dataset.topPopupInvertX === '1';\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupOpenByHovertopPopupOpenByHover) {\n\t\t\toptions.openByHover = elOpener.dataset.topPopupOpenByHover === 'true' || elOpener.dataset.topPopupOpenByHover === '1';\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupUseOriginal) {\n\t\t\toptions.useOriginal = elOpener.dataset.topPopupUseOriginal === 'true' || elOpener.dataset.topPopupUseOriginal === '1';\n\t\t}\n\n\t\treturn await Worker.open(elOpener, options);\n\t}\n\n\t/**\n\t * Создать и открыть Popup\n\t * @param elOpener - элемент, вызвавший открытие Popup\n\t * @param options - опции Popup\n\t */\n\tprivate static async open(elOpener: HTMLElement, options: PopupOptions): Promise<TopLibPopup> {\n\t\tif (elOpener instanceof HTMLElement) elOpener.dataset.topPopupOpened = 'opened';\n\n\t\tconst { TopLibPopup } = await import('./popup');\n\n\t\tif (Core.$) {\n\t\t\tconst $elOpener = Core.$(elOpener);\n\n\t\t\t// deprecated, используется aftershow.top-menu-popup\n\t\t\tif ($elOpener.data('aftershow')) {\n\t\t\t\tlet afterShow = $elOpener.data('aftershow');\n\t\t\t\tif (typeof (afterShow) == 'string') {\n\t\t\t\t\t// TODO: Удалить с сайта указание кода функции в html\n\t\t\t\t\t// @deprecated\n\t\t\t\t\tafterShow = eval(afterShow.replace(/\\W/g, ''));\n\t\t\t\t}\n\n\t\t\t\t$elOpener.one('aftershow.top-menu-popup', afterShow);\n\t\t\t}\n\n\t\t\t// deprecated, используется afterclose.top-menu-popup\n\t\t\tif ($elOpener.data('afterclose')) {\n\t\t\t\tlet afterclose = $elOpener.data('afterclose');\n\t\t\t\tif (typeof (afterclose) == 'string') {\n\t\t\t\t\t// TODO: Удалить с сайта указание кода функции в html\n\t\t\t\t\t// @deprecated\n\t\t\t\t\tafterclose = eval(afterclose.replace(/\\W/g, ''));\n\t\t\t\t}\n\n\t\t\t\t$elOpener.one('afterclose.top-menu-popup', afterclose);\n\t\t\t}\n\t\t}\n\n\t\toptions.isFullScreen = Core.state.isMobile;\n\n\t\treturn new TopLibPopup(elOpener, options);\n\t}\n\n\tstatic close(elPopup: HTMLElement, restoreFocus = false): void {\n\t\tconst popup = Worker.getPopup(elPopup);\n\n\t\tif (popup) {\n\t\t\tpopup.close();\n\n\t\t\tconst isFocused = popup.el.contains(document.activeElement);\n\n\t\t\tif (restoreFocus && !isFocused) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tpopup.el.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic recalcPosition(elPopup: HTMLElement): void {\n\t\tconst popup = Worker.getPopup(elPopup);\n\t\tif (popup && popup.elPopupBody instanceof HTMLElement) {\n\t\t\tpopup.recalcPosition();\n\t\t}\n\t}\n\n\t/**\n\t * Скролл к активному элементу списка\n\t */\n\tstatic scrollToActive(elPopup: HTMLElement): void {\n\t\tconst elItemActive = DOM.querySelectorVisible(elPopup, 'ul.top-popup_content > li > .top-active');\n\t\tif (!elItemActive) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst elUl = elPopup.querySelector('ul.top-popup_content');\n\t\tconst elsLi = DOM.querySelectorAllVisible(elPopup, 'ul.top-popup_content > li');\n\n\t\telPopup.classList.add('top-popup-wrapper-no_animate');\n\t\tsetTimeout(() => elPopup.classList.remove('top-popup-wrapper-no_animate'), 100);\n\n\t\tlet top = 100;\n\t\tfor (const elLi of elsLi) {\n\t\t\tif (elLi.querySelector(':scope > .top-active')) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (elLi instanceof HTMLElement) top += elLi.offsetHeight;\n\t\t}\n\n\t\tif (elUl instanceof HTMLElement) {\n\t\t\tconst heightWrapper = elUl.offsetHeight;\n\t\t\tif (top > heightWrapper) {\n\t\t\t\telUl.scrollTop = top - heightWrapper;\n\t\t\t} else {\n\t\t\t\telUl.scrollTop = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic decoratorBeforeOpen(popup: TopLibPopup<any>): void {\n\t\tif (this.options.decoratorBeforeOpen) {\n\t\t\tthis.options.decoratorBeforeOpen(popup);\n\t\t}\n\t};\n\n\tstatic decoratorAfterOpen(popup: TopLibPopup<any>): void {\n\t\tif (this.options.decoratorAfterOpen) {\n\t\t\tthis.options.decoratorAfterOpen(popup);\n\t\t}\n\t};\n\n\tstatic decoratorIsIgnoreOuterClick(e: MouseEvent): boolean {\n\t\tif (this.options.decoratorIsIgnoreOuterClick) {\n\t\t\treturn this.options.decoratorIsIgnoreOuterClick(e);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Зарегистрировать Vue компонент\n\t *\n\t * Каждый экземляр Popup регистрируется в словаре vueConnectors для последующего доступа из js\n\t */\n\tstatic regVueComponent(id: string, vueConnector: any): void {\n\t\tif (Worker.vueConnectors.get(id)) {\n\t\t\tthrow 'Vue component Popup use duplicated id: ' + id;\n\t\t}\n\n\t\tWorker.vueConnectors.set(id, vueConnector);\n\t}\n\n\t/**\n\t * Снять с регистрации Vue компонент\n\t */\n\tstatic unregVueComponent(id: string): void {\n\t\tWorker.vueConnectors.delete(id);\n\t}\n\n\t/**\n\t * Сгенерировать элемент для открытия popup\n\t */\n\tstatic genElPopupOpener(tagName: string, props: OpenerProps, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\t\tconst el = DOM.genEl(tagName, {}, ...elsChildrens) as TopLibPopup['el'];\n\n\t\tel.dataset.topPopup = '#' + props.id;\n\n\t\t// if (props.pos === undefined) props.pos = '3';\n\t\t// if (props.notch === undefined) props.notch = true;\n\t\t// if (props.posBy === undefined) props.posBy = 'fixed';\n\n\t\tfor (let name in props) {\n\t\t\tconst attrName = 'topPopup' + name.charAt(0).toUpperCase() + name.slice(1);\n\n\t\t\tel.dataset[attrName] = props[name];\n\t\t}\n\n\t\tel.__TopPopupOpenerProps = props;\n\n\t\treturn el;\n\t}\n\n}\n\nexport default Worker;\n"],"names":["elPopup","el","elOpener2","options2","isFocused","popup","restoreFocus","elLi","elsLi","elUl","heightWrapper","top","e","id","vueConnector","tagName","elsChildrens","name","props"],"mappings":"6KA6BA,MAAA,MAAA,mBAKkB,OAAA,cAAA,IAAA,sBAOU,OAAA,SAAAA,EAAA,gDAO3B,OAAA,iBAAAC,EAAA,CAGC,OAAAA,EAAA,QAAA,kBAAA,EACD,OAAA,mBAAAA,EAAA,oCAIC,OAAAC,2CAAA,0MAiBD,aAAA,aAAAA,EAAA,CAOC,GAAA,EAAAA,aAAA,aAAA,6JAoBAA,EAAA,QAAA,+CAIAA,EAAA,QAAA,mDAOAA,EAAA,QAAA,gBACCC,EAAA,MAAAD,EAAA,QAAA,gBAAA,QAAAA,EAAA,QAAA,gBAAA,KAGDA,EAAA,QAAA,iDAIAA,EAAA,QAAA,iDAIAA,EAAA,QAAA,yDAOAA,EAAA,QAAA,kBACCC,EAAA,QAAAD,EAAA,QAAA,kBAAA,QAAAA,EAAA,QAAA,kBAAA,KAMDA,EAAA,QAAA,yCACCC,EAAA,YAAAD,EAAA,QAAA,sBAAA,QAAAA,EAAA,QAAA,sBAAA,KAMDA,EAAA,QAAA,sBACCC,EAAA,YAAAD,EAAA,QAAA,sBAAA,QAAAA,EAAA,QAAA,sBAAA,4BAIF,aAAA,KAAA,SAAA,QAAA,yKAYC,GAAA,MAAA,KAAA,EAAA,wCAIC,GAAA,UAAA,KAAA,WAAA,EAAA,2CAEC,OAAA,WAAA,WAGC,UAAA,KAAA,UAAA,QAAA,MAAA,EAAA,CAAA,GAGD,UAAA,IAAA,2BAAA,SAAA,EAID,GAAA,UAAA,KAAA,YAAA,EAAA,6CAEC,OAAA,YAAA,WAGC,WAAA,KAAA,WAAA,QAAA,MAAA,EAAA,CAAA,GAGD,UAAA,IAAA,4BAAA,UAAA,yDAMF,IAAA,YAAA,SAAA,OAAA,kEASC,MAAAE,EAAAC,EAAA,GAAA,SAAA,SAAA,aAAA,EAEAC,GAAA,CAAAF,mBAEEC,EAAA,GAAA,MAAA,CAAe,CAAA,GAInB,OAAA,eAAAL,EAAA,wFAOA,OAAA,eAAAA,EAAA,2NAcCA,EAAA,UAAA,IAAA,8BAAA,EACA,WAAA,IAAAA,EAAA,UAAA,OAAA,8BAAA,EAAA,GAAA,YAGA,UAAAO,KAAAC,EAAA,CACC,GAAAD,EAAA,cAAA,sBAAA,sDAOD,GAAAE,aAAA,YAAA,CACC,MAAAC,EAAAD,EAAA,aACAE,EAAAD,EACCD,EAAA,UAAAE,EAAAD,EAEAD,EAAA,UAAA,GAGH,OAAA,oBAAAJ,EAAA,CAGC,KAAA,QAAA,qBACC,KAAA,QAAA,oBAAAA,CAAA,EAEF,OAAA,mBAAAA,EAAA,CAGC,KAAA,QAAA,oBACC,KAAA,QAAA,mBAAAA,CAAA,EAEF,OAAA,4BAAAO,EAAA,CAGC,OAAA,KAAA,QAAA,wEAIA,GACD,OAAA,gBAAAC,EAAAC,EAAA,+GAaA,OAAA,kBAAAD,EAAA,CAMC,OAAA,cAAA,OAAAA,CAAA,oCAOA,MAAAZ,EAAA,UAAA,QAAA,MAAAc,EAAA,CAAA,EAAA,GAAAC,CAAA,8BAQA,QAAAC,KAAAC,EAAA,2EAMA,OAAAjB,EAAA,sBAAAiB,EAEAjB,EAGF"}
1
+ {"version":3,"file":"worker.amd.js","sources":["../../src/components/popup/lib/worker.ts"],"sourcesContent":["/**\n * PopupWorker управляет работой Popup\n *\n * Должен грузить TopLibPopup только в отложенном режиме\n */\n\nimport Core from '@/core/core/core';\nimport DOM from '@/core/utils/dom';\nimport type { PopupOptions, TopLibPopup } from '@/components/popup/lib/popup';\nimport type { OpenerProps } from '@/components/popup/popup/opener/types';\n\nexport type Options = {\n\t/**\n\t * Глобальное событие, которое будет вызвано перед открытием TopPopup\n\t */\n\tdecoratorBeforeOpen?: (popup: TopLibPopup) => void,\n\n\t/**\n\t * Глобальное событие, которое будет вызвано после открытия TopPopup\n\t */\n\tdecoratorAfterOpen?: (popup: TopLibPopup) => void;\n\n\t/**\n\t * Определитель того, что клик вне Popup нужно игнорировать\n\t * @returns {boolean} - если true, то click не приведет к закрытию Popup\n\t */\n\tdecoratorIsIgnoreOuterClick?: (e: MouseEvent) => boolean\n}\n\nclass Worker {\n\n\t/**\n\t * Глобальное выключение закрытия меню, используется при различных оверлеях\n\t */\n\tstatic noClose = false;\n\n\t/**\n\t * Для взаимодействия с vue\n\t */\n\tstatic vueConnectors = new Map();\n\n\tstatic options: Options = {};\n\n\t/**\n\t * Вернуть объект компонента popup, привязанный к элементу\n\t */\n\tstatic getPopup(elPopup: HTMLElement): TopLibPopup {\n\t\treturn DOM.storage(elPopup, 'TopPopup') as TopLibPopup;\n\t}\n\n\tstatic getElPopupOpener(el: Element): HTMLElement | null {\n\t\treturn el.closest<HTMLElement>('[data-top-popup]');\n\t}\n\n\tstatic getPopupFromOpener(el: HTMLElement): TopLibPopup | null {\n\t\tconst elOpener = Worker.getElPopupOpener(el);\n\t\tif (!elOpener) return null;\n\n\t\treturn DOM.storage(elOpener, '#TopPopup');\n\t}\n\n\t/**\n\t * Вернуть все элементы с Popup\n\t */\n\tstatic getAll(): HTMLElement[] {\n\t\treturn DOM.querySelectorAllArray(document, '.top-popup-wrapper');\n\t}\n\n\t/**\n\t * Вернуть все элементы с открытыми Popup\n\t */\n\tstatic getAllVisible(): HTMLElement[] {\n\t\treturn DOM.querySelectorAllVisible(document, '.top-popup-wrapper');\n\t}\n\n\t/**\n\t * Открыть Popup от указанного elOpener\n\t * @param {HTMLElement} elOpener - элемент, который должен вызвать открытие Popup\n\t */\n\tstatic async openByOpener(elOpener: HTMLElement): Promise<TopLibPopup | undefined> {\n\t\tif (!(elOpener instanceof HTMLElement)) return;\n\n\t\tconst options: PopupOptions = {};\n\n\t\toptions.popup = elOpener.dataset.topPopup;\n\n\t\toptions.id = elOpener.dataset.topPopupId;\n\n\t\t/**\n\t\t * @deprecated в php шаблонах нет data-top-popup-id\n\t\t */\n\t\tif (!options.id && options.popup) {\n\t\t\telOpener.dataset.topPopupId = btoa(\n\t\t\t\tString.fromCharCode(...new TextEncoder().encode(options.popup))\n\t\t\t);\n\n\t\t\toptions.id = elOpener.dataset.topPopupId;\n\t\t}\n\n\t\t/**\n\t\t * @deprecated topPopupP - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupP) {\n\t\t\toptions.p = parseInt(elOpener.dataset.topPopupP);\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupPos) {\n\t\t\toptions.p = parseInt(elOpener.dataset.topPopupPos);\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupNotch) {\n\t\t\toptions.notch = elOpener.dataset.topPopupNotch === 'true' || elOpener.dataset.topPopupNotch === '1';\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupClass) {\n\t\t\toptions.class = elOpener.dataset.topPopupClass;\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupPosBy) {\n\t\t\toptions.posBy = elOpener.dataset.topPopupPosBy as PopupOptions['posBy'];\n\t\t}\n\n\t\tif (elOpener.dataset.topPopupFront) {\n\t\t\toptions.frontSelector = elOpener.dataset.topPopupFront;\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupInvertX) {\n\t\t\toptions.invertX = elOpener.dataset.topPopupInvertX === 'true' || elOpener.dataset.topPopupInvertX === '1';\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupOpenByHovertopPopupOpenByHover) {\n\t\t\toptions.openByHover = elOpener.dataset.topPopupOpenByHover === 'true' || elOpener.dataset.topPopupOpenByHover === '1';\n\t\t}\n\n\t\t/**\n\t\t * @deprecated '1' - добавлено для обратной совместимости\n\t\t */\n\t\tif (elOpener.dataset.topPopupUseOriginal) {\n\t\t\toptions.useOriginal = elOpener.dataset.topPopupUseOriginal === 'true' || elOpener.dataset.topPopupUseOriginal === '1';\n\t\t}\n\n\t\treturn await Worker.open(elOpener, options);\n\t}\n\n\t/**\n\t * Создать и открыть Popup\n\t * @param elOpener - элемент, вызвавший открытие Popup\n\t * @param options - опции Popup\n\t */\n\tprivate static async open(elOpener: HTMLElement, options: PopupOptions): Promise<TopLibPopup> {\n\t\tif (elOpener instanceof HTMLElement) elOpener.dataset.topPopupOpened = 'opened';\n\n\t\tconst { TopLibPopup } = await import('./popup');\n\n\t\tif (Core.$) {\n\t\t\tconst $elOpener = Core.$(elOpener);\n\n\t\t\t// deprecated, используется aftershow.top-menu-popup\n\t\t\tif ($elOpener.data('aftershow')) {\n\t\t\t\tlet afterShow = $elOpener.data('aftershow');\n\t\t\t\tif (typeof (afterShow) == 'string') {\n\t\t\t\t\t// TODO: Удалить с сайта указание кода функции в html\n\t\t\t\t\t// @deprecated\n\t\t\t\t\tafterShow = eval(afterShow.replace(/\\W/g, ''));\n\t\t\t\t}\n\n\t\t\t\t$elOpener.one('aftershow.top-menu-popup', afterShow);\n\t\t\t}\n\n\t\t\t// deprecated, используется afterclose.top-menu-popup\n\t\t\tif ($elOpener.data('afterclose')) {\n\t\t\t\tlet afterclose = $elOpener.data('afterclose');\n\t\t\t\tif (typeof (afterclose) == 'string') {\n\t\t\t\t\t// TODO: Удалить с сайта указание кода функции в html\n\t\t\t\t\t// @deprecated\n\t\t\t\t\tafterclose = eval(afterclose.replace(/\\W/g, ''));\n\t\t\t\t}\n\n\t\t\t\t$elOpener.one('afterclose.top-menu-popup', afterclose);\n\t\t\t}\n\t\t}\n\n\t\toptions.isFullScreen = Core.state.isMobile;\n\n\t\treturn new TopLibPopup(elOpener, options);\n\t}\n\n\tstatic close(elPopup: HTMLElement, restoreFocus = false): void {\n\t\tconst popup = Worker.getPopup(elPopup);\n\n\t\tif (popup) {\n\t\t\tpopup.close();\n\n\t\t\tconst isFocused = popup.el.contains(document.activeElement);\n\n\t\t\tif (restoreFocus && !isFocused) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tpopup.el.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic recalcPosition(elPopup: HTMLElement): void {\n\t\tconst popup = Worker.getPopup(elPopup);\n\t\tif (popup && popup.elPopupBody instanceof HTMLElement) {\n\t\t\tpopup.recalcPosition();\n\t\t}\n\t}\n\n\t/**\n\t * Скролл к активному элементу списка\n\t */\n\tstatic scrollToActive(elPopup: HTMLElement): void {\n\t\tconst elItemActive = DOM.querySelectorVisible(elPopup, 'ul.top-popup_content > li > .top-active');\n\t\tif (!elItemActive) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst elUl = elPopup.querySelector('ul.top-popup_content');\n\t\tconst elsLi = DOM.querySelectorAllVisible(elPopup, 'ul.top-popup_content > li');\n\n\t\telPopup.classList.add('top-popup-wrapper-no_animate');\n\t\tsetTimeout(() => elPopup.classList.remove('top-popup-wrapper-no_animate'), 100);\n\n\t\tlet top = 100;\n\t\tfor (const elLi of elsLi) {\n\t\t\tif (elLi.querySelector(':scope > .top-active')) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (elLi instanceof HTMLElement) top += elLi.offsetHeight;\n\t\t}\n\n\t\tif (elUl instanceof HTMLElement) {\n\t\t\tconst heightWrapper = elUl.offsetHeight;\n\t\t\tif (top > heightWrapper) {\n\t\t\t\telUl.scrollTop = top - heightWrapper;\n\t\t\t} else {\n\t\t\t\telUl.scrollTop = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic decoratorBeforeOpen(popup: TopLibPopup<any>): void {\n\t\tif (this.options.decoratorBeforeOpen) {\n\t\t\tthis.options.decoratorBeforeOpen(popup);\n\t\t}\n\t};\n\n\tstatic decoratorAfterOpen(popup: TopLibPopup<any>): void {\n\t\tif (this.options.decoratorAfterOpen) {\n\t\t\tthis.options.decoratorAfterOpen(popup);\n\t\t}\n\t};\n\n\tstatic decoratorIsIgnoreOuterClick(e: MouseEvent): boolean {\n\t\tif (this.options.decoratorIsIgnoreOuterClick) {\n\t\t\treturn this.options.decoratorIsIgnoreOuterClick(e);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Зарегистрировать Vue компонент\n\t *\n\t * Каждый экземляр Popup регистрируется в словаре vueConnectors для последующего доступа из js\n\t */\n\tstatic regVueComponent(id: string, vueConnector: any): void {\n\t\tif (Worker.vueConnectors.get(id)) {\n\t\t\tthrow 'Vue component Popup use duplicated id: ' + id;\n\t\t}\n\n\t\tWorker.vueConnectors.set(id, vueConnector);\n\t}\n\n\t/**\n\t * Снять с регистрации Vue компонент\n\t */\n\tstatic unregVueComponent(id: string): void {\n\t\tWorker.vueConnectors.delete(id);\n\t}\n\n\t/**\n\t * Сгенерировать элемент для открытия popup\n\t */\n\tstatic genElPopupOpener(tagName: string, props: OpenerProps, ...elsChildrens: HTMLElement[] | string[]): HTMLElement {\n\t\tconst el = DOM.genEl(tagName, {}, ...elsChildrens) as TopLibPopup['el'];\n\n\t\tel.dataset.topPopup = '#' + props.id;\n\n\t\t// if (props.pos === undefined) props.pos = '3';\n\t\t// if (props.notch === undefined) props.notch = true;\n\t\t// if (props.posBy === undefined) props.posBy = 'fixed';\n\n\t\tfor (let name in props) {\n\t\t\tconst attrName = 'topPopup' + name.charAt(0).toUpperCase() + name.slice(1);\n\n\t\t\tel.dataset[attrName] = props[name];\n\t\t}\n\n\t\tel.__TopPopupOpenerProps = props;\n\n\t\treturn el;\n\t}\n\n}\n\nexport default Worker;\n"],"names":["elPopup","el","elOpener2","options2","isFocused","popup","restoreFocus","elLi","elsLi","elUl","heightWrapper","top","e","id","vueConnector","tagName","elsChildrens","name","props"],"mappings":"6KA6BA,MAAA,MAAA,mBAKkB,OAAA,cAAA,IAAA,sBAOU,OAAA,SAAAA,EAAA,gDAO3B,OAAA,iBAAAC,EAAA,CAGC,OAAAA,EAAA,QAAA,kBAAA,EACD,OAAA,mBAAAA,EAAA,oCAIC,OAAAC,2CAAA,0MAiBD,aAAA,aAAAA,EAAA,CAOC,GAAA,EAAAA,aAAA,aAAA,+FAYCA,EAAA,QAAA,WAAA,KAA8B,OAAA,aAAA,GAAA,IAAA,YAAA,EAAA,OAAAC,EAAA,KAAA,CAAA,8BAU/BD,EAAA,QAAA,+CAIAA,EAAA,QAAA,mDAOAA,EAAA,QAAA,gBACCC,EAAA,MAAAD,EAAA,QAAA,gBAAA,QAAAA,EAAA,QAAA,gBAAA,KAGDA,EAAA,QAAA,iDAIAA,EAAA,QAAA,iDAIAA,EAAA,QAAA,yDAOAA,EAAA,QAAA,kBACCC,EAAA,QAAAD,EAAA,QAAA,kBAAA,QAAAA,EAAA,QAAA,kBAAA,KAMDA,EAAA,QAAA,yCACCC,EAAA,YAAAD,EAAA,QAAA,sBAAA,QAAAA,EAAA,QAAA,sBAAA,KAMDA,EAAA,QAAA,sBACCC,EAAA,YAAAD,EAAA,QAAA,sBAAA,QAAAA,EAAA,QAAA,sBAAA,4BAIF,aAAA,KAAA,SAAA,QAAA,yKAYC,GAAA,MAAA,KAAA,EAAA,wCAIC,GAAA,UAAA,KAAA,WAAA,EAAA,2CAEC,OAAA,WAAA,WAGC,UAAA,KAAA,UAAA,QAAA,MAAA,EAAA,CAAA,GAGD,UAAA,IAAA,2BAAA,SAAA,EAID,GAAA,UAAA,KAAA,YAAA,EAAA,6CAEC,OAAA,YAAA,WAGC,WAAA,KAAA,WAAA,QAAA,MAAA,EAAA,CAAA,GAGD,UAAA,IAAA,4BAAA,UAAA,yDAMF,IAAA,YAAA,SAAA,OAAA,kEASC,MAAAE,EAAAC,EAAA,GAAA,SAAA,SAAA,aAAA,EAEAC,GAAA,CAAAF,mBAEEC,EAAA,GAAA,MAAA,CAAe,CAAA,GAInB,OAAA,eAAAL,EAAA,wFAOA,OAAA,eAAAA,EAAA,2NAcCA,EAAA,UAAA,IAAA,8BAAA,EACA,WAAA,IAAAA,EAAA,UAAA,OAAA,8BAAA,EAAA,GAAA,YAGA,UAAAO,KAAAC,EAAA,CACC,GAAAD,EAAA,cAAA,sBAAA,sDAOD,GAAAE,aAAA,YAAA,CACC,MAAAC,EAAAD,EAAA,aACAE,EAAAD,EACCD,EAAA,UAAAE,EAAAD,EAEAD,EAAA,UAAA,GAGH,OAAA,oBAAAJ,EAAA,CAGC,KAAA,QAAA,qBACC,KAAA,QAAA,oBAAAA,CAAA,EAEF,OAAA,mBAAAA,EAAA,CAGC,KAAA,QAAA,oBACC,KAAA,QAAA,mBAAAA,CAAA,EAEF,OAAA,4BAAAO,EAAA,CAGC,OAAA,KAAA,QAAA,wEAIA,GACD,OAAA,gBAAAC,EAAAC,EAAA,+GAaA,OAAA,kBAAAD,EAAA,CAMC,OAAA,cAAA,OAAAA,CAAA,oCAOA,MAAAZ,EAAA,UAAA,QAAA,MAAAc,EAAA,CAAA,EAAA,GAAAC,CAAA,8BAQA,QAAAC,KAAAC,EAAA,2EAMA,OAAAjB,EAAA,sBAAAiB,EAEAjB,EAGF"}