@farm.js/core 0.1.17 → 0.1.19
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/after.cjs +12 -225
- package/dist/agent-runtime.cjs +83 -2800
- package/dist/api/client.cjs +17 -4060
- package/dist/api/route-manager.cjs +34 -4354
- package/dist/api/runtime.cjs +29 -2696
- package/dist/api.cjs +88 -8434
- package/dist/app-markdown.cjs +39 -280
- package/dist/app-markdown.mjs +3 -3
- package/dist/cache.cjs +38 -1560
- package/dist/chunk-22GUSVNJ.cjs +351 -0
- package/dist/{chunk-EN7WTEAY.mjs → chunk-2ANEVVF7.mjs} +1 -1
- package/dist/chunk-2CQ74SP6.cjs +13 -0
- package/dist/{chunk-YD4J4XCI.mjs → chunk-2GNATDDE.mjs} +1 -1
- package/dist/chunk-2SJ4RQ6P.cjs +57 -0
- package/dist/chunk-3376ZTRC.cjs +1 -0
- package/dist/chunk-4PNUXIVU.cjs +472 -0
- package/dist/chunk-4PPEPOZZ.cjs +21 -0
- package/dist/chunk-4ZFL5GFN.cjs +520 -0
- package/dist/chunk-5OVTOKGH.cjs +65 -0
- package/dist/chunk-5QIKR7RR.cjs +224 -0
- package/dist/chunk-5ZSWG4UX.cjs +127 -0
- package/dist/chunk-62YJ2IEB.cjs +238 -0
- package/dist/chunk-6EODJYCX.cjs +183 -0
- package/dist/chunk-6EXBPJ24.cjs +434 -0
- package/dist/chunk-6QQDAAAZ.cjs +38 -0
- package/dist/chunk-6V4TDWEC.cjs +455 -0
- package/dist/chunk-72ADZ6GQ.cjs +19 -0
- package/dist/chunk-75BRBIFP.cjs +172 -0
- package/dist/{chunk-ZCNJKLA2.mjs → chunk-7BC6GAL7.mjs} +1 -1
- package/dist/chunk-7W3CPVXS.cjs +24 -0
- package/dist/chunk-A6WIQH5Z.cjs +31 -0
- package/dist/chunk-A777V5WU.cjs +725 -0
- package/dist/chunk-AFOD3LYZ.cjs +377 -0
- package/dist/chunk-AH7HOAQ3.cjs +151 -0
- package/dist/chunk-AMDMVWMI.cjs +39 -0
- package/dist/chunk-AORPIPNB.cjs +552 -0
- package/dist/chunk-ARJWXNQL.cjs +256 -0
- package/dist/chunk-AYJR42WX.cjs +711 -0
- package/dist/chunk-BBVSJVBZ.cjs +600 -0
- package/dist/chunk-BIDYX3SL.cjs +91 -0
- package/dist/chunk-BYODCJD6.cjs +663 -0
- package/dist/chunk-C3VRMB6H.cjs +85 -0
- package/dist/chunk-C5GUTBZK.cjs +173 -0
- package/dist/chunk-CIAGU2X4.cjs +337 -0
- package/dist/chunk-CMGMGHUZ.cjs +27 -0
- package/dist/chunk-CXP5U3RW.cjs +54 -0
- package/dist/chunk-D2ULAULS.cjs +166 -0
- package/dist/chunk-D7JTOLFK.cjs +285 -0
- package/dist/chunk-DVM4FKZL.cjs +169 -0
- package/dist/chunk-DYEJQTDN.cjs +49 -0
- package/dist/chunk-E2ROOWQC.cjs +2225 -0
- package/dist/chunk-E3UK5IIB.cjs +593 -0
- package/dist/chunk-EM6SBQKM.cjs +470 -0
- package/dist/chunk-FJSWYIR7.cjs +482 -0
- package/dist/chunk-FK6GO24V.cjs +54 -0
- package/dist/{chunk-MVIWBEJF.mjs → chunk-FVZGEVTO.mjs} +7 -7
- package/dist/chunk-FXUUWYAX.cjs +654 -0
- package/dist/chunk-G3HRIVEY.cjs +395 -0
- package/dist/chunk-G643DQCH.cjs +13 -0
- package/dist/chunk-G7HXGLEC.cjs +175 -0
- package/dist/chunk-GDSHDTJ4.cjs +152 -0
- package/dist/chunk-GPVTX3HT.cjs +1415 -0
- package/dist/chunk-H6G5INWM.cjs +1094 -0
- package/dist/{chunk-DHDVMXYK.mjs → chunk-HALDNTIV.mjs} +30 -4
- package/dist/chunk-HBTUGXHS.cjs +180 -0
- package/dist/chunk-HREOKQWT.cjs +45 -0
- package/dist/{chunk-5QOEPUYE.mjs → chunk-HSDL2AUR.mjs} +1 -1
- package/dist/chunk-I4J452B7.cjs +435 -0
- package/dist/chunk-I57LW5VZ.cjs +94 -0
- package/dist/chunk-I5YBCWQ6.cjs +40 -0
- package/dist/chunk-I7PUUDGY.cjs +389 -0
- package/dist/chunk-IAMRBF3Z.cjs +86 -0
- package/dist/chunk-IQXFRNY2.cjs +169 -0
- package/dist/chunk-ISTFC3MZ.cjs +1357 -0
- package/dist/chunk-IXTFU4PL.cjs +2355 -0
- package/dist/chunk-J3LOGE4T.cjs +42 -0
- package/dist/chunk-J7FSKED3.cjs +93 -0
- package/dist/chunk-JDNHKPTD.cjs +22 -0
- package/dist/chunk-JSROZYYO.cjs +164 -0
- package/dist/chunk-K6FNHVDR.cjs +696 -0
- package/dist/chunk-KGZIORNL.cjs +43 -0
- package/dist/chunk-KR6CKSXT.cjs +15 -0
- package/dist/chunk-KROWKCUH.cjs +185 -0
- package/dist/chunk-KVFPGF2M.cjs +46 -0
- package/dist/{chunk-TNBAYAWO.mjs → chunk-L4DVIHOC.mjs} +1 -1
- package/dist/chunk-LCCBO7PJ.cjs +46 -0
- package/dist/chunk-LIUGYUX3.cjs +22 -0
- package/dist/chunk-LTNGXMQ6.cjs +55 -0
- package/dist/chunk-M2L4MYDQ.cjs +14 -0
- package/dist/chunk-MCJLA63J.cjs +1 -0
- package/dist/chunk-MKB2EGIR.cjs +148 -0
- package/dist/chunk-MQ3H6LT5.cjs +202 -0
- package/dist/chunk-MT763TDW.cjs +43 -0
- package/dist/{chunk-XWAYMDLB.mjs → chunk-MVUREHPN.mjs} +1 -1
- package/dist/chunk-MWSK6C4J.cjs +18 -0
- package/dist/chunk-MWWVKDW3.cjs +169 -0
- package/dist/{chunk-6VQIKZZO.mjs → chunk-N255VYFP.mjs} +1 -1
- package/dist/chunk-NBAHDVOJ.cjs +2040 -0
- package/dist/chunk-NO3WWW3N.cjs +192 -0
- package/dist/chunk-NSFC3LHB.cjs +10244 -0
- package/dist/chunk-NZKJGRB3.cjs +230 -0
- package/dist/chunk-OAVTUMJP.cjs +1496 -0
- package/dist/{chunk-SXHV42UQ.mjs → chunk-OFEY6KHO.mjs} +88 -13
- package/dist/chunk-OHY2ZWUG.cjs +25 -0
- package/dist/chunk-OI6CMLWX.cjs +47 -0
- package/dist/chunk-OWOUTKIJ.cjs +558 -0
- package/dist/chunk-OX6O6WVA.cjs +74 -0
- package/dist/chunk-OXSIH4D6.cjs +476 -0
- package/dist/chunk-OYDRPBBV.cjs +453 -0
- package/dist/chunk-OYEUREB6.cjs +35 -0
- package/dist/chunk-PCOTGFSM.cjs +139 -0
- package/dist/{chunk-76DG3LF3.mjs → chunk-PGQBL5DN.mjs} +1 -1
- package/dist/chunk-PZYCPSCC.cjs +35 -0
- package/dist/chunk-QBK2AA4U.cjs +445 -0
- package/dist/{chunk-UTBVHYS3.mjs → chunk-QBPKKQTD.mjs} +2 -2
- package/dist/chunk-QBPXNZGV.cjs +487 -0
- package/dist/chunk-QNPEUFHQ.cjs +27 -0
- package/dist/chunk-QZRVZSPN.cjs +236 -0
- package/dist/chunk-R5A5KNVX.cjs +20 -0
- package/dist/chunk-R5JIFR6B.cjs +42 -0
- package/dist/chunk-R6AIILII.cjs +193 -0
- package/dist/chunk-RFYO7QUD.cjs +9 -0
- package/dist/chunk-RG3ZOTG5.cjs +34 -0
- package/dist/chunk-ROUTX2E5.cjs +390 -0
- package/dist/chunk-RTHIVJ2G.cjs +54 -0
- package/dist/chunk-S27FMYAM.cjs +644 -0
- package/dist/chunk-S3A45T7F.cjs +166 -0
- package/dist/chunk-S3JO3N4H.cjs +17 -0
- package/dist/chunk-SK35NQKK.cjs +27 -0
- package/dist/chunk-SU7MH53P.cjs +180 -0
- package/dist/chunk-SVRTJOUF.cjs +113 -0
- package/dist/chunk-SWN467MP.cjs +18 -0
- package/dist/chunk-SYQ3MOWW.cjs +73 -0
- package/dist/chunk-T5CERMEH.cjs +417 -0
- package/dist/chunk-TFAXUHWX.cjs +206 -0
- package/dist/chunk-TIWHTW3Q.cjs +24 -0
- package/dist/chunk-TKJZFIML.cjs +20 -0
- package/dist/chunk-TKNSDBBN.cjs +193 -0
- package/dist/chunk-U4KT7QP3.cjs +23 -0
- package/dist/chunk-U5BMPGS3.cjs +862 -0
- package/dist/chunk-UJ2C4ICS.cjs +277 -0
- package/dist/chunk-UQZ4AYTH.cjs +168 -0
- package/dist/chunk-US2QVW3E.cjs +36 -0
- package/dist/{chunk-QGVJVSNX.mjs → chunk-V4AICMQA.mjs} +2 -2
- package/dist/chunk-VB6UCX3V.cjs +421 -0
- package/dist/chunk-VEKFLAQM.cjs +300 -0
- package/dist/chunk-VQDBNVOO.cjs +14 -0
- package/dist/chunk-W4E7WMXE.cjs +71 -0
- package/dist/chunk-WJ3HK3LJ.cjs +1102 -0
- package/dist/chunk-WMAPPDMM.cjs +28 -0
- package/dist/chunk-WMOGFOUJ.cjs +223 -0
- package/dist/chunk-WPYFSQKK.cjs +37 -0
- package/dist/{chunk-56DAX2BE.mjs → chunk-WZXN4R5Y.mjs} +24 -13
- package/dist/chunk-XDGMADQM.cjs +14225 -0
- package/dist/chunk-XGC343EY.cjs +443 -0
- package/dist/chunk-XSKZORAS.cjs +727 -0
- package/dist/chunk-XWAWFQFS.cjs +82 -0
- package/dist/chunk-Y4YMF2NQ.cjs +460 -0
- package/dist/chunk-Y4YWHNKU.cjs +250 -0
- package/dist/chunk-Y53ZSFN6.cjs +504 -0
- package/dist/chunk-YA6LLTIJ.cjs +411 -0
- package/dist/chunk-YFPGHF5F.cjs +202 -0
- package/dist/chunk-YJRZR7VU.cjs +28 -0
- package/dist/chunk-YTAABQEV.cjs +1 -0
- package/dist/chunk-YX3DBN4M.cjs +18 -0
- package/dist/chunk-YZTASLPQ.cjs +64 -0
- package/dist/chunk-Z5HIWVDP.cjs +2173 -0
- package/dist/chunk-ZEG3OPIB.cjs +93 -0
- package/dist/chunk-ZMN3H73H.cjs +155 -0
- package/dist/client/lifecycle.cjs +6 -35
- package/dist/client-plugins.cjs +7 -448
- package/dist/client.cjs +171 -9808
- package/dist/config.cjs +8 -36
- package/dist/cron.cjs +24 -491
- package/dist/deferred.cjs +26 -475
- package/dist/deployment.cjs +39 -210
- package/dist/devtools-5KGPDVKL.cjs +388 -0
- package/dist/{devtools-UFVTMQX5.mjs → devtools-FY5R7TQ4.mjs} +3 -3
- package/dist/devtools-client-4WAPJY5L.cjs +254 -0
- package/dist/devtools-ui-5GBDIGMK.cjs +1296 -0
- package/dist/docs.cjs +46 -5657
- package/dist/docs.mjs +5 -5
- package/dist/env-types.cjs +5 -226
- package/dist/env.cjs +21 -338
- package/dist/environment/vite.cjs +8 -372
- package/dist/environment.cjs +12 -94
- package/dist/font.cjs +13 -63
- package/dist/headers.cjs +7 -123
- package/dist/i18n/client.cjs +55 -294
- package/dist/i18n/index.cjs +22 -209
- package/dist/i18n/server.cjs +22 -745
- package/dist/image/server.cjs +13 -729
- package/dist/image/sharp.cjs +33 -171
- package/dist/image.cjs +41 -85
- package/dist/index.cjs +1151 -68080
- package/dist/index.mjs +14 -14
- package/dist/instrumentation.cjs +12 -138
- package/dist/integration-orm-55F7CII5.cjs +13 -0
- package/dist/integrations.cjs +55 -4090
- package/dist/internal/app-markdown-runtime.cjs +27 -224
- package/dist/internal/app-markdown-runtime.mjs +2 -2
- package/dist/internal/build-runtime.cjs +120 -52259
- package/dist/internal/build-runtime.mjs +13 -13
- package/dist/internal/cli-runtime.cjs +67 -13811
- package/dist/internal/cli-runtime.mjs +7 -7
- package/dist/internal/client-error-overlay.cjs +80 -733
- package/dist/internal/client-error-overlay.mjs +1 -1
- package/dist/internal/client-runtime.cjs +81 -913
- package/dist/internal/compression-runtime.cjs +8 -214
- package/dist/internal/config-runtime.cjs +42 -6547
- package/dist/internal/config-runtime.mjs +3 -3
- package/dist/internal/docs-precompiled-runtime.cjs +26 -46
- package/dist/internal/infra-analytics-runtime.cjs +10 -536
- package/dist/internal/isolated-boundary.cjs +14 -414
- package/dist/internal/metadata-image-runtime.cjs +7 -285
- package/dist/internal/product-telemetry-runtime.cjs +42 -97
- package/dist/internal/product-telemetry-runtime.mjs +1 -1
- package/dist/internal/production-node-env.cjs +6 -63
- package/dist/internal/production-runtime.cjs +418 -7133
- package/dist/internal/production-runtime.mjs +3 -3
- package/dist/internal/request-cookies.cjs +6 -54
- package/dist/json-ld.cjs +24 -50
- package/dist/layers-E4WPJNY5.cjs +17 -0
- package/dist/manager-G4B2IPYE.cjs +14 -0
- package/dist/markdown.cjs +21 -547
- package/dist/markdown.mjs +1 -1
- package/dist/middleware.cjs +36 -2995
- package/dist/navigation.cjs +22 -2588
- package/dist/nitro-4I2MYLY2.cjs +652 -0
- package/dist/observability.cjs +22 -614
- package/dist/og.cjs +5 -28
- package/dist/plugin.cjs +106 -37442
- package/dist/plugin.mjs +9 -9
- package/dist/query/client.cjs +113 -449
- package/dist/query/index.cjs +26 -288
- package/dist/query/parsers.cjs +23 -247
- package/dist/query/server.cjs +36 -298
- package/dist/renderer/react/client.cjs +9 -43
- package/dist/renderer/react/server.cjs +40 -103
- package/dist/renderer/react/vite.cjs +7 -29
- package/dist/renderer-client.cjs +126 -4295
- package/dist/renderer.cjs +31 -249
- package/dist/request.cjs +5 -68
- package/dist/router.cjs +11 -474
- package/dist/routes.cjs +42 -2461
- package/dist/{schema-dev-notice-2IE2F2XI.mjs → schema-dev-notice-O67CPXJ6.mjs} +1 -1
- package/dist/schema-dev-notice-Y7MQEFGN.cjs +56 -0
- package/dist/schema.cjs +6 -33
- package/dist/search-client-G3RICOFU.cjs +13 -0
- package/dist/server-action-security.cjs +25 -541
- package/dist/server-fn-client.cjs +6 -337
- package/dist/server-fn.cjs +32 -1841
- package/dist/server-plugins.cjs +15 -884
- package/dist/server-query-client.cjs +15 -1883
- package/dist/server-query.cjs +16 -1838
- package/dist/server.cjs +296 -44681
- package/dist/server.mjs +11 -11
- package/dist/storage.cjs +57 -576
- package/dist/testing.cjs +89 -3186
- package/dist/theme/client.cjs +13 -108
- package/dist/theme/index.cjs +6 -68
- package/dist/theme/runtime.cjs +13 -78
- package/dist/theme/server.cjs +10 -179
- package/dist/version.cjs +4 -32
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +119 -37773
- package/dist/vite.mjs +9 -9
- package/dist/workflows.cjs +19 -1040
- package/package.json +1 -1
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkY53ZSFN6cjs = require('./chunk-Y53ZSFN6.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkHBTUGXHScjs = require('./chunk-HBTUGXHS.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
|
|
10
|
+
|
|
11
|
+
// src/middleware/chain.ts
|
|
12
|
+
var DEFAULT_MEMORY_RATE_LIMIT_ENTRIES = 1e5;
|
|
13
|
+
var _UnsupportedRateLimitStorageError = class _UnsupportedRateLimitStorageError extends TypeError {
|
|
14
|
+
constructor() {
|
|
15
|
+
super(
|
|
16
|
+
"RateLimitStorage must implement atomic increment(key, windowMs). Legacy get/set adapters can lose increments under concurrency. Use memoryRateLimitStorage() for one process or redisRateLimitStorage() from @farm.js/cache-redis for production."
|
|
17
|
+
);
|
|
18
|
+
this.name = "UnsupportedRateLimitStorageError";
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, _UnsupportedRateLimitStorageError, "UnsupportedRateLimitStorageError");
|
|
22
|
+
var UnsupportedRateLimitStorageError = _UnsupportedRateLimitStorageError;
|
|
23
|
+
function memoryRateLimitStorage(options = {}) {
|
|
24
|
+
const maxEntries = _nullishCoalesce(options.maxEntries, () => ( DEFAULT_MEMORY_RATE_LIMIT_ENTRIES));
|
|
25
|
+
if (!Number.isSafeInteger(maxEntries) || maxEntries <= 0) {
|
|
26
|
+
throw new TypeError("memoryRateLimitStorage maxEntries must be a positive safe integer.");
|
|
27
|
+
}
|
|
28
|
+
const records = /* @__PURE__ */ new Map();
|
|
29
|
+
let earliestExpiry = Infinity;
|
|
30
|
+
function read(key, now) {
|
|
31
|
+
const record = records.get(key);
|
|
32
|
+
if (!record) return null;
|
|
33
|
+
if (record.resetAt <= now) {
|
|
34
|
+
records.delete(key);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return record;
|
|
38
|
+
}
|
|
39
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, read, "read");
|
|
40
|
+
function pruneExpired(now) {
|
|
41
|
+
if (now < earliestExpiry) return;
|
|
42
|
+
earliestExpiry = Infinity;
|
|
43
|
+
for (const [key, record] of records) {
|
|
44
|
+
if (record.resetAt <= now) records.delete(key);
|
|
45
|
+
else earliestExpiry = Math.min(earliestExpiry, record.resetAt);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, pruneExpired, "pruneExpired");
|
|
49
|
+
return {
|
|
50
|
+
increment(key, windowMs) {
|
|
51
|
+
if (!Number.isSafeInteger(windowMs) || windowMs <= 0) {
|
|
52
|
+
throw new TypeError("Rate-limit windowMs must be a positive safe integer.");
|
|
53
|
+
}
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
const current = read(key, now);
|
|
56
|
+
if (current) {
|
|
57
|
+
current.count++;
|
|
58
|
+
return { ...current };
|
|
59
|
+
}
|
|
60
|
+
if (records.size >= maxEntries) pruneExpired(now);
|
|
61
|
+
if (records.size >= maxEntries) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
`Process-local rate-limit storage reached its ${maxEntries} active-key capacity. Configure a shared production adapter or increase maxEntries.`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
const next = { count: 1, resetAt: now + windowMs };
|
|
67
|
+
records.set(key, next);
|
|
68
|
+
earliestExpiry = Math.min(earliestExpiry, next.resetAt);
|
|
69
|
+
return { ...next };
|
|
70
|
+
},
|
|
71
|
+
get(key) {
|
|
72
|
+
const record = read(key, Date.now());
|
|
73
|
+
return record ? { ...record } : null;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, memoryRateLimitStorage, "memoryRateLimitStorage");
|
|
78
|
+
var defaultRateLimitStorage = memoryRateLimitStorage();
|
|
79
|
+
function parseTimeWindow(window) {
|
|
80
|
+
const match = window.match(/^(\d+)(ms|s|m|h|d)$/);
|
|
81
|
+
if (!match) throw new Error(`Invalid time window: ${window}`);
|
|
82
|
+
const [, amount, unit] = match;
|
|
83
|
+
const value = Number.parseInt(amount, 10);
|
|
84
|
+
const multipliers = {
|
|
85
|
+
ms: 1,
|
|
86
|
+
s: 1e3,
|
|
87
|
+
m: 60 * 1e3,
|
|
88
|
+
h: 60 * 60 * 1e3,
|
|
89
|
+
d: 24 * 60 * 60 * 1e3
|
|
90
|
+
};
|
|
91
|
+
const windowMs = value * multipliers[unit];
|
|
92
|
+
if (!Number.isSafeInteger(windowMs) || windowMs <= 0) {
|
|
93
|
+
throw new Error(`Invalid time window: ${window}`);
|
|
94
|
+
}
|
|
95
|
+
return windowMs;
|
|
96
|
+
}
|
|
97
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, parseTimeWindow, "parseTimeWindow");
|
|
98
|
+
function createRateLimitMiddleware(config) {
|
|
99
|
+
if (!Number.isSafeInteger(config.requests) || config.requests <= 0) {
|
|
100
|
+
throw new TypeError("Rate limit requests must be a positive safe integer.");
|
|
101
|
+
}
|
|
102
|
+
const windowMs = parseTimeWindow(config.window);
|
|
103
|
+
const storage = config.storage || defaultRateLimitStorage;
|
|
104
|
+
assertAtomicRateLimitStorage(storage);
|
|
105
|
+
return async (ctx, next) => {
|
|
106
|
+
const key = config.keyGenerator ? config.keyGenerator(ctx) : `${requireRateLimitClientAddress(ctx)}:${ctx.pathname}`;
|
|
107
|
+
const current = await storage.increment(key, windowMs);
|
|
108
|
+
assertRateLimitIncrementResult(current);
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
const resetIn = Math.max(1, Math.ceil((current.resetAt - now) / 1e3));
|
|
111
|
+
const remaining = Math.max(0, config.requests - current.count);
|
|
112
|
+
setRateLimitHeaders(ctx, config.requests, remaining, resetIn, Math.ceil(windowMs / 1e3));
|
|
113
|
+
if (current.count > config.requests) {
|
|
114
|
+
setMiddlewareResponseHeader(ctx, "Retry-After", String(resetIn));
|
|
115
|
+
if (config.onLimit) {
|
|
116
|
+
const result = await config.onLimit(ctx);
|
|
117
|
+
if (result) return result;
|
|
118
|
+
}
|
|
119
|
+
ctx.json(
|
|
120
|
+
{
|
|
121
|
+
error: "Rate limit exceeded",
|
|
122
|
+
retryAfter: resetIn
|
|
123
|
+
},
|
|
124
|
+
429
|
|
125
|
+
);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
return next();
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createRateLimitMiddleware, "createRateLimitMiddleware");
|
|
132
|
+
function requireRateLimitClientAddress(ctx) {
|
|
133
|
+
const address = _optionalChain([ctx, 'access', _ => _.request, 'access', _2 => _2.socket, 'optionalAccess', _3 => _3.remoteAddress]);
|
|
134
|
+
if (address) return address;
|
|
135
|
+
throw new Error(
|
|
136
|
+
"Rate limiting could not identify the caller: this runtime reports no client address. Set `server.trustProxy` so a proxy's x-forwarded-for is trusted, or pass a `keyGenerator` that derives the bucket from something you do have, such as a session or an API key."
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, requireRateLimitClientAddress, "requireRateLimitClientAddress");
|
|
140
|
+
function assertAtomicRateLimitStorage(storage) {
|
|
141
|
+
if (!storage || typeof storage.increment !== "function") {
|
|
142
|
+
throw new UnsupportedRateLimitStorageError();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, assertAtomicRateLimitStorage, "assertAtomicRateLimitStorage");
|
|
146
|
+
function assertRateLimitIncrementResult(result) {
|
|
147
|
+
if (!result || !Number.isSafeInteger(result.count) || result.count <= 0 || !Number.isFinite(result.resetAt) || result.resetAt <= 0) {
|
|
148
|
+
throw new TypeError(
|
|
149
|
+
"RateLimitStorage.increment() must return a positive integer count and a resetAt timestamp."
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, assertRateLimitIncrementResult, "assertRateLimitIncrementResult");
|
|
154
|
+
function setRateLimitHeaders(ctx, limit, remaining, resetIn, windowSeconds) {
|
|
155
|
+
setMiddlewareResponseHeader(ctx, "RateLimit-Policy", `"farm";q=${limit};w=${windowSeconds}`);
|
|
156
|
+
setMiddlewareResponseHeader(ctx, "RateLimit", `"farm";r=${remaining};t=${resetIn}`);
|
|
157
|
+
}
|
|
158
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, setRateLimitHeaders, "setRateLimitHeaders");
|
|
159
|
+
function setMiddlewareResponseHeader(ctx, name, value) {
|
|
160
|
+
ctx.headers.set(name, value);
|
|
161
|
+
if (!ctx.response.headersSent && !ctx.response.writableEnded) {
|
|
162
|
+
ctx.response.setHeader(name, value);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, setMiddlewareResponseHeader, "setMiddlewareResponseHeader");
|
|
166
|
+
function matchPattern(pattern, pathname) {
|
|
167
|
+
if (pattern instanceof RegExp) {
|
|
168
|
+
return pattern.test(pathname);
|
|
169
|
+
}
|
|
170
|
+
const regexPattern = pattern.replace(/\*\*/g, "__DOUBLE_STAR__").replace(/\*/g, "__SINGLE_STAR__").replace(/[.+?^${}()|[\]\\/]/g, "\\$&").replace(/__DOUBLE_STAR__/g, ".*").replace(/__SINGLE_STAR__/g, "[^/]+");
|
|
171
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
172
|
+
return regex.test(pathname);
|
|
173
|
+
}
|
|
174
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, matchPattern, "matchPattern");
|
|
175
|
+
var _MiddlewareChainImpl = class _MiddlewareChainImpl {
|
|
176
|
+
constructor(basePath = "/") {
|
|
177
|
+
this.handlers = [];
|
|
178
|
+
this.basePath = basePath === "/" ? "/" : basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Set the base path for this middleware chain (called by manager when loading)
|
|
182
|
+
*/
|
|
183
|
+
setBasePath(path2) {
|
|
184
|
+
this.basePath = path2 === "/" ? "/" : path2.endsWith("/") ? path2.slice(0, -1) : path2;
|
|
185
|
+
}
|
|
186
|
+
use(fn) {
|
|
187
|
+
this.handlers.push(fn);
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Normalize a path pattern - auto-scope to middleware route
|
|
192
|
+
* If middleware is in /contact, then "/api" becomes "/contact/api"
|
|
193
|
+
*/
|
|
194
|
+
normalizePattern(pattern) {
|
|
195
|
+
if (this.basePath === "/") {
|
|
196
|
+
return pattern.startsWith("/") ? pattern : `/${pattern}`;
|
|
197
|
+
}
|
|
198
|
+
const cleanPattern = pattern.startsWith("/") ? pattern.slice(1) : pattern;
|
|
199
|
+
return `${this.basePath}/${cleanPattern}`;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Conditionally run middleware based on a condition.
|
|
203
|
+
* Only supports boolean values or functions that evaluate to boolean.
|
|
204
|
+
* Route-based string matching has been removed - use function conditions instead.
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* .when(true, (ctx, next) => { ... }) // Always run
|
|
208
|
+
* .when((ctx) => ctx.data.get('flag'), (ctx, next) => { ... }) // Conditional
|
|
209
|
+
* .when((ctx) => ctx.pathname === '/contact', (ctx, next) => { ... }) // Path-based condition
|
|
210
|
+
*/
|
|
211
|
+
when(condition, fn) {
|
|
212
|
+
const conditionalMiddleware = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async (ctx, next) => {
|
|
213
|
+
const shouldRun = typeof condition === "function" ? condition(ctx) : condition;
|
|
214
|
+
if (!shouldRun) {
|
|
215
|
+
return next();
|
|
216
|
+
}
|
|
217
|
+
if (typeof fn === "function" && fn.length === 2) {
|
|
218
|
+
return fn(ctx, next);
|
|
219
|
+
} else {
|
|
220
|
+
const subChain = middleware(this.basePath);
|
|
221
|
+
fn(subChain);
|
|
222
|
+
const { handlers } = subChain.build();
|
|
223
|
+
let index = 0;
|
|
224
|
+
let returnedResponse;
|
|
225
|
+
const executeNext = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async () => {
|
|
226
|
+
if (index < handlers.length) {
|
|
227
|
+
const handler = handlers[index++];
|
|
228
|
+
const result = await handler(ctx, executeNext);
|
|
229
|
+
if (result instanceof Response) {
|
|
230
|
+
returnedResponse = result;
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
const result = await next();
|
|
235
|
+
if (result instanceof Response) {
|
|
236
|
+
returnedResponse = result;
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return returnedResponse;
|
|
241
|
+
}, "executeNext");
|
|
242
|
+
return executeNext();
|
|
243
|
+
}
|
|
244
|
+
}, "conditionalMiddleware");
|
|
245
|
+
this.handlers.push(conditionalMiddleware);
|
|
246
|
+
return this;
|
|
247
|
+
}
|
|
248
|
+
rateLimit(config) {
|
|
249
|
+
this.handlers.push(createRateLimitMiddleware(config));
|
|
250
|
+
return this;
|
|
251
|
+
}
|
|
252
|
+
redirect(source, destination, permanent = false) {
|
|
253
|
+
const redirectMiddleware = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async (ctx, next) => {
|
|
254
|
+
const normalizedSource = this.normalizePattern(source);
|
|
255
|
+
if (matchPattern(normalizedSource, ctx.pathname)) {
|
|
256
|
+
ctx.redirect(destination, permanent ? 308 : 307);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
return next();
|
|
260
|
+
}, "redirectMiddleware");
|
|
261
|
+
this.handlers.push(redirectMiddleware);
|
|
262
|
+
return this;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Rewrite the current middleware route to a new destination.
|
|
266
|
+
* Since each middleware file is route-specific, the source is automatically
|
|
267
|
+
* the middleware's route, so you only need to specify the destination.
|
|
268
|
+
*
|
|
269
|
+
* @param destination - The destination path to rewrite to
|
|
270
|
+
* @param condition - Optional boolean or function that evaluates to boolean.
|
|
271
|
+
* If provided and evaluates to false, rewrite is skipped.
|
|
272
|
+
* If not provided, rewrite always happens.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* // In /contact/middleware.ts
|
|
276
|
+
* .rewrite('/about') // Always rewrites /contact to /about
|
|
277
|
+
* .rewrite('/about', true) // Always rewrites
|
|
278
|
+
* .rewrite('/about', false) // Never rewrites
|
|
279
|
+
* .rewrite('/about', (ctx) => ctx.data.get('shouldRewrite')) // Conditional rewrite
|
|
280
|
+
*/
|
|
281
|
+
rewrite(destination, condition) {
|
|
282
|
+
const rewriteMiddleware = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async (ctx, next) => {
|
|
283
|
+
if (condition !== void 0) {
|
|
284
|
+
const shouldRewrite = typeof condition === "function" ? condition(ctx) : condition;
|
|
285
|
+
if (!shouldRewrite) {
|
|
286
|
+
return next();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (this.basePath !== "/") {
|
|
290
|
+
if (ctx.pathname === this.basePath) {
|
|
291
|
+
ctx.rewrite(destination);
|
|
292
|
+
} else if (ctx.pathname.startsWith(this.basePath + "/")) {
|
|
293
|
+
const subPath = ctx.pathname.slice(this.basePath.length);
|
|
294
|
+
const newPath = destination + subPath;
|
|
295
|
+
ctx.rewrite(newPath);
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
ctx.rewrite(destination);
|
|
299
|
+
}
|
|
300
|
+
return next();
|
|
301
|
+
}, "rewriteMiddleware");
|
|
302
|
+
this.handlers.push(rewriteMiddleware);
|
|
303
|
+
return this;
|
|
304
|
+
}
|
|
305
|
+
build() {
|
|
306
|
+
return {
|
|
307
|
+
handlers: this.handlers,
|
|
308
|
+
config: this.config
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, _MiddlewareChainImpl, "MiddlewareChainImpl");
|
|
313
|
+
var MiddlewareChainImpl = _MiddlewareChainImpl;
|
|
314
|
+
async function getRateLimitStatus(key, limit, storage = defaultRateLimitStorage) {
|
|
315
|
+
if (!Number.isSafeInteger(limit) || limit <= 0) {
|
|
316
|
+
throw new TypeError("Rate limit must be a positive safe integer.");
|
|
317
|
+
}
|
|
318
|
+
assertAtomicRateLimitStorage(storage);
|
|
319
|
+
if (typeof storage.get !== "function") {
|
|
320
|
+
throw new TypeError(
|
|
321
|
+
"getRateLimitStatus() requires a RateLimitStorage adapter that implements get(key)."
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
const record = await storage.get(key);
|
|
325
|
+
if (!record) {
|
|
326
|
+
return {
|
|
327
|
+
requests: 0,
|
|
328
|
+
limit,
|
|
329
|
+
remaining: limit,
|
|
330
|
+
resetIn: null,
|
|
331
|
+
resetAt: null,
|
|
332
|
+
isLimited: false
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
assertRateLimitIncrementResult(record);
|
|
336
|
+
const now = Date.now();
|
|
337
|
+
if (record.resetAt && now > record.resetAt) {
|
|
338
|
+
return {
|
|
339
|
+
requests: 0,
|
|
340
|
+
limit,
|
|
341
|
+
remaining: limit,
|
|
342
|
+
resetIn: null,
|
|
343
|
+
resetAt: null,
|
|
344
|
+
isLimited: false
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
const requests = record.count || 0;
|
|
348
|
+
const remaining = Math.max(0, limit - requests);
|
|
349
|
+
const isLimited = requests >= limit;
|
|
350
|
+
let resetIn = null;
|
|
351
|
+
let resetAt = null;
|
|
352
|
+
if (record.resetAt) {
|
|
353
|
+
const remainingMs = record.resetAt - now;
|
|
354
|
+
resetIn = remainingMs > 0 ? Math.ceil(remainingMs / 1e3) : null;
|
|
355
|
+
resetAt = new Date(record.resetAt);
|
|
356
|
+
}
|
|
357
|
+
return {
|
|
358
|
+
requests,
|
|
359
|
+
limit,
|
|
360
|
+
remaining,
|
|
361
|
+
resetIn,
|
|
362
|
+
resetAt,
|
|
363
|
+
isLimited
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, getRateLimitStatus, "getRateLimitStatus");
|
|
367
|
+
function middleware(basePath = "/") {
|
|
368
|
+
return new MiddlewareChainImpl(basePath);
|
|
369
|
+
}
|
|
370
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, middleware, "middleware");
|
|
371
|
+
|
|
372
|
+
// src/middleware/helpers.ts
|
|
373
|
+
function unwrapMiddleware(middleware2, defaults) {
|
|
374
|
+
if (!middleware2) {
|
|
375
|
+
return defaults || {};
|
|
376
|
+
}
|
|
377
|
+
const result = { ...defaults };
|
|
378
|
+
for (const [key, value] of middleware2.data) {
|
|
379
|
+
result[key] = value;
|
|
380
|
+
}
|
|
381
|
+
return result;
|
|
382
|
+
}
|
|
383
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, unwrapMiddleware, "unwrapMiddleware");
|
|
384
|
+
function getFromMiddleware(middleware2, key, defaultValue) {
|
|
385
|
+
if (!middleware2) {
|
|
386
|
+
return defaultValue;
|
|
387
|
+
}
|
|
388
|
+
const value = middleware2.data.get(key);
|
|
389
|
+
return value !== void 0 ? value : defaultValue;
|
|
390
|
+
}
|
|
391
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, getFromMiddleware, "getFromMiddleware");
|
|
392
|
+
function hasMiddlewareData(middleware2) {
|
|
393
|
+
if (!middleware2) return false;
|
|
394
|
+
return middleware2.data.size > 0;
|
|
395
|
+
}
|
|
396
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, hasMiddlewareData, "hasMiddlewareData");
|
|
397
|
+
|
|
398
|
+
// src/middleware/vite-plugin.ts
|
|
399
|
+
var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
|
|
400
|
+
var _path = require('path'); var _path2 = _interopRequireDefault(_path);
|
|
401
|
+
function getMiddlewareAppDirectory(root, srcDir) {
|
|
402
|
+
const sourceDirectory = _path2.default.join(root, srcDir);
|
|
403
|
+
const appDirectory = _path2.default.join(sourceDirectory, "app");
|
|
404
|
+
return _fs2.default.existsSync(appDirectory) ? appDirectory : sourceDirectory;
|
|
405
|
+
}
|
|
406
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, getMiddlewareAppDirectory, "getMiddlewareAppDirectory");
|
|
407
|
+
function farmMiddlewarePlugin(options = {}) {
|
|
408
|
+
const srcDir = _nullishCoalesce(options.srcDir, () => ( "src"));
|
|
409
|
+
let manager = null;
|
|
410
|
+
let discoveryComplete = false;
|
|
411
|
+
let discoveryPromise = null;
|
|
412
|
+
const discover = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async (server) => {
|
|
413
|
+
const i18n = _chunkHBTUGXHScjs.resolveFarmI18nConfig.call(void 0, false, {
|
|
414
|
+
root: server.config.root,
|
|
415
|
+
mode: server.config.mode === "production" ? "production" : "development",
|
|
416
|
+
basePath: _nullishCoalesce(options.basePath, () => ( "/"))
|
|
417
|
+
});
|
|
418
|
+
manager = new (0, _chunkY53ZSFN6cjs.MiddlewareManager)(
|
|
419
|
+
getMiddlewareAppDirectory(server.config.root, srcDir),
|
|
420
|
+
server,
|
|
421
|
+
void 0,
|
|
422
|
+
i18n
|
|
423
|
+
);
|
|
424
|
+
await manager.discover();
|
|
425
|
+
discoveryComplete = true;
|
|
426
|
+
}, "discover");
|
|
427
|
+
return {
|
|
428
|
+
name: "@farm.js/core:middleware",
|
|
429
|
+
enforce: "pre",
|
|
430
|
+
configureServer(server) {
|
|
431
|
+
discoveryPromise = discover(server);
|
|
432
|
+
void discoveryPromise.catch((error) => {
|
|
433
|
+
console.error("[FARM] Middleware discovery error:", error);
|
|
434
|
+
});
|
|
435
|
+
const execute = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async (req, res, _pathname, sharedData) => {
|
|
436
|
+
if (discoveryPromise) {
|
|
437
|
+
await discoveryPromise;
|
|
438
|
+
}
|
|
439
|
+
if (!manager) {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
const handled = await manager.execute(req, res);
|
|
443
|
+
const middlewareData = req.__FARM_MIDDLEWARE_DATA__;
|
|
444
|
+
if (sharedData && middlewareData instanceof Map) {
|
|
445
|
+
for (const [key, value] of middlewareData) {
|
|
446
|
+
sharedData.set(key, value);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return handled;
|
|
450
|
+
}, "execute");
|
|
451
|
+
server.__farmMiddleware__ = {
|
|
452
|
+
execute,
|
|
453
|
+
getMiddlewares: /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, () => _nullishCoalesce(_optionalChain([manager, 'optionalAccess', _4 => _4.getMiddlewares, 'call', _5 => _5()]), () => ( [])), "getMiddlewares"),
|
|
454
|
+
isReady: /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, () => discoveryComplete, "isReady"),
|
|
455
|
+
waitForDiscovery: /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, () => discoveryPromise, "waitForDiscovery")
|
|
456
|
+
};
|
|
457
|
+
},
|
|
458
|
+
async handleHotUpdate({ file, server, modules }) {
|
|
459
|
+
if (!/^middleware\.[tj]sx?$/.test(_path2.default.basename(file))) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
for (const module of modules) {
|
|
463
|
+
server.moduleGraph.invalidateModule(module);
|
|
464
|
+
}
|
|
465
|
+
await _optionalChain([manager, 'optionalAccess', _6 => _6.reload, 'call', _7 => _7()]);
|
|
466
|
+
server.ws.send({ type: "full-reload", path: "*" });
|
|
467
|
+
return [];
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, farmMiddlewarePlugin, "farmMiddlewarePlugin");
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
exports.UnsupportedRateLimitStorageError = UnsupportedRateLimitStorageError; exports.memoryRateLimitStorage = memoryRateLimitStorage; exports.getRateLimitStatus = getRateLimitStatus; exports.middleware = middleware; exports.unwrapMiddleware = unwrapMiddleware; exports.getFromMiddleware = getFromMiddleware; exports.hasMiddlewareData = hasMiddlewareData; exports.farmMiddlewarePlugin = farmMiddlewarePlugin;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
|
|
4
|
+
|
|
5
|
+
// src/theme/runtime.ts
|
|
6
|
+
var FALLBACK_CLIENT_SNAPSHOT = Object.freeze({
|
|
7
|
+
theme: "system",
|
|
8
|
+
resolvedTheme: "light",
|
|
9
|
+
mounted: true
|
|
10
|
+
});
|
|
11
|
+
var cachedClientSnapshot = FALLBACK_CLIENT_SNAPSHOT;
|
|
12
|
+
function snapshotsMatch(left, right) {
|
|
13
|
+
return left.theme === right.theme && left.resolvedTheme === right.resolvedTheme && left.mounted === right.mounted;
|
|
14
|
+
}
|
|
15
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, snapshotsMatch, "snapshotsMatch");
|
|
16
|
+
function getTheme() {
|
|
17
|
+
const next = typeof window === "undefined" ? FALLBACK_CLIENT_SNAPSHOT : _optionalChain([window, 'access', _ => _.__FARM_THEME__, 'optionalAccess', _2 => _2.snapshot]);
|
|
18
|
+
if (!next) return cachedClientSnapshot;
|
|
19
|
+
if (!snapshotsMatch(cachedClientSnapshot, next)) cachedClientSnapshot = next;
|
|
20
|
+
return cachedClientSnapshot;
|
|
21
|
+
}
|
|
22
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, getTheme, "getTheme");
|
|
23
|
+
function setTheme(theme) {
|
|
24
|
+
const runtime = typeof window === "undefined" ? void 0 : window.__FARM_THEME__;
|
|
25
|
+
if (!runtime) {
|
|
26
|
+
throw new Error("The FARMJS theme runtime is not enabled. Add `theme` to farm.config.ts.");
|
|
27
|
+
}
|
|
28
|
+
runtime.setTheme(theme);
|
|
29
|
+
}
|
|
30
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, setTheme, "setTheme");
|
|
31
|
+
function toggleTheme() {
|
|
32
|
+
const next = getTheme().resolvedTheme === "dark" ? "light" : "dark";
|
|
33
|
+
setTheme(next);
|
|
34
|
+
return next;
|
|
35
|
+
}
|
|
36
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, toggleTheme, "toggleTheme");
|
|
37
|
+
function subscribeTheme(listener) {
|
|
38
|
+
if (typeof window === "undefined") return () => {
|
|
39
|
+
};
|
|
40
|
+
const handleThemeChange = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, () => {
|
|
41
|
+
getTheme();
|
|
42
|
+
listener();
|
|
43
|
+
}, "handleThemeChange");
|
|
44
|
+
window.addEventListener("farm:themechange", handleThemeChange);
|
|
45
|
+
return () => window.removeEventListener("farm:themechange", handleThemeChange);
|
|
46
|
+
}
|
|
47
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, subscribeTheme, "subscribeTheme");
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
exports.getTheme = getTheme; exports.setTheme = setTheme; exports.toggleTheme = toggleTheme; exports.subscribeTheme = subscribeTheme;
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
compileFarmDocsAdapterEdgeManifest,
|
|
9
9
|
createFarmDocsAPIHandler
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-QBPKKQTD.mjs";
|
|
11
11
|
import {
|
|
12
12
|
FARM_DOCS_LAST_MODIFIED_MANIFEST,
|
|
13
13
|
createFarmDocsHandler,
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
loadFarmDocsPage,
|
|
18
18
|
resolveFarmDocsContentDir,
|
|
19
19
|
toFarmDocsMarkdownPage
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-HSDL2AUR.mjs";
|
|
21
21
|
import {
|
|
22
22
|
generateFarmDocsSearchClientRuntime,
|
|
23
23
|
isFarmDocsSearchEnabled,
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
getDeployTargetForPreset,
|
|
32
32
|
hasCustomFarmRouteContext,
|
|
33
33
|
resolveDeployOutputPath
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-V4AICMQA.mjs";
|
|
35
35
|
import {
|
|
36
36
|
resolveFarmInstrumentationFile
|
|
37
37
|
} from "./chunk-F5D4XEAS.mjs";
|
|
@@ -64,13 +64,13 @@ import {
|
|
|
64
64
|
resolveFarmClientCacheAdapterEntry,
|
|
65
65
|
resolveFarmIsolatedClientHydrationMode,
|
|
66
66
|
resolveFarmNotFoundComponentPath
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-WZXN4R5Y.mjs";
|
|
68
68
|
import {
|
|
69
69
|
findRequestBoundSourceBlockers,
|
|
70
70
|
generateFarmTypeArtifacts,
|
|
71
71
|
parseRouteRenderingDirective,
|
|
72
72
|
resolveRouteRenderingConfigFromFile
|
|
73
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-2ANEVVF7.mjs";
|
|
74
74
|
import {
|
|
75
75
|
isFarmPreviewDeploymentEnvironment
|
|
76
76
|
} from "./chunk-BOYNDCZL.mjs";
|
|
@@ -97,7 +97,7 @@ import {
|
|
|
97
97
|
} from "./chunk-OLYK7EAK.mjs";
|
|
98
98
|
import {
|
|
99
99
|
applyFarmCspHashesToHtml
|
|
100
|
-
} from "./chunk-
|
|
100
|
+
} from "./chunk-7BC6GAL7.mjs";
|
|
101
101
|
import {
|
|
102
102
|
applyFarmCronVercelCrons,
|
|
103
103
|
createFarmCronCloudflareConfig,
|
|
@@ -109,7 +109,7 @@ import {
|
|
|
109
109
|
} from "./chunk-4OOBRCJX.mjs";
|
|
110
110
|
import {
|
|
111
111
|
isFarmMarkdownPageFile
|
|
112
|
-
} from "./chunk-
|
|
112
|
+
} from "./chunk-N255VYFP.mjs";
|
|
113
113
|
import {
|
|
114
114
|
resolveFarmMdxComponentsModulePath,
|
|
115
115
|
resolveMdxConfig
|