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.
Files changed (45) hide show
  1. package/LLM.md +683 -13
  2. package/README.md +33 -5
  3. package/dist/{build-k36xrzvy.js → build-rfh8cgh3.js} +40 -11
  4. package/dist/bundler/index.d.ts +1 -0
  5. package/dist/bundler/index.d.ts.map +1 -1
  6. package/dist/bundler/worker-bundler.d.ts +14 -0
  7. package/dist/bundler/worker-bundler.d.ts.map +1 -0
  8. package/dist/cli/commands/build.d.ts.map +1 -1
  9. package/dist/cli/commands/deploy.d.ts.map +1 -1
  10. package/dist/cli/commands/dev.d.ts.map +1 -1
  11. package/dist/config/compiler.d.ts.map +1 -1
  12. package/dist/config/index.d.ts +1 -0
  13. package/dist/config/index.d.ts.map +1 -1
  14. package/dist/config/resolve.d.ts +3 -0
  15. package/dist/config/resolve.d.ts.map +1 -0
  16. package/dist/config/schema.d.ts +37 -31
  17. package/dist/config/schema.d.ts.map +1 -1
  18. package/dist/{deploy-dbvfq8vq.js → deploy-k0fcgt3d.js} +40 -11
  19. package/dist/{dev-rk8p6pse.js → dev-d4wabqyf.js} +73 -470
  20. package/dist/dev-server/server.d.ts.map +1 -1
  21. package/dist/{doctor-06y8nxd4.js → doctor-z4ffybce.js} +2 -2
  22. package/dist/{index-jht2j546.js → index-0kzg8wed.js} +26 -6
  23. package/dist/index-1xqeptt2.js +623 -0
  24. package/dist/{index-pwgyy2q9.js → index-dr6sbp8d.js} +1 -1
  25. package/dist/{index-6v3wjg1r.js → index-rfhx0yd5.js} +11 -7
  26. package/dist/{index-05fyzwne.js → index-twpgq9k9.js} +5 -5
  27. package/dist/{index-1phx14av.js → index-wyf3s77s.js} +1 -1
  28. package/dist/{index-vs49yxn4.js → index-xxwbb2nt.js} +1 -1
  29. package/dist/index-zbvmtcn2.js +795 -0
  30. package/dist/src/browser.js +1 -1
  31. package/dist/src/cli/index.js +1 -1
  32. package/dist/src/index.js +12 -13
  33. package/dist/src/sveltekit/index.js +4 -5
  34. package/dist/src/test/index.js +6 -7
  35. package/dist/src/vite/index.js +19 -399
  36. package/dist/test/simple-context.d.ts.map +1 -1
  37. package/dist/{types-x9q7t491.js → types-sffr9681.js} +7 -8
  38. package/dist/vite/config-file.d.ts +25 -0
  39. package/dist/vite/config-file.d.ts.map +1 -0
  40. package/dist/vite/index.d.ts +1 -0
  41. package/dist/vite/index.d.ts.map +1 -1
  42. package/dist/worker-entry/composed-worker.d.ts.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/index-k7r18na8.js +0 -0
  45. package/dist/index-ws68xvq2.js +0 -311
@@ -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 };