nitropack-nightly 2.10.0-28638117.48423122 → 3.0.0-beta-28638602.1fe7b893-nitro-nightly-mirror

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 (281) hide show
  1. package/README.md +3 -0
  2. package/cli.d.ts +1 -1
  3. package/config.d.ts +1 -1
  4. package/core.d.ts +1 -1
  5. package/dist/cli/index.d.mts +1 -1
  6. package/dist/cli/index.d.ts +1 -1
  7. package/dist/cli/index.mjs +1 -18
  8. package/dist/config/index.d.mts +1 -6
  9. package/dist/config/index.d.ts +1 -6
  10. package/dist/config/index.mjs +1 -5
  11. package/dist/core/index.d.mts +1 -69
  12. package/dist/core/index.d.ts +1 -69
  13. package/dist/core/index.mjs +1 -2436
  14. package/dist/kit/index.d.mts +1 -44
  15. package/dist/kit/index.d.ts +1 -44
  16. package/dist/kit/index.mjs +1 -71
  17. package/dist/meta/index.d.mts +1 -3
  18. package/dist/meta/index.d.ts +1 -3
  19. package/dist/meta/index.mjs +1 -3
  20. package/dist/presets/index.d.mts +1 -1
  21. package/dist/presets/index.d.ts +1 -2
  22. package/dist/presets/index.mjs +1 -1
  23. package/dist/rollup/index.d.mts +1 -5
  24. package/dist/rollup/index.d.ts +1 -5
  25. package/dist/rollup/index.mjs +1 -2033
  26. package/dist/runtime/index.d.mts +1 -0
  27. package/dist/runtime/index.d.ts +1 -12
  28. package/dist/runtime/index.mjs +1 -17
  29. package/dist/types/index.d.mts +1 -260
  30. package/dist/types/index.d.ts +1 -260
  31. package/dist/types/index.mjs +1 -1
  32. package/kit.d.ts +1 -1
  33. package/meta.d.ts +1 -1
  34. package/package.json +6 -172
  35. package/presets.d.ts +1 -1
  36. package/rollup.d.ts +1 -1
  37. package/runtime-meta.d.ts +1 -4
  38. package/runtime-meta.mjs +1 -30
  39. package/runtime.d.ts +1 -1
  40. package/types.d.ts +1 -1
  41. package/dist/cli/build.mjs +0 -47
  42. package/dist/cli/common.mjs +0 -13
  43. package/dist/cli/dev.mjs +0 -63
  44. package/dist/cli/index2.mjs +0 -14
  45. package/dist/cli/list.mjs +0 -28
  46. package/dist/cli/prepare.mjs +0 -21
  47. package/dist/cli/run.mjs +0 -57
  48. package/dist/presets/_all.gen.d.ts +0 -2
  49. package/dist/presets/_all.gen.mjs +0 -52
  50. package/dist/presets/_nitro/base-worker.d.ts +0 -2
  51. package/dist/presets/_nitro/base-worker.mjs +0 -25
  52. package/dist/presets/_nitro/nitro-dev.d.ts +0 -2
  53. package/dist/presets/_nitro/nitro-dev.mjs +0 -19
  54. package/dist/presets/_nitro/nitro-prerender.d.ts +0 -2
  55. package/dist/presets/_nitro/nitro-prerender.mjs +0 -17
  56. package/dist/presets/_nitro/preset.d.ts +0 -2
  57. package/dist/presets/_nitro/preset.mjs +0 -5
  58. package/dist/presets/_nitro/runtime/nitro-dev.d.ts +0 -1
  59. package/dist/presets/_nitro/runtime/nitro-dev.mjs +0 -86
  60. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.ts +0 -3
  61. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +0 -7
  62. package/dist/presets/_nitro/runtime/service-worker.d.ts +0 -1
  63. package/dist/presets/_nitro/runtime/service-worker.mjs +0 -31
  64. package/dist/presets/_nitro/service-worker.d.ts +0 -2
  65. package/dist/presets/_nitro/service-worker.mjs +0 -110
  66. package/dist/presets/_resolve.d.ts +0 -8
  67. package/dist/presets/_resolve.mjs +0 -44
  68. package/dist/presets/_static/preset.d.ts +0 -2
  69. package/dist/presets/_static/preset.mjs +0 -69
  70. package/dist/presets/_types.gen.d.ts +0 -16
  71. package/dist/presets/_types.gen.mjs +0 -0
  72. package/dist/presets/alwaysdata/preset.d.ts +0 -2
  73. package/dist/presets/alwaysdata/preset.mjs +0 -14
  74. package/dist/presets/aws-amplify/preset.d.ts +0 -3
  75. package/dist/presets/aws-amplify/preset.mjs +0 -27
  76. package/dist/presets/aws-amplify/runtime/aws-amplify.d.ts +0 -1
  77. package/dist/presets/aws-amplify/runtime/aws-amplify.mjs +0 -13
  78. package/dist/presets/aws-amplify/types.d.ts +0 -141
  79. package/dist/presets/aws-amplify/types.mjs +0 -0
  80. package/dist/presets/aws-amplify/utils.d.ts +0 -2
  81. package/dist/presets/aws-amplify/utils.mjs +0 -82
  82. package/dist/presets/aws-lambda/preset.d.ts +0 -2
  83. package/dist/presets/aws-lambda/preset.mjs +0 -21
  84. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.ts +0 -15
  85. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +0 -53
  86. package/dist/presets/aws-lambda/runtime/aws-lambda.d.ts +0 -4
  87. package/dist/presets/aws-lambda/runtime/aws-lambda.mjs +0 -45
  88. package/dist/presets/azure/preset.d.ts +0 -3
  89. package/dist/presets/azure/preset.mjs +0 -44
  90. package/dist/presets/azure/runtime/azure-functions.d.ts +0 -5
  91. package/dist/presets/azure/runtime/azure-functions.mjs +0 -22
  92. package/dist/presets/azure/runtime/azure-swa.d.ts +0 -5
  93. package/dist/presets/azure/runtime/azure-swa.mjs +0 -28
  94. package/dist/presets/azure/types.d.ts +0 -13
  95. package/dist/presets/azure/types.mjs +0 -0
  96. package/dist/presets/azure/utils.d.ts +0 -3
  97. package/dist/presets/azure/utils.mjs +0 -183
  98. package/dist/presets/bun/preset.d.ts +0 -2
  99. package/dist/presets/bun/preset.mjs +0 -17
  100. package/dist/presets/bun/runtime/bun.d.ts +0 -1
  101. package/dist/presets/bun/runtime/bun.mjs +0 -32
  102. package/dist/presets/cleavr/preset.d.ts +0 -2
  103. package/dist/presets/cleavr/preset.mjs +0 -12
  104. package/dist/presets/cloudflare/preset.d.ts +0 -3
  105. package/dist/presets/cloudflare/preset.mjs +0 -145
  106. package/dist/presets/cloudflare/runtime/cloudflare-module.d.ts +0 -13
  107. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +0 -104
  108. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.ts +0 -20
  109. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +0 -56
  110. package/dist/presets/cloudflare/runtime/cloudflare-worker.d.ts +0 -1
  111. package/dist/presets/cloudflare/runtime/cloudflare-worker.mjs +0 -64
  112. package/dist/presets/cloudflare/types.d.ts +0 -89
  113. package/dist/presets/cloudflare/types.mjs +0 -0
  114. package/dist/presets/cloudflare/types.wrangler.d.ts +0 -974
  115. package/dist/presets/cloudflare/types.wrangler.mjs +0 -0
  116. package/dist/presets/cloudflare/utils.d.ts +0 -3
  117. package/dist/presets/cloudflare/utils.mjs +0 -163
  118. package/dist/presets/deno/preset.d.ts +0 -2
  119. package/dist/presets/deno/preset.mjs +0 -151
  120. package/dist/presets/deno/runtime/deno-deploy.d.ts +0 -1
  121. package/dist/presets/deno/runtime/deno-deploy.mjs +0 -31
  122. package/dist/presets/deno/runtime/deno-server.d.ts +0 -3
  123. package/dist/presets/deno/runtime/deno-server.mjs +0 -65
  124. package/dist/presets/digitalocean/preset.d.ts +0 -2
  125. package/dist/presets/digitalocean/preset.mjs +0 -11
  126. package/dist/presets/edgio/preset.d.ts +0 -2
  127. package/dist/presets/edgio/preset.mjs +0 -95
  128. package/dist/presets/firebase/preset.d.ts +0 -3
  129. package/dist/presets/firebase/preset.mjs +0 -51
  130. package/dist/presets/firebase/runtime/firebase-gen-1.d.ts +0 -2
  131. package/dist/presets/firebase/runtime/firebase-gen-1.mjs +0 -8
  132. package/dist/presets/firebase/runtime/firebase-gen-2.d.ts +0 -2
  133. package/dist/presets/firebase/runtime/firebase-gen-2.mjs +0 -15
  134. package/dist/presets/firebase/runtime/firebase-gen-default.d.ts +0 -1
  135. package/dist/presets/firebase/runtime/firebase-gen-default.mjs +0 -1
  136. package/dist/presets/firebase/types.d.ts +0 -37
  137. package/dist/presets/firebase/types.mjs +0 -0
  138. package/dist/presets/firebase/utils.d.ts +0 -3
  139. package/dist/presets/firebase/utils.mjs +0 -50
  140. package/dist/presets/flightcontrol/preset.d.ts +0 -2
  141. package/dist/presets/flightcontrol/preset.mjs +0 -11
  142. package/dist/presets/heroku/preset.d.ts +0 -2
  143. package/dist/presets/heroku/preset.mjs +0 -11
  144. package/dist/presets/iis/preset.d.ts +0 -2
  145. package/dist/presets/iis/preset.mjs +0 -32
  146. package/dist/presets/iis/utils.d.ts +0 -3
  147. package/dist/presets/iis/utils.mjs +0 -159
  148. package/dist/presets/koyeb/preset.d.ts +0 -2
  149. package/dist/presets/koyeb/preset.mjs +0 -11
  150. package/dist/presets/netlify/legacy/preset.d.ts +0 -2
  151. package/dist/presets/netlify/legacy/preset.mjs +0 -145
  152. package/dist/presets/netlify/legacy/runtime/netlify-builder.d.ts +0 -2
  153. package/dist/presets/netlify/legacy/runtime/netlify-builder.mjs +0 -4
  154. package/dist/presets/netlify/legacy/runtime/netlify-edge.d.ts +0 -2
  155. package/dist/presets/netlify/legacy/runtime/netlify-edge.mjs +0 -25
  156. package/dist/presets/netlify/legacy/runtime/netlify-lambda.d.ts +0 -3
  157. package/dist/presets/netlify/legacy/runtime/netlify-lambda.mjs +0 -38
  158. package/dist/presets/netlify/legacy/runtime/netlify.d.ts +0 -3
  159. package/dist/presets/netlify/legacy/runtime/netlify.mjs +0 -21
  160. package/dist/presets/netlify/legacy/utils.d.ts +0 -4
  161. package/dist/presets/netlify/legacy/utils.mjs +0 -113
  162. package/dist/presets/netlify/preset.d.ts +0 -3
  163. package/dist/presets/netlify/preset.mjs +0 -130
  164. package/dist/presets/netlify/runtime/netlify-edge.d.ts +0 -2
  165. package/dist/presets/netlify/runtime/netlify-edge.mjs +0 -25
  166. package/dist/presets/netlify/runtime/netlify.d.ts +0 -3
  167. package/dist/presets/netlify/runtime/netlify.mjs +0 -53
  168. package/dist/presets/netlify/types.d.ts +0 -12
  169. package/dist/presets/netlify/types.mjs +0 -0
  170. package/dist/presets/netlify/utils.d.ts +0 -5
  171. package/dist/presets/netlify/utils.mjs +0 -94
  172. package/dist/presets/node/preset.d.ts +0 -2
  173. package/dist/presets/node/preset.mjs +0 -49
  174. package/dist/presets/node/runtime/cli.d.ts +0 -1
  175. package/dist/presets/node/runtime/cli.mjs +0 -21
  176. package/dist/presets/node/runtime/cluster.d.ts +0 -1
  177. package/dist/presets/node/runtime/cluster.mjs +0 -58
  178. package/dist/presets/node/runtime/node-listener.d.ts +0 -6
  179. package/dist/presets/node/runtime/node-listener.mjs +0 -13
  180. package/dist/presets/node/runtime/node-server.d.ts +0 -3
  181. package/dist/presets/node/runtime/node-server.mjs +0 -43
  182. package/dist/presets/platform.sh/preset.d.ts +0 -2
  183. package/dist/presets/platform.sh/preset.mjs +0 -11
  184. package/dist/presets/render.com/preset.d.ts +0 -2
  185. package/dist/presets/render.com/preset.mjs +0 -11
  186. package/dist/presets/stormkit/preset.d.ts +0 -2
  187. package/dist/presets/stormkit/preset.mjs +0 -15
  188. package/dist/presets/stormkit/runtime/stormkit.d.ts +0 -21
  189. package/dist/presets/stormkit/runtime/stormkit.mjs +0 -32
  190. package/dist/presets/vercel/preset.d.ts +0 -3
  191. package/dist/presets/vercel/preset.mjs +0 -104
  192. package/dist/presets/vercel/runtime/vercel-edge.d.ts +0 -2
  193. package/dist/presets/vercel/runtime/vercel-edge.mjs +0 -22
  194. package/dist/presets/vercel/runtime/vercel.d.ts +0 -4
  195. package/dist/presets/vercel/runtime/vercel.mjs +0 -17
  196. package/dist/presets/vercel/types.d.ts +0 -78
  197. package/dist/presets/vercel/types.mjs +0 -0
  198. package/dist/presets/vercel/utils.d.ts +0 -5
  199. package/dist/presets/vercel/utils.mjs +0 -186
  200. package/dist/presets/winterjs/preset.d.ts +0 -2
  201. package/dist/presets/winterjs/preset.mjs +0 -20
  202. package/dist/presets/winterjs/runtime/winterjs.d.ts +0 -1
  203. package/dist/presets/winterjs/runtime/winterjs.mjs +0 -69
  204. package/dist/presets/zeabur/preset.d.ts +0 -2
  205. package/dist/presets/zeabur/preset.mjs +0 -70
  206. package/dist/presets/zeabur/runtime/zeabur.d.ts +0 -4
  207. package/dist/presets/zeabur/runtime/zeabur.mjs +0 -8
  208. package/dist/runtime/app.d.ts +0 -2
  209. package/dist/runtime/app.mjs +0 -1
  210. package/dist/runtime/cache.d.ts +0 -1
  211. package/dist/runtime/cache.mjs +0 -6
  212. package/dist/runtime/config.d.ts +0 -1
  213. package/dist/runtime/config.mjs +0 -1
  214. package/dist/runtime/context.d.ts +0 -1
  215. package/dist/runtime/context.mjs +0 -1
  216. package/dist/runtime/database.d.ts +0 -1
  217. package/dist/runtime/database.mjs +0 -1
  218. package/dist/runtime/error.d.ts +0 -1
  219. package/dist/runtime/error.mjs +0 -1
  220. package/dist/runtime/internal/app.d.ts +0 -3
  221. package/dist/runtime/internal/app.mjs +0 -152
  222. package/dist/runtime/internal/cache.d.ts +0 -8
  223. package/dist/runtime/internal/cache.mjs +0 -329
  224. package/dist/runtime/internal/client.d.ts +0 -1
  225. package/dist/runtime/internal/client.mjs +0 -4
  226. package/dist/runtime/internal/config.d.ts +0 -6
  227. package/dist/runtime/internal/config.mjs +0 -58
  228. package/dist/runtime/internal/context.d.ts +0 -12
  229. package/dist/runtime/internal/context.mjs +0 -17
  230. package/dist/runtime/internal/database.d.ts +0 -2
  231. package/dist/runtime/internal/database.mjs +0 -14
  232. package/dist/runtime/internal/debug.d.ts +0 -2
  233. package/dist/runtime/internal/debug.mjs +0 -5
  234. package/dist/runtime/internal/error.d.ts +0 -4
  235. package/dist/runtime/internal/error.mjs +0 -71
  236. package/dist/runtime/internal/lib/http-graceful-shutdown.d.ts +0 -16
  237. package/dist/runtime/internal/lib/http-graceful-shutdown.mjs +0 -213
  238. package/dist/runtime/internal/meta.d.ts +0 -2
  239. package/dist/runtime/internal/meta.mjs +0 -3
  240. package/dist/runtime/internal/plugin.d.ts +0 -3
  241. package/dist/runtime/internal/plugin.mjs +0 -4
  242. package/dist/runtime/internal/polyfill/deno-env.d.ts +0 -0
  243. package/dist/runtime/internal/polyfill/deno-env.mjs +0 -1
  244. package/dist/runtime/internal/renderer.d.ts +0 -2
  245. package/dist/runtime/internal/renderer.mjs +0 -38
  246. package/dist/runtime/internal/route-rules.d.ts +0 -14
  247. package/dist/runtime/internal/route-rules.mjs +0 -67
  248. package/dist/runtime/internal/routes/openapi.d.ts +0 -3
  249. package/dist/runtime/internal/routes/openapi.mjs +0 -85
  250. package/dist/runtime/internal/routes/scalar.d.ts +0 -2
  251. package/dist/runtime/internal/routes/scalar.mjs +0 -191
  252. package/dist/runtime/internal/routes/swagger.d.ts +0 -2
  253. package/dist/runtime/internal/routes/swagger.mjs +0 -39
  254. package/dist/runtime/internal/shutdown.d.ts +0 -10
  255. package/dist/runtime/internal/shutdown.mjs +0 -34
  256. package/dist/runtime/internal/static.d.ts +0 -2
  257. package/dist/runtime/internal/static.mjs +0 -89
  258. package/dist/runtime/internal/storage.d.ts +0 -2
  259. package/dist/runtime/internal/storage.mjs +0 -5
  260. package/dist/runtime/internal/task.d.ts +0 -17
  261. package/dist/runtime/internal/task.mjs +0 -73
  262. package/dist/runtime/internal/timing.d.ts +0 -2
  263. package/dist/runtime/internal/timing.mjs +0 -29
  264. package/dist/runtime/internal/utils.azure.d.ts +0 -2
  265. package/dist/runtime/internal/utils.azure.mjs +0 -51
  266. package/dist/runtime/internal/utils.d.ts +0 -23
  267. package/dist/runtime/internal/utils.env.d.ts +0 -7
  268. package/dist/runtime/internal/utils.env.mjs +0 -39
  269. package/dist/runtime/internal/utils.lambda.d.ts +0 -12
  270. package/dist/runtime/internal/utils.lambda.mjs +0 -30
  271. package/dist/runtime/internal/utils.mjs +0 -129
  272. package/dist/runtime/plugin.d.ts +0 -1
  273. package/dist/runtime/plugin.mjs +0 -1
  274. package/dist/runtime/storage.d.ts +0 -1
  275. package/dist/runtime/storage.mjs +0 -1
  276. package/dist/runtime/task.d.ts +0 -1
  277. package/dist/runtime/task.mjs +0 -1
  278. package/dist/runtime/utils.d.ts +0 -1
  279. package/dist/runtime/utils.mjs +0 -1
  280. package/dist/shared/nitro.DkCt8MDS.d.mts +0 -588
  281. package/dist/shared/nitro.DkCt8MDS.d.ts +0 -588
@@ -1,2436 +1 @@
1
- import { createHooks, createDebugger } from 'hookable';
2
- import { createUnimport } from 'unimport';
3
- import consola, { consola as consola$1 } from 'consola';
4
- import { watchConfig, loadConfig } from 'c12';
5
- import { klona } from 'klona/full';
6
- import { resolveCompatibilityDatesFromEnv, formatDate, resolveCompatibilityDates, formatCompatibilityDate } from 'compatx';
7
- import { isDebug, isTest, nodeMajorVersion, provider } from 'std-env';
8
- import { resolve, relative, join, normalize, isAbsolute, dirname } from 'pathe';
9
- import { runtimeDir, pkgDir } from 'nitropack/runtime/meta';
10
- export { runtimeDependencies as nitroRuntimeDependencies } from 'nitropack/runtime/meta';
11
- import { colorize } from 'consola/utils';
12
- import { findWorkspaceDir } from 'pkg-types';
13
- import { resolveNitroPath, isDirectory, writeFile, prettyPath } from 'nitropack/kit';
14
- export { defineNitroPreset } from 'nitropack/kit';
15
- import { existsSync, promises, accessSync } from 'node:fs';
16
- import escapeRE from 'escape-string-regexp';
17
- import { resolveModuleExportNames, resolvePath, parseNodeModulePath, lookupNodeModuleSubpath } from 'mlly';
18
- import defu$1, { defu } from 'defu';
19
- import { withLeadingSlash, withoutTrailingSlash, withTrailingSlash, withBase, parseURL, joinURL, withoutBase } from 'ufo';
20
- import { createStorage as createStorage$1, builtinDrivers } from 'unstorage';
21
- import jiti from 'jiti';
22
- import fsp, { readFile, writeFile as writeFile$1 } from 'node:fs/promises';
23
- import { ofetch } from 'ofetch';
24
- import { globby } from 'globby';
25
- import { pathToFileURL } from 'node:url';
26
- import chalk from 'chalk';
27
- import { toRouteMatcher, createRouter } from 'radix3';
28
- import mime from 'mime';
29
- import { getRollupConfig } from 'nitropack/rollup';
30
- import * as rollup from 'rollup';
31
- import { watch } from 'chokidar';
32
- import { debounce } from 'perfect-debounce';
33
- import { resolveAlias } from 'pathe/utils';
34
- import { genTypeImport } from 'knitwork';
35
- import { generateTypes, resolveSchema } from 'untyped';
36
- import { upperFirst } from 'scule';
37
- import prettyBytes from 'pretty-bytes';
38
- import { gzipSize } from 'gzip-size';
39
- import { version } from 'nitropack/meta';
40
- import zlib from 'node:zlib';
41
- import { Worker } from 'node:worker_threads';
42
- import { eventHandler, getRequestHeader, createError, setResponseHeader, setResponseStatus, getResponseStatus, getResponseStatusText, send, createApp, fromNodeMiddleware, toNodeListener } from 'h3';
43
- import { createProxyServer } from 'httpxy';
44
- import { listen } from 'listhen';
45
- import { servePlaceholder } from 'serve-placeholder';
46
- import serveStatic from 'serve-static';
47
- import fse from 'fs-extra';
48
-
49
- const NitroDefaults = {
50
- // General
51
- debug: isDebug,
52
- timing: isDebug,
53
- logLevel: isTest ? 1 : 3,
54
- runtimeConfig: { app: {}, nitro: {} },
55
- appConfig: {},
56
- appConfigFiles: [],
57
- // Dirs
58
- scanDirs: [],
59
- buildDir: ".nitro",
60
- output: {
61
- dir: "{{ rootDir }}/.output",
62
- serverDir: "{{ output.dir }}/server",
63
- publicDir: "{{ output.dir }}/public"
64
- },
65
- // Features
66
- experimental: {},
67
- future: {},
68
- storage: {},
69
- devStorage: {},
70
- bundledStorage: [],
71
- publicAssets: [],
72
- serverAssets: [],
73
- plugins: [],
74
- tasks: {},
75
- scheduledTasks: {},
76
- imports: {
77
- exclude: [],
78
- dirs: [],
79
- presets: [],
80
- virtualImports: ["#imports"]
81
- },
82
- virtual: {},
83
- compressPublicAssets: false,
84
- ignore: [],
85
- // Dev
86
- dev: false,
87
- devServer: { watch: [] },
88
- watchOptions: { ignoreInitial: true },
89
- devProxy: {},
90
- // Logging
91
- logging: {
92
- compressedSizes: true,
93
- buildSuccess: true
94
- },
95
- // Routing
96
- baseURL: process.env.NITRO_APP_BASE_URL || "/",
97
- handlers: [],
98
- devHandlers: [],
99
- // errorHandler: "nitropack/runtime/internal/error",
100
- errorHandler: "#internal/nitro/error",
101
- routeRules: {},
102
- prerender: {
103
- autoSubfolderIndex: true,
104
- concurrency: 1,
105
- interval: 0,
106
- retry: 3,
107
- retryDelay: 500,
108
- failOnError: false,
109
- crawlLinks: false,
110
- ignore: [],
111
- routes: []
112
- },
113
- // Rollup
114
- unenv: {},
115
- analyze: false,
116
- moduleSideEffects: [
117
- "unenv/runtime/polyfill/",
118
- "node-fetch-native/polyfill",
119
- "node-fetch-native/dist/polyfill",
120
- resolve(runtimeDir, "polyfill/")
121
- ],
122
- replace: {},
123
- node: true,
124
- sourceMap: true,
125
- esbuild: {
126
- options: {
127
- jsxFactory: "h",
128
- jsxFragment: "Fragment"
129
- }
130
- },
131
- // Advanced
132
- typescript: {
133
- strict: false,
134
- generateTsConfig: true,
135
- generateRuntimeConfigTypes: true,
136
- tsconfigPath: "types/tsconfig.json",
137
- internalPaths: false,
138
- tsConfig: {}
139
- },
140
- nodeModulesDirs: [],
141
- hooks: {},
142
- commands: {},
143
- // Framework
144
- framework: {
145
- name: "nitro",
146
- version: ""
147
- }
148
- };
149
-
150
- const fallbackCompatibilityDate = "2024-04-03";
151
- async function resolveCompatibilityOptions(options) {
152
- options.compatibilityDate = resolveCompatibilityDatesFromEnv(
153
- options.compatibilityDate
154
- );
155
- if (!options.compatibilityDate.default && options.preset !== "nitro-prerender") {
156
- options.compatibilityDate.default = await _resolveDefault(options);
157
- }
158
- }
159
- let _fallbackInfoShown = false;
160
- let _promptedUserToUpdate = false;
161
- async function _resolveDefault(options) {
162
- const _todayDate = formatDate(/* @__PURE__ */ new Date());
163
- const consola$1 = consola.withTag("nitro");
164
- consola$1.warn(`No valid compatibility date is specified.`);
165
- const onFallback = () => {
166
- if (!_fallbackInfoShown) {
167
- consola$1.info(
168
- [
169
- `Using \`${fallbackCompatibilityDate}\` as fallback.`,
170
- ` Please specify compatibility date to avoid unwanted behavior changes:`,
171
- ` - Add \`compatibilityDate: '${_todayDate}'\` to the config file.`,
172
- ` - Or set \`COMPATIBILITY_DATE=${_todayDate}\` environment variable.`,
173
- ``
174
- ].join("\n")
175
- );
176
- _fallbackInfoShown = true;
177
- }
178
- return fallbackCompatibilityDate;
179
- };
180
- const shallUpdate = options._cli?.command === "dev" && !_promptedUserToUpdate && await consola$1.prompt(
181
- `Do you want to auto update config file to set ${colorize("cyan", `compatibilityDate: '${_todayDate}'`)}?`,
182
- {
183
- type: "confirm",
184
- default: true
185
- }
186
- );
187
- _promptedUserToUpdate = true;
188
- if (!shallUpdate) {
189
- return onFallback();
190
- }
191
- const { updateConfig } = await import('c12/update');
192
- const updateResult = await updateConfig({
193
- configFile: "nitro.config",
194
- cwd: options.rootDir,
195
- async onCreate({ configFile }) {
196
- const shallCreate = await consola$1.prompt(
197
- `Do you want to initialize a new config in ${colorize("cyan", relative(".", configFile))}?`,
198
- {
199
- type: "confirm",
200
- default: true
201
- }
202
- );
203
- if (shallCreate !== true) {
204
- return false;
205
- }
206
- return _getDefaultNitroConfig();
207
- },
208
- async onUpdate(config) {
209
- config.compatibilityDate = _todayDate;
210
- }
211
- }).catch((error) => {
212
- consola$1.error(`Failed to update config: ${error.message}`);
213
- return null;
214
- });
215
- if (updateResult?.configFile) {
216
- consola$1.success(
217
- `Compatibility date set to \`${_todayDate}\` in \`${relative(".", updateResult.configFile)}\``
218
- );
219
- return _todayDate;
220
- }
221
- return onFallback();
222
- }
223
- function _getDefaultNitroConfig() {
224
- return (
225
- /* js */
226
- `
227
- import { defineNitroConfig } from 'nitropack/config'
228
-
229
- export default defineNitroConfig({})
230
- `
231
- );
232
- }
233
-
234
- async function resolvePathOptions(options) {
235
- options.rootDir = resolve(options.rootDir || ".");
236
- options.workspaceDir = await findWorkspaceDir(options.rootDir).catch(
237
- () => options.rootDir
238
- );
239
- options.srcDir = resolve(options.srcDir || options.rootDir);
240
- for (const key of ["srcDir", "buildDir"]) {
241
- options[key] = resolve(options.rootDir, options[key]);
242
- }
243
- options.alias = {
244
- ...options.alias,
245
- "~/": join(options.srcDir, "/"),
246
- "@/": join(options.srcDir, "/"),
247
- "~~/": join(options.rootDir, "/"),
248
- "@@/": join(options.rootDir, "/")
249
- };
250
- if (!options.static && !options.entry) {
251
- throw new Error(
252
- `Nitro entry is missing! Is "${options.preset}" preset correct?`
253
- );
254
- }
255
- if (options.entry) {
256
- options.entry = resolveNitroPath(options.entry, options);
257
- }
258
- options.output.dir = resolveNitroPath(
259
- options.output.dir || NitroDefaults.output.dir,
260
- options,
261
- options.rootDir
262
- );
263
- options.output.publicDir = resolveNitroPath(
264
- options.output.publicDir || NitroDefaults.output.publicDir,
265
- options,
266
- options.rootDir
267
- );
268
- options.output.serverDir = resolveNitroPath(
269
- options.output.serverDir || NitroDefaults.output.serverDir,
270
- options,
271
- options.rootDir
272
- );
273
- options.nodeModulesDirs.push(resolve(options.workspaceDir, "node_modules"));
274
- options.nodeModulesDirs.push(resolve(options.rootDir, "node_modules"));
275
- options.nodeModulesDirs.push(resolve(pkgDir, "node_modules"));
276
- options.nodeModulesDirs.push(resolve(pkgDir, ".."));
277
- options.nodeModulesDirs = [
278
- ...new Set(
279
- options.nodeModulesDirs.map((dir) => resolve(options.rootDir, dir))
280
- )
281
- ];
282
- options.plugins = options.plugins.map((p) => resolveNitroPath(p, options));
283
- options.scanDirs.unshift(options.srcDir);
284
- options.scanDirs = options.scanDirs.map(
285
- (dir) => resolve(options.srcDir, dir)
286
- );
287
- options.scanDirs = [...new Set(options.scanDirs)];
288
- options.appConfigFiles ??= [];
289
- options.appConfigFiles = options.appConfigFiles.map((file) => _tryResolve(resolveNitroPath(file, options))).filter(Boolean);
290
- for (const dir of options.scanDirs) {
291
- const configFile = _tryResolve("app.config", dir);
292
- if (configFile && !options.appConfigFiles.includes(configFile)) {
293
- options.appConfigFiles.push(configFile);
294
- }
295
- }
296
- }
297
- function _tryResolve(path, base = ".", extensions = ["", ".js", ".ts", ".mjs", ".cjs", ".json"]) {
298
- path = resolve(base, path);
299
- if (existsSync(path)) {
300
- return path;
301
- }
302
- for (const ext of extensions) {
303
- const p = path + ext;
304
- if (existsSync(p)) {
305
- return p;
306
- }
307
- }
308
- }
309
-
310
- async function resolveImportsOptions(options) {
311
- if (options.imports === false) {
312
- return;
313
- }
314
- options.imports.presets ??= [];
315
- options.imports.presets.push(...getNitroImportsPreset());
316
- const h3Exports = await resolveModuleExportNames("h3", {
317
- url: import.meta.url
318
- });
319
- options.imports.presets ??= [];
320
- options.imports.presets.push({
321
- from: "h3",
322
- imports: h3Exports.filter((n) => !/^[A-Z]/.test(n) && n !== "use")
323
- });
324
- options.imports.dirs ??= [];
325
- options.imports.dirs.push(
326
- ...options.scanDirs.map((dir) => join(dir, "utils/*"))
327
- );
328
- if (Array.isArray(options.imports.exclude) && options.imports.exclude.length === 0) {
329
- options.imports.exclude.push(/[/\\]\.git[/\\]/);
330
- options.imports.exclude.push(options.buildDir);
331
- const scanDirsInNodeModules = options.scanDirs.map((dir) => dir.match(/(?<=\/)node_modules\/(.+)$/)?.[1]).filter(Boolean);
332
- options.imports.exclude.push(
333
- scanDirsInNodeModules.length > 0 ? new RegExp(
334
- `node_modules\\/(?!${scanDirsInNodeModules.map((dir) => escapeRE(dir)).join("|")})`
335
- ) : /[/\\]node_modules[/\\]/
336
- );
337
- }
338
- }
339
- function getNitroImportsPreset() {
340
- return [
341
- {
342
- from: "nitropack/runtime",
343
- imports: [
344
- "defineCachedFunction",
345
- "defineCachedEventHandler",
346
- "cachedFunction",
347
- "cachedEventHandler",
348
- "useRuntimeConfig",
349
- "useStorage",
350
- "useNitroApp",
351
- "defineNitroPlugin",
352
- "nitroPlugin",
353
- "defineRenderHandler",
354
- "defineRouteMeta",
355
- "getRouteRules",
356
- "useAppConfig",
357
- "useEvent",
358
- "defineTask",
359
- "runTask",
360
- "defineNitroErrorHandler"
361
- ]
362
- }
363
- ];
364
- }
365
-
366
- async function resolveRouteRulesOptions(options) {
367
- options.routeRules = defu(options.routeRules, options.routes || {});
368
- options.routeRules = normalizeRouteRules(options);
369
- }
370
- function normalizeRouteRules(config) {
371
- const normalizedRules = {};
372
- for (const path in config.routeRules) {
373
- const routeConfig = config.routeRules[path];
374
- const routeRules = {
375
- ...routeConfig,
376
- redirect: void 0,
377
- proxy: void 0
378
- };
379
- if (routeConfig.redirect) {
380
- routeRules.redirect = {
381
- // @ts-ignore
382
- to: "/",
383
- statusCode: 307,
384
- ...typeof routeConfig.redirect === "string" ? { to: routeConfig.redirect } : routeConfig.redirect
385
- };
386
- if (path.endsWith("/**")) {
387
- routeRules.redirect._redirectStripBase = path.slice(0, -3);
388
- }
389
- }
390
- if (routeConfig.proxy) {
391
- routeRules.proxy = typeof routeConfig.proxy === "string" ? { to: routeConfig.proxy } : routeConfig.proxy;
392
- if (path.endsWith("/**")) {
393
- routeRules.proxy._proxyStripBase = path.slice(0, -3);
394
- }
395
- }
396
- if (routeConfig.cors) {
397
- routeRules.headers = {
398
- "access-control-allow-origin": "*",
399
- "access-control-allow-methods": "*",
400
- "access-control-allow-headers": "*",
401
- "access-control-max-age": "0",
402
- ...routeRules.headers
403
- };
404
- }
405
- if (routeConfig.swr) {
406
- routeRules.cache = routeRules.cache || {};
407
- routeRules.cache.swr = true;
408
- if (typeof routeConfig.swr === "number") {
409
- routeRules.cache.maxAge = routeConfig.swr;
410
- }
411
- }
412
- if (routeConfig.cache === false) {
413
- routeRules.cache = false;
414
- }
415
- normalizedRules[path] = routeRules;
416
- }
417
- return normalizedRules;
418
- }
419
-
420
- async function resolveDatabaseOptions(options) {
421
- if (options.experimental.database && options.imports) {
422
- options.imports.presets.push({
423
- from: "nitropack/runtime",
424
- imports: ["useDatabase"]
425
- });
426
- if (options.dev && !options.database && !options.devDatabase) {
427
- options.devDatabase = {
428
- default: {
429
- connector: "sqlite",
430
- options: {
431
- cwd: options.rootDir
432
- }
433
- }
434
- };
435
- } else if (options.node && !options.database) {
436
- options.database = {
437
- default: {
438
- connector: "sqlite",
439
- options: {}
440
- }
441
- };
442
- }
443
- }
444
- }
445
-
446
- async function resolveFetchOptions(options) {
447
- if (options.experimental.nodeFetchCompat === void 0) {
448
- options.experimental.nodeFetchCompat = (nodeMajorVersion || 0) < 18;
449
- if (options.experimental.nodeFetchCompat && provider !== "stackblitz") {
450
- consola.warn(
451
- "Node fetch compatibility is enabled. Please consider upgrading to Node.js >= 18."
452
- );
453
- }
454
- }
455
- if (!options.experimental.nodeFetchCompat) {
456
- options.alias = {
457
- "node-fetch-native/polyfill": "unenv/runtime/mock/empty",
458
- "node-fetch-native": "node-fetch-native/native",
459
- ...options.alias
460
- };
461
- }
462
- }
463
-
464
- async function resolveExportConditionsOptions(options) {
465
- options.exportConditions = _resolveExportConditions(
466
- options.exportConditions,
467
- { dev: options.dev, node: options.node, wasm: options.experimental.wasm }
468
- );
469
- }
470
- function _resolveExportConditions(conditions = [], opts) {
471
- const resolvedConditions = [];
472
- resolvedConditions.push(opts.dev ? "development" : "production");
473
- resolvedConditions.push(...conditions);
474
- if (opts.node) {
475
- resolvedConditions.push("node");
476
- } else {
477
- resolvedConditions.push(
478
- "wintercg",
479
- "worker",
480
- "web",
481
- "browser",
482
- "workerd",
483
- "edge-light",
484
- "netlify",
485
- "edge-routine",
486
- "deno"
487
- );
488
- }
489
- if (opts.wasm) {
490
- resolvedConditions.push("wasm", "unwasm");
491
- }
492
- resolvedConditions.push("import", "default");
493
- return resolvedConditions.filter(
494
- (c, i) => resolvedConditions.indexOf(c) === i
495
- );
496
- }
497
-
498
- async function resolveRuntimeConfigOptions(options) {
499
- options.runtimeConfig = normalizeRuntimeConfig(options);
500
- }
501
- function normalizeRuntimeConfig(config) {
502
- provideFallbackValues(config.runtimeConfig || {});
503
- const runtimeConfig = defu$1(
504
- config.runtimeConfig,
505
- {
506
- app: {
507
- baseURL: config.baseURL
508
- },
509
- nitro: {
510
- envExpansion: config.experimental?.envExpansion,
511
- openAPI: config.openAPI
512
- }
513
- }
514
- );
515
- runtimeConfig.nitro.routeRules = config.routeRules;
516
- return runtimeConfig;
517
- }
518
- function provideFallbackValues(obj) {
519
- for (const key in obj) {
520
- if (obj[key] === void 0 || obj[key] === null) {
521
- obj[key] = "";
522
- } else if (typeof obj[key] === "object") {
523
- provideFallbackValues(obj[key]);
524
- }
525
- }
526
- }
527
-
528
- async function resolveOpenAPIOptions(options) {
529
- if (options.dev && options.experimental.openAPI) {
530
- options.handlers.push({
531
- route: "/_nitro/openapi.json",
532
- handler: "nitropack/runtime/internal/routes/openapi"
533
- });
534
- options.handlers.push({
535
- route: "/_nitro/scalar",
536
- handler: "nitropack/runtime/internal/routes/scalar"
537
- });
538
- options.handlers.push({
539
- route: "/_nitro/swagger",
540
- handler: "nitropack/runtime/internal/routes/swagger"
541
- });
542
- }
543
- }
544
-
545
- async function resolveAssetsOptions(options) {
546
- for (const publicAsset of options.publicAssets) {
547
- publicAsset.dir = resolve(options.srcDir, publicAsset.dir);
548
- publicAsset.baseURL = withLeadingSlash(
549
- withoutTrailingSlash(publicAsset.baseURL || "/")
550
- );
551
- }
552
- for (const dir of options.scanDirs) {
553
- const publicDir = resolve(dir, "public");
554
- if (!existsSync(publicDir)) {
555
- continue;
556
- }
557
- if (options.publicAssets.some((asset) => asset.dir === publicDir)) {
558
- continue;
559
- }
560
- options.publicAssets.push({ dir: publicDir });
561
- }
562
- for (const serverAsset of options.serverAssets) {
563
- serverAsset.dir = resolve(options.srcDir, serverAsset.dir);
564
- }
565
- options.serverAssets.push({
566
- baseName: "server",
567
- dir: resolve(options.srcDir, "assets")
568
- });
569
- for (const asset of options.publicAssets) {
570
- asset.baseURL = asset.baseURL || "/";
571
- const isTopLevel = asset.baseURL === "/";
572
- asset.fallthrough = asset.fallthrough ?? isTopLevel;
573
- const routeRule = options.routeRules[asset.baseURL + "/**"];
574
- asset.maxAge = routeRule?.cache?.maxAge ?? asset.maxAge ?? 0;
575
- if (asset.maxAge && !asset.fallthrough) {
576
- options.routeRules[asset.baseURL + "/**"] = defu(routeRule, {
577
- headers: {
578
- "cache-control": `public, max-age=${asset.maxAge}, immutable`
579
- }
580
- });
581
- }
582
- }
583
- }
584
-
585
- async function resolveURLOptions(options) {
586
- options.baseURL = withLeadingSlash(withTrailingSlash(options.baseURL));
587
- }
588
-
589
- const configResolvers = [
590
- resolveCompatibilityOptions,
591
- resolvePathOptions,
592
- resolveImportsOptions,
593
- resolveRouteRulesOptions,
594
- resolveDatabaseOptions,
595
- resolveFetchOptions,
596
- resolveExportConditionsOptions,
597
- resolveRuntimeConfigOptions,
598
- resolveOpenAPIOptions,
599
- resolveURLOptions,
600
- resolveAssetsOptions
601
- ];
602
- async function loadOptions(configOverrides = {}, opts = {}) {
603
- const options = await _loadUserConfig(configOverrides, opts);
604
- for (const resolver of configResolvers) {
605
- await resolver(options);
606
- }
607
- return options;
608
- }
609
- async function _loadUserConfig(configOverrides = {}, opts = {}) {
610
- let presetOverride = configOverrides.preset || process.env.NITRO_PRESET || process.env.SERVER_PRESET;
611
- if (configOverrides.dev) {
612
- presetOverride = "nitro-dev";
613
- }
614
- configOverrides = klona(configOverrides);
615
- globalThis.defineNitroConfig = globalThis.defineNitroConfig || ((c) => c);
616
- let compatibilityDate = configOverrides.compatibilityDate || opts.compatibilityDate || (process.env.NITRO_COMPATIBILITY_DATE || process.env.SERVER_COMPATIBILITY_DATE || process.env.COMPATIBILITY_DATE);
617
- const { resolvePreset } = await import('nitropack/presets');
618
- const loadedConfig = await (opts.watch ? watchConfig : loadConfig)({
619
- name: "nitro",
620
- cwd: configOverrides.rootDir,
621
- dotenv: configOverrides.dev,
622
- extend: { extendKey: ["extends", "preset"] },
623
- overrides: {
624
- ...configOverrides,
625
- preset: presetOverride
626
- },
627
- async defaultConfig({ configs }) {
628
- if (!compatibilityDate) {
629
- compatibilityDate = configs.main?.compatibilityDate || configs.rc?.compatibilityDate || configs.packageJson?.compatibilityDate;
630
- }
631
- return {
632
- preset: (await resolvePreset("", {
633
- static: configOverrides.static,
634
- compatibilityDate: compatibilityDate || fallbackCompatibilityDate
635
- }))?._meta?.name
636
- };
637
- },
638
- defaults: NitroDefaults,
639
- jitiOptions: {
640
- alias: {
641
- nitropack: "nitropack/config",
642
- "nitropack/config": "nitropack/config"
643
- }
644
- },
645
- async resolve(id) {
646
- const preset = await resolvePreset(id, {
647
- static: configOverrides.static,
648
- compatibilityDate: compatibilityDate || fallbackCompatibilityDate
649
- });
650
- if (preset) {
651
- return {
652
- config: preset
653
- };
654
- }
655
- },
656
- ...opts.c12
657
- });
658
- const options = klona(loadedConfig.config);
659
- options._config = configOverrides;
660
- options._c12 = loadedConfig;
661
- const _presetName = (loadedConfig.layers || []).find((l) => l.config?._meta?.name)?.config?._meta?.name || presetOverride;
662
- options.preset = _presetName;
663
- options.compatibilityDate = resolveCompatibilityDates(
664
- compatibilityDate,
665
- options.compatibilityDate
666
- );
667
- return options;
668
- }
669
-
670
- async function createStorage(nitro) {
671
- const storage = createStorage$1();
672
- const mounts = {
673
- ...nitro.options.storage,
674
- ...nitro.options.devStorage
675
- };
676
- for (const [path, opts] of Object.entries(mounts)) {
677
- if (opts.driver) {
678
- const driver = await import(builtinDrivers[opts.driver] || opts.driver).then((r) => r.default || r);
679
- storage.mount(path, driver(opts));
680
- } else {
681
- nitro.logger.warn(`No \`driver\` set for storage mount point "${path}".`);
682
- }
683
- }
684
- return storage;
685
- }
686
- async function snapshotStorage(nitro) {
687
- const data = {};
688
- const allKeys = [
689
- ...new Set(
690
- await Promise.all(
691
- nitro.options.bundledStorage.map((base) => nitro.storage.getKeys(base))
692
- ).then((r) => r.flat())
693
- )
694
- ];
695
- await Promise.all(
696
- allKeys.map(async (key) => {
697
- data[key] = await nitro.storage.getItem(key);
698
- })
699
- );
700
- return data;
701
- }
702
-
703
- async function installModules(nitro) {
704
- const _modules = [...nitro.options.modules || []];
705
- const modules = await Promise.all(
706
- _modules.map((mod) => _resolveNitroModule(mod, nitro.options))
707
- );
708
- const _installedURLs = /* @__PURE__ */ new Set();
709
- for (const mod of modules) {
710
- if (mod._url) {
711
- if (_installedURLs.has(mod._url)) {
712
- continue;
713
- }
714
- _installedURLs.add(mod._url);
715
- }
716
- await mod.setup(nitro);
717
- }
718
- }
719
- function _resolveNitroModule(mod, nitroOptions) {
720
- let _url;
721
- if (typeof mod === "string") {
722
- globalThis.defineNitroModule = // @ts-ignore
723
- globalThis.defineNitroModule || ((mod2) => mod2);
724
- const _jiti = jiti(nitroOptions.rootDir, {
725
- interopDefault: true,
726
- esmResolve: true,
727
- alias: nitroOptions.alias
728
- });
729
- const _modPath = _jiti.resolve(mod);
730
- _url = _modPath;
731
- mod = _jiti(_modPath);
732
- }
733
- if (typeof mod === "function") {
734
- mod = { setup: mod };
735
- }
736
- if (!mod.setup) {
737
- mod.setup = () => {
738
- };
739
- }
740
- return Promise.resolve({
741
- _url,
742
- ...mod
743
- });
744
- }
745
-
746
- async function updateNitroConfig(nitro, config) {
747
- nitro.options.routeRules = normalizeRouteRules(
748
- config.routeRules ? config : nitro.options
749
- );
750
- nitro.options.runtimeConfig = normalizeRuntimeConfig(
751
- config.runtimeConfig ? config : nitro.options
752
- );
753
- await nitro.hooks.callHook("rollup:reload");
754
- consola.success("Nitro config hot reloaded!");
755
- }
756
-
757
- async function runTask(taskEvent, opts) {
758
- const ctx = await _getTasksContext(opts);
759
- const result = await ctx.devFetch(`/_nitro/tasks/${taskEvent.name}`, {
760
- method: "POST",
761
- body: taskEvent
762
- });
763
- return result;
764
- }
765
- async function listTasks(opts) {
766
- const ctx = await _getTasksContext(opts);
767
- const res = await ctx.devFetch("/_nitro/tasks");
768
- return res.tasks;
769
- }
770
- function addNitroTasksVirtualFile(nitro) {
771
- nitro.options.virtual["#nitro-internal-virtual/tasks"] = () => {
772
- const _scheduledTasks = Object.entries(nitro.options.scheduledTasks || {}).map(([cron, _tasks]) => {
773
- const tasks = (Array.isArray(_tasks) ? _tasks : [_tasks]).filter(
774
- (name) => {
775
- if (!nitro.options.tasks[name]) {
776
- nitro.logger.warn(`Scheduled task \`${name}\` is not defined!`);
777
- return false;
778
- }
779
- return true;
780
- }
781
- );
782
- return { cron, tasks };
783
- }).filter((e) => e.tasks.length > 0);
784
- const scheduledTasks = _scheduledTasks.length > 0 ? _scheduledTasks : false;
785
- return (
786
- /* js */
787
- `
788
- export const scheduledTasks = ${JSON.stringify(scheduledTasks)};
789
-
790
- export const tasks = {
791
- ${Object.entries(nitro.options.tasks).map(
792
- ([name, task]) => `"${name}": {
793
- meta: {
794
- description: ${JSON.stringify(task.description)},
795
- },
796
- resolve: ${task.handler ? `() => import("${normalize(
797
- task.handler
798
- )}").then(r => r.default || r)` : "undefined"},
799
- }`
800
- ).join(",\n")}
801
- };`
802
- );
803
- };
804
- }
805
- const _devHint = `(is dev server running?)`;
806
- async function _getTasksContext(opts) {
807
- const cwd = resolve(process.cwd(), opts?.cwd || ".");
808
- const outDir = resolve(cwd, opts?.buildDir || ".nitro");
809
- const buildInfoPath = resolve(outDir, "nitro.json");
810
- if (!existsSync(buildInfoPath)) {
811
- throw new Error(`Missing info file: \`${buildInfoPath}\` ${_devHint}`);
812
- }
813
- const buildInfo = JSON.parse(
814
- await readFile(buildInfoPath, "utf8")
815
- );
816
- if (!buildInfo.dev?.pid || !buildInfo.dev?.workerAddress) {
817
- throw new Error(
818
- `Missing dev server info in: \`${buildInfoPath}\` ${_devHint}`
819
- );
820
- }
821
- if (!_pidIsRunning(buildInfo.dev.pid)) {
822
- throw new Error(`Dev server is not running (pid: ${buildInfo.dev.pid})`);
823
- }
824
- const devFetch = ofetch.create({
825
- baseURL: `http://${buildInfo.dev.workerAddress.host || "localhost"}:${buildInfo.dev.workerAddress.port || "3000"}`,
826
- // @ts-expect-error
827
- socketPath: buildInfo.dev.workerAddress.socketPath
828
- });
829
- return {
830
- buildInfo,
831
- devFetch
832
- };
833
- }
834
- function _pidIsRunning(pid) {
835
- try {
836
- process.kill(pid, 0);
837
- return true;
838
- } catch {
839
- return false;
840
- }
841
- }
842
-
843
- const GLOB_SCAN_PATTERN = "**/*.{js,mjs,cjs,ts,mts,cts,tsx,jsx}";
844
- const suffixRegex = /\.(connect|delete|get|head|options|patch|post|put|trace)(\.(dev|prod|prerender))?$/;
845
- async function scanAndSyncOptions(nitro) {
846
- const scannedPlugins = await scanPlugins(nitro);
847
- for (const plugin of scannedPlugins) {
848
- if (!nitro.options.plugins.includes(plugin)) {
849
- nitro.options.plugins.push(plugin);
850
- }
851
- }
852
- if (nitro.options.experimental.tasks) {
853
- const scannedTasks = await scanTasks(nitro);
854
- for (const scannedTask of scannedTasks) {
855
- if (scannedTask.name in nitro.options.tasks) {
856
- if (!nitro.options.tasks[scannedTask.name].handler) {
857
- nitro.options.tasks[scannedTask.name].handler = scannedTask.handler;
858
- }
859
- } else {
860
- nitro.options.tasks[scannedTask.name] = {
861
- handler: scannedTask.handler,
862
- description: ""
863
- };
864
- }
865
- }
866
- }
867
- const scannedModules = await scanModules(nitro);
868
- nitro.options.modules = nitro.options.modules || [];
869
- for (const modPath of scannedModules) {
870
- if (!nitro.options.modules.includes(modPath)) {
871
- nitro.options.modules.push(modPath);
872
- }
873
- }
874
- }
875
- async function scanHandlers(nitro) {
876
- const middleware = await scanMiddleware(nitro);
877
- const handlers = await Promise.all([
878
- scanServerRoutes(
879
- nitro,
880
- nitro.options.apiDir || "api",
881
- nitro.options.apiBaseURL || "/api"
882
- ),
883
- scanServerRoutes(nitro, nitro.options.routesDir || "routes")
884
- ]).then((r) => r.flat());
885
- nitro.scannedHandlers = [
886
- ...middleware,
887
- ...handlers.filter((h, index, array) => {
888
- return array.findIndex(
889
- (h2) => h.route === h2.route && h.method === h2.method && h.env === h2.env
890
- ) === index;
891
- })
892
- ];
893
- return handlers;
894
- }
895
- async function scanMiddleware(nitro) {
896
- const files = await scanFiles(nitro, "middleware");
897
- return files.map((file) => {
898
- return {
899
- middleware: true,
900
- handler: file.fullPath
901
- };
902
- });
903
- }
904
- async function scanServerRoutes(nitro, dir, prefix = "/") {
905
- const files = await scanFiles(nitro, dir);
906
- return files.map((file) => {
907
- let route = file.path.replace(/\.[A-Za-z]+$/, "").replace(/\[\.{3}]/g, "**").replace(/\[\.{3}(\w+)]/g, "**:$1").replace(/\[(\w+)]/g, ":$1");
908
- route = withLeadingSlash(withoutTrailingSlash(withBase(route, prefix)));
909
- const suffixMatch = route.match(suffixRegex);
910
- let method;
911
- let env;
912
- if (suffixMatch?.index) {
913
- route = route.slice(0, Math.max(0, suffixMatch.index));
914
- method = suffixMatch[1];
915
- env = suffixMatch[3];
916
- }
917
- route = route.replace(/\/index$/, "") || "/";
918
- return {
919
- handler: file.fullPath,
920
- lazy: true,
921
- middleware: false,
922
- route,
923
- method,
924
- env
925
- };
926
- });
927
- }
928
- async function scanPlugins(nitro) {
929
- const files = await scanFiles(nitro, "plugins");
930
- return files.map((f) => f.fullPath);
931
- }
932
- async function scanTasks(nitro) {
933
- const files = await scanFiles(nitro, "tasks");
934
- return files.map((f) => {
935
- const name = f.path.replace(/\/index$/, "").replace(/\.[A-Za-z]+$/, "").replace(/\//g, ":");
936
- return { name, handler: f.fullPath };
937
- });
938
- }
939
- async function scanModules(nitro) {
940
- const files = await scanFiles(nitro, "modules");
941
- return files.map((f) => f.fullPath);
942
- }
943
- async function scanFiles(nitro, name) {
944
- const files = await Promise.all(
945
- nitro.options.scanDirs.map((dir) => scanDir(nitro, dir, name))
946
- ).then((r) => r.flat());
947
- return files;
948
- }
949
- async function scanDir(nitro, dir, name) {
950
- const fileNames = await globby(join(name, GLOB_SCAN_PATTERN), {
951
- cwd: dir,
952
- dot: true,
953
- ignore: nitro.options.ignore,
954
- absolute: true
955
- });
956
- return fileNames.map((fullPath) => {
957
- return {
958
- fullPath,
959
- path: relative(join(dir, name), fullPath)
960
- };
961
- }).sort((a, b) => a.path.localeCompare(b.path));
962
- }
963
-
964
- async function createNitro(config = {}, opts = {}) {
965
- const options = await loadOptions(config, opts);
966
- const nitro = {
967
- options,
968
- hooks: createHooks(),
969
- vfs: {},
970
- logger: consola$1.withTag("nitro"),
971
- scannedHandlers: [],
972
- close: () => nitro.hooks.callHook("close"),
973
- storage: void 0,
974
- async updateConfig(config2) {
975
- updateNitroConfig(nitro, config2);
976
- }
977
- };
978
- await scanAndSyncOptions(nitro);
979
- nitro.storage = await createStorage(nitro);
980
- nitro.hooks.hook("close", async () => {
981
- await nitro.storage.dispose();
982
- });
983
- if (nitro.options.debug) {
984
- createDebugger(nitro.hooks, { tag: "nitro" });
985
- nitro.options.plugins.push("nitropack/runtime/internal/debug");
986
- }
987
- if (nitro.options.timing) {
988
- nitro.options.plugins.push("nitropack/runtime/internal/timing");
989
- }
990
- if (nitro.options.logLevel !== void 0) {
991
- nitro.logger.level = nitro.options.logLevel;
992
- }
993
- nitro.hooks.addHooks(nitro.options.hooks);
994
- addNitroTasksVirtualFile(nitro);
995
- if (nitro.options.imports) {
996
- nitro.unimport = createUnimport(nitro.options.imports);
997
- await nitro.unimport.init();
998
- nitro.options.virtual["#imports"] = () => nitro.unimport?.toExports() || "";
999
- nitro.options.virtual["#nitro"] = 'export * from "#imports"';
1000
- }
1001
- await installModules(nitro);
1002
- return nitro;
1003
- }
1004
-
1005
- async function writeTypes(nitro) {
1006
- const types = {
1007
- routes: {}
1008
- };
1009
- const typesDir = resolve(nitro.options.buildDir, "types");
1010
- const middleware = [...nitro.scannedHandlers, ...nitro.options.handlers];
1011
- for (const mw of middleware) {
1012
- if (typeof mw.handler !== "string" || !mw.route) {
1013
- continue;
1014
- }
1015
- const relativePath = relative(
1016
- typesDir,
1017
- resolveNitroPath(mw.handler, nitro.options)
1018
- ).replace(/\.(js|mjs|cjs|ts|mts|cts|tsx|jsx)$/, "");
1019
- const method = mw.method || "default";
1020
- types.routes[mw.route] ??= {};
1021
- types.routes[mw.route][method] ??= [];
1022
- types.routes[mw.route][method].push(
1023
- `Simplify<Serialize<Awaited<ReturnType<typeof import('${relativePath}').default>>>>`
1024
- );
1025
- }
1026
- let autoImportedTypes = [];
1027
- let autoImportExports = "";
1028
- if (nitro.unimport) {
1029
- await nitro.unimport.init();
1030
- autoImportExports = await nitro.unimport.toExports(typesDir).then(
1031
- (r) => r.replace(/#internal\/nitro/g, relative(typesDir, runtimeDir))
1032
- );
1033
- const resolvedImportPathMap = /* @__PURE__ */ new Map();
1034
- const imports = await nitro.unimport.getImports().then((r) => r.filter((i) => !i.type));
1035
- for (const i of imports) {
1036
- if (resolvedImportPathMap.has(i.from)) {
1037
- continue;
1038
- }
1039
- let path = resolveAlias(i.from, nitro.options.alias);
1040
- if (!isAbsolute(path)) {
1041
- const resolvedPath = await resolvePath(i.from, {
1042
- url: nitro.options.nodeModulesDirs
1043
- }).catch(() => null);
1044
- if (resolvedPath) {
1045
- const { dir, name } = parseNodeModulePath(resolvedPath);
1046
- if (!dir || !name) {
1047
- path = resolvedPath;
1048
- } else {
1049
- const subpath = await lookupNodeModuleSubpath(resolvedPath);
1050
- path = join(dir, name, subpath || "");
1051
- }
1052
- }
1053
- }
1054
- if (existsSync(path) && !await isDirectory(path)) {
1055
- path = path.replace(/\.[a-z]+$/, "");
1056
- }
1057
- if (isAbsolute(path)) {
1058
- path = relative(typesDir, path);
1059
- }
1060
- resolvedImportPathMap.set(i.from, path);
1061
- }
1062
- autoImportedTypes = [
1063
- nitro.options.imports && nitro.options.imports.autoImport !== false ? (await nitro.unimport.generateTypeDeclarations({
1064
- exportHelper: false,
1065
- resolvePath: (i) => resolvedImportPathMap.get(i.from) ?? i.from
1066
- })).trim() : ""
1067
- ];
1068
- }
1069
- await nitro.hooks.callHook("types:extend", types);
1070
- const routes = [
1071
- "// Generated by nitro",
1072
- 'import type { Serialize, Simplify } from "nitropack/types";',
1073
- 'declare module "nitropack/types" {',
1074
- " type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T",
1075
- " interface InternalApi {",
1076
- ...Object.entries(types.routes).map(
1077
- ([path, methods]) => [
1078
- ` '${path}': {`,
1079
- ...Object.entries(methods).map(
1080
- ([method, types2]) => ` '${method}': ${types2.join(" | ")}`
1081
- ),
1082
- " }"
1083
- ].join("\n")
1084
- ),
1085
- " }",
1086
- "}",
1087
- // Makes this a module for augmentation purposes
1088
- "export {}"
1089
- ];
1090
- const config = [
1091
- "// Generated by nitro",
1092
- `
1093
- // App Config
1094
- import type { Defu } from 'defu'
1095
-
1096
- ${nitro.options.appConfigFiles.map(
1097
- (file, index) => genTypeImport(relative(typesDir, file).replace(/\.\w+$/, ""), [
1098
- { name: "default", as: `appConfig${index}` }
1099
- ])
1100
- ).join("\n")}
1101
-
1102
- type UserAppConfig = Defu<{}, [${nitro.options.appConfigFiles.map((_, index) => `typeof appConfig${index}`).join(", ")}]>
1103
-
1104
- declare module "nitropack/types" {
1105
- interface AppConfig extends UserAppConfig {}`,
1106
- nitro.options.typescript.generateRuntimeConfigTypes ? generateTypes(
1107
- await resolveSchema(
1108
- Object.fromEntries(
1109
- Object.entries(nitro.options.runtimeConfig).filter(
1110
- ([key]) => !["app", "nitro"].includes(key)
1111
- )
1112
- )
1113
- ),
1114
- {
1115
- interfaceName: "NitroRuntimeConfig",
1116
- addExport: false,
1117
- addDefaults: false,
1118
- allowExtraKeys: false,
1119
- indentation: 2
1120
- }
1121
- ) : "",
1122
- `}`,
1123
- // Makes this a module for augmentation purposes
1124
- "export {}"
1125
- ];
1126
- const declarations = [
1127
- // local nitropack augmentations
1128
- '/// <reference path="./nitro-routes.d.ts" />',
1129
- '/// <reference path="./nitro-config.d.ts" />',
1130
- // global server auto-imports
1131
- '/// <reference path="./nitro-imports.d.ts" />'
1132
- ];
1133
- const buildFiles = [];
1134
- buildFiles.push({
1135
- path: join(typesDir, "nitro-routes.d.ts"),
1136
- contents: routes.join("\n")
1137
- });
1138
- buildFiles.push({
1139
- path: join(typesDir, "nitro-config.d.ts"),
1140
- contents: config.join("\n")
1141
- });
1142
- buildFiles.push({
1143
- path: join(typesDir, "nitro-imports.d.ts"),
1144
- contents: [...autoImportedTypes, autoImportExports || "export {}"].join(
1145
- "\n"
1146
- )
1147
- });
1148
- buildFiles.push({
1149
- path: join(typesDir, "nitro.d.ts"),
1150
- contents: declarations.join("\n")
1151
- });
1152
- if (nitro.options.typescript.generateTsConfig) {
1153
- const tsConfigPath = resolve(
1154
- nitro.options.buildDir,
1155
- nitro.options.typescript.tsconfigPath
1156
- );
1157
- const tsconfigDir = dirname(tsConfigPath);
1158
- const tsConfig = defu(nitro.options.typescript.tsConfig, {
1159
- compilerOptions: {
1160
- forceConsistentCasingInFileNames: true,
1161
- strict: nitro.options.typescript.strict,
1162
- noEmit: true,
1163
- target: "ESNext",
1164
- module: "ESNext",
1165
- moduleResolution: nitro.options.experimental.typescriptBundlerResolution === false ? "Node" : "Bundler",
1166
- allowJs: true,
1167
- resolveJsonModule: true,
1168
- jsx: "preserve",
1169
- allowSyntheticDefaultImports: true,
1170
- jsxFactory: "h",
1171
- jsxFragmentFactory: "Fragment",
1172
- paths: {
1173
- "#imports": [
1174
- relativeWithDot(tsconfigDir, join(typesDir, "nitro-imports"))
1175
- ],
1176
- "~/*": [
1177
- relativeWithDot(
1178
- tsconfigDir,
1179
- join(nitro.options.alias["~"] || nitro.options.srcDir, "*")
1180
- )
1181
- ],
1182
- "@/*": [
1183
- relativeWithDot(
1184
- tsconfigDir,
1185
- join(nitro.options.alias["@"] || nitro.options.srcDir, "*")
1186
- )
1187
- ],
1188
- "~~/*": [
1189
- relativeWithDot(
1190
- tsconfigDir,
1191
- join(nitro.options.alias["~~"] || nitro.options.rootDir, "*")
1192
- )
1193
- ],
1194
- "@@/*": [
1195
- relativeWithDot(
1196
- tsconfigDir,
1197
- join(nitro.options.alias["@@"] || nitro.options.rootDir, "*")
1198
- )
1199
- ],
1200
- ...nitro.options.typescript.internalPaths ? {
1201
- "nitropack/runtime": [
1202
- relativeWithDot(tsconfigDir, join(runtimeDir, "index"))
1203
- ],
1204
- "#internal/nitro": [
1205
- relativeWithDot(tsconfigDir, join(runtimeDir, "index"))
1206
- ],
1207
- "nitropack/runtime/*": [
1208
- relativeWithDot(tsconfigDir, join(runtimeDir, "*"))
1209
- ],
1210
- "#internal/nitro/*": [
1211
- relativeWithDot(tsconfigDir, join(runtimeDir, "*"))
1212
- ]
1213
- } : {}
1214
- }
1215
- },
1216
- include: [
1217
- relativeWithDot(tsconfigDir, join(typesDir, "nitro.d.ts")).replace(
1218
- /^(?=[^.])/,
1219
- "./"
1220
- ),
1221
- join(relativeWithDot(tsconfigDir, nitro.options.rootDir), "**/*"),
1222
- ...nitro.options.srcDir === nitro.options.rootDir ? [] : [join(relativeWithDot(tsconfigDir, nitro.options.srcDir), "**/*")]
1223
- ]
1224
- });
1225
- for (const alias in tsConfig.compilerOptions.paths) {
1226
- const paths = tsConfig.compilerOptions.paths[alias];
1227
- tsConfig.compilerOptions.paths[alias] = await Promise.all(
1228
- paths.map(async (path) => {
1229
- if (!isAbsolute(path)) {
1230
- return path;
1231
- }
1232
- const stats = await promises.stat(path).catch(
1233
- () => null
1234
- /* file does not exist */
1235
- );
1236
- return relativeWithDot(
1237
- tsconfigDir,
1238
- stats?.isFile() ? path.replace(/(?<=\w)\.\w+$/g, "") : path
1239
- );
1240
- })
1241
- );
1242
- }
1243
- tsConfig.include = [
1244
- ...new Set(
1245
- tsConfig.include.map(
1246
- (p) => isAbsolute(p) ? relativeWithDot(tsconfigDir, p) : p
1247
- )
1248
- )
1249
- ];
1250
- if (tsConfig.exclude) {
1251
- tsConfig.exclude = [
1252
- ...new Set(
1253
- tsConfig.exclude.map(
1254
- (p) => isAbsolute(p) ? relativeWithDot(tsconfigDir, p) : p
1255
- )
1256
- )
1257
- ];
1258
- }
1259
- buildFiles.push({
1260
- path: tsConfigPath,
1261
- contents: JSON.stringify(tsConfig, null, 2)
1262
- });
1263
- }
1264
- await Promise.all(
1265
- buildFiles.map(async (file) => {
1266
- await writeFile(
1267
- resolve(nitro.options.buildDir, file.path),
1268
- file.contents
1269
- );
1270
- })
1271
- );
1272
- }
1273
- const RELATIVE_RE = /^\.{1,2}\//;
1274
- function relativeWithDot(from, to) {
1275
- const rel = relative(from, to);
1276
- return RELATIVE_RE.test(rel) ? rel : "./" + rel;
1277
- }
1278
-
1279
- function formatRollupError(_error) {
1280
- try {
1281
- const logs = [_error.toString()];
1282
- const errors = _error?.errors || [_error];
1283
- for (const error of errors) {
1284
- const id = error.path || error.id || _error.id;
1285
- let path = isAbsolute(id) ? relative(process.cwd(), id) : id;
1286
- const location = error.loc || error.location;
1287
- if (location) {
1288
- path += `:${location.line}:${location.column}`;
1289
- }
1290
- const text = error.text || error.frame;
1291
- logs.push(
1292
- `Rollup error while processing \`${path}\`` + text ? "\n\n" + text : ""
1293
- );
1294
- }
1295
- return logs.join("\n");
1296
- } catch {
1297
- return _error?.toString();
1298
- }
1299
- }
1300
-
1301
- function nitroServerName(nitro) {
1302
- return nitro.options.framework.name === "nitro" ? "Nitro Server" : `${upperFirst(nitro.options.framework.name)} Nitro server`;
1303
- }
1304
-
1305
- async function watchDev(nitro, rollupConfig) {
1306
- let rollupWatcher;
1307
- async function load() {
1308
- if (rollupWatcher) {
1309
- await rollupWatcher.close();
1310
- }
1311
- await scanHandlers(nitro);
1312
- rollupWatcher = startRollupWatcher(nitro, rollupConfig);
1313
- await writeTypes(nitro);
1314
- }
1315
- const reload = debounce(load);
1316
- const watchPatterns = nitro.options.scanDirs.flatMap((dir) => [
1317
- join(dir, nitro.options.apiDir || "api"),
1318
- join(dir, nitro.options.routesDir || "routes"),
1319
- join(dir, "middleware", GLOB_SCAN_PATTERN),
1320
- join(dir, "plugins"),
1321
- join(dir, "modules")
1322
- ]);
1323
- const watchReloadEvents = /* @__PURE__ */ new Set(["add", "addDir", "unlink", "unlinkDir"]);
1324
- const reloadWatcher = watch(watchPatterns, { ignoreInitial: true }).on(
1325
- "all",
1326
- (event) => {
1327
- if (watchReloadEvents.has(event)) {
1328
- reload();
1329
- }
1330
- }
1331
- );
1332
- nitro.hooks.hook("close", () => {
1333
- rollupWatcher.close();
1334
- reloadWatcher.close();
1335
- });
1336
- nitro.hooks.hook("rollup:reload", () => reload());
1337
- await load();
1338
- }
1339
- function startRollupWatcher(nitro, rollupConfig) {
1340
- const watcher = rollup.watch(
1341
- defu$1(rollupConfig, {
1342
- watch: {
1343
- chokidar: nitro.options.watchOptions
1344
- }
1345
- })
1346
- );
1347
- let start;
1348
- watcher.on("event", (event) => {
1349
- switch (event.code) {
1350
- case "START": {
1351
- return;
1352
- }
1353
- case "BUNDLE_START": {
1354
- start = Date.now();
1355
- return;
1356
- }
1357
- case "END": {
1358
- nitro.hooks.callHook("compiled", nitro);
1359
- if (nitro.options.logging.buildSuccess) {
1360
- nitro.logger.success(
1361
- `${nitroServerName(nitro)} built`,
1362
- start ? `in ${Date.now() - start} ms` : ""
1363
- );
1364
- }
1365
- nitro.hooks.callHook("dev:reload");
1366
- return;
1367
- }
1368
- case "ERROR": {
1369
- nitro.logger.error(formatRollupError(event.error));
1370
- }
1371
- }
1372
- });
1373
- return watcher;
1374
- }
1375
-
1376
- async function generateFSTree(dir, options = {}) {
1377
- if (isTest) {
1378
- return;
1379
- }
1380
- const files = await globby("**/*.*", { cwd: dir, ignore: ["*.map"] });
1381
- const items = (await Promise.all(
1382
- files.map(async (file) => {
1383
- const path = resolve(dir, file);
1384
- const src = await promises.readFile(path);
1385
- const size = src.byteLength;
1386
- const gzip = options.compressedSizes ? await gzipSize(src) : 0;
1387
- return { file, path, size, gzip };
1388
- })
1389
- )).sort((a, b) => a.path.localeCompare(b.path));
1390
- let totalSize = 0;
1391
- let totalGzip = 0;
1392
- let totalNodeModulesSize = 0;
1393
- let totalNodeModulesGzip = 0;
1394
- let treeText = "";
1395
- for (const [index, item] of items.entries()) {
1396
- dirname(item.file);
1397
- const rpath = relative(process.cwd(), item.path);
1398
- const treeChar = index === items.length - 1 ? "\u2514\u2500" : "\u251C\u2500";
1399
- const isNodeModules = item.file.includes("node_modules");
1400
- if (isNodeModules) {
1401
- totalNodeModulesSize += item.size;
1402
- totalNodeModulesGzip += item.gzip;
1403
- continue;
1404
- }
1405
- treeText += chalk.gray(
1406
- ` ${treeChar} ${rpath} (${prettyBytes(item.size)})`
1407
- );
1408
- if (options.compressedSizes) {
1409
- treeText += chalk.gray(` (${prettyBytes(item.gzip)} gzip)`);
1410
- }
1411
- treeText += "\n";
1412
- totalSize += item.size;
1413
- totalGzip += item.gzip;
1414
- }
1415
- treeText += `${chalk.cyan("\u03A3 Total size:")} ${prettyBytes(
1416
- totalSize + totalNodeModulesSize
1417
- )}`;
1418
- if (options.compressedSizes) {
1419
- treeText += ` (${prettyBytes(totalGzip + totalNodeModulesGzip)} gzip)`;
1420
- }
1421
- treeText += "\n";
1422
- return treeText;
1423
- }
1424
-
1425
- async function buildProduction(nitro, rollupConfig) {
1426
- await scanHandlers(nitro);
1427
- await writeTypes(nitro);
1428
- await _snapshot(nitro);
1429
- if (!nitro.options.static) {
1430
- nitro.logger.info(
1431
- `Building ${nitroServerName(nitro)} (preset: \`${nitro.options.preset}\`, compatibility date: \`${formatCompatibilityDate(nitro.options.compatibilityDate)}\` )`
1432
- );
1433
- const build = await rollup.rollup(rollupConfig).catch((error) => {
1434
- nitro.logger.error(formatRollupError(error));
1435
- throw error;
1436
- });
1437
- await build.write(rollupConfig.output);
1438
- }
1439
- const buildInfoPath = resolve(nitro.options.output.dir, "nitro.json");
1440
- const buildInfo = {
1441
- date: (/* @__PURE__ */ new Date()).toJSON(),
1442
- preset: nitro.options.preset,
1443
- framework: nitro.options.framework,
1444
- versions: {
1445
- nitro: version
1446
- },
1447
- commands: {
1448
- preview: nitro.options.commands.preview,
1449
- deploy: nitro.options.commands.deploy
1450
- }
1451
- };
1452
- await writeFile(buildInfoPath, JSON.stringify(buildInfo, null, 2));
1453
- if (!nitro.options.static) {
1454
- if (nitro.options.logging.buildSuccess) {
1455
- nitro.logger.success(`${nitroServerName(nitro)} built`);
1456
- }
1457
- if (nitro.options.logLevel > 1) {
1458
- process.stdout.write(
1459
- await generateFSTree(nitro.options.output.serverDir, {
1460
- compressedSizes: nitro.options.logging.compressedSizes
1461
- }) || ""
1462
- );
1463
- }
1464
- }
1465
- await nitro.hooks.callHook("compiled", nitro);
1466
- const rOutput = relative(process.cwd(), nitro.options.output.dir);
1467
- const rewriteRelativePaths = (input) => {
1468
- return input.replace(/([\s:])\.\/(\S*)/g, `$1${rOutput}/$2`);
1469
- };
1470
- if (buildInfo.commands.preview) {
1471
- nitro.logger.success(
1472
- `You can preview this build using \`${rewriteRelativePaths(
1473
- buildInfo.commands.preview
1474
- )}\``
1475
- );
1476
- }
1477
- if (buildInfo.commands.deploy) {
1478
- nitro.logger.success(
1479
- `You can deploy this build using \`${rewriteRelativePaths(
1480
- buildInfo.commands.deploy
1481
- )}\``
1482
- );
1483
- }
1484
- }
1485
- async function _snapshot(nitro) {
1486
- if (nitro.options.bundledStorage.length === 0 || nitro.options.preset === "nitro-prerender") {
1487
- return;
1488
- }
1489
- const storageDir = resolve(nitro.options.buildDir, "snapshot");
1490
- nitro.options.serverAssets.push({
1491
- baseName: "nitro:bundled",
1492
- dir: storageDir
1493
- });
1494
- const data = await snapshotStorage(nitro);
1495
- await Promise.all(
1496
- Object.entries(data).map(async ([path, contents]) => {
1497
- if (typeof contents !== "string") {
1498
- contents = JSON.stringify(contents);
1499
- }
1500
- const fsPath = join(storageDir, path.replace(/:/g, "/"));
1501
- await promises.mkdir(dirname(fsPath), { recursive: true });
1502
- await promises.writeFile(fsPath, contents, "utf8");
1503
- })
1504
- );
1505
- }
1506
-
1507
- async function build(nitro) {
1508
- const rollupConfig = getRollupConfig(nitro);
1509
- await nitro.hooks.callHook("rollup:before", nitro, rollupConfig);
1510
- return nitro.options.dev ? watchDev(nitro, rollupConfig) : buildProduction(nitro, rollupConfig);
1511
- }
1512
-
1513
- async function compressPublicAssets(nitro) {
1514
- const publicFiles = await globby("**", {
1515
- cwd: nitro.options.output.publicDir,
1516
- absolute: false,
1517
- dot: true,
1518
- ignore: ["**/*.gz", "**/*.br"]
1519
- });
1520
- await Promise.all(
1521
- publicFiles.map(async (fileName) => {
1522
- const filePath = resolve(nitro.options.output.publicDir, fileName);
1523
- if (existsSync(filePath + ".gz") || existsSync(filePath + ".br")) {
1524
- return;
1525
- }
1526
- const mimeType = mime.getType(fileName) || "text/plain";
1527
- const fileContents = await fsp.readFile(filePath);
1528
- if (fileContents.length < 1024 || fileName.endsWith(".map") || !isCompressibleMime(mimeType)) {
1529
- return;
1530
- }
1531
- const { gzip, brotli } = nitro.options.compressPublicAssets || {};
1532
- const encodings = [
1533
- gzip !== false && "gzip",
1534
- brotli !== false && "br"
1535
- ].filter(Boolean);
1536
- await Promise.all(
1537
- encodings.map(async (encoding) => {
1538
- const suffix = "." + (encoding === "gzip" ? "gz" : "br");
1539
- const compressedPath = filePath + suffix;
1540
- if (existsSync(compressedPath)) {
1541
- return;
1542
- }
1543
- const gzipOptions = { level: zlib.constants.Z_BEST_COMPRESSION };
1544
- const brotliOptions = {
1545
- [zlib.constants.BROTLI_PARAM_MODE]: isTextMime(mimeType) ? zlib.constants.BROTLI_MODE_TEXT : zlib.constants.BROTLI_MODE_GENERIC,
1546
- [zlib.constants.BROTLI_PARAM_QUALITY]: zlib.constants.BROTLI_MAX_QUALITY,
1547
- [zlib.constants.BROTLI_PARAM_SIZE_HINT]: fileContents.length
1548
- };
1549
- const compressedBuff = await new Promise(
1550
- (resolve2, reject) => {
1551
- const cb = (error, result) => error ? reject(error) : resolve2(result);
1552
- if (encoding === "gzip") {
1553
- zlib.gzip(fileContents, gzipOptions, cb);
1554
- } else {
1555
- zlib.brotliCompress(fileContents, brotliOptions, cb);
1556
- }
1557
- }
1558
- );
1559
- await fsp.writeFile(compressedPath, compressedBuff);
1560
- })
1561
- );
1562
- })
1563
- );
1564
- }
1565
- function isTextMime(mimeType) {
1566
- return /text|javascript|json|xml/.test(mimeType);
1567
- }
1568
- const COMPRESSIBLE_MIMES_RE = /* @__PURE__ */ new Set([
1569
- "application/dash+xml",
1570
- "application/eot",
1571
- "application/font",
1572
- "application/font-sfnt",
1573
- "application/javascript",
1574
- "application/json",
1575
- "application/opentype",
1576
- "application/otf",
1577
- "application/pkcs7-mime",
1578
- "application/protobuf",
1579
- "application/rss+xml",
1580
- "application/truetype",
1581
- "application/ttf",
1582
- "application/vnd.apple.mpegurl",
1583
- "application/vnd.mapbox-vector-tile",
1584
- "application/vnd.ms-fontobject",
1585
- "application/xhtml+xml",
1586
- "application/xml",
1587
- "application/x-font-opentype",
1588
- "application/x-font-truetype",
1589
- "application/x-font-ttf",
1590
- "application/x-httpd-cgi",
1591
- "application/x-javascript",
1592
- "application/x-mpegurl",
1593
- "application/x-opentype",
1594
- "application/x-otf",
1595
- "application/x-perl",
1596
- "application/x-ttf",
1597
- "font/eot",
1598
- "font/opentype",
1599
- "font/otf",
1600
- "font/ttf",
1601
- "image/svg+xml",
1602
- "text/css",
1603
- "text/csv",
1604
- "text/html",
1605
- "text/javascript",
1606
- "text/js",
1607
- "text/plain",
1608
- "text/richtext",
1609
- "text/tab-separated-values",
1610
- "text/xml",
1611
- "text/x-component",
1612
- "text/x-java-source",
1613
- "text/x-script",
1614
- "vnd.apple.mpegurl"
1615
- ]);
1616
- function isCompressibleMime(mimeType) {
1617
- return COMPRESSIBLE_MIMES_RE.has(mimeType);
1618
- }
1619
-
1620
- const allowedExtensions = /* @__PURE__ */ new Set(["", ".json"]);
1621
- const linkParents$1 = /* @__PURE__ */ new Map();
1622
- async function runParallel(inputs, cb, opts) {
1623
- const tasks = /* @__PURE__ */ new Set();
1624
- function queueNext() {
1625
- const route = inputs.values().next().value;
1626
- if (!route) {
1627
- return;
1628
- }
1629
- inputs.delete(route);
1630
- const task = new Promise((resolve) => setTimeout(resolve, opts.interval)).then(() => cb(route)).catch((error) => {
1631
- console.error(error);
1632
- });
1633
- tasks.add(task);
1634
- return task.then(() => {
1635
- tasks.delete(task);
1636
- if (inputs.size > 0) {
1637
- return refillQueue();
1638
- }
1639
- });
1640
- }
1641
- function refillQueue() {
1642
- const workers = Math.min(opts.concurrency - tasks.size, inputs.size);
1643
- return Promise.all(Array.from({ length: workers }, () => queueNext()));
1644
- }
1645
- await refillQueue();
1646
- }
1647
- const LINK_REGEX = /(?<=\s)href=(?!&quot;)["']?([^"'>]+)/g;
1648
- const HTML_ENTITIES = {
1649
- "&lt;": "<",
1650
- "&gt;": ">",
1651
- "&amp;": "&",
1652
- "&apos;": "'",
1653
- "&quot;": '"'
1654
- };
1655
- function escapeHtml(text) {
1656
- return text.replace(
1657
- /&(lt|gt|amp|apos|quot);/g,
1658
- (ch) => HTML_ENTITIES[ch] || ch
1659
- );
1660
- }
1661
- function extractLinks(html, from, res, crawlLinks) {
1662
- const links = [];
1663
- const _links = [];
1664
- if (crawlLinks) {
1665
- _links.push(
1666
- ...[...html.matchAll(LINK_REGEX)].map((m) => escapeHtml(m[1])).filter((m) => !decodeURIComponent(m).startsWith("#")).filter((link) => allowedExtensions.has(getExtension(link)))
1667
- );
1668
- }
1669
- const header = res.headers.get("x-nitro-prerender") || "";
1670
- _links.push(...header.split(",").map((i) => decodeURIComponent(i.trim())));
1671
- for (const link of _links.filter(Boolean)) {
1672
- const _link = parseURL(link);
1673
- if (_link.protocol) {
1674
- continue;
1675
- }
1676
- if (!_link.pathname.startsWith("/")) {
1677
- const fromURL = new URL(from, "http://localhost");
1678
- _link.pathname = new URL(_link.pathname, fromURL).pathname;
1679
- }
1680
- links.push(_link.pathname + _link.search);
1681
- }
1682
- for (const link of links) {
1683
- const _parents = linkParents$1.get(link);
1684
- if (_parents) {
1685
- _parents.add(from);
1686
- } else {
1687
- linkParents$1.set(link, /* @__PURE__ */ new Set([from]));
1688
- }
1689
- }
1690
- return links;
1691
- }
1692
- const EXT_REGEX = /\.[\da-z]+$/;
1693
- function getExtension(link) {
1694
- const pathname = parseURL(link).pathname;
1695
- return (pathname.match(EXT_REGEX) || [])[0] || "";
1696
- }
1697
- function formatPrerenderRoute(route) {
1698
- let str = ` \u251C\u2500 ${route.route} (${route.generateTimeMS}ms)`;
1699
- if (route.error) {
1700
- const parents = linkParents$1.get(route.route);
1701
- const errorColor = chalk[route.error.statusCode === 404 ? "yellow" : "red"];
1702
- const errorLead = parents?.size ? "\u251C\u2500\u2500" : "\u2514\u2500\u2500";
1703
- str += `
1704
- \u2502 ${errorLead} ${errorColor(route.error)}`;
1705
- if (parents?.size) {
1706
- str += `
1707
- ${[...parents.values()].map((link) => ` \u2502 \u2514\u2500\u2500 Linked from ${link}`).join("\n")}`;
1708
- }
1709
- }
1710
- if (route.skip) {
1711
- str += chalk.gray(" (skipped)");
1712
- }
1713
- return chalk.gray(str);
1714
- }
1715
- function matchesIgnorePattern(path, pattern) {
1716
- if (typeof pattern === "string") {
1717
- return path.startsWith(pattern);
1718
- }
1719
- if (typeof pattern === "function") {
1720
- return pattern(path) === true;
1721
- }
1722
- if (pattern instanceof RegExp) {
1723
- return pattern.test(path);
1724
- }
1725
- return false;
1726
- }
1727
-
1728
- const JsonSigRx = /^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;
1729
- const linkParents = /* @__PURE__ */ new Map();
1730
- async function prerender(nitro) {
1731
- if (nitro.options.noPublicDir) {
1732
- console.warn(
1733
- "[nitro] Skipping prerender since `noPublicDir` option is enabled."
1734
- );
1735
- return;
1736
- }
1737
- const routes = new Set(nitro.options.prerender.routes);
1738
- const prerenderRulePaths = Object.entries(nitro.options.routeRules).filter(([path2, options]) => options.prerender && !path2.includes("*")).map((e) => e[0]);
1739
- for (const route of prerenderRulePaths) {
1740
- routes.add(route);
1741
- }
1742
- await nitro.hooks.callHook("prerender:routes", routes);
1743
- if (routes.size === 0) {
1744
- if (nitro.options.prerender.crawlLinks) {
1745
- routes.add("/");
1746
- } else {
1747
- return;
1748
- }
1749
- }
1750
- nitro.logger.info("Initializing prerenderer");
1751
- nitro._prerenderedRoutes = [];
1752
- nitro._prerenderMeta = nitro._prerenderMeta || {};
1753
- const prerendererConfig = {
1754
- ...nitro.options._config,
1755
- static: false,
1756
- rootDir: nitro.options.rootDir,
1757
- logLevel: 0,
1758
- preset: "nitro-prerender"
1759
- };
1760
- await nitro.hooks.callHook("prerender:config", prerendererConfig);
1761
- const nitroRenderer = await createNitro(prerendererConfig);
1762
- const prerenderStartTime = Date.now();
1763
- await nitro.hooks.callHook("prerender:init", nitroRenderer);
1764
- let path = relative(nitro.options.output.dir, nitro.options.output.publicDir);
1765
- if (!path.startsWith(".")) {
1766
- path = `./${path}`;
1767
- }
1768
- nitroRenderer.options.commands.preview = `npx serve ${path}`;
1769
- nitroRenderer.options.output.dir = nitro.options.output.dir;
1770
- await build(nitroRenderer);
1771
- const serverFilename = typeof nitroRenderer.options.rollupConfig?.output?.entryFileNames === "string" ? nitroRenderer.options.rollupConfig.output.entryFileNames : "index.mjs";
1772
- const serverEntrypoint = resolve(
1773
- nitroRenderer.options.output.serverDir,
1774
- serverFilename
1775
- );
1776
- const { closePrerenderer, localFetch } = await import(pathToFileURL(serverEntrypoint).href);
1777
- const _routeRulesMatcher = toRouteMatcher(
1778
- createRouter({ routes: nitro.options.routeRules })
1779
- );
1780
- const _getRouteRules = (path2) => defu({}, ..._routeRulesMatcher.matchAll(path2).reverse());
1781
- const generatedRoutes = /* @__PURE__ */ new Set();
1782
- const failedRoutes = /* @__PURE__ */ new Set();
1783
- const skippedRoutes = /* @__PURE__ */ new Set();
1784
- const displayedLengthWarns = /* @__PURE__ */ new Set();
1785
- const canPrerender = (route = "/") => {
1786
- if (generatedRoutes.has(route) || skippedRoutes.has(route)) {
1787
- return false;
1788
- }
1789
- for (const pattern of nitro.options.prerender.ignore) {
1790
- if (matchesIgnorePattern(route, pattern)) {
1791
- return false;
1792
- }
1793
- }
1794
- if (_getRouteRules(route).prerender === false) {
1795
- return false;
1796
- }
1797
- return true;
1798
- };
1799
- const canWriteToDisk = (route) => {
1800
- if (route.route.includes("?")) {
1801
- return false;
1802
- }
1803
- const FS_MAX_SEGMENT = 255;
1804
- const FS_MAX_PATH = 1024;
1805
- const FS_MAX_PATH_PUBLIC_HTML = FS_MAX_PATH - (nitro.options.output.publicDir.length + 10);
1806
- if ((route.route.length >= FS_MAX_PATH_PUBLIC_HTML || route.route.split("/").some((s) => s.length > FS_MAX_SEGMENT)) && !displayedLengthWarns.has(route)) {
1807
- displayedLengthWarns.add(route);
1808
- const _route = route.route.slice(0, 60) + "...";
1809
- if (route.route.length >= FS_MAX_PATH_PUBLIC_HTML) {
1810
- nitro.logger.warn(
1811
- `Prerendering long route "${_route}" (${route.route.length}) can cause filesystem issues since it exceeds ${FS_MAX_PATH_PUBLIC_HTML}-character limit when writing to \`${nitro.options.output.publicDir}\`.`
1812
- );
1813
- } else {
1814
- nitro.logger.warn(
1815
- `Skipping prerender of the route "${_route}" since it exceeds the ${FS_MAX_SEGMENT}-character limit in one of the path segments and can cause filesystem issues.`
1816
- );
1817
- return false;
1818
- }
1819
- }
1820
- return true;
1821
- };
1822
- const generateRoute = async (route) => {
1823
- const start = Date.now();
1824
- route = decodeURI(route);
1825
- if (!canPrerender(route)) {
1826
- skippedRoutes.add(route);
1827
- return;
1828
- }
1829
- generatedRoutes.add(route);
1830
- const _route = { route };
1831
- const encodedRoute = encodeURI(route);
1832
- const res = await localFetch(
1833
- withBase(encodedRoute, nitro.options.baseURL),
1834
- {
1835
- headers: { "x-nitro-prerender": encodedRoute },
1836
- retry: nitro.options.prerender.retry,
1837
- retryDelay: nitro.options.prerender.retryDelay
1838
- }
1839
- );
1840
- let dataBuff = Buffer.from(await res.arrayBuffer());
1841
- Object.defineProperty(_route, "contents", {
1842
- get: () => {
1843
- return dataBuff ? dataBuff.toString("utf8") : void 0;
1844
- },
1845
- set(value) {
1846
- if (dataBuff) {
1847
- dataBuff = Buffer.from(value);
1848
- }
1849
- }
1850
- });
1851
- Object.defineProperty(_route, "data", {
1852
- get: () => {
1853
- return dataBuff ? dataBuff.buffer : void 0;
1854
- },
1855
- set(value) {
1856
- if (dataBuff) {
1857
- dataBuff = Buffer.from(value);
1858
- }
1859
- }
1860
- });
1861
- const redirectCodes = [301, 302, 303, 304, 307, 308];
1862
- if (![200, ...redirectCodes].includes(res.status)) {
1863
- _route.error = new Error(`[${res.status}] ${res.statusText}`);
1864
- _route.error.statusCode = res.status;
1865
- _route.error.statusMessage = res.statusText;
1866
- failedRoutes.add(_route);
1867
- }
1868
- _route.generateTimeMS = Date.now() - start;
1869
- const contentType = res.headers.get("content-type") || "";
1870
- const isImplicitHTML = !route.endsWith(".html") && contentType.includes("html") && !JsonSigRx.test(dataBuff.subarray(0, 32).toString("utf8"));
1871
- const routeWithIndex = route.endsWith("/") ? route + "index" : route;
1872
- const htmlPath = route.endsWith("/") || nitro.options.prerender.autoSubfolderIndex ? joinURL(route, "index.html") : route + ".html";
1873
- _route.fileName = withoutBase(
1874
- isImplicitHTML ? htmlPath : routeWithIndex,
1875
- nitro.options.baseURL
1876
- );
1877
- const inferredContentType = mime.getType(_route.fileName) || "text/plain";
1878
- _route.contentType = contentType || inferredContentType;
1879
- await nitro.hooks.callHook("prerender:generate", _route, nitro);
1880
- if (_route.contentType !== inferredContentType) {
1881
- nitro._prerenderMeta[_route.fileName] ||= {};
1882
- nitro._prerenderMeta[_route.fileName].contentType = _route.contentType;
1883
- }
1884
- if (_route.skip || _route.error) {
1885
- await nitro.hooks.callHook("prerender:route", _route);
1886
- nitro.logger.log(formatPrerenderRoute(_route));
1887
- dataBuff = void 0;
1888
- return _route;
1889
- }
1890
- if (canWriteToDisk(_route)) {
1891
- const filePath = join(nitro.options.output.publicDir, _route.fileName);
1892
- await writeFile(filePath, dataBuff);
1893
- nitro._prerenderedRoutes.push(_route);
1894
- } else {
1895
- _route.skip = true;
1896
- }
1897
- if (!_route.error && (isImplicitHTML || route.endsWith(".html"))) {
1898
- const extractedLinks = extractLinks(
1899
- dataBuff.toString("utf8"),
1900
- route,
1901
- res,
1902
- nitro.options.prerender.crawlLinks
1903
- );
1904
- for (const _link of extractedLinks) {
1905
- if (canPrerender(_link)) {
1906
- routes.add(_link);
1907
- }
1908
- }
1909
- }
1910
- await nitro.hooks.callHook("prerender:route", _route);
1911
- nitro.logger.log(formatPrerenderRoute(_route));
1912
- dataBuff = void 0;
1913
- return _route;
1914
- };
1915
- nitro.logger.info(
1916
- nitro.options.prerender.crawlLinks ? `Prerendering ${routes.size} initial routes with crawler` : `Prerendering ${routes.size} routes`
1917
- );
1918
- await runParallel(routes, generateRoute, {
1919
- concurrency: nitro.options.prerender.concurrency,
1920
- interval: nitro.options.prerender.interval
1921
- });
1922
- await closePrerenderer();
1923
- await nitro.hooks.callHook("prerender:done", {
1924
- prerenderedRoutes: nitro._prerenderedRoutes,
1925
- failedRoutes: [...failedRoutes]
1926
- });
1927
- if (nitro.options.prerender.failOnError && failedRoutes.size > 0) {
1928
- nitro.logger.log("\nErrors prerendering:");
1929
- for (const route of failedRoutes) {
1930
- const parents = linkParents.get(route.route);
1931
- parents?.size ? `
1932
- ${[...parents.values()].map((link) => chalk.gray(` \u2502 \u2514\u2500\u2500 Linked from ${link}`)).join("\n")}` : "";
1933
- nitro.logger.log(formatPrerenderRoute(route));
1934
- }
1935
- nitro.logger.log("");
1936
- throw new Error("Exiting due to prerender errors.");
1937
- }
1938
- const prerenderTimeInMs = Date.now() - prerenderStartTime;
1939
- nitro.logger.info(
1940
- `Prerendered ${nitro._prerenderedRoutes.length} routes in ${prerenderTimeInMs / 1e3} seconds`
1941
- );
1942
- if (nitro.options.compressPublicAssets) {
1943
- await compressPublicAssets(nitro);
1944
- }
1945
- }
1946
-
1947
- function createVFSHandler(nitro) {
1948
- return eventHandler(async (event) => {
1949
- const vfsEntries = {
1950
- ...nitro.vfs,
1951
- ...nitro.options.virtual
1952
- };
1953
- const url = event.path || "";
1954
- const isJson = url.endsWith(".json") || getRequestHeader(event, "accept")?.includes("application/json");
1955
- const id = decodeURIComponent(url.replace(/^(\.json)?\/?/, "") || "");
1956
- if (id && !(id in vfsEntries)) {
1957
- throw createError({ message: "File not found", statusCode: 404 });
1958
- }
1959
- let content = id ? vfsEntries[id] : void 0;
1960
- if (typeof content === "function") {
1961
- content = await content();
1962
- }
1963
- if (isJson) {
1964
- return {
1965
- rootDir: nitro.options.rootDir,
1966
- entries: Object.keys(vfsEntries).map((id2) => ({
1967
- id: id2,
1968
- path: "/_vfs.json/" + encodeURIComponent(id2)
1969
- })),
1970
- current: id ? {
1971
- id,
1972
- content
1973
- } : null
1974
- };
1975
- }
1976
- const directories = { [nitro.options.rootDir]: {} };
1977
- const fpaths = Object.keys(vfsEntries);
1978
- for (const item of fpaths) {
1979
- const segments = item.replace(nitro.options.rootDir, "").split("/").filter(Boolean);
1980
- let currentDir = item.startsWith(nitro.options.rootDir) ? directories[nitro.options.rootDir] : directories;
1981
- for (const segment of segments) {
1982
- if (!currentDir[segment]) {
1983
- currentDir[segment] = {};
1984
- }
1985
- currentDir = currentDir[segment];
1986
- }
1987
- }
1988
- const generateHTML = (directory, path = []) => Object.entries(directory).map(([fname, value = {}]) => {
1989
- const subpath = [...path, fname];
1990
- const key = subpath.join("/");
1991
- const encodedUrl = encodeURIComponent(key);
1992
- const linkClass = url === `/${encodedUrl}` ? "bg-gray-700 text-white" : "hover:bg-gray-800 text-gray-200";
1993
- return Object.keys(value).length === 0 ? `
1994
- <li class="flex flex-nowrap">
1995
- <a href="/_vfs/${encodedUrl}" class="w-full text-sm px-2 py-1 border-b border-gray-10 ${linkClass}">
1996
- ${fname}
1997
- </a>
1998
- </li>
1999
- ` : `
2000
- <li>
2001
- <details ${url.startsWith(`/${encodedUrl}`) ? "open" : ""}>
2002
- <summary class="w-full text-sm px-2 py-1 border-b border-gray-10 hover:bg-gray-800 text-gray-200">
2003
- ${fname}
2004
- </summary>
2005
- <ul class="ml-4">
2006
- ${generateHTML(value, subpath)}
2007
- </ul>
2008
- </details>
2009
- </li>
2010
- `;
2011
- }).join("");
2012
- const rootDirectory = directories[nitro.options.rootDir];
2013
- delete directories[nitro.options.rootDir];
2014
- const items = generateHTML(rootDirectory, [nitro.options.rootDir]) + generateHTML(directories);
2015
- const files = `
2016
- <div class="h-full overflow-auto border-r border-gray:10">
2017
- <p class="text-white text-bold text-center py-1 opacity-50">Virtual Files</p>
2018
- <ul class="flex flex-col">${items}</ul>
2019
- </div>
2020
- `;
2021
- const file = id ? editorTemplate({
2022
- readOnly: true,
2023
- language: id.endsWith("html") ? "html" : "javascript",
2024
- theme: "vs-dark",
2025
- value: content,
2026
- wordWrap: "wordWrapColumn",
2027
- wordWrapColumn: 80
2028
- }) : `
2029
- <div class="w-full h-full flex opacity-50">
2030
- <h1 class="text-white m-auto">Select a virtual file to inspect</h1>
2031
- </div>
2032
- `;
2033
- return (
2034
- /* html */
2035
- `
2036
- <!doctype html>
2037
- <html>
2038
- <head>
2039
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css" />
2040
- <link rel="stylesheet" data-name="vs/editor/editor.main" href="${vsUrl}/editor/editor.main.min.css">
2041
- <script src="https://cdn.jsdelivr.net/npm/@unocss/runtime"><\/script>
2042
- <style>
2043
- html {
2044
- background: #1E1E1E;
2045
- color: white;
2046
- }
2047
- [un-cloak] {
2048
- display: none;
2049
- }
2050
- </style>
2051
- </head>
2052
- <body class="bg-[#1E1E1E]">
2053
- <div un-cloak class="h-screen grid grid-cols-[300px_1fr]">
2054
- ${files}
2055
- ${file}
2056
- </div>
2057
- </body>
2058
- </html>`
2059
- );
2060
- });
2061
- }
2062
- const monacoVersion = "0.30.0";
2063
- const monacoUrl = `https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/${monacoVersion}/min`;
2064
- const vsUrl = `${monacoUrl}/vs`;
2065
- const editorTemplate = (options) => `
2066
- <div id="editor" class="min-h-screen w-full h-full"></div>
2067
- <script src="${vsUrl}/loader.min.js"><\/script>
2068
- <script>
2069
- require.config({ paths: { vs: '${vsUrl}' } })
2070
-
2071
- const proxy = URL.createObjectURL(new Blob([\`
2072
- self.MonacoEnvironment = { baseUrl: '${monacoUrl}' }
2073
- importScripts('${vsUrl}/base/worker/workerMain.min.js')
2074
- \`], { type: 'text/javascript' }))
2075
- window.MonacoEnvironment = { getWorkerUrl: () => proxy }
2076
-
2077
- setTimeout(() => {
2078
- require(['vs/editor/editor.main'], function () {
2079
- monaco.editor.create(document.getElementById('editor'), ${JSON.stringify(
2080
- options
2081
- )})
2082
- })
2083
- }, 0);
2084
- <\/script>
2085
- `;
2086
-
2087
- function errorHandler(error, event) {
2088
- setResponseHeader(event, "Content-Type", "text/html; charset=UTF-8");
2089
- setResponseStatus(event, 503, "Server Unavailable");
2090
- let body;
2091
- let title;
2092
- if (error) {
2093
- title = `${getResponseStatus(event)} ${getResponseStatusText(event)}`;
2094
- body = `<code><pre>${error.stack}</pre></code>`;
2095
- } else {
2096
- title = "Reloading server...";
2097
- body = "<progress></progress><script>document.querySelector('progress').indeterminate=true<\/script>";
2098
- }
2099
- return send(
2100
- event,
2101
- `<!DOCTYPE html>
2102
- <html lang="en">
2103
- <head>
2104
- <meta charset="utf-8">
2105
- <meta name="viewport" content="width=device-width, initial-scale=1">
2106
- ${error ? "" : '<meta http-equiv="refresh" content="2">'}
2107
- <title>${title}</title>
2108
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico/css/pico.min.css">
2109
- </head>
2110
- <body>
2111
- <main class="container">
2112
- <article>
2113
- <header>
2114
- <h2>${title}</h2>
2115
- </header>
2116
- ${body}
2117
- <footer>
2118
- Check console logs for more information.
2119
- </footer>
2120
- </article>
2121
- </main>
2122
- </body>
2123
- </html>
2124
- `
2125
- );
2126
- }
2127
-
2128
- function initWorker(filename) {
2129
- if (!existsSync(filename)) {
2130
- return;
2131
- }
2132
- return new Promise((resolve2, reject) => {
2133
- const worker = new Worker(filename);
2134
- worker.once("exit", (code) => {
2135
- reject(
2136
- new Error(
2137
- code ? "[worker] exited with code: " + code : "[worker] exited"
2138
- )
2139
- );
2140
- });
2141
- worker.once("error", (err) => {
2142
- const newErr = new Error("[worker init] " + err.message);
2143
- newErr.stack = err.stack;
2144
- reject(newErr);
2145
- });
2146
- const addressListener = (event) => {
2147
- if (!event || !event?.address) {
2148
- return;
2149
- }
2150
- worker.off("message", addressListener);
2151
- resolve2({
2152
- worker,
2153
- address: event.address
2154
- });
2155
- };
2156
- worker.on("message", addressListener);
2157
- });
2158
- }
2159
- async function killWorker(worker, nitro) {
2160
- if (!worker) {
2161
- return;
2162
- }
2163
- if (worker.worker) {
2164
- worker.worker.postMessage({ event: "shutdown" });
2165
- const gracefulShutdownTimeout = Number.parseInt(process.env.NITRO_SHUTDOWN_TIMEOUT || "", 10) || 3;
2166
- await new Promise((resolve2) => {
2167
- const timeout = setTimeout(() => {
2168
- nitro.logger.warn(
2169
- `[nitro] [dev] Force closing worker after ${gracefulShutdownTimeout} seconds...`
2170
- );
2171
- resolve2();
2172
- }, gracefulShutdownTimeout * 1e3);
2173
- worker.worker?.once("message", (message) => {
2174
- if (message.event === "exit") {
2175
- clearTimeout(timeout);
2176
- resolve2();
2177
- }
2178
- });
2179
- });
2180
- worker.worker.removeAllListeners();
2181
- await worker.worker.terminate();
2182
- worker.worker = null;
2183
- }
2184
- if (worker.address.socketPath && existsSync(worker.address.socketPath)) {
2185
- await promises.rm(worker.address.socketPath).catch(() => {
2186
- });
2187
- }
2188
- }
2189
- function createDevServer(nitro) {
2190
- const workerEntry = resolve(
2191
- nitro.options.output.dir,
2192
- nitro.options.output.serverDir,
2193
- "index.mjs"
2194
- );
2195
- const errorHandler$1 = nitro.options.devErrorHandler || errorHandler;
2196
- let lastError;
2197
- let reloadPromise;
2198
- let currentWorker;
2199
- async function _reload() {
2200
- const oldWorker = currentWorker;
2201
- currentWorker = void 0;
2202
- await killWorker(oldWorker, nitro);
2203
- currentWorker = await initWorker(workerEntry);
2204
- if (!currentWorker) {
2205
- return;
2206
- }
2207
- const buildInfoPath = resolve(nitro.options.buildDir, "nitro.json");
2208
- const buildInfo = {
2209
- date: (/* @__PURE__ */ new Date()).toJSON(),
2210
- preset: nitro.options.preset,
2211
- framework: nitro.options.framework,
2212
- versions: {
2213
- nitro: version
2214
- },
2215
- dev: {
2216
- pid: process.pid,
2217
- workerAddress: currentWorker?.address
2218
- }
2219
- };
2220
- await writeFile$1(buildInfoPath, JSON.stringify(buildInfo, null, 2));
2221
- }
2222
- const reload = debounce(() => {
2223
- reloadPromise = _reload().then(() => {
2224
- lastError = void 0;
2225
- }).catch((error) => {
2226
- console.error("[worker reload]", error);
2227
- lastError = error;
2228
- }).finally(() => {
2229
- reloadPromise = void 0;
2230
- });
2231
- return reloadPromise;
2232
- });
2233
- nitro.hooks.hook("dev:reload", reload);
2234
- const app = createApp();
2235
- for (const handler of nitro.options.devHandlers) {
2236
- app.use(handler.route || "/", handler.handler);
2237
- }
2238
- app.use("/_vfs", createVFSHandler(nitro));
2239
- for (const asset of nitro.options.publicAssets) {
2240
- const url = joinURL(
2241
- nitro.options.runtimeConfig.app.baseURL,
2242
- asset.baseURL || "/"
2243
- );
2244
- app.use(url, fromNodeMiddleware(serveStatic(asset.dir)));
2245
- if (!asset.fallthrough) {
2246
- app.use(url, fromNodeMiddleware(servePlaceholder()));
2247
- }
2248
- }
2249
- for (const route of Object.keys(nitro.options.devProxy).sort().reverse()) {
2250
- let opts = nitro.options.devProxy[route];
2251
- if (typeof opts === "string") {
2252
- opts = { target: opts };
2253
- }
2254
- const proxy2 = createProxy(opts);
2255
- app.use(
2256
- route,
2257
- eventHandler(async (event) => {
2258
- await proxy2.handle(event);
2259
- })
2260
- );
2261
- }
2262
- const proxy = createProxy();
2263
- proxy.proxy.on("proxyReq", (proxyReq, req) => {
2264
- if (!proxyReq.hasHeader("x-forwarded-for")) {
2265
- const address = req.socket.remoteAddress;
2266
- if (address) {
2267
- proxyReq.appendHeader("x-forwarded-for", address);
2268
- }
2269
- }
2270
- if (!proxyReq.hasHeader("x-forwarded-port")) {
2271
- const localPort = req?.socket?.localPort;
2272
- if (localPort) {
2273
- proxyReq.setHeader("x-forwarded-port", req.socket.localPort);
2274
- }
2275
- }
2276
- if (!proxyReq.hasHeader("x-forwarded-Proto")) {
2277
- const encrypted = req?.connection?.encrypted;
2278
- proxyReq.setHeader("x-forwarded-proto", encrypted ? "https" : "http");
2279
- }
2280
- });
2281
- const getWorkerAddress = () => {
2282
- const address = currentWorker?.address;
2283
- if (!address) {
2284
- return;
2285
- }
2286
- if (address.socketPath) {
2287
- try {
2288
- accessSync(address.socketPath);
2289
- } catch (error) {
2290
- if (!lastError) {
2291
- lastError = error;
2292
- }
2293
- return;
2294
- }
2295
- }
2296
- return address;
2297
- };
2298
- app.use(
2299
- eventHandler(async (event) => {
2300
- await reloadPromise;
2301
- const address = getWorkerAddress();
2302
- if (!address) {
2303
- const error = lastError || createError("Worker not ready");
2304
- return errorHandler$1(error, event);
2305
- }
2306
- await proxy.handle(event, { target: address }).catch((error) => {
2307
- lastError = error;
2308
- throw error;
2309
- });
2310
- })
2311
- );
2312
- const upgrade = (req, socket, head) => {
2313
- return proxy.proxy.ws(
2314
- req,
2315
- // @ts-expect-error
2316
- socket,
2317
- {
2318
- target: getWorkerAddress(),
2319
- xfwd: true
2320
- },
2321
- head
2322
- );
2323
- };
2324
- let listeners = [];
2325
- const _listen = async (port, opts) => {
2326
- const listener = await listen(toNodeListener(app), { port, ...opts });
2327
- listener.server.on("upgrade", (req, sock, head) => {
2328
- upgrade(req, sock, head);
2329
- });
2330
- listeners.push(listener);
2331
- return listener;
2332
- };
2333
- let watcher;
2334
- if (nitro.options.devServer.watch.length > 0) {
2335
- watcher = watch(nitro.options.devServer.watch, nitro.options.watchOptions);
2336
- watcher.on("add", reload).on("change", reload);
2337
- }
2338
- async function close() {
2339
- if (watcher) {
2340
- await watcher.close();
2341
- }
2342
- await killWorker(currentWorker, nitro);
2343
- await Promise.all(listeners.map((l) => l.close()));
2344
- listeners = [];
2345
- }
2346
- nitro.hooks.hook("close", close);
2347
- return {
2348
- reload,
2349
- listen: _listen,
2350
- app,
2351
- close,
2352
- watcher,
2353
- upgrade
2354
- };
2355
- }
2356
- function createProxy(defaults = {}) {
2357
- const proxy = createProxyServer(defaults);
2358
- const handle = async (event, opts = {}) => {
2359
- try {
2360
- await proxy.web(event.node.req, event.node.res, opts);
2361
- } catch (error) {
2362
- if (error?.code !== "ECONNRESET") {
2363
- throw error;
2364
- }
2365
- }
2366
- };
2367
- return {
2368
- proxy,
2369
- handle
2370
- };
2371
- }
2372
-
2373
- const NEGATION_RE = /^(!?)(.*)$/;
2374
- const PARENT_DIR_GLOB_RE = /!?\.\.\//;
2375
- async function copyPublicAssets(nitro) {
2376
- if (nitro.options.noPublicDir) {
2377
- return;
2378
- }
2379
- for (const asset of nitro.options.publicAssets) {
2380
- const srcDir = asset.dir;
2381
- const dstDir = join(nitro.options.output.publicDir, asset.baseURL);
2382
- if (await isDirectory(srcDir)) {
2383
- const includePatterns = [
2384
- "**",
2385
- ...nitro.options.ignore.map((p) => {
2386
- const [_, negation, pattern] = p.match(NEGATION_RE) || [];
2387
- return (
2388
- // Convert ignore to include patterns
2389
- (negation ? "" : "!") + // Make non-glob patterns relative to publicAssetDir
2390
- (pattern.startsWith("*") ? pattern : relative(srcDir, resolve(nitro.options.srcDir, pattern)))
2391
- );
2392
- })
2393
- ].filter((p) => !PARENT_DIR_GLOB_RE.test(p));
2394
- const publicAssets = await globby(includePatterns, {
2395
- cwd: srcDir,
2396
- absolute: false,
2397
- dot: true
2398
- });
2399
- await Promise.all(
2400
- publicAssets.map(async (file) => {
2401
- const src = join(srcDir, file);
2402
- const dst = join(dstDir, file);
2403
- if (!existsSync(dst)) {
2404
- await promises.cp(src, dst);
2405
- }
2406
- })
2407
- );
2408
- }
2409
- }
2410
- if (nitro.options.compressPublicAssets) {
2411
- await compressPublicAssets(nitro);
2412
- }
2413
- nitro.logger.success(
2414
- "Generated public " + prettyPath(nitro.options.output.publicDir)
2415
- );
2416
- }
2417
-
2418
- async function prepare(nitro) {
2419
- await prepareDir(nitro.options.output.dir);
2420
- if (!nitro.options.noPublicDir) {
2421
- await prepareDir(nitro.options.output.publicDir);
2422
- }
2423
- if (!nitro.options.static) {
2424
- await prepareDir(nitro.options.output.serverDir);
2425
- }
2426
- }
2427
- async function prepareDir(dir) {
2428
- await fsp.mkdir(dir, { recursive: true });
2429
- await fse.emptyDir(dir);
2430
- }
2431
-
2432
- function defineNitroConfig(config) {
2433
- return config;
2434
- }
2435
-
2436
- export { GLOB_SCAN_PATTERN, build, copyPublicAssets, createDevServer, createNitro, defineNitroConfig, listTasks, loadOptions, prepare, prerender, runTask, scanHandlers, scanMiddleware, scanModules, scanPlugins, scanServerRoutes, scanTasks, writeTypes };
1
+ export * from "nitro/core";