devflare 1.0.0-next.16 → 1.0.0-next.17
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 +673 -224
- package/README.md +70 -8
- package/bin/devflare.js +1 -1
- package/dist/{account-fw8nafav.js → account-0evqkmnc.js} +8 -8
- package/dist/{account-0w8wdzjv.js → account-0v11zbzk.js} +9 -9
- package/dist/{account-eygq6qx7.js → account-2w85efas.js} +9 -9
- package/dist/{account-pzq69nys.js → account-61gw9s7t.js} +9 -9
- package/dist/account-65sk9q34.js +475 -0
- package/dist/account-77vx7q2f.js +475 -0
- package/dist/account-7z38mgqf.js +475 -0
- package/dist/account-8wgprpbt.js +475 -0
- package/dist/account-9gt3tej1.js +475 -0
- package/dist/account-dtndtbad.js +475 -0
- package/dist/account-e95v7f4s.js +475 -0
- package/dist/account-fbyyptg7.js +475 -0
- package/dist/account-gnzhz1c9.js +475 -0
- package/dist/account-m6jq6fnp.js +475 -0
- package/dist/account-mvnfagh9.js +475 -0
- package/dist/account-p0crq2gh.js +475 -0
- package/dist/account-qkcevx7a.js +475 -0
- package/dist/account-txwqg1rx.js +475 -0
- package/dist/account-w5n5bjh2.js +475 -0
- package/dist/account-zd61t0ey.js +475 -0
- package/dist/api-11gkk043.js +33 -0
- package/dist/api-2n6dd2ws.js +33 -0
- package/dist/api-dbxvch9h.js +33 -0
- package/dist/api-p9hf69kr.js +33 -0
- package/dist/api-r10j00ev.js +33 -0
- package/dist/api-senf2569.js +33 -0
- package/dist/api-swcgnp72.js +33 -0
- package/dist/{api-d6ekexs5.js → api-th82mps4.js} +3 -1
- package/dist/bridge/client.d.ts +29 -6
- package/dist/bridge/client.d.ts.map +1 -1
- package/dist/bridge/gateway-runtime.d.ts +8 -0
- package/dist/bridge/gateway-runtime.d.ts.map +1 -0
- package/dist/bridge/index.d.ts +2 -2
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/log.d.ts +5 -0
- package/dist/bridge/log.d.ts.map +1 -0
- package/dist/bridge/miniflare.d.ts.map +1 -1
- package/dist/bridge/proxy.d.ts +7 -5
- package/dist/bridge/proxy.d.ts.map +1 -1
- package/dist/bridge/serialization.d.ts +36 -16
- package/dist/bridge/serialization.d.ts.map +1 -1
- package/dist/bridge/server.d.ts +1 -0
- package/dist/bridge/server.d.ts.map +1 -1
- package/dist/bridge/v2/body-streams.d.ts +53 -0
- package/dist/bridge/v2/body-streams.d.ts.map +1 -0
- package/dist/bridge/v2/codec.d.ts +106 -0
- package/dist/bridge/v2/codec.d.ts.map +1 -0
- package/dist/bridge/v2/control-messages.d.ts +51 -0
- package/dist/bridge/v2/control-messages.d.ts.map +1 -0
- package/dist/bridge/v2/frames.d.ts +109 -0
- package/dist/bridge/v2/frames.d.ts.map +1 -0
- package/dist/bridge/v2/index.d.ts +11 -0
- package/dist/bridge/v2/index.d.ts.map +1 -0
- package/dist/bridge/v2/legacy-protocol.d.ts +146 -0
- package/dist/bridge/v2/legacy-protocol.d.ts.map +1 -0
- package/dist/bridge/v2/legacy-serialization.d.ts +103 -0
- package/dist/bridge/v2/legacy-serialization.d.ts.map +1 -0
- package/dist/bridge/v2/serialization.d.ts +48 -0
- package/dist/bridge/v2/serialization.d.ts.map +1 -0
- package/dist/bridge/v2/transport.d.ts +31 -0
- package/dist/bridge/v2/transport.d.ts.map +1 -0
- package/dist/bridge/v2/value-codec.d.ts +61 -0
- package/dist/bridge/v2/value-codec.d.ts.map +1 -0
- package/dist/bridge/v2/value-serialization.d.ts +103 -0
- package/dist/bridge/v2/value-serialization.d.ts.map +1 -0
- package/dist/bridge/v2/wire.d.ts +170 -0
- package/dist/bridge/v2/wire.d.ts.map +1 -0
- package/dist/bridge/v2/ws-relay.d.ts +53 -0
- package/dist/bridge/v2/ws-relay.d.ts.map +1 -0
- package/dist/browser-shim/server.d.ts +63 -0
- package/dist/browser-shim/server.d.ts.map +1 -1
- package/dist/browser.d.ts +396 -38
- package/dist/browser.d.ts.map +1 -1
- package/dist/{src/browser.js → browser.js} +19 -33
- package/dist/build-07mjrvsn.js +53 -0
- package/dist/build-0rfr8k1s.js +53 -0
- package/dist/build-1313sg73.js +52 -0
- package/dist/build-1hnntbks.js +53 -0
- package/dist/build-1r3myv0k.js +53 -0
- package/dist/build-28561w5v.js +54 -0
- package/dist/build-50yqpwb3.js +54 -0
- package/dist/build-55z8psd6.js +53 -0
- package/dist/build-5b9wj2p0.js +53 -0
- package/dist/build-5frhzh1m.js +53 -0
- package/dist/{build-p3r3117t.js → build-6ye9vnab.js} +8 -9
- package/dist/build-8gv18jrq.js +52 -0
- package/dist/build-9bgqypy6.js +53 -0
- package/dist/{build-506kjhcm.js → build-9em4ymqn.js} +12 -13
- package/dist/build-eh3x12qc.js +52 -0
- package/dist/build-emhyycp7.js +53 -0
- package/dist/build-f1m9jn7b.js +53 -0
- package/dist/build-ffe72jjv.js +54 -0
- package/dist/build-fx90y6za.js +53 -0
- package/dist/build-h31egsze.js +53 -0
- package/dist/build-hpczwagb.js +53 -0
- package/dist/build-j2re91xe.js +54 -0
- package/dist/{build-66866ahs.js → build-j78389rg.js} +12 -13
- package/dist/build-m3kckn5g.js +53 -0
- package/dist/build-mf3thcjm.js +53 -0
- package/dist/build-n3n5bv37.js +52 -0
- package/dist/build-ngfy4v5x.js +53 -0
- package/dist/build-pr843h0d.js +52 -0
- package/dist/build-qyg2b45p.js +52 -0
- package/dist/build-r6884kyt.js +53 -0
- package/dist/build-re370wkf.js +53 -0
- package/dist/build-vvndgwg0.js +52 -0
- package/dist/build-wp559jkf.js +54 -0
- package/dist/{build-g1adm3ww.js → build-x4r67275.js} +12 -13
- package/dist/build-xp4pfhvv.js +52 -0
- package/dist/{build-1kmkwqgh.js → build-y489r2h9.js} +16 -15
- package/dist/build-y6g4bvx5.js +52 -0
- package/dist/build-yvn0yhwx.js +52 -0
- package/dist/build-z4vmhs5c.js +53 -0
- package/dist/bundler/defaults.d.ts +23 -0
- package/dist/bundler/defaults.d.ts.map +1 -0
- package/dist/bundler/do-bundler.d.ts.map +1 -1
- package/dist/bundler/index.d.ts +1 -0
- package/dist/bundler/index.d.ts.map +1 -1
- package/dist/bundler/rolldown-shared.d.ts +29 -0
- package/dist/bundler/rolldown-shared.d.ts.map +1 -1
- package/dist/bundler/worker-bundler.d.ts.map +1 -1
- package/dist/bundler/worker-compat.d.ts.map +1 -1
- package/dist/cli/build-manifest.d.ts +54 -0
- package/dist/cli/build-manifest.d.ts.map +1 -0
- package/dist/cli/commands/build-artifacts.d.ts.map +1 -1
- package/dist/cli/commands/deploy.d.ts.map +1 -1
- package/dist/cli/dependencies.d.ts +1 -0
- package/dist/cli/dependencies.d.ts.map +1 -1
- package/dist/cli/deploy-strategy.d.ts +3 -3
- package/dist/cli/deploy-strategy.d.ts.map +1 -1
- package/dist/cli/help-pages/pages/core.d.ts.map +1 -1
- package/dist/cli/index.js +12 -0
- package/dist/cli/preview-bindings.d.ts +8 -1
- package/dist/cli/preview-bindings.d.ts.map +1 -1
- package/dist/cli/preview.d.ts +1 -2
- package/dist/cli/preview.d.ts.map +1 -1
- package/dist/cloudflare/account-resources.d.ts.map +1 -1
- package/dist/cloudflare/api.d.ts +67 -3
- package/dist/cloudflare/api.d.ts.map +1 -1
- package/dist/cloudflare/auth.d.ts.map +1 -1
- package/dist/{src/cloudflare → cloudflare}/index.js +7 -7
- package/dist/cloudflare/known-permission-group-ids.generated.d.ts +10 -0
- package/dist/cloudflare/known-permission-group-ids.generated.d.ts.map +1 -0
- package/dist/cloudflare/kv-namespace.d.ts +2 -1
- package/dist/cloudflare/kv-namespace.d.ts.map +1 -1
- package/dist/cloudflare/preferences.d.ts +7 -0
- package/dist/cloudflare/preferences.d.ts.map +1 -1
- package/dist/cloudflare/preview-registry-inference.d.ts +14 -0
- package/dist/cloudflare/preview-registry-inference.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-records.d.ts +3 -60
- package/dist/cloudflare/preview-registry-records.d.ts.map +1 -1
- package/dist/cloudflare/preview-registry-shape.d.ts +47 -0
- package/dist/cloudflare/preview-registry-shape.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-transport.d.ts +4 -0
- package/dist/cloudflare/preview-registry-transport.d.ts.map +1 -0
- package/dist/cloudflare/preview-urls.d.ts +3 -0
- package/dist/cloudflare/preview-urls.d.ts.map +1 -0
- package/dist/cloudflare/tokens.d.ts +23 -0
- package/dist/cloudflare/tokens.d.ts.map +1 -1
- package/dist/cloudflare/types.d.ts +1 -1
- package/dist/cloudflare/types.d.ts.map +1 -1
- package/dist/cloudflare/usage.d.ts +30 -2
- package/dist/cloudflare/usage.d.ts.map +1 -1
- package/dist/config/binding-resolution-helpers.d.ts +36 -0
- package/dist/config/binding-resolution-helpers.d.ts.map +1 -0
- package/dist/config/compatibility.d.ts +3 -0
- package/dist/config/compatibility.d.ts.map +1 -0
- package/dist/config/compiler.d.ts +61 -20
- package/dist/config/compiler.d.ts.map +1 -1
- package/dist/config/deploy-resources.d.ts +58 -0
- package/dist/config/deploy-resources.d.ts.map +1 -0
- package/dist/config/index.d.ts +5 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/preview-resources.d.ts +6 -0
- package/dist/config/preview-resources.d.ts.map +1 -1
- package/dist/config/preview.d.ts.map +1 -1
- package/dist/config/ref.d.ts +14 -1
- package/dist/config/ref.d.ts.map +1 -1
- package/dist/config/resolve-phased.d.ts +72 -0
- package/dist/config/resolve-phased.d.ts.map +1 -0
- package/dist/config/resolve.d.ts +7 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resource-resolution.d.ts +26 -6
- package/dist/config/resource-resolution.d.ts.map +1 -1
- package/dist/config/schema-bindings.d.ts +262 -0
- package/dist/config/schema-bindings.d.ts.map +1 -1
- package/dist/config/schema-env.d.ts +375 -39
- package/dist/config/schema-env.d.ts.map +1 -1
- package/dist/config/schema-normalization.d.ts +26 -2
- package/dist/config/schema-normalization.d.ts.map +1 -1
- package/dist/config/schema.d.ts +994 -63
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/service-bindings-validation.d.ts +36 -0
- package/dist/config/service-bindings-validation.d.ts.map +1 -0
- package/dist/{config-hwdqjse7.js → config-1japnjmx.js} +5 -5
- package/dist/{config-q0g5qdga.js → config-287wjn1m.js} +6 -6
- package/dist/{config-fjwke42y.js → config-4x6vq82e.js} +6 -6
- package/dist/{config-pxvewrhv.js → config-5n0avhcx.js} +6 -6
- package/dist/config-70s2ap5j.js +59 -0
- package/dist/config-7hge8ze6.js +59 -0
- package/dist/config-7rbp7aek.js +59 -0
- package/dist/config-b8xbbmta.js +59 -0
- package/dist/config-baee5690.js +59 -0
- package/dist/config-bczpc1ey.js +59 -0
- package/dist/{src/config-entry.js → config-entry.js} +3 -3
- package/dist/config-fhmwzaw6.js +59 -0
- package/dist/config-g9vkfa4x.js +59 -0
- package/dist/config-gpexkzth.js +59 -0
- package/dist/config-nspw7sgv.js +59 -0
- package/dist/config-ntm4x9wt.js +59 -0
- package/dist/config-nv6hfpg6.js +59 -0
- package/dist/config-pjc33wew.js +59 -0
- package/dist/config-pnz2e8s3.js +59 -0
- package/dist/config-qts6nh6g.js +59 -0
- package/dist/config-sg2xrdt4.js +59 -0
- package/dist/config-vzwckat3.js +59 -0
- package/dist/config-x90dkmm7.js +59 -0
- package/dist/{src/decorators → decorators}/index.js +2 -2
- package/dist/deploy-1s6nv5rp.js +921 -0
- package/dist/{deploy-ykpcjkc2.js → deploy-30ph1rrd.js} +263 -32
- package/dist/{deploy-ex4g5avz.js → deploy-39dmfn9d.js} +338 -38
- package/dist/deploy-44n2pshy.js +1016 -0
- package/dist/deploy-45qxpsfe.js +921 -0
- package/dist/deploy-64e57w1g.js +1040 -0
- package/dist/deploy-82j43vta.js +1040 -0
- package/dist/deploy-99m8qhpa.js +1041 -0
- package/dist/deploy-9twkd32f.js +1040 -0
- package/dist/deploy-a2eq2c1n.js +1040 -0
- package/dist/{deploy-csfhdr64.js → deploy-a3pb1qs5.js} +259 -29
- package/dist/deploy-agbtfm04.js +921 -0
- package/dist/{deploy-jnb0bhka.js → deploy-aswbtbf3.js} +361 -49
- package/dist/deploy-bqf3kxy5.js +972 -0
- package/dist/deploy-fv4z648h.js +921 -0
- package/dist/deploy-gsybda2f.js +1038 -0
- package/dist/deploy-h17nzysm.js +921 -0
- package/dist/deploy-hc89h4wg.js +1045 -0
- package/dist/deploy-jey5pnqn.js +1040 -0
- package/dist/deploy-jv0yfqvk.js +1040 -0
- package/dist/deploy-kn3z6spd.js +941 -0
- package/dist/deploy-m22xmz9w.js +921 -0
- package/dist/deploy-nefp2njy.js +1038 -0
- package/dist/deploy-ppp8pg6w.js +1038 -0
- package/dist/deploy-qah2eag6.js +1041 -0
- package/dist/deploy-qdq2gpad.js +1045 -0
- package/dist/deploy-r1yf8913.js +1038 -0
- package/dist/deploy-r8nam9rr.js +1038 -0
- package/dist/deploy-rrm4a0xw.js +921 -0
- package/dist/deploy-s0tfnc12.js +1040 -0
- package/dist/deploy-s636ks9k.js +1041 -0
- package/dist/deploy-skqn61j3.js +1038 -0
- package/dist/deploy-smv2870h.js +921 -0
- package/dist/deploy-sp16nxs5.js +972 -0
- package/dist/deploy-sr805bvq.js +921 -0
- package/dist/deploy-t9dehmn0.js +1041 -0
- package/dist/deploy-taxt7njz.js +1041 -0
- package/dist/deploy-tnfvfh9m.js +1040 -0
- package/dist/deploy-w5f8db4s.js +1040 -0
- package/dist/deploy-wsxcectr.js +921 -0
- package/dist/deploy-xyfbhj3v.js +1038 -0
- package/dist/deploy-yv1y5xaa.js +921 -0
- package/dist/deploy-z3ejw37k.js +1040 -0
- package/dist/{dev-8nssqatr.js → dev-02tgdc4f.js} +199 -448
- package/dist/dev-0tqhveye.js +2314 -0
- package/dist/dev-3dj2gkfq.js +2314 -0
- package/dist/dev-3e0etsww.js +2314 -0
- package/dist/dev-47dk7c13.js +2314 -0
- package/dist/dev-4a2a31cm.js +2314 -0
- package/dist/dev-4w1stcn8.js +2427 -0
- package/dist/dev-5wkh1z4a.js +2188 -0
- package/dist/dev-6t22zmey.js +2350 -0
- package/dist/dev-89p1sdv7.js +2395 -0
- package/dist/dev-8d1gxjky.js +2427 -0
- package/dist/dev-8yawx3cv.js +2314 -0
- package/dist/dev-9h4p8a0c.js +2393 -0
- package/dist/dev-9xmttj4c.js +2314 -0
- package/dist/dev-bkbz97z0.js +2314 -0
- package/dist/{dev-grznx8fn.js → dev-ct3344kv.js} +199 -448
- package/dist/{dev-7ef5e2j1.js → dev-dg8dh5c1.js} +123 -298
- package/dist/dev-dr5jb965.js +2427 -0
- package/dist/dev-e4sjqtbq.js +2314 -0
- package/dist/dev-ecq26mg4.js +2350 -0
- package/dist/dev-ef237vgp.js +2324 -0
- package/dist/dev-enbdg4st.js +2314 -0
- package/dist/dev-jcrxg8hq.js +2160 -0
- package/dist/dev-jk0gqges.js +2432 -0
- package/dist/dev-k62936am.js +2314 -0
- package/dist/dev-k8ptbvrs.js +2160 -0
- package/dist/dev-kqm107h4.js +2422 -0
- package/dist/dev-n0gx7eya.js +2350 -0
- package/dist/dev-n23m6rtb.js +2314 -0
- package/dist/dev-ny8fmkzg.js +2432 -0
- package/dist/dev-p1c65cga.js +2386 -0
- package/dist/dev-p4fjbb4h.js +2395 -0
- package/dist/dev-pnfcv79z.js +2160 -0
- package/dist/dev-qnrrv5ey.js +2393 -0
- package/dist/dev-qqysg50t.js +2427 -0
- package/dist/dev-r9f3n11q.js +2410 -0
- package/dist/dev-s0815dw4.js +2427 -0
- package/dist/dev-s4tpkg60.js +2314 -0
- package/dist/dev-s82fcesg.js +2314 -0
- package/dist/dev-s9sz53me.js +2401 -0
- package/dist/dev-sdka7z0d.js +2427 -0
- package/dist/dev-server/d1-migrations.d.ts +22 -0
- package/dist/dev-server/d1-migrations.d.ts.map +1 -1
- package/dist/dev-server/dev-server-state.d.ts +56 -0
- package/dist/dev-server/dev-server-state.d.ts.map +1 -0
- package/dist/dev-server/gateway-script.d.ts +14 -1
- package/dist/dev-server/gateway-script.d.ts.map +1 -1
- package/dist/dev-server/miniflare-bindings.d.ts +16 -0
- package/dist/dev-server/miniflare-bindings.d.ts.map +1 -0
- package/dist/dev-server/miniflare-dev-config.d.ts +30 -0
- package/dist/dev-server/miniflare-dev-config.d.ts.map +1 -0
- package/dist/dev-server/miniflare-worker-config.d.ts +44 -0
- package/dist/dev-server/miniflare-worker-config.d.ts.map +1 -0
- package/dist/dev-server/reload-queue.d.ts +13 -0
- package/dist/dev-server/reload-queue.d.ts.map +1 -0
- package/dist/dev-server/server-startup-helpers.d.ts +84 -0
- package/dist/dev-server/server-startup-helpers.d.ts.map +1 -0
- package/dist/dev-server/server.d.ts.map +1 -1
- package/dist/dev-server/vite-utils.d.ts +18 -0
- package/dist/dev-server/vite-utils.d.ts.map +1 -1
- package/dist/dev-server/worker-source-watcher.d.ts +6 -0
- package/dist/dev-server/worker-source-watcher.d.ts.map +1 -1
- package/dist/dev-t3tjscah.js +2350 -0
- package/dist/dev-t50kdb1j.js +2338 -0
- package/dist/dev-t5xf55pt.js +2314 -0
- package/dist/dev-t63c44bb.js +2314 -0
- package/dist/dev-wg3d38sy.js +2433 -0
- package/dist/dev-wh4rfgsh.js +2427 -0
- package/dist/{dev-2pd33m28.js → dev-wjh8gdd1.js} +200 -325
- package/dist/dev-xzxy9qvq.js +2314 -0
- package/dist/dev-yymaq4ph.js +2392 -0
- package/dist/dev-zg2w2ve3.js +2422 -0
- package/dist/dev-zsb2xk1x.js +2427 -0
- package/dist/dev-zty3yhzg.js +2324 -0
- package/dist/{doctor-04ammrrh.js → doctor-3mqavqg3.js} +10 -10
- package/dist/{doctor-fzkznce1.js → doctor-5nek32fz.js} +10 -10
- package/dist/{doctor-sa5xv1bz.js → doctor-7ra1w0sk.js} +10 -10
- package/dist/doctor-ak830a0k.js +245 -0
- package/dist/doctor-bye3cs8a.js +245 -0
- package/dist/{doctor-fmjj65mc.js → doctor-c5m9pmwq.js} +8 -8
- package/dist/doctor-cqfkgxvw.js +245 -0
- package/dist/doctor-e1h9mhzp.js +245 -0
- package/dist/doctor-fmqsrafk.js +245 -0
- package/dist/doctor-hgs7wr5g.js +245 -0
- package/dist/doctor-j8ytsy94.js +245 -0
- package/dist/doctor-mcmkgp6e.js +245 -0
- package/dist/doctor-qb6m2exc.js +245 -0
- package/dist/doctor-qq4tsh8q.js +245 -0
- package/dist/doctor-tecv869a.js +245 -0
- package/dist/doctor-wg0245pe.js +245 -0
- package/dist/doctor-z3jfqxtz.js +245 -0
- package/dist/durable-object-4hey8fgy.js +13 -0
- package/dist/durable-object-v3gsnybk.js +13 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/index-0krb65s3.js +215 -0
- package/dist/index-0mantew0.js +513 -0
- package/dist/{index-p03n4qet.js → index-0mezg6ar.js} +26 -21
- package/dist/{index-mqekt778.js → index-0tk2rs0q.js} +1 -1
- package/dist/{index-h18pxvzs.js → index-124e9t4t.js} +1 -1
- package/dist/{index-na3mnm1k.js → index-1546yrn0.js} +2 -2
- package/dist/index-15fpa5tx.js +232 -0
- package/dist/{index-jb75kwa4.js → index-18mp5v50.js} +33 -14
- package/dist/{index-4v9bc2pc.js → index-195tc6qh.js} +26 -21
- package/dist/{index-0kfzdywd.js → index-1bg8w2gf.js} +1 -1
- package/dist/index-1d4jg11n.js +542 -0
- package/dist/index-1e2qtrmj.js +188 -0
- package/dist/{index-v5nmqthy.js → index-1ghhgb9d.js} +2 -2
- package/dist/index-1nhd9nkd.js +232 -0
- package/dist/{index-6psz1h4c.js → index-1wn8mjep.js} +116 -96
- package/dist/index-1xhd5czz.js +185 -0
- package/dist/index-2a2g4fwp.js +993 -0
- package/dist/{index-fvsadj32.js → index-2bmtj21z.js} +2 -2
- package/dist/{index-816krz9p.js → index-2dpmd14d.js} +1 -1
- package/dist/{index-3ke5d2vn.js → index-2fa0afdp.js} +173 -30
- package/dist/{index-d8etnfef.js → index-2rcrefqd.js} +173 -30
- package/dist/index-2t2m5148.js +1372 -0
- package/dist/index-2vbzamev.js +437 -0
- package/dist/index-2vdep9h0.js +993 -0
- package/dist/{index-zfhq6s96.js → index-2y90j9cz.js} +2 -2
- package/dist/index-33ep0z9x.js +385 -0
- package/dist/index-37jgbaw6.js +1372 -0
- package/dist/index-380ncsqc.js +977 -0
- package/dist/{index-thna1tkd.js → index-3e1x39fc.js} +111 -26
- package/dist/index-3e7by9sy.js +223 -0
- package/dist/{index-xk9djfjp.js → index-3egad6wm.js} +34 -15
- package/dist/index-3f8rzmjw.js +232 -0
- package/dist/index-3vd4r37r.js +1372 -0
- package/dist/index-3vgn5e89.js +1682 -0
- package/dist/index-3x7k3t0f.js +513 -0
- package/dist/index-3xfe2dst.js +399 -0
- package/dist/index-464j1zb4.js +513 -0
- package/dist/{index-pnbs1b8k.js → index-48rxsj95.js} +110 -25
- package/dist/index-4bezcdd1.js +385 -0
- package/dist/index-4fp11z9e.js +973 -0
- package/dist/{index-m3fmw6mx.js → index-4knecthc.js} +2 -2
- package/dist/index-502y7w13.js +538 -0
- package/dist/index-50mxxb4q.js +185 -0
- package/dist/index-5achzspr.js +185 -0
- package/dist/index-5ef3jmv7.js +1372 -0
- package/dist/index-5eswe8yv.js +844 -0
- package/dist/index-5gevxfgs.js +513 -0
- package/dist/index-5gmf048z.js +817 -0
- package/dist/index-5jtkxpjf.js +971 -0
- package/dist/{index-72mve6vh.js → index-5m85bd9x.js} +1 -1
- package/dist/{index-4rrttqj5.js → index-5n5nn0a8.js} +62 -176
- package/dist/index-5p3bgjwr.js +808 -0
- package/dist/index-5vzcszr2.js +1230 -0
- package/dist/index-5w77r4w9.js +513 -0
- package/dist/index-62srkqcm.js +168 -0
- package/dist/index-63cgqe43.js +1372 -0
- package/dist/index-65e7xx1a.js +19 -0
- package/dist/index-65qrje14.js +185 -0
- package/dist/index-66sx3b3v.js +385 -0
- package/dist/{index-b8m6883k.js → index-678j0n13.js} +2 -2
- package/dist/{index-epw1jxz5.js → index-6ftrth7n.js} +194 -180
- package/dist/index-6g90pvxa.js +215 -0
- package/dist/index-6j4m5x2d.js +1372 -0
- package/dist/{index-7v583xan.js → index-6jwpke14.js} +13 -46
- package/dist/index-6knsjvxh.js +1372 -0
- package/dist/index-6kwq6yf8.js +979 -0
- package/dist/index-6mg4yvc6.js +74 -0
- package/dist/{index-e9yw4d6y.js → index-6phry941.js} +5 -5
- package/dist/index-6r59wbek.js +232 -0
- package/dist/index-6sf815ps.js +74 -0
- package/dist/index-6zd89k6y.js +1230 -0
- package/dist/{index-ry131z23.js → index-71rwg0cn.js} +62 -176
- package/dist/index-75ex2m0x.js +695 -0
- package/dist/{index-htzf0py1.js → index-79exzs3q.js} +194 -180
- package/dist/{index-1sp39f2f.js → index-7bxj118m.js} +62 -176
- package/dist/index-7c6np4mq.js +397 -0
- package/dist/{index-7x0ybbtx.js → index-7cm339qz.js} +5 -5
- package/dist/index-7eqyr4j8.js +70 -0
- package/dist/index-7k278fgz.js +273 -0
- package/dist/index-7kazxkjt.js +1372 -0
- package/dist/index-7m0x8m9r.js +844 -0
- package/dist/index-7p74smg8.js +1372 -0
- package/dist/index-7q8fke3k.js +188 -0
- package/dist/index-7qk6eafn.js +1682 -0
- package/dist/{index-yzddwp02.js → index-7vbjt6ba.js} +110 -93
- package/dist/{index-7kcxjhta.js → index-7z4b0vgd.js} +19 -5
- package/dist/index-82xn4azv.js +74 -0
- package/dist/index-83wns7cz.js +70 -0
- package/dist/index-852945d4.js +413 -0
- package/dist/{index-8t5nb4qx.js → index-86rvj79f.js} +5 -5
- package/dist/index-88tcq0t4.js +542 -0
- package/dist/{index-q4kaz181.js → index-8evn52g1.js} +279 -268
- package/dist/index-8jkf4nsd.js +695 -0
- package/dist/{index-sqrksgb2.js → index-8nx4ce3e.js} +7 -7
- package/dist/index-8q1bcnrh.js +1372 -0
- package/dist/index-8t5gynct.js +971 -0
- package/dist/index-905svbb6.js +470 -0
- package/dist/index-94cb0sac.js +1372 -0
- package/dist/index-95mmvbw7.js +538 -0
- package/dist/index-97x94h0m.js +438 -0
- package/dist/index-9an9qqr1.js +728 -0
- package/dist/index-9d125myk.js +1372 -0
- package/dist/index-9gg0kqw0.js +470 -0
- package/dist/index-9ryw7mcw.js +971 -0
- package/dist/index-a3e13a7m.js +478 -0
- package/dist/index-a6j44jmr.js +1372 -0
- package/dist/index-a75ejnvt.js +1711 -0
- package/dist/index-ab2nck1h.js +1372 -0
- package/dist/index-abrqnq3e.js +488 -0
- package/dist/index-afjbpgb1.js +1218 -0
- package/dist/index-at89fpde.js +470 -0
- package/dist/{index-cgbvmse6.js → index-awr0tp6p.js} +1 -1
- package/dist/index-b1be9bdh.js +1372 -0
- package/dist/index-b1xs3wc4.js +513 -0
- package/dist/index-b50x7seh.js +513 -0
- package/dist/{index-9az6s7ad.js → index-b5ra8w3q.js} +1 -1
- package/dist/index-b64sbzgv.js +884 -0
- package/dist/index-b7r8ntpm.js +1372 -0
- package/dist/index-ba9gyy13.js +513 -0
- package/dist/{index-k29yjhv0.js → index-bb66mn7p.js} +1 -1
- package/dist/index-bc5pvbbd.js +1193 -0
- package/dist/index-bj0mk3dw.js +74 -0
- package/dist/index-bj3a8dr0.js +1372 -0
- package/dist/index-bk3eez1g.js +513 -0
- package/dist/index-btjx137w.js +774 -0
- package/dist/index-btrfqp9h.js +133 -0
- package/dist/index-bx6gangy.js +402 -0
- package/dist/index-c0tc0yts.js +471 -0
- package/dist/{index-6jef5emv.js → index-c0whkev9.js} +27 -3
- package/dist/index-ca96qkva.js +1372 -0
- package/dist/index-cdtzkedk.js +993 -0
- package/dist/index-cejgenma.js +1372 -0
- package/dist/index-cp8jt5pr.js +52 -0
- package/dist/index-cpz69pek.js +1372 -0
- package/dist/{index-gs4y9gdf.js → index-crrdegk5.js} +2 -2
- package/dist/index-cskszwkx.js +1372 -0
- package/dist/index-cxf22a0s.js +74 -0
- package/dist/index-cy3c3w81.js +270 -0
- package/dist/index-d5dgb1j6.js +74 -0
- package/dist/index-da397xcx.js +1372 -0
- package/dist/index-damyy8bw.js +1372 -0
- package/dist/{index-x9cwdxw5.js → index-dd6fwwmq.js} +3 -3
- package/dist/index-dh1954bp.js +52 -0
- package/dist/index-djp2wd1f.js +1372 -0
- package/dist/{index-0apbm26n.js → index-dmbdj6va.js} +111 -94
- package/dist/index-dphr32gc.js +420 -0
- package/dist/index-dxh2qyyw.js +52 -0
- package/dist/index-dzayfxjy.js +492 -0
- package/dist/index-e05q77kt.js +397 -0
- package/dist/index-e11b1fb2.js +495 -0
- package/dist/index-e3zvspqj.js +968 -0
- package/dist/index-e4tzzbn9.js +1372 -0
- package/dist/index-e5ct1gwb.js +1372 -0
- package/dist/index-e7ptcz1a.js +1372 -0
- package/dist/index-e7wt0203.js +513 -0
- package/dist/{index-61jsjnsv.js → index-ebwsvf9t.js} +110 -25
- package/dist/index-ed73jn3d.js +185 -0
- package/dist/index-ed7n5d07.js +185 -0
- package/dist/index-ejs2a4kd.js +513 -0
- package/dist/index-esjrgt3y.js +467 -0
- package/dist/index-ev03khsd.js +513 -0
- package/dist/index-f1gsqm54.js +168 -0
- package/dist/index-f90314kt.js +52 -0
- package/dist/index-f9mhsept.js +185 -0
- package/dist/index-fa6zwffw.js +70 -0
- package/dist/index-fama7kpt.js +52 -0
- package/dist/index-fkyvxe4b.js +968 -0
- package/dist/index-g0h40xke.js +513 -0
- package/dist/index-g0rqh52c.js +385 -0
- package/dist/{index-0eqksag4.js → index-g170d619.js} +13 -46
- package/dist/index-g3qtxkms.js +881 -0
- package/dist/index-gactvqcs.js +467 -0
- package/dist/index-gaew61v4.js +470 -0
- package/dist/index-gba371j7.js +542 -0
- package/dist/index-gegyyfnw.js +1372 -0
- package/dist/index-get7he2s.js +133 -0
- package/dist/index-gn5wy09x.js +205 -0
- package/dist/{index-2pb7b9mw.js → index-gtbgzwfs.js} +62 -176
- package/dist/index-gtpz0gkz.js +185 -0
- package/dist/index-h1s66pmp.js +52 -0
- package/dist/{index-11m5a8wd.js → index-h8r2d8y5.js} +112 -26
- package/dist/index-heeqwrfd.js +385 -0
- package/dist/{index-7g8zyws4.js → index-hheb5dyt.js} +2 -2
- package/dist/index-hjz2x9nq.js +441 -0
- package/dist/index-hkex7ns5.js +513 -0
- package/dist/index-hmbctwv6.js +517 -0
- package/dist/index-hpzasdhw.js +513 -0
- package/dist/index-hqdr9wdm.js +74 -0
- package/dist/index-hrvz8d26.js +1372 -0
- package/dist/index-hyvhnf6r.js +971 -0
- package/dist/index-j2kc5rbv.js +895 -0
- package/dist/index-j2xdxwsz.js +133 -0
- package/dist/index-j47hhb3r.js +694 -0
- package/dist/index-j5aphr5x.js +185 -0
- package/dist/index-j68v36q1.js +188 -0
- package/dist/index-j7cf22x7.js +968 -0
- package/dist/index-j7xxrbnr.js +694 -0
- package/dist/index-jptqxkew.js +470 -0
- package/dist/index-jsymy3mb.js +781 -0
- package/dist/index-jwvy32xk.js +188 -0
- package/dist/index-jxe1b19v.js +133 -0
- package/dist/index-jz96ry5g.js +513 -0
- package/dist/index-k6wtsgs1.js +971 -0
- package/dist/index-kawa49m8.js +371 -0
- package/dist/index-key4e5c9.js +168 -0
- package/dist/index-khbmdrn2.js +884 -0
- package/dist/index-kpzfwex6.js +264 -0
- package/dist/index-kse4gn99.js +74 -0
- package/dist/index-ktscz0r2.js +264 -0
- package/dist/index-kybmjvad.js +1212 -0
- package/dist/index-kzm9cea8.js +185 -0
- package/dist/index-m2d74gqg.js +808 -0
- package/dist/index-m56w7mjt.js +513 -0
- package/dist/index-m95ha3n4.js +264 -0
- package/dist/index-ma151p8g.js +264 -0
- package/dist/index-mg8vwqxf.js +514 -0
- package/dist/index-mhdsywhs.js +264 -0
- package/dist/index-mjgx910r.js +895 -0
- package/dist/index-mkrmaea3.js +185 -0
- package/dist/index-mkxnyyjn.js +264 -0
- package/dist/index-mp5mrst6.js +1372 -0
- package/dist/index-ms15cr86.js +513 -0
- package/dist/index-mt99xkc6.js +133 -0
- package/dist/index-mttv6k25.js +881 -0
- package/dist/index-myxfx52v.js +385 -0
- package/dist/index-mzw7732t.js +74 -0
- package/dist/index-n3mjwz22.js +188 -0
- package/dist/index-n3yksgz0.js +1372 -0
- package/dist/{index-9n6djthj.js → index-n4jr3dmk.js} +32 -38
- package/dist/index-n5drt64b.js +74 -0
- package/dist/index-n8frmffg.js +264 -0
- package/dist/index-n8k8chde.js +694 -0
- package/dist/index-na796ka6.js +994 -0
- package/dist/index-nbs4q0qg.js +1218 -0
- package/dist/index-newpq2zf.js +968 -0
- package/dist/index-nexg9p7j.js +1271 -0
- package/dist/index-nfm8tb5n.js +74 -0
- package/dist/index-nga2tg9z.js +1372 -0
- package/dist/{index-43dq8yx8.js → index-ngbzr9gz.js} +111 -94
- package/dist/index-nh90nk7j.js +380 -0
- package/dist/index-njnmfxm5.js +1372 -0
- package/dist/index-nqma24j3.js +385 -0
- package/dist/index-ntddf5d9.js +993 -0
- package/dist/index-nte9n8w9.js +538 -0
- package/dist/index-ntxp7ke1.js +264 -0
- package/dist/index-nwxnmw41.js +264 -0
- package/dist/index-p1xe5eem.js +513 -0
- package/dist/{index-wztc9stx.js → index-p477xm52.js} +13 -46
- package/dist/index-p8nmkrgw.js +470 -0
- package/dist/{index-yqbxjysa.js → index-p97s12vf.js} +50 -43
- package/dist/index-p9hvv0yd.js +401 -0
- package/dist/index-pac7wv88.js +307 -0
- package/dist/index-ptp2pfq1.js +52 -0
- package/dist/index-pyeycp3f.js +74 -0
- package/dist/index-q23xf3vr.js +479 -0
- package/dist/index-q34rvh5a.js +247 -0
- package/dist/{index-j185x270.js → index-q5errwrj.js} +53 -46
- package/dist/{index-2jnrqbny.js → index-q5nhzc9m.js} +4 -88
- package/dist/index-q8f4kawk.js +204 -0
- package/dist/index-qer8zv2r.js +997 -0
- package/dist/index-qhyy018y.js +467 -0
- package/dist/index-qmhdydwy.js +70 -0
- package/dist/index-qpmvca5j.js +470 -0
- package/dist/index-qr96vaj1.js +52 -0
- package/dist/{index-74198nxd.js → index-qtyhg3dn.js} +53 -46
- package/dist/index-qye17gq5.js +264 -0
- package/dist/index-r0839f5k.js +133 -0
- package/dist/index-r1rqg72v.js +1372 -0
- package/dist/index-rbckga8p.js +971 -0
- package/dist/index-rbxb5x2w.js +1372 -0
- package/dist/index-rck779bj.js +739 -0
- package/dist/index-rfn2gt5f.js +1658 -0
- package/dist/index-rg21w26a.js +470 -0
- package/dist/index-rgcz45t0.js +1372 -0
- package/dist/index-rhnd376q.js +133 -0
- package/dist/index-rjc5z3w6.js +971 -0
- package/dist/index-rkhtayd6.js +385 -0
- package/dist/index-rm8srzmv.js +371 -0
- package/dist/index-rmhk5j03.js +968 -0
- package/dist/index-rp4t86bt.js +993 -0
- package/dist/index-rpq5ktdy.js +264 -0
- package/dist/index-rpsmhdd4.js +1218 -0
- package/dist/index-rqpakjyr.js +470 -0
- package/dist/index-rttk33x6.js +232 -0
- package/dist/index-rwa82e89.js +385 -0
- package/dist/index-rz185crv.js +695 -0
- package/dist/index-s22verzj.js +1218 -0
- package/dist/index-s2s3g1nt.js +133 -0
- package/dist/index-s7ytytth.js +781 -0
- package/dist/index-sefnpzwa.js +185 -0
- package/dist/index-sgxw0xzd.js +513 -0
- package/dist/index-stc0caq6.js +1009 -0
- package/dist/index-svz82w9h.js +513 -0
- package/dist/index-sx49e8x9.js +884 -0
- package/dist/index-sxadwvw9.js +185 -0
- package/dist/index-sxn223fz.js +1372 -0
- package/dist/index-sy0c2mh0.js +1372 -0
- package/dist/index-syeh1hca.js +264 -0
- package/dist/index-t18wyhgf.js +418 -0
- package/dist/index-t4fhcx1n.js +71 -0
- package/dist/index-td4hbgj5.js +1372 -0
- package/dist/{index-hjy8ctpc.js → index-tkvt9mmq.js} +47 -14
- package/dist/index-tmmcf4m6.js +808 -0
- package/dist/index-tpgs5v64.js +366 -0
- package/dist/index-tt4fsv91.js +412 -0
- package/dist/{index-t08te69w.js → index-tte89s31.js} +28 -11
- package/dist/index-tvjg7swe.js +1372 -0
- package/dist/index-txndxr4w.js +513 -0
- package/dist/index-tyh5jc55.js +990 -0
- package/dist/index-tyt0wa52.js +470 -0
- package/dist/index-tyt3wcfr.js +1372 -0
- package/dist/index-v3znz08m.js +968 -0
- package/dist/index-v78xbj6n.js +808 -0
- package/dist/index-v915brjk.js +1372 -0
- package/dist/index-v922fmsx.js +52 -0
- package/dist/index-v9w1bbfe.js +842 -0
- package/dist/index-vbbgtm8p.js +513 -0
- package/dist/{index-k6vq6kkt.js → index-vcjgrmzj.js} +3 -3
- package/dist/{index-9ba1etyz.js → index-vdewcg1r.js} +204 -54
- package/dist/index-vhqww6tt.js +307 -0
- package/dist/index-vse8620z.js +1372 -0
- package/dist/index-vtjp46c3.js +52 -0
- package/dist/{index-jwd8pcb2.js → index-vxhxk8mf.js} +53 -46
- package/dist/index-w3azfsa0.js +695 -0
- package/dist/index-w4tq35dn.js +52 -0
- package/dist/index-w5qxvxzq.js +991 -0
- package/dist/index-w5sedpqn.js +986 -0
- package/dist/index-waha3chv.js +1230 -0
- package/dist/index-wdxww0kj.js +1006 -0
- package/dist/index-wdy5y07x.js +1372 -0
- package/dist/index-wf9pnh6j.js +385 -0
- package/dist/index-wnnbbbkt.js +1192 -0
- package/dist/index-wvcmvtjf.js +1372 -0
- package/dist/index-x0jbntp0.js +470 -0
- package/dist/index-x6scc3nx.js +70 -0
- package/dist/index-x8e2wsbv.js +971 -0
- package/dist/index-xgfyxpfs.js +1218 -0
- package/dist/index-xm9hp9xc.js +1372 -0
- package/dist/index-xp7zkxcx.js +1372 -0
- package/dist/index-xrbj0ebk.js +185 -0
- package/dist/index-xskax7r3.js +50 -0
- package/dist/index-xvk5n96q.js +694 -0
- package/dist/index-xy1jvt4w.js +1229 -0
- package/dist/index-xzg9hhf3.js +470 -0
- package/dist/index-xzpg0kaz.js +70 -0
- package/dist/index-y3q6qvv3.js +316 -0
- package/dist/index-y44ts1dk.js +52 -0
- package/dist/index-y5nt1wjb.js +971 -0
- package/dist/index-y82b8w14.js +1372 -0
- package/dist/index-yb07t3c5.js +1372 -0
- package/dist/index-yc3xz3vm.js +431 -0
- package/dist/index-yeaqrevg.js +1372 -0
- package/dist/index-ygwsd1nn.js +438 -0
- package/dist/index-yhdavjk7.js +371 -0
- package/dist/index-yjhns95b.js +188 -0
- package/dist/index-yk23p7he.js +1372 -0
- package/dist/index-ykfgpsmm.js +190 -0
- package/dist/index-ymz3cfab.js +968 -0
- package/dist/index-yq9g1sq7.js +264 -0
- package/dist/index-ys5q9ch9.js +366 -0
- package/dist/index-yt0n4p46.js +973 -0
- package/dist/index-ytq1t9jx.js +232 -0
- package/dist/index-ywmtmf3b.js +513 -0
- package/dist/index-yzb44q6d.js +1372 -0
- package/dist/index-z043xk61.js +133 -0
- package/dist/index-z0gsf674.js +431 -0
- package/dist/index-z32n0ndp.js +1372 -0
- package/dist/index-z4qgk76w.js +1372 -0
- package/dist/{index-yc0gcchc.js → index-z8njfj2g.js} +11 -44
- package/dist/{index-0w826dsr.js → index-z9fjnwa8.js} +21 -3
- package/dist/{index-1xpj0m4r.js → index-z9gy8w6b.js} +1 -1
- package/dist/index-zapkc14c.js +264 -0
- package/dist/index-zes6w8yr.js +185 -0
- package/dist/index-zgrqest7.js +695 -0
- package/dist/index-zsngz131.js +1372 -0
- package/dist/index-zxhc6sb0.js +192 -0
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -0
- package/dist/{init-r4hnxan3.js → init-wfh63bfz.js} +1 -1
- package/dist/{login-5bsxxpvc.js → login-1amyp1jy.js} +10 -10
- package/dist/{login-bhaw72zc.js → login-1cdwn1dj.js} +11 -11
- package/dist/{login-2hnz4m4n.js → login-456h8jk3.js} +11 -11
- package/dist/{login-6tzvczw2.js → login-4n470c4j.js} +11 -11
- package/dist/login-4sh7s849.js +77 -0
- package/dist/login-5dmkf0pz.js +77 -0
- package/dist/login-88tp4gbb.js +77 -0
- package/dist/login-b51faqpc.js +77 -0
- package/dist/login-bxyjqmbj.js +77 -0
- package/dist/login-c4649qss.js +77 -0
- package/dist/login-d80a2qxd.js +77 -0
- package/dist/login-dp0napaz.js +77 -0
- package/dist/login-j3r6z2t4.js +77 -0
- package/dist/login-jkfkdjg4.js +77 -0
- package/dist/login-kch6f2yj.js +77 -0
- package/dist/login-pmqh94ws.js +77 -0
- package/dist/login-rc82x5j8.js +77 -0
- package/dist/login-tvppwyx2.js +77 -0
- package/dist/login-w76jx22q.js +77 -0
- package/dist/login-ze7y36rc.js +77 -0
- package/dist/{previews-gm3z0syj.js → previews-02jmcwft.js} +140 -94
- package/dist/previews-31bq82km.js +1225 -0
- package/dist/{previews-j9ymq4ys.js → previews-62pcvvpe.js} +140 -95
- package/dist/{previews-3rn8mz2c.js → previews-76fxkp59.js} +140 -94
- package/dist/previews-844bp6kf.js +1214 -0
- package/dist/previews-8amn46qv.js +1214 -0
- package/dist/previews-a5xbkksy.js +1214 -0
- package/dist/previews-bgnryzav.js +1214 -0
- package/dist/previews-bkhv9dnr.js +1214 -0
- package/dist/previews-c2c64z5m.js +1214 -0
- package/dist/previews-e4wgscsb.js +1214 -0
- package/dist/previews-ew4reetn.js +1214 -0
- package/dist/previews-hzqke1fg.js +1214 -0
- package/dist/previews-j8wa3sge.js +1214 -0
- package/dist/previews-k5n6vhpm.js +1214 -0
- package/dist/previews-n4sdyxa5.js +1214 -0
- package/dist/previews-npwrwb0b.js +1214 -0
- package/dist/previews-q8ph9wbe.js +1214 -0
- package/dist/previews-rfswrh7q.js +1214 -0
- package/dist/previews-s0y5yp8s.js +1214 -0
- package/dist/previews-s5b6mnz5.js +1214 -0
- package/dist/{previews-d487qde5.js → previews-sdte4984.js} +23 -23
- package/dist/previews-t5tdm6t0.js +1225 -0
- package/dist/previews-tk7vpzj9.js +1214 -0
- package/dist/previews-tqt4pk27.js +1214 -0
- package/dist/previews-vqg4psk2.js +1225 -0
- package/dist/{productions-x9p0pym1.js → productions-4abj58kx.js} +12 -12
- package/dist/{productions-5ev5qweg.js → productions-4dpec71r.js} +13 -13
- package/dist/{productions-120xg0aq.js → productions-4nedsanh.js} +13 -13
- package/dist/{productions-p5rbgp2f.js → productions-5c58yafp.js} +13 -13
- package/dist/{productions-me3tdvr9.js → productions-5xq5cjhx.js} +13 -13
- package/dist/productions-6dr0bmd7.js +505 -0
- package/dist/productions-8f6s8dqr.js +505 -0
- package/dist/productions-a2hcwwzf.js +505 -0
- package/dist/productions-b7svyjp7.js +505 -0
- package/dist/productions-bf2cnr05.js +505 -0
- package/dist/productions-dkgry3gv.js +505 -0
- package/dist/productions-eqh105tk.js +505 -0
- package/dist/productions-etvcm7yf.js +505 -0
- package/dist/productions-f1zpbmjz.js +505 -0
- package/dist/productions-j14pvx93.js +505 -0
- package/dist/productions-j7s1ywvg.js +505 -0
- package/dist/productions-jp3v3q3p.js +505 -0
- package/dist/productions-m9p42amj.js +505 -0
- package/dist/productions-mxbneawa.js +505 -0
- package/dist/productions-np4exh9p.js +505 -0
- package/dist/productions-rr1hqgda.js +505 -0
- package/dist/productions-rtf9ksgg.js +505 -0
- package/dist/productions-w2nzftcz.js +505 -0
- package/dist/productions-wbks5h7e.js +505 -0
- package/dist/productions-y99ayk6h.js +505 -0
- package/dist/productions-zpqyw5gm.js +505 -0
- package/dist/runtime/context-events.d.ts.map +1 -1
- package/dist/runtime/context.d.ts +8 -1
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/exports.d.ts +1 -4
- package/dist/runtime/exports.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +3 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/{src/runtime → runtime}/index.js +22 -7
- package/dist/runtime/middleware.d.ts +55 -0
- package/dist/runtime/middleware.d.ts.map +1 -1
- package/dist/runtime/router/index.d.ts +7 -0
- package/dist/runtime/router/index.d.ts.map +1 -0
- package/dist/runtime/router/types.d.ts +24 -0
- package/dist/runtime/router/types.d.ts.map +1 -0
- package/dist/runtime/validation.d.ts +9 -1
- package/dist/runtime/validation.d.ts.map +1 -1
- package/dist/{src/sveltekit → sveltekit}/index.js +36 -71
- package/dist/sveltekit/platform.d.ts +10 -0
- package/dist/sveltekit/platform.d.ts.map +1 -1
- package/dist/test/binding-hints.d.ts +11 -0
- package/dist/test/binding-hints.d.ts.map +1 -0
- package/dist/test/bridge-context.d.ts +7 -0
- package/dist/test/bridge-context.d.ts.map +1 -1
- package/dist/test/index.d.ts +0 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/{index-2x53aqjm.js → test/index.js} +836 -774
- package/dist/test/simple-context-bindings.d.ts +13 -0
- package/dist/test/simple-context-bindings.d.ts.map +1 -0
- package/dist/test/simple-context-env.d.ts +35 -0
- package/dist/test/simple-context-env.d.ts.map +1 -0
- package/dist/test/simple-context-gateway-script.d.ts.map +1 -1
- package/dist/test/simple-context-handlers.d.ts +12 -0
- package/dist/test/simple-context-handlers.d.ts.map +1 -0
- package/dist/test/simple-context-lifecycle.d.ts +32 -0
- package/dist/test/simple-context-lifecycle.d.ts.map +1 -0
- package/dist/test/simple-context-mfconfig.d.ts +7 -0
- package/dist/test/simple-context-mfconfig.d.ts.map +1 -0
- package/dist/test/simple-context-multi-worker.d.ts +16 -0
- package/dist/test/simple-context-multi-worker.d.ts.map +1 -0
- package/dist/test/simple-context-runtime.d.ts +19 -0
- package/dist/test/simple-context-runtime.d.ts.map +1 -0
- package/dist/test/simple-context-startup.d.ts +11 -0
- package/dist/test/simple-context-startup.d.ts.map +1 -0
- package/dist/test/simple-context-transport.d.ts +14 -0
- package/dist/test/simple-context-transport.d.ts.map +1 -0
- package/dist/test/simple-context.d.ts +6 -3
- package/dist/test/simple-context.d.ts.map +1 -1
- package/dist/test/utilities.d.ts +13 -5
- package/dist/test/utilities.d.ts.map +1 -1
- package/dist/test/worker.d.ts +1 -1
- package/dist/test/worker.d.ts.map +1 -1
- package/dist/{token-kedhcret.js → token-3b9wws58.js} +3 -3
- package/dist/{token-m8jmnjwk.js → token-47kcz18j.js} +3 -3
- package/dist/token-exz78pth.js +419 -0
- package/dist/token-fcthx92c.js +419 -0
- package/dist/token-grwp8z4q.js +419 -0
- package/dist/token-jkmm44z2.js +419 -0
- package/dist/token-qxtvzm3b.js +419 -0
- package/dist/token-rq8mvtz9.js +419 -0
- package/dist/token-sct51r47.js +419 -0
- package/dist/token-sfgxcgen.js +419 -0
- package/dist/transform/durable-object.d.ts.map +1 -1
- package/dist/transform/worker-entrypoint.d.ts +5 -0
- package/dist/transform/worker-entrypoint.d.ts.map +1 -1
- package/dist/types-0qv4xces.js +572 -0
- package/dist/types-2nvrs9jg.js +572 -0
- package/dist/types-2pbe8kzw.js +572 -0
- package/dist/types-2zyt0m43.js +572 -0
- package/dist/types-4xxer9ep.js +572 -0
- package/dist/{types-6e5yx6km.js → types-5t5y7a5n.js} +9 -9
- package/dist/{types-1gwr2ex6.js → types-5wd2rygw.js} +9 -9
- package/dist/types-7j3ykgx7.js +572 -0
- package/dist/types-8g78x34n.js +572 -0
- package/dist/types-e6d336q3.js +572 -0
- package/dist/types-hqh2fx0x.js +572 -0
- package/dist/types-j12xmdnd.js +572 -0
- package/dist/types-jqn26et3.js +572 -0
- package/dist/types-n0mxbq26.js +572 -0
- package/dist/types-naz9hvw5.js +572 -0
- package/dist/{types-p0gckpn6.js → types-qjcd1jks.js} +7 -7
- package/dist/types-r9zb8sw1.js +572 -0
- package/dist/types-rv5xwgsn.js +572 -0
- package/dist/types-t39njdqx.js +572 -0
- package/dist/types-tkgch3xv.js +572 -0
- package/dist/{types-0sqwkp7x.js → types-vvtb7rrh.js} +9 -9
- package/dist/types-w1grncdj.js +572 -0
- package/dist/types-wmw49exb.js +572 -0
- package/dist/types-ymxz9jga.js +572 -0
- package/dist/utils/resolve-package.d.ts.map +1 -1
- package/dist/utils/send-email.js +19 -0
- package/dist/vite/config-file.d.ts.map +1 -1
- package/dist/{src/vite → vite}/index.js +12 -11
- package/dist/vite/plugin-config-hook.d.ts +28 -0
- package/dist/vite/plugin-config-hook.d.ts.map +1 -0
- package/dist/vite/plugin-context.d.ts +25 -0
- package/dist/vite/plugin-context.d.ts.map +1 -0
- package/dist/vite/plugin-durable-objects.d.ts +18 -0
- package/dist/vite/plugin-durable-objects.d.ts.map +1 -0
- package/dist/vite/plugin-programmatic.d.ts +44 -0
- package/dist/vite/plugin-programmatic.d.ts.map +1 -0
- package/dist/vite/plugin-transform.d.ts +41 -0
- package/dist/vite/plugin-transform.d.ts.map +1 -0
- package/dist/vite/plugin.d.ts +6 -39
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/{worker-y9ha6g44.js → worker-18ceqscc.js} +11 -11
- package/dist/{worker-0srh2jfr.js → worker-1yqpwte2.js} +12 -12
- package/dist/{worker-qtam8grz.js → worker-2aw27zxy.js} +12 -12
- package/dist/{worker-4xrfd10a.js → worker-45tp4a8f.js} +12 -12
- package/dist/worker-68zttchg.js +513 -0
- package/dist/worker-729cf3fh.js +513 -0
- package/dist/worker-aydzxt4f.js +513 -0
- package/dist/worker-ejdxma7k.js +513 -0
- package/dist/worker-entry/composed-worker.d.ts +1 -0
- package/dist/worker-entry/composed-worker.d.ts.map +1 -1
- package/dist/worker-entry/durable-object-discovery.d.ts +20 -0
- package/dist/worker-entry/durable-object-discovery.d.ts.map +1 -0
- package/dist/worker-entry/extensions.d.ts +5 -0
- package/dist/worker-entry/extensions.d.ts.map +1 -0
- package/dist/worker-entry/routes.d.ts +1 -1
- package/dist/worker-entry/routes.d.ts.map +1 -1
- package/dist/worker-entry/surface-paths.d.ts +4 -4
- package/dist/worker-entry/surface-paths.d.ts.map +1 -1
- package/dist/worker-entrypoint-4xp7msd7.js +16 -0
- package/dist/worker-entrypoint-f1v9y4s8.js +15 -0
- package/dist/{worker-qzm0b7br.js → worker-f6xqjg65.js} +12 -12
- package/dist/worker-fdnn62de.js +513 -0
- package/dist/worker-frnh95rg.js +513 -0
- package/dist/worker-k55nfrmp.js +513 -0
- package/dist/worker-kqc6w7ry.js +513 -0
- package/dist/worker-ksvcq8be.js +513 -0
- package/dist/worker-mjzfstv5.js +513 -0
- package/dist/worker-p4rtsndj.js +513 -0
- package/dist/worker-p6d53qan.js +513 -0
- package/dist/worker-qh2qbv97.js +513 -0
- package/dist/worker-r234vnv9.js +513 -0
- package/dist/worker-r47bv7gt.js +513 -0
- package/dist/worker-s4nvbqsm.js +513 -0
- package/dist/worker-ttj7vwce.js +513 -0
- package/dist/worker-wv4jdneg.js +513 -0
- package/dist/worker-xcbscr75.js +513 -0
- package/dist/worker-ywwkf3cp.js +513 -0
- package/dist/worker-z8wtk0sh.js +513 -0
- package/package.json +138 -123
- package/dist/account-s66jb15j.js +0 -475
- package/dist/browser-shim/worker.d.ts +0 -14
- package/dist/browser-shim/worker.d.ts.map +0 -1
- package/dist/deploy-7nmzc9r8.js +0 -609
- package/dist/deploy-tp0g6qdp.js +0 -609
- package/dist/index-091sh1ma.js +0 -1229
- package/dist/index-f85s8gj3.js +0 -2649
- package/dist/index-fe2ngvh7.js +0 -1229
- package/dist/index-hfj1a2c4.js +0 -2649
- package/dist/index-maxpsfk8.js +0 -402
- package/dist/index-mbdmrner.js +0 -402
- package/dist/index-mea5bc45.js +0 -418
- package/dist/index-sgb7c8nm.js +0 -402
- package/dist/index-vt4yxkmf.js +0 -470
- package/dist/index-wyq6c6yj.js +0 -402
- package/dist/index-zyt5byt6.js +0 -2649
- package/dist/login-x8tgckqm.js +0 -77
- package/dist/previews-q031mx34.js +0 -1168
- package/dist/src/cli/index.js +0 -12
- package/dist/src/index.js +0 -144
- package/dist/src/test/index.js +0 -77
package/LLM.md
CHANGED
|
@@ -11,7 +11,7 @@ It is meant to read like a proper markdown handbook rather than a second source
|
|
|
11
11
|
- Links use the same `/docs/...` routes as the documentation site.
|
|
12
12
|
|
|
13
13
|
## Documentation map
|
|
14
|
-
This export covers
|
|
14
|
+
This export covers 87 pages across 5 top-level groups.
|
|
15
15
|
|
|
16
16
|
### Quickstart
|
|
17
17
|
See why Devflare exists, build the smallest safe first worker, and keep the documentation contract nearby before you branch into the deeper toolkit.
|
|
@@ -92,70 +92,76 @@ Use cross-cutting guides to choose the right storage, state, async, file-deliver
|
|
|
92
92
|
Use the per-binding guides for the exact authoring, runtime, testing, preview, and example details once the guide pages have already helped you choose the right pattern.
|
|
93
93
|
|
|
94
94
|
- **KV** — Fast lookup state, cache-like reads, and lightweight shared data with strong local support.
|
|
95
|
-
- [KV](/docs/kv
|
|
96
|
-
- [KV internals](/docs/kv
|
|
97
|
-
- [Testing KV](/docs/kv
|
|
98
|
-
- [KV example](/docs/kv
|
|
95
|
+
- [KV](/docs/bindings/kv) — KV bindings are first-class in Devflare: author stable names in config, keep env typed, and run real get or put flows locally.
|
|
96
|
+
- [KV internals](/docs/bindings/kv/internals) — KV goes through the full Devflare pipeline: normalize authoring, resolve names when needed, then compile to Wrangler output.
|
|
97
|
+
- [Testing KV](/docs/bindings/kv/testing) — Use the default test harness first. KV is one of the bindings Devflare supports best in local tests.
|
|
98
|
+
- [KV example](/docs/bindings/kv/example) — This example keeps KV simple: one binding, one fetch handler, one assertion.
|
|
99
99
|
|
|
100
100
|
- **D1** — SQLite-style relational queries with a strong local harness and id or name-based authoring.
|
|
101
|
-
- [D1](/docs/d1
|
|
102
|
-
- [D1 internals](/docs/d1
|
|
103
|
-
- [Testing D1](/docs/d1
|
|
104
|
-
- [D1 example](/docs/d1
|
|
101
|
+
- [D1](/docs/bindings/d1) — D1 gets the same stable-name authoring story as KV, but the runtime shape is relational: `prepare`, `batch`, `exec`, and prepared statements.
|
|
102
|
+
- [D1 internals](/docs/bindings/d1/internals) — D1 uses the same normalize-then-resolve pattern as KV, but compiles to Wrangler `d1_databases` and exposes a relational local runtime surface.
|
|
103
|
+
- [Testing D1](/docs/bindings/d1/testing) — D1 is one of the easiest bindings to test meaningfully with Devflare because the local runtime already speaks the same database API your worker uses.
|
|
104
|
+
- [D1 example](/docs/bindings/d1/example) — This starter example keeps D1 focused on one job: answer a single query and prove the binding works locally.
|
|
105
105
|
|
|
106
106
|
- **R2** — Object storage bindings with strong local support and one important rule: do not assume a browser URL contract.
|
|
107
|
-
- [R2](/docs/r2
|
|
108
|
-
- [R2 internals](/docs/r2
|
|
109
|
-
- [Testing R2](/docs/r2
|
|
110
|
-
- [R2 example](/docs/r2
|
|
107
|
+
- [R2](/docs/bindings/r2) — R2 is straightforward in config and well-supported locally, but browser-facing delivery should usually go through a Worker route instead of assuming bucket URLs.
|
|
108
|
+
- [R2 internals](/docs/bindings/r2/internals) — R2 is simpler than KV or D1 because the authored value is already the bucket name, so there is no name-versus-id resolution dance.
|
|
109
|
+
- [Testing R2](/docs/bindings/r2/testing) — R2 is local-friendly, which means you can test real object operations without inventing a storage adapter just to get off the ground.
|
|
110
|
+
- [R2 example](/docs/bindings/r2/example) — This example uses one private bucket and one route, which is still the cleanest default shape for many real apps.
|
|
111
111
|
|
|
112
112
|
- **Durable Objects** — Stateful coordination primitives with strong local support, cross-worker wiring, and important preview caveats.
|
|
113
|
-
- [Durable Objects](/docs/durable-
|
|
114
|
-
- [Durable Objects internals](/docs/durable-
|
|
115
|
-
- [Testing Durable Objects](/docs/durable-
|
|
116
|
-
- [Durable Objects example](/docs/durable-
|
|
113
|
+
- [Durable Objects](/docs/bindings/durable-objects) — The fast Devflare payoff is simple: put one counter object in a `do.*` file, call it from the worker, and call the same object directly in tests.
|
|
114
|
+
- [Durable Objects internals](/docs/bindings/durable-objects/internals) — Durable Object bindings normalize into a stable binding shape, compile into Wrangler `durable_objects.bindings`, and participate in Devflare’s own DO bundling path.
|
|
115
|
+
- [Testing Durable Objects](/docs/bindings/durable-objects/testing) — Durable Objects are well-supported in the default Devflare harness, which means you can test real object behavior without hand-building a fake namespace first.
|
|
116
|
+
- [Durable Objects example](/docs/bindings/durable-objects/example) — This example shows the whole Durable Object story in the smallest useful shape: one auto-discovered object, one worker route, and one direct test.
|
|
117
117
|
|
|
118
118
|
- **Queues** — Producer and consumer bindings for background work with a strong local trigger story.
|
|
119
|
-
- [Queues](/docs/
|
|
120
|
-
- [Queues internals](/docs/
|
|
121
|
-
- [Testing Queues](/docs/
|
|
122
|
-
- [Queues example](/docs/
|
|
119
|
+
- [Queues](/docs/bindings/queues) — Devflare models Queue producers and consumers explicitly, which makes local tests and preview naming much easier to reason about.
|
|
120
|
+
- [Queues internals](/docs/bindings/queues/internals) — Queue config is compiled into explicit producer and consumer blocks, with preview resource materialization available for both queue names and DLQs.
|
|
121
|
+
- [Testing Queues](/docs/bindings/queues/testing) — Queue testing is one of the places where Devflare’s helper surface feels especially good because the queue trigger already knows how to drive the real handler shape.
|
|
122
|
+
- [Queues example](/docs/bindings/queues/example) — This starter example wires one producer, one consumer, and one stored result so you can see the whole queue loop without ceremony.
|
|
123
|
+
|
|
124
|
+
- **Services** — Worker-to-worker bindings with `ref()` support, typed env generation, and good local multi-worker tests.
|
|
125
|
+
- [Services](/docs/bindings/services) — The fast Devflare payoff is simple: wire one worker to another with `ref()`, call it through `env.MATH_SERVICE`, and prove the same relationship locally in one test.
|
|
126
|
+
- [Services internals](/docs/bindings/services/internals) — Devflare resolves referenced worker configs, bundles the linked worker surfaces, and then exposes those services as local multi-worker bindings.
|
|
127
|
+
- [Testing Services](/docs/bindings/services/testing) — Service bindings are one of the clearest Devflare wins in multi-worker apps: you can keep the real worker boundary and still prove it through the default local harness.
|
|
128
|
+
- [Services example](/docs/bindings/services/example) — This example shows the smallest useful service-binding loop: one `ref()`, one gateway route, and one local multi-worker test.
|
|
123
129
|
|
|
124
130
|
- **AI** — Workers AI bindings for remote inference, with a deliberately remote-oriented testing story.
|
|
125
|
-
- [AI](/docs/ai
|
|
126
|
-
- [AI internals](/docs/ai
|
|
127
|
-
- [Testing AI](/docs/ai
|
|
128
|
-
- [AI example](/docs/ai
|
|
131
|
+
- [AI](/docs/bindings/ai) — Devflare makes Workers AI usable by keeping the binding tiny in config, the worker call obvious, and the remote smoke test explicit instead of fake.
|
|
132
|
+
- [AI internals](/docs/bindings/ai/internals) — AI has a smaller compiler story than storage bindings, but a more explicit auth and remote-runtime story.
|
|
133
|
+
- [Testing AI](/docs/bindings/ai/testing) — The right AI test strategy is selective: use remote mode when you mean to test inference, and skip cleanly when the environment is not allowed to do that.
|
|
134
|
+
- [AI example](/docs/bindings/ai/example) — This example keeps the AI story honest and useful: one binding, one tiny inference route, and one skip-aware remote smoke test.
|
|
129
135
|
|
|
130
136
|
- **Vectorize** — Vector similarity indexes with explicit remote testing and preview-aware index naming.
|
|
131
|
-
- [Vectorize](/docs/vectorize
|
|
132
|
-
- [Vectorize internals](/docs/vectorize
|
|
133
|
-
- [Testing Vectorize](/docs/vectorize
|
|
134
|
-
- [Vectorize example](/docs/vectorize
|
|
137
|
+
- [Vectorize](/docs/bindings/vectorize) — Devflare makes Vectorize usable by keeping the index name explicit in config, preview naming honest, and the real smoke test explicit instead of buried under mocks.
|
|
138
|
+
- [Vectorize internals](/docs/bindings/vectorize/internals) — Vectorize compiles cleanly into Wrangler output and participates in preview resource lifecycle, but the runtime value of the binding mostly lives in remote infrastructure.
|
|
139
|
+
- [Testing Vectorize](/docs/bindings/vectorize/testing) — The right Vectorize tests are targeted remote checks: a small insert or query, a clear skip condition, and a real index behind the binding.
|
|
140
|
+
- [Vectorize example](/docs/bindings/vectorize/example) — This example keeps Vectorize honest and usable: one index binding, one upsert-and-query route, and one skip-aware remote smoke test.
|
|
135
141
|
|
|
136
142
|
- **Hyperdrive** — PostgreSQL-oriented bindings with schema support, name resolution, and a narrower proven local story than D1 or KV.
|
|
137
|
-
- [Hyperdrive](/docs/hyperdrive
|
|
138
|
-
- [Hyperdrive internals](/docs/hyperdrive
|
|
139
|
-
- [Testing Hyperdrive](/docs/hyperdrive
|
|
140
|
-
- [Hyperdrive example](/docs/hyperdrive
|
|
143
|
+
- [Hyperdrive](/docs/bindings/hyperdrive) — Hyperdrive is modeled in Devflare config and compile flows like other name-based resources, but its tested local ergonomics are thinner than D1 or KV.
|
|
144
|
+
- [Hyperdrive internals](/docs/bindings/hyperdrive/internals) — Hyperdrive uses the same normalize-and-resolve pattern as KV and D1, but preview lifecycle includes a fallback path instead of guaranteed preview cloning.
|
|
145
|
+
- [Testing Hyperdrive](/docs/bindings/hyperdrive/testing) — Hyperdrive testing should start smaller and more cautiously than D1 testing: prove the binding exists, then add targeted integration where the real database path matters.
|
|
146
|
+
- [Hyperdrive example](/docs/bindings/hyperdrive/example) — This example keeps Hyperdrive focused on one thing: prove the binding exists and expose the connection information your app will need next.
|
|
141
147
|
|
|
142
148
|
- **Browser Rendering** — Headless browser support with an explicit single-binding limit and a stronger dev-server story than test-helper story.
|
|
143
|
-
- [Browser Rendering](/docs/browser-
|
|
144
|
-
- [Browser Rendering internals](/docs/browser-internals) — Browser Rendering support in Devflare is more than a config pass-through: the dev server starts a browser shim and a binding worker that line up with Cloudflare and puppeteer expectations.
|
|
145
|
-
- [Testing Browser Rendering](/docs/browser-testing) — Browser tests should usually be integration-flavored: either drive the worker in dev or exercise a thin smoke path that proves the binding can launch and fetch.
|
|
146
|
-
- [Browser Rendering example](/docs/browser-example) — This example shows the real browser
|
|
149
|
+
- [Browser Rendering](/docs/bindings/browser-rendering) — Browser Rendering shines in Devflare’s bridge-backed dev story: keep one browser binding, one narrow worker route, and one smoke path that proves launch works.
|
|
150
|
+
- [Browser Rendering internals](/docs/bindings/browser-rendering/internals) — Browser Rendering support in Devflare is more than a config pass-through: the dev server starts a browser shim and a binding worker that line up with Cloudflare and puppeteer expectations.
|
|
151
|
+
- [Testing Browser Rendering](/docs/bindings/browser-rendering/testing) — Browser tests should usually be integration-flavored: either drive the worker in dev or exercise a thin smoke path that proves the binding can launch and fetch.
|
|
152
|
+
- [Browser Rendering example](/docs/bindings/browser-rendering/example) — This example shows the real browser path people actually need: one binding, one title-read route, and one smoke check through the dev server.
|
|
147
153
|
|
|
148
154
|
- **Analytics Engine** — Dataset bindings for writeDataPoint-style event recording with schema support and lighter local testing guidance.
|
|
149
|
-
- [Analytics Engine](/docs/analytics-engine
|
|
150
|
-
- [Analytics Engine internals](/docs/analytics-engine
|
|
151
|
-
- [Testing Analytics Engine](/docs/analytics-engine
|
|
152
|
-
- [Analytics Engine example](/docs/analytics-engine
|
|
155
|
+
- [Analytics Engine](/docs/bindings/analytics-engine) — Analytics Engine is modeled cleanly in Devflare config and generated types, but the repo evidence points to a lighter local story than the first-class storage bindings.
|
|
156
|
+
- [Analytics Engine internals](/docs/bindings/analytics-engine/internals) — Analytics Engine has a straightforward compiler story, plus a preview note that matters because datasets are auto-created on first write instead of provisioned like buckets or databases.
|
|
157
|
+
- [Testing Analytics Engine](/docs/bindings/analytics-engine/testing) — Analytics Engine tests should stay thin: verify that the worker writes a data point, not that you can recreate Cloudflare analytics locally.
|
|
158
|
+
- [Analytics Engine example](/docs/bindings/analytics-engine/example) — This example writes one analytics event from one route, which is usually all you need to teach the binding shape clearly.
|
|
153
159
|
|
|
154
160
|
- **Send Email** — Outbound email bindings with real local support, plus an important distinction from inbound email event handlers.
|
|
155
|
-
- [Send Email](/docs/send-email
|
|
156
|
-
- [Send Email internals](/docs/send-email
|
|
157
|
-
- [Testing Send Email](/docs/send-email
|
|
158
|
-
- [Send Email example](/docs/send-email
|
|
161
|
+
- [Send Email](/docs/bindings/send-email) — Send Email is a real binding surface in Devflare, and it is worth documenting separately from inbound `src/email.ts` handlers so the two flows do not get blurred together.
|
|
162
|
+
- [Send Email internals](/docs/bindings/send-email/internals) — Send Email compiles into Wrangler output, normalizes message input at runtime, and supports local address restrictions instead of treating email as an unbounded free-for-all.
|
|
163
|
+
- [Testing Send Email](/docs/bindings/send-email/testing) — Send Email is stronger locally than many platform-service bindings because outbound email can be exercised in the default harness, while inbound email has its own related helper surface.
|
|
164
|
+
- [Send Email example](/docs/bindings/send-email/example) — This example keeps outbound email explicit: one binding, one recipient rule, one worker path that sends one message.
|
|
159
165
|
|
|
160
166
|
## Full documentation
|
|
161
167
|
|
|
@@ -303,10 +309,10 @@ Hover a label to see what it means for config, local runtime, tests, previews, a
|
|
|
303
309
|
- **KV, D1, and R2** — Devflare gives the main storage bindings a strong local-first story: readable config, generated env typing, local runtime behavior, and realistic tests without losing the Cloudflare shape. ([link](/docs/storage-bindings))
|
|
304
310
|
- **Durable Objects and queues** — Stateful objects and deferred work are treated as real worker surfaces, with config discovery, local runtime wrappers, and test helpers that match the application boundary. ([link](/docs/durable-objects-and-queues))
|
|
305
311
|
- **Service bindings and worker composition** — Service bindings and `ref()` let worker-to-worker dependencies stay explicit enough for local multi-worker runtime, generated types, and real tests through the same env surface the app uses. ([link](/docs/multi-workers))
|
|
306
|
-
- **Hyperdrive** — Hyperdrive is modeled cleanly in config and generated output, but the local and preview ergonomics are more constrained than KV, D1, or R2 because the real database and credentials stay remote. ([link](/docs/hyperdrive
|
|
307
|
-
- **Workers AI** — The AI binding is supported in config, types, and deployment flows, but meaningful tests are remote-oriented because real inference still lives on Cloudflare infrastructure. ([link](/docs/ai
|
|
308
|
-
- **Vectorize** — Vectorize is fully modeled in config and preview-aware naming, but real inserts and similarity queries still need remote infrastructure and honest remote-mode tests. ([link](/docs/vectorize
|
|
309
|
-
- **Browser Rendering** — Browser Rendering is fully supported through Devflare's bridge-backed local dev story, config model, generated typing, and runtime integration. The main platform caveat is still the Cloudflare one: exactly one browser binding. ([link](/docs/browser-
|
|
312
|
+
- **Hyperdrive** — Hyperdrive is modeled cleanly in config and generated output, but the local and preview ergonomics are more constrained than KV, D1, or R2 because the real database and credentials stay remote. ([link](/docs/bindings/hyperdrive))
|
|
313
|
+
- **Workers AI** — The AI binding is supported in config, types, and deployment flows, but meaningful tests are remote-oriented because real inference still lives on Cloudflare infrastructure. ([link](/docs/bindings/ai))
|
|
314
|
+
- **Vectorize** — Vectorize is fully modeled in config and preview-aware naming, but real inserts and similarity queries still need remote infrastructure and honest remote-mode tests. ([link](/docs/bindings/vectorize))
|
|
315
|
+
- **Browser Rendering** — Browser Rendering is fully supported through Devflare's bridge-backed local dev story, config model, generated typing, and runtime integration. The main platform caveat is still the Cloudflare one: exactly one browser binding. ([link](/docs/bindings/browser-rendering))
|
|
310
316
|
|
|
311
317
|
#### What Devflare adds on top of raw Cloudflare workflows
|
|
312
318
|
|
|
@@ -943,9 +949,9 @@ Once one tiny example works locally, jump to the dedicated binding guides for th
|
|
|
943
949
|
|
|
944
950
|
##### Highlights
|
|
945
951
|
|
|
946
|
-
- **Durable Objects guide** — Read the fuller guidance on stateful objects, migrations, previews, and local testing. ([link](/docs/durable-
|
|
947
|
-
- **R2 guide** — Open the deeper R2 page for delivery boundaries, testing patterns, and storage architecture choices. ([link](/docs/r2
|
|
948
|
-
- **Browser Rendering guide** — Open the browser guide when you need the single-binding caveat, dev-server details, or heavier browser workflows. ([link](/docs/browser-
|
|
952
|
+
- **Durable Objects guide** — Read the fuller guidance on stateful objects, migrations, previews, and local testing. ([link](/docs/bindings/durable-objects))
|
|
953
|
+
- **R2 guide** — Open the deeper R2 page for delivery boundaries, testing patterns, and storage architecture choices. ([link](/docs/bindings/r2))
|
|
954
|
+
- **Browser Rendering guide** — Open the browser guide when you need the single-binding caveat, dev-server details, or heavier browser workflows. ([link](/docs/bindings/browser-rendering))
|
|
949
955
|
|
|
950
956
|
---
|
|
951
957
|
|
|
@@ -2577,6 +2583,26 @@ This is why `config.env` is more than a raw Wrangler mirror. It can change the D
|
|
|
2577
2583
|
| `routes`, `assets`, `limits`, `observability` | Deployment routing, static assets, CPU limits, or observability should differ by lane. |
|
|
2578
2584
|
| `rolldown`, `vite`, `wrangler` | The build host or the passthrough escape hatch needs environment-specific behavior. |
|
|
2579
2585
|
|
|
2586
|
+
#### Environment overrides: arrays replace, objects deep-merge, primitives replace
|
|
2587
|
+
|
|
2588
|
+
Overlays compose onto the base config with three rules: object-shaped values are deep-merged key by key, primitive values (strings, numbers, booleans) are replaced wholesale, and array-shaped values are replaced wholesale (they do not append). Reading an environment block as an override of the base — not as an addition to it — keeps these rules predictable.
|
|
2589
|
+
|
|
2590
|
+
The replace-arrays rule is the one most likely to surprise someone arriving from a config system that appended arrays. If a base config sets `routes: […]` and the overlay sets `routes: […]`, the overlay’s array becomes the resolved value; the base array is not concatenated. The same applies to `migrations` and to nested arrays like `triggers.crons`.
|
|
2591
|
+
|
|
2592
|
+
##### Reference table
|
|
2593
|
+
|
|
2594
|
+
| Field shape | Merge rule | Example |
|
|
2595
|
+
| --- | --- | --- |
|
|
2596
|
+
| `routes` (array) | Replace | Base `routes: [{ pattern: "app.example.com/*", zone_name: "example.com" }]` + overlay `routes: [{ pattern: "preview.example.com/*", zone_name: "example.com" }]` resolves to **only** the preview entry. |
|
|
2597
|
+
| `migrations` (array) | Replace | Base `migrations: [{ tag: "v1", new_classes: ["Room"] }]` + overlay `migrations: [{ tag: "v2", new_classes: ["Room", "User"] }]` resolves to **only** the v2 entry. To preserve history, restate the prior migrations in the overlay. |
|
|
2598
|
+
| `triggers.crons` (array under nested object) | Replace at the array level (the parent `triggers` object is still deep-merged) | Base `triggers: { crons: ["*/5 * * * *"] }` + overlay `triggers: { crons: ["0 * * * *"] }` resolves to `triggers.crons = ["0 * * * *"]`. Other keys on `triggers` deep-merge as usual. |
|
|
2599
|
+
| `bindings` (object) | Deep-merge | Adding `bindings.kv.NEW_NS` in an overlay extends the base `bindings.kv` map; existing namespaces survive unless the overlay names the same key. |
|
|
2600
|
+
| `name`, `compatibility_date` (primitive) | Replace | The overlay value wins when present; otherwise the base value stays. |
|
|
2601
|
+
|
|
2602
|
+
> **Warning — Arrays replace, they do not append**
|
|
2603
|
+
>
|
|
2604
|
+
> If you only want to add one extra route, one extra cron, or one extra migration to the base, the overlay must restate the base entries alongside the new one. An overlay that lists only the new entry will silently drop the base entries from the resolved config.
|
|
2605
|
+
|
|
2580
2606
|
#### Choose the environment where it matters, and let explicit deploy targets do the rest
|
|
2581
2607
|
|
|
2582
2608
|
##### Steps
|
|
@@ -3903,17 +3929,18 @@ That is great once you already opened the right binding page. This index is for
|
|
|
3903
3929
|
|
|
3904
3930
|
##### Highlights
|
|
3905
3931
|
|
|
3906
|
-
- **Testing KV** — Use the default test harness first. KV is one of the bindings Devflare supports best in local tests. Open the KV overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/kv
|
|
3907
|
-
- **Testing D1** — D1 is one of the easiest bindings to test meaningfully with Devflare because the local runtime already speaks the same database API your worker uses. Open the D1 overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/d1
|
|
3908
|
-
- **Testing R2** — R2 is local-friendly, which means you can test real object operations without inventing a storage adapter just to get off the ground. Open the R2 overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/r2
|
|
3909
|
-
- **Testing Durable Objects** — Durable Objects are well-supported in the default Devflare harness, which means you can test real object behavior without hand-building a fake namespace first. Open the Durable Objects overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/durable-
|
|
3910
|
-
- **Testing Queues** — Queue testing is one of the places where Devflare’s helper surface feels especially good because the queue trigger already knows how to drive the real handler shape. Open the Queues overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/
|
|
3911
|
-
- **Testing
|
|
3912
|
-
- **Testing
|
|
3913
|
-
- **Testing
|
|
3914
|
-
- **Testing
|
|
3915
|
-
- **Testing
|
|
3916
|
-
- **Testing
|
|
3932
|
+
- **Testing KV** — Use the default test harness first. KV is one of the bindings Devflare supports best in local tests. Open the KV overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/kv/testing))
|
|
3933
|
+
- **Testing D1** — D1 is one of the easiest bindings to test meaningfully with Devflare because the local runtime already speaks the same database API your worker uses. Open the D1 overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/d1/testing))
|
|
3934
|
+
- **Testing R2** — R2 is local-friendly, which means you can test real object operations without inventing a storage adapter just to get off the ground. Open the R2 overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/r2/testing))
|
|
3935
|
+
- **Testing Durable Objects** — Durable Objects are well-supported in the default Devflare harness, which means you can test real object behavior without hand-building a fake namespace first. Open the Durable Objects overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/durable-objects/testing))
|
|
3936
|
+
- **Testing Queues** — Queue testing is one of the places where Devflare’s helper surface feels especially good because the queue trigger already knows how to drive the real handler shape. Open the Queues overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/queues/testing))
|
|
3937
|
+
- **Testing Services** — Service bindings are one of the clearest Devflare wins in multi-worker apps: you can keep the real worker boundary and still prove it through the default local harness. Open the Services overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/services/testing))
|
|
3938
|
+
- **Testing AI** — The right AI test strategy is selective: use remote mode when you mean to test inference, and skip cleanly when the environment is not allowed to do that. Open the AI overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/ai/testing))
|
|
3939
|
+
- **Testing Vectorize** — The right Vectorize tests are targeted remote checks: a small insert or query, a clear skip condition, and a real index behind the binding. Open the Vectorize overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/vectorize/testing))
|
|
3940
|
+
- **Testing Hyperdrive** — Hyperdrive testing should start smaller and more cautiously than D1 testing: prove the binding exists, then add targeted integration where the real database path matters. Open the Hyperdrive overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/hyperdrive/testing))
|
|
3941
|
+
- **Testing Browser Rendering** — Browser tests should usually be integration-flavored: either drive the worker in dev or exercise a thin smoke path that proves the binding can launch and fetch. Open the Browser Rendering overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/browser-rendering/testing))
|
|
3942
|
+
- **Testing Analytics Engine** — Analytics Engine tests should stay thin: verify that the worker writes a data point, not that you can recreate Cloudflare analytics locally. Open the Analytics Engine overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/analytics-engine/testing))
|
|
3943
|
+
- **Testing Send Email** — Send Email is stronger locally than many platform-service bindings because outbound email can be exercised in the default harness, while inbound email has its own related helper surface. Open the Send Email overview first when you need the full binding story, or jump straight here when the only open question is how to test it. ([link](/docs/bindings/send-email/testing))
|
|
3917
3944
|
|
|
3918
3945
|
#### The testing posture is not identical for every binding
|
|
3919
3946
|
|
|
@@ -3926,6 +3953,7 @@ That is great once you already opened the right binding page. This index is for
|
|
|
3926
3953
|
| R2 | First-class local runtime and tests | `createTestContext()` with `env.ASSETS` or `cf.worker.fetch()` |
|
|
3927
3954
|
| Durable Objects | First-class local runtime and tests, including cross-worker references | `createTestContext()` with the real DO namespace in `env` |
|
|
3928
3955
|
| Queues | First-class local runtime and queue-trigger tests | `createTestContext()` plus `cf.queue.trigger()` |
|
|
3956
|
+
| Services | First-class local runtime and multi-worker tests | `createTestContext()` plus `env.MY_SERVICE` |
|
|
3929
3957
|
| AI | Remote-oriented; local tests require remote mode | `createTestContext()` after remote mode is enabled, plus `shouldSkip.ai` |
|
|
3930
3958
|
| Vectorize | Remote-oriented; local tests require remote mode or explicit mocks | `createTestContext()` in remote mode plus `shouldSkip.vectorize` |
|
|
3931
3959
|
| Hyperdrive | Supported, but with a narrower proven local test story | `createTestContext()` plus small binding or smoke checks |
|
|
@@ -5446,10 +5474,10 @@ export async function GET({ env, params }: FetchEvent<DevflareEnv>): Promise<Res
|
|
|
5446
5474
|
|
|
5447
5475
|
##### Highlights
|
|
5448
5476
|
|
|
5449
|
-
- **KV** — Open the KV guide when the storage shape is keyed lookup, cache-like state, or namespace lifecycle. ([link](/docs/kv
|
|
5450
|
-
- **D1** — Open the D1 guide when the storage shape is query-driven and you need the actual SQL-shaped runtime contract. ([link](/docs/d1
|
|
5451
|
-
- **R2** — Open the R2 guide when the real question is bucket usage, testing, preview naming, or file delivery details. ([link](/docs/r2
|
|
5452
|
-
- **Hyperdrive** — Open the Hyperdrive guide when the worker is reaching an existing PostgreSQL system and the operational caveats matter more than the storage taxonomy. ([link](/docs/hyperdrive
|
|
5477
|
+
- **KV** — Open the KV guide when the storage shape is keyed lookup, cache-like state, or namespace lifecycle. ([link](/docs/bindings/kv))
|
|
5478
|
+
- **D1** — Open the D1 guide when the storage shape is query-driven and you need the actual SQL-shaped runtime contract. ([link](/docs/bindings/d1))
|
|
5479
|
+
- **R2** — Open the R2 guide when the real question is bucket usage, testing, preview naming, or file delivery details. ([link](/docs/bindings/r2))
|
|
5480
|
+
- **Hyperdrive** — Open the Hyperdrive guide when the worker is reaching an existing PostgreSQL system and the operational caveats matter more than the storage taxonomy. ([link](/docs/bindings/hyperdrive))
|
|
5453
5481
|
|
|
5454
5482
|
---
|
|
5455
5483
|
|
|
@@ -5585,7 +5613,7 @@ export async function GET({ env, params }: FetchEvent<DevflareEnv>): Promise<Res
|
|
|
5585
5613
|
|
|
5586
5614
|
##### Highlights
|
|
5587
5615
|
|
|
5588
|
-
- **R2 binding guide** — Open this once the architecture choice is done and the next question is the exact binding shape, local runtime behavior, or testing posture. ([link](/docs/r2
|
|
5616
|
+
- **R2 binding guide** — Open this once the architecture choice is done and the next question is the exact binding shape, local runtime behavior, or testing posture. ([link](/docs/bindings/r2))
|
|
5589
5617
|
- **Preview-scoped bindings** — Open this when preview deployments should own separate buckets or other disposable infrastructure that can be cleaned up by scope later. ([link](/docs/config-previews))
|
|
5590
5618
|
- **createTestContext()** — Open this when the next question is how the local worker-shaped test harness exposes real R2 bindings and helper surfaces. ([link](/docs/create-test-context))
|
|
5591
5619
|
|
|
@@ -5709,8 +5737,8 @@ export default defineConfig({
|
|
|
5709
5737
|
|
|
5710
5738
|
##### Highlights
|
|
5711
5739
|
|
|
5712
|
-
- **Durable Objects** — Open the Durable Objects guide for the real binding shape, local tests, migrations, and preview caveats. ([link](/docs/durable-
|
|
5713
|
-
- **Queues** — Open the Queues guide for producer and consumer authoring, queue tests, and preview resource lifecycle details. ([link](/docs/
|
|
5740
|
+
- **Durable Objects** — Open the Durable Objects guide for the real binding shape, local tests, migrations, and preview caveats. ([link](/docs/bindings/durable-objects))
|
|
5741
|
+
- **Queues** — Open the Queues guide for producer and consumer authoring, queue tests, and preview resource lifecycle details. ([link](/docs/bindings/queues))
|
|
5714
5742
|
|
|
5715
5743
|
---
|
|
5716
5744
|
|
|
@@ -5725,7 +5753,7 @@ export default defineConfig({
|
|
|
5725
5753
|
| Navigation title | Worker composition |
|
|
5726
5754
|
| Eyebrow | Composition |
|
|
5727
5755
|
|
|
5728
|
-
The
|
|
5756
|
+
The Services guide can explain the mechanics. This page exists for the composition question: when should another worker exist at all, how do you keep the boundary explicit, and which docs own the deeper service details once you commit to it?
|
|
5729
5757
|
|
|
5730
5758
|
#### At a glance
|
|
5731
5759
|
|
|
@@ -5740,7 +5768,7 @@ The service-binding reference pages can explain the mechanics. This page exists
|
|
|
5740
5768
|
|
|
5741
5769
|
The goal is not to split one worker just because the file count went up. The goal is to give a real runtime boundary a real worker boundary, then let service bindings make that relationship explicit enough for tooling and review.
|
|
5742
5770
|
|
|
5743
|
-
That means this page should answer the architecture choice first. The
|
|
5771
|
+
That means this page should answer the architecture choice first. The Services guide can take over once the answer is already “yes, another worker should exist.”
|
|
5744
5772
|
|
|
5745
5773
|
##### Reference table
|
|
5746
5774
|
|
|
@@ -5758,20 +5786,20 @@ That means this page should answer the architecture choice first. The service-bi
|
|
|
5758
5786
|
|
|
5759
5787
|
If another worker is real, the relationship belongs in config instead of in copied worker names or half-remembered script references. `ref()` gives Devflare enough structure to follow the dependency into local runtime, generated env types, and compiled output.
|
|
5760
5788
|
|
|
5761
|
-
Keep the architecture example simple: one referenced worker and one explicit service binding are enough to show the boundary. Named entrypoints are real too, but the
|
|
5789
|
+
Keep the architecture example simple: one referenced worker and one explicit service binding are enough to show the boundary. Named entrypoints are real too, but the Services and generated-types pages own that deeper contract once the worker boundary itself is already justified.
|
|
5762
5790
|
|
|
5763
5791
|
##### Example — Model the worker family with `ref()` and one explicit service binding
|
|
5764
5792
|
|
|
5765
5793
|
```ts
|
|
5766
5794
|
import { defineConfig, ref } from 'devflare/config'
|
|
5767
5795
|
|
|
5768
|
-
|
|
5796
|
+
const mathWorker = ref(() => import('../math-service/devflare.config'))
|
|
5769
5797
|
|
|
5770
5798
|
export default defineConfig({
|
|
5771
5799
|
name: 'gateway',
|
|
5772
5800
|
bindings: {
|
|
5773
5801
|
services: {
|
|
5774
|
-
|
|
5802
|
+
MATH_SERVICE: mathWorker.worker
|
|
5775
5803
|
}
|
|
5776
5804
|
}
|
|
5777
5805
|
})
|
|
@@ -5809,8 +5837,8 @@ test('service binding calls the default worker export', async () => {
|
|
|
5809
5837
|
|
|
5810
5838
|
##### Highlights
|
|
5811
5839
|
|
|
5812
|
-
- **
|
|
5813
|
-
- **Testing Services** — Open the service testing guide when the next question is the right default harness or how to test named entrypoints accurately. ([link](/docs/
|
|
5840
|
+
- **Services guide** — Open the service guide for the exact binding shape, env typing, and compiler behavior once another worker is definitely the right boundary. ([link](/docs/bindings/services))
|
|
5841
|
+
- **Testing Services** — Open the service testing guide when the next question is the right default harness or how to test named entrypoints accurately. ([link](/docs/bindings/services/testing))
|
|
5814
5842
|
- **Generated types** — Open this page when `ref()` relationships, named entrypoints, or `defineConfig<Entrypoints>()` typing becomes the real question. ([link](/docs/generated-types))
|
|
5815
5843
|
- **Preview strategies** — Open the preview page when the worker family needs real isolation and the naming model is the release question now. ([link](/docs/preview-strategies))
|
|
5816
5844
|
- **Testing overview** — Use the testing map when the next question is broader than service bindings alone. ([link](/docs/testing-overview))
|
|
@@ -5823,7 +5851,7 @@ test('service binding calls the default worker export', async () => {
|
|
|
5823
5851
|
|
|
5824
5852
|
| Field | Value |
|
|
5825
5853
|
| --- | --- |
|
|
5826
|
-
| Route | [`/docs/kv
|
|
5854
|
+
| Route | [`/docs/bindings/kv`](/docs/bindings/kv) |
|
|
5827
5855
|
| Group | Bindings |
|
|
5828
5856
|
| Navigation title | KV |
|
|
5829
5857
|
| Eyebrow | Binding reference |
|
|
@@ -5901,9 +5929,9 @@ Cloudflare Workers KV docs is the platform reference. This page is the Devflare
|
|
|
5901
5929
|
|
|
5902
5930
|
##### Highlights
|
|
5903
5931
|
|
|
5904
|
-
- **KV internals** — See normalization, Wrangler `kv_namespaces`, and the preview or runtime details behind the authored shape. ([link](/docs/kv
|
|
5905
|
-
- **Testing KV** — Start from `createTestContext()` plus `env.CACHE` or `cf.worker.fetch()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/kv
|
|
5906
|
-
- **KV example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/kv
|
|
5932
|
+
- **KV internals** — See normalization, Wrangler `kv_namespaces`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/kv/internals))
|
|
5933
|
+
- **Testing KV** — Start from `createTestContext()` plus `env.CACHE` or `cf.worker.fetch()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/kv/testing))
|
|
5934
|
+
- **KV example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/kv/example))
|
|
5907
5935
|
|
|
5908
5936
|
---
|
|
5909
5937
|
|
|
@@ -5913,7 +5941,7 @@ Cloudflare Workers KV docs is the platform reference. This page is the Devflare
|
|
|
5913
5941
|
|
|
5914
5942
|
| Field | Value |
|
|
5915
5943
|
| --- | --- |
|
|
5916
|
-
| Route | [`/docs/kv
|
|
5944
|
+
| Route | [`/docs/bindings/kv/internals`](/docs/bindings/kv/internals) |
|
|
5917
5945
|
| Group | Bindings |
|
|
5918
5946
|
| Navigation title | KV internals |
|
|
5919
5947
|
| Eyebrow | Under the hood |
|
|
@@ -5993,7 +6021,7 @@ export default defineConfig({
|
|
|
5993
6021
|
|
|
5994
6022
|
| Field | Value |
|
|
5995
6023
|
| --- | --- |
|
|
5996
|
-
| Route | [`/docs/kv
|
|
6024
|
+
| Route | [`/docs/bindings/kv/testing`](/docs/bindings/kv/testing) |
|
|
5997
6025
|
| Group | Bindings |
|
|
5998
6026
|
| Navigation title | Testing KV |
|
|
5999
6027
|
| Eyebrow | Testing |
|
|
@@ -6058,7 +6086,7 @@ test('stores and reads a cache value', async () => {
|
|
|
6058
6086
|
|
|
6059
6087
|
| Field | Value |
|
|
6060
6088
|
| --- | --- |
|
|
6061
|
-
| Route | [`/docs/kv
|
|
6089
|
+
| Route | [`/docs/bindings/kv/example`](/docs/bindings/kv/example) |
|
|
6062
6090
|
| Group | Bindings |
|
|
6063
6091
|
| Navigation title | KV example |
|
|
6064
6092
|
| Eyebrow | Starter example |
|
|
@@ -6148,7 +6176,7 @@ test('writes and reads through the worker', async () => {
|
|
|
6148
6176
|
|
|
6149
6177
|
| Field | Value |
|
|
6150
6178
|
| --- | --- |
|
|
6151
|
-
| Route | [`/docs/d1
|
|
6179
|
+
| Route | [`/docs/bindings/d1`](/docs/bindings/d1) |
|
|
6152
6180
|
| Group | Bindings |
|
|
6153
6181
|
| Navigation title | D1 |
|
|
6154
6182
|
| Eyebrow | Binding reference |
|
|
@@ -6226,9 +6254,9 @@ Cloudflare D1 docs is the platform reference. This page is the Devflare translat
|
|
|
6226
6254
|
|
|
6227
6255
|
##### Highlights
|
|
6228
6256
|
|
|
6229
|
-
- **D1 internals** — See normalization, Wrangler `d1_databases`, and the preview or runtime details behind the authored shape. ([link](/docs/d1
|
|
6230
|
-
- **Testing D1** — Start from `createTestContext()` with `env.DB` or `cf.worker.fetch()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/d1
|
|
6231
|
-
- **D1 example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/d1
|
|
6257
|
+
- **D1 internals** — See normalization, Wrangler `d1_databases`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/d1/internals))
|
|
6258
|
+
- **Testing D1** — Start from `createTestContext()` with `env.DB` or `cf.worker.fetch()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/d1/testing))
|
|
6259
|
+
- **D1 example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/d1/example))
|
|
6232
6260
|
|
|
6233
6261
|
---
|
|
6234
6262
|
|
|
@@ -6238,7 +6266,7 @@ Cloudflare D1 docs is the platform reference. This page is the Devflare translat
|
|
|
6238
6266
|
|
|
6239
6267
|
| Field | Value |
|
|
6240
6268
|
| --- | --- |
|
|
6241
|
-
| Route | [`/docs/d1
|
|
6269
|
+
| Route | [`/docs/bindings/d1/internals`](/docs/bindings/d1/internals) |
|
|
6242
6270
|
| Group | Bindings |
|
|
6243
6271
|
| Navigation title | D1 internals |
|
|
6244
6272
|
| Eyebrow | Under the hood |
|
|
@@ -6318,7 +6346,7 @@ export default defineConfig({
|
|
|
6318
6346
|
|
|
6319
6347
|
| Field | Value |
|
|
6320
6348
|
| --- | --- |
|
|
6321
|
-
| Route | [`/docs/d1
|
|
6349
|
+
| Route | [`/docs/bindings/d1/testing`](/docs/bindings/d1/testing) |
|
|
6322
6350
|
| Group | Bindings |
|
|
6323
6351
|
| Navigation title | Testing D1 |
|
|
6324
6352
|
| Eyebrow | Testing |
|
|
@@ -6383,7 +6411,7 @@ test('D1 answers a simple health query', async () => {
|
|
|
6383
6411
|
|
|
6384
6412
|
| Field | Value |
|
|
6385
6413
|
| --- | --- |
|
|
6386
|
-
| Route | [`/docs/d1
|
|
6414
|
+
| Route | [`/docs/bindings/d1/example`](/docs/bindings/d1/example) |
|
|
6387
6415
|
| Group | Bindings |
|
|
6388
6416
|
| Navigation title | D1 example |
|
|
6389
6417
|
| Eyebrow | Starter example |
|
|
@@ -6466,7 +6494,7 @@ test('GET / returns a D1-backed health response', async () => {
|
|
|
6466
6494
|
|
|
6467
6495
|
| Field | Value |
|
|
6468
6496
|
| --- | --- |
|
|
6469
|
-
| Route | [`/docs/r2
|
|
6497
|
+
| Route | [`/docs/bindings/r2`](/docs/bindings/r2) |
|
|
6470
6498
|
| Group | Bindings |
|
|
6471
6499
|
| Navigation title | R2 |
|
|
6472
6500
|
| Eyebrow | Binding reference |
|
|
@@ -6543,9 +6571,9 @@ Cloudflare R2 docs is the platform reference. This page is the Devflare translat
|
|
|
6543
6571
|
|
|
6544
6572
|
##### Highlights
|
|
6545
6573
|
|
|
6546
|
-
- **R2 internals** — See normalization, Wrangler `r2_buckets`, and the preview or runtime details behind the authored shape. ([link](/docs/r2
|
|
6547
|
-
- **Testing R2** — Start from `createTestContext()` with `env.ASSETS` or `cf.worker.fetch()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/r2
|
|
6548
|
-
- **R2 example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/r2
|
|
6574
|
+
- **R2 internals** — See normalization, Wrangler `r2_buckets`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/r2/internals))
|
|
6575
|
+
- **Testing R2** — Start from `createTestContext()` with `env.ASSETS` or `cf.worker.fetch()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/r2/testing))
|
|
6576
|
+
- **R2 example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/r2/example))
|
|
6549
6577
|
|
|
6550
6578
|
---
|
|
6551
6579
|
|
|
@@ -6555,7 +6583,7 @@ Cloudflare R2 docs is the platform reference. This page is the Devflare translat
|
|
|
6555
6583
|
|
|
6556
6584
|
| Field | Value |
|
|
6557
6585
|
| --- | --- |
|
|
6558
|
-
| Route | [`/docs/r2
|
|
6586
|
+
| Route | [`/docs/bindings/r2/internals`](/docs/bindings/r2/internals) |
|
|
6559
6587
|
| Group | Bindings |
|
|
6560
6588
|
| Navigation title | R2 internals |
|
|
6561
6589
|
| Eyebrow | Under the hood |
|
|
@@ -6634,7 +6662,7 @@ export default defineConfig({
|
|
|
6634
6662
|
|
|
6635
6663
|
| Field | Value |
|
|
6636
6664
|
| --- | --- |
|
|
6637
|
-
| Route | [`/docs/r2
|
|
6665
|
+
| Route | [`/docs/bindings/r2/testing`](/docs/bindings/r2/testing) |
|
|
6638
6666
|
| Group | Bindings |
|
|
6639
6667
|
| Navigation title | Testing R2 |
|
|
6640
6668
|
| Eyebrow | Testing |
|
|
@@ -6700,7 +6728,7 @@ test('stores and reads an object', async () => {
|
|
|
6700
6728
|
|
|
6701
6729
|
| Field | Value |
|
|
6702
6730
|
| --- | --- |
|
|
6703
|
-
| Route | [`/docs/r2
|
|
6731
|
+
| Route | [`/docs/bindings/r2/example`](/docs/bindings/r2/example) |
|
|
6704
6732
|
| Group | Bindings |
|
|
6705
6733
|
| Navigation title | R2 example |
|
|
6706
6734
|
| Eyebrow | Starter example |
|
|
@@ -6791,16 +6819,16 @@ test('GET /files/hello.txt serves the stored object', async () => {
|
|
|
6791
6819
|
|
|
6792
6820
|
### Use Durable Objects when coordination or state really belongs with a single object identity
|
|
6793
6821
|
|
|
6794
|
-
> Devflare
|
|
6822
|
+
> The fast Devflare payoff is simple: put one counter object in a `do.*` file, call it from the worker, and call the same object directly in tests.
|
|
6795
6823
|
|
|
6796
6824
|
| Field | Value |
|
|
6797
6825
|
| --- | --- |
|
|
6798
|
-
| Route | [`/docs/durable-
|
|
6826
|
+
| Route | [`/docs/bindings/durable-objects`](/docs/bindings/durable-objects) |
|
|
6799
6827
|
| Group | Bindings |
|
|
6800
6828
|
| Navigation title | Durable Objects |
|
|
6801
6829
|
| Eyebrow | Binding reference |
|
|
6802
6830
|
|
|
6803
|
-
|
|
6831
|
+
Devflare auto-discovers `**/do.*.{ts,js}` by default, wires the Durable Object binding into the worker env, and lets tests use the same namespace without making you invent a fake DO harness first.
|
|
6804
6832
|
|
|
6805
6833
|
#### At a glance
|
|
6806
6834
|
|
|
@@ -6812,26 +6840,31 @@ That makes DO-heavy apps easier to reason about locally, but it also means you s
|
|
|
6812
6840
|
|
|
6813
6841
|
#### Author it in the simplest shape that still says what you mean
|
|
6814
6842
|
|
|
6815
|
-
|
|
6843
|
+
The easiest honest starting point is one local Durable Object class and one binding that points at it by class name.
|
|
6816
6844
|
|
|
6817
|
-
|
|
6845
|
+
If the class lives in a `do.*` file, Devflare discovers it with the default `**/do.*.{ts,js}` pattern, so the first example does not need extra DO file config.
|
|
6818
6846
|
|
|
6819
|
-
##### Example — Durable Object
|
|
6847
|
+
##### Example — Start with one discovered Durable Object and one binding
|
|
6820
6848
|
|
|
6821
6849
|
```ts
|
|
6822
6850
|
import { defineConfig } from 'devflare/config'
|
|
6823
6851
|
|
|
6824
6852
|
export default defineConfig({
|
|
6825
|
-
name: '
|
|
6853
|
+
name: 'counter-worker',
|
|
6826
6854
|
files: {
|
|
6827
|
-
|
|
6855
|
+
fetch: 'src/fetch.ts'
|
|
6828
6856
|
},
|
|
6829
6857
|
bindings: {
|
|
6830
6858
|
durableObjects: {
|
|
6831
|
-
|
|
6832
|
-
LOCK: { className: 'WriteLock' }
|
|
6859
|
+
COUNTER: 'Counter'
|
|
6833
6860
|
}
|
|
6834
|
-
}
|
|
6861
|
+
},
|
|
6862
|
+
migrations: [
|
|
6863
|
+
{
|
|
6864
|
+
tag: 'v1',
|
|
6865
|
+
new_classes: ['Counter']
|
|
6866
|
+
}
|
|
6867
|
+
]
|
|
6835
6868
|
})
|
|
6836
6869
|
```
|
|
6837
6870
|
|
|
@@ -6840,7 +6873,7 @@ export default defineConfig({
|
|
|
6840
6873
|
##### Key points
|
|
6841
6874
|
|
|
6842
6875
|
- Use Durable Objects when state or coordination should live behind one object identity, not when you merely want a fancy singleton.
|
|
6843
|
-
- They are a good fit for
|
|
6876
|
+
- They are a good fit for counters, rooms, distributed locks, and request serialization.
|
|
6844
6877
|
- If the state is really just data you query, D1 or KV may stay simpler and easier to preview.
|
|
6845
6878
|
|
|
6846
6879
|
#### Notes worth keeping visible
|
|
@@ -6875,9 +6908,9 @@ Cloudflare Durable Objects docs is the platform reference. This page is the Devf
|
|
|
6875
6908
|
|
|
6876
6909
|
##### Highlights
|
|
6877
6910
|
|
|
6878
|
-
- **Durable Objects internals** — See normalization, Wrangler `durable_objects.bindings`, and the preview or runtime details behind the authored shape. ([link](/docs/durable-
|
|
6879
|
-
- **Testing Durable Objects** — Start from `createTestContext()` with the real DO namespace in `env` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/durable-
|
|
6880
|
-
- **Durable Objects example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/durable-
|
|
6911
|
+
- **Durable Objects internals** — See normalization, Wrangler `durable_objects.bindings`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/durable-objects/internals))
|
|
6912
|
+
- **Testing Durable Objects** — Start from `createTestContext()` with the real DO namespace in `env` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/durable-objects/testing))
|
|
6913
|
+
- **Durable Objects example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/durable-objects/example))
|
|
6881
6914
|
|
|
6882
6915
|
---
|
|
6883
6916
|
|
|
@@ -6887,7 +6920,7 @@ Cloudflare Durable Objects docs is the platform reference. This page is the Devf
|
|
|
6887
6920
|
|
|
6888
6921
|
| Field | Value |
|
|
6889
6922
|
| --- | --- |
|
|
6890
|
-
| Route | [`/docs/durable-
|
|
6923
|
+
| Route | [`/docs/bindings/durable-objects/internals`](/docs/bindings/durable-objects/internals) |
|
|
6891
6924
|
| Group | Bindings |
|
|
6892
6925
|
| Navigation title | Durable Objects internals |
|
|
6893
6926
|
| Eyebrow | Under the hood |
|
|
@@ -6918,16 +6951,21 @@ Keep the binding readable in source, then inspect only the Wrangler-facing slice
|
|
|
6918
6951
|
import { defineConfig } from 'devflare/config'
|
|
6919
6952
|
|
|
6920
6953
|
export default defineConfig({
|
|
6921
|
-
name: '
|
|
6954
|
+
name: 'counter-worker',
|
|
6922
6955
|
files: {
|
|
6923
|
-
|
|
6956
|
+
fetch: 'src/fetch.ts'
|
|
6924
6957
|
},
|
|
6925
6958
|
bindings: {
|
|
6926
6959
|
durableObjects: {
|
|
6927
|
-
|
|
6928
|
-
LOCK: { className: 'WriteLock' }
|
|
6960
|
+
COUNTER: 'Counter'
|
|
6929
6961
|
}
|
|
6930
|
-
}
|
|
6962
|
+
},
|
|
6963
|
+
migrations: [
|
|
6964
|
+
{
|
|
6965
|
+
tag: 'v1',
|
|
6966
|
+
new_classes: ['Counter']
|
|
6967
|
+
}
|
|
6968
|
+
]
|
|
6931
6969
|
})
|
|
6932
6970
|
```
|
|
6933
6971
|
|
|
@@ -6971,7 +7009,7 @@ export default defineConfig({
|
|
|
6971
7009
|
|
|
6972
7010
|
| Field | Value |
|
|
6973
7011
|
| --- | --- |
|
|
6974
|
-
| Route | [`/docs/durable-
|
|
7012
|
+
| Route | [`/docs/bindings/durable-objects/testing`](/docs/bindings/durable-objects/testing) |
|
|
6975
7013
|
| Group | Bindings |
|
|
6976
7014
|
| Navigation title | Testing Durable Objects |
|
|
6977
7015
|
| Eyebrow | Testing |
|
|
@@ -7003,10 +7041,10 @@ beforeAll(() => createTestContext())
|
|
|
7003
7041
|
afterAll(() => env.dispose())
|
|
7004
7042
|
|
|
7005
7043
|
test('the counter object increments', async () => {
|
|
7006
|
-
const
|
|
7007
|
-
|
|
7008
|
-
|
|
7009
|
-
expect(await
|
|
7044
|
+
const counter = env.COUNTER.getByName('main')
|
|
7045
|
+
expect(await counter.increment()).toBe(1)
|
|
7046
|
+
expect(await counter.increment()).toBe(2)
|
|
7047
|
+
expect(await counter.getValue()).toBe(2)
|
|
7010
7048
|
})
|
|
7011
7049
|
```
|
|
7012
7050
|
|
|
@@ -7034,28 +7072,28 @@ test('the counter object increments', async () => {
|
|
|
7034
7072
|
|
|
7035
7073
|
### A small Durable Objects example you can adapt quickly
|
|
7036
7074
|
|
|
7037
|
-
> This example
|
|
7075
|
+
> This example shows the whole Durable Object story in the smallest useful shape: one auto-discovered object, one worker route, and one direct test.
|
|
7038
7076
|
|
|
7039
7077
|
| Field | Value |
|
|
7040
7078
|
| --- | --- |
|
|
7041
|
-
| Route | [`/docs/durable-
|
|
7079
|
+
| Route | [`/docs/bindings/durable-objects/example`](/docs/bindings/durable-objects/example) |
|
|
7042
7080
|
| Group | Bindings |
|
|
7043
7081
|
| Navigation title | Durable Objects example |
|
|
7044
7082
|
| Eyebrow | Starter example |
|
|
7045
7083
|
|
|
7046
|
-
A counter is
|
|
7084
|
+
A counter is enough to show why Devflare is valuable here: you do not need custom DO glue just to get a real local loop. The same `env.COUNTER` namespace works in the worker and in tests.
|
|
7047
7085
|
|
|
7048
7086
|
#### At a glance
|
|
7049
7087
|
|
|
7050
7088
|
| Fact | Value |
|
|
7051
7089
|
| --- | --- |
|
|
7052
|
-
| Config focus |
|
|
7053
|
-
| Runtime shape |
|
|
7090
|
+
| Config focus | Auto-discovered `do.*` file plus one DO binding |
|
|
7091
|
+
| Runtime shape | Direct namespace method calls from the worker and the test harness |
|
|
7054
7092
|
| Best use | Counters, room state, and small single-identity coordination examples |
|
|
7055
7093
|
|
|
7056
7094
|
#### Start by wiring the binding clearly in config
|
|
7057
7095
|
|
|
7058
|
-
##### Example — Minimal Durable Object config
|
|
7096
|
+
##### Example — Minimal Durable Object config using the default discovery pattern
|
|
7059
7097
|
|
|
7060
7098
|
```ts
|
|
7061
7099
|
import { defineConfig } from 'devflare/config'
|
|
@@ -7063,8 +7101,7 @@ import { defineConfig } from 'devflare/config'
|
|
|
7063
7101
|
export default defineConfig({
|
|
7064
7102
|
name: 'do-example',
|
|
7065
7103
|
files: {
|
|
7066
|
-
fetch: 'src/fetch.ts'
|
|
7067
|
-
durableObjects: 'src/do/**/*.ts'
|
|
7104
|
+
fetch: 'src/fetch.ts'
|
|
7068
7105
|
},
|
|
7069
7106
|
bindings: {
|
|
7070
7107
|
durableObjects: {
|
|
@@ -7078,36 +7115,63 @@ export default defineConfig({
|
|
|
7078
7115
|
}
|
|
7079
7116
|
]
|
|
7080
7117
|
})
|
|
7118
|
+
|
|
7119
|
+
// Devflare auto-discovers src/do.counter.ts via the default:
|
|
7120
|
+
// durableObjects: '**/do.*.{ts,js}'
|
|
7081
7121
|
```
|
|
7082
7122
|
|
|
7083
7123
|
#### Then use it in one honest runtime path
|
|
7084
7124
|
|
|
7085
7125
|
##### Key points
|
|
7086
7126
|
|
|
7087
|
-
- This tiny shape already proves that the object class, namespace, and
|
|
7088
|
-
- Once this works, richer room or lock logic becomes a normal extension instead of a blind leap.
|
|
7127
|
+
- This tiny shape already proves that the object class, namespace, storage, and worker path are wired correctly.
|
|
7128
|
+
- Once this works, richer room, session, or lock logic becomes a normal extension instead of a blind leap.
|
|
7089
7129
|
|
|
7090
|
-
##### Example — A tiny object and
|
|
7130
|
+
##### Example — A tiny object and one worker path
|
|
7131
|
+
|
|
7132
|
+
###### File — src/do.counter.ts
|
|
7133
|
+
|
|
7134
|
+
```ts
|
|
7135
|
+
import { DurableObject } from 'cloudflare:workers'
|
|
7136
|
+
|
|
7137
|
+
export class Counter extends DurableObject<DevflareEnv> {
|
|
7138
|
+
async increment(amount = 1): Promise<number> {
|
|
7139
|
+
const current = (await this.ctx.storage.get<number>('value')) ?? 0
|
|
7140
|
+
const next = current + amount
|
|
7141
|
+
await this.ctx.storage.put('value', next)
|
|
7142
|
+
return next
|
|
7143
|
+
}
|
|
7144
|
+
|
|
7145
|
+
async getValue(): Promise<number> {
|
|
7146
|
+
return (await this.ctx.storage.get<number>('value')) ?? 0
|
|
7147
|
+
}
|
|
7148
|
+
}
|
|
7149
|
+
```
|
|
7150
|
+
|
|
7151
|
+
###### File — src/fetch.ts
|
|
7091
7152
|
|
|
7092
7153
|
```ts
|
|
7093
7154
|
import { env } from 'devflare'
|
|
7094
7155
|
|
|
7095
|
-
|
|
7156
|
+
export async function fetch(request: Request): Promise<Response> {
|
|
7157
|
+
const url = new URL(request.url)
|
|
7158
|
+
const counter = env.COUNTER.getByName('main')
|
|
7096
7159
|
|
|
7097
|
-
|
|
7098
|
-
|
|
7099
|
-
|
|
7100
|
-
|
|
7160
|
+
if (url.pathname === '/value') {
|
|
7161
|
+
return Response.json({ value: await counter.getValue() })
|
|
7162
|
+
}
|
|
7163
|
+
|
|
7164
|
+
return Response.json({ value: await counter.increment() })
|
|
7101
7165
|
}
|
|
7102
7166
|
```
|
|
7103
7167
|
|
|
7104
7168
|
#### Lock in the behavior with one small test or smoke path
|
|
7105
7169
|
|
|
7106
|
-
> **Note —
|
|
7170
|
+
> **Note — This is the valuable bit**
|
|
7107
7171
|
>
|
|
7108
|
-
> You do not need a chat app to
|
|
7172
|
+
> You do not need a chat app to feel the Devflare advantage. One counter already proves that DO files, env bindings, and tests stay part of one simple loop.
|
|
7109
7173
|
|
|
7110
|
-
##### Example — A
|
|
7174
|
+
##### Example — A direct test that shows the Devflare payoff immediately
|
|
7111
7175
|
|
|
7112
7176
|
```ts
|
|
7113
7177
|
import { afterAll, beforeAll, expect, test } from 'bun:test'
|
|
@@ -7117,11 +7181,13 @@ import { env } from 'devflare'
|
|
|
7117
7181
|
beforeAll(() => createTestContext())
|
|
7118
7182
|
afterAll(() => env.dispose())
|
|
7119
7183
|
|
|
7120
|
-
test('
|
|
7121
|
-
const
|
|
7122
|
-
|
|
7123
|
-
expect(await
|
|
7124
|
-
|
|
7184
|
+
test('the same counter works directly in tests and through the worker', async () => {
|
|
7185
|
+
const counter = env.COUNTER.getByName('main')
|
|
7186
|
+
expect(await counter.increment()).toBe(1)
|
|
7187
|
+
expect(await counter.increment()).toBe(2)
|
|
7188
|
+
|
|
7189
|
+
const response = await cf.worker.get('/value')
|
|
7190
|
+
expect(await response.json()).toEqual({ value: 2 })
|
|
7125
7191
|
})
|
|
7126
7192
|
```
|
|
7127
7193
|
|
|
@@ -7133,7 +7199,7 @@ test('GET / increments the counter object', async () => {
|
|
|
7133
7199
|
|
|
7134
7200
|
| Field | Value |
|
|
7135
7201
|
| --- | --- |
|
|
7136
|
-
| Route | [`/docs/
|
|
7202
|
+
| Route | [`/docs/bindings/queues`](/docs/bindings/queues) |
|
|
7137
7203
|
| Group | Bindings |
|
|
7138
7204
|
| Navigation title | Queues |
|
|
7139
7205
|
| Eyebrow | Binding reference |
|
|
@@ -7218,9 +7284,9 @@ Cloudflare Queues docs is the platform reference. This page is the Devflare tran
|
|
|
7218
7284
|
|
|
7219
7285
|
##### Highlights
|
|
7220
7286
|
|
|
7221
|
-
- **Queues internals** — See normalization, Wrangler `queues.producers` and `queues.consumers`, and the preview or runtime details behind the authored shape. ([link](/docs/
|
|
7222
|
-
- **Testing Queues** — Start from `createTestContext()` plus `cf.queue.trigger()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/
|
|
7223
|
-
- **Queues example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/
|
|
7287
|
+
- **Queues internals** — See normalization, Wrangler `queues.producers` and `queues.consumers`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/queues/internals))
|
|
7288
|
+
- **Testing Queues** — Start from `createTestContext()` plus `cf.queue.trigger()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/queues/testing))
|
|
7289
|
+
- **Queues example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/queues/example))
|
|
7224
7290
|
|
|
7225
7291
|
---
|
|
7226
7292
|
|
|
@@ -7230,7 +7296,7 @@ Cloudflare Queues docs is the platform reference. This page is the Devflare tran
|
|
|
7230
7296
|
|
|
7231
7297
|
| Field | Value |
|
|
7232
7298
|
| --- | --- |
|
|
7233
|
-
| Route | [`/docs/
|
|
7299
|
+
| Route | [`/docs/bindings/queues/internals`](/docs/bindings/queues/internals) |
|
|
7234
7300
|
| Group | Bindings |
|
|
7235
7301
|
| Navigation title | Queues internals |
|
|
7236
7302
|
| Eyebrow | Under the hood |
|
|
@@ -7322,7 +7388,7 @@ export default defineConfig({
|
|
|
7322
7388
|
|
|
7323
7389
|
| Field | Value |
|
|
7324
7390
|
| --- | --- |
|
|
7325
|
-
| Route | [`/docs/
|
|
7391
|
+
| Route | [`/docs/bindings/queues/testing`](/docs/bindings/queues/testing) |
|
|
7326
7392
|
| Group | Bindings |
|
|
7327
7393
|
| Navigation title | Testing Queues |
|
|
7328
7394
|
| Eyebrow | Testing |
|
|
@@ -7393,7 +7459,7 @@ test('queue consumer stores a processed result', async () => {
|
|
|
7393
7459
|
|
|
7394
7460
|
| Field | Value |
|
|
7395
7461
|
| --- | --- |
|
|
7396
|
-
| Route | [`/docs/
|
|
7462
|
+
| Route | [`/docs/bindings/queues/example`](/docs/bindings/queues/example) |
|
|
7397
7463
|
| Group | Bindings |
|
|
7398
7464
|
| Navigation title | Queues example |
|
|
7399
7465
|
| Eyebrow | Starter example |
|
|
@@ -7485,18 +7551,339 @@ test('queue work writes a result record', async () => {
|
|
|
7485
7551
|
|
|
7486
7552
|
---
|
|
7487
7553
|
|
|
7554
|
+
### Use service bindings to keep multi-worker apps explicit instead of magical
|
|
7555
|
+
|
|
7556
|
+
> The fast Devflare payoff is simple: wire one worker to another with `ref()`, call it through `env.MATH_SERVICE`, and prove the same relationship locally in one test.
|
|
7557
|
+
|
|
7558
|
+
| Field | Value |
|
|
7559
|
+
| --- | --- |
|
|
7560
|
+
| Route | [`/docs/bindings/services`](/docs/bindings/services) |
|
|
7561
|
+
| Group | Bindings |
|
|
7562
|
+
| Navigation title | Services |
|
|
7563
|
+
| Eyebrow | Binding reference |
|
|
7564
|
+
|
|
7565
|
+
This is the clean lane for apps that genuinely need more than one worker. Devflare keeps the worker family explicit in config, resolves the referenced surface, and lets local tests use the same service binding contract instead of copied worker names or hand-built internal URLs.
|
|
7566
|
+
|
|
7567
|
+
#### At a glance
|
|
7568
|
+
|
|
7569
|
+
| Fact | Value |
|
|
7570
|
+
| --- | --- |
|
|
7571
|
+
| Config key | bindings.services |
|
|
7572
|
+
| Authoring shape | Record<string, { service: string; environment?: string; entrypoint?: string }> \| ref().worker(...) |
|
|
7573
|
+
| Best for | Multi-worker systems, internal RPC boundaries, and explicit service composition |
|
|
7574
|
+
|
|
7575
|
+
#### Author it in the simplest shape that still says what you mean
|
|
7576
|
+
|
|
7577
|
+
The easiest honest starting point is one gateway worker, one referenced worker, and one service binding in config.
|
|
7578
|
+
|
|
7579
|
+
`ref()` is especially useful because it keeps the dependency explicit while still giving Devflare enough structure to resolve, type, and boot the linked worker locally later.
|
|
7580
|
+
|
|
7581
|
+
##### Example — Service binding authoring with `ref()`
|
|
7582
|
+
|
|
7583
|
+
```ts
|
|
7584
|
+
import { defineConfig, ref } from 'devflare/config'
|
|
7585
|
+
|
|
7586
|
+
const mathService = ref(() => import('../math-service/devflare.config'))
|
|
7587
|
+
|
|
7588
|
+
export default defineConfig({
|
|
7589
|
+
name: 'gateway',
|
|
7590
|
+
bindings: {
|
|
7591
|
+
services: {
|
|
7592
|
+
MATH_SERVICE: mathService.worker,
|
|
7593
|
+
ADMIN: mathService.worker('AdminEntrypoint')
|
|
7594
|
+
}
|
|
7595
|
+
}
|
|
7596
|
+
})
|
|
7597
|
+
```
|
|
7598
|
+
|
|
7599
|
+
#### When this binding fits best
|
|
7600
|
+
|
|
7601
|
+
##### Key points
|
|
7602
|
+
|
|
7603
|
+
- Use service bindings when another worker is a real dependency, not when one large worker is merely inconvenient to think about.
|
|
7604
|
+
- They are a strong fit for internal APIs, admin surfaces, search workers, and explicit worker-family boundaries.
|
|
7605
|
+
- If the dependency is actually shared data rather than another service boundary, a direct binding like D1, KV, or DO may stay simpler.
|
|
7606
|
+
|
|
7607
|
+
#### Notes worth keeping visible
|
|
7608
|
+
|
|
7609
|
+
##### Key points
|
|
7610
|
+
|
|
7611
|
+
- Preview isolation follows resolved worker names, not just whatever branch or alias string you passed to a deploy command.
|
|
7612
|
+
- Named entrypoints are modeled, but critical production wiring is still worth validating in compiled output.
|
|
7613
|
+
- Service bindings are references, not preview-managed account resources like KV, D1, or queues.
|
|
7614
|
+
|
|
7615
|
+
> **Note — A very good review question**
|
|
7616
|
+
>
|
|
7617
|
+
> Ask which worker names a preview will actually deploy before you assume the worker family is isolated.
|
|
7618
|
+
|
|
7619
|
+
#### Cloudflare docs vs the Devflare layer
|
|
7620
|
+
|
|
7621
|
+
Cloudflare Service bindings docs is the platform reference. This page is the Devflare translation layer: keep `bindings.services` readable in source, understand the typed env surface, and know which local, preview, or remote lane actually matches the binding.
|
|
7622
|
+
|
|
7623
|
+
##### Highlights
|
|
7624
|
+
|
|
7625
|
+
- **Cloudflare Service bindings docs** — Platform reference for worker-to-worker bindings, service entrypoints, and the underlying runtime contract. ([link](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/))
|
|
7626
|
+
|
|
7627
|
+
##### Reference table
|
|
7628
|
+
|
|
7629
|
+
| Question | Cloudflare docs | This Devflare page |
|
|
7630
|
+
| --- | --- | --- |
|
|
7631
|
+
| Primary focus | Platform reference for worker-to-worker bindings, service entrypoints, and the underlying runtime contract. | How to author `bindings.services`, what the runtime surface looks like, and how Services fits a Devflare project. |
|
|
7632
|
+
| Testing and runtime lens | Cloudflare’s docs focus on the raw binding API, product semantics, and platform limits for the binding itself. | First-class local runtime and multi-worker tests. Use the Devflare guidance when you need the honest local harness or the right remote gate instead of only the product API shape. |
|
|
7633
|
+
| When to open it | When you need the platform contract, limits, APIs, or account-level product details. | When you are wiring, testing, previewing, or reviewing the binding inside a Devflare app. |
|
|
7634
|
+
|
|
7635
|
+
#### Go deeper only if this one-page guide stops being enough
|
|
7636
|
+
|
|
7637
|
+
##### Highlights
|
|
7638
|
+
|
|
7639
|
+
- **Services internals** — See normalization, Wrangler `services`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/services/internals))
|
|
7640
|
+
- **Testing Services** — Start from `createTestContext()` plus `env.MY_SERVICE` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/services/testing))
|
|
7641
|
+
- **Services example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/services/example))
|
|
7642
|
+
|
|
7643
|
+
---
|
|
7644
|
+
|
|
7645
|
+
### How Devflare wires Services from config to runtime
|
|
7646
|
+
|
|
7647
|
+
> Devflare resolves referenced worker configs, bundles the linked worker surfaces, and then exposes those services as local multi-worker bindings.
|
|
7648
|
+
|
|
7649
|
+
| Field | Value |
|
|
7650
|
+
| --- | --- |
|
|
7651
|
+
| Route | [`/docs/bindings/services/internals`](/docs/bindings/services/internals) |
|
|
7652
|
+
| Group | Bindings |
|
|
7653
|
+
| Navigation title | Services internals |
|
|
7654
|
+
| Eyebrow | Under the hood |
|
|
7655
|
+
|
|
7656
|
+
Service bindings feel more than cosmetic: the tooling follows the relationship far enough to keep local tests, type generation, and compiled output aligned.
|
|
7657
|
+
|
|
7658
|
+
#### At a glance
|
|
7659
|
+
|
|
7660
|
+
| Fact | Value |
|
|
7661
|
+
| --- | --- |
|
|
7662
|
+
| Normalization | Plain objects and `ref().worker(...)` values normalize into one service-binding model |
|
|
7663
|
+
| Compile target | Wrangler `services` |
|
|
7664
|
+
| Preview note | Preview can rewrite service names, but service bindings are not preview-managed resources like KV or D1 |
|
|
7665
|
+
|
|
7666
|
+
#### Devflare normalizes the authored shape before it does anything louder
|
|
7667
|
+
|
|
7668
|
+
Service bindings can be authored as plain binding objects or as `ref().worker(...)` results. Devflare normalizes those into one shape so compiler, type generation, and test setup can all reason about them consistently.
|
|
7669
|
+
|
|
7670
|
+
When a binding comes from `ref()`, Devflare can follow the referenced config, discover the relevant worker surface, and keep that relationship visible in local tooling.
|
|
7671
|
+
|
|
7672
|
+
##### Example — Services from authored config to generated output
|
|
7673
|
+
|
|
7674
|
+
Keep the binding readable in source, then inspect only the Wrangler-facing slice Devflare emits when the config is compiled.
|
|
7675
|
+
|
|
7676
|
+
###### File — devflare.config.ts
|
|
7677
|
+
|
|
7678
|
+
```ts
|
|
7679
|
+
import { defineConfig, ref } from 'devflare/config'
|
|
7680
|
+
|
|
7681
|
+
const mathService = ref(() => import('../math-service/devflare.config'))
|
|
7682
|
+
|
|
7683
|
+
export default defineConfig({
|
|
7684
|
+
name: 'gateway',
|
|
7685
|
+
bindings: {
|
|
7686
|
+
services: {
|
|
7687
|
+
MATH_SERVICE: mathService.worker,
|
|
7688
|
+
ADMIN: mathService.worker('AdminEntrypoint')
|
|
7689
|
+
}
|
|
7690
|
+
}
|
|
7691
|
+
})
|
|
7692
|
+
```
|
|
7693
|
+
|
|
7694
|
+
###### File — .devflare/wrangler.jsonc
|
|
7695
|
+
|
|
7696
|
+
```json
|
|
7697
|
+
{
|
|
7698
|
+
"services": [
|
|
7699
|
+
{ "binding": "MATH_SERVICE", "service": "math-service" }
|
|
7700
|
+
]
|
|
7701
|
+
}
|
|
7702
|
+
```
|
|
7703
|
+
|
|
7704
|
+
#### Local runtime support depends on what Devflare can model directly
|
|
7705
|
+
|
|
7706
|
+
##### Key points
|
|
7707
|
+
|
|
7708
|
+
- `resolveServiceBindings()` is responsible for following referenced configs and bundling the default `worker.ts` export or named entrypoints as needed.
|
|
7709
|
+
- Local multi-worker Miniflare wiring uses the resolved service metadata so a gateway worker can call another worker naturally in tests.
|
|
7710
|
+
- Type generation can emit service-specific interfaces; if that is not possible, the binding falls back to a generic `Fetcher` contract.
|
|
7711
|
+
|
|
7712
|
+
#### Compile, preview, and cleanup behavior
|
|
7713
|
+
|
|
7714
|
+
##### Key points
|
|
7715
|
+
|
|
7716
|
+
- Compile emits the standard `services` array that Wrangler expects.
|
|
7717
|
+
- Preview flows can rewrite service names when the preview naming rules say they should, but there is no separate resource-provisioning lifecycle for services themselves.
|
|
7718
|
+
- Critical production wiring is still worth checking through `config print`, `build`, or dry-run deploy output.
|
|
7719
|
+
|
|
7720
|
+
> **Tip — This is configuration as architecture, not just syntax**
|
|
7721
|
+
>
|
|
7722
|
+
> Service bindings work well in Devflare because the relationships are explicit enough for tooling to follow, type, and test.
|
|
7723
|
+
|
|
7724
|
+
---
|
|
7725
|
+
|
|
7726
|
+
### Test Services the way Devflare expects it to run
|
|
7727
|
+
|
|
7728
|
+
> Service bindings are one of the clearest Devflare wins in multi-worker apps: you can keep the real worker boundary and still prove it through the default local harness.
|
|
7729
|
+
|
|
7730
|
+
| Field | Value |
|
|
7731
|
+
| --- | --- |
|
|
7732
|
+
| Route | [`/docs/bindings/services/testing`](/docs/bindings/services/testing) |
|
|
7733
|
+
| Group | Bindings |
|
|
7734
|
+
| Navigation title | Testing Services |
|
|
7735
|
+
| Eyebrow | Testing |
|
|
7736
|
+
|
|
7737
|
+
Start with `createTestContext()`, then call the bound service through the generated env shape. That proves the config relationship, the local worker family, and the callable contract in the same language the app itself uses.
|
|
7738
|
+
|
|
7739
|
+
#### At a glance
|
|
7740
|
+
|
|
7741
|
+
| Fact | Value |
|
|
7742
|
+
| --- | --- |
|
|
7743
|
+
| Best for | Gateway-to-service calls, entrypoint wiring, and typed multi-worker behavior |
|
|
7744
|
+
| Default harness | `createTestContext()` plus `env.MY_SERVICE` |
|
|
7745
|
+
| Escalate when | The risk is worker naming drift, preview topology, or compiled output correctness |
|
|
7746
|
+
|
|
7747
|
+
#### Start with the default test loop
|
|
7748
|
+
|
|
7749
|
+
The shortest honest test is usually one real service call through the generated env binding. That already proves the config relationship and the callable surface.
|
|
7750
|
+
|
|
7751
|
+
Keep one test for the default worker entry and one for any named entrypoint that matters operationally.
|
|
7752
|
+
|
|
7753
|
+
##### Example — Testing a service binding through the env
|
|
7754
|
+
|
|
7755
|
+
```ts
|
|
7756
|
+
import { afterAll, beforeAll, expect, test } from 'bun:test'
|
|
7757
|
+
import { createTestContext } from 'devflare/test'
|
|
7758
|
+
import { env } from 'devflare'
|
|
7759
|
+
|
|
7760
|
+
beforeAll(() => createTestContext())
|
|
7761
|
+
afterAll(() => env.dispose())
|
|
7762
|
+
|
|
7763
|
+
test('service binding calls the default worker export', async () => {
|
|
7764
|
+
expect(await env.MATH_SERVICE.add(5, 3)).toBe(8)
|
|
7765
|
+
})
|
|
7766
|
+
```
|
|
7767
|
+
|
|
7768
|
+
#### The helper surface to remember
|
|
7769
|
+
|
|
7770
|
+
##### Key points
|
|
7771
|
+
|
|
7772
|
+
- Use the bound env service directly when the service relationship is the thing you want to prove.
|
|
7773
|
+
- Keep named entrypoints explicit in tests so they do not quietly drift from the config contract.
|
|
7774
|
+
- Run `devflare types` whenever service entrypoints change so env autocomplete and generated types stay in sync.
|
|
7775
|
+
|
|
7776
|
+
#### When to move beyond the default harness
|
|
7777
|
+
|
|
7778
|
+
##### Key points
|
|
7779
|
+
|
|
7780
|
+
- Local tests prove the callable relationship, not that your preview or production worker names are what you intended.
|
|
7781
|
+
- If the service graph is business-critical, validate compiled output before deploys as well.
|
|
7782
|
+
- Test naming and topology at preview or build time when those are the real failure modes.
|
|
7783
|
+
|
|
7784
|
+
> **Warning — A typed local call is not the whole deploy story**
|
|
7785
|
+
>
|
|
7786
|
+
> The local harness tells you the relationship is modeled correctly. A preview or build check tells you the resolved worker names are still the ones you expect.
|
|
7787
|
+
|
|
7788
|
+
---
|
|
7789
|
+
|
|
7790
|
+
### A small Services example you can adapt quickly
|
|
7791
|
+
|
|
7792
|
+
> This example shows the smallest useful service-binding loop: one `ref()`, one gateway route, and one local multi-worker test.
|
|
7793
|
+
|
|
7794
|
+
| Field | Value |
|
|
7795
|
+
| --- | --- |
|
|
7796
|
+
| Route | [`/docs/bindings/services/example`](/docs/bindings/services/example) |
|
|
7797
|
+
| Group | Bindings |
|
|
7798
|
+
| Navigation title | Services example |
|
|
7799
|
+
| Eyebrow | Starter example |
|
|
7800
|
+
|
|
7801
|
+
That is enough to show why Devflare helps here: the relationship stays explicit in config, typed in env, and testable without hand-assembling your own mini service mesh in the test file.
|
|
7802
|
+
|
|
7803
|
+
#### At a glance
|
|
7804
|
+
|
|
7805
|
+
| Fact | Value |
|
|
7806
|
+
| --- | --- |
|
|
7807
|
+
| Config focus | Explicit `ref()` wiring |
|
|
7808
|
+
| Runtime shape | One env service call from the gateway worker |
|
|
7809
|
+
| Best use | Internal APIs and worker-family boundaries |
|
|
7810
|
+
|
|
7811
|
+
#### Start by wiring the binding clearly in config
|
|
7812
|
+
|
|
7813
|
+
##### Example — Gateway config with a service ref
|
|
7814
|
+
|
|
7815
|
+
```ts
|
|
7816
|
+
import { defineConfig, ref } from 'devflare/config'
|
|
7817
|
+
|
|
7818
|
+
const mathService = ref(() => import('../math-service/devflare.config'))
|
|
7819
|
+
|
|
7820
|
+
export default defineConfig({
|
|
7821
|
+
name: 'gateway',
|
|
7822
|
+
files: {
|
|
7823
|
+
fetch: 'src/fetch.ts'
|
|
7824
|
+
},
|
|
7825
|
+
bindings: {
|
|
7826
|
+
services: {
|
|
7827
|
+
MATH_SERVICE: mathService.worker
|
|
7828
|
+
}
|
|
7829
|
+
}
|
|
7830
|
+
})
|
|
7831
|
+
```
|
|
7832
|
+
|
|
7833
|
+
#### Then use it in one honest runtime path
|
|
7834
|
+
|
|
7835
|
+
##### Key points
|
|
7836
|
+
|
|
7837
|
+
- Once this tiny path works, adding named entrypoints becomes an incremental extension, not a different architecture.
|
|
7838
|
+
- Keep one simple service example like this around if you want a smoke check for multi-worker wiring.
|
|
7839
|
+
|
|
7840
|
+
##### Example — Use the service in the gateway worker
|
|
7841
|
+
|
|
7842
|
+
```ts
|
|
7843
|
+
import { env } from 'devflare'
|
|
7844
|
+
|
|
7845
|
+
export async function fetch(): Promise<Response> {
|
|
7846
|
+
const result = await env.MATH_SERVICE.add(4, 5)
|
|
7847
|
+
return Response.json({ result })
|
|
7848
|
+
}
|
|
7849
|
+
```
|
|
7850
|
+
|
|
7851
|
+
#### Lock in the behavior with one small test or smoke path
|
|
7852
|
+
|
|
7853
|
+
> **Important — This is the valuable bit**
|
|
7854
|
+
>
|
|
7855
|
+
> You do not need a whole microservice fleet to feel the Devflare value. One gateway call already proves that config refs, env bindings, and local multi-worker tests stay part of one coherent loop.
|
|
7856
|
+
|
|
7857
|
+
##### Example — A single multi-worker test
|
|
7858
|
+
|
|
7859
|
+
```ts
|
|
7860
|
+
import { afterAll, beforeAll, expect, test } from 'bun:test'
|
|
7861
|
+
import { createTestContext, cf } from 'devflare/test'
|
|
7862
|
+
import { env } from 'devflare'
|
|
7863
|
+
|
|
7864
|
+
beforeAll(() => createTestContext())
|
|
7865
|
+
afterAll(() => env.dispose())
|
|
7866
|
+
|
|
7867
|
+
test('GET / calls the math service', async () => {
|
|
7868
|
+
const response = await cf.worker.get('/')
|
|
7869
|
+
expect(await response.json()).toEqual({ result: 9 })
|
|
7870
|
+
})
|
|
7871
|
+
```
|
|
7872
|
+
|
|
7873
|
+
---
|
|
7874
|
+
|
|
7488
7875
|
### Use the AI binding when the worker needs real Workers AI inference, not just a local mock
|
|
7489
7876
|
|
|
7490
|
-
> AI
|
|
7877
|
+
> Devflare makes Workers AI usable by keeping the binding tiny in config, the worker call obvious, and the remote smoke test explicit instead of fake.
|
|
7491
7878
|
|
|
7492
7879
|
| Field | Value |
|
|
7493
7880
|
| --- | --- |
|
|
7494
|
-
| Route | [`/docs/ai
|
|
7881
|
+
| Route | [`/docs/bindings/ai`](/docs/bindings/ai) |
|
|
7495
7882
|
| Group | Bindings |
|
|
7496
7883
|
| Navigation title | AI |
|
|
7497
7884
|
| Eyebrow | Binding reference |
|
|
7498
7885
|
|
|
7499
|
-
|
|
7886
|
+
AI is still remote-oriented, but the first useful path is simple: one worker route, one `env.AI.run(...)` call, and one skip-aware remote test that says clearly when the real platform was involved.
|
|
7500
7887
|
|
|
7501
7888
|
#### At a glance
|
|
7502
7889
|
|
|
@@ -7508,9 +7895,9 @@ That means the docs should be honest: Devflare can compile and type the binding
|
|
|
7508
7895
|
|
|
7509
7896
|
#### Author it in the simplest shape that still says what you mean
|
|
7510
7897
|
|
|
7511
|
-
AI is a remote-oriented binding
|
|
7898
|
+
AI is a remote-oriented binding, but the first worker path should still be tiny and concrete: receive one request, call one model, return one JSON response.
|
|
7512
7899
|
|
|
7513
|
-
The
|
|
7900
|
+
The Devflare-specific win is not fake local inference. It is that config, worker code, and remote test gating stay explicit enough that you know when the real platform was actually exercised.
|
|
7514
7901
|
|
|
7515
7902
|
##### Example — Workers AI binding authoring
|
|
7516
7903
|
|
|
@@ -7567,9 +7954,9 @@ Cloudflare Workers AI docs is the platform reference. This page is the Devflare
|
|
|
7567
7954
|
|
|
7568
7955
|
##### Highlights
|
|
7569
7956
|
|
|
7570
|
-
- **AI internals** — See normalization, Wrangler `ai` binding, and the preview or runtime details behind the authored shape. ([link](/docs/ai
|
|
7571
|
-
- **Testing AI** — Start from `createTestContext()` after remote mode is enabled, plus `shouldSkip.ai` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/ai
|
|
7572
|
-
- **AI example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/ai
|
|
7957
|
+
- **AI internals** — See normalization, Wrangler `ai` binding, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/ai/internals))
|
|
7958
|
+
- **Testing AI** — Start from `createTestContext()` after remote mode is enabled, plus `shouldSkip.ai` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/ai/testing))
|
|
7959
|
+
- **AI example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/ai/example))
|
|
7573
7960
|
|
|
7574
7961
|
---
|
|
7575
7962
|
|
|
@@ -7579,7 +7966,7 @@ Cloudflare Workers AI docs is the platform reference. This page is the Devflare
|
|
|
7579
7966
|
|
|
7580
7967
|
| Field | Value |
|
|
7581
7968
|
| --- | --- |
|
|
7582
|
-
| Route | [`/docs/ai
|
|
7969
|
+
| Route | [`/docs/bindings/ai/internals`](/docs/bindings/ai/internals) |
|
|
7583
7970
|
| Group | Bindings |
|
|
7584
7971
|
| Navigation title | AI internals |
|
|
7585
7972
|
| Eyebrow | Under the hood |
|
|
@@ -7658,7 +8045,7 @@ export default defineConfig({
|
|
|
7658
8045
|
|
|
7659
8046
|
| Field | Value |
|
|
7660
8047
|
| --- | --- |
|
|
7661
|
-
| Route | [`/docs/ai
|
|
8048
|
+
| Route | [`/docs/bindings/ai/testing`](/docs/bindings/ai/testing) |
|
|
7662
8049
|
| Group | Bindings |
|
|
7663
8050
|
| Navigation title | Testing AI |
|
|
7664
8051
|
| Eyebrow | Testing |
|
|
@@ -7728,16 +8115,16 @@ describe.skipIf(skipAI)('AI binding', () => {
|
|
|
7728
8115
|
|
|
7729
8116
|
### A small AI example you can adapt quickly
|
|
7730
8117
|
|
|
7731
|
-
> This example keeps the AI
|
|
8118
|
+
> This example keeps the AI story honest and useful: one binding, one tiny inference route, and one skip-aware remote smoke test.
|
|
7732
8119
|
|
|
7733
8120
|
| Field | Value |
|
|
7734
8121
|
| --- | --- |
|
|
7735
|
-
| Route | [`/docs/ai
|
|
8122
|
+
| Route | [`/docs/bindings/ai/example`](/docs/bindings/ai/example) |
|
|
7736
8123
|
| Group | Bindings |
|
|
7737
8124
|
| Navigation title | AI example |
|
|
7738
8125
|
| Eyebrow | Starter example |
|
|
7739
8126
|
|
|
7740
|
-
That is enough to
|
|
8127
|
+
That is enough to show the Devflare value: config stays tiny, the worker code stays normal, and the test tells you clearly when remote AI was really available.
|
|
7741
8128
|
|
|
7742
8129
|
#### At a glance
|
|
7743
8130
|
|
|
@@ -7789,26 +8176,48 @@ export async function fetch(): Promise<Response> {
|
|
|
7789
8176
|
}
|
|
7790
8177
|
```
|
|
7791
8178
|
|
|
7792
|
-
####
|
|
8179
|
+
#### Lock in the behavior with one small test or smoke path
|
|
7793
8180
|
|
|
7794
|
-
> **
|
|
8181
|
+
> **Important — The Devflare win is the explicit remote gate**
|
|
7795
8182
|
>
|
|
7796
|
-
>
|
|
8183
|
+
> A clear skip condition is more trustworthy than a fake local AI emulator that never touched the real platform. That honesty is part of what makes the Devflare AI story usable.
|
|
8184
|
+
|
|
8185
|
+
##### Example — A skip-aware remote smoke test
|
|
8186
|
+
|
|
8187
|
+
```ts
|
|
8188
|
+
import { afterAll, beforeAll, describe, expect, test } from 'bun:test'
|
|
8189
|
+
import { createTestContext, cf, env, shouldSkip } from 'devflare/test'
|
|
8190
|
+
|
|
8191
|
+
beforeAll(() => createTestContext())
|
|
8192
|
+
afterAll(() => env.dispose())
|
|
8193
|
+
|
|
8194
|
+
const skipAI = await shouldSkip.ai
|
|
8195
|
+
|
|
8196
|
+
describe.skipIf(skipAI)('AI route', () => {
|
|
8197
|
+
test('calls Workers AI through the worker boundary', async () => {
|
|
8198
|
+
const response = await cf.worker.get('/')
|
|
8199
|
+
expect(response.ok).toBe(true)
|
|
8200
|
+
|
|
8201
|
+
const body = await response.json()
|
|
8202
|
+
expect(body.result).toBeDefined()
|
|
8203
|
+
})
|
|
8204
|
+
})
|
|
8205
|
+
```
|
|
7797
8206
|
|
|
7798
8207
|
---
|
|
7799
8208
|
|
|
7800
8209
|
### Use Vectorize when the worker really owns similarity search, not just string matching
|
|
7801
8210
|
|
|
7802
|
-
> Vectorize
|
|
8211
|
+
> Devflare makes Vectorize usable by keeping the index name explicit in config, preview naming honest, and the real smoke test explicit instead of buried under mocks.
|
|
7803
8212
|
|
|
7804
8213
|
| Field | Value |
|
|
7805
8214
|
| --- | --- |
|
|
7806
|
-
| Route | [`/docs/vectorize
|
|
8215
|
+
| Route | [`/docs/bindings/vectorize`](/docs/bindings/vectorize) |
|
|
7807
8216
|
| Group | Bindings |
|
|
7808
8217
|
| Navigation title | Vectorize |
|
|
7809
8218
|
| Eyebrow | Binding reference |
|
|
7810
8219
|
|
|
7811
|
-
|
|
8220
|
+
The right first path is small: one binding, one tiny upsert-and-query route, and one skip-aware remote smoke test that tells the truth about whether the real index was involved.
|
|
7812
8221
|
|
|
7813
8222
|
#### At a glance
|
|
7814
8223
|
|
|
@@ -7881,9 +8290,9 @@ Cloudflare Vectorize docs is the platform reference. This page is the Devflare t
|
|
|
7881
8290
|
|
|
7882
8291
|
##### Highlights
|
|
7883
8292
|
|
|
7884
|
-
- **Vectorize internals** — See normalization, Wrangler `vectorize`, and the preview or runtime details behind the authored shape. ([link](/docs/vectorize
|
|
7885
|
-
- **Testing Vectorize** — Start from `createTestContext()` in remote mode plus `shouldSkip.vectorize` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/vectorize
|
|
7886
|
-
- **Vectorize example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/vectorize
|
|
8293
|
+
- **Vectorize internals** — See normalization, Wrangler `vectorize`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/vectorize/internals))
|
|
8294
|
+
- **Testing Vectorize** — Start from `createTestContext()` in remote mode plus `shouldSkip.vectorize` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/vectorize/testing))
|
|
8295
|
+
- **Vectorize example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/vectorize/example))
|
|
7887
8296
|
|
|
7888
8297
|
---
|
|
7889
8298
|
|
|
@@ -7893,7 +8302,7 @@ Cloudflare Vectorize docs is the platform reference. This page is the Devflare t
|
|
|
7893
8302
|
|
|
7894
8303
|
| Field | Value |
|
|
7895
8304
|
| --- | --- |
|
|
7896
|
-
| Route | [`/docs/vectorize
|
|
8305
|
+
| Route | [`/docs/bindings/vectorize/internals`](/docs/bindings/vectorize/internals) |
|
|
7897
8306
|
| Group | Bindings |
|
|
7898
8307
|
| Navigation title | Vectorize internals |
|
|
7899
8308
|
| Eyebrow | Under the hood |
|
|
@@ -7973,7 +8382,7 @@ export default defineConfig({
|
|
|
7973
8382
|
|
|
7974
8383
|
| Field | Value |
|
|
7975
8384
|
| --- | --- |
|
|
7976
|
-
| Route | [`/docs/vectorize
|
|
8385
|
+
| Route | [`/docs/bindings/vectorize/testing`](/docs/bindings/vectorize/testing) |
|
|
7977
8386
|
| Group | Bindings |
|
|
7978
8387
|
| Navigation title | Testing Vectorize |
|
|
7979
8388
|
| Eyebrow | Testing |
|
|
@@ -8042,16 +8451,16 @@ describe.skipIf(skipVectorize)('Vectorize binding', () => {
|
|
|
8042
8451
|
|
|
8043
8452
|
### A small Vectorize example you can adapt quickly
|
|
8044
8453
|
|
|
8045
|
-
> This example keeps Vectorize honest: one index binding, one upsert, and one
|
|
8454
|
+
> This example keeps Vectorize honest and usable: one index binding, one upsert-and-query route, and one skip-aware remote smoke test.
|
|
8046
8455
|
|
|
8047
8456
|
| Field | Value |
|
|
8048
8457
|
| --- | --- |
|
|
8049
|
-
| Route | [`/docs/vectorize
|
|
8458
|
+
| Route | [`/docs/bindings/vectorize/example`](/docs/bindings/vectorize/example) |
|
|
8050
8459
|
| Group | Bindings |
|
|
8051
8460
|
| Navigation title | Vectorize example |
|
|
8052
8461
|
| Eyebrow | Starter example |
|
|
8053
8462
|
|
|
8054
|
-
That is enough to show the binding shape without
|
|
8463
|
+
That is enough to show the binding shape, the worker contract, and the Devflare remote gate without dragging in a whole retrieval stack on page one.
|
|
8055
8464
|
|
|
8056
8465
|
#### At a glance
|
|
8057
8466
|
|
|
@@ -8111,11 +8520,33 @@ export async function fetch(): Promise<Response> {
|
|
|
8111
8520
|
}
|
|
8112
8521
|
```
|
|
8113
8522
|
|
|
8114
|
-
####
|
|
8523
|
+
#### Lock in the behavior with one small test or smoke path
|
|
8115
8524
|
|
|
8116
|
-
> **
|
|
8525
|
+
> **Important — The Devflare win is honest lifecycle plus honest gating**
|
|
8117
8526
|
>
|
|
8118
|
-
>
|
|
8527
|
+
> The named index still has to exist, but Devflare keeps that reality visible in config, preview naming, and skip-aware tests instead of hiding it behind fake local success.
|
|
8528
|
+
|
|
8529
|
+
##### Example — A skip-aware remote Vectorize smoke test
|
|
8530
|
+
|
|
8531
|
+
```ts
|
|
8532
|
+
import { afterAll, beforeAll, describe, expect, test } from 'bun:test'
|
|
8533
|
+
import { createTestContext, cf, env, shouldSkip } from 'devflare/test'
|
|
8534
|
+
|
|
8535
|
+
beforeAll(() => createTestContext())
|
|
8536
|
+
afterAll(() => env.dispose())
|
|
8537
|
+
|
|
8538
|
+
const skipVectorize = await shouldSkip.vectorize
|
|
8539
|
+
|
|
8540
|
+
describe.skipIf(skipVectorize)('Vectorize route', () => {
|
|
8541
|
+
test('hits the configured index through the worker boundary', async () => {
|
|
8542
|
+
const response = await cf.worker.get('/')
|
|
8543
|
+
expect(response.ok).toBe(true)
|
|
8544
|
+
|
|
8545
|
+
const body = await response.json()
|
|
8546
|
+
expect(body.result).toBeDefined()
|
|
8547
|
+
})
|
|
8548
|
+
})
|
|
8549
|
+
```
|
|
8119
8550
|
|
|
8120
8551
|
---
|
|
8121
8552
|
|
|
@@ -8125,7 +8556,7 @@ export async function fetch(): Promise<Response> {
|
|
|
8125
8556
|
|
|
8126
8557
|
| Field | Value |
|
|
8127
8558
|
| --- | --- |
|
|
8128
|
-
| Route | [`/docs/hyperdrive
|
|
8559
|
+
| Route | [`/docs/bindings/hyperdrive`](/docs/bindings/hyperdrive) |
|
|
8129
8560
|
| Group | Bindings |
|
|
8130
8561
|
| Navigation title | Hyperdrive |
|
|
8131
8562
|
| Eyebrow | Binding reference |
|
|
@@ -8156,7 +8587,7 @@ export default defineConfig({
|
|
|
8156
8587
|
bindings: {
|
|
8157
8588
|
hyperdrive: {
|
|
8158
8589
|
DB: 'app-postgres',
|
|
8159
|
-
|
|
8590
|
+
ANALYTICS_DB: { id: 'hyperdrive-id' }
|
|
8160
8591
|
}
|
|
8161
8592
|
}
|
|
8162
8593
|
})
|
|
@@ -8202,9 +8633,9 @@ Cloudflare Hyperdrive docs is the platform reference. This page is the Devflare
|
|
|
8202
8633
|
|
|
8203
8634
|
##### Highlights
|
|
8204
8635
|
|
|
8205
|
-
- **Hyperdrive internals** — See normalization, Wrangler `hyperdrive`, and the preview or runtime details behind the authored shape. ([link](/docs/hyperdrive
|
|
8206
|
-
- **Testing Hyperdrive** — Start from `createTestContext()` plus small binding or smoke checks and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/hyperdrive
|
|
8207
|
-
- **Hyperdrive example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/hyperdrive
|
|
8636
|
+
- **Hyperdrive internals** — See normalization, Wrangler `hyperdrive`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/hyperdrive/internals))
|
|
8637
|
+
- **Testing Hyperdrive** — Start from `createTestContext()` plus small binding or smoke checks and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/hyperdrive/testing))
|
|
8638
|
+
- **Hyperdrive example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/hyperdrive/example))
|
|
8208
8639
|
|
|
8209
8640
|
---
|
|
8210
8641
|
|
|
@@ -8214,7 +8645,7 @@ Cloudflare Hyperdrive docs is the platform reference. This page is the Devflare
|
|
|
8214
8645
|
|
|
8215
8646
|
| Field | Value |
|
|
8216
8647
|
| --- | --- |
|
|
8217
|
-
| Route | [`/docs/hyperdrive
|
|
8648
|
+
| Route | [`/docs/bindings/hyperdrive/internals`](/docs/bindings/hyperdrive/internals) |
|
|
8218
8649
|
| Group | Bindings |
|
|
8219
8650
|
| Navigation title | Hyperdrive internals |
|
|
8220
8651
|
| Eyebrow | Under the hood |
|
|
@@ -8249,7 +8680,7 @@ export default defineConfig({
|
|
|
8249
8680
|
bindings: {
|
|
8250
8681
|
hyperdrive: {
|
|
8251
8682
|
DB: 'app-postgres',
|
|
8252
|
-
|
|
8683
|
+
ANALYTICS_DB: { id: 'hyperdrive-id' }
|
|
8253
8684
|
}
|
|
8254
8685
|
}
|
|
8255
8686
|
})
|
|
@@ -8293,7 +8724,7 @@ export default defineConfig({
|
|
|
8293
8724
|
|
|
8294
8725
|
| Field | Value |
|
|
8295
8726
|
| --- | --- |
|
|
8296
|
-
| Route | [`/docs/hyperdrive
|
|
8727
|
+
| Route | [`/docs/bindings/hyperdrive/testing`](/docs/bindings/hyperdrive/testing) |
|
|
8297
8728
|
| Group | Bindings |
|
|
8298
8729
|
| Navigation title | Testing Hyperdrive |
|
|
8299
8730
|
| Eyebrow | Testing |
|
|
@@ -8358,7 +8789,7 @@ test('Hyperdrive binding exposes connection info', () => {
|
|
|
8358
8789
|
|
|
8359
8790
|
| Field | Value |
|
|
8360
8791
|
| --- | --- |
|
|
8361
|
-
| Route | [`/docs/hyperdrive
|
|
8792
|
+
| Route | [`/docs/bindings/hyperdrive/example`](/docs/bindings/hyperdrive/example) |
|
|
8362
8793
|
| Group | Bindings |
|
|
8363
8794
|
| Navigation title | Hyperdrive example |
|
|
8364
8795
|
| Eyebrow | Starter example |
|
|
@@ -8423,16 +8854,16 @@ export async function fetch(): Promise<Response> {
|
|
|
8423
8854
|
|
|
8424
8855
|
### Use Browser Rendering when the worker really needs a headless browser path
|
|
8425
8856
|
|
|
8426
|
-
>
|
|
8857
|
+
> Browser Rendering shines in Devflare’s bridge-backed dev story: keep one browser binding, one narrow worker route, and one smoke path that proves launch works.
|
|
8427
8858
|
|
|
8428
8859
|
| Field | Value |
|
|
8429
8860
|
| --- | --- |
|
|
8430
|
-
| Route | [`/docs/browser-
|
|
8861
|
+
| Route | [`/docs/bindings/browser-rendering`](/docs/bindings/browser-rendering) |
|
|
8431
8862
|
| Group | Bindings |
|
|
8432
8863
|
| Navigation title | Browser Rendering |
|
|
8433
8864
|
| Eyebrow | Binding reference |
|
|
8434
8865
|
|
|
8435
|
-
|
|
8866
|
+
The platform limit is still real — exactly one browser binding — but Devflare adds the missing local ergonomics through the browser shim, binding worker, and integration-friendly route model.
|
|
8436
8867
|
|
|
8437
8868
|
#### At a glance
|
|
8438
8869
|
|
|
@@ -8505,9 +8936,9 @@ Cloudflare Browser Rendering docs is the platform reference. This page is the De
|
|
|
8505
8936
|
|
|
8506
8937
|
##### Highlights
|
|
8507
8938
|
|
|
8508
|
-
- **Browser Rendering internals** — See normalization, Wrangler `browser` binding, and the preview or runtime details behind the authored shape. ([link](/docs/browser-internals))
|
|
8509
|
-
- **Testing Browser Rendering** — Start from A narrow browser route exercised through the dev server, a preview URL, or another integration-style path and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/browser-testing))
|
|
8510
|
-
- **Browser Rendering example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/browser-example))
|
|
8939
|
+
- **Browser Rendering internals** — See normalization, Wrangler `browser` binding, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/browser-rendering/internals))
|
|
8940
|
+
- **Testing Browser Rendering** — Start from A narrow browser route exercised through the dev server, a preview URL, or another integration-style path and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/browser-rendering/testing))
|
|
8941
|
+
- **Browser Rendering example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/browser-rendering/example))
|
|
8511
8942
|
|
|
8512
8943
|
---
|
|
8513
8944
|
|
|
@@ -8517,7 +8948,7 @@ Cloudflare Browser Rendering docs is the platform reference. This page is the De
|
|
|
8517
8948
|
|
|
8518
8949
|
| Field | Value |
|
|
8519
8950
|
| --- | --- |
|
|
8520
|
-
| Route | [`/docs/browser-internals`](/docs/browser-internals) |
|
|
8951
|
+
| Route | [`/docs/bindings/browser-rendering/internals`](/docs/bindings/browser-rendering/internals) |
|
|
8521
8952
|
| Group | Bindings |
|
|
8522
8953
|
| Navigation title | Browser Rendering internals |
|
|
8523
8954
|
| Eyebrow | Under the hood |
|
|
@@ -8584,9 +9015,11 @@ export default defineConfig({
|
|
|
8584
9015
|
- Preview logic can materialize names, but Devflare does not provision or delete browser “resources” because they are not account-managed the same way storage bindings are.
|
|
8585
9016
|
- The browser path can also warn about missing local WebSocket support when the environment lacks the `ws` dependency needed for proxying.
|
|
8586
9017
|
|
|
8587
|
-
> **Note —
|
|
9018
|
+
> **Note — Local browser-rendering shim**
|
|
9019
|
+
>
|
|
9020
|
+
> The dev-side endpoint Devflare exposes for `@cloudflare/puppeteer` is the **local browser-rendering shim**. It accepts only loopback browser origins (e.g. `http://127.0.0.1:*`, `http://localhost:*`) plus origin-less tool traffic such as Puppeteer or curl.
|
|
8588
9021
|
>
|
|
8589
|
-
>
|
|
9022
|
+
> This loopback-only posture is the security model of the shim itself — it is devflare’s protected helper endpoint for the local Browser Rendering binding. It is **not** a policy applied to your normal worker routes; user app routes still follow whatever request and CORS rules the worker code itself defines.
|
|
8590
9023
|
|
|
8591
9024
|
---
|
|
8592
9025
|
|
|
@@ -8596,7 +9029,7 @@ export default defineConfig({
|
|
|
8596
9029
|
|
|
8597
9030
|
| Field | Value |
|
|
8598
9031
|
| --- | --- |
|
|
8599
|
-
| Route | [`/docs/browser-testing`](/docs/browser-testing) |
|
|
9032
|
+
| Route | [`/docs/bindings/browser-rendering/testing`](/docs/bindings/browser-rendering/testing) |
|
|
8600
9033
|
| Group | Bindings |
|
|
8601
9034
|
| Navigation title | Testing Browser Rendering |
|
|
8602
9035
|
| Eyebrow | Testing |
|
|
@@ -8656,16 +9089,16 @@ test('browser-backed route responds', async () => {
|
|
|
8656
9089
|
|
|
8657
9090
|
### A small Browser Rendering example you can adapt quickly
|
|
8658
9091
|
|
|
8659
|
-
> This example shows the real browser
|
|
9092
|
+
> This example shows the real browser path people actually need: one binding, one title-read route, and one smoke check through the dev server.
|
|
8660
9093
|
|
|
8661
9094
|
| Field | Value |
|
|
8662
9095
|
| --- | --- |
|
|
8663
|
-
| Route | [`/docs/browser-example`](/docs/browser-example) |
|
|
9096
|
+
| Route | [`/docs/bindings/browser-rendering/example`](/docs/bindings/browser-rendering/example) |
|
|
8664
9097
|
| Group | Bindings |
|
|
8665
9098
|
| Navigation title | Browser Rendering example |
|
|
8666
9099
|
| Eyebrow | Starter example |
|
|
8667
9100
|
|
|
8668
|
-
It is intentionally smaller than a full PDF pipeline, but it uses the same
|
|
9101
|
+
It is intentionally smaller than a full PDF pipeline, but it uses the same Devflare idea: a narrow worker route on top of a bridge-backed local browser lane.
|
|
8669
9102
|
|
|
8670
9103
|
#### At a glance
|
|
8671
9104
|
|
|
@@ -8721,11 +9154,27 @@ export async function fetch(): Promise<Response> {
|
|
|
8721
9154
|
}
|
|
8722
9155
|
```
|
|
8723
9156
|
|
|
8724
|
-
####
|
|
9157
|
+
#### Lock in the behavior with one small test or smoke path
|
|
8725
9158
|
|
|
8726
|
-
> **
|
|
9159
|
+
> **Important — The Devflare value is the bridge-backed local lane**
|
|
8727
9160
|
>
|
|
8728
|
-
> Browser work is still heavier than most bindings. Keep
|
|
9161
|
+
> Browser work is still heavier than most bindings, but Devflare gives it a real local/dev story instead of forcing you to document only the production path. Keep the first route narrow enough that launch failures are easy to diagnose.
|
|
9162
|
+
|
|
9163
|
+
##### Example — A dev-server smoke check for the browser route
|
|
9164
|
+
|
|
9165
|
+
```ts
|
|
9166
|
+
import { expect, test } from 'bun:test'
|
|
9167
|
+
|
|
9168
|
+
const baseUrl = process.env.DEVFLARE_TEST_URL ?? 'http://127.0.0.1:8787'
|
|
9169
|
+
|
|
9170
|
+
test('browser route returns a title', async () => {
|
|
9171
|
+
const response = await fetch(new URL('/', baseUrl))
|
|
9172
|
+
expect(response.ok).toBe(true)
|
|
9173
|
+
|
|
9174
|
+
const body = await response.json()
|
|
9175
|
+
expect(body.title).toBeTruthy()
|
|
9176
|
+
})
|
|
9177
|
+
```
|
|
8729
9178
|
|
|
8730
9179
|
---
|
|
8731
9180
|
|
|
@@ -8735,7 +9184,7 @@ export async function fetch(): Promise<Response> {
|
|
|
8735
9184
|
|
|
8736
9185
|
| Field | Value |
|
|
8737
9186
|
| --- | --- |
|
|
8738
|
-
| Route | [`/docs/analytics-engine
|
|
9187
|
+
| Route | [`/docs/bindings/analytics-engine`](/docs/bindings/analytics-engine) |
|
|
8739
9188
|
| Group | Bindings |
|
|
8740
9189
|
| Navigation title | Analytics Engine |
|
|
8741
9190
|
| Eyebrow | Binding reference |
|
|
@@ -8813,9 +9262,9 @@ Cloudflare Workers Analytics Engine docs is the platform reference. This page is
|
|
|
8813
9262
|
|
|
8814
9263
|
##### Highlights
|
|
8815
9264
|
|
|
8816
|
-
- **Analytics Engine internals** — See normalization, Wrangler `analytics_engine_datasets`, and the preview or runtime details behind the authored shape. ([link](/docs/analytics-engine
|
|
8817
|
-
- **Testing Analytics Engine** — Start from A thin worker test or explicit mock around `writeDataPoint()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/analytics-engine
|
|
8818
|
-
- **Analytics Engine example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/analytics-engine
|
|
9265
|
+
- **Analytics Engine internals** — See normalization, Wrangler `analytics_engine_datasets`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/analytics-engine/internals))
|
|
9266
|
+
- **Testing Analytics Engine** — Start from A thin worker test or explicit mock around `writeDataPoint()` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/analytics-engine/testing))
|
|
9267
|
+
- **Analytics Engine example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/analytics-engine/example))
|
|
8819
9268
|
|
|
8820
9269
|
---
|
|
8821
9270
|
|
|
@@ -8825,7 +9274,7 @@ Cloudflare Workers Analytics Engine docs is the platform reference. This page is
|
|
|
8825
9274
|
|
|
8826
9275
|
| Field | Value |
|
|
8827
9276
|
| --- | --- |
|
|
8828
|
-
| Route | [`/docs/analytics-engine
|
|
9277
|
+
| Route | [`/docs/bindings/analytics-engine/internals`](/docs/bindings/analytics-engine/internals) |
|
|
8829
9278
|
| Group | Bindings |
|
|
8830
9279
|
| Navigation title | Analytics Engine internals |
|
|
8831
9280
|
| Eyebrow | Under the hood |
|
|
@@ -8905,7 +9354,7 @@ export default defineConfig({
|
|
|
8905
9354
|
|
|
8906
9355
|
| Field | Value |
|
|
8907
9356
|
| --- | --- |
|
|
8908
|
-
| Route | [`/docs/analytics-engine
|
|
9357
|
+
| Route | [`/docs/bindings/analytics-engine/testing`](/docs/bindings/analytics-engine/testing) |
|
|
8909
9358
|
| Group | Bindings |
|
|
8910
9359
|
| Navigation title | Testing Analytics Engine |
|
|
8911
9360
|
| Eyebrow | Testing |
|
|
@@ -8972,7 +9421,7 @@ test('records an analytics point', () => {
|
|
|
8972
9421
|
|
|
8973
9422
|
| Field | Value |
|
|
8974
9423
|
| --- | --- |
|
|
8975
|
-
| Route | [`/docs/analytics-engine
|
|
9424
|
+
| Route | [`/docs/bindings/analytics-engine/example`](/docs/bindings/analytics-engine/example) |
|
|
8976
9425
|
| Group | Bindings |
|
|
8977
9426
|
| Navigation title | Analytics Engine example |
|
|
8978
9427
|
| Eyebrow | Starter example |
|
|
@@ -9045,7 +9494,7 @@ export async function fetch(): Promise<Response> {
|
|
|
9045
9494
|
|
|
9046
9495
|
| Field | Value |
|
|
9047
9496
|
| --- | --- |
|
|
9048
|
-
| Route | [`/docs/send-email
|
|
9497
|
+
| Route | [`/docs/bindings/send-email`](/docs/bindings/send-email) |
|
|
9049
9498
|
| Group | Bindings |
|
|
9050
9499
|
| Navigation title | Send Email |
|
|
9051
9500
|
| Eyebrow | Binding reference |
|
|
@@ -9127,9 +9576,9 @@ Cloudflare send_email binding docs is the platform reference. This page is the D
|
|
|
9127
9576
|
|
|
9128
9577
|
##### Highlights
|
|
9129
9578
|
|
|
9130
|
-
- **Send Email internals** — See normalization, Wrangler `send_email`, and the preview or runtime details behind the authored shape. ([link](/docs/send-email
|
|
9131
|
-
- **Testing Send Email** — Start from `createTestContext()` plus `env.TRANSACTIONAL_EMAIL.send(...)` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/send-email
|
|
9132
|
-
- **Send Email example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/send-email
|
|
9579
|
+
- **Send Email internals** — See normalization, Wrangler `send_email`, and the preview or runtime details behind the authored shape. ([link](/docs/bindings/send-email/internals))
|
|
9580
|
+
- **Testing Send Email** — Start from `createTestContext()` plus `env.TRANSACTIONAL_EMAIL.send(...)` and only escalate when the binding or deployment model genuinely needs it. ([link](/docs/bindings/send-email/testing))
|
|
9581
|
+
- **Send Email example** — Adapt one small end-to-end path before you hide the binding behind a bigger abstraction. ([link](/docs/bindings/send-email/example))
|
|
9133
9582
|
|
|
9134
9583
|
---
|
|
9135
9584
|
|
|
@@ -9139,7 +9588,7 @@ Cloudflare send_email binding docs is the platform reference. This page is the D
|
|
|
9139
9588
|
|
|
9140
9589
|
| Field | Value |
|
|
9141
9590
|
| --- | --- |
|
|
9142
|
-
| Route | [`/docs/send-email
|
|
9591
|
+
| Route | [`/docs/bindings/send-email/internals`](/docs/bindings/send-email/internals) |
|
|
9143
9592
|
| Group | Bindings |
|
|
9144
9593
|
| Navigation title | Send Email internals |
|
|
9145
9594
|
| Eyebrow | Under the hood |
|
|
@@ -9223,7 +9672,7 @@ export default defineConfig({
|
|
|
9223
9672
|
|
|
9224
9673
|
| Field | Value |
|
|
9225
9674
|
| --- | --- |
|
|
9226
|
-
| Route | [`/docs/send-email
|
|
9675
|
+
| Route | [`/docs/bindings/send-email/testing`](/docs/bindings/send-email/testing) |
|
|
9227
9676
|
| Group | Bindings |
|
|
9228
9677
|
| Navigation title | Testing Send Email |
|
|
9229
9678
|
| Eyebrow | Testing |
|
|
@@ -9292,7 +9741,7 @@ test('sends an outbound transactional email', async () => {
|
|
|
9292
9741
|
|
|
9293
9742
|
| Field | Value |
|
|
9294
9743
|
| --- | --- |
|
|
9295
|
-
| Route | [`/docs/send-email
|
|
9744
|
+
| Route | [`/docs/bindings/send-email/example`](/docs/bindings/send-email/example) |
|
|
9296
9745
|
| Group | Bindings |
|
|
9297
9746
|
| Navigation title | Send Email example |
|
|
9298
9747
|
| Eyebrow | Starter example |
|