transone 0.1.2 → 0.3.0

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.
@@ -0,0 +1,27 @@
1
+ var l=":root{--cyy-rpx:calc(min(100vw, 750px) / 750);}",c=/(-?\d+(?:\.\d+)?)rpx/g;function i(e){return String(e).replace(c,(t,r)=>`calc(${r} * var(--cyy-rpx))`)}class p{styleElement=null;styles=new Map;constructor(){}addStyle(e,t){this.styles.set(e,t),this.updateStyles()}removeStyle(e){this.styles.delete(e),this.updateStyles()}clearStyles(){if(this.styles.clear(),this.styleElement)this.styleElement.textContent=""}destroy(){if(this.clearStyles(),this.styleElement)this.styleElement.remove(),this.styleElement=null}ensureStyleElement(){if(!this.styleElement){let e=document.createElement("style");document.head.appendChild(e),this.styleElement=e}return this.styleElement}convertToCSS(e){return Object.entries(e).map(([t,r])=>`${t.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${i(r)};`).join(`
2
+ `)}updateStyles(){if(this.styles.size===0){if(this.styleElement)this.styleElement.textContent="";return}let e=this.ensureStyleElement(),t=l+`
3
+ `;this.styles.forEach((r)=>{if(t+=`${r.selector} {
4
+ ${this.convertToCSS(r.properties)}
5
+ }
6
+ `,r.hover)t+=`${r.selector}:hover {
7
+ ${this.convertToCSS(r.hover)}
8
+ }
9
+ `;if(r.media)Object.entries(r.media).forEach(([n,s])=>{t+=`@media ${n} {
10
+ ${r.selector} {
11
+ ${this.convertToCSS(s)}
12
+ }
13
+ }
14
+ `})}),e.textContent=t}}function m(e){return e.map((t)=>o(t)).join(`
15
+
16
+ `)}function o(e,t=""){if("atRule"in e){let n=e.rules.map((s)=>o(s,`${t} `)).join(`
17
+
18
+ `);return`${t}${e.atRule} {
19
+ ${n}
20
+ ${t}}`}let r=Object.entries(e.properties).map(([n,s])=>`${t} ${u(n)}: ${String(s)};`).join(`
21
+ `);return`${t}${e.selector} {
22
+ ${r}
23
+ ${t}}`}function u(e){if(e.startsWith("--")||e.includes("-"))return e;return e.replace(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}
24
+ export{i as Ca,p as Da,m as Ea};
25
+
26
+ //# debugId=C326383C7F39C8EB64756E2164756E21
27
+ //# sourceMappingURL=index-d5wsetxf.js.map
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../lib/style/units.ts", "../lib/style/StyleManager.ts", "../lib/style/sheet.ts"],
4
+ "sourcesContent": [
5
+ "/** 跨端尺寸单位换算:rpx(微信 750 设计宽)在 H5 端转换为视口相对值。\n *\n * 1rpx = 视口宽度 / 750,且视口宽度上限 750px(桌面端不再放大,页面按\n * 750px 基准居中显示,与小程序设计宽一致)。\n */\n\n/** 根 CSS 变量:--cyy-rpx 为 1rpx 的等效长度 */\nexport const ROOT_RPX_RULE =\n ':root{--cyy-rpx:calc(min(100vw, 750px) / 750);}';\n\nconst RPX_PATTERN = /(-?\\d+(?:\\.\\d+)?)rpx/g;\n\n/** 把字符串/数值中的 `N rpx` 替换为 `calc(N * var(--cyy-rpx))` */\nexport function convertRpx(value: string | number): string {\n return String(value).replace(\n RPX_PATTERN,\n (_match, number: string) => `calc(${number} * var(--cyy-rpx))`\n );\n}\n",
6
+ "export interface StyleOptions {\n selector: string;\n properties: Record<string, string | number>;\n hover?: Record<string, string | number>;\n media?: Record<string, Record<string, string | number>>;\n}\n\nimport { convertRpx, ROOT_RPX_RULE } from './units';\n\nexport class StyleManager {\n public styleElement: HTMLStyleElement | null = null;\n public styles: Map<string, StyleOptions> = new Map();\n\n constructor() {\n // style 元素延迟到首次 addStyle 时创建,避免无样式组件产生空 <style> 节点\n }\n\n public addStyle(name: string, options: StyleOptions): void {\n this.styles.set(name, options);\n this.updateStyles();\n }\n\n public removeStyle(name: string): void {\n this.styles.delete(name);\n this.updateStyles();\n }\n\n public clearStyles(): void {\n this.styles.clear();\n if (this.styleElement) {\n this.styleElement.textContent = '';\n }\n }\n\n public destroy(): void {\n this.clearStyles();\n if (this.styleElement) {\n this.styleElement.remove();\n this.styleElement = null;\n }\n }\n\n private ensureStyleElement(): HTMLStyleElement {\n if (!this.styleElement) {\n const element = document.createElement('style');\n document.head.appendChild(element);\n this.styleElement = element;\n }\n return this.styleElement;\n }\n\n private convertToCSS(properties: Record<string, string | number>): string {\n return Object.entries(properties)\n .map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${convertRpx(value)};`;\n })\n .join('\\n');\n }\n\n private updateStyles(): void {\n if (this.styles.size === 0) {\n if (this.styleElement) {\n this.styleElement.textContent = '';\n }\n return;\n }\n\n const element = this.ensureStyleElement();\n let cssText = ROOT_RPX_RULE + '\\n';\n\n this.styles.forEach((style) => {\n // 基础样式\n cssText += `${style.selector} {\\n${this.convertToCSS(style.properties)}\\n}\\n`;\n\n // hover 样式\n if (style.hover) {\n cssText += `${style.selector}:hover {\\n${this.convertToCSS(style.hover)}\\n}\\n`;\n }\n\n // media 查询\n if (style.media) {\n Object.entries(style.media).forEach(([query, properties]) => {\n cssText += `@media ${query} {\\n${style.selector} {\\n${this.convertToCSS(properties)}\\n}\\n}\\n`;\n });\n }\n });\n\n element.textContent = cssText;\n }\n}\n",
7
+ "export type StyleValue = string | number;\n\nexport type StyleProperties = Record<string, StyleValue>;\n\nexport interface StyleRule {\n selector: string;\n properties: StyleProperties;\n}\n\nexport interface StyleAtRule {\n atRule: string;\n rules: StyleRule[];\n}\n\nexport type StyleSheetEntry = StyleRule | StyleAtRule;\n\nexport type StyleSheet = StyleSheetEntry[];\n\nexport function renderStyleSheet(styles: StyleSheet): string {\n return styles.map((entry) => renderStyleEntry(entry)).join('\\n\\n');\n}\n\nfunction renderStyleEntry(entry: StyleSheetEntry, indent = ''): string {\n if ('atRule' in entry) {\n const rules = entry.rules\n .map((rule) => renderStyleEntry(rule, `${indent} `))\n .join('\\n\\n');\n\n return `${indent}${entry.atRule} {\\n${rules}\\n${indent}}`;\n }\n\n const declarations = Object.entries(entry.properties)\n .map(\n ([property, value]) =>\n `${indent} ${toCssProperty(property)}: ${String(value)};`\n )\n .join('\\n');\n\n return `${indent}${entry.selector} {\\n${declarations}\\n${indent}}`;\n}\n\nfunction toCssProperty(property: string): string {\n if (property.startsWith('--') || property.includes('-')) {\n return property;\n }\n\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n"
8
+ ],
9
+ "mappings": "AAOO,IAAM,EACX,kDAEI,EAAc,wBAGb,SAAS,CAAU,CAAC,EAAgC,CACzD,OAAO,OAAO,CAAK,EAAE,QACnB,EACA,CAAC,EAAQ,IAAmB,QAAQ,qBACtC,ECRK,MAAM,CAAa,CACjB,aAAwC,KACxC,OAAoC,IAAI,IAE/C,WAAW,EAAG,EAIP,QAAQ,CAAC,EAAc,EAA6B,CACzD,KAAK,OAAO,IAAI,EAAM,CAAO,EAC7B,KAAK,aAAa,EAGb,WAAW,CAAC,EAAoB,CACrC,KAAK,OAAO,OAAO,CAAI,EACvB,KAAK,aAAa,EAGb,WAAW,EAAS,CAEzB,GADA,KAAK,OAAO,MAAM,EACd,KAAK,aACP,KAAK,aAAa,YAAc,GAI7B,OAAO,EAAS,CAErB,GADA,KAAK,YAAY,EACb,KAAK,aACP,KAAK,aAAa,OAAO,EACzB,KAAK,aAAe,KAIhB,kBAAkB,EAAqB,CAC7C,GAAI,CAAC,KAAK,aAAc,CACtB,IAAM,EAAU,SAAS,cAAc,OAAO,EAC9C,SAAS,KAAK,YAAY,CAAO,EACjC,KAAK,aAAe,EAEtB,OAAO,KAAK,aAGN,YAAY,CAAC,EAAqD,CACxE,OAAO,OAAO,QAAQ,CAAU,EAC7B,IAAI,EAAE,EAAK,KAEH,GADQ,EAAI,QAAQ,WAAY,KAAK,EAAE,YAAY,MACrC,EAAW,CAAK,IACtC,EACA,KAAK;AAAA,CAAI,EAGN,YAAY,EAAS,CAC3B,GAAI,KAAK,OAAO,OAAS,EAAG,CAC1B,GAAI,KAAK,aACP,KAAK,aAAa,YAAc,GAElC,OAGF,IAAM,EAAU,KAAK,mBAAmB,EACpC,EAAU,EAAgB;AAAA,EAE9B,KAAK,OAAO,QAAQ,CAAC,IAAU,CAK7B,GAHA,GAAW,GAAG,EAAM;AAAA,EAAe,KAAK,aAAa,EAAM,UAAU;AAAA;AAAA,EAGjE,EAAM,MACR,GAAW,GAAG,EAAM;AAAA,EAAqB,KAAK,aAAa,EAAM,KAAK;AAAA;AAAA,EAIxE,GAAI,EAAM,MACR,OAAO,QAAQ,EAAM,KAAK,EAAE,QAAQ,EAAE,EAAO,KAAgB,CAC3D,GAAW,UAAU;AAAA,EAAY,EAAM;AAAA,EAAe,KAAK,aAAa,CAAU;AAAA;AAAA;AAAA,EACnF,EAEJ,EAED,EAAQ,YAAc,EAE1B,CCxEO,SAAS,CAAgB,CAAC,EAA4B,CAC3D,OAAO,EAAO,IAAI,CAAC,IAAU,EAAiB,CAAK,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM,EAGnE,SAAS,CAAgB,CAAC,EAAwB,EAAS,GAAY,CACrE,GAAI,WAAY,EAAO,CACrB,IAAM,EAAQ,EAAM,MACjB,IAAI,CAAC,IAAS,EAAiB,EAAM,GAAG,KAAU,CAAC,EACnD,KAAK;AAAA;AAAA,CAAM,EAEd,MAAO,GAAG,IAAS,EAAM;AAAA,EAAa;AAAA,EAAU,KAGlD,IAAM,EAAe,OAAO,QAAQ,EAAM,UAAU,EACjD,IACC,EAAE,EAAU,KACV,GAAG,MAAW,EAAc,CAAQ,MAAM,OAAO,CAAK,IAC1D,EACC,KAAK;AAAA,CAAI,EAEZ,MAAO,GAAG,IAAS,EAAM;AAAA,EAAe;AAAA,EAAiB,KAG3D,SAAS,CAAa,CAAC,EAA0B,CAC/C,GAAI,EAAS,WAAW,IAAI,GAAK,EAAS,SAAS,GAAG,EACpD,OAAO,EAGT,OAAO,EAAS,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG",
10
+ "debugId": "C326383C7F39C8EB64756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,5 @@
1
+ class i extends Error{code;config;response;cause;constructor(e){super(e.message);this.name="RequestError",this.code=e.code,this.config=e.config,this.response=e.response,this.cause=e.cause}}function S(e){return e instanceof i}var F=new Set(["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"]);function g(e){if(e===void 0)return"GET";let t=e.toUpperCase();if(!F.has(t))throw Error(`Unsupported HTTP method: ${e}`);return t}var U=/^[a-z][a-z\d+.-]*:\/\//i;function N(e){return U.test(e)}function L(e,t){if(!e||N(t))return t;return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}function O(e){if(e instanceof Date)return e.toISOString();if(typeof e==="object")return JSON.stringify(e);return String(e)}function j(e){if(!e)return"";let t=[];return Object.keys(e).forEach((r)=>{let s=e[r];if(s===void 0||s===null)return;let o=encodeURIComponent(r);if(Array.isArray(s)){s.forEach((n)=>{if(n===void 0||n===null)return;t.push(`${o}=${encodeURIComponent(O(n))}`)});return}t.push(`${o}=${encodeURIComponent(O(s))}`)}),t.join("&")}function T(e,t,r){let s=L(e,t),o=j(r);if(!o)return s;let n=s.includes("?")?"&":"?";return`${s}${n}${o}`}function v(e){if(e===void 0||e===null)return;return String(e)}function f(...e){let t={},r=new Map;return e.forEach((s)=>{if(!s)return;Object.keys(s).forEach((o)=>{let n=v(s[o]);if(n===void 0)return;let a=o.toLowerCase(),p=r.get(a);if(p!==void 0&&p!==o)delete t[p];r.set(a,o),t[o]=n})}),t}function _(e,t){return Object.keys(e).some((r)=>r.toLowerCase()===t.toLowerCase())}function D(e,t,r){if(r==="GET"||r==="HEAD")return;if(e===void 0||e===null)return;if(typeof e==="string")return e;if(typeof FormData<"u"&&e instanceof FormData)return e;if(typeof Blob<"u"&&e instanceof Blob)return e;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;if(!_(t,"Content-Type"))t["Content-Type"]="application/json";return JSON.stringify(e)}class P{platform="web";async request(e){let t=g(e.method),r=T(e.baseURL,e.url,e.params),s=f(e.headers),o=D(e.data,s,t),n=new AbortController,a=!1,p=!1,l;if(e.signal)if(e.signal.aborted)p=!0,n.abort();else e.signal.addEventListener("abort",()=>{p=!0,n.abort()},{once:!0});if(typeof e.timeout==="number"&&e.timeout>0)l=setTimeout(()=>{a=!0,n.abort()},e.timeout);let q=e.credentials??(e.withCredentials===!0?"include":"same-origin");try{let d=await fetch(r,{method:t,headers:s,body:o,signal:n.signal,credentials:q}),u={};return d.headers.forEach((E,b)=>{u[b]=E}),{data:await B(d,e),statusCode:d.status,statusText:d.statusText,headers:u,config:e}}catch(d){if(a)throw new i({code:"TIMEOUT",message:`Request timeout after ${String(e.timeout)}ms`,config:e,cause:d});if(p||n.signal.aborted)throw new i({code:"ABORTED",message:"Request aborted",config:e,cause:d});throw new i({code:"NETWORK_ERROR",message:d instanceof Error?d.message:String(d),config:e,cause:d})}finally{if(l!==void 0)clearTimeout(l)}}}async function B(e,t){if(t.responseType==="arraybuffer")return e.arrayBuffer();let r=await e.text();if(t.dataType==="text"||!r)return r;try{return JSON.parse(r)}catch{return r}}function z(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof global<"u")return global;return{}}function C(e){let t=z()[e];return typeof t==="object"&&t!==null?t:null}function y(){if(A("wx"))return"weixin";if(A("my"))return"alipay";if(A("tt"))return"bytedance";if(typeof fetch==="function")return"web";return"unknown"}function A(e){let t=C(e);return t!==null&&typeof t.request==="function"}var M={platform:"weixin",globalName:"wx",headerField:"header",statusField:"statusCode",responseHeaderField:"header"},H={platform:"alipay",globalName:"my",headerField:"headers",statusField:"status",responseHeaderField:"headers"},k={platform:"bytedance",globalName:"tt",headerField:"header",statusField:"statusCode",responseHeaderField:"header"};class m{dialect;platform;constructor(e){this.dialect=e;this.platform=e.platform}request(e){let t=C(this.dialect.globalName);if(!t||typeof t.request!=="function")return Promise.reject(new i({code:"UNSUPPORTED_PLATFORM",message:`${this.dialect.globalName}.request is not available in current environment`,config:e}));let r=t.request;return new Promise((s,o)=>{let n=!1,a=!1,p,l,q=(u)=>{if(a)return;if(a=!0,l!==void 0)clearTimeout(l);u()},d={url:T(e.baseURL,e.url,e.params),method:e.method??"GET",data:e.data,[this.dialect.headerField]:V(e.headers),dataType:e.dataType??"json",...e.responseType!==void 0?{responseType:e.responseType}:{},...e.timeout!==void 0&&e.timeout>0?{timeout:e.timeout}:{},success:(u)=>{q(()=>{let c=u[this.dialect.statusField],E=Number(c??u.statusCode??0),b=K(u[this.dialect.responseHeaderField]);s({data:u.data,statusCode:E,headers:b,config:e,...Array.isArray(u.cookies)?{cookies:u.cookies}:{},...typeof u.errMsg==="string"?{errMsg:u.errMsg}:{}})})},fail:(u)=>{q(()=>{let c=W(u);o(new i({code:n?"TIMEOUT":G(c),message:c||"Network request failed",config:e,cause:u}))})}};if(e.timeout!==void 0&&e.timeout>0)l=setTimeout(()=>{n=!0,p?.abort?.()},e.timeout);if(p=r(d)??void 0,e.signal)if(e.signal.aborted)p?.abort?.();else e.signal.addEventListener("abort",()=>{p?.abort?.()},{once:!0})})}}function V(e){return f(e)}function K(e){if(typeof e!=="object"||e===null)return{};let t={};return Object.keys(e).forEach((r)=>{let s=e[r];if(s!==void 0&&s!==null)t[r]=String(s)}),t}function W(e){if(typeof e.errMsg==="string")return e.errMsg;if(typeof e.errorMessage==="string")return e.errorMessage;if(typeof e.error==="string")return e.error;return""}function G(e){if(!e)return"UNKNOWN";if(/timeout/i.test(e))return"TIMEOUT";if(/abort/i.test(e))return"ABORTED";return"NETWORK_ERROR"}var I={web:new P,weixin:new m(M),alipay:new m(H),bytedance:new m(k)};function w(e){let t=I[e];if(!t)throw new i({code:"UNSUPPORTED_PLATFORM",message:`Unsupported request platform: ${String(e)}`,config:{url:""}});return t}async function x(e,t,r){if(e.platform!==void 0&&e.platform!=="auto")return w(e.platform);if(t!==void 0)return typeof t==="function"?await t(e):t;if(r!==void 0&&r!=="auto")return w(r);let s=y();if(s==="unknown")throw new i({code:"UNSUPPORTED_PLATFORM",message:"No supported request platform detected (web fetch / wx.request / my.request / tt.request)",config:e});return w(s)}class R{handlers=[];use(e,t){return this.handlers.push({onFulfilled:e,onRejected:t}),this.handlers.length-1}eject(e){if(this.handlers[e]!==void 0)this.handlers[e]=null}clear(){this.handlers.length=0}forEach(e){this.handlers.forEach((t,r)=>{if(t!==null)e(t,r)})}}class h{interceptors={request:new R,response:new R};instanceDefaults;instanceAdapter;instancePlatform;constructor(e={}){let{adapter:t,platform:r,...s}=e;this.instanceAdapter=t,this.instancePlatform=r,this.instanceDefaults={...s}}request(e){let t;try{t=this.mergeConfig(e)}catch(n){return Promise.reject(n)}let r=[];this.interceptors.request.forEach((n)=>{r.push(n.onFulfilled,n.onRejected)}),r.push((n)=>this.dispatch(n),void 0);let s=[];this.interceptors.response.forEach((n)=>{s.push({onFulfilled:n.onFulfilled,onRejected:n.onRejected})});for(let n=s.length-1;n>=0;n-=1){let a=s[n];r.push(a.onFulfilled,a.onRejected)}let o=Promise.resolve(t);while(r.length>0){let n=r.shift(),a=r.shift();o=o.then(n,a)}return o}get(e,t){return this.request({...t,url:e,method:"GET"})}delete(e,t){return this.request({...t,url:e,method:"DELETE"})}head(e,t){return this.request({...t,url:e,method:"HEAD"})}options(e,t){return this.request({...t,url:e,method:"OPTIONS"})}post(e,t,r){return this.request({...r,url:e,method:"POST",data:t})}put(e,t,r){return this.request({...r,url:e,method:"PUT",data:t})}patch(e,t,r){return this.request({...r,url:e,method:"PATCH",data:t})}dispatch(e){return x(e,this.instanceAdapter,this.instancePlatform).then((t)=>t.request(e))}mergeConfig(e){if(!e||typeof e!=="object")throw new i({code:"BAD_REQUEST",message:"Request config must be an object",config:e});let t={...this.instanceDefaults,...e,headers:f(this.instanceDefaults.headers,e.headers),params:{...this.instanceDefaults.params,...e.params}};if(typeof t.url!=="string"||t.url.length===0)throw new i({code:"BAD_REQUEST",message:"Request url is required",config:t});try{t.method=g(t.method)}catch(r){throw new i({code:"BAD_REQUEST",message:r.message,config:t,cause:r})}return t}}function ge(e={}){return new h(e)}var Te=new h;
2
+ export{i as Fa,S as Ga,y as Ha,I as Ia,w as Ja,x as Ka,R as La,h as Ma,ge as Na,Te as Oa};
3
+
4
+ //# debugId=C2EF7110F3404F9F64756E2164756E21
5
+ //# sourceMappingURL=index-xp7y2crt.js.map
@@ -0,0 +1,18 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../lib/request/errors.ts", "../lib/request/helpers.ts", "../lib/request/adapters/fetch.ts", "../lib/request/adapters/platform.ts", "../lib/request/adapters/mp.ts", "../lib/request/adapters/index.ts", "../lib/request/interceptors.ts", "../lib/request/request.ts", "../lib/request/index.ts"],
4
+ "sourcesContent": [
5
+ "import type { RequestConfig, RequestResponse } from './types';\n\n/**\n * 统一请求错误码:\n * - NETWORK_ERROR:网络层失败(断网、DNS、连接被拒等)\n * - TIMEOUT:超时\n * - ABORTED:被 AbortSignal 取消\n * - BAD_REQUEST:配置非法(缺少 url、方法不支持等)\n * - UNSUPPORTED_PLATFORM:当前环境没有可用的请求 API,或指定了不支持的端\n * - UNKNOWN:无法归类的失败\n */\nexport type RequestErrorCode =\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'BAD_REQUEST'\n | 'UNSUPPORTED_PLATFORM'\n | 'UNKNOWN';\n\nexport interface RequestErrorOptions {\n code: RequestErrorCode;\n message: string;\n /** 出错的请求配置 */\n config: RequestConfig;\n /** 出错时已拿到的响应(如响应处理阶段失败) */\n response?: RequestResponse;\n /** 底层原因(原生异常 / 平台 fail 对象等) */\n cause?: unknown;\n}\n\n/**\n * 统一请求错误:适配器与拦截器抛出的错误全部归一化为该类型,\n * 便于调用方按 code 分支处理(超时重试、取消忽略、网络提示等)。\n */\nexport class RequestError extends Error {\n readonly code: RequestErrorCode;\n readonly config: RequestConfig;\n readonly response?: RequestResponse;\n readonly cause?: unknown;\n\n public constructor(options: RequestErrorOptions) {\n super(options.message);\n this.name = 'RequestError';\n this.code = options.code;\n this.config = options.config;\n this.response = options.response;\n this.cause = options.cause;\n }\n}\n\nexport function isRequestError(error: unknown): error is RequestError {\n return error instanceof RequestError;\n}\n",
6
+ "/**\n * request 模块纯函数工具:URL 拼接、query 序列化、请求头合并、请求体序列化。\n * 不依赖任何平台全局,便于单测。\n */\nimport type { HeaderValue, HttpMethod } from './types';\n\nconst HTTP_METHODS: ReadonlySet<string> = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH',\n 'HEAD',\n 'OPTIONS',\n]);\n\n/** 归一化 HTTP 方法为大写;缺省为 GET,非法方法抛错 */\nexport function normalizeMethod(method: string | undefined): HttpMethod {\n if (method === undefined) {\n return 'GET';\n }\n const normalized = method.toUpperCase();\n if (!HTTP_METHODS.has(normalized)) {\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n return normalized as HttpMethod;\n}\n\nconst ABSOLUTE_URL_RE = /^[a-z][a-z\\d+.-]*:\\/\\//i;\n\n/** 是否为带协议的绝对地址(http:// / https:// 等) */\nexport function isAbsoluteURL(url: string): boolean {\n return ABSOLUTE_URL_RE.test(url);\n}\n\n/** 拼接 baseURL 与相对地址,去除重复斜杠;绝对地址直接返回 */\nexport function combineURLs(baseURL: string | undefined, url: string): string {\n if (!baseURL || isAbsoluteURL(url)) {\n return url;\n }\n return `${baseURL.replace(/\\/+$/, '')}/${url.replace(/^\\/+/, '')}`;\n}\n\nfunction formatParamValue(value: unknown): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * 序列化 query 参数:null / undefined 跳过,数组展开为重复键,\n * Date 转 ISO 字符串,对象 JSON 序列化。\n */\nexport function serializeParams(\n params: Record<string, unknown> | undefined\n): string {\n if (!params) {\n return '';\n }\n const parts: string[] = [];\n Object.keys(params).forEach((key) => {\n const value = params[key];\n if (value === undefined || value === null) {\n return;\n }\n const encodedKey = encodeURIComponent(key);\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item === undefined || item === null) {\n return;\n }\n parts.push(\n `${encodedKey}=${encodeURIComponent(formatParamValue(item))}`\n );\n });\n return;\n }\n parts.push(`${encodedKey}=${encodeURIComponent(formatParamValue(value))}`);\n });\n return parts.join('&');\n}\n\n/** 拼接完整请求地址:baseURL + url + query 参数 */\nexport function buildURL(\n baseURL: string | undefined,\n url: string,\n params: Record<string, unknown> | undefined\n): string {\n const full = combineURLs(baseURL, url);\n const query = serializeParams(params);\n if (!query) {\n return full;\n }\n const separator = full.includes('?') ? '&' : '?';\n return `${full}${separator}${query}`;\n}\n\nfunction normalizeHeaderValue(value: HeaderValue): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n return String(value);\n}\n\n/**\n * 大小写不敏感合并请求头:多个来源按顺序合并,后出现的同名头(忽略大小写)\n * 覆盖先前的,键名保留后出现来源的原始写法。\n */\nexport function mergeHeaders(\n ...sources: Array<Record<string, HeaderValue> | undefined>\n): Record<string, string> {\n const merged: Record<string, string> = {};\n const lowerToKey = new Map<string, string>();\n\n sources.forEach((source) => {\n if (!source) {\n return;\n }\n Object.keys(source).forEach((key) => {\n const value = normalizeHeaderValue(source[key]);\n if (value === undefined) {\n return;\n }\n const lower = key.toLowerCase();\n const previous = lowerToKey.get(lower);\n if (previous !== undefined && previous !== key) {\n delete merged[previous];\n }\n lowerToKey.set(lower, key);\n merged[key] = value;\n });\n });\n\n return merged;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n return Object.keys(headers).some(\n (key) => key.toLowerCase() === name.toLowerCase()\n );\n}\n\n/**\n * 序列化请求体(Web 端):\n * - GET / HEAD 无请求体\n * - 字符串、FormData、Blob、ArrayBuffer / TypedArray 原样透传\n * - 普通对象 / 数组 JSON 序列化,并自动设置 Content-Type: application/json\n */\nexport function serializeBody(\n data: unknown,\n headers: Record<string, string>,\n method: HttpMethod\n): BodyInit | undefined {\n if (method === 'GET' || method === 'HEAD') {\n return undefined;\n }\n if (data === undefined || data === null) {\n return undefined;\n }\n if (typeof data === 'string') {\n return data;\n }\n if (typeof FormData !== 'undefined' && data instanceof FormData) {\n return data;\n }\n if (typeof Blob !== 'undefined' && data instanceof Blob) {\n return data;\n }\n if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n return data as BodyInit;\n }\n if (!hasHeader(headers, 'Content-Type')) {\n headers['Content-Type'] = 'application/json';\n }\n return JSON.stringify(data);\n}\n",
7
+ "import { RequestError } from '../errors';\nimport {\n buildURL,\n mergeHeaders,\n normalizeMethod,\n serializeBody,\n} from '../helpers';\nimport type { RequestAdapter, RequestConfig, RequestResponse } from '../types';\n\n/**\n * Web 端适配器(策略):基于 fetch。\n *\n * - 超时:AbortController + timer,超时归类 TIMEOUT\n * - 取消:config.signal 与超时共用同一个 AbortController,外部取消归类 ABORTED\n * - 响应体:arraybuffer 返回 ArrayBuffer;json(默认)尝试解析、失败回退原文;text 返回原文\n */\nexport class FetchAdapter implements RequestAdapter {\n public readonly platform = 'web' as const;\n\n public async request<T>(\n config: RequestConfig<T>\n ): Promise<RequestResponse<T>> {\n const method = normalizeMethod(config.method);\n const url = buildURL(config.baseURL, config.url, config.params);\n const headers = mergeHeaders(config.headers);\n const body = serializeBody(config.data, headers, method);\n const controller = new AbortController();\n let timedOut = false;\n let externalAborted = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n if (config.signal) {\n if (config.signal.aborted) {\n externalAborted = true;\n controller.abort();\n } else {\n config.signal.addEventListener(\n 'abort',\n () => {\n externalAborted = true;\n controller.abort();\n },\n { once: true }\n );\n }\n }\n\n if (typeof config.timeout === 'number' && config.timeout > 0) {\n timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, config.timeout);\n }\n\n const credentials: RequestCredentials =\n config.credentials ??\n (config.withCredentials === true ? 'include' : 'same-origin');\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n credentials,\n });\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const data = await parseFetchData(response, config);\n return {\n data: data as T,\n statusCode: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n config,\n };\n } catch (error) {\n if (timedOut) {\n throw new RequestError({\n code: 'TIMEOUT',\n message: `Request timeout after ${String(config.timeout)}ms`,\n config,\n cause: error,\n });\n }\n if (externalAborted || controller.signal.aborted) {\n throw new RequestError({\n code: 'ABORTED',\n message: 'Request aborted',\n config,\n cause: error,\n });\n }\n throw new RequestError({\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : String(error),\n config,\n cause: error,\n });\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n }\n}\n\nasync function parseFetchData(\n response: Response,\n config: RequestConfig\n): Promise<unknown> {\n if (config.responseType === 'arraybuffer') {\n return response.arrayBuffer();\n }\n const text = await response.text();\n if (config.dataType === 'text' || !text) {\n return text;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n",
8
+ "import type { DetectedPlatform } from '../types';\n\ntype Host = Record<string, unknown>;\n\n/** 各端安全访问全局对象:优先 globalThis(微信基础库 2.2.3+ 可用),兜底 self / global */\nfunction getHost(): Host {\n if (typeof globalThis !== 'undefined') {\n return globalThis as unknown as Host;\n }\n if (typeof self !== 'undefined') {\n return self as unknown as Host;\n }\n if (typeof global !== 'undefined') {\n return global as unknown as Host;\n }\n return {};\n}\n\n/** 小程序请求全局的公共形状(wx.request / my.request / tt.request) */\nexport interface MiniProgramRequestApi {\n request?: (options: Record<string, unknown>) => { abort?: () => void };\n}\n\n/**\n * 读取小程序请求全局(wx / my / tt)。\n * 通过全局对象属性访问而非直接引用全局名,避免污染全局声明、\n * 也避免与用户安装的小程序官方类型(如 miniprogram-api-typings)冲突。\n */\nexport function getMiniProgramApi(\n name: 'wx' | 'my' | 'tt'\n): MiniProgramRequestApi | null {\n const api = getHost()[name];\n return typeof api === 'object' && api !== null\n ? (api as MiniProgramRequestApi)\n : null;\n}\n\n/**\n * 运行时探测目标端:\n * 小程序全局优先(wx → my → tt),其次 Web fetch;均不可用返回 'unknown'。\n */\nexport function detectPlatform(): DetectedPlatform {\n if (hasRequestApi('wx')) {\n return 'weixin';\n }\n if (hasRequestApi('my')) {\n return 'alipay';\n }\n if (hasRequestApi('tt')) {\n return 'bytedance';\n }\n if (typeof fetch === 'function') {\n return 'web';\n }\n return 'unknown';\n}\n\nfunction hasRequestApi(name: 'wx' | 'my' | 'tt'): boolean {\n const api = getMiniProgramApi(name);\n return api !== null && typeof api.request === 'function';\n}\n",
9
+ "import { RequestError, type RequestErrorCode } from '../errors';\nimport { buildURL, mergeHeaders } from '../helpers';\nimport type {\n HeaderValue,\n RequestAdapter,\n RequestConfig,\n RequestResponse,\n} from '../types';\nimport { getMiniProgramApi } from './platform';\n\n/**\n * 小程序差异层:微信 / 阿里 / 字节的请求 API 语义一致(wx.request /\n * my.request / tt.request),仅字段名与回调形状不同。与 CLI 的 MpDialect\n * 同思路,把差异收敛为参数化方言,避免三个适配器重复实现。\n */\nexport interface MiniProgramDialect {\n /** 目标端标识 */\n platform: 'weixin' | 'alipay' | 'bytedance';\n /** 全局对象名:wx / my / tt */\n globalName: 'wx' | 'my' | 'tt';\n /** 请求参数中请求头字段名:微信/字节 header,阿里 headers */\n headerField: 'header' | 'headers';\n /** 成功回调中状态码字段:微信/字节 statusCode,阿里 status */\n statusField: 'statusCode' | 'status';\n /** 成功回调中响应头字段名:微信/字节 header,阿里 headers */\n responseHeaderField: 'header' | 'headers';\n}\n\nexport const WEIXIN_DIALECT: MiniProgramDialect = {\n platform: 'weixin',\n globalName: 'wx',\n headerField: 'header',\n statusField: 'statusCode',\n responseHeaderField: 'header',\n};\n\nexport const ALIPAY_DIALECT: MiniProgramDialect = {\n platform: 'alipay',\n globalName: 'my',\n headerField: 'headers',\n statusField: 'status',\n responseHeaderField: 'headers',\n};\n\nexport const BYTEDANCE_DIALECT: MiniProgramDialect = {\n platform: 'bytedance',\n globalName: 'tt',\n headerField: 'header',\n statusField: 'statusCode',\n responseHeaderField: 'header',\n};\n\n/**\n * 小程序端适配器(策略):wx.request / my.request / tt.request 的统一封装。\n *\n * - 超时:手动 timer + 底层任务 abort,三端行为一致;成功/失败回调都会清理 timer\n * - 取消:config.signal 触发时 abort 底层任务\n * - 失败归一化:按平台 errMsg 关键字归类 TIMEOUT / ABORTED / NETWORK_ERROR\n */\nexport class MiniProgramAdapter implements RequestAdapter {\n public readonly platform: 'weixin' | 'alipay' | 'bytedance';\n\n public constructor(private readonly dialect: MiniProgramDialect) {\n this.platform = dialect.platform;\n }\n\n public request<T>(config: RequestConfig<T>): Promise<RequestResponse<T>> {\n const api = getMiniProgramApi(this.dialect.globalName);\n if (!api || typeof api.request !== 'function') {\n return Promise.reject(\n new RequestError({\n code: 'UNSUPPORTED_PLATFORM',\n message: `${this.dialect.globalName}.request is not available in current environment`,\n config,\n })\n );\n }\n // 守卫后收窄为函数;Promise 执行器闭包内无法复用前面的窄化\n const requestFn = api.request;\n\n return new Promise<RequestResponse<T>>((resolve, reject) => {\n let timedOut = false;\n let settled = false;\n let task: { abort?: () => void } | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n // 保证成功/失败/超时只结算一次,并清理超时 timer\n const settle = (fn: () => void): void => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n fn();\n };\n\n const options: Record<string, unknown> = {\n url: buildURL(config.baseURL, config.url, config.params),\n method: config.method ?? 'GET',\n data: config.data,\n [this.dialect.headerField]: normalizeHeaders(config.headers),\n dataType: config.dataType ?? 'json',\n ...(config.responseType !== undefined\n ? { responseType: config.responseType }\n : {}),\n ...(config.timeout !== undefined && config.timeout > 0\n ? { timeout: config.timeout }\n : {}),\n success: (res: Record<string, unknown>) => {\n settle(() => {\n const rawStatus = res[this.dialect.statusField];\n const statusCode = Number(rawStatus ?? res.statusCode ?? 0);\n const responseHeaders = normalizeResponseHeaders(\n res[this.dialect.responseHeaderField]\n );\n resolve({\n data: res.data as T,\n statusCode,\n headers: responseHeaders,\n config,\n ...(Array.isArray(res.cookies)\n ? { cookies: res.cookies as string[] }\n : {}),\n ...(typeof res.errMsg === 'string' ? { errMsg: res.errMsg } : {}),\n });\n });\n },\n fail: (err: Record<string, unknown>) => {\n settle(() => {\n const errMsg = extractFailMessage(err);\n reject(\n new RequestError({\n code: timedOut ? 'TIMEOUT' : classifyMpError(errMsg),\n message: errMsg || 'Network request failed',\n config,\n cause: err,\n })\n );\n });\n },\n };\n\n if (config.timeout !== undefined && config.timeout > 0) {\n timer = setTimeout(() => {\n timedOut = true;\n task?.abort?.();\n }, config.timeout);\n }\n\n task = requestFn(options) ?? undefined;\n\n if (config.signal) {\n if (config.signal.aborted) {\n task?.abort?.();\n } else {\n config.signal.addEventListener(\n 'abort',\n () => {\n task?.abort?.();\n },\n { once: true }\n );\n }\n }\n });\n }\n}\n\nfunction normalizeHeaders(\n headers: Record<string, HeaderValue> | undefined\n): Record<string, string> {\n return mergeHeaders(headers);\n}\n\nfunction normalizeResponseHeaders(value: unknown): Record<string, string> {\n if (typeof value !== 'object' || value === null) {\n return {};\n }\n const result: Record<string, string> = {};\n Object.keys(value as Record<string, unknown>).forEach((key) => {\n const item = (value as Record<string, unknown>)[key];\n if (item !== undefined && item !== null) {\n result[key] = String(item);\n }\n });\n return result;\n}\n\nfunction extractFailMessage(err: Record<string, unknown>): string {\n if (typeof err.errMsg === 'string') {\n return err.errMsg;\n }\n if (typeof err.errorMessage === 'string') {\n return err.errorMessage;\n }\n if (typeof err.error === 'string') {\n return err.error;\n }\n return '';\n}\n\n/** 按平台 errMsg 关键字归类错误码 */\nfunction classifyMpError(errMsg: string): RequestErrorCode {\n if (!errMsg) {\n return 'UNKNOWN';\n }\n if (/timeout/i.test(errMsg)) {\n return 'TIMEOUT';\n }\n if (/abort/i.test(errMsg)) {\n return 'ABORTED';\n }\n return 'NETWORK_ERROR';\n}\n",
10
+ "import { RequestError } from '../errors';\nimport type {\n DetectedPlatform,\n RequestAdapter,\n RequestAdapterResolver,\n RequestConfig,\n RequestPlatform,\n} from '../types';\nimport { FetchAdapter } from './fetch';\nimport {\n ALIPAY_DIALECT,\n BYTEDANCE_DIALECT,\n MiniProgramAdapter,\n WEIXIN_DIALECT,\n} from './mp';\nimport { detectPlatform } from './platform';\n\nexport { detectPlatform } from './platform';\nexport type { MiniProgramRequestApi } from './platform';\nexport type { MiniProgramDialect } from './mp';\n\n/** 各端适配器注册表:'auto' 不在此列,由运行时探测决定 */\nexport const adapters: Record<\n Exclude<RequestPlatform, 'auto'>,\n RequestAdapter\n> = {\n web: new FetchAdapter(),\n weixin: new MiniProgramAdapter(WEIXIN_DIALECT),\n alipay: new MiniProgramAdapter(ALIPAY_DIALECT),\n bytedance: new MiniProgramAdapter(BYTEDANCE_DIALECT),\n};\n\n/** 按目标端创建适配器;不支持的端抛 UNSUPPORTED_PLATFORM */\nexport function createAdapter(\n platform: Exclude<RequestPlatform, 'auto'>\n): RequestAdapter {\n const adapter = adapters[platform];\n if (!adapter) {\n throw new RequestError({\n code: 'UNSUPPORTED_PLATFORM',\n message: `Unsupported request platform: ${String(platform)}`,\n config: { url: '' },\n });\n }\n return adapter;\n}\n\n/**\n * 解析请求应使用的适配器(优先级从高到低):\n * 1. 请求级 config.platform(显式指定非 auto 时)\n * 2. 实例级自定义 adapter(对象或解析函数)\n * 3. 实例级默认 platform;仍为 auto 时运行时探测\n */\nexport async function resolveAdapter(\n config: RequestConfig,\n instanceAdapter?: RequestAdapter | RequestAdapterResolver,\n instancePlatform?: RequestPlatform\n): Promise<RequestAdapter> {\n if (config.platform !== undefined && config.platform !== 'auto') {\n return createAdapter(config.platform);\n }\n if (instanceAdapter !== undefined) {\n return typeof instanceAdapter === 'function'\n ? await instanceAdapter(config)\n : instanceAdapter;\n }\n if (instancePlatform !== undefined && instancePlatform !== 'auto') {\n return createAdapter(instancePlatform);\n }\n const detected: DetectedPlatform = detectPlatform();\n if (detected === 'unknown') {\n throw new RequestError({\n code: 'UNSUPPORTED_PLATFORM',\n message:\n 'No supported request platform detected (web fetch / wx.request / my.request / tt.request)',\n config,\n });\n }\n return createAdapter(detected);\n}\n",
11
+ "import type {\n InterceptorFulfilled,\n InterceptorHandler,\n InterceptorRejected,\n} from './types';\n\n/**\n * 拦截器管理器:维护同类型(请求 / 响应)拦截器列表。\n * - use 注册并返回 id,eject 按 id 移除(软删除,保留占位)\n * - forEach 跳过已移除的项\n */\nexport class InterceptorManager<T> {\n private readonly handlers: Array<InterceptorHandler<T> | null> = [];\n\n public use(\n onFulfilled?: InterceptorFulfilled<T>,\n onRejected?: InterceptorRejected\n ): number {\n this.handlers.push({ onFulfilled, onRejected });\n return this.handlers.length - 1;\n }\n\n public eject(id: number): void {\n if (this.handlers[id] !== undefined) {\n this.handlers[id] = null;\n }\n }\n\n public clear(): void {\n this.handlers.length = 0;\n }\n\n public forEach(\n fn: (handler: InterceptorHandler<T>, id: number) => void\n ): void {\n this.handlers.forEach((handler, id) => {\n if (handler !== null) {\n fn(handler, id);\n }\n });\n }\n}\n",
12
+ "import { resolveAdapter } from './adapters';\nimport { RequestError } from './errors';\nimport { mergeHeaders, normalizeMethod } from './helpers';\nimport { InterceptorManager } from './interceptors';\nimport type {\n RequestAdapter,\n RequestConfig,\n RequestOptions,\n RequestResponse,\n} from './types';\n\ntype ChainStep = (value: unknown) => unknown;\n\n/**\n * 统一请求客户端:跨端请求入口。\n *\n * 职责:\n * - 实例级默认值(baseURL / headers / timeout / platform 等)与单次配置合并\n * - 请求拦截器(注册顺序)→ 平台适配器 → 响应拦截器(后注册先执行)的链路编排\n * - 目标端解析:config.platform > 实例 adapter > 实例 platform > 运行时探测\n *\n * 用法:\n * ```ts\n * const http = createRequest({ baseURL: '/api', timeout: 10000 });\n * http.interceptors.request.use((config) => {\n * config.headers.Authorization = `Bearer ${token}`;\n * return config;\n * });\n * const res = await http.get<{ list: Item[] }>('/items');\n * ```\n */\nexport class Request {\n /** 请求 / 响应拦截器管理器 */\n public readonly interceptors: {\n request: InterceptorManager<RequestConfig>;\n response: InterceptorManager<RequestResponse>;\n } = {\n request: new InterceptorManager<RequestConfig>(),\n response: new InterceptorManager<RequestResponse>(),\n };\n\n private readonly instanceDefaults: RequestOptions;\n private readonly instanceAdapter?: RequestOptions['adapter'];\n private readonly instancePlatform?: RequestOptions['platform'];\n\n public constructor(options: RequestOptions = {}) {\n const {\n adapter: instanceAdapter,\n platform: instancePlatform,\n ...rest\n } = options;\n this.instanceAdapter = instanceAdapter;\n this.instancePlatform = instancePlatform;\n this.instanceDefaults = { ...rest };\n }\n\n /** 发起请求:合并配置 → 请求拦截器 → 适配器 → 响应拦截器 */\n public request<T = unknown>(\n config: RequestConfig<T>\n ): Promise<RequestResponse<T>> {\n let merged: RequestConfig<T>;\n try {\n merged = this.mergeConfig(config);\n } catch (error) {\n // 配置非法统一走 rejected promise,调用方用 .catch / try-await 即可处理\n return Promise.reject(error);\n }\n\n // 拦截器链:请求拦截器按注册顺序在最前,适配器居中进行实际请求,\n // 响应拦截器后注册的先执行(离调用方最近,最外层)。\n // 链以 (fulfilled, rejected) 成对消费;onRejected 捕获的是其之前链路的错误。\n const chain: Array<ChainStep | undefined> = [];\n this.interceptors.request.forEach((handler) => {\n chain.push(\n handler.onFulfilled as unknown as ChainStep,\n handler.onRejected as ChainStep | undefined\n );\n });\n chain.push(\n (value: unknown) => this.dispatch(value as RequestConfig<T>),\n undefined\n );\n const responseHandlers: Array<{\n onFulfilled?: ChainStep;\n onRejected?: ChainStep | undefined;\n }> = [];\n this.interceptors.response.forEach((handler) => {\n responseHandlers.push({\n onFulfilled: handler.onFulfilled as unknown as ChainStep,\n onRejected: handler.onRejected as ChainStep | undefined,\n });\n });\n for (let index = responseHandlers.length - 1; index >= 0; index -= 1) {\n const handler = responseHandlers[index];\n chain.push(handler.onFulfilled, handler.onRejected);\n }\n\n let promise: Promise<unknown> = Promise.resolve(merged);\n while (chain.length > 0) {\n const fulfilled = chain.shift();\n const rejected = chain.shift();\n promise = promise.then(\n fulfilled as ((value: unknown) => unknown) | undefined,\n rejected as ((reason: unknown) => unknown) | undefined\n );\n }\n return promise as Promise<RequestResponse<T>>;\n }\n\n public get<T = unknown>(\n url: string,\n config?: Omit<RequestConfig, 'url' | 'method'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'GET' });\n }\n\n public delete<T = unknown>(\n url: string,\n config?: Omit<RequestConfig, 'url' | 'method'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'DELETE' });\n }\n\n public head<T = unknown>(\n url: string,\n config?: Omit<RequestConfig, 'url' | 'method'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'HEAD' });\n }\n\n public options<T = unknown>(\n url: string,\n config?: Omit<RequestConfig, 'url' | 'method'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'OPTIONS' });\n }\n\n public post<T = unknown>(\n url: string,\n data?: T,\n config?: Omit<RequestConfig<T>, 'url' | 'method' | 'data'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'POST', data });\n }\n\n public put<T = unknown>(\n url: string,\n data?: T,\n config?: Omit<RequestConfig<T>, 'url' | 'method' | 'data'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'PUT', data });\n }\n\n public patch<T = unknown>(\n url: string,\n data?: T,\n config?: Omit<RequestConfig<T>, 'url' | 'method' | 'data'>\n ): Promise<RequestResponse<T>> {\n return this.request<T>({ ...config, url, method: 'PATCH', data });\n }\n\n private dispatch<T>(config: RequestConfig<T>): Promise<RequestResponse<T>> {\n return resolveAdapter(\n config,\n this.instanceAdapter,\n this.instancePlatform\n ).then((adapter: RequestAdapter) => adapter.request<T>(config));\n }\n\n /** 合并实例级默认值与单次配置,并校验 url / method */\n private mergeConfig<T>(config: RequestConfig<T>): RequestConfig<T> {\n if (!config || typeof config !== 'object') {\n throw new RequestError({\n code: 'BAD_REQUEST',\n message: 'Request config must be an object',\n config: config as RequestConfig,\n });\n }\n\n const merged: RequestConfig = {\n ...this.instanceDefaults,\n ...config,\n headers: mergeHeaders(this.instanceDefaults.headers, config.headers),\n params: { ...this.instanceDefaults.params, ...config.params },\n };\n\n if (typeof merged.url !== 'string' || merged.url.length === 0) {\n throw new RequestError({\n code: 'BAD_REQUEST',\n message: 'Request url is required',\n config: merged,\n });\n }\n\n try {\n merged.method = normalizeMethod(merged.method);\n } catch (cause) {\n throw new RequestError({\n code: 'BAD_REQUEST',\n message: (cause as Error).message,\n config: merged,\n cause,\n });\n }\n\n return merged as RequestConfig<T>;\n }\n}\n",
13
+ "import { Request } from './request';\nimport type { RequestOptions } from './types';\n\n/** 创建独立请求实例;不传配置时等价于使用默认实例 */\nexport function createRequest(options: RequestOptions = {}): Request {\n return new Request(options);\n}\n\n/**\n * 全局默认请求实例:直接使用无需创建。\n * ```ts\n * import { request } from 'transone/request';\n * const res = await request.get('/api/items');\n * ```\n */\nexport const request: Request = new Request();\n\nexport { Request } from './request';\nexport { InterceptorManager } from './interceptors';\nexport { RequestError, isRequestError } from './errors';\nexport type { RequestErrorCode, RequestErrorOptions } from './errors';\nexport {\n adapters,\n createAdapter,\n detectPlatform,\n resolveAdapter,\n} from './adapters';\nexport type { MiniProgramDialect, MiniProgramRequestApi } from './adapters';\nexport type {\n DetectedPlatform,\n HeaderValue,\n HttpMethod,\n InterceptorFulfilled,\n InterceptorHandler,\n InterceptorRejected,\n RequestAdapter,\n RequestAdapterResolver,\n RequestConfig,\n RequestDataType,\n RequestOptions,\n RequestPlatform,\n RequestResponse,\n RequestResponseType,\n} from './types';\n"
14
+ ],
15
+ "mappings": "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",
16
+ "debugId": "C2EF7110F3404F9F64756E2164756E21",
17
+ "names": []
18
+ }
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { OneApp, AppOptions } from './core/app';
2
2
  import type { ComponentProps } from './core/component';
3
3
  export * from './core';
4
4
  export * from './router';
5
+ export * from './request';
5
6
  export declare function createApp<TState extends object = Record<string, unknown>, TConfig extends object = Record<string, unknown>, TRootProps extends ComponentProps = ComponentProps>(options?: AppOptions<TState, TConfig, TRootProps>): OneApp<TState, TConfig, TRootProps>;
6
- export declare const version = "0.1.2";
7
+ export declare const version = "0.3.0";
7
8
  export declare const name = "transone";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{$ as $e,A as ue,Aa as dr,B as pe,Ba as ur,C as fe,D as ce,E as ge,F as me,G as Re,H as xe,I as Te,J as Ve,K as ye,L as be,M as Fe,N as Me,O as je,P as ke,Q as he,R as ve,S as Ce,T as we,U as Ae,V as Ee,W as Oe,X as Pe,Y as Se,Z as qe,_ as Le,a as z,aa as ze,b as B,ba as Be,c as D,ca as De,d as G,da as Ge,e as H,ea as He,f as I,fa as Ie,g as J,ga as Je,h as K,ha as Ke,i as N,ia as Ne,j as Q,ja as Qe,k as U,ka as Ue,l as W,la as d,m as X,ma as We,n as Y,na as Xe,o as Z,oa as Ye,p as _,pa as Ze,q as ee,qa as _e,r as re,ra as er,s as te,sa as rr,t as oe,ta as tr,u as ne,ua as or,v as ie,va as ir,w as le,wa as u,x as se,xa as lr,y as ae,ya as sr,z as de,za as ar}from"./index-2h18qzcx.js";import{Da as nr}from"./index-2e39fr05.js";function p(e){return e instanceof Error?e.message:String(e)}function f(e,r,t){try{let n=e(r,t);if(n===!0)return;return n===!1?"Validation failed":n}catch(n){return p(n)}}function g(e="This field is required"){return(r)=>{if(r===null||r===void 0)return e;if(typeof r==="string"&&r.trim().length===0)return e;if(Array.isArray(r)&&r.length===0)return e;return!0}}function m(e,r=`Must be at least ${e} characters`){return(t)=>typeof t==="string"&&t.length>=e?!0:r}function R(e){return e}function x(e,r){let t={},n=(o)=>{let i=r[o]??[],l=d(e,o),s=i.map((a)=>f(a,l,e)).filter((a)=>a!==void 0);if(s.length===0)delete t[o];else t[o]=s;return{valid:s.length===0,errors:s}};return{model:e,errors:t,validate(){let o={};return Object.keys(r).forEach((i)=>{let l=n(i);if(!l.valid)o[i]=l.errors}),{valid:Object.keys(o).length===0,errors:o}},validateField:n,resetErrors(){Object.keys(t).forEach((o)=>delete t[o])}}}function E(e={}){return new u(e)}var O="0.1.2",P="transone";export{Oe as A,me as Article,Re as Aside,Ce as Blockquote,ae as Button,ve as Code,or as Component,er as ComponentRenderStrategy,ie as Div,Ye as ElementRenderStrategy,je as Em,ce as Footer,Se as Form,xe as H1,Te as H2,Ve as H3,ye as H4,be as H5,Fe as H6,fe as Header,Pe as Img,de as Input,qe as Label,Ee as Li,pe as Main,Xe as ModelBindingController,ge as Nav,Ae as Ol,u as OneApp,ze as Option,se as P,he as Pre,G as ReactiveSystem,Ze as RendererContext,sr as Router,ar as RouterLink,dr as RouterView,ue as Section,$e as Select,rr as SlotRenderStrategy,ke as Small,le as Span,Me as Strong,Be as Table,ne as Tag,Ge as Tbody,Je as Td,tr as TemplateEngine,_e as TextRenderStrategy,Le as Textarea,Ie as Th,De as Thead,He as Tr,we as Ul,K as computed,E as createApp,Ke as createComponent,x as createForm,ur as createRouter,Qe as each,J as effect,D as flushSync,d as getModelValue,oe as h,ee as isComponentNode,re as isHTMLNode,Y as isReactive,Z as isReadonly,Q as isRef,te as isSlotProvider,m as minLength,Ue as modelPath,P as name,B as nextTick,H as reactive,z as reactiveScheduler,I as readonly,N as ref,ir as renderHtmlDocument,nr as renderStyleSheet,g as required,We as setModelValue,Ne as slot,W as stop,_ as toChildren,U as unref,lr as useRouter,R as validate,O as version,X as watch};
1
+ import{$ as ze,A as pe,Aa as pr,B as fe,Ba as u,C as ce,D as ge,E as me,F as xe,G as Re,H as Te,I as Ve,J as ye,K as be,L as Fe,M as Me,N as je,O as ke,P as he,Q as ve,R as Ce,S as we,T as Ae,U as Ee,V as Oe,W as Pe,X as Se,Y as qe,Z as Le,_ as $e,a as B,aa as Be,b as D,ba as De,c as G,ca as Ge,d as H,da as He,e as I,ea as Ie,f as J,fa as Je,g as K,ga as Ke,h as N,ha as Ne,i as Q,ia as Qe,j as U,ja as Ue,k as W,ka as We,l as X,la as d,m as Y,ma as Xe,n as Z,na as Ye,o as _,oa as Ze,p as ee,pa as _e,q as re,qa as er,r as te,ra as rr,s as oe,sa as tr,t as ne,ta as or,u as ie,ua as nr,v as le,va as ir,w as se,wa as lr,x as ae,xa as sr,y as de,ya as ar,z as ue,za as dr}from"./index-49z4707x.js";import{Ea as ur}from"./index-d5wsetxf.js";import{Fa as fr,Ga as cr,Ha as gr,Ia as mr,Ja as xr,Ka as Rr,La as Tr,Ma as Vr,Na as yr,Oa as br}from"./index-xp7y2crt.js";function p(e){return e instanceof Error?e.message:String(e)}function f(e,r,t){try{let n=e(r,t);if(n===!0)return;return n===!1?"Validation failed":n}catch(n){return p(n)}}function g(e="This field is required"){return(r)=>{if(r===null||r===void 0)return e;if(typeof r==="string"&&r.trim().length===0)return e;if(Array.isArray(r)&&r.length===0)return e;return!0}}function m(e,r=`Must be at least ${e} characters`){return(t)=>typeof t==="string"&&t.length>=e?!0:r}function x(e){return e}function R(e,r){let t={},n=(o)=>{let i=r[o]??[],l=d(e,o),s=i.map((a)=>f(a,l,e)).filter((a)=>a!==void 0);if(s.length===0)delete t[o];else t[o]=s;return{valid:s.length===0,errors:s}};return{model:e,errors:t,validate(){let o={};return Object.keys(r).forEach((i)=>{let l=n(i);if(!l.valid)o[i]=l.errors}),{valid:Object.keys(o).length===0,errors:o}},validateField:n,resetErrors(){Object.keys(t).forEach((o)=>delete t[o])}}}function E(e={}){return new u(e)}var O="0.3.0",P="transone";export{Pe as A,xe as Article,Re as Aside,we as Blockquote,de as Button,Ce as Code,dr as Component,lr as ComponentRenderStrategy,le as Div,or as ElementRenderStrategy,ke as Em,ge as Footer,qe as Form,Te as H1,Ve as H2,ye as H3,be as H4,Fe as H5,Me as H6,ce as Header,Se as Img,ue as Input,Tr as InterceptorManager,Le as Label,Oe as Li,fe as Main,Ye as ModelBindingController,me as Nav,Ee as Ol,u as OneApp,Be as Option,ae as P,ve as Pre,H as ReactiveSystem,nr as RendererContext,Vr as Request,fr as RequestError,Ze as Router,_e as RouterLink,er as RouterView,pe as Section,ze as Select,sr as SlotRenderStrategy,he as Small,se as Span,je as Strong,De as Table,ie as Tag,He as Tbody,Ke as Td,ar as TemplateEngine,ir as TextRenderStrategy,$e as Textarea,Je as Th,Ge as Thead,Ie as Tr,Ae as Ul,mr as adapters,N as computed,xr as createAdapter,E as createApp,Ne as createComponent,R as createForm,yr as createRequest,rr as createRouter,gr as detectPlatform,Ue as each,K as effect,G as flushSync,d as getModelValue,ne as h,re as isComponentNode,te as isHTMLNode,Z as isReactive,_ as isReadonly,U as isRef,cr as isRequestError,oe as isSlotProvider,m as minLength,We as modelPath,P as name,D as nextTick,I as reactive,B as reactiveScheduler,J as readonly,Q as ref,pr as renderHtmlDocument,ur as renderStyleSheet,br as request,g as required,Rr as resolveAdapter,Xe as setModelValue,Qe as slot,X as stop,ee as toChildren,W as unref,tr as useRouter,x as validate,O as version,Y as watch};
2
2
 
3
- //# debugId=68CCAB24B589585764756E2164756E21
3
+ //# debugId=CBF629252CF02FBB64756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -3,9 +3,9 @@
3
3
  "sources": ["../lib/core/form.ts", "../lib/index.ts"],
4
4
  "sourcesContent": [
5
5
  "import { getModelValue } from './model';\n\nexport type ValidationResult = boolean | string;\n\nexport type ValidationRule<T = unknown> = (\n value: T,\n model: object\n) => ValidationResult;\n\nexport type ValidationRules<TModel extends object> = {\n [TPath in keyof TModel & string]?: readonly ValidationRule[];\n} & Record<string, readonly ValidationRule[] | undefined>;\n\nexport interface FieldValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport interface FormValidationResult {\n valid: boolean;\n errors: Record<string, string[]>;\n}\n\nexport interface FormController<TModel extends object> {\n readonly model: TModel;\n readonly errors: Record<string, string[]>;\n validate(): FormValidationResult;\n validateField(path: string): FieldValidationResult;\n resetErrors(): void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction runRule(\n rule: ValidationRule,\n value: unknown,\n model: object\n): string | undefined {\n try {\n const result = rule(value, model);\n if (result === true) {\n return undefined;\n }\n return result === false ? 'Validation failed' : result;\n } catch (error) {\n return errorMessage(error);\n }\n}\n\nexport function required(message = 'This field is required'): ValidationRule {\n return (value) => {\n if (value === null || value === undefined) {\n return message;\n }\n if (typeof value === 'string' && value.trim().length === 0) {\n return message;\n }\n if (Array.isArray(value) && value.length === 0) {\n return message;\n }\n return true;\n };\n}\n\nexport function minLength(\n length: number,\n message = `Must be at least ${length} characters`\n): ValidationRule {\n return (value) =>\n typeof value === 'string' && value.length >= length ? true : message;\n}\n\nexport function validate(rule: ValidationRule): ValidationRule {\n return rule;\n}\n\nexport function createForm<TModel extends object>(\n model: TModel,\n rules: ValidationRules<TModel>\n): FormController<TModel> {\n const errors: Record<string, string[]> = {};\n\n const validateField = (path: string): FieldValidationResult => {\n const fieldRules = rules[path] ?? [];\n const value = getModelValue(model as Record<string, unknown>, path);\n const fieldErrors = fieldRules\n .map((rule) => runRule(rule, value, model))\n .filter((message): message is string => message !== undefined);\n\n if (fieldErrors.length === 0) {\n delete errors[path];\n } else {\n errors[path] = fieldErrors;\n }\n\n return { valid: fieldErrors.length === 0, errors: fieldErrors };\n };\n\n return {\n model,\n errors,\n validate(): FormValidationResult {\n const allErrors: Record<string, string[]> = {};\n Object.keys(rules).forEach((path) => {\n const result = validateField(path);\n if (!result.valid) {\n allErrors[path] = result.errors;\n }\n });\n return { valid: Object.keys(allErrors).length === 0, errors: allErrors };\n },\n validateField,\n resetErrors(): void {\n Object.keys(errors).forEach((path) => delete errors[path]);\n },\n };\n}\n",
6
- "import { OneApp, AppOptions } from './core/app';\nimport type { ComponentProps } from './core/component';\n\n// 导出核心功能\nexport * from './core';\n\n// 导出路由功能\nexport * from './router';\n\n// 创建应用实例的主函数\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp(options);\n}\n\n// 导出框架名称和版本\nexport const version = '0.1.2';\nexport const name = 'transone';\n"
6
+ "import { OneApp, AppOptions } from './core/app';\nimport type { ComponentProps } from './core/component';\n\n// 导出核心功能\nexport * from './core';\n\n// 导出路由功能\nexport * from './router';\n\n// 导出跨端请求模块\nexport * from './request';\n\n// 创建应用实例的主函数\nexport function createApp<\n TState extends object = Record<string, unknown>,\n TConfig extends object = Record<string, unknown>,\n TRootProps extends ComponentProps = ComponentProps,\n>(\n options: AppOptions<TState, TConfig, TRootProps> = {}\n): OneApp<TState, TConfig, TRootProps> {\n return new OneApp(options);\n}\n\n// 导出框架名称和版本\nexport const version = '0.3.0';\nexport const name = 'transone';\n"
7
7
  ],
8
- "mappings": "quBA+BA,SAAS,CAAY,CAAC,EAAwB,CAC5C,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAG9D,SAAS,CAAO,CACd,EACA,EACA,EACoB,CACpB,GAAI,CACF,IAAM,EAAS,EAAK,EAAO,CAAK,EAChC,GAAI,IAAW,GACb,OAEF,OAAO,IAAW,GAAQ,oBAAsB,EAChD,MAAO,EAAO,CACd,OAAO,EAAa,CAAK,GAItB,SAAS,CAAQ,CAAC,EAAU,yBAA0C,CAC3E,MAAO,CAAC,IAAU,CAChB,GAAI,IAAU,MAAQ,IAAU,OAC9B,OAAO,EAET,GAAI,OAAO,IAAU,UAAY,EAAM,KAAK,EAAE,SAAW,EACvD,OAAO,EAET,GAAI,MAAM,QAAQ,CAAK,GAAK,EAAM,SAAW,EAC3C,OAAO,EAET,MAAO,IAIJ,SAAS,CAAS,CACvB,EACA,EAAU,oBAAoB,eACd,CAChB,MAAO,CAAC,IACN,OAAO,IAAU,UAAY,EAAM,QAAU,EAAS,GAAO,EAG1D,SAAS,CAAQ,CAAC,EAAsC,CAC7D,OAAO,EAGF,SAAS,CAAiC,CAC/C,EACA,EACwB,CACxB,IAAM,EAAmC,CAAC,EAEpC,EAAgB,CAAC,IAAwC,CAC7D,IAAM,EAAa,EAAM,IAAS,CAAC,EAC7B,EAAQ,EAAc,EAAkC,CAAI,EAC5D,EAAc,EACjB,IAAI,CAAC,IAAS,EAAQ,EAAM,EAAO,CAAK,CAAC,EACzC,OAAO,CAAC,IAA+B,IAAY,MAAS,EAE/D,GAAI,EAAY,SAAW,EACzB,OAAO,EAAO,GAEd,OAAO,GAAQ,EAGjB,MAAO,CAAE,MAAO,EAAY,SAAW,EAAG,OAAQ,CAAY,GAGhE,MAAO,CACL,QACA,SACA,QAAQ,EAAyB,CAC/B,IAAM,EAAsC,CAAC,EAO7C,OANA,OAAO,KAAK,CAAK,EAAE,QAAQ,CAAC,IAAS,CACnC,IAAM,EAAS,EAAc,CAAI,EACjC,GAAI,CAAC,EAAO,MACV,EAAU,GAAQ,EAAO,OAE5B,EACM,CAAE,MAAO,OAAO,KAAK,CAAS,EAAE,SAAW,EAAG,OAAQ,CAAU,GAEzE,gBACA,WAAW,EAAS,CAClB,OAAO,KAAK,CAAM,EAAE,QAAQ,CAAC,IAAS,OAAO,EAAO,EAAK,EAE7D,EC3GK,SAAS,CAIf,CACC,EAAmD,CAAC,EACf,CACrC,OAAO,IAAI,EAAO,CAAO,EAIpB,IAAM,EAAU,QACV,EAAO",
9
- "debugId": "68CCAB24B589585764756E2164756E21",
8
+ "mappings": "i2BA+BA,SAAS,CAAY,CAAC,EAAwB,CAC5C,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAG9D,SAAS,CAAO,CACd,EACA,EACA,EACoB,CACpB,GAAI,CACF,IAAM,EAAS,EAAK,EAAO,CAAK,EAChC,GAAI,IAAW,GACb,OAEF,OAAO,IAAW,GAAQ,oBAAsB,EAChD,MAAO,EAAO,CACd,OAAO,EAAa,CAAK,GAItB,SAAS,CAAQ,CAAC,EAAU,yBAA0C,CAC3E,MAAO,CAAC,IAAU,CAChB,GAAI,IAAU,MAAQ,IAAU,OAC9B,OAAO,EAET,GAAI,OAAO,IAAU,UAAY,EAAM,KAAK,EAAE,SAAW,EACvD,OAAO,EAET,GAAI,MAAM,QAAQ,CAAK,GAAK,EAAM,SAAW,EAC3C,OAAO,EAET,MAAO,IAIJ,SAAS,CAAS,CACvB,EACA,EAAU,oBAAoB,eACd,CAChB,MAAO,CAAC,IACN,OAAO,IAAU,UAAY,EAAM,QAAU,EAAS,GAAO,EAG1D,SAAS,CAAQ,CAAC,EAAsC,CAC7D,OAAO,EAGF,SAAS,CAAiC,CAC/C,EACA,EACwB,CACxB,IAAM,EAAmC,CAAC,EAEpC,EAAgB,CAAC,IAAwC,CAC7D,IAAM,EAAa,EAAM,IAAS,CAAC,EAC7B,EAAQ,EAAc,EAAkC,CAAI,EAC5D,EAAc,EACjB,IAAI,CAAC,IAAS,EAAQ,EAAM,EAAO,CAAK,CAAC,EACzC,OAAO,CAAC,IAA+B,IAAY,MAAS,EAE/D,GAAI,EAAY,SAAW,EACzB,OAAO,EAAO,GAEd,OAAO,GAAQ,EAGjB,MAAO,CAAE,MAAO,EAAY,SAAW,EAAG,OAAQ,CAAY,GAGhE,MAAO,CACL,QACA,SACA,QAAQ,EAAyB,CAC/B,IAAM,EAAsC,CAAC,EAO7C,OANA,OAAO,KAAK,CAAK,EAAE,QAAQ,CAAC,IAAS,CACnC,IAAM,EAAS,EAAc,CAAI,EACjC,GAAI,CAAC,EAAO,MACV,EAAU,GAAQ,EAAO,OAE5B,EACM,CAAE,MAAO,OAAO,KAAK,CAAS,EAAE,SAAW,EAAG,OAAQ,CAAU,GAEzE,gBACA,WAAW,EAAS,CAClB,OAAO,KAAK,CAAM,EAAE,QAAQ,CAAC,IAAS,OAAO,EAAO,EAAK,EAE7D,ECxGK,SAAS,CAIf,CACC,EAAmD,CAAC,EACf,CACrC,OAAO,IAAI,EAAO,CAAO,EAIpB,IAAM,EAAU,QACV,EAAO",
9
+ "debugId": "CBF629252CF02FBB64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -0,0 +1,12 @@
1
+ import type { RequestAdapter, RequestConfig, RequestResponse } from '../types';
2
+ /**
3
+ * Web 端适配器(策略):基于 fetch。
4
+ *
5
+ * - 超时:AbortController + timer,超时归类 TIMEOUT
6
+ * - 取消:config.signal 与超时共用同一个 AbortController,外部取消归类 ABORTED
7
+ * - 响应体:arraybuffer 返回 ArrayBuffer;json(默认)尝试解析、失败回退原文;text 返回原文
8
+ */
9
+ export declare class FetchAdapter implements RequestAdapter {
10
+ readonly platform: "web";
11
+ request<T>(config: RequestConfig<T>): Promise<RequestResponse<T>>;
12
+ }
@@ -0,0 +1,15 @@
1
+ import type { RequestAdapter, RequestAdapterResolver, RequestConfig, RequestPlatform } from '../types';
2
+ export { detectPlatform } from './platform';
3
+ export type { MiniProgramRequestApi } from './platform';
4
+ export type { MiniProgramDialect } from './mp';
5
+ /** 各端适配器注册表:'auto' 不在此列,由运行时探测决定 */
6
+ export declare const adapters: Record<Exclude<RequestPlatform, 'auto'>, RequestAdapter>;
7
+ /** 按目标端创建适配器;不支持的端抛 UNSUPPORTED_PLATFORM */
8
+ export declare function createAdapter(platform: Exclude<RequestPlatform, 'auto'>): RequestAdapter;
9
+ /**
10
+ * 解析请求应使用的适配器(优先级从高到低):
11
+ * 1. 请求级 config.platform(显式指定非 auto 时)
12
+ * 2. 实例级自定义 adapter(对象或解析函数)
13
+ * 3. 实例级默认 platform;仍为 auto 时运行时探测
14
+ */
15
+ export declare function resolveAdapter(config: RequestConfig, instanceAdapter?: RequestAdapter | RequestAdapterResolver, instancePlatform?: RequestPlatform): Promise<RequestAdapter>;
@@ -0,0 +1,34 @@
1
+ import type { RequestAdapter, RequestConfig, RequestResponse } from '../types';
2
+ /**
3
+ * 小程序差异层:微信 / 阿里 / 字节的请求 API 语义一致(wx.request /
4
+ * my.request / tt.request),仅字段名与回调形状不同。与 CLI 的 MpDialect
5
+ * 同思路,把差异收敛为参数化方言,避免三个适配器重复实现。
6
+ */
7
+ export interface MiniProgramDialect {
8
+ /** 目标端标识 */
9
+ platform: 'weixin' | 'alipay' | 'bytedance';
10
+ /** 全局对象名:wx / my / tt */
11
+ globalName: 'wx' | 'my' | 'tt';
12
+ /** 请求参数中请求头字段名:微信/字节 header,阿里 headers */
13
+ headerField: 'header' | 'headers';
14
+ /** 成功回调中状态码字段:微信/字节 statusCode,阿里 status */
15
+ statusField: 'statusCode' | 'status';
16
+ /** 成功回调中响应头字段名:微信/字节 header,阿里 headers */
17
+ responseHeaderField: 'header' | 'headers';
18
+ }
19
+ export declare const WEIXIN_DIALECT: MiniProgramDialect;
20
+ export declare const ALIPAY_DIALECT: MiniProgramDialect;
21
+ export declare const BYTEDANCE_DIALECT: MiniProgramDialect;
22
+ /**
23
+ * 小程序端适配器(策略):wx.request / my.request / tt.request 的统一封装。
24
+ *
25
+ * - 超时:手动 timer + 底层任务 abort,三端行为一致;成功/失败回调都会清理 timer
26
+ * - 取消:config.signal 触发时 abort 底层任务
27
+ * - 失败归一化:按平台 errMsg 关键字归类 TIMEOUT / ABORTED / NETWORK_ERROR
28
+ */
29
+ export declare class MiniProgramAdapter implements RequestAdapter {
30
+ private readonly dialect;
31
+ readonly platform: 'weixin' | 'alipay' | 'bytedance';
32
+ constructor(dialect: MiniProgramDialect);
33
+ request<T>(config: RequestConfig<T>): Promise<RequestResponse<T>>;
34
+ }
@@ -0,0 +1,18 @@
1
+ import type { DetectedPlatform } from '../types';
2
+ /** 小程序请求全局的公共形状(wx.request / my.request / tt.request) */
3
+ export interface MiniProgramRequestApi {
4
+ request?: (options: Record<string, unknown>) => {
5
+ abort?: () => void;
6
+ };
7
+ }
8
+ /**
9
+ * 读取小程序请求全局(wx / my / tt)。
10
+ * 通过全局对象属性访问而非直接引用全局名,避免污染全局声明、
11
+ * 也避免与用户安装的小程序官方类型(如 miniprogram-api-typings)冲突。
12
+ */
13
+ export declare function getMiniProgramApi(name: 'wx' | 'my' | 'tt'): MiniProgramRequestApi | null;
14
+ /**
15
+ * 运行时探测目标端:
16
+ * 小程序全局优先(wx → my → tt),其次 Web fetch;均不可用返回 'unknown'。
17
+ */
18
+ export declare function detectPlatform(): DetectedPlatform;
@@ -0,0 +1,33 @@
1
+ import type { RequestConfig, RequestResponse } from './types';
2
+ /**
3
+ * 统一请求错误码:
4
+ * - NETWORK_ERROR:网络层失败(断网、DNS、连接被拒等)
5
+ * - TIMEOUT:超时
6
+ * - ABORTED:被 AbortSignal 取消
7
+ * - BAD_REQUEST:配置非法(缺少 url、方法不支持等)
8
+ * - UNSUPPORTED_PLATFORM:当前环境没有可用的请求 API,或指定了不支持的端
9
+ * - UNKNOWN:无法归类的失败
10
+ */
11
+ export type RequestErrorCode = 'NETWORK_ERROR' | 'TIMEOUT' | 'ABORTED' | 'BAD_REQUEST' | 'UNSUPPORTED_PLATFORM' | 'UNKNOWN';
12
+ export interface RequestErrorOptions {
13
+ code: RequestErrorCode;
14
+ message: string;
15
+ /** 出错的请求配置 */
16
+ config: RequestConfig;
17
+ /** 出错时已拿到的响应(如响应处理阶段失败) */
18
+ response?: RequestResponse;
19
+ /** 底层原因(原生异常 / 平台 fail 对象等) */
20
+ cause?: unknown;
21
+ }
22
+ /**
23
+ * 统一请求错误:适配器与拦截器抛出的错误全部归一化为该类型,
24
+ * 便于调用方按 code 分支处理(超时重试、取消忽略、网络提示等)。
25
+ */
26
+ export declare class RequestError extends Error {
27
+ readonly code: RequestErrorCode;
28
+ readonly config: RequestConfig;
29
+ readonly response?: RequestResponse;
30
+ readonly cause?: unknown;
31
+ constructor(options: RequestErrorOptions);
32
+ }
33
+ export declare function isRequestError(error: unknown): error is RequestError;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * request 模块纯函数工具:URL 拼接、query 序列化、请求头合并、请求体序列化。
3
+ * 不依赖任何平台全局,便于单测。
4
+ */
5
+ import type { HeaderValue, HttpMethod } from './types';
6
+ /** 归一化 HTTP 方法为大写;缺省为 GET,非法方法抛错 */
7
+ export declare function normalizeMethod(method: string | undefined): HttpMethod;
8
+ /** 是否为带协议的绝对地址(http:// / https:// 等) */
9
+ export declare function isAbsoluteURL(url: string): boolean;
10
+ /** 拼接 baseURL 与相对地址,去除重复斜杠;绝对地址直接返回 */
11
+ export declare function combineURLs(baseURL: string | undefined, url: string): string;
12
+ /**
13
+ * 序列化 query 参数:null / undefined 跳过,数组展开为重复键,
14
+ * Date 转 ISO 字符串,对象 JSON 序列化。
15
+ */
16
+ export declare function serializeParams(params: Record<string, unknown> | undefined): string;
17
+ /** 拼接完整请求地址:baseURL + url + query 参数 */
18
+ export declare function buildURL(baseURL: string | undefined, url: string, params: Record<string, unknown> | undefined): string;
19
+ /**
20
+ * 大小写不敏感合并请求头:多个来源按顺序合并,后出现的同名头(忽略大小写)
21
+ * 覆盖先前的,键名保留后出现来源的原始写法。
22
+ */
23
+ export declare function mergeHeaders(...sources: Array<Record<string, HeaderValue> | undefined>): Record<string, string>;
24
+ /**
25
+ * 序列化请求体(Web 端):
26
+ * - GET / HEAD 无请求体
27
+ * - 字符串、FormData、Blob、ArrayBuffer / TypedArray 原样透传
28
+ * - 普通对象 / 数组 JSON 序列化,并自动设置 Content-Type: application/json
29
+ */
30
+ export declare function serializeBody(data: unknown, headers: Record<string, string>, method: HttpMethod): BodyInit | undefined;
@@ -0,0 +1,19 @@
1
+ import { Request } from './request';
2
+ import type { RequestOptions } from './types';
3
+ /** 创建独立请求实例;不传配置时等价于使用默认实例 */
4
+ export declare function createRequest(options?: RequestOptions): Request;
5
+ /**
6
+ * 全局默认请求实例:直接使用无需创建。
7
+ * ```ts
8
+ * import { request } from 'transone/request';
9
+ * const res = await request.get('/api/items');
10
+ * ```
11
+ */
12
+ export declare const request: Request;
13
+ export { Request } from './request';
14
+ export { InterceptorManager } from './interceptors';
15
+ export { RequestError, isRequestError } from './errors';
16
+ export type { RequestErrorCode, RequestErrorOptions } from './errors';
17
+ export { adapters, createAdapter, detectPlatform, resolveAdapter, } from './adapters';
18
+ export type { MiniProgramDialect, MiniProgramRequestApi } from './adapters';
19
+ export type { DetectedPlatform, HeaderValue, HttpMethod, InterceptorFulfilled, InterceptorHandler, InterceptorRejected, RequestAdapter, RequestAdapterResolver, RequestConfig, RequestDataType, RequestOptions, RequestPlatform, RequestResponse, RequestResponseType, } from './types';
@@ -0,0 +1,4 @@
1
+ import{Fa as a,Ga as b,Ha as c,Ia as d,Ja as e,Ka as f,La as g,Ma as h,Na as i,Oa as j}from"../index-xp7y2crt.js";export{g as InterceptorManager,h as Request,a as RequestError,d as adapters,e as createAdapter,i as createRequest,c as detectPlatform,b as isRequestError,j as request,f as resolveAdapter};
2
+
3
+ //# debugId=3E481CB7C031442F64756E2164756E21
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "3E481CB7C031442F64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,13 @@
1
+ import type { InterceptorFulfilled, InterceptorHandler, InterceptorRejected } from './types';
2
+ /**
3
+ * 拦截器管理器:维护同类型(请求 / 响应)拦截器列表。
4
+ * - use 注册并返回 id,eject 按 id 移除(软删除,保留占位)
5
+ * - forEach 跳过已移除的项
6
+ */
7
+ export declare class InterceptorManager<T> {
8
+ private readonly handlers;
9
+ use(onFulfilled?: InterceptorFulfilled<T>, onRejected?: InterceptorRejected): number;
10
+ eject(id: number): void;
11
+ clear(): void;
12
+ forEach(fn: (handler: InterceptorHandler<T>, id: number) => void): void;
13
+ }
@@ -0,0 +1,43 @@
1
+ import { InterceptorManager } from './interceptors';
2
+ import type { RequestConfig, RequestOptions, RequestResponse } from './types';
3
+ /**
4
+ * 统一请求客户端:跨端请求入口。
5
+ *
6
+ * 职责:
7
+ * - 实例级默认值(baseURL / headers / timeout / platform 等)与单次配置合并
8
+ * - 请求拦截器(注册顺序)→ 平台适配器 → 响应拦截器(后注册先执行)的链路编排
9
+ * - 目标端解析:config.platform > 实例 adapter > 实例 platform > 运行时探测
10
+ *
11
+ * 用法:
12
+ * ```ts
13
+ * const http = createRequest({ baseURL: '/api', timeout: 10000 });
14
+ * http.interceptors.request.use((config) => {
15
+ * config.headers.Authorization = `Bearer ${token}`;
16
+ * return config;
17
+ * });
18
+ * const res = await http.get<{ list: Item[] }>('/items');
19
+ * ```
20
+ */
21
+ export declare class Request {
22
+ /** 请求 / 响应拦截器管理器 */
23
+ readonly interceptors: {
24
+ request: InterceptorManager<RequestConfig>;
25
+ response: InterceptorManager<RequestResponse>;
26
+ };
27
+ private readonly instanceDefaults;
28
+ private readonly instanceAdapter?;
29
+ private readonly instancePlatform?;
30
+ constructor(options?: RequestOptions);
31
+ /** 发起请求:合并配置 → 请求拦截器 → 适配器 → 响应拦截器 */
32
+ request<T = unknown>(config: RequestConfig<T>): Promise<RequestResponse<T>>;
33
+ get<T = unknown>(url: string, config?: Omit<RequestConfig, 'url' | 'method'>): Promise<RequestResponse<T>>;
34
+ delete<T = unknown>(url: string, config?: Omit<RequestConfig, 'url' | 'method'>): Promise<RequestResponse<T>>;
35
+ head<T = unknown>(url: string, config?: Omit<RequestConfig, 'url' | 'method'>): Promise<RequestResponse<T>>;
36
+ options<T = unknown>(url: string, config?: Omit<RequestConfig, 'url' | 'method'>): Promise<RequestResponse<T>>;
37
+ post<T = unknown>(url: string, data?: T, config?: Omit<RequestConfig<T>, 'url' | 'method' | 'data'>): Promise<RequestResponse<T>>;
38
+ put<T = unknown>(url: string, data?: T, config?: Omit<RequestConfig<T>, 'url' | 'method' | 'data'>): Promise<RequestResponse<T>>;
39
+ patch<T = unknown>(url: string, data?: T, config?: Omit<RequestConfig<T>, 'url' | 'method' | 'data'>): Promise<RequestResponse<T>>;
40
+ private dispatch;
41
+ /** 合并实例级默认值与单次配置,并校验 url / method */
42
+ private mergeConfig;
43
+ }