nitro-nightly 3.1.0-20251028-110430-e607b753 → 3.1.0-20251028-132924-f89aefa2

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 (157) hide show
  1. package/dist/_build/build.mjs +379 -14
  2. package/dist/_build/{rollup.mjs → build2.mjs} +218 -68
  3. package/dist/_build/info.mjs +963 -7
  4. package/dist/_build/prepare.mjs +1491 -2
  5. package/dist/_build/snapshot.mjs +155 -31
  6. package/dist/_build/vite.mjs +43 -2307
  7. package/dist/_build/vite2.mjs +149 -0
  8. package/dist/{_deps → _chunks/_deps}/c12.mjs +1 -1
  9. package/dist/{_deps → _chunks/_deps}/giget.mjs +1 -1
  10. package/dist/_chunks/_deps/klona.mjs +137 -0
  11. package/dist/{_deps → _chunks/_deps}/knitwork.mjs +1 -1
  12. package/dist/{_deps → _chunks/_deps}/local-pkg.mjs +1 -1
  13. package/dist/{_deps → _chunks/_deps}/mlly.mjs +1 -1
  14. package/dist/{_deps → _chunks/_deps}/nypm.mjs +1 -1
  15. package/dist/{_deps → _chunks/_deps}/pathe.mjs +1 -1
  16. package/dist/{_deps → _chunks/_deps}/pkg-types.mjs +2 -2
  17. package/dist/{_deps → _chunks/_deps}/rou3.mjs +1 -1
  18. package/dist/_chunks/_deps/std-env.mjs +3 -0
  19. package/dist/{_deps → _chunks/_deps}/unimport.mjs +2 -2
  20. package/dist/{_deps → _chunks/_deps}/unplugin-utils.mjs +1 -1
  21. package/dist/{_deps → _chunks/_deps}/untyped.mjs +1 -1
  22. package/dist/{_deps → _chunks/_deps}/unwasm.mjs +2 -2
  23. package/dist/{_presets → _chunks/_presets}/_resolve.mjs +2 -2
  24. package/dist/{_presets → _chunks/_presets}/_utils.mjs +1 -1
  25. package/dist/{_presets → _chunks/_presets}/azure.mjs +1 -1
  26. package/dist/{_presets → _chunks/_presets}/cloudflare.mjs +4 -4
  27. package/dist/{_presets → _chunks/_presets}/deno.mjs +1 -1
  28. package/dist/{_presets → _chunks/_presets}/firebase.mjs +1 -1
  29. package/dist/{_presets → _chunks/_presets}/iis.mjs +1 -1
  30. package/dist/{_presets → _chunks/_presets}/index.mjs +1 -1
  31. package/dist/{_presets → _chunks/_presets}/vercel.mjs +3 -3
  32. package/dist/{_presets → _chunks/_presets}/zeabur.mjs +1 -1
  33. package/dist/_chunks/app.mjs +600 -0
  34. package/dist/_chunks/index.mjs +648 -0
  35. package/dist/_chunks/server.mjs +256 -0
  36. package/dist/_cli/build.mjs +2 -2
  37. package/dist/_cli/dev.mjs +46 -130
  38. package/dist/_cli/index.mjs +1 -1
  39. package/dist/_cli/list.mjs +2 -2
  40. package/dist/_cli/prepare.mjs +2 -2
  41. package/dist/_cli/run.mjs +2 -2
  42. package/dist/cli/index.mjs +1 -1
  43. package/dist/index.mjs +94 -120
  44. package/dist/node_modules/cookie-es/dist/index.mjs +262 -0
  45. package/dist/node_modules/cookie-es/package.json +37 -0
  46. package/dist/node_modules/rendu/dist/index.mjs +380 -0
  47. package/dist/node_modules/rendu/package.json +47 -0
  48. package/dist/runtime/internal/task.mjs +1 -2
  49. package/dist/types/index.d.mts +2 -1
  50. package/dist/vite.mjs +103 -114
  51. package/lib/runtime/meta.mjs +18 -25
  52. package/package.json +9 -10
  53. package/dist/_build/assets.mjs +0 -235
  54. package/dist/_build/config.mjs +0 -124
  55. package/dist/_build/plugins.mjs +0 -1041
  56. package/dist/_build/rolldown.mjs +0 -494
  57. package/dist/_build/types.mjs +0 -268
  58. package/dist/node_modules/klona/dist/index.mjs +0 -81
  59. package/dist/node_modules/klona/full/index.mjs +0 -53
  60. package/dist/node_modules/klona/package.json +0 -74
  61. package/dist/node_modules/std-env/dist/index.mjs +0 -1
  62. package/dist/node_modules/std-env/package.json +0 -46
  63. /package/dist/{_deps → _chunks/_deps}/@jridgewell/gen-mapping.mjs +0 -0
  64. /package/dist/{_deps → _chunks/_deps}/@jridgewell/remapping.mjs +0 -0
  65. /package/dist/{_deps → _chunks/_deps}/@jridgewell/resolve-uri.mjs +0 -0
  66. /package/dist/{_deps → _chunks/_deps}/@jridgewell/sourcemap-codec.mjs +0 -0
  67. /package/dist/{_deps → _chunks/_deps}/@jridgewell/trace-mapping.mjs +0 -0
  68. /package/dist/{_deps → _chunks/_deps}/@pi0/vite-plugin-fullstack.mjs +0 -0
  69. /package/dist/{_deps → _chunks/_deps}/@rollup/plugin-alias.mjs +0 -0
  70. /package/dist/{_deps → _chunks/_deps}/@rollup/plugin-commonjs.mjs +0 -0
  71. /package/dist/{_deps → _chunks/_deps}/@rollup/plugin-inject.mjs +0 -0
  72. /package/dist/{_deps → _chunks/_deps}/@rollup/plugin-json.mjs +0 -0
  73. /package/dist/{_deps → _chunks/_deps}/@rollup/plugin-node-resolve.mjs +0 -0
  74. /package/dist/{_deps → _chunks/_deps}/@rollup/plugin-replace.mjs +0 -0
  75. /package/dist/{_deps → _chunks/_deps}/@rollup/pluginutils.mjs +0 -0
  76. /package/dist/{_deps → _chunks/_deps}/acorn.mjs +0 -0
  77. /package/dist/{_deps → _chunks/_deps}/chokidar.mjs +0 -0
  78. /package/dist/{_deps → _chunks/_deps}/citty.mjs +0 -0
  79. /package/dist/{_deps → _chunks/_deps}/commondir.mjs +0 -0
  80. /package/dist/{_deps → _chunks/_deps}/compatx.mjs +0 -0
  81. /package/dist/{_deps → _chunks/_deps}/confbox.mjs +0 -0
  82. /package/dist/{_deps → _chunks/_deps}/debug.mjs +0 -0
  83. /package/dist/{_deps → _chunks/_deps}/deepmerge.mjs +0 -0
  84. /package/dist/{_deps → _chunks/_deps}/depd.mjs +0 -0
  85. /package/dist/{_deps → _chunks/_deps}/dot-prop.mjs +0 -0
  86. /package/dist/{_deps → _chunks/_deps}/dotenv.mjs +0 -0
  87. /package/dist/{_deps → _chunks/_deps}/duplexer.mjs +0 -0
  88. /package/dist/{_deps → _chunks/_deps}/ee-first.mjs +0 -0
  89. /package/dist/{_deps → _chunks/_deps}/encodeurl.mjs +0 -0
  90. /package/dist/{_deps → _chunks/_deps}/escape-html.mjs +0 -0
  91. /package/dist/{_deps → _chunks/_deps}/escape-string-regexp.mjs +0 -0
  92. /package/dist/{_deps → _chunks/_deps}/estree-walker.mjs +0 -0
  93. /package/dist/{_deps → _chunks/_deps}/etag.mjs +0 -0
  94. /package/dist/{_deps → _chunks/_deps}/exsolve.mjs +0 -0
  95. /package/dist/{_deps → _chunks/_deps}/fdir.mjs +0 -0
  96. /package/dist/{_deps → _chunks/_deps}/fresh.mjs +0 -0
  97. /package/dist/{_deps → _chunks/_deps}/function-bind.mjs +0 -0
  98. /package/dist/{_deps → _chunks/_deps}/gzip-size.mjs +0 -0
  99. /package/dist/{_deps → _chunks/_deps}/hasown.mjs +0 -0
  100. /package/dist/{_deps → _chunks/_deps}/http-errors.mjs +0 -0
  101. /package/dist/{_deps → _chunks/_deps}/httpxy.mjs +0 -0
  102. /package/dist/{_deps → _chunks/_deps}/inherits.mjs +0 -0
  103. /package/dist/{_deps → _chunks/_deps}/is-core-module.mjs +0 -0
  104. /package/dist/{_deps → _chunks/_deps}/is-module.mjs +0 -0
  105. /package/dist/{_deps → _chunks/_deps}/is-reference.mjs +0 -0
  106. /package/dist/{_deps → _chunks/_deps}/js-tokens.mjs +0 -0
  107. /package/dist/{_deps → _chunks/_deps}/magic-string.mjs +0 -0
  108. /package/dist/{_deps → _chunks/_deps}/mime-db.mjs +0 -0
  109. /package/dist/{_deps → _chunks/_deps}/mime-types.mjs +0 -0
  110. /package/dist/{_deps → _chunks/_deps}/mime.mjs +0 -0
  111. /package/dist/{_deps → _chunks/_deps}/ms.mjs +0 -0
  112. /package/dist/{_deps → _chunks/_deps}/node-fetch-native.mjs +0 -0
  113. /package/dist/{_deps → _chunks/_deps}/on-finished.mjs +0 -0
  114. /package/dist/{_deps → _chunks/_deps}/parseurl.mjs +0 -0
  115. /package/dist/{_deps → _chunks/_deps}/path-parse.mjs +0 -0
  116. /package/dist/{_deps → _chunks/_deps}/perfect-debounce.mjs +0 -0
  117. /package/dist/{_deps → _chunks/_deps}/picomatch.mjs +0 -0
  118. /package/dist/{_deps → _chunks/_deps}/pretty-bytes.mjs +0 -0
  119. /package/dist/{_deps → _chunks/_deps}/quansync.mjs +0 -0
  120. /package/dist/{_deps → _chunks/_deps}/range-parser.mjs +0 -0
  121. /package/dist/{_deps → _chunks/_deps}/rc9.mjs +0 -0
  122. /package/dist/{_deps → _chunks/_deps}/readdirp.mjs +0 -0
  123. /package/dist/{_deps → _chunks/_deps}/resolve.mjs +0 -0
  124. /package/dist/{_deps → _chunks/_deps}/send.mjs +0 -0
  125. /package/dist/{_deps → _chunks/_deps}/serve-static.mjs +0 -0
  126. /package/dist/{_deps → _chunks/_deps}/setprototypeof.mjs +0 -0
  127. /package/dist/{_deps → _chunks/_deps}/statuses.mjs +0 -0
  128. /package/dist/{_deps → _chunks/_deps}/strip-literal.mjs +0 -0
  129. /package/dist/{_deps → _chunks/_deps}/supports-color.mjs +0 -0
  130. /package/dist/{_deps → _chunks/_deps}/tinyexec.mjs +0 -0
  131. /package/dist/{_deps → _chunks/_deps}/tinyglobby.mjs +0 -0
  132. /package/dist/{_deps → _chunks/_deps}/toidentifier.mjs +0 -0
  133. /package/dist/{_deps → _chunks/_deps}/ultrahtml.mjs +0 -0
  134. /package/dist/{_deps → _chunks/_deps}/unplugin.mjs +0 -0
  135. /package/dist/{_deps → _chunks/_deps}/webpack-virtual-modules.mjs +0 -0
  136. /package/dist/{_presets → _chunks/_presets}/_all.mjs +0 -0
  137. /package/dist/{_presets → _chunks/_presets}/_nitro.mjs +0 -0
  138. /package/dist/{_presets → _chunks/_presets}/_static.mjs +0 -0
  139. /package/dist/{_presets → _chunks/_presets}/_types.mjs +0 -0
  140. /package/dist/{_presets → _chunks/_presets}/alwaysdata.mjs +0 -0
  141. /package/dist/{_presets → _chunks/_presets}/aws-amplify.mjs +0 -0
  142. /package/dist/{_presets → _chunks/_presets}/aws-lambda.mjs +0 -0
  143. /package/dist/{_presets → _chunks/_presets}/bun.mjs +0 -0
  144. /package/dist/{_presets → _chunks/_presets}/cleavr.mjs +0 -0
  145. /package/dist/{_presets → _chunks/_presets}/digitalocean.mjs +0 -0
  146. /package/dist/{_presets → _chunks/_presets}/flightcontrol.mjs +0 -0
  147. /package/dist/{_presets → _chunks/_presets}/genezio.mjs +0 -0
  148. /package/dist/{_presets → _chunks/_presets}/heroku.mjs +0 -0
  149. /package/dist/{_presets → _chunks/_presets}/koyeb.mjs +0 -0
  150. /package/dist/{_presets → _chunks/_presets}/netlify.mjs +0 -0
  151. /package/dist/{_presets → _chunks/_presets}/node.mjs +0 -0
  152. /package/dist/{_presets → _chunks/_presets}/platform.mjs +0 -0
  153. /package/dist/{_presets → _chunks/_presets}/render.mjs +0 -0
  154. /package/dist/{_presets → _chunks/_presets}/standard.mjs +0 -0
  155. /package/dist/{_presets → _chunks/_presets}/stormkit.mjs +0 -0
  156. /package/dist/{_presets → _chunks/_presets}/winterjs.mjs +0 -0
  157. /package/dist/{_presets → _chunks/_presets}/zerops.mjs +0 -0
@@ -1,4 +1,1493 @@
1
- import fsp from 'node:fs/promises';
1
+ import consola, { consola as consola$1 } from 'consola';
2
+ import { Hookable, createDebugger } from 'hookable';
3
+ import { w as watchConfig, l as loadConfig } from '../_chunks/_deps/c12.mjs';
4
+ import { r as resolveCompatibilityDatesFromEnv, a as resolveCompatibilityDates } from '../_chunks/_deps/compatx.mjs';
5
+ import { k as klona, a as klona$1 } from '../_chunks/_deps/klona.mjs';
6
+ import { runtimeDir, pkgDir } from 'nitro/runtime/meta';
7
+ import { d, a } from '../_chunks/_deps/std-env.mjs';
8
+ import { r as resolve, j as join, a as relative, d as dirname, n as normalize } from '../_chunks/_deps/pathe.mjs';
9
+ import { existsSync, promises } from 'node:fs';
10
+ import defu$1, { defu } from 'defu';
11
+ import { withLeadingSlash, withoutTrailingSlash, withTrailingSlash, withBase } from 'ufo';
12
+ import { e as escapeStringRegexp } from '../_chunks/_deps/escape-string-regexp.mjs';
13
+ import { g as resolveModuleExportNames } from '../_chunks/_deps/mlly.mjs';
14
+ import { f as findWorkspaceDir } from '../_chunks/_deps/pkg-types.mjs';
15
+ import { r as resolveModulePath } from '../_chunks/_deps/exsolve.mjs';
16
+ import { createJiti } from 'jiti';
17
+ import { g as glob } from '../_chunks/_deps/tinyglobby.mjs';
18
+ import fsp, { stat, mkdir, writeFile as writeFile$1, readFile } from 'node:fs/promises';
19
+ import { ofetch } from 'ofetch';
20
+ import { createStorage as createStorage$1, builtinDrivers } from 'unstorage';
21
+ import { c as createRouter, a as addRoute, b as compileRouterToString, d as findRoute, f as findAllRoutes } from '../_chunks/_deps/rou3.mjs';
22
+ import { hash } from 'ohash';
23
+ import { c as createUnimport } from '../_chunks/_deps/unimport.mjs';
24
+ import { colors } from 'consola/utils';
25
+ import { g as getProperty } from '../_chunks/_deps/dot-prop.mjs';
26
+ import zlib from 'node:zlib';
27
+ import { m as mime } from '../_chunks/_deps/mime.mjs';
28
+
29
+ const NitroDefaults = {
30
+ // General
31
+ compatibilityDate: "latest",
32
+ debug: d,
33
+ logLevel: a ? 1 : 3,
34
+ runtimeConfig: { app: {}, nitro: {} },
35
+ // Dirs
36
+ scanDirs: [],
37
+ buildDir: ".nitro",
38
+ output: {
39
+ dir: "{{ rootDir }}/.output",
40
+ serverDir: "{{ output.dir }}/server",
41
+ publicDir: "{{ output.dir }}/public"
42
+ },
43
+ // Features
44
+ experimental: {},
45
+ future: {},
46
+ storage: {},
47
+ devStorage: {},
48
+ bundledStorage: [],
49
+ publicAssets: [],
50
+ serverAssets: [],
51
+ plugins: [],
52
+ tasks: {},
53
+ scheduledTasks: {},
54
+ imports: false,
55
+ virtual: {},
56
+ compressPublicAssets: false,
57
+ ignore: [],
58
+ // Dev
59
+ dev: false,
60
+ devServer: { watch: [] },
61
+ watchOptions: { ignoreInitial: true },
62
+ devProxy: {},
63
+ // Logging
64
+ logging: {
65
+ compressedSizes: true,
66
+ buildSuccess: true
67
+ },
68
+ // Routing
69
+ baseURL: process.env.NITRO_APP_BASE_URL || "/",
70
+ handlers: [],
71
+ devHandlers: [],
72
+ errorHandler: void 0,
73
+ routeRules: {},
74
+ prerender: {
75
+ autoSubfolderIndex: true,
76
+ concurrency: 1,
77
+ interval: 0,
78
+ retry: 3,
79
+ retryDelay: 500,
80
+ failOnError: false,
81
+ crawlLinks: false,
82
+ ignore: [],
83
+ routes: []
84
+ },
85
+ // Rollup
86
+ builder: void 0,
87
+ moduleSideEffects: ["unenv/polyfill/", resolve(runtimeDir, "polyfill/")],
88
+ replace: {},
89
+ node: true,
90
+ sourceMap: true,
91
+ esbuild: {
92
+ options: {
93
+ jsxFactory: "h",
94
+ jsxFragment: "Fragment"
95
+ }
96
+ },
97
+ // Advanced
98
+ typescript: {
99
+ strict: true,
100
+ generateRuntimeConfigTypes: false,
101
+ generateTsConfig: false,
102
+ tsconfigPath: "types/tsconfig.json",
103
+ internalPaths: false,
104
+ tsConfig: {}
105
+ },
106
+ nodeModulesDirs: [],
107
+ hooks: {},
108
+ commands: {},
109
+ // Framework
110
+ framework: {
111
+ name: "nitro",
112
+ version: ""
113
+ }
114
+ };
115
+
116
+ async function resolveAssetsOptions(options) {
117
+ for (const publicAsset of options.publicAssets) {
118
+ publicAsset.dir = resolve(options.srcDir, publicAsset.dir);
119
+ publicAsset.baseURL = withLeadingSlash(
120
+ withoutTrailingSlash(publicAsset.baseURL || "/")
121
+ );
122
+ }
123
+ for (const dir of options.scanDirs) {
124
+ const publicDir = resolve(dir, "public");
125
+ if (!existsSync(publicDir)) {
126
+ continue;
127
+ }
128
+ if (options.publicAssets.some((asset) => asset.dir === publicDir)) {
129
+ continue;
130
+ }
131
+ options.publicAssets.push({ dir: publicDir });
132
+ }
133
+ for (const serverAsset of options.serverAssets) {
134
+ serverAsset.dir = resolve(options.srcDir, serverAsset.dir);
135
+ }
136
+ options.serverAssets.push({
137
+ baseName: "server",
138
+ dir: resolve(options.srcDir, "assets")
139
+ });
140
+ for (const asset of options.publicAssets) {
141
+ asset.baseURL = asset.baseURL || "/";
142
+ const isTopLevel = asset.baseURL === "/";
143
+ asset.fallthrough = asset.fallthrough ?? isTopLevel;
144
+ const routeRule = options.routeRules[asset.baseURL + "/**"];
145
+ asset.maxAge = routeRule?.cache?.maxAge ?? asset.maxAge ?? 0;
146
+ if (asset.maxAge && !asset.fallthrough) {
147
+ options.routeRules[asset.baseURL + "/**"] = defu(routeRule, {
148
+ headers: {
149
+ "cache-control": `public, max-age=${asset.maxAge}, immutable`
150
+ }
151
+ });
152
+ }
153
+ }
154
+ }
155
+
156
+ async function resolveCompatibilityOptions(options) {
157
+ options.compatibilityDate = resolveCompatibilityDatesFromEnv(
158
+ options.compatibilityDate
159
+ );
160
+ }
161
+
162
+ async function resolveDatabaseOptions(options) {
163
+ if (options.experimental.database && options.imports) {
164
+ options.imports.presets.push({
165
+ from: "nitro/runtime/internal/database",
166
+ imports: ["useDatabase"]
167
+ });
168
+ if (options.dev && !options.database && !options.devDatabase) {
169
+ options.devDatabase = {
170
+ default: {
171
+ connector: "sqlite",
172
+ options: {
173
+ cwd: options.rootDir
174
+ }
175
+ }
176
+ };
177
+ } else if (options.node && !options.database) {
178
+ options.database = {
179
+ default: {
180
+ connector: "sqlite",
181
+ options: {}
182
+ }
183
+ };
184
+ }
185
+ }
186
+ }
187
+
188
+ async function resolveExportConditionsOptions(options) {
189
+ options.exportConditions = _resolveExportConditions(
190
+ options.exportConditions || [],
191
+ { dev: options.dev, node: options.node, wasm: options.experimental.wasm }
192
+ );
193
+ }
194
+ function _resolveExportConditions(conditions, opts) {
195
+ const resolvedConditions = [];
196
+ resolvedConditions.push(opts.dev ? "development" : "production");
197
+ resolvedConditions.push(...conditions);
198
+ if (opts.node) {
199
+ resolvedConditions.push("node");
200
+ } else {
201
+ resolvedConditions.push(
202
+ "wintercg",
203
+ "worker",
204
+ "web",
205
+ "browser",
206
+ "workerd",
207
+ "edge-light",
208
+ "netlify",
209
+ "edge-routine",
210
+ "deno"
211
+ );
212
+ }
213
+ if (opts.wasm) {
214
+ resolvedConditions.push("wasm", "unwasm");
215
+ }
216
+ resolvedConditions.push("import", "default");
217
+ return resolvedConditions.filter(
218
+ (c, i) => resolvedConditions.indexOf(c) === i
219
+ );
220
+ }
221
+
222
+ async function resolveImportsOptions(options) {
223
+ if (options.imports === false) {
224
+ return;
225
+ }
226
+ options.imports.presets ??= [];
227
+ options.imports.presets.push(...getNitroImportsPreset());
228
+ const h3Exports = await resolveModuleExportNames("h3", {
229
+ url: import.meta.url
230
+ });
231
+ options.imports.presets ??= [];
232
+ options.imports.presets.push({
233
+ from: "h3",
234
+ imports: h3Exports.filter((n) => !/^[A-Z]/.test(n) && n !== "use")
235
+ });
236
+ options.imports.dirs ??= [];
237
+ options.imports.dirs.push(
238
+ ...options.scanDirs.map((dir) => join(dir, "utils/**/*"))
239
+ );
240
+ if (Array.isArray(options.imports.exclude) && options.imports.exclude.length === 0) {
241
+ options.imports.exclude.push(/[/\\]\.git[/\\]/);
242
+ options.imports.exclude.push(options.buildDir);
243
+ const scanDirsInNodeModules = options.scanDirs.map((dir) => dir.match(/(?<=\/)node_modules\/(.+)$/)?.[1]).filter(Boolean);
244
+ options.imports.exclude.push(
245
+ scanDirsInNodeModules.length > 0 ? new RegExp(
246
+ `node_modules\\/(?!${scanDirsInNodeModules.map((dir) => escapeStringRegexp(dir)).join("|")})`
247
+ ) : /[/\\]node_modules[/\\]/
248
+ );
249
+ }
250
+ }
251
+ function getNitroImportsPreset() {
252
+ return [
253
+ {
254
+ from: "nitro/runtime/internal/app",
255
+ imports: ["useNitroApp"]
256
+ },
257
+ {
258
+ from: "nitro/runtime/internal/runtime-config",
259
+ imports: ["useRuntimeConfig"]
260
+ },
261
+ {
262
+ from: "nitro/runtime/internal/plugin",
263
+ imports: ["defineNitroPlugin", "nitroPlugin"]
264
+ },
265
+ {
266
+ from: "nitro/runtime/internal/cache",
267
+ imports: [
268
+ "defineCachedFunction",
269
+ "defineCachedEventHandler",
270
+ "defineCachedHandler",
271
+ "cachedFunction",
272
+ "cachedEventHandler"
273
+ ]
274
+ },
275
+ {
276
+ from: "nitro/runtime/internal/storage",
277
+ imports: ["useStorage"]
278
+ },
279
+ {
280
+ from: "nitro/runtime/internal/renderer",
281
+ imports: ["defineRenderHandler"]
282
+ },
283
+ {
284
+ from: "nitro/runtime/internal/meta",
285
+ imports: ["defineRouteMeta"]
286
+ },
287
+ {
288
+ from: "nitro/runtime/internal/route-rules",
289
+ imports: ["getRouteRules"]
290
+ },
291
+ {
292
+ from: "nitro/runtime/internal/context",
293
+ imports: ["useRequest"]
294
+ },
295
+ {
296
+ from: "nitro/runtime/internal/task",
297
+ imports: ["defineTask", "runTask"]
298
+ },
299
+ {
300
+ from: "nitro/runtime/internal/error/utils",
301
+ imports: ["defineNitroErrorHandler"]
302
+ },
303
+ {
304
+ from: "nitro/deps/ofetch",
305
+ imports: ["$fetch"]
306
+ }
307
+ ];
308
+ }
309
+
310
+ async function resolveOpenAPIOptions(options) {
311
+ if (!options.experimental.openAPI) {
312
+ return;
313
+ }
314
+ if (!options.dev && !options.openAPI?.production) {
315
+ return;
316
+ }
317
+ const shouldPrerender = !options.dev && options.openAPI?.production === "prerender";
318
+ const handlersEnv = shouldPrerender ? "prerender" : "";
319
+ const prerenderRoutes = [];
320
+ const jsonRoute = options.openAPI?.route || "/_openapi.json";
321
+ prerenderRoutes.push(jsonRoute);
322
+ options.handlers.push({
323
+ route: jsonRoute,
324
+ env: handlersEnv,
325
+ handler: join(runtimeDir, "internal/routes/openapi")
326
+ });
327
+ if (options.openAPI?.ui?.scalar !== false) {
328
+ const scalarRoute = options.openAPI?.ui?.scalar?.route || "/_scalar";
329
+ prerenderRoutes.push(scalarRoute);
330
+ options.handlers.push({
331
+ route: options.openAPI?.ui?.scalar?.route || "/_scalar",
332
+ env: handlersEnv,
333
+ handler: join(runtimeDir, "internal/routes/scalar")
334
+ });
335
+ }
336
+ if (options.openAPI?.ui?.swagger !== false) {
337
+ const swaggerRoute = options.openAPI?.ui?.swagger?.route || "/_swagger";
338
+ prerenderRoutes.push(swaggerRoute);
339
+ options.handlers.push({
340
+ route: swaggerRoute,
341
+ env: handlersEnv,
342
+ handler: join(runtimeDir, "internal/routes/swagger")
343
+ });
344
+ }
345
+ if (shouldPrerender) {
346
+ options.prerender ??= {};
347
+ options.prerender.routes ??= [];
348
+ options.prerender.routes.push(...prerenderRoutes);
349
+ }
350
+ }
351
+
352
+ function prettyPath(p, highlight = true) {
353
+ p = relative(process.cwd(), p);
354
+ return highlight ? colors.cyan(p) : p;
355
+ }
356
+ function resolveNitroPath(path, nitroOptions, base) {
357
+ if (typeof path !== "string") {
358
+ throw new TypeError("Invalid path: " + path);
359
+ }
360
+ path = _compilePathTemplate(path)(nitroOptions);
361
+ for (const base2 in nitroOptions.alias) {
362
+ if (path.startsWith(base2)) {
363
+ path = nitroOptions.alias[base2] + path.slice(base2.length);
364
+ }
365
+ }
366
+ return resolve(base || nitroOptions.srcDir, path);
367
+ }
368
+ function _compilePathTemplate(contents) {
369
+ return (params) => contents.replace(/{{ ?([\w.]+) ?}}/g, (_, match) => {
370
+ const val = getProperty(params, match);
371
+ if (!val) {
372
+ consola.warn(
373
+ `cannot resolve template param '${match}' in ${contents.slice(0, 20)}`
374
+ );
375
+ }
376
+ return val || `${match}`;
377
+ });
378
+ }
379
+ async function writeFile(file, contents, log = false) {
380
+ await mkdir(dirname(file), { recursive: true });
381
+ await writeFile$1(
382
+ file,
383
+ contents,
384
+ typeof contents === "string" ? "utf8" : void 0
385
+ );
386
+ if (log) {
387
+ consola.info("Generated", prettyPath(file));
388
+ }
389
+ }
390
+ async function isDirectory(path) {
391
+ try {
392
+ return (await stat(path)).isDirectory();
393
+ } catch {
394
+ return false;
395
+ }
396
+ }
397
+
398
+ const RESOLVE_EXTENSIONS = [".ts", ".js", ".mts", ".mjs", ".tsx", ".jsx"];
399
+ async function resolvePathOptions(options) {
400
+ options.rootDir = resolve(options.rootDir || ".") + "/";
401
+ options.workspaceDir ||= await findWorkspaceDir(options.rootDir).catch(() => options.rootDir) + "/";
402
+ for (const key of ["srcDir", "buildDir"]) {
403
+ options[key] = resolve(options.rootDir, options[key] || ".");
404
+ }
405
+ options.alias ??= {};
406
+ if (!options.static && !options.entry) {
407
+ throw new Error(
408
+ `Nitro entry is missing! Is "${options.preset}" preset correct?`
409
+ );
410
+ }
411
+ if (options.entry) {
412
+ options.entry = resolveNitroPath(options.entry, options);
413
+ }
414
+ options.output.dir = resolveNitroPath(
415
+ options.output.dir || NitroDefaults.output.dir,
416
+ options,
417
+ options.rootDir
418
+ ) + "/";
419
+ options.output.publicDir = resolveNitroPath(
420
+ options.output.publicDir || NitroDefaults.output.publicDir,
421
+ options,
422
+ options.rootDir
423
+ ) + "/";
424
+ options.output.serverDir = resolveNitroPath(
425
+ options.output.serverDir || NitroDefaults.output.serverDir,
426
+ options,
427
+ options.rootDir
428
+ ) + "/";
429
+ options.nodeModulesDirs.push(resolve(options.rootDir, "node_modules"));
430
+ options.nodeModulesDirs.push(resolve(options.workspaceDir, "node_modules"));
431
+ options.nodeModulesDirs.push(resolve(pkgDir, "dist/node_modules"));
432
+ options.nodeModulesDirs.push(resolve(pkgDir, "node_modules"));
433
+ options.nodeModulesDirs.push(resolve(pkgDir, ".."));
434
+ options.nodeModulesDirs = [
435
+ ...new Set(
436
+ // Adding trailing slash to optimize resolve performance (path is explicitly a dir)
437
+ options.nodeModulesDirs.map((dir) => resolve(options.rootDir, dir) + "/")
438
+ )
439
+ ];
440
+ options.plugins = options.plugins.map((p) => resolveNitroPath(p, options));
441
+ options.scanDirs.unshift(options.srcDir);
442
+ options.scanDirs = options.scanDirs.map(
443
+ (dir) => resolve(options.srcDir, dir)
444
+ );
445
+ options.scanDirs = [...new Set(options.scanDirs.map((dir) => dir + "/"))];
446
+ if (options.serverEntry) {
447
+ options.serverEntry = resolveModulePath(
448
+ resolveNitroPath(options.serverEntry, options),
449
+ {
450
+ from: options.scanDirs,
451
+ extensions: RESOLVE_EXTENSIONS
452
+ }
453
+ );
454
+ } else {
455
+ const defaultServerEntry = resolveModulePath("./server", {
456
+ from: options.scanDirs,
457
+ extensions: RESOLVE_EXTENSIONS,
458
+ try: true
459
+ });
460
+ if (defaultServerEntry) {
461
+ options.serverEntry = defaultServerEntry;
462
+ consola.info(
463
+ `Using \`${prettyPath(defaultServerEntry)}\` as server entry.`
464
+ );
465
+ }
466
+ }
467
+ if (options.renderer?.entry) {
468
+ options.renderer.entry = resolveModulePath(
469
+ resolveNitroPath(options.renderer?.entry, options),
470
+ {
471
+ from: options.scanDirs,
472
+ extensions: RESOLVE_EXTENSIONS
473
+ }
474
+ );
475
+ }
476
+ if (options.renderer?.template) {
477
+ options.renderer.template = resolveModulePath(
478
+ resolveNitroPath(options.renderer?.template, options),
479
+ {
480
+ from: options.scanDirs,
481
+ extensions: [".html"]
482
+ }
483
+ );
484
+ } else if (!options.renderer?.entry) {
485
+ const defaultIndex = resolveModulePath("./index.html", {
486
+ from: options.scanDirs,
487
+ extensions: [".html"],
488
+ try: true
489
+ });
490
+ if (defaultIndex) {
491
+ options.renderer ??= {};
492
+ options.renderer.template = defaultIndex;
493
+ consola.info(
494
+ `Using \`${prettyPath(defaultIndex)}\` as renderer template.`
495
+ );
496
+ }
497
+ }
498
+ if (options.renderer?.template && !options.renderer?.entry) {
499
+ options.renderer ??= {};
500
+ options.renderer.entry = join(
501
+ runtimeDir,
502
+ "internal/routes/renderer-template" + (options.dev ? ".dev" : "")
503
+ );
504
+ }
505
+ }
506
+
507
+ async function resolveRouteRulesOptions(options) {
508
+ options.routeRules = defu(options.routeRules, options.routes || {});
509
+ options.routeRules = normalizeRouteRules(options);
510
+ }
511
+ function normalizeRouteRules(config) {
512
+ const normalizedRules = {};
513
+ for (let path in config.routeRules) {
514
+ const routeConfig = config.routeRules[path];
515
+ path = withLeadingSlash(path);
516
+ const routeRules = {
517
+ ...routeConfig,
518
+ redirect: void 0,
519
+ proxy: void 0
520
+ };
521
+ if (routeConfig.redirect) {
522
+ routeRules.redirect = {
523
+ // @ts-ignore
524
+ to: "/",
525
+ status: 307,
526
+ ...typeof routeConfig.redirect === "string" ? { to: routeConfig.redirect } : routeConfig.redirect
527
+ };
528
+ if (path.endsWith("/**")) {
529
+ routeRules.redirect._redirectStripBase = path.slice(0, -3);
530
+ }
531
+ }
532
+ if (routeConfig.proxy) {
533
+ routeRules.proxy = typeof routeConfig.proxy === "string" ? { to: routeConfig.proxy } : routeConfig.proxy;
534
+ if (path.endsWith("/**")) {
535
+ routeRules.proxy._proxyStripBase = path.slice(0, -3);
536
+ }
537
+ }
538
+ if (routeConfig.cors) {
539
+ routeRules.headers = {
540
+ "access-control-allow-origin": "*",
541
+ "access-control-allow-methods": "*",
542
+ "access-control-allow-headers": "*",
543
+ "access-control-max-age": "0",
544
+ ...routeRules.headers
545
+ };
546
+ }
547
+ if (routeConfig.swr) {
548
+ routeRules.cache = routeRules.cache || {};
549
+ routeRules.cache.swr = true;
550
+ if (typeof routeConfig.swr === "number") {
551
+ routeRules.cache.maxAge = routeConfig.swr;
552
+ }
553
+ }
554
+ if (routeConfig.cache === false) {
555
+ routeRules.cache = false;
556
+ }
557
+ normalizedRules[path] = routeRules;
558
+ }
559
+ return normalizedRules;
560
+ }
561
+
562
+ async function resolveRuntimeConfigOptions(options) {
563
+ options.runtimeConfig = normalizeRuntimeConfig(options);
564
+ }
565
+ function normalizeRuntimeConfig(config) {
566
+ provideFallbackValues(config.runtimeConfig || {});
567
+ const runtimeConfig = defu$1(
568
+ config.runtimeConfig,
569
+ {
570
+ app: {
571
+ baseURL: config.baseURL
572
+ },
573
+ nitro: {
574
+ envExpansion: config.experimental?.envExpansion,
575
+ openAPI: config.openAPI
576
+ }
577
+ }
578
+ );
579
+ runtimeConfig.nitro.routeRules = config.routeRules;
580
+ checkSerializableRuntimeConfig(runtimeConfig);
581
+ return runtimeConfig;
582
+ }
583
+ function provideFallbackValues(obj) {
584
+ for (const key in obj) {
585
+ if (obj[key] === void 0 || obj[key] === null) {
586
+ obj[key] = "";
587
+ } else if (typeof obj[key] === "object") {
588
+ provideFallbackValues(obj[key]);
589
+ }
590
+ }
591
+ }
592
+ function checkSerializableRuntimeConfig(obj, path = []) {
593
+ if (isPrimitiveValue(obj)) {
594
+ return;
595
+ }
596
+ for (const key in obj) {
597
+ const value = obj[key];
598
+ if (value === null || value === void 0 || isPrimitiveValue(value)) {
599
+ continue;
600
+ }
601
+ if (Array.isArray(value)) {
602
+ for (const [index, item] of value.entries())
603
+ checkSerializableRuntimeConfig(item, [...path, `${key}[${index}]`]);
604
+ } else if (typeof value === "object" && value.constructor === Object && (!value.constructor?.name || value.constructor.name === "Object")) {
605
+ checkSerializableRuntimeConfig(value, [...path, key]);
606
+ } else {
607
+ console.warn(
608
+ `Runtime config option \`${[...path, key].join(".")}\` may not be able to be serialized.`
609
+ );
610
+ }
611
+ }
612
+ }
613
+ function isPrimitiveValue(value) {
614
+ return typeof value === "string" || typeof value === "number" || typeof value === "boolean";
615
+ }
616
+
617
+ async function resolveStorageOptions(options) {
618
+ const fsMounts = {
619
+ root: resolve(options.rootDir),
620
+ src: resolve(options.srcDir),
621
+ build: resolve(options.buildDir),
622
+ cache: resolve(options.buildDir, "cache")
623
+ };
624
+ for (const p in fsMounts) {
625
+ options.devStorage[p] = options.devStorage[p] || {
626
+ driver: "fs",
627
+ readOnly: p === "root" || p === "src",
628
+ base: fsMounts[p]
629
+ };
630
+ }
631
+ if (options.dev && options.storage.data === void 0 && options.devStorage.data === void 0) {
632
+ options.devStorage.data = {
633
+ driver: "fs",
634
+ base: resolve(options.rootDir, ".data/kv")
635
+ };
636
+ } else if (options.node && options.storage.data === void 0) {
637
+ options.storage.data = {
638
+ driver: "fsLite",
639
+ base: "./.data/kv"
640
+ };
641
+ }
642
+ }
643
+
644
+ async function resolveURLOptions(options) {
645
+ options.baseURL = withLeadingSlash(withTrailingSlash(options.baseURL));
646
+ }
647
+
648
+ async function resolveErrorOptions(options) {
649
+ if (!options.errorHandler) {
650
+ options.errorHandler = [];
651
+ } else if (!Array.isArray(options.errorHandler)) {
652
+ options.errorHandler = [options.errorHandler];
653
+ }
654
+ options.errorHandler.push(
655
+ join(runtimeDir, `internal/error/${options.dev ? "dev" : "prod"}`)
656
+ );
657
+ }
658
+
659
+ const common = {
660
+ meta: {
661
+ name: "nitro-common",
662
+ url: import.meta.url
663
+ },
664
+ alias: {
665
+ "buffer/": "node:buffer",
666
+ "buffer/index": "node:buffer",
667
+ "buffer/index.js": "node:buffer",
668
+ "string_decoder/": "node:string_decoder",
669
+ "process/": "node:process"
670
+ }
671
+ };
672
+ const nodeless = {
673
+ meta: {
674
+ name: "nitro-nodeless",
675
+ url: import.meta.url
676
+ },
677
+ inject: {
678
+ global: "unenv/polyfill/globalthis",
679
+ process: "node:process",
680
+ Buffer: ["node:buffer", "Buffer"],
681
+ clearImmediate: ["node:timers", "clearImmediate"],
682
+ setImmediate: ["node:timers", "setImmediate"],
683
+ performance: "unenv/polyfill/performance",
684
+ PerformanceObserver: ["node:perf_hooks", "PerformanceObserver"],
685
+ BroadcastChannel: ["node:worker_threads", "BroadcastChannel"]
686
+ },
687
+ polyfill: [
688
+ "unenv/polyfill/globalthis-global",
689
+ "unenv/polyfill/process",
690
+ "unenv/polyfill/buffer",
691
+ "unenv/polyfill/timers"
692
+ ]
693
+ };
694
+ async function resolveUnenv(options) {
695
+ options.unenv ??= [];
696
+ if (!Array.isArray(options.unenv)) {
697
+ options.unenv = [options.unenv];
698
+ }
699
+ options.unenv = options.unenv.filter(Boolean);
700
+ if (!options.node) {
701
+ options.unenv.unshift(nodeless);
702
+ }
703
+ options.unenv.unshift(common);
704
+ }
705
+
706
+ async function resolveBuilder(options) {
707
+ if (!options.builder) {
708
+ options.builder = process.env.NITRO_BUILDER || "rollup";
709
+ }
710
+ if (options.builder === "rolldown") {
711
+ try {
712
+ await import('rolldown');
713
+ } catch {
714
+ throw new Error(
715
+ `Builder "rolldown" is not available. Make sure to install "rolldown" package.`
716
+ );
717
+ }
718
+ } else if (options.builder === "vite") {
719
+ try {
720
+ await import('vite');
721
+ } catch {
722
+ throw new Error(
723
+ `Builder "vite" is not available. Make sure to install "vite" package.`
724
+ );
725
+ }
726
+ }
727
+ if (!["rollup", "rolldown", "vite"].includes(options.builder)) {
728
+ throw new Error(`Builder "${options.builder}" is not supported.`);
729
+ }
730
+ }
731
+
732
+ const configResolvers = [
733
+ resolveCompatibilityOptions,
734
+ resolvePathOptions,
735
+ resolveImportsOptions,
736
+ resolveRouteRulesOptions,
737
+ resolveDatabaseOptions,
738
+ resolveExportConditionsOptions,
739
+ resolveRuntimeConfigOptions,
740
+ resolveOpenAPIOptions,
741
+ resolveURLOptions,
742
+ resolveAssetsOptions,
743
+ resolveStorageOptions,
744
+ resolveErrorOptions,
745
+ resolveUnenv,
746
+ resolveBuilder
747
+ ];
748
+ async function loadOptions(configOverrides = {}, opts = {}) {
749
+ const options = await _loadUserConfig(configOverrides, opts);
750
+ for (const resolver of configResolvers) {
751
+ await resolver(options);
752
+ }
753
+ return options;
754
+ }
755
+ async function _loadUserConfig(configOverrides = {}, opts = {}) {
756
+ configOverrides = klona(configOverrides);
757
+ globalThis.defineNitroConfig = globalThis.defineNitroConfig || ((c) => c);
758
+ let compatibilityDate = configOverrides.compatibilityDate || opts.compatibilityDate || (process.env.NITRO_COMPATIBILITY_DATE || process.env.SERVER_COMPATIBILITY_DATE || process.env.COMPATIBILITY_DATE);
759
+ const { resolvePreset } = await import('../_chunks/_presets/index.mjs');
760
+ let preset = configOverrides.preset || process.env.NITRO_PRESET || process.env.SERVER_PRESET;
761
+ const _dotenv = opts.dotenv ?? (configOverrides.dev && { fileName: [".env", ".env.local"] });
762
+ const loadedConfig = await (opts.watch ? watchConfig : loadConfig)({
763
+ name: "nitro",
764
+ cwd: configOverrides.rootDir,
765
+ dotenv: _dotenv,
766
+ extend: { extendKey: ["extends", "preset"] },
767
+ defaults: NitroDefaults,
768
+ jitiOptions: {
769
+ alias: {
770
+ nitropack: "nitro/config",
771
+ "nitro/config": "nitro/config"
772
+ }
773
+ },
774
+ async overrides({ rawConfigs }) {
775
+ const getConf = (key) => configOverrides[key] ?? rawConfigs.main?.[key] ?? rawConfigs.rc?.[key] ?? rawConfigs.packageJson?.[key];
776
+ if (!compatibilityDate) {
777
+ compatibilityDate = getConf("compatibilityDate");
778
+ }
779
+ const framework = getConf("framework");
780
+ const isCustomFramework = framework?.name && framework.name !== "nitro";
781
+ if (!preset) {
782
+ preset = getConf("preset");
783
+ }
784
+ if (configOverrides.dev) {
785
+ preset = preset && preset !== "nitro-dev" ? await resolvePreset(preset, {
786
+ static: getConf("static"),
787
+ dev: true,
788
+ compatibilityDate: compatibilityDate || "latest"
789
+ }).then((p) => p?._meta?.name || "nitro-dev").catch(() => "nitro-dev") : "nitro-dev";
790
+ } else if (!preset) {
791
+ preset = await resolvePreset("", {
792
+ static: getConf("static"),
793
+ dev: false,
794
+ compatibilityDate: compatibilityDate || "latest"
795
+ }).then((p) => p?._meta?.name);
796
+ }
797
+ return {
798
+ ...configOverrides,
799
+ preset,
800
+ typescript: {
801
+ generateRuntimeConfigTypes: !isCustomFramework,
802
+ ...getConf("typescript"),
803
+ ...configOverrides.typescript
804
+ }
805
+ };
806
+ },
807
+ async resolve(id) {
808
+ const preset2 = await resolvePreset(id, {
809
+ static: configOverrides.static,
810
+ compatibilityDate: compatibilityDate || "latest",
811
+ dev: configOverrides.dev
812
+ });
813
+ if (preset2) {
814
+ return {
815
+ config: klona(preset2)
816
+ };
817
+ }
818
+ },
819
+ ...opts.c12
820
+ });
821
+ const options = klona(loadedConfig.config);
822
+ options._config = configOverrides;
823
+ options._c12 = loadedConfig;
824
+ const _presetName = (loadedConfig.layers || []).find((l) => l.config?._meta?.name)?.config?._meta?.name || preset;
825
+ options.preset = _presetName;
826
+ options.compatibilityDate = resolveCompatibilityDates(
827
+ compatibilityDate,
828
+ options.compatibilityDate
829
+ );
830
+ if (options.dev && options.preset !== "nitro-dev") {
831
+ consola.info(`Using \`${options.preset}\` emulation in development mode.`);
832
+ }
833
+ return options;
834
+ }
835
+
836
+ async function updateNitroConfig(nitro, config) {
837
+ nitro.options.routeRules = normalizeRouteRules(
838
+ config.routeRules ? config : nitro.options
839
+ );
840
+ nitro.options.runtimeConfig = normalizeRuntimeConfig(
841
+ config.runtimeConfig ? config : nitro.options
842
+ );
843
+ await nitro.hooks.callHook("rollup:reload");
844
+ consola.success("Nitro config hot reloaded!");
845
+ }
846
+
847
+ async function installModules(nitro) {
848
+ const _modules = [...nitro.options.modules || []];
849
+ const modules = await Promise.all(
850
+ _modules.map((mod) => _resolveNitroModule(mod, nitro.options))
851
+ );
852
+ const _installedURLs = /* @__PURE__ */ new Set();
853
+ for (const mod of modules) {
854
+ if (mod._url) {
855
+ if (_installedURLs.has(mod._url)) {
856
+ continue;
857
+ }
858
+ _installedURLs.add(mod._url);
859
+ }
860
+ await mod.setup(nitro);
861
+ }
862
+ }
863
+ async function _resolveNitroModule(mod, nitroOptions) {
864
+ let _url;
865
+ if (typeof mod === "string") {
866
+ globalThis.defineNitroModule = // @ts-ignore
867
+ globalThis.defineNitroModule || ((mod2) => mod2);
868
+ const jiti = createJiti(nitroOptions.rootDir, {
869
+ alias: nitroOptions.alias
870
+ });
871
+ const _modPath = jiti.esmResolve(mod);
872
+ _url = _modPath;
873
+ mod = await jiti.import(_modPath, { default: true });
874
+ }
875
+ if (typeof mod === "function") {
876
+ mod = { setup: mod };
877
+ }
878
+ if (!mod.setup) {
879
+ mod.setup = () => {
880
+ };
881
+ }
882
+ return {
883
+ _url,
884
+ ...mod
885
+ };
886
+ }
887
+
888
+ const GLOB_SCAN_PATTERN = "**/*.{js,mjs,cjs,ts,mts,cts,tsx,jsx}";
889
+ const suffixRegex = /(\.(?<method>connect|delete|get|head|options|patch|post|put|trace))?(\.(?<env>dev|prod|prerender))?$/;
890
+ async function scanAndSyncOptions(nitro) {
891
+ const scannedPlugins = await scanPlugins(nitro);
892
+ for (const plugin of scannedPlugins) {
893
+ if (!nitro.options.plugins.includes(plugin)) {
894
+ nitro.options.plugins.push(plugin);
895
+ }
896
+ }
897
+ if (nitro.options.experimental.tasks) {
898
+ const scannedTasks = await scanTasks(nitro);
899
+ for (const scannedTask of scannedTasks) {
900
+ if (scannedTask.name in nitro.options.tasks) {
901
+ if (!nitro.options.tasks[scannedTask.name].handler) {
902
+ nitro.options.tasks[scannedTask.name].handler = scannedTask.handler;
903
+ }
904
+ } else {
905
+ nitro.options.tasks[scannedTask.name] = {
906
+ handler: scannedTask.handler,
907
+ description: ""
908
+ };
909
+ }
910
+ }
911
+ }
912
+ const scannedModules = await scanModules(nitro);
913
+ nitro.options.modules = nitro.options.modules || [];
914
+ for (const modPath of scannedModules) {
915
+ if (!nitro.options.modules.includes(modPath)) {
916
+ nitro.options.modules.push(modPath);
917
+ }
918
+ }
919
+ }
920
+ async function scanHandlers(nitro) {
921
+ const middleware = await scanMiddleware(nitro);
922
+ const handlers = await Promise.all([
923
+ scanServerRoutes(
924
+ nitro,
925
+ nitro.options.apiDir || "api",
926
+ nitro.options.apiBaseURL || "/api"
927
+ ),
928
+ scanServerRoutes(nitro, nitro.options.routesDir || "routes")
929
+ ]).then((r) => r.flat());
930
+ nitro.scannedHandlers = [
931
+ ...middleware,
932
+ ...handlers.filter((h, index, array) => {
933
+ return array.findIndex(
934
+ (h2) => h.route === h2.route && h.method === h2.method && h.env === h2.env
935
+ ) === index;
936
+ })
937
+ ];
938
+ return handlers;
939
+ }
940
+ async function scanMiddleware(nitro) {
941
+ const files = await scanFiles(nitro, "middleware");
942
+ return files.map((file) => {
943
+ return {
944
+ route: "/**",
945
+ middleware: true,
946
+ handler: file.fullPath
947
+ };
948
+ });
949
+ }
950
+ async function scanServerRoutes(nitro, dir, prefix = "/") {
951
+ const files = await scanFiles(nitro, dir);
952
+ return files.map((file) => {
953
+ let route = file.path.replace(/\.[A-Za-z]+$/, "").replace(/\(([^(/\\]+)\)[/\\]/g, "").replace(/\[\.{3}]/g, "**").replace(/\[\.{3}(\w+)]/g, "**:$1").replace(/\[([^/\]]+)]/g, ":$1");
954
+ route = withLeadingSlash(withoutTrailingSlash(withBase(route, prefix)));
955
+ const suffixMatch = route.match(suffixRegex);
956
+ let method;
957
+ let env;
958
+ if (suffixMatch?.index && suffixMatch?.index >= 0) {
959
+ route = route.slice(0, suffixMatch.index);
960
+ method = suffixMatch.groups?.method;
961
+ env = suffixMatch.groups?.env;
962
+ }
963
+ route = route.replace(/\/index$/, "") || "/";
964
+ return {
965
+ handler: file.fullPath,
966
+ lazy: true,
967
+ middleware: false,
968
+ route,
969
+ method,
970
+ env
971
+ };
972
+ });
973
+ }
974
+ async function scanPlugins(nitro) {
975
+ const files = await scanFiles(nitro, "plugins");
976
+ return files.map((f) => f.fullPath);
977
+ }
978
+ async function scanTasks(nitro) {
979
+ const files = await scanFiles(nitro, "tasks");
980
+ return files.map((f) => {
981
+ const name = f.path.replace(/\/index$/, "").replace(/\.[A-Za-z]+$/, "").replace(/\//g, ":");
982
+ return { name, handler: f.fullPath };
983
+ });
984
+ }
985
+ async function scanModules(nitro) {
986
+ const files = await scanFiles(nitro, "modules");
987
+ return files.map((f) => f.fullPath);
988
+ }
989
+ async function scanFiles(nitro, name) {
990
+ const files = await Promise.all(
991
+ nitro.options.scanDirs.map((dir) => scanDir(nitro, dir, name))
992
+ ).then((r) => r.flat());
993
+ return files;
994
+ }
995
+ async function scanDir(nitro, dir, name) {
996
+ const fileNames = await glob(join(name, GLOB_SCAN_PATTERN), {
997
+ cwd: dir,
998
+ dot: true,
999
+ ignore: nitro.options.ignore,
1000
+ absolute: true
1001
+ }).catch((error) => {
1002
+ if (error?.code === "ENOTDIR") {
1003
+ nitro.logger.warn(
1004
+ `Ignoring \`${join(dir, name)}\`. It must be a directory.`
1005
+ );
1006
+ return [];
1007
+ }
1008
+ throw error;
1009
+ });
1010
+ return fileNames.map((fullPath) => {
1011
+ return {
1012
+ fullPath,
1013
+ path: relative(join(dir, name), fullPath)
1014
+ };
1015
+ }).sort((a, b) => a.path.localeCompare(b.path));
1016
+ }
1017
+
1018
+ async function runTask(taskEvent, opts) {
1019
+ const ctx = await _getTasksContext(opts);
1020
+ const result = await ctx.devFetch(`/_nitro/tasks/${taskEvent.name}`, {
1021
+ method: "POST",
1022
+ body: taskEvent
1023
+ });
1024
+ return result;
1025
+ }
1026
+ async function listTasks(opts) {
1027
+ const ctx = await _getTasksContext(opts);
1028
+ const res = await ctx.devFetch("/_nitro/tasks");
1029
+ return res.tasks;
1030
+ }
1031
+ function addNitroTasksVirtualFile(nitro) {
1032
+ nitro.options.virtual["#nitro-internal-virtual/tasks"] = () => {
1033
+ const _scheduledTasks = Object.entries(nitro.options.scheduledTasks || {}).map(([cron, _tasks]) => {
1034
+ const tasks = (Array.isArray(_tasks) ? _tasks : [_tasks]).filter(
1035
+ (name) => {
1036
+ if (!nitro.options.tasks[name]) {
1037
+ nitro.logger.warn(`Scheduled task \`${name}\` is not defined!`);
1038
+ return false;
1039
+ }
1040
+ return true;
1041
+ }
1042
+ );
1043
+ return { cron, tasks };
1044
+ }).filter((e) => e.tasks.length > 0);
1045
+ const scheduledTasks = _scheduledTasks.length > 0 ? _scheduledTasks : false;
1046
+ return (
1047
+ /* js */
1048
+ `
1049
+ export const scheduledTasks = ${JSON.stringify(scheduledTasks)};
1050
+
1051
+ export const tasks = {
1052
+ ${Object.entries(nitro.options.tasks).map(
1053
+ ([name, task]) => `"${name}": {
1054
+ meta: {
1055
+ description: ${JSON.stringify(task.description)},
1056
+ },
1057
+ resolve: ${task.handler ? `() => import("${normalize(
1058
+ task.handler
1059
+ )}").then(r => r.default || r)` : "undefined"},
1060
+ }`
1061
+ ).join(",\n")}
1062
+ };`
1063
+ );
1064
+ };
1065
+ }
1066
+ const _devHint = `(is dev server running?)`;
1067
+ async function _getTasksContext(opts) {
1068
+ const cwd = resolve(process.cwd(), opts?.cwd || ".");
1069
+ const outDir = resolve(cwd, opts?.buildDir || ".nitro");
1070
+ const buildInfoPath = resolve(outDir, "nitro.json");
1071
+ if (!existsSync(buildInfoPath)) {
1072
+ throw new Error(`Missing info file: \`${buildInfoPath}\` ${_devHint}`);
1073
+ }
1074
+ const buildInfo = JSON.parse(
1075
+ await readFile(buildInfoPath, "utf8")
1076
+ );
1077
+ if (!buildInfo.dev?.pid || !buildInfo.dev?.workerAddress) {
1078
+ throw new Error(
1079
+ `Missing dev server info in: \`${buildInfoPath}\` ${_devHint}`
1080
+ );
1081
+ }
1082
+ if (!_pidIsRunning(buildInfo.dev.pid)) {
1083
+ throw new Error(`Dev server is not running (pid: ${buildInfo.dev.pid})`);
1084
+ }
1085
+ const devFetch = ofetch.create({
1086
+ baseURL: `http://${buildInfo.dev.workerAddress.host || "localhost"}:${buildInfo.dev.workerAddress.port || "3000"}`,
1087
+ // @ts-expect-error
1088
+ socketPath: buildInfo.dev.workerAddress.socketPath
1089
+ });
1090
+ return {
1091
+ buildInfo,
1092
+ devFetch
1093
+ };
1094
+ }
1095
+ function _pidIsRunning(pid) {
1096
+ try {
1097
+ process.kill(pid, 0);
1098
+ return true;
1099
+ } catch {
1100
+ return false;
1101
+ }
1102
+ }
1103
+
1104
+ async function createStorage(nitro) {
1105
+ const storage = createStorage$1();
1106
+ const mounts = klona$1({
1107
+ ...nitro.options.storage,
1108
+ ...nitro.options.devStorage
1109
+ });
1110
+ for (const [path, opts] of Object.entries(mounts)) {
1111
+ if (opts.driver) {
1112
+ const driver = await import(builtinDrivers[opts.driver] || opts.driver).then((r) => r.default || r);
1113
+ storage.mount(path, driver(opts));
1114
+ } else {
1115
+ nitro.logger.warn(`No \`driver\` set for storage mount point "${path}".`);
1116
+ }
1117
+ }
1118
+ return storage;
1119
+ }
1120
+ async function snapshotStorage(nitro) {
1121
+ const data = {};
1122
+ const allKeys = [
1123
+ ...new Set(
1124
+ await Promise.all(
1125
+ nitro.options.bundledStorage.map((base) => nitro.storage.getKeys(base))
1126
+ ).then((r) => r.flat())
1127
+ )
1128
+ ];
1129
+ await Promise.all(
1130
+ allKeys.map(async (key) => {
1131
+ data[key] = await nitro.storage.getItem(key);
1132
+ })
1133
+ );
1134
+ return data;
1135
+ }
1136
+
1137
+ const isGlobalMiddleware = (h) => !h.method && (!h.route || h.route === "/**");
1138
+ function initNitroRouting(nitro) {
1139
+ const envConditions = new Set(
1140
+ [
1141
+ nitro.options.dev ? "dev" : "prod",
1142
+ nitro.options.preset,
1143
+ nitro.options.preset === "nitro-prerender" ? "prerender" : void 0
1144
+ ].filter(Boolean)
1145
+ );
1146
+ const matchesEnv = (h) => {
1147
+ const hEnv = Array.isArray(h.env) ? h.env : [h.env];
1148
+ const envs = hEnv.filter(Boolean);
1149
+ return envs.length === 0 || envs.some((env) => envConditions.has(env));
1150
+ };
1151
+ const routes = new Router();
1152
+ const routeRules = new Router(
1153
+ true
1154
+ /* matchAll */
1155
+ );
1156
+ const globalMiddleware = [];
1157
+ const routedMiddleware = new Router(
1158
+ true
1159
+ /* matchAll */
1160
+ );
1161
+ const warns = /* @__PURE__ */ new Set();
1162
+ const sync = () => {
1163
+ routeRules._update(
1164
+ Object.entries(nitro.options.routeRules).map(([route, data]) => ({
1165
+ route,
1166
+ method: "",
1167
+ data: {
1168
+ ...data,
1169
+ _route: route
1170
+ }
1171
+ }))
1172
+ );
1173
+ const _routes = [
1174
+ ...nitro.scannedHandlers,
1175
+ ...nitro.options.handlers
1176
+ ].filter((h) => h && !h.middleware && matchesEnv(h));
1177
+ if (nitro.options.renderer?.entry) {
1178
+ const existingWildcard = _routes.findIndex(
1179
+ (h) => /^\/\*\*(:.+)?$/.test(h.route) && (!h.method || h.method === "GET")
1180
+ );
1181
+ if (existingWildcard !== -1) {
1182
+ const h = _routes[existingWildcard];
1183
+ const warn = `The renderer will override \`${relative(".", h.handler)}\` (route: \`${h.route}\`). Use a more specific route or different HTTP method.`;
1184
+ if (!warns.has(warn)) {
1185
+ warns.add(warn);
1186
+ nitro.logger.warn(warn);
1187
+ }
1188
+ _routes.splice(existingWildcard, 1);
1189
+ }
1190
+ _routes.push({
1191
+ route: "/**",
1192
+ lazy: true,
1193
+ handler: nitro.options.renderer?.entry
1194
+ });
1195
+ }
1196
+ routes._update(
1197
+ _routes.map((h) => ({
1198
+ ...h,
1199
+ method: h.method || "",
1200
+ data: handlerWithImportHash(h)
1201
+ }))
1202
+ );
1203
+ const _middleware = [
1204
+ ...nitro.scannedHandlers,
1205
+ ...nitro.options.handlers
1206
+ ].filter((h) => h && h.middleware && matchesEnv(h));
1207
+ if (nitro.options.serveStatic) {
1208
+ _middleware.unshift({
1209
+ route: "/**",
1210
+ middleware: true,
1211
+ handler: join(runtimeDir, "internal/static")
1212
+ });
1213
+ }
1214
+ globalMiddleware.splice(
1215
+ 0,
1216
+ globalMiddleware.length,
1217
+ ..._middleware.filter((h) => isGlobalMiddleware(h)).map((m) => handlerWithImportHash(m))
1218
+ );
1219
+ routedMiddleware._update(
1220
+ _middleware.filter((h) => !isGlobalMiddleware(h)).map((h) => ({
1221
+ ...h,
1222
+ method: h.method || "",
1223
+ data: handlerWithImportHash(h)
1224
+ }))
1225
+ );
1226
+ };
1227
+ nitro.routing = Object.freeze({
1228
+ sync,
1229
+ routes,
1230
+ routeRules,
1231
+ globalMiddleware,
1232
+ routedMiddleware
1233
+ });
1234
+ }
1235
+ function handlerWithImportHash(h) {
1236
+ const id = (h.lazy ? "_lazy_" : "_") + hash(h.handler).replace(/-/g, "").slice(0, 6);
1237
+ return { ...h, _importHash: id };
1238
+ }
1239
+ class Router {
1240
+ #routes;
1241
+ #router;
1242
+ #compiled;
1243
+ constructor(matchAll) {
1244
+ this._update([]);
1245
+ }
1246
+ get routes() {
1247
+ return this.#routes;
1248
+ }
1249
+ _update(routes) {
1250
+ this.#routes = routes;
1251
+ this.#router = createRouter();
1252
+ this.#compiled = void 0;
1253
+ for (const route of routes) {
1254
+ addRoute(this.#router, route.method, route.route, route.data);
1255
+ }
1256
+ }
1257
+ hasRoutes() {
1258
+ return this.#routes.length > 0;
1259
+ }
1260
+ compileToString(opts) {
1261
+ return this.#compiled || (this.#compiled = compileRouterToString(this.#router, void 0, opts));
1262
+ }
1263
+ match(method, path) {
1264
+ return findRoute(this.#router, method, path)?.data;
1265
+ }
1266
+ matchAll(method, path) {
1267
+ return findAllRoutes(this.#router, method, path).map(
1268
+ (route) => route.data
1269
+ );
1270
+ }
1271
+ }
1272
+
1273
+ async function createNitro(config = {}, opts = {}) {
1274
+ const options = await loadOptions(config, opts);
1275
+ const nitro = {
1276
+ options,
1277
+ hooks: new Hookable(),
1278
+ vfs: {},
1279
+ routing: {},
1280
+ logger: consola$1.withTag("nitro"),
1281
+ scannedHandlers: [],
1282
+ close: () => nitro.hooks.callHook("close"),
1283
+ storage: void 0,
1284
+ async updateConfig(config2) {
1285
+ updateNitroConfig(nitro, config2);
1286
+ }
1287
+ };
1288
+ initNitroRouting(nitro);
1289
+ await scanAndSyncOptions(nitro);
1290
+ nitro.storage = await createStorage(nitro);
1291
+ nitro.hooks.hook("close", async () => {
1292
+ await nitro.storage.dispose();
1293
+ });
1294
+ if (nitro.options.debug) {
1295
+ createDebugger(nitro.hooks, { tag: "nitro" });
1296
+ }
1297
+ if (nitro.options.logLevel !== void 0) {
1298
+ nitro.logger.level = nitro.options.logLevel;
1299
+ }
1300
+ nitro.hooks.addHooks(nitro.options.hooks);
1301
+ addNitroTasksVirtualFile(nitro);
1302
+ await installModules(nitro);
1303
+ if (nitro.options.imports) {
1304
+ nitro.unimport = createUnimport(nitro.options.imports);
1305
+ await nitro.unimport.init();
1306
+ nitro.options.virtual["#imports"] = () => nitro.unimport?.toExports() || "";
1307
+ nitro.options.virtual["#nitro"] = 'export * from "#imports"';
1308
+ }
1309
+ await scanHandlers(nitro);
1310
+ nitro.routing.sync();
1311
+ return nitro;
1312
+ }
1313
+
1314
+ async function compressPublicAssets(nitro) {
1315
+ const publicFiles = await glob("**", {
1316
+ cwd: nitro.options.output.publicDir,
1317
+ absolute: false,
1318
+ dot: true,
1319
+ ignore: ["**/*.gz", "**/*.br"]
1320
+ });
1321
+ await Promise.all(
1322
+ publicFiles.map(async (fileName) => {
1323
+ const filePath = resolve(nitro.options.output.publicDir, fileName);
1324
+ if (existsSync(filePath + ".gz") || existsSync(filePath + ".br")) {
1325
+ return;
1326
+ }
1327
+ const mimeType = mime.getType(fileName) || "text/plain";
1328
+ const fileContents = await fsp.readFile(filePath);
1329
+ if (fileContents.length < 1024 || fileName.endsWith(".map") || !isCompressibleMime(mimeType)) {
1330
+ return;
1331
+ }
1332
+ const { gzip, brotli } = nitro.options.compressPublicAssets || {};
1333
+ const encodings = [
1334
+ gzip !== false && "gzip",
1335
+ brotli !== false && "br"
1336
+ ].filter(Boolean);
1337
+ await Promise.all(
1338
+ encodings.map(async (encoding) => {
1339
+ const suffix = "." + (encoding === "gzip" ? "gz" : "br");
1340
+ const compressedPath = filePath + suffix;
1341
+ if (existsSync(compressedPath)) {
1342
+ return;
1343
+ }
1344
+ const gzipOptions = { level: zlib.constants.Z_BEST_COMPRESSION };
1345
+ const brotliOptions = {
1346
+ [zlib.constants.BROTLI_PARAM_MODE]: isTextMime(mimeType) ? zlib.constants.BROTLI_MODE_TEXT : zlib.constants.BROTLI_MODE_GENERIC,
1347
+ [zlib.constants.BROTLI_PARAM_QUALITY]: zlib.constants.BROTLI_MAX_QUALITY,
1348
+ [zlib.constants.BROTLI_PARAM_SIZE_HINT]: fileContents.length
1349
+ };
1350
+ const compressedBuff = await new Promise(
1351
+ (resolve2, reject) => {
1352
+ const cb = (error, result) => error ? reject(error) : resolve2(result);
1353
+ if (encoding === "gzip") {
1354
+ zlib.gzip(fileContents, gzipOptions, cb);
1355
+ } else {
1356
+ zlib.brotliCompress(fileContents, brotliOptions, cb);
1357
+ }
1358
+ }
1359
+ );
1360
+ await fsp.writeFile(compressedPath, compressedBuff);
1361
+ })
1362
+ );
1363
+ })
1364
+ );
1365
+ }
1366
+ function isTextMime(mimeType) {
1367
+ return /text|javascript|json|xml/.test(mimeType);
1368
+ }
1369
+ const COMPRESSIBLE_MIMES_RE = /* @__PURE__ */ new Set([
1370
+ "application/dash+xml",
1371
+ "application/eot",
1372
+ "application/font",
1373
+ "application/font-sfnt",
1374
+ "application/javascript",
1375
+ "application/json",
1376
+ "application/opentype",
1377
+ "application/otf",
1378
+ "application/pdf",
1379
+ "application/pkcs7-mime",
1380
+ "application/protobuf",
1381
+ "application/rss+xml",
1382
+ "application/truetype",
1383
+ "application/ttf",
1384
+ "application/vnd.apple.mpegurl",
1385
+ "application/vnd.mapbox-vector-tile",
1386
+ "application/vnd.ms-fontobject",
1387
+ "application/wasm",
1388
+ "application/xhtml+xml",
1389
+ "application/xml",
1390
+ "application/x-font-opentype",
1391
+ "application/x-font-truetype",
1392
+ "application/x-font-ttf",
1393
+ "application/x-httpd-cgi",
1394
+ "application/x-javascript",
1395
+ "application/x-mpegurl",
1396
+ "application/x-opentype",
1397
+ "application/x-otf",
1398
+ "application/x-perl",
1399
+ "application/x-ttf",
1400
+ "font/eot",
1401
+ "font/opentype",
1402
+ "font/otf",
1403
+ "font/ttf",
1404
+ "image/svg+xml",
1405
+ "text/css",
1406
+ "text/csv",
1407
+ "text/html",
1408
+ "text/javascript",
1409
+ "text/js",
1410
+ "text/plain",
1411
+ "text/richtext",
1412
+ "text/tab-separated-values",
1413
+ "text/xml",
1414
+ "text/x-component",
1415
+ "text/x-java-source",
1416
+ "text/x-script",
1417
+ "vnd.apple.mpegurl"
1418
+ ]);
1419
+ function isCompressibleMime(mimeType) {
1420
+ return COMPRESSIBLE_MIMES_RE.has(mimeType);
1421
+ }
1422
+
1423
+ const NEGATION_RE = /^(!?)(.*)$/;
1424
+ const PARENT_DIR_GLOB_RE = /!?\.\.\//;
1425
+ async function scanUnprefixedPublicAssets(nitro) {
1426
+ const scannedPaths = [];
1427
+ for (const asset of nitro.options.publicAssets) {
1428
+ if (asset.baseURL && asset.baseURL !== "/" && !asset.fallthrough) {
1429
+ continue;
1430
+ }
1431
+ if (!await isDirectory(asset.dir)) {
1432
+ continue;
1433
+ }
1434
+ const includePatterns = getIncludePatterns(nitro, asset.dir);
1435
+ const publicAssets = await glob(includePatterns, {
1436
+ cwd: asset.dir,
1437
+ absolute: false,
1438
+ dot: true
1439
+ });
1440
+ scannedPaths.push(
1441
+ ...publicAssets.map((file) => join(asset.baseURL || "/", file))
1442
+ );
1443
+ }
1444
+ return scannedPaths;
1445
+ }
1446
+ async function copyPublicAssets(nitro) {
1447
+ if (nitro.options.noPublicDir) {
1448
+ return;
1449
+ }
1450
+ for (const asset of nitro.options.publicAssets) {
1451
+ const srcDir = asset.dir;
1452
+ const dstDir = join(nitro.options.output.publicDir, asset.baseURL);
1453
+ if (await isDirectory(srcDir)) {
1454
+ const includePatterns = getIncludePatterns(nitro, srcDir);
1455
+ const publicAssets = await glob(includePatterns, {
1456
+ cwd: srcDir,
1457
+ absolute: false,
1458
+ dot: true
1459
+ });
1460
+ await Promise.all(
1461
+ publicAssets.map(async (file) => {
1462
+ const src = join(srcDir, file);
1463
+ const dst = join(dstDir, file);
1464
+ if (!existsSync(dst)) {
1465
+ await promises.cp(src, dst);
1466
+ }
1467
+ })
1468
+ );
1469
+ }
1470
+ }
1471
+ if (nitro.options.compressPublicAssets) {
1472
+ await compressPublicAssets(nitro);
1473
+ }
1474
+ nitro.logger.success(
1475
+ "Generated public " + prettyPath(nitro.options.output.publicDir)
1476
+ );
1477
+ }
1478
+ function getIncludePatterns(nitro, srcDir) {
1479
+ return [
1480
+ "**",
1481
+ ...nitro.options.ignore.map((p) => {
1482
+ const [_, negation, pattern] = p.match(NEGATION_RE) || [];
1483
+ return (
1484
+ // Convert ignore to include patterns
1485
+ (negation ? "" : "!") + // Make non-glob patterns relative to publicAssetDir
1486
+ (pattern.startsWith("*") ? pattern : relative(srcDir, resolve(nitro.options.srcDir, pattern)))
1487
+ );
1488
+ })
1489
+ ].filter((p) => !PARENT_DIR_GLOB_RE.test(p));
1490
+ }
2
1491
 
3
1492
  async function prepare(nitro) {
4
1493
  await prepareDir(nitro.options.output.dir);
@@ -14,4 +1503,4 @@ async function prepareDir(dir) {
14
1503
  await fsp.mkdir(dir, { recursive: true });
15
1504
  }
16
1505
 
17
- export { prepare as p };
1506
+ export { snapshotStorage as a, scanUnprefixedPublicAssets as b, createNitro as c, compressPublicAssets as d, runTask as e, listTasks as f, copyPublicAssets as g, prettyPath as h, isDirectory as i, loadOptions as l, prepare as p, resolveNitroPath as r, scanHandlers as s, writeFile as w };