legonode 0.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.
Files changed (194) hide show
  1. package/README.md +107 -0
  2. package/dist/cli/cli.d.ts +3 -0
  3. package/dist/cli/cli.d.ts.map +1 -0
  4. package/dist/cli/cli.js +44 -0
  5. package/dist/cli/cli.js.map +1 -0
  6. package/dist/cli/commands/build.d.ts +8 -0
  7. package/dist/cli/commands/build.d.ts.map +1 -0
  8. package/dist/cli/commands/build.js +101 -0
  9. package/dist/cli/commands/build.js.map +1 -0
  10. package/dist/cli/commands/dev.d.ts +13 -0
  11. package/dist/cli/commands/dev.d.ts.map +1 -0
  12. package/dist/cli/commands/dev.js +285 -0
  13. package/dist/cli/commands/dev.js.map +1 -0
  14. package/dist/cli/commands/start.d.ts +10 -0
  15. package/dist/cli/commands/start.d.ts.map +1 -0
  16. package/dist/cli/commands/start.js +108 -0
  17. package/dist/cli/commands/start.js.map +1 -0
  18. package/dist/cli/pluginHooks.d.ts +5 -0
  19. package/dist/cli/pluginHooks.d.ts.map +1 -0
  20. package/dist/cli/pluginHooks.js +11 -0
  21. package/dist/cli/pluginHooks.js.map +1 -0
  22. package/dist/src/body/parseBody.d.ts +11 -0
  23. package/dist/src/body/parseBody.d.ts.map +1 -0
  24. package/dist/src/body/parseBody.js +113 -0
  25. package/dist/src/body/parseBody.js.map +1 -0
  26. package/dist/src/config/loadConfig.d.ts +71 -0
  27. package/dist/src/config/loadConfig.d.ts.map +1 -0
  28. package/dist/src/config/loadConfig.js +69 -0
  29. package/dist/src/config/loadConfig.js.map +1 -0
  30. package/dist/src/core/context.d.ts +139 -0
  31. package/dist/src/core/context.d.ts.map +1 -0
  32. package/dist/src/core/context.js +293 -0
  33. package/dist/src/core/context.js.map +1 -0
  34. package/dist/src/core/lifecycle.d.ts +3 -0
  35. package/dist/src/core/lifecycle.d.ts.map +1 -0
  36. package/dist/src/core/lifecycle.js +14 -0
  37. package/dist/src/core/lifecycle.js.map +1 -0
  38. package/dist/src/core/runtime.d.ts +28 -0
  39. package/dist/src/core/runtime.d.ts.map +1 -0
  40. package/dist/src/core/runtime.js +104 -0
  41. package/dist/src/core/runtime.js.map +1 -0
  42. package/dist/src/cors/cors.d.ts +5 -0
  43. package/dist/src/cors/cors.d.ts.map +1 -0
  44. package/dist/src/cors/cors.js +75 -0
  45. package/dist/src/cors/cors.js.map +1 -0
  46. package/dist/src/events/eventBus.d.ts +19 -0
  47. package/dist/src/events/eventBus.d.ts.map +1 -0
  48. package/dist/src/events/eventBus.js +29 -0
  49. package/dist/src/events/eventBus.js.map +1 -0
  50. package/dist/src/events/eventExecutor.d.ts +5 -0
  51. package/dist/src/events/eventExecutor.d.ts.map +1 -0
  52. package/dist/src/events/eventExecutor.js +84 -0
  53. package/dist/src/events/eventExecutor.js.map +1 -0
  54. package/dist/src/index.d.ts +23 -0
  55. package/dist/src/index.d.ts.map +1 -0
  56. package/dist/src/index.js +13 -0
  57. package/dist/src/index.js.map +1 -0
  58. package/dist/src/json/fastStringify.d.ts +7 -0
  59. package/dist/src/json/fastStringify.d.ts.map +1 -0
  60. package/dist/src/json/fastStringify.js +73 -0
  61. package/dist/src/json/fastStringify.js.map +1 -0
  62. package/dist/src/loader/fileScanner.d.ts +18 -0
  63. package/dist/src/loader/fileScanner.d.ts.map +1 -0
  64. package/dist/src/loader/fileScanner.js +133 -0
  65. package/dist/src/loader/fileScanner.js.map +1 -0
  66. package/dist/src/loader/moduleCache.d.ts +3 -0
  67. package/dist/src/loader/moduleCache.d.ts.map +1 -0
  68. package/dist/src/loader/moduleCache.js +19 -0
  69. package/dist/src/loader/moduleCache.js.map +1 -0
  70. package/dist/src/loader/moduleLoader.d.ts +2 -0
  71. package/dist/src/loader/moduleLoader.d.ts.map +1 -0
  72. package/dist/src/loader/moduleLoader.js +4 -0
  73. package/dist/src/loader/moduleLoader.js.map +1 -0
  74. package/dist/src/logger/requestLogger.d.ts +20 -0
  75. package/dist/src/logger/requestLogger.d.ts.map +1 -0
  76. package/dist/src/logger/requestLogger.js +63 -0
  77. package/dist/src/logger/requestLogger.js.map +1 -0
  78. package/dist/src/middleware/middlewareLoader.d.ts +3 -0
  79. package/dist/src/middleware/middlewareLoader.d.ts.map +1 -0
  80. package/dist/src/middleware/middlewareLoader.js +28 -0
  81. package/dist/src/middleware/middlewareLoader.js.map +1 -0
  82. package/dist/src/middleware/middlewareResolver.d.ts +13 -0
  83. package/dist/src/middleware/middlewareResolver.d.ts.map +1 -0
  84. package/dist/src/middleware/middlewareResolver.js +72 -0
  85. package/dist/src/middleware/middlewareResolver.js.map +1 -0
  86. package/dist/src/middleware/middlewareRunner.d.ts +10 -0
  87. package/dist/src/middleware/middlewareRunner.d.ts.map +1 -0
  88. package/dist/src/middleware/middlewareRunner.js +27 -0
  89. package/dist/src/middleware/middlewareRunner.js.map +1 -0
  90. package/dist/src/middleware/middlewareTable.d.ts +6 -0
  91. package/dist/src/middleware/middlewareTable.d.ts.map +1 -0
  92. package/dist/src/middleware/middlewareTable.js +44 -0
  93. package/dist/src/middleware/middlewareTable.js.map +1 -0
  94. package/dist/src/pipeline/compose.d.ts +10 -0
  95. package/dist/src/pipeline/compose.d.ts.map +1 -0
  96. package/dist/src/pipeline/compose.js +35 -0
  97. package/dist/src/pipeline/compose.js.map +1 -0
  98. package/dist/src/pipeline/pipelineCache.d.ts +16 -0
  99. package/dist/src/pipeline/pipelineCache.d.ts.map +1 -0
  100. package/dist/src/pipeline/pipelineCache.js +73 -0
  101. package/dist/src/pipeline/pipelineCache.js.map +1 -0
  102. package/dist/src/plugin/pluginAPI.d.ts +63 -0
  103. package/dist/src/plugin/pluginAPI.d.ts.map +1 -0
  104. package/dist/src/plugin/pluginAPI.js +2 -0
  105. package/dist/src/plugin/pluginAPI.js.map +1 -0
  106. package/dist/src/plugin/pluginManager.d.ts +6 -0
  107. package/dist/src/plugin/pluginManager.d.ts.map +1 -0
  108. package/dist/src/plugin/pluginManager.js +16 -0
  109. package/dist/src/plugin/pluginManager.js.map +1 -0
  110. package/dist/src/router/matcher.d.ts +10 -0
  111. package/dist/src/router/matcher.d.ts.map +1 -0
  112. package/dist/src/router/matcher.js +69 -0
  113. package/dist/src/router/matcher.js.map +1 -0
  114. package/dist/src/router/radixTree.d.ts +24 -0
  115. package/dist/src/router/radixTree.d.ts.map +1 -0
  116. package/dist/src/router/radixTree.js +208 -0
  117. package/dist/src/router/radixTree.js.map +1 -0
  118. package/dist/src/router/routeLoader.d.ts +22 -0
  119. package/dist/src/router/routeLoader.d.ts.map +1 -0
  120. package/dist/src/router/routeLoader.js +94 -0
  121. package/dist/src/router/routeLoader.js.map +1 -0
  122. package/dist/src/router/routeTable.d.ts +25 -0
  123. package/dist/src/router/routeTable.d.ts.map +1 -0
  124. package/dist/src/router/routeTable.js +133 -0
  125. package/dist/src/router/routeTable.js.map +1 -0
  126. package/dist/src/router/router.d.ts +18 -0
  127. package/dist/src/router/router.d.ts.map +1 -0
  128. package/dist/src/router/router.js +158 -0
  129. package/dist/src/router/router.js.map +1 -0
  130. package/dist/src/schedules/parseSchedule.d.ts +15 -0
  131. package/dist/src/schedules/parseSchedule.d.ts.map +1 -0
  132. package/dist/src/schedules/parseSchedule.js +111 -0
  133. package/dist/src/schedules/parseSchedule.js.map +1 -0
  134. package/dist/src/schedules/runScheduler.d.ts +14 -0
  135. package/dist/src/schedules/runScheduler.d.ts.map +1 -0
  136. package/dist/src/schedules/runScheduler.js +58 -0
  137. package/dist/src/schedules/runScheduler.js.map +1 -0
  138. package/dist/src/schedules/scheduleLoader.d.ts +14 -0
  139. package/dist/src/schedules/scheduleLoader.d.ts.map +1 -0
  140. package/dist/src/schedules/scheduleLoader.js +122 -0
  141. package/dist/src/schedules/scheduleLoader.js.map +1 -0
  142. package/dist/src/schedules/types.d.ts +37 -0
  143. package/dist/src/schedules/types.d.ts.map +1 -0
  144. package/dist/src/schedules/types.js +2 -0
  145. package/dist/src/schedules/types.js.map +1 -0
  146. package/dist/src/server/errorHandler.d.ts +4 -0
  147. package/dist/src/server/errorHandler.d.ts.map +1 -0
  148. package/dist/src/server/errorHandler.js +10 -0
  149. package/dist/src/server/errorHandler.js.map +1 -0
  150. package/dist/src/server/requestHandler.d.ts +35 -0
  151. package/dist/src/server/requestHandler.d.ts.map +1 -0
  152. package/dist/src/server/requestHandler.js +439 -0
  153. package/dist/src/server/requestHandler.js.map +1 -0
  154. package/dist/src/server/server.d.ts +20 -0
  155. package/dist/src/server/server.d.ts.map +1 -0
  156. package/dist/src/server/server.js +74 -0
  157. package/dist/src/server/server.js.map +1 -0
  158. package/dist/src/tasks/scheduler.d.ts +10 -0
  159. package/dist/src/tasks/scheduler.d.ts.map +1 -0
  160. package/dist/src/tasks/scheduler.js +10 -0
  161. package/dist/src/tasks/scheduler.js.map +1 -0
  162. package/dist/src/tasks/taskRunner.d.ts +3 -0
  163. package/dist/src/tasks/taskRunner.d.ts.map +1 -0
  164. package/dist/src/tasks/taskRunner.js +4 -0
  165. package/dist/src/tasks/taskRunner.js.map +1 -0
  166. package/dist/src/trace/traceEngine.d.ts +45 -0
  167. package/dist/src/trace/traceEngine.d.ts.map +1 -0
  168. package/dist/src/trace/traceEngine.js +63 -0
  169. package/dist/src/trace/traceEngine.js.map +1 -0
  170. package/dist/src/trace/traceStore.d.ts +10 -0
  171. package/dist/src/trace/traceStore.d.ts.map +1 -0
  172. package/dist/src/trace/traceStore.js +10 -0
  173. package/dist/src/trace/traceStore.js.map +1 -0
  174. package/dist/src/utils/logger.d.ts +6 -0
  175. package/dist/src/utils/logger.d.ts.map +1 -0
  176. package/dist/src/utils/logger.js +21 -0
  177. package/dist/src/utils/logger.js.map +1 -0
  178. package/dist/src/utils/path.d.ts +2 -0
  179. package/dist/src/utils/path.d.ts.map +1 -0
  180. package/dist/src/utils/path.js +4 -0
  181. package/dist/src/utils/path.js.map +1 -0
  182. package/dist/src/validation/routeSchema.d.ts +77 -0
  183. package/dist/src/validation/routeSchema.d.ts.map +1 -0
  184. package/dist/src/validation/routeSchema.js +134 -0
  185. package/dist/src/validation/routeSchema.js.map +1 -0
  186. package/dist/src/validation/validateApp.d.ts +20 -0
  187. package/dist/src/validation/validateApp.d.ts.map +1 -0
  188. package/dist/src/validation/validateApp.js +23 -0
  189. package/dist/src/validation/validateApp.js.map +1 -0
  190. package/dist/src/validation/validateBody.d.ts +7 -0
  191. package/dist/src/validation/validateBody.d.ts.map +1 -0
  192. package/dist/src/validation/validateBody.js +8 -0
  193. package/dist/src/validation/validateBody.js.map +1 -0
  194. package/package.json +31 -0
@@ -0,0 +1,35 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { CorsConfig, ErrorHandler } from "../config/loadConfig.js";
3
+ import type { LegonodePlugin } from "../plugin/pluginAPI.js";
4
+ import type { ResponseSchemaMap } from "../validation/routeSchema.js";
5
+ import type { LegonodeLogger } from "../logger/requestLogger.js";
6
+ import type { TracerFn, TraceStartFn } from "../trace/traceEngine.js";
7
+ export declare function clearRuntimeCache(appDir?: string): void;
8
+ /** Warm runtime so first request gets sync lookup (Fastify-style: ready before accepting connections). */
9
+ export declare function warmRuntime(options: RequestHandlerOptions): Promise<void>;
10
+ export type RequestHandlerOptions = {
11
+ appDir?: string;
12
+ maxBodySize?: number;
13
+ errorHandler?: ErrorHandler;
14
+ cors?: CorsConfig;
15
+ plugins?: LegonodePlugin[];
16
+ /** Default response body schemas per status (from legonode.config responses). */
17
+ responses?: ResponseSchemaMap;
18
+ /** Base logger for ctx.logger (request-scoped children will include traceId). */
19
+ logger?: LegonodeLogger;
20
+ /** Dev options from config (e.g. dev.logPretty for pino-pretty in development). */
21
+ dev?: {
22
+ cron?: boolean;
23
+ logPretty?: boolean;
24
+ };
25
+ /** Override default API tracing (span end). */
26
+ tracer?: TracerFn;
27
+ /** Override default API tracing (span start). */
28
+ traceStart?: TraceStartFn;
29
+ /** Set false to disable request lifecycle logging and tracer/traceStart callbacks (default: true). */
30
+ tracing?: boolean;
31
+ /** Set true to reuse context objects from a pool (may help under heavy load with many routes). */
32
+ contextPool?: boolean;
33
+ };
34
+ export declare function handleNodeRequest(req: IncomingMessage, res: ServerResponse, options?: RequestHandlerOptions): Promise<void>;
35
+ //# sourceMappingURL=requestHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestHandler.d.ts","sourceRoot":"","sources":["../../../src/server/requestHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAMjE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAsB7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAOjE,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMtE,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,0GAA0G;AAC1G,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAGf;AAiGD,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,iFAAiF;IACjF,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,iFAAiF;IACjF,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,mFAAmF;IACnF,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C,+CAA+C;IAC/C,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,iDAAiD;IACjD,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,sGAAsG;IACtG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kGAAkG;IAClG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAwGF,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE,qBAA0B,iBAqQpC"}
@@ -0,0 +1,439 @@
1
+ import { resolve } from "node:path";
2
+ import { createRuntime } from "../core/runtime.js";
3
+ import { getDefaultStatusFromSchema, releaseContext } from "../core/context.js";
4
+ import { parseBody } from "../body/parseBody.js";
5
+ import { getCorsHeaders, shouldRejectCorsRequest } from "../cors/cors.js";
6
+ import { getOrCreateEventBus } from "../events/eventExecutor.js";
7
+ import { getOrCreateScheduleRunner } from "../schedules/scheduleLoader.js";
8
+ import { getOrCreateMiddlewareResolver, preloadMiddleware, } from "../middleware/middlewareResolver.js";
9
+ import { NextError } from "../middleware/middlewareRunner.js";
10
+ import { getOrCreatePipeline, preloadPipelines, } from "../pipeline/pipelineCache.js";
11
+ import { resolveRoute, preloadRoutes, } from "../router/router.js";
12
+ import { getRouteTable } from "../router/routeTable.js";
13
+ import { getStringifier } from "../json/fastStringify.js";
14
+ import { ValidationError } from "../validation/routeSchema.js";
15
+ import { setBaseLogger, createPrettyLogger, getBaseLogger, } from "../logger/requestLogger.js";
16
+ import { appLogger } from "../utils/logger.js";
17
+ import { defaultErrorHandler } from "./errorHandler.js";
18
+ const runtimeCache = new Map();
19
+ export function clearRuntimeCache(appDir) {
20
+ if (appDir !== undefined) {
21
+ runtimeCache.delete(resolve(appDir));
22
+ }
23
+ else {
24
+ runtimeCache.clear();
25
+ }
26
+ }
27
+ /** Warm runtime so first request gets sync lookup (Fastify-style: ready before accepting connections). */
28
+ export async function warmRuntime(options) {
29
+ const r = getOrCreateRuntime(options);
30
+ if (typeof r.then === "function")
31
+ await r;
32
+ }
33
+ function getOrCreateRuntime(options) {
34
+ const appDir = options.appDir ?? "./src";
35
+ const key = resolve(appDir);
36
+ const cached = runtimeCache.get(key);
37
+ if (cached !== undefined) {
38
+ if (typeof cached.then === "function")
39
+ return cached;
40
+ return cached;
41
+ }
42
+ const promise = (async () => {
43
+ if (options.logger !== undefined) {
44
+ setBaseLogger(options.logger);
45
+ }
46
+ else if (options.dev?.logPretty) {
47
+ setBaseLogger(createPrettyLogger());
48
+ }
49
+ const [eventBus, scheduleRunner] = await Promise.all([
50
+ getOrCreateEventBus(appDir),
51
+ getOrCreateScheduleRunner(appDir),
52
+ ]);
53
+ const tracer = options.tracer
54
+ ? (data) => {
55
+ defaultTracer(data);
56
+ options.tracer(data);
57
+ }
58
+ : defaultTracer;
59
+ const traceStart = options.traceStart
60
+ ? (data) => {
61
+ defaultTraceStart(data);
62
+ options.traceStart(data);
63
+ }
64
+ : defaultTraceStart;
65
+ const runtime = createRuntime({
66
+ appDir: options.appDir,
67
+ plugins: options.plugins ?? [],
68
+ eventBus,
69
+ scheduleRunner,
70
+ tracer,
71
+ traceStart,
72
+ tracing: options.tracing !== false,
73
+ ...(options.contextPool !== undefined && {
74
+ contextPool: options.contextPool,
75
+ }),
76
+ });
77
+ await preloadRoutes(appDir);
78
+ const table = getRouteTable(appDir);
79
+ const byPath = new Map();
80
+ for (const r of table) {
81
+ let fileByMethod = byPath.get(r.pathname);
82
+ if (!fileByMethod) {
83
+ fileByMethod = {};
84
+ byPath.set(r.pathname, fileByMethod);
85
+ }
86
+ fileByMethod[r.method ?? ""] = r.filePath;
87
+ }
88
+ const pathnameMethodPairs = Array.from(byPath.entries()).flatMap(([pathname, fileByMethod]) => Object.keys(fileByMethod).map((method) => ({ pathname, method })));
89
+ await preloadMiddleware(appDir, pathnameMethodPairs);
90
+ const middlewareResolver = getOrCreateMiddlewareResolver(appDir);
91
+ const pipelineEntries = [];
92
+ for (const { pathname, method } of pathnameMethodPairs) {
93
+ const routeResult = resolveRoute(method, pathname, appDir);
94
+ const route = routeResult != null &&
95
+ typeof routeResult.then === "function"
96
+ ? await routeResult
97
+ : routeResult;
98
+ if (!route)
99
+ continue;
100
+ const mwResult = middlewareResolver.resolveForPathname(route.middlewarePath, method);
101
+ const middleware = mwResult != null &&
102
+ typeof mwResult.then === "function"
103
+ ? await mwResult
104
+ : mwResult;
105
+ pipelineEntries.push({
106
+ pathname: route.middlewarePath,
107
+ method,
108
+ route: route.route,
109
+ middleware,
110
+ });
111
+ }
112
+ preloadPipelines(appDir, pipelineEntries);
113
+ runtimeCache.set(key, runtime);
114
+ return runtime;
115
+ })();
116
+ runtimeCache.set(key, promise);
117
+ return promise;
118
+ }
119
+ function defaultTraceStart(data) {
120
+ getBaseLogger()
121
+ .child({ traceId: data.traceId })
122
+ .info({ method: data.method, pathname: data.pathname }, "request started");
123
+ }
124
+ function defaultTracer(data) {
125
+ getBaseLogger()
126
+ .child({ traceId: data.traceId })
127
+ .info({
128
+ method: data.method,
129
+ pathname: data.pathname,
130
+ ...(data.statusCode != null && { statusCode: data.statusCode }),
131
+ durationMs: data.durationMs,
132
+ ...(data.routeId != null && { routeId: data.routeId }),
133
+ ...(data.responseSize != null && { responseSize: data.responseSize }),
134
+ ...(data.error != null && { error: data.error }),
135
+ }, "request completed");
136
+ }
137
+ function toFrameworkResponse(result) {
138
+ if (result && typeof result === "object") {
139
+ const obj = result;
140
+ // Treat as framework Response only when it uses the response shape explicitly.
141
+ if ("json" in obj) {
142
+ return result;
143
+ }
144
+ if ("body" in obj && ("status" in obj || "headers" in obj)) {
145
+ return result;
146
+ }
147
+ }
148
+ return { json: result };
149
+ }
150
+ const HELLO_WORLD_JSON = Buffer.from('{"hello":"world"}', "utf8");
151
+ const NOT_FOUND_MSG = "Route not found";
152
+ const INTERNAL_ERROR_JSON = Buffer.from('{"error":"Internal Server Error"}', "utf8");
153
+ function isHelloWorld(obj) {
154
+ return (obj != null &&
155
+ typeof obj === "object" &&
156
+ !Array.isArray(obj) &&
157
+ "hello" in obj &&
158
+ obj.hello === "world" &&
159
+ Object.keys(obj).length === 1);
160
+ }
161
+ function sendFrameworkResponse(res, response, extraStatus, extraHeaders, responseSchema,
162
+ /** When set, use this for JSON body instead of serializing (avoids double serialize). */
163
+ preSerializedJson) {
164
+ const status = response.status ?? extraStatus ?? 200;
165
+ res.statusCode = status;
166
+ if (extraHeaders) {
167
+ for (const [k, v] of Object.entries(extraHeaders))
168
+ res.setHeader(k, String(v));
169
+ }
170
+ const headers = response.headers ?? {};
171
+ for (const [k, v] of Object.entries(headers))
172
+ res.setHeader(k, v);
173
+ if ("json" in response) {
174
+ if (!res.getHeader("content-type"))
175
+ res.setHeader("content-type", "application/json; charset=utf-8");
176
+ if (status === 200 && isHelloWorld(response.json)) {
177
+ res.end(HELLO_WORLD_JSON);
178
+ return;
179
+ }
180
+ const stringifier = getStringifier(responseSchema, status);
181
+ let payload;
182
+ if (preSerializedJson) {
183
+ payload = preSerializedJson;
184
+ }
185
+ else if (stringifier) {
186
+ try {
187
+ payload = stringifier(response.json);
188
+ }
189
+ catch {
190
+ payload = JSON.stringify(response.json);
191
+ }
192
+ }
193
+ else {
194
+ payload = JSON.stringify(response.json);
195
+ }
196
+ res.end(payload);
197
+ return;
198
+ }
199
+ const body = response.body ?? "";
200
+ res.end(typeof body === "string" ? body : Buffer.from(body));
201
+ }
202
+ export async function handleNodeRequest(req, res, options = {}) {
203
+ const appDir = options.appDir ?? "./src";
204
+ const method = (req.method ?? "GET").toUpperCase();
205
+ const rawUrl = req.url ?? "/";
206
+ const q = rawUrl.indexOf("?");
207
+ const pathnameRaw = q === -1 ? rawUrl : rawUrl.slice(0, q);
208
+ const pathname = pathnameRaw.startsWith("/")
209
+ ? pathnameRaw
210
+ : "/" + pathnameRaw;
211
+ const runtimeOrPromise = getOrCreateRuntime(options);
212
+ const runtime = typeof runtimeOrPromise.then === "function"
213
+ ? (await runtimeOrPromise)
214
+ : runtimeOrPromise;
215
+ const ctx = runtime.createRequestContext(req, res);
216
+ if (method === "GET" || method === "HEAD") {
217
+ ctx.body = null;
218
+ }
219
+ else {
220
+ const maxBodySize = options.maxBodySize ?? 1_000_000;
221
+ const parseResult = await parseBody(req, maxBodySize);
222
+ if (!parseResult.ok) {
223
+ res.statusCode = parseResult.status;
224
+ res.setHeader("content-type", "application/json; charset=utf-8");
225
+ res.end(JSON.stringify(parseResult.body));
226
+ return;
227
+ }
228
+ ctx.body = parseResult.body;
229
+ }
230
+ if (runtime.hasPlugins)
231
+ await runtime.runHook("onRequest", ctx);
232
+ const corsConfig = options.cors ?? {};
233
+ if (shouldRejectCorsRequest(corsConfig, req)) {
234
+ const rawOrigin = req.headers.origin;
235
+ const requestOrigin = typeof rawOrigin === "string"
236
+ ? rawOrigin
237
+ : Array.isArray(rawOrigin)
238
+ ? (rawOrigin[0] ?? "unknown")
239
+ : "unknown";
240
+ res.statusCode = 403;
241
+ res.setHeader("content-type", "application/json; charset=utf-8");
242
+ res.end(JSON.stringify({
243
+ error: `CORS policy violation: origin "${requestOrigin}" is not allowed.`,
244
+ code: "CORS_ORIGIN_NOT_ALLOWED",
245
+ hint: "Add this origin to `cors.origin`",
246
+ }));
247
+ return;
248
+ }
249
+ const corsHeaders = getCorsHeaders(corsConfig, req);
250
+ for (const [k, v] of Object.entries(corsHeaders))
251
+ res.setHeader(k, v);
252
+ if (method === "OPTIONS") {
253
+ res.statusCode = 204;
254
+ res.end();
255
+ return;
256
+ }
257
+ ctx.__traceSpan?.start({ method, pathname });
258
+ const routeResult = resolveRoute(method, pathname, appDir);
259
+ const route = (routeResult != null &&
260
+ typeof routeResult.then === "function"
261
+ ? await routeResult
262
+ : routeResult);
263
+ const matchedRouteId = route != null
264
+ ? (route.route?.routeId ??
265
+ route.routeId ??
266
+ null)
267
+ : null;
268
+ let pathnameForMiddleware;
269
+ let middleware;
270
+ if (route) {
271
+ ctx.params = route.params;
272
+ const loaded = route.route;
273
+ const mergedResponseSchema = loaded.responseSchema
274
+ ? { ...(options.responses ?? {}), ...loaded.responseSchema }
275
+ : options.responses;
276
+ if (ctx.__responseSchemaRef && mergedResponseSchema !== undefined)
277
+ ctx.__responseSchemaRef.current = mergedResponseSchema;
278
+ if (ctx.__defaultStatusRef && mergedResponseSchema !== undefined)
279
+ ctx.__defaultStatusRef.current =
280
+ getDefaultStatusFromSchema(mergedResponseSchema);
281
+ if (runtime.hasPlugins)
282
+ await runtime.runHook("onRouteMatch", ctx);
283
+ pathnameForMiddleware = route.middlewarePath;
284
+ const middlewareResolver = getOrCreateMiddlewareResolver(appDir);
285
+ const middlewareResult = middlewareResolver.resolveForPathname(pathnameForMiddleware, method);
286
+ middleware = (middlewareResult != null &&
287
+ typeof middlewareResult.then === "function"
288
+ ? await middlewareResult
289
+ : middlewareResult);
290
+ if (runtime.hasPlugins) {
291
+ await runtime.runHook("onMiddlewareResolved", ctx, {
292
+ pathname: pathnameForMiddleware,
293
+ method,
294
+ count: middleware.length,
295
+ });
296
+ }
297
+ }
298
+ else {
299
+ pathnameForMiddleware = pathname;
300
+ middleware = [];
301
+ }
302
+ let requestError;
303
+ try {
304
+ let handlerResult;
305
+ if (runtime.hasPlugins)
306
+ await runtime.runHook("beforeHandler", ctx);
307
+ if (route) {
308
+ const pipeline = getOrCreatePipeline(appDir, pathnameForMiddleware, method, route.route, middleware);
309
+ const raw = pipeline(ctx);
310
+ handlerResult =
311
+ raw != null && typeof raw.then === "function"
312
+ ? await raw
313
+ : raw;
314
+ }
315
+ else {
316
+ handlerResult = {
317
+ status: 404,
318
+ json: { error: NOT_FOUND_MSG, method, pathname },
319
+ };
320
+ }
321
+ if (runtime.hasPlugins)
322
+ await runtime.runHook("afterHandler", ctx, handlerResult);
323
+ if (ctx.res.sent) {
324
+ // User already sent via ctx.res.json(), ctx.res.send(), etc.
325
+ }
326
+ else {
327
+ if (!ctx.res.sent) {
328
+ if (runtime.hasPlugins)
329
+ await runtime.runHook("beforeResponse", ctx);
330
+ const response = toFrameworkResponse(handlerResult);
331
+ const mergedResponseSchema = route && ctx.__responseSchemaRef?.current !== undefined
332
+ ? ctx.__responseSchemaRef.current
333
+ : options.responses;
334
+ const statusCode = ctx.res.statusCode ?? 200;
335
+ let preSerializedJson;
336
+ if ("json" in response) {
337
+ if (statusCode === 200 && isHelloWorld(response.json)) {
338
+ if (ctx.__responseSizeRef)
339
+ ctx.__responseSizeRef.current = HELLO_WORLD_JSON.length;
340
+ }
341
+ else {
342
+ const stringifier = getStringifier(mergedResponseSchema, statusCode);
343
+ if (stringifier) {
344
+ try {
345
+ preSerializedJson = stringifier(response.json);
346
+ }
347
+ catch {
348
+ preSerializedJson = JSON.stringify(response.json);
349
+ }
350
+ }
351
+ else {
352
+ preSerializedJson = JSON.stringify(response.json);
353
+ }
354
+ if (ctx.__responseSizeRef && preSerializedJson)
355
+ ctx.__responseSizeRef.current =
356
+ Buffer.byteLength(preSerializedJson);
357
+ }
358
+ }
359
+ else if (ctx.__responseSizeRef && "body" in response) {
360
+ const b = response.body;
361
+ ctx.__responseSizeRef.current =
362
+ b === undefined
363
+ ? 0
364
+ : typeof b === "string"
365
+ ? Buffer.byteLength(b)
366
+ : b.length;
367
+ }
368
+ sendFrameworkResponse(res, response, ctx.res.statusCode, ctx.res.headers, mergedResponseSchema, preSerializedJson);
369
+ }
370
+ }
371
+ }
372
+ catch (err) {
373
+ requestError = err;
374
+ if (err instanceof ValidationError) {
375
+ if (!ctx.res.sent) {
376
+ res.statusCode = err.status;
377
+ res.setHeader("content-type", "application/json; charset=utf-8");
378
+ res.end(JSON.stringify(err.json));
379
+ }
380
+ return;
381
+ }
382
+ const actualErr = err instanceof NextError ? err.error : err;
383
+ if (runtime.hasPlugins)
384
+ await runtime.runHook("onError", ctx, actualErr).catch(() => { });
385
+ const errorHandler = options.errorHandler ?? defaultErrorHandler;
386
+ try {
387
+ if (!ctx.res.sent && runtime.hasPlugins)
388
+ await runtime.runHook("beforeResponse", ctx);
389
+ const result = await errorHandler(ctx, actualErr);
390
+ if (!ctx.res.sent && result != null && typeof result === "object") {
391
+ const status = "status" in result ? result.status : 500;
392
+ const headers = "headers" in result ? result.headers : undefined;
393
+ if ("json" in result) {
394
+ res.statusCode = status ?? 500;
395
+ if (headers)
396
+ for (const [k, v] of Object.entries(headers))
397
+ res.setHeader(k, String(v));
398
+ if (!res.getHeader("content-type"))
399
+ res.setHeader("content-type", "application/json; charset=utf-8");
400
+ res.end(JSON.stringify(result.json));
401
+ }
402
+ else if ("body" in result) {
403
+ res.statusCode = status ?? 500;
404
+ if (headers)
405
+ for (const [k, v] of Object.entries(headers))
406
+ res.setHeader(k, String(v));
407
+ const body = result.body ?? "";
408
+ res.end(typeof body === "string" ? body : Buffer.from(body));
409
+ }
410
+ }
411
+ }
412
+ catch (handlerErr) {
413
+ if (!ctx.res.sent) {
414
+ res.statusCode = 500;
415
+ res.setHeader("content-type", "application/json; charset=utf-8");
416
+ res.end(INTERNAL_ERROR_JSON);
417
+ }
418
+ appLogger.error(handlerErr);
419
+ }
420
+ }
421
+ finally {
422
+ const span = ctx.__traceSpan;
423
+ if (span) {
424
+ span.annotate("statusCode", res.statusCode);
425
+ span.annotate("routeId", matchedRouteId);
426
+ span.annotate("responseSize", ctx.__responseSizeRef?.current ?? 0);
427
+ if (requestError !== undefined) {
428
+ const actualErr = requestError instanceof NextError ? requestError.error : requestError;
429
+ span.annotate("error", actualErr instanceof Error ? actualErr.message : String(actualErr));
430
+ }
431
+ span.end();
432
+ }
433
+ if (runtime.hasPlugins)
434
+ await runtime.runHook("afterResponse", ctx);
435
+ if (runtime.contextPool)
436
+ releaseContext(ctx);
437
+ }
438
+ }
439
+ //# sourceMappingURL=requestHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestHandler.js","sourceRoot":"","sources":["../../../src/server/requestHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type RequestHandlerOptions } from "./requestHandler.js";
3
+ import { type LegonodeConfig } from "../config/loadConfig.js";
4
+ export type NodeServerOptions = RequestHandlerOptions & {
5
+ port?: number;
6
+ hostname?: string;
7
+ onListen?: (info: {
8
+ port: number;
9
+ hostname: string;
10
+ }) => void;
11
+ appDir?: string;
12
+ };
13
+ export declare function createNodeServer(options?: NodeServerOptions): {
14
+ server: import("http").Server<typeof IncomingMessage, typeof ServerResponse>;
15
+ listen: () => Promise<void>;
16
+ close: () => Promise<void>;
17
+ isListening: boolean;
18
+ };
19
+ export declare function setupServer(config: LegonodeConfig, cwd: string, appDir: string, port: number, host: string): ReturnType<typeof createNodeServer> | null;
20
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,GAAG;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAGF,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB;;;;;EAsD/D;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAAG,IAAI,CAe5C"}
@@ -0,0 +1,74 @@
1
+ import { createServer } from "node:http";
2
+ import { handleNodeRequest, warmRuntime, } from "./requestHandler.js";
3
+ import { getRequestHandlerOptionsFromConfig, } from "../config/loadConfig.js";
4
+ import { getRouteTable } from "../router/routeTable.js";
5
+ import { appLogger } from "../utils/logger.js";
6
+ export function createNodeServer(options = {}) {
7
+ const port = options.port ?? 3000;
8
+ const hostname = options.hostname ?? "127.0.0.1";
9
+ let isListening = false;
10
+ const server = createServer((req, res) => {
11
+ handleNodeRequest(req, res, options);
12
+ });
13
+ async function listen() {
14
+ if (isListening)
15
+ return;
16
+ await warmRuntime(options);
17
+ return new Promise((resolve, reject) => {
18
+ if (isListening)
19
+ return;
20
+ server.listen(port);
21
+ server.once("listening", () => {
22
+ isListening = true;
23
+ options.onListen?.({ port, hostname });
24
+ resolve();
25
+ });
26
+ server.once("error", (err) => {
27
+ if (err.code === "EADDRINUSE") {
28
+ appLogger.error(`Port ${port} is already in use`);
29
+ resolve();
30
+ }
31
+ else {
32
+ reject(err);
33
+ }
34
+ });
35
+ });
36
+ }
37
+ async function close() {
38
+ if (!isListening)
39
+ return;
40
+ return new Promise((resolve, reject) => {
41
+ server.close((err) => {
42
+ isListening = false;
43
+ if (err)
44
+ reject(err);
45
+ else
46
+ resolve();
47
+ });
48
+ });
49
+ }
50
+ return {
51
+ server,
52
+ listen,
53
+ close,
54
+ isListening,
55
+ };
56
+ }
57
+ export function setupServer(config, cwd, appDir, port, host) {
58
+ try {
59
+ getRouteTable(appDir);
60
+ return createNodeServer({
61
+ ...getRequestHandlerOptionsFromConfig(config, cwd, { appDir }),
62
+ port,
63
+ hostname: host,
64
+ onListen: ({ hostname, port: p }) => {
65
+ appLogger.info(`legonode dev listening on http://${hostname}:${p}`);
66
+ },
67
+ });
68
+ }
69
+ catch (error) {
70
+ appLogger.error("Failed to setup server\n", error.message);
71
+ }
72
+ return null;
73
+ }
74
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type ScheduledTask = {
2
+ name: string;
3
+ cron: string;
4
+ run: () => Promise<void> | void;
5
+ };
6
+ export declare function createScheduler(): {
7
+ register: (task: ScheduledTask) => void;
8
+ list: () => ScheduledTask[];
9
+ };
10
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/tasks/scheduler.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,wBAAgB,eAAe;qBAIV,aAAa;;EAKjC"}
@@ -0,0 +1,10 @@
1
+ export function createScheduler() {
2
+ const tasks = [];
3
+ return {
4
+ register: (task) => {
5
+ tasks.push(task);
6
+ },
7
+ list: () => tasks.slice()
8
+ };
9
+ }
10
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/tasks/scheduler.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,OAAO;QACL,QAAQ,EAAE,CAAC,IAAmB,EAAE,EAAE;YAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ScheduledTask } from "./scheduler.js";
2
+ export declare function runTask(task: ScheduledTask): Promise<void>;
3
+ //# sourceMappingURL=taskRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskRunner.d.ts","sourceRoot":"","sources":["../../../src/tasks/taskRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,wBAAsB,OAAO,CAAC,IAAI,EAAE,aAAa,iBAEhD"}