phecda-server 1.1.0 → 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
+ ```
@@ -0,0 +1,104 @@
1
+ import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
2
+ import { Request, Response } from 'express';
3
+ import amqplib from 'amqplib';
4
+ import { PhecdaEvents } from 'phecda-core';
5
+
6
+ declare class Wrap<F, T> {
7
+ v1: F;
8
+ V2: T;
9
+ constructor(v1: F, V2: T);
10
+ get value(): T;
11
+ }
12
+
13
+ type Construct<T = any> = new (...args: any[]) => T;
14
+ interface PhecdaEmitter {
15
+ on<N extends keyof PhecdaEvents>(eventName: N, cb: (args: PhecdaEvents[N]) => void): void;
16
+ once<N extends keyof PhecdaEvents>(eventName: N, cb: (args: PhecdaEvents[N]) => void): void;
17
+ off<N extends keyof PhecdaEvents>(eventName: N, cb: (args: PhecdaEvents[N]) => void): void;
18
+ removeAllListeners<N extends keyof PhecdaEvents>(eventName: N): void;
19
+ emit<N extends keyof PhecdaEvents>(eventName: N, param: PhecdaEvents[N]): void;
20
+ }
21
+ interface PHandler {
22
+ error?: (arg: any) => void;
23
+ }
24
+ interface ServerMeta {
25
+ route?: {
26
+ type: RequestType;
27
+ route: string;
28
+ };
29
+ mq?: {
30
+ queue: string;
31
+ routeKey: string;
32
+ options: amqplib.Options.Consume;
33
+ };
34
+ header: Record<string, string>;
35
+ params: {
36
+ type: string;
37
+ index: number;
38
+ key: string;
39
+ validate?: boolean;
40
+ }[];
41
+ guards: string[];
42
+ interceptors: string[];
43
+ middlewares: string[];
44
+ method: string;
45
+ name: string;
46
+ }
47
+ type RequestType = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head';
48
+ type MergeType = <R extends Promise<any>[]>(...args: R) => {
49
+ [K in keyof R]: Awaited<R[K]>;
50
+ };
51
+ interface BaseError {
52
+ error: true;
53
+ status: number;
54
+ }
55
+ interface PError extends BaseError {
56
+ message: string;
57
+ description: string;
58
+ }
59
+ type ResOrErr<R> = {
60
+ [K in keyof R]: Awaited<R[K]> | PError;
61
+ };
62
+ type PRes<T> = T;
63
+ type UnWrap<T extends any[]> = {
64
+ [K in keyof T]: T[K] extends Wrap<infer F, infer _> ? F : T[K];
65
+ };
66
+ type Transform<A> = {
67
+ [K in keyof A]: A[K] extends (...args: infer P) => infer R ? (...args: UnWrap<P> extends unknown[] ? UnWrap<P> : unknown[]) => R : never;
68
+ };
69
+ interface ServerContextData {
70
+ request?: Request<any, any, any, any, Record<string, any>>;
71
+ response?: Response<any, Record<string, any>>;
72
+ }
73
+ interface MqContextData {
74
+ content?: string;
75
+ message?: any;
76
+ channel?: amqplib.Channel;
77
+ }
78
+
79
+ interface RequestArgs {
80
+ body: Record<string, any>;
81
+ query: Record<string, string>;
82
+ params: Record<string, string>;
83
+ realParam: string;
84
+ method: RequestType;
85
+ url: string;
86
+ tag: string;
87
+ }
88
+ type MergedReqArg = Pick<RequestArgs, 'body' | 'query' | 'params' | 'tag'>;
89
+ declare function toReq(arg: RequestArgs): {
90
+ method: RequestType;
91
+ url: string;
92
+ body: Record<string, any>;
93
+ query: string;
94
+ params: string;
95
+ };
96
+ declare const merge: (...args: RequestArgs[]) => MergedReqArg[];
97
+ type RequestMethod = <F extends (...args: any[]) => any>(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>;
98
+ declare function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<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>>>>;
101
+ declare function isError<T = any>(data: T | PError): data is PError;
102
+ declare function $S(index: number, key?: string): any;
103
+
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,30 +1,9 @@
1
- import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
2
- import { R as RequestType, c as PRes, b as ResOrErr, a as PError } from '../types-acc60391.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
+ import 'axios';
3
3
  import 'express';
4
4
  import 'amqplib';
5
+ import 'phecda-core';
5
6
 
6
- interface RequestArgs {
7
- body: Record<string, any>;
8
- query: Record<string, string>;
9
- params: Record<string, string>;
10
- realParam: string;
11
- method: RequestType;
12
- url: string;
13
- tag: string;
14
- }
15
- type MergedReqArg = Pick<RequestArgs, 'body' | 'query' | 'params' | 'tag'>;
16
- declare function toReq(arg: RequestArgs): {
17
- method: RequestType;
18
- url: string;
19
- body: Record<string, any>;
20
- query: string;
21
- params: string;
22
- };
23
- declare const merge: (...args: RequestArgs[]) => MergedReqArg[];
24
- type RequestMethod = <F extends (...args: any[]) => any>(fn: F, args: Parameters<F>) => Promise<ReturnType<F>>;
25
- declare function createReq(instance: AxiosInstance): <R>(arg: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<PRes<Awaited<R>>>>;
26
- declare function createMergeReq(instance: AxiosInstance, key?: string): <R extends unknown[]>(args: R, config?: AxiosRequestConfig) => Promise<AxiosResponse<ResOrErr<PRes<R>>>>;
27
- declare function isError<T = any>(data: T | PError): data is PError;
28
- declare function $S(index: number, key?: string): any;
7
+ declare function createBeacon(baseUrl: string): (arg: any) => void;
29
8
 
30
- export { $S, RequestMethod, createMergeReq, createReq, isError, merge, toReq };
9
+ export { createBeacon };
@@ -22,8 +22,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var client_exports = {};
23
23
  __export(client_exports, {
24
24
  $S: () => $S,
25
- createMergeReq: () => createMergeReq,
25
+ createBeacon: () => createBeacon,
26
+ createParallelReq: () => createParallelReq,
26
27
  createReq: () => createReq,
28
+ createSeriesReq: () => createSeriesReq,
27
29
  isError: () => isError,
28
30
  merge: () => merge,
29
31
  toReq: () => toReq
@@ -33,7 +35,7 @@ module.exports = __toCommonJS(client_exports);
33
35
  // src/common.ts
34
36
  var SERIES_SYMBOL = "__symbol_series__";
35
37
 
36
- // src/client/index.ts
38
+ // src/client/axios.ts
37
39
  function toReq(arg) {
38
40
  const { body, query, realParam, method, url } = arg;
39
41
  return {
@@ -74,12 +76,24 @@ function createReq(instance) {
74
76
  };
75
77
  }
76
78
  __name(createReq, "createReq");
77
- function createMergeReq(instance, key = "/__PHECDA_SERVER__") {
79
+ function createSeriesReq(instance, key = "/__PHECDA_SERVER__") {
80
+ return (args, config) => {
81
+ return instance.post(key, {
82
+ category: "series",
83
+ data: merge(...args)
84
+ }, config);
85
+ };
86
+ }
87
+ __name(createSeriesReq, "createSeriesReq");
88
+ function createParallelReq(instance, key = "/__PHECDA_SERVER__") {
78
89
  return (args, config) => {
79
- return instance.post(key, merge(...args), config);
90
+ return instance.post(key, {
91
+ category: "parallel",
92
+ data: merge(...args)
93
+ }, config);
80
94
  };
81
95
  }
82
- __name(createMergeReq, "createMergeReq");
96
+ __name(createParallelReq, "createParallelReq");
83
97
  function isError(data) {
84
98
  return typeof data === "object" && data.error;
85
99
  }
@@ -88,11 +102,22 @@ function $S(index, key = "") {
88
102
  return `${SERIES_SYMBOL}@${index}@${key}`;
89
103
  }
90
104
  __name($S, "$S");
105
+
106
+ // src/client/index.ts
107
+ function createBeacon(baseUrl) {
108
+ return (arg) => {
109
+ const { url, params, query, body } = toReq(arg);
110
+ navigator.sendBeacon(`${baseUrl}${url}${params}${query}`, JSON.stringify(body));
111
+ };
112
+ }
113
+ __name(createBeacon, "createBeacon");
91
114
  // Annotate the CommonJS export names for ESM import in node:
92
115
  0 && (module.exports = {
93
116
  $S,
94
- createMergeReq,
117
+ createBeacon,
118
+ createParallelReq,
95
119
  createReq,
120
+ createSeriesReq,
96
121
  isError,
97
122
  merge,
98
123
  toReq
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/index.ts","../../src/common.ts"],"sourcesContent":["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","export const SERIES_SYMBOL = '__symbol_series__'\nexport const REQ_SYMBOL = '__symbol_req__'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA;;;;;;;;;;;;ACFO,IAAMA,gBAAgB;;;ADatB,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;","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"]}
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/index.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
+ return (args, config) => {
50
+ return instance.post(key, {
51
+ category: "series",
52
+ data: merge(...args)
53
+ }, config);
54
+ };
55
+ }
56
+ __name(createSeriesReq, "createSeriesReq");
57
+ function createParallelReq(instance, key = "/__PHECDA_SERVER__") {
49
58
  return (args, config) => {
50
- return instance.post(key, merge(...args), config);
59
+ return instance.post(key, {
60
+ category: "parallel",
61
+ data: merge(...args)
62
+ }, config);
51
63
  };
52
64
  }
53
- __name(createMergeReq, "createMergeReq");
65
+ __name(createParallelReq, "createParallelReq");
54
66
  function isError(data) {
55
67
  return typeof data === "object" && data.error;
56
68
  }
@@ -59,10 +71,21 @@ function $S(index, key = "") {
59
71
  return `${SERIES_SYMBOL}@${index}@${key}`;
60
72
  }
61
73
  __name($S, "$S");
74
+
75
+ // src/client/index.ts
76
+ function createBeacon(baseUrl) {
77
+ return (arg) => {
78
+ const { url, params, query, body } = toReq(arg);
79
+ navigator.sendBeacon(`${baseUrl}${url}${params}${query}`, JSON.stringify(body));
80
+ };
81
+ }
82
+ __name(createBeacon, "createBeacon");
62
83
  export {
63
84
  $S,
64
- createMergeReq,
85
+ createBeacon,
86
+ createParallelReq,
65
87
  createReq,
88
+ createSeriesReq,
66
89
  isError,
67
90
  merge,
68
91
  toReq
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/common.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"],"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;","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"]}
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,9 +1,10 @@
1
- import { S as ServerMeta, P as PHandler, R as RequestType, C as Construct } from './types-acc60391.js';
2
- export { B as BaseError, M as MergeType, e as MqContextData, a as PError, c as PRes, b as ResOrErr, d as ServerContextData, T as Transform, U as UnWrap } from './types-acc60391.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';
6
6
  import amqplib from 'amqplib';
7
+ import 'axios';
7
8
 
8
9
  interface ValidatePipe {
9
10
  transform(args: {
@@ -138,21 +139,19 @@ declare class Pcompiler {
138
139
  }[]): void;
139
140
  }
140
141
 
142
+ declare const emitter: PhecdaEmitter;
143
+ declare function Factory<T>(Modules: Construct<T>[]): Promise<{
144
+ moduleMap: Map<string, any>;
145
+ meta: Pmeta[];
146
+ }>;
147
+
141
148
  interface Options {
142
149
  route?: string;
143
150
  globalGuards?: string[];
144
151
  globalInterceptors?: string[];
145
152
  middlewares?: string[];
146
153
  }
147
- declare function bindApp(app: Express, { meta, moduleMap }: {
148
- meta: Pmeta[];
149
- moduleMap: any;
150
- }, options?: Options): void;
151
-
152
- declare function Factory<T>(Modules: Construct<T>[]): Promise<{
153
- moduleMap: Map<string, any>;
154
- meta: Pmeta[];
155
- }>;
154
+ declare function bindApp(app: Express, { meta, moduleMap }: Awaited<ReturnType<typeof Factory>>, options?: Options): void;
156
155
 
157
156
  declare function BaseParam(type: string, key: string, validate?: boolean): any;
158
157
  declare function Body(key?: string, validate?: boolean): any;
@@ -175,11 +174,10 @@ declare function Header(name: string, value: string): (target: any, k: PropertyK
175
174
 
176
175
  declare function Server(localPath: string): PluginOption;
177
176
 
178
- declare function bindMQ(ch: amqplib.Channel, { meta, moduleMap }: {
179
- meta: Pmeta[];
180
- moduleMap: any;
181
- }): Promise<void>;
177
+ declare function bindMQ(ch: amqplib.Channel, { meta, moduleMap }: Awaited<ReturnType<typeof Factory>>): Promise<void>;
182
178
  type MqMethod<T> = (arg: T) => void;
183
179
  declare function createPub<T extends (...args: any[]) => any>(ch: amqplib.Channel, method: T, type?: string): Promise<MqMethod<Parameters<T>>>;
184
180
 
185
- export { BadRequestException, BaseParam, Body, Construct, Controller, Delete, Factory, ForbiddenException, Get, Guard, Header, HttpException, Inject, Interceptor, MQ, Options, PHandler, Param, Pcompiler, Pcontext, Pmeta, Post, Put, Query, RabbitMqContext, RequestType, Route, Server, ServerContext, ServerMeta, UndefinedException, ValidateException, ValidatePipe, addGuard, addInterceptor, bindApp, bindMQ, createPub, defaultPipe, 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 };