vite-react-ssg 0.3.3 → 0.4.0

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.
@@ -1,1541 +0,0 @@
1
- 'use strict';
2
-
3
- const node_path = require('node:path');
4
- const node_module = require('node:module');
5
- const kolorist = require('kolorist');
6
- const fs = require('fs-extra');
7
- const vite = require('vite');
8
- const JSDOM = require('jsdom');
9
- const SiteMetadataDefaults = require('./vite-react-ssg.4ca822c0.cjs');
10
- const express = require('express');
11
- const node_fs = require('node:fs');
12
- const React = require('react');
13
- const reactHelmetAsync = require('react-helmet-async');
14
- const server_js = require('react-router-dom/server.js');
15
- const node_stream = require('node:stream');
16
- const server = require('react-dom/server');
17
-
18
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
19
-
20
- const fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
21
- const express__default = /*#__PURE__*/_interopDefaultCompat(express);
22
- const React__default = /*#__PURE__*/_interopDefaultCompat(React);
23
-
24
- function getDefaultExportFromCjs (x) {
25
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
26
- }
27
-
28
- var eventemitter3 = {exports: {}};
29
-
30
- (function (module) {
31
-
32
- var has = Object.prototype.hasOwnProperty
33
- , prefix = '~';
34
-
35
- /**
36
- * Constructor to create a storage for our `EE` objects.
37
- * An `Events` instance is a plain object whose properties are event names.
38
- *
39
- * @constructor
40
- * @private
41
- */
42
- function Events() {}
43
-
44
- //
45
- // We try to not inherit from `Object.prototype`. In some engines creating an
46
- // instance in this way is faster than calling `Object.create(null)` directly.
47
- // If `Object.create(null)` is not supported we prefix the event names with a
48
- // character to make sure that the built-in object properties are not
49
- // overridden or used as an attack vector.
50
- //
51
- if (Object.create) {
52
- Events.prototype = Object.create(null);
53
-
54
- //
55
- // This hack is needed because the `__proto__` property is still inherited in
56
- // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
57
- //
58
- if (!new Events().__proto__) prefix = false;
59
- }
60
-
61
- /**
62
- * Representation of a single event listener.
63
- *
64
- * @param {Function} fn The listener function.
65
- * @param {*} context The context to invoke the listener with.
66
- * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
67
- * @constructor
68
- * @private
69
- */
70
- function EE(fn, context, once) {
71
- this.fn = fn;
72
- this.context = context;
73
- this.once = once || false;
74
- }
75
-
76
- /**
77
- * Add a listener for a given event.
78
- *
79
- * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
80
- * @param {(String|Symbol)} event The event name.
81
- * @param {Function} fn The listener function.
82
- * @param {*} context The context to invoke the listener with.
83
- * @param {Boolean} once Specify if the listener is a one-time listener.
84
- * @returns {EventEmitter}
85
- * @private
86
- */
87
- function addListener(emitter, event, fn, context, once) {
88
- if (typeof fn !== 'function') {
89
- throw new TypeError('The listener must be a function');
90
- }
91
-
92
- var listener = new EE(fn, context || emitter, once)
93
- , evt = prefix ? prefix + event : event;
94
-
95
- if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
96
- else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
97
- else emitter._events[evt] = [emitter._events[evt], listener];
98
-
99
- return emitter;
100
- }
101
-
102
- /**
103
- * Clear event by name.
104
- *
105
- * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
106
- * @param {(String|Symbol)} evt The Event name.
107
- * @private
108
- */
109
- function clearEvent(emitter, evt) {
110
- if (--emitter._eventsCount === 0) emitter._events = new Events();
111
- else delete emitter._events[evt];
112
- }
113
-
114
- /**
115
- * Minimal `EventEmitter` interface that is molded against the Node.js
116
- * `EventEmitter` interface.
117
- *
118
- * @constructor
119
- * @public
120
- */
121
- function EventEmitter() {
122
- this._events = new Events();
123
- this._eventsCount = 0;
124
- }
125
-
126
- /**
127
- * Return an array listing the events for which the emitter has registered
128
- * listeners.
129
- *
130
- * @returns {Array}
131
- * @public
132
- */
133
- EventEmitter.prototype.eventNames = function eventNames() {
134
- var names = []
135
- , events
136
- , name;
137
-
138
- if (this._eventsCount === 0) return names;
139
-
140
- for (name in (events = this._events)) {
141
- if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
142
- }
143
-
144
- if (Object.getOwnPropertySymbols) {
145
- return names.concat(Object.getOwnPropertySymbols(events));
146
- }
147
-
148
- return names;
149
- };
150
-
151
- /**
152
- * Return the listeners registered for a given event.
153
- *
154
- * @param {(String|Symbol)} event The event name.
155
- * @returns {Array} The registered listeners.
156
- * @public
157
- */
158
- EventEmitter.prototype.listeners = function listeners(event) {
159
- var evt = prefix ? prefix + event : event
160
- , handlers = this._events[evt];
161
-
162
- if (!handlers) return [];
163
- if (handlers.fn) return [handlers.fn];
164
-
165
- for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
166
- ee[i] = handlers[i].fn;
167
- }
168
-
169
- return ee;
170
- };
171
-
172
- /**
173
- * Return the number of listeners listening to a given event.
174
- *
175
- * @param {(String|Symbol)} event The event name.
176
- * @returns {Number} The number of listeners.
177
- * @public
178
- */
179
- EventEmitter.prototype.listenerCount = function listenerCount(event) {
180
- var evt = prefix ? prefix + event : event
181
- , listeners = this._events[evt];
182
-
183
- if (!listeners) return 0;
184
- if (listeners.fn) return 1;
185
- return listeners.length;
186
- };
187
-
188
- /**
189
- * Calls each of the listeners registered for a given event.
190
- *
191
- * @param {(String|Symbol)} event The event name.
192
- * @returns {Boolean} `true` if the event had listeners, else `false`.
193
- * @public
194
- */
195
- EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
196
- var evt = prefix ? prefix + event : event;
197
-
198
- if (!this._events[evt]) return false;
199
-
200
- var listeners = this._events[evt]
201
- , len = arguments.length
202
- , args
203
- , i;
204
-
205
- if (listeners.fn) {
206
- if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
207
-
208
- switch (len) {
209
- case 1: return listeners.fn.call(listeners.context), true;
210
- case 2: return listeners.fn.call(listeners.context, a1), true;
211
- case 3: return listeners.fn.call(listeners.context, a1, a2), true;
212
- case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
213
- case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
214
- case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
215
- }
216
-
217
- for (i = 1, args = new Array(len -1); i < len; i++) {
218
- args[i - 1] = arguments[i];
219
- }
220
-
221
- listeners.fn.apply(listeners.context, args);
222
- } else {
223
- var length = listeners.length
224
- , j;
225
-
226
- for (i = 0; i < length; i++) {
227
- if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
228
-
229
- switch (len) {
230
- case 1: listeners[i].fn.call(listeners[i].context); break;
231
- case 2: listeners[i].fn.call(listeners[i].context, a1); break;
232
- case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
233
- case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
234
- default:
235
- if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
236
- args[j - 1] = arguments[j];
237
- }
238
-
239
- listeners[i].fn.apply(listeners[i].context, args);
240
- }
241
- }
242
- }
243
-
244
- return true;
245
- };
246
-
247
- /**
248
- * Add a listener for a given event.
249
- *
250
- * @param {(String|Symbol)} event The event name.
251
- * @param {Function} fn The listener function.
252
- * @param {*} [context=this] The context to invoke the listener with.
253
- * @returns {EventEmitter} `this`.
254
- * @public
255
- */
256
- EventEmitter.prototype.on = function on(event, fn, context) {
257
- return addListener(this, event, fn, context, false);
258
- };
259
-
260
- /**
261
- * Add a one-time listener for a given event.
262
- *
263
- * @param {(String|Symbol)} event The event name.
264
- * @param {Function} fn The listener function.
265
- * @param {*} [context=this] The context to invoke the listener with.
266
- * @returns {EventEmitter} `this`.
267
- * @public
268
- */
269
- EventEmitter.prototype.once = function once(event, fn, context) {
270
- return addListener(this, event, fn, context, true);
271
- };
272
-
273
- /**
274
- * Remove the listeners of a given event.
275
- *
276
- * @param {(String|Symbol)} event The event name.
277
- * @param {Function} fn Only remove the listeners that match this function.
278
- * @param {*} context Only remove the listeners that have this context.
279
- * @param {Boolean} once Only remove one-time listeners.
280
- * @returns {EventEmitter} `this`.
281
- * @public
282
- */
283
- EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
284
- var evt = prefix ? prefix + event : event;
285
-
286
- if (!this._events[evt]) return this;
287
- if (!fn) {
288
- clearEvent(this, evt);
289
- return this;
290
- }
291
-
292
- var listeners = this._events[evt];
293
-
294
- if (listeners.fn) {
295
- if (
296
- listeners.fn === fn &&
297
- (!once || listeners.once) &&
298
- (!context || listeners.context === context)
299
- ) {
300
- clearEvent(this, evt);
301
- }
302
- } else {
303
- for (var i = 0, events = [], length = listeners.length; i < length; i++) {
304
- if (
305
- listeners[i].fn !== fn ||
306
- (once && !listeners[i].once) ||
307
- (context && listeners[i].context !== context)
308
- ) {
309
- events.push(listeners[i]);
310
- }
311
- }
312
-
313
- //
314
- // Reset the array, or remove it completely if we have no more listeners.
315
- //
316
- if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
317
- else clearEvent(this, evt);
318
- }
319
-
320
- return this;
321
- };
322
-
323
- /**
324
- * Remove all listeners, or those of the specified event.
325
- *
326
- * @param {(String|Symbol)} [event] The event name.
327
- * @returns {EventEmitter} `this`.
328
- * @public
329
- */
330
- EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
331
- var evt;
332
-
333
- if (event) {
334
- evt = prefix ? prefix + event : event;
335
- if (this._events[evt]) clearEvent(this, evt);
336
- } else {
337
- this._events = new Events();
338
- this._eventsCount = 0;
339
- }
340
-
341
- return this;
342
- };
343
-
344
- //
345
- // Alias methods names because people roll like that.
346
- //
347
- EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
348
- EventEmitter.prototype.addListener = EventEmitter.prototype.on;
349
-
350
- //
351
- // Expose the prefix.
352
- //
353
- EventEmitter.prefixed = prefix;
354
-
355
- //
356
- // Allow `EventEmitter` to be imported as module namespace.
357
- //
358
- EventEmitter.EventEmitter = EventEmitter;
359
-
360
- //
361
- // Expose the module.
362
- //
363
- {
364
- module.exports = EventEmitter;
365
- }
366
- } (eventemitter3));
367
-
368
- var eventemitter3Exports = eventemitter3.exports;
369
- const EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
370
-
371
- class TimeoutError extends Error {
372
- constructor(message) {
373
- super(message);
374
- this.name = 'TimeoutError';
375
- }
376
- }
377
-
378
- /**
379
- An error to be thrown when the request is aborted by AbortController.
380
- DOMException is thrown instead of this Error when DOMException is available.
381
- */
382
- let AbortError$1 = class AbortError extends Error {
383
- constructor(message) {
384
- super();
385
- this.name = 'AbortError';
386
- this.message = message;
387
- }
388
- };
389
-
390
- /**
391
- TODO: Remove AbortError and just throw DOMException when targeting Node 18.
392
- */
393
- const getDOMException = errorMessage => globalThis.DOMException === undefined ?
394
- new AbortError$1(errorMessage) :
395
- new DOMException(errorMessage);
396
-
397
- /**
398
- TODO: Remove below function and just 'reject(signal.reason)' when targeting Node 18.
399
- */
400
- const getAbortedReason = signal => {
401
- const reason = signal.reason === undefined ?
402
- getDOMException('This operation was aborted.') :
403
- signal.reason;
404
-
405
- return reason instanceof Error ? reason : getDOMException(reason);
406
- };
407
-
408
- function pTimeout(promise, milliseconds, fallback, options) {
409
- let timer;
410
-
411
- const cancelablePromise = new Promise((resolve, reject) => {
412
- if (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {
413
- throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${milliseconds}\``);
414
- }
415
-
416
- if (milliseconds === Number.POSITIVE_INFINITY) {
417
- resolve(promise);
418
- return;
419
- }
420
-
421
- options = {
422
- customTimers: {setTimeout, clearTimeout},
423
- ...options
424
- };
425
-
426
- if (options.signal) {
427
- const {signal} = options;
428
- if (signal.aborted) {
429
- reject(getAbortedReason(signal));
430
- }
431
-
432
- signal.addEventListener('abort', () => {
433
- reject(getAbortedReason(signal));
434
- });
435
- }
436
-
437
- timer = options.customTimers.setTimeout.call(undefined, () => {
438
- if (typeof fallback === 'function') {
439
- try {
440
- resolve(fallback());
441
- } catch (error) {
442
- reject(error);
443
- }
444
-
445
- return;
446
- }
447
-
448
- const message = typeof fallback === 'string' ? fallback : `Promise timed out after ${milliseconds} milliseconds`;
449
- const timeoutError = fallback instanceof Error ? fallback : new TimeoutError(message);
450
-
451
- if (typeof promise.cancel === 'function') {
452
- promise.cancel();
453
- }
454
-
455
- reject(timeoutError);
456
- }, milliseconds);
457
-
458
- (async () => {
459
- try {
460
- resolve(await promise);
461
- } catch (error) {
462
- reject(error);
463
- } finally {
464
- options.customTimers.clearTimeout.call(undefined, timer);
465
- }
466
- })();
467
- });
468
-
469
- cancelablePromise.clear = () => {
470
- clearTimeout(timer);
471
- timer = undefined;
472
- };
473
-
474
- return cancelablePromise;
475
- }
476
-
477
- // Port of lower_bound from https://en.cppreference.com/w/cpp/algorithm/lower_bound
478
- // Used to compute insertion index to keep queue sorted after insertion
479
- function lowerBound(array, value, comparator) {
480
- let first = 0;
481
- let count = array.length;
482
- while (count > 0) {
483
- const step = Math.trunc(count / 2);
484
- let it = first + step;
485
- if (comparator(array[it], value) <= 0) {
486
- first = ++it;
487
- count -= step + 1;
488
- }
489
- else {
490
- count = step;
491
- }
492
- }
493
- return first;
494
- }
495
-
496
- var __classPrivateFieldGet$1 = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) {
497
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
498
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
499
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
500
- };
501
- var _PriorityQueue_queue;
502
- class PriorityQueue {
503
- constructor() {
504
- _PriorityQueue_queue.set(this, []);
505
- }
506
- enqueue(run, options) {
507
- options = {
508
- priority: 0,
509
- ...options,
510
- };
511
- const element = {
512
- priority: options.priority,
513
- run,
514
- };
515
- if (this.size && __classPrivateFieldGet$1(this, _PriorityQueue_queue, "f")[this.size - 1].priority >= options.priority) {
516
- __classPrivateFieldGet$1(this, _PriorityQueue_queue, "f").push(element);
517
- return;
518
- }
519
- const index = lowerBound(__classPrivateFieldGet$1(this, _PriorityQueue_queue, "f"), element, (a, b) => b.priority - a.priority);
520
- __classPrivateFieldGet$1(this, _PriorityQueue_queue, "f").splice(index, 0, element);
521
- }
522
- dequeue() {
523
- const item = __classPrivateFieldGet$1(this, _PriorityQueue_queue, "f").shift();
524
- return item === null || item === void 0 ? void 0 : item.run;
525
- }
526
- filter(options) {
527
- return __classPrivateFieldGet$1(this, _PriorityQueue_queue, "f").filter((element) => element.priority === options.priority).map((element) => element.run);
528
- }
529
- get size() {
530
- return __classPrivateFieldGet$1(this, _PriorityQueue_queue, "f").length;
531
- }
532
- }
533
- _PriorityQueue_queue = new WeakMap();
534
-
535
- var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
536
- if (kind === "m") throw new TypeError("Private method is not writable");
537
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
538
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
539
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
540
- };
541
- var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) {
542
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
543
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
544
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
545
- };
546
- var _PQueue_instances, _PQueue_carryoverConcurrencyCount, _PQueue_isIntervalIgnored, _PQueue_intervalCount, _PQueue_intervalCap, _PQueue_interval, _PQueue_intervalEnd, _PQueue_intervalId, _PQueue_timeoutId, _PQueue_queue, _PQueue_queueClass, _PQueue_pending, _PQueue_concurrency, _PQueue_isPaused, _PQueue_throwOnTimeout, _PQueue_doesIntervalAllowAnother_get, _PQueue_doesConcurrentAllowAnother_get, _PQueue_next, _PQueue_onResumeInterval, _PQueue_isIntervalPaused_get, _PQueue_tryToStartAnother, _PQueue_initializeIntervalIfNeeded, _PQueue_onInterval, _PQueue_processQueue, _PQueue_throwOnAbort, _PQueue_onEvent;
547
- /**
548
- The error thrown by `queue.add()` when a job is aborted before it is run. See `signal`.
549
- */
550
- class AbortError extends Error {
551
- }
552
- /**
553
- Promise queue with concurrency control.
554
- */
555
- class PQueue extends EventEmitter {
556
- // TODO: The `throwOnTimeout` option should affect the return types of `add()` and `addAll()`
557
- constructor(options) {
558
- var _a, _b, _c, _d;
559
- super();
560
- _PQueue_instances.add(this);
561
- _PQueue_carryoverConcurrencyCount.set(this, void 0);
562
- _PQueue_isIntervalIgnored.set(this, void 0);
563
- _PQueue_intervalCount.set(this, 0);
564
- _PQueue_intervalCap.set(this, void 0);
565
- _PQueue_interval.set(this, void 0);
566
- _PQueue_intervalEnd.set(this, 0);
567
- _PQueue_intervalId.set(this, void 0);
568
- _PQueue_timeoutId.set(this, void 0);
569
- _PQueue_queue.set(this, void 0);
570
- _PQueue_queueClass.set(this, void 0);
571
- _PQueue_pending.set(this, 0);
572
- // The `!` is needed because of https://github.com/microsoft/TypeScript/issues/32194
573
- _PQueue_concurrency.set(this, void 0);
574
- _PQueue_isPaused.set(this, void 0);
575
- _PQueue_throwOnTimeout.set(this, void 0);
576
- /**
577
- Per-operation timeout in milliseconds. Operations fulfill once `timeout` elapses if they haven't already.
578
-
579
- Applies to each future operation.
580
- */
581
- Object.defineProperty(this, "timeout", {
582
- enumerable: true,
583
- configurable: true,
584
- writable: true,
585
- value: void 0
586
- });
587
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
588
- options = {
589
- carryoverConcurrencyCount: false,
590
- intervalCap: Number.POSITIVE_INFINITY,
591
- interval: 0,
592
- concurrency: Number.POSITIVE_INFINITY,
593
- autoStart: true,
594
- queueClass: PriorityQueue,
595
- ...options,
596
- };
597
- if (!(typeof options.intervalCap === 'number' && options.intervalCap >= 1)) {
598
- throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(_b = (_a = options.intervalCap) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : ''}\` (${typeof options.intervalCap})`);
599
- }
600
- if (options.interval === undefined || !(Number.isFinite(options.interval) && options.interval >= 0)) {
601
- throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(_d = (_c = options.interval) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : ''}\` (${typeof options.interval})`);
602
- }
603
- __classPrivateFieldSet(this, _PQueue_carryoverConcurrencyCount, options.carryoverConcurrencyCount, "f");
604
- __classPrivateFieldSet(this, _PQueue_isIntervalIgnored, options.intervalCap === Number.POSITIVE_INFINITY || options.interval === 0, "f");
605
- __classPrivateFieldSet(this, _PQueue_intervalCap, options.intervalCap, "f");
606
- __classPrivateFieldSet(this, _PQueue_interval, options.interval, "f");
607
- __classPrivateFieldSet(this, _PQueue_queue, new options.queueClass(), "f");
608
- __classPrivateFieldSet(this, _PQueue_queueClass, options.queueClass, "f");
609
- this.concurrency = options.concurrency;
610
- this.timeout = options.timeout;
611
- __classPrivateFieldSet(this, _PQueue_throwOnTimeout, options.throwOnTimeout === true, "f");
612
- __classPrivateFieldSet(this, _PQueue_isPaused, options.autoStart === false, "f");
613
- }
614
- get concurrency() {
615
- return __classPrivateFieldGet(this, _PQueue_concurrency, "f");
616
- }
617
- set concurrency(newConcurrency) {
618
- if (!(typeof newConcurrency === 'number' && newConcurrency >= 1)) {
619
- throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${newConcurrency}\` (${typeof newConcurrency})`);
620
- }
621
- __classPrivateFieldSet(this, _PQueue_concurrency, newConcurrency, "f");
622
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_processQueue).call(this);
623
- }
624
- async add(function_, options = {}) {
625
- options = {
626
- timeout: this.timeout,
627
- throwOnTimeout: __classPrivateFieldGet(this, _PQueue_throwOnTimeout, "f"),
628
- ...options,
629
- };
630
- return new Promise((resolve, reject) => {
631
- __classPrivateFieldGet(this, _PQueue_queue, "f").enqueue(async () => {
632
- var _a;
633
- var _b, _c;
634
- __classPrivateFieldSet(this, _PQueue_pending, (_b = __classPrivateFieldGet(this, _PQueue_pending, "f"), _b++, _b), "f");
635
- __classPrivateFieldSet(this, _PQueue_intervalCount, (_c = __classPrivateFieldGet(this, _PQueue_intervalCount, "f"), _c++, _c), "f");
636
- try {
637
- // TODO: Use options.signal?.throwIfAborted() when targeting Node.js 18
638
- if ((_a = options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
639
- // TODO: Use ABORT_ERR code when targeting Node.js 16 (https://nodejs.org/docs/latest-v16.x/api/errors.html#abort_err)
640
- throw new AbortError('The task was aborted.');
641
- }
642
- let operation = function_({ signal: options.signal });
643
- if (options.timeout) {
644
- operation = pTimeout(Promise.resolve(operation), options.timeout);
645
- }
646
- if (options.signal) {
647
- operation = Promise.race([operation, __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_throwOnAbort).call(this, options.signal)]);
648
- }
649
- const result = await operation;
650
- resolve(result);
651
- this.emit('completed', result);
652
- }
653
- catch (error) {
654
- if (error instanceof TimeoutError && !options.throwOnTimeout) {
655
- resolve();
656
- return;
657
- }
658
- reject(error);
659
- this.emit('error', error);
660
- }
661
- finally {
662
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_next).call(this);
663
- }
664
- }, options);
665
- this.emit('add');
666
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_tryToStartAnother).call(this);
667
- });
668
- }
669
- async addAll(functions, options) {
670
- return Promise.all(functions.map(async (function_) => this.add(function_, options)));
671
- }
672
- /**
673
- Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)
674
- */
675
- start() {
676
- if (!__classPrivateFieldGet(this, _PQueue_isPaused, "f")) {
677
- return this;
678
- }
679
- __classPrivateFieldSet(this, _PQueue_isPaused, false, "f");
680
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_processQueue).call(this);
681
- return this;
682
- }
683
- /**
684
- Put queue execution on hold.
685
- */
686
- pause() {
687
- __classPrivateFieldSet(this, _PQueue_isPaused, true, "f");
688
- }
689
- /**
690
- Clear the queue.
691
- */
692
- clear() {
693
- __classPrivateFieldSet(this, _PQueue_queue, new (__classPrivateFieldGet(this, _PQueue_queueClass, "f"))(), "f");
694
- }
695
- /**
696
- Can be called multiple times. Useful if you for example add additional items at a later time.
697
-
698
- @returns A promise that settles when the queue becomes empty.
699
- */
700
- async onEmpty() {
701
- // Instantly resolve if the queue is empty
702
- if (__classPrivateFieldGet(this, _PQueue_queue, "f").size === 0) {
703
- return;
704
- }
705
- await __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_onEvent).call(this, 'empty');
706
- }
707
- /**
708
- @returns A promise that settles when the queue size is less than the given limit: `queue.size < limit`.
709
-
710
- If you want to avoid having the queue grow beyond a certain size you can `await queue.onSizeLessThan()` before adding a new item.
711
-
712
- Note that this only limits the number of items waiting to start. There could still be up to `concurrency` jobs already running that this call does not include in its calculation.
713
- */
714
- async onSizeLessThan(limit) {
715
- // Instantly resolve if the queue is empty.
716
- if (__classPrivateFieldGet(this, _PQueue_queue, "f").size < limit) {
717
- return;
718
- }
719
- await __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_onEvent).call(this, 'next', () => __classPrivateFieldGet(this, _PQueue_queue, "f").size < limit);
720
- }
721
- /**
722
- The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.
723
-
724
- @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.
725
- */
726
- async onIdle() {
727
- // Instantly resolve if none pending and if nothing else is queued
728
- if (__classPrivateFieldGet(this, _PQueue_pending, "f") === 0 && __classPrivateFieldGet(this, _PQueue_queue, "f").size === 0) {
729
- return;
730
- }
731
- await __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_onEvent).call(this, 'idle');
732
- }
733
- /**
734
- Size of the queue, the number of queued items waiting to run.
735
- */
736
- get size() {
737
- return __classPrivateFieldGet(this, _PQueue_queue, "f").size;
738
- }
739
- /**
740
- Size of the queue, filtered by the given options.
741
-
742
- For example, this can be used to find the number of items remaining in the queue with a specific priority level.
743
- */
744
- sizeBy(options) {
745
- // eslint-disable-next-line unicorn/no-array-callback-reference
746
- return __classPrivateFieldGet(this, _PQueue_queue, "f").filter(options).length;
747
- }
748
- /**
749
- Number of running items (no longer in the queue).
750
- */
751
- get pending() {
752
- return __classPrivateFieldGet(this, _PQueue_pending, "f");
753
- }
754
- /**
755
- Whether the queue is currently paused.
756
- */
757
- get isPaused() {
758
- return __classPrivateFieldGet(this, _PQueue_isPaused, "f");
759
- }
760
- }
761
- _PQueue_carryoverConcurrencyCount = new WeakMap(), _PQueue_isIntervalIgnored = new WeakMap(), _PQueue_intervalCount = new WeakMap(), _PQueue_intervalCap = new WeakMap(), _PQueue_interval = new WeakMap(), _PQueue_intervalEnd = new WeakMap(), _PQueue_intervalId = new WeakMap(), _PQueue_timeoutId = new WeakMap(), _PQueue_queue = new WeakMap(), _PQueue_queueClass = new WeakMap(), _PQueue_pending = new WeakMap(), _PQueue_concurrency = new WeakMap(), _PQueue_isPaused = new WeakMap(), _PQueue_throwOnTimeout = new WeakMap(), _PQueue_instances = new WeakSet(), _PQueue_doesIntervalAllowAnother_get = function _PQueue_doesIntervalAllowAnother_get() {
762
- return __classPrivateFieldGet(this, _PQueue_isIntervalIgnored, "f") || __classPrivateFieldGet(this, _PQueue_intervalCount, "f") < __classPrivateFieldGet(this, _PQueue_intervalCap, "f");
763
- }, _PQueue_doesConcurrentAllowAnother_get = function _PQueue_doesConcurrentAllowAnother_get() {
764
- return __classPrivateFieldGet(this, _PQueue_pending, "f") < __classPrivateFieldGet(this, _PQueue_concurrency, "f");
765
- }, _PQueue_next = function _PQueue_next() {
766
- var _a;
767
- __classPrivateFieldSet(this, _PQueue_pending, (_a = __classPrivateFieldGet(this, _PQueue_pending, "f"), _a--, _a), "f");
768
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_tryToStartAnother).call(this);
769
- this.emit('next');
770
- }, _PQueue_onResumeInterval = function _PQueue_onResumeInterval() {
771
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_onInterval).call(this);
772
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_initializeIntervalIfNeeded).call(this);
773
- __classPrivateFieldSet(this, _PQueue_timeoutId, undefined, "f");
774
- }, _PQueue_isIntervalPaused_get = function _PQueue_isIntervalPaused_get() {
775
- const now = Date.now();
776
- if (__classPrivateFieldGet(this, _PQueue_intervalId, "f") === undefined) {
777
- const delay = __classPrivateFieldGet(this, _PQueue_intervalEnd, "f") - now;
778
- if (delay < 0) {
779
- // Act as the interval was done
780
- // We don't need to resume it here because it will be resumed on line 160
781
- __classPrivateFieldSet(this, _PQueue_intervalCount, (__classPrivateFieldGet(this, _PQueue_carryoverConcurrencyCount, "f")) ? __classPrivateFieldGet(this, _PQueue_pending, "f") : 0, "f");
782
- }
783
- else {
784
- // Act as the interval is pending
785
- if (__classPrivateFieldGet(this, _PQueue_timeoutId, "f") === undefined) {
786
- __classPrivateFieldSet(this, _PQueue_timeoutId, setTimeout(() => {
787
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_onResumeInterval).call(this);
788
- }, delay), "f");
789
- }
790
- return true;
791
- }
792
- }
793
- return false;
794
- }, _PQueue_tryToStartAnother = function _PQueue_tryToStartAnother() {
795
- if (__classPrivateFieldGet(this, _PQueue_queue, "f").size === 0) {
796
- // We can clear the interval ("pause")
797
- // Because we can redo it later ("resume")
798
- if (__classPrivateFieldGet(this, _PQueue_intervalId, "f")) {
799
- clearInterval(__classPrivateFieldGet(this, _PQueue_intervalId, "f"));
800
- }
801
- __classPrivateFieldSet(this, _PQueue_intervalId, undefined, "f");
802
- this.emit('empty');
803
- if (__classPrivateFieldGet(this, _PQueue_pending, "f") === 0) {
804
- this.emit('idle');
805
- }
806
- return false;
807
- }
808
- if (!__classPrivateFieldGet(this, _PQueue_isPaused, "f")) {
809
- const canInitializeInterval = !__classPrivateFieldGet(this, _PQueue_instances, "a", _PQueue_isIntervalPaused_get);
810
- if (__classPrivateFieldGet(this, _PQueue_instances, "a", _PQueue_doesIntervalAllowAnother_get) && __classPrivateFieldGet(this, _PQueue_instances, "a", _PQueue_doesConcurrentAllowAnother_get)) {
811
- const job = __classPrivateFieldGet(this, _PQueue_queue, "f").dequeue();
812
- if (!job) {
813
- return false;
814
- }
815
- this.emit('active');
816
- job();
817
- if (canInitializeInterval) {
818
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_initializeIntervalIfNeeded).call(this);
819
- }
820
- return true;
821
- }
822
- }
823
- return false;
824
- }, _PQueue_initializeIntervalIfNeeded = function _PQueue_initializeIntervalIfNeeded() {
825
- if (__classPrivateFieldGet(this, _PQueue_isIntervalIgnored, "f") || __classPrivateFieldGet(this, _PQueue_intervalId, "f") !== undefined) {
826
- return;
827
- }
828
- __classPrivateFieldSet(this, _PQueue_intervalId, setInterval(() => {
829
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_onInterval).call(this);
830
- }, __classPrivateFieldGet(this, _PQueue_interval, "f")), "f");
831
- __classPrivateFieldSet(this, _PQueue_intervalEnd, Date.now() + __classPrivateFieldGet(this, _PQueue_interval, "f"), "f");
832
- }, _PQueue_onInterval = function _PQueue_onInterval() {
833
- if (__classPrivateFieldGet(this, _PQueue_intervalCount, "f") === 0 && __classPrivateFieldGet(this, _PQueue_pending, "f") === 0 && __classPrivateFieldGet(this, _PQueue_intervalId, "f")) {
834
- clearInterval(__classPrivateFieldGet(this, _PQueue_intervalId, "f"));
835
- __classPrivateFieldSet(this, _PQueue_intervalId, undefined, "f");
836
- }
837
- __classPrivateFieldSet(this, _PQueue_intervalCount, __classPrivateFieldGet(this, _PQueue_carryoverConcurrencyCount, "f") ? __classPrivateFieldGet(this, _PQueue_pending, "f") : 0, "f");
838
- __classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_processQueue).call(this);
839
- }, _PQueue_processQueue = function _PQueue_processQueue() {
840
- // eslint-disable-next-line no-empty
841
- while (__classPrivateFieldGet(this, _PQueue_instances, "m", _PQueue_tryToStartAnother).call(this)) { }
842
- }, _PQueue_throwOnAbort = async function _PQueue_throwOnAbort(signal) {
843
- return new Promise((_resolve, reject) => {
844
- signal.addEventListener('abort', () => {
845
- // TODO: Reject with signal.throwIfAborted() when targeting Node.js 18
846
- // TODO: Use ABORT_ERR code when targeting Node.js 16 (https://nodejs.org/docs/latest-v16.x/api/errors.html#abort_err)
847
- reject(new AbortError('The task was aborted.'));
848
- }, { once: true });
849
- });
850
- }, _PQueue_onEvent = async function _PQueue_onEvent(event, filter) {
851
- return new Promise(resolve => {
852
- const listener = () => {
853
- if (filter && !filter()) {
854
- return;
855
- }
856
- this.off(event, listener);
857
- resolve();
858
- };
859
- this.on(event, listener);
860
- });
861
- };
862
-
863
- function buildLog(text, count) {
864
- console.log(`
865
- ${kolorist.gray("[vite-react-ssg]")} ${kolorist.yellow(text)}${count ? kolorist.blue(` (${count})`) : ""}`);
866
- }
867
- function getSize(str) {
868
- return `${(str.length / 1024).toFixed(2)} KiB`;
869
- }
870
- async function routesToPaths(routes) {
871
- const pathToEntry = {};
872
- function addEntry(path, entry) {
873
- if (!entry)
874
- return;
875
- if (entry[0] === "/")
876
- entry = entry.slice(1);
877
- if (pathToEntry[path])
878
- pathToEntry[path].add(entry);
879
- else
880
- pathToEntry[path] = /* @__PURE__ */ new Set([entry]);
881
- }
882
- if (!routes)
883
- return { paths: ["/"], pathToEntry };
884
- const paths = /* @__PURE__ */ new Set();
885
- const lazyPaths = /* @__PURE__ */ new Set();
886
- const getPaths = async (routes2, prefix = "") => {
887
- prefix = prefix.replace(/\/$/g, "");
888
- for (const route of routes2) {
889
- let path = route.path;
890
- path = handlePath(path, prefix, route.entry);
891
- if (route.getStaticPaths && path?.includes(":")) {
892
- const staticPaths = await route.getStaticPaths();
893
- for (let staticPath of staticPaths) {
894
- staticPath = handlePath(staticPath, prefix, route.entry);
895
- if (Array.isArray(route.children))
896
- await getPaths(route.children, staticPath);
897
- }
898
- }
899
- if (route.lazy)
900
- lazyPaths.add(route.index ? prefix : path ?? "");
901
- if (route.index)
902
- addEntry(prefix, route.entry);
903
- if (Array.isArray(route.children))
904
- await getPaths(route.children, path);
905
- }
906
- };
907
- await getPaths(routes);
908
- return { paths: Array.from(paths), pathToEntry, lazyPaths: Array.from(lazyPaths) };
909
- function handlePath(path, prefix, entry) {
910
- if (path != null) {
911
- path = prefix && !path.startsWith("/") ? `${prefix}${path ? `/${path}` : ""}` : path;
912
- paths.add(path);
913
- addEntry(path, entry);
914
- if (pathToEntry[prefix]) {
915
- const pathCopy = path;
916
- pathToEntry[prefix].forEach((entry2) => addEntry(pathCopy, entry2));
917
- }
918
- }
919
- return path;
920
- }
921
- }
922
- function createFetchRequest(req) {
923
- const origin = `${req.protocol}://${req.get("host")}`;
924
- const url = new URL(req.originalUrl || req.url, origin);
925
- const controller = new AbortController();
926
- req.on("close", () => controller.abort());
927
- const headers = new Headers();
928
- for (const [key, values] of Object.entries(req.headers)) {
929
- if (values) {
930
- if (Array.isArray(values)) {
931
- for (const value of values)
932
- headers.append(key, value);
933
- } else {
934
- headers.set(key, values);
935
- }
936
- }
937
- }
938
- const init = {
939
- method: req.method,
940
- headers,
941
- signal: controller.signal
942
- };
943
- if (req.method !== "GET" && req.method !== "HEAD")
944
- init.body = req.body;
945
- return new Request(url.href, init);
946
- }
947
- async function resolveAlias(config, entry) {
948
- const resolver = config.createResolver();
949
- const result = await resolver(entry, config.root);
950
- return result || node_path.join(config.root, entry);
951
- }
952
- const { version } = JSON.parse(
953
- node_fs.readFileSync(new URL("../../package.json", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('shared/vite-react-ssg.69de2462.cjs', document.baseURI).href)))).toString()
954
- );
955
- function createRequest(path) {
956
- const url = new URL(path, "http://vite-react-ssg.com");
957
- url.search = "";
958
- url.hash = "";
959
- url.pathname = path;
960
- return new Request(url.href);
961
- }
962
-
963
- async function getCritters(outDir, options = {}) {
964
- try {
965
- const CrittersClass = (await import('critters')).default;
966
- return new CrittersClass({
967
- path: outDir,
968
- logLevel: "warn",
969
- external: true,
970
- inlineFonts: true,
971
- preloadFonts: true,
972
- ...options
973
- });
974
- } catch (e) {
975
- return void 0;
976
- }
977
- }
978
-
979
- async function renderStaticApp(app) {
980
- const writableStream = new WritableAsPromise();
981
- const { pipe } = server.renderToPipeableStream(app, {
982
- onError(error) {
983
- writableStream.destroy(error);
984
- },
985
- onAllReady() {
986
- pipe(writableStream);
987
- }
988
- });
989
- return writableStream.getPromise();
990
- }
991
- class WritableAsPromise extends node_stream.Writable {
992
- constructor() {
993
- super();
994
- this._output = "";
995
- this._deferred = {
996
- promise: null,
997
- resolve: () => null,
998
- reject: () => null
999
- };
1000
- this._deferred.promise = new Promise((resolve, reject) => {
1001
- this._deferred.resolve = resolve;
1002
- this._deferred.reject = reject;
1003
- });
1004
- }
1005
- _write(chunk, _enc, next) {
1006
- this._output += chunk.toString();
1007
- next();
1008
- }
1009
- _destroy(error, next) {
1010
- if (error instanceof Error)
1011
- this._deferred.reject(error);
1012
- else
1013
- next();
1014
- }
1015
- end() {
1016
- this._deferred.resolve(this._output);
1017
- return this.destroy();
1018
- }
1019
- getPromise() {
1020
- return this._deferred.promise;
1021
- }
1022
- }
1023
-
1024
- async function render(routes, request, styleCollector) {
1025
- const { dataRoutes, query } = server_js.createStaticHandler(routes);
1026
- const context = await query(request);
1027
- const helmetContext = {};
1028
- if (context instanceof Response)
1029
- throw context;
1030
- const router = server_js.createStaticRouter(dataRoutes, context);
1031
- let app = /* @__PURE__ */ React__default.createElement(reactHelmetAsync.HelmetProvider, { context: helmetContext }, /* @__PURE__ */ React__default.createElement(SiteMetadataDefaults.SiteMetadataDefaults, null), /* @__PURE__ */ React__default.createElement(server_js.StaticRouterProvider, { router, context }));
1032
- if (styleCollector)
1033
- app = styleCollector.collect(app);
1034
- const appHTML = await renderStaticApp(app);
1035
- const { helmet } = helmetContext;
1036
- const htmlAttributes = helmet.htmlAttributes.toString();
1037
- const bodyAttributes = helmet.bodyAttributes.toString();
1038
- const metaStrings = [
1039
- helmet.title.toString(),
1040
- helmet.meta.toString(),
1041
- helmet.link.toString(),
1042
- helmet.script.toString()
1043
- ];
1044
- const styleTag = styleCollector?.toString?.(appHTML) ?? "";
1045
- const metaAttributes = metaStrings.filter(Boolean);
1046
- return { appHTML, htmlAttributes, bodyAttributes, metaAttributes, styleTag, routerContext: context };
1047
- }
1048
- async function preLoad(routes, paths) {
1049
- if (!paths || paths.length === 0)
1050
- return routes;
1051
- const { dataRoutes, query } = server_js.createStaticHandler(routes);
1052
- await Promise.all(paths.map(async (path) => {
1053
- const request = createRequest(path);
1054
- return query(request);
1055
- }));
1056
- return dataRoutes;
1057
- }
1058
-
1059
- function renderPreloadLinks(document, modules, ssrManifest) {
1060
- const seen = /* @__PURE__ */ new Set();
1061
- const preloadLinks = [];
1062
- Array.from(modules).forEach((id) => {
1063
- const files = ssrManifest[id] || [];
1064
- files.forEach((file) => {
1065
- if (!preloadLinks.includes(file))
1066
- preloadLinks.push(file);
1067
- });
1068
- });
1069
- if (preloadLinks) {
1070
- preloadLinks.forEach((file) => {
1071
- if (!seen.has(file)) {
1072
- seen.add(file);
1073
- renderPreloadLink(document, file);
1074
- }
1075
- });
1076
- }
1077
- }
1078
- function renderPreloadLink(document, file) {
1079
- if (file.endsWith(".js")) {
1080
- appendLink(document, {
1081
- rel: "modulepreload",
1082
- crossOrigin: "",
1083
- href: file
1084
- });
1085
- } else if (file.endsWith(".css")) {
1086
- appendLink(document, {
1087
- rel: "stylesheet",
1088
- href: file
1089
- });
1090
- }
1091
- }
1092
- function createLink$1(document) {
1093
- return document.createElement("link");
1094
- }
1095
- function setAttrs(el, attrs) {
1096
- const keys = Object.keys(attrs);
1097
- for (const key of keys)
1098
- el.setAttribute(key, attrs[key]);
1099
- }
1100
- function appendLink(document, attrs) {
1101
- const exits = document.head.querySelector(`link[href='${attrs.file}']`);
1102
- if (exits)
1103
- return;
1104
- const link = createLink$1(document);
1105
- setAttrs(link, attrs);
1106
- document.head.appendChild(link);
1107
- }
1108
-
1109
- async function renderHTML({
1110
- rootContainerId,
1111
- indexHTML,
1112
- appHTML,
1113
- metaAttributes,
1114
- bodyAttributes,
1115
- htmlAttributes,
1116
- initialState
1117
- }) {
1118
- const stateScript = initialState ? `
1119
- <script>window.__INITIAL_STATE__=${initialState}<\/script>` : "";
1120
- const headStartTag = "<head>";
1121
- const metaTags = metaAttributes.join("");
1122
- indexHTML = indexHTML.replace(headStartTag, headStartTag + metaTags);
1123
- const bodyStartTag = "<body";
1124
- indexHTML = indexHTML.replace(bodyStartTag, `${bodyStartTag} ${bodyAttributes}`);
1125
- const htmlStartTag = "<html";
1126
- indexHTML = indexHTML.replace(htmlStartTag, `${htmlStartTag} ${htmlAttributes}`);
1127
- const container = `<div id="${rootContainerId}"></div>`;
1128
- if (indexHTML.includes(container)) {
1129
- return indexHTML.replace(
1130
- container,
1131
- `<div id="${rootContainerId}" data-server-rendered="true">${appHTML}</div>${stateScript}`
1132
- );
1133
- }
1134
- const html5Parser = await import('html5parser');
1135
- const ast = html5Parser.parse(indexHTML);
1136
- let renderedOutput;
1137
- html5Parser.walk(ast, {
1138
- enter: (node) => {
1139
- if (!renderedOutput && node?.type === html5Parser.SyntaxKind.Tag && Array.isArray(node.attributes) && node.attributes.length > 0 && node.attributes.some((attr) => attr.name.value === "id" && attr.value?.value === rootContainerId)) {
1140
- const attributesStringified = [...node.attributes.map(({ name: { value: name }, value }) => `${name}="${value.value}"`)].join(" ");
1141
- const indexHTMLBefore = indexHTML.slice(0, node.start);
1142
- const indexHTMLAfter = indexHTML.slice(node.end);
1143
- renderedOutput = `${indexHTMLBefore}<${node.name} ${attributesStringified} data-server-rendered="true">${appHTML}</${node.name}>${stateScript}${indexHTMLAfter}`;
1144
- }
1145
- }
1146
- });
1147
- if (!renderedOutput)
1148
- throw new Error(`Could not find a tag with id="${rootContainerId}" to replace it with server-side rendered HTML`);
1149
- return renderedOutput;
1150
- }
1151
- async function detectEntry(root) {
1152
- const scriptSrcReg = /<script(?:.*?)src=["'](.+?)["'](?!<)(?:.*)\>(?:[\n\r\s]*?)(?:<\/script>)/img;
1153
- const html = await fs__default.readFile(node_path.join(root, "index.html"), "utf-8");
1154
- const scripts = [...html.matchAll(scriptSrcReg)];
1155
- const [, entry] = scripts.find((matchResult) => {
1156
- const [script] = matchResult;
1157
- const [, scriptType] = script.match(/.*\stype=(?:'|")?([^>'"\s]+)/i) || [];
1158
- return scriptType === "module";
1159
- }) || [];
1160
- return entry || "src/main.ts";
1161
- }
1162
- function createLink(href) {
1163
- return `<link rel="stylesheet" href="${href}">`;
1164
- }
1165
-
1166
- function DefaultIncludedRoutes(paths, _routes) {
1167
- return paths.filter((i) => !i.includes(":") && !i.includes("*"));
1168
- }
1169
- async function build(ssgOptions = {}, viteConfig = {}) {
1170
- const mode = process.env.MODE || process.env.NODE_ENV || ssgOptions.mode || "production";
1171
- const config = await vite.resolveConfig(viteConfig, "build", mode, mode);
1172
- const cwd = process.cwd();
1173
- const root = config.root || cwd;
1174
- const ssgOut = node_path.join(root, ".vite-react-ssg-temp", Math.random().toString(36).substring(2, 12));
1175
- const outDir = config.build.outDir || "dist";
1176
- const out = node_path.isAbsolute(outDir) ? outDir : node_path.join(root, outDir);
1177
- const {
1178
- script = "sync",
1179
- mock = false,
1180
- entry = await detectEntry(root),
1181
- formatting = "none",
1182
- crittersOptions = {},
1183
- includedRoutes: configIncludedRoutes = DefaultIncludedRoutes,
1184
- onBeforePageRender,
1185
- onPageRendered,
1186
- onFinished,
1187
- dirStyle = "flat",
1188
- includeAllRoutes = false,
1189
- format = "esm",
1190
- concurrency = 20,
1191
- rootContainerId = "root"
1192
- } = Object.assign({}, config.ssgOptions || {}, ssgOptions);
1193
- if (fs__default.existsSync(ssgOut))
1194
- await fs__default.remove(ssgOut);
1195
- buildLog("Build for client...");
1196
- await vite.build(vite.mergeConfig(viteConfig, {
1197
- build: {
1198
- manifest: true,
1199
- ssrManifest: true,
1200
- rollupOptions: {
1201
- input: {
1202
- app: node_path.join(root, "./index.html")
1203
- }
1204
- }
1205
- },
1206
- mode: config.mode
1207
- }));
1208
- if (mock) {
1209
- const { jsdomGlobal } = await import('../chunks/jsdomGlobal.cjs');
1210
- jsdomGlobal();
1211
- }
1212
- buildLog("Build for server...");
1213
- process.env.VITE_SSG = "true";
1214
- const ssrEntry = await resolveAlias(config, entry);
1215
- await vite.build(vite.mergeConfig(viteConfig, {
1216
- build: {
1217
- ssr: ssrEntry,
1218
- outDir: ssgOut,
1219
- minify: false,
1220
- cssCodeSplit: false,
1221
- rollupOptions: {
1222
- output: format === "esm" ? {
1223
- entryFileNames: "[name].mjs",
1224
- format: "esm"
1225
- } : {
1226
- entryFileNames: "[name].cjs",
1227
- format: "cjs"
1228
- }
1229
- }
1230
- },
1231
- mode: config.mode
1232
- }));
1233
- const prefix = format === "esm" && process.platform === "win32" ? "file://" : "";
1234
- const ext = format === "esm" ? ".mjs" : ".cjs";
1235
- const serverEntry = node_path.join(prefix, ssgOut, node_path.parse(ssrEntry).name + ext);
1236
- const _require = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (document.currentScript && document.currentScript.src || new URL('shared/vite-react-ssg.69de2462.cjs', document.baseURI).href)));
1237
- const { createRoot, includedRoutes: serverEntryIncludedRoutes } = format === "esm" ? await import(serverEntry) : _require(serverEntry);
1238
- const includedRoutes = serverEntryIncludedRoutes || configIncludedRoutes;
1239
- const { routes } = await createRoot(false);
1240
- const { lazyPaths } = await routesToPaths(routes);
1241
- const dataRoutes = await preLoad([...routes], lazyPaths);
1242
- const { paths, pathToEntry } = await routesToPaths(dataRoutes);
1243
- let routesPaths = includeAllRoutes ? paths : await includedRoutes(paths, routes || []);
1244
- routesPaths = DefaultIncludedRoutes(routesPaths);
1245
- routesPaths = Array.from(new Set(routesPaths));
1246
- buildLog("Rendering Pages...", routesPaths.length);
1247
- const critters = crittersOptions !== false ? await getCritters(outDir, crittersOptions) : void 0;
1248
- if (critters)
1249
- console.log(`${kolorist.gray("[vite-react-ssg]")} ${kolorist.blue("Critical CSS generation enabled via `critters`")}`);
1250
- const ssrManifest = JSON.parse(await fs__default.readFile(node_path.join(out, "ssr-manifest.json"), "utf-8"));
1251
- const manifest = JSON.parse(await fs__default.readFile(node_path.join(out, "manifest.json"), "utf-8"));
1252
- let indexHTML = await fs__default.readFile(node_path.join(out, "index.html"), "utf-8");
1253
- indexHTML = rewriteScripts(indexHTML, script);
1254
- const queue = new PQueue({ concurrency });
1255
- const crittersQueue = new PQueue({ concurrency: 1 });
1256
- for (const path of routesPaths) {
1257
- queue.add(async () => {
1258
- try {
1259
- const appCtx = await createRoot(false, path);
1260
- const { initialState, routes: routes2, triggerOnSSRAppRendered, transformState = SiteMetadataDefaults.serializeState, getStyleCollector } = appCtx;
1261
- const styleCollector = getStyleCollector ? await getStyleCollector() : null;
1262
- const transformedIndexHTML = await onBeforePageRender?.(path, indexHTML, appCtx) || indexHTML;
1263
- const request = createRequest(path);
1264
- const { appHTML, bodyAttributes, htmlAttributes, metaAttributes, styleTag } = await render([...routes2], request, styleCollector);
1265
- await triggerOnSSRAppRendered?.(path, appHTML, appCtx);
1266
- const renderedHTML = await renderHTML({
1267
- rootContainerId,
1268
- appHTML,
1269
- indexHTML: transformedIndexHTML,
1270
- metaAttributes,
1271
- bodyAttributes,
1272
- htmlAttributes,
1273
- initialState: null
1274
- });
1275
- const jsdom = new JSDOM.JSDOM(renderedHTML);
1276
- const modules = collectModulesForEntrys(manifest, pathToEntry?.[path]);
1277
- renderPreloadLinks(jsdom.window.document, modules, ssrManifest);
1278
- const html = jsdom.serialize();
1279
- let transformed = await onPageRendered?.(path, html, appCtx) || html;
1280
- if (critters)
1281
- transformed = await crittersQueue.add(() => critters.process(transformed));
1282
- if (styleTag)
1283
- transformed = transformed.replace("<head>", `<head>${styleTag}`);
1284
- const formatted = await formatHtml(transformed, formatting);
1285
- const relativeRouteFile = `${(path.endsWith("/") ? `${path}index` : path).replace(/^\//g, "")}.html`;
1286
- const filename = dirStyle === "nested" ? node_path.join(path.replace(/^\//g, ""), "index.html") : relativeRouteFile;
1287
- await fs__default.ensureDir(node_path.join(out, node_path.dirname(filename)));
1288
- await fs__default.writeFile(node_path.join(out, filename), formatted, "utf-8");
1289
- config.logger.info(
1290
- `${kolorist.dim(`${outDir}/`)}${kolorist.cyan(filename.padEnd(15, " "))} ${kolorist.dim(getSize(formatted))}`
1291
- );
1292
- } catch (err) {
1293
- throw new Error(`${kolorist.gray("[vite-react-ssg]")} ${kolorist.red(`Error on page: ${kolorist.cyan(path)}`)}
1294
- ${err.stack}`);
1295
- }
1296
- });
1297
- }
1298
- await queue.start().onIdle();
1299
- await fs__default.remove(node_path.join(root, ".vite-react-ssg-temp"));
1300
- const pwaPlugin = config.plugins.find((i) => i.name === "vite-plugin-pwa")?.api;
1301
- if (pwaPlugin && !pwaPlugin.disabled && pwaPlugin.generateSW) {
1302
- buildLog("Regenerate PWA...");
1303
- await pwaPlugin.generateSW();
1304
- }
1305
- console.log(`
1306
- ${kolorist.gray("[vite-react-ssg]")} ${kolorist.green("Build finished.")}`);
1307
- await onFinished?.();
1308
- const waitInSeconds = 15;
1309
- const timeout = setTimeout(() => {
1310
- console.log(`${kolorist.gray("[vite-react-ssg]")} ${kolorist.yellow(`Build process still running after ${waitInSeconds}s`)}. There might be something misconfigured in your setup. Force exit.`);
1311
- process.exit(0);
1312
- }, waitInSeconds * 1e3);
1313
- timeout.unref();
1314
- }
1315
- function rewriteScripts(indexHTML, mode) {
1316
- if (!mode || mode === "sync")
1317
- return indexHTML;
1318
- return indexHTML.replace(/<script type="module" /g, `<script type="module" ${mode} `);
1319
- }
1320
- async function formatHtml(html, formatting) {
1321
- if (formatting === "minify") {
1322
- const htmlMinifier = await import('html-minifier');
1323
- return htmlMinifier.minify(html, {
1324
- collapseWhitespace: true,
1325
- caseSensitive: true,
1326
- collapseInlineTagWhitespace: false,
1327
- minifyJS: true,
1328
- minifyCSS: true
1329
- });
1330
- } else if (formatting === "prettify") {
1331
- const prettier = (await import('prettier/esm/standalone.mjs')).default;
1332
- const parserHTML = (await import('prettier/esm/parser-html.mjs')).default;
1333
- return prettier.format(html, { semi: false, parser: "html", plugins: [parserHTML] });
1334
- }
1335
- return html;
1336
- }
1337
- function collectModulesForEntrys(manifest, entrys) {
1338
- const mods = /* @__PURE__ */ new Set();
1339
- if (!entrys)
1340
- return mods;
1341
- for (const entry of entrys)
1342
- collectModules(manifest, entry, mods);
1343
- return mods;
1344
- }
1345
- function collectModules(manifest, entry, mods = /* @__PURE__ */ new Set()) {
1346
- if (!entry)
1347
- return mods;
1348
- mods.add(entry);
1349
- manifest[entry]?.dynamicImports?.forEach((item) => {
1350
- collectModules(manifest, item, mods);
1351
- });
1352
- return mods;
1353
- }
1354
-
1355
- const SHORTCUTS = [
1356
- {
1357
- key: "u",
1358
- description: "show server url",
1359
- action(vite, _) {
1360
- vite.config.logger.info("");
1361
- printServerInfo(vite, true);
1362
- }
1363
- },
1364
- {
1365
- key: "c",
1366
- description: "clear console",
1367
- action(vite, _) {
1368
- vite.config.logger.clearScreen("error");
1369
- }
1370
- },
1371
- {
1372
- key: "q",
1373
- description: "quit",
1374
- action(_, server) {
1375
- server.close(() => process.exit());
1376
- }
1377
- }
1378
- ];
1379
- function bindShortcuts(viteServer, server) {
1380
- if (!process.stdin.isTTY || process.env.CI)
1381
- return;
1382
- viteServer.config.logger.info(
1383
- kolorist.dim(kolorist.green(" \u279C")) + kolorist.dim(" press ") + kolorist.bold("h") + kolorist.dim(" to show help")
1384
- );
1385
- const shortcuts = SHORTCUTS;
1386
- let actionRunning = false;
1387
- const onInput = async (input) => {
1388
- if (input === "" || input === "") {
1389
- try {
1390
- await server.close();
1391
- } finally {
1392
- process.exit(1);
1393
- }
1394
- return;
1395
- }
1396
- if (actionRunning)
1397
- return;
1398
- if (input === "h") {
1399
- viteServer.config.logger.info(
1400
- [
1401
- "",
1402
- kolorist.bold(" Shortcuts"),
1403
- ...shortcuts.map(
1404
- (shortcut2) => kolorist.dim(" press ") + kolorist.bold(shortcut2.key) + kolorist.dim(` to ${shortcut2.description}`)
1405
- )
1406
- ].join("\n")
1407
- );
1408
- }
1409
- const shortcut = shortcuts.find((shortcut2) => shortcut2.key === input);
1410
- if (!shortcut)
1411
- return;
1412
- actionRunning = true;
1413
- await shortcut.action(viteServer, server);
1414
- actionRunning = false;
1415
- };
1416
- process.stdin.setRawMode(true);
1417
- process.stdin.on("data", onInput).setEncoding("utf8").resume();
1418
- server.on("close", () => {
1419
- process.stdin.off("data", onInput).pause();
1420
- });
1421
- }
1422
-
1423
- async function dev(ssgOptions = {}, viteConfig = {}) {
1424
- const mode = process.env.MODE || process.env.NODE_ENV || ssgOptions.mode || "development";
1425
- const config = await vite.resolveConfig(viteConfig, "serve", mode, mode);
1426
- const cwd = process.cwd();
1427
- const root = config.root || cwd;
1428
- const {
1429
- entry = await detectEntry(root),
1430
- onBeforePageRender,
1431
- onPageRendered,
1432
- rootContainerId = "root"
1433
- } = Object.assign({}, config.ssgOptions || {}, ssgOptions);
1434
- const ssrEntry = await resolveAlias(config, entry);
1435
- const template = await fs__default.readFile(node_path.join(root, "index.html"), "utf-8");
1436
- let viteServer;
1437
- globalThis.__ssr_start_time = performance.now();
1438
- createServer().then((app) => {
1439
- const port = viteServer.config.server.port || 5173;
1440
- const server = app.listen(port, () => {
1441
- printServerInfo(viteServer);
1442
- bindShortcuts(viteServer, server);
1443
- });
1444
- });
1445
- async function createServer() {
1446
- process.env.__DEV_MODE_SSR = "true";
1447
- const app = express__default();
1448
- viteServer = await vite.createServer({
1449
- // ...options,
1450
- server: { middlewareMode: true },
1451
- appType: "custom"
1452
- });
1453
- app.use(viteServer.middlewares);
1454
- app.use("*", async (req, res) => {
1455
- try {
1456
- const url = req.originalUrl;
1457
- const indexHTML = await viteServer.transformIndexHtml(url, template);
1458
- const createRoot = await viteServer.ssrLoadModule(ssrEntry).then((m) => m.createRoot);
1459
- const appCtx = await createRoot(false, url);
1460
- const { routes, getStyleCollector } = appCtx;
1461
- const transformedIndexHTML = await onBeforePageRender?.(url, indexHTML, appCtx) || indexHTML;
1462
- const styleCollector = getStyleCollector ? await getStyleCollector() : null;
1463
- const { appHTML, bodyAttributes, htmlAttributes, metaAttributes, styleTag, routerContext } = await render([...routes], createFetchRequest(req), styleCollector);
1464
- metaAttributes.push(styleTag);
1465
- const matchesEntries = routerContext.matches.map((match) => match.route.entry).filter((entry2) => !!entry2).map((entry2) => entry2[0] === "/" ? entry2 : `/${entry2}`);
1466
- const mods = await Promise.all(
1467
- [entry, ...matchesEntries].map(async (entry2) => await viteServer.moduleGraph.getModuleByUrl(entry2))
1468
- );
1469
- const assetsUrls = /* @__PURE__ */ new Set();
1470
- const collectAssets = async (mod) => {
1471
- if (!mod || !mod?.ssrTransformResult)
1472
- return;
1473
- const { deps = [], dynamicDeps = [] } = mod?.ssrTransformResult;
1474
- const allDeps = [...deps, ...dynamicDeps];
1475
- for (const dep of allDeps) {
1476
- if (dep.endsWith(".css")) {
1477
- assetsUrls.add(dep);
1478
- } else if (dep.endsWith(".ts") || dep.endsWith(".tsx")) {
1479
- const depModule = await viteServer.moduleGraph.getModuleByUrl(dep);
1480
- depModule && await collectAssets(depModule);
1481
- }
1482
- }
1483
- };
1484
- await Promise.all(mods.map(async (mod) => collectAssets(mod)));
1485
- const preloadLink = [...assetsUrls].map((item) => createLink(item));
1486
- metaAttributes.push(...preloadLink);
1487
- const renderedHTML = await renderHTML({
1488
- rootContainerId,
1489
- appHTML,
1490
- indexHTML: transformedIndexHTML,
1491
- metaAttributes,
1492
- bodyAttributes,
1493
- htmlAttributes,
1494
- initialState: null
1495
- });
1496
- const transformed = await onPageRendered?.(url, renderedHTML, appCtx) || renderedHTML;
1497
- res.status(200).set({ "Content-Type": "text/html" }).end(transformed);
1498
- } catch (e) {
1499
- viteServer.ssrFixStacktrace(e);
1500
- console.error(`[vite-react-ssg] error: ${e.stack}`);
1501
- res.status(500).end(e.stack);
1502
- }
1503
- });
1504
- return app;
1505
- }
1506
- }
1507
- async function printServerInfo(server, onlyUrl = false) {
1508
- const info = server.config.logger.info;
1509
- const port = server.config.server.port || 5173;
1510
- const url = `http://localhost:${port}/`;
1511
- if (!onlyUrl) {
1512
- let ssrReadyMessage = " -- SSR";
1513
- if (globalThis.__ssr_start_time) {
1514
- ssrReadyMessage += ` ready in ${kolorist.reset(kolorist.bold(`${Math.round(
1515
- // @ts-expect-error global var
1516
- performance.now() - globalThis.__ssr_start_time
1517
- )}ms`))}`;
1518
- }
1519
- info(
1520
- `
1521
- ${kolorist.bgLightCyan(` VITE-REACT-SSG v${version} `)}`,
1522
- { clear: !server.config.logger.hasWarned }
1523
- );
1524
- info(
1525
- `${kolorist.cyan(`
1526
- VITE v${vite.version}`) + kolorist.dim(ssrReadyMessage)}
1527
- `
1528
- );
1529
- }
1530
- info(
1531
- kolorist.green(" dev server running at:")
1532
- );
1533
- printUrls(url, info);
1534
- }
1535
- function printUrls(url, info) {
1536
- const colorUrl = (url2) => kolorist.cyan(url2.replace(/:(\d+)\//, (_, port) => `:${kolorist.bold(port)}/`));
1537
- info(` ${kolorist.green("\u279C")} ${kolorist.bold("Local")}: ${colorUrl(url)}`);
1538
- }
1539
-
1540
- exports.build = build;
1541
- exports.dev = dev;