branch: main
mf.ts
3479 bytesRaw
import { Miniflare, Response } from "miniflare";
import { MockAgent } from "undici";

const mockAgent = new MockAgent();

mockAgent
  .get("https://cloudflare.com")
  .intercept({ path: "/" })
  .reply(200, "cloudflare!");

mockAgent
  .get("https://miniflare.mocks")
  .intercept({ path: "/delay" })
  .reply(200, "cloudflare!")
  .delay(10000);

mockAgent
  .get("https://jsonplaceholder.typicode.com")
  .intercept({ path: "/todos/1" })
  .reply(
    200,
    {
      userId: 1,
      id: 1,
      title: "delectus aut autem",
      completed: false,
    },
    {
      headers: {
        "content-type": "application/json",
      },
    }
  );

const mf_instance = new Miniflare({
  d1Persist: false,
  kvPersist: false,
  r2Persist: false,
  cachePersist: false,
  workers: [
    {
      scriptPath: "./build/index.js",
      compatibilityDate: "2025-07-24",
      cache: true,
      d1Databases: ["DB"],
      modules: true,
      modulesRules: [
        { type: "CompiledWasm", include: ["**/*.wasm"], fallthrough: true },
      ],
      bindings: {
        EXAMPLE_SECRET: "example",
        SOME_SECRET: "secret!",
        SOME_VARIABLE: "some value",
        SOME_OBJECT_VARIABLE: {
          foo: 42,
          bar: "string"
        },
      },
      durableObjects: {
        COUNTER: "Counter",
        PUT_RAW_TEST_OBJECT: "PutRawTestObject",
        AUTO: "AutoResponseObject",
        MY_CLASS: "MyClass",
        ECHO_CONTAINER: {
          className: "EchoContainer",
          useSQLite: true,
          container: {
            imageName: "worker-dev/echocontainer:latest",
          }
        },
        SQL_COUNTER: {
          className: "SqlCounter",
          useSQLite: true,
        },
        SQL_ITERATOR: {
          className: "SqlIterator",
          useSQLite: true,
        },
      },
      kvNamespaces: ["SOME_NAMESPACE", "FILE_SIZES", "TEST"],
      serviceBindings: {
        async remote() {
          return new Response("hello world");
        },
      },
      r2Buckets: ["EMPTY_BUCKET", "PUT_BUCKET", "SEEDED_BUCKET", "DELETE_BUCKET"],
      queueConsumers: {
        my_queue: {
          maxBatchTimeout: 1,
        },
      },
      queueProducers: ["my_queue", "my_queue"],
      fetchMock: mockAgent,
      assets: {
        directory: "./public",
        binding: "ASSETS",
        routerConfig: {
          has_user_worker: true
        }
      },
      secretsStoreSecrets: {
        SECRETS: {
          store_id: "SECRET_STORE",
          secret_name: "secret-name"
        },
        MISSING_SECRET: {
          store_id: "SECRET_STORE_MISSING",
          secret_name: "missing-secret"
        }
      },
      wrappedBindings: {
        HTTP_ANALYTICS: {
          scriptName: "mini-analytics-engine" // mock out analytics engine binding to the "mini-analytics-engine" worker
        }
      },
      ratelimits: {
        TEST_RATE_LIMITER: {
          simple: {
            limit: 10,
            period: 60,
          }
        }
      }
    },
    {
      name: "mini-analytics-engine",
      modules: true,
      script: `export default function (env) {
        return {
          writeDataPoint(data) {
            console.log(data)
          }
        }
      }`
    }]
});

// Seed the secret store with a value using the new API
const secretAPI = await mf_instance.getSecretsStoreSecretAPI("SECRETS");
await secretAPI().create("secret value");

export const mf = mf_instance;
export const mfUrl = await mf.ready;