{"version":3,"sources":["../src/miniflare.ts"],"sourcesContent":["/**\n * Miniflare Integration\n *\n * Provides a miniflare-based Durable Object binding for Node.js development/testing.\n * This allows you to use the same MDXDatabase API locally.\n *\n * @example\n * ```ts\n * import { createMiniflareBinding } from '@mdxdb/sqlite/miniflare'\n *\n * const binding = await createMiniflareBinding('./.data')\n * const id = binding.idFromName('example.com')\n * const db = binding.get(id)\n *\n * // Use the same RPC methods\n * await db.create({ ns: 'example.com', type: 'Post', data: { title: 'Hello' } })\n * ```\n *\n * @packageDocumentation\n */\n\n// DurableObjectNamespace, DurableObjectId, DurableObjectStub are global from @cloudflare/workers-types\nimport type {\n  MDXDatabaseRPC,\n  Thing,\n  Artifact,\n  ArtifactType,\n  ActionStatus,\n} from './types.js'\n\n// Miniflare types (we'll import dynamically)\ninterface MiniflareOptions {\n  modules: boolean\n  script?: string\n  scriptPath?: string\n  durableObjects: Record<string, string>\n  durableObjectsPersist?: string\n}\n\ninterface Miniflare {\n  getDurableObjectNamespace(name: string): Promise<DurableObjectNamespace<MDXDatabaseRPC>>\n  dispose(): Promise<void>\n}\n\n// Cache miniflare instance\nlet miniflareInstance: Miniflare | null = null\nlet miniflareBinding: DurableObjectNamespace<MDXDatabaseRPC> | null = null\n\n/**\n * Create a miniflare-based Durable Object binding\n *\n * This creates a local miniflare instance that emulates the Cloudflare Workers\n * runtime with Durable Objects SQLite storage.\n */\nexport async function createMiniflareBinding(\n  persistPath?: string\n): Promise<DurableObjectNamespace<MDXDatabaseRPC>> {\n  // Return cached binding if available\n  if (miniflareBinding) {\n    return miniflareBinding\n  }\n\n  // Dynamic import miniflare and path\n  const { Miniflare: MF } = await import('miniflare')\n  const { fileURLToPath } = await import('node:url')\n  const { dirname, join } = await import('node:path')\n  const { existsSync } = await import('node:fs')\n\n  // Get the path to the durable-object.js file\n  // When running from source (vitest), __dirname is src/\n  // When running from dist, __dirname is dist/\n  const __filename = fileURLToPath(import.meta.url)\n  const __dirname = dirname(__filename)\n\n  // Check if we're running from source (src/) or dist\n  // Miniflare needs the bundled version (no code splitting)\n  let doPath = join(__dirname, 'durable-object.bundled.js')\n  if (!existsSync(doPath)) {\n    // Try dist directory (when running tests from src/)\n    const distPath = join(__dirname, '..', 'dist', 'durable-object.bundled.js')\n    if (existsSync(distPath)) {\n      doPath = distPath\n    } else {\n      throw new Error(\n        `Cannot find durable-object.bundled.js. Tried:\\n  - ${doPath}\\n  - ${distPath}\\n` +\n        `Run 'pnpm build' first if testing with miniflare.`\n      )\n    }\n  }\n\n  // Create miniflare instance with the actual module file\n  // Using type assertion because newer miniflare versions changed the script field to required\n  // but we're using scriptPath which is a valid alternative\n  miniflareInstance = new MF({\n    modules: true,\n    scriptPath: doPath,\n    durableObjects: {\n      MDXDB: {\n        className: 'MDXDatabase',\n        // Enable SQLite for this DO class\n        useSQLite: true,\n      },\n    },\n    durableObjectsPersist: persistPath ?? '.mf/do',\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } as any) as unknown as Miniflare\n\n  // Get the binding\n  miniflareBinding = await miniflareInstance.getDurableObjectNamespace('MDXDB')\n\n  return miniflareBinding\n}\n\n/**\n * Dispose the miniflare instance\n *\n * Call this when you're done to clean up resources.\n */\nexport async function disposeMiniflare(): Promise<void> {\n  if (miniflareInstance) {\n    await miniflareInstance.dispose()\n    miniflareInstance = null\n    miniflareBinding = null\n  }\n}\n\n/**\n * Create a simple in-memory implementation for testing\n *\n * This is a lighter alternative to miniflare for unit tests.\n */\nexport function createInMemoryBinding(): DurableObjectNamespace<MDXDatabaseRPC> {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const instances = new Map<string, any>()\n\n  // Create a simple in-memory SQLite-like storage\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const createInMemoryInstance = (name: string): any => {\n    // Storage maps\n    const things = new Map<string, Record<string, unknown>>()\n    const relationships = new Map<string, Record<string, unknown>>()\n    const search = new Map<string, Record<string, unknown>>()\n    const events = new Map<string, Record<string, unknown>>()\n    const actions = new Map<string, Record<string, unknown>>()\n    const artifacts = new Map<string, Record<string, unknown>>()\n\n    const generateId = () => `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`\n\n    const instance: MDXDatabaseRPC = {\n      // Thing operations\n      async list(options = {}) {\n        let result = Array.from(things.values())\n          .filter((t: Record<string, unknown>) => !t.deleted_at)\n\n        if (options.type) {\n          result = result.filter((t: Record<string, unknown>) => t.type === options.type)\n        }\n        if (options.ns) {\n          result = result.filter((t: Record<string, unknown>) => t.ns === options.ns)\n        }\n\n        // Handle where clause\n        if (options.where) {\n          for (const [key, value] of Object.entries(options.where)) {\n            result = result.filter((t: Record<string, unknown>) => {\n              const data = t.data as Record<string, unknown>\n              return data[key] === value\n            })\n          }\n        }\n\n        // Handle ordering\n        if (options.orderBy) {\n          const orderBy = options.orderBy as string\n          result.sort((a: Record<string, unknown>, b: Record<string, unknown>) => {\n            let aVal: string | number | boolean | null | undefined\n            let bVal: string | number | boolean | null | undefined\n            if (['url', 'ns', 'type', 'id', 'created_at', 'updated_at'].includes(orderBy)) {\n              aVal = a[orderBy] as string | number | boolean | null | undefined\n              bVal = b[orderBy] as string | number | boolean | null | undefined\n            } else {\n              // JSON field\n              aVal = (a.data as Record<string, unknown>)[orderBy] as string | number | boolean | null | undefined\n              bVal = (b.data as Record<string, unknown>)[orderBy] as string | number | boolean | null | undefined\n            }\n            if (aVal === undefined || aVal === null) return 1\n            if (bVal === undefined || bVal === null) return -1\n            if (aVal < bVal) return -1\n            if (aVal > bVal) return 1\n            return 0\n          })\n          if (options.order === 'desc') {\n            result.reverse()\n          }\n        }\n\n        // Handle offset and limit\n        if (options.offset) {\n          result = result.slice(options.offset)\n        }\n        if (options.limit) {\n          result = result.slice(0, options.limit)\n        }\n\n        return result.map((row: Record<string, unknown>) => ({\n          ns: row.ns as string,\n          type: row.type as string,\n          id: row.id as string,\n          url: row.url as string,\n          data: row.data as Record<string, unknown>,\n          content: row.content as string | undefined,\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n        }))\n      },\n\n      async read(url) {\n        const row = things.get(url)\n        if (!row || row.deleted_at) return null\n\n        return {\n          ns: row.ns as string,\n          type: row.type as string,\n          id: row.id as string,\n          url: row.url as string,\n          data: row.data as Record<string, unknown>,\n          content: row.content as string | undefined,\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n        }\n      },\n\n      async readById(type, id) {\n        const url = `https://${name}/${type}/${id}`\n        return instance.read(url)\n      },\n\n      async create(options) {\n        const id = options.id ?? generateId()\n        const url = options.url ?? `https://${options.ns}/${options.type}/${id}`\n        const now = new Date().toISOString()\n\n        if (things.has(url)) {\n          throw new Error(`Thing already exists: ${url}`)\n        }\n\n        const row = {\n          url,\n          ns: options.ns,\n          type: options.type,\n          id,\n          data: options.data,\n          content: options.content ?? '',\n          created_at: now,\n          updated_at: now,\n          deleted_at: null,\n        }\n\n        things.set(url, row)\n\n        return {\n          ns: options.ns,\n          type: options.type,\n          id,\n          url,\n          data: options.data,\n          content: options.content,\n          createdAt: new Date(now),\n          updatedAt: new Date(now),\n        }\n      },\n\n      async update(url, options) {\n        const existing = things.get(url)\n        if (!existing || existing.deleted_at) {\n          throw new Error(`Thing not found: ${url}`)\n        }\n\n        const now = new Date().toISOString()\n        const merged = { ...(existing.data as Record<string, unknown>), ...options.data }\n\n        existing.data = merged\n        existing.updated_at = now\n        if (options.content !== undefined) {\n          existing.content = options.content\n        }\n\n        return {\n          ns: existing.ns as string,\n          type: existing.type as string,\n          id: existing.id as string,\n          url: existing.url as string,\n          data: merged as Record<string, unknown>,\n          content: existing.content as string | undefined,\n          createdAt: new Date(existing.created_at as string),\n          updatedAt: new Date(now),\n        } as Thing\n      },\n\n      async upsert(options) {\n        const id = options.id ?? generateId()\n        const url = options.url ?? `https://${options.ns}/${options.type}/${id}`\n\n        const existing = things.get(url)\n        if (existing && !existing.deleted_at) {\n          return instance.update(url, { data: options.data, content: options.content })\n        }\n\n        return instance.create({ ...options, id, url })\n      },\n\n      async remove(url) {\n        const deleted = things.delete(url)\n        // Also delete relationships\n        for (const [key, rel] of relationships) {\n          if (rel.from_url === url || rel.to_url === url) {\n            relationships.delete(key)\n          }\n        }\n        return deleted\n      },\n\n      async search(options) {\n        const queryLower = options.query.toLowerCase()\n        const all = await instance.list({ type: options.type, limit: options.limit })\n\n        return all.filter(thing => {\n          const searchText = JSON.stringify(thing).toLowerCase()\n          return searchText.includes(queryLower)\n        })\n      },\n\n      // Relationship operations\n      async relate(options) {\n        const id = `rel_${options.from}_${options.type}_${options.to}`\n        const now = new Date().toISOString()\n\n        relationships.set(id, {\n          id,\n          type: options.type,\n          from_url: options.from,\n          to_url: options.to,\n          data: options.data,\n          created_at: now,\n        })\n\n        return {\n          id,\n          type: options.type,\n          from: options.from,\n          to: options.to,\n          data: options.data,\n          createdAt: new Date(now),\n        }\n      },\n\n      async unrelate(from, type, to) {\n        const id = `rel_${from}_${type}_${to}`\n        return relationships.delete(id)\n      },\n\n      async related(url, type, direction) {\n        // Default to 'from' if direction is not specified or undefined\n        const dir = direction ?? 'from'\n        const urls: string[] = []\n\n        for (const rel of relationships.values()) {\n          if (type && rel.type !== type) continue\n\n          // dir='to': Return things this URL points TO (outbound, where from_url = url)\n          if ((dir === 'to' || dir === 'both') && rel.from_url === url) {\n            urls.push(rel.to_url as string)\n          }\n          // dir='from': Return things that point TO this URL (inbound, where to_url = url)\n          if ((dir === 'from' || dir === 'both') && rel.to_url === url) {\n            urls.push(rel.from_url as string)\n          }\n        }\n\n        const result = []\n        for (const u of [...new Set(urls)]) {\n          const thing = await instance.read(u)\n          if (thing) result.push(thing)\n        }\n        return result\n      },\n\n      async relationships(url, type, direction) {\n        // Default to 'both' if direction is not specified or undefined\n        const dir = direction ?? 'both'\n        const result = []\n\n        for (const rel of relationships.values()) {\n          if (type && rel.type !== type) continue\n\n          const matches =\n            (dir === 'from' && rel.from_url === url) ||\n            (dir === 'to' && rel.to_url === url) ||\n            (dir === 'both' && (rel.from_url === url || rel.to_url === url))\n\n          if (matches) {\n            result.push({\n              id: rel.id as string,\n              type: rel.type as string,\n              from: rel.from_url as string,\n              to: rel.to_url as string,\n              data: rel.data as Record<string, unknown> | undefined,\n              createdAt: new Date(rel.created_at as string),\n            })\n          }\n        }\n\n        return result\n      },\n\n      // Vector search (placeholder - requires Vectorize binding in production)\n      async vectorSearch() {\n        return []\n      },\n\n      async setEmbedding() {},\n\n      async upsertEmbeddings() {},\n\n      async deleteVectors() {},\n\n      // Event operations\n      async track(options) {\n        const id = generateId()\n        const now = new Date().toISOString()\n\n        events.set(id, {\n          id,\n          type: options.type,\n          timestamp: now,\n          source: options.source,\n          data: options.data,\n          correlation_id: options.correlationId,\n          causation_id: options.causationId,\n        })\n\n        return {\n          id,\n          type: options.type,\n          timestamp: new Date(now),\n          source: options.source,\n          data: options.data,\n          correlationId: options.correlationId,\n          causationId: options.causationId,\n        }\n      },\n\n      async getEvent(id) {\n        const row = events.get(id)\n        if (!row) return null\n\n        return {\n          id: row.id as string,\n          type: row.type as string,\n          timestamp: new Date(row.timestamp as string),\n          source: row.source as string,\n          data: row.data as Record<string, unknown>,\n          correlationId: row.correlation_id as string | undefined,\n          causationId: row.causation_id as string | undefined,\n        }\n      },\n\n      async queryEvents(options = {}) {\n        let result = Array.from(events.values())\n\n        if (options.type) {\n          result = result.filter((e: Record<string, unknown>) => e.type === options.type)\n        }\n        if (options.source) {\n          result = result.filter((e: Record<string, unknown>) => e.source === options.source)\n        }\n        if (options.limit) {\n          result = result.slice(0, options.limit)\n        }\n\n        return result.map((row: Record<string, unknown>) => ({\n          id: row.id as string,\n          type: row.type as string,\n          timestamp: new Date(row.timestamp as string),\n          source: row.source as string,\n          data: row.data as Record<string, unknown>,\n          correlationId: row.correlation_id as string | undefined,\n          causationId: row.causation_id as string | undefined,\n        }))\n      },\n\n      // Action operations\n      async send(options) {\n        const id = generateId()\n        const now = new Date().toISOString()\n\n        actions.set(id, {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: options.status ?? 'pending',\n          created_at: now,\n          updated_at: now,\n          metadata: options.metadata,\n        })\n\n        return {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: options.status ?? 'pending',\n          createdAt: new Date(now),\n          updatedAt: new Date(now),\n          metadata: options.metadata,\n        }\n      },\n\n      async do(options) {\n        const id = generateId()\n        const now = new Date().toISOString()\n\n        actions.set(id, {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: 'active',\n          created_at: now,\n          updated_at: now,\n          started_at: now,\n          metadata: options.metadata,\n        })\n\n        return {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: 'active',\n          createdAt: new Date(now),\n          updatedAt: new Date(now),\n          startedAt: new Date(now),\n          metadata: options.metadata,\n        }\n      },\n\n      async getAction(id) {\n        const row = actions.get(id)\n        if (!row) return null\n\n        return {\n          id: row.id as string,\n          actor: row.actor as string,\n          object: row.object as string,\n          action: row.action as string,\n          status: row.status as 'pending' | 'active' | 'completed' | 'failed' | 'cancelled',\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n          startedAt: row.started_at ? new Date(row.started_at as string) : undefined,\n          completedAt: row.completed_at ? new Date(row.completed_at as string) : undefined,\n          result: row.result,\n          error: row.error as string | undefined,\n          metadata: row.metadata as Record<string, unknown> | undefined,\n        }\n      },\n\n      async queryActions(options = {}) {\n        let result = Array.from(actions.values())\n\n        if (options.actor) {\n          result = result.filter((a: Record<string, unknown>) => a.actor === options.actor)\n        }\n        if (options.status) {\n          const statuses = Array.isArray(options.status) ? options.status : [options.status]\n          result = result.filter((a: Record<string, unknown>) => statuses.includes(a.status as ActionStatus))\n        }\n        if (options.limit) {\n          result = result.slice(0, options.limit)\n        }\n\n        return result.map((row: Record<string, unknown>) => ({\n          id: row.id as string,\n          actor: row.actor as string,\n          object: row.object as string,\n          action: row.action as string,\n          status: row.status as 'pending' | 'active' | 'completed' | 'failed' | 'cancelled',\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n          startedAt: row.started_at ? new Date(row.started_at as string) : undefined,\n          completedAt: row.completed_at ? new Date(row.completed_at as string) : undefined,\n          result: row.result,\n          error: row.error as string | undefined,\n          metadata: row.metadata as Record<string, unknown> | undefined,\n        }))\n      },\n\n      async startAction(id) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'active'\n        row.started_at = now\n        row.updated_at = now\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      async completeAction(id, result) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'completed'\n        row.completed_at = now\n        row.updated_at = now\n        row.result = result\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      async failAction(id, error) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'failed'\n        row.completed_at = now\n        row.updated_at = now\n        row.error = error\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      async cancelAction(id) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'cancelled'\n        row.completed_at = now\n        row.updated_at = now\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      // Artifact operations\n      async storeArtifact(options) {\n        const now = new Date().toISOString()\n        const expiresAt = options.ttl\n          ? new Date(Date.now() + options.ttl).toISOString()\n          : undefined\n\n        artifacts.set(options.key, {\n          key: options.key,\n          type: options.type,\n          source: options.source,\n          source_hash: options.sourceHash,\n          created_at: now,\n          expires_at: expiresAt,\n          content: options.content,\n          metadata: options.metadata,\n        })\n\n        return {\n          key: options.key,\n          type: options.type,\n          source: options.source,\n          sourceHash: options.sourceHash,\n          createdAt: new Date(now),\n          expiresAt: expiresAt ? new Date(expiresAt) : undefined,\n          content: options.content,\n          metadata: options.metadata,\n        }\n      },\n\n      async getArtifact(key) {\n        const row = artifacts.get(key)\n        if (!row) return null\n\n        if (row.expires_at && new Date(row.expires_at as string) < new Date()) {\n          artifacts.delete(key)\n          return null\n        }\n\n        return {\n          key: row.key as string,\n          type: row.type as ArtifactType,\n          source: row.source as string,\n          sourceHash: row.source_hash as string,\n          createdAt: new Date(row.created_at as string),\n          expiresAt: row.expires_at ? new Date(row.expires_at as string) : undefined,\n          content: row.content,\n          metadata: row.metadata as Record<string, unknown> | undefined,\n        } as Artifact\n      },\n\n      async getArtifactBySource(source, type) {\n        for (const row of artifacts.values()) {\n          if (row.source === source && row.type === type) {\n            return instance.getArtifact(row.key as string)\n          }\n        }\n        return null\n      },\n\n      async deleteArtifact(key) {\n        return artifacts.delete(key)\n      },\n\n      async cleanExpiredArtifacts() {\n        const now = new Date()\n        let count = 0\n\n        for (const [key, row] of artifacts) {\n          if (row.expires_at && new Date(row.expires_at as string) < now) {\n            artifacts.delete(key)\n            count++\n          }\n        }\n\n        return count\n      },\n\n      // Database info\n      getDatabaseSize() {\n        return 0\n      },\n\n      getNamespace() {\n        return name\n      },\n    }\n\n    return instance\n  }\n\n  return {\n    idFromName(name: string): DurableObjectId {\n      return { toString: () => name, name }\n    },\n\n    idFromString(id: string): DurableObjectId {\n      return { toString: () => id }\n    },\n\n    newUniqueId(): DurableObjectId {\n      const id = `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`\n      return { toString: () => id }\n    },\n\n    get(id: DurableObjectId): DurableObjectStub<MDXDatabaseRPC> {\n      const name = id.name ?? id.toString()\n\n      if (!instances.has(name)) {\n        instances.set(name, createInMemoryInstance(name))\n      }\n\n      const instance = instances.get(name)!\n\n      return {\n        ...instance,\n        id,\n        name,\n      } as DurableObjectStub<MDXDatabaseRPC>\n    },\n  }\n}\n"],"mappings":"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","names":[]}