@wzyjs/middle-sdk 0.3.36 → 0.3.38

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,2 +1,2 @@
1
1
  // @ts-nocheck
2
- var S=["iframe","blank"],c=(e)=>Boolean(e)&&typeof e==="object"&&!Array.isArray(e),i=(e)=>typeof e==="string"?e:"",l=(e)=>typeof e==="string"?e:null,z=(e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string"):[],A=(e)=>{if(!c(e))return;let t=i(e.id),s=i(e.identifier),o=i(e.name);if(!t||!s||!o)return;return{id:t,identifier:s,name:o}},C=(e)=>S.includes(e)?e:null,d=(e)=>{if(!Array.isArray(e))return[];return e.flatMap((t)=>{if(!c(t))return[];let s=i(t.name),o=i(t.path);if(!s||!o)return[];return[{icon:l(t.icon),isMenu:Boolean(t.isMenu),name:s,openMode:C(t.openMode),path:o,permissions:z(t.permissions)}]})},h=(e)=>{if(!Array.isArray(e))return[];return e.flatMap((t)=>{if(!c(t))return[];let s=i(t.key),o=i(t.name);if(!s||!o)return[];return[{description:l(t.description),key:s,name:o}]})},M=(e)=>h(e),y=(e)=>h(e);var F=async(e,t)=>{if(typeof t!=="string"||!t)return{app:void 0,pages:[],permissions:[],roles:[]};let s=`${e.replace(/\/$/,"")}/api/oauth/userinfo`,o=await fetch(s,{cache:"no-store",headers:{Authorization:`Bearer ${t}`}});if(!o.ok)throw Error("Failed to load middle userinfo");let r=await o.json();return{app:A(r.app),pages:d(r.pages),permissions:M(r.permissions),roles:y(r.roles)}},f=async(e,t)=>{let s=await F(e,t.middleAccessToken);t.app=s.app,t.pages=s.pages,t.permissions=s.permissions,t.roles=s.roles},p=(e)=>{e.app=void 0,e.pages=[],e.permissions=[],e.roles=[]};var k=()=>({middleAction:"middle:access-profile:refresh"}),g=(e)=>Boolean(e)&&typeof e==="object"&&!Array.isArray(e)&&e.middleAction==="middle:access-profile:refresh";import{Buffer as E}from"node:buffer";var I=300000,x=(e)=>typeof e==="number"&&Number.isFinite(e)&&Date.now()+I<e,u=(e)=>{let t=e;if(typeof t.expires_at==="number"&&Number.isFinite(t.expires_at))return t.expires_at*1000;if(typeof t.expires_in==="number"&&Number.isFinite(t.expires_in))return Date.now()+t.expires_in*1000;return},m=async(e)=>{let t=await fetch(`${e.issuer}/api/oauth/token`,{body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken}),cache:"no-store",headers:{Authorization:`Basic ${E.from(`${e.clientId}:${e.clientSecret}`).toString("base64")}`,"Content-Type":"application/x-www-form-urlencoded"},method:"POST"}),s=await t.json().catch(()=>({}));if(!t.ok||typeof s.access_token!=="string"||!s.access_token)throw Error("刷新中台 access token 失败");return{accessToken:s.access_token,accessTokenExpiresAt:u(s),refreshToken:typeof s.refresh_token==="string"&&s.refresh_token?s.refresh_token:e.refreshToken}};var U=(e,t)=>{let s=t;if(typeof s?.sub==="string")e.sub=s.sub;if(typeof s?.email==="string")e.email=s.email;if(typeof s?.name==="string")e.name=s.name;if(typeof s?.picture==="string")e.picture=s.picture},j=(e,t)=>{let s=t;if(!s?.access_token)return;if(e.middleAccessToken=s.access_token,e.middleAccessTokenExpiresAt=u(t),e.middleAuthError=void 0,typeof s.refresh_token==="string"&&s.refresh_token)e.middleRefreshToken=s.refresh_token},w=(e)=>{if(!e.middleAccessTokenExpiresAt||Date.now()>=e.middleAccessTokenExpiresAt)e.middleAccessToken=void 0,p(e)},B=async(e,t,s)=>{if(!g(s)||!t.middleAccessToken)return!1;try{await f(e,t),t.middleAuthError=void 0}catch(o){p(t),t.middleAuthError="access_profile_refresh_failed"}return!0},b=(e,t,s)=>async({token:o,account:r,profile:O,session:R,trigger:$})=>{let n=o;if(U(n,O),j(n,r),!r?.access_token&&n.middleAccessToken&&!x(n.middleAccessTokenExpiresAt)){if(!n.middleRefreshToken)return w(n),n;try{let a=await m({clientId:t,clientSecret:s,issuer:e,refreshToken:n.middleRefreshToken});n.middleAccessToken=a.accessToken,n.middleAccessTokenExpiresAt=a.accessTokenExpiresAt,n.middleRefreshToken=a.refreshToken,n.middleAuthError=void 0}catch(a){return w(n),n.middleAuthError="access_token_refresh_failed",n}}if($==="update"&&await B(e,n,R))return n;if(n.middleAccessToken&&(r?.access_token||!n.app))try{await f(e,n),n.middleAuthError=void 0}catch(a){if(r?.access_token)throw a;p(n),n.middleAuthError="access_profile_refresh_failed"}return n};var N=()=>async({session:e,token:t})=>{let s=e,o=s.user,r=t;if(s.user&&r.sub)o.id=r.sub;if(s.user)s.user.email=r.email,s.user.name=r.name,s.user.image=typeof r.picture==="string"?r.picture:null;return s.app=r.app,s.middleAuthError=r.middleAuthError,s.middleAccessToken=r.middleAccessToken,s.pages=r.pages??[],s.permissions=r.permissions??[],s.roles=r.roles??[],s};var P=(e,t,s)=>({jwt:b(e,t,s),session:N(),async redirect({url:o,baseUrl:r}){if(o.startsWith(r))return o;if(o.startsWith("/"))return`${r}${o}`;return r}});var _=(e,t)=>{let s={httpOnly:!0,path:"/",sameSite:"lax",secure:t};return{callbackUrl:{name:`${e}.callback-url`,options:s},csrfToken:{name:`${e}.csrf-token`,options:s},nonce:{name:`${e}.nonce`,options:s},pkceCodeVerifier:{name:`${e}.pkce.code-verifier`,options:{...s,maxAge:900}},sessionToken:{name:`${e}.session-token`,options:s},state:{name:`${e}.state`,options:{...s,maxAge:900}}}};var te=(e)=>{let t=e.issuer.replace(/\/$/,"");return{debug:e.debug??!1,cookies:!e.cookiePrefix?void 0:_(e.cookiePrefix,e.secureCookies??!1),pages:e.pages,secret:e.secret,callbacks:P(t,e.clientId,e.clientSecret),session:{strategy:"jwt"},providers:[{id:"middle",name:"中台登录",type:"oauth",issuer:t,clientId:e.clientId,clientSecret:e.clientSecret,checks:["pkce","state"],idToken:!0,jwks_endpoint:`${t}/api/oauth/jwks`,authorization:{url:`${t}/api/oauth/authorize`,params:{scope:"openid profile email offline_access"}},token:{url:`${t}/api/oauth/token`},userinfo:{url:`${t}/api/oauth/userinfo`},profile(s){return{email:s.email,id:s.sub,image:s.picture,name:s.name}}}]}};export{g as isMiddleAccessProfileRefreshUpdate,te as createMiddleNextAuthOptions,k as createMiddleAccessProfileRefreshUpdate};
2
+ var S=["iframe","blank"],c=(e)=>Boolean(e)&&typeof e==="object"&&!Array.isArray(e),i=(e)=>typeof e==="string"?e:"",l=(e)=>typeof e==="string"?e:null,z=(e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string"):[],A=(e)=>{if(!c(e))return;let t=i(e.id),s=i(e.identifier),o=i(e.name);if(!t||!s||!o)return;return{id:t,identifier:s,name:o}},C=(e)=>S.includes(e)?e:null,d=(e)=>{if(!Array.isArray(e))return[];return e.flatMap((t)=>{if(!c(t))return[];let s=i(t.name),o=i(t.path);if(!s||!o)return[];return[{icon:l(t.icon),isMenu:Boolean(t.isMenu),name:s,openMode:C(t.openMode),path:o,permissions:z(t.permissions)}]})},h=(e)=>{if(!Array.isArray(e))return[];return e.flatMap((t)=>{if(!c(t))return[];let s=i(t.key),o=i(t.name);if(!s||!o)return[];return[{description:l(t.description),key:s,name:o}]})},M=(e)=>h(e),y=(e)=>h(e);var F=async(e,t)=>{if(typeof t!=="string"||!t)return{app:void 0,pages:[],permissions:[],roles:[]};let s=`${e.replace(/\/$/,"")}/api/oauth/userinfo`,o=await fetch(s,{cache:"no-store",headers:{Authorization:`Bearer ${t}`}});if(!o.ok)throw Error("Failed to load middle userinfo");let r=await o.json();return{app:A(r.app),pages:d(r.pages),permissions:M(r.permissions),roles:y(r.roles)}},f=async(e,t)=>{let s=await F(e,t.middleAccessToken);t.app=s.app,t.pages=s.pages,t.permissions=s.permissions,t.roles=s.roles},p=(e)=>{e.app=void 0,e.pages=[],e.permissions=[],e.roles=[]};var k=()=>({middleAction:"middle:access-profile:refresh"}),g=(e)=>Boolean(e)&&typeof e==="object"&&!Array.isArray(e)&&e.middleAction==="middle:access-profile:refresh";import{Buffer as E}from"node:buffer";var I=300000,x=(e)=>typeof e==="number"&&Number.isFinite(e)&&Date.now()+I<e,u=(e)=>{let t=e;if(typeof t.expires_at==="number"&&Number.isFinite(t.expires_at))return t.expires_at*1000;if(typeof t.expires_in==="number"&&Number.isFinite(t.expires_in))return Date.now()+t.expires_in*1000;return},m=async(e)=>{let t=await fetch(`${e.issuer}/api/oauth/token`,{body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken}),cache:"no-store",headers:{Authorization:`Basic ${E.from(`${e.clientId}:${e.clientSecret}`).toString("base64")}`,"Content-Type":"application/x-www-form-urlencoded"},method:"POST"}),s=await t.json().catch(()=>({}));if(!t.ok||typeof s.access_token!=="string"||!s.access_token)throw Error("刷新中台 access token 失败");return{accessToken:s.access_token,accessTokenExpiresAt:u(s),refreshToken:typeof s.refresh_token==="string"&&s.refresh_token?s.refresh_token:e.refreshToken}};var U=(e,t)=>{let s=t;if(typeof s?.sub==="string")e.sub=s.sub;if(typeof s?.email==="string")e.email=s.email;if(typeof s?.name==="string")e.name=s.name;if(typeof s?.picture==="string")e.picture=s.picture},j=(e,t)=>{let s=t;if(!s?.access_token)return;if(e.middleAccessToken=s.access_token,e.middleAccessTokenExpiresAt=u(t),e.middleAuthError=void 0,typeof s.refresh_token==="string"&&s.refresh_token)e.middleRefreshToken=s.refresh_token},w=(e)=>{if(!e.middleAccessTokenExpiresAt||Date.now()>=e.middleAccessTokenExpiresAt)e.middleAccessToken=void 0,p(e)},B=async(e,t,s)=>{if(!g(s)||!t.middleAccessToken)return!1;try{await f(e,t),t.middleAuthError=void 0}catch(o){p(t),t.middleAuthError="access_profile_refresh_failed"}return!0},b=(e,t,s)=>async({token:o,account:r,profile:O,session:R,trigger:$})=>{let n=o;if(U(n,O),j(n,r),!r?.access_token&&n.middleAccessToken&&!x(n.middleAccessTokenExpiresAt)){if(!n.middleRefreshToken)return w(n),n;try{let a=await m({clientId:t,clientSecret:s,issuer:e,refreshToken:n.middleRefreshToken});n.middleAccessToken=a.accessToken,n.middleAccessTokenExpiresAt=a.accessTokenExpiresAt,n.middleRefreshToken=a.refreshToken,n.middleAuthError=void 0}catch(a){return w(n),n.middleAuthError="access_token_refresh_failed",n}}if($==="update"&&await B(e,n,R))return n;if(n.middleAccessToken&&(r?.access_token||!n.app))try{await f(e,n),n.middleAuthError=void 0}catch(a){if(r?.access_token)throw a;p(n),n.middleAuthError="access_profile_refresh_failed"}return n};var N=()=>async({session:e,token:t})=>{let s=e,o=s.user,r=t;if(s.user&&r.sub)o.id=r.sub;if(s.user)s.user.email=r.email,s.user.name=r.name,s.user.image=typeof r.picture==="string"?r.picture:null;return s.app=r.app,s.middleAuthError=r.middleAuthError,s.middleAccessToken=r.middleAccessToken,s.pages=r.pages??[],s.permissions=r.permissions??[],s.roles=r.roles??[],s};var P=(e,t,s)=>({jwt:b(e,t,s),session:N(),async redirect({url:o,baseUrl:r}){if(o.startsWith(r))return o;if(o.startsWith("/"))return`${r}${o}`;return r}});var _=(e,t)=>{let s={httpOnly:!0,path:"/",sameSite:"lax",secure:t};return{callbackUrl:{name:`${e}.callback-url`,options:s},csrfToken:{name:`${e}.csrf-token`,options:s},nonce:{name:`${e}.nonce`,options:s},pkceCodeVerifier:{name:`${e}.pkce.code-verifier`,options:{...s,maxAge:900}},sessionToken:{name:`${e}.session-token`,options:s},state:{name:`${e}.state`,options:{...s,maxAge:900}}}};var te=(e)=>{let t=e.issuer.replace(/\/$/,"");return{debug:e.debug??!1,cookies:!e.cookiePrefix?void 0:_(e.cookiePrefix,e.secureCookies??!1),pages:e.pages,secret:e.secret,callbacks:P(t,e.clientId,e.clientSecret),session:{strategy:"jwt"},providers:[{id:"middle",name:"中台登录",type:"oauth",issuer:t,clientId:e.clientId,clientSecret:e.clientSecret,checks:["pkce","state"],idToken:!0,jwks_endpoint:`${t}/api/oauth/jwks`,authorization:{url:`${t}/api/oauth/authorize`,params:{prompt:"consent",scope:"openid profile email offline_access"}},token:{url:`${t}/api/oauth/token`},userinfo:{url:`${t}/api/oauth/userinfo`},profile(s){return{email:s.email,id:s.sub,image:s.picture,name:s.name}}}]}};export{g as isMiddleAccessProfileRefreshUpdate,te as createMiddleNextAuthOptions,k as createMiddleAccessProfileRefreshUpdate};
@@ -1,3 +1,4 @@
1
1
  export declare const MiddleIframeRoutePage: (props: import("./MiddleIframeRoutePage").MiddleIframeRoutePageProps) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const resolveMiddleMenuGroups: (option?: import("./types").ResolveMiddleMenuGroupOptions) => import("./types").MiddleResolvedMenuGroup[];
2
3
  export declare const resolveMiddleMenuPages: (pages: import("./types").MiddlePage[], option?: import("./types").ResolveMiddlePageOptions) => import("./types").MiddleResolvedPage[];
3
- export type { MiddlePage, MiddleResolvedPage } from './types';
4
+ export type { MiddleMenuGroup, MiddleMenuItem, MiddlePage, MiddleResolvedMenuGroup, MiddleResolvedPage, ResolveMiddleMenuGroupOptions, } from './types';
@@ -1,3 +1,3 @@
1
1
  // @ts-nocheck
2
2
  'use client';
3
- import{useSearchParams as R}from"next/navigation";var i=(e)=>/^https?:\/\/[^\s]+$/i.test(e),m=(e)=>/^\/[^\s]*$/.test(e),d=(e)=>i(e.path)&&e.openMode!=="blank",g=(e)=>i(e.path)&&e.openMode==="blank",u=(e,t={})=>{if(!d(e))return e.path;let r=new URLSearchParams({url:e.path});return`${t.iframePagePath??"/middle"}?${r.toString()}`},M=(e)=>{if(g(e))return"blank";if(d(e))return"iframe";return"route"},p=(e,t)=>{if(!t||!m(e.path))return!1;return t===e.path||e.path!=="/"&&t.startsWith(`${e.path}/`)},h=(e,t={})=>{let r=M(e),a=r==="blank",l=t.iframePagePath??"/middle",o=r==="iframe"?t.pathname===l&&t.iframeUrl===e.path:r==="route"?p(e,t.pathname):!1;return{href:u(e,t),isActive:o,isBlank:a,isExternal:i(e.path),isIframe:r==="iframe",isRoute:r==="route",page:e,rel:a?"noreferrer":void 0,target:a?"_blank":void 0,type:r}},P=(e,t={})=>{return e.filter((r)=>r.isMenu).map((r)=>h(r,t))};import{jsx as n}from"react/jsx-runtime";var v={background:"#fff",display:"flex",flexDirection:"column",height:"100%",minHeight:720},y={border:0,flex:1,minHeight:0},S={alignItems:"center",background:"#fff",color:"#6b7280",display:"flex",justifyContent:"center",minHeight:"100%",padding:"48px 24px"},f=(e)=>{let{className:t,fallback:r="页面地址无效",style:a,url:l,urlParamName:o="url"}=e,c=R(),s=l??c.get(o)??"";if(!s||!i(s))return n("div",{className:t,style:{...S,...a},children:r});return n("div",{className:t,style:{...v,...a},children:n("iframe",{src:s,style:y,title:s})})};var D=f,N=P;export{N as resolveMiddleMenuPages,D as MiddleIframeRoutePage};
3
+ import{useSearchParams as A}from"next/navigation";var a=(e)=>/^https?:\/\/[^\s]+$/i.test(e),P=(e)=>/^\/[^\s]*$/.test(e),M=(e)=>a(e.path)&&e.openMode!=="blank",c=(e)=>a(e.path)&&e.openMode==="blank",f=(e,r={})=>{if(!M(e))return e.path;let t=new URLSearchParams({url:e.path});return`${r.iframePagePath??"/middle"}?${t.toString()}`},g=(e)=>{if(c(e))return"blank";if(M(e))return"iframe";return"route"},h=(e,r)=>{if(!r||!P(e.path))return!1;return r===e.path||e.path!=="/"&&r.startsWith(`${e.path}/`)},R=(e,r={})=>{let t=g(e),s=t==="blank",i=r.iframePagePath??"/middle",o=t==="iframe"?r.pathname===i&&r.iframeUrl===e.path:t==="route"?h(e,r.pathname):!1;return{href:f(e,r),isActive:o,isBlank:s,isExternal:a(e.path),isIframe:t==="iframe",isRoute:t==="route",page:e,rel:s?"noreferrer":void 0,target:s?"_blank":void 0,type:t}},d=(e,r={})=>{return e.filter((t)=>t.isMenu).map((t)=>R(t,r))},v=(e)=>{let[r="",t=""]=e.split("/");return{groupName:r.trim(),pageName:t.trim()}},E=(e)=>{let r=new Map;return e.forEach((t)=>{if(!t.isMenu)return;let{groupName:s,pageName:i}=v(t.name);if(!s||!i)return;let o={icon:t.icon,name:i,openMode:t.openMode,path:t.path,permissions:t.permissions},n=r.get(s);if(n){n.items.push(o);return}r.set(s,{groupName:s,items:[o]})}),Array.from(r.values())},m=(e={})=>{return E(e.pages??[]).flatMap((t)=>{let s=d(t.items.map((i)=>({...i,isMenu:!0})),e);if(!s.length)return[];return[{groupName:t.groupName,items:s}]})};import{jsx as u}from"react/jsx-runtime";var N={background:"#fff",display:"flex",flexDirection:"column",height:"100%",minHeight:720},y={border:0,flex:1,minHeight:0},G={alignItems:"center",background:"#fff",color:"#6b7280",display:"flex",justifyContent:"center",minHeight:"100%",padding:"48px 24px"},p=(e)=>{let{className:r,fallback:t="页面地址无效",style:s,url:i,urlParamName:o="url"}=e,n=A(),l=i??n.get(o)??"";if(!l||!a(l))return u("div",{className:r,style:{...G,...s},children:t});return u("div",{className:r,style:{...N,...s},children:u("iframe",{src:l,style:y,title:l})})};var U=p,O=m,T=d;export{T as resolveMiddleMenuPages,O as resolveMiddleMenuGroups,U as MiddleIframeRoutePage};
@@ -6,6 +6,20 @@ export interface MiddlePage {
6
6
  path: string;
7
7
  permissions: string[];
8
8
  }
9
+ export interface MiddleMenuItem {
10
+ icon: string | null;
11
+ name: string;
12
+ openMode: 'iframe' | 'blank' | null;
13
+ path: string;
14
+ permissions: string[];
15
+ }
16
+ export interface MiddleMenuGroup {
17
+ groupName: string;
18
+ items: MiddleMenuItem[];
19
+ }
20
+ export interface ResolveMiddleMenuGroupOptions extends ResolveMiddlePageOptions {
21
+ pages?: MiddlePage[] | null;
22
+ }
9
23
  export interface ResolveMiddlePageOptions {
10
24
  iframePagePath?: string;
11
25
  iframeUrl?: string | null;
@@ -23,3 +37,7 @@ export interface MiddleResolvedPage {
23
37
  target?: '_blank';
24
38
  type: 'route' | 'iframe' | 'blank';
25
39
  }
40
+ export interface MiddleResolvedMenuGroup {
41
+ groupName: string;
42
+ items: MiddleResolvedPage[];
43
+ }
@@ -1,3 +1,4 @@
1
- import type { MiddlePage, MiddleResolvedPage, ResolveMiddlePageOptions } from './types';
1
+ import type { MiddlePage, MiddleResolvedMenuGroup, MiddleResolvedPage, ResolveMiddleMenuGroupOptions, ResolveMiddlePageOptions } from './types';
2
2
  export declare const isExternalPagePath: (path: string) => boolean;
3
3
  export declare const resolveMiddleMenuPages: (pages: MiddlePage[], option?: ResolveMiddlePageOptions) => MiddleResolvedPage[];
4
+ export declare const resolveMiddleMenuGroups: (option?: ResolveMiddleMenuGroupOptions) => MiddleResolvedMenuGroup[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wzyjs/middle-sdk",
3
- "version": "0.3.36",
3
+ "version": "0.3.38",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "scripts": {
@@ -47,7 +47,7 @@
47
47
  "@trpc/react-query": "^11.7.0",
48
48
  "@trpc/server": "^11.7.0",
49
49
  "@types/react": "^19.1.10",
50
- "next": "^16.2.4",
50
+ "next": "^16.2.9",
51
51
  "next-auth": "^4.24.11",
52
52
  "react": "^19.1.0",
53
53
  "typescript": "^5.9.3"
@@ -84,5 +84,5 @@
84
84
  "publishConfig": {
85
85
  "access": "public"
86
86
  },
87
- "gitHead": "7db0faf741993d729a9e1c0742f480f364816222"
87
+ "gitHead": "e88061e1c33e2905e50909fab454baf1e86d0d6d"
88
88
  }