devflare 0.0.0 → 1.0.0-next.1
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/LLM.md +976 -0
- package/README.md +737 -1
- package/bin/devflare.js +14 -0
- package/dist/account-rvrj687w.js +397 -0
- package/dist/ai-dx4fr9jh.js +107 -0
- package/dist/bridge/client.d.ts +82 -0
- package/dist/bridge/client.d.ts.map +1 -0
- package/dist/bridge/index.d.ts +7 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/miniflare.d.ts +70 -0
- package/dist/bridge/miniflare.d.ts.map +1 -0
- package/dist/bridge/protocol.d.ts +146 -0
- package/dist/bridge/protocol.d.ts.map +1 -0
- package/dist/bridge/proxy.d.ts +49 -0
- package/dist/bridge/proxy.d.ts.map +1 -0
- package/dist/bridge/serialization.d.ts +83 -0
- package/dist/bridge/serialization.d.ts.map +1 -0
- package/dist/bridge/server.d.ts +8 -0
- package/dist/bridge/server.d.ts.map +1 -0
- package/dist/browser-shim/binding-worker.d.ts +7 -0
- package/dist/browser-shim/binding-worker.d.ts.map +1 -0
- package/dist/browser-shim/handler.d.ts +21 -0
- package/dist/browser-shim/handler.d.ts.map +1 -0
- package/dist/browser-shim/index.d.ts +3 -0
- package/dist/browser-shim/index.d.ts.map +1 -0
- package/dist/browser-shim/server.d.ts +25 -0
- package/dist/browser-shim/server.d.ts.map +1 -0
- package/dist/browser-shim/worker.d.ts +14 -0
- package/dist/browser-shim/worker.d.ts.map +1 -0
- package/dist/build-mnf6v8gd.js +53 -0
- package/dist/bundler/do-bundler.d.ts +42 -0
- package/dist/bundler/do-bundler.d.ts.map +1 -0
- package/dist/bundler/index.d.ts +2 -0
- package/dist/bundler/index.d.ts.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/colors.d.ts +11 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/commands/account.d.ts +4 -0
- package/dist/cli/commands/account.d.ts.map +1 -0
- package/dist/cli/commands/ai.d.ts +3 -0
- package/dist/cli/commands/ai.d.ts.map +1 -0
- package/dist/cli/commands/build.d.ts +4 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/deploy.d.ts +4 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/dev.d.ts +4 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/doctor.d.ts +4 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/remote.d.ts +4 -0
- package/dist/cli/commands/remote.d.ts.map +1 -0
- package/dist/cli/commands/types.d.ts +4 -0
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/dependencies.d.ts +90 -0
- package/dist/cli/dependencies.d.ts.map +1 -0
- package/dist/cli/index.d.ts +23 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/wrangler-auth.d.ts +36 -0
- package/dist/cli/wrangler-auth.d.ts.map +1 -0
- package/dist/cloudflare/account.d.ts +65 -0
- package/dist/cloudflare/account.d.ts.map +1 -0
- package/dist/cloudflare/api.d.ts +51 -0
- package/dist/cloudflare/api.d.ts.map +1 -0
- package/dist/cloudflare/auth.d.ts +35 -0
- package/dist/cloudflare/auth.d.ts.map +1 -0
- package/dist/cloudflare/index.d.ts +107 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +13 -0
- package/dist/cloudflare/preferences.d.ts +46 -0
- package/dist/cloudflare/preferences.d.ts.map +1 -0
- package/dist/cloudflare/pricing.d.ts +15 -0
- package/dist/cloudflare/pricing.d.ts.map +1 -0
- package/dist/cloudflare/remote-config.d.ts +37 -0
- package/dist/cloudflare/remote-config.d.ts.map +1 -0
- package/dist/cloudflare/types.d.ts +161 -0
- package/dist/cloudflare/types.d.ts.map +1 -0
- package/dist/cloudflare/usage.d.ts +77 -0
- package/dist/cloudflare/usage.d.ts.map +1 -0
- package/dist/config/compiler.d.ts +146 -0
- package/dist/config/compiler.d.ts.map +1 -0
- package/dist/config/define.d.ts +44 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/loader.d.ts +52 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/ref.d.ts +160 -0
- package/dist/config/ref.d.ts.map +1 -0
- package/dist/config/schema.d.ts +3318 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/decorators/durable-object.d.ts +59 -0
- package/dist/decorators/durable-object.d.ts.map +1 -0
- package/dist/decorators/index.d.ts +3 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +9 -0
- package/dist/deploy-nhceck39.js +70 -0
- package/dist/dev-qnxet3j9.js +2096 -0
- package/dist/dev-server/index.d.ts +2 -0
- package/dist/dev-server/index.d.ts.map +1 -0
- package/dist/dev-server/server.d.ts +30 -0
- package/dist/dev-server/server.d.ts.map +1 -0
- package/dist/doctor-e8fy6fj5.js +186 -0
- package/dist/durable-object-t4kbb0yt.js +13 -0
- package/dist/env.d.ts +48 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/index-07q6yxyc.js +168 -0
- package/dist/index-1xpj0m4r.js +57 -0
- package/dist/index-37x76zdn.js +4 -0
- package/dist/index-3t6rypgc.js +13 -0
- package/dist/index-67qcae0f.js +183 -0
- package/dist/index-a855bdsx.js +18 -0
- package/dist/index-d8bdkx2h.js +109 -0
- package/dist/index-ep3445yc.js +2225 -0
- package/dist/index-gz1gndna.js +307 -0
- package/dist/index-hcex3rgh.js +266 -0
- package/dist/index-m2q41jwa.js +462 -0
- package/dist/index-n7rs26ft.js +77 -0
- package/dist/index-pf5s73n9.js +1413 -0
- package/dist/index-rbht7m9r.js +36 -0
- package/dist/index-tfyxa77h.js +850 -0
- package/dist/index-tk6ej9dj.js +94 -0
- package/dist/index-z14anrqp.js +226 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +298 -0
- package/dist/init-f9mgmew3.js +186 -0
- package/dist/remote-q59qk463.js +97 -0
- package/dist/runtime/context.d.ts +46 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/exports.d.ts +118 -0
- package/dist/runtime/exports.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +111 -0
- package/dist/runtime/middleware.d.ts +82 -0
- package/dist/runtime/middleware.d.ts.map +1 -0
- package/dist/runtime/validation.d.ts +37 -0
- package/dist/runtime/validation.d.ts.map +1 -0
- package/dist/sveltekit/index.d.ts +2 -0
- package/dist/sveltekit/index.d.ts.map +1 -0
- package/dist/sveltekit/index.js +182 -0
- package/dist/sveltekit/platform.d.ts +141 -0
- package/dist/sveltekit/platform.d.ts.map +1 -0
- package/dist/test/bridge-context.d.ts +73 -0
- package/dist/test/bridge-context.d.ts.map +1 -0
- package/dist/test/cf.d.ts +130 -0
- package/dist/test/cf.d.ts.map +1 -0
- package/dist/test/email.d.ts +75 -0
- package/dist/test/email.d.ts.map +1 -0
- package/dist/test/index.d.ts +22 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +71 -0
- package/dist/test/multi-worker-context.d.ts +114 -0
- package/dist/test/multi-worker-context.d.ts.map +1 -0
- package/dist/test/queue.d.ts +74 -0
- package/dist/test/queue.d.ts.map +1 -0
- package/dist/test/remote-ai.d.ts +6 -0
- package/dist/test/remote-ai.d.ts.map +1 -0
- package/dist/test/remote-vectorize.d.ts +6 -0
- package/dist/test/remote-vectorize.d.ts.map +1 -0
- package/dist/test/resolve-service-bindings.d.ts +68 -0
- package/dist/test/resolve-service-bindings.d.ts.map +1 -0
- package/dist/test/scheduled.d.ts +58 -0
- package/dist/test/scheduled.d.ts.map +1 -0
- package/dist/test/should-skip.d.ts +50 -0
- package/dist/test/should-skip.d.ts.map +1 -0
- package/dist/test/simple-context.d.ts +43 -0
- package/dist/test/simple-context.d.ts.map +1 -0
- package/dist/test/tail.d.ts +86 -0
- package/dist/test/tail.d.ts.map +1 -0
- package/dist/test/utilities.d.ts +99 -0
- package/dist/test/utilities.d.ts.map +1 -0
- package/dist/test/worker.d.ts +76 -0
- package/dist/test/worker.d.ts.map +1 -0
- package/dist/transform/durable-object.d.ts +46 -0
- package/dist/transform/durable-object.d.ts.map +1 -0
- package/dist/transform/index.d.ts +3 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/worker-entrypoint.d.ts +66 -0
- package/dist/transform/worker-entrypoint.d.ts.map +1 -0
- package/dist/types-5nyrz1sz.js +454 -0
- package/dist/utils/entrypoint-discovery.d.ts +29 -0
- package/dist/utils/entrypoint-discovery.d.ts.map +1 -0
- package/dist/utils/glob.d.ts +33 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/resolve-package.d.ts +10 -0
- package/dist/utils/resolve-package.d.ts.map +1 -0
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +339 -0
- package/dist/vite/plugin.d.ts +138 -0
- package/dist/vite/plugin.d.ts.map +1 -0
- package/dist/worker-entrypoint-m9th0rg0.js +13 -0
- package/dist/workerName.d.ts +17 -0
- package/dist/workerName.d.ts.map +1 -0
- package/package.json +112 -1
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import {
|
|
2
|
+
discoverEntrypointsAsync,
|
|
3
|
+
resolvePackageSpecifier
|
|
4
|
+
} from "./index-tk6ej9dj.js";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_DO_PATTERN,
|
|
7
|
+
DEFAULT_ENTRYPOINT_PATTERN,
|
|
8
|
+
findFiles
|
|
9
|
+
} from "./index-rbht7m9r.js";
|
|
10
|
+
import {
|
|
11
|
+
findDurableObjectClasses
|
|
12
|
+
} from "./index-gz1gndna.js";
|
|
13
|
+
import"./index-07q6yxyc.js";
|
|
14
|
+
import"./index-67qcae0f.js";
|
|
15
|
+
import {
|
|
16
|
+
loadConfig,
|
|
17
|
+
normalizeDOBinding
|
|
18
|
+
} from "./index-hcex3rgh.js";
|
|
19
|
+
import {
|
|
20
|
+
getDependencies
|
|
21
|
+
} from "./index-1xpj0m4r.js";
|
|
22
|
+
import {
|
|
23
|
+
__require
|
|
24
|
+
} from "./index-37x76zdn.js";
|
|
25
|
+
|
|
26
|
+
// src/cli/commands/types.ts
|
|
27
|
+
import { resolve, relative, dirname } from "pathe";
|
|
28
|
+
async function parseConfigForRefs(configPath) {
|
|
29
|
+
const fs = await import("node:fs/promises");
|
|
30
|
+
const refs = [];
|
|
31
|
+
const serviceBindings = [];
|
|
32
|
+
const doBindings = [];
|
|
33
|
+
try {
|
|
34
|
+
const code = await fs.readFile(configPath, "utf-8");
|
|
35
|
+
const refPattern = /const\s+(\w+)\s*=\s*ref\s*\(\s*(?:'[^']*'\s*,\s*)?(?:\(\s*\)\s*=>\s*)?import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
|
|
36
|
+
let match;
|
|
37
|
+
while ((match = refPattern.exec(code)) !== null) {
|
|
38
|
+
refs.push({
|
|
39
|
+
varName: match[1],
|
|
40
|
+
importPath: match[2]
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const servicePattern = /(\w+)\s*:\s*(\w+)\.worker(?:\s*\(\s*['"](\w+)['"]\s*\))?/g;
|
|
44
|
+
while ((match = servicePattern.exec(code)) !== null) {
|
|
45
|
+
serviceBindings.push({
|
|
46
|
+
bindingName: match[1],
|
|
47
|
+
varName: match[2],
|
|
48
|
+
entrypoint: match[3]
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const doPattern = /(\w+)\s*:\s*(\w+)\.([A-Z][A-Z0-9_]*)\s*[,\n\r}]/g;
|
|
52
|
+
while ((match = doPattern.exec(code)) !== null) {
|
|
53
|
+
if (match[3] === "worker")
|
|
54
|
+
continue;
|
|
55
|
+
doBindings.push({
|
|
56
|
+
bindingName: match[1],
|
|
57
|
+
varName: match[2],
|
|
58
|
+
doName: match[3]
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
} catch {}
|
|
62
|
+
return { refs, serviceBindings, doBindings };
|
|
63
|
+
}
|
|
64
|
+
async function findInterfaceTypes(searchDirs) {
|
|
65
|
+
const fs = await import("node:fs/promises");
|
|
66
|
+
const interfaces = new Map;
|
|
67
|
+
for (const dir of searchDirs) {
|
|
68
|
+
const typeFiles = await findFiles("**/*.types.ts", { cwd: dir });
|
|
69
|
+
const srcFiles = await findFiles("src/**/*.ts", { cwd: dir });
|
|
70
|
+
const allFiles = [...new Set([...typeFiles, ...srcFiles])];
|
|
71
|
+
for (const filePath of allFiles) {
|
|
72
|
+
try {
|
|
73
|
+
const code = await fs.readFile(filePath, "utf-8");
|
|
74
|
+
const interfacePattern = /export\s+interface\s+(\w+(?:Interface|Rpc))\s*\{/g;
|
|
75
|
+
let match;
|
|
76
|
+
while ((match = interfacePattern.exec(code)) !== null) {
|
|
77
|
+
const interfaceName = match[1];
|
|
78
|
+
let baseName;
|
|
79
|
+
if (interfaceName.endsWith("Interface")) {
|
|
80
|
+
baseName = interfaceName.slice(0, -9);
|
|
81
|
+
} else if (interfaceName.endsWith("Rpc")) {
|
|
82
|
+
baseName = interfaceName.slice(0, -3);
|
|
83
|
+
} else {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!interfaces.has(baseName)) {
|
|
87
|
+
interfaces.set(baseName, { filePath, interfaceName });
|
|
88
|
+
}
|
|
89
|
+
if (!interfaces.has("__default__")) {
|
|
90
|
+
if (baseName === "Worker" || baseName === "Default" || baseName === "MathService") {
|
|
91
|
+
interfaces.set("__default__", { filePath, interfaceName });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
} catch {}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return interfaces;
|
|
99
|
+
}
|
|
100
|
+
async function resolveReferencedConfigs(configPath, cwd) {
|
|
101
|
+
const fs = await import("node:fs/promises");
|
|
102
|
+
const referenced = [];
|
|
103
|
+
const { refs, serviceBindings, doBindings } = await parseConfigForRefs(configPath);
|
|
104
|
+
if (refs.length === 0) {
|
|
105
|
+
return referenced;
|
|
106
|
+
}
|
|
107
|
+
const configDir = dirname(configPath);
|
|
108
|
+
for (const ref of refs) {
|
|
109
|
+
let refConfigPath = resolvePackageSpecifier(ref.importPath, configDir);
|
|
110
|
+
if (!refConfigPath.endsWith(".ts") && !refConfigPath.endsWith(".js")) {
|
|
111
|
+
refConfigPath += ".ts";
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
await fs.access(refConfigPath);
|
|
115
|
+
const refDir = dirname(refConfigPath);
|
|
116
|
+
const entrypoints = await discoverEntrypointsAsync(refDir, DEFAULT_ENTRYPOINT_PATTERN);
|
|
117
|
+
const refDOs = await discoverDurableObjects(refDir, DEFAULT_DO_PATTERN);
|
|
118
|
+
const interfaceMap = await findInterfaceTypes([configDir, refDir]);
|
|
119
|
+
const bindings = serviceBindings.filter((sb) => sb.varName === ref.varName).map((sb) => {
|
|
120
|
+
const info = {
|
|
121
|
+
bindingName: sb.bindingName,
|
|
122
|
+
entrypoint: sb.entrypoint
|
|
123
|
+
};
|
|
124
|
+
const lookupKey = sb.entrypoint || "__default__";
|
|
125
|
+
const interfaceInfo = interfaceMap.get(lookupKey) || sb.entrypoint && interfaceMap.get(sb.entrypoint);
|
|
126
|
+
if (interfaceInfo) {
|
|
127
|
+
info.interfaceImport = generateImportPath(cwd, interfaceInfo.filePath);
|
|
128
|
+
info.interfaceType = interfaceInfo.interfaceName;
|
|
129
|
+
}
|
|
130
|
+
return info;
|
|
131
|
+
});
|
|
132
|
+
const crossWorkerDOs = doBindings.filter((doBinding) => doBinding.varName === ref.varName).map((doBinding) => {
|
|
133
|
+
const matchingDO = refDOs.find((do_) => do_.bindingName === doBinding.doName);
|
|
134
|
+
if (matchingDO) {
|
|
135
|
+
return {
|
|
136
|
+
bindingName: doBinding.bindingName,
|
|
137
|
+
doName: doBinding.doName,
|
|
138
|
+
className: matchingDO.className,
|
|
139
|
+
filePath: matchingDO.filePath
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}).filter((item) => item !== null);
|
|
144
|
+
referenced.push({
|
|
145
|
+
varName: ref.varName,
|
|
146
|
+
importPath: ref.importPath,
|
|
147
|
+
refDir,
|
|
148
|
+
entrypoints,
|
|
149
|
+
serviceBindings: bindings,
|
|
150
|
+
durableObjects: crossWorkerDOs
|
|
151
|
+
});
|
|
152
|
+
} catch {}
|
|
153
|
+
}
|
|
154
|
+
return referenced;
|
|
155
|
+
}
|
|
156
|
+
async function discoverDurableObjects(cwd, pattern) {
|
|
157
|
+
const fs = await import("node:fs/promises");
|
|
158
|
+
const discovered = [];
|
|
159
|
+
const files = await findFiles(pattern, { cwd });
|
|
160
|
+
for (const filePath of files) {
|
|
161
|
+
try {
|
|
162
|
+
const code = await fs.readFile(filePath, "utf-8");
|
|
163
|
+
const classNames = findDurableObjectClasses(code);
|
|
164
|
+
for (const className of classNames) {
|
|
165
|
+
const bindingName = className.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2").toUpperCase();
|
|
166
|
+
discovered.push({
|
|
167
|
+
className,
|
|
168
|
+
filePath,
|
|
169
|
+
bindingName
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
} catch {}
|
|
173
|
+
}
|
|
174
|
+
return discovered;
|
|
175
|
+
}
|
|
176
|
+
function generateImportPath(cwd, filePath) {
|
|
177
|
+
let relativePath = relative(cwd, filePath);
|
|
178
|
+
relativePath = relativePath.replace(/\.(ts|tsx|js|jsx)$/, "");
|
|
179
|
+
if (!relativePath.startsWith(".") && !relativePath.startsWith("/")) {
|
|
180
|
+
relativePath = "./" + relativePath;
|
|
181
|
+
}
|
|
182
|
+
return relativePath;
|
|
183
|
+
}
|
|
184
|
+
function generateBindingMembers(config, doClassMap, crossWorkerDOMap, serviceBindingMap, cwd, indent) {
|
|
185
|
+
const lines = [];
|
|
186
|
+
const imports = [];
|
|
187
|
+
if (config.bindings) {
|
|
188
|
+
if (config.bindings.kv) {
|
|
189
|
+
for (const binding of Object.keys(config.bindings.kv)) {
|
|
190
|
+
lines.push(`${indent}${binding}: KVNamespace`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (config.bindings.d1) {
|
|
194
|
+
for (const binding of Object.keys(config.bindings.d1)) {
|
|
195
|
+
lines.push(`${indent}${binding}: D1Database`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (config.bindings.r2) {
|
|
199
|
+
for (const binding of Object.keys(config.bindings.r2)) {
|
|
200
|
+
lines.push(`${indent}${binding}: R2Bucket`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (config.bindings.durableObjects) {
|
|
204
|
+
for (const [binding, doConfig] of Object.entries(config.bindings.durableObjects)) {
|
|
205
|
+
const crossWorkerDO = crossWorkerDOMap.get(binding);
|
|
206
|
+
if (crossWorkerDO) {
|
|
207
|
+
const importPath = generateImportPath(cwd, crossWorkerDO.filePath);
|
|
208
|
+
lines.push(`${indent}${binding}: DurableObjectNamespace<Rpc.DurableObjectBranded & import('${importPath}').${crossWorkerDO.className}>`);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const className = doConfig.className;
|
|
212
|
+
if (className) {
|
|
213
|
+
const classInfo = doClassMap.get(className);
|
|
214
|
+
if (classInfo) {
|
|
215
|
+
lines.push(`${indent}${binding}: DurableObjectNamespace<Rpc.DurableObjectBranded & import('${classInfo.importPath}').${classInfo.className}>`);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
lines.push(`${indent}${binding}: DurableObjectNamespace`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (config.bindings.queues?.producers) {
|
|
223
|
+
for (const binding of Object.keys(config.bindings.queues.producers)) {
|
|
224
|
+
lines.push(`${indent}${binding}: Queue`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (config.bindings.services) {
|
|
228
|
+
for (const binding of Object.keys(config.bindings.services)) {
|
|
229
|
+
const serviceInfo = serviceBindingMap.get(binding);
|
|
230
|
+
if (serviceInfo?.interfaceType && serviceInfo.interfaceImport) {
|
|
231
|
+
imports.push(`import type { ${serviceInfo.interfaceType} } from '${serviceInfo.interfaceImport}'`);
|
|
232
|
+
lines.push(`${indent}${binding}: ${serviceInfo.interfaceType}`);
|
|
233
|
+
} else {
|
|
234
|
+
lines.push(`${indent}${binding}: Fetcher`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (config.bindings.ai) {
|
|
239
|
+
lines.push(`${indent}${config.bindings.ai.binding}: Ai`);
|
|
240
|
+
}
|
|
241
|
+
if (config.bindings.vectorize) {
|
|
242
|
+
for (const binding of Object.keys(config.bindings.vectorize)) {
|
|
243
|
+
lines.push(`${indent}${binding}: VectorizeIndex`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (config.bindings.hyperdrive) {
|
|
247
|
+
for (const binding of Object.keys(config.bindings.hyperdrive)) {
|
|
248
|
+
lines.push(`${indent}${binding}: Hyperdrive`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (config.bindings.browser) {
|
|
252
|
+
lines.push(`${indent}${config.bindings.browser.binding}: Fetcher`);
|
|
253
|
+
}
|
|
254
|
+
if (config.bindings.analyticsEngine) {
|
|
255
|
+
for (const binding of Object.keys(config.bindings.analyticsEngine)) {
|
|
256
|
+
lines.push(`${indent}${binding}: AnalyticsEngineDataset`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (config.vars) {
|
|
261
|
+
for (const key of Object.keys(config.vars)) {
|
|
262
|
+
lines.push(`${indent}${key}: string`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (config.secrets) {
|
|
266
|
+
for (const secret of Object.keys(config.secrets)) {
|
|
267
|
+
lines.push(`${indent}${secret}: string`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return { lines, imports };
|
|
271
|
+
}
|
|
272
|
+
function generateBindingTypes(config, discoveredDOs, discoveredEntrypoints, referencedConfigs, cwd) {
|
|
273
|
+
const doClassMap = new Map;
|
|
274
|
+
for (const do_ of discoveredDOs) {
|
|
275
|
+
doClassMap.set(do_.className, {
|
|
276
|
+
importPath: generateImportPath(cwd, do_.filePath),
|
|
277
|
+
className: do_.className
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
const crossWorkerDOMap = new Map;
|
|
281
|
+
for (const ref of referencedConfigs) {
|
|
282
|
+
for (const doInfo of ref.durableObjects) {
|
|
283
|
+
crossWorkerDOMap.set(doInfo.bindingName, doInfo);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const serviceBindingMap = new Map;
|
|
287
|
+
for (const ref of referencedConfigs) {
|
|
288
|
+
for (const sb of ref.serviceBindings) {
|
|
289
|
+
serviceBindingMap.set(sb.bindingName, sb);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const usedTypes = new Set;
|
|
293
|
+
if (config.bindings) {
|
|
294
|
+
if (config.bindings.kv && Object.keys(config.bindings.kv).length > 0)
|
|
295
|
+
usedTypes.add("KVNamespace");
|
|
296
|
+
if (config.bindings.d1 && Object.keys(config.bindings.d1).length > 0)
|
|
297
|
+
usedTypes.add("D1Database");
|
|
298
|
+
if (config.bindings.r2 && Object.keys(config.bindings.r2).length > 0)
|
|
299
|
+
usedTypes.add("R2Bucket");
|
|
300
|
+
if (config.bindings.durableObjects && Object.keys(config.bindings.durableObjects).length > 0)
|
|
301
|
+
usedTypes.add("DurableObjectNamespace");
|
|
302
|
+
if (config.bindings.queues?.producers && Object.keys(config.bindings.queues.producers).length > 0)
|
|
303
|
+
usedTypes.add("Queue");
|
|
304
|
+
if (config.bindings.services) {
|
|
305
|
+
const hasUntypedServices = Object.keys(config.bindings.services).some((name) => !serviceBindingMap.get(name)?.interfaceType);
|
|
306
|
+
if (hasUntypedServices)
|
|
307
|
+
usedTypes.add("Fetcher");
|
|
308
|
+
}
|
|
309
|
+
if (config.bindings.ai)
|
|
310
|
+
usedTypes.add("Ai");
|
|
311
|
+
if (config.bindings.vectorize && Object.keys(config.bindings.vectorize).length > 0)
|
|
312
|
+
usedTypes.add("VectorizeIndex");
|
|
313
|
+
if (config.bindings.hyperdrive && Object.keys(config.bindings.hyperdrive).length > 0)
|
|
314
|
+
usedTypes.add("Hyperdrive");
|
|
315
|
+
if (config.bindings.browser)
|
|
316
|
+
usedTypes.add("Fetcher");
|
|
317
|
+
if (config.bindings.analyticsEngine && Object.keys(config.bindings.analyticsEngine).length > 0)
|
|
318
|
+
usedTypes.add("AnalyticsEngineDataset");
|
|
319
|
+
}
|
|
320
|
+
const lines = [
|
|
321
|
+
"// Generated by devflare - DO NOT EDIT",
|
|
322
|
+
"// Run `devflare types` to regenerate",
|
|
323
|
+
""
|
|
324
|
+
];
|
|
325
|
+
const hasLocalDOsWithClasses = config.bindings?.durableObjects && Object.values(config.bindings.durableObjects).some((doConfig) => doConfig.className && doClassMap.has(doConfig.className));
|
|
326
|
+
const hasCrossWorkerDOs = crossWorkerDOMap.size > 0;
|
|
327
|
+
const hasDOsWithClasses = hasLocalDOsWithClasses || hasCrossWorkerDOs;
|
|
328
|
+
if (usedTypes.size > 0) {
|
|
329
|
+
const sortedTypes = [...usedTypes].sort();
|
|
330
|
+
if (hasDOsWithClasses) {
|
|
331
|
+
lines.push(`import type { ${sortedTypes.join(", ")}, Rpc } from '@cloudflare/workers-types'`);
|
|
332
|
+
} else {
|
|
333
|
+
lines.push(`import type { ${sortedTypes.join(", ")} } from '@cloudflare/workers-types'`);
|
|
334
|
+
}
|
|
335
|
+
lines.push("");
|
|
336
|
+
}
|
|
337
|
+
const { lines: bindingMembers, imports: serviceImports } = generateBindingMembers(config, doClassMap, crossWorkerDOMap, serviceBindingMap, cwd, "\t\t");
|
|
338
|
+
const uniqueImports = [...new Set(serviceImports)];
|
|
339
|
+
if (uniqueImports.length > 0) {
|
|
340
|
+
lines.push(...uniqueImports);
|
|
341
|
+
lines.push("");
|
|
342
|
+
}
|
|
343
|
+
lines.push("declare global {");
|
|
344
|
+
lines.push("\tinterface DevflareEnv {");
|
|
345
|
+
lines.push(...bindingMembers);
|
|
346
|
+
lines.push("\t}");
|
|
347
|
+
lines.push("}");
|
|
348
|
+
lines.push("");
|
|
349
|
+
if (discoveredEntrypoints.length > 0) {
|
|
350
|
+
const entrypointNames = discoveredEntrypoints.map((ep) => `'${ep.className}'`).join(" | ");
|
|
351
|
+
lines.push("/**");
|
|
352
|
+
lines.push(" * Named entrypoints discovered from ep.*.ts files.");
|
|
353
|
+
lines.push(" * Use with defineConfig<Entrypoints>() for type-safe cross-worker references.");
|
|
354
|
+
lines.push(" */");
|
|
355
|
+
lines.push(`export type Entrypoints = ${entrypointNames}`);
|
|
356
|
+
} else {
|
|
357
|
+
lines.push("/**");
|
|
358
|
+
lines.push(" * Named entrypoints (none discovered - add ep.*.ts files to enable).");
|
|
359
|
+
lines.push(" * Use with defineConfig<Entrypoints>() for type-safe cross-worker references.");
|
|
360
|
+
lines.push(" */");
|
|
361
|
+
lines.push("export type Entrypoints = string");
|
|
362
|
+
}
|
|
363
|
+
lines.push("");
|
|
364
|
+
return lines.join(`
|
|
365
|
+
`);
|
|
366
|
+
}
|
|
367
|
+
async function runTypesCommand(parsed, logger, options) {
|
|
368
|
+
const cwd = options.cwd || process.cwd();
|
|
369
|
+
const configPath = parsed.options.config;
|
|
370
|
+
const outputPath = parsed.options.output || "env.d.ts";
|
|
371
|
+
logger.info("Generating TypeScript types...");
|
|
372
|
+
try {
|
|
373
|
+
const actualConfigPath = configPath ? resolve(cwd, configPath) : resolve(cwd, "devflare.config.ts");
|
|
374
|
+
const config = await loadConfig({ cwd, configFile: configPath });
|
|
375
|
+
const doPattern = typeof config.files?.durableObjects === "string" ? config.files.durableObjects : DEFAULT_DO_PATTERN;
|
|
376
|
+
let discoveredDOs = [];
|
|
377
|
+
if (config.files?.durableObjects !== false) {
|
|
378
|
+
discoveredDOs = await discoverDurableObjects(cwd, doPattern);
|
|
379
|
+
if (discoveredDOs.length > 0) {
|
|
380
|
+
logger.info(`Discovered ${discoveredDOs.length} Durable Object class(es):`);
|
|
381
|
+
for (const do_ of discoveredDOs) {
|
|
382
|
+
logger.info(` • ${do_.className} → ${do_.bindingName}`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (config.bindings?.durableObjects) {
|
|
387
|
+
for (const [bindingName, doConfig] of Object.entries(config.bindings.durableObjects)) {
|
|
388
|
+
const normalized = normalizeDOBinding(doConfig);
|
|
389
|
+
const className = normalized.className;
|
|
390
|
+
if (!className)
|
|
391
|
+
continue;
|
|
392
|
+
const existing = discoveredDOs.find((d) => d.className === className);
|
|
393
|
+
if (existing)
|
|
394
|
+
continue;
|
|
395
|
+
if (normalized.scriptName && (normalized.scriptName.endsWith(".ts") || normalized.scriptName.endsWith(".js"))) {
|
|
396
|
+
const filePath = resolve(cwd, "src", normalized.scriptName);
|
|
397
|
+
discoveredDOs.push({
|
|
398
|
+
className,
|
|
399
|
+
filePath,
|
|
400
|
+
bindingName
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
const epPattern = typeof config.files?.entrypoints === "string" ? config.files.entrypoints : DEFAULT_ENTRYPOINT_PATTERN;
|
|
406
|
+
let discoveredEntrypoints = [];
|
|
407
|
+
if (config.files?.entrypoints !== false) {
|
|
408
|
+
discoveredEntrypoints = await discoverEntrypointsAsync(cwd, epPattern);
|
|
409
|
+
if (discoveredEntrypoints.length > 0) {
|
|
410
|
+
logger.info(`Discovered ${discoveredEntrypoints.length} entrypoint class(es):`);
|
|
411
|
+
for (const ep of discoveredEntrypoints) {
|
|
412
|
+
logger.info(` • ${ep.className}`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
const referencedConfigs = await resolveReferencedConfigs(actualConfigPath, cwd);
|
|
417
|
+
if (referencedConfigs.length > 0) {
|
|
418
|
+
logger.info(`Found ${referencedConfigs.length} referenced worker(s):`);
|
|
419
|
+
for (const ref of referencedConfigs) {
|
|
420
|
+
const typedBindings = ref.serviceBindings.filter((sb) => sb.interfaceType);
|
|
421
|
+
if (typedBindings.length > 0) {
|
|
422
|
+
logger.info(` • ${ref.varName}: ${typedBindings.map((sb) => `${sb.bindingName} → ${sb.interfaceType}`).join(", ")}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const normalizedConfig = {
|
|
427
|
+
...config,
|
|
428
|
+
bindings: config.bindings ? {
|
|
429
|
+
...config.bindings,
|
|
430
|
+
durableObjects: config.bindings.durableObjects ? Object.fromEntries(Object.entries(config.bindings.durableObjects).map(([name, doConfig]) => {
|
|
431
|
+
const normalized = normalizeDOBinding(doConfig);
|
|
432
|
+
return [name, { className: normalized.className, scriptName: normalized.scriptName }];
|
|
433
|
+
})) : undefined
|
|
434
|
+
} : undefined
|
|
435
|
+
};
|
|
436
|
+
const types = generateBindingTypes(normalizedConfig, discoveredDOs, discoveredEntrypoints, referencedConfigs, cwd);
|
|
437
|
+
const { fs } = await getDependencies();
|
|
438
|
+
const fullPath = resolve(cwd, outputPath);
|
|
439
|
+
await fs.writeFile(fullPath, types, "utf-8");
|
|
440
|
+
logger.success(`Generated types: ${outputPath}`);
|
|
441
|
+
return { exitCode: 0 };
|
|
442
|
+
} catch (error) {
|
|
443
|
+
if (error instanceof Error) {
|
|
444
|
+
logger.error("Type generation failed:", error.message);
|
|
445
|
+
if (parsed.options.debug) {
|
|
446
|
+
logger.error(error.stack);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return { exitCode: 1 };
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
export {
|
|
453
|
+
runTypesCommand
|
|
454
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Information about a discovered entrypoint class
|
|
3
|
+
*/
|
|
4
|
+
export interface DiscoveredEntrypoint {
|
|
5
|
+
className: string;
|
|
6
|
+
filePath: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Find WorkerEntrypoint classes in source code
|
|
10
|
+
* @param code - Source code to search
|
|
11
|
+
* @returns Array of class names found
|
|
12
|
+
*/
|
|
13
|
+
export declare function findEntrypointClasses(code: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Discover entrypoint classes from ep.*.ts files in a directory (synchronous)
|
|
16
|
+
* @param dir - Directory to scan
|
|
17
|
+
* @returns Array of discovered entrypoints
|
|
18
|
+
*/
|
|
19
|
+
export declare function discoverEntrypointsSync(dir: string): DiscoveredEntrypoint[];
|
|
20
|
+
/**
|
|
21
|
+
* Discover entrypoint classes from ep.*.ts files using glob pattern (async).
|
|
22
|
+
* Respects .gitignore automatically.
|
|
23
|
+
*
|
|
24
|
+
* @param cwd - Working directory for glob
|
|
25
|
+
* @param pattern - Glob pattern for ep.*.ts files (default: **/ep.*.{ts,js})
|
|
26
|
+
* @returns Array of discovered entrypoints
|
|
27
|
+
*/
|
|
28
|
+
export declare function discoverEntrypointsAsync(cwd: string, pattern?: string): Promise<DiscoveredEntrypoint[]>;
|
|
29
|
+
//# sourceMappingURL=entrypoint-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entrypoint-discovery.d.ts","sourceRoot":"","sources":["../../src/utils/entrypoint-discovery.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CAChB;AAYD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY5D;AAWD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,EAAE,CA0B3E;AAMD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,SAA6B,GAClC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAoBjC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Default glob pattern for Durable Object discovery */
|
|
2
|
+
export declare const DEFAULT_DO_PATTERN = "**/do.*.{ts,js}";
|
|
3
|
+
/** Default glob pattern for WorkerEntrypoint discovery */
|
|
4
|
+
export declare const DEFAULT_ENTRYPOINT_PATTERN = "**/ep.*.{ts,js}";
|
|
5
|
+
/** Default glob pattern for Workflow discovery */
|
|
6
|
+
export declare const DEFAULT_WORKFLOW_PATTERN = "**/wf.*.{ts,js}";
|
|
7
|
+
export interface GlobOptions {
|
|
8
|
+
/** Working directory for glob pattern */
|
|
9
|
+
cwd: string;
|
|
10
|
+
/** Return absolute paths instead of relative */
|
|
11
|
+
absolute?: boolean;
|
|
12
|
+
/** Respect .gitignore files (default: true) */
|
|
13
|
+
gitignore?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find files matching a glob pattern with .gitignore support.
|
|
17
|
+
* This is the async version for use in CLI commands and bundlers.
|
|
18
|
+
*
|
|
19
|
+
* @param pattern - Glob pattern (e.g., '**/do.*.{ts,js}')
|
|
20
|
+
* @param options - Glob options
|
|
21
|
+
* @returns Array of matching file paths
|
|
22
|
+
*/
|
|
23
|
+
export declare function findFiles(pattern: string | string[], options: GlobOptions): Promise<string[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Find files matching a glob pattern synchronously.
|
|
26
|
+
* Use sparingly — prefer async version for better performance.
|
|
27
|
+
*
|
|
28
|
+
* @param pattern - Glob pattern (e.g., '**/do.*.{ts,js}')
|
|
29
|
+
* @param options - Glob options
|
|
30
|
+
* @returns Array of matching file paths
|
|
31
|
+
*/
|
|
32
|
+
export declare function findFilesSync(pattern: string | string[], options: GlobOptions): string[];
|
|
33
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/utils/glob.ts"],"names":[],"mappings":"AAaA,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,oBAAoB,CAAA;AAEnD,0DAA0D;AAC1D,eAAO,MAAM,0BAA0B,oBAAoB,CAAA;AAE3D,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAMzD,MAAM,WAAW,WAAW;IAC3B,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAMD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC9B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GAClB,MAAM,EAAE,CAeV"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a package specifier to a filesystem path
|
|
3
|
+
* Handles workspace packages like '@devflare/case11-do-shared/devflare.config'
|
|
4
|
+
*
|
|
5
|
+
* @param specifier - Package specifier (e.g., '@scope/pkg/path' or './relative/path')
|
|
6
|
+
* @param fromDir - Directory to resolve relative paths from
|
|
7
|
+
* @returns Resolved filesystem path
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolvePackageSpecifier(specifier: string, fromDir: string): string;
|
|
10
|
+
//# sourceMappingURL=resolve-package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-package.d.ts","sourceRoot":"","sources":["../../src/utils/resolve-package.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgDlF"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { devflarePlugin, getPluginContext, getCloudflareConfig, getDevflareConfigs, type DevflarePluginOptions, type DevflarePluginContext, type AuxiliaryWorkerConfig, type DODiscoveryResult } from './plugin';
|
|
2
|
+
export { devflarePlugin as default } from './plugin';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,UAAU,CAAA"}
|