@hkyhy/marsun-components-core 0.1.23 → 0.1.25

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.
Files changed (39) hide show
  1. package/dist/components/AgentHub/Chat/utils/index.d.ts +2 -0
  2. package/dist/components/AgentHub/Chat/utils/smoothScroll.js +51 -0
  3. package/dist/components/AgentHub/Chat/utils/smoothScroll.js.map +1 -0
  4. package/dist/components/File/FilePreview/FilePreviewContent.js +11 -12
  5. package/dist/components/File/FilePreview/FilePreviewContent.js.map +1 -1
  6. package/dist/components/Filter/FilterSelect/index.d.ts +4 -2
  7. package/dist/components/Filter/FilterSelect/index.js +253 -157
  8. package/dist/components/Filter/FilterSelect/index.js.map +1 -1
  9. package/dist/components/Filter/FilterSelect/style.module.scss.js +14 -12
  10. package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -1
  11. package/dist/components/Form/index.d.ts +6 -0
  12. package/dist/components/Form/kneFormInfo.d.ts +47 -0
  13. package/dist/components/Form/kneFormInfo.js +23 -0
  14. package/dist/components/Form/kneFormInfo.js.map +1 -0
  15. package/dist/components/Form/kneReactForm.d.ts +8 -0
  16. package/dist/components/Layout/PageSpin/index.js +5 -5
  17. package/dist/components/Layout/PageSpin/index.js.map +1 -1
  18. package/dist/components/Table/Table.d.ts +8 -0
  19. package/dist/components/Table/Table.js +39 -0
  20. package/dist/components/Table/Table.js.map +1 -0
  21. package/dist/components/Table/index.d.ts +2 -0
  22. package/dist/components/Table/style.module.scss.js +7 -0
  23. package/dist/components/Table/style.module.scss.js.map +1 -0
  24. package/dist/components/index.d.ts +1 -0
  25. package/dist/index.d.ts +3 -1
  26. package/dist/index.js +379 -332
  27. package/dist/index.js.map +1 -1
  28. package/dist/marsun-components-core.css +1 -1
  29. package/dist/styles/global.css +1 -1
  30. package/dist/theme/theme.js +8 -6
  31. package/dist/theme/theme.js.map +1 -1
  32. package/dist/theme/tokens.css +12 -0
  33. package/dist/utils/authRedirect.d.ts +17 -4
  34. package/dist/utils/authRedirect.js +39 -20
  35. package/dist/utils/authRedirect.js.map +1 -1
  36. package/dist/utils/createMarsunRequest.d.ts +2 -0
  37. package/dist/utils/createMarsunRequest.js +20 -18
  38. package/dist/utils/createMarsunRequest.js.map +1 -1
  39. package/package.json +4 -1
@@ -1,33 +1,52 @@
1
- const i = "redirect_url", a = "/dashboard";
2
- function o(t) {
1
+ const o = "redirect_url", d = "/dashboard";
2
+ function c(t) {
3
3
  return !(!t.startsWith("/") || t.startsWith("//") || t === "/login" || t.startsWith("/login?"));
4
4
  }
5
- function s(t) {
6
- return !t || !o(t) ? a : t;
5
+ function f(t, n) {
6
+ try {
7
+ const r = new URL(t);
8
+ return r.protocol !== "http:" && r.protocol !== "https:" || n.length === 0 ? !1 : n.includes(r.origin);
9
+ } catch {
10
+ return !1;
11
+ }
7
12
  }
8
- function c(t, r = "", n = "") {
9
- return `${t}${r}${n}`;
13
+ function l(t, n = []) {
14
+ return c(t) ? !0 : f(t, n);
10
15
  }
11
- function d(t, r = "/login") {
12
- const n = t ?? c(
16
+ function h(t, n = []) {
17
+ return !t || !l(t, n) ? d : t;
18
+ }
19
+ function w(t, n = "", r = "") {
20
+ return `${t}${n}${r}`;
21
+ }
22
+ function R(t = window.location.pathname, n = window.location.search, r = window.location.hash) {
23
+ return `${window.location.origin}${t}${n}${r}`;
24
+ }
25
+ function g(t, n = "/login") {
26
+ const r = typeof n == "string" ? { loginPath: n } : n, e = r.loginPath || "/login", u = r.allowedRedirectOrigins || [], i = t ?? (r.useAbsoluteRedirect ? R() : w(
13
27
  window.location.pathname,
14
28
  window.location.search,
15
29
  window.location.hash
16
- );
17
- if (!o(n))
18
- return r;
19
- const e = new URLSearchParams();
20
- return e.set(i, n), `${r}?${e.toString()}`;
30
+ ));
31
+ if (!l(i, u) && !c(i))
32
+ return e;
33
+ const a = new URLSearchParams();
34
+ if (a.set(o, i), /^https?:\/\//i.test(e)) {
35
+ const s = new URL(e);
36
+ return s.searchParams.set(o, i), s.toString();
37
+ }
38
+ return `${e}?${a.toString()}`;
21
39
  }
22
- function u(t) {
40
+ function p(t, n = []) {
23
41
  const r = new URLSearchParams(t.startsWith("?") ? t.slice(1) : t);
24
- return s(r.get(i));
42
+ return h(r.get(o), n);
25
43
  }
26
44
  export {
27
- i as REDIRECT_URL_PARAM,
28
- c as buildLocationRedirectUrl,
29
- d as buildLoginPath,
30
- u as readRedirectUrlFromSearch,
31
- s as resolveRedirectUrl
45
+ o as REDIRECT_URL_PARAM,
46
+ R as buildAbsoluteLocationRedirectUrl,
47
+ w as buildLocationRedirectUrl,
48
+ g as buildLoginPath,
49
+ p as readRedirectUrlFromSearch,
50
+ h as resolveRedirectUrl
32
51
  };
33
52
  //# sourceMappingURL=authRedirect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authRedirect.js","sources":["../../src/utils/authRedirect.ts"],"sourcesContent":["export const REDIRECT_URL_PARAM = 'redirect_url';\n\nconst DEFAULT_POST_LOGIN_PATH = '/dashboard';\n\nfunction isSafeRedirectUrl(url: string): boolean {\n if (!url.startsWith('/') || url.startsWith('//')) {\n return false;\n }\n if (url === '/login' || url.startsWith('/login?')) {\n return false;\n }\n return true;\n}\n\nexport function resolveRedirectUrl(value: string | null | undefined): string {\n if (!value || !isSafeRedirectUrl(value)) {\n return DEFAULT_POST_LOGIN_PATH;\n }\n return value;\n}\n\nexport function buildLocationRedirectUrl(pathname: string, search = '', hash = ''): string {\n return `${pathname}${search}${hash}`;\n}\n\n/** 构建带 redirect_url 的登录页路径 */\nexport function buildLoginPath(redirectUrl?: string, loginPath = '/login'): string {\n const target =\n redirectUrl ??\n buildLocationRedirectUrl(\n window.location.pathname,\n window.location.search,\n window.location.hash,\n );\n\n if (!isSafeRedirectUrl(target)) {\n return loginPath;\n }\n\n const params = new URLSearchParams();\n params.set(REDIRECT_URL_PARAM, target);\n return `${loginPath}?${params.toString()}`;\n}\n\nexport function readRedirectUrlFromSearch(search: string): string {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n return resolveRedirectUrl(params.get(REDIRECT_URL_PARAM));\n}\n"],"names":["REDIRECT_URL_PARAM","DEFAULT_POST_LOGIN_PATH","isSafeRedirectUrl","url","resolveRedirectUrl","value","buildLocationRedirectUrl","pathname","search","hash","buildLoginPath","redirectUrl","loginPath","target","params","readRedirectUrlFromSearch"],"mappings":"AAAO,MAAMA,IAAqB,gBAE5BC,IAA0B;AAEhC,SAASC,EAAkBC,GAAsB;AAI/C,SAHI,GAACA,EAAI,WAAW,GAAG,KAAKA,EAAI,WAAW,IAAI,KAG3CA,MAAQ,YAAYA,EAAI,WAAW,SAAS;AAIlD;AAEO,SAASC,EAAmBC,GAA0C;AAC3E,SAAI,CAACA,KAAS,CAACH,EAAkBG,CAAK,IAC7BJ,IAEFI;AACT;AAEO,SAASC,EAAyBC,GAAkBC,IAAS,IAAIC,IAAO,IAAY;AACzF,SAAO,GAAGF,CAAQ,GAAGC,CAAM,GAAGC,CAAI;AACpC;AAGO,SAASC,EAAeC,GAAsBC,IAAY,UAAkB;AACjF,QAAMC,IACJF,KACAL;AAAA,IACE,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,EAAA;AAGpB,MAAI,CAACJ,EAAkBW,CAAM;AAC3B,WAAOD;AAGT,QAAME,IAAS,IAAI,gBAAA;AACnB,SAAAA,EAAO,IAAId,GAAoBa,CAAM,GAC9B,GAAGD,CAAS,IAAIE,EAAO,UAAU;AAC1C;AAEO,SAASC,EAA0BP,GAAwB;AAChE,QAAMM,IAAS,IAAI,gBAAgBN,EAAO,WAAW,GAAG,IAAIA,EAAO,MAAM,CAAC,IAAIA,CAAM;AACpF,SAAOJ,EAAmBU,EAAO,IAAId,CAAkB,CAAC;AAC1D;"}
1
+ {"version":3,"file":"authRedirect.js","sources":["../../src/utils/authRedirect.ts"],"sourcesContent":["export const REDIRECT_URL_PARAM = 'redirect_url';\n\nconst DEFAULT_POST_LOGIN_PATH = '/dashboard';\n\nexport type BuildLoginPathOptions = {\n /** 登录页路径或绝对 URL(如 https://auth.parent.com/login) */\n loginPath?: string;\n /** 允许的绝对 redirect 源;未传时仅允许相对路径 */\n allowedRedirectOrigins?: string[];\n /** 为 true 时,默认 redirect 使用当前页绝对 URL(跨子系统 SSO) */\n useAbsoluteRedirect?: boolean;\n};\n\nfunction isSafeRelativeRedirect(url: string): boolean {\n if (!url.startsWith('/') || url.startsWith('//')) {\n return false;\n }\n if (url === '/login' || url.startsWith('/login?')) {\n return false;\n }\n return true;\n}\n\nfunction isSafeAbsoluteRedirect(url: string, allowedOrigins: string[]): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return false;\n }\n if (allowedOrigins.length === 0) {\n return false;\n }\n return allowedOrigins.includes(parsed.origin);\n } catch {\n return false;\n }\n}\n\nfunction isSafeRedirectUrl(url: string, allowedOrigins: string[] = []): boolean {\n if (isSafeRelativeRedirect(url)) {\n return true;\n }\n return isSafeAbsoluteRedirect(url, allowedOrigins);\n}\n\nexport function resolveRedirectUrl(\n value: string | null | undefined,\n allowedOrigins: string[] = [],\n): string {\n if (!value || !isSafeRedirectUrl(value, allowedOrigins)) {\n return DEFAULT_POST_LOGIN_PATH;\n }\n return value;\n}\n\nexport function buildLocationRedirectUrl(pathname: string, search = '', hash = ''): string {\n return `${pathname}${search}${hash}`;\n}\n\n/** 当前页绝对 URL(用于跨子域 SSO redirect_url) */\nexport function buildAbsoluteLocationRedirectUrl(\n pathname = window.location.pathname,\n search = window.location.search,\n hash = window.location.hash,\n): string {\n return `${window.location.origin}${pathname}${search}${hash}`;\n}\n\n/**\n * 构建带 redirect_url 的登录页路径。\n * `loginPath` 可为相对路径或绝对 URL(VITE_AUTH_LOGIN_URL)。\n */\nexport function buildLoginPath(\n redirectUrl?: string,\n loginPathOrOptions: string | BuildLoginPathOptions = '/login',\n): string {\n const options: BuildLoginPathOptions =\n typeof loginPathOrOptions === 'string' ? { loginPath: loginPathOrOptions } : loginPathOrOptions;\n\n const loginPath = options.loginPath || '/login';\n const allowedOrigins = options.allowedRedirectOrigins || [];\n\n const target =\n redirectUrl ??\n (options.useAbsoluteRedirect\n ? buildAbsoluteLocationRedirectUrl()\n : buildLocationRedirectUrl(\n window.location.pathname,\n window.location.search,\n window.location.hash,\n ));\n\n if (!isSafeRedirectUrl(target, allowedOrigins) && !isSafeRelativeRedirect(target)) {\n return loginPath;\n }\n\n const params = new URLSearchParams();\n params.set(REDIRECT_URL_PARAM, target);\n\n if (/^https?:\\/\\//i.test(loginPath)) {\n const url = new URL(loginPath);\n url.searchParams.set(REDIRECT_URL_PARAM, target);\n return url.toString();\n }\n\n return `${loginPath}?${params.toString()}`;\n}\n\nexport function readRedirectUrlFromSearch(search: string, allowedOrigins: string[] = []): string {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n return resolveRedirectUrl(params.get(REDIRECT_URL_PARAM), allowedOrigins);\n}\n"],"names":["REDIRECT_URL_PARAM","DEFAULT_POST_LOGIN_PATH","isSafeRelativeRedirect","url","isSafeAbsoluteRedirect","allowedOrigins","parsed","isSafeRedirectUrl","resolveRedirectUrl","value","buildLocationRedirectUrl","pathname","search","hash","buildAbsoluteLocationRedirectUrl","buildLoginPath","redirectUrl","loginPathOrOptions","options","loginPath","target","params","readRedirectUrlFromSearch"],"mappings":"AAAO,MAAMA,IAAqB,gBAE5BC,IAA0B;AAWhC,SAASC,EAAuBC,GAAsB;AAIpD,SAHI,GAACA,EAAI,WAAW,GAAG,KAAKA,EAAI,WAAW,IAAI,KAG3CA,MAAQ,YAAYA,EAAI,WAAW,SAAS;AAIlD;AAEA,SAASC,EAAuBD,GAAaE,GAAmC;AAC9E,MAAI;AACF,UAAMC,IAAS,IAAI,IAAIH,CAAG;AAI1B,WAHIG,EAAO,aAAa,WAAWA,EAAO,aAAa,YAGnDD,EAAe,WAAW,IACrB,KAEFA,EAAe,SAASC,EAAO,MAAM;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,EAAkBJ,GAAaE,IAA2B,IAAa;AAC9E,SAAIH,EAAuBC,CAAG,IACrB,KAEFC,EAAuBD,GAAKE,CAAc;AACnD;AAEO,SAASG,EACdC,GACAJ,IAA2B,IACnB;AACR,SAAI,CAACI,KAAS,CAACF,EAAkBE,GAAOJ,CAAc,IAC7CJ,IAEFQ;AACT;AAEO,SAASC,EAAyBC,GAAkBC,IAAS,IAAIC,IAAO,IAAY;AACzF,SAAO,GAAGF,CAAQ,GAAGC,CAAM,GAAGC,CAAI;AACpC;AAGO,SAASC,EACdH,IAAW,OAAO,SAAS,UAC3BC,IAAS,OAAO,SAAS,QACzBC,IAAO,OAAO,SAAS,MACf;AACR,SAAO,GAAG,OAAO,SAAS,MAAM,GAAGF,CAAQ,GAAGC,CAAM,GAAGC,CAAI;AAC7D;AAMO,SAASE,EACdC,GACAC,IAAqD,UAC7C;AACR,QAAMC,IACJ,OAAOD,KAAuB,WAAW,EAAE,WAAWA,MAAuBA,GAEzEE,IAAYD,EAAQ,aAAa,UACjCb,IAAiBa,EAAQ,0BAA0B,CAAA,GAEnDE,IACJJ,MACCE,EAAQ,sBACLJ,MACAJ;AAAA,IACE,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,EAAA;AAGxB,MAAI,CAACH,EAAkBa,GAAQf,CAAc,KAAK,CAACH,EAAuBkB,CAAM;AAC9E,WAAOD;AAGT,QAAME,IAAS,IAAI,gBAAA;AAGnB,MAFAA,EAAO,IAAIrB,GAAoBoB,CAAM,GAEjC,gBAAgB,KAAKD,CAAS,GAAG;AACnC,UAAMhB,IAAM,IAAI,IAAIgB,CAAS;AAC7B,WAAAhB,EAAI,aAAa,IAAIH,GAAoBoB,CAAM,GACxCjB,EAAI,SAAA;AAAA,EACb;AAEA,SAAO,GAAGgB,CAAS,IAAIE,EAAO,UAAU;AAC1C;AAEO,SAASC,EAA0BV,GAAgBP,IAA2B,IAAY;AAC/F,QAAMgB,IAAS,IAAI,gBAAgBT,EAAO,WAAW,GAAG,IAAIA,EAAO,MAAM,CAAC,IAAIA,CAAM;AACpF,SAAOJ,EAAmBa,EAAO,IAAIrB,CAAkB,GAAGK,CAAc;AAC1E;"}
@@ -7,6 +7,8 @@ export interface CreateMarsunRequestOptions {
7
7
  baseURL?: string;
8
8
  timeout?: number;
9
9
  successCode?: number;
10
+ /** Cookie 会话 SSO:跨域携带凭证 */
11
+ withCredentials?: boolean;
10
12
  getToken?: () => string | null;
11
13
  onUnauthorized?: () => void;
12
14
  isPublicUrl?: (url: string) => boolean;
@@ -1,53 +1,55 @@
1
- import { message as w } from "antd";
1
+ import { message as C } from "antd";
2
2
  import "../node_modules/axios/index.js";
3
3
  import S from "../node_modules/axios/lib/axios.js";
4
4
  const b = "X-Skip-Error-Handler";
5
- function l(t) {
5
+ function g(t) {
6
6
  return !!(t != null && t[b]);
7
7
  }
8
- function C(t = {}) {
8
+ function B(t = {}) {
9
9
  const {
10
10
  baseURL: d = "/api",
11
11
  timeout: E = 3e4,
12
12
  successCode: P = 0,
13
+ withCredentials: R = !1,
13
14
  getToken: r,
14
15
  onUnauthorized: n,
15
- isPublicUrl: R = () => !1,
16
- isOnLoginPage: j = () => !1,
17
- showError: a = (e) => w.error(e)
18
- } = t, o = S.create({
16
+ isPublicUrl: j = () => !1,
17
+ isOnLoginPage: w = () => !1,
18
+ showError: o = (e) => C.error(e)
19
+ } = t, a = S.create({
19
20
  baseURL: d,
20
21
  timeout: E,
22
+ withCredentials: R,
21
23
  headers: {
22
24
  "Content-Type": "application/json"
23
25
  }
24
26
  });
25
- return o.interceptors.request.use(
27
+ return a.interceptors.request.use(
26
28
  (e) => {
27
29
  const s = r == null ? void 0 : r();
28
30
  return s && (e.headers.Authorization = `Bearer ${s}`), e;
29
31
  },
30
32
  (e) => Promise.reject(e)
31
- ), o.interceptors.response.use(
33
+ ), a.interceptors.response.use(
32
34
  (e) => {
33
35
  const s = e.data;
34
- return s.code !== P ? (l(e.config.headers) || a(s.message || "请求失败"), Promise.reject(new Error(s.message || "请求失败"))) : e.data;
36
+ return s.code !== P ? (g(e.config.headers) || o(s.message || "请求失败"), Promise.reject(new Error(s.message || "请求失败"))) : e.data;
35
37
  },
36
38
  (e) => {
37
- var i, c, u, m, p, f, g;
38
- const s = ((i = e.config) == null ? void 0 : i.url) ?? "", H = l((c = e.config) == null ? void 0 : c.headers);
39
+ var i, c, u, m, f, p, l;
40
+ const s = ((i = e.config) == null ? void 0 : i.url) ?? "", H = g((c = e.config) == null ? void 0 : c.headers);
39
41
  if (((u = e.response) == null ? void 0 : u.status) === 401)
40
- !R(s) && !j() && (n == null || n());
42
+ !j(s) && !w() && (n == null || n());
41
43
  else if (!H) {
42
- const q = ((p = (m = e.response) == null ? void 0 : m.data) == null ? void 0 : p.message) || e.message || "请求失败";
43
- a(q);
44
+ const q = ((f = (m = e.response) == null ? void 0 : m.data) == null ? void 0 : f.message) || e.message || "请求失败";
45
+ o(q);
44
46
  }
45
- const k = ((g = (f = e.response) == null ? void 0 : f.data) == null ? void 0 : g.message) || e.message || "请求失败";
47
+ const k = ((l = (p = e.response) == null ? void 0 : p.data) == null ? void 0 : l.message) || e.message || "请求失败";
46
48
  return Promise.reject(new Error(k));
47
49
  }
48
- ), o;
50
+ ), a;
49
51
  }
50
52
  export {
51
- C as createMarsunRequest
53
+ B as createMarsunRequest
52
54
  };
53
55
  //# sourceMappingURL=createMarsunRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createMarsunRequest.js","sources":["../../src/utils/createMarsunRequest.ts"],"sourcesContent":["import { message } from 'antd';\nimport axios from 'axios';\n\nexport interface MarsunApiResponse<T = unknown> {\n code: number;\n message?: string;\n data?: T;\n}\n\nexport interface CreateMarsunRequestOptions {\n baseURL?: string;\n timeout?: number;\n successCode?: number;\n getToken?: () => string | null;\n onUnauthorized?: () => void;\n isPublicUrl?: (url: string) => boolean;\n isOnLoginPage?: () => boolean;\n showError?: (msg: string) => void;\n}\n\n/** 与 axios 实例兼容的请求客户端(避免对外暴露 axios 类型,消除多副本 axios 的类型冲突) */\nexport interface MarsunRequestClient {\n get<T = unknown>(url: string, config?: unknown): Promise<T>;\n post<T = unknown>(url: string, data?: unknown, config?: unknown): Promise<T>;\n put<T = unknown>(url: string, data?: unknown, config?: unknown): Promise<T>;\n patch<T = unknown>(url: string, data?: unknown, config?: unknown): Promise<T>;\n delete<T = unknown>(url: string, config?: unknown): Promise<T>;\n request<T = unknown>(config: unknown): Promise<T>;\n}\n\nconst SKIP_ERROR_HEADER = 'X-Skip-Error-Handler';\n\nfunction getSkipHandler(headers: unknown): boolean {\n return Boolean((headers as Record<string, string> | undefined)?.[SKIP_ERROR_HEADER]);\n}\n\n/** 创建带鉴权、统一错误处理的 axios 实例 */\nexport function createMarsunRequest(options: CreateMarsunRequestOptions = {}): MarsunRequestClient {\n const {\n baseURL = '/api',\n timeout = 30000,\n successCode = 0,\n getToken,\n onUnauthorized,\n isPublicUrl = () => false,\n isOnLoginPage = () => false,\n showError = (msg) => message.error(msg),\n } = options;\n\n const request = axios.create({\n baseURL,\n timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n request.interceptors.request.use(\n (config) => {\n const token = getToken?.();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => Promise.reject(error),\n );\n\n request.interceptors.response.use(\n (response) => {\n const data = response.data as MarsunApiResponse;\n if (data.code !== successCode) {\n if (!getSkipHandler(response.config.headers)) {\n showError(data.message || '请求失败');\n }\n return Promise.reject(new Error(data.message || '请求失败'));\n }\n return response.data;\n },\n (error) => {\n const url = error.config?.url ?? '';\n const skipHandler = getSkipHandler(error.config?.headers);\n\n if (error.response?.status === 401) {\n if (!isPublicUrl(url) && !isOnLoginPage()) {\n onUnauthorized?.();\n }\n } else if (!skipHandler) {\n const msg = error.response?.data?.message || error.message || '请求失败';\n showError(msg);\n }\n const msg = error.response?.data?.message || error.message || '请求失败';\n return Promise.reject(new Error(msg));\n },\n );\n\n return request as MarsunRequestClient;\n}\n"],"names":["SKIP_ERROR_HEADER","getSkipHandler","headers","createMarsunRequest","options","baseURL","timeout","successCode","getToken","onUnauthorized","isPublicUrl","isOnLoginPage","showError","msg","message","request","axios","config","token","error","response","data","url","_a","skipHandler","_b","_c","_e","_d","_g","_f"],"mappings":";;;AA8BA,MAAMA,IAAoB;AAE1B,SAASC,EAAeC,GAA2B;AACjD,SAAO,GAASA,KAAA,QAAAA,EAAiDF;AACnE;AAGO,SAASG,EAAoBC,IAAsC,IAAyB;AACjG,QAAM;AAAA,IACJ,SAAAC,IAAU;AAAA,IACV,SAAAC,IAAU;AAAA,IACV,aAAAC,IAAc;AAAA,IACd,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAC,IAAc,MAAM;AAAA,IACpB,eAAAC,IAAgB,MAAM;AAAA,IACtB,WAAAC,IAAY,CAACC,MAAQC,EAAQ,MAAMD,CAAG;AAAA,EAAA,IACpCT,GAEEW,IAAUC,EAAM,OAAO;AAAA,IAC3B,SAAAX;AAAA,IACA,SAAAC;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD;AAED,SAAAS,EAAQ,aAAa,QAAQ;AAAA,IAC3B,CAACE,MAAW;AACV,YAAMC,IAAQV,KAAA,gBAAAA;AACd,aAAIU,MACFD,EAAO,QAAQ,gBAAgB,UAAUC,CAAK,KAEzCD;AAAA,IACT;AAAA,IACA,CAACE,MAAU,QAAQ,OAAOA,CAAK;AAAA,EAAA,GAGjCJ,EAAQ,aAAa,SAAS;AAAA,IAC5B,CAACK,MAAa;AACZ,YAAMC,IAAOD,EAAS;AACtB,aAAIC,EAAK,SAASd,KACXN,EAAemB,EAAS,OAAO,OAAO,KACzCR,EAAUS,EAAK,WAAW,MAAM,GAE3B,QAAQ,OAAO,IAAI,MAAMA,EAAK,WAAW,MAAM,CAAC,KAElDD,EAAS;AAAA,IAClB;AAAA,IACA,CAACD,MAAU;;AACT,YAAMG,MAAMC,IAAAJ,EAAM,WAAN,gBAAAI,EAAc,QAAO,IAC3BC,IAAcvB,GAAewB,IAAAN,EAAM,WAAN,gBAAAM,EAAc,OAAO;AAExD,YAAIC,IAAAP,EAAM,aAAN,gBAAAO,EAAgB,YAAW;AAC7B,QAAI,CAAChB,EAAYY,CAAG,KAAK,CAACX,QACxBF,KAAA,QAAAA;AAAA,eAEO,CAACe,GAAa;AACvB,cAAMX,MAAMc,KAAAC,IAAAT,EAAM,aAAN,gBAAAS,EAAgB,SAAhB,gBAAAD,EAAsB,YAAWR,EAAM,WAAW;AAC9D,QAAAP,EAAUC,CAAG;AAAA,MACf;AACA,YAAMA,MAAMgB,KAAAC,IAAAX,EAAM,aAAN,gBAAAW,EAAgB,SAAhB,gBAAAD,EAAsB,YAAWV,EAAM,WAAW;AAC9D,aAAO,QAAQ,OAAO,IAAI,MAAMN,CAAG,CAAC;AAAA,IACtC;AAAA,EAAA,GAGKE;AACT;"}
1
+ {"version":3,"file":"createMarsunRequest.js","sources":["../../src/utils/createMarsunRequest.ts"],"sourcesContent":["import { message } from 'antd';\nimport axios from 'axios';\n\nexport interface MarsunApiResponse<T = unknown> {\n code: number;\n message?: string;\n data?: T;\n}\n\nexport interface CreateMarsunRequestOptions {\n baseURL?: string;\n timeout?: number;\n successCode?: number;\n /** Cookie 会话 SSO:跨域携带凭证 */\n withCredentials?: boolean;\n getToken?: () => string | null;\n onUnauthorized?: () => void;\n isPublicUrl?: (url: string) => boolean;\n isOnLoginPage?: () => boolean;\n showError?: (msg: string) => void;\n}\n\n/** 与 axios 实例兼容的请求客户端(避免对外暴露 axios 类型,消除多副本 axios 的类型冲突) */\nexport interface MarsunRequestClient {\n get<T = unknown>(url: string, config?: unknown): Promise<T>;\n post<T = unknown>(url: string, data?: unknown, config?: unknown): Promise<T>;\n put<T = unknown>(url: string, data?: unknown, config?: unknown): Promise<T>;\n patch<T = unknown>(url: string, data?: unknown, config?: unknown): Promise<T>;\n delete<T = unknown>(url: string, config?: unknown): Promise<T>;\n request<T = unknown>(config: unknown): Promise<T>;\n}\n\nconst SKIP_ERROR_HEADER = 'X-Skip-Error-Handler';\n\nfunction getSkipHandler(headers: unknown): boolean {\n return Boolean((headers as Record<string, string> | undefined)?.[SKIP_ERROR_HEADER]);\n}\n\n/** 创建带鉴权、统一错误处理的 axios 实例 */\nexport function createMarsunRequest(options: CreateMarsunRequestOptions = {}): MarsunRequestClient {\n const {\n baseURL = '/api',\n timeout = 30000,\n successCode = 0,\n withCredentials = false,\n getToken,\n onUnauthorized,\n isPublicUrl = () => false,\n isOnLoginPage = () => false,\n showError = (msg) => message.error(msg),\n } = options;\n\n const request = axios.create({\n baseURL,\n timeout,\n withCredentials,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n request.interceptors.request.use(\n (config) => {\n const token = getToken?.();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => Promise.reject(error),\n );\n\n request.interceptors.response.use(\n (response) => {\n const data = response.data as MarsunApiResponse;\n if (data.code !== successCode) {\n if (!getSkipHandler(response.config.headers)) {\n showError(data.message || '请求失败');\n }\n return Promise.reject(new Error(data.message || '请求失败'));\n }\n return response.data;\n },\n (error) => {\n const url = error.config?.url ?? '';\n const skipHandler = getSkipHandler(error.config?.headers);\n\n if (error.response?.status === 401) {\n if (!isPublicUrl(url) && !isOnLoginPage()) {\n onUnauthorized?.();\n }\n } else if (!skipHandler) {\n const msg = error.response?.data?.message || error.message || '请求失败';\n showError(msg);\n }\n const msg = error.response?.data?.message || error.message || '请求失败';\n return Promise.reject(new Error(msg));\n },\n );\n\n return request as MarsunRequestClient;\n}\n"],"names":["SKIP_ERROR_HEADER","getSkipHandler","headers","createMarsunRequest","options","baseURL","timeout","successCode","withCredentials","getToken","onUnauthorized","isPublicUrl","isOnLoginPage","showError","msg","message","request","axios","config","token","error","response","data","url","_a","skipHandler","_b","_c","_e","_d","_g","_f"],"mappings":";;;AAgCA,MAAMA,IAAoB;AAE1B,SAASC,EAAeC,GAA2B;AACjD,SAAO,GAASA,KAAA,QAAAA,EAAiDF;AACnE;AAGO,SAASG,EAAoBC,IAAsC,IAAyB;AACjG,QAAM;AAAA,IACJ,SAAAC,IAAU;AAAA,IACV,SAAAC,IAAU;AAAA,IACV,aAAAC,IAAc;AAAA,IACd,iBAAAC,IAAkB;AAAA,IAClB,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAC,IAAc,MAAM;AAAA,IACpB,eAAAC,IAAgB,MAAM;AAAA,IACtB,WAAAC,IAAY,CAACC,MAAQC,EAAQ,MAAMD,CAAG;AAAA,EAAA,IACpCV,GAEEY,IAAUC,EAAM,OAAO;AAAA,IAC3B,SAAAZ;AAAA,IACA,SAAAC;AAAA,IACA,iBAAAE;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD;AAED,SAAAQ,EAAQ,aAAa,QAAQ;AAAA,IAC3B,CAACE,MAAW;AACV,YAAMC,IAAQV,KAAA,gBAAAA;AACd,aAAIU,MACFD,EAAO,QAAQ,gBAAgB,UAAUC,CAAK,KAEzCD;AAAA,IACT;AAAA,IACA,CAACE,MAAU,QAAQ,OAAOA,CAAK;AAAA,EAAA,GAGjCJ,EAAQ,aAAa,SAAS;AAAA,IAC5B,CAACK,MAAa;AACZ,YAAMC,IAAOD,EAAS;AACtB,aAAIC,EAAK,SAASf,KACXN,EAAeoB,EAAS,OAAO,OAAO,KACzCR,EAAUS,EAAK,WAAW,MAAM,GAE3B,QAAQ,OAAO,IAAI,MAAMA,EAAK,WAAW,MAAM,CAAC,KAElDD,EAAS;AAAA,IAClB;AAAA,IACA,CAACD,MAAU;;AACT,YAAMG,MAAMC,IAAAJ,EAAM,WAAN,gBAAAI,EAAc,QAAO,IAC3BC,IAAcxB,GAAeyB,IAAAN,EAAM,WAAN,gBAAAM,EAAc,OAAO;AAExD,YAAIC,IAAAP,EAAM,aAAN,gBAAAO,EAAgB,YAAW;AAC7B,QAAI,CAAChB,EAAYY,CAAG,KAAK,CAACX,QACxBF,KAAA,QAAAA;AAAA,eAEO,CAACe,GAAa;AACvB,cAAMX,MAAMc,KAAAC,IAAAT,EAAM,aAAN,gBAAAS,EAAgB,SAAhB,gBAAAD,EAAsB,YAAWR,EAAM,WAAW;AAC9D,QAAAP,EAAUC,CAAG;AAAA,MACf;AACA,YAAMA,MAAMgB,KAAAC,IAAAX,EAAM,aAAN,gBAAAW,EAAgB,SAAhB,gBAAAD,EAAsB,YAAWV,EAAM,WAAW;AAC9D,aAAO,QAAQ,OAAO,IAAI,MAAMN,CAAG,CAAC;AAAA,IACtC;AAAA,EAAA,GAGKE;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkyhy/marsun-components-core",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
4
4
  "description": "Marsun pure UI component library",
5
5
  "type": "module",
6
6
  "repository": {
@@ -76,6 +76,9 @@
76
76
  "dependencies": {
77
77
  "@js-preview/excel": "^1.7.14",
78
78
  "@kne/button-group": "^0.1.24",
79
+ "@kne/form-info": "^0.1.10",
80
+ "@kne/react-form": "^3.1.9",
81
+ "@kne/react-form-antd": "^4.1.2",
79
82
  "ahooks": "^3.8.1",
80
83
  "classnames": "^2.5.1",
81
84
  "dayjs": "^1.11.13",