veryfront 0.0.3 → 0.0.5

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/data.js ADDED
@@ -0,0 +1,1132 @@
1
+ // src/core/utils/cache/stores/memory/lru-list-manager.ts
2
+ var LRUListManager = class {
3
+ constructor() {
4
+ this.head = null;
5
+ this.tail = null;
6
+ }
7
+ getHead() {
8
+ return this.head;
9
+ }
10
+ getTail() {
11
+ return this.tail;
12
+ }
13
+ moveToFront(node) {
14
+ if (node === this.head) {
15
+ node.entry.lastAccessed = Date.now();
16
+ return;
17
+ }
18
+ this.removeNode(node);
19
+ this.addToFront(node);
20
+ }
21
+ addToFront(node) {
22
+ node.next = this.head;
23
+ node.prev = null;
24
+ if (this.head) {
25
+ this.head.prev = node;
26
+ }
27
+ this.head = node;
28
+ if (!this.tail) {
29
+ this.tail = node;
30
+ }
31
+ node.entry.lastAccessed = Date.now();
32
+ }
33
+ removeNode(node) {
34
+ if (node.prev) {
35
+ node.prev.next = node.next;
36
+ }
37
+ if (node.next) {
38
+ node.next.prev = node.prev;
39
+ }
40
+ if (node === this.head) {
41
+ this.head = node.next;
42
+ }
43
+ if (node === this.tail) {
44
+ this.tail = node.prev;
45
+ }
46
+ }
47
+ clear() {
48
+ this.head = null;
49
+ this.tail = null;
50
+ }
51
+ };
52
+
53
+ // src/core/utils/cache/eviction/eviction-manager.ts
54
+ var EvictionManager = class {
55
+ constructor(options = {}) {
56
+ this.onEvict = options.onEvict;
57
+ }
58
+ evictIfNeeded(cache, lruTracker, newEntrySize, maxSize, maxMemory) {
59
+ while (cache.size >= maxSize) {
60
+ this.evictLRU(cache, lruTracker);
61
+ }
62
+ let memoryUsed = Array.from(cache.values()).reduce((sum, entry) => sum + entry.size, 0);
63
+ while (memoryUsed + newEntrySize > maxMemory && cache.size > 0) {
64
+ const evictedSize = this.evictLRU(cache, lruTracker);
65
+ memoryUsed -= evictedSize;
66
+ }
67
+ }
68
+ evictLRU(cache, lruTracker) {
69
+ const keyToEvict = lruTracker.getLRU();
70
+ if (!keyToEvict) {
71
+ return 0;
72
+ }
73
+ const entry = cache.get(keyToEvict);
74
+ const size = entry?.size || 0;
75
+ const value = entry?.value;
76
+ cache.delete(keyToEvict);
77
+ lruTracker.remove(keyToEvict);
78
+ if (this.onEvict && entry) {
79
+ this.onEvict(keyToEvict, value);
80
+ }
81
+ return size;
82
+ }
83
+ evictLRUFromList(listManager, store, tagIndex, currentSize) {
84
+ const tail = listManager.getTail();
85
+ if (!tail)
86
+ return currentSize;
87
+ const node = tail;
88
+ listManager.removeNode(node);
89
+ store.delete(node.key);
90
+ const newSize = currentSize - node.entry.size;
91
+ if (node.entry.tags) {
92
+ this.cleanupTags(node.entry.tags, node.key, tagIndex);
93
+ }
94
+ if (this.onEvict) {
95
+ this.onEvict(node.key, node.entry.value);
96
+ }
97
+ return newSize;
98
+ }
99
+ enforceMemoryLimits(listManager, store, tagIndex, currentSize, maxEntries, maxSizeBytes) {
100
+ let size = currentSize;
101
+ while ((store.size > maxEntries || size > maxSizeBytes) && listManager.getTail()) {
102
+ size = this.evictLRUFromList(listManager, store, tagIndex, size);
103
+ }
104
+ return size;
105
+ }
106
+ cleanupTags(tags, key, tagIndex) {
107
+ for (const tag of tags) {
108
+ const set = tagIndex.get(tag);
109
+ if (set) {
110
+ set.delete(key);
111
+ if (set.size === 0) {
112
+ tagIndex.delete(tag);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ evictExpired(cache, lruTracker, ttl) {
118
+ const now = Date.now();
119
+ let evicted = 0;
120
+ for (const [key, entry] of cache.entries()) {
121
+ if (this.isExpired(entry, ttl, now)) {
122
+ cache.delete(key);
123
+ lruTracker.remove(key);
124
+ evicted++;
125
+ }
126
+ }
127
+ return evicted;
128
+ }
129
+ isExpired(entry, ttl, now = Date.now()) {
130
+ if (typeof entry.expiry === "number") {
131
+ return now > entry.expiry;
132
+ }
133
+ if (typeof entry.timestamp === "number" && typeof ttl === "number") {
134
+ const age = now - entry.timestamp;
135
+ return age > ttl;
136
+ }
137
+ return false;
138
+ }
139
+ };
140
+
141
+ // src/core/utils/cache/stores/memory/lru-node.ts
142
+ var LRUNode = class {
143
+ constructor(key, entry, prev = null, next = null) {
144
+ this.key = key;
145
+ this.entry = entry;
146
+ this.prev = prev;
147
+ this.next = next;
148
+ }
149
+ };
150
+
151
+ // src/core/utils/cache/stores/memory/entry-manager.ts
152
+ var EntryManager = class {
153
+ constructor(estimateSizeOf) {
154
+ this.estimateSizeOf = estimateSizeOf;
155
+ }
156
+ updateExistingEntry(node, value, ttlMs, tags, defaultTtlMs, listManager, tagIndex, key) {
157
+ const oldSize = node.entry.size;
158
+ const newSize = this.estimateSizeOf(value);
159
+ const expiry = this.calculateExpiry(ttlMs, defaultTtlMs);
160
+ if (node.entry.tags) {
161
+ this.cleanupTags(node.entry.tags, key, tagIndex);
162
+ }
163
+ node.entry = {
164
+ value,
165
+ size: newSize,
166
+ expiry,
167
+ tags,
168
+ lastAccessed: Date.now()
169
+ };
170
+ listManager.moveToFront(node);
171
+ return newSize - oldSize;
172
+ }
173
+ createNewEntry(key, value, ttlMs, tags, defaultTtlMs, listManager, store) {
174
+ const size = this.estimateSizeOf(value);
175
+ const expiry = this.calculateExpiry(ttlMs, defaultTtlMs);
176
+ const entry = {
177
+ value,
178
+ size,
179
+ expiry,
180
+ tags,
181
+ lastAccessed: Date.now()
182
+ };
183
+ const node = new LRUNode(key, entry);
184
+ store.set(key, node);
185
+ listManager.addToFront(node);
186
+ return [node, size];
187
+ }
188
+ updateTagIndex(tags, key, tagIndex) {
189
+ for (const tag of tags) {
190
+ if (!tagIndex.has(tag)) {
191
+ tagIndex.set(tag, /* @__PURE__ */ new Set());
192
+ }
193
+ tagIndex.get(tag)?.add(key);
194
+ }
195
+ }
196
+ cleanupTags(tags, key, tagIndex) {
197
+ for (const tag of tags) {
198
+ const set = tagIndex.get(tag);
199
+ if (set) {
200
+ set.delete(key);
201
+ if (set.size === 0) {
202
+ tagIndex.delete(tag);
203
+ }
204
+ }
205
+ }
206
+ }
207
+ calculateExpiry(ttlMs, defaultTtlMs) {
208
+ if (typeof ttlMs === "number") {
209
+ return Date.now() + ttlMs;
210
+ }
211
+ if (defaultTtlMs) {
212
+ return Date.now() + defaultTtlMs;
213
+ }
214
+ return void 0;
215
+ }
216
+ };
217
+
218
+ // src/core/utils/cache/stores/memory/lru-cache-adapter.ts
219
+ function defaultSizeEstimator(value) {
220
+ if (value === null || value === void 0)
221
+ return 0;
222
+ if (typeof value === "string")
223
+ return value.length * 2;
224
+ if (typeof value === "number" || typeof value === "bigint")
225
+ return 8;
226
+ if (typeof value === "boolean")
227
+ return 4;
228
+ if (value instanceof Uint8Array || ArrayBuffer.isView(value))
229
+ return value.byteLength;
230
+ if (value instanceof ArrayBuffer)
231
+ return value.byteLength;
232
+ if (typeof Blob !== "undefined" && value instanceof Blob)
233
+ return value.size;
234
+ try {
235
+ return JSON.stringify(value).length * 2;
236
+ } catch {
237
+ return 0;
238
+ }
239
+ }
240
+ var LRUCacheAdapter = class {
241
+ constructor(options = {}) {
242
+ this.store = /* @__PURE__ */ new Map();
243
+ this.tagIndex = /* @__PURE__ */ new Map();
244
+ this.listManager = new LRUListManager();
245
+ this.currentSize = 0;
246
+ this.maxEntries = options.maxEntries || 1e3;
247
+ this.maxSizeBytes = options.maxSizeBytes || 50 * 1024 * 1024;
248
+ this.defaultTtlMs = options.ttlMs;
249
+ this.onEvict = options.onEvict;
250
+ const estimateSizeOf = options.estimateSizeOf || defaultSizeEstimator;
251
+ this.evictionManager = new EvictionManager({
252
+ onEvict: this.onEvict,
253
+ loggerContext: "MemoryCache"
254
+ });
255
+ this.entryManager = new EntryManager(estimateSizeOf);
256
+ }
257
+ get(key) {
258
+ const node = this.store.get(key);
259
+ if (!node)
260
+ return void 0;
261
+ if (this.evictionManager.isExpired(node.entry)) {
262
+ this.delete(key);
263
+ return void 0;
264
+ }
265
+ this.listManager.moveToFront(node);
266
+ return node.entry.value;
267
+ }
268
+ set(key, value, ttlMs, tags) {
269
+ const existingNode = this.store.get(key);
270
+ if (existingNode) {
271
+ const sizeDelta = this.entryManager.updateExistingEntry(
272
+ existingNode,
273
+ value,
274
+ ttlMs,
275
+ tags,
276
+ this.defaultTtlMs,
277
+ this.listManager,
278
+ this.tagIndex,
279
+ key
280
+ );
281
+ this.currentSize += sizeDelta;
282
+ } else {
283
+ const [_node, size] = this.entryManager.createNewEntry(
284
+ key,
285
+ value,
286
+ ttlMs,
287
+ tags,
288
+ this.defaultTtlMs,
289
+ this.listManager,
290
+ this.store
291
+ );
292
+ this.currentSize += size;
293
+ }
294
+ if (tags && tags.length > 0) {
295
+ this.entryManager.updateTagIndex(tags, key, this.tagIndex);
296
+ }
297
+ this.currentSize = this.evictionManager.enforceMemoryLimits(
298
+ this.listManager,
299
+ this.store,
300
+ this.tagIndex,
301
+ this.currentSize,
302
+ this.maxEntries,
303
+ this.maxSizeBytes
304
+ );
305
+ }
306
+ delete(key) {
307
+ const node = this.store.get(key);
308
+ if (!node)
309
+ return;
310
+ this.listManager.removeNode(node);
311
+ this.store.delete(key);
312
+ this.currentSize -= node.entry.size;
313
+ if (node.entry.tags) {
314
+ this.entryManager.cleanupTags(node.entry.tags, key, this.tagIndex);
315
+ }
316
+ if (this.onEvict) {
317
+ this.onEvict(key, node.entry.value);
318
+ }
319
+ }
320
+ invalidateTag(tag) {
321
+ const set = this.tagIndex.get(tag);
322
+ if (!set)
323
+ return 0;
324
+ let count = 0;
325
+ for (const key of set) {
326
+ this.delete(key);
327
+ count++;
328
+ }
329
+ this.tagIndex.delete(tag);
330
+ return count;
331
+ }
332
+ clear() {
333
+ if (this.onEvict) {
334
+ for (const [key, node] of this.store) {
335
+ this.onEvict(key, node.entry.value);
336
+ }
337
+ }
338
+ this.store.clear();
339
+ this.tagIndex.clear();
340
+ this.listManager.clear();
341
+ this.currentSize = 0;
342
+ }
343
+ getStats() {
344
+ return {
345
+ entries: this.store.size,
346
+ sizeBytes: this.currentSize,
347
+ maxEntries: this.maxEntries,
348
+ maxSizeBytes: this.maxSizeBytes,
349
+ tags: this.tagIndex.size
350
+ };
351
+ }
352
+ cleanupExpired() {
353
+ const now = Date.now();
354
+ let cleaned = 0;
355
+ for (const [key, node] of this.store) {
356
+ if (typeof node.entry.expiry === "number" && now > node.entry.expiry) {
357
+ this.delete(key);
358
+ cleaned++;
359
+ }
360
+ }
361
+ return cleaned;
362
+ }
363
+ keys() {
364
+ return this.store.keys();
365
+ }
366
+ has(key) {
367
+ return this.get(key) !== void 0;
368
+ }
369
+ };
370
+
371
+ // src/core/utils/runtime-guards.ts
372
+ function hasDenoRuntime(global) {
373
+ return typeof global === "object" && global !== null && "Deno" in global && typeof global.Deno?.env?.get === "function";
374
+ }
375
+ function hasNodeProcess(global) {
376
+ return typeof global === "object" && global !== null && "process" in global && typeof global.process?.env === "object";
377
+ }
378
+
379
+ // src/core/utils/logger/env.ts
380
+ function getEnvironmentVariable(name) {
381
+ try {
382
+ if (typeof Deno !== "undefined" && hasDenoRuntime(globalThis)) {
383
+ const value = globalThis.Deno?.env.get(name);
384
+ return value === "" ? void 0 : value;
385
+ }
386
+ if (hasNodeProcess(globalThis)) {
387
+ const value = globalThis.process?.env[name];
388
+ return value === "" ? void 0 : value;
389
+ }
390
+ } catch (error) {
391
+ console.debug(`Failed to get environment variable ${name}:`, error);
392
+ return void 0;
393
+ }
394
+ return void 0;
395
+ }
396
+
397
+ // src/core/utils/logger/logger.ts
398
+ var cachedLogLevel;
399
+ function resolveLogLevel(force = false) {
400
+ if (force || cachedLogLevel === void 0) {
401
+ cachedLogLevel = getDefaultLevel();
402
+ }
403
+ return cachedLogLevel;
404
+ }
405
+ var ConsoleLogger = class {
406
+ constructor(prefix, level = resolveLogLevel()) {
407
+ this.prefix = prefix;
408
+ this.level = level;
409
+ }
410
+ setLevel(level) {
411
+ this.level = level;
412
+ }
413
+ getLevel() {
414
+ return this.level;
415
+ }
416
+ debug(message, ...args) {
417
+ if (this.level <= 0 /* DEBUG */) {
418
+ console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);
419
+ }
420
+ }
421
+ info(message, ...args) {
422
+ if (this.level <= 1 /* INFO */) {
423
+ console.log(`[${this.prefix}] ${message}`, ...args);
424
+ }
425
+ }
426
+ warn(message, ...args) {
427
+ if (this.level <= 2 /* WARN */) {
428
+ console.warn(`[${this.prefix}] WARN: ${message}`, ...args);
429
+ }
430
+ }
431
+ error(message, ...args) {
432
+ if (this.level <= 3 /* ERROR */) {
433
+ console.error(`[${this.prefix}] ERROR: ${message}`, ...args);
434
+ }
435
+ }
436
+ async time(label, fn) {
437
+ const start = performance.now();
438
+ try {
439
+ const result = await fn();
440
+ const end = performance.now();
441
+ this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);
442
+ return result;
443
+ } catch (_error) {
444
+ const end = performance.now();
445
+ this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, _error);
446
+ throw _error;
447
+ }
448
+ }
449
+ };
450
+ function parseLogLevel(levelString) {
451
+ if (!levelString)
452
+ return void 0;
453
+ const upper = levelString.toUpperCase();
454
+ switch (upper) {
455
+ case "DEBUG":
456
+ return 0 /* DEBUG */;
457
+ case "WARN":
458
+ return 2 /* WARN */;
459
+ case "ERROR":
460
+ return 3 /* ERROR */;
461
+ case "INFO":
462
+ return 1 /* INFO */;
463
+ default:
464
+ return void 0;
465
+ }
466
+ }
467
+ var getDefaultLevel = () => {
468
+ const envLevel = getEnvironmentVariable("LOG_LEVEL");
469
+ const parsedLevel = parseLogLevel(envLevel);
470
+ if (parsedLevel !== void 0)
471
+ return parsedLevel;
472
+ const debugFlag = getEnvironmentVariable("VERYFRONT_DEBUG");
473
+ if (debugFlag === "1" || debugFlag === "true")
474
+ return 0 /* DEBUG */;
475
+ return 1 /* INFO */;
476
+ };
477
+ var trackedLoggers = /* @__PURE__ */ new Set();
478
+ function createLogger(prefix) {
479
+ const logger2 = new ConsoleLogger(prefix);
480
+ trackedLoggers.add(logger2);
481
+ return logger2;
482
+ }
483
+ var cliLogger = createLogger("CLI");
484
+ var serverLogger = createLogger("SERVER");
485
+ var rendererLogger = createLogger("RENDERER");
486
+ var bundlerLogger = createLogger("BUNDLER");
487
+ var agentLogger = createLogger("AGENT");
488
+ var logger = createLogger("VERYFRONT");
489
+
490
+ // src/core/utils/constants/cache.ts
491
+ var SECONDS_PER_MINUTE = 60;
492
+ var MINUTES_PER_HOUR = 60;
493
+ var HOURS_PER_DAY = 24;
494
+ var MS_PER_SECOND = 1e3;
495
+ var DEFAULT_LRU_MAX_ENTRIES = 100;
496
+ var COMPONENT_LOADER_TTL_MS = 10 * MINUTES_PER_HOUR * MS_PER_SECOND;
497
+ var MDX_RENDERER_TTL_MS = 10 * MINUTES_PER_HOUR * MS_PER_SECOND;
498
+ var RENDERER_CORE_TTL_MS = 5 * MINUTES_PER_HOUR * MS_PER_SECOND;
499
+ var TSX_LAYOUT_TTL_MS = 10 * MINUTES_PER_HOUR * MS_PER_SECOND;
500
+ var DATA_FETCHING_MAX_ENTRIES = 200;
501
+ var DATA_FETCHING_TTL_MS = 10 * MINUTES_PER_HOUR * MS_PER_SECOND;
502
+ var MDX_CACHE_TTL_PRODUCTION_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;
503
+ var MDX_CACHE_TTL_DEVELOPMENT_MS = 5 * MINUTES_PER_HOUR * MS_PER_SECOND;
504
+ var BUNDLE_CACHE_TTL_PRODUCTION_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;
505
+ var BUNDLE_CACHE_TTL_DEVELOPMENT_MS = 5 * MINUTES_PER_HOUR * MS_PER_SECOND;
506
+ var BUNDLE_MANIFEST_PROD_TTL_MS = 7 * HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;
507
+ var BUNDLE_MANIFEST_DEV_TTL_MS = MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;
508
+ var SERVER_ACTION_DEFAULT_TTL_SEC = MINUTES_PER_HOUR * SECONDS_PER_MINUTE;
509
+ var ONE_DAY_MS = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;
510
+ var LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;
511
+
512
+ // src/core/utils/constants/http.ts
513
+ var KB_IN_BYTES = 1024;
514
+ var PREFETCH_MAX_SIZE_BYTES = 200 * KB_IN_BYTES;
515
+
516
+ // src/core/utils/constants/hmr.ts
517
+ var HMR_MAX_MESSAGE_SIZE_BYTES = 1024 * KB_IN_BYTES;
518
+
519
+ // src/core/utils/constants/network.ts
520
+ var BYTES_PER_MB = 1024 * 1024;
521
+
522
+ // deno.json
523
+ var deno_default = {
524
+ name: "veryfront",
525
+ version: "0.1.0",
526
+ nodeModulesDir: "auto",
527
+ workspace: [
528
+ "./examples/async-worker-redis",
529
+ "./examples/knowledge-base",
530
+ "./examples/form-handling",
531
+ "./examples/middleware-demo",
532
+ "./examples/coding-agent",
533
+ "./examples/durable-workflows"
534
+ ],
535
+ exports: {
536
+ ".": "./src/index.ts",
537
+ "./cli": "./src/cli/main.ts",
538
+ "./server": "./src/server/index.ts",
539
+ "./middleware": "./src/middleware/index.ts",
540
+ "./components": "./src/react/components/index.ts",
541
+ "./data": "./src/data/index.ts",
542
+ "./config": "./src/core/config/index.ts",
543
+ "./ai": "./src/ai/index.ts",
544
+ "./ai/client": "./src/ai/client.ts",
545
+ "./ai/react": "./src/ai/react/index.ts",
546
+ "./ai/primitives": "./src/ai/react/primitives/index.ts",
547
+ "./ai/components": "./src/ai/react/components/index.ts",
548
+ "./ai/production": "./src/ai/production/index.ts",
549
+ "./ai/dev": "./src/ai/dev/index.ts",
550
+ "./ai/workflow": "./src/ai/workflow/index.ts",
551
+ "./ai/workflow/react": "./src/ai/workflow/react/index.ts"
552
+ },
553
+ imports: {
554
+ "@veryfront": "./src/index.ts",
555
+ "@veryfront/": "./src/",
556
+ "@veryfront/ai": "./src/ai/index.ts",
557
+ "@veryfront/ai/": "./src/ai/",
558
+ "@veryfront/platform": "./src/platform/index.ts",
559
+ "@veryfront/platform/": "./src/platform/",
560
+ "@veryfront/types": "./src/core/types/index.ts",
561
+ "@veryfront/types/": "./src/core/types/",
562
+ "@veryfront/utils": "./src/core/utils/index.ts",
563
+ "@veryfront/utils/": "./src/core/utils/",
564
+ "@veryfront/middleware": "./src/middleware/index.ts",
565
+ "@veryfront/middleware/": "./src/middleware/",
566
+ "@veryfront/errors": "./src/core/errors/index.ts",
567
+ "@veryfront/errors/": "./src/core/errors/",
568
+ "@veryfront/config": "./src/core/config/index.ts",
569
+ "@veryfront/config/": "./src/core/config/",
570
+ "@veryfront/observability": "./src/observability/index.ts",
571
+ "@veryfront/observability/": "./src/observability/",
572
+ "@veryfront/routing": "./src/routing/index.ts",
573
+ "@veryfront/routing/": "./src/routing/",
574
+ "@veryfront/transforms": "./src/build/transforms/index.ts",
575
+ "@veryfront/transforms/": "./src/build/transforms/",
576
+ "@veryfront/data": "./src/data/index.ts",
577
+ "@veryfront/data/": "./src/data/",
578
+ "@veryfront/security": "./src/security/index.ts",
579
+ "@veryfront/security/": "./src/security/",
580
+ "@veryfront/components": "./src/react/components/index.ts",
581
+ "@veryfront/react": "./src/react/index.ts",
582
+ "@veryfront/react/": "./src/react/",
583
+ "@veryfront/html": "./src/html/index.ts",
584
+ "@veryfront/html/": "./src/html/",
585
+ "@veryfront/rendering": "./src/rendering/index.ts",
586
+ "@veryfront/rendering/": "./src/rendering/",
587
+ "@veryfront/build": "./src/build/index.ts",
588
+ "@veryfront/build/": "./src/build/",
589
+ "@veryfront/server": "./src/server/index.ts",
590
+ "@veryfront/server/": "./src/server/",
591
+ "@veryfront/modules": "./src/module-system/index.ts",
592
+ "@veryfront/modules/": "./src/module-system/",
593
+ "@veryfront/compat/console": "./src/platform/compat/console/index.ts",
594
+ "@veryfront/compat/": "./src/platform/compat/",
595
+ "std/": "https://deno.land/std@0.220.0/",
596
+ "@std/path": "https://deno.land/std@0.220.0/path/mod.ts",
597
+ "@std/testing/bdd.ts": "https://deno.land/std@0.220.0/testing/bdd.ts",
598
+ "@std/expect": "https://deno.land/std@0.220.0/expect/mod.ts",
599
+ csstype: "https://esm.sh/csstype@3.2.3",
600
+ "@types/react": "https://esm.sh/@types/react@18.3.27?deps=csstype@3.2.3",
601
+ "@types/react-dom": "https://esm.sh/@types/react-dom@18.3.7?deps=csstype@3.2.3",
602
+ react: "https://esm.sh/react@18.3.1",
603
+ "react-dom": "https://esm.sh/react-dom@18.3.1",
604
+ "react-dom/server": "https://esm.sh/react-dom@18.3.1/server",
605
+ "react-dom/client": "https://esm.sh/react-dom@18.3.1/client",
606
+ "react/jsx-runtime": "https://esm.sh/react@18.3.1/jsx-runtime",
607
+ "react/jsx-dev-runtime": "https://esm.sh/react@18.3.1/jsx-dev-runtime",
608
+ "@mdx-js/mdx": "https://esm.sh/@mdx-js/mdx@3.0.0?deps=react@18.3.1,react-dom@18.3.1",
609
+ "@mdx-js/react": "https://esm.sh/@mdx-js/react@3.0.0?deps=react@18.3.1,react-dom@18.3.1",
610
+ "unist-util-visit": "https://esm.sh/unist-util-visit@5.0.0",
611
+ "mdast-util-to-string": "https://esm.sh/mdast-util-to-string@4.0.0",
612
+ "github-slugger": "https://esm.sh/github-slugger@2.0.0",
613
+ "remark-gfm": "https://esm.sh/remark-gfm@4.0.1",
614
+ "remark-frontmatter": "https://esm.sh/remark-frontmatter@5.0.0",
615
+ "rehype-highlight": "https://esm.sh/rehype-highlight@7.0.2",
616
+ "rehype-slug": "https://esm.sh/rehype-slug@6.0.0",
617
+ esbuild: "https://deno.land/x/esbuild@v0.20.1/wasm.js",
618
+ "esbuild/mod.js": "https://deno.land/x/esbuild@v0.20.1/mod.js",
619
+ "es-module-lexer": "https://esm.sh/es-module-lexer@1.5.0",
620
+ zod: "https://esm.sh/zod@3.22.0",
621
+ "mime-types": "https://esm.sh/mime-types@2.1.35",
622
+ mdast: "https://esm.sh/@types/mdast@4.0.3",
623
+ hast: "https://esm.sh/@types/hast@3.0.3",
624
+ unist: "https://esm.sh/@types/unist@3.0.2",
625
+ unified: "https://esm.sh/unified@11.0.5?dts",
626
+ ai: "https://esm.sh/ai@5.0.76",
627
+ "ai/react": "https://esm.sh/@ai-sdk/react@2.0.59",
628
+ "@ai-sdk/openai": "https://esm.sh/@ai-sdk/openai@2.0.1",
629
+ "@ai-sdk/anthropic": "https://esm.sh/@ai-sdk/anthropic@2.0.4",
630
+ unocss: "https://esm.sh/unocss@0.59.0",
631
+ "@unocss/core": "https://esm.sh/@unocss/core@0.59.0",
632
+ "@unocss/preset-wind": "https://esm.sh/@unocss/preset-wind@0.59.0"
633
+ },
634
+ compilerOptions: {
635
+ jsx: "react-jsx",
636
+ jsxImportSource: "react",
637
+ strict: true,
638
+ noImplicitAny: true,
639
+ noUncheckedIndexedAccess: true,
640
+ types: [],
641
+ lib: [
642
+ "deno.window",
643
+ "dom",
644
+ "dom.iterable",
645
+ "dom.asynciterable",
646
+ "deno.ns"
647
+ ]
648
+ },
649
+ tasks: {
650
+ setup: "deno run --allow-all scripts/setup.ts",
651
+ dev: "deno run --allow-all --no-lock --unstable-net --unstable-worker-options src/cli/main.ts dev",
652
+ build: "deno compile --allow-all --output ../../bin/veryfront src/cli/main.ts",
653
+ "build:npm": "deno run -A scripts/build-npm.ts",
654
+ test: "DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --unstable-worker-options --unstable-net",
655
+ "test:unit": "DENO_JOBS=1 deno test --parallel --allow-all --v8-flags=--max-old-space-size=8192 --ignore=tests --unstable-worker-options --unstable-net",
656
+ "test:integration": "DENO_JOBS=1 deno test --parallel --fail-fast --allow-all tests --unstable-worker-options --unstable-net",
657
+ "test:batches": "deno run --allow-all scripts/test-batches.ts",
658
+ "test:unsafe": "DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --unstable-worker-options --unstable-net",
659
+ "test:coverage": "rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --unstable-worker-options --unstable-net || exit 1",
660
+ "test:coverage:unit": "rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage --ignore=tests --unstable-worker-options --unstable-net || exit 1",
661
+ "test:coverage:integration": "rm -rf coverage && DENO_JOBS=1 deno test --parallel --fail-fast --allow-all --coverage=coverage tests --unstable-worker-options --unstable-net || exit 1",
662
+ "coverage:report": "deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --lcov > coverage/lcov.info && deno run --allow-read scripts/check-coverage.ts 80",
663
+ "coverage:html": "deno coverage coverage --include=src/ --exclude=tests --exclude=src/**/*_test.ts --exclude=src/**/*_test.tsx --exclude=src/**/*.test.ts --exclude=src/**/*.test.tsx --html",
664
+ lint: "deno lint src/",
665
+ fmt: "deno fmt src/",
666
+ typecheck: "deno check src/index.ts src/cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/build/transforms/index.ts src/core/config/index.ts src/core/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/module-system/index.ts",
667
+ "docs:check-links": "deno run -A scripts/check-doc-links.ts",
668
+ "lint:ban-console": "deno run --allow-read scripts/ban-console.ts",
669
+ "lint:ban-deep-imports": "deno run --allow-read scripts/ban-deep-imports.ts",
670
+ "lint:ban-internal-root-imports": "deno run --allow-read scripts/ban-internal-root-imports.ts",
671
+ "lint:check-awaits": "deno run --allow-read scripts/check-unawaited-promises.ts",
672
+ "check:circular": "deno run -A jsr:@cunarist/deno-circular-deps src/index.ts"
673
+ },
674
+ lint: {
675
+ include: [
676
+ "src/**/*.ts",
677
+ "src/**/*.tsx"
678
+ ],
679
+ exclude: [
680
+ "dist/",
681
+ "coverage/"
682
+ ],
683
+ rules: {
684
+ tags: [
685
+ "recommended"
686
+ ],
687
+ include: [
688
+ "ban-untagged-todo"
689
+ ],
690
+ exclude: [
691
+ "no-explicit-any",
692
+ "no-process-global",
693
+ "no-console"
694
+ ]
695
+ }
696
+ },
697
+ fmt: {
698
+ include: [
699
+ "src/**/*.ts",
700
+ "src/**/*.tsx"
701
+ ],
702
+ exclude: [
703
+ "dist/",
704
+ "coverage/"
705
+ ],
706
+ options: {
707
+ useTabs: false,
708
+ lineWidth: 100,
709
+ indentWidth: 2,
710
+ semiColons: true,
711
+ singleQuote: false,
712
+ proseWrap: "preserve"
713
+ }
714
+ }
715
+ };
716
+
717
+ // src/core/utils/version.ts
718
+ var VERSION = typeof deno_default.version === "string" ? deno_default.version : "0.0.0";
719
+
720
+ // src/core/utils/bundle-manifest.ts
721
+ var InMemoryBundleManifestStore = class {
722
+ constructor() {
723
+ this.metadata = /* @__PURE__ */ new Map();
724
+ this.code = /* @__PURE__ */ new Map();
725
+ this.sourceIndex = /* @__PURE__ */ new Map();
726
+ }
727
+ getBundleMetadata(key) {
728
+ const entry = this.metadata.get(key);
729
+ if (!entry)
730
+ return Promise.resolve(void 0);
731
+ if (entry.expiry && Date.now() > entry.expiry) {
732
+ this.metadata.delete(key);
733
+ return Promise.resolve(void 0);
734
+ }
735
+ return Promise.resolve(entry.value);
736
+ }
737
+ setBundleMetadata(key, metadata, ttlMs) {
738
+ const expiry = ttlMs ? Date.now() + ttlMs : void 0;
739
+ this.metadata.set(key, { value: metadata, expiry });
740
+ if (!this.sourceIndex.has(metadata.source)) {
741
+ this.sourceIndex.set(metadata.source, /* @__PURE__ */ new Set());
742
+ }
743
+ this.sourceIndex.get(metadata.source).add(key);
744
+ return Promise.resolve();
745
+ }
746
+ getBundleCode(hash) {
747
+ const entry = this.code.get(hash);
748
+ if (!entry)
749
+ return Promise.resolve(void 0);
750
+ if (entry.expiry && Date.now() > entry.expiry) {
751
+ this.code.delete(hash);
752
+ return Promise.resolve(void 0);
753
+ }
754
+ return Promise.resolve(entry.value);
755
+ }
756
+ setBundleCode(hash, code, ttlMs) {
757
+ const expiry = ttlMs ? Date.now() + ttlMs : void 0;
758
+ this.code.set(hash, { value: code, expiry });
759
+ return Promise.resolve();
760
+ }
761
+ async deleteBundle(key) {
762
+ const metadata = await this.getBundleMetadata(key);
763
+ this.metadata.delete(key);
764
+ if (metadata) {
765
+ this.code.delete(metadata.codeHash);
766
+ const sourceKeys = this.sourceIndex.get(metadata.source);
767
+ if (sourceKeys) {
768
+ sourceKeys.delete(key);
769
+ if (sourceKeys.size === 0) {
770
+ this.sourceIndex.delete(metadata.source);
771
+ }
772
+ }
773
+ }
774
+ }
775
+ async invalidateSource(source) {
776
+ const keys = this.sourceIndex.get(source);
777
+ if (!keys)
778
+ return 0;
779
+ let count = 0;
780
+ for (const key of Array.from(keys)) {
781
+ await this.deleteBundle(key);
782
+ count++;
783
+ }
784
+ this.sourceIndex.delete(source);
785
+ return count;
786
+ }
787
+ clear() {
788
+ this.metadata.clear();
789
+ this.code.clear();
790
+ this.sourceIndex.clear();
791
+ return Promise.resolve();
792
+ }
793
+ isAvailable() {
794
+ return Promise.resolve(true);
795
+ }
796
+ getStats() {
797
+ let totalSize = 0;
798
+ let oldest;
799
+ let newest;
800
+ for (const { value } of this.metadata.values()) {
801
+ totalSize += value.size;
802
+ if (!oldest || value.compiledAt < oldest)
803
+ oldest = value.compiledAt;
804
+ if (!newest || value.compiledAt > newest)
805
+ newest = value.compiledAt;
806
+ }
807
+ return Promise.resolve({
808
+ totalBundles: this.metadata.size,
809
+ totalSize,
810
+ oldestBundle: oldest,
811
+ newestBundle: newest
812
+ });
813
+ }
814
+ };
815
+ var manifestStore = new InMemoryBundleManifestStore();
816
+
817
+ // src/core/utils/lru-wrapper.ts
818
+ var LRUCache = class {
819
+ adapter;
820
+ cleanupTimer;
821
+ cleanupIntervalMs;
822
+ ttlMs;
823
+ constructor(options = {}) {
824
+ const adapterOptions = {
825
+ maxEntries: options.maxEntries ?? DEFAULT_LRU_MAX_ENTRIES,
826
+ ttlMs: options.ttlMs
827
+ };
828
+ this.adapter = new LRUCacheAdapter(adapterOptions);
829
+ this.ttlMs = options.ttlMs;
830
+ this.cleanupIntervalMs = options.cleanupIntervalMs ?? 6e4;
831
+ if (this.ttlMs && this.ttlMs > 0) {
832
+ this.startPeriodicCleanup();
833
+ }
834
+ }
835
+ startPeriodicCleanup() {
836
+ if (shouldDisableInterval()) {
837
+ return;
838
+ }
839
+ if (this.cleanupTimer) {
840
+ clearInterval(this.cleanupTimer);
841
+ }
842
+ const timer = setInterval(() => {
843
+ this.adapter.cleanupExpired();
844
+ }, this.cleanupIntervalMs);
845
+ this.cleanupTimer = timer;
846
+ }
847
+ toStringKey(key) {
848
+ if (typeof key === "string") {
849
+ return key;
850
+ }
851
+ return String(key);
852
+ }
853
+ get size() {
854
+ return this.adapter.getStats().entries;
855
+ }
856
+ has(key) {
857
+ return this.adapter.get(this.toStringKey(key)) !== void 0;
858
+ }
859
+ get(key) {
860
+ return this.adapter.get(this.toStringKey(key));
861
+ }
862
+ set(key, value) {
863
+ this.adapter.set(this.toStringKey(key), value);
864
+ }
865
+ delete(key) {
866
+ const stringKey = this.toStringKey(key);
867
+ const had = this.adapter.get(stringKey) !== void 0;
868
+ this.adapter.delete(stringKey);
869
+ return had;
870
+ }
871
+ clear() {
872
+ this.adapter.clear();
873
+ }
874
+ cleanup() {
875
+ this.adapter.cleanupExpired();
876
+ }
877
+ destroy() {
878
+ if (this.cleanupTimer) {
879
+ clearInterval(this.cleanupTimer);
880
+ this.cleanupTimer = void 0;
881
+ }
882
+ this.adapter.clear();
883
+ }
884
+ keys() {
885
+ return this.adapter.keys();
886
+ }
887
+ };
888
+ function shouldDisableInterval() {
889
+ if (globalThis.__vfDisableLruInterval === true) {
890
+ return true;
891
+ }
892
+ try {
893
+ return process.env("VF_DISABLE_LRU_INTERVAL") === "1";
894
+ } catch (_error) {
895
+ return false;
896
+ }
897
+ }
898
+
899
+ // src/data/data-fetching-cache.ts
900
+ function isLruIntervalDisabled() {
901
+ if (globalThis.__vfDisableLruInterval === true) {
902
+ return true;
903
+ }
904
+ try {
905
+ return process.env.VF_DISABLE_LRU_INTERVAL === "1";
906
+ } catch (_error) {
907
+ return false;
908
+ }
909
+ }
910
+ var CacheManager = class {
911
+ constructor() {
912
+ this.cache = new LRUCache({
913
+ maxEntries: DATA_FETCHING_MAX_ENTRIES,
914
+ ttlMs: isLruIntervalDisabled() ? void 0 : DATA_FETCHING_TTL_MS
915
+ });
916
+ this.cacheKeys = /* @__PURE__ */ new Set();
917
+ }
918
+ get(key) {
919
+ const entry = this.cache.get(key);
920
+ return entry ?? null;
921
+ }
922
+ set(key, entry) {
923
+ this.cache.set(key, entry);
924
+ this.cacheKeys.add(key);
925
+ }
926
+ delete(key) {
927
+ this.cache.delete(key);
928
+ this.cacheKeys.delete(key);
929
+ }
930
+ clear() {
931
+ this.cache.clear();
932
+ this.cacheKeys.clear();
933
+ }
934
+ clearPattern(pattern) {
935
+ for (const key of this.cacheKeys) {
936
+ if (key.includes(pattern)) {
937
+ this.delete(key);
938
+ }
939
+ }
940
+ }
941
+ shouldRevalidate(entry) {
942
+ if (entry.revalidate === false) {
943
+ return false;
944
+ }
945
+ if (typeof entry.revalidate === "number") {
946
+ const age = Date.now() - entry.timestamp;
947
+ return age > entry.revalidate * 1e3;
948
+ }
949
+ return false;
950
+ }
951
+ createCacheKey(context) {
952
+ const params = JSON.stringify(context.params);
953
+ const pathname = context.url.pathname;
954
+ return `${pathname}::${params}`;
955
+ }
956
+ };
957
+
958
+ // src/data/server-data-fetcher.ts
959
+ var ServerDataFetcher = class {
960
+ constructor(adapter) {
961
+ this.adapter = adapter;
962
+ }
963
+ async fetch(pageModule, context) {
964
+ if (!pageModule.getServerData) {
965
+ return { props: {} };
966
+ }
967
+ try {
968
+ const result = await pageModule.getServerData(context);
969
+ if (result.redirect) {
970
+ return { redirect: result.redirect };
971
+ }
972
+ if (result.notFound) {
973
+ return { notFound: true };
974
+ }
975
+ return {
976
+ props: result.props ?? {},
977
+ revalidate: result.revalidate
978
+ };
979
+ } catch (error) {
980
+ this.logError("Error in getServerData:", error);
981
+ throw error;
982
+ }
983
+ }
984
+ logError(message, error) {
985
+ const debugEnabled = this.adapter?.env.get("VERYFRONT_DEBUG");
986
+ if (debugEnabled) {
987
+ serverLogger.error(message, error);
988
+ }
989
+ }
990
+ };
991
+
992
+ // src/data/static-data-fetcher.ts
993
+ var StaticDataFetcher = class {
994
+ constructor(cacheManager, adapter) {
995
+ this.cacheManager = cacheManager;
996
+ this.adapter = adapter;
997
+ this.pendingRevalidations = /* @__PURE__ */ new Map();
998
+ }
999
+ async fetch(pageModule, context) {
1000
+ if (!pageModule.getStaticData) {
1001
+ return { props: {} };
1002
+ }
1003
+ const cacheKey = this.cacheManager.createCacheKey(context);
1004
+ const cached = this.cacheManager.get(cacheKey);
1005
+ if (cached && !this.cacheManager.shouldRevalidate(cached)) {
1006
+ return cached.data;
1007
+ }
1008
+ if (cached && this.cacheManager.shouldRevalidate(cached)) {
1009
+ if (!this.pendingRevalidations.has(cacheKey)) {
1010
+ this.pendingRevalidations.set(
1011
+ cacheKey,
1012
+ this.revalidateInBackground(pageModule, context, cacheKey)
1013
+ );
1014
+ }
1015
+ return cached.data;
1016
+ }
1017
+ return await this.fetchFresh(pageModule, context, cacheKey);
1018
+ }
1019
+ async fetchFresh(pageModule, context, cacheKey) {
1020
+ if (!pageModule.getStaticData) {
1021
+ return { props: {} };
1022
+ }
1023
+ try {
1024
+ const result = await pageModule.getStaticData({
1025
+ params: context.params,
1026
+ url: context.url
1027
+ });
1028
+ this.cacheManager.set(cacheKey, {
1029
+ data: result,
1030
+ timestamp: Date.now(),
1031
+ revalidate: result.revalidate
1032
+ });
1033
+ return result;
1034
+ } catch (error) {
1035
+ this.logError("Error in getStaticData:", error);
1036
+ throw error;
1037
+ }
1038
+ }
1039
+ async revalidateInBackground(pageModule, context, cacheKey) {
1040
+ try {
1041
+ if (!pageModule.getStaticData) {
1042
+ return;
1043
+ }
1044
+ const result = await pageModule.getStaticData({
1045
+ params: context.params,
1046
+ url: context.url
1047
+ });
1048
+ this.cacheManager.set(cacheKey, {
1049
+ data: result,
1050
+ timestamp: Date.now(),
1051
+ revalidate: result.revalidate
1052
+ });
1053
+ } catch (error) {
1054
+ this.logError("Error revalidating data:", error);
1055
+ } finally {
1056
+ this.pendingRevalidations.delete(cacheKey);
1057
+ }
1058
+ }
1059
+ logError(message, error) {
1060
+ const debugEnabled = this.adapter?.env.get("VERYFRONT_DEBUG");
1061
+ if (debugEnabled) {
1062
+ serverLogger.error(message, error);
1063
+ }
1064
+ }
1065
+ };
1066
+
1067
+ // src/data/static-paths-fetcher.ts
1068
+ var StaticPathsFetcher = class {
1069
+ async fetch(pageModule) {
1070
+ if (!pageModule.getStaticPaths) {
1071
+ return null;
1072
+ }
1073
+ try {
1074
+ return await pageModule.getStaticPaths();
1075
+ } catch (error) {
1076
+ this.logError("Error in getStaticPaths:", error);
1077
+ throw error;
1078
+ }
1079
+ }
1080
+ logError(message, error) {
1081
+ serverLogger.error(message, error);
1082
+ }
1083
+ };
1084
+
1085
+ // src/data/data-fetcher.ts
1086
+ var DataFetcher = class {
1087
+ constructor(adapter) {
1088
+ this.cacheManager = new CacheManager();
1089
+ this.serverFetcher = new ServerDataFetcher(adapter);
1090
+ this.staticFetcher = new StaticDataFetcher(this.cacheManager, adapter);
1091
+ this.pathsFetcher = new StaticPathsFetcher();
1092
+ }
1093
+ async fetchData(pageModule, context, mode = "development") {
1094
+ if (!pageModule.getServerData && !pageModule.getStaticData) {
1095
+ return { props: {} };
1096
+ }
1097
+ if (mode === "development" && pageModule.getServerData) {
1098
+ return await this.serverFetcher.fetch(pageModule, context);
1099
+ }
1100
+ if (pageModule.getStaticData) {
1101
+ return await this.staticFetcher.fetch(pageModule, context);
1102
+ }
1103
+ if (pageModule.getServerData) {
1104
+ return await this.serverFetcher.fetch(pageModule, context);
1105
+ }
1106
+ return { props: {} };
1107
+ }
1108
+ async getStaticPaths(pageModule) {
1109
+ return await this.pathsFetcher.fetch(pageModule);
1110
+ }
1111
+ clearCache(pattern) {
1112
+ if (pattern) {
1113
+ this.cacheManager.clearPattern(pattern);
1114
+ } else {
1115
+ this.cacheManager.clear();
1116
+ }
1117
+ }
1118
+ };
1119
+
1120
+ // src/data/helpers.ts
1121
+ var redirect = (destination, permanent = false) => ({
1122
+ redirect: { destination, permanent }
1123
+ });
1124
+ var notFound = () => ({
1125
+ notFound: true
1126
+ });
1127
+ export {
1128
+ DataFetcher,
1129
+ notFound,
1130
+ redirect
1131
+ };
1132
+ //# sourceMappingURL=data.js.map