devflare 1.0.0-next.15 → 1.0.0-next.16
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 +9360 -1819
- package/README.md +313 -39
- package/bin/devflare.js +17 -7
- package/dist/account-0w8wdzjv.js +475 -0
- package/dist/account-eygq6qx7.js +475 -0
- package/dist/account-fw8nafav.js +475 -0
- package/dist/account-pzq69nys.js +475 -0
- package/dist/account-s66jb15j.js +475 -0
- package/dist/api-d6ekexs5.js +25 -0
- package/dist/bridge/index.d.ts +1 -1
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/miniflare.d.ts.map +1 -1
- package/dist/bridge/protocol.d.ts +1 -1
- package/dist/bridge/protocol.d.ts.map +1 -1
- package/dist/bridge/proxy.d.ts +0 -4
- package/dist/bridge/proxy.d.ts.map +1 -1
- package/dist/bridge/serialization.d.ts.map +1 -1
- package/dist/bridge/server.d.ts +1 -1
- package/dist/bridge/server.d.ts.map +1 -1
- package/dist/browser-shim/handler.d.ts +1 -1
- package/dist/browser-shim/handler.d.ts.map +1 -1
- package/dist/browser.d.ts +1648 -38
- package/dist/browser.d.ts.map +1 -1
- package/dist/build-1kmkwqgh.js +53 -0
- package/dist/build-506kjhcm.js +53 -0
- package/dist/build-66866ahs.js +53 -0
- package/dist/build-g1adm3ww.js +53 -0
- package/dist/build-p3r3117t.js +53 -0
- package/dist/bundler/do-bundler.d.ts.map +1 -1
- package/dist/bundler/rolldown-shared.d.ts +24 -0
- package/dist/bundler/rolldown-shared.d.ts.map +1 -0
- package/dist/bundler/worker-bundler.d.ts +0 -1
- package/dist/bundler/worker-bundler.d.ts.map +1 -1
- package/dist/cli/command-utils.d.ts +18 -0
- package/dist/cli/command-utils.d.ts.map +1 -0
- package/dist/cli/commands/account.d.ts +1 -1
- package/dist/cli/commands/account.d.ts.map +1 -1
- package/dist/cli/commands/build-artifacts.d.ts +27 -0
- package/dist/cli/commands/build-artifacts.d.ts.map +1 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/deploy.d.ts.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/login.d.ts +4 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/cleanup.d.ts +9 -0
- package/dist/cli/commands/previews-support/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/family.d.ts +10 -0
- package/dist/cli/commands/previews-support/family.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/render.d.ts +8 -0
- package/dist/cli/commands/previews-support/render.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/theme.d.ts +10 -0
- package/dist/cli/commands/previews-support/theme.d.ts.map +1 -0
- package/dist/cli/commands/previews-support/types.d.ts +70 -0
- package/dist/cli/commands/previews-support/types.d.ts.map +1 -0
- package/dist/cli/commands/previews.d.ts +4 -0
- package/dist/cli/commands/previews.d.ts.map +1 -0
- package/dist/cli/commands/productions.d.ts +4 -0
- package/dist/cli/commands/productions.d.ts.map +1 -0
- package/dist/cli/commands/token.d.ts +4 -0
- package/dist/cli/commands/token.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/discovery.d.ts +7 -0
- package/dist/cli/commands/type-generation/discovery.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/generator.d.ts +44 -0
- package/dist/cli/commands/type-generation/generator.d.ts.map +1 -0
- package/dist/cli/commands/type-generation/models.d.ts +27 -0
- package/dist/cli/commands/type-generation/models.d.ts.map +1 -0
- package/dist/cli/commands/types.d.ts.map +1 -1
- package/dist/cli/commands/worker.d.ts +4 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/config-path.d.ts +2 -1
- package/dist/cli/config-path.d.ts.map +1 -1
- package/dist/cli/deploy-strategy.d.ts +17 -0
- package/dist/cli/deploy-strategy.d.ts.map +1 -0
- package/dist/cli/deploy-target.d.ts +17 -0
- package/dist/cli/deploy-target.d.ts.map +1 -0
- package/dist/cli/generated-artifacts.d.ts +12 -0
- package/dist/cli/generated-artifacts.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/account.d.ts +3 -0
- package/dist/cli/help-pages/pages/account.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/core.d.ts +4 -0
- package/dist/cli/help-pages/pages/core.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/index.d.ts +3 -0
- package/dist/cli/help-pages/pages/index.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/misc.d.ts +3 -0
- package/dist/cli/help-pages/pages/misc.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/previews.d.ts +3 -0
- package/dist/cli/help-pages/pages/previews.d.ts.map +1 -0
- package/dist/cli/help-pages/pages/productions.d.ts +3 -0
- package/dist/cli/help-pages/pages/productions.d.ts.map +1 -0
- package/dist/cli/help-pages/render.d.ts +12 -0
- package/dist/cli/help-pages/render.d.ts.map +1 -0
- package/dist/cli/help-pages/shared.d.ts +15 -0
- package/dist/cli/help-pages/shared.d.ts.map +1 -0
- package/dist/cli/help-pages/types.d.ts +23 -0
- package/dist/cli/help-pages/types.d.ts.map +1 -0
- package/dist/cli/help.d.ts +6 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/preview-bindings.d.ts +42 -0
- package/dist/cli/preview-bindings.d.ts.map +1 -0
- package/dist/cli/preview.d.ts +11 -0
- package/dist/cli/preview.d.ts.map +1 -0
- package/dist/cli/ui.d.ts +37 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/workspace-build-guard.d.ts +14 -0
- package/dist/cli/workspace-build-guard.d.ts.map +1 -0
- package/dist/cloudflare/account-core.d.ts +6 -0
- package/dist/cloudflare/account-core.d.ts.map +1 -0
- package/dist/cloudflare/account-resources.d.ts +40 -0
- package/dist/cloudflare/account-resources.d.ts.map +1 -0
- package/dist/cloudflare/account-status.d.ts +11 -0
- package/dist/cloudflare/account-status.d.ts.map +1 -0
- package/dist/cloudflare/account-workers.d.ts +14 -0
- package/dist/cloudflare/account-workers.d.ts.map +1 -0
- package/dist/cloudflare/account.d.ts +7 -64
- package/dist/cloudflare/account.d.ts.map +1 -1
- package/dist/cloudflare/api.d.ts +4 -0
- package/dist/cloudflare/api.d.ts.map +1 -1
- package/dist/cloudflare/index.d.ts +57 -2
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/kv-namespace.d.ts +3 -0
- package/dist/cloudflare/kv-namespace.d.ts.map +1 -0
- package/dist/cloudflare/preferences.d.ts.map +1 -1
- package/dist/cloudflare/preview-registry-cache.d.ts +6 -0
- package/dist/cloudflare/preview-registry-cache.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-records.d.ts +61 -0
- package/dist/cloudflare/preview-registry-records.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-store.d.ts +14 -0
- package/dist/cloudflare/preview-registry-store.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry-types.d.ts +103 -0
- package/dist/cloudflare/preview-registry-types.d.ts.map +1 -0
- package/dist/cloudflare/preview-registry.d.ts +42 -0
- package/dist/cloudflare/preview-registry.d.ts.map +1 -0
- package/dist/cloudflare/registry-schema.d.ts +253 -0
- package/dist/cloudflare/registry-schema.d.ts.map +1 -0
- package/dist/cloudflare/tokens.d.ts +18 -0
- package/dist/cloudflare/tokens.d.ts.map +1 -0
- package/dist/cloudflare/types.d.ts +122 -5
- package/dist/cloudflare/types.d.ts.map +1 -1
- package/dist/cloudflare/usage.d.ts.map +1 -1
- package/dist/config/compiler.d.ts +4 -0
- package/dist/config/compiler.d.ts.map +1 -1
- package/dist/config/framework-providers.d.ts +9 -0
- package/dist/config/framework-providers.d.ts.map +1 -0
- package/dist/config/index.d.ts +4 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/preview-resources.d.ts +77 -0
- package/dist/config/preview-resources.d.ts.map +1 -0
- package/dist/config/preview.d.ts +31 -0
- package/dist/config/preview.d.ts.map +1 -0
- package/dist/config/ref.d.ts +0 -22
- package/dist/config/ref.d.ts.map +1 -1
- package/dist/config/resolve.d.ts +1 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resource-resolution.d.ts +21 -5
- package/dist/config/resource-resolution.d.ts.map +1 -1
- package/dist/config/schema-bindings.d.ts +693 -0
- package/dist/config/schema-bindings.d.ts.map +1 -0
- package/dist/config/schema-build.d.ts +67 -0
- package/dist/config/schema-build.d.ts.map +1 -0
- package/dist/config/schema-env.d.ts +1341 -0
- package/dist/config/schema-env.d.ts.map +1 -0
- package/dist/config/schema-normalization.d.ts +64 -0
- package/dist/config/schema-normalization.d.ts.map +1 -0
- package/dist/config/schema-runtime.d.ts +230 -0
- package/dist/config/schema-runtime.d.ts.map +1 -0
- package/dist/config/schema.d.ts +542 -3736
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config-entry.d.ts +5 -0
- package/dist/config-entry.d.ts.map +1 -0
- package/dist/{config-v9tr4rts.js → config-fjwke42y.js} +6 -4
- package/dist/config-hwdqjse7.js +59 -0
- package/dist/config-pxvewrhv.js +59 -0
- package/dist/config-q0g5qdga.js +59 -0
- package/dist/decorators/durable-object.d.ts.map +1 -1
- package/dist/deploy-7nmzc9r8.js +609 -0
- package/dist/deploy-csfhdr64.js +691 -0
- package/dist/deploy-ex4g5avz.js +621 -0
- package/dist/deploy-jnb0bhka.js +609 -0
- package/dist/deploy-tp0g6qdp.js +609 -0
- package/dist/deploy-ykpcjkc2.js +690 -0
- package/dist/{dev-ymtphbkg.js → dev-2pd33m28.js} +386 -348
- package/dist/dev-7ef5e2j1.js +2409 -0
- package/dist/dev-8nssqatr.js +2409 -0
- package/dist/dev-grznx8fn.js +2409 -0
- package/dist/dev-server/d1-migrations.d.ts +14 -0
- package/dist/dev-server/d1-migrations.d.ts.map +1 -0
- package/dist/dev-server/gateway-script.d.ts +8 -0
- package/dist/dev-server/gateway-script.d.ts.map +1 -0
- package/dist/dev-server/runtime-stdio.d.ts.map +1 -1
- package/dist/dev-server/server.d.ts.map +1 -1
- package/dist/dev-server/vite-process.d.ts +14 -0
- package/dist/dev-server/vite-process.d.ts.map +1 -0
- package/dist/dev-server/vite-utils.d.ts +1 -1
- package/dist/dev-server/vite-utils.d.ts.map +1 -1
- package/dist/dev-server/worker-source-watcher.d.ts +11 -0
- package/dist/dev-server/worker-source-watcher.d.ts.map +1 -0
- package/dist/dev-server/worker-surface-paths.d.ts +6 -0
- package/dist/dev-server/worker-surface-paths.d.ts.map +1 -0
- package/dist/{doctor-xv4gm1h4.js → doctor-04ammrrh.js} +67 -32
- package/dist/doctor-fmjj65mc.js +245 -0
- package/dist/doctor-fzkznce1.js +245 -0
- package/dist/doctor-sa5xv1bz.js +245 -0
- package/dist/index-091sh1ma.js +1229 -0
- package/dist/index-0apbm26n.js +788 -0
- package/dist/index-0eqksag4.js +418 -0
- package/dist/{index-k8vh558d.js → index-0kfzdywd.js} +15 -2
- package/dist/index-0w826dsr.js +379 -0
- package/dist/{index-5s1bz1e0.js → index-11m5a8wd.js} +100 -22
- package/dist/{index-0rsa2c1t.js → index-1sp39f2f.js} +110 -57
- package/dist/index-2jnrqbny.js +1301 -0
- package/dist/index-2pb7b9mw.js +378 -0
- package/dist/{index-3a4mmn57.js → index-2x53aqjm.js} +1065 -890
- package/dist/index-3ke5d2vn.js +1229 -0
- package/dist/index-43dq8yx8.js +788 -0
- package/dist/index-4rrttqj5.js +378 -0
- package/dist/index-4v9bc2pc.js +1367 -0
- package/dist/index-61jsjnsv.js +280 -0
- package/dist/index-6jef5emv.js +176 -0
- package/dist/index-6psz1h4c.js +788 -0
- package/dist/index-72mve6vh.js +168 -0
- package/dist/{index-zvgc3e0c.js → index-74198nxd.js} +159 -63
- package/dist/{index-7bq4xq84.js → index-7g8zyws4.js} +7 -12
- package/dist/index-7kcxjhta.js +456 -0
- package/dist/index-7v583xan.js +418 -0
- package/dist/index-7x0ybbtx.js +133 -0
- package/dist/index-816krz9p.js +52 -0
- package/dist/index-82f1z98k.js +41 -0
- package/dist/index-8t5nb4qx.js +133 -0
- package/dist/index-9az6s7ad.js +52 -0
- package/dist/{index-59df49vn.js → index-9ba1etyz.js} +29 -51
- package/dist/{index-001mw014.js → index-9fbtk7gv.js} +134 -248
- package/dist/index-9n6djthj.js +490 -0
- package/dist/index-aabgympv.js +39 -0
- package/dist/index-b8m6883k.js +74 -0
- package/dist/{index-5yxg30va.js → index-cgbvmse6.js} +15 -6
- package/dist/index-d8etnfef.js +1229 -0
- package/dist/index-e9yw4d6y.js +133 -0
- package/dist/index-epw1jxz5.js +1204 -0
- package/dist/index-f85s8gj3.js +2649 -0
- package/dist/index-fe2ngvh7.js +1229 -0
- package/dist/index-fvsadj32.js +192 -0
- package/dist/index-gs4y9gdf.js +456 -0
- package/dist/{index-fef08w43.js → index-h18pxvzs.js} +7 -6
- package/dist/index-hfj1a2c4.js +2649 -0
- package/dist/{index-8gtqgb3q.js → index-hjy8ctpc.js} +14 -92
- package/dist/index-htzf0py1.js +1204 -0
- package/dist/index-j185x270.js +897 -0
- package/dist/index-jb75kwa4.js +519 -0
- package/dist/index-jwd8pcb2.js +897 -0
- package/dist/index-k29yjhv0.js +52 -0
- package/dist/index-k6vq6kkt.js +456 -0
- package/dist/{index-vky23txa.js → index-m3fmw6mx.js} +2 -2
- package/dist/index-maxpsfk8.js +402 -0
- package/dist/index-mbdmrner.js +402 -0
- package/dist/index-mea5bc45.js +418 -0
- package/dist/index-mqekt778.js +185 -0
- package/dist/index-na3mnm1k.js +74 -0
- package/dist/index-p03n4qet.js +1367 -0
- package/dist/index-p296ban8.js +191 -0
- package/dist/index-pnbs1b8k.js +280 -0
- package/dist/index-q4kaz181.js +1207 -0
- package/dist/index-ry131z23.js +378 -0
- package/dist/index-sgb7c8nm.js +402 -0
- package/dist/index-sqrksgb2.js +133 -0
- package/dist/index-stgn34cr.js +148 -0
- package/dist/{index-v8vvsn9x.js → index-t08te69w.js} +1 -18
- package/dist/index-thna1tkd.js +280 -0
- package/dist/index-v5nmqthy.js +74 -0
- package/dist/{index-n932ytmq.js → index-vt4yxkmf.js} +2 -2
- package/dist/index-wyq6c6yj.js +402 -0
- package/dist/index-wztc9stx.js +418 -0
- package/dist/index-x9cwdxw5.js +456 -0
- package/dist/index-xk9djfjp.js +519 -0
- package/dist/index-yc0gcchc.js +418 -0
- package/dist/index-yqbxjysa.js +897 -0
- package/dist/index-yzddwp02.js +788 -0
- package/dist/index-zfhq6s96.js +74 -0
- package/dist/index-zt22fe2j.js +54 -0
- package/dist/index-zyt5byt6.js +2649 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/{init-na2atvz2.js → init-r4hnxan3.js} +24 -17
- package/dist/login-2hnz4m4n.js +77 -0
- package/dist/login-5bsxxpvc.js +77 -0
- package/dist/login-6tzvczw2.js +77 -0
- package/dist/login-bhaw72zc.js +77 -0
- package/dist/login-x8tgckqm.js +77 -0
- package/dist/previews-3rn8mz2c.js +1168 -0
- package/dist/previews-d487qde5.js +1200 -0
- package/dist/previews-gm3z0syj.js +1168 -0
- package/dist/previews-j9ymq4ys.js +1169 -0
- package/dist/previews-q031mx34.js +1168 -0
- package/dist/productions-120xg0aq.js +505 -0
- package/dist/productions-5ev5qweg.js +505 -0
- package/dist/productions-me3tdvr9.js +505 -0
- package/dist/productions-p5rbgp2f.js +505 -0
- package/dist/productions-x9p0pym1.js +505 -0
- package/dist/runtime/context-events.d.ts +13 -0
- package/dist/runtime/context-events.d.ts.map +1 -0
- package/dist/runtime/context-types.d.ts +82 -0
- package/dist/runtime/context-types.d.ts.map +1 -0
- package/dist/runtime/context.d.ts +6 -267
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/exports.d.ts +3 -3
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/middleware.d.ts +8 -38
- package/dist/runtime/middleware.d.ts.map +1 -1
- package/dist/src/browser.js +9 -17
- package/dist/src/cli/index.js +3 -1
- package/dist/src/cloudflare/index.js +49 -3
- package/dist/src/config-entry.js +14 -0
- package/dist/src/index.js +24 -20
- package/dist/src/runtime/index.js +3 -9
- package/dist/src/sveltekit/index.js +10 -8
- package/dist/src/test/index.js +16 -19
- package/dist/src/vite/index.js +7 -5
- package/dist/sveltekit/platform.d.ts +1 -1
- package/dist/sveltekit/platform.d.ts.map +1 -1
- package/dist/test/cf.d.ts +10 -10
- package/dist/test/email.d.ts.map +1 -1
- package/dist/test/index.d.ts +1 -6
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/queue.d.ts.map +1 -1
- package/dist/test/remote-ai.d.ts.map +1 -1
- package/dist/test/remote-cloudflare.d.ts +13 -0
- package/dist/test/remote-cloudflare.d.ts.map +1 -0
- package/dist/test/remote-vectorize.d.ts.map +1 -1
- package/dist/test/resolve-service-bindings.d.ts.map +1 -1
- package/dist/test/scheduled.d.ts.map +1 -1
- package/dist/test/should-skip.d.ts +0 -18
- package/dist/test/should-skip.d.ts.map +1 -1
- package/dist/test/simple-context-durable-objects.d.ts +6 -0
- package/dist/test/simple-context-durable-objects.d.ts.map +1 -0
- package/dist/test/simple-context-gateway-script.d.ts +2 -0
- package/dist/test/simple-context-gateway-script.d.ts.map +1 -0
- package/dist/test/simple-context-paths.d.ts +40 -0
- package/dist/test/simple-context-paths.d.ts.map +1 -0
- package/dist/test/simple-context.d.ts +1 -23
- package/dist/test/simple-context.d.ts.map +1 -1
- package/dist/test/tail.d.ts.map +1 -1
- package/dist/test/worker.d.ts.map +1 -1
- package/dist/token-kedhcret.js +419 -0
- package/dist/token-m8jmnjwk.js +419 -0
- package/dist/{types-158m16vd.js → types-0sqwkp7x.js} +244 -140
- package/dist/types-1gwr2ex6.js +572 -0
- package/dist/types-6e5yx6km.js +572 -0
- package/dist/types-p0gckpn6.js +572 -0
- package/dist/utils/send-email.d.ts.map +1 -1
- package/dist/vite/config-file.d.ts.map +1 -1
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/worker-0srh2jfr.js +513 -0
- package/dist/worker-4xrfd10a.js +513 -0
- package/dist/worker-entry/composed-worker.d.ts +0 -7
- package/dist/worker-entry/composed-worker.d.ts.map +1 -1
- package/dist/worker-entry/surface-paths.d.ts +15 -0
- package/dist/worker-entry/surface-paths.d.ts.map +1 -0
- package/dist/worker-qtam8grz.js +513 -0
- package/dist/worker-qzm0b7br.js +513 -0
- package/dist/worker-y9ha6g44.js +513 -0
- package/package.json +17 -10
- package/R2.md +0 -200
- package/dist/account-spa7gzsn.js +0 -421
- package/dist/build-zv25ke4s.js +0 -102
- package/dist/deploy-6xmqvv06.js +0 -118
- package/dist/index-2q3pmzrx.js +0 -90
- package/dist/index-6nb7w45m.js +0 -79
- package/dist/index-tksw7gpy.js +0 -503
- package/dist/index-v43z02tr.js +0 -205
- package/dist/index-xdq9ery1.js +0 -664
- package/dist/test/multi-worker-context.d.ts +0 -114
- package/dist/test/multi-worker-context.d.ts.map +0 -1
package/dist/index-xdq9ery1.js
DELETED
|
@@ -1,664 +0,0 @@
|
|
|
1
|
-
// src/cloudflare/auth.ts
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
5
|
-
import { execSync } from "node:child_process";
|
|
6
|
-
var WRANGLER_CONFIG_FILE = "config/default.toml";
|
|
7
|
-
var EXPIRY_BUFFER_MS = 5 * 60 * 1000;
|
|
8
|
-
var cachedToken = null;
|
|
9
|
-
var cacheExpiresAt = 0;
|
|
10
|
-
function invalidateToken() {
|
|
11
|
-
cachedToken = null;
|
|
12
|
-
cacheExpiresAt = 0;
|
|
13
|
-
}
|
|
14
|
-
function getWranglerConfigPaths() {
|
|
15
|
-
const paths = [];
|
|
16
|
-
if (process.platform === "win32" && process.env.APPDATA) {
|
|
17
|
-
paths.push(join(process.env.APPDATA, "xdg.config", ".wrangler", WRANGLER_CONFIG_FILE));
|
|
18
|
-
}
|
|
19
|
-
if (process.env.XDG_CONFIG_HOME) {
|
|
20
|
-
paths.push(join(process.env.XDG_CONFIG_HOME, ".wrangler", WRANGLER_CONFIG_FILE));
|
|
21
|
-
}
|
|
22
|
-
paths.push(join(homedir(), ".wrangler", WRANGLER_CONFIG_FILE));
|
|
23
|
-
return paths;
|
|
24
|
-
}
|
|
25
|
-
function getWranglerConfigPath() {
|
|
26
|
-
const paths = getWranglerConfigPaths();
|
|
27
|
-
for (const path of paths) {
|
|
28
|
-
if (existsSync(path)) {
|
|
29
|
-
return path;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
function hasWranglerConfig() {
|
|
35
|
-
return getWranglerConfigPath() !== null;
|
|
36
|
-
}
|
|
37
|
-
function parseSimpleToml(content) {
|
|
38
|
-
const result = {};
|
|
39
|
-
const lines = content.split(`
|
|
40
|
-
`);
|
|
41
|
-
for (const line of lines) {
|
|
42
|
-
const trimmed = line.trim();
|
|
43
|
-
if (trimmed.startsWith("#") || trimmed === "")
|
|
44
|
-
continue;
|
|
45
|
-
if (trimmed.startsWith("["))
|
|
46
|
-
continue;
|
|
47
|
-
const match = trimmed.match(/^(\w+)\s*=\s*["'](.*)["']$/);
|
|
48
|
-
if (match) {
|
|
49
|
-
result[match[1]] = match[2];
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return result;
|
|
53
|
-
}
|
|
54
|
-
function readWranglerConfig() {
|
|
55
|
-
const configPath = getWranglerConfigPath();
|
|
56
|
-
if (!configPath || !existsSync(configPath)) {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
const content = readFileSync(configPath, "utf-8");
|
|
61
|
-
const config = parseSimpleToml(content);
|
|
62
|
-
const token = config.oauth_token;
|
|
63
|
-
const expirationTime = config.expiration_time;
|
|
64
|
-
if (token && expirationTime) {
|
|
65
|
-
return {
|
|
66
|
-
token,
|
|
67
|
-
expiresAt: new Date(expirationTime)
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
return null;
|
|
71
|
-
} catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async function getWranglerAuth() {
|
|
76
|
-
const config = readWranglerConfig();
|
|
77
|
-
if (!config)
|
|
78
|
-
return null;
|
|
79
|
-
const configPath = getWranglerConfigPath();
|
|
80
|
-
if (!configPath)
|
|
81
|
-
return null;
|
|
82
|
-
try {
|
|
83
|
-
const content = readFileSync(configPath, "utf-8");
|
|
84
|
-
const parsed = parseSimpleToml(content);
|
|
85
|
-
return {
|
|
86
|
-
oauthToken: parsed.oauth_token,
|
|
87
|
-
refreshToken: parsed.refresh_token,
|
|
88
|
-
expiresAt: config.expiresAt
|
|
89
|
-
};
|
|
90
|
-
} catch {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
function refreshWranglerToken() {
|
|
95
|
-
try {
|
|
96
|
-
const result = execSync("bunx wrangler auth token", {
|
|
97
|
-
encoding: "utf-8",
|
|
98
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
99
|
-
timeout: 15000
|
|
100
|
-
});
|
|
101
|
-
const lines = result.trim().split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
102
|
-
const token = lines[lines.length - 1]?.trim();
|
|
103
|
-
if (token && token.length >= 20 && !token.includes("wrangler") && !token.includes("⛅")) {
|
|
104
|
-
return token;
|
|
105
|
-
}
|
|
106
|
-
return null;
|
|
107
|
-
} catch {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
async function getApiToken(forceRefresh = false) {
|
|
112
|
-
if (!forceRefresh && cachedToken && Date.now() < cacheExpiresAt) {
|
|
113
|
-
return cachedToken;
|
|
114
|
-
}
|
|
115
|
-
const envToken = process.env.CLOUDFLARE_API_TOKEN;
|
|
116
|
-
if (envToken) {
|
|
117
|
-
return envToken;
|
|
118
|
-
}
|
|
119
|
-
if (!forceRefresh) {
|
|
120
|
-
const config = readWranglerConfig();
|
|
121
|
-
if (config) {
|
|
122
|
-
const now = Date.now();
|
|
123
|
-
const expiresAt = config.expiresAt.getTime();
|
|
124
|
-
if (now < expiresAt - EXPIRY_BUFFER_MS) {
|
|
125
|
-
cachedToken = config.token;
|
|
126
|
-
cacheExpiresAt = expiresAt - EXPIRY_BUFFER_MS;
|
|
127
|
-
return config.token;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
const refreshedToken = refreshWranglerToken();
|
|
132
|
-
if (refreshedToken) {
|
|
133
|
-
cachedToken = refreshedToken;
|
|
134
|
-
cacheExpiresAt = Date.now() + EXPIRY_BUFFER_MS;
|
|
135
|
-
return refreshedToken;
|
|
136
|
-
}
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
async function isAuthenticated() {
|
|
140
|
-
const token = await getApiToken();
|
|
141
|
-
return token !== null;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// src/cloudflare/api.ts
|
|
145
|
-
var API_BASE = "https://api.cloudflare.com/client/v4";
|
|
146
|
-
var DEFAULT_TIMEOUT = 1e4;
|
|
147
|
-
var hasRetriedWithFreshToken = false;
|
|
148
|
-
async function fetchWithTimeout(url, init, timeoutMs) {
|
|
149
|
-
const controller = new AbortController;
|
|
150
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
151
|
-
try {
|
|
152
|
-
const response = await Promise.race([
|
|
153
|
-
fetch(url, { ...init, signal: controller.signal }),
|
|
154
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error(`Request timed out after ${timeoutMs}ms`)), timeoutMs))
|
|
155
|
-
]);
|
|
156
|
-
return response;
|
|
157
|
-
} finally {
|
|
158
|
-
clearTimeout(timeoutId);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
class CloudflareAPIError extends Error {
|
|
163
|
-
code;
|
|
164
|
-
errors;
|
|
165
|
-
constructor(message, code, errors) {
|
|
166
|
-
super(message);
|
|
167
|
-
this.code = code;
|
|
168
|
-
this.errors = errors;
|
|
169
|
-
this.name = "CloudflareAPIError";
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
class AuthenticationError extends Error {
|
|
174
|
-
constructor(message = "Not authenticated. Run: bunx wrangler login") {
|
|
175
|
-
super(message);
|
|
176
|
-
this.name = "AuthenticationError";
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
async function createHeaders(options, forceRefresh = false) {
|
|
180
|
-
const token = options?.token ?? await getApiToken(forceRefresh);
|
|
181
|
-
if (!token) {
|
|
182
|
-
throw new AuthenticationError;
|
|
183
|
-
}
|
|
184
|
-
return new Headers({
|
|
185
|
-
Authorization: `Bearer ${token}`,
|
|
186
|
-
"Content-Type": "application/json"
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
function isAuthError(response, data) {
|
|
190
|
-
if (response.status === 401)
|
|
191
|
-
return true;
|
|
192
|
-
if (!data.success && data.errors?.some((e) => e.code === 1e4 || e.message?.toLowerCase().includes("authentication") || e.message?.toLowerCase().includes("token"))) {
|
|
193
|
-
return true;
|
|
194
|
-
}
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
async function apiGet(path, options) {
|
|
198
|
-
const makeRequest = async (forceRefresh) => {
|
|
199
|
-
const headers = await createHeaders(options, forceRefresh);
|
|
200
|
-
const url = `${API_BASE}${path}`;
|
|
201
|
-
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
202
|
-
const response2 = await fetchWithTimeout(url, {
|
|
203
|
-
method: "GET",
|
|
204
|
-
headers
|
|
205
|
-
}, timeout);
|
|
206
|
-
const data2 = await response2.json();
|
|
207
|
-
return { response: response2, data: data2 };
|
|
208
|
-
};
|
|
209
|
-
let { response, data } = await makeRequest(false);
|
|
210
|
-
if (isAuthError(response, data) && !hasRetriedWithFreshToken && !options?.token) {
|
|
211
|
-
hasRetriedWithFreshToken = true;
|
|
212
|
-
invalidateToken();
|
|
213
|
-
({ response, data } = await makeRequest(true));
|
|
214
|
-
hasRetriedWithFreshToken = false;
|
|
215
|
-
}
|
|
216
|
-
if (!data.success) {
|
|
217
|
-
throw new CloudflareAPIError(data.errors[0]?.message || "API request failed", response.status, data.errors);
|
|
218
|
-
}
|
|
219
|
-
return data.result;
|
|
220
|
-
}
|
|
221
|
-
async function apiPost(path, body, options) {
|
|
222
|
-
const headers = await createHeaders(options);
|
|
223
|
-
const url = `${API_BASE}${path}`;
|
|
224
|
-
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
225
|
-
const response = await fetchWithTimeout(url, {
|
|
226
|
-
method: "POST",
|
|
227
|
-
headers,
|
|
228
|
-
body: JSON.stringify(body)
|
|
229
|
-
}, timeout);
|
|
230
|
-
const data = await response.json();
|
|
231
|
-
if (!data.success) {
|
|
232
|
-
throw new CloudflareAPIError(data.errors[0]?.message || "API request failed", response.status, data.errors);
|
|
233
|
-
}
|
|
234
|
-
return data.result;
|
|
235
|
-
}
|
|
236
|
-
async function apiGetAll(path, options) {
|
|
237
|
-
const results = [];
|
|
238
|
-
let page = 1;
|
|
239
|
-
const perPage = 50;
|
|
240
|
-
const maxPages = 100;
|
|
241
|
-
while (page <= maxPages) {
|
|
242
|
-
const separator = path.includes("?") ? "&" : "?";
|
|
243
|
-
const pagedPath = `${path}${separator}page=${page}&per_page=${perPage}`;
|
|
244
|
-
const headers = await createHeaders(options);
|
|
245
|
-
const url = `${API_BASE}${pagedPath}`;
|
|
246
|
-
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
247
|
-
const response = await fetchWithTimeout(url, {
|
|
248
|
-
method: "GET",
|
|
249
|
-
headers
|
|
250
|
-
}, timeout);
|
|
251
|
-
const data = await response.json();
|
|
252
|
-
if (!data.success) {
|
|
253
|
-
throw new CloudflareAPIError(data.errors[0]?.message || "API request failed", response.status, data.errors);
|
|
254
|
-
}
|
|
255
|
-
results.push(...data.result);
|
|
256
|
-
if (!data.result_info) {
|
|
257
|
-
break;
|
|
258
|
-
}
|
|
259
|
-
if (data.result.length === 0) {
|
|
260
|
-
break;
|
|
261
|
-
}
|
|
262
|
-
if (data.result_info.total_count !== undefined) {
|
|
263
|
-
if (results.length >= data.result_info.total_count) {
|
|
264
|
-
break;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
if (data.result_info.total_pages !== undefined) {
|
|
268
|
-
if (page >= data.result_info.total_pages) {
|
|
269
|
-
break;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
page++;
|
|
273
|
-
}
|
|
274
|
-
return results;
|
|
275
|
-
}
|
|
276
|
-
async function kvGet(accountId, namespaceId, key, options) {
|
|
277
|
-
const token = options?.token ?? await getApiToken();
|
|
278
|
-
if (!token)
|
|
279
|
-
throw new AuthenticationError;
|
|
280
|
-
const encodedKey = encodeURIComponent(key);
|
|
281
|
-
const url = `${API_BASE}/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/values/${encodedKey}`;
|
|
282
|
-
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
283
|
-
const response = await fetchWithTimeout(url, {
|
|
284
|
-
method: "GET",
|
|
285
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
286
|
-
}, timeout);
|
|
287
|
-
if (response.status === 404) {
|
|
288
|
-
return null;
|
|
289
|
-
}
|
|
290
|
-
if (!response.ok) {
|
|
291
|
-
try {
|
|
292
|
-
const errorData = await response.json();
|
|
293
|
-
throw new CloudflareAPIError(errorData.errors[0]?.message || "KV read failed", response.status, errorData.errors);
|
|
294
|
-
} catch {
|
|
295
|
-
throw new CloudflareAPIError("KV read failed", response.status, []);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
return response.text();
|
|
299
|
-
}
|
|
300
|
-
async function kvPut(accountId, namespaceId, key, value, options) {
|
|
301
|
-
const token = options?.token ?? await getApiToken();
|
|
302
|
-
if (!token)
|
|
303
|
-
throw new AuthenticationError;
|
|
304
|
-
const encodedKey = encodeURIComponent(key);
|
|
305
|
-
const url = `${API_BASE}/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/values/${encodedKey}`;
|
|
306
|
-
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
307
|
-
const response = await fetchWithTimeout(url, {
|
|
308
|
-
method: "PUT",
|
|
309
|
-
headers: {
|
|
310
|
-
Authorization: `Bearer ${token}`,
|
|
311
|
-
"Content-Type": "text/plain"
|
|
312
|
-
},
|
|
313
|
-
body: value
|
|
314
|
-
}, timeout);
|
|
315
|
-
if (!response.ok) {
|
|
316
|
-
try {
|
|
317
|
-
const errorData = await response.json();
|
|
318
|
-
throw new CloudflareAPIError(errorData.errors[0]?.message || "KV write failed", response.status, errorData.errors);
|
|
319
|
-
} catch {
|
|
320
|
-
throw new CloudflareAPIError("KV write failed", response.status, []);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// src/cloudflare/account.ts
|
|
326
|
-
async function getAccounts() {
|
|
327
|
-
const accounts = await apiGetAll("/accounts");
|
|
328
|
-
return accounts.map((acc) => ({
|
|
329
|
-
id: acc.id,
|
|
330
|
-
name: acc.name,
|
|
331
|
-
type: acc.type,
|
|
332
|
-
createdOn: acc.created_on ? new Date(acc.created_on) : undefined
|
|
333
|
-
}));
|
|
334
|
-
}
|
|
335
|
-
async function getPrimaryAccount() {
|
|
336
|
-
const accounts = await getAccounts();
|
|
337
|
-
return accounts[0] ?? null;
|
|
338
|
-
}
|
|
339
|
-
async function getAccountById(accountId) {
|
|
340
|
-
try {
|
|
341
|
-
const account = await apiGet(`/accounts/${accountId}`);
|
|
342
|
-
return {
|
|
343
|
-
id: account.id,
|
|
344
|
-
name: account.name,
|
|
345
|
-
type: account.type,
|
|
346
|
-
createdOn: account.created_on ? new Date(account.created_on) : undefined
|
|
347
|
-
};
|
|
348
|
-
} catch {
|
|
349
|
-
return null;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
async function listWorkers(accountId, options) {
|
|
353
|
-
const scripts = await apiGetAll(`/accounts/${accountId}/workers/scripts`, options);
|
|
354
|
-
return scripts.map((s) => ({
|
|
355
|
-
name: s.name ?? s.id,
|
|
356
|
-
createdOn: new Date(s.created_on),
|
|
357
|
-
modifiedOn: new Date(s.modified_on)
|
|
358
|
-
}));
|
|
359
|
-
}
|
|
360
|
-
async function listKVNamespaces(accountId, options) {
|
|
361
|
-
const namespaces = await apiGetAll(`/accounts/${accountId}/storage/kv/namespaces`, options);
|
|
362
|
-
return namespaces.map((ns) => ({
|
|
363
|
-
id: ns.id,
|
|
364
|
-
name: ns.title
|
|
365
|
-
}));
|
|
366
|
-
}
|
|
367
|
-
async function listD1Databases(accountId, options) {
|
|
368
|
-
const databases = await apiGetAll(`/accounts/${accountId}/d1/database`, options);
|
|
369
|
-
return databases.map((db) => ({
|
|
370
|
-
id: db.uuid,
|
|
371
|
-
name: db.name,
|
|
372
|
-
version: db.version,
|
|
373
|
-
tableCount: db.num_tables,
|
|
374
|
-
sizeBytes: db.file_size
|
|
375
|
-
}));
|
|
376
|
-
}
|
|
377
|
-
async function listR2Buckets(accountId, options) {
|
|
378
|
-
const buckets = await apiGetAll(`/accounts/${accountId}/r2/buckets`, options);
|
|
379
|
-
return buckets.map((b) => ({
|
|
380
|
-
name: b.name,
|
|
381
|
-
createdOn: new Date(b.creation_date),
|
|
382
|
-
location: b.location
|
|
383
|
-
}));
|
|
384
|
-
}
|
|
385
|
-
async function listVectorizeIndexes(accountId, options) {
|
|
386
|
-
try {
|
|
387
|
-
const indexes = await apiGetAll(`/accounts/${accountId}/vectorize/v2/indexes`, options);
|
|
388
|
-
return indexes.map((idx) => ({
|
|
389
|
-
name: idx.name,
|
|
390
|
-
dimensions: idx.config.dimensions,
|
|
391
|
-
metric: idx.config.metric,
|
|
392
|
-
description: idx.description
|
|
393
|
-
}));
|
|
394
|
-
} catch {
|
|
395
|
-
return [];
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
async function listAIModels(accountId, options) {
|
|
399
|
-
try {
|
|
400
|
-
const models = await apiGetAll(`/accounts/${accountId}/ai/models/search`, options);
|
|
401
|
-
return models.map((m) => ({
|
|
402
|
-
id: m.id,
|
|
403
|
-
name: m.name,
|
|
404
|
-
task: m.task?.name,
|
|
405
|
-
description: m.description
|
|
406
|
-
}));
|
|
407
|
-
} catch {
|
|
408
|
-
return [];
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
async function getServiceStatus(accountId, service) {
|
|
412
|
-
const timeout = 1e4;
|
|
413
|
-
try {
|
|
414
|
-
switch (service) {
|
|
415
|
-
case "workers": {
|
|
416
|
-
const workers = await Promise.race([
|
|
417
|
-
listWorkers(accountId),
|
|
418
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout))
|
|
419
|
-
]);
|
|
420
|
-
return {
|
|
421
|
-
service,
|
|
422
|
-
available: true,
|
|
423
|
-
count: workers.length
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
case "kv": {
|
|
427
|
-
const namespaces = await Promise.race([
|
|
428
|
-
listKVNamespaces(accountId),
|
|
429
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout))
|
|
430
|
-
]);
|
|
431
|
-
return {
|
|
432
|
-
service,
|
|
433
|
-
available: true,
|
|
434
|
-
count: namespaces.length
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
case "d1": {
|
|
438
|
-
const databases = await Promise.race([
|
|
439
|
-
listD1Databases(accountId),
|
|
440
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout))
|
|
441
|
-
]);
|
|
442
|
-
return {
|
|
443
|
-
service,
|
|
444
|
-
available: true,
|
|
445
|
-
count: databases.length
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
case "r2": {
|
|
449
|
-
const buckets = await Promise.race([
|
|
450
|
-
listR2Buckets(accountId),
|
|
451
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout))
|
|
452
|
-
]);
|
|
453
|
-
return {
|
|
454
|
-
service,
|
|
455
|
-
available: true,
|
|
456
|
-
count: buckets.length
|
|
457
|
-
};
|
|
458
|
-
}
|
|
459
|
-
case "vectorize": {
|
|
460
|
-
const indexes = await Promise.race([
|
|
461
|
-
listVectorizeIndexes(accountId),
|
|
462
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout))
|
|
463
|
-
]);
|
|
464
|
-
return {
|
|
465
|
-
service,
|
|
466
|
-
available: true,
|
|
467
|
-
count: indexes.length
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
case "ai": {
|
|
471
|
-
const models = await Promise.race([
|
|
472
|
-
listAIModels(accountId),
|
|
473
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout))
|
|
474
|
-
]);
|
|
475
|
-
return {
|
|
476
|
-
service,
|
|
477
|
-
available: models.length > 0,
|
|
478
|
-
count: models.length
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
|
-
default:
|
|
482
|
-
return {
|
|
483
|
-
service,
|
|
484
|
-
available: false
|
|
485
|
-
};
|
|
486
|
-
}
|
|
487
|
-
} catch {
|
|
488
|
-
return {
|
|
489
|
-
service,
|
|
490
|
-
available: false
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
async function getAllServiceStatus(accountId) {
|
|
495
|
-
const services = [
|
|
496
|
-
"workers",
|
|
497
|
-
"kv",
|
|
498
|
-
"d1",
|
|
499
|
-
"r2",
|
|
500
|
-
"vectorize",
|
|
501
|
-
"ai"
|
|
502
|
-
];
|
|
503
|
-
const statuses = await Promise.all(services.map((s) => getServiceStatus(accountId, s)));
|
|
504
|
-
return statuses;
|
|
505
|
-
}
|
|
506
|
-
async function hasService(accountId, service) {
|
|
507
|
-
const status = await getServiceStatus(accountId, service);
|
|
508
|
-
return status.available;
|
|
509
|
-
}
|
|
510
|
-
async function getAccountSummary(accountId) {
|
|
511
|
-
const account = await getAccountById(accountId);
|
|
512
|
-
if (!account)
|
|
513
|
-
return null;
|
|
514
|
-
const services = await getAllServiceStatus(accountId);
|
|
515
|
-
return {
|
|
516
|
-
account,
|
|
517
|
-
services
|
|
518
|
-
};
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
// src/cloudflare/preferences.ts
|
|
522
|
-
import { homedir as homedir2 } from "node:os";
|
|
523
|
-
import { join as join2 } from "node:path";
|
|
524
|
-
import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync, mkdirSync } from "node:fs";
|
|
525
|
-
var DEVFLARE_KV_NAMESPACE_TITLE = "devflare-usage";
|
|
526
|
-
var GLOBAL_ACCOUNT_KEY = "settings:defaultAccountId";
|
|
527
|
-
var LOCAL_CACHE_DIR = ".devflare";
|
|
528
|
-
var LOCAL_CACHE_FILE = "preferences.json";
|
|
529
|
-
function getLocalPreferencesPath() {
|
|
530
|
-
return join2(homedir2(), LOCAL_CACHE_DIR, LOCAL_CACHE_FILE);
|
|
531
|
-
}
|
|
532
|
-
function readLocalPreferences() {
|
|
533
|
-
const path = getLocalPreferencesPath();
|
|
534
|
-
if (!existsSync2(path)) {
|
|
535
|
-
return {};
|
|
536
|
-
}
|
|
537
|
-
try {
|
|
538
|
-
const content = readFileSync2(path, "utf-8");
|
|
539
|
-
return JSON.parse(content);
|
|
540
|
-
} catch {
|
|
541
|
-
return {};
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
function writeLocalPreferences(prefs) {
|
|
545
|
-
const path = getLocalPreferencesPath();
|
|
546
|
-
const dir = join2(homedir2(), LOCAL_CACHE_DIR);
|
|
547
|
-
if (!existsSync2(dir)) {
|
|
548
|
-
mkdirSync(dir, { recursive: true });
|
|
549
|
-
}
|
|
550
|
-
writeFileSync(path, JSON.stringify(prefs, null, "\t"), "utf-8");
|
|
551
|
-
}
|
|
552
|
-
function findPackageJsonPath(startDir) {
|
|
553
|
-
let dir = startDir ?? process.cwd();
|
|
554
|
-
while (dir !== join2(dir, "..")) {
|
|
555
|
-
const pkgPath = join2(dir, "package.json");
|
|
556
|
-
if (existsSync2(pkgPath)) {
|
|
557
|
-
return pkgPath;
|
|
558
|
-
}
|
|
559
|
-
dir = join2(dir, "..");
|
|
560
|
-
}
|
|
561
|
-
return null;
|
|
562
|
-
}
|
|
563
|
-
function readPackageJson(path) {
|
|
564
|
-
try {
|
|
565
|
-
const content = readFileSync2(path, "utf-8");
|
|
566
|
-
return JSON.parse(content);
|
|
567
|
-
} catch {
|
|
568
|
-
return null;
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
function writePackageJson(path, pkg) {
|
|
572
|
-
writeFileSync(path, JSON.stringify(pkg, null, "\t") + `
|
|
573
|
-
`, "utf-8");
|
|
574
|
-
}
|
|
575
|
-
function getWorkspaceAccountId() {
|
|
576
|
-
const pkgPath = findPackageJsonPath();
|
|
577
|
-
if (!pkgPath)
|
|
578
|
-
return null;
|
|
579
|
-
const pkg = readPackageJson(pkgPath);
|
|
580
|
-
return pkg?.devflare?.accountId ?? null;
|
|
581
|
-
}
|
|
582
|
-
function setWorkspaceAccountId(accountId) {
|
|
583
|
-
let pkgPath = findPackageJsonPath();
|
|
584
|
-
let pkg;
|
|
585
|
-
if (pkgPath) {
|
|
586
|
-
pkg = readPackageJson(pkgPath) ?? {};
|
|
587
|
-
} else {
|
|
588
|
-
pkgPath = join2(process.cwd(), "package.json");
|
|
589
|
-
pkg = {
|
|
590
|
-
name: "workspace",
|
|
591
|
-
private: true
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
|
-
if (!pkg.devflare) {
|
|
595
|
-
pkg.devflare = {};
|
|
596
|
-
}
|
|
597
|
-
pkg.devflare.accountId = accountId;
|
|
598
|
-
writePackageJson(pkgPath, pkg);
|
|
599
|
-
return pkgPath;
|
|
600
|
-
}
|
|
601
|
-
async function getOrCreatePreferencesNamespace(accountId) {
|
|
602
|
-
const namespaces = await apiGet(`/accounts/${accountId}/storage/kv/namespaces`);
|
|
603
|
-
const existing = namespaces.find((ns) => ns.title === DEVFLARE_KV_NAMESPACE_TITLE);
|
|
604
|
-
if (existing) {
|
|
605
|
-
return existing.id;
|
|
606
|
-
}
|
|
607
|
-
const created = await apiPost(`/accounts/${accountId}/storage/kv/namespaces`, { title: DEVFLARE_KV_NAMESPACE_TITLE });
|
|
608
|
-
return created.id;
|
|
609
|
-
}
|
|
610
|
-
async function getGlobalDefaultAccountId(fallbackAccountId) {
|
|
611
|
-
const local = readLocalPreferences();
|
|
612
|
-
if (local.defaultAccountId) {
|
|
613
|
-
return local.defaultAccountId;
|
|
614
|
-
}
|
|
615
|
-
try {
|
|
616
|
-
const namespaceId = await getOrCreatePreferencesNamespace(fallbackAccountId);
|
|
617
|
-
const value = await kvGet(fallbackAccountId, namespaceId, GLOBAL_ACCOUNT_KEY);
|
|
618
|
-
if (value) {
|
|
619
|
-
writeLocalPreferences({
|
|
620
|
-
...local,
|
|
621
|
-
defaultAccountId: value,
|
|
622
|
-
lastUpdated: new Date().toISOString()
|
|
623
|
-
});
|
|
624
|
-
return value;
|
|
625
|
-
}
|
|
626
|
-
} catch {}
|
|
627
|
-
return null;
|
|
628
|
-
}
|
|
629
|
-
async function setGlobalDefaultAccountId(accountId, anyAccountId) {
|
|
630
|
-
const kvAccountId = anyAccountId ?? accountId;
|
|
631
|
-
const local = readLocalPreferences();
|
|
632
|
-
writeLocalPreferences({
|
|
633
|
-
...local,
|
|
634
|
-
defaultAccountId: accountId,
|
|
635
|
-
lastUpdated: new Date().toISOString()
|
|
636
|
-
});
|
|
637
|
-
try {
|
|
638
|
-
const namespaceId = await getOrCreatePreferencesNamespace(kvAccountId);
|
|
639
|
-
await kvPut(kvAccountId, namespaceId, GLOBAL_ACCOUNT_KEY, accountId);
|
|
640
|
-
} catch {}
|
|
641
|
-
}
|
|
642
|
-
async function getEffectiveAccountId(primaryAccountId) {
|
|
643
|
-
const workspaceId = getWorkspaceAccountId();
|
|
644
|
-
if (workspaceId) {
|
|
645
|
-
return { accountId: workspaceId, source: "workspace" };
|
|
646
|
-
}
|
|
647
|
-
const globalId = await getGlobalDefaultAccountId(primaryAccountId);
|
|
648
|
-
if (globalId) {
|
|
649
|
-
return { accountId: globalId, source: "global" };
|
|
650
|
-
}
|
|
651
|
-
return { accountId: primaryAccountId, source: "primary" };
|
|
652
|
-
}
|
|
653
|
-
async function clearGlobalDefaultAccountId(anyAccountId) {
|
|
654
|
-
const local = readLocalPreferences();
|
|
655
|
-
delete local.defaultAccountId;
|
|
656
|
-
local.lastUpdated = new Date().toISOString();
|
|
657
|
-
writeLocalPreferences(local);
|
|
658
|
-
try {
|
|
659
|
-
const namespaceId = await getOrCreatePreferencesNamespace(anyAccountId);
|
|
660
|
-
await kvPut(anyAccountId, namespaceId, GLOBAL_ACCOUNT_KEY, "");
|
|
661
|
-
} catch {}
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
export { hasWranglerConfig, getWranglerAuth, getApiToken, isAuthenticated, CloudflareAPIError, AuthenticationError, apiGet, apiPost, kvGet, kvPut, getAccounts, getPrimaryAccount, getAccountById, listWorkers, listKVNamespaces, listD1Databases, listR2Buckets, listVectorizeIndexes, listAIModels, getServiceStatus, getAllServiceStatus, hasService, getAccountSummary, getWorkspaceAccountId, setWorkspaceAccountId, getGlobalDefaultAccountId, setGlobalDefaultAccountId, getEffectiveAccountId, clearGlobalDefaultAccountId };
|