@moneko/core 4.7.4 → 4.7.6

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,12 +1,41 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
- type ProxyItem = {
2
+ /**
3
+ * 将请求 URI 转换为文件名
4
+ * @param uri 请求 URI
5
+ * @returns 文件名
6
+ * @example
7
+ * convertUriToFileName('GET /api/create') => 'GET➯api>create'
8
+ * convertUriToFileName('POST /api/create') => 'POST➯api>create'
9
+ */ export declare function convertUriToFileName(uri: string): string;
10
+ export interface HarvesterOptions {
11
+ /**
12
+ * 生成的 Mock 文件名
13
+ * @param params 参数
14
+ * @param params.method 请求方法
15
+ * @param params.pathname 请求 URL 的 pathname
16
+ * @param params.convert 转换文件名的函数
17
+ * @returns 文件名,文件名会自动添加到 mock 目录下,如果返回false, 则不生成 Mock 文件
18
+ */ generate?: (params: HarvesterGenerateParams) => string | boolean;
19
+ }
20
+ export interface HarvesterGenerateParams {
21
+ /**
22
+ * 请求方法
23
+ */ method: string;
24
+ /**
25
+ * 请求 URL 的 pathname
26
+ */ pathname: string;
27
+ /**
28
+ * 转换文件名的函数
29
+ */ convert: typeof convertUriToFileName;
30
+ }
31
+ export type ProxyItem = {
3
32
  target: string;
4
33
  changeOrigin?: boolean;
5
34
  secure?: boolean;
6
35
  ws?: boolean;
7
36
  pathRewrite?: Record<string, string>;
8
37
  headers?: Record<string, string>;
9
- /** 抓取上游响应数据用于初始化 Mock 数据 */ harvester?: boolean;
38
+ /** 抓取上游响应数据用于初始化 Mock 数据 */ harvester?: HarvesterOptions | boolean;
10
39
  };
11
40
  export type ProxyConfig = Record<string, string | ProxyItem>;
12
41
  type IServerResponse = ServerResponse<IncomingMessage> & {
package/lib/dev/proxy.mjs CHANGED
@@ -1 +1 @@
1
- import{request as e}from"node:http";import{request as t}from"node:https";import{URL as o}from"node:url";import{brotliDecompressSync as r,gunzipSync as n,inflateSync as i}from"node:zlib";import{updateFile as p}from"@moneko/utils";import a from"../commom/log.mjs";import{containMockUrl as s}from"./mock.mjs";export async function setupProxy(m,l,c){if(l.writableEnded)return l;let d=m.url,h=Object.keys(c).find(e=>new RegExp(e).test(d));if(!h)return!1;let f="string"==typeof c[h]?{target:c[h],pathRewrite:void 0,changeOrigin:!0,secure:!0,ws:!1}:c[h],u=new o(f.target),g=d;if(f.pathRewrite&&"object"==typeof f.pathRewrite)for(let e in f.pathRewrite)Object.prototype.hasOwnProperty.call(f.pathRewrite,e)&&(g=d.replace(new RegExp(e),f.pathRewrite[e]));let w="https:"===u.protocol,y={method:m.method,hostname:u.hostname,port:u.port||(w?443:80),path:g,headers:{...m.headers},protocol:u.protocol};f.changeOrigin&&(y.headers.host=u.host);let R=w?t:e;return new Promise(e=>{let t=R(y,t=>{let a=t.statusCode||404,c=a>=400,d=`${m.method||"GET"} ${new o(`${u.origin}${m.url}`).pathname}`,h=!!s(d);if(c&&h)return e(!1);if(l.writeHead(a,t.headers),!c&&!h&&f.harvester){let e=[];t.on("data",t=>e.push(t)),t.on("end",()=>{let o={" ":"➯","/":">",":":"◍"},a=Buffer.concat(e),s=t.headers["content-encoding"]||"",m=null;(m=s.includes("gzip")?n(a).toString():s.includes("br")?r(a).toString():s.includes("deflate")?i(a).toString():a.toString())&&p(`mock/${d.replace(/[\s/:]/g,e=>o[e]||e)}.ts`,`import type { MockConfiguration } from '@moneko/core';const conf: MockConfiguration = {'${d}': ${m}};export default conf;`)})}t.pipe(l),e(l)});t.on("error",t=>(a(t),l.headersSent?l.end():(l.writeHead(502,{"Content-Type":"text/plain"}),l.end(`Proxy Error: ${t.message}`)),e(!1))),m.pipe(t)})}
1
+ import{request as e}from"node:http";import{request as t}from"node:https";import{URL as r}from"node:url";import{brotliDecompressSync as o,gunzipSync as n,inflateSync as i}from"node:zlib";import{updateFile as a}from"@moneko/utils";import p from"../commom/log.mjs";import{isFunction as s,isObject as m}from"../utils/index.mjs";import{containMockUrl as l}from"./mock.mjs";export function convertUriToFileName(e){let t={" ":"➯","/":">",":":"◍"};return e.replace(/[\s/:]/g,e=>t[e]||e)}export async function setupProxy(c,h,d){if(h.writableEnded)return h;let f=c.url,u=Object.keys(d).find(e=>new RegExp(e).test(f));if(!u)return!1;let g="string"==typeof d[u]?{target:d[u],pathRewrite:void 0,changeOrigin:!0,secure:!0,ws:!1}:d[u],w=new r(g.target),y=f;if(g.pathRewrite&&"object"==typeof g.pathRewrite)for(let e in g.pathRewrite)Object.prototype.hasOwnProperty.call(g.pathRewrite,e)&&(y=f.replace(new RegExp(e),g.pathRewrite[e]));let v="https:"===w.protocol,x={method:c.method,hostname:w.hostname,port:w.port||(v?443:80),path:y,headers:{...c.headers},protocol:w.protocol};g.changeOrigin&&(x.headers.host=w.host);let R=v?t:e;return new Promise(e=>{let t=R(x,t=>{let p=c.method||"GET",d=new r(`${w.origin}${c.url}`).pathname,f=`${p} ${d}`,u=t.statusCode||404,y=u>=400,v=!!l(f);if(y&&v)return e(!1);if(h.writeHead(u,t.headers),!y&&!v&&g.harvester){let e=m(g.harvester)&&s(g.harvester.generate)?g.harvester.generate({method:p,pathname:d,convert:convertUriToFileName}):convertUriToFileName(f);if(e){let r=[];t.on("data",e=>r.push(e)),t.on("end",()=>{let p=Buffer.concat(r),s=t.headers["content-encoding"]||"",m=null;(m=s.includes("gzip")?n(p).toString():s.includes("br")?o(p).toString():s.includes("deflate")?i(p).toString():p.toString())&&a(`mock/${e}.ts`,`import type { MockConfiguration } from '@moneko/core';const conf: MockConfiguration = {'${f}': ${m}};export default conf;`)})}}t.pipe(h),e(h)});t.on("error",t=>(p(t),h.headersSent?h.end():(h.writeHead(502,{"Content-Type":"text/plain"}),h.end(`Proxy Error: ${t.message}`)),e(!1))),c.pipe(t)})}
package/lib/index.d.mts CHANGED
@@ -13,7 +13,7 @@ export { default as require } from './commom/require.mjs';
13
13
  export * as Rule from './commom/rule.mjs';
14
14
  export { default as timer } from './commom/timer.mjs';
15
15
  export { type MockConfiguration, type ProxyFuncType, type RequestFormData, yApiMock, type YApiOption, type YApiOptionBySchema, yApiSchemaMock } from './dev/mock.mjs';
16
- export type { ProxyConfig } from './dev/proxy.mjs';
16
+ export { convertUriToFileName, type HarvesterGenerateParams, type HarvesterOptions, type ProxyConfig, type ProxyItem } from './dev/proxy.mjs';
17
17
  export type { ReactCompilerOption } from './loader/react-compiler.cjs';
18
18
  export { type JsxDomExpressions, default as jsxDomExpressions } from './options/jsx-dom-expressions.mjs';
19
19
  export { type OptimizationSplitChunksOptions, default as splitChunk } from './options/split-chunk.mjs';
package/lib/index.mjs CHANGED
@@ -1 +1 @@
1
- export{declToMd}from"./commom/decl-to-md.mjs";export*from"./commom/git.mjs";export{default as hasPkg}from"./commom/has-pkg.mjs";export{getIPv4,getPort}from"./commom/net.mjs";export{default as open}from"./commom/open.mjs";export{default as parseArgs}from"./commom/parse-args.mjs";export{CUSTOMCONFIG,default as paths,routeDir,yarnArgv}from"./commom/paths.mjs";export{default as printLog}from"./commom/print-log.mjs";export{default as require}from"./commom/require.mjs";export*as Rule from"./commom/rule.mjs";export{default as timer}from"./commom/timer.mjs";export{yApiMock,yApiSchemaMock}from"./dev/mock.mjs";export{default as jsxDomExpressions}from"./options/jsx-dom-expressions.mjs";export{default as splitChunk}from"./options/split-chunk.mjs";export{HtmlPlugin}from"./plugin/html-plugin.mjs";export*from"./plugin/manifest/index.mjs";export{APPTYPE,coreName,FRAMEWORK,isCI,isDev,isLibrary,isMicro,mainDirectory,packageJson,PACKAGENAME}from"./process-env.mjs";export{digest,md5,node_modules,resolveProgram,toCamelCase}from"./utils/index.mjs";export*from"@moneko/mdx";export*from"@moneko/utils";import o from"webpack";export{o as webpack};
1
+ export{declToMd}from"./commom/decl-to-md.mjs";export*from"./commom/git.mjs";export{default as hasPkg}from"./commom/has-pkg.mjs";export{getIPv4,getPort}from"./commom/net.mjs";export{default as open}from"./commom/open.mjs";export{default as parseArgs}from"./commom/parse-args.mjs";export{CUSTOMCONFIG,default as paths,routeDir,yarnArgv}from"./commom/paths.mjs";export{default as printLog}from"./commom/print-log.mjs";export{default as require}from"./commom/require.mjs";export*as Rule from"./commom/rule.mjs";export{default as timer}from"./commom/timer.mjs";export{yApiMock,yApiSchemaMock}from"./dev/mock.mjs";export{convertUriToFileName}from"./dev/proxy.mjs";export{default as jsxDomExpressions}from"./options/jsx-dom-expressions.mjs";export{default as splitChunk}from"./options/split-chunk.mjs";export{HtmlPlugin}from"./plugin/html-plugin.mjs";export*from"./plugin/manifest/index.mjs";export{APPTYPE,coreName,FRAMEWORK,isCI,isDev,isLibrary,isMicro,mainDirectory,packageJson,PACKAGENAME}from"./process-env.mjs";export{digest,md5,node_modules,resolveProgram,toCamelCase}from"./utils/index.mjs";export*from"@moneko/mdx";export*from"@moneko/utils";import o from"webpack";export{o as webpack};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moneko/core",
3
- "version": "4.7.4",
3
+ "version": "4.7.6",
4
4
  "description": "core",
5
5
  "main": "lib/index.mjs",
6
6
  "type": "module",