nitropack-nightly 2.13.0-20260107-111908-1e9a7f50 → 2.13.0-20260107-191535-f0969025

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.
@@ -0,0 +1,30 @@
1
+ async function runParallel(inputs, cb, opts) {
2
+ const errors = [];
3
+ const tasks = /* @__PURE__ */ new Set();
4
+ function queueNext() {
5
+ const route = inputs.values().next().value;
6
+ if (!route) {
7
+ return;
8
+ }
9
+ inputs.delete(route);
10
+ const task = (opts.interval ? new Promise((resolve) => setTimeout(resolve, opts.interval)) : Promise.resolve()).then(() => cb(route)).catch((error) => {
11
+ console.error(error);
12
+ errors.push(error);
13
+ });
14
+ tasks.add(task);
15
+ return task.then(() => {
16
+ tasks.delete(task);
17
+ if (inputs.size > 0) {
18
+ return refillQueue();
19
+ }
20
+ });
21
+ }
22
+ function refillQueue() {
23
+ const workers = Math.min(opts.concurrency - tasks.size, inputs.size);
24
+ return Promise.all(Array.from({ length: workers }, () => queueNext()));
25
+ }
26
+ await refillQueue();
27
+ return { errors };
28
+ }
29
+
30
+ export { runParallel as r };
@@ -39,6 +39,7 @@ import { generateTypes, resolveSchema } from 'untyped';
39
39
  import { version } from 'nitropack/meta';
40
40
  import { gzipSize } from 'gzip-size';
41
41
  import prettyBytes from 'pretty-bytes';
42
+ import { r as runParallel } from '../_chunks/parallel.mjs';
42
43
  import { getProperty } from 'dot-prop';
43
44
  import zlib from 'node:zlib';
44
45
  import { walk, parse } from 'ultrahtml';
@@ -1521,32 +1522,6 @@ function startRollupWatcher(nitro, rollupConfig) {
1521
1522
 
1522
1523
  const presetsWithConfig = ["awsAmplify", "awsLambda", "azure", "cloudflare", "firebase", "netlify", "vercel"];
1523
1524
 
1524
- async function runParallel(inputs, cb, opts) {
1525
- const tasks = /* @__PURE__ */ new Set();
1526
- function queueNext() {
1527
- const route = inputs.values().next().value;
1528
- if (!route) {
1529
- return;
1530
- }
1531
- inputs.delete(route);
1532
- const task = (opts.interval ? new Promise((resolve) => setTimeout(resolve, opts.interval)) : Promise.resolve()).then(() => cb(route)).catch((error) => {
1533
- console.error(error);
1534
- });
1535
- tasks.add(task);
1536
- return task.then(() => {
1537
- tasks.delete(task);
1538
- if (inputs.size > 0) {
1539
- return refillQueue();
1540
- }
1541
- });
1542
- }
1543
- function refillQueue() {
1544
- const workers = Math.min(opts.concurrency - tasks.size, inputs.size);
1545
- return Promise.all(Array.from({ length: workers }, () => queueNext()));
1546
- }
1547
- await refillQueue();
1548
- }
1549
-
1550
1525
  async function generateFSTree(dir, options = {}) {
1551
1526
  if (isTest) {
1552
1527
  return;
@@ -2822,6 +2797,9 @@ class DevServer {
2822
2797
  app.use(handler.route || "/", handler.handler);
2823
2798
  }
2824
2799
  app.use("/_vfs", createVFSHandler(this.nitro));
2800
+ const routeRulesMatcher = toRouteMatcher(
2801
+ createRouter({ routes: this.nitro.options.routeRules })
2802
+ );
2825
2803
  for (const asset of this.nitro.options.publicAssets) {
2826
2804
  const url = joinURL(
2827
2805
  this.nitro.options.runtimeConfig.app.baseURL,
@@ -2836,6 +2814,19 @@ class DevServer {
2836
2814
  if (path.endsWith(".gz")) {
2837
2815
  res.setHeader("Content-Encoding", "gzip");
2838
2816
  }
2817
+ const pathname = res.req?._parsedOriginalUrl?.pathname;
2818
+ if (pathname) {
2819
+ const rules = defu$1(
2820
+ {},
2821
+ ...routeRulesMatcher.matchAll(pathname).reverse()
2822
+ );
2823
+ if (rules.headers) {
2824
+ for (const [k, v] of Object.entries(rules.headers)) {
2825
+ if (k === "cache-control") continue;
2826
+ res.appendHeader(k, v);
2827
+ }
2828
+ }
2829
+ }
2839
2830
  }
2840
2831
  })
2841
2832
  )
@@ -1,4 +1,4 @@
1
- const version = "2.13.0-20260107-111908-1e9a7f50";
1
+ const version = "2.13.0-20260107-191535-f0969025";
2
2
 
3
3
  const compatibilityChanges = [
4
4
  {
@@ -34,6 +34,7 @@ import { readFile } from 'node:fs/promises';
34
34
  import createEtag from 'etag';
35
35
  import mime from 'mime';
36
36
  import { withTrailingSlash } from 'ufo';
37
+ import { r as runParallel } from '../_chunks/parallel.mjs';
37
38
  import _replace from '@rollup/plugin-replace';
38
39
  import { normalizeKey, builtinDrivers } from 'unstorage';
39
40
 
@@ -1233,31 +1234,43 @@ function publicAssets(nitro) {
1233
1234
  absolute: false,
1234
1235
  dot: true
1235
1236
  });
1236
- for (const id of files) {
1237
- let mimeType = mime.getType(id.replace(/\.(gz|br)$/, "")) || "text/plain";
1238
- if (mimeType.startsWith("text")) {
1239
- mimeType += "; charset=utf-8";
1240
- }
1241
- const fullPath = resolve(nitro.options.output.publicDir, id);
1242
- const assetData = await promises.readFile(fullPath);
1243
- const etag = createEtag(assetData);
1244
- const stat = await promises.stat(fullPath);
1245
- const assetId = "/" + decodeURIComponent(id);
1246
- let encoding;
1247
- if (id.endsWith(".gz")) {
1248
- encoding = "gzip";
1249
- } else if (id.endsWith(".br")) {
1250
- encoding = "br";
1251
- }
1252
- assets[assetId] = {
1253
- type: nitro._prerenderMeta?.[assetId]?.contentType || mimeType,
1254
- encoding,
1255
- etag,
1256
- mtime: stat.mtime.toJSON(),
1257
- size: stat.size,
1258
- path: relative(nitro.options.output.serverDir, fullPath),
1259
- data: nitro.options.serveStatic === "inline" ? assetData.toString("base64") : void 0
1260
- };
1237
+ const { errors } = await runParallel(
1238
+ new Set(files),
1239
+ async (id) => {
1240
+ let mimeType = mime.getType(id.replace(/\.(gz|br)$/, "")) || "text/plain";
1241
+ if (mimeType.startsWith("text")) {
1242
+ mimeType += "; charset=utf-8";
1243
+ }
1244
+ const fullPath = resolve(nitro.options.output.publicDir, id);
1245
+ const [assetData, stat] = await Promise.all([
1246
+ promises.readFile(fullPath),
1247
+ promises.stat(fullPath)
1248
+ ]);
1249
+ const etag = createEtag(assetData);
1250
+ const assetId = "/" + decodeURIComponent(id);
1251
+ let encoding;
1252
+ if (id.endsWith(".gz")) {
1253
+ encoding = "gzip";
1254
+ } else if (id.endsWith(".br")) {
1255
+ encoding = "br";
1256
+ }
1257
+ assets[assetId] = {
1258
+ type: nitro._prerenderMeta?.[assetId]?.contentType || mimeType,
1259
+ encoding,
1260
+ etag,
1261
+ mtime: stat.mtime.toJSON(),
1262
+ size: stat.size,
1263
+ path: relative(nitro.options.output.serverDir, fullPath),
1264
+ data: nitro.options.serveStatic === "inline" ? assetData.toString("base64") : void 0
1265
+ };
1266
+ },
1267
+ { concurrency: 25 }
1268
+ );
1269
+ if (errors.length > 0) {
1270
+ throw new Error(
1271
+ `Failed to process some public assets:
1272
+ - ${errors.map((e) => e instanceof Error ? e.message : String(e)).join("\n- ")}`
1273
+ );
1261
1274
  }
1262
1275
  for (const key in assets) {
1263
1276
  if (/\.(gz|br)$/.test(key)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nitropack-nightly",
3
- "version": "2.13.0-20260107-111908-1e9a7f50",
3
+ "version": "2.13.0-20260107-191535-f0969025",
4
4
  "description": "Build and Deploy Universal JavaScript Servers",
5
5
  "repository": "nitrojs/nitro",
6
6
  "license": "MIT",