@deessejs/server 0.0.0 → 1.0.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.
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/dist/api/factory.d.ts +8 -8
- package/dist/api/factory.d.ts.map +1 -1
- package/dist/api/factory.js +181 -109
- package/dist/api/factory.js.map +1 -1
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/types.d.ts +31 -16
- package/dist/api/types.d.ts.map +1 -1
- package/dist/context/builder.d.ts +5 -4
- package/dist/context/builder.d.ts.map +1 -1
- package/dist/context/builder.js +8 -3
- package/dist/context/builder.js.map +1 -1
- package/dist/context/types.d.ts +10 -3
- package/dist/context/types.d.ts.map +1 -1
- package/dist/errors/server-error.d.ts +9 -3
- package/dist/errors/server-error.d.ts.map +1 -1
- package/dist/errors/server-error.js +16 -4
- package/dist/errors/server-error.js.map +1 -1
- package/dist/errors/types.d.ts +1 -0
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/events/dsl.d.ts +55 -0
- package/dist/events/dsl.d.ts.map +1 -0
- package/dist/events/dsl.js +42 -0
- package/dist/events/dsl.js.map +1 -0
- package/dist/events/emitter.d.ts +27 -6
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +193 -23
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/index.d.ts +4 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +3 -1
- package/dist/events/index.js.map +1 -1
- package/dist/events/queue.d.ts +19 -0
- package/dist/events/queue.d.ts.map +1 -0
- package/dist/events/queue.js +54 -0
- package/dist/events/queue.js.map +1 -0
- package/dist/events/types.d.ts +1 -1
- package/dist/events/types.d.ts.map +1 -1
- package/dist/hooks/executor.d.ts +3 -3
- package/dist/hooks/executor.d.ts.map +1 -1
- package/dist/hooks/types.d.ts +4 -4
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/internal-mutation/builder.d.ts +13 -10
- package/dist/internal-mutation/builder.d.ts.map +1 -1
- package/dist/internal-mutation/builder.js +57 -1
- package/dist/internal-mutation/builder.js.map +1 -1
- package/dist/internal-mutation/types.d.ts +5 -4
- package/dist/internal-mutation/types.d.ts.map +1 -1
- package/dist/internal-query/builder.d.ts +13 -10
- package/dist/internal-query/builder.d.ts.map +1 -1
- package/dist/internal-query/builder.js +56 -1
- package/dist/internal-query/builder.js.map +1 -1
- package/dist/internal-query/types.d.ts +4 -3
- package/dist/internal-query/types.d.ts.map +1 -1
- package/dist/middleware/builder.d.ts +1 -1
- package/dist/middleware/builder.d.ts.map +1 -1
- package/dist/middleware/helpers.d.ts +28 -0
- package/dist/middleware/helpers.d.ts.map +1 -0
- package/dist/middleware/helpers.js +31 -0
- package/dist/middleware/helpers.js.map +1 -0
- package/dist/middleware/types.d.ts.map +1 -1
- package/dist/mutation/builder.d.ts +13 -10
- package/dist/mutation/builder.d.ts.map +1 -1
- package/dist/mutation/builder.js +55 -1
- package/dist/mutation/builder.js.map +1 -1
- package/dist/mutation/types.d.ts +5 -4
- package/dist/mutation/types.d.ts.map +1 -1
- package/dist/query/builder.d.ts +18 -18
- package/dist/query/builder.d.ts.map +1 -1
- package/dist/query/builder.js +83 -32
- package/dist/query/builder.js.map +1 -1
- package/dist/query/types.d.ts +21 -18
- package/dist/query/types.d.ts.map +1 -1
- package/dist/router/builder.d.ts +4 -12
- package/dist/router/builder.d.ts.map +1 -1
- package/dist/router/builder.js +10 -32
- package/dist/router/builder.js.map +1 -1
- package/dist/router/types.d.ts +78 -2
- package/dist/router/types.d.ts.map +1 -1
- package/dist/type-test.d.ts +2 -0
- package/dist/type-test.d.ts.map +1 -0
- package/dist/type-test.js +2 -0
- package/dist/type-test.js.map +1 -0
- package/dist/types.d.ts +28 -7
- package/dist/types.d.ts.map +1 -1
- package/eslint.config.js +124 -1
- package/package.json +42 -38
- package/src/api/factory.ts +243 -160
- package/src/api/index.ts +2 -2
- package/src/api/types.ts +45 -18
- package/src/context/builder.ts +16 -10
- package/src/context/types.ts +11 -4
- package/src/errors/server-error.ts +20 -9
- package/src/errors/types.ts +1 -0
- package/src/events/dsl.ts +65 -0
- package/src/events/emitter.ts +224 -35
- package/src/events/index.ts +4 -1
- package/src/events/queue.ts +70 -0
- package/src/events/types.ts +1 -3
- package/src/hooks/executor.ts +4 -4
- package/src/hooks/types.ts +6 -11
- package/src/index.ts +11 -4
- package/src/internal-mutation/builder.ts +110 -36
- package/src/internal-mutation/types.ts +6 -5
- package/src/internal-query/builder.ts +102 -34
- package/src/internal-query/types.ts +5 -4
- package/src/middleware/builder.ts +1 -1
- package/src/middleware/helpers.ts +87 -0
- package/src/middleware/types.ts +1 -3
- package/src/mutation/builder.ts +106 -33
- package/src/mutation/types.ts +6 -5
- package/src/procedure/types.ts +1 -1
- package/src/query/builder.ts +151 -101
- package/src/query/types.ts +29 -19
- package/src/router/builder.ts +21 -46
- package/src/router/types.ts +120 -3
- package/src/types.ts +41 -38
- package/tests/index.test.ts +389 -2
- package/tests/type-safety.test.ts +496 -0
- package/dist/api.d.ts +0 -31
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -155
- package/dist/api.js.map +0 -1
- package/dist/context.d.ts +0 -16
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -25
- package/dist/context.js.map +0 -1
- package/dist/errors.d.ts +0 -30
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -79
- package/dist/errors.js.map +0 -1
- package/dist/events.d.ts +0 -14
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -42
- package/dist/events.js.map +0 -1
- package/dist/hooks.d.ts +0 -11
- package/dist/hooks.d.ts.map +0 -1
- package/dist/hooks.js +0 -26
- package/dist/hooks.js.map +0 -1
- package/dist/procedures.d.ts +0 -23
- package/dist/procedures.d.ts.map +0 -1
- package/dist/procedures.js +0 -4
- package/dist/procedures.js.map +0 -1
- package/dist/query-builder.d.ts +0 -37
- package/dist/query-builder.d.ts.map +0 -1
- package/dist/query-builder.js +0 -103
- package/dist/query-builder.js.map +0 -1
- package/dist/router.d.ts +0 -32
- package/dist/router.d.ts.map +0 -1
- package/dist/router.js +0 -98
- package/dist/router.js.map +0 -1
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Nesalia Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/api/factory.d.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Plugin, type Middleware, type Router, type Procedure } from "../types.js";
|
|
2
2
|
import { EventEmitter } from "../events/emitter.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type APIInstance, type TypedAPIInstance, type RequestInfo } from "./types.js";
|
|
4
4
|
export declare function createAPI<Ctx, TRoutes extends Router<Ctx>>(config: {
|
|
5
5
|
router: TRoutes;
|
|
6
|
-
context
|
|
6
|
+
context?: Ctx;
|
|
7
|
+
createContext?: (requestInfo?: RequestInfo) => Ctx;
|
|
7
8
|
plugins?: Plugin<Ctx>[];
|
|
8
9
|
middleware?: Middleware<Ctx>[];
|
|
9
10
|
eventEmitter?: EventEmitter<any>;
|
|
10
|
-
}):
|
|
11
|
+
}): TypedAPIInstance<Ctx, TRoutes>;
|
|
11
12
|
export declare function createPublicAPI<Ctx, TRoutes extends Router<Ctx>>(api: APIInstance<Ctx, TRoutes>): APIInstance<Ctx, PublicRouter<TRoutes>>;
|
|
12
|
-
|
|
13
|
-
export declare function createLocalExecutor<Ctx>(api: APIInstance<Ctx>): LocalExecutor<Ctx>;
|
|
14
|
-
type PublicRouter<TRoutes extends Router> = {
|
|
13
|
+
type PublicRouter<TRoutes extends Router<any, any>> = {
|
|
15
14
|
[K in keyof TRoutes as TRoutes[K] extends Procedure<any, any, any> ? TRoutes[K] extends {
|
|
16
15
|
type: "query" | "mutation";
|
|
17
|
-
} ? K : never : K]: TRoutes[K] extends Router ? PublicRouter<TRoutes[K]> : TRoutes[K];
|
|
16
|
+
} ? K : never : K]: TRoutes[K] extends Router<any, any> ? PublicRouter<TRoutes[K]> : TRoutes[K];
|
|
18
17
|
};
|
|
18
|
+
export {};
|
|
19
19
|
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/api/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/api/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAA6D,MAAM,aAAa,CAAC;AACnJ,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIpD,OAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAwMxF,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,CAAC,EACxD,MAAM,EAAE;IACN,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,KAAK,GAAG,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;CAClC,GACA,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CA+ChC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,CAAC,EAC9D,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,GAC7B,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAWzC;AAED,KAAK,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;KACnD,CAAC,IAAI,MAAM,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAC9D,OAAO,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,GAC/C,CAAC,GACD,KAAK,GACP,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GACvC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;CACf,CAAC"}
|
package/dist/api/factory.js
CHANGED
|
@@ -1,161 +1,233 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.router = config.router;
|
|
13
|
-
this.ctx = config.context;
|
|
14
|
-
this.plugins = config.plugins;
|
|
15
|
-
this.globalMiddleware = config.middleware;
|
|
16
|
-
this.eventEmitter = config.eventEmitter;
|
|
17
|
-
}
|
|
18
|
-
async executeRaw(route, args) {
|
|
19
|
-
// Parse route like "users.get" or "posts.list"
|
|
20
|
-
const parts = route.split(".");
|
|
21
|
-
let current = this.router;
|
|
22
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
23
|
-
current = current[parts[i]];
|
|
24
|
-
if (!current) {
|
|
25
|
-
return createErrorResult("ROUTE_NOT_FOUND", `Route not found: ${route}`);
|
|
1
|
+
import { err, error as errorFn, none } from "@deessejs/fp";
|
|
2
|
+
import { createPendingEventQueue } from "../events/queue.js";
|
|
3
|
+
import { createErrorResult, ServerException } from "../errors/server-error.js";
|
|
4
|
+
import { isRouter, isProcedure } from "../router/index.js";
|
|
5
|
+
function createRouterProxy(router, ctx, globalMiddleware, rootRouter, eventEmitter, queue, path = []
|
|
6
|
+
/* eslint-disable @typescript-eslint/consistent-return */
|
|
7
|
+
) {
|
|
8
|
+
return new Proxy({}, {
|
|
9
|
+
get(target, prop) {
|
|
10
|
+
if (prop === "then" || prop === "toJSON" || prop === "valueOf" || prop === Symbol.toStringTag) {
|
|
11
|
+
return undefined;
|
|
26
12
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
13
|
+
if (typeof prop !== "string") {
|
|
14
|
+
return none();
|
|
15
|
+
}
|
|
16
|
+
const value = router[prop];
|
|
17
|
+
if (value === undefined) {
|
|
18
|
+
return none();
|
|
19
|
+
}
|
|
20
|
+
if (isProcedure(value)) {
|
|
21
|
+
const fullPath = [...path, prop].join(".");
|
|
22
|
+
return (args) => executeRoute(rootRouter, ctx, globalMiddleware, fullPath, args, eventEmitter, queue);
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "object" && value !== null) {
|
|
25
|
+
return createRouterProxy(value, ctx, globalMiddleware, rootRouter, eventEmitter, queue, [...path, prop]);
|
|
26
|
+
}
|
|
27
|
+
return none();
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function executeRoute(router, ctx, globalMiddleware, route, args, eventEmitter, queue) {
|
|
32
|
+
const parts = route.split(".");
|
|
33
|
+
let current = router;
|
|
34
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
35
|
+
current = current[parts[i]];
|
|
36
|
+
if (!current) {
|
|
30
37
|
return createErrorResult("ROUTE_NOT_FOUND", `Route not found: ${route}`);
|
|
31
38
|
}
|
|
32
|
-
// Execute with hooks
|
|
33
|
-
return executeProcedure(procedure, this.ctx, args, this.globalMiddleware);
|
|
34
39
|
}
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
const procedure = current[parts.at(-1)];
|
|
41
|
+
if (!procedure || !isProcedure(procedure)) {
|
|
42
|
+
return createErrorResult("ROUTE_NOT_FOUND", `Route not found: ${route}`);
|
|
37
43
|
}
|
|
44
|
+
return executeProcedure(procedure, ctx, args, globalMiddleware, eventEmitter, queue, route);
|
|
38
45
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
eventEmitter,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
// ============================================
|
|
53
|
-
// createPublicAPI
|
|
54
|
-
// ============================================
|
|
55
|
-
export function createPublicAPI(api) {
|
|
56
|
-
const publicRouter = filterPublicRouter(api.router);
|
|
57
|
-
return new APIInstanceImpl({
|
|
58
|
-
router: publicRouter,
|
|
59
|
-
context: api.ctx,
|
|
60
|
-
plugins: api.plugins,
|
|
61
|
-
middleware: api.globalMiddleware,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
// ============================================
|
|
65
|
-
// createClient (alias)
|
|
66
|
-
// ============================================
|
|
67
|
-
export { createPublicAPI as createClient };
|
|
68
|
-
// ============================================
|
|
69
|
-
// createLocalExecutor
|
|
70
|
-
// ============================================
|
|
71
|
-
export function createLocalExecutor(api) {
|
|
72
|
-
const events = [];
|
|
46
|
+
function createHandlerContext(ctx, queue) {
|
|
47
|
+
const send = (name, data, options) => {
|
|
48
|
+
queue.enqueue({
|
|
49
|
+
name: name,
|
|
50
|
+
data,
|
|
51
|
+
timestamp: new Date().toISOString(),
|
|
52
|
+
namespace: options?.namespace ?? "default",
|
|
53
|
+
options,
|
|
54
|
+
});
|
|
55
|
+
};
|
|
73
56
|
return {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
},
|
|
77
|
-
getEvents: () => events,
|
|
57
|
+
...ctx,
|
|
58
|
+
send,
|
|
78
59
|
};
|
|
79
60
|
}
|
|
80
|
-
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
61
|
+
async function executeProcedure(procedure, ctx, args, middleware, eventEmitter, queue, route) {
|
|
62
|
+
// Create handler context with send function
|
|
63
|
+
const handlerCtx = createHandlerContext(ctx, queue);
|
|
64
|
+
// Validate args if schema is defined
|
|
65
|
+
const hookedProc = procedure;
|
|
66
|
+
if (hookedProc.argsSchema) {
|
|
67
|
+
const parseResult = hookedProc.argsSchema.safeParse(args);
|
|
68
|
+
if (!parseResult.success) {
|
|
69
|
+
const errors = parseResult.error.errors.map((e) => `${e.path.join(".")}: ${e.message}`);
|
|
70
|
+
/* eslint-disable unicorn/throw-new-error -- errorFn returns a function, not a constructor */
|
|
71
|
+
const ValidationError = errorFn({ name: "VALIDATION_ERROR", message: (args) => args.message });
|
|
72
|
+
return err(ValidationError({ message: errors.join(", ") })
|
|
73
|
+
.addNotes(`Validation failed for route: ${route}`));
|
|
74
|
+
/* eslint-enable unicorn/throw-new-error */
|
|
75
|
+
}
|
|
76
|
+
args = parseResult.data;
|
|
77
|
+
}
|
|
78
|
+
// Extract per-procedure middleware and combine with global middleware
|
|
79
|
+
// Per-procedure middleware runs AFTER global middleware (as per design doc)
|
|
80
|
+
const procedureMiddleware = hookedProc._middleware || [];
|
|
81
|
+
const allMiddleware = [...middleware, ...procedureMiddleware];
|
|
90
82
|
try {
|
|
91
|
-
// Apply middleware chain
|
|
92
83
|
let index = 0;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
84
|
+
/* eslint-disable-next-line sonarjs/cognitive-complexity, complexity -- Middleware chain requires this complexity */
|
|
85
|
+
const next = async (overrides) => {
|
|
86
|
+
// Merge context if overrides provided
|
|
87
|
+
const currentCtx = overrides?.ctx ? { ...handlerCtx, ...overrides.ctx } : handlerCtx;
|
|
88
|
+
if (index >= allMiddleware.length) {
|
|
89
|
+
// No more middleware, execute procedure handler
|
|
97
90
|
if (hookedProc._hooks?.beforeInvoke) {
|
|
98
|
-
await hookedProc._hooks.beforeInvoke(
|
|
91
|
+
await hookedProc._hooks.beforeInvoke(currentCtx, args);
|
|
99
92
|
}
|
|
100
93
|
try {
|
|
101
|
-
const result = await procedure.handler(
|
|
94
|
+
const result = await procedure.handler(currentCtx, args);
|
|
102
95
|
if (hookedProc._hooks?.afterInvoke) {
|
|
103
|
-
await hookedProc._hooks.afterInvoke(
|
|
96
|
+
await hookedProc._hooks.afterInvoke(currentCtx, args, result);
|
|
104
97
|
}
|
|
105
98
|
if (result.ok && hookedProc._hooks?.onSuccess) {
|
|
106
|
-
await hookedProc._hooks.onSuccess(
|
|
99
|
+
await hookedProc._hooks.onSuccess(currentCtx, args, result.value);
|
|
107
100
|
}
|
|
108
101
|
else if (!result.ok && hookedProc._hooks?.onError) {
|
|
109
|
-
await hookedProc._hooks.onError(
|
|
102
|
+
await hookedProc._hooks.onError(currentCtx, args, result.error);
|
|
103
|
+
}
|
|
104
|
+
// Only emit events if handler succeeded
|
|
105
|
+
if (result.ok) {
|
|
106
|
+
await queue.flush(eventEmitter);
|
|
110
107
|
}
|
|
111
108
|
return result;
|
|
112
109
|
}
|
|
113
110
|
catch (error) {
|
|
114
111
|
if (hookedProc._hooks?.onError) {
|
|
115
|
-
await hookedProc._hooks.onError(
|
|
112
|
+
await hookedProc._hooks.onError(currentCtx, args, error);
|
|
116
113
|
}
|
|
117
|
-
|
|
114
|
+
const errToReturn = error instanceof Error ? error : new Error(String(error));
|
|
115
|
+
/* eslint-disable unicorn/throw-new-error -- errorFn returns a function, not a constructor */
|
|
116
|
+
const InternalError = errorFn({ name: "INTERNAL_ERROR", message: (args) => args.message });
|
|
117
|
+
return err(InternalError({ message: errToReturn.message })
|
|
118
|
+
.addNotes(`Error in route: ${route}`)
|
|
119
|
+
.from(errorFn({ name: "INTERNAL_ERROR", message: (_) => errToReturn.message })({ message: errToReturn.message })));
|
|
120
|
+
/* eslint-enable unicorn/throw-new-error */
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
|
-
const mw =
|
|
121
|
-
return mw.handler(
|
|
123
|
+
const mw = allMiddleware[index++];
|
|
124
|
+
return mw.handler(currentCtx, {
|
|
125
|
+
next: (innerOverrides) => next(innerOverrides),
|
|
126
|
+
args,
|
|
127
|
+
meta: {},
|
|
128
|
+
});
|
|
122
129
|
};
|
|
123
130
|
return await next();
|
|
124
131
|
}
|
|
125
132
|
catch (error) {
|
|
126
|
-
|
|
133
|
+
// On error, discard pending events (don't emit them)
|
|
134
|
+
queue.clear();
|
|
135
|
+
const errToReturn = error instanceof Error ? error : new Error(String(error));
|
|
136
|
+
if (error instanceof ServerException) {
|
|
137
|
+
/* eslint-disable unicorn/throw-new-error -- errorFn returns a function, not a constructor */
|
|
138
|
+
const ServerError = errorFn({ name: error.code, message: (args) => args.message });
|
|
139
|
+
return err(ServerError({ message: error.message })
|
|
140
|
+
.addNotes(`Route: ${route}`)
|
|
141
|
+
.from(errorFn({ name: error.code, message: (_) => error.message })({ message: error.message })));
|
|
142
|
+
/* eslint-enable unicorn/throw-new-error */
|
|
143
|
+
}
|
|
144
|
+
/* eslint-disable unicorn/throw-new-error -- errorFn returns a function, not a constructor */
|
|
145
|
+
const UnexpectedError = errorFn({ name: "INTERNAL_ERROR", message: (args) => args.message });
|
|
146
|
+
return err(UnexpectedError({ message: errToReturn.message })
|
|
147
|
+
.addNotes(`Unexpected error in route: ${route}`)
|
|
148
|
+
.from(errorFn({ name: "INTERNAL_ERROR", message: (_) => errToReturn.message })({ message: errToReturn.message })));
|
|
149
|
+
/* eslint-enable unicorn/throw-new-error */
|
|
127
150
|
}
|
|
128
151
|
}
|
|
152
|
+
export function createAPI(config) {
|
|
153
|
+
const { router, context, createContext, plugins = [], middleware = [], eventEmitter } = config;
|
|
154
|
+
const queue = createPendingEventQueue();
|
|
155
|
+
// Resolve context factory - createContext takes precedence over static context
|
|
156
|
+
// Both factories accept optional RequestInfo for per-request context enrichment
|
|
157
|
+
const contextFactory = createContext ?? ((_requestInfo) => context);
|
|
158
|
+
const executeRawInternal = (route, args, ctx) => {
|
|
159
|
+
return executeRoute(router, ctx, middleware, route, args, eventEmitter, queue);
|
|
160
|
+
};
|
|
161
|
+
const execute = async (route, args, requestInfo) => {
|
|
162
|
+
const ctx = contextFactory(requestInfo); // Fresh context per request, with optional request info
|
|
163
|
+
return executeRawInternal(route, args, ctx);
|
|
164
|
+
};
|
|
165
|
+
const executeRaw = async (route, args, requestInfo) => {
|
|
166
|
+
const ctx = contextFactory(requestInfo); // Fresh context per request, with optional request info
|
|
167
|
+
return executeRawInternal(route, args, ctx);
|
|
168
|
+
};
|
|
169
|
+
const initialCtx = contextFactory();
|
|
170
|
+
const state = {
|
|
171
|
+
router,
|
|
172
|
+
ctx: initialCtx,
|
|
173
|
+
plugins,
|
|
174
|
+
globalMiddleware: middleware,
|
|
175
|
+
eventEmitter,
|
|
176
|
+
executeRaw,
|
|
177
|
+
execute,
|
|
178
|
+
};
|
|
179
|
+
const routerProxy = createRouterProxy(state.router, state.ctx, state.globalMiddleware, state.router, eventEmitter, queue);
|
|
180
|
+
return new Proxy(state, {
|
|
181
|
+
get(target, prop) {
|
|
182
|
+
if (prop === "router")
|
|
183
|
+
return target.router;
|
|
184
|
+
if (prop === "ctx")
|
|
185
|
+
return target.ctx;
|
|
186
|
+
if (prop === "plugins")
|
|
187
|
+
return target.plugins;
|
|
188
|
+
if (prop === "globalMiddleware")
|
|
189
|
+
return target.globalMiddleware;
|
|
190
|
+
if (prop === "eventEmitter")
|
|
191
|
+
return target.eventEmitter;
|
|
192
|
+
if (prop === "execute")
|
|
193
|
+
return target.execute.bind(target);
|
|
194
|
+
if (prop === "executeRaw")
|
|
195
|
+
return target.executeRaw.bind(target);
|
|
196
|
+
if (prop === "getEvents")
|
|
197
|
+
return () => target.eventEmitter?.getEventLog() ?? [];
|
|
198
|
+
return routerProxy[prop];
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
export function createPublicAPI(api) {
|
|
203
|
+
const publicRouter = filterPublicRouter(api.router);
|
|
204
|
+
// Try to get createContext from the API instance if available
|
|
205
|
+
const createContext = api.createContext;
|
|
206
|
+
return createAPI({
|
|
207
|
+
router: publicRouter,
|
|
208
|
+
context: api.ctx,
|
|
209
|
+
createContext: createContext,
|
|
210
|
+
plugins: api.plugins,
|
|
211
|
+
middleware: api.globalMiddleware,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
129
214
|
function filterPublicRouter(router) {
|
|
130
215
|
const result = {};
|
|
131
216
|
for (const key in router) {
|
|
132
217
|
const value = router[key];
|
|
133
218
|
if (isRouter(value)) {
|
|
134
|
-
// Recurse into nested router
|
|
135
219
|
result[key] = filterPublicRouter(value);
|
|
136
220
|
}
|
|
137
221
|
else if (isProcedure(value)) {
|
|
138
|
-
// Only include query and mutation
|
|
139
222
|
if (value.type === "query" || value.type === "mutation") {
|
|
140
223
|
result[key] = value;
|
|
141
224
|
}
|
|
142
225
|
}
|
|
143
226
|
else {
|
|
144
|
-
// Pass through anything else
|
|
145
227
|
result[key] = value;
|
|
146
228
|
}
|
|
147
229
|
}
|
|
148
230
|
return result;
|
|
149
231
|
}
|
|
150
|
-
|
|
151
|
-
if (!obj || typeof obj !== "object")
|
|
152
|
-
return false;
|
|
153
|
-
// If it has procedure-like properties, it's not a plain router
|
|
154
|
-
for (const key of Object.keys(obj)) {
|
|
155
|
-
if (isProcedure(obj[key])) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
232
|
+
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
161
233
|
//# sourceMappingURL=factory.js.map
|
package/dist/api/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/api/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/api/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAe,KAAK,IAAI,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAc3D,SAAS,iBAAiB,CACxB,MAAmB,EACnB,GAAQ,EACR,gBAAmC,EACnC,UAAuB,EACvB,YAA2C,EAC3C,KAAiD,EACjD,OAAiB,EAAE;AACrB,yDAAyD;;IAEvD,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;QACnB,GAAG,CAAC,MAAe,EAAE,IAAqB;YACxC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC9F,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,GAAI,MAAc,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAa,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;YACjH,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,iBAAiB,CAAC,KAAoB,EAAE,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1H,CAAC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAmB,EACnB,GAAQ,EACR,gBAAmC,EACnC,KAAa,EACb,IAAa,EACb,YAA2C,EAC3C,KAAiD;IAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAQ,MAAM,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,iBAAiB,EAAE,oBAAoB,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC,iBAAiB,EAAE,oBAAoB,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAQ,EACR,KAAiD;IAEjD,MAAM,IAAI,GAAG,CAAC,IAAkB,EAAE,IAAiC,EAAE,OAAqB,EAAQ,EAAE;QAClG,KAAK,CAAC,OAAO,CAAC;YACZ,IAAI,EAAE,IAAc;YACpB,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS;YAC1C,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,GAAI,GAAc;QAClB,IAAI;KAC0B,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,SAAuC,EACvC,GAAQ,EACR,IAAU,EACV,UAA6B,EAC7B,YAA2C,EAC3C,KAAiD,EACjD,KAAa;IAEb,4CAA4C;IAC5C,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEpD,qCAAqC;IACrC,MAAM,UAAU,GAAG,SAAgB,CAAC;IACpC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7F,6FAA6F;YAC7F,MAAM,eAAe,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,IAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACpH,OAAO,GAAG,CACR,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC5C,QAAQ,CAAC,gCAAgC,KAAK,EAAE,CAAC,CACrD,CAAC;YACF,2CAA2C;QAC7C,CAAC;QACD,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,4EAA4E;IAC5E,MAAM,mBAAmB,GAAsB,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5E,MAAM,aAAa,GAAsB,CAAC,GAAG,UAAU,EAAE,GAAG,mBAAmB,CAAC,CAAC;IAEjF,IAAI,CAAC;QACH,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,oHAAoH;QACpH,MAAM,IAAI,GAAG,KAAK,EAAE,SAAkC,EAA2B,EAAE;YACjF,sCAAsC;YACtC,MAAM,UAAU,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;YAErF,IAAI,KAAK,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBAClC,gDAAgD;gBAChD,IAAI,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;oBACpC,MAAM,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACzD,IAAI,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;wBACnC,MAAM,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;oBAChE,CAAC;oBACD,IAAI,MAAM,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;wBAC9C,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBACpE,CAAC;yBAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;wBACpD,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClE,CAAC;oBACD,wCAAwC;oBACxC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;wBACd,MAAM,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAClC,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;wBAC/B,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC3D,CAAC;oBACD,MAAM,WAAW,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9E,6FAA6F;oBAC7F,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,IAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;oBAChH,OAAO,GAAG,CACR,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;yBAC5C,QAAQ,CAAC,mBAAmB,KAAK,EAAE,CAAC;yBACpC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAC7H,CAAC;oBACF,2CAA2C;gBAC7C,CAAC;YACH,CAAC;YACD,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE;gBAC5B,IAAI,EAAE,CAAC,cAAuC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC;gBACvE,IAAI;gBACJ,IAAI,EAAE,EAAE;aACT,CAA8B,CAAC;QAClC,CAAC,CAAC;QACF,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,qDAAqD;QACrD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,6FAA6F;YAC7F,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,IAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACxG,OAAO,GAAG,CACR,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;iBACpC,QAAQ,CAAC,UAAU,KAAK,EAAE,CAAC;iBAC3B,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAC3G,CAAC;YACF,2CAA2C;QAC7C,CAAC;QACD,6FAA6F;QAC7F,MAAM,eAAe,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,IAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAClH,OAAO,GAAG,CACR,eAAe,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;aAC9C,QAAQ,CAAC,8BAA8B,KAAK,EAAE,CAAC;aAC/C,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAC7H,CAAC;QACF,2CAA2C;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,MAOC;IAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC/F,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IAExC,+EAA+E;IAC/E,gFAAgF;IAChF,MAAM,cAAc,GAAG,aAAa,IAAI,CAAC,CAAC,YAA0B,EAAE,EAAE,CAAC,OAAc,CAAC,CAAC;IAEzF,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,IAAa,EAAE,GAAQ,EAA4B,EAAE;QAC9F,OAAO,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACjF,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EAAE,KAAa,EAAE,IAAa,EAAE,WAAyB,EAA4B,EAAE;QAC1G,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,wDAAwD;QACjG,OAAO,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,KAAa,EAAE,IAAa,EAAE,WAAyB,EAA4B,EAAE;QAC7G,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,wDAAwD;QACjG,OAAO,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,GAAmC;QAC5C,MAAM;QACN,GAAG,EAAE,UAAU;QACf,OAAO;QACP,gBAAgB,EAAE,UAAU;QAC5B,YAAY;QACZ,UAAU;QACV,OAAO;KACR,CAAC;IAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAQ,CAAC;IACjI,OAAO,IAAI,KAAK,CAAC,KAAY,EAAE;QAC7B,GAAG,CAAC,MAAM,EAAE,IAAqB;YAC/B,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC;YAC5C,IAAI,IAAI,KAAK,KAAK;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC;YACtC,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC;YAC9C,IAAI,IAAI,KAAK,kBAAkB;gBAAE,OAAO,MAAM,CAAC,gBAAgB,CAAC;YAChE,IAAI,IAAI,KAAK,cAAc;gBAAE,OAAO,MAAM,CAAC,YAAY,CAAC;YACxD,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,IAAI,KAAK,YAAY;gBAAE,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAChF,OAAQ,WAAmB,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAA8B;IAE9B,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpD,8DAA8D;IAC9D,MAAM,aAAa,GAAI,GAAW,CAAC,aAAa,CAAC;IACjD,OAAO,SAAS,CAAC;QACf,MAAM,EAAE,YAAmB;QAC3B,OAAO,EAAE,GAAG,CAAC,GAAG;QAChB,aAAa,EAAE,aAAa;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,UAAU,EAAE,GAAG,CAAC,gBAAgB;KACjC,CAAQ,CAAC;AACZ,CAAC;AAYD,SAAS,kBAAkB,CAAmC,MAAe;IAC3E,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAK,KAAa,CAAC,IAAI,KAAK,OAAO,IAAK,KAAa,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC1E,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,sDAAsD"}
|
package/dist/api/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { APIInstance,
|
|
2
|
-
export { createAPI, createPublicAPI
|
|
1
|
+
export type { APIInstance, APIConfig, RequestInfo } from "./types.js";
|
|
2
|
+
export { createAPI, createPublicAPI } from "./factory.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/api/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createAPI, createPublicAPI
|
|
1
|
+
export { createAPI, createPublicAPI } from "./factory.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/api/types.d.ts
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type
|
|
3
|
-
|
|
1
|
+
import { type EventEmitter } from "../events/emitter.js";
|
|
2
|
+
import { type Result } from "@deessejs/fp";
|
|
3
|
+
import { type Router, type Procedure } from "../types.js";
|
|
4
|
+
export type EventEmitterAny = EventEmitter<any>;
|
|
5
|
+
export type ProcedureProxy<Ctx, Args, Output> = (args: Args) => Promise<Result<Output>>;
|
|
6
|
+
export type RouterProxy<Ctx, Routes extends Router<Ctx, any>> = {
|
|
7
|
+
[K in keyof Routes]: Routes[K] extends Procedure<Ctx, infer Args, infer Output> ? ProcedureProxy<Ctx, Args, Output> : Routes[K] extends Router<Ctx, any> ? RouterProxy<Ctx, Routes[K]> : Routes[K];
|
|
8
|
+
};
|
|
9
|
+
export type TypedAPIInstance<Ctx, TRoutes extends Router<Ctx, any>> = APIInstance<Ctx, TRoutes> & RouterProxy<Ctx, TRoutes>;
|
|
10
|
+
export interface RequestInfo {
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
method?: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface APIInstance<Ctx, TRoutes = Router<Ctx, any>> {
|
|
4
17
|
readonly router: TRoutes;
|
|
5
18
|
readonly ctx: Ctx;
|
|
6
|
-
readonly plugins: Plugin<Ctx>[];
|
|
7
|
-
readonly globalMiddleware: Middleware<Ctx>[];
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export interface LocalExecutor<Ctx> {
|
|
12
|
-
execute(route: string, args: unknown): Promise<import("@deessejs/fp").Result<unknown>>;
|
|
13
|
-
getEvents(): any[];
|
|
19
|
+
readonly plugins: import("../types.js").Plugin<Ctx>[];
|
|
20
|
+
readonly globalMiddleware: import("../types.js").Middleware<Ctx>[];
|
|
21
|
+
readonly eventEmitter?: EventEmitterAny;
|
|
22
|
+
execute(route: string, args: unknown, requestInfo?: RequestInfo): Promise<import("@deessejs/fp").Result<unknown>>;
|
|
23
|
+
executeRaw(route: string, args: unknown, requestInfo?: RequestInfo): Promise<import("@deessejs/fp").Result<unknown>>;
|
|
14
24
|
}
|
|
15
|
-
export interface APIConfig<
|
|
25
|
+
export interface APIConfig<TRoutes extends Router<unknown, any>> {
|
|
16
26
|
router: TRoutes;
|
|
17
|
-
context
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
context?: unknown;
|
|
28
|
+
/**
|
|
29
|
+
* Factory function to create context per request.
|
|
30
|
+
* Receives optional RequestInfo (headers, method, url) for per-request context enrichment.
|
|
31
|
+
*/
|
|
32
|
+
createContext?: (requestInfo?: RequestInfo) => unknown;
|
|
33
|
+
plugins: import("../types.js").Plugin<unknown>[];
|
|
34
|
+
middleware: import("../types.js").Middleware<unknown>[];
|
|
35
|
+
eventEmitter?: EventEmitterAny;
|
|
21
36
|
}
|
|
22
37
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/api/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type EventRegistry, type Middleware, type Router } from "../types.js";
|
|
2
2
|
import { QueryBuilder } from "../query/builder.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type TypedAPIInstance } from "../api/types.js";
|
|
4
|
+
import { type DefineContextConfig } from "./types.js";
|
|
4
5
|
export declare function defineContext<Ctx, Events extends EventRegistry = EventRegistry>(config: DefineContextConfig<Ctx, Events>): {
|
|
5
|
-
t: QueryBuilder<Ctx>;
|
|
6
|
+
t: QueryBuilder<Ctx, Events>;
|
|
6
7
|
createAPI: (apiConfig: {
|
|
7
8
|
router: Router<Ctx>;
|
|
8
9
|
middleware?: Middleware<Ctx>[];
|
|
9
|
-
}) =>
|
|
10
|
+
}) => TypedAPIInstance<Ctx, Router<Ctx>>;
|
|
10
11
|
};
|
|
11
12
|
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAQ,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAgB,aAAa,CAC3B,GAAG,EACH,MAAM,SAAS,aAAa,GAAG,aAAa,EAE5C,MAAM,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,GACvC;IACD,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,CAAC,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAA;KAAE,KAAK,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CACvH,CA2BA"}
|
package/dist/context/builder.js
CHANGED
|
@@ -2,16 +2,21 @@ import { QueryBuilder } from "../query/builder.js";
|
|
|
2
2
|
import { EventEmitter } from "../events/emitter.js";
|
|
3
3
|
import { createAPI } from "../api/factory.js";
|
|
4
4
|
export function defineContext(config) {
|
|
5
|
-
const { context, plugins = [], events } = config;
|
|
5
|
+
const { context, createContext, plugins = [], events } = config;
|
|
6
6
|
// Create event emitter if events are defined
|
|
7
7
|
const eventEmitter = events ? new EventEmitter(events) : undefined;
|
|
8
|
+
// Initial context for QueryBuilder (used for building queries, not for request handling)
|
|
9
|
+
const initialContext = createContext ? createContext() : context;
|
|
8
10
|
// Create query builder (t)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
12
|
+
const t = new QueryBuilder(initialContext, eventEmitter);
|
|
13
|
+
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
14
|
+
// Create createAPI function
|
|
11
15
|
const createAPIFn = (apiConfig) => {
|
|
12
16
|
return createAPI({
|
|
13
17
|
router: apiConfig.router,
|
|
14
18
|
context,
|
|
19
|
+
createContext,
|
|
15
20
|
plugins,
|
|
16
21
|
middleware: apiConfig.middleware,
|
|
17
22
|
eventEmitter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/context/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAI9C,MAAM,UAAU,aAAa,CAI3B,MAAwC;IAKxC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEhE,6CAA6C;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAS,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,yFAAyF;IACzF,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjE,2BAA2B;IAC3B,uDAAuD;IACvD,MAAM,CAAC,GAAG,IAAI,YAAY,CAAc,cAAqB,EAAE,YAAmB,CAAC,CAAC;IACpF,sDAAsD;IAEtD,4BAA4B;IAC5B,MAAM,WAAW,GAAG,CAAC,SAAkE,EAAE,EAAE;QACzF,OAAO,SAAS,CAAC;YACf,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,OAAO;YACP,aAAa;YACb,OAAO;YACP,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,YAAY;SACb,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC"}
|