{"_id":"turso.do","name":"turso.do","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"turso.do","version":"0.0.1","description":"Managed service client for Turso-compatible SQLite on Cloudflare","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc","test":"vitest run","test:watch":"vitest"},"keywords":["turso","libsql","sqlite","cloudflare","durable-objects","managed-service"],"author":{"name":"Nathan Clevenger"},"license":"MIT","dependencies":{"@dotdo/turso":"0.0.1"},"devDependencies":{"typescript":"^5.3.3","vitest":"^2.0.0"},"_id":"turso.do@0.0.1","gitHead":"77fd4d165205fb7aae603a74d207c71b7b8a45c2","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-dUBIpqloPuusbWyEDZQ9DQLE30ekWv+VyYOl6cx/8+p7YGzDFdJWCefDYaHU+xAK/411Ijv8WAYf02044vg6qw==","shasum":"33b592cc86342f413d73dfa8ef97c0b72a60509a","tarball":"https://registry.npmjs.org/turso.do/-/turso.do-0.0.1.tgz","fileCount":6,"unpackedSize":22163,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCID8BgB6C2BF10c02g5GY3yfFGl4KF0+rF9JcslNfX+2VAiEAz1NtwddCywa6GAeW/AlU9A4V9FpLUWLbY9ystYGRJR4="}]},"_npmUser":{"name":"nathanclevenger","email":"nateclev@gmail.com"},"directories":{},"maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/turso.do_0.0.1_1769079775673_0.9441526155551092"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-22T11:02:55.611Z","0.0.1":"2026-01-22T11:02:55.820Z","modified":"2026-01-22T11:02:55.973Z"},"maintainers":[{"name":"nathanclevenger","email":"nateclev@gmail.com"}],"description":"Managed service client for Turso-compatible SQLite on Cloudflare","keywords":["turso","libsql","sqlite","cloudflare","durable-objects","managed-service"],"author":{"name":"Nathan Clevenger"},"license":"MIT","readme":"# turso.do\n\n[![npm version](https://img.shields.io/npm/v/turso.do.svg)](https://www.npmjs.com/package/turso.do)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](../../LICENSE)\n\n**The simplest way to use SQLite at the edge.**\n\nYou want a database. Not a deployment pipeline. Not a configuration nightmare. Not another service to manage.\n\n**Just write SQL.**\n\n## The Problem\n\nSetting up edge databases is complicated. Durable Objects require configuration. Storage needs provisioning. Authentication demands attention. You wanted to build your app, not wrestle with infrastructure.\n\n## The Solution\n\n`turso.do` is SQLite that just works. One import. One line. Done.\n\n```typescript\nimport { sql } from 'turso.do'\n\nconst users = await sql`SELECT * FROM users WHERE active = ${true}`\n```\n\nNo setup. No configuration. No infrastructure. Just your data, everywhere, fast.\n\n## Installation\n\n```bash\nnpm install turso.do\n```\n\n## Quick Start\n\n### Tagged Template Queries\n\nThe fastest way to query:\n\n```typescript\nimport { sql, createDatabase } from 'turso.do'\n\n// Use the default database\nconst users = await sql`SELECT * FROM users`\n\n// Parameterized queries are automatic and safe\nconst user = await sql`SELECT * FROM users WHERE email = ${email}`\n\n// Joins, subqueries, everything works\nconst posts = await sql`\n  SELECT p.*, u.name as author_name\n  FROM posts p\n  JOIN users u ON p.author_id = u.id\n  WHERE p.published = ${true}\n  ORDER BY p.created_at DESC\n  LIMIT ${10}\n`\n```\n\n### Named Databases\n\nCreate isolated databases for different purposes:\n\n```typescript\nimport { createDatabase } from 'turso.do'\n\nconst analytics = createDatabase('analytics')\nconst userDb = createDatabase('users')\n\nawait analytics.sql`INSERT INTO events (name, data) VALUES (${'pageview'}, ${JSON.stringify(data)})`\nawait userDb.sql`UPDATE users SET last_seen = datetime('now') WHERE id = ${userId}`\n```\n\n### Transactions\n\nACID transactions with a clean API:\n\n```typescript\nimport { createDatabase } from 'turso.do'\n\nconst db = createDatabase('my-app')\n\nawait db.transaction(async (tx) => {\n  // Create an order\n  const order = await tx.sql`\n    INSERT INTO orders (user_id, total)\n    VALUES (${userId}, ${total})\n    RETURNING id\n  `\n\n  // Add line items\n  for (const item of items) {\n    await tx.sql`\n      INSERT INTO order_items (order_id, product_id, quantity, price)\n      VALUES (${order[0].id}, ${item.productId}, ${item.quantity}, ${item.price})\n    `\n  }\n\n  // Decrement inventory\n  for (const item of items) {\n    await tx.sql`\n      UPDATE products\n      SET inventory = inventory - ${item.quantity}\n      WHERE id = ${item.productId}\n    `\n  }\n})\n```\n\n### Batch Operations\n\nMultiple queries, single roundtrip:\n\n```typescript\nimport { createDatabase } from 'turso.do'\n\nconst db = createDatabase('my-app')\n\nconst [users, posts, comments] = await db.batch([\n  sql`SELECT COUNT(*) as count FROM users`,\n  sql`SELECT COUNT(*) as count FROM posts WHERE published = ${true}`,\n  sql`SELECT COUNT(*) as count FROM comments WHERE created_at > datetime('now', '-24 hours')`\n])\n```\n\n## Schema Management\n\n### Create Tables\n\n```typescript\nimport { sql } from 'turso.do'\n\nawait sql`\n  CREATE TABLE IF NOT EXISTS users (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    email TEXT UNIQUE NOT NULL,\n    name TEXT,\n    created_at TEXT DEFAULT (datetime('now'))\n  )\n`\n\nawait sql`\n  CREATE TABLE IF NOT EXISTS posts (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    author_id INTEGER NOT NULL REFERENCES users(id),\n    title TEXT NOT NULL,\n    content TEXT,\n    published BOOLEAN DEFAULT false,\n    created_at TEXT DEFAULT (datetime('now'))\n  )\n`\n\nawait sql`CREATE INDEX IF NOT EXISTS idx_posts_author ON posts(author_id)`\n```\n\n### Migrations\n\n```typescript\nimport { createDatabase } from 'turso.do'\n\nconst db = createDatabase('my-app')\n\n// Check current version\nconst [{ version }] = await db.sql`PRAGMA user_version`\n\nif (version < 1) {\n  await db.sql`ALTER TABLE users ADD COLUMN avatar_url TEXT`\n  await db.sql`PRAGMA user_version = 1`\n}\n\nif (version < 2) {\n  await db.sql`CREATE TABLE notifications (...)`\n  await db.sql`PRAGMA user_version = 2`\n}\n```\n\n## Real-World Examples\n\n### User Authentication\n\n```typescript\nimport { sql } from 'turso.do'\n\nexport async function createUser(email: string, passwordHash: string) {\n  const [user] = await sql`\n    INSERT INTO users (email, password_hash)\n    VALUES (${email}, ${passwordHash})\n    RETURNING id, email, created_at\n  `\n  return user\n}\n\nexport async function verifyUser(email: string) {\n  const [user] = await sql`\n    SELECT id, email, password_hash\n    FROM users\n    WHERE email = ${email}\n  `\n  return user\n}\n```\n\n### API Endpoint\n\n```typescript\nimport { sql } from 'turso.do'\n\nexport default {\n  async fetch(request: Request) {\n    const url = new URL(request.url)\n\n    if (url.pathname === '/api/posts') {\n      const posts = await sql`\n        SELECT id, title, created_at\n        FROM posts\n        WHERE published = ${true}\n        ORDER BY created_at DESC\n        LIMIT 20\n      `\n      return Response.json(posts)\n    }\n\n    return new Response('Not Found', { status: 404 })\n  }\n}\n```\n\n### Real-Time Analytics\n\n```typescript\nimport { sql, createDatabase } from 'turso.do'\n\nconst analytics = createDatabase('analytics')\n\nexport async function trackEvent(event: string, properties: object) {\n  await analytics.sql`\n    INSERT INTO events (name, properties, timestamp)\n    VALUES (${event}, ${JSON.stringify(properties)}, ${Date.now()})\n  `\n}\n\nexport async function getDailyStats(date: string) {\n  return analytics.sql`\n    SELECT\n      name,\n      COUNT(*) as count,\n      COUNT(DISTINCT json_extract(properties, '$.user_id')) as unique_users\n    FROM events\n    WHERE date(timestamp/1000, 'unixepoch') = ${date}\n    GROUP BY name\n    ORDER BY count DESC\n  `\n}\n```\n\n## API Reference\n\n### `sql` Template Tag\n\nExecute queries with automatic parameter binding:\n\n```typescript\nimport { sql } from 'turso.do'\n\n// Parameters are automatically escaped\nconst results = await sql`SELECT * FROM users WHERE name = ${name}`\n```\n\n### `createDatabase(name)`\n\nCreate or connect to a named database:\n\n```typescript\nimport { createDatabase } from 'turso.do'\n\nconst db = createDatabase('my-database')\n\n// db.sql - tagged template queries\n// db.execute - raw query execution\n// db.batch - batched queries\n// db.transaction - ACID transactions\n```\n\n### `db.transaction(fn)`\n\nExecute a function within a transaction:\n\n```typescript\nawait db.transaction(async (tx) => {\n  await tx.sql`INSERT INTO ...`\n  await tx.sql`UPDATE ...`\n  // Automatically committed on success, rolled back on error\n})\n```\n\n### `db.batch(queries)`\n\nExecute multiple queries in a single roundtrip:\n\n```typescript\nconst results = await db.batch([\n  sql`SELECT * FROM users`,\n  sql`SELECT * FROM posts`\n])\n```\n\n## Configuration\n\n### Environment Variables\n\n```bash\nTURSO_DO_AUTH_TOKEN=your-auth-token  # Optional: for authenticated access\nTURSO_DO_DATABASE=my-app             # Optional: default database name\n```\n\n### Custom Configuration\n\n```typescript\nimport { createDatabase } from 'turso.do'\n\nconst db = createDatabase('my-app', {\n  authToken: process.env.AUTH_TOKEN,\n  baseUrl: 'https://custom.turso.do'\n})\n```\n\n## Why turso.do?\n\n| Feature | turso.do | Traditional DB |\n|---------|----------|----------------|\n| Setup time | 0 minutes | 30+ minutes |\n| Cold starts | None | Connection timeouts |\n| Global latency | < 10ms | 50ms+ |\n| Connection limits | Unlimited | Pool exhaustion |\n| Scaling | Automatic | Manual configuration |\n\n## Links\n\n- [Documentation](https://turso.do/docs)\n- [GitHub Repository](https://github.com/dotdo-io/sqlite)\n- [API Reference](https://turso.do/docs/api)\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-140089ce8e8d4942c750ea002ffb0990"}