{"_id":"@20chan/kysely-duckdb","name":"@20chan/kysely-duckdb","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@20chan/kysely-duckdb","version":"0.1.0","description":"kysely dialect for duckdb","exports":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"},"keywords":["kysely","kysely-dialect","duckdb"],"author":{"name":"runoshun"},"license":"MIT","devDependencies":{"@tsconfig/node18":"^18.2.2","@types/jest":"^29.5.5","@types/node":"^20.7.0","dprint":"^0.41.0","jest":"^29.7.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","tsup":"^7.2.0","typedoc":"^0.25.1","typescript":"^5.2.2"},"peerDependencies":{"duckdb":"*","kysely":"*"},"scripts":{"test":"jest","build":"rimraf ./dist && tsup src/index.ts --format cjs,esm --dts --sourcemap","check":"tsc --noEmit","docs":"typedoc src/index.ts","all":"npm run check && npm run test && npm run build && npm run docs"},"_id":"@20chan/kysely-duckdb@0.1.0","_integrity":"sha512-5D7LMOwu+7G9AWKbfJ6Y3ctNbOyMWKU1ATDirJrRIWm3ILYzk2oy8nQ48N0zfZJmFjB/Zuayur4Yp8QpqER+GQ==","_resolved":"/tmp/c794764102f0a22779cf6ea73852a980/20chan-kysely-duckdb-0.1.0.tgz","_from":"file:20chan-kysely-duckdb-0.1.0.tgz","_nodeVersion":"18.18.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-5D7LMOwu+7G9AWKbfJ6Y3ctNbOyMWKU1ATDirJrRIWm3ILYzk2oy8nQ48N0zfZJmFjB/Zuayur4Yp8QpqER+GQ==","shasum":"e0c86ebdff9f6a4e39025fc0516e3ba458de7d1c","tarball":"https://registry.npmjs.org/@20chan/kysely-duckdb/-/kysely-duckdb-0.1.0.tgz","fileCount":9,"unpackedSize":78962,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA+q3zjB/gU4g/n7tqLEiyF05+8Ppc/7XQq0Fi8eqMjPAiAZDgnP/Mh1QX37EJs3XUHpRFyGpLZyonMcwpVLdQyCIw=="}]},"_npmUser":{"name":"20chan","email":"2@0chan.dev"},"directories":{},"maintainers":[{"name":"20chan","email":"2@0chan.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kysely-duckdb_0.1.0_1737010115731_0.8443636888394888"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-16T06:48:35.607Z","0.1.0":"2025-01-16T06:48:35.904Z","modified":"2025-01-16T06:48:36.168Z"},"maintainers":[{"name":"20chan","email":"2@0chan.dev"}],"description":"kysely dialect for duckdb","keywords":["kysely","kysely-dialect","duckdb"],"author":{"name":"runoshun"},"license":"MIT","readme":"## Kysely Dialect for DuckDB\n\n[![test](https://github.com/runoshun/kysely-duckdb/actions/workflows/test.yml/badge.svg)](https://github.com/runoshun/kysely-duckdb/actions/workflows/test.yml)\n\nThis dialect allows you to use [Kysely](https://kysely.dev/) with [DuckDB](https://duckdb.org/).\nPlease see following instructions and [API Reference](https://runoshun.github.io/kysely-duckdb/).\n\n### Installation\n```bash\n$ npm install --save kysely duckdb kysely-duckdb\n```\n\n### Usage\n\n```ts\nimport * as duckdb from \"duckdb\";\nimport { Kysely } from \"kysely\";\nimport { DuckDbDialect } from \"kysely-duckdb\"\n\nconst db = new duckdb.Database(\":memory:\");\nconst duckdbDialect = new DuckDbDialect({\n  database: db,\n  tableMappings: {\n    person:\n      `read_json('./person.json', columns={\"first_name\": \"STRING\", \"gender\": \"STRING\", \"last_name\": \"STRING\"})`,\n  },\n});\nconst kysely = new Kysely<DatabaseSchema>({ dialect: duckdbDialect });\nconst res = await kysely.selectFrom(\"person\").selectAll().execute();\n```\n\n### Configrations\nThe configuration object of `DuckDbDialect` can contain the following properties:\n\n* `database`: A `duckdb.Database` instance or a function that returns a `Promise` of a `duckdb.Database` instance.\n* `tableMappings`: A mapping of table names in Kysely to DuckDB table expressions. This is useful if you want to use DuckDB's external data sources, such as JSON files or CSV files.\n\n### DuckDB DataTypes Supports (Experimental Feature)\n\nDuckDB supports various data types like arrays, structs, blobs and more.\nKysely has not built in supports for these types, but it can handle almost\nof these using [raw SQL](https://kysely.dev/docs/recipes/raw-sql) feature.\n\nThis package includes some shallow helper for these types. \n\n```ts\nimport type { DuckDBNodeDataTypes } from \"kysely-duckdb\";\nimport { datatypes } from \"kysely-dockdb\";\n\n// DuckDBNodeDataTypes: type mappings for table schema\nexport interface Database {\n  t1: {\n    int_list: number[];\n    string_list: string[];\n    map1: DuckDBNodeDataTypes[\"MAP\"]; // `map` is alias of string now. The returned value from duckdb is like '{a=1,b=2}'\n    struct1: {\n      x: number;\n      y: string;\n    };\n    bitstring1: DuckDBNodeDataTypes[\"BIT\"];\n    blob1: DuckDBNodeDataTypes[\"BLOB\"];\n    bool1: DuckDBNodeDataTypes[\"BOOLEAN\"];\n    date1: DuckDBNodeDataTypes[\"DATE\"];\n    timestamp1: DuckDBNodeDataTypes[\"TIMESTAMP\"];\n    timestamptz1: DuckDBNodeDataTypes[\"TIMESTAMPTZ\"];\n    interval1: DuckDBNodeDataTypes[\"INTERVAL\"];\n  };\n}\n\n...\n\n// datatypes: type constructors\nconst kysely = new Kysely<Database>({dialect: duckDbDialect});\nawait kysely\n  .insertInto(\"t1\")\n  .values([{\n    int_list: datatypes.list([3, 4, 5]),\n    string_list: datatypes.list([\"d\", \"e\", \"f\"]),\n    map1: types.map([[1, 2], [3, 4]]),\n    struct1: datatypes.struct({\n      x: sql`${1}`,\n      y: sql`${\"aaa\"}`,\n    }),\n    bitstring1: datatypes.bit(\"010101\"),\n    blob1: datatypes.blob(Buffer.from([0xBB, 0xCC])),\n    bool1: true,\n    date1: datatypes.date(new Date()),\n    timestamp1: datatypes.timestamp(new Date()),\n    timestamptz1: datatypes.timestamptz(new Date().toISOString().slice(0, -1) + \"+03:00\"),\n    interval1: sql`INTERVAL 1 YEAR`,\n  }])\n  .execute();\n```","readmeFilename":"README.md"}