import { g as z, a as j } from "../.chunks/field-CyyFzM-Y.es.js";
const O = (o = {}) => (o = { ...o }, o.loadingEl ??= globalThis.document?.body, o.loadingShowSpinner ??= !0, o.method ??= "POST", o.accept ??= "application/json", o), S = (o, t, s) => ({
  result: o,
  errors: t,
  response: s
}), k = (o) => o.startsWith("/system_2/common/"), A = (o = !1, t = window.location.href, s) => {
  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(".");
  return `${e}//${d}${n ? `:${n}` : ""}`;
}, F = (o) => Object.values(o).some(
  (t) => t instanceof FileList || t instanceof File || t instanceof Blob || Array.isArray(t) && t.some((s) => s instanceof File || s instanceof Blob)
), C = (o, t, s) => {
  const e = {
    inLoading: !1,
    path: t,
    url: o.options.baseUrl + t,
    options: O(o.options.requestOptions),
    mockerOptions: void 0,
    params: {},
    // незаполненное свойство
    getInLoading: () => e.inLoading,
    setParams: (r) => (e.params = { ...r }, e),
    changeParams: (r) => (Object.assign(e.params, r), e),
    setOptions: (r) => (Object.assign(e.options, r), e),
    setMocker: (r) => (e.mockerOptions = r, e),
    call: async (r) => e.exec(r),
    callFetch: async (r, n) => e.exec(n, r),
    callInNewWindow: async (r) => {
      const n = e.genData(r), i = o.genMiddlewareCtx(e, n);
      o.options.onPrepareData?.(n, i);
      const { postInWindow: d } = await import("../.chunks/lazy-40pjr8cZ.es.js");
      d(e.url, n, "_blank");
    },
    callInSelfWindow: async (r) => {
      const n = e.genData(r), i = o.genMiddlewareCtx(e, n);
      o.options.onPrepareData?.(n, i);
      const { postInWindow: d } = await import("../.chunks/lazy-40pjr8cZ.es.js");
      d(e.url, n, "_self");
    },
    genData: (r, n) => {
      const i = { ...e.params };
      if (delete i.fetch_style, r) {
        let d = [...r];
        s && (d = d.filter((l) => s.includes(l))), i.fields = d;
      } else
        s && (i.fields = s);
      return n && (i.fetch_style = n), i;
    },
    abortByFingerprint: () => {
      if (!e.options.checkFingerprint) return;
      const r = e.path + e.options.checkFingerprint;
      o.abortControllers[r]?.abort(
        new DOMException(`Stopped previous request by fingerprint: ${e.options.checkFingerprint}`, "AbortError")
      );
      const n = new AbortController();
      return o.abortControllers[r] = n, n.signal;
    },
    /**
     * Общая функция выполнения запросов
     */
    async exec(r, n) {
      const i = o.options.Request, d = o.options.fetch, l = e.genData(r, n), g = o.genMiddlewareCtx(e, l);
      o.options.onPrepareData?.(l, g);
      const x = F(l);
      if (x && e.options.method !== "POST")
        throw new Error("Files can be sent only in POST requests");
      let R = e.url, y;
      if (x) {
        if (e.options.method !== "POST")
          throw new Error("Files can be sent only in POST requests");
        const { formDataSerializer: p } = await import("../.chunks/lazy-40pjr8cZ.es.js");
        y = p(l);
      } else e.options.method !== "POST" ? R += "?" + await o.options.querySerializer(l) : y = o.options.bodySerializer(l);
      let E = e.abortByFingerprint();
      if (e.mockerOptions) {
        const { genMockResponse: p } = await import("../.chunks/index-DkQWJkMc.es.js");
        return await p(e.mockerOptions, r, l, E);
      }
      const P = {
        ...o.options,
        method: e.options.method,
        body: y,
        signal: E
      };
      let f = new i(R, P);
      f.headers.set("x-request-id", g.id), f.headers.set("accept", e.options.accept), x || f.headers.set("content-type", "application/json");
      const u = {
        ...g,
        request: f
      };
      e.inLoading = !0, e.options.onLoading?.(e.inLoading, u);
      let a;
      const w = await o.middlewareOnRequest(f, u);
      if (w instanceof Response ? a = w : w instanceof i && (f = w), !a)
        try {
          a = await d(f);
        } catch (p) {
          a = await o.middlewareOnError(p, u);
        } finally {
          e.inLoading = !1, e.options.onLoading?.(e.inLoading, u);
        }
      a = await o.middlewareOnResponse(a, u);
      let c, h, m;
      try {
        const p = a.headers.get("content-type")?.includes("application/json");
        h = await a.text(), this.options.accept === "application/json" || p ? c = JSON.parse(h) : o.useExt ? c = S(h, void 0, a) : c = h;
      } catch (p) {
        if ((p instanceof SyntaxError || p instanceof TypeError) && (m = p, m.responseText = h), o.useExt && m) {
          let b = a.status, q = a.statusText;
          b === 200 && (b = 1e4, q = "Error API response"), c = S(null, [
            {
              code: b,
              string: q
            }
          ], a), o.options.useApiConsole && console.error(p);
        } else
          throw p;
      }
      return o.useExt && (c.response = a, c && e.options.onApiLoaded?.(c, u, o.options.requestOptions?.onApiLoaded), c?.errors && (o.options.useApiConsole && console.warn(new Error("API error"), { res: c }), e.options.onApiError?.(c, { ...u, formatError: m }, o.options.requestOptions?.onApiError)), c?.messages && e.options.onApiMessage?.(c, u)), c;
    }
  };
  return e;
};
class I {
  options;
  useExt;
  middlewares = [];
  mokerByPath = /* @__PURE__ */ new Map();
  abortControllers = {};
  constructor(t = {}, s) {
    t.requestOptions = O(t.requestOptions), t.useApiConsole ??= !0, t.fetch ??= globalThis.fetch, t.Request ??= globalThis.Request, t.querySerializer ??= async (e) => {
      const { querySerializer: r } = await import("../.chunks/lazy-40pjr8cZ.es.js");
      return r(e);
    }, t.bodySerializer ??= (e) => typeof e == "string" ? e : JSON.stringify(e), this.options = t, this.useExt = s;
  }
  generateUUID() {
    return crypto?.randomUUID ? crypto.randomUUID() : "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (t) => {
      const s = Math.random() * 16 | 0;
      return (t === "x" ? s : s & 3 | 8).toString(16);
    });
  }
  /**
   * Зарегистрировать middleware
   */
  use(t) {
    this.middlewares.push(t);
  }
  /**
   * Создать объект запроса
   *
   * После создания объекта он заполняется необходимыми данными и выполняет запросы к API с помощью APIRequest2.call();
   *
   * Опционально generic указывать нельзя, поэтому необходимо дублировать определение fetchStyle, [см.](https://github.com/Microsoft/TypeScript/issues/26242)
   *
   * @param path Путь метода API
   * @param fieldsNarrow Список получаемых полей, для методов API с моделью. Если объект запроса переиспользуется, и список полей меняется, указывайте его непосредственно при вызове `api.call()`
   */
  gen(t, s) {
    return C(this, t, s);
  }
  /**
   * Создать объект запроса, не описанного в OpenAPI
   */
  genAny(t, s) {
    return this.gen(t, s);
  }
  /**
   * Создать контекст выполнения запроса
   */
  genMiddlewareCtx(t, s) {
    const e = this.generateUUID(), r = Object.freeze({
      baseUrl: this.options.baseUrl,
      querySerializer: this.options.querySerializer,
      bodySerializer: this.options.bodySerializer,
      Request: this.options.Request,
      fetch: this.options.fetch
    });
    return {
      useExt: this.useExt,
      requestOptions: t.options,
      data: s,
      middlewareData: {},
      options: r,
      schemaPath: t.path,
      id: e
    };
  }
  /**
   * Обработчик middleware.onRequest
   *
   * @param request Запрос для обработки
   * @param middlewareCtx Контекст выполнения запроса
   * @return Новый экземпляр `Request` или `Response` при модификации запроса, или undefined
   */
  async middlewareOnRequest(t, s) {
    for (const e of this.middlewares) {
      const r = await e.onRequest?.({
        ...s,
        request: t
      });
      if (r)
        if (r instanceof Request)
          t = r;
        else {
          if (r instanceof Response)
            return r;
          throw new Error("onRequest: must return new Request() or Response() when modifying the request");
        }
    }
    return t;
  }
  /**
   * Обработчик middleware.onResponse
   *
   * @param `error` Ошибка, переданная для обработки
   * @param middlewareCtx
   * @return Новый экземпляр `Response` при успешной обработке или выбрасывает ошибку
   */
  async middlewareOnError(t, s) {
    let e = t;
    for (const r of this.middlewares) {
      const n = await r.onError?.({
        ...s,
        error: e
      });
      if (n) {
        if (n instanceof Response)
          return n;
        if (n instanceof Error) {
          e = n;
          continue;
        }
        throw new Error("onError: must return new Response() or instance of Error");
      }
    }
    throw e;
  }
  /**
   * Обработчик middleware.onResponse
   *
   * @param response Ответ для обработки
   * @param middlewareCtx Контекст выполнения запроса
   * @return Новый экземпляр `Response` при модификации ответа, или undefined
   */
  async middlewareOnResponse(t, s) {
    for (const e of this.middlewares) {
      const r = await e.onResponse?.({
        ...s,
        response: t
      });
      if (r) {
        if (!(r instanceof Response))
          throw new Error("onResponse: must return new Response() when modifying the response");
        t = r;
      }
    }
    return t;
  }
  /**
   * Установить генератор данных вместо реальных запросов к серверу для конкретного метода API
   */
  setMocker(t, s) {
    this.mokerByPath.set(t, s), this.genOriginal || (this.genOriginal = this.gen.bind(this), this.gen = (e, r) => {
      const n = this.genOriginal(e, r), i = this.mokerByPath.get(e);
      return i && n.setMocker(i), n;
    });
  }
}
const T = async (...o) => {
  const { postInWindow: t } = await import("../.chunks/lazy-40pjr8cZ.es.js");
  return t(...o);
}, D = async (...o) => {
  const { dataToForm: t } = await import("../.chunks/lazy-40pjr8cZ.es.js");
  return t(...o);
}, M = (o = {}, t) => new I(o, t);
export {
  M as createClient,
  D as dataToForm,
  S as genExtRes,
  z as genFieldFilter,
  j as genFieldOrder,
  A as getBaseDomainUrl,
  k as isPublicAPI,
  T as postInWindow
};
//# sourceMappingURL=index.js.map
