@farm.js/core 0.1.17 → 0.1.18
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/cache.cjs +38 -1560
- package/dist/chunk-22GUSVNJ.cjs +351 -0
- package/dist/chunk-2CQ74SP6.cjs +13 -0
- package/dist/chunk-2SJ4RQ6P.cjs +57 -0
- package/dist/chunk-3376ZTRC.cjs +1 -0
- package/dist/{chunk-YD4J4XCI.mjs → chunk-3XG26Z3J.mjs} +1 -1
- 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-7W3CPVXS.cjs +24 -0
- package/dist/chunk-A6WIQH5Z.cjs +31 -0
- package/dist/chunk-AFOD3LYZ.cjs +377 -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-AWRISO2H.cjs +2199 -0
- package/dist/chunk-AYJR42WX.cjs +711 -0
- package/dist/chunk-B4CH33IG.cjs +644 -0
- package/dist/chunk-BIDYX3SL.cjs +91 -0
- package/dist/chunk-BSTRERPP.cjs +40 -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-E2BMSZ2W.cjs +151 -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-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-GNEO2XOF.cjs +2040 -0
- package/dist/{chunk-56DAX2BE.mjs → chunk-GYKJCFTS.mjs} +1 -1
- package/dist/chunk-H6G5INWM.cjs +1094 -0
- package/dist/chunk-HBTUGXHS.cjs +180 -0
- package/dist/chunk-HREOKQWT.cjs +45 -0
- package/dist/chunk-I4J452B7.cjs +435 -0
- package/dist/chunk-I57LW5VZ.cjs +94 -0
- package/dist/chunk-I7PUUDGY.cjs +389 -0
- package/dist/chunk-IAMRBF3Z.cjs +86 -0
- package/dist/chunk-IKNRN4VS.cjs +14214 -0
- package/dist/chunk-IQXFRNY2.cjs +169 -0
- package/dist/chunk-IXTFU4PL.cjs +2355 -0
- package/dist/chunk-J2OP5GG3.cjs +725 -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-MVIWBEJF.mjs → chunk-KPNVGRBL.mjs} +1 -1
- package/dist/chunk-KR6CKSXT.cjs +15 -0
- package/dist/chunk-KROWKCUH.cjs +185 -0
- package/dist/chunk-KVFPGF2M.cjs +46 -0
- 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-MWSK6C4J.cjs +18 -0
- package/dist/chunk-MWWVKDW3.cjs +169 -0
- package/dist/chunk-NO3WWW3N.cjs +192 -0
- package/dist/chunk-NV3A5DXM.cjs +862 -0
- package/dist/chunk-NWOD6NIT.cjs +9 -0
- package/dist/chunk-NZKJGRB3.cjs +230 -0
- package/dist/chunk-OAVTUMJP.cjs +1496 -0
- package/dist/chunk-OHY2ZWUG.cjs +25 -0
- package/dist/chunk-OI6CMLWX.cjs +47 -0
- package/dist/chunk-OIEOCXKG.cjs +453 -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-OYEUREB6.cjs +35 -0
- package/dist/chunk-PCOTGFSM.cjs +139 -0
- package/dist/chunk-PZYCPSCC.cjs +35 -0
- package/dist/chunk-QBK2AA4U.cjs +445 -0
- 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-RG3ZOTG5.cjs +34 -0
- package/dist/chunk-ROUTX2E5.cjs +390 -0
- package/dist/chunk-RTHIVJ2G.cjs +54 -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-TWGMSEHX.cjs +525 -0
- package/dist/chunk-TYQUSXUG.cjs +1357 -0
- package/dist/chunk-U4KT7QP3.cjs +23 -0
- package/dist/chunk-UJ2C4ICS.cjs +277 -0
- package/dist/chunk-UN5GHC5V.cjs +10244 -0
- package/dist/chunk-UQZ4AYTH.cjs +168 -0
- package/dist/chunk-US2QVW3E.cjs +36 -0
- 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-WZMNW2IW.cjs +1415 -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-OUIPHVV6.cjs +388 -0
- package/dist/devtools-client-4WAPJY5L.cjs +254 -0
- package/dist/devtools-ui-5GBDIGMK.cjs +1296 -0
- package/dist/docs.cjs +46 -5657
- 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 +3 -3
- 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/build-runtime.cjs +120 -52259
- package/dist/internal/build-runtime.mjs +3 -3
- package/dist/internal/cli-runtime.cjs +67 -13811
- 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/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/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/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 +2 -2
- 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-MXSZMVDG.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 +2 -2
- 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 +2 -2
- package/dist/workflows.cjs +19 -1040
- package/package.json +1 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
var _chunkTIWHTW3Qcjs = require('./chunk-TIWHTW3Q.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
|
|
7
|
+
|
|
8
|
+
// src/env-types.ts
|
|
9
|
+
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
10
|
+
var _path = require('path'); var path = _interopRequireWildcard(_path);
|
|
11
|
+
var DEFAULT_OUT_FILE = "farm-env.d.ts";
|
|
12
|
+
var CONFIG_FILENAMES = [
|
|
13
|
+
"farm.config.ts",
|
|
14
|
+
"farm.config.tsx",
|
|
15
|
+
"farm.config.mts",
|
|
16
|
+
"farm.config.cts",
|
|
17
|
+
"farm.config.js",
|
|
18
|
+
"farm.config.jsx",
|
|
19
|
+
"farm.config.mjs",
|
|
20
|
+
"farm.config.cjs",
|
|
21
|
+
"config.ts",
|
|
22
|
+
"config.tsx",
|
|
23
|
+
"config.mts",
|
|
24
|
+
"config.cts",
|
|
25
|
+
"config.js",
|
|
26
|
+
"config.jsx",
|
|
27
|
+
"config.mjs",
|
|
28
|
+
"config.cjs"
|
|
29
|
+
];
|
|
30
|
+
async function generateEnvTypes(options) {
|
|
31
|
+
const root = path.resolve(options.root);
|
|
32
|
+
const srcDir = options.srcDir || "src";
|
|
33
|
+
const outFile = options.outFile || DEFAULT_OUT_FILE;
|
|
34
|
+
const outPath = path.isAbsolute(outFile) ? outFile : path.join(root, srcDir, outFile);
|
|
35
|
+
const content = createEnvTypeDeclarations(options, outPath);
|
|
36
|
+
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
37
|
+
_chunkTIWHTW3Qcjs.writeFileIfChanged.call(void 0, outPath, content);
|
|
38
|
+
return outPath;
|
|
39
|
+
}
|
|
40
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, generateEnvTypes, "generateEnvTypes");
|
|
41
|
+
function createEnvTypeDeclarations(options, outPath) {
|
|
42
|
+
const root = path.resolve(options.root);
|
|
43
|
+
const configPath = findConfigPath(root, options.configPath);
|
|
44
|
+
const configPaths = [
|
|
45
|
+
...(_nullishCoalesce(options.layerConfigPaths, () => ( []))).filter((value) => fs.existsSync(value)),
|
|
46
|
+
...configPath ? [configPath] : []
|
|
47
|
+
];
|
|
48
|
+
const content = configPaths.length > 1 ? createLayeredConfigBackedEnvTypes(outPath, configPaths) : configPaths.length === 1 ? createConfigBackedEnvTypes(outPath, configPaths[0]) : createEmptyEnvTypes();
|
|
49
|
+
return content;
|
|
50
|
+
}
|
|
51
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createEnvTypeDeclarations, "createEnvTypeDeclarations");
|
|
52
|
+
function createLayeredConfigBackedEnvTypes(outPath, configPaths) {
|
|
53
|
+
const imports = configPaths.map(
|
|
54
|
+
(configPath, index) => `import type FarmConfig${index} from ${JSON.stringify(toTypeImportPath(outPath, configPath))};`
|
|
55
|
+
).join("\n");
|
|
56
|
+
const resolvedTypes = configPaths.map(
|
|
57
|
+
(_configPath, index) => `
|
|
58
|
+
type FarmConfigEnv${index} = typeof FarmConfig${index} extends { env?: infer TEnv }
|
|
59
|
+
? NonNullable<TEnv>
|
|
60
|
+
: never;
|
|
61
|
+
type FarmResolvedEnv${index} = [FarmConfigEnv${index}] extends [never]
|
|
62
|
+
? { server: {}; public: {} }
|
|
63
|
+
: InferEnv<FarmConfigEnv${index}>;`
|
|
64
|
+
).join("\n");
|
|
65
|
+
const mergedTypes = configPaths.slice(1).map(
|
|
66
|
+
(_configPath, index) => `type FarmMergedEnv${index + 1} = MergeFarmEnv<${index === 0 ? "FarmResolvedEnv0" : `FarmMergedEnv${index}`}, FarmResolvedEnv${index + 1}>;`
|
|
67
|
+
).join("\n");
|
|
68
|
+
const finalType = `FarmMergedEnv${configPaths.length - 1}`;
|
|
69
|
+
return `/**
|
|
70
|
+
* Auto-generated env types from Farm layers and farm.config.
|
|
71
|
+
* Regenerated on dev start, build, and farm generate.
|
|
72
|
+
*/
|
|
73
|
+
${imports}
|
|
74
|
+
import type { InferEnv } from "@farm.js/core/env";
|
|
75
|
+
|
|
76
|
+
type MergeFarmEnv<TBase, TOverride> = {
|
|
77
|
+
server: Omit<TBase extends { server: infer T } ? T : {}, keyof (TOverride extends { server: infer T } ? T : {})> &
|
|
78
|
+
(TOverride extends { server: infer T } ? T : {});
|
|
79
|
+
public: Omit<TBase extends { public: infer T } ? T : {}, keyof (TOverride extends { public: infer T } ? T : {})> &
|
|
80
|
+
(TOverride extends { public: infer T } ? T : {});
|
|
81
|
+
};
|
|
82
|
+
${resolvedTypes}
|
|
83
|
+
${mergedTypes}
|
|
84
|
+
|
|
85
|
+
type FarmResolvedEnv = ${finalType};
|
|
86
|
+
|
|
87
|
+
declare module "@farm.js/core/env" {
|
|
88
|
+
interface FarmEnvTypes {
|
|
89
|
+
server: FarmResolvedEnv["server"];
|
|
90
|
+
public: FarmResolvedEnv["public"];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
declare module "@farm.js/core" {
|
|
95
|
+
interface FarmEnvTypes {
|
|
96
|
+
server: FarmResolvedEnv["server"];
|
|
97
|
+
public: FarmResolvedEnv["public"];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export {};
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
104
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createLayeredConfigBackedEnvTypes, "createLayeredConfigBackedEnvTypes");
|
|
105
|
+
function findConfigPath(root, configPath) {
|
|
106
|
+
if (configPath) {
|
|
107
|
+
const resolvedPath = path.isAbsolute(configPath) ? configPath : path.join(root, configPath);
|
|
108
|
+
return fs.existsSync(resolvedPath) ? resolvedPath : null;
|
|
109
|
+
}
|
|
110
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
111
|
+
const resolvedPath = path.join(root, filename);
|
|
112
|
+
if (fs.existsSync(resolvedPath)) {
|
|
113
|
+
return resolvedPath;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, findConfigPath, "findConfigPath");
|
|
119
|
+
function createConfigBackedEnvTypes(outPath, configPath) {
|
|
120
|
+
const configImportPath = toTypeImportPath(outPath, configPath);
|
|
121
|
+
return `/**
|
|
122
|
+
* Auto-generated env types from farm.config.
|
|
123
|
+
* Regenerated on dev start, build, and farm generate.
|
|
124
|
+
*/
|
|
125
|
+
import type FarmConfig from ${JSON.stringify(configImportPath)};
|
|
126
|
+
import type { InferEnv } from "@farm.js/core/env";
|
|
127
|
+
|
|
128
|
+
type FarmConfigEnv = typeof FarmConfig extends { env?: infer TEnv } ? NonNullable<TEnv> : never;
|
|
129
|
+
type FarmResolvedEnv = [FarmConfigEnv] extends [never]
|
|
130
|
+
? { server: {}; public: {} }
|
|
131
|
+
: InferEnv<FarmConfigEnv>;
|
|
132
|
+
|
|
133
|
+
declare module "@farm.js/core/env" {
|
|
134
|
+
interface FarmEnvTypes {
|
|
135
|
+
server: FarmResolvedEnv["server"];
|
|
136
|
+
public: FarmResolvedEnv["public"];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
declare module "@farm.js/core" {
|
|
141
|
+
interface FarmEnvTypes {
|
|
142
|
+
server: FarmResolvedEnv["server"];
|
|
143
|
+
public: FarmResolvedEnv["public"];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export {};
|
|
148
|
+
`;
|
|
149
|
+
}
|
|
150
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createConfigBackedEnvTypes, "createConfigBackedEnvTypes");
|
|
151
|
+
function createEmptyEnvTypes() {
|
|
152
|
+
return `/**
|
|
153
|
+
* Auto-generated env types from farm.config.
|
|
154
|
+
* Regenerated on dev start, build, and farm generate.
|
|
155
|
+
*/
|
|
156
|
+
declare module "@farm.js/core/env" {
|
|
157
|
+
interface FarmEnvTypes {
|
|
158
|
+
server: {};
|
|
159
|
+
public: {};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
declare module "@farm.js/core" {
|
|
164
|
+
interface FarmEnvTypes {
|
|
165
|
+
server: {};
|
|
166
|
+
public: {};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export {};
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createEmptyEnvTypes, "createEmptyEnvTypes");
|
|
174
|
+
function toTypeImportPath(outPath, targetPath) {
|
|
175
|
+
const relativePath = path.relative(path.dirname(outPath), targetPath).replace(/\\/g, "/").replace(/\.(tsx?|jsx?|mjs|cjs|mts|cts)$/, "");
|
|
176
|
+
return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
|
|
177
|
+
}
|
|
178
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, toTypeImportPath, "toTypeImportPath");
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
exports.generateEnvTypes = generateEnvTypes; exports.createEnvTypeDeclarations = createEnvTypeDeclarations;
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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 _chunkJDNHKPTDcjs = require('./chunk-JDNHKPTD.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkCMGMGHUZcjs = require('./chunk-CMGMGHUZ.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
var _chunk5QIKR7RRcjs = require('./chunk-5QIKR7RR.cjs');
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
|
|
14
|
+
|
|
15
|
+
// src/cron.ts
|
|
16
|
+
var DEFAULT_FARM_CRON_SECRET_ENV = "CRON_SECRET";
|
|
17
|
+
var FARM_CRON_MANIFEST = "cron-manifest.json";
|
|
18
|
+
var CRON_FIELD_RANGES = [
|
|
19
|
+
[0, 59, "minute"],
|
|
20
|
+
[0, 23, "hour"],
|
|
21
|
+
[1, 31, "day of month"],
|
|
22
|
+
[1, 12, "month"],
|
|
23
|
+
[0, 6, "day of week"]
|
|
24
|
+
];
|
|
25
|
+
function resolveCronConfig(cron) {
|
|
26
|
+
if (isResolvedCronConfig(cron)) return cron;
|
|
27
|
+
if (!cron) {
|
|
28
|
+
return {
|
|
29
|
+
enabled: false,
|
|
30
|
+
secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,
|
|
31
|
+
jobs: []
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const jobs = [];
|
|
35
|
+
for (const [name, job] of Object.entries(cron)) {
|
|
36
|
+
if (!job || typeof job !== "object" || Array.isArray(job)) {
|
|
37
|
+
throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);
|
|
38
|
+
}
|
|
39
|
+
if (job.enabled === false) continue;
|
|
40
|
+
jobs.push(normalizeCronJob(name, job));
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
enabled: jobs.length > 0,
|
|
44
|
+
secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,
|
|
45
|
+
jobs
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, resolveCronConfig, "resolveCronConfig");
|
|
49
|
+
async function prepareFarmCronForNitro(config) {
|
|
50
|
+
const cron = isResolvedCronConfig(config.cron) ? config.cron : resolveCronConfig(config.cron);
|
|
51
|
+
const root = config.root || process.cwd();
|
|
52
|
+
const distDir = config.distDir || ".farm";
|
|
53
|
+
const fs = await import("fs/promises");
|
|
54
|
+
const path = await import("path");
|
|
55
|
+
const manifestPath = path.join(root, distDir, FARM_CRON_MANIFEST);
|
|
56
|
+
const generatedDir = path.join(root, distDir, ".nitro", "farm-cron");
|
|
57
|
+
if (!cron.enabled) {
|
|
58
|
+
await Promise.all([
|
|
59
|
+
fs.rm(manifestPath, { force: true }),
|
|
60
|
+
fs.rm(generatedDir, { recursive: true, force: true })
|
|
61
|
+
]);
|
|
62
|
+
return {
|
|
63
|
+
jobs: [],
|
|
64
|
+
tasks: {},
|
|
65
|
+
scheduledTasks: {}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
await fs.rm(generatedDir, { recursive: true, force: true });
|
|
69
|
+
await fs.mkdir(generatedDir, { recursive: true });
|
|
70
|
+
const tasks = {};
|
|
71
|
+
const wrapperNames = resolveCronWrapperFileNames(cron.jobs.map((job) => job.name));
|
|
72
|
+
for (const job of cron.jobs) {
|
|
73
|
+
const taskName = getFarmCronTaskName(job.name);
|
|
74
|
+
const wrapperPath = _chunk5QIKR7RRcjs.toPosixPath.call(void 0, path.join(generatedDir, `${wrapperNames.get(job.name)}.mjs`));
|
|
75
|
+
await fs.writeFile(wrapperPath, createNitroCronTaskWrapper(job, cron.secretEnv), "utf8");
|
|
76
|
+
tasks[taskName] = {
|
|
77
|
+
handler: wrapperPath,
|
|
78
|
+
description: job.description || `Farm cron ${job.name}`
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const manifest = createFarmCronManifest(cron);
|
|
82
|
+
await fs.mkdir(path.dirname(manifestPath), { recursive: true });
|
|
83
|
+
await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}
|
|
84
|
+
`, "utf8");
|
|
85
|
+
return {
|
|
86
|
+
jobs: cron.jobs,
|
|
87
|
+
tasks,
|
|
88
|
+
scheduledTasks: createCronScheduledTasks(cron.jobs),
|
|
89
|
+
manifestPath
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, prepareFarmCronForNitro, "prepareFarmCronForNitro");
|
|
93
|
+
function createFarmCronManifest(cron) {
|
|
94
|
+
return {
|
|
95
|
+
schemaVersion: 1,
|
|
96
|
+
secretEnv: cron.secretEnv,
|
|
97
|
+
jobs: cron.jobs.map((job) => ({
|
|
98
|
+
name: job.name,
|
|
99
|
+
schedule: job.schedule,
|
|
100
|
+
path: job.path,
|
|
101
|
+
description: job.description || null
|
|
102
|
+
}))
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createFarmCronManifest, "createFarmCronManifest");
|
|
106
|
+
function createFarmCronVercelCrons(jobs) {
|
|
107
|
+
return jobs.flatMap(
|
|
108
|
+
(job) => job.schedule.map((schedule) => ({
|
|
109
|
+
path: job.path,
|
|
110
|
+
schedule
|
|
111
|
+
}))
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createFarmCronVercelCrons, "createFarmCronVercelCrons");
|
|
115
|
+
function applyFarmCronVercelCrons(vercelConfig, jobs) {
|
|
116
|
+
const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];
|
|
117
|
+
const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));
|
|
118
|
+
const crons = [...existingCrons];
|
|
119
|
+
for (const cron of createFarmCronVercelCrons(jobs)) {
|
|
120
|
+
const key = `${cron.path}:${cron.schedule}`;
|
|
121
|
+
if (seen.has(key)) continue;
|
|
122
|
+
seen.add(key);
|
|
123
|
+
crons.push(cron);
|
|
124
|
+
}
|
|
125
|
+
return crons.length > 0 ? { ...vercelConfig, crons } : vercelConfig;
|
|
126
|
+
}
|
|
127
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, applyFarmCronVercelCrons, "applyFarmCronVercelCrons");
|
|
128
|
+
function createFarmCronCloudflareTriggers(jobs) {
|
|
129
|
+
return [...new Set(jobs.flatMap((job) => job.schedule))];
|
|
130
|
+
}
|
|
131
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createFarmCronCloudflareTriggers, "createFarmCronCloudflareTriggers");
|
|
132
|
+
function createFarmCronCloudflareConfig(jobs) {
|
|
133
|
+
const crons = createFarmCronCloudflareTriggers(jobs);
|
|
134
|
+
if (crons.length === 0) return void 0;
|
|
135
|
+
return {
|
|
136
|
+
deployConfig: true,
|
|
137
|
+
wrangler: {
|
|
138
|
+
triggers: { crons }
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createFarmCronCloudflareConfig, "createFarmCronCloudflareConfig");
|
|
143
|
+
function mergeScheduledTasks(...maps) {
|
|
144
|
+
const merged = /* @__PURE__ */ new Map();
|
|
145
|
+
for (const map of maps) {
|
|
146
|
+
for (const [schedule, taskNames] of Object.entries(map || {})) {
|
|
147
|
+
const current = merged.get(schedule) || [];
|
|
148
|
+
for (const taskName of Array.isArray(taskNames) ? taskNames : [taskNames]) {
|
|
149
|
+
if (!current.includes(taskName)) current.push(taskName);
|
|
150
|
+
}
|
|
151
|
+
merged.set(schedule, current);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return Object.fromEntries(
|
|
155
|
+
[...merged].map(([schedule, taskNames]) => [
|
|
156
|
+
schedule,
|
|
157
|
+
taskNames.length === 1 ? taskNames[0] : taskNames
|
|
158
|
+
])
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, mergeScheduledTasks, "mergeScheduledTasks");
|
|
162
|
+
function isExplicitDevelopmentEnv() {
|
|
163
|
+
const nodeEnv = _chunkCMGMGHUZcjs.readFarmEnvironmentValue.call(void 0, "NODE_ENV");
|
|
164
|
+
return nodeEnv === "development" || nodeEnv === "test";
|
|
165
|
+
}
|
|
166
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, isExplicitDevelopmentEnv, "isExplicitDevelopmentEnv");
|
|
167
|
+
function isCronRequestAuthorized(request, options = {}) {
|
|
168
|
+
const secretEnv = options.secretEnv || DEFAULT_FARM_CRON_SECRET_ENV;
|
|
169
|
+
const secret = options.secret || _chunkCMGMGHUZcjs.readFarmEnvironmentValue.call(void 0, secretEnv);
|
|
170
|
+
if (!secret) {
|
|
171
|
+
return options.allowUnsecured === true || !_chunkCMGMGHUZcjs.getFarmRuntimeBindings.call(void 0, ) && isExplicitDevelopmentEnv();
|
|
172
|
+
}
|
|
173
|
+
const authorization = request.headers.get("authorization") || "";
|
|
174
|
+
const bearer = _optionalChain([/^Bearer (.*)$/i, 'access', _ => _.exec, 'call', _2 => _2(authorization), 'optionalAccess', _3 => _3[1]]) || "";
|
|
175
|
+
const headerSecret = request.headers.get("x-farm-cron-secret") || "";
|
|
176
|
+
return _chunkJDNHKPTDcjs.farmSecretsMatch.call(void 0, bearer, secret) || _chunkJDNHKPTDcjs.farmSecretsMatch.call(void 0, headerSecret, secret);
|
|
177
|
+
}
|
|
178
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, isCronRequestAuthorized, "isCronRequestAuthorized");
|
|
179
|
+
function cronRoute(handler, options = {}) {
|
|
180
|
+
return (request, ...args) => {
|
|
181
|
+
if (!isCronRequestAuthorized(request, options)) {
|
|
182
|
+
return Promise.resolve(
|
|
183
|
+
Response.json({ error: "Unauthorized cron request." }, { status: 401 })
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
return handler(request, ...args);
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, cronRoute, "cronRoute");
|
|
190
|
+
function normalizeCronJob(name, job) {
|
|
191
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {
|
|
192
|
+
throw new TypeError(
|
|
193
|
+
`Farm cron name ${JSON.stringify(name)} must start with a letter or number and contain only letters, numbers, dots, underscores, or hyphens.`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
if (!job || typeof job !== "object" || Array.isArray(job)) {
|
|
197
|
+
throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);
|
|
198
|
+
}
|
|
199
|
+
const path = normalizeCronPath(name, job.path);
|
|
200
|
+
const rawSchedule = Array.isArray(job.schedule) ? job.schedule : [job.schedule];
|
|
201
|
+
const schedule = [...new Set(rawSchedule.map((value) => normalizeCronExpression(name, value)))];
|
|
202
|
+
if (schedule.length === 0) {
|
|
203
|
+
throw new TypeError(`Farm cron ${JSON.stringify(name)} must define at least one schedule.`);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
name,
|
|
207
|
+
schedule,
|
|
208
|
+
path,
|
|
209
|
+
description: _optionalChain([job, 'access', _4 => _4.description, 'optionalAccess', _5 => _5.trim, 'call', _6 => _6()]) || void 0
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, normalizeCronJob, "normalizeCronJob");
|
|
213
|
+
function normalizeCronPath(name, value) {
|
|
214
|
+
if (typeof value !== "string" || !value.trim().startsWith("/")) {
|
|
215
|
+
throw new TypeError(`Farm cron ${JSON.stringify(name)} path must start with "/".`);
|
|
216
|
+
}
|
|
217
|
+
const hasUnstableCharacters = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, (candidate) => candidate.includes("\\") || Array.from(candidate).some((character) => {
|
|
218
|
+
const code = character.charCodeAt(0);
|
|
219
|
+
return code <= 31 || code >= 127 && code <= 159;
|
|
220
|
+
}), "hasUnstableCharacters");
|
|
221
|
+
if (hasUnstableCharacters(value)) {
|
|
222
|
+
throw new TypeError(
|
|
223
|
+
`Farm cron ${JSON.stringify(name)} path cannot contain backslashes or control characters.`
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
const path = value.trim();
|
|
227
|
+
if (path.startsWith("//") || path.includes("?") || path.includes("#")) {
|
|
228
|
+
throw new TypeError(
|
|
229
|
+
`Farm cron ${JSON.stringify(name)} path must be an application pathname without a host, query, or hash.`
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
for (const segment of path.split("/")) {
|
|
233
|
+
let decoded = segment;
|
|
234
|
+
try {
|
|
235
|
+
decoded = decodeURIComponent(segment);
|
|
236
|
+
} catch (e) {
|
|
237
|
+
}
|
|
238
|
+
if (hasUnstableCharacters(decoded)) {
|
|
239
|
+
throw new TypeError(
|
|
240
|
+
`Farm cron ${JSON.stringify(name)} path cannot contain backslashes or control characters.`
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
if (decoded.includes("/")) {
|
|
244
|
+
throw new TypeError(
|
|
245
|
+
`Farm cron ${JSON.stringify(name)} path cannot contain percent-encoded path separators.`
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
if (decoded === "." || decoded === "..") {
|
|
249
|
+
throw new TypeError(
|
|
250
|
+
`Farm cron ${JSON.stringify(name)} path cannot contain "." or ".." path segments.`
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return path.length > 1 ? path.replace(/\/+$/, "") : path;
|
|
255
|
+
}
|
|
256
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, normalizeCronPath, "normalizeCronPath");
|
|
257
|
+
function normalizeCronExpression(name, value) {
|
|
258
|
+
if (typeof value !== "string") {
|
|
259
|
+
throw new TypeError(`Farm cron ${JSON.stringify(name)} schedule must be a string.`);
|
|
260
|
+
}
|
|
261
|
+
const expression = value.trim().replace(/\s+/g, " ");
|
|
262
|
+
const fields = expression.split(" ");
|
|
263
|
+
if (fields.length !== CRON_FIELD_RANGES.length) {
|
|
264
|
+
throw new TypeError(
|
|
265
|
+
`Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} must use five fields: minute hour day-of-month month day-of-week.`
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
fields.forEach((field, index) => {
|
|
269
|
+
const [minimum, maximum, label] = CRON_FIELD_RANGES[index];
|
|
270
|
+
validateCronField(name, expression, field, minimum, maximum, label);
|
|
271
|
+
});
|
|
272
|
+
if (fields[2] !== "*" && fields[4] !== "*") {
|
|
273
|
+
throw new TypeError(
|
|
274
|
+
`Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} cannot constrain both day-of-month and day-of-week.`
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
return expression;
|
|
278
|
+
}
|
|
279
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, normalizeCronExpression, "normalizeCronExpression");
|
|
280
|
+
function validateCronField(name, expression, field, minimum, maximum, label) {
|
|
281
|
+
for (const segment of field.split(",")) {
|
|
282
|
+
const [range, stepText, ...extra] = segment.split("/");
|
|
283
|
+
if (!range || extra.length > 0 || stepText !== void 0 && !isIntegerInRange(stepText, 1)) {
|
|
284
|
+
throwInvalidCronField(name, expression, label);
|
|
285
|
+
}
|
|
286
|
+
if (range === "*") continue;
|
|
287
|
+
const bounds = range.split("-");
|
|
288
|
+
if (bounds.length > 2 || !bounds.every((value) => isIntegerInRange(value, minimum, maximum))) {
|
|
289
|
+
throwInvalidCronField(name, expression, label);
|
|
290
|
+
}
|
|
291
|
+
if (bounds.length === 2 && Number(bounds[0]) > Number(bounds[1])) {
|
|
292
|
+
throwInvalidCronField(name, expression, label);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, validateCronField, "validateCronField");
|
|
297
|
+
function isIntegerInRange(value, minimum, maximum = Number.MAX_SAFE_INTEGER) {
|
|
298
|
+
if (!/^\d+$/.test(value)) return false;
|
|
299
|
+
const parsed = Number(value);
|
|
300
|
+
return parsed >= minimum && parsed <= maximum;
|
|
301
|
+
}
|
|
302
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, isIntegerInRange, "isIntegerInRange");
|
|
303
|
+
function throwInvalidCronField(name, expression, label) {
|
|
304
|
+
throw new TypeError(
|
|
305
|
+
`Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} has an invalid ${label} field.`
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, throwInvalidCronField, "throwInvalidCronField");
|
|
309
|
+
function isResolvedCronConfig(value) {
|
|
310
|
+
return !!value && typeof value === "object" && "enabled" in value && typeof value.enabled === "boolean" && "jobs" in value && Array.isArray(value.jobs) && "secretEnv" in value;
|
|
311
|
+
}
|
|
312
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, isResolvedCronConfig, "isResolvedCronConfig");
|
|
313
|
+
function createCronScheduledTasks(jobs) {
|
|
314
|
+
const scheduledTasks = {};
|
|
315
|
+
for (const job of jobs) {
|
|
316
|
+
const taskName = getFarmCronTaskName(job.name);
|
|
317
|
+
for (const schedule of job.schedule) {
|
|
318
|
+
scheduledTasks[schedule] = mergeTaskNames(scheduledTasks[schedule], taskName);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return scheduledTasks;
|
|
322
|
+
}
|
|
323
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createCronScheduledTasks, "createCronScheduledTasks");
|
|
324
|
+
function mergeTaskNames(current, taskName) {
|
|
325
|
+
if (!current) return taskName;
|
|
326
|
+
const names = Array.isArray(current) ? current : [current];
|
|
327
|
+
return names.includes(taskName) ? names : [...names, taskName];
|
|
328
|
+
}
|
|
329
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, mergeTaskNames, "mergeTaskNames");
|
|
330
|
+
function getFarmCronTaskName(name) {
|
|
331
|
+
return `farm:cron:${name}`;
|
|
332
|
+
}
|
|
333
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, getFarmCronTaskName, "getFarmCronTaskName");
|
|
334
|
+
function createNitroCronTaskWrapper(job, secretEnv) {
|
|
335
|
+
return `
|
|
336
|
+
import { useNitroApp } from "nitro/app";
|
|
337
|
+
import { defineTask } from "nitro/task";
|
|
338
|
+
|
|
339
|
+
const name = ${JSON.stringify(job.name)};
|
|
340
|
+
const path = ${JSON.stringify(job.path)};
|
|
341
|
+
const secretEnv = ${JSON.stringify(secretEnv)};
|
|
342
|
+
|
|
343
|
+
function readSecret(event) {
|
|
344
|
+
const runtimeEnv = event?.context?.cloudflare?.env || event?.context?.env || {};
|
|
345
|
+
return runtimeEnv[secretEnv] || (typeof process !== "undefined" ? process.env?.[secretEnv] : "") || "";
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export default defineTask({
|
|
349
|
+
meta: {
|
|
350
|
+
name: ${JSON.stringify(getFarmCronTaskName(job.name))},
|
|
351
|
+
description: ${JSON.stringify(job.description || `Farm cron ${job.name}`)}
|
|
352
|
+
},
|
|
353
|
+
async run(event) {
|
|
354
|
+
const headers = new Headers({
|
|
355
|
+
"x-farm-cron-name": name,
|
|
356
|
+
"x-farm-cron-scheduled-at": String(event?.payload?.scheduledTime || Date.now())
|
|
357
|
+
});
|
|
358
|
+
const secret = readSecret(event);
|
|
359
|
+
if (secret) headers.set("authorization", "Bearer " + secret);
|
|
360
|
+
|
|
361
|
+
const response = await useNitroApp().fetch(path, { method: "GET", headers });
|
|
362
|
+
const contentType = response.headers.get("content-type") || "";
|
|
363
|
+
const body = response.status === 204
|
|
364
|
+
? null
|
|
365
|
+
: contentType.includes("application/json")
|
|
366
|
+
? await response.json().catch(() => null)
|
|
367
|
+
: await response.text();
|
|
368
|
+
|
|
369
|
+
if (!response.ok) {
|
|
370
|
+
const detail = typeof body === "string" ? body : JSON.stringify(body);
|
|
371
|
+
throw new Error(
|
|
372
|
+
"Farm cron " + JSON.stringify(name) + " received " + response.status +
|
|
373
|
+
" from " + path + (detail ? ": " + detail : "")
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return { result: body };
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
`.trim();
|
|
381
|
+
}
|
|
382
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, createNitroCronTaskWrapper, "createNitroCronTaskWrapper");
|
|
383
|
+
function resolveCronWrapperFileNames(names) {
|
|
384
|
+
const groups = /* @__PURE__ */ new Map();
|
|
385
|
+
for (const name of names) {
|
|
386
|
+
const key = safeFileName(name).toLowerCase();
|
|
387
|
+
groups.set(key, (_nullishCoalesce(groups.get(key), () => ( 0))) + 1);
|
|
388
|
+
}
|
|
389
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
390
|
+
const claimed = /* @__PURE__ */ new Map();
|
|
391
|
+
for (const name of names) {
|
|
392
|
+
const base = safeFileName(name);
|
|
393
|
+
const key = base.toLowerCase();
|
|
394
|
+
const fileName = (_nullishCoalesce(groups.get(key), () => ( 0))) > 1 ? `${key}-${cronNameFingerprint(name)}` : base;
|
|
395
|
+
const claimedBy = claimed.get(fileName.toLowerCase());
|
|
396
|
+
if (claimedBy !== void 0) {
|
|
397
|
+
throw new Error(
|
|
398
|
+
`Farm cron jobs ${JSON.stringify(claimedBy)} and ${JSON.stringify(name)} generate the same wrapper file ${JSON.stringify(`${fileName}.mjs`)}. Rename one of them.`
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
claimed.set(fileName.toLowerCase(), name);
|
|
402
|
+
resolved.set(name, fileName);
|
|
403
|
+
}
|
|
404
|
+
return resolved;
|
|
405
|
+
}
|
|
406
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, resolveCronWrapperFileNames, "resolveCronWrapperFileNames");
|
|
407
|
+
function cronNameFingerprint(value) {
|
|
408
|
+
let hash = 2166136261;
|
|
409
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
410
|
+
hash ^= value.charCodeAt(index);
|
|
411
|
+
hash = Math.imul(hash, 16777619);
|
|
412
|
+
}
|
|
413
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
414
|
+
}
|
|
415
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, cronNameFingerprint, "cronNameFingerprint");
|
|
416
|
+
function safeFileName(value) {
|
|
417
|
+
return value.replace(/[^a-zA-Z0-9._-]+/g, "-") || "cron";
|
|
418
|
+
}
|
|
419
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, safeFileName, "safeFileName");
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
exports.DEFAULT_FARM_CRON_SECRET_ENV = DEFAULT_FARM_CRON_SECRET_ENV; exports.FARM_CRON_MANIFEST = FARM_CRON_MANIFEST; exports.resolveCronConfig = resolveCronConfig; exports.prepareFarmCronForNitro = prepareFarmCronForNitro; exports.createFarmCronManifest = createFarmCronManifest; exports.createFarmCronVercelCrons = createFarmCronVercelCrons; exports.applyFarmCronVercelCrons = applyFarmCronVercelCrons; exports.createFarmCronCloudflareTriggers = createFarmCronCloudflareTriggers; exports.createFarmCronCloudflareConfig = createFarmCronCloudflareConfig; exports.mergeScheduledTasks = mergeScheduledTasks; exports.isCronRequestAuthorized = isCronRequestAuthorized; exports.cronRoute = cronRoute;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
|
|
4
|
+
|
|
5
|
+
// src/route-context.ts
|
|
6
|
+
var FARM_ROUTE_CONTEXT_SYMBOL = /* @__PURE__ */ Symbol.for("farm.routeContext");
|
|
7
|
+
async function resolveFarmRouteContext(config, input) {
|
|
8
|
+
if (typeof config.context !== "function") {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
return config.context(input);
|
|
12
|
+
}
|
|
13
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, resolveFarmRouteContext, "resolveFarmRouteContext");
|
|
14
|
+
function withFarmRouteContext(props, context) {
|
|
15
|
+
if (context === void 0) {
|
|
16
|
+
return props;
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(props, FARM_ROUTE_CONTEXT_SYMBOL, {
|
|
19
|
+
value: context,
|
|
20
|
+
enumerable: false,
|
|
21
|
+
configurable: true
|
|
22
|
+
});
|
|
23
|
+
return props;
|
|
24
|
+
}
|
|
25
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, withFarmRouteContext, "withFarmRouteContext");
|
|
26
|
+
function getFarmRouteContext(props) {
|
|
27
|
+
if (!props || typeof props !== "object") {
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
return props[FARM_ROUTE_CONTEXT_SYMBOL];
|
|
31
|
+
}
|
|
32
|
+
_chunkS3JO3N4Hcjs.__name.call(void 0, getFarmRouteContext, "getFarmRouteContext");
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
exports.resolveFarmRouteContext = resolveFarmRouteContext; exports.withFarmRouteContext = withFarmRouteContext; exports.getFarmRouteContext = getFarmRouteContext;
|