phecda-server 1.1.1 → 1.2.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.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # phecda-server
2
+ types share between server and client, like `nestjs`
3
+
4
+ ## express
5
+ ### server side
6
+ ```ts
7
+ // in test.controller.ts
8
+ import { Body, Controller, Get, Param, Post, Query, Watcher, emitter } from 'phecda-server'
9
+
10
+ @Controller('/base')
11
+ export class TestController {
12
+ @Post('/:test')
13
+ async test(@Param('test') test: string, @Body('name') name: string, @Query('id') id: string) {
14
+ console.log(`${test}-${name}-${id}`)
15
+ emitter.emit('watch', 1)
16
+ return `${test}-${name}-${id}`
17
+ }
18
+
19
+ @Get('/get')
20
+ async get() {
21
+ return {
22
+ data: 'test',
23
+ }
24
+ }
25
+ }
26
+ ```
27
+ ```ts
28
+ // in server.ts
29
+ import fs from 'fs'
30
+ import { Factory, bindApp } from 'phecda-server'
31
+ import express from 'express'
32
+ import { TestController } from './test.controller'
33
+ const data = await Factory([TestController])
34
+ fs.writeFileSync('meta.p.js', JSON.stringify(data.meta.map(item => item.data)))
35
+ const app = express()
36
+ app.all('*', (req, res, next) => {
37
+ res.header('Access-Control-Allow-Origin', '*')
38
+ res.header('Access-Control-Allow-Headers', 'Content-Type')
39
+ res.header('Access-Control-Allow-Methods', '*')
40
+ next()
41
+ })
42
+ app.use(express.json())
43
+
44
+ bindApp(app, data)
45
+ ```
46
+
47
+ ### client side
48
+
49
+ ```ts
50
+ // in vite.config.ts
51
+
52
+ import { defineConfig } from 'vite'
53
+ import { Server } from 'phecda-server'
54
+
55
+ export default defineConfig({
56
+ plugins: [Server('meta.p.js')],
57
+
58
+ })
59
+ ```
60
+
61
+ ```ts
62
+ // in main.ts
63
+
64
+ import { $S, createBeacon, createMergeReq, createReq, isError } from 'phecda-server/client'
65
+ import axios from 'axios'
66
+ import { TestController } from './test.controller'
67
+
68
+ const instance = axios.create({
69
+ // ...
70
+ })
71
+ const useRequest = createReq(instance)
72
+ const useMergeRequest = createMergeReq(instance)
73
+ const { test, get } = new TestController()
74
+ async function request() {
75
+ const { data } = await useRequest(test('phecda', 'server', '1'))
76
+ console.log('[normal request]:')
77
+
78
+ console.log(data)
79
+ }
80
+
81
+ async function seriesRequest() {
82
+ const { data: [, res2] } = await useMergeRequest([get(), test($S(0, 'data'), 'server', '1')])
83
+ console.log('[series request]:')
84
+
85
+ if (isError(res2))
86
+ console.error(res2.message)
87
+ else console.log(res2)
88
+ }
89
+
90
+ async function mergeRequest() {
91
+ const { data: [res1, res2] } = await useMergeRequest([test('phecda', 'server', '1'), get()])
92
+ console.log('[merge request]:')
93
+
94
+ if (isError(res1))
95
+ console.error(res1.message)
96
+ else console.log(res1)
97
+
98
+ if (isError(res2))
99
+ console.error(res2.message)
100
+ else console.log(res2)
101
+ }
102
+
103
+ request()
104
+ mergeRequest()
105
+ seriesRequest()
106
+ ```
@@ -96,8 +96,9 @@ declare function toReq(arg: RequestArgs): {
96
96
  declare const merge: (...args: RequestArgs[]) => MergedReqArg[];
97
97
  type RequestMethod = <F extends (...args: any[]) => any>(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>;
98
98
  declare function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<R>>>>;
99
- declare function createMergeReq(instance: AxiosInstance, key?: string): <R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>>;
99
+ declare function createSeriesReq(instance: AxiosInstance, key?: string): <R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>>;
100
+ declare function createParallelReq(instance: AxiosInstance, key?: string): <R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>>;
100
101
  declare function isError<T = any>(data: T | PError): data is PError;
101
102
  declare function $S(index: number, key?: string): any;
102
103
 
103
- export { $S as $, BaseError as B, Construct as C, MergeType as M, PHandler as P, RequestType as R, ServerMeta as S, Transform as T, UnWrap as U, PhecdaEmitter as a, PError as b, ResOrErr as c, PRes as d, ServerContextData as e, MqContextData as f, RequestMethod as g, createReq as h, createMergeReq as i, isError as j, merge as m, toReq as t };
104
+ export { $S as $, BaseError as B, Construct as C, MergeType as M, PHandler as P, RequestType as R, ServerMeta as S, Transform as T, UnWrap as U, PhecdaEmitter as a, PError as b, ResOrErr as c, PRes as d, ServerContextData as e, MqContextData as f, RequestMethod as g, createReq as h, createSeriesReq as i, createParallelReq as j, isError as k, merge as m, toReq as t };
@@ -1,4 +1,4 @@
1
- export { $ as $S, g as RequestMethod, i as createMergeReq, h as createReq, j as isError, m as merge, t as toReq } from '../server-d482bc0d.js';
1
+ export { $ as $S, g as RequestMethod, j as createParallelReq, h as createReq, i as createSeriesReq, k as isError, m as merge, t as toReq } from '../axios-13a49ed4.js';
2
2
  import 'axios';
3
3
  import 'express';
4
4
  import 'amqplib';
@@ -23,8 +23,9 @@ var client_exports = {};
23
23
  __export(client_exports, {
24
24
  $S: () => $S,
25
25
  createBeacon: () => createBeacon,
26
- createMergeReq: () => createMergeReq,
26
+ createParallelReq: () => createParallelReq,
27
27
  createReq: () => createReq,
28
+ createSeriesReq: () => createSeriesReq,
28
29
  isError: () => isError,
29
30
  merge: () => merge,
30
31
  toReq: () => toReq
@@ -34,7 +35,7 @@ module.exports = __toCommonJS(client_exports);
34
35
  // src/common.ts
35
36
  var SERIES_SYMBOL = "__symbol_series__";
36
37
 
37
- // src/client/server.ts
38
+ // src/client/axios.ts
38
39
  function toReq(arg) {
39
40
  const { body, query, realParam, method, url } = arg;
40
41
  return {
@@ -75,12 +76,24 @@ function createReq(instance) {
75
76
  };
76
77
  }
77
78
  __name(createReq, "createReq");
78
- function createMergeReq(instance, key = "/__PHECDA_SERVER__") {
79
+ function createSeriesReq(instance, key = "/__PHECDA_SERVER__") {
79
80
  return (args, config) => {
80
- return instance.post(key, merge(...args), config);
81
+ return instance.post(key, {
82
+ category: "series",
83
+ data: merge(...args)
84
+ }, config);
81
85
  };
82
86
  }
83
- __name(createMergeReq, "createMergeReq");
87
+ __name(createSeriesReq, "createSeriesReq");
88
+ function createParallelReq(instance, key = "/__PHECDA_SERVER__") {
89
+ return (args, config) => {
90
+ return instance.post(key, {
91
+ category: "parallel",
92
+ data: merge(...args)
93
+ }, config);
94
+ };
95
+ }
96
+ __name(createParallelReq, "createParallelReq");
84
97
  function isError(data) {
85
98
  return typeof data === "object" && data.error;
86
99
  }
@@ -102,8 +115,9 @@ __name(createBeacon, "createBeacon");
102
115
  0 && (module.exports = {
103
116
  $S,
104
117
  createBeacon,
105
- createMergeReq,
118
+ createParallelReq,
106
119
  createReq,
120
+ createSeriesReq,
107
121
  isError,
108
122
  merge,
109
123
  toReq
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/index.ts","../../src/common.ts","../../src/client/server.ts"],"sourcesContent":["import { toReq } from './server'\nexport * from './server'\n\nexport function createBeacon(baseUrl: string) {\n return (arg: any) => {\n const { url, params, query, body } = toReq(arg as any)\n\n navigator.sendBeacon(`${baseUrl}${url}${params}${query}`, JSON.stringify(body))\n }\n}\n","export const SERIES_SYMBOL = '__symbol_series__'\nexport const REQ_SYMBOL = '__symbol_req__'\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport type { PError, PRes, RequestType, ResOrErr } from '../types'\nimport { SERIES_SYMBOL } from '../common'\ninterface RequestArgs {\n body: Record<string, any>\n query: Record<string, string>\n params: Record<string, string>\n realParam: string\n method: RequestType\n url: string\n tag: string\n}\ntype MergedReqArg = Pick<RequestArgs, 'body' | 'query' | 'params' | 'tag' >\nexport function toReq(arg: RequestArgs) {\n const { body, query, realParam, method, url } = arg\n return { method, url, body, query: Object.keys(query).length > 0 ? `?${Object.entries(query).map(([k, v]) => `${k}=${v}`).join('&')}` : '', params: realParam }\n}\n\nexport const merge = (...args: RequestArgs[]) => {\n const ret = [] as MergedReqArg[]\n for (const i of args) {\n const { body, query, params, tag } = i\n ret.push({ tag, body, query, params })\n }\n\n return ret\n}\n\nexport type RequestMethod = <F extends (...args: any[]) => any >(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>\n\nexport function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<R>>> > {\n // @ts-expect-error methods without route decorator won't send request\n return (arg: any, config?: AxiosRequestConfig) => {\n const { url, params, query, body, method } = toReq(arg as RequestArgs)\n if (!method) {\n console.warn('methods without route decorator won\\'t send request')\n return\n }\n\n const ret = [`${url}${params}${query}`] as any[]\n body && ret.push(body)\n config && ret.push(config)\n // @ts-expect-error misdirction\n return instance[method](...ret)\n }\n}\n\nexport function createMergeReq(instance: AxiosInstance, key = '/__PHECDA_SERVER__'): < R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>> {\n // @ts-expect-error misdirction\n return (args: RequestArgs[], config?: AxiosRequestConfig) => {\n return instance.post(key, merge(...args), config)\n }\n}\n\nexport function isError<T = any>(data: T | PError): data is PError {\n return typeof data === 'object' && (data as any).error\n}\n\nexport function $S(index: number, key = ''): any {\n return `${SERIES_SYMBOL}@${index}@${key}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;ACAO,IAAMA,gBAAgB;;;ACatB,SAASC,MAAMC,KAAkB;AACtC,QAAM,EAAEC,MAAMC,OAAOC,WAAWC,QAAQC,IAAG,IAAKL;AAChD,SAAO;IAAEI;IAAQC;IAAKJ;IAAMC,OAAOI,OAAOC,KAAKL,KAAAA,EAAOM,SAAS,IAAI,IAAIF,OAAOG,QAAQP,KAAAA,EAAOQ,IAAI,CAAC,CAACC,GAAGC,CAAAA,MAAO,GAAGD,KAAKC,GAAG,EAAEC,KAAK,GAAA,MAAS;IAAIC,QAAQX;EAAU;AAChK;AAHgBJ;AAKT,IAAMgB,QAAQ,2BAAIC,SAAwB;AAC/C,QAAMC,MAAM,CAAA;AACZ,aAAWC,KAAKF,MAAM;AACpB,UAAM,EAAEf,MAAMC,OAAOY,QAAQK,IAAG,IAAKD;AACrCD,QAAIG,KAAK;MAAED;MAAKlB;MAAMC;MAAOY;IAAO,CAAA;EACtC;AAEA,SAAOG;AACT,GARqB;AAYd,SAASI,UAAUC,UAAgH;AAExI,SAAO,CAACtB,KAAUuB,WAAgC;AAChD,UAAM,EAAElB,KAAKS,QAAQZ,OAAOD,MAAMG,OAAM,IAAKL,MAAMC,GAAAA;AACnD,QAAI,CAACI,QAAQ;AACXoB,cAAQC,KAAK,oDAAA;AACb;IACF;AAEA,UAAMR,MAAM;MAAC,GAAGZ,MAAMS,SAASZ;;AAC/BD,YAAQgB,IAAIG,KAAKnB,IAAAA;AACjBsB,cAAUN,IAAIG,KAAKG,MAAAA;AAEnB,WAAOD,SAASlB,QAAO,GAAIa,GAAAA;EAC7B;AACF;AAfgBI;AAiBT,SAASK,eAAeJ,UAAyBK,MAAM,sBAAiI;AAE7L,SAAO,CAACX,MAAqBO,WAAgC;AAC3D,WAAOD,SAASM,KAAKD,KAAKZ,MAAAA,GAASC,IAAAA,GAAOO,MAAAA;EAC5C;AACF;AALgBG;AAOT,SAASG,QAAiBC,MAAkC;AACjE,SAAO,OAAOA,SAAS,YAAaA,KAAaC;AACnD;AAFgBF;AAIT,SAASG,GAAGC,OAAeN,MAAM,IAAS;AAC/C,SAAO,GAAGO,iBAAiBD,SAASN;AACtC;AAFgBK;;;AFvDT,SAASG,aAAaC,SAAiB;AAC5C,SAAO,CAACC,QAAa;AACnB,UAAM,EAAEC,KAAKC,QAAQC,OAAOC,KAAI,IAAKC,MAAML,GAAAA;AAE3CM,cAAUC,WAAW,GAAGR,UAAUE,MAAMC,SAASC,SAASK,KAAKC,UAAUL,IAAAA,CAAAA;EAC3E;AACF;AANgBN;","names":["SERIES_SYMBOL","toReq","arg","body","query","realParam","method","url","Object","keys","length","entries","map","k","v","join","params","merge","args","ret","i","tag","push","createReq","instance","config","console","warn","createMergeReq","key","post","isError","data","error","$S","index","SERIES_SYMBOL","createBeacon","baseUrl","arg","url","params","query","body","toReq","navigator","sendBeacon","JSON","stringify"]}
1
+ {"version":3,"sources":["../../src/client/index.ts","../../src/common.ts","../../src/client/axios.ts"],"sourcesContent":["import { toReq } from './axios'\nexport * from './axios'\n\nexport function createBeacon(baseUrl: string) {\n return (arg: any) => {\n const { url, params, query, body } = toReq(arg as any)\n\n navigator.sendBeacon(`${baseUrl}${url}${params}${query}`, JSON.stringify(body))\n }\n}\n","export const SERIES_SYMBOL = '__symbol_series__'\nexport const REQ_SYMBOL = '__symbol_req__'\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport type { PError, PRes, RequestType, ResOrErr } from '../types'\nimport { SERIES_SYMBOL } from '../common'\ninterface RequestArgs {\n body: Record<string, any>\n query: Record<string, string>\n params: Record<string, string>\n realParam: string\n method: RequestType\n url: string\n tag: string\n}\ntype MergedReqArg = Pick<RequestArgs, 'body' | 'query' | 'params' | 'tag' >\nexport function toReq(arg: RequestArgs) {\n const { body, query, realParam, method, url } = arg\n return { method, url, body, query: Object.keys(query).length > 0 ? `?${Object.entries(query).map(([k, v]) => `${k}=${v}`).join('&')}` : '', params: realParam }\n}\n\nexport const merge = (...args: RequestArgs[]) => {\n const ret = [] as MergedReqArg[]\n for (const i of args) {\n const { body, query, params, tag } = i\n ret.push({ tag, body, query, params })\n }\n\n return ret\n}\n\nexport type RequestMethod = <F extends (...args: any[]) => any >(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>\n\nexport function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<R>>> > {\n // @ts-expect-error methods without route decorator won't send request\n return (arg: any, config?: AxiosRequestConfig) => {\n const { url, params, query, body, method } = toReq(arg as RequestArgs)\n if (!method) {\n console.warn('methods without route decorator won\\'t send request')\n return\n }\n\n const ret = [`${url}${params}${query}`] as any[]\n body && ret.push(body)\n config && ret.push(config)\n // @ts-expect-error misdirction\n return instance[method](...ret)\n }\n}\n\nexport function createSeriesReq(instance: AxiosInstance, key = '/__PHECDA_SERVER__'): < R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>> {\n // @ts-expect-error misdirction\n return (args: RequestArgs[], config?: AxiosRequestConfig) => {\n return instance.post(key, {\n category: 'series',\n data: merge(...args),\n }, config)\n }\n}\n\nexport function createParallelReq(instance: AxiosInstance, key = '/__PHECDA_SERVER__'): < R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>> {\n // @ts-expect-error misdirction\n return (args: RequestArgs[], config?: AxiosRequestConfig) => {\n return instance.post(key, {\n category: 'parallel',\n data: merge(...args),\n }, config)\n }\n}\n\nexport function isError<T = any>(data: T | PError): data is PError {\n return typeof data === 'object' && (data as any).error\n}\n\nexport function $S(index: number, key = ''): any {\n return `${SERIES_SYMBOL}@${index}@${key}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;ACAO,IAAMA,gBAAgB;;;ACatB,SAASC,MAAMC,KAAkB;AACtC,QAAM,EAAEC,MAAMC,OAAOC,WAAWC,QAAQC,IAAG,IAAKL;AAChD,SAAO;IAAEI;IAAQC;IAAKJ;IAAMC,OAAOI,OAAOC,KAAKL,KAAAA,EAAOM,SAAS,IAAI,IAAIF,OAAOG,QAAQP,KAAAA,EAAOQ,IAAI,CAAC,CAACC,GAAGC,CAAAA,MAAO,GAAGD,KAAKC,GAAG,EAAEC,KAAK,GAAA,MAAS;IAAIC,QAAQX;EAAU;AAChK;AAHgBJ;AAKT,IAAMgB,QAAQ,2BAAIC,SAAwB;AAC/C,QAAMC,MAAM,CAAA;AACZ,aAAWC,KAAKF,MAAM;AACpB,UAAM,EAAEf,MAAMC,OAAOY,QAAQK,IAAG,IAAKD;AACrCD,QAAIG,KAAK;MAAED;MAAKlB;MAAMC;MAAOY;IAAO,CAAA;EACtC;AAEA,SAAOG;AACT,GARqB;AAYd,SAASI,UAAUC,UAAgH;AAExI,SAAO,CAACtB,KAAUuB,WAAgC;AAChD,UAAM,EAAElB,KAAKS,QAAQZ,OAAOD,MAAMG,OAAM,IAAKL,MAAMC,GAAAA;AACnD,QAAI,CAACI,QAAQ;AACXoB,cAAQC,KAAK,oDAAA;AACb;IACF;AAEA,UAAMR,MAAM;MAAC,GAAGZ,MAAMS,SAASZ;;AAC/BD,YAAQgB,IAAIG,KAAKnB,IAAAA;AACjBsB,cAAUN,IAAIG,KAAKG,MAAAA;AAEnB,WAAOD,SAASlB,QAAO,GAAIa,GAAAA;EAC7B;AACF;AAfgBI;AAiBT,SAASK,gBAAgBJ,UAAyBK,MAAM,sBAAiI;AAE9L,SAAO,CAACX,MAAqBO,WAAgC;AAC3D,WAAOD,SAASM,KAAKD,KAAK;MACxBE,UAAU;MACVC,MAAMf,MAAAA,GAASC,IAAAA;IACjB,GAAGO,MAAAA;EACL;AACF;AARgBG;AAUT,SAASK,kBAAkBT,UAAyBK,MAAM,sBAAiI;AAEhM,SAAO,CAACX,MAAqBO,WAAgC;AAC3D,WAAOD,SAASM,KAAKD,KAAK;MACxBE,UAAU;MACVC,MAAMf,MAAAA,GAASC,IAAAA;IACjB,GAAGO,MAAAA;EACL;AACF;AARgBQ;AAUT,SAASC,QAAiBF,MAAkC;AACjE,SAAO,OAAOA,SAAS,YAAaA,KAAaG;AACnD;AAFgBD;AAIT,SAASE,GAAGC,OAAeR,MAAM,IAAS;AAC/C,SAAO,GAAGS,iBAAiBD,SAASR;AACtC;AAFgBO;;;AFpET,SAASG,aAAaC,SAAiB;AAC5C,SAAO,CAACC,QAAa;AACnB,UAAM,EAAEC,KAAKC,QAAQC,OAAOC,KAAI,IAAKC,MAAML,GAAAA;AAE3CM,cAAUC,WAAW,GAAGR,UAAUE,MAAMC,SAASC,SAASK,KAAKC,UAAUL,IAAAA,CAAAA;EAC3E;AACF;AANgBN;","names":["SERIES_SYMBOL","toReq","arg","body","query","realParam","method","url","Object","keys","length","entries","map","k","v","join","params","merge","args","ret","i","tag","push","createReq","instance","config","console","warn","createSeriesReq","key","post","category","data","createParallelReq","isError","error","$S","index","SERIES_SYMBOL","createBeacon","baseUrl","arg","url","params","query","body","toReq","navigator","sendBeacon","JSON","stringify"]}
@@ -4,7 +4,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
4
4
  // src/common.ts
5
5
  var SERIES_SYMBOL = "__symbol_series__";
6
6
 
7
- // src/client/server.ts
7
+ // src/client/axios.ts
8
8
  function toReq(arg) {
9
9
  const { body, query, realParam, method, url } = arg;
10
10
  return {
@@ -45,12 +45,24 @@ function createReq(instance) {
45
45
  };
46
46
  }
47
47
  __name(createReq, "createReq");
48
- function createMergeReq(instance, key = "/__PHECDA_SERVER__") {
48
+ function createSeriesReq(instance, key = "/__PHECDA_SERVER__") {
49
49
  return (args, config) => {
50
- return instance.post(key, merge(...args), config);
50
+ return instance.post(key, {
51
+ category: "series",
52
+ data: merge(...args)
53
+ }, config);
51
54
  };
52
55
  }
53
- __name(createMergeReq, "createMergeReq");
56
+ __name(createSeriesReq, "createSeriesReq");
57
+ function createParallelReq(instance, key = "/__PHECDA_SERVER__") {
58
+ return (args, config) => {
59
+ return instance.post(key, {
60
+ category: "parallel",
61
+ data: merge(...args)
62
+ }, config);
63
+ };
64
+ }
65
+ __name(createParallelReq, "createParallelReq");
54
66
  function isError(data) {
55
67
  return typeof data === "object" && data.error;
56
68
  }
@@ -71,8 +83,9 @@ __name(createBeacon, "createBeacon");
71
83
  export {
72
84
  $S,
73
85
  createBeacon,
74
- createMergeReq,
86
+ createParallelReq,
75
87
  createReq,
88
+ createSeriesReq,
76
89
  isError,
77
90
  merge,
78
91
  toReq
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/common.ts","../../src/client/server.ts","../../src/client/index.ts"],"sourcesContent":["export const SERIES_SYMBOL = '__symbol_series__'\nexport const REQ_SYMBOL = '__symbol_req__'\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport type { PError, PRes, RequestType, ResOrErr } from '../types'\nimport { SERIES_SYMBOL } from '../common'\ninterface RequestArgs {\n body: Record<string, any>\n query: Record<string, string>\n params: Record<string, string>\n realParam: string\n method: RequestType\n url: string\n tag: string\n}\ntype MergedReqArg = Pick<RequestArgs, 'body' | 'query' | 'params' | 'tag' >\nexport function toReq(arg: RequestArgs) {\n const { body, query, realParam, method, url } = arg\n return { method, url, body, query: Object.keys(query).length > 0 ? `?${Object.entries(query).map(([k, v]) => `${k}=${v}`).join('&')}` : '', params: realParam }\n}\n\nexport const merge = (...args: RequestArgs[]) => {\n const ret = [] as MergedReqArg[]\n for (const i of args) {\n const { body, query, params, tag } = i\n ret.push({ tag, body, query, params })\n }\n\n return ret\n}\n\nexport type RequestMethod = <F extends (...args: any[]) => any >(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>\n\nexport function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<R>>> > {\n // @ts-expect-error methods without route decorator won't send request\n return (arg: any, config?: AxiosRequestConfig) => {\n const { url, params, query, body, method } = toReq(arg as RequestArgs)\n if (!method) {\n console.warn('methods without route decorator won\\'t send request')\n return\n }\n\n const ret = [`${url}${params}${query}`] as any[]\n body && ret.push(body)\n config && ret.push(config)\n // @ts-expect-error misdirction\n return instance[method](...ret)\n }\n}\n\nexport function createMergeReq(instance: AxiosInstance, key = '/__PHECDA_SERVER__'): < R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>> {\n // @ts-expect-error misdirction\n return (args: RequestArgs[], config?: AxiosRequestConfig) => {\n return instance.post(key, merge(...args), config)\n }\n}\n\nexport function isError<T = any>(data: T | PError): data is PError {\n return typeof data === 'object' && (data as any).error\n}\n\nexport function $S(index: number, key = ''): any {\n return `${SERIES_SYMBOL}@${index}@${key}`\n}\n","import { toReq } from './server'\nexport * from './server'\n\nexport function createBeacon(baseUrl: string) {\n return (arg: any) => {\n const { url, params, query, body } = toReq(arg as any)\n\n navigator.sendBeacon(`${baseUrl}${url}${params}${query}`, JSON.stringify(body))\n }\n}\n"],"mappings":";;;;AAAO,IAAMA,gBAAgB;;;ACatB,SAASC,MAAMC,KAAkB;AACtC,QAAM,EAAEC,MAAMC,OAAOC,WAAWC,QAAQC,IAAG,IAAKL;AAChD,SAAO;IAAEI;IAAQC;IAAKJ;IAAMC,OAAOI,OAAOC,KAAKL,KAAAA,EAAOM,SAAS,IAAI,IAAIF,OAAOG,QAAQP,KAAAA,EAAOQ,IAAI,CAAC,CAACC,GAAGC,CAAAA,MAAO,GAAGD,KAAKC,GAAG,EAAEC,KAAK,GAAA,MAAS;IAAIC,QAAQX;EAAU;AAChK;AAHgBJ;AAKT,IAAMgB,QAAQ,2BAAIC,SAAwB;AAC/C,QAAMC,MAAM,CAAA;AACZ,aAAWC,KAAKF,MAAM;AACpB,UAAM,EAAEf,MAAMC,OAAOY,QAAQK,IAAG,IAAKD;AACrCD,QAAIG,KAAK;MAAED;MAAKlB;MAAMC;MAAOY;IAAO,CAAA;EACtC;AAEA,SAAOG;AACT,GARqB;AAYd,SAASI,UAAUC,UAAgH;AAExI,SAAO,CAACtB,KAAUuB,WAAgC;AAChD,UAAM,EAAElB,KAAKS,QAAQZ,OAAOD,MAAMG,OAAM,IAAKL,MAAMC,GAAAA;AACnD,QAAI,CAACI,QAAQ;AACXoB,cAAQC,KAAK,oDAAA;AACb;IACF;AAEA,UAAMR,MAAM;MAAC,GAAGZ,MAAMS,SAASZ;;AAC/BD,YAAQgB,IAAIG,KAAKnB,IAAAA;AACjBsB,cAAUN,IAAIG,KAAKG,MAAAA;AAEnB,WAAOD,SAASlB,QAAO,GAAIa,GAAAA;EAC7B;AACF;AAfgBI;AAiBT,SAASK,eAAeJ,UAAyBK,MAAM,sBAAiI;AAE7L,SAAO,CAACX,MAAqBO,WAAgC;AAC3D,WAAOD,SAASM,KAAKD,KAAKZ,MAAAA,GAASC,IAAAA,GAAOO,MAAAA;EAC5C;AACF;AALgBG;AAOT,SAASG,QAAiBC,MAAkC;AACjE,SAAO,OAAOA,SAAS,YAAaA,KAAaC;AACnD;AAFgBF;AAIT,SAASG,GAAGC,OAAeN,MAAM,IAAS;AAC/C,SAAO,GAAGO,iBAAiBD,SAASN;AACtC;AAFgBK;;;ACvDT,SAASG,aAAaC,SAAiB;AAC5C,SAAO,CAACC,QAAa;AACnB,UAAM,EAAEC,KAAKC,QAAQC,OAAOC,KAAI,IAAKC,MAAML,GAAAA;AAE3CM,cAAUC,WAAW,GAAGR,UAAUE,MAAMC,SAASC,SAASK,KAAKC,UAAUL,IAAAA,CAAAA;EAC3E;AACF;AANgBN;","names":["SERIES_SYMBOL","toReq","arg","body","query","realParam","method","url","Object","keys","length","entries","map","k","v","join","params","merge","args","ret","i","tag","push","createReq","instance","config","console","warn","createMergeReq","key","post","isError","data","error","$S","index","SERIES_SYMBOL","createBeacon","baseUrl","arg","url","params","query","body","toReq","navigator","sendBeacon","JSON","stringify"]}
1
+ {"version":3,"sources":["../../src/common.ts","../../src/client/axios.ts","../../src/client/index.ts"],"sourcesContent":["export const SERIES_SYMBOL = '__symbol_series__'\nexport const REQ_SYMBOL = '__symbol_req__'\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'\nimport type { PError, PRes, RequestType, ResOrErr } from '../types'\nimport { SERIES_SYMBOL } from '../common'\ninterface RequestArgs {\n body: Record<string, any>\n query: Record<string, string>\n params: Record<string, string>\n realParam: string\n method: RequestType\n url: string\n tag: string\n}\ntype MergedReqArg = Pick<RequestArgs, 'body' | 'query' | 'params' | 'tag' >\nexport function toReq(arg: RequestArgs) {\n const { body, query, realParam, method, url } = arg\n return { method, url, body, query: Object.keys(query).length > 0 ? `?${Object.entries(query).map(([k, v]) => `${k}=${v}`).join('&')}` : '', params: realParam }\n}\n\nexport const merge = (...args: RequestArgs[]) => {\n const ret = [] as MergedReqArg[]\n for (const i of args) {\n const { body, query, params, tag } = i\n ret.push({ tag, body, query, params })\n }\n\n return ret\n}\n\nexport type RequestMethod = <F extends (...args: any[]) => any >(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>\n\nexport function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<R>>> > {\n // @ts-expect-error methods without route decorator won't send request\n return (arg: any, config?: AxiosRequestConfig) => {\n const { url, params, query, body, method } = toReq(arg as RequestArgs)\n if (!method) {\n console.warn('methods without route decorator won\\'t send request')\n return\n }\n\n const ret = [`${url}${params}${query}`] as any[]\n body && ret.push(body)\n config && ret.push(config)\n // @ts-expect-error misdirction\n return instance[method](...ret)\n }\n}\n\nexport function createSeriesReq(instance: AxiosInstance, key = '/__PHECDA_SERVER__'): < R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>> {\n // @ts-expect-error misdirction\n return (args: RequestArgs[], config?: AxiosRequestConfig) => {\n return instance.post(key, {\n category: 'series',\n data: merge(...args),\n }, config)\n }\n}\n\nexport function createParallelReq(instance: AxiosInstance, key = '/__PHECDA_SERVER__'): < R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>> {\n // @ts-expect-error misdirction\n return (args: RequestArgs[], config?: AxiosRequestConfig) => {\n return instance.post(key, {\n category: 'parallel',\n data: merge(...args),\n }, config)\n }\n}\n\nexport function isError<T = any>(data: T | PError): data is PError {\n return typeof data === 'object' && (data as any).error\n}\n\nexport function $S(index: number, key = ''): any {\n return `${SERIES_SYMBOL}@${index}@${key}`\n}\n","import { toReq } from './axios'\nexport * from './axios'\n\nexport function createBeacon(baseUrl: string) {\n return (arg: any) => {\n const { url, params, query, body } = toReq(arg as any)\n\n navigator.sendBeacon(`${baseUrl}${url}${params}${query}`, JSON.stringify(body))\n }\n}\n"],"mappings":";;;;AAAO,IAAMA,gBAAgB;;;ACatB,SAASC,MAAMC,KAAkB;AACtC,QAAM,EAAEC,MAAMC,OAAOC,WAAWC,QAAQC,IAAG,IAAKL;AAChD,SAAO;IAAEI;IAAQC;IAAKJ;IAAMC,OAAOI,OAAOC,KAAKL,KAAAA,EAAOM,SAAS,IAAI,IAAIF,OAAOG,QAAQP,KAAAA,EAAOQ,IAAI,CAAC,CAACC,GAAGC,CAAAA,MAAO,GAAGD,KAAKC,GAAG,EAAEC,KAAK,GAAA,MAAS;IAAIC,QAAQX;EAAU;AAChK;AAHgBJ;AAKT,IAAMgB,QAAQ,2BAAIC,SAAwB;AAC/C,QAAMC,MAAM,CAAA;AACZ,aAAWC,KAAKF,MAAM;AACpB,UAAM,EAAEf,MAAMC,OAAOY,QAAQK,IAAG,IAAKD;AACrCD,QAAIG,KAAK;MAAED;MAAKlB;MAAMC;MAAOY;IAAO,CAAA;EACtC;AAEA,SAAOG;AACT,GARqB;AAYd,SAASI,UAAUC,UAAgH;AAExI,SAAO,CAACtB,KAAUuB,WAAgC;AAChD,UAAM,EAAElB,KAAKS,QAAQZ,OAAOD,MAAMG,OAAM,IAAKL,MAAMC,GAAAA;AACnD,QAAI,CAACI,QAAQ;AACXoB,cAAQC,KAAK,oDAAA;AACb;IACF;AAEA,UAAMR,MAAM;MAAC,GAAGZ,MAAMS,SAASZ;;AAC/BD,YAAQgB,IAAIG,KAAKnB,IAAAA;AACjBsB,cAAUN,IAAIG,KAAKG,MAAAA;AAEnB,WAAOD,SAASlB,QAAO,GAAIa,GAAAA;EAC7B;AACF;AAfgBI;AAiBT,SAASK,gBAAgBJ,UAAyBK,MAAM,sBAAiI;AAE9L,SAAO,CAACX,MAAqBO,WAAgC;AAC3D,WAAOD,SAASM,KAAKD,KAAK;MACxBE,UAAU;MACVC,MAAMf,MAAAA,GAASC,IAAAA;IACjB,GAAGO,MAAAA;EACL;AACF;AARgBG;AAUT,SAASK,kBAAkBT,UAAyBK,MAAM,sBAAiI;AAEhM,SAAO,CAACX,MAAqBO,WAAgC;AAC3D,WAAOD,SAASM,KAAKD,KAAK;MACxBE,UAAU;MACVC,MAAMf,MAAAA,GAASC,IAAAA;IACjB,GAAGO,MAAAA;EACL;AACF;AARgBQ;AAUT,SAASC,QAAiBF,MAAkC;AACjE,SAAO,OAAOA,SAAS,YAAaA,KAAaG;AACnD;AAFgBD;AAIT,SAASE,GAAGC,OAAeR,MAAM,IAAS;AAC/C,SAAO,GAAGS,iBAAiBD,SAASR;AACtC;AAFgBO;;;ACpET,SAASG,aAAaC,SAAiB;AAC5C,SAAO,CAACC,QAAa;AACnB,UAAM,EAAEC,KAAKC,QAAQC,OAAOC,KAAI,IAAKC,MAAML,GAAAA;AAE3CM,cAAUC,WAAW,GAAGR,UAAUE,MAAMC,SAASC,SAASK,KAAKC,UAAUL,IAAAA,CAAAA;EAC3E;AACF;AANgBN;","names":["SERIES_SYMBOL","toReq","arg","body","query","realParam","method","url","Object","keys","length","entries","map","k","v","join","params","merge","args","ret","i","tag","push","createReq","instance","config","console","warn","createSeriesReq","key","post","category","data","createParallelReq","isError","error","$S","index","SERIES_SYMBOL","createBeacon","baseUrl","arg","url","params","query","body","toReq","navigator","sendBeacon","JSON","stringify"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as ServerMeta, P as PHandler, R as RequestType, a as PhecdaEmitter, C as Construct } from './server-d482bc0d.js';
2
- export { $ as $S, B as BaseError, M as MergeType, f as MqContextData, b as PError, d as PRes, g as RequestMethod, c as ResOrErr, e as ServerContextData, T as Transform, U as UnWrap, i as createMergeReq, h as createReq, j as isError, m as merge, t as toReq } from './server-d482bc0d.js';
1
+ import { S as ServerMeta, P as PHandler, R as RequestType, a as PhecdaEmitter, C as Construct } from './axios-13a49ed4.js';
2
+ export { $ as $S, B as BaseError, M as MergeType, f as MqContextData, b as PError, d as PRes, g as RequestMethod, c as ResOrErr, e as ServerContextData, T as Transform, U as UnWrap, j as createParallelReq, h as createReq, i as createSeriesReq, k as isError, m as merge, t as toReq } from './axios-13a49ed4.js';
3
3
  import { Express } from 'express';
4
4
  import { PluginOption } from 'vite';
5
5
  export * from 'phecda-core';
@@ -178,4 +178,6 @@ declare function bindMQ(ch: amqplib.Channel, { meta, moduleMap }: Awaited<Return
178
178
  type MqMethod<T> = (arg: T) => void;
179
179
  declare function createPub<T extends (...args: any[]) => any>(ch: amqplib.Channel, method: T, type?: string): Promise<MqMethod<Parameters<T>>>;
180
180
 
181
- export { BadRequestException, BaseParam, Body, Construct, Controller, Delete, Factory, ForbiddenException, Get, Guard, Header, HttpException, Inject, Interceptor, MQ, Options, PHandler, Param, Pcompiler, Pcontext, PhecdaEmitter, Pmeta, Post, Put, Query, RabbitMqContext, RequestType, Route, Server, ServerContext, ServerMeta, UndefinedException, ValidateException, ValidatePipe, addGuard, addInterceptor, bindApp, bindMQ, createPub, defaultPipe, emitter, getInstance, parseMeta, useMqFilter, useMqPipe, useServerFilter, useServerPipe };
181
+ declare function createMqReq(channel: amqplib.Channel): <R>(arg: R) => Promise<void>;
182
+
183
+ export { BadRequestException, BaseParam, Body, Construct, Controller, Delete, Factory, ForbiddenException, Get, Guard, Header, HttpException, Inject, Interceptor, MQ, Options, PHandler, Param, Pcompiler, Pcontext, PhecdaEmitter, Pmeta, Post, Put, Query, RabbitMqContext, RequestType, Route, Server, ServerContext, ServerMeta, UndefinedException, ValidateException, ValidatePipe, addGuard, addInterceptor, bindApp, bindMQ, createMqReq, createPub, defaultPipe, emitter, getInstance, parseMeta, useMqFilter, useMqPipe, useServerFilter, useServerPipe };
package/dist/index.js CHANGED
@@ -65,9 +65,11 @@ __export(src_exports, {
65
65
  addInterceptor: () => addInterceptor,
66
66
  bindApp: () => bindApp,
67
67
  bindMQ: () => bindMQ,
68
- createMergeReq: () => createMergeReq,
68
+ createMqReq: () => createMqReq,
69
+ createParallelReq: () => createParallelReq,
69
70
  createPub: () => createPub,
70
71
  createReq: () => createReq,
72
+ createSeriesReq: () => createSeriesReq,
71
73
  defaultPipe: () => defaultPipe,
72
74
  emitter: () => emitter,
73
75
  getInstance: () => getInstance,
@@ -488,40 +490,74 @@ function bindApp(app, { meta, moduleMap }, options = {}) {
488
490
  };
489
491
  const context = new ServerContext(route, contextData);
490
492
  const ret = [];
491
- const { body } = req;
492
- for (const i in body) {
493
- const { tag } = body[i];
494
- const [name] = tag.split("-");
495
- const { guards, reflect, interceptors, params } = Pcontext.metaDataRecord[tag];
496
- const instance = moduleMap.get(name);
497
- try {
498
- if (!params)
499
- throw new NotFoundException(`"${tag}" doesn't exist`);
500
- await context.useGuard(guards, true);
501
- await context.useInterceptor(interceptors, true);
502
- const args = await context.usePipe(params.map(({ type, key, validate }) => {
503
- const arg = resolveDep(body[i][type], key);
504
- if (typeof arg === "string" && arg.startsWith(SERIES_SYMBOL)) {
505
- const [, index, argKey] = arg.split("@");
493
+ const { body: { category, data } } = req;
494
+ if (category === "series") {
495
+ for (const item of data) {
496
+ const { tag } = item;
497
+ const [name] = tag.split("-");
498
+ const { guards, reflect, interceptors, params } = Pcontext.metaDataRecord[tag];
499
+ const instance = moduleMap.get(name);
500
+ try {
501
+ if (!params)
502
+ throw new NotFoundException(`"${tag}" doesn't exist`);
503
+ await context.useGuard(guards, true);
504
+ await context.useInterceptor(interceptors, true);
505
+ const args = await context.usePipe(params.map(({ type, key, validate }) => {
506
+ const arg = resolveDep(item[type], key);
507
+ if (typeof arg === "string" && arg.startsWith(SERIES_SYMBOL)) {
508
+ const [, index, argKey] = arg.split("@");
509
+ return {
510
+ arg: resolveDep(ret[Number(index)], argKey || key),
511
+ validate
512
+ };
513
+ }
506
514
  return {
507
- arg: resolveDep(ret[Number(index)], argKey || key),
515
+ arg,
508
516
  validate
509
517
  };
510
- }
511
- return {
512
- arg,
513
- validate
514
- };
515
- }), reflect);
516
- instance.meta = contextData;
517
- ret.push(await context.usePost(await methodMap[tag](...args)));
518
- } catch (e) {
519
- const m = Pcontext.metaRecord[tag];
520
- m.handlers.forEach((handler) => handler.error?.(e));
521
- ret.push(await context.useFilter(e));
518
+ }), reflect);
519
+ instance.meta = contextData;
520
+ ret.push(await context.usePost(await methodMap[tag](...args)));
521
+ } catch (e) {
522
+ const m = Pcontext.metaRecord[tag];
523
+ m.handlers.forEach((handler) => handler.error?.(e));
524
+ ret.push(await context.useFilter(e));
525
+ }
522
526
  }
527
+ return res.json(ret);
523
528
  }
524
- res.json(ret);
529
+ if (category === "parallel") {
530
+ return Promise.all(data.map((item) => {
531
+ return new Promise(async (resolve2) => {
532
+ const { tag } = item;
533
+ const [name] = tag.split("-");
534
+ const { guards, reflect, interceptors, params } = Pcontext.metaDataRecord[tag];
535
+ const instance = moduleMap.get(name);
536
+ try {
537
+ if (!params)
538
+ throw new NotFoundException(`"${tag}" doesn't exist`);
539
+ await context.useGuard(guards, true);
540
+ await context.useInterceptor(interceptors, true);
541
+ const args = await context.usePipe(params.map(({ type, key, validate }) => {
542
+ const arg = resolveDep(item[type], key);
543
+ return {
544
+ arg,
545
+ validate
546
+ };
547
+ }), reflect);
548
+ instance.meta = contextData;
549
+ resolve2(await context.usePost(await methodMap[tag](...args)));
550
+ } catch (e) {
551
+ const m = Pcontext.metaRecord[tag];
552
+ m.handlers.forEach((handler) => handler.error?.(e));
553
+ resolve2(await context.useFilter(e));
554
+ }
555
+ });
556
+ })).then((ret2) => {
557
+ res.json(ret2);
558
+ });
559
+ }
560
+ res.json(await context.useFilter(new NotFoundException("category should be 'parallel' or 'series'")));
525
561
  });
526
562
  }
527
563
  __name(bindApp, "bindApp");
@@ -906,7 +942,7 @@ async function createPub(ch, method, type) {
906
942
  }
907
943
  __name(createPub, "createPub");
908
944
 
909
- // src/client/server.ts
945
+ // src/client/axios.ts
910
946
  function toReq(arg) {
911
947
  const { body, query, realParam, method, url } = arg;
912
948
  return {
@@ -947,12 +983,24 @@ function createReq(instance) {
947
983
  };
948
984
  }
949
985
  __name(createReq, "createReq");
950
- function createMergeReq(instance, key = "/__PHECDA_SERVER__") {
986
+ function createSeriesReq(instance, key = "/__PHECDA_SERVER__") {
987
+ return (args, config) => {
988
+ return instance.post(key, {
989
+ category: "series",
990
+ data: merge(...args)
991
+ }, config);
992
+ };
993
+ }
994
+ __name(createSeriesReq, "createSeriesReq");
995
+ function createParallelReq(instance, key = "/__PHECDA_SERVER__") {
951
996
  return (args, config) => {
952
- return instance.post(key, merge(...args), config);
997
+ return instance.post(key, {
998
+ category: "parallel",
999
+ data: merge(...args)
1000
+ }, config);
953
1001
  };
954
1002
  }
955
- __name(createMergeReq, "createMergeReq");
1003
+ __name(createParallelReq, "createParallelReq");
956
1004
  function isError(data) {
957
1005
  return typeof data === "object" && data.error;
958
1006
  }
@@ -961,6 +1009,16 @@ function $S(index, key = "") {
961
1009
  return `${SERIES_SYMBOL}@${index}@${key}`;
962
1010
  }
963
1011
  __name($S, "$S");
1012
+
1013
+ // src/client/server.ts
1014
+ function createMqReq(channel) {
1015
+ return async (arg) => {
1016
+ const { url, body } = arg;
1017
+ await channel.assertQueue(url);
1018
+ await channel.sendToQueue(url, Buffer.from(JSON.stringify(body)));
1019
+ };
1020
+ }
1021
+ __name(createMqReq, "createMqReq");
964
1022
  // Annotate the CommonJS export names for ESM import in node:
965
1023
  0 && (module.exports = {
966
1024
  $S,
@@ -995,9 +1053,11 @@ __name($S, "$S");
995
1053
  addInterceptor,
996
1054
  bindApp,
997
1055
  bindMQ,
998
- createMergeReq,
1056
+ createMqReq,
1057
+ createParallelReq,
999
1058
  createPub,
1000
1059
  createReq,
1060
+ createSeriesReq,
1001
1061
  defaultPipe,
1002
1062
  emitter,
1003
1063
  getInstance,