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,293 @@
1
+ import { getNoopLogger } from "../logger/requestLogger.js";
2
+ /** Pick default status when handler does not call res.status(): prefer 200, then 201, then 204; else 200. */
3
+ export function getDefaultStatusFromSchema(schema) {
4
+ if (!schema || typeof schema !== "object")
5
+ return 200;
6
+ const keys = Object.keys(schema)
7
+ .map(Number)
8
+ .filter((k) => !Number.isNaN(k));
9
+ if (keys.length === 0)
10
+ return 200;
11
+ if (keys.includes(200))
12
+ return 200;
13
+ if (keys.includes(201))
14
+ return 201;
15
+ if (keys.includes(204))
16
+ return 204;
17
+ return 200;
18
+ }
19
+ function createLegonodeResponse(nodeRes, defaultStatusRef, responseSizeRef, beforeSend, ctxRef) {
20
+ const state = {
21
+ nodeRes,
22
+ defaultStatusRef,
23
+ responseSizeRef,
24
+ sent: false,
25
+ explicitStatus: null,
26
+ headers: Object.create(null),
27
+ };
28
+ function effectiveStatus() {
29
+ return state.explicitStatus ?? state.defaultStatusRef.current;
30
+ }
31
+ function applyHeaders() {
32
+ for (const [k, v] of Object.entries(state.headers)) {
33
+ state.nodeRes.setHeader(k, String(v));
34
+ }
35
+ }
36
+ function doSend(body) {
37
+ state.sent = true;
38
+ if (state.responseSizeRef) {
39
+ state.responseSizeRef.current =
40
+ body === undefined ? 0 : Buffer.isBuffer(body) ? body.length : typeof body === "string" ? Buffer.byteLength(body) : body.length;
41
+ }
42
+ state.nodeRes.statusCode = effectiveStatus();
43
+ applyHeaders();
44
+ if (body !== undefined) {
45
+ state.nodeRes.end(Buffer.isBuffer(body) ? body : typeof body === "string" ? body : Buffer.from(body));
46
+ }
47
+ else {
48
+ state.nodeRes.end();
49
+ }
50
+ }
51
+ function end(body) {
52
+ if (state.sent)
53
+ return;
54
+ if (beforeSend && ctxRef?.current) {
55
+ const c = ctxRef;
56
+ return (async () => {
57
+ await beforeSend(c.current);
58
+ if (state.sent)
59
+ return;
60
+ doSend(body);
61
+ })();
62
+ }
63
+ doSend(body);
64
+ }
65
+ function sendJson(data) {
66
+ if (state.sent)
67
+ return;
68
+ state.nodeRes.setHeader("content-type", "application/json; charset=utf-8");
69
+ return end(JSON.stringify(data));
70
+ }
71
+ const chain = {
72
+ json(data) {
73
+ return sendJson(data);
74
+ },
75
+ send(body) {
76
+ return end(body);
77
+ },
78
+ text(body) {
79
+ if (state.sent)
80
+ return;
81
+ state.nodeRes.setHeader("content-type", "text/plain; charset=utf-8");
82
+ return end(body);
83
+ },
84
+ html(body) {
85
+ if (state.sent)
86
+ return;
87
+ state.nodeRes.setHeader("content-type", "text/html; charset=utf-8");
88
+ return end(body);
89
+ }
90
+ };
91
+ function doRedirect(url, code) {
92
+ state.explicitStatus = code;
93
+ if (state.responseSizeRef)
94
+ state.responseSizeRef.current = 0;
95
+ state.nodeRes.setHeader("location", url);
96
+ applyHeaders();
97
+ state.sent = true;
98
+ state.nodeRes.statusCode = effectiveStatus();
99
+ state.nodeRes.end();
100
+ }
101
+ function redirect(url, code = 302) {
102
+ if (state.sent)
103
+ return;
104
+ if (beforeSend && ctxRef?.current) {
105
+ const c = ctxRef;
106
+ return (async () => {
107
+ await beforeSend(c.current);
108
+ if (state.sent)
109
+ return;
110
+ doRedirect(url, code);
111
+ })();
112
+ }
113
+ doRedirect(url, code);
114
+ }
115
+ function doStream(readable) {
116
+ state.sent = true;
117
+ if (state.responseSizeRef)
118
+ state.responseSizeRef.current = 0;
119
+ state.nodeRes.statusCode = effectiveStatus();
120
+ applyHeaders();
121
+ readable.pipe(state.nodeRes);
122
+ }
123
+ function stream(readable) {
124
+ if (state.sent)
125
+ return;
126
+ if (beforeSend && ctxRef?.current) {
127
+ const c = ctxRef;
128
+ return (async () => {
129
+ await beforeSend(c.current);
130
+ if (state.sent)
131
+ return;
132
+ doStream(readable);
133
+ })();
134
+ }
135
+ doStream(readable);
136
+ }
137
+ const res = {
138
+ get raw() {
139
+ return state.nodeRes;
140
+ },
141
+ status(code) {
142
+ state.explicitStatus = code;
143
+ return chain;
144
+ },
145
+ get headers() {
146
+ return state.headers;
147
+ },
148
+ setHeader(name, value) {
149
+ state.headers[name.toLowerCase()] = value;
150
+ },
151
+ send(body) {
152
+ return end(body);
153
+ },
154
+ html(body) {
155
+ if (state.sent)
156
+ return;
157
+ state.nodeRes.setHeader("content-type", "text/html; charset=utf-8");
158
+ return end(body);
159
+ },
160
+ json(data) {
161
+ return sendJson(data);
162
+ },
163
+ text(body) {
164
+ if (state.sent)
165
+ return;
166
+ state.nodeRes.setHeader("content-type", "text/plain; charset=utf-8");
167
+ return end(body);
168
+ },
169
+ redirect,
170
+ stream,
171
+ get sent() {
172
+ return state.sent;
173
+ },
174
+ get statusCode() {
175
+ return effectiveStatus();
176
+ },
177
+ reinit(n, d, r) {
178
+ state.nodeRes = n;
179
+ state.defaultStatusRef = d;
180
+ state.responseSizeRef = r;
181
+ state.sent = false;
182
+ state.explicitStatus = null;
183
+ for (const k of Object.keys(state.headers))
184
+ delete state.headers[k];
185
+ }
186
+ };
187
+ return res;
188
+ }
189
+ const ctxPool = [];
190
+ const EMPTY_PARAMS = Object.create(null);
191
+ /** Parse query string to a plain object (no URLSearchParams allocation; null prototype). */
192
+ function parseQuery(search) {
193
+ const obj = Object.create(null);
194
+ if (!search.length)
195
+ return obj;
196
+ let start = 0;
197
+ while (start < search.length) {
198
+ const eq = search.indexOf("=", start);
199
+ const amp = search.indexOf("&", start);
200
+ const end = amp === -1 ? search.length : amp;
201
+ const key = decodeURIComponent(search.slice(start, eq === -1 ? end : eq).replace(/\+/g, " "));
202
+ const value = eq === -1 || eq >= end
203
+ ? ""
204
+ : decodeURIComponent(search.slice(eq + 1, end).replace(/\+/g, " "));
205
+ if (key.length)
206
+ obj[key] = value;
207
+ start = amp === -1 ? search.length : amp + 1;
208
+ }
209
+ return obj;
210
+ }
211
+ function parseQueryFromReq(req) {
212
+ const raw = req.url ?? "/";
213
+ const i = raw.indexOf("?");
214
+ const search = i === -1 ? "" : raw.slice(i + 1);
215
+ return parseQuery(search);
216
+ }
217
+ function allocContext(req, res, beforeSend) {
218
+ const responseSchemaRef = {};
219
+ const defaultStatusRef = { current: 200 };
220
+ const responseSizeRef = { current: 0 };
221
+ const ctxRef = { current: null };
222
+ const ctx = {
223
+ req,
224
+ res: createLegonodeResponse(res, defaultStatusRef, responseSizeRef, beforeSend, ctxRef),
225
+ __responseSchemaRef: responseSchemaRef,
226
+ __defaultStatusRef: defaultStatusRef,
227
+ __responseSizeRef: responseSizeRef,
228
+ params: Object.create(null),
229
+ get query() {
230
+ if (ctx.__queryCache === undefined) {
231
+ ctx.__queryCache = parseQueryFromReq(ctx.req);
232
+ }
233
+ return ctx.__queryCache;
234
+ },
235
+ set query(v) {
236
+ ctx.__queryCache = v;
237
+ },
238
+ body: null,
239
+ state: Object.create(null),
240
+ emit: () => { },
241
+ schedule: () => { },
242
+ logger: getNoopLogger(),
243
+ log: { state: [] },
244
+ trace: { get traceId() { return ""; } },
245
+ __ctxRef: ctxRef,
246
+ };
247
+ ctxRef.current = ctx;
248
+ return ctx;
249
+ }
250
+ function reinitContext(ctx, req, res, beforeSend) {
251
+ const defaultStatusRef = ctx.__defaultStatusRef;
252
+ const responseSizeRef = ctx.__responseSizeRef;
253
+ defaultStatusRef.current = 200;
254
+ responseSizeRef.current = 0;
255
+ ctx.req = req;
256
+ if (ctx.__ctxRef)
257
+ ctx.__ctxRef.current = ctx;
258
+ if (ctx.res.reinit) {
259
+ ctx.res.reinit(res, defaultStatusRef, responseSizeRef);
260
+ }
261
+ else {
262
+ const ctxRef = ctx.__ctxRef ?? { current: ctx };
263
+ ctx.res = createLegonodeResponse(res, defaultStatusRef, responseSizeRef, beforeSend, ctxRef);
264
+ }
265
+ ctx.params = Object.create(null);
266
+ ctx.body = null;
267
+ delete ctx.__queryCache;
268
+ ctx.state = Object.create(null);
269
+ ctx.log.state = [];
270
+ return ctx;
271
+ }
272
+ /** Get context from pool or create new. Use releaseContext(ctx) in finally when done. When usePool is false, always alloc (faster hot path for hello-world). */
273
+ export function getContext(req, res, usePool = false, beforeSend) {
274
+ if (!usePool)
275
+ return allocContext(req, res, beforeSend);
276
+ const recycled = ctxPool.pop();
277
+ if (recycled)
278
+ return reinitContext(recycled, req, res, beforeSend);
279
+ return allocContext(req, res, beforeSend);
280
+ }
281
+ /** Return context to pool. Call in request handler finally. Keeps ctx.res for reuse via reinit. */
282
+ export function releaseContext(ctx) {
283
+ ctx.req = null;
284
+ ctx.params = EMPTY_PARAMS;
285
+ ctx.body = null;
286
+ delete ctx.__queryCache;
287
+ ctx.state = Object.create(null);
288
+ ctx.log.state = [];
289
+ ctxPool.push(ctx);
290
+ }
291
+ /** Get a request context (from pool when possible). Same as getContext; exported for backwards compatibility. */
292
+ export const createContext = getContext;
293
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const lifecycleStages: readonly ["requestReceived", "createContext", "traceStart", "globalMiddleware", "routeMatch", "routeMiddleware", "handler", "emitEvents", "responseTransform", "sendResponse", "traceEnd"];
2
+ export type LifecycleStage = (typeof lifecycleStages)[number];
3
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,4LAYlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const lifecycleStages = [
2
+ "requestReceived",
3
+ "createContext",
4
+ "traceStart",
5
+ "globalMiddleware",
6
+ "routeMatch",
7
+ "routeMiddleware",
8
+ "handler",
9
+ "emitEvents",
10
+ "responseTransform",
11
+ "sendResponse",
12
+ "traceEnd"
13
+ ];
14
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB;IACjB,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,UAAU;CACF,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type LegonodeContext } from "./context.js";
3
+ import type { EventBus } from "../events/eventBus.js";
4
+ import type { LegonodePlugin } from "../plugin/pluginAPI.js";
5
+ import type { TracerFn, TraceStartFn } from "../trace/traceEngine.js";
6
+ import type { ScheduleRunnerFn } from "../schedules/scheduleLoader.js";
7
+ export type RuntimeOptions = {
8
+ appDir?: string | undefined;
9
+ plugins?: LegonodePlugin[];
10
+ eventBus?: EventBus;
11
+ scheduleRunner?: ScheduleRunnerFn;
12
+ tracer?: TracerFn;
13
+ traceStart?: TraceStartFn;
14
+ /** When false, disable tracer/traceStart callbacks (default: true). Logger always has traceId for correlation. */
15
+ tracing?: boolean;
16
+ /** When true, reuse context objects from a pool (can reduce GC; enable for long-lived servers with many routes). */
17
+ contextPool?: boolean;
18
+ };
19
+ export declare function createRuntime(options?: RuntimeOptions): {
20
+ createRequestContext: (req: IncomingMessage, res: ServerResponse) => LegonodeContext;
21
+ events: EventBus;
22
+ hasPlugins: boolean;
23
+ contextPool: boolean;
24
+ tracing: boolean;
25
+ runHook: (hook: keyof LegonodePlugin, ...args: unknown[]) => Promise<void>;
26
+ };
27
+ export type Runtime = ReturnType<typeof createRuntime>;
28
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAIhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAa,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,kHAAkH;IAClH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oHAAoH;IACpH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB;gCAcrB,eAAe,OAAO,cAAc;;;;;;EAwFxE;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { getContext } from "./context.js";
2
+ import { createTraceSpan } from "../trace/traceEngine.js";
3
+ import { createRequestLogger } from "../logger/requestLogger.js";
4
+ import { createEventBus } from "../events/eventBus.js";
5
+ import { createPluginManager } from "../plugin/pluginManager.js";
6
+ export function createRuntime(options = {}) {
7
+ const events = options.eventBus ?? createEventBus();
8
+ const scheduleRunner = options.scheduleRunner ?? (() => { });
9
+ const plugins = options.plugins ?? [];
10
+ const pluginManager = createPluginManager(plugins);
11
+ const useTracing = options.tracing !== false &&
12
+ process.env.LEGONODE_SKIP_TRACING !== "1" &&
13
+ process.env.LEGONODE_SKIP_TRACING !== "true";
14
+ const tracer = useTracing ? options.tracer : undefined;
15
+ const traceStart = useTracing ? options.traceStart : undefined;
16
+ const hasPlugins = plugins.length > 0;
17
+ const contextPool = options.contextPool === true;
18
+ function createRequestContext(req, res) {
19
+ const beforeSend = hasPlugins
20
+ ? (ctx) => pluginManager.runHook("beforeResponse", ctx)
21
+ : undefined;
22
+ const ctx = getContext(req, res, contextPool, beforeSend);
23
+ const requestTraceStart = traceStart
24
+ ? (data) => {
25
+ traceStart(data);
26
+ ctx.log.state.push({
27
+ level: "info",
28
+ args: [{ method: data.method, pathname: data.pathname }, "request started"],
29
+ timestamp: data.startTime
30
+ });
31
+ }
32
+ : undefined;
33
+ const requestTracer = tracer
34
+ ? (data) => {
35
+ tracer(data);
36
+ ctx.log.state.push({
37
+ level: "info",
38
+ args: [
39
+ {
40
+ method: data.method,
41
+ pathname: data.pathname,
42
+ ...(data.statusCode != null && { statusCode: data.statusCode }),
43
+ durationMs: data.durationMs,
44
+ ...(data.routeId != null && { routeId: data.routeId }),
45
+ ...(data.responseSize != null && { responseSize: data.responseSize }),
46
+ ...(data.error != null && { error: data.error })
47
+ },
48
+ "request completed"
49
+ ],
50
+ timestamp: data.endTime
51
+ });
52
+ }
53
+ : undefined;
54
+ const span = createTraceSpan(requestTracer, requestTraceStart);
55
+ ctx.log.state = [];
56
+ ctx.logger = createRequestLogger(span.traceId, undefined, ctx.log.state);
57
+ ctx.trace = { get traceId() { return span.traceId; } };
58
+ ctx.__traceSpan = span;
59
+ ctx.emit = (name, payload) => {
60
+ if (hasPlugins) {
61
+ void pluginManager.runHook("onEventEmit", ctx, { name, payload });
62
+ }
63
+ events.emit(name, payload, {
64
+ traceId: span.traceId,
65
+ logger: ctx.logger,
66
+ eventName: name
67
+ });
68
+ };
69
+ ctx.schedule = (name, payload) => {
70
+ if (hasPlugins) {
71
+ void pluginManager.runHook("onCronRun", ctx, {
72
+ name,
73
+ payload,
74
+ source: "manual"
75
+ });
76
+ }
77
+ const result = scheduleRunner(name, payload);
78
+ if (result && typeof result.then === "function") {
79
+ return result.catch((error) => {
80
+ if (hasPlugins) {
81
+ void pluginManager.runHook("onCronError", ctx, {
82
+ name,
83
+ payload,
84
+ source: "manual",
85
+ error
86
+ });
87
+ }
88
+ throw error;
89
+ });
90
+ }
91
+ return result;
92
+ };
93
+ return ctx;
94
+ }
95
+ return {
96
+ createRequestContext,
97
+ events,
98
+ hasPlugins,
99
+ contextPool,
100
+ tracing: useTracing,
101
+ runHook: pluginManager.runHook.bind(pluginManager)
102
+ };
103
+ }
104
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ import type { CorsConfig } from "../config/loadConfig.js";
3
+ export declare function shouldRejectCorsRequest(cors: CorsConfig | boolean, req: IncomingMessage): boolean;
4
+ export declare function getCorsHeaders(cors: CorsConfig | boolean, req: IncomingMessage): Record<string, string>;
5
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../src/cors/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAqD1D,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAKjG;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB"}
@@ -0,0 +1,75 @@
1
+ const DEFAULT_METHODS = ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "OPTIONS"];
2
+ const DEFAULT_HEADERS = ["content-type", "authorization", "accept"];
3
+ function getRequestOrigin(req) {
4
+ const raw = req.headers.origin;
5
+ if (typeof raw === "string")
6
+ return raw;
7
+ if (Array.isArray(raw))
8
+ return raw[0] ?? null;
9
+ return null;
10
+ }
11
+ function isOriginAllowed(config, req) {
12
+ const origin = getRequestOrigin(req);
13
+ const cfg = config.origin || [];
14
+ if (!origin) {
15
+ // Non-browser or same-origin requests usually don't send Origin.
16
+ return true;
17
+ }
18
+ if (cfg === undefined || cfg === true) {
19
+ return true;
20
+ }
21
+ if (typeof cfg === "string") {
22
+ return cfg === origin;
23
+ }
24
+ if (Array.isArray(cfg)) {
25
+ return cfg.includes(origin);
26
+ }
27
+ return false;
28
+ }
29
+ function resolveOrigin(config, req) {
30
+ const origin = getRequestOrigin(req);
31
+ if (!isOriginAllowed(config, req))
32
+ return null;
33
+ const cfg = config.origin;
34
+ if (cfg === undefined || cfg === true) {
35
+ return origin;
36
+ }
37
+ if (cfg === false) {
38
+ return null;
39
+ }
40
+ if (typeof cfg === "string") {
41
+ return cfg;
42
+ }
43
+ if (Array.isArray(cfg)) {
44
+ // Allowed when list contains request origin.
45
+ return origin;
46
+ }
47
+ return null;
48
+ }
49
+ export function shouldRejectCorsRequest(cors, req) {
50
+ const config = typeof cors === "boolean" ? {} : cors;
51
+ const origin = getRequestOrigin(req);
52
+ if (!origin)
53
+ return false;
54
+ return !isOriginAllowed(config, req);
55
+ }
56
+ export function getCorsHeaders(cors, req) {
57
+ const config = typeof cors === "boolean" ? {} : cors;
58
+ const allowOrigin = resolveOrigin(config, req);
59
+ if (!allowOrigin)
60
+ return {};
61
+ const headers = {
62
+ "Access-Control-Allow-Origin": allowOrigin
63
+ };
64
+ const methods = config.methods ?? DEFAULT_METHODS;
65
+ headers["Access-Control-Allow-Methods"] = Array.isArray(methods) ? methods.join(", ") : methods;
66
+ const allowedHeaders = config.allowedHeaders ?? DEFAULT_HEADERS;
67
+ headers["Access-Control-Allow-Headers"] = Array.isArray(allowedHeaders)
68
+ ? allowedHeaders.join(", ")
69
+ : allowedHeaders;
70
+ if (config.credentials === true) {
71
+ headers["Access-Control-Allow-Credentials"] = "true";
72
+ }
73
+ return headers;
74
+ }
75
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../src/cors/cors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { LegonodeLogger } from "../logger/requestLogger.js";
2
+ export type EventEmitterFn = (name: string, payload?: unknown) => void;
3
+ /** Context passed to event handlers for tracing and logging. Ties event execution to the request that emitted it. */
4
+ export type EventContext = {
5
+ /** Trace id of the request that emitted the event (empty when emitted outside a request, e.g. cron). */
6
+ traceId: string;
7
+ /** Logger with traceId in bindings so logs from the handler correlate with the API call. */
8
+ logger: LegonodeLogger;
9
+ /** Event name (e.g. "user.created"). */
10
+ eventName: string;
11
+ };
12
+ export type EventHandler = (payload: unknown, ctx: EventContext) => void | Promise<void>;
13
+ export type EventBus = {
14
+ on: (name: string, handler: EventHandler) => void;
15
+ /** Emit with optional event context (set by framework when called from request ctx.emit). */
16
+ emit: (name: string, payload?: unknown, eventCtx?: EventContext) => void;
17
+ };
18
+ export declare function createEventBus(): EventBus;
19
+ //# sourceMappingURL=eventBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventBus.d.ts","sourceRoot":"","sources":["../../../src/events/eventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEvE,qHAAqH;AACrH,MAAM,MAAM,YAAY,GAAG;IACzB,wGAAwG;IACxG,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,MAAM,EAAE,cAAc,CAAC;IACvB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD,6FAA6F;IAC7F,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1E,CAAC;AAUF,wBAAgB,cAAc,IAAI,QAAQ,CAmBzC"}
@@ -0,0 +1,29 @@
1
+ import { getBaseLogger } from "../logger/requestLogger.js";
2
+ function defaultEventContext(eventName) {
3
+ return {
4
+ traceId: "",
5
+ logger: getBaseLogger().child({ eventName }),
6
+ eventName
7
+ };
8
+ }
9
+ export function createEventBus() {
10
+ const handlers = new Map();
11
+ return {
12
+ on: (name, handler) => {
13
+ const list = handlers.get(name) ?? [];
14
+ list.push(handler);
15
+ handlers.set(name, list);
16
+ },
17
+ emit: (name, payload, eventCtx) => {
18
+ const list = handlers.get(name) ?? [];
19
+ if (list.length === 0) {
20
+ console.warn(`[Event] event not found: "${name}"`);
21
+ return;
22
+ }
23
+ const ctx = eventCtx ?? defaultEventContext(name);
24
+ for (const handler of list)
25
+ void handler(payload, ctx);
26
+ }
27
+ };
28
+ }
29
+ //# sourceMappingURL=eventBus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventBus.js","sourceRoot":"","sources":["../../../src/events/eventBus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAsB3D,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO;QACL,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;QAC5C,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,GAAG,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClD,KAAK,MAAM,OAAO,IAAI,IAAI;gBAAE,KAAK,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EventBus } from "./eventBus.js";
2
+ export declare function getOrCreateEventBus(appDir: string): Promise<EventBus>;
3
+ export declare function clearEventBusCache(appDir?: string): void;
4
+ export declare function registerEventHandlersFromApp(bus: EventBus, appDir: string): Promise<void>;
5
+ //# sourceMappingURL=eventExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventExecutor.d.ts","sourceRoot":"","sources":["../../../src/events/eventExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AAI5D,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQ3E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxD;AAuBD,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC/F"}