devflare 1.0.0-next.10 → 1.0.0-next.12
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 +683 -13
- package/README.md +33 -5
- package/dist/{build-k36xrzvy.js → build-rfh8cgh3.js} +40 -11
- package/dist/bundler/index.d.ts +1 -0
- package/dist/bundler/index.d.ts.map +1 -1
- package/dist/bundler/worker-bundler.d.ts +14 -0
- package/dist/bundler/worker-bundler.d.ts.map +1 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/deploy.d.ts.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/config/compiler.d.ts.map +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/resolve.d.ts +3 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/schema.d.ts +37 -31
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/{deploy-dbvfq8vq.js → deploy-k0fcgt3d.js} +40 -11
- package/dist/{dev-rk8p6pse.js → dev-d4wabqyf.js} +73 -470
- package/dist/dev-server/server.d.ts.map +1 -1
- package/dist/{doctor-06y8nxd4.js → doctor-z4ffybce.js} +2 -2
- package/dist/{index-jht2j546.js → index-0kzg8wed.js} +26 -6
- package/dist/index-1xqeptt2.js +623 -0
- package/dist/{index-pwgyy2q9.js → index-dr6sbp8d.js} +1 -1
- package/dist/{index-6v3wjg1r.js → index-rfhx0yd5.js} +11 -7
- package/dist/{index-05fyzwne.js → index-twpgq9k9.js} +5 -5
- package/dist/{index-1phx14av.js → index-wyf3s77s.js} +1 -1
- package/dist/{index-vs49yxn4.js → index-xxwbb2nt.js} +1 -1
- package/dist/index-zbvmtcn2.js +795 -0
- package/dist/src/browser.js +1 -1
- package/dist/src/cli/index.js +1 -1
- package/dist/src/index.js +12 -13
- package/dist/src/sveltekit/index.js +4 -5
- package/dist/src/test/index.js +6 -7
- package/dist/src/vite/index.js +19 -399
- package/dist/test/simple-context.d.ts.map +1 -1
- package/dist/{types-x9q7t491.js → types-sffr9681.js} +7 -8
- package/dist/vite/config-file.d.ts +25 -0
- package/dist/vite/config-file.d.ts.map +1 -0
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/worker-entry/composed-worker.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/index-k7r18na8.js +0 -0
- package/dist/index-ws68xvq2.js +0 -311
package/dist/index-ws68xvq2.js
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
discoverRoutes
|
|
3
|
-
} from "./index-1p814k7s.js";
|
|
4
|
-
import {
|
|
5
|
-
__require
|
|
6
|
-
} from "./index-37x76zdn.js";
|
|
7
|
-
|
|
8
|
-
// src/worker-entry/composed-worker.ts
|
|
9
|
-
import { defu } from "defu";
|
|
10
|
-
import { dirname, relative, resolve } from "pathe";
|
|
11
|
-
var DEFAULT_FETCH_ENTRY_FILES = [
|
|
12
|
-
"src/fetch.ts",
|
|
13
|
-
"src/fetch.js",
|
|
14
|
-
"src/fetch.mts",
|
|
15
|
-
"src/fetch.mjs"
|
|
16
|
-
];
|
|
17
|
-
var DEFAULT_QUEUE_ENTRY_FILES = [
|
|
18
|
-
"src/queue.ts",
|
|
19
|
-
"src/queue.js",
|
|
20
|
-
"src/queue.mts",
|
|
21
|
-
"src/queue.mjs"
|
|
22
|
-
];
|
|
23
|
-
var DEFAULT_SCHEDULED_ENTRY_FILES = [
|
|
24
|
-
"src/scheduled.ts",
|
|
25
|
-
"src/scheduled.js",
|
|
26
|
-
"src/scheduled.mts",
|
|
27
|
-
"src/scheduled.mjs"
|
|
28
|
-
];
|
|
29
|
-
var DEFAULT_EMAIL_ENTRY_FILES = [
|
|
30
|
-
"src/email.ts",
|
|
31
|
-
"src/email.js",
|
|
32
|
-
"src/email.mts",
|
|
33
|
-
"src/email.mjs"
|
|
34
|
-
];
|
|
35
|
-
function resolveConfigForEnvironment(config, environment) {
|
|
36
|
-
if (environment && config.env?.[environment]) {
|
|
37
|
-
return defu(config.env[environment], config);
|
|
38
|
-
}
|
|
39
|
-
return config;
|
|
40
|
-
}
|
|
41
|
-
async function resolveWorkerHandlerPath(cwd, configuredPath, defaultEntries) {
|
|
42
|
-
if (configuredPath === false) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
const fs = await import("node:fs/promises");
|
|
46
|
-
const candidates = new Set;
|
|
47
|
-
if (typeof configuredPath === "string" && configuredPath) {
|
|
48
|
-
candidates.add(configuredPath);
|
|
49
|
-
}
|
|
50
|
-
for (const defaultEntry of defaultEntries) {
|
|
51
|
-
candidates.add(defaultEntry);
|
|
52
|
-
}
|
|
53
|
-
for (const candidate of candidates) {
|
|
54
|
-
const absolutePath = resolve(cwd, candidate);
|
|
55
|
-
try {
|
|
56
|
-
await fs.access(absolutePath);
|
|
57
|
-
return absolutePath;
|
|
58
|
-
} catch {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
async function resolveWorkerSurfacePaths(cwd, config) {
|
|
65
|
-
return {
|
|
66
|
-
fetch: await resolveWorkerHandlerPath(cwd, config.files?.fetch, DEFAULT_FETCH_ENTRY_FILES),
|
|
67
|
-
queue: await resolveWorkerHandlerPath(cwd, config.files?.queue, DEFAULT_QUEUE_ENTRY_FILES),
|
|
68
|
-
scheduled: await resolveWorkerHandlerPath(cwd, config.files?.scheduled, DEFAULT_SCHEDULED_ENTRY_FILES),
|
|
69
|
-
email: await resolveWorkerHandlerPath(cwd, config.files?.email, DEFAULT_EMAIL_ENTRY_FILES)
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function toImportSpecifier(fromFilePath, toFilePath) {
|
|
73
|
-
const specifier = relative(dirname(fromFilePath), toFilePath).replace(/\\/g, "/");
|
|
74
|
-
return specifier.startsWith(".") ? specifier : `./${specifier}`;
|
|
75
|
-
}
|
|
76
|
-
function createGeneratedRouteModuleImports(entryPath, routeDiscovery) {
|
|
77
|
-
if (!routeDiscovery) {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
return routeDiscovery.routes.map((route, index) => ({
|
|
81
|
-
identifier: `__devflareRouteModule${index}`,
|
|
82
|
-
importPath: toImportSpecifier(entryPath, route.absolutePath),
|
|
83
|
-
filePath: route.filePath,
|
|
84
|
-
routePath: route.routePath,
|
|
85
|
-
segmentsJson: JSON.stringify(route.segments)
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
function needsComposedWorkerEntrypoint(surfacePaths, routeDiscovery) {
|
|
89
|
-
return Boolean(surfacePaths.fetch || surfacePaths.queue || surfacePaths.scheduled || surfacePaths.email || routeDiscovery?.routes.length);
|
|
90
|
-
}
|
|
91
|
-
function getComposedWorkerEntrypointSource(surfaceImportPaths, configuredLocalSendEmailBindings = {}, routeImports = [], options = {}) {
|
|
92
|
-
const importLines = [`import { createEmailEvent, createFetchEvent, createQueueEvent, createRouteResolve, createScheduledEvent, invokeFetchModule, matchFetchRoute, runWithEventContext, setLocalSendEmailBindings } from 'devflare/runtime'`];
|
|
93
|
-
const moduleFallbackLines = [];
|
|
94
|
-
const localSendEmailBindings = JSON.stringify(configuredLocalSendEmailBindings);
|
|
95
|
-
const routeManifestEntries = routeImports.map(({ identifier, filePath, routePath, segmentsJson }) => {
|
|
96
|
-
return ` { filePath: ${JSON.stringify(filePath)}, routePath: ${JSON.stringify(routePath)}, segments: ${segmentsJson}, module: ${identifier} }`;
|
|
97
|
-
});
|
|
98
|
-
const registerSurfaceModule = (identifier, importPath) => {
|
|
99
|
-
if (importPath) {
|
|
100
|
-
importLines.push(`import * as ${identifier} from '${importPath}'`);
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
moduleFallbackLines.push(`const ${identifier} = {}`);
|
|
104
|
-
};
|
|
105
|
-
registerSurfaceModule("__devflareFetchModule", surfaceImportPaths.fetch);
|
|
106
|
-
registerSurfaceModule("__devflareQueueModule", surfaceImportPaths.queue);
|
|
107
|
-
registerSurfaceModule("__devflareScheduledModule", surfaceImportPaths.scheduled);
|
|
108
|
-
registerSurfaceModule("__devflareEmailModule", surfaceImportPaths.email);
|
|
109
|
-
for (const routeImport of routeImports) {
|
|
110
|
-
importLines.push(`import * as ${routeImport.identifier} from '${routeImport.importPath}'`);
|
|
111
|
-
}
|
|
112
|
-
const includeDevInternalEmail = options.devInternalEmail === true;
|
|
113
|
-
const devInternalEmailHelpers = includeDevInternalEmail ? `
|
|
114
|
-
function __devflareCreateEmailHeaders(rawBody) {
|
|
115
|
-
const headers = new Headers()
|
|
116
|
-
const lines = rawBody.split(/\\r?\\n/)
|
|
117
|
-
|
|
118
|
-
for (const line of lines) {
|
|
119
|
-
if (line.trim() === '') {
|
|
120
|
-
break
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const colonIndex = line.indexOf(':')
|
|
124
|
-
if (colonIndex <= 0) {
|
|
125
|
-
continue
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
headers.append(line.slice(0, colonIndex).trim(), line.slice(colonIndex + 1).trim())
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return headers
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function __devflareCreateEmailRawStream(rawBody) {
|
|
135
|
-
return new ReadableStream({
|
|
136
|
-
start(controller) {
|
|
137
|
-
controller.enqueue(new TextEncoder().encode(rawBody))
|
|
138
|
-
controller.close()
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async function __devflareHandleInternalEmail(request, env, ctx) {
|
|
144
|
-
if (!__devflareEmailHandler) {
|
|
145
|
-
return new Response('Email handler not configured', { status: 501 })
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const from = request.headers.get('x-devflare-email-from') || 'unknown@example.com'
|
|
149
|
-
const to = request.headers.get('x-devflare-email-to') || 'worker@example.com'
|
|
150
|
-
const rawBody = await request.text()
|
|
151
|
-
const emailMessage = {
|
|
152
|
-
from,
|
|
153
|
-
to,
|
|
154
|
-
headers: __devflareCreateEmailHeaders(rawBody),
|
|
155
|
-
raw: __devflareCreateEmailRawStream(rawBody),
|
|
156
|
-
rawSize: rawBody.length,
|
|
157
|
-
setReject(reason) {
|
|
158
|
-
console.warn('[Devflare email rejected]', reason)
|
|
159
|
-
},
|
|
160
|
-
async forward(rcptTo) {
|
|
161
|
-
console.log('[Devflare email forwarded]', rcptTo)
|
|
162
|
-
return Promise.resolve()
|
|
163
|
-
},
|
|
164
|
-
async reply(message) {
|
|
165
|
-
console.log('[Devflare email reply sent]', message?.from)
|
|
166
|
-
return Promise.resolve()
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const __devflareEvent = createEmailEvent(emailMessage, env, ctx)
|
|
171
|
-
|
|
172
|
-
await runWithEventContext(
|
|
173
|
-
__devflareEvent,
|
|
174
|
-
() => __devflareEmailHandler(__devflareEvent, env, ctx)
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
return new Response(JSON.stringify({ ok: true, from, to }), {
|
|
178
|
-
headers: { 'Content-Type': 'application/json' }
|
|
179
|
-
})
|
|
180
|
-
}
|
|
181
|
-
` : "";
|
|
182
|
-
return `
|
|
183
|
-
${importLines.join(`
|
|
184
|
-
`)}
|
|
185
|
-
${moduleFallbackLines.join(`
|
|
186
|
-
`)}
|
|
187
|
-
|
|
188
|
-
setLocalSendEmailBindings(${localSendEmailBindings})
|
|
189
|
-
|
|
190
|
-
const __devflareHasFetchModule = ${surfaceImportPaths.fetch ? "true" : "false"}
|
|
191
|
-
const __devflareRoutes = [
|
|
192
|
-
${routeManifestEntries.join(`,
|
|
193
|
-
`)}
|
|
194
|
-
]
|
|
195
|
-
const __devflareHasRoutes = __devflareRoutes.length > 0
|
|
196
|
-
|
|
197
|
-
const __devflareResolveHandler = (module, namedExport) => {
|
|
198
|
-
const defaultExport = module.default
|
|
199
|
-
|
|
200
|
-
if (typeof defaultExport === 'function') {
|
|
201
|
-
return defaultExport
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (defaultExport && typeof defaultExport[namedExport] === 'function') {
|
|
205
|
-
return defaultExport[namedExport].bind(defaultExport)
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if (typeof module[namedExport] === 'function') {
|
|
209
|
-
return module[namedExport]
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
return null
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const __devflareQueueHandler = __devflareResolveHandler(__devflareQueueModule, 'queue')
|
|
216
|
-
const __devflareScheduledHandler = __devflareResolveHandler(__devflareScheduledModule, 'scheduled')
|
|
217
|
-
const __devflareEmailHandler = __devflareResolveHandler(__devflareEmailModule, 'email')
|
|
218
|
-
${devInternalEmailHelpers}
|
|
219
|
-
|
|
220
|
-
export default {
|
|
221
|
-
...(${surfaceImportPaths.fetch || routeImports.length > 0 || includeDevInternalEmail ? "true" : "false"}
|
|
222
|
-
? {
|
|
223
|
-
async fetch(request, env, ctx) {
|
|
224
|
-
${includeDevInternalEmail ? `const url = new URL(request.url)
|
|
225
|
-
|
|
226
|
-
if (
|
|
227
|
-
request.headers.get('x-devflare-event') === 'email'
|
|
228
|
-
&& url.pathname === '/_devflare/internal/email'
|
|
229
|
-
) {
|
|
230
|
-
return __devflareHandleInternalEmail(request, env, ctx)
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
` : ""}const __devflareInitialRouteMatch = __devflareHasRoutes ? matchFetchRoute(__devflareRoutes, request) : null
|
|
234
|
-
const __devflareEvent = createFetchEvent(request, env, ctx, {
|
|
235
|
-
params: __devflareInitialRouteMatch?.params ?? {}
|
|
236
|
-
})
|
|
237
|
-
return runWithEventContext(
|
|
238
|
-
__devflareEvent,
|
|
239
|
-
() => invokeFetchModule(
|
|
240
|
-
__devflareFetchModule,
|
|
241
|
-
__devflareEvent,
|
|
242
|
-
__devflareHasRoutes
|
|
243
|
-
? createRouteResolve(__devflareRoutes, __devflareEvent)
|
|
244
|
-
: undefined
|
|
245
|
-
)
|
|
246
|
-
)
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
: {}),
|
|
250
|
-
...(__devflareQueueHandler
|
|
251
|
-
? {
|
|
252
|
-
async queue(batch, env, ctx) {
|
|
253
|
-
const __devflareEvent = createQueueEvent(batch, env, ctx)
|
|
254
|
-
return runWithEventContext(
|
|
255
|
-
__devflareEvent,
|
|
256
|
-
() => __devflareQueueHandler(__devflareEvent, env, ctx)
|
|
257
|
-
)
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
: {}),
|
|
261
|
-
...(__devflareScheduledHandler
|
|
262
|
-
? {
|
|
263
|
-
async scheduled(controller, env, ctx) {
|
|
264
|
-
const __devflareEvent = createScheduledEvent(controller, env, ctx)
|
|
265
|
-
return runWithEventContext(
|
|
266
|
-
__devflareEvent,
|
|
267
|
-
() => __devflareScheduledHandler(__devflareEvent, env, ctx)
|
|
268
|
-
)
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
: {}),
|
|
272
|
-
...(__devflareEmailHandler
|
|
273
|
-
? {
|
|
274
|
-
async email(message, env, ctx) {
|
|
275
|
-
const __devflareEvent = createEmailEvent(message, env, ctx)
|
|
276
|
-
return runWithEventContext(
|
|
277
|
-
__devflareEvent,
|
|
278
|
-
() => __devflareEmailHandler(__devflareEvent, env, ctx)
|
|
279
|
-
)
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
: {})
|
|
283
|
-
}
|
|
284
|
-
`.trimStart();
|
|
285
|
-
}
|
|
286
|
-
async function prepareComposedWorkerEntrypoint(cwd, config, environment, options = {}) {
|
|
287
|
-
const resolvedConfig = resolveConfigForEnvironment(config, environment);
|
|
288
|
-
if (resolvedConfig.wrangler?.passthrough && Object.prototype.hasOwnProperty.call(resolvedConfig.wrangler.passthrough, "main")) {
|
|
289
|
-
return null;
|
|
290
|
-
}
|
|
291
|
-
const surfacePaths = await resolveWorkerSurfacePaths(cwd, resolvedConfig);
|
|
292
|
-
const routeDiscovery = await discoverRoutes(cwd, resolvedConfig);
|
|
293
|
-
if (!needsComposedWorkerEntrypoint(surfacePaths, routeDiscovery)) {
|
|
294
|
-
return null;
|
|
295
|
-
}
|
|
296
|
-
const fs = await import("node:fs/promises");
|
|
297
|
-
const entryDir = resolve(cwd, ".devflare", "worker-entrypoints");
|
|
298
|
-
const entryPath = resolve(entryDir, "main.ts");
|
|
299
|
-
await fs.mkdir(entryDir, { recursive: true });
|
|
300
|
-
const surfaceImportPaths = {
|
|
301
|
-
fetch: surfacePaths.fetch ? toImportSpecifier(entryPath, surfacePaths.fetch) : null,
|
|
302
|
-
queue: surfacePaths.queue ? toImportSpecifier(entryPath, surfacePaths.queue) : null,
|
|
303
|
-
scheduled: surfacePaths.scheduled ? toImportSpecifier(entryPath, surfacePaths.scheduled) : null,
|
|
304
|
-
email: surfacePaths.email ? toImportSpecifier(entryPath, surfacePaths.email) : null
|
|
305
|
-
};
|
|
306
|
-
const routeImports = createGeneratedRouteModuleImports(entryPath, routeDiscovery);
|
|
307
|
-
await fs.writeFile(entryPath, getComposedWorkerEntrypointSource(surfaceImportPaths, resolvedConfig.bindings?.sendEmail ?? {}, routeImports, options));
|
|
308
|
-
return ".devflare/worker-entrypoints/main.ts";
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
export { prepareComposedWorkerEntrypoint };
|