Skip to content

Config Types

Tamer exports TypeScript types for the Tamer config (tamer/project.config.ts) and for Wrangler configs (generated from the official Wrangler config schema). Use them to author both with full type safety.

Usage

Tamer config

ts
import {
  cf,
  defineConfig,
  type WorkerConfig,
  type EnvOverride,
  type WfpConfig,
  type WfpNamespaceConfig,
  type WfpWorkerTemplate,
} from "@dragonmastery/tamer";

export default defineConfig({
  stack: "my-app",
  compatibility_date: "2025-05-19",
  workers: {
    api: { /* WorkerConfig */ } satisfies WorkerConfig,
  },
  wfp: {
    ephemeralEnvPattern: "^pr-",
    tenantDirectory: {
      worker: "dispatch",
      shardGroup: "directory",
      service: "tenant",
    },
    namespaces: {
      myapp: {
        workers: {
          tenant: {
            main: "apps/tenant/src/index.ts",
            shardGroups: [
              { name: "primary", binding: "DB", migrationsDir: "db/primary/migrations" },
            ],
            d1: [
              { logicalName: "system", binding: "DB_SYSTEM", migrationsDir: "db/system/migrations" },
            ],
            vars: { APP_NAME: "MyApp" },
            services: [{ binding: "API", service: "${tamer:worker:api.name}" }],
            secrets: ["JWT_SECRET"],
          } satisfies WfpWorkerTemplate,
        },
      } satisfies WfpNamespaceConfig,
    },
  } satisfies WfpConfig,
});

Wrangler config

ts
import type {
  WranglerConfig,
  WranglerEnvironment,
  WranglerD1Database,
  WranglerR2Bucket,
  WranglerKVNamespace,
} from "@dragonmastery/tamer";

const config: WranglerConfig = {
  name: "my-worker",
  main: "src/index.ts",
  compatibility_date: "2025-01-01",
  d1_databases: [{ binding: "DB", database_id: "xxx" }],
};

Exported types

Tamer config types

TypeDescription
TamerConfigRoot document (defineConfig return type). Union of TamerConfigSingle / TamerConfigMulti.
TamerConfigSingleSingle-worker stack (worker field).
TamerConfigMultiMulti-worker stack (workers map).
TamerConfigBaseShared root fields: stack, account_id, compatibility_date, naming, wfp, protectedEnvs, dnsRecords, logpushJobs, outputs, codegen.
WorkerConfigA worker entry under workers (or top-level worker).
EnvOverrideShape of env.<name> and local override blocks.
NamingConventionsOptional naming hooks (d1Single, d1Shard, r2Bucket, workerName, workflow).
WfpConfigwfp block: { namespaces, ephemeralEnvPattern?, tenantDirectory? }.
WfpNamespaceConfigOne dispatch namespace per product: { workers: Record<service, WfpWorkerTemplate>, namespace? }. Default CF namespace name is {product}-{env}.
WfpWorkerTemplatePer-service tenant Worker template: wrangler passthrough (kv_namespaces, queues, worker_loaders, …) plus { main, path?, shardGroups?, d1?, vars?, services?, secrets?, durableObjects?, doMigrations?, r2Groups?, local?, env? }. local / env.<name> overlays merge like stack workers (for local wrangler.json gen and remote deploy). Each workspace gets one script named {service}-{workspace}-{env}. Deployed via wrangler deploy --dispatch-namespace.
ShardGroupConfigAppend-only horizontal sharding: { name, binding, migrationsDir, migrationsTable?, seedDir? }. Shard N binds as {binding}_{NNN} (e.g. DB_000). Used on resources.shardGroups[] (stack) and WfpWorkerTemplate.shardGroups[] (tenant).
PerTenantD1ConfigNon-sharded per-tenant utility D1: { logicalName, binding, migrationsDir?, migrationsTable?, seedDir? }.
WfpTenantDirectoryConfig{ worker, shardGroup, service?, blockSize? } — maps dense tenantNumber → dispatch script name in a stack-level directory shard group.
D1ResourceConfigEntry under resources.d1[].
R2ResourceConfigEntry under resources.r2[].

Wrangler types

TypeDescription
WranglerConfigFull wrangler config (alias: RawConfig)
WranglerEnvironmentEnvironment block (alias: RawEnvironment)
WranglerD1DatabaseD1 binding entry
WranglerR2BucketR2 binding entry
WranglerKVNamespaceKV binding entry

Derived name patterns

When no naming hook or per-resource cloudflareName override is set, Tamer derives Cloudflare names from the logical name + env (the stack identity is available to hooks but not embedded in defaults):

ResourceDefault name
D1 singledb_{logical}_{env}
D1 shardeddb_{logical}_{YYYYMMDD}_{env}
R2 bucketr2-{logical}-{env}
KV namespacekv_{logical}_{env}
Queueq-{logical}-{env}
Hyperdrivehd-{logical}-{env}
Vectorizevec-{logical}-{env}
AI Gatewayaigw-{logical}-{env}
Pipelinepipe-{logical}-{env}
Workflowwf-{logical}-{env}
Secrets Storesec-{logical}-{env}
Worker script{stack}-{workerKey}-{env} (local omits -{env})
Dispatch namespace{product}-{env} (from wfp.namespaces)
Tenant dispatch script{service}-{workspace}-{env}
Shard group physical (stack)db_{group}_{NNN}_{stack}_{env} → binding {prefix}_{NNN}
Shard group physical (tenant)db_{group}_{NNN}_{product}_{workspace}_{env} → binding {prefix}_{NNN}
Per-tenant utility D1db_{logicalName}_{product}_{workspace}_{env}

How Wrangler types are generated

Wrangler types are generated from Wrangler's config-schema.json via scripts/generate-wrangler-types.ts. The schema is fetched from unpkg (pinned via WRANGLER_SCHEMA_VERSION, or local via WRANGLER_SCHEMA_PATH).

Output: src/generated/wrangler-types.generated.ts — never hand-edit. Regenerate with bun run generate:wrangler-types.

Released under the Tamer Evaluation License.