nitro-nightly 3.1.0-20251028-110430-e607b753 → 3.1.0-20251028-131831-fe9fd554

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
@@ -0,0 +1,648 @@
1
+ import { c as createNitro, b as scanUnprefixedPublicAssets, d as compressPublicAssets, w as writeFile, r as resolveNitroPath, i as isDirectory } from '../_build/prepare.mjs';
2
+ import { pathToFileURL } from 'node:url';
3
+ import { colors } from 'consola/utils';
4
+ import { defu } from 'defu';
5
+ import { m as mime } from './_deps/mime.mjs';
6
+ import { a as addRoute, f as findAllRoutes, c as createRouter } from './_deps/rou3.mjs';
7
+ import { parseURL, withTrailingSlash, withBase, joinURL, withoutBase } from 'ufo';
8
+ import { z, P } from './_deps/ultrahtml.mjs';
9
+ import { a as relative, r as resolve, j as join, c as resolveAlias, i as isAbsolute, d as dirname } from './_deps/pathe.mjs';
10
+ import './server.mjs';
11
+ import { existsSync, promises } from 'node:fs';
12
+ import { i as parseNodeModulePath, l as lookupNodeModuleSubpath } from './_deps/mlly.mjs';
13
+ import { r as resolveModulePath } from './_deps/exsolve.mjs';
14
+ import { runtimeDir } from 'nitro/runtime/meta';
15
+ import { g as generateTypes, r as resolveSchema } from './_deps/untyped.mjs';
16
+ import { t as toExports } from './_deps/unimport.mjs';
17
+
18
+ async function build(nitro) {
19
+ switch (nitro.options.builder) {
20
+ case "rollup": {
21
+ const { rollupBuild } = await import('../_build/build2.mjs');
22
+ return rollupBuild(nitro);
23
+ }
24
+ case "rolldown": {
25
+ const { rolldownBuild } = await import('../_build/build.mjs');
26
+ return rolldownBuild(nitro);
27
+ }
28
+ case "vite": {
29
+ const { viteBuild } = await import('../_build/vite2.mjs');
30
+ return viteBuild(nitro);
31
+ }
32
+ default: {
33
+ throw new Error(`Unknown builder: ${nitro.options.builder}`);
34
+ }
35
+ }
36
+ }
37
+
38
+ async function runParallel(inputs, cb, opts) {
39
+ const tasks = /* @__PURE__ */ new Set();
40
+ function queueNext() {
41
+ const route = inputs.values().next().value;
42
+ if (!route) {
43
+ return;
44
+ }
45
+ inputs.delete(route);
46
+ const task = (opts.interval ? new Promise((resolve) => setTimeout(resolve, opts.interval)) : Promise.resolve()).then(() => cb(route)).catch((error) => {
47
+ console.error(error);
48
+ });
49
+ tasks.add(task);
50
+ return task.then(() => {
51
+ tasks.delete(task);
52
+ if (inputs.size > 0) {
53
+ return refillQueue();
54
+ }
55
+ });
56
+ }
57
+ function refillQueue() {
58
+ const workers = Math.min(opts.concurrency - tasks.size, inputs.size);
59
+ return Promise.all(Array.from({ length: workers }, () => queueNext()));
60
+ }
61
+ await refillQueue();
62
+ }
63
+
64
+ const allowedExtensions = /* @__PURE__ */ new Set(["", ".json"]);
65
+ const linkParents$1 = /* @__PURE__ */ new Map();
66
+ const HTML_ENTITIES = {
67
+ "&lt;": "<",
68
+ "&gt;": ">",
69
+ "&amp;": "&",
70
+ "&apos;": "'",
71
+ "&quot;": '"'
72
+ };
73
+ function escapeHtml(text) {
74
+ return text.replace(
75
+ /&(lt|gt|amp|apos|quot);/g,
76
+ (ch) => HTML_ENTITIES[ch] || ch
77
+ );
78
+ }
79
+ async function extractLinks(html, from, res, crawlLinks) {
80
+ const links = [];
81
+ const _links = [];
82
+ if (crawlLinks) {
83
+ await z(P(html), (node) => {
84
+ if (!node.attributes?.href) {
85
+ return;
86
+ }
87
+ const link = escapeHtml(node.attributes.href);
88
+ if (!decodeURIComponent(link).startsWith("#") && allowedExtensions.has(getExtension(link))) {
89
+ _links.push(link);
90
+ }
91
+ });
92
+ }
93
+ const header = res.headers.get("x-nitro-prerender") || "";
94
+ _links.push(...header.split(",").map((i) => decodeURIComponent(i.trim())));
95
+ for (const link of _links.filter(Boolean)) {
96
+ const _link = parseURL(link);
97
+ if (_link.protocol || _link.host) {
98
+ continue;
99
+ }
100
+ if (!_link.pathname.startsWith("/")) {
101
+ const fromURL = new URL(from, "http://localhost");
102
+ _link.pathname = new URL(_link.pathname, fromURL).pathname;
103
+ }
104
+ links.push(_link.pathname + _link.search);
105
+ }
106
+ for (const link of links) {
107
+ const _parents = linkParents$1.get(link);
108
+ if (_parents) {
109
+ _parents.add(from);
110
+ } else {
111
+ linkParents$1.set(link, /* @__PURE__ */ new Set([from]));
112
+ }
113
+ }
114
+ return links;
115
+ }
116
+ const EXT_REGEX = /\.[\da-z]+$/;
117
+ function getExtension(link) {
118
+ const pathname = parseURL(link).pathname;
119
+ return (pathname.match(EXT_REGEX) || [])[0] || "";
120
+ }
121
+ function formatPrerenderRoute(route) {
122
+ let str = ` \u251C\u2500 ${route.route} (${route.generateTimeMS}ms)`;
123
+ if (route.error) {
124
+ const parents = linkParents$1.get(route.route);
125
+ const errorColor = colors[route.error.status === 404 ? "yellow" : "red"];
126
+ const errorLead = parents?.size ? "\u251C\u2500\u2500" : "\u2514\u2500\u2500";
127
+ str += `
128
+ \u2502 ${errorLead} ${errorColor(route.error.message)}`;
129
+ if (parents?.size) {
130
+ str += `
131
+ ${[...parents.values()].map((link) => ` \u2502 \u2514\u2500\u2500 Linked from ${link}`).join("\n")}`;
132
+ }
133
+ }
134
+ if (route.skip) {
135
+ str += colors.gray(" (skipped)");
136
+ }
137
+ return colors.gray(str);
138
+ }
139
+ function matchesIgnorePattern(path, pattern) {
140
+ if (typeof pattern === "string") {
141
+ return path.startsWith(pattern);
142
+ }
143
+ if (typeof pattern === "function") {
144
+ return pattern(path) === true;
145
+ }
146
+ if (pattern instanceof RegExp) {
147
+ return pattern.test(path);
148
+ }
149
+ return false;
150
+ }
151
+
152
+ const JsonSigRx = /^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;
153
+ const linkParents = /* @__PURE__ */ new Map();
154
+ async function prerender(nitro) {
155
+ if (nitro.options.noPublicDir) {
156
+ nitro.logger.warn(
157
+ "Skipping prerender since `noPublicDir` option is enabled."
158
+ );
159
+ return;
160
+ }
161
+ if (nitro.options.builder === "vite") {
162
+ nitro.logger.warn(
163
+ "Skipping prerender since not supported with vite builder yet..."
164
+ );
165
+ return;
166
+ }
167
+ const routes = new Set(nitro.options.prerender.routes);
168
+ const prerenderRulePaths = Object.entries(nitro.options.routeRules).filter(([path2, options]) => options.prerender && !path2.includes("*")).map((e) => e[0]);
169
+ for (const route of prerenderRulePaths) {
170
+ routes.add(route);
171
+ }
172
+ await nitro.hooks.callHook("prerender:routes", routes);
173
+ if (routes.size === 0) {
174
+ if (nitro.options.prerender.crawlLinks) {
175
+ routes.add("/");
176
+ } else {
177
+ return;
178
+ }
179
+ }
180
+ nitro.logger.info("Initializing prerenderer");
181
+ nitro._prerenderedRoutes = [];
182
+ nitro._prerenderMeta = nitro._prerenderMeta || {};
183
+ const prerendererConfig = {
184
+ ...nitro.options._config,
185
+ static: false,
186
+ rootDir: nitro.options.rootDir,
187
+ logLevel: 0,
188
+ preset: "nitro-prerender"
189
+ };
190
+ await nitro.hooks.callHook("prerender:config", prerendererConfig);
191
+ const nitroRenderer = await createNitro(prerendererConfig);
192
+ const prerenderStartTime = Date.now();
193
+ await nitro.hooks.callHook("prerender:init", nitroRenderer);
194
+ let path = relative(nitro.options.output.dir, nitro.options.output.publicDir);
195
+ if (!path.startsWith(".")) {
196
+ path = `./${path}`;
197
+ }
198
+ nitroRenderer.options.commands.preview = `npx serve ${path}`;
199
+ nitroRenderer.options.output.dir = nitro.options.output.dir;
200
+ await build(nitroRenderer);
201
+ const serverFilename = typeof nitroRenderer.options.rollupConfig?.output?.entryFileNames === "string" ? nitroRenderer.options.rollupConfig.output.entryFileNames : "index.mjs";
202
+ const serverEntrypoint = resolve(
203
+ nitroRenderer.options.output.serverDir,
204
+ serverFilename
205
+ );
206
+ const { closePrerenderer, appFetch } = await import(pathToFileURL(serverEntrypoint).href);
207
+ const routeRules = createRouter();
208
+ for (const [route, rules] of Object.entries(nitro.options.routeRules)) {
209
+ addRoute(routeRules, void 0, route, rules);
210
+ }
211
+ const _getRouteRules = (path2) => defu(
212
+ {},
213
+ ...findAllRoutes(routeRules, void 0, path2).map((r) => r.data).reverse()
214
+ );
215
+ const generatedRoutes = /* @__PURE__ */ new Set();
216
+ const failedRoutes = /* @__PURE__ */ new Set();
217
+ const skippedRoutes = /* @__PURE__ */ new Set();
218
+ const displayedLengthWarns = /* @__PURE__ */ new Set();
219
+ const publicAssetBases = nitro.options.publicAssets.filter(
220
+ (a) => !!a.baseURL && a.baseURL !== "/" && !a.fallthrough
221
+ ).map((a) => withTrailingSlash(a.baseURL));
222
+ const scannedPublicAssets = nitro.options.prerender.ignoreUnprefixedPublicAssets ? new Set(await scanUnprefixedPublicAssets(nitro)) : /* @__PURE__ */ new Set();
223
+ const canPrerender = (route = "/") => {
224
+ if (generatedRoutes.has(route) || skippedRoutes.has(route)) {
225
+ return false;
226
+ }
227
+ for (const pattern of nitro.options.prerender.ignore) {
228
+ if (matchesIgnorePattern(route, pattern)) {
229
+ return false;
230
+ }
231
+ }
232
+ if (publicAssetBases.some((base) => route.startsWith(base))) {
233
+ return false;
234
+ }
235
+ if (scannedPublicAssets.has(route)) {
236
+ return false;
237
+ }
238
+ if (_getRouteRules(route).prerender === false) {
239
+ return false;
240
+ }
241
+ return true;
242
+ };
243
+ const canWriteToDisk = (route) => {
244
+ if (route.route.includes("?")) {
245
+ return false;
246
+ }
247
+ const FS_MAX_SEGMENT = 255;
248
+ const FS_MAX_PATH = 1024;
249
+ const FS_MAX_PATH_PUBLIC_HTML = FS_MAX_PATH - (nitro.options.output.publicDir.length + 10);
250
+ if ((route.route.length >= FS_MAX_PATH_PUBLIC_HTML || route.route.split("/").some((s) => s.length > FS_MAX_SEGMENT)) && !displayedLengthWarns.has(route)) {
251
+ displayedLengthWarns.add(route);
252
+ const _route = route.route.slice(0, 60) + "...";
253
+ if (route.route.length >= FS_MAX_PATH_PUBLIC_HTML) {
254
+ nitro.logger.warn(
255
+ `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}\`.`
256
+ );
257
+ } else {
258
+ nitro.logger.warn(
259
+ `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.`
260
+ );
261
+ return false;
262
+ }
263
+ }
264
+ return true;
265
+ };
266
+ const generateRoute = async (route) => {
267
+ const start = Date.now();
268
+ route = decodeURI(route);
269
+ if (!canPrerender(route)) {
270
+ skippedRoutes.add(route);
271
+ return;
272
+ }
273
+ generatedRoutes.add(route);
274
+ const _route = { route };
275
+ const encodedRoute = encodeURI(route);
276
+ const res = await appFetch(withBase(encodedRoute, nitro.options.baseURL), {
277
+ headers: [["x-nitro-prerender", encodedRoute]]
278
+ // TODO
279
+ // retry: nitro.options.prerender.retry,
280
+ // retryDelay: nitro.options.prerender.retryDelay,
281
+ });
282
+ let dataBuff = Buffer.from(await res.arrayBuffer());
283
+ Object.defineProperty(_route, "contents", {
284
+ get: () => {
285
+ return dataBuff ? dataBuff.toString("utf8") : void 0;
286
+ },
287
+ set(value) {
288
+ if (dataBuff) {
289
+ dataBuff = Buffer.from(value);
290
+ }
291
+ }
292
+ });
293
+ Object.defineProperty(_route, "data", {
294
+ get: () => {
295
+ return dataBuff ? dataBuff.buffer : void 0;
296
+ },
297
+ set(value) {
298
+ if (dataBuff) {
299
+ dataBuff = Buffer.from(value);
300
+ }
301
+ }
302
+ });
303
+ const redirectCodes = [301, 302, 303, 304, 307, 308];
304
+ if (![200, ...redirectCodes].includes(res.status)) {
305
+ _route.error = new Error(`[${res.status}] ${res.statusText}`);
306
+ _route.error.status = res.status;
307
+ _route.error.statusText = res.statusText;
308
+ }
309
+ _route.generateTimeMS = Date.now() - start;
310
+ const contentType = res.headers.get("content-type") || "";
311
+ const isImplicitHTML = !route.endsWith(".html") && contentType.includes("html") && !JsonSigRx.test(dataBuff.subarray(0, 32).toString("utf8"));
312
+ const routeWithIndex = route.endsWith("/") ? route + "index" : route;
313
+ const htmlPath = route.endsWith("/") || nitro.options.prerender.autoSubfolderIndex ? joinURL(route, "index.html") : route + ".html";
314
+ _route.fileName = withoutBase(
315
+ isImplicitHTML ? htmlPath : routeWithIndex,
316
+ nitro.options.baseURL
317
+ );
318
+ const inferredContentType = mime.getType(_route.fileName) || "text/plain";
319
+ _route.contentType = contentType || inferredContentType;
320
+ await nitro.hooks.callHook("prerender:generate", _route, nitro);
321
+ if (_route.contentType !== inferredContentType) {
322
+ nitro._prerenderMeta[_route.fileName] ||= {};
323
+ nitro._prerenderMeta[_route.fileName].contentType = _route.contentType;
324
+ }
325
+ if (_route.error) {
326
+ failedRoutes.add(_route);
327
+ }
328
+ if (_route.skip || _route.error) {
329
+ await nitro.hooks.callHook("prerender:route", _route);
330
+ nitro.logger.log(formatPrerenderRoute(_route));
331
+ dataBuff = void 0;
332
+ return _route;
333
+ }
334
+ if (canWriteToDisk(_route)) {
335
+ const filePath = join(nitro.options.output.publicDir, _route.fileName);
336
+ await writeFile(filePath, dataBuff);
337
+ nitro._prerenderedRoutes.push(_route);
338
+ } else {
339
+ _route.skip = true;
340
+ }
341
+ if (!_route.error && (isImplicitHTML || route.endsWith(".html"))) {
342
+ const extractedLinks = await extractLinks(
343
+ dataBuff.toString("utf8"),
344
+ route,
345
+ res,
346
+ nitro.options.prerender.crawlLinks
347
+ );
348
+ for (const _link of extractedLinks) {
349
+ if (canPrerender(_link)) {
350
+ routes.add(_link);
351
+ }
352
+ }
353
+ }
354
+ await nitro.hooks.callHook("prerender:route", _route);
355
+ nitro.logger.log(formatPrerenderRoute(_route));
356
+ dataBuff = void 0;
357
+ return _route;
358
+ };
359
+ nitro.logger.info(
360
+ nitro.options.prerender.crawlLinks ? `Prerendering ${routes.size} initial routes with crawler` : `Prerendering ${routes.size} routes`
361
+ );
362
+ await runParallel(routes, generateRoute, {
363
+ concurrency: nitro.options.prerender.concurrency,
364
+ interval: nitro.options.prerender.interval
365
+ });
366
+ await closePrerenderer();
367
+ await nitro.hooks.callHook("prerender:done", {
368
+ prerenderedRoutes: nitro._prerenderedRoutes,
369
+ failedRoutes: [...failedRoutes]
370
+ });
371
+ if (nitro.options.prerender.failOnError && failedRoutes.size > 0) {
372
+ nitro.logger.log("\nErrors prerendering:");
373
+ for (const route of failedRoutes) {
374
+ const parents = linkParents.get(route.route);
375
+ parents?.size ? `
376
+ ${[...parents.values()].map((link) => colors.gray(` \u2502 \u2514\u2500\u2500 Linked from ${link}`)).join("\n")}` : "";
377
+ nitro.logger.log(formatPrerenderRoute(route));
378
+ }
379
+ nitro.logger.log("");
380
+ throw new Error("Exiting due to prerender errors.");
381
+ }
382
+ const prerenderTimeInMs = Date.now() - prerenderStartTime;
383
+ nitro.logger.info(
384
+ `Prerendered ${nitro._prerenderedRoutes.length} routes in ${prerenderTimeInMs / 1e3} seconds`
385
+ );
386
+ if (nitro.options.compressPublicAssets) {
387
+ await compressPublicAssets(nitro);
388
+ }
389
+ }
390
+
391
+ async function writeTypes(nitro) {
392
+ const types = {
393
+ routes: {}
394
+ };
395
+ const typesDir = resolve(nitro.options.buildDir, "types");
396
+ const middleware = [...nitro.scannedHandlers, ...nitro.options.handlers];
397
+ for (const mw of middleware) {
398
+ if (typeof mw.handler !== "string" || !mw.route) {
399
+ continue;
400
+ }
401
+ const relativePath = relative(
402
+ typesDir,
403
+ resolveNitroPath(mw.handler, nitro.options)
404
+ ).replace(/\.(js|mjs|cjs|ts|mts|cts|tsx|jsx)$/, "");
405
+ const method = mw.method || "default";
406
+ types.routes[mw.route] ??= {};
407
+ types.routes[mw.route][method] ??= [];
408
+ types.routes[mw.route][method].push(
409
+ `Simplify<Serialize<Awaited<ReturnType<typeof import('${relativePath}').default>>>>`
410
+ );
411
+ }
412
+ let autoImportedTypes = [];
413
+ let autoImportExports = "";
414
+ if (nitro.unimport) {
415
+ await nitro.unimport.init();
416
+ const allImports = await nitro.unimport.getImports();
417
+ autoImportExports = toExports(allImports).replace(
418
+ /#internal\/nitro/g,
419
+ relative(typesDir, runtimeDir)
420
+ );
421
+ const resolvedImportPathMap = /* @__PURE__ */ new Map();
422
+ for (const i of allImports) {
423
+ const from = i.typeFrom || i.from;
424
+ if (resolvedImportPathMap.has(from)) {
425
+ continue;
426
+ }
427
+ let path = resolveAlias(from, nitro.options.alias);
428
+ if (!isAbsolute(path)) {
429
+ const resolvedPath = resolveModulePath(from, {
430
+ try: true,
431
+ from: nitro.options.nodeModulesDirs,
432
+ conditions: ["type", "node", "import"],
433
+ suffixes: ["", "/index"],
434
+ extensions: [".mjs", ".cjs", ".js", ".mts", ".cts", ".ts"]
435
+ });
436
+ if (resolvedPath) {
437
+ const { dir, name } = parseNodeModulePath(resolvedPath);
438
+ if (!dir || !name) {
439
+ path = resolvedPath;
440
+ } else {
441
+ const subpath = await lookupNodeModuleSubpath(resolvedPath);
442
+ path = join(dir, name, subpath || "");
443
+ }
444
+ }
445
+ }
446
+ if (existsSync(path) && !await isDirectory(path)) {
447
+ path = path.replace(/\.[a-z]+$/, "");
448
+ }
449
+ if (isAbsolute(path)) {
450
+ path = relative(typesDir, path);
451
+ }
452
+ resolvedImportPathMap.set(from, path);
453
+ }
454
+ autoImportedTypes = [
455
+ nitro.options.imports && nitro.options.imports.autoImport !== false ? (await nitro.unimport.generateTypeDeclarations({
456
+ exportHelper: false,
457
+ resolvePath: (i) => {
458
+ const from = i.typeFrom || i.from;
459
+ return resolvedImportPathMap.get(from) ?? from;
460
+ }
461
+ })).trim() : ""
462
+ ];
463
+ }
464
+ const generateRoutes = () => [
465
+ "// Generated by nitro",
466
+ 'import type { Serialize, Simplify } from "nitro/types";',
467
+ 'declare module "nitro/types" {',
468
+ " type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T",
469
+ " interface InternalApi {",
470
+ ...Object.entries(types.routes).map(
471
+ ([path, methods]) => [
472
+ ` '${path}': {`,
473
+ ...Object.entries(methods).map(
474
+ ([method, types2]) => ` '${method}': ${types2.join(" | ")}`
475
+ ),
476
+ " }"
477
+ ].join("\n")
478
+ ),
479
+ " }",
480
+ "}",
481
+ // Makes this a module for augmentation purposes
482
+ "export {}"
483
+ ];
484
+ const config = [
485
+ "// Generated by nitro",
486
+ /* ts */
487
+ `declare module "nitro/types" {`,
488
+ nitro.options.typescript.generateRuntimeConfigTypes ? generateTypes(
489
+ await resolveSchema(
490
+ Object.fromEntries(
491
+ Object.entries(nitro.options.runtimeConfig).filter(
492
+ ([key]) => !["app", "nitro"].includes(key)
493
+ )
494
+ )
495
+ ),
496
+ {
497
+ interfaceName: "NitroRuntimeConfig",
498
+ addExport: false,
499
+ addDefaults: false,
500
+ allowExtraKeys: false,
501
+ indentation: 2
502
+ }
503
+ ) : "",
504
+ `}`,
505
+ // Makes this a module for augmentation purposes
506
+ "export {}"
507
+ ];
508
+ const declarations = [
509
+ // local nitropack augmentations
510
+ '/// <reference path="./nitro-routes.d.ts" />',
511
+ '/// <reference path="./nitro-config.d.ts" />',
512
+ // global server auto-imports
513
+ '/// <reference path="./nitro-imports.d.ts" />'
514
+ ];
515
+ const buildFiles = [];
516
+ buildFiles.push({
517
+ path: join(typesDir, "nitro-routes.d.ts"),
518
+ contents: () => generateRoutes().join("\n")
519
+ });
520
+ buildFiles.push({
521
+ path: join(typesDir, "nitro-config.d.ts"),
522
+ contents: config.join("\n")
523
+ });
524
+ buildFiles.push({
525
+ path: join(typesDir, "nitro-imports.d.ts"),
526
+ contents: [...autoImportedTypes, autoImportExports || "export {}"].join(
527
+ "\n"
528
+ )
529
+ });
530
+ buildFiles.push({
531
+ path: join(typesDir, "nitro.d.ts"),
532
+ contents: declarations.join("\n")
533
+ });
534
+ if (nitro.options.typescript.generateTsConfig) {
535
+ const tsConfigPath = resolve(
536
+ nitro.options.buildDir,
537
+ nitro.options.typescript.tsconfigPath
538
+ );
539
+ const tsconfigDir = dirname(tsConfigPath);
540
+ const tsConfig = defu(nitro.options.typescript.tsConfig, {
541
+ compilerOptions: {
542
+ /* Base options: */
543
+ esModuleInterop: true,
544
+ allowSyntheticDefaultImports: true,
545
+ skipLibCheck: true,
546
+ target: "ESNext",
547
+ allowJs: true,
548
+ resolveJsonModule: true,
549
+ moduleDetection: "force",
550
+ isolatedModules: true,
551
+ verbatimModuleSyntax: true,
552
+ allowImportingTsExtensions: true,
553
+ /* Strictness */
554
+ strict: nitro.options.typescript.strict,
555
+ noUncheckedIndexedAccess: true,
556
+ noImplicitOverride: true,
557
+ forceConsistentCasingInFileNames: true,
558
+ /* If NOT transpiling with TypeScript: */
559
+ module: "Preserve",
560
+ jsx: "preserve",
561
+ jsxFactory: "h",
562
+ jsxFragmentFactory: "Fragment",
563
+ paths: {
564
+ "#imports": [
565
+ relativeWithDot(tsconfigDir, join(typesDir, "nitro-imports"))
566
+ ],
567
+ ...nitro.options.typescript.internalPaths ? {
568
+ "nitro/runtime": [
569
+ relativeWithDot(tsconfigDir, join(runtimeDir, "index"))
570
+ ],
571
+ "#internal/nitro": [
572
+ relativeWithDot(tsconfigDir, join(runtimeDir, "index"))
573
+ ],
574
+ "nitro/runtime/*": [
575
+ relativeWithDot(tsconfigDir, join(runtimeDir, "*"))
576
+ ],
577
+ "#internal/nitro/*": [
578
+ relativeWithDot(tsconfigDir, join(runtimeDir, "*"))
579
+ ]
580
+ } : {}
581
+ }
582
+ },
583
+ include: [
584
+ relativeWithDot(tsconfigDir, join(typesDir, "nitro.d.ts")).replace(
585
+ /^(?=[^.])/,
586
+ "./"
587
+ ),
588
+ join(relativeWithDot(tsconfigDir, nitro.options.rootDir), "**/*"),
589
+ ...nitro.options.srcDir === nitro.options.rootDir ? [] : [join(relativeWithDot(tsconfigDir, nitro.options.srcDir), "**/*")]
590
+ ]
591
+ });
592
+ for (const alias in tsConfig.compilerOptions.paths) {
593
+ const paths = await Promise.all(
594
+ tsConfig.compilerOptions.paths[alias].map(async (path) => {
595
+ if (!isAbsolute(path)) {
596
+ return path;
597
+ }
598
+ const stats = await promises.stat(path).catch(
599
+ () => null
600
+ /* file does not exist */
601
+ );
602
+ return relativeWithDot(
603
+ tsconfigDir,
604
+ stats?.isFile() ? path.replace(/(?<=\w)\.\w+$/g, "") : path
605
+ );
606
+ })
607
+ );
608
+ tsConfig.compilerOptions.paths[alias] = [...new Set(paths)];
609
+ }
610
+ tsConfig.include = [
611
+ ...new Set(
612
+ tsConfig.include.map(
613
+ (p) => isAbsolute(p) ? relativeWithDot(tsconfigDir, p) : p
614
+ )
615
+ )
616
+ ];
617
+ if (tsConfig.exclude) {
618
+ tsConfig.exclude = [
619
+ ...new Set(
620
+ tsConfig.exclude.map(
621
+ (p) => isAbsolute(p) ? relativeWithDot(tsconfigDir, p) : p
622
+ )
623
+ )
624
+ ];
625
+ }
626
+ types.tsConfig = tsConfig;
627
+ buildFiles.push({
628
+ path: tsConfigPath,
629
+ contents: () => JSON.stringify(tsConfig, null, 2)
630
+ });
631
+ }
632
+ await nitro.hooks.callHook("types:extend", types);
633
+ await Promise.all(
634
+ buildFiles.map(async (file) => {
635
+ await writeFile(
636
+ resolve(nitro.options.buildDir, file.path),
637
+ typeof file.contents === "string" ? file.contents : file.contents()
638
+ );
639
+ })
640
+ );
641
+ }
642
+ const RELATIVE_RE = /^\.{1,2}\//;
643
+ function relativeWithDot(from, to) {
644
+ const rel = relative(from, to);
645
+ return RELATIVE_RE.test(rel) ? rel : "./" + rel;
646
+ }
647
+
648
+ export { build as b, prerender as p, runParallel as r, writeTypes as w };