{"_id":"@ben-pr-p/kysely-duckdb","name":"@ben-pr-p/kysely-duckdb","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@ben-pr-p/kysely-duckdb","version":"0.2.0","description":"kysely dialect for duckdb","exports":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"},"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"},"keywords":["kysely","kysely-dialect","duckdb"],"author":{"name":"runoshun"},"license":"MIT","devDependencies":{"@duckdb/node-api":"^1.3.4-alpha.27","@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/node-api":"*","kysely":"*"},"_id":"@ben-pr-p/kysely-duckdb@0.2.0","gitHead":"202d415b5e64622e66a70c047d14025801d436f1","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-S6ufZ1iouEbkYVa9ZbsAQsSCwgrnToiQm1wjUNRN1inYhbDsb9CQ5gANwPRV5NcQbomeIIvgI994CWwDrrVB7w==","shasum":"eaff9dc7857ffa520396351f7e33112965c0c0c6","tarball":"https://registry.npmjs.org/@ben-pr-p/kysely-duckdb/-/kysely-duckdb-0.2.0.tgz","fileCount":10,"unpackedSize":97636,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAVhSsIOdL+YMa80vN8pDcBSGMRpbCxDVPAEOE9YNJzfAiAYH7/wJcpRVi2Fxcqvg+1/Gq9UBhAr44wes6sGchNH9w=="}]},"_npmUser":{"name":"ben-pr-p","email":"ben.paul.ryan.packer@gmail.com"},"directories":{},"maintainers":[{"name":"ben-pr-p","email":"ben.paul.ryan.packer@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kysely-duckdb_0.2.0_1758035418194_0.38052869959754676"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-16T15:10:18.110Z","0.2.0":"2025-09-16T15:10:18.360Z","modified":"2025-09-16T15:10:18.625Z"},"maintainers":[{"name":"ben-pr-p","email":"ben.paul.ryan.packer@gmail.com"}],"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\n```bash\n$ npm install --save kysely @duckdb/node-api kysely-duckdb\n```\n\n### Usage\n\n```ts\nimport { DuckDBInstance } from \"@duckdb/node-api\";\nimport { Kysely } from \"kysely\";\nimport { DuckDbDialect } from \"kysely-duckdb\";\n\nconst db = await DuckDBInstance.create(\":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\n\nThe configuration object of `DuckDbDialect` can contain the following properties:\n\n- `database`: A `DuckDBInstance` instance or a function that returns a `Promise` of a `DuckDBInstance` 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```\n","readmeFilename":"README.md","_rev":"1-1e07d1a2450344184f4242b78555dfe3"}