@moneko/core 3.49.0 → 3.49.1

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.
@@ -10,7 +10,14 @@ import printLog, { METHOD_COLOR } from '../commom/print-log.mjs';
10
10
  import require from '../commom/require.mjs';
11
11
  import { jsonSchema } from './json-schema.mjs';
12
12
  declare function shouldHaveBody(req: IncomingMessage);
13
- declare function getRequestBody(req: IncomingMessage);
13
+ export declare function cacheBody(req: RequestFormData & {
14
+ _bodyCached?: boolean;
15
+ _dataChunks?: Uint8Array[];
16
+ });
17
+ declare function parseBody(chunks: Uint8Array[], contentType: string);
18
+ declare async function getRequestBody(req: IncomingMessage & {
19
+ _dataChunks?: Uint8Array[];
20
+ });
14
21
  export interface RequestFormData extends IncomingMessage {
15
22
  files?: {
16
23
  fieldname: string;
package/lib/dev/mock.mjs CHANGED
@@ -1 +1 @@
1
- import e from"node:http";import{StringDecoder as t}from"node:string_decoder";import{URL as o}from"node:url";import{directoryExists as r,ink as n,print as a}from"@moneko/utils";import{watch as c}from"chokidar";import{merge as i}from"webpack-merge";import s from"../commom/log.mjs";import l from"../commom/match-path.mjs";import m,{METHOD_COLOR as d}from"../commom/print-log.mjs";import p from"../commom/require.mjs";import{jsonSchema as f}from"./json-schema.mjs";function u(e,t,o){if(delete p.cache[t],o[t]){for(let r in o[t])Object.prototype.hasOwnProperty.call(o[t],r)&&(e[r]=null,delete e[r]);o[t]=null,delete o[t]}}export const yApiSchemaMock=(t,o)=>new Promise(r=>{e.get(`${t.host}/api/interface/get?id=${t.id}&token=${t.token}`,e=>{e.setEncoding("utf8");let t="";e.on("data",e=>{t+=e}),e.on("end",()=>{try{let e=JSON.parse(t);if(e?.data?.res_body_is_json_schema){let t=JSON.parse(e.data.res_body),n=f(t);void 0!==o?r(i(n,o)):r(n)}}catch(e){s(e)}})})});export const yApiMock=(t,r)=>new Promise((n,a)=>{let c=new o(r.host),i={hostname:c.hostname,port:c.port,path:t.url?.replace(new RegExp(r.pathRewrite),`/mock/${r.projectId}/`),method:t.method,headers:t.headers,query:Object.fromEntries(c.searchParams)},l=e.request(i,e=>{e.setEncoding("utf8");let t="";e.on("data",e=>{t+=e}),e.on("end",()=>{try{n(JSON.parse(t))}catch(e){s(e)}})});l.on("error",e=>{a(e.message)}),l.write(JSON.stringify(t.body)),l.end()});export const oldMock={};export let nextMock={};export function containMockUrl(e){return Object.keys(nextMock).find(t=>RegExp(`^${t.replace(/(:\w*)[^/]/g,"((?!/).)")}*$`).test(e))}export default(e=>{if(!r(e.directory))return;let i=!0;return c(e.directory).on("all",async function(e,t){if("string"==typeof t){switch(a(n("Updating mock...","245"),!0),e){case"add":case"change":try{u(nextMock,t,oldMock);let e=p(t).default;oldMock[t]=e,nextMock=Object.assign(nextMock,e)}catch(e){s(e)}break;case"unlink":u(nextMock,t,oldMock)}i?i=!1:a(n("Mock update successful","245"),!0)}}),(e,r)=>{if(r.writableEnded)return r;let n=new o(`http://localhost:3000${e.url}`),a=e.method||"GET",c=`${a} ${n.pathname}`,i=containMockUrl(c)||c,f=nextMock[i];if(f){if(m(a,n.pathname,{note:"MOCK",labelAlign:"center",labelLen:8,labelForegroundColor:d[a].fg,labelBackgroundColor:d[a].bg}),r.send=e=>r.end("string"==typeof e?e:JSON.stringify(e)),r.writeHead(200,{"Content-Type":e.headers["content-type"]}),"function"==typeof f){let o=l(i.split(" ")[1],n.pathname);return n.searchParams&&Object.assign(e,{query:Object.fromEntries(n.searchParams)}),o&&Object.assign(e,{params:o.params}),e.body=new Promise((o,r)=>{if(["GET","HEAD","OPTIONS"].includes(e.method?.toUpperCase()||""))return o(null);let n=e.headers["content-length"],a=e.headers["transfer-encoding"];if(!n&&!a)return o(null);let c=e.headers["content-type"]||"",i=[];e.on("data",e=>{i.push(e)}),e.on("end",()=>{let e=Buffer.concat(i);if(c.includes("application/json"))try{let r=new t("utf-8").write(e);o(JSON.parse(r))}catch(e){s(e)}else c.includes("application/octet-stream")||c.startsWith("image/")?o(e):c.includes("text/")?o(e.toString("utf-8")):c.includes("application/x-www-form-urlencoded")?o(p("querystring").parse(e.toString("utf-8"))):o(e)}),e.on("error",r)}),f(e,r),!0}return r.end("string"==typeof f?f:JSON.stringify(f)),!0}return!1}});
1
+ import e from"node:http";import{StringDecoder as t}from"node:string_decoder";import{URL as r}from"node:url";import{directoryExists as n,ink as o,print as a}from"@moneko/utils";import{watch as c}from"chokidar";import{merge as i}from"webpack-merge";import s from"../commom/log.mjs";import d from"../commom/match-path.mjs";import l,{METHOD_COLOR as m}from"../commom/print-log.mjs";import u from"../commom/require.mjs";import{jsonSchema as p}from"./json-schema.mjs";function f(e){return!["GET","HEAD","OPTIONS"].includes(e.method?.toUpperCase()||"")}export function cacheBody(e){if(!e._bodyCached&&f(e)&&!e.readableEnded){e._bodyCached=!0;try{let t=[],r=e.on.bind(e),n=e.emit.bind(e),o=!1;e.on=function(e,n){return"data"!==e||o||(o=!0,r("data",e=>{t.push(e)})),r(e,n)};let a=!1;e.emit=function(r,...o){return"end"===r&&!a&&(a=!0,t.length>0&&(e._dataChunks=t)),n.call(this,r,...o)}}catch(e){s(e)}}}function h(e,r){try{let n=Buffer.concat(e);if(r.includes("application/json")){let e=new t("utf-8").write(n);return JSON.parse(e)}if(r.includes("application/octet-stream")||r.startsWith("image/"));else if(r.includes("text/"))return n.toString("utf-8");else if(r.includes("application/x-www-form-urlencoded"))return Object.fromEntries(new URLSearchParams(n.toString("utf8")));return n}catch(e){return s(e),null}}async function g(e){return new Promise(t=>{if(!f(e)){t(null);return}let r=e.headers["content-type"]||"",n=e.headers["content-length"],o=e.headers["transfer-encoding"],a=[];if(void 0!==e._dataChunks){t(h(e._dataChunks,r));return}if(!n&&!o){t(null);return}e.on("data",e=>{a.push(e)}),e.on("end",()=>{t(h(a,r))}),e.on("error",e=>{t(null),s(e)})})}function y(e,t,r){if(delete u.cache[t],r[t]){for(let n in r[t])Object.prototype.hasOwnProperty.call(r[t],n)&&(e[n]=null,delete e[n]);r[t]=null,delete r[t]}}export const yApiSchemaMock=(t,r)=>new Promise(n=>{e.get(`${t.host}/api/interface/get?id=${t.id}&token=${t.token}`,e=>{e.setEncoding("utf8");let t="";e.on("data",e=>{t+=e}),e.on("end",()=>{try{let e=JSON.parse(t);if(e?.data?.res_body_is_json_schema){let t=JSON.parse(e.data.res_body),o=p(t);void 0!==r?n(i(o,r)):n(o)}}catch(e){s(e)}})})});export const yApiMock=(t,n)=>new Promise((o,a)=>{let c=new r(n.host),i={hostname:c.hostname,port:c.port,path:t.url?.replace(new RegExp(n.pathRewrite),`/mock/${n.projectId}/`),method:t.method,headers:t.headers,query:Object.fromEntries(c.searchParams)},d=e.request(i,e=>{e.setEncoding("utf8");let t="";e.on("data",e=>{t+=e}),e.on("end",()=>{try{o(JSON.parse(t))}catch(e){s(e)}})});d.on("error",e=>{a(e.message)}),d.write(JSON.stringify(t.body)),d.end()});export const oldMock={};export let nextMock={};export function containMockUrl(e){return Object.keys(nextMock).find(t=>RegExp(`^${t.replace(/(:\w*)[^/]/g,"((?!/).)")}*$`).test(e))}export default(e=>{if(!n(e.directory))return;let t=!0;return c(e.directory).on("all",async function(e,r){if("string"==typeof r){switch(a(o("Updating mock...","245"),!0),e){case"add":case"change":try{y(nextMock,r,oldMock);let e=u(r).default;oldMock[r]=e,nextMock=Object.assign(nextMock,e)}catch(e){s(e)}break;case"unlink":y(nextMock,r,oldMock)}t?t=!1:a(o("Mock update successful","245"),!0)}}),(e,t)=>{if(t.writableEnded)return t;let n=new r(`http://localhost:3000${e.url}`),o=e.method||"GET",a=`${o} ${n.pathname}`,c=containMockUrl(a)||a,i=nextMock[c];if(i){if(l(o,n.pathname,{note:"MOCK",labelAlign:"center",labelLen:8,labelForegroundColor:m[o].fg,labelBackgroundColor:m[o].bg}),t.send=e=>t.end("string"==typeof e?e:JSON.stringify(e)),t.writeHead(200,{"Content-Type":e.headers["content-type"]}),"function"==typeof i){let r=d(c.split(" ")[1],n.pathname);n.searchParams&&Object.assign(e,{query:Object.fromEntries(n.searchParams)}),r&&Object.assign(e,{params:r.params}),e.body=g(e);try{i(e,t)}catch(e){s(e)}return!0}return t.end("string"==typeof i?i:JSON.stringify(i)),!0}return!1}});
@@ -9,7 +9,7 @@ import paths from '../commom/paths.mjs';
9
9
  import { CONFIG } from '../config.mjs';
10
10
  import getCert, { type CertOption } from '../dev/get-cert.mjs';
11
11
  import { setupProxy } from '../dev/proxy.mjs';
12
- import setupMock from './mock.mjs';
12
+ import setupMock, { cacheBody } from './mock.mjs';
13
13
  export type FileSystem = OutputFileSystem & {
14
14
  existsSync: typeof existsSync;
15
15
  createReadStream: typeof createReadStream;
@@ -1 +1 @@
1
- import{createServer as e}from"node:http";import{createServer as t}from"node:https";import{extname as o,join as r}from"node:path";import n from"../commom/mime.mjs";import i from"../commom/open.mjs";import s from"../commom/paths.mjs";import{CONFIG as a}from"../config.mjs";import m from"../dev/get-cert.mjs";import{setupProxy as c}from"../dev/proxy.mjs";import l from"./mock.mjs";let p={"Access-Control-Allow-Credentials":"true","Access-Control-Allow-Headers":"Authorization, Content-Type, Accept, X-Requested-With, Origin, DNT, User-Agent, Cache-Control, X-CSRF-Token, X-API-Key, X-Client-Version, X-Device-ID, Content-Language, Accept-Language, X-Custom-Header, X-Mx-ReqToken, Keep-Alive, If-Modified-Since","Access-Control-Allow-Methods":"GET, DELETE, HEAD, OPTIONS, POST, PUT, PATCH, PURGE, LINK, UNLINK, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, REPORT, SEARCH, CONNECT, TRACE","Access-Control-Allow-Origin":"*","Cache-Control":"no-store, no-cache, must-revalidate, proxy-revalidate",Pragma:"no-cache",Expires:"0"};async function d(d){let C=r(d.root_dir,"index.html"),h=l({directory:s.mockPath});function f(e,t,r){let i=e.headers["accept-encoding"],s=i?.includes("br"),a=`${r}.${s?"br":"gz"}`,m=d.fileSystem.existsSync(a);m&&t.setHeader("Content-Encoding",s?"br":"gzip");let c=d.fileSystem.createReadStream(m?a:r,{autoClose:!0});c.on("open",()=>{t.writeHead(200,Object.assign({},p,d.headers,{"Access-Control-Allow-Origin":e.headers.origin??"*","Content-Type":n[o(r)]||"application/octet-stream"}))}),c.on("error",e=>{switch(c.destroy(),e.code){case"ENOENT":t.writeHead(301,{Location:"/index.html"}),t.end();break;case"EACCES":t.writeHead(403,{"Content-Type":"text/plain"}),t.end(`Forbidden: ${e.message}`);break;default:t.writeHead(500,{"Content-Type":"text/plain"}),t.end(`Internal Server Error: ${e.message}`)}}),c.pipe(t)}async function u(e,t){if(!(d.onRequest&&d.onRequest(e,t))&&(a.proxy&&await c(e,t,a.proxy),!(h&&h(e,t))&&!t.writableEnded)){if("GET"===e.method){let o="/"===e.url?C:decodeURIComponent(r(d.root_dir,e.url.replace(d.basename??"/","/")));if(d.fileSystem.existsSync(o))return f(e,t,o)}if(e.headers.accept?.includes("text/html"))return f(e,t,C);t.writeHead(404,{"Content-Type":"text/plain"}),t.end("File Not Found")}}let A=d.https?t(await m(d.host,!0===d.https?{install:!0}:d.https),u):e(u);return A.listen(d.port),d.open&&i(`${d.https?"https:":"http:"}//${d.host}:${d.port}${"/"===d.basename?"":d.basename}`),A}export default d;
1
+ import{createServer as e}from"node:http";import{createServer as t}from"node:https";import{extname as o,join as r}from"node:path";import n from"../commom/mime.mjs";import i from"../commom/open.mjs";import s from"../commom/paths.mjs";import{CONFIG as a}from"../config.mjs";import m from"../dev/get-cert.mjs";import{setupProxy as c}from"../dev/proxy.mjs";import l,{cacheBody as p}from"./mock.mjs";let d={"Access-Control-Allow-Credentials":"true","Access-Control-Allow-Headers":"Authorization, Content-Type, Accept, X-Requested-With, Origin, DNT, User-Agent, Cache-Control, X-CSRF-Token, X-API-Key, X-Client-Version, X-Device-ID, Content-Language, Accept-Language, X-Custom-Header, X-Mx-ReqToken, Keep-Alive, If-Modified-Since","Access-Control-Allow-Methods":"GET, DELETE, HEAD, OPTIONS, POST, PUT, PATCH, PURGE, LINK, UNLINK, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, REPORT, SEARCH, CONNECT, TRACE","Access-Control-Allow-Origin":"*","Cache-Control":"no-store, no-cache, must-revalidate, proxy-revalidate",Pragma:"no-cache",Expires:"0"};async function C(C){let h=r(C.root_dir,"index.html"),f=l({directory:s.mockPath});function u(e,t,r){let i=e.headers["accept-encoding"],s=i?.includes("br"),a=`${r}.${s?"br":"gz"}`,m=C.fileSystem.existsSync(a);m&&t.setHeader("Content-Encoding",s?"br":"gzip");let c=C.fileSystem.createReadStream(m?a:r,{autoClose:!0});c.on("open",()=>{t.writeHead(200,Object.assign({},d,C.headers,{"Access-Control-Allow-Origin":e.headers.origin??"*","Content-Type":n[o(r)]||"application/octet-stream"}))}),c.on("error",e=>{switch(c.destroy(),e.code){case"ENOENT":t.writeHead(301,{Location:"/index.html"}),t.end();break;case"EACCES":t.writeHead(403,{"Content-Type":"text/plain"}),t.end(`Forbidden: ${e.message}`);break;default:t.writeHead(500,{"Content-Type":"text/plain"}),t.end(`Internal Server Error: ${e.message}`)}}),c.pipe(t)}async function A(e,t){if(p(e),!(C.onRequest&&C.onRequest(e,t))&&(a.proxy&&await c(e,t,a.proxy),!(f&&f(e,t))&&!t.writableEnded)){if("GET"===e.method){let o="/"===e.url?h:decodeURIComponent(r(C.root_dir,e.url.replace(C.basename??"/","/")));if(C.fileSystem.existsSync(o))return u(e,t,o)}if(e.headers.accept?.includes("text/html"))return u(e,t,h);t.writeHead(404,{"Content-Type":"text/plain"}),t.end("File Not Found")}}let E=C.https?t(await m(C.host,!0===C.https?{install:!0}:C.https),A):e(A);return E.listen(C.port),C.open&&i(`${C.https?"https:":"http:"}//${C.host}:${C.port}${"/"===C.basename?"":C.basename}`),E}export default C;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moneko/core",
3
- "version": "3.49.0",
3
+ "version": "3.49.1",
4
4
  "description": "core",
5
5
  "main": "lib/index.mjs",
6
6
  "type": "module",