vite-ssg-optimized 0.24.2-optimized.51 → 0.24.2-optimized.53

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.
package/dist/node/cli.cjs CHANGED
@@ -4,7 +4,7 @@ const process = require('node:process');
4
4
  const kolorist = require('kolorist');
5
5
  const yargs = require('yargs');
6
6
  const helpers = require('yargs/helpers');
7
- const node = require('../shared/vite-ssg-optimized.a71b6942.cjs');
7
+ const node = require('../shared/vite-ssg-optimized.e0773de0.cjs');
8
8
  require('node:module');
9
9
  require('node:path');
10
10
  require('@unhead/ssr');
package/dist/node/cli.mjs CHANGED
@@ -2,7 +2,7 @@ import process from 'node:process';
2
2
  import { gray, bold, red, reset, underline } from 'kolorist';
3
3
  import yargs from 'yargs';
4
4
  import { hideBin } from 'yargs/helpers';
5
- import { b as build } from '../shared/vite-ssg-optimized.7dc8356d.mjs';
5
+ import { b as build } from '../shared/vite-ssg-optimized.8d456b79.mjs';
6
6
  import 'node:module';
7
7
  import 'node:path';
8
8
  import '@unhead/ssr';
package/dist/node.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const node = require('./shared/vite-ssg-optimized.a71b6942.cjs');
3
+ const node = require('./shared/vite-ssg-optimized.e0773de0.cjs');
4
4
  require('node:module');
5
5
  require('node:path');
6
6
  require('node:process');
package/dist/node.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { b as build } from './shared/vite-ssg-optimized.7dc8356d.mjs';
1
+ export { b as build } from './shared/vite-ssg-optimized.8d456b79.mjs';
2
2
  import 'node:module';
3
3
  import 'node:path';
4
4
  import 'node:process';
@@ -2,7 +2,7 @@
2
2
 
3
3
  const node_module = require('node:module');
4
4
  const node_worker_threads = require('node:worker_threads');
5
- const node = require('./vite-ssg-optimized.a71b6942.cjs');
5
+ const node = require('./vite-ssg-optimized.e0773de0.cjs');
6
6
  const kolorist = require('kolorist');
7
7
  const vite = require('vite');
8
8
  require('node:path');
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'node:module';
2
2
  import { parentPort, workerData } from 'node:worker_threads';
3
- import { p as plainify, e as executeTaskFn, a as buildClient, c as buildServer } from './vite-ssg-optimized.7dc8356d.mjs';
3
+ import { p as plainify, e as executeTaskFn, a as buildClient, c as buildServer } from './vite-ssg-optimized.8d456b79.mjs';
4
4
  import { red, gray, blue } from 'kolorist';
5
5
  import { resolveConfig } from 'vite';
6
6
  import 'node:path';
@@ -1051,6 +1051,9 @@ class BuildWorkerProxy {
1051
1051
  once(type, listener) {
1052
1052
  this.worker.once(type, listener);
1053
1053
  }
1054
+ unref() {
1055
+ this.worker.unref();
1056
+ }
1054
1057
  async send(type, args) {
1055
1058
  const id = crypto.randomUUID();
1056
1059
  const promise = new Promise((resolve, reject) => {
@@ -1276,7 +1279,15 @@ async function build(ssgOptions = {}, viteConfig = {}) {
1276
1279
  const workerRunCount = /* @__PURE__ */ new WeakMap();
1277
1280
  const MAX_RUNS_PER_WORKER = 100;
1278
1281
  let lastWorkerIndex = workers.length - 1;
1279
- function replaceWorker(workerProxy) {
1282
+ const workerProxyMap = /* @__PURE__ */ new Map();
1283
+ const workerTransitionPromises = [];
1284
+ const pendingTasks = () => {
1285
+ return Array.from(workerProxyMap.keys()).map((worker) => workersInUse.get(worker) || []).flat();
1286
+ };
1287
+ async function replaceWorker(workerProxy) {
1288
+ if (workerProxyMap.has(workerProxy)) {
1289
+ return await workerProxyMap.get(workerProxy);
1290
+ }
1280
1291
  const index = workers.indexOf(workerProxy);
1281
1292
  if (index === -1) {
1282
1293
  return workerProxy;
@@ -1284,26 +1295,57 @@ async function build(ssgOptions = {}, viteConfig = {}) {
1284
1295
  ++lastWorkerIndex;
1285
1296
  config.logger.info(`${blue("[vite-ssg]")} ${yellow(`Replace worker #${workerProxy.id} => #${lastWorkerIndex}`)}`);
1286
1297
  const workerPromises = workersInUse.get(workerProxy) || [];
1287
- const newWorkerProxy = createProxy({
1288
- ...createProxyOptions,
1289
- workerId: lastWorkerIndex
1290
- });
1291
- workers[index] = newWorkerProxy;
1292
- Promise.allSettled([...workerPromises, Promise.resolve()]).then(async () => {
1298
+ const transitionPromise = Promise.allSettled([...workerPromises, Promise.resolve()]).then(async () => {
1299
+ await new Promise((resolve) => setTimeout(resolve, 4));
1293
1300
  await terminateWorker(workerProxy, onFinished);
1301
+ workerTransitionPromises.splice(workerTransitionPromises.indexOf(transitionPromise), 1);
1302
+ workerProxyMap.delete(workerProxy);
1294
1303
  });
1295
- return newWorkerProxy;
1304
+ workerTransitionPromises.push(transitionPromise);
1305
+ workerProxyMap.set(workerProxy, Promise.resolve().then(async () => {
1306
+ while (pendingTasks().length > MAX_RUNS_PER_WORKER / 5) {
1307
+ await new Promise((resolve) => setTimeout(resolve, 300));
1308
+ }
1309
+ while (workerTransitionPromises.length > 2) {
1310
+ console.log(`${gray("[vite-ssg]")} ${yellow(`Waiting for worker transition to finish. ${workerTransitionPromises.length} transitions running`)}`);
1311
+ await Promise.race(workerTransitionPromises);
1312
+ }
1313
+ const newWorkerProxy = createProxy({
1314
+ ...createProxyOptions,
1315
+ workerId: lastWorkerIndex
1316
+ });
1317
+ workers[index] = newWorkerProxy;
1318
+ return newWorkerProxy;
1319
+ }));
1320
+ return await workerProxyMap.get(workerProxy);
1296
1321
  }
1297
1322
  const queue = new PQueue({ concurrency });
1323
+ let shouldBreak = false;
1324
+ const breakHandler = () => {
1325
+ shouldBreak = true;
1326
+ workers.forEach((worker) => worker.unref());
1327
+ };
1328
+ process$1.once("SIGINT", breakHandler);
1329
+ process$1.once("SIGTERM", breakHandler);
1330
+ process$1.once("beforeExit", breakHandler);
1331
+ process$1.once("exit", breakHandler);
1298
1332
  for (const route of routesPaths) {
1333
+ if (shouldBreak) {
1334
+ console.log(`${gray("[vite-ssg]")} ${yellow("Build process interrupted.")}`);
1335
+ break;
1336
+ }
1299
1337
  await queue.onSizeLessThan(concurrency);
1300
1338
  queue.add(async () => {
1339
+ if (shouldBreak) {
1340
+ console.log(`${gray("[vite-ssg]")} ${yellow("Build process interrupted.")}`);
1341
+ return Promise.resolve();
1342
+ }
1301
1343
  let workerProxy = await selectWorker(workerIndex++ % numberOfWorkers);
1302
1344
  const currentCount = (workerRunCount.get(workerProxy) ?? 0) + 1;
1303
1345
  workerRunCount.set(workerProxy, currentCount);
1304
1346
  if (currentCount > MAX_RUNS_PER_WORKER) {
1347
+ workerProxy = await replaceWorker(workerProxy);
1305
1348
  workerRunCount.delete(workerProxy);
1306
- workerProxy = replaceWorker(workerProxy);
1307
1349
  }
1308
1350
  let retryCount = 0;
1309
1351
  const maxRetries = 3;
@@ -1060,6 +1060,9 @@ class BuildWorkerProxy {
1060
1060
  once(type, listener) {
1061
1061
  this.worker.once(type, listener);
1062
1062
  }
1063
+ unref() {
1064
+ this.worker.unref();
1065
+ }
1063
1066
  async send(type, args) {
1064
1067
  const id = crypto.randomUUID();
1065
1068
  const promise = new Promise((resolve, reject) => {
@@ -1132,7 +1135,7 @@ async function buildServer(config, viteConfig, { ssrEntry, ssgOut, format, mock
1132
1135
  }
1133
1136
  function createProxy(options) {
1134
1137
  const workerExt = options.format === "esm" ? ".mjs" : ".cjs";
1135
- const workerProxy = new BuildWorkerProxy(new URL(`./build.worker${workerExt}`, (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/vite-ssg-optimized.a71b6942.cjs', document.baseURI).href))), {
1138
+ const workerProxy = new BuildWorkerProxy(new URL(`./build.worker${workerExt}`, (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/vite-ssg-optimized.e0773de0.cjs', document.baseURI).href))), {
1136
1139
  env: process__default.env,
1137
1140
  workerData: options
1138
1141
  });
@@ -1261,7 +1264,7 @@ async function build(ssgOptions = {}, viteConfig = {}) {
1261
1264
  return worker;
1262
1265
  };
1263
1266
  const serverEntry = prefix + node_path.join(ssgOut, node_path.parse(ssrEntry).name + ext).replace(/\\/g, "/");
1264
- const _require = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/vite-ssg-optimized.a71b6942.cjs', document.baseURI).href)));
1267
+ const _require = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/vite-ssg-optimized.e0773de0.cjs', document.baseURI).href)));
1265
1268
  const { createApp, includedRoutes: serverEntryIncludedRoutes } = format === "esm" ? await import(serverEntry) : _require(serverEntry);
1266
1269
  const includedRoutes = serverEntryIncludedRoutes || configIncludedRoutes;
1267
1270
  const { routes } = await createApp(false);
@@ -1285,7 +1288,15 @@ async function build(ssgOptions = {}, viteConfig = {}) {
1285
1288
  const workerRunCount = /* @__PURE__ */ new WeakMap();
1286
1289
  const MAX_RUNS_PER_WORKER = 100;
1287
1290
  let lastWorkerIndex = workers.length - 1;
1288
- function replaceWorker(workerProxy) {
1291
+ const workerProxyMap = /* @__PURE__ */ new Map();
1292
+ const workerTransitionPromises = [];
1293
+ const pendingTasks = () => {
1294
+ return Array.from(workerProxyMap.keys()).map((worker) => workersInUse.get(worker) || []).flat();
1295
+ };
1296
+ async function replaceWorker(workerProxy) {
1297
+ if (workerProxyMap.has(workerProxy)) {
1298
+ return await workerProxyMap.get(workerProxy);
1299
+ }
1289
1300
  const index = workers.indexOf(workerProxy);
1290
1301
  if (index === -1) {
1291
1302
  return workerProxy;
@@ -1293,26 +1304,57 @@ async function build(ssgOptions = {}, viteConfig = {}) {
1293
1304
  ++lastWorkerIndex;
1294
1305
  config.logger.info(`${kolorist.blue("[vite-ssg]")} ${kolorist.yellow(`Replace worker #${workerProxy.id} => #${lastWorkerIndex}`)}`);
1295
1306
  const workerPromises = workersInUse.get(workerProxy) || [];
1296
- const newWorkerProxy = createProxy({
1297
- ...createProxyOptions,
1298
- workerId: lastWorkerIndex
1299
- });
1300
- workers[index] = newWorkerProxy;
1301
- Promise.allSettled([...workerPromises, Promise.resolve()]).then(async () => {
1307
+ const transitionPromise = Promise.allSettled([...workerPromises, Promise.resolve()]).then(async () => {
1308
+ await new Promise((resolve) => setTimeout(resolve, 4));
1302
1309
  await terminateWorker(workerProxy, onFinished);
1310
+ workerTransitionPromises.splice(workerTransitionPromises.indexOf(transitionPromise), 1);
1311
+ workerProxyMap.delete(workerProxy);
1303
1312
  });
1304
- return newWorkerProxy;
1313
+ workerTransitionPromises.push(transitionPromise);
1314
+ workerProxyMap.set(workerProxy, Promise.resolve().then(async () => {
1315
+ while (pendingTasks().length > MAX_RUNS_PER_WORKER / 5) {
1316
+ await new Promise((resolve) => setTimeout(resolve, 300));
1317
+ }
1318
+ while (workerTransitionPromises.length > 2) {
1319
+ console.log(`${kolorist.gray("[vite-ssg]")} ${kolorist.yellow(`Waiting for worker transition to finish. ${workerTransitionPromises.length} transitions running`)}`);
1320
+ await Promise.race(workerTransitionPromises);
1321
+ }
1322
+ const newWorkerProxy = createProxy({
1323
+ ...createProxyOptions,
1324
+ workerId: lastWorkerIndex
1325
+ });
1326
+ workers[index] = newWorkerProxy;
1327
+ return newWorkerProxy;
1328
+ }));
1329
+ return await workerProxyMap.get(workerProxy);
1305
1330
  }
1306
1331
  const queue = new PQueue({ concurrency });
1332
+ let shouldBreak = false;
1333
+ const breakHandler = () => {
1334
+ shouldBreak = true;
1335
+ workers.forEach((worker) => worker.unref());
1336
+ };
1337
+ process__default.once("SIGINT", breakHandler);
1338
+ process__default.once("SIGTERM", breakHandler);
1339
+ process__default.once("beforeExit", breakHandler);
1340
+ process__default.once("exit", breakHandler);
1307
1341
  for (const route of routesPaths) {
1342
+ if (shouldBreak) {
1343
+ console.log(`${kolorist.gray("[vite-ssg]")} ${kolorist.yellow("Build process interrupted.")}`);
1344
+ break;
1345
+ }
1308
1346
  await queue.onSizeLessThan(concurrency);
1309
1347
  queue.add(async () => {
1348
+ if (shouldBreak) {
1349
+ console.log(`${kolorist.gray("[vite-ssg]")} ${kolorist.yellow("Build process interrupted.")}`);
1350
+ return Promise.resolve();
1351
+ }
1310
1352
  let workerProxy = await selectWorker(workerIndex++ % numberOfWorkers);
1311
1353
  const currentCount = (workerRunCount.get(workerProxy) ?? 0) + 1;
1312
1354
  workerRunCount.set(workerProxy, currentCount);
1313
1355
  if (currentCount > MAX_RUNS_PER_WORKER) {
1356
+ workerProxy = await replaceWorker(workerProxy);
1314
1357
  workerRunCount.delete(workerProxy);
1315
- workerProxy = replaceWorker(workerProxy);
1316
1358
  }
1317
1359
  let retryCount = 0;
1318
1360
  const maxRetries = 3;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-ssg-optimized",
3
- "version": "0.24.2-optimized.51",
3
+ "version": "0.24.2-optimized.53",
4
4
  "description": "Server-side generation for Vite",
5
5
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",