devflare 1.0.0-next.1 → 1.0.0-next.11

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 (123) hide show
  1. package/LLM.md +1424 -610
  2. package/R2.md +200 -0
  3. package/README.md +302 -505
  4. package/bin/devflare.js +8 -8
  5. package/dist/{account-rvrj687w.js → account-8psavtg6.js} +27 -4
  6. package/dist/bridge/miniflare.d.ts +6 -0
  7. package/dist/bridge/miniflare.d.ts.map +1 -1
  8. package/dist/bridge/proxy.d.ts +5 -6
  9. package/dist/bridge/proxy.d.ts.map +1 -1
  10. package/dist/bridge/server.d.ts.map +1 -1
  11. package/dist/browser.d.ts +50 -0
  12. package/dist/browser.d.ts.map +1 -0
  13. package/dist/{build-mnf6v8gd.js → build-ezksv2dd.js} +26 -7
  14. package/dist/bundler/do-bundler.d.ts +7 -0
  15. package/dist/bundler/do-bundler.d.ts.map +1 -1
  16. package/dist/cli/commands/account.d.ts.map +1 -1
  17. package/dist/cli/commands/build.d.ts.map +1 -1
  18. package/dist/cli/commands/deploy.d.ts.map +1 -1
  19. package/dist/cli/commands/dev.d.ts.map +1 -1
  20. package/dist/cli/commands/doctor.d.ts.map +1 -1
  21. package/dist/cli/commands/init.d.ts.map +1 -1
  22. package/dist/cli/commands/types.d.ts.map +1 -1
  23. package/dist/cli/config-path.d.ts +5 -0
  24. package/dist/cli/config-path.d.ts.map +1 -0
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/package-metadata.d.ts +16 -0
  27. package/dist/cli/package-metadata.d.ts.map +1 -0
  28. package/dist/config/compiler.d.ts +7 -0
  29. package/dist/config/compiler.d.ts.map +1 -1
  30. package/dist/config/index.d.ts +1 -1
  31. package/dist/config/index.d.ts.map +1 -1
  32. package/dist/config/schema.d.ts +2594 -1234
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/{deploy-nhceck39.js → deploy-jdpy21t6.js} +33 -15
  35. package/dist/{dev-qnxet3j9.js → dev-9mq7zhww.js} +900 -234
  36. package/dist/dev-server/miniflare-log.d.ts +12 -0
  37. package/dist/dev-server/miniflare-log.d.ts.map +1 -0
  38. package/dist/dev-server/runtime-stdio.d.ts +8 -0
  39. package/dist/dev-server/runtime-stdio.d.ts.map +1 -0
  40. package/dist/dev-server/server.d.ts +2 -0
  41. package/dist/dev-server/server.d.ts.map +1 -1
  42. package/dist/dev-server/vite-utils.d.ts +37 -0
  43. package/dist/dev-server/vite-utils.d.ts.map +1 -0
  44. package/dist/{doctor-e8fy6fj5.js → doctor-z4ffybce.js} +73 -50
  45. package/dist/{durable-object-t4kbb0yt.js → durable-object-yt8v1dyn.js} +1 -1
  46. package/dist/index-1p814k7s.js +227 -0
  47. package/dist/{index-tk6ej9dj.js → index-2q3pmzrx.js} +12 -16
  48. package/dist/{index-67qcae0f.js → index-51s1hkw4.js} +16 -1
  49. package/dist/{index-ep3445yc.js → index-53xcakh8.js} +414 -171
  50. package/dist/{index-pf5s73n9.js → index-59df49vn.js} +11 -281
  51. package/dist/index-5yxg30va.js +304 -0
  52. package/dist/index-62b3gt2g.js +12 -0
  53. package/dist/index-6h8xbs75.js +44 -0
  54. package/dist/index-8gtqgb3q.js +529 -0
  55. package/dist/{index-gz1gndna.js → index-9wt9x09k.js} +42 -62
  56. package/dist/index-dr6sbp8d.js +39 -0
  57. package/dist/index-fef08w43.js +231 -0
  58. package/dist/index-k7r18na8.js +0 -0
  59. package/dist/{index-m2q41jwa.js → index-n932ytmq.js} +9 -1
  60. package/dist/{index-07q6yxyc.js → index-v8vvsn9x.js} +1 -0
  61. package/dist/index-vky23txa.js +70 -0
  62. package/dist/{index-z14anrqp.js → index-wfbfz02q.js} +14 -15
  63. package/dist/index-ws68xvq2.js +311 -0
  64. package/dist/{index-hcex3rgh.js → index-wyf3s77s.js} +85 -8
  65. package/dist/index-xqfbd9fx.js +195 -0
  66. package/dist/index-xxwbb2nt.js +322 -0
  67. package/dist/index-y1d8za14.js +196 -0
  68. package/dist/{init-f9mgmew3.js → init-na2atvz2.js} +42 -55
  69. package/dist/router/types.d.ts +24 -0
  70. package/dist/router/types.d.ts.map +1 -0
  71. package/dist/runtime/context.d.ts +249 -8
  72. package/dist/runtime/context.d.ts.map +1 -1
  73. package/dist/runtime/exports.d.ts +50 -55
  74. package/dist/runtime/exports.d.ts.map +1 -1
  75. package/dist/runtime/index.d.ts +8 -1
  76. package/dist/runtime/index.d.ts.map +1 -1
  77. package/dist/runtime/middleware.d.ts +77 -60
  78. package/dist/runtime/middleware.d.ts.map +1 -1
  79. package/dist/runtime/router.d.ts +7 -0
  80. package/dist/runtime/router.d.ts.map +1 -0
  81. package/dist/runtime/validation.d.ts +1 -1
  82. package/dist/runtime/validation.d.ts.map +1 -1
  83. package/dist/src/browser.js +150 -0
  84. package/dist/src/cli/index.js +10 -0
  85. package/dist/{cloudflare → src/cloudflare}/index.js +3 -3
  86. package/dist/{decorators → src/decorators}/index.js +2 -2
  87. package/dist/src/index.js +132 -0
  88. package/dist/src/runtime/index.js +111 -0
  89. package/dist/{sveltekit → src/sveltekit}/index.js +14 -6
  90. package/dist/{test → src/test}/index.js +22 -13
  91. package/dist/{vite → src/vite}/index.js +128 -59
  92. package/dist/sveltekit/platform.d.ts.map +1 -1
  93. package/dist/test/bridge-context.d.ts +5 -2
  94. package/dist/test/bridge-context.d.ts.map +1 -1
  95. package/dist/test/cf.d.ts +25 -11
  96. package/dist/test/cf.d.ts.map +1 -1
  97. package/dist/test/email.d.ts +16 -7
  98. package/dist/test/email.d.ts.map +1 -1
  99. package/dist/test/queue.d.ts.map +1 -1
  100. package/dist/test/resolve-service-bindings.d.ts.map +1 -1
  101. package/dist/test/scheduled.d.ts.map +1 -1
  102. package/dist/test/simple-context.d.ts +1 -1
  103. package/dist/test/simple-context.d.ts.map +1 -1
  104. package/dist/test/tail.d.ts +2 -1
  105. package/dist/test/tail.d.ts.map +1 -1
  106. package/dist/test/worker.d.ts +6 -0
  107. package/dist/test/worker.d.ts.map +1 -1
  108. package/dist/transform/durable-object.d.ts.map +1 -1
  109. package/dist/transform/worker-entrypoint.d.ts.map +1 -1
  110. package/dist/{types-5nyrz1sz.js → types-nq5acrwh.js} +30 -16
  111. package/dist/utils/entrypoint-discovery.d.ts +6 -3
  112. package/dist/utils/entrypoint-discovery.d.ts.map +1 -1
  113. package/dist/utils/send-email.d.ts +15 -0
  114. package/dist/utils/send-email.d.ts.map +1 -0
  115. package/dist/vite/plugin.d.ts.map +1 -1
  116. package/dist/worker-entry/composed-worker.d.ts +13 -0
  117. package/dist/worker-entry/composed-worker.d.ts.map +1 -0
  118. package/dist/worker-entry/routes.d.ts +22 -0
  119. package/dist/worker-entry/routes.d.ts.map +1 -0
  120. package/dist/{worker-entrypoint-m9th0rg0.js → worker-entrypoint-c259fmfs.js} +1 -1
  121. package/package.json +21 -19
  122. package/dist/index.js +0 -298
  123. package/dist/runtime/index.js +0 -111
@@ -0,0 +1,12 @@
1
+ export interface MiniflareCompatibilityLogger {
2
+ info(message: string): void;
3
+ }
4
+ interface MiniflareLogLike {
5
+ warn(message: string): void;
6
+ info(message: string): void;
7
+ }
8
+ type MiniflareLogConstructor = new (level?: number) => MiniflareLogLike;
9
+ export declare function formatCompatibilityDateFallbackNotice(message: string): string | null;
10
+ export declare function createCompatibilityAwareMiniflareLog<TBase extends MiniflareLogConstructor>(BaseLog: TBase, level: number, logger?: MiniflareCompatibilityLogger): InstanceType<TBase>;
11
+ export {};
12
+ //# sourceMappingURL=miniflare-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniflare-log.d.ts","sourceRoot":"","sources":["../../src/dev-server/miniflare-log.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,UAAU,gBAAgB;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,KAAK,uBAAuB,GAAG,KAAK,KAAK,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAA;AASvE,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUpF;AAED,wBAAgB,oCAAoC,CAAC,KAAK,SAAS,uBAAuB,EACzF,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,4BAA4B,GACnC,YAAY,CAAC,KAAK,CAAC,CAsBrB"}
@@ -0,0 +1,8 @@
1
+ import type { Readable } from 'node:stream';
2
+ export interface RuntimeStdioLogger {
3
+ log?(message: string): void;
4
+ info?(message: string): void;
5
+ error?(message: string): void;
6
+ }
7
+ export declare function createRuntimeStdioForwarder(logger?: RuntimeStdioLogger): (stdout: Readable, stderr: Readable) => void;
8
+ //# sourceMappingURL=runtime-stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-stdio.d.ts","sourceRoot":"","sources":["../../src/dev-server/runtime-stdio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,WAAW,kBAAkB;IAClC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAyBD,wBAAgB,2BAA2B,CAAC,MAAM,CAAC,EAAE,kBAAkB,gDAUtE"}
@@ -9,6 +9,8 @@ export interface DevServerOptions {
9
9
  vitePort?: number;
10
10
  /** Miniflare port for gateway (default: 8787) */
11
11
  miniflarePort?: number;
12
+ /** Whether to start Vite for this package */
13
+ enableVite?: boolean;
12
14
  /** Persist storage data */
13
15
  persist?: boolean;
14
16
  /** Logger instance */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dev-server/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAA;AAa3D,MAAM,WAAW,gBAAgB;IAChC,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACzB,2BAA2B;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,0BAA0B;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,yCAAyC;IACzC,YAAY,IAAI,aAAa,GAAG,IAAI,CAAA;CACpC;AA2kBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAmepE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dev-server/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAA;AAmB3D,MAAM,WAAW,gBAAgB;IAChC,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACzB,2BAA2B;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,0BAA0B;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,yCAAyC;IACzC,YAAY,IAAI,aAAa,GAAG,IAAI,CAAA;CACpC;AAktBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA64BpE"}
@@ -0,0 +1,37 @@
1
+ export declare const VITE_CONFIG_FILES: readonly ["vite.config.ts", "vite.config.js", "vite.config.mts", "vite.config.mjs", "vite.config.cts", "vite.config.cjs"];
2
+ export interface ViteProjectFileSystem {
3
+ access(path: string): Promise<void>;
4
+ readFile(path: string, encoding: BufferEncoding): Promise<string>;
5
+ }
6
+ export interface ViteProjectDetection {
7
+ viteConfigPath: string | null;
8
+ hasLocalViteDependency: boolean;
9
+ hasLocalCloudflareVitePluginDependency: boolean;
10
+ shouldStartVite: boolean;
11
+ wantsViteIntegration: boolean;
12
+ }
13
+ export interface SpawnedLikeProcess {
14
+ pid?: number;
15
+ stdout: NodeJS.ReadableStream | null;
16
+ stderr: NodeJS.ReadableStream | null;
17
+ readonly killed: boolean;
18
+ kill(signal?: NodeJS.Signals): boolean;
19
+ on(event: 'exit', handler: (code: number | null, signal: NodeJS.Signals | null) => void): SpawnedLikeProcess;
20
+ on(event: 'error', handler: (error: Error) => void): SpawnedLikeProcess;
21
+ }
22
+ export interface WaitForViteReadyOptions {
23
+ timeoutMs?: number;
24
+ onStdout?: (chunk: string | Buffer) => void;
25
+ onStderr?: (chunk: string | Buffer) => void;
26
+ }
27
+ export interface StopProcessTreeOptions {
28
+ platform?: NodeJS.Platform;
29
+ timeoutMs?: number;
30
+ runCommand?: (command: string, args: string[]) => Promise<void>;
31
+ }
32
+ export declare function detectViteProject(cwd: string, fs?: ViteProjectFileSystem): Promise<ViteProjectDetection>;
33
+ export declare function stripAnsi(value: string): string;
34
+ export declare function extractViteReadyUrl(output: string): string | null;
35
+ export declare function waitForViteReady(process: SpawnedLikeProcess, options?: WaitForViteReadyOptions): Promise<string | null>;
36
+ export declare function stopSpawnedProcessTree(process: Pick<SpawnedLikeProcess, 'pid' | 'kill' | 'killed' | 'on'>, options?: StopProcessTreeOptions): Promise<void>;
37
+ //# sourceMappingURL=vite-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-utils.d.ts","sourceRoot":"","sources":["../../src/dev-server/vite-utils.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,2HAOpB,CAAA;AAEV,MAAM,WAAW,qBAAqB;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACjE;AAED,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,sCAAsC,EAAE,OAAO,CAAA;IAC/C,eAAe,EAAE,OAAO,CAAA;IACxB,oBAAoB,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,kBAAkB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IACpC,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAA;IACtC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GAAG,kBAAkB,CAAA;IAC5G,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,kBAAkB,CAAA;CACvE;AAED,MAAM,WAAW,uBAAuB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D;AAwBD,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,EAAE,CAAC,EAAE,qBAAqB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAoC/B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBjE;AAED,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuDxB;AA2CD,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,EACnE,OAAO,GAAE,sBAA2B,GAClC,OAAO,CAAC,IAAI,CAAC,CAwCf"}
@@ -1,29 +1,41 @@
1
1
  import {
2
- loadConfig,
3
- resolveConfigPath
4
- } from "./index-hcex3rgh.js";
2
+ detectViteProject
3
+ } from "./index-y1d8za14.js";
4
+ import {
5
+ formatSupportedConfigFilenames,
6
+ resolveConfigCandidatePath
7
+ } from "./index-dr6sbp8d.js";
5
8
  import {
6
9
  getDependencies
7
10
  } from "./index-1xpj0m4r.js";
11
+ import {
12
+ loadConfig
13
+ } from "./index-wyf3s77s.js";
8
14
  import"./index-37x76zdn.js";
9
15
 
10
16
  // src/cli/commands/doctor.ts
11
- import { resolve } from "pathe";
17
+ import { basename, dirname, relative, resolve } from "pathe";
12
18
  async function runDoctorCommand(parsed, logger, options) {
13
19
  const cwd = options.cwd || process.cwd();
20
+ const requestedConfigOption = parsed.options.config;
21
+ const requestedConfigPath = requestedConfigOption ? resolve(cwd, requestedConfigOption) : cwd;
14
22
  const checks = [];
15
23
  const { fs } = await getDependencies();
24
+ const viteProject = await detectViteProject(cwd, fs);
16
25
  logger.info(`Running diagnostics...
17
26
  `);
18
- try {
19
- const configPath = await resolveConfigPath(cwd);
27
+ const configPath = await resolveConfigCandidatePath(requestedConfigPath);
28
+ if (configPath) {
20
29
  checks.push({
21
30
  name: "Config File",
22
31
  status: "pass",
23
32
  message: `Found: ${configPath}`
24
33
  });
25
34
  try {
26
- const config = await loadConfig({ cwd });
35
+ const config = requestedConfigOption ? await loadConfig({
36
+ cwd: dirname(configPath),
37
+ configFile: basename(configPath)
38
+ }) : await loadConfig({ cwd });
27
39
  checks.push({
28
40
  name: "Config Valid",
29
41
  status: "pass",
@@ -36,11 +48,11 @@ async function runDoctorCommand(parsed, logger, options) {
36
48
  message: error instanceof Error ? error.message : "Unknown error"
37
49
  });
38
50
  }
39
- } catch {
51
+ } else {
40
52
  checks.push({
41
53
  name: "Config File",
42
54
  status: "fail",
43
- message: "devflare.config.ts not found. Run `devflare init` to create one."
55
+ message: `${formatSupportedConfigFilenames()} not found. Run \`devflare init\` to create one.`
44
56
  });
45
57
  }
46
58
  const packageJsonPath = resolve(cwd, "package.json");
@@ -67,63 +79,63 @@ async function runDoctorCommand(parsed, logger, options) {
67
79
  message: "devflare not in dependencies"
68
80
  });
69
81
  }
70
- if (deps.vite) {
82
+ } catch {
83
+ checks.push({
84
+ name: "package.json",
85
+ status: "fail",
86
+ message: "package.json not found"
87
+ });
88
+ }
89
+ if (viteProject.wantsViteIntegration) {
90
+ checks.push({
91
+ name: "Vite Integration",
92
+ status: "pass",
93
+ message: "Enabled for this package"
94
+ });
95
+ if (viteProject.hasLocalViteDependency) {
71
96
  checks.push({
72
97
  name: "vite dep",
73
98
  status: "pass",
74
- message: `Version: ${deps.vite}`
99
+ message: "Found in package.json"
75
100
  });
76
101
  } else {
77
102
  checks.push({
78
103
  name: "vite dep",
79
- status: "fail",
80
- message: "vite required but not found"
104
+ status: "warn",
105
+ message: "Not declared in this package.json (workspace-hoisted installs may still work)"
81
106
  });
82
107
  }
83
- if (deps["@cloudflare/vite-plugin"]) {
108
+ if (viteProject.hasLocalCloudflareVitePluginDependency) {
84
109
  checks.push({
85
110
  name: "@cloudflare/vite-plugin",
86
111
  status: "pass",
87
- message: `Version: ${deps["@cloudflare/vite-plugin"]}`
112
+ message: "Found in package.json"
88
113
  });
89
114
  } else {
90
115
  checks.push({
91
116
  name: "@cloudflare/vite-plugin",
92
- status: "fail",
93
- message: "@cloudflare/vite-plugin required but not found"
117
+ status: "warn",
118
+ message: "Not declared in this package.json"
94
119
  });
95
120
  }
96
- } catch {
97
- checks.push({
98
- name: "package.json",
99
- status: "fail",
100
- message: "package.json not found"
101
- });
102
- }
103
- const viteConfigPaths = [
104
- "vite.config.ts",
105
- "vite.config.js",
106
- "vite.config.mts",
107
- "vite.config.mjs"
108
- ];
109
- let viteConfigFound = false;
110
- for (const configName of viteConfigPaths) {
111
- try {
112
- await fs.access(resolve(cwd, configName));
113
- viteConfigFound = true;
121
+ if (viteProject.viteConfigPath) {
114
122
  checks.push({
115
123
  name: "Vite Config",
116
124
  status: "pass",
117
- message: `Found: ${configName}`
125
+ message: `Found: ${viteProject.viteConfigPath}`
118
126
  });
119
- break;
120
- } catch {}
121
- }
122
- if (!viteConfigFound) {
127
+ } else {
128
+ checks.push({
129
+ name: "Vite Config",
130
+ status: "warn",
131
+ message: "No vite.config found. Create one with @cloudflare/vite-plugin"
132
+ });
133
+ }
134
+ } else {
123
135
  checks.push({
124
- name: "Vite Config",
125
- status: "warn",
126
- message: "No vite.config found. Create one with @cloudflare/vite-plugin"
136
+ name: "Vite Integration",
137
+ status: "pass",
138
+ message: "Not enabled for this package (worker-only mode)"
127
139
  });
128
140
  }
129
141
  try {
@@ -141,18 +153,29 @@ async function runDoctorCommand(parsed, logger, options) {
141
153
  });
142
154
  }
143
155
  try {
144
- await fs.access(resolve(cwd, "wrangler.jsonc"));
156
+ const projectWranglerPath = resolve(cwd, "wrangler.jsonc");
157
+ await fs.access(projectWranglerPath);
145
158
  checks.push({
146
159
  name: "wrangler.jsonc",
147
160
  status: "pass",
148
- message: "Found (generated)"
161
+ message: `Found: ${relative(cwd, projectWranglerPath) || "wrangler.jsonc"}`
149
162
  });
150
163
  } catch {
151
- checks.push({
152
- name: "wrangler.jsonc",
153
- status: "warn",
154
- message: "Not found. Run `devflare dev` or `devflare build` to generate."
155
- });
164
+ try {
165
+ const viteWranglerPath = resolve(cwd, ".devflare", "wrangler.jsonc");
166
+ await fs.access(viteWranglerPath);
167
+ checks.push({
168
+ name: "wrangler.jsonc",
169
+ status: "pass",
170
+ message: `Found: ${relative(cwd, viteWranglerPath)} (Vite-generated)`
171
+ });
172
+ } catch {
173
+ checks.push({
174
+ name: "wrangler.jsonc",
175
+ status: "warn",
176
+ message: "Not found. Run `devflare build` or `devflare deploy` to generate `wrangler.jsonc`, or use `devflare/vite` to populate `.devflare/wrangler.jsonc`."
177
+ });
178
+ }
156
179
  }
157
180
  let hasFailures = false;
158
181
  let hasWarnings = false;
@@ -3,7 +3,7 @@ import {
3
3
  findDurableObjectClassesDetailed,
4
4
  generateWrapper,
5
5
  transformDurableObject
6
- } from "./index-gz1gndna.js";
6
+ } from "./index-9wt9x09k.js";
7
7
  import"./index-37x76zdn.js";
8
8
  export {
9
9
  transformDurableObject,
@@ -0,0 +1,227 @@
1
+ import {
2
+ findFiles
3
+ } from "./index-rbht7m9r.js";
4
+ import {
5
+ __require
6
+ } from "./index-37x76zdn.js";
7
+
8
+ // src/worker-entry/routes.ts
9
+ import { relative, resolve } from "pathe";
10
+ var DEFAULT_ROUTE_DIR = "src/routes";
11
+ var DEFAULT_ROUTE_FILE_PATTERNS = [
12
+ "**/*.ts",
13
+ "**/*.tsx",
14
+ "**/*.js",
15
+ "**/*.jsx",
16
+ "**/*.mts",
17
+ "**/*.mjs"
18
+ ];
19
+ function normalizeRoutePrefix(prefix) {
20
+ if (!prefix || prefix === "/") {
21
+ return "";
22
+ }
23
+ const normalized = prefix.startsWith("/") ? prefix : `/${prefix}`;
24
+ return normalized.replace(/\/+$/g, "");
25
+ }
26
+ function createStaticSegmentsFromPrefix(prefix) {
27
+ if (!prefix) {
28
+ return [];
29
+ }
30
+ return prefix.split("/").filter(Boolean).map((value) => ({
31
+ type: "static",
32
+ value
33
+ }));
34
+ }
35
+ function shouldIgnoreRouteFile(relativePath) {
36
+ return relativePath.split("/").some((segment) => segment.startsWith("_"));
37
+ }
38
+ function toRoutePath(segments) {
39
+ if (segments.length === 0) {
40
+ return "/";
41
+ }
42
+ return `/${segments.map((segment) => {
43
+ if (segment.type === "static") {
44
+ return segment.value;
45
+ }
46
+ if (segment.type === "param") {
47
+ return `[${segment.name}]`;
48
+ }
49
+ if (segment.type === "rest") {
50
+ return `[...${segment.name}]`;
51
+ }
52
+ return `[[...${segment.name}]]`;
53
+ }).join("/")}`;
54
+ }
55
+ function getRouteSignature(segments) {
56
+ if (segments.length === 0) {
57
+ return "/";
58
+ }
59
+ return segments.map((segment) => {
60
+ if (segment.type === "static") {
61
+ return `static:${segment.value}`;
62
+ }
63
+ if (segment.type === "param") {
64
+ return "param";
65
+ }
66
+ if (segment.type === "rest") {
67
+ return "rest";
68
+ }
69
+ return "optional-rest";
70
+ }).join("/");
71
+ }
72
+ function getSegmentPriority(segment) {
73
+ if (segment.type === "static") {
74
+ return 4;
75
+ }
76
+ if (segment.type === "param") {
77
+ return 3;
78
+ }
79
+ if (segment.type === "rest") {
80
+ return 1;
81
+ }
82
+ return 0;
83
+ }
84
+ function compareRoutes(a, b) {
85
+ const maxLength = Math.max(a.segments.length, b.segments.length);
86
+ for (let index = 0;index < maxLength; index += 1) {
87
+ const left = a.segments[index];
88
+ const right = b.segments[index];
89
+ if (!left && !right) {
90
+ break;
91
+ }
92
+ if (!left) {
93
+ return 1;
94
+ }
95
+ if (!right) {
96
+ return -1;
97
+ }
98
+ const priorityDifference = getSegmentPriority(right) - getSegmentPriority(left);
99
+ if (priorityDifference !== 0) {
100
+ return priorityDifference;
101
+ }
102
+ if (left.type === "static" && right.type === "static") {
103
+ const lexicalDifference = left.value.localeCompare(right.value);
104
+ if (lexicalDifference !== 0) {
105
+ return lexicalDifference;
106
+ }
107
+ }
108
+ }
109
+ return a.filePath.localeCompare(b.filePath);
110
+ }
111
+ function parseRouteSegments(relativePath, prefixSegments) {
112
+ const withoutExtension = relativePath.replace(/\.[^.]+$/u, "");
113
+ const rawSegments = withoutExtension.split("/").filter(Boolean);
114
+ const routeSegments = [...prefixSegments];
115
+ for (let index = 0;index < rawSegments.length; index += 1) {
116
+ const segment = rawSegments[index];
117
+ const isLastSegment = index === rawSegments.length - 1;
118
+ if (segment === "index" && isLastSegment) {
119
+ continue;
120
+ }
121
+ const optionalRestMatch = segment.match(/^\[\[\.\.\.(.+)\]\]$/u);
122
+ if (optionalRestMatch) {
123
+ if (!isLastSegment) {
124
+ throw new Error(`Optional rest segment must be the final segment: ${relativePath}`);
125
+ }
126
+ routeSegments.push({
127
+ type: "optional-rest",
128
+ name: optionalRestMatch[1]
129
+ });
130
+ continue;
131
+ }
132
+ const restMatch = segment.match(/^\[\.\.\.(.+)\]$/u);
133
+ if (restMatch) {
134
+ if (!isLastSegment) {
135
+ throw new Error(`Rest segment must be the final segment: ${relativePath}`);
136
+ }
137
+ routeSegments.push({
138
+ type: "rest",
139
+ name: restMatch[1]
140
+ });
141
+ continue;
142
+ }
143
+ const dynamicMatch = segment.match(/^\[(.+)\]$/u);
144
+ if (dynamicMatch) {
145
+ routeSegments.push({
146
+ type: "param",
147
+ name: dynamicMatch[1]
148
+ });
149
+ continue;
150
+ }
151
+ routeSegments.push({
152
+ type: "static",
153
+ value: segment
154
+ });
155
+ }
156
+ return routeSegments;
157
+ }
158
+ async function directoryExists(dirPath) {
159
+ const fs = await import("node:fs/promises");
160
+ try {
161
+ const stat = await fs.stat(dirPath);
162
+ return stat.isDirectory();
163
+ } catch {
164
+ return false;
165
+ }
166
+ }
167
+ function getRouteDirectoryCandidate(cwd, config) {
168
+ const routesConfig = config.files?.routes;
169
+ if (routesConfig === false) {
170
+ return null;
171
+ }
172
+ const dir = routesConfig?.dir ?? DEFAULT_ROUTE_DIR;
173
+ return {
174
+ dir,
175
+ absoluteDir: resolve(cwd, dir),
176
+ prefix: normalizeRoutePrefix(routesConfig?.prefix)
177
+ };
178
+ }
179
+ async function discoverRoutes(cwd, config) {
180
+ const routeDirectory = getRouteDirectoryCandidate(cwd, config);
181
+ if (!routeDirectory) {
182
+ return null;
183
+ }
184
+ if (!await directoryExists(routeDirectory.absoluteDir)) {
185
+ return null;
186
+ }
187
+ const prefixSegments = createStaticSegmentsFromPrefix(routeDirectory.prefix);
188
+ const files = await findFiles(DEFAULT_ROUTE_FILE_PATTERNS, {
189
+ cwd: routeDirectory.absoluteDir,
190
+ absolute: true
191
+ });
192
+ const discoveredRoutes = [];
193
+ const routeSignatures = new Map;
194
+ for (const absolutePath of files) {
195
+ const relativeToRouteDir = relative(routeDirectory.absoluteDir, absolutePath).replace(/\\/g, "/");
196
+ if (shouldIgnoreRouteFile(relativeToRouteDir)) {
197
+ continue;
198
+ }
199
+ const segments = parseRouteSegments(relativeToRouteDir, prefixSegments);
200
+ const routePath = toRoutePath(segments);
201
+ const filePath = relative(cwd, absolutePath).replace(/\\/g, "/");
202
+ const signature = getRouteSignature(segments);
203
+ const existingFilePath = routeSignatures.get(signature);
204
+ if (existingFilePath) {
205
+ throw new Error(`Conflicting file routes detected for "${routePath}". Both "${existingFilePath}" and "${filePath}" resolve to the same route.`);
206
+ }
207
+ routeSignatures.set(signature, filePath);
208
+ discoveredRoutes.push({
209
+ absolutePath,
210
+ filePath,
211
+ routePath,
212
+ segments
213
+ });
214
+ }
215
+ if (discoveredRoutes.length === 0) {
216
+ return null;
217
+ }
218
+ discoveredRoutes.sort(compareRoutes);
219
+ return {
220
+ dir: routeDirectory.dir,
221
+ absoluteDir: routeDirectory.absoluteDir,
222
+ prefix: routeDirectory.prefix,
223
+ routes: discoveredRoutes
224
+ };
225
+ }
226
+
227
+ export { getRouteDirectoryCandidate, discoverRoutes };
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  DEFAULT_ENTRYPOINT_PATTERN,
3
- findFiles
3
+ findFiles,
4
+ findFilesSync
4
5
  } from "./index-rbht7m9r.js";
5
6
  import {
6
7
  __require
7
8
  } from "./index-37x76zdn.js";
8
9
 
9
10
  // src/utils/entrypoint-discovery.ts
10
- import { readdirSync, readFileSync } from "fs";
11
- import { join } from "path";
11
+ import { readFileSync } from "fs";
12
12
  var ENTRYPOINT_CLASS_PATTERN = /export\s+class\s+(\w+)\s+extends\s+WorkerEntrypoint/g;
13
13
  function findEntrypointClasses(code) {
14
14
  const classes = [];
@@ -19,22 +19,18 @@ function findEntrypointClasses(code) {
19
19
  }
20
20
  return classes;
21
21
  }
22
- var EP_FILE_PATTERN = /^ep\.[^.]+\.ts$/;
23
- function discoverEntrypointsSync(dir) {
22
+ function discoverEntrypointsSync(cwd, pattern = DEFAULT_ENTRYPOINT_PATTERN) {
24
23
  const discovered = [];
25
24
  try {
26
- const files = readdirSync(dir, { withFileTypes: true });
25
+ const files = findFilesSync(pattern, { cwd });
27
26
  for (const file of files) {
28
- if (file.isFile() && EP_FILE_PATTERN.test(file.name)) {
29
- const filePath = join(dir, file.name);
30
- try {
31
- const code = readFileSync(filePath, "utf-8");
32
- const classNames = findEntrypointClasses(code);
33
- for (const className of classNames) {
34
- discovered.push({ className, filePath });
35
- }
36
- } catch {}
37
- }
27
+ try {
28
+ const code = readFileSync(file, "utf-8");
29
+ const classNames = findEntrypointClasses(code);
30
+ for (const className of classNames) {
31
+ discovered.push({ className, filePath: file });
32
+ }
33
+ } catch {}
38
34
  }
39
35
  } catch {}
40
36
  return discovered;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  normalizeDOBinding
3
- } from "./index-hcex3rgh.js";
3
+ } from "./index-wyf3s77s.js";
4
4
  import {
5
5
  __require
6
6
  } from "./index-37x76zdn.js";
@@ -133,6 +133,7 @@ function compileBindings(bindings, result) {
133
133
  result.services = Object.entries(bindings.services).map(([binding, config]) => ({
134
134
  binding,
135
135
  service: config.service,
136
+ ...config.entrypoint && { entrypoint: config.entrypoint },
136
137
  ...config.environment && { environment: config.environment }
137
138
  }));
138
139
  }
@@ -160,6 +161,20 @@ function compileBindings(bindings, result) {
160
161
  dataset: config.dataset
161
162
  }));
162
163
  }
164
+ if (bindings.sendEmail) {
165
+ result.send_email = Object.entries(bindings.sendEmail).map(([name, config]) => ({
166
+ name,
167
+ ...config.destinationAddress && {
168
+ destination_address: config.destinationAddress
169
+ },
170
+ ...config.allowedDestinationAddresses && {
171
+ allowed_destination_addresses: config.allowedDestinationAddresses
172
+ },
173
+ ...config.allowedSenderAddresses && {
174
+ allowed_sender_addresses: config.allowedSenderAddresses
175
+ }
176
+ }));
177
+ }
163
178
  }
164
179
  function stringifyConfig(config) {
165
180
  const header = `// Generated by devflare — Do not edit directly