veryfront 0.0.4 → 0.0.6

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/config.js ADDED
@@ -0,0 +1,654 @@
1
+ // src/core/config/schema.ts
2
+ import { z } from "zod";
3
+
4
+ // src/core/errors/veryfront-error.ts
5
+ function createError(error) {
6
+ return error;
7
+ }
8
+ function toError(veryfrontError) {
9
+ const error = new Error(veryfrontError.message);
10
+ error.name = `VeryfrontError[${veryfrontError.type}]`;
11
+ Object.defineProperty(error, "context", {
12
+ value: veryfrontError,
13
+ enumerable: false,
14
+ configurable: true
15
+ });
16
+ return error;
17
+ }
18
+
19
+ // src/core/config/schema.ts
20
+ var corsSchema = z.union([z.boolean(), z.object({ origin: z.string().optional() }).strict()]);
21
+ var veryfrontConfigSchema = z.object({
22
+ title: z.string().optional(),
23
+ description: z.string().optional(),
24
+ experimental: z.object({
25
+ esmLayouts: z.boolean().optional(),
26
+ precompileMDX: z.boolean().optional()
27
+ }).partial().optional(),
28
+ router: z.enum(["app", "pages"]).optional(),
29
+ defaultLayout: z.string().optional(),
30
+ theme: z.object({ colors: z.record(z.string()).optional() }).partial().optional(),
31
+ build: z.object({
32
+ outDir: z.string().optional(),
33
+ trailingSlash: z.boolean().optional(),
34
+ esbuild: z.object({
35
+ wasmURL: z.string().url().optional(),
36
+ worker: z.boolean().optional()
37
+ }).partial().optional()
38
+ }).partial().optional(),
39
+ cache: z.object({
40
+ dir: z.string().optional(),
41
+ bundleManifest: z.object({
42
+ type: z.enum(["redis", "kv", "memory"]).optional(),
43
+ redisUrl: z.string().optional(),
44
+ keyPrefix: z.string().optional(),
45
+ ttl: z.number().int().positive().optional(),
46
+ enabled: z.boolean().optional()
47
+ }).partial().optional()
48
+ }).partial().optional(),
49
+ dev: z.object({
50
+ port: z.number().int().positive().optional(),
51
+ host: z.string().optional(),
52
+ open: z.boolean().optional(),
53
+ hmr: z.boolean().optional(),
54
+ components: z.array(z.string()).optional()
55
+ }).partial().optional(),
56
+ resolve: z.object({
57
+ importMap: z.object({
58
+ imports: z.record(z.string()).optional(),
59
+ scopes: z.record(z.record(z.string())).optional()
60
+ }).partial().optional()
61
+ }).partial().optional(),
62
+ security: z.object({
63
+ csp: z.record(z.array(z.string())).optional(),
64
+ remoteHosts: z.array(z.string().url()).optional(),
65
+ cors: corsSchema.optional(),
66
+ coop: z.enum(["same-origin", "same-origin-allow-popups", "unsafe-none"]).optional(),
67
+ corp: z.enum(["same-origin", "same-site", "cross-origin"]).optional(),
68
+ coep: z.enum(["require-corp", "unsafe-none"]).optional()
69
+ }).partial().optional(),
70
+ middleware: z.object({
71
+ custom: z.array(z.function()).optional()
72
+ }).partial().optional(),
73
+ theming: z.object({
74
+ brandName: z.string().optional(),
75
+ logoHtml: z.string().optional()
76
+ }).partial().optional(),
77
+ assetPipeline: z.object({
78
+ images: z.object({
79
+ enabled: z.boolean().optional(),
80
+ formats: z.array(z.enum(["webp", "avif", "jpeg", "png"])).optional(),
81
+ sizes: z.array(z.number().int().positive()).optional(),
82
+ quality: z.number().int().min(1).max(100).optional(),
83
+ inputDir: z.string().optional(),
84
+ outputDir: z.string().optional(),
85
+ preserveOriginal: z.boolean().optional()
86
+ }).partial().optional(),
87
+ css: z.object({
88
+ enabled: z.boolean().optional(),
89
+ minify: z.boolean().optional(),
90
+ autoprefixer: z.boolean().optional(),
91
+ purge: z.boolean().optional(),
92
+ criticalCSS: z.boolean().optional(),
93
+ inputDir: z.string().optional(),
94
+ outputDir: z.string().optional(),
95
+ browsers: z.array(z.string()).optional(),
96
+ purgeContent: z.array(z.string()).optional(),
97
+ sourceMap: z.boolean().optional()
98
+ }).partial().optional()
99
+ }).partial().optional(),
100
+ observability: z.object({
101
+ tracing: z.object({
102
+ enabled: z.boolean().optional(),
103
+ exporter: z.enum(["jaeger", "zipkin", "otlp", "console"]).optional(),
104
+ endpoint: z.string().optional(),
105
+ serviceName: z.string().optional(),
106
+ sampleRate: z.number().min(0).max(1).optional()
107
+ }).partial().optional(),
108
+ metrics: z.object({
109
+ enabled: z.boolean().optional(),
110
+ exporter: z.enum(["prometheus", "otlp", "console"]).optional(),
111
+ endpoint: z.string().optional(),
112
+ prefix: z.string().optional(),
113
+ collectInterval: z.number().int().positive().optional()
114
+ }).partial().optional()
115
+ }).partial().optional(),
116
+ fs: z.object({
117
+ type: z.enum(["local", "veryfront-api", "memory"]).optional(),
118
+ local: z.object({
119
+ baseDir: z.string().optional()
120
+ }).partial().optional(),
121
+ veryfront: z.object({
122
+ apiBaseUrl: z.string().url(),
123
+ apiToken: z.string(),
124
+ projectSlug: z.string(),
125
+ cache: z.object({
126
+ enabled: z.boolean().optional(),
127
+ ttl: z.number().int().positive().optional(),
128
+ maxSize: z.number().int().positive().optional()
129
+ }).partial().optional(),
130
+ retry: z.object({
131
+ maxRetries: z.number().int().min(0).optional(),
132
+ initialDelay: z.number().int().positive().optional(),
133
+ maxDelay: z.number().int().positive().optional()
134
+ }).partial().optional()
135
+ }).partial().optional(),
136
+ memory: z.object({
137
+ files: z.record(z.union([z.string(), z.instanceof(Uint8Array)])).optional()
138
+ }).partial().optional()
139
+ }).partial().optional()
140
+ }).partial();
141
+ function validateVeryfrontConfig(input) {
142
+ const parsed = veryfrontConfigSchema.safeParse(input);
143
+ if (!parsed.success) {
144
+ const first = parsed.error.issues[0];
145
+ const path = first?.path?.length ? first.path.join(".") : "<root>";
146
+ const expected = first?.message || String(first);
147
+ let hint = "";
148
+ if (String(path).includes("security.cors")) {
149
+ hint = " Expected boolean or { origin?: string }.";
150
+ }
151
+ const context = {
152
+ field: path,
153
+ expected: expected + hint,
154
+ value: input
155
+ };
156
+ throw toError(
157
+ createError({
158
+ type: "config",
159
+ message: `Invalid veryfront.config at ${path}: ${expected}.${hint}`,
160
+ context
161
+ })
162
+ );
163
+ }
164
+ return parsed.data;
165
+ }
166
+ function findUnknownTopLevelKeys(input) {
167
+ const known = /* @__PURE__ */ new Set([
168
+ "title",
169
+ "description",
170
+ "experimental",
171
+ "router",
172
+ "defaultLayout",
173
+ "theme",
174
+ "build",
175
+ "cache",
176
+ "dev",
177
+ "resolve",
178
+ "security",
179
+ "middleware",
180
+ "theming",
181
+ "assetPipeline",
182
+ "observability",
183
+ "fs"
184
+ ]);
185
+ return Object.keys(input).filter((k) => !known.has(k));
186
+ }
187
+
188
+ // src/core/config/loader.ts
189
+ import { join } from "path";
190
+
191
+ // src/core/utils/runtime-guards.ts
192
+ function hasDenoRuntime(global) {
193
+ return typeof global === "object" && global !== null && "Deno" in global && typeof global.Deno?.env?.get === "function";
194
+ }
195
+ function hasNodeProcess(global) {
196
+ return typeof global === "object" && global !== null && "process" in global && typeof global.process?.env === "object";
197
+ }
198
+
199
+ // src/core/utils/logger/env.ts
200
+ function getEnvironmentVariable(name) {
201
+ try {
202
+ if (typeof Deno !== "undefined" && hasDenoRuntime(globalThis)) {
203
+ const value = globalThis.Deno?.env.get(name);
204
+ return value === "" ? void 0 : value;
205
+ }
206
+ if (hasNodeProcess(globalThis)) {
207
+ const value = globalThis.process?.env[name];
208
+ return value === "" ? void 0 : value;
209
+ }
210
+ } catch {
211
+ return void 0;
212
+ }
213
+ return void 0;
214
+ }
215
+
216
+ // src/core/utils/logger/logger.ts
217
+ var cachedLogLevel;
218
+ function resolveLogLevel(force = false) {
219
+ if (force || cachedLogLevel === void 0) {
220
+ cachedLogLevel = getDefaultLevel();
221
+ }
222
+ return cachedLogLevel;
223
+ }
224
+ var ConsoleLogger = class {
225
+ constructor(prefix, level = resolveLogLevel()) {
226
+ this.prefix = prefix;
227
+ this.level = level;
228
+ }
229
+ setLevel(level) {
230
+ this.level = level;
231
+ }
232
+ getLevel() {
233
+ return this.level;
234
+ }
235
+ debug(message, ...args) {
236
+ if (this.level <= 0 /* DEBUG */) {
237
+ console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);
238
+ }
239
+ }
240
+ info(message, ...args) {
241
+ if (this.level <= 1 /* INFO */) {
242
+ console.log(`[${this.prefix}] ${message}`, ...args);
243
+ }
244
+ }
245
+ warn(message, ...args) {
246
+ if (this.level <= 2 /* WARN */) {
247
+ console.warn(`[${this.prefix}] WARN: ${message}`, ...args);
248
+ }
249
+ }
250
+ error(message, ...args) {
251
+ if (this.level <= 3 /* ERROR */) {
252
+ console.error(`[${this.prefix}] ERROR: ${message}`, ...args);
253
+ }
254
+ }
255
+ async time(label, fn) {
256
+ const start = performance.now();
257
+ try {
258
+ const result = await fn();
259
+ const end = performance.now();
260
+ this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);
261
+ return result;
262
+ } catch (error) {
263
+ const end = performance.now();
264
+ this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, error);
265
+ throw error;
266
+ }
267
+ }
268
+ };
269
+ function parseLogLevel(levelString) {
270
+ if (!levelString)
271
+ return void 0;
272
+ const upper = levelString.toUpperCase();
273
+ switch (upper) {
274
+ case "DEBUG":
275
+ return 0 /* DEBUG */;
276
+ case "WARN":
277
+ return 2 /* WARN */;
278
+ case "ERROR":
279
+ return 3 /* ERROR */;
280
+ case "INFO":
281
+ return 1 /* INFO */;
282
+ default:
283
+ return void 0;
284
+ }
285
+ }
286
+ var getDefaultLevel = () => {
287
+ const envLevel = getEnvironmentVariable("LOG_LEVEL");
288
+ const parsedLevel = parseLogLevel(envLevel);
289
+ if (parsedLevel !== void 0)
290
+ return parsedLevel;
291
+ const debugFlag = getEnvironmentVariable("VERYFRONT_DEBUG");
292
+ if (debugFlag === "1" || debugFlag === "true")
293
+ return 0 /* DEBUG */;
294
+ return 1 /* INFO */;
295
+ };
296
+ var trackedLoggers = /* @__PURE__ */ new Set();
297
+ function createLogger(prefix) {
298
+ const logger2 = new ConsoleLogger(prefix);
299
+ trackedLoggers.add(logger2);
300
+ return logger2;
301
+ }
302
+ var cliLogger = createLogger("CLI");
303
+ var serverLogger = createLogger("SERVER");
304
+ var rendererLogger = createLogger("RENDERER");
305
+ var bundlerLogger = createLogger("BUNDLER");
306
+ var agentLogger = createLogger("AGENT");
307
+ var logger = createLogger("VERYFRONT");
308
+
309
+ // src/core/utils/constants/cdn.ts
310
+ var ESM_CDN_BASE = "https://esm.sh";
311
+ var REACT_VERSION_18_3 = "18.3.1";
312
+ var REACT_DEFAULT_VERSION = REACT_VERSION_18_3;
313
+ function getReactCDNUrl(version = REACT_DEFAULT_VERSION) {
314
+ return `${ESM_CDN_BASE}/react@${version}`;
315
+ }
316
+ function getReactDOMCDNUrl(version = REACT_DEFAULT_VERSION) {
317
+ return `${ESM_CDN_BASE}/react-dom@${version}`;
318
+ }
319
+ function getReactDOMClientCDNUrl(version = REACT_DEFAULT_VERSION) {
320
+ return `${ESM_CDN_BASE}/react-dom@${version}/client`;
321
+ }
322
+ function getReactDOMServerCDNUrl(version = REACT_DEFAULT_VERSION) {
323
+ return `${ESM_CDN_BASE}/react-dom@${version}/server`;
324
+ }
325
+ function getReactJSXRuntimeCDNUrl(version = REACT_DEFAULT_VERSION) {
326
+ return `${ESM_CDN_BASE}/react@${version}/jsx-runtime`;
327
+ }
328
+ function getReactJSXDevRuntimeCDNUrl(version = REACT_DEFAULT_VERSION) {
329
+ return `${ESM_CDN_BASE}/react@${version}/jsx-dev-runtime`;
330
+ }
331
+ function getReactImportMap(version = REACT_DEFAULT_VERSION) {
332
+ return {
333
+ react: getReactCDNUrl(version),
334
+ "react-dom": getReactDOMCDNUrl(version),
335
+ "react-dom/client": getReactDOMClientCDNUrl(version),
336
+ "react-dom/server": getReactDOMServerCDNUrl(version),
337
+ "react/jsx-runtime": getReactJSXRuntimeCDNUrl(version),
338
+ "react/jsx-dev-runtime": getReactJSXDevRuntimeCDNUrl(version)
339
+ };
340
+ }
341
+
342
+ // src/core/config/loader.ts
343
+ function getDefaultImportMapForConfig() {
344
+ return { imports: getReactImportMap(REACT_DEFAULT_VERSION) };
345
+ }
346
+ var DEFAULT_CONFIG = {
347
+ title: "Veryfront App",
348
+ description: "Built with Veryfront",
349
+ experimental: {
350
+ esmLayouts: true
351
+ },
352
+ router: void 0,
353
+ defaultLayout: void 0,
354
+ theme: {
355
+ colors: {
356
+ primary: "#3B82F6"
357
+ }
358
+ },
359
+ build: {
360
+ outDir: "dist",
361
+ trailingSlash: false,
362
+ esbuild: {
363
+ wasmURL: "https://deno.land/x/esbuild@v0.20.1/esbuild.wasm",
364
+ worker: false
365
+ }
366
+ },
367
+ cache: {
368
+ dir: ".veryfront/cache",
369
+ render: {
370
+ type: "memory",
371
+ ttl: void 0,
372
+ maxEntries: 500,
373
+ kvPath: void 0,
374
+ redisUrl: void 0,
375
+ redisKeyPrefix: void 0
376
+ }
377
+ },
378
+ dev: {
379
+ port: 3002,
380
+ host: "localhost",
381
+ open: false
382
+ },
383
+ resolve: {
384
+ importMap: getDefaultImportMapForConfig()
385
+ }
386
+ };
387
+ var configCacheByProject = /* @__PURE__ */ new Map();
388
+ function validateCorsConfig(userConfig) {
389
+ if (!userConfig || typeof userConfig !== "object") {
390
+ return;
391
+ }
392
+ const config = userConfig;
393
+ const security = config.security;
394
+ const cors = security?.cors;
395
+ if (!cors || typeof cors !== "object" || Array.isArray(cors)) {
396
+ return;
397
+ }
398
+ const corsObj = cors;
399
+ const origin = corsObj.origin;
400
+ if (origin !== void 0 && typeof origin !== "string") {
401
+ throw new ConfigValidationError(
402
+ "security.cors.origin must be a string. Expected boolean or { origin?: string }"
403
+ );
404
+ }
405
+ }
406
+ function validateConfigShape(userConfig) {
407
+ validateVeryfrontConfig(userConfig);
408
+ const unknown = typeof userConfig === "object" && userConfig ? findUnknownTopLevelKeys(userConfig) : [];
409
+ if (unknown.length > 0) {
410
+ serverLogger.warn(`Unknown config keys: ${unknown.join(", ")}. These will be ignored.`);
411
+ }
412
+ }
413
+ function mergeConfigs(userConfig) {
414
+ const merged = {
415
+ ...DEFAULT_CONFIG,
416
+ ...userConfig,
417
+ dev: {
418
+ ...DEFAULT_CONFIG.dev,
419
+ ...userConfig.dev
420
+ },
421
+ theme: {
422
+ ...DEFAULT_CONFIG.theme,
423
+ ...userConfig.theme
424
+ },
425
+ build: {
426
+ ...DEFAULT_CONFIG.build,
427
+ ...userConfig.build
428
+ },
429
+ cache: {
430
+ ...DEFAULT_CONFIG.cache,
431
+ ...userConfig.cache
432
+ },
433
+ resolve: {
434
+ ...DEFAULT_CONFIG.resolve,
435
+ ...userConfig.resolve
436
+ }
437
+ };
438
+ if (merged.resolve) {
439
+ const defaultMap = DEFAULT_CONFIG.resolve?.importMap;
440
+ const userMap = userConfig.resolve?.importMap;
441
+ if (defaultMap || userMap) {
442
+ merged.resolve.importMap = {
443
+ imports: {
444
+ ...defaultMap?.imports ?? {},
445
+ ...userMap?.imports ?? {}
446
+ },
447
+ scopes: {
448
+ ...defaultMap?.scopes ?? {},
449
+ ...userMap?.scopes ?? {}
450
+ }
451
+ };
452
+ }
453
+ }
454
+ return merged;
455
+ }
456
+ var ConfigValidationError = class extends Error {
457
+ constructor(message) {
458
+ super(message);
459
+ this.name = "ConfigValidationError";
460
+ }
461
+ };
462
+ async function loadAndMergeConfig(configPath, projectDir) {
463
+ try {
464
+ const configUrl = `file://${configPath}?t=${Date.now()}`;
465
+ const configModule = await import(configUrl);
466
+ const userConfig = configModule.default || configModule;
467
+ validateCorsConfig(userConfig);
468
+ validateConfigShape(userConfig);
469
+ const merged = mergeConfigs(userConfig);
470
+ configCacheByProject.set(projectDir, merged);
471
+ return merged;
472
+ } catch (error) {
473
+ if (error instanceof ConfigValidationError) {
474
+ throw error;
475
+ }
476
+ if (error instanceof Error && error.message.startsWith("Invalid veryfront.config")) {
477
+ throw error;
478
+ }
479
+ throw error;
480
+ }
481
+ }
482
+ async function getConfig(projectDir, adapter) {
483
+ const cached = configCacheByProject.get(projectDir);
484
+ if (cached)
485
+ return cached;
486
+ const configFiles = ["veryfront.config.js", "veryfront.config.ts", "veryfront.config.mjs"];
487
+ for (const configFile of configFiles) {
488
+ const configPath = join(projectDir, configFile);
489
+ const exists = await adapter.fs.exists(configPath);
490
+ if (!exists)
491
+ continue;
492
+ try {
493
+ const merged = await loadAndMergeConfig(configPath, projectDir);
494
+ if (merged)
495
+ return merged;
496
+ } catch (error) {
497
+ if (error instanceof ConfigValidationError) {
498
+ throw error;
499
+ }
500
+ if (error instanceof Error && error.message.startsWith("Invalid veryfront.config")) {
501
+ throw error;
502
+ }
503
+ const errorMessage = error instanceof Error ? error.message : String(error);
504
+ serverLogger.warn(`[CONFIG] Failed to load ${configFile}, trying next config file:`, {
505
+ error: errorMessage
506
+ });
507
+ continue;
508
+ }
509
+ }
510
+ const defaultConfig2 = DEFAULT_CONFIG;
511
+ configCacheByProject.set(projectDir, defaultConfig2);
512
+ return defaultConfig2;
513
+ }
514
+ function clearConfigCache() {
515
+ configCacheByProject.clear();
516
+ }
517
+
518
+ // src/core/config/define-config.ts
519
+ function defineConfig(config) {
520
+ return config;
521
+ }
522
+
523
+ // src/core/config/defaults.ts
524
+ var DEFAULT_DEV_PORT = 3e3;
525
+ var DEFAULT_TIMEOUT_MS = 5e3;
526
+ var SSR_TIMEOUT_MS = 1e4;
527
+ var SANDBOX_TIMEOUT_MS = 5e3;
528
+ var DEFAULT_CACHE_MAX_SIZE = 100;
529
+ var defaultConfig = {
530
+ server: {
531
+ port: DEFAULT_DEV_PORT,
532
+ hostname: "0.0.0.0"
533
+ },
534
+ timeouts: {
535
+ default: DEFAULT_TIMEOUT_MS,
536
+ api: 3e4,
537
+ ssr: SSR_TIMEOUT_MS,
538
+ hmr: 3e4,
539
+ sandbox: SANDBOX_TIMEOUT_MS
540
+ },
541
+ cache: {
542
+ jit: {
543
+ maxSize: DEFAULT_CACHE_MAX_SIZE,
544
+ tempDirPrefix: "vf-bundle-"
545
+ }
546
+ },
547
+ metrics: {
548
+ ssrBoundaries: [5, 10, 25, 50, 75, 100, 250, 500, 750, 1e3, 2500, 5e3, 7500, 1e4]
549
+ }
550
+ };
551
+ var DEFAULT_PREFETCH_DELAY_MS = 100;
552
+ var DEFAULT_METRICS_COLLECT_INTERVAL_MS = 6e4;
553
+ var DURATION_HISTOGRAM_BOUNDARIES_MS = [
554
+ 5,
555
+ 10,
556
+ 25,
557
+ 50,
558
+ 75,
559
+ 100,
560
+ 250,
561
+ 500,
562
+ 750,
563
+ 1e3,
564
+ 2500,
565
+ 5e3,
566
+ 7500,
567
+ 1e4
568
+ ];
569
+ var SIZE_HISTOGRAM_BOUNDARIES_KB = [
570
+ 1,
571
+ 5,
572
+ 10,
573
+ 25,
574
+ 50,
575
+ 100,
576
+ 250,
577
+ 500,
578
+ 1e3,
579
+ 2500,
580
+ 5e3,
581
+ 1e4
582
+ ];
583
+ var DEFAULT_REDIS_SCAN_COUNT = 100;
584
+ var DEFAULT_REDIS_BATCH_DELETE_SIZE = 1e3;
585
+ var PAGE_TRANSITION_DELAY_MS = 150;
586
+
587
+ // src/core/config/network-defaults.ts
588
+ var LOCALHOST = {
589
+ IPV4: "127.0.0.1",
590
+ IPV6: "::1",
591
+ HOSTNAME: "localhost"
592
+ };
593
+ var HTTP_DEFAULTS = {
594
+ PORT: 3e3,
595
+ HOST: "localhost",
596
+ PROD_HOST: "0.0.0.0"
597
+ };
598
+ var REDIS_DEFAULTS = {
599
+ URL: "redis://127.0.0.1:6379",
600
+ PORT: 6379,
601
+ HOST: "127.0.0.1"
602
+ };
603
+ var DEV_LOCALHOST_ORIGINS = [
604
+ "http://localhost",
605
+ "http://127.0.0.1",
606
+ "https://localhost",
607
+ "https://127.0.0.1"
608
+ ];
609
+ var DEV_LOCALHOST_CSP = {
610
+ WS: "ws://localhost:* wss://localhost:*",
611
+ HTTP: "http://localhost"
612
+ };
613
+ var LOCALHOST_URLS = {
614
+ HTTP: "http://localhost",
615
+ HTTPS: "https://localhost",
616
+ HTTP_IPV4: "http://127.0.0.1",
617
+ HTTPS_IPV4: "https://127.0.0.1"
618
+ };
619
+ function buildLocalhostUrl(port, protocol = "http") {
620
+ return `${protocol}://${LOCALHOST.HOSTNAME}:${port}`;
621
+ }
622
+ function buildIpv4Url(port, protocol = "http") {
623
+ return `${protocol}://${LOCALHOST.IPV4}:${port}`;
624
+ }
625
+ export {
626
+ DEFAULT_CACHE_MAX_SIZE,
627
+ DEFAULT_DEV_PORT,
628
+ DEFAULT_METRICS_COLLECT_INTERVAL_MS,
629
+ DEFAULT_PREFETCH_DELAY_MS,
630
+ DEFAULT_REDIS_BATCH_DELETE_SIZE,
631
+ DEFAULT_REDIS_SCAN_COUNT,
632
+ DEFAULT_TIMEOUT_MS,
633
+ DEV_LOCALHOST_CSP,
634
+ DEV_LOCALHOST_ORIGINS,
635
+ DURATION_HISTOGRAM_BOUNDARIES_MS,
636
+ HTTP_DEFAULTS,
637
+ LOCALHOST,
638
+ LOCALHOST_URLS,
639
+ PAGE_TRANSITION_DELAY_MS,
640
+ REDIS_DEFAULTS,
641
+ SANDBOX_TIMEOUT_MS,
642
+ SIZE_HISTOGRAM_BOUNDARIES_KB,
643
+ SSR_TIMEOUT_MS,
644
+ buildIpv4Url,
645
+ buildLocalhostUrl,
646
+ clearConfigCache,
647
+ defaultConfig,
648
+ defineConfig,
649
+ findUnknownTopLevelKeys,
650
+ getConfig,
651
+ validateVeryfrontConfig,
652
+ veryfrontConfigSchema
653
+ };
654
+ //# sourceMappingURL=config.js.map