silgi 0.42.5 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/dist/_virtual/rolldown_runtime.mjs +11 -0
  2. package/dist/build.d.mts +3 -11
  3. package/dist/build.mjs +4 -48
  4. package/dist/cli/build/build.mjs +17 -0
  5. package/dist/cli/build/dev.d.mts +9 -0
  6. package/dist/cli/build/dev.mjs +59 -0
  7. package/dist/cli/build/prepare.d.mts +6 -0
  8. package/dist/cli/build/prepare.mjs +15 -0
  9. package/dist/cli/commands/commands.mjs +90 -0
  10. package/dist/cli/commands/env.mjs +53 -0
  11. package/dist/cli/commands/init.mjs +84 -0
  12. package/dist/cli/commands/install.mjs +52 -0
  13. package/dist/cli/commands/prepare.mjs +65 -0
  14. package/dist/cli/commands/reset.mjs +46 -0
  15. package/dist/cli/commands/run.mjs +105 -0
  16. package/dist/cli/commands/watch.mjs +48 -0
  17. package/dist/cli/config/defaults.mjs +117 -0
  18. package/dist/cli/config/index.d.mts +3 -11
  19. package/dist/cli/config/index.mjs +4 -17
  20. package/dist/cli/config/loader.d.mts +6 -0
  21. package/dist/cli/config/loader.mjs +71 -0
  22. package/dist/cli/config/resolvers/compatibility.mjs +71 -0
  23. package/dist/cli/config/resolvers/imports.mjs +35 -0
  24. package/dist/cli/config/resolvers/paths.mjs +98 -0
  25. package/dist/cli/config/resolvers/storage.mjs +23 -0
  26. package/dist/cli/config/resolvers/url.mjs +9 -0
  27. package/dist/cli/config/types.d.mts +14 -0
  28. package/dist/cli/config/types.mjs +147 -0
  29. package/dist/cli/core/apiful.mjs +36 -0
  30. package/dist/cli/core/app.mjs +105 -0
  31. package/dist/cli/core/devServer.mjs +10 -0
  32. package/dist/cli/core/env.mjs +68 -0
  33. package/dist/cli/core/installPackage.mjs +60 -0
  34. package/dist/cli/core/runtimeConfig.mjs +70 -0
  35. package/dist/cli/core/scan.mjs +35 -0
  36. package/dist/cli/core/silgi.mjs +111 -0
  37. package/dist/cli/core/templates.mjs +38 -0
  38. package/dist/cli/framework/emptyFramework.mjs +7 -0
  39. package/dist/cli/framework/h3.mjs +55 -0
  40. package/dist/cli/framework/index.mjs +15 -0
  41. package/dist/cli/framework/nitro.mjs +24 -0
  42. package/dist/cli/framework/nuxt.mjs +10 -0
  43. package/dist/cli/index.d.mts +1 -1
  44. package/dist/cli/index.mjs +24 -27
  45. package/dist/cli/module/exportScan.mjs +180 -0
  46. package/dist/cli/module/install.mjs +49 -0
  47. package/dist/cli/module/scan.mjs +195 -0
  48. package/dist/cli/scan/prepareCommands.mjs +40 -0
  49. package/dist/cli/scan/prepareConfigs.mjs +33 -0
  50. package/dist/cli/scan/prepareCoreFile.mjs +118 -0
  51. package/dist/cli/scan/prepareScanFile.mjs +59 -0
  52. package/dist/cli/scan/prepareSchema.mjs +140 -0
  53. package/dist/cli/scan/scanExportFile.mjs +312 -0
  54. package/dist/cli/scan/writeCoreFile.mjs +22 -0
  55. package/dist/cli/scan/writeTypesAndFiles.mjs +72 -0
  56. package/dist/cli/utils/cancel.mjs +14 -0
  57. package/dist/cli/utils/common.mjs +15 -0
  58. package/dist/cli/utils/compatibility.mjs +33 -0
  59. package/dist/cli/utils/debug.mjs +11 -0
  60. package/dist/cli/utils/ignore.mjs +56 -0
  61. package/dist/cli/utils/readScanFile.mjs +58 -0
  62. package/dist/cli/utils/storage.mjs +23 -0
  63. package/dist/core/context.d.mts +30 -0
  64. package/dist/core/context.mjs +32 -0
  65. package/dist/core/createSilgi.d.mts +6 -0
  66. package/dist/core/createSilgi.mjs +152 -0
  67. package/dist/core/error.d.mts +65 -0
  68. package/dist/core/error.mjs +106 -0
  69. package/dist/core/event.d.mts +26 -0
  70. package/dist/core/event.mjs +44 -0
  71. package/dist/core/index.d.mts +24 -316
  72. package/dist/core/index.mjs +27 -1345
  73. package/dist/core/orchestrate.mjs +113 -0
  74. package/dist/core/response.d.mts +20 -0
  75. package/dist/core/response.mjs +105 -0
  76. package/dist/core/silgi.d.mts +19 -0
  77. package/dist/core/silgi.mjs +141 -0
  78. package/dist/core/silgiApp.d.mts +9 -0
  79. package/dist/core/silgiApp.mjs +23 -0
  80. package/dist/core/storage.d.mts +7 -0
  81. package/dist/core/storage.mjs +15 -0
  82. package/dist/core/unctx.d.mts +21 -0
  83. package/dist/core/unctx.mjs +35 -0
  84. package/dist/core/utils/event-stream.d.mts +53 -0
  85. package/dist/core/utils/event-stream.mjs +38 -0
  86. package/dist/core/utils/event.d.mts +8 -0
  87. package/dist/core/utils/event.mjs +12 -0
  88. package/dist/core/utils/internal/event-stream.d.mts +45 -0
  89. package/dist/core/utils/internal/event-stream.mjs +137 -0
  90. package/dist/core/utils/internal/obj.mjs +9 -0
  91. package/dist/core/utils/internal/object.mjs +29 -0
  92. package/dist/core/utils/internal/query.mjs +73 -0
  93. package/dist/core/utils/internal/req.mjs +35 -0
  94. package/dist/core/utils/merge.d.mts +14 -0
  95. package/dist/core/utils/merge.mjs +27 -0
  96. package/dist/{shared/silgi.DTwQEdSr.d.mts → core/utils/middleware.d.mts} +11 -13
  97. package/dist/core/utils/middleware.mjs +12 -0
  98. package/dist/core/utils/request.mjs +35 -0
  99. package/dist/core/utils/resolver.d.mts +7 -0
  100. package/dist/core/utils/resolver.mjs +29 -0
  101. package/dist/core/utils/runtime.d.mts +7 -0
  102. package/dist/core/utils/runtime.mjs +20 -0
  103. package/dist/core/utils/sanitize.mjs +22 -0
  104. package/dist/core/utils/schema.d.mts +34 -0
  105. package/dist/core/utils/schema.mjs +33 -0
  106. package/dist/core/utils/service.d.mts +13 -0
  107. package/dist/core/utils/service.mjs +19 -0
  108. package/dist/core/utils/shared.d.mts +6 -0
  109. package/dist/core/utils/shared.mjs +7 -0
  110. package/dist/core/utils/storage.d.mts +24 -0
  111. package/dist/core/utils/storage.mjs +54 -0
  112. package/dist/index.d.mts +21 -6
  113. package/dist/index.mjs +22 -16
  114. package/dist/kit/add/add-commands.d.mts +6 -0
  115. package/dist/kit/add/add-commands.mjs +12 -0
  116. package/dist/kit/add/add-core-file.d.mts +9 -0
  117. package/dist/kit/add/add-core-file.mjs +11 -0
  118. package/dist/kit/add/add-imports.d.mts +14 -0
  119. package/dist/kit/add/add-imports.mjs +56 -0
  120. package/dist/kit/add/add-npm.d.mts +14 -0
  121. package/dist/kit/add/add-npm.mjs +23 -0
  122. package/dist/kit/define.d.mts +28 -0
  123. package/dist/kit/define.mjs +25 -0
  124. package/dist/kit/errors.d.mts +6 -0
  125. package/dist/kit/errors.mjs +11 -0
  126. package/dist/kit/esm.d.mts +11 -0
  127. package/dist/kit/esm.mjs +21 -0
  128. package/dist/kit/fs.d.mts +7 -0
  129. package/dist/kit/fs.mjs +23 -0
  130. package/dist/kit/function-utils.d.mts +27 -0
  131. package/dist/kit/function-utils.mjs +75 -0
  132. package/dist/kit/gen.d.mts +5 -0
  133. package/dist/kit/gen.mjs +26 -0
  134. package/dist/kit/hash.d.mts +4 -0
  135. package/dist/kit/hash.mjs +10 -0
  136. package/dist/kit/index.d.mts +22 -321
  137. package/dist/kit/index.mjs +23 -1039
  138. package/dist/kit/isFramework.d.mts +6 -0
  139. package/dist/kit/isFramework.mjs +21 -0
  140. package/dist/kit/logger.d.mts +6 -0
  141. package/dist/kit/logger.mjs +10 -0
  142. package/dist/kit/migration.d.mts +113 -0
  143. package/dist/kit/migration.mjs +301 -0
  144. package/dist/kit/module.d.mts +14 -0
  145. package/dist/kit/module.mjs +53 -0
  146. package/dist/kit/path.d.mts +7 -0
  147. package/dist/kit/path.mjs +26 -0
  148. package/dist/kit/preset.d.mts +8 -0
  149. package/dist/kit/preset.mjs +11 -0
  150. package/dist/kit/resolve.d.mts +37 -0
  151. package/dist/kit/resolve.mjs +82 -0
  152. package/dist/kit/template.d.mts +14 -0
  153. package/dist/kit/template.mjs +59 -0
  154. package/dist/kit/useRequest.d.mts +19 -0
  155. package/dist/kit/useRequest.mjs +63 -0
  156. package/dist/kit/utils.d.mts +34 -0
  157. package/dist/kit/utils.mjs +90 -0
  158. package/dist/package.mjs +176 -0
  159. package/dist/presets/_all.gen.d.mts +5 -2
  160. package/dist/presets/_all.gen.mjs +16 -13
  161. package/dist/presets/_resolve.d.mts +10 -6
  162. package/dist/presets/_resolve.mjs +51 -65
  163. package/dist/presets/_types.gen.d.mts +8 -5
  164. package/dist/presets/_types.gen.mjs +5 -1
  165. package/dist/presets/h3/preset.d.mts +5 -2
  166. package/dist/presets/h3/preset.mjs +33 -38
  167. package/dist/presets/hono/preset.d.mts +5 -2
  168. package/dist/presets/hono/preset.mjs +28 -35
  169. package/dist/presets/index.d.mts +3 -2
  170. package/dist/presets/index.mjs +3 -1
  171. package/dist/presets/nitro/preset.d.mts +5 -2
  172. package/dist/presets/nitro/preset.mjs +35 -42
  173. package/dist/presets/npmpackage/preset.d.mts +5 -2
  174. package/dist/presets/npmpackage/preset.mjs +27 -32
  175. package/dist/presets/nuxt/preset.d.mts +5 -2
  176. package/dist/presets/nuxt/preset.mjs +39 -44
  177. package/dist/runtime/index.d.mts +4 -3
  178. package/dist/runtime/index.mjs +5 -3
  179. package/dist/runtime/internal/config.d.mts +11 -7
  180. package/dist/runtime/internal/config.mjs +79 -90
  181. package/dist/runtime/internal/debug.d.mts +6 -3
  182. package/dist/runtime/internal/debug.mjs +9 -4
  183. package/dist/runtime/internal/defu.d.mts +4 -1
  184. package/dist/runtime/internal/defu.mjs +7 -2
  185. package/dist/runtime/internal/index.d.mts +7 -6
  186. package/dist/runtime/internal/index.mjs +8 -20
  187. package/dist/runtime/internal/nitro.d.mts +6 -3
  188. package/dist/runtime/internal/nitro.mjs +29 -37
  189. package/dist/runtime/internal/nuxt.d.mts +12 -8
  190. package/dist/runtime/internal/nuxt.mjs +12 -7
  191. package/dist/runtime/internal/ofetch.d.mts +8 -4
  192. package/dist/runtime/internal/ofetch.mjs +33 -34
  193. package/dist/runtime/internal/plugin.d.mts +7 -3
  194. package/dist/runtime/internal/plugin.mjs +7 -3
  195. package/dist/types/cliConfig.d.mts +288 -0
  196. package/dist/types/cliConfig.mjs +0 -0
  197. package/dist/types/cliHooks.d.mts +154 -0
  198. package/dist/types/cliHooks.mjs +0 -0
  199. package/dist/types/compatibility.d.mts +13 -0
  200. package/dist/types/compatibility.mjs +0 -0
  201. package/dist/types/config.d.mts +46 -0
  202. package/dist/types/config.mjs +0 -0
  203. package/dist/types/dotenv.d.mts +29 -0
  204. package/dist/types/dotenv.mjs +0 -0
  205. package/dist/types/event.d.mts +63 -0
  206. package/dist/types/event.mjs +0 -0
  207. package/dist/types/global.d.mts +24 -0
  208. package/dist/types/global.mjs +0 -0
  209. package/dist/types/helper.d.mts +25 -0
  210. package/dist/types/helper.mjs +0 -0
  211. package/dist/types/hooks.d.mts +37 -0
  212. package/dist/types/hooks.mjs +0 -0
  213. package/dist/types/index.d.mts +26 -1306
  214. package/dist/types/index.mjs +0 -1
  215. package/dist/types/kits.d.mts +32 -0
  216. package/dist/types/kits.mjs +0 -0
  217. package/dist/types/middleware.d.mts +31 -0
  218. package/dist/types/middleware.mjs +0 -0
  219. package/dist/types/module.d.mts +102 -0
  220. package/dist/types/module.mjs +0 -0
  221. package/dist/types/preset.d.mts +20 -0
  222. package/dist/types/preset.mjs +0 -0
  223. package/dist/types/route.d.mts +59 -0
  224. package/dist/types/route.mjs +0 -0
  225. package/dist/types/runtime/index.d.mts +5 -0
  226. package/dist/types/runtime/index.mjs +0 -0
  227. package/dist/types/runtime/nuxt.d.mts +13 -0
  228. package/dist/types/runtime/nuxt.mjs +0 -0
  229. package/dist/types/runtime/ofetch.d.mts +14 -0
  230. package/dist/types/runtime/ofetch.mjs +0 -0
  231. package/dist/types/runtime/plugin.d.mts +8 -0
  232. package/dist/types/runtime/plugin.mjs +0 -0
  233. package/dist/types/runtime/silgi.d.mts +11 -0
  234. package/dist/types/runtime/silgi.mjs +0 -0
  235. package/dist/types/schema.d.mts +86 -0
  236. package/dist/types/schema.mjs +0 -0
  237. package/dist/types/service.d.mts +102 -0
  238. package/dist/types/service.mjs +0 -0
  239. package/dist/types/shared.d.mts +19 -0
  240. package/dist/types/shared.mjs +0 -0
  241. package/dist/types/silgi.d.mts +71 -0
  242. package/dist/types/silgi.mjs +0 -0
  243. package/dist/types/silgiCLI.d.mts +118 -0
  244. package/dist/types/silgiCLI.mjs +0 -0
  245. package/dist/types/standard-schema.d.mts +61 -0
  246. package/dist/types/standard-schema.mjs +0 -0
  247. package/dist/types/storage.d.mts +30 -0
  248. package/dist/types/storage.mjs +0 -0
  249. package/package.json +20 -35
  250. package/dist/_chunks/silgiApp.mjs +0 -25
  251. package/dist/cli/build.mjs +0 -2190
  252. package/dist/cli/common.mjs +0 -13
  253. package/dist/cli/compatibility.mjs +0 -30
  254. package/dist/cli/dev.mjs +0 -67
  255. package/dist/cli/init.mjs +0 -112
  256. package/dist/cli/install.mjs +0 -151
  257. package/dist/cli/loader.mjs +0 -618
  258. package/dist/cli/prepare.mjs +0 -188
  259. package/dist/cli/reset.mjs +0 -55
  260. package/dist/cli/run.mjs +0 -159
  261. package/dist/cli/types.mjs +0 -232
  262. package/dist/cli/watch.mjs +0 -91
  263. package/dist/presets/next/preset.d.mts +0 -3
  264. package/dist/presets/next/preset.mjs +0 -38
  265. package/dist/runtime/internal/next.d.mts +0 -9
  266. package/dist/runtime/internal/next.mjs +0 -22
@@ -0,0 +1,113 @@
1
+ import { normalizeResult, useSilgi } from "./unctx.mjs";
2
+ import { createError } from "./error.mjs";
3
+ import { generateStorageKey, useSilgiStorage } from "./utils/storage.mjs";
4
+ import { parseRequestInput } from "./utils/internal/req.mjs";
5
+ import { getQuery, getRouterParams } from "./utils/request.mjs";
6
+ import { getUrlPrefix } from "./utils/resolver.mjs";
7
+ import { silgiFetch } from "./silgi.mjs";
8
+
9
+ //#region src/core/orchestrate.ts
10
+ async function orchestrate(route, event) {
11
+ const silgiCtx = useSilgi();
12
+ const silgiURL = getUrlPrefix(route.route || event.req.url, route.method);
13
+ const input = route.service?.rules?.readBeforeBody === false ? {} : await parseRequestInput(event.req);
14
+ const hookContext = { earlyReturnValue: false };
15
+ const routerParams = input.path || getRouterParams(event);
16
+ const queryParams = input.query || getQuery(event);
17
+ const inputData = {
18
+ args: input,
19
+ query: queryParams,
20
+ path: routerParams
21
+ };
22
+ try {
23
+ if (!route.service) throw createError({
24
+ statusCode: 404,
25
+ statusMessage: "Service not found"
26
+ });
27
+ const cachePromise = cacheExecute(input, route, silgiURL, event);
28
+ const beforeHookPromise = silgiCtx.callHook("fetch:before", {
29
+ url: silgiURL,
30
+ input,
31
+ event,
32
+ route,
33
+ hookContext
34
+ });
35
+ const cacheData = await cachePromise;
36
+ await beforeHookPromise;
37
+ if (hookContext.earlyReturnValue !== false) return hookContext.earlyReturnValue;
38
+ if (cacheData?.success) {
39
+ await silgiCtx.callHook("fetch:after", {
40
+ event,
41
+ url: silgiURL,
42
+ input,
43
+ result: cacheData.data,
44
+ success: true,
45
+ cached: true,
46
+ route,
47
+ hookContext
48
+ });
49
+ return cacheData.data;
50
+ }
51
+ silgiCtx.shared.$fetch = silgiFetch;
52
+ silgiCtx.shared.silgi = silgiCtx;
53
+ const result = await route.service?.handler?.(inputData, silgiCtx.shared, event);
54
+ await silgiCtx.callHook("fetch:after", {
55
+ event,
56
+ url: silgiURL,
57
+ input: inputData,
58
+ result,
59
+ success: true,
60
+ route,
61
+ hookContext
62
+ });
63
+ if (route.service?.storage && cacheData?.cachedKey) await useSilgiStorage(route.service.storage.base).setItem(cacheData.cachedKey, result, route.service.storage.options);
64
+ return result;
65
+ } catch (err) {
66
+ await silgiCtx.callHook("fetch:error", {
67
+ event,
68
+ input: inputData,
69
+ error: err instanceof Error ? err : new Error(String(err)),
70
+ url: silgiURL,
71
+ route,
72
+ hookContext
73
+ });
74
+ silgiCtx.captureError(silgiCtx, createError({
75
+ message: err instanceof Error ? err.message : String(err),
76
+ statusCode: 500,
77
+ statusMessage: "Internal Server Error",
78
+ cause: err
79
+ }), {
80
+ event,
81
+ tags: ["execute"]
82
+ });
83
+ throw err;
84
+ }
85
+ }
86
+ async function cacheExecute(input, route, silgiURL, event) {
87
+ if (!route.service || !route.service.storage) return;
88
+ const cacheKey = route.service.storage ? await generateStorageKey({
89
+ url: silgiURL,
90
+ input,
91
+ keyGenerator: route.service.storage.key,
92
+ storageOptions: route.service.storage,
93
+ requestId: event?.requestId
94
+ }) : null;
95
+ if (cacheKey) {
96
+ const cachedResult = await useSilgiStorage(route.service.storage.base).getItem(cacheKey);
97
+ if (cachedResult !== null) return {
98
+ success: true,
99
+ data: normalizeResult(cachedResult),
100
+ cached: true,
101
+ cachedKey: cacheKey
102
+ };
103
+ }
104
+ return {
105
+ success: false,
106
+ data: null,
107
+ cached: false,
108
+ cachedKey: cacheKey
109
+ };
110
+ }
111
+
112
+ //#endregion
113
+ export { orchestrate };
@@ -0,0 +1,20 @@
1
+ import { SilgiError$1 as SilgiError } from "./error.mjs";
2
+ import { SilgiEvent } from "silgi/types";
3
+
4
+ //#region src/core/response.d.ts
5
+ type MaybePromise<T> = T | Promise<T>;
6
+ interface SilgiHandlerConfig {
7
+ debug?: boolean;
8
+ // websocket?: WebSocketOptions;
9
+ onError?: (error: SilgiError, event: SilgiEvent) => MaybePromise<void | unknown>;
10
+ onRequest?: (event: SilgiEvent) => MaybePromise<void>;
11
+ onBeforeResponse?: (event: SilgiEvent, response: Response | PreparedResponse) => MaybePromise<void>;
12
+ }
13
+ type PreparedResponse = ResponseInit & {
14
+ body?: BodyInit | null;
15
+ };
16
+ declare const kNotFound: symbol;
17
+ declare const kHandled: symbol;
18
+ declare function handleResponse(val: unknown, event: SilgiEvent, config: SilgiHandlerConfig): Response | Promise<Response>;
19
+ //#endregion
20
+ export { handleResponse as handleResponse$1, kHandled as kHandled$1, kNotFound as kNotFound$1 };
@@ -0,0 +1,105 @@
1
+ import { isJSONSerializable } from "./utils/internal/object.mjs";
2
+ import { createError } from "./error.mjs";
3
+ import { FastResponse } from "srvx";
4
+
5
+ //#region src/core/response.ts
6
+ const kNotFound = /* @__PURE__ */ Symbol.for("silgi.notFound");
7
+ const kHandled = /* @__PURE__ */ Symbol.for("silgi.handled");
8
+ function handleResponse(val, event, config) {
9
+ if (val && val instanceof Promise) return val.catch((error) => error).then((resolvedVal) => handleResponse(resolvedVal, event, config));
10
+ const response = prepareResponse(val, event, config);
11
+ if (response instanceof Promise) return handleResponse(response, event, config);
12
+ const { onBeforeResponse } = config;
13
+ return onBeforeResponse ? Promise.resolve(onBeforeResponse(event, response)).then(() => response) : response;
14
+ }
15
+ function prepareResponse(val, event, config, nested) {
16
+ if (val === kHandled) return new FastResponse(null);
17
+ if (val === kNotFound) val = createError({
18
+ statusCode: 404,
19
+ statusMessage: `Cannot find any route matching [${event.req.method}] ${event.url}`
20
+ });
21
+ if (val && val instanceof Error) {
22
+ const error = createError(val);
23
+ const { onError } = config;
24
+ return onError && !nested ? Promise.resolve(onError(error, event)).catch((error$1) => error$1).then((newVal) => prepareResponse(newVal ?? val, event, config, true)) : errorResponse(error, config.debug);
25
+ }
26
+ const eventHeaders = event.res._headers;
27
+ if (!(val instanceof Response)) {
28
+ const res = prepareResponseBody(val, event, config);
29
+ const status = event.res.status;
30
+ return new FastResponse(nullBody(event.req.method, status) ? null : res.body, {
31
+ status,
32
+ statusText: event.res.statusText,
33
+ headers: res.headers && eventHeaders ? mergeHeaders(res.headers, eventHeaders) : res.headers || eventHeaders
34
+ });
35
+ }
36
+ if (!eventHeaders) return val;
37
+ return new FastResponse(nullBody(event.req.method, val.status) ? null : val.body, {
38
+ status: val.status,
39
+ statusText: val.statusText,
40
+ headers: mergeHeaders(eventHeaders, val.headers)
41
+ });
42
+ }
43
+ function nullBody(method, status) {
44
+ return method === "HEAD" || status === 100 || status === 101 || status === 102 || status === 204 || status === 205 || status === 304;
45
+ }
46
+ function mergeHeaders(base, merge) {
47
+ const mergedHeaders = new Headers(base);
48
+ for (const [name, value] of merge) if (name === "set-cookie") mergedHeaders.append(name, value);
49
+ else mergedHeaders.set(name, value);
50
+ return mergedHeaders;
51
+ }
52
+ const emptyHeaders = new Headers({ "content-length": "0" });
53
+ const jsonHeaders = new Headers({ "content-type": "application/json;charset=UTF-8" });
54
+ function prepareResponseBody(val, event, config) {
55
+ if (val === null || val === void 0) return {
56
+ body: "",
57
+ headers: emptyHeaders
58
+ };
59
+ const valType = typeof val;
60
+ if (valType === "string") return { body: val };
61
+ if (val instanceof Uint8Array) {
62
+ event.res.headers.set("content-length", val.byteLength.toString());
63
+ return { body: val };
64
+ }
65
+ if (isJSONSerializable(val, valType)) return {
66
+ body: JSON.stringify(val, void 0, config.debug ? 2 : void 0),
67
+ headers: jsonHeaders
68
+ };
69
+ if (valType === "bigint") return {
70
+ body: val.toString(),
71
+ headers: jsonHeaders
72
+ };
73
+ if (val instanceof Blob) {
74
+ const headers = {
75
+ "content-type": val.type,
76
+ "content-length": val.size.toString()
77
+ };
78
+ if ("name" in val) {
79
+ const filename = encodeURIComponent(val.name);
80
+ headers["content-disposition"] = `filename="${filename}"; filename*=UTF-8''${filename}`;
81
+ }
82
+ return {
83
+ body: val.stream(),
84
+ headers
85
+ };
86
+ }
87
+ if (valType === "symbol") return { body: val.toString() };
88
+ if (valType === "function") return { body: `${val.name}()` };
89
+ return { body: val };
90
+ }
91
+ function errorResponse(error, debug) {
92
+ return new FastResponse(JSON.stringify({
93
+ statusCode: error.statusCode,
94
+ statusMessage: error.statusMessage,
95
+ data: error.data,
96
+ stack: debug && error.stack ? error.stack.split("\n").map((l) => l.trim()) : void 0
97
+ }, null, 2), {
98
+ status: error.statusCode,
99
+ statusText: error.statusMessage,
100
+ headers: { "content-type": "application/json; charset=utf-8" }
101
+ });
102
+ }
103
+
104
+ //#endregion
105
+ export { handleResponse, kHandled, kNotFound };
@@ -0,0 +1,19 @@
1
+ import { MiddlewareSetup, ServiceSetup, ServicesObject, Silgi, SilgiEvent, SilgiRuntimeContext, StandardSchemaV1, WebSocketOptions } from "silgi/types";
2
+
3
+ //#region src/core/silgi.d.ts
4
+
5
+ /**
6
+ * Fetch API for Silgi framework
7
+ */
8
+ declare function silgiFetch<Service extends ServicesObject = ServicesObject, Path extends keyof Service = keyof Service>(_request: Path, options?: RequestInit, context?: SilgiRuntimeContext): Promise<Response | Promise<Response>>;
9
+ /**
10
+ * Fetch API for Silgi framework using standard Request options
11
+ */
12
+ declare function silgiFetch(_request: Request | URL, options?: RequestInit & {
13
+ path?: Record<string, any>;
14
+ }, context?: SilgiRuntimeContext): Promise<Response | Promise<Response>>;
15
+ declare function middleware(event: SilgiEvent): Promise<any>;
16
+ declare function handler(event: SilgiEvent): Promise<any>;
17
+ declare function getWebsocket(silgi?: Silgi): WebSocketOptions;
18
+ //#endregion
19
+ export { getWebsocket as getWebsocket$1, handler as handler$1, middleware as middleware$1, silgiFetch as silgiFetch$1 };
@@ -0,0 +1,141 @@
1
+ import { useSilgi } from "./unctx.mjs";
2
+ import { createError, isError } from "./error.mjs";
3
+ import { SilgiHttpEvent } from "./event.mjs";
4
+ import { handleResponse, kNotFound } from "./response.mjs";
5
+ import { orchestrate } from "./orchestrate.mjs";
6
+ import { findAllRoutes, findRoute } from "rou3";
7
+
8
+ //#region src/core/silgi.ts
9
+ function getHeader(name, headers) {
10
+ if (!headers) return;
11
+ if (headers instanceof Headers) return headers.get(name);
12
+ const lName = name.toLowerCase();
13
+ if (Array.isArray(headers)) return headers.find((h) => h[0] === name || lName === h[0].toLowerCase())?.[1];
14
+ return headers[name] || headers[lName];
15
+ }
16
+ function substitutePathParams(path, pathParams) {
17
+ if (!pathParams) return path;
18
+ return path.replace(/:(\w+)/g, (_, key) => {
19
+ if (key in pathParams) return encodeURIComponent(pathParams[key]);
20
+ return `:${key}`;
21
+ });
22
+ }
23
+ function withDuplexIfBody(options) {
24
+ if (!options) return options;
25
+ if (options.body && !("duplex" in options)) return {
26
+ ...options,
27
+ duplex: "half"
28
+ };
29
+ return options;
30
+ }
31
+ async function silgiFetch(_request, options, context) {
32
+ let request;
33
+ if (typeof _request === "string") {
34
+ _request = substitutePathParams(_request, options?.pathParams);
35
+ let url = _request;
36
+ if (url[0] === "/") {
37
+ const host = getHeader("Host", options?.headers) || ".";
38
+ const proto = getHeader("X-Forwarded-Proto", options?.headers) === "https" ? "https" : "http";
39
+ url = `${proto}://${host}${url}`;
40
+ }
41
+ request = new Request(url, withDuplexIfBody(options));
42
+ } else if (options || _request instanceof URL) request = new Request(_request, withDuplexIfBody(options));
43
+ else request = _request;
44
+ const silgiEvent = new SilgiHttpEvent(request, context);
45
+ let handlerRes;
46
+ try {
47
+ handlerRes = handler(silgiEvent);
48
+ } catch (error) {
49
+ handlerRes = Promise.reject(error);
50
+ }
51
+ return handleResponse(handlerRes, silgiEvent, {});
52
+ }
53
+ async function middleware(event) {
54
+ const silgiContext = useSilgi();
55
+ event._chain = Promise.resolve(await silgiContext.callHook("request:on", event));
56
+ let _chain = void 0;
57
+ const _middleware = silgiContext.globalMiddlewares;
58
+ if (_middleware) {
59
+ _chain = _chain || Promise.resolve();
60
+ for (const m of _middleware) _chain = _chain.then(async (_previous) => {
61
+ if (_previous !== void 0 && _previous !== kNotFound) return _previous;
62
+ if (!(m.method === event.req.method) || !m.middleware) return;
63
+ try {
64
+ await silgiContext.callHook("middleware:global:on", event, m.middleware);
65
+ } catch (error) {
66
+ if (isError(error)) throw error;
67
+ throw createError({
68
+ message: "Middleware error",
69
+ statusCode: 500,
70
+ statusMessage: "Middleware error",
71
+ cause: error
72
+ });
73
+ }
74
+ return m.middleware.handler?.(event, silgiContext);
75
+ });
76
+ }
77
+ const _mRouter = silgiContext._middlewareRouter;
78
+ if (_mRouter) {
79
+ const matches = findAllRoutes(_mRouter, event.req.method, event.url.pathname);
80
+ if (matches.length > 0) {
81
+ _chain = _chain || Promise.resolve();
82
+ for (const match of matches) _chain = _chain.then(async (_previous) => {
83
+ if (_previous !== void 0 && _previous !== kNotFound) return _previous;
84
+ if (!(match.data.method === event.req.method) || !match.data.middleware) return;
85
+ event.context.params = match.params;
86
+ event.context.matchedRoute = match.data;
87
+ try {
88
+ await silgiContext.callHook("middleware:router:on", event, match.data.middleware);
89
+ } catch (error) {
90
+ if (isError(error)) throw error;
91
+ throw createError({
92
+ message: "Middleware error",
93
+ statusCode: 500,
94
+ statusMessage: "Middleware error",
95
+ cause: error
96
+ });
97
+ }
98
+ return match.data.middleware.handler?.(event, silgiContext);
99
+ });
100
+ }
101
+ }
102
+ event._chain = _chain;
103
+ if (event._chain) {
104
+ const data = await event._chain;
105
+ if (data !== void 0 && data !== kNotFound) return data;
106
+ }
107
+ }
108
+ async function handler(event) {
109
+ await middleware(event);
110
+ const silgiContext = useSilgi();
111
+ if (silgiContext.router) {
112
+ const match = findRoute(silgiContext.router, event.req.method, event.url.pathname);
113
+ if (match) if (event._chain) return event._chain.then(async (_previous) => {
114
+ if (_previous !== void 0 && _previous !== kNotFound) return _previous;
115
+ event.context.params = match.params;
116
+ event.context.matchedRoute = match.data;
117
+ return orchestrate(match.data, event);
118
+ });
119
+ else {
120
+ event.context.params = match.params;
121
+ event.context.matchedRoute = match.data;
122
+ return orchestrate(match.data, event);
123
+ }
124
+ }
125
+ return event._chain ? event._chain.then((_previous) => _previous === void 0 ? kNotFound : _previous) : kNotFound;
126
+ }
127
+ function getWebsocket(silgi = useSilgi()) {
128
+ return {
129
+ ...silgi.options.websocket,
130
+ resolve: async (request) => {
131
+ const _method = request.method || "GET";
132
+ const event = new SilgiHttpEvent(request, {});
133
+ const silgiContext = useSilgi();
134
+ const handler$1 = silgiContext.router && findRoute(silgiContext.router, event.req.method, event.url.pathname);
135
+ return handler$1?.data.service?.websocket || {};
136
+ }
137
+ };
138
+ }
139
+
140
+ //#endregion
141
+ export { getWebsocket, handler, middleware, silgiFetch };
@@ -0,0 +1,9 @@
1
+ import { UseContext } from "unctx";
2
+ import { SilgiCLI } from "silgi/types";
3
+
4
+ //#region src/core/silgiApp.d.ts
5
+ declare const silgiCLICtx: UseContext<SilgiCLI>;
6
+ declare function useSilgiCLI(): SilgiCLI;
7
+ declare function tryUseSilgiCLI(): SilgiCLI | null;
8
+ //#endregion
9
+ export { silgiCLICtx as silgiCLICtx$1, tryUseSilgiCLI as tryUseSilgiCLI$1, useSilgiCLI as useSilgiCLI$1 };
@@ -0,0 +1,23 @@
1
+ import consola from "consola";
2
+ import { getContext } from "unctx";
3
+
4
+ //#region src/core/silgiApp.ts
5
+ const silgiCLICtx = getContext("silgiCLI");
6
+ function useSilgiCLI() {
7
+ const instance = silgiCLICtx.tryUse();
8
+ if (!instance) throw new Error("Silgi instance is unavailable!");
9
+ return instance;
10
+ }
11
+ async function silgiCLIIClose() {
12
+ const silgi = silgiCLICtx.tryUse();
13
+ if (!silgi) return;
14
+ await silgi.close();
15
+ await silgi.callHook("close", silgi);
16
+ consola.withTag("silgi").success("Process terminated");
17
+ }
18
+ function tryUseSilgiCLI() {
19
+ return silgiCLICtx.tryUse();
20
+ }
21
+
22
+ //#endregion
23
+ export { silgiCLICtx, silgiCLIIClose, tryUseSilgiCLI, useSilgiCLI };
@@ -0,0 +1,7 @@
1
+ import { Storage } from "unstorage";
2
+ import { Silgi, SilgiStorageBase } from "silgi/types";
3
+
4
+ //#region src/core/storage.d.ts
5
+ declare function storageMount<T extends Storage = Storage>(silgi?: Silgi): (base: keyof SilgiStorageBase, driver: Parameters<Storage["mount"]>[1]) => T;
6
+ //#endregion
7
+ export { storageMount as storageMount$1 };
@@ -0,0 +1,15 @@
1
+ import { useSilgi } from "./unctx.mjs";
2
+
3
+ //#region src/core/storage.ts
4
+ function storageMount(silgi) {
5
+ const _silgi = silgi || useSilgi();
6
+ return (base, driver) => {
7
+ const existingStorage = _silgi.storage.getMount(base);
8
+ if (existingStorage) return existingStorage.driver;
9
+ const storage = _silgi.storage.mount(base, driver);
10
+ return storage;
11
+ };
12
+ }
13
+
14
+ //#endregion
15
+ export { storageMount };
@@ -0,0 +1,21 @@
1
+ import { UseContext } from "unctx";
2
+ import { Silgi } from "silgi/types";
3
+
4
+ //#region src/core/unctx.d.ts
5
+ declare const silgiCtx: UseContext<Silgi>;
6
+ declare function useSilgi(): Silgi;
7
+ /**
8
+ * Get access to Nuxt instance.
9
+ *
10
+ * Returns null if Nuxt instance is unavailable.
11
+ * @example
12
+ * ```js
13
+ * const silgi = tryUseSilgi()
14
+ * if (silgi) {
15
+ * // Do something
16
+ * }
17
+ * ```
18
+ */
19
+ declare function tryUseSilgi(): Silgi | null;
20
+ //#endregion
21
+ export { silgiCtx as silgiCtx$1, tryUseSilgi as tryUseSilgi$1, useSilgi as useSilgi$1 };
@@ -0,0 +1,35 @@
1
+ import { getContext } from "unctx";
2
+
3
+ //#region src/core/unctx.ts
4
+ const silgiCtx = getContext("silgi");
5
+ function useSilgi() {
6
+ const instance = silgiCtx.tryUse();
7
+ if (!instance) throw new Error("Silgi instance is unavailable!");
8
+ return instance;
9
+ }
10
+ function normalizeResult(result) {
11
+ if (Array.isArray(result)) return [...result];
12
+ if (result && typeof result === "object") {
13
+ if (Object.keys(result).every((key) => !Number.isNaN(Number(key)))) return Object.values(result);
14
+ return { ...result };
15
+ }
16
+ return result;
17
+ }
18
+ /**
19
+ * Get access to Nuxt instance.
20
+ *
21
+ * Returns null if Nuxt instance is unavailable.
22
+ * @example
23
+ * ```js
24
+ * const silgi = tryUseSilgi()
25
+ * if (silgi) {
26
+ * // Do something
27
+ * }
28
+ * ```
29
+ */
30
+ function tryUseSilgi() {
31
+ return silgiCtx.tryUse();
32
+ }
33
+
34
+ //#endregion
35
+ export { normalizeResult, silgiCtx, tryUseSilgi, useSilgi };
@@ -0,0 +1,53 @@
1
+ import { EventStream$1 as EventStream } from "./internal/event-stream.mjs";
2
+ import { SilgiEvent } from "silgi/types";
3
+
4
+ //#region src/core/utils/event-stream.d.ts
5
+ interface EventStreamOptions {
6
+ /**
7
+ * Automatically close the writable stream when the request is closed
8
+ *
9
+ * Default is `true`
10
+ */
11
+ autoclose?: boolean;
12
+ }
13
+ /**
14
+ * See https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#fields
15
+ */
16
+ interface EventStreamMessage {
17
+ id?: string;
18
+ event?: string;
19
+ retry?: number;
20
+ data: string;
21
+ }
22
+ /**
23
+ * Initialize an EventStream instance for creating [server sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)
24
+ *
25
+ * @experimental This function is experimental and might be unstable in some environments.
26
+ *
27
+ * @example
28
+ *
29
+ * ```ts
30
+ * import { createEventStream, sendEventStream } from "h3";
31
+ *
32
+ * app.get("/sse", (event) => {
33
+ * const eventStream = createEventStream(event);
34
+ *
35
+ * // Send a message every second
36
+ * const interval = setInterval(async () => {
37
+ * await eventStream.push("Hello world");
38
+ * }, 1000);
39
+ *
40
+ * // cleanup the interval and close the stream when the connection is terminated
41
+ * eventStream.onClosed(async () => {
42
+ * console.log("closing SSE...");
43
+ * clearInterval(interval);
44
+ * await eventStream.close();
45
+ * });
46
+ *
47
+ * return eventStream.send();
48
+ * });
49
+ * ```
50
+ */
51
+ declare function createEventStream(event: SilgiEvent, opts?: EventStreamOptions): EventStream;
52
+ //#endregion
53
+ export { EventStreamMessage, EventStreamOptions, createEventStream as createEventStream$1 };
@@ -0,0 +1,38 @@
1
+ import { EventStream } from "./internal/event-stream.mjs";
2
+
3
+ //#region src/core/utils/event-stream.ts
4
+ /**
5
+ * Initialize an EventStream instance for creating [server sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)
6
+ *
7
+ * @experimental This function is experimental and might be unstable in some environments.
8
+ *
9
+ * @example
10
+ *
11
+ * ```ts
12
+ * import { createEventStream, sendEventStream } from "h3";
13
+ *
14
+ * app.get("/sse", (event) => {
15
+ * const eventStream = createEventStream(event);
16
+ *
17
+ * // Send a message every second
18
+ * const interval = setInterval(async () => {
19
+ * await eventStream.push("Hello world");
20
+ * }, 1000);
21
+ *
22
+ * // cleanup the interval and close the stream when the connection is terminated
23
+ * eventStream.onClosed(async () => {
24
+ * console.log("closing SSE...");
25
+ * clearInterval(interval);
26
+ * await eventStream.close();
27
+ * });
28
+ *
29
+ * return eventStream.send();
30
+ * });
31
+ * ```
32
+ */
33
+ function createEventStream(event, opts) {
34
+ return new EventStream(event, opts);
35
+ }
36
+
37
+ //#endregion
38
+ export { createEventStream };
@@ -0,0 +1,8 @@
1
+ import { SilgiEvent, SilgiRuntimeContext } from "silgi/types";
2
+
3
+ //#region src/core/utils/event.d.ts
4
+ // import { isRuntimePresents } from 'silgi/kit'
5
+ declare function getEvent<T extends SilgiEvent>(event?: SilgiEvent): T;
6
+ declare function getEventContext<T extends SilgiRuntimeContext>(event?: SilgiEvent): T;
7
+ //#endregion
8
+ export { getEvent as getEvent$1, getEventContext as getEventContext$1 };
@@ -0,0 +1,12 @@
1
+ //#region src/core/utils/event.ts
2
+ function getEvent(event) {
3
+ if (event?.event) return getEvent(event.event);
4
+ return event;
5
+ }
6
+ function getEventContext(event) {
7
+ const _event = getEvent(event);
8
+ return _event.context;
9
+ }
10
+
11
+ //#endregion
12
+ export { getEvent, getEventContext };
@@ -0,0 +1,45 @@
1
+ import { EventStreamMessage, EventStreamOptions } from "../event-stream.mjs";
2
+ import { SilgiEvent } from "silgi/types";
3
+
4
+ //#region src/core/utils/internal/event-stream.d.ts
5
+
6
+ /**
7
+ * A helper class for [server sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#event_stream_format)
8
+ */
9
+ declare class EventStream {
10
+ private readonly _event;
11
+ private readonly _transformStream;
12
+ private readonly _writer;
13
+ private readonly _encoder;
14
+ private _writerIsClosed;
15
+ private _paused;
16
+ private _unsentData;
17
+ private _disposed;
18
+ private _handled;
19
+ constructor(event: SilgiEvent, opts?: EventStreamOptions);
20
+ /**
21
+ * Publish new event(s) for the client
22
+ */
23
+ push(message: string): Promise<void>;
24
+ push(message: string[]): Promise<void>;
25
+ push(message: EventStreamMessage): Promise<void>;
26
+ push(message: EventStreamMessage[]): Promise<void>;
27
+ private _sendEvent;
28
+ private _sendEvents;
29
+ pause(): void;
30
+ get isPaused(): boolean;
31
+ resume(): Promise<void>;
32
+ flush(): Promise<void>;
33
+ /**
34
+ * Close the stream and the connection if the stream is being sent to the client
35
+ */
36
+ close(): Promise<void>;
37
+ /**
38
+ * Triggers callback when the writable stream is closed.
39
+ * It is also triggered after calling the `close()` method.
40
+ */
41
+ onClosed(cb: () => any): void;
42
+ send(): Promise<BodyInit>;
43
+ }
44
+ //#endregion
45
+ export { EventStream as EventStream$1 };