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.
- package/LLM.md +1424 -610
- package/R2.md +200 -0
- package/README.md +302 -505
- package/bin/devflare.js +8 -8
- package/dist/{account-rvrj687w.js → account-8psavtg6.js} +27 -4
- package/dist/bridge/miniflare.d.ts +6 -0
- package/dist/bridge/miniflare.d.ts.map +1 -1
- package/dist/bridge/proxy.d.ts +5 -6
- package/dist/bridge/proxy.d.ts.map +1 -1
- package/dist/bridge/server.d.ts.map +1 -1
- package/dist/browser.d.ts +50 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/{build-mnf6v8gd.js → build-ezksv2dd.js} +26 -7
- package/dist/bundler/do-bundler.d.ts +7 -0
- package/dist/bundler/do-bundler.d.ts.map +1 -1
- package/dist/cli/commands/account.d.ts.map +1 -1
- 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/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/types.d.ts.map +1 -1
- package/dist/cli/config-path.d.ts +5 -0
- package/dist/cli/config-path.d.ts.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/package-metadata.d.ts +16 -0
- package/dist/cli/package-metadata.d.ts.map +1 -0
- package/dist/config/compiler.d.ts +7 -0
- package/dist/config/compiler.d.ts.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/schema.d.ts +2594 -1234
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/{deploy-nhceck39.js → deploy-jdpy21t6.js} +33 -15
- package/dist/{dev-qnxet3j9.js → dev-9mq7zhww.js} +900 -234
- package/dist/dev-server/miniflare-log.d.ts +12 -0
- package/dist/dev-server/miniflare-log.d.ts.map +1 -0
- package/dist/dev-server/runtime-stdio.d.ts +8 -0
- package/dist/dev-server/runtime-stdio.d.ts.map +1 -0
- package/dist/dev-server/server.d.ts +2 -0
- package/dist/dev-server/server.d.ts.map +1 -1
- package/dist/dev-server/vite-utils.d.ts +37 -0
- package/dist/dev-server/vite-utils.d.ts.map +1 -0
- package/dist/{doctor-e8fy6fj5.js → doctor-z4ffybce.js} +73 -50
- package/dist/{durable-object-t4kbb0yt.js → durable-object-yt8v1dyn.js} +1 -1
- package/dist/index-1p814k7s.js +227 -0
- package/dist/{index-tk6ej9dj.js → index-2q3pmzrx.js} +12 -16
- package/dist/{index-67qcae0f.js → index-51s1hkw4.js} +16 -1
- package/dist/{index-ep3445yc.js → index-53xcakh8.js} +414 -171
- package/dist/{index-pf5s73n9.js → index-59df49vn.js} +11 -281
- package/dist/index-5yxg30va.js +304 -0
- package/dist/index-62b3gt2g.js +12 -0
- package/dist/index-6h8xbs75.js +44 -0
- package/dist/index-8gtqgb3q.js +529 -0
- package/dist/{index-gz1gndna.js → index-9wt9x09k.js} +42 -62
- package/dist/index-dr6sbp8d.js +39 -0
- package/dist/index-fef08w43.js +231 -0
- package/dist/index-k7r18na8.js +0 -0
- package/dist/{index-m2q41jwa.js → index-n932ytmq.js} +9 -1
- package/dist/{index-07q6yxyc.js → index-v8vvsn9x.js} +1 -0
- package/dist/index-vky23txa.js +70 -0
- package/dist/{index-z14anrqp.js → index-wfbfz02q.js} +14 -15
- package/dist/index-ws68xvq2.js +311 -0
- package/dist/{index-hcex3rgh.js → index-wyf3s77s.js} +85 -8
- package/dist/index-xqfbd9fx.js +195 -0
- package/dist/index-xxwbb2nt.js +322 -0
- package/dist/index-y1d8za14.js +196 -0
- package/dist/{init-f9mgmew3.js → init-na2atvz2.js} +42 -55
- package/dist/router/types.d.ts +24 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/runtime/context.d.ts +249 -8
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/exports.d.ts +50 -55
- package/dist/runtime/exports.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +8 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/middleware.d.ts +77 -60
- package/dist/runtime/middleware.d.ts.map +1 -1
- package/dist/runtime/router.d.ts +7 -0
- package/dist/runtime/router.d.ts.map +1 -0
- package/dist/runtime/validation.d.ts +1 -1
- package/dist/runtime/validation.d.ts.map +1 -1
- package/dist/src/browser.js +150 -0
- package/dist/src/cli/index.js +10 -0
- package/dist/{cloudflare → src/cloudflare}/index.js +3 -3
- package/dist/{decorators → src/decorators}/index.js +2 -2
- package/dist/src/index.js +132 -0
- package/dist/src/runtime/index.js +111 -0
- package/dist/{sveltekit → src/sveltekit}/index.js +14 -6
- package/dist/{test → src/test}/index.js +22 -13
- package/dist/{vite → src/vite}/index.js +128 -59
- package/dist/sveltekit/platform.d.ts.map +1 -1
- package/dist/test/bridge-context.d.ts +5 -2
- package/dist/test/bridge-context.d.ts.map +1 -1
- package/dist/test/cf.d.ts +25 -11
- package/dist/test/cf.d.ts.map +1 -1
- package/dist/test/email.d.ts +16 -7
- package/dist/test/email.d.ts.map +1 -1
- package/dist/test/queue.d.ts.map +1 -1
- package/dist/test/resolve-service-bindings.d.ts.map +1 -1
- package/dist/test/scheduled.d.ts.map +1 -1
- package/dist/test/simple-context.d.ts +1 -1
- package/dist/test/simple-context.d.ts.map +1 -1
- package/dist/test/tail.d.ts +2 -1
- package/dist/test/tail.d.ts.map +1 -1
- package/dist/test/worker.d.ts +6 -0
- package/dist/test/worker.d.ts.map +1 -1
- package/dist/transform/durable-object.d.ts.map +1 -1
- package/dist/transform/worker-entrypoint.d.ts.map +1 -1
- package/dist/{types-5nyrz1sz.js → types-nq5acrwh.js} +30 -16
- package/dist/utils/entrypoint-discovery.d.ts +6 -3
- package/dist/utils/entrypoint-discovery.d.ts.map +1 -1
- package/dist/utils/send-email.d.ts +15 -0
- package/dist/utils/send-email.d.ts.map +1 -0
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/worker-entry/composed-worker.d.ts +13 -0
- package/dist/worker-entry/composed-worker.d.ts.map +1 -0
- package/dist/worker-entry/routes.d.ts +22 -0
- package/dist/worker-entry/routes.d.ts.map +1 -0
- package/dist/{worker-entrypoint-m9th0rg0.js → worker-entrypoint-c259fmfs.js} +1 -1
- package/package.json +21 -19
- package/dist/index.js +0 -298
- 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;
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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({
|
|
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
|
-
}
|
|
51
|
+
} else {
|
|
40
52
|
checks.push({
|
|
41
53
|
name: "Config File",
|
|
42
54
|
status: "fail",
|
|
43
|
-
message:
|
|
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
|
-
|
|
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:
|
|
99
|
+
message: "Found in package.json"
|
|
75
100
|
});
|
|
76
101
|
} else {
|
|
77
102
|
checks.push({
|
|
78
103
|
name: "vite dep",
|
|
79
|
-
status: "
|
|
80
|
-
message: "
|
|
104
|
+
status: "warn",
|
|
105
|
+
message: "Not declared in this package.json (workspace-hoisted installs may still work)"
|
|
81
106
|
});
|
|
82
107
|
}
|
|
83
|
-
if (
|
|
108
|
+
if (viteProject.hasLocalCloudflareVitePluginDependency) {
|
|
84
109
|
checks.push({
|
|
85
110
|
name: "@cloudflare/vite-plugin",
|
|
86
111
|
status: "pass",
|
|
87
|
-
message:
|
|
112
|
+
message: "Found in package.json"
|
|
88
113
|
});
|
|
89
114
|
} else {
|
|
90
115
|
checks.push({
|
|
91
116
|
name: "@cloudflare/vite-plugin",
|
|
92
|
-
status: "
|
|
93
|
-
message: "
|
|
117
|
+
status: "warn",
|
|
118
|
+
message: "Not declared in this package.json"
|
|
94
119
|
});
|
|
95
120
|
}
|
|
96
|
-
|
|
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: ${
|
|
125
|
+
message: `Found: ${viteProject.viteConfigPath}`
|
|
118
126
|
});
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
125
|
-
status: "
|
|
126
|
-
message: "
|
|
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
|
-
|
|
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:
|
|
161
|
+
message: `Found: ${relative(cwd, projectWranglerPath) || "wrangler.jsonc"}`
|
|
149
162
|
});
|
|
150
163
|
} catch {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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;
|
|
@@ -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 {
|
|
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
|
-
|
|
23
|
-
function discoverEntrypointsSync(dir) {
|
|
22
|
+
function discoverEntrypointsSync(cwd, pattern = DEFAULT_ENTRYPOINT_PATTERN) {
|
|
24
23
|
const discovered = [];
|
|
25
24
|
try {
|
|
26
|
-
const files =
|
|
25
|
+
const files = findFilesSync(pattern, { cwd });
|
|
27
26
|
for (const file of files) {
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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-
|
|
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
|