@frictionless-ts/database 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +9 -0
- package/README.md +3 -0
- package/build/adapters/base.d.ts +20 -0
- package/build/adapters/base.js +66 -0
- package/build/adapters/create.d.ts +5 -0
- package/build/adapters/create.js +17 -0
- package/build/adapters/mysql.d.ts +10 -0
- package/build/adapters/mysql.js +90 -0
- package/build/adapters/mysql.spec.d.ts +1 -0
- package/build/adapters/mysql.spec.js +170 -0
- package/build/adapters/postgresql.d.ts +10 -0
- package/build/adapters/postgresql.js +100 -0
- package/build/adapters/postgresql.spec.d.ts +1 -0
- package/build/adapters/postgresql.spec.js +170 -0
- package/build/adapters/sqlite.bun.d.ts +2 -0
- package/build/adapters/sqlite.bun.js +7 -0
- package/build/adapters/sqlite.d.ts +11 -0
- package/build/adapters/sqlite.js +57 -0
- package/build/adapters/sqlite.node.d.ts +2 -0
- package/build/adapters/sqlite.node.js +43 -0
- package/build/adapters/sqlite.spec.d.ts +1 -0
- package/build/adapters/sqlite.spec.js +252 -0
- package/build/field/Field.d.ts +3 -0
- package/build/field/Field.js +2 -0
- package/build/field/Type.d.ts +2 -0
- package/build/field/Type.js +2 -0
- package/build/field/index.d.ts +2 -0
- package/build/field/index.js +2 -0
- package/build/index.d.ts +6 -0
- package/build/index.js +7 -0
- package/build/package/index.d.ts +2 -0
- package/build/package/index.js +3 -0
- package/build/package/load.d.ts +7 -0
- package/build/package/load.js +30 -0
- package/build/package/save.d.ts +10 -0
- package/build/package/save.js +28 -0
- package/build/plugin.d.ts +15 -0
- package/build/plugin.js +54 -0
- package/build/plugin.spec.d.ts +1 -0
- package/build/plugin.spec.js +328 -0
- package/build/resource/Format.d.ts +1 -0
- package/build/resource/Format.js +2 -0
- package/build/resource/index.d.ts +1 -0
- package/build/resource/index.js +2 -0
- package/build/schema/Schema.d.ts +4 -0
- package/build/schema/Schema.js +2 -0
- package/build/schema/index.d.ts +2 -0
- package/build/schema/index.js +2 -0
- package/build/schema/infer.d.ts +4 -0
- package/build/schema/infer.js +24 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +25 -0
- package/build/table/index.d.ts +2 -0
- package/build/table/index.js +3 -0
- package/build/table/load.d.ts +6 -0
- package/build/table/load.js +29 -0
- package/build/table/load.spec.d.ts +1 -0
- package/build/table/load.spec.js +24 -0
- package/build/table/save.d.ts +4 -0
- package/build/table/save.js +57 -0
- package/build/table/save.spec.d.ts +1 -0
- package/build/table/save.spec.js +20 -0
- package/package.json +45 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { useRecording } from "vitest-polly";
|
|
4
|
+
import { loadPackageFromDatabase } from "../package/index.js";
|
|
5
|
+
import { inferDatabaseSchema } from "../schema/index.js";
|
|
6
|
+
import { loadDatabaseTable, saveDatabaseTable } from "../table/index.js";
|
|
7
|
+
import { createAdapter } from "./create.js";
|
|
8
|
+
useRecording();
|
|
9
|
+
const path = process.env.DPKIT_POSTGRESQL_URL;
|
|
10
|
+
// Vitest runs in-file tests sequentially so we can use the same table
|
|
11
|
+
const dialect = { table: "dpkit" };
|
|
12
|
+
const record1 = { id: 1, name: "english" };
|
|
13
|
+
const record2 = { id: 2, name: "中文" };
|
|
14
|
+
describe.skipIf(!path)("PostgresqlAdapter", () => {
|
|
15
|
+
if (!path)
|
|
16
|
+
return;
|
|
17
|
+
it("should infer schema", async () => {
|
|
18
|
+
const source = pl
|
|
19
|
+
.DataFrame([
|
|
20
|
+
pl.Series("string", ["string"], pl.Utf8),
|
|
21
|
+
pl.Series("integer", [1], pl.Int32),
|
|
22
|
+
pl.Series("number", [1.1], pl.Float64),
|
|
23
|
+
])
|
|
24
|
+
.lazy();
|
|
25
|
+
await saveDatabaseTable(source, {
|
|
26
|
+
path,
|
|
27
|
+
dialect,
|
|
28
|
+
format: "postgresql",
|
|
29
|
+
overwrite: true,
|
|
30
|
+
});
|
|
31
|
+
const schema = await inferDatabaseSchema({
|
|
32
|
+
path,
|
|
33
|
+
dialect,
|
|
34
|
+
format: "postgresql",
|
|
35
|
+
});
|
|
36
|
+
expect(schema).toEqual({
|
|
37
|
+
fields: [
|
|
38
|
+
{ name: "string", type: "string" },
|
|
39
|
+
{ name: "integer", type: "integer" },
|
|
40
|
+
{ name: "number", type: "number" },
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it("should save/load table", async () => {
|
|
45
|
+
const source = pl.DataFrame([record1, record2]).lazy();
|
|
46
|
+
await saveDatabaseTable(source, {
|
|
47
|
+
path,
|
|
48
|
+
dialect,
|
|
49
|
+
format: "postgresql",
|
|
50
|
+
overwrite: true,
|
|
51
|
+
});
|
|
52
|
+
const target = await loadDatabaseTable({
|
|
53
|
+
path,
|
|
54
|
+
dialect,
|
|
55
|
+
format: "postgresql",
|
|
56
|
+
});
|
|
57
|
+
expect((await target.collect()).toRecords()).toEqual([record1, record2]);
|
|
58
|
+
});
|
|
59
|
+
it("should save/load table with various data types", async () => {
|
|
60
|
+
const source = pl
|
|
61
|
+
.DataFrame([
|
|
62
|
+
pl.Series("array", ["[1, 2, 3]"], pl.String),
|
|
63
|
+
pl.Series("boolean", [true], pl.Bool),
|
|
64
|
+
pl.Series("date", [new Date(Date.UTC(2025, 0, 1))], pl.Date),
|
|
65
|
+
pl.Series("datetime", [new Date(Date.UTC(2025, 0, 1))], pl.Datetime),
|
|
66
|
+
pl.Series("duration", ["P23DT23H"], pl.String),
|
|
67
|
+
pl.Series("geojson", ['{"value": 1}'], pl.String),
|
|
68
|
+
pl.Series("geopoint", [[40.0, 50.0]], pl.List(pl.Float32)),
|
|
69
|
+
pl.Series("integer", [1], pl.Int32),
|
|
70
|
+
pl.Series("list", [[1.0, 2.0, 3.0]], pl.List(pl.Float32)),
|
|
71
|
+
pl.Series("number", [1.1], pl.Float64),
|
|
72
|
+
pl.Series("object", ['{"value": 1}']),
|
|
73
|
+
pl.Series("string", ["string"], pl.String),
|
|
74
|
+
pl.Series("time", [new Date(Date.UTC(2025, 0, 1))], pl.Time),
|
|
75
|
+
pl.Series("year", [2025], pl.Int32),
|
|
76
|
+
pl.Series("yearmonth", [[2025, 1]], pl.List(pl.Int16)),
|
|
77
|
+
])
|
|
78
|
+
.lazy();
|
|
79
|
+
await saveDatabaseTable(source, {
|
|
80
|
+
path,
|
|
81
|
+
dialect,
|
|
82
|
+
format: "postgresql",
|
|
83
|
+
overwrite: true,
|
|
84
|
+
fieldTypes: {
|
|
85
|
+
geojson: "geojson",
|
|
86
|
+
geopoint: "geopoint",
|
|
87
|
+
list: "list",
|
|
88
|
+
object: "object",
|
|
89
|
+
// TODO: Remove time after:
|
|
90
|
+
// https://github.com/pola-rs/nodejs-polars/issues/364
|
|
91
|
+
time: "time",
|
|
92
|
+
year: "year",
|
|
93
|
+
yearmonth: "yearmonth",
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
const target = await loadDatabaseTable({ path, dialect, format: "postgresql" }, { denormalized: true });
|
|
97
|
+
expect((await target.collect()).toRecords()).toEqual([
|
|
98
|
+
{
|
|
99
|
+
array: "[1, 2, 3]",
|
|
100
|
+
boolean: true,
|
|
101
|
+
date: "2025-01-01",
|
|
102
|
+
datetime: new Date(Date.UTC(2025, 0, 1)),
|
|
103
|
+
duration: "P23DT23H",
|
|
104
|
+
geojson: '{"value": 1}',
|
|
105
|
+
geopoint: "40.0,50.0",
|
|
106
|
+
integer: 1,
|
|
107
|
+
list: "1.0,2.0,3.0",
|
|
108
|
+
number: 1.1,
|
|
109
|
+
object: '{"value": 1}',
|
|
110
|
+
string: "string",
|
|
111
|
+
time: "00:00:00",
|
|
112
|
+
year: 2025,
|
|
113
|
+
yearmonth: "2025-01",
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
});
|
|
117
|
+
it("should load package from database", async () => {
|
|
118
|
+
const adapter = createAdapter("postgresql");
|
|
119
|
+
const database = await adapter.connectDatabase(path);
|
|
120
|
+
await database.schema.dropTable("table1").ifExists().execute();
|
|
121
|
+
await database.schema
|
|
122
|
+
.createTable("table1")
|
|
123
|
+
.ifNotExists()
|
|
124
|
+
.addColumn("id", "integer", column => column.notNull())
|
|
125
|
+
.addColumn("name", "text")
|
|
126
|
+
.execute();
|
|
127
|
+
await database.schema.dropTable("table2").ifExists().execute();
|
|
128
|
+
await database.schema
|
|
129
|
+
.createTable("table2")
|
|
130
|
+
.ifNotExists()
|
|
131
|
+
.addColumn("id", "integer", column => column.notNull())
|
|
132
|
+
.addColumn("number", "numeric")
|
|
133
|
+
.addColumn("datetime", "timestamp")
|
|
134
|
+
.execute();
|
|
135
|
+
const datapackage = await loadPackageFromDatabase(path, {
|
|
136
|
+
format: "postgresql",
|
|
137
|
+
includeTables: ["table1", "table2"],
|
|
138
|
+
});
|
|
139
|
+
expect(datapackage).toEqual({
|
|
140
|
+
resources: [
|
|
141
|
+
{
|
|
142
|
+
path,
|
|
143
|
+
name: "table1",
|
|
144
|
+
format: "postgresql",
|
|
145
|
+
dialect: { table: "table1" },
|
|
146
|
+
schema: {
|
|
147
|
+
fields: [
|
|
148
|
+
{ name: "id", type: "integer", constraints: { required: true } },
|
|
149
|
+
{ name: "name", type: "string" },
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
path,
|
|
155
|
+
name: "table2",
|
|
156
|
+
format: "postgresql",
|
|
157
|
+
dialect: { table: "table2" },
|
|
158
|
+
schema: {
|
|
159
|
+
fields: [
|
|
160
|
+
{ name: "id", type: "integer", constraints: { required: true } },
|
|
161
|
+
{ name: "number", type: "number" },
|
|
162
|
+
{ name: "datetime", type: "datetime" },
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYWRhcHRlcnMvcG9zdGdyZXNxbC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFM0MsWUFBWSxFQUFFLENBQUE7QUFFZCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFBO0FBRTdDLHNFQUFzRTtBQUN0RSxNQUFNLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQTtBQUNsQyxNQUFNLE9BQU8sR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFBO0FBQzFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUE7QUFFckMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUMvQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU07SUFFakIsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25DLE1BQU0sTUFBTSxHQUFHLEVBQUU7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WUFDOUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pELEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRCxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDMUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDNUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMs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ZW50IjpbImltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyB1c2VSZWNvcmRpbmcgfSBmcm9tIFwidml0ZXN0LXBvbGx5XCJcbmltcG9ydCB7IGxvYWRQYWNrYWdlRnJvbURhdGFiYXNlIH0gZnJvbSBcIi4uL3BhY2thZ2UvaW5kZXgudHNcIlxuaW1wb3J0IHsgaW5mZXJEYXRhYmFzZVNjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHsgbG9hZERhdGFiYXNlVGFibGUsIHNhdmVEYXRhYmFzZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IGNyZWF0ZUFkYXB0ZXIgfSBmcm9tIFwiLi9jcmVhdGUudHNcIlxuXG51c2VSZWNvcmRpbmcoKVxuXG5jb25zdCBwYXRoID0gcHJvY2Vzcy5lbnYuRFBLSVRfUE9TVEdSRVNRTF9VUkxcblxuLy8gVml0ZXN0IHJ1bnMgaW4tZmlsZSB0ZXN0cyBzZXF1ZW50aWFsbHkgc28gd2UgY2FuIHVzZSB0aGUgc2FtZSB0YWJsZVxuY29uc3QgZGlhbGVjdCA9IHsgdGFibGU6IFwiZHBraXRcIiB9XG5jb25zdCByZWNvcmQxID0geyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfVxuY29uc3QgcmVjb3JkMiA9IHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfVxuXG5kZXNjcmliZS5za2lwSWYoIXBhdGgpKFwiUG9zdGdyZXNxbEFkYXB0ZXJcIiwgKCkgPT4ge1xuICBpZiAoIXBhdGgpIHJldHVyblxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoW1xuICAgICAgICBwbC5TZXJpZXMoXCJzdHJpbmdcIiwgW1wic3RyaW5nXCJdLCBwbC5VdGY4KSxcbiAgICAgICAgcGwuU2VyaWVzKFwiaW50ZWdlclwiLCBbMV0sIHBsLkludDMyKSxcbiAgICAgICAgcGwuU2VyaWVzKFwibnVtYmVyXCIsIFsxLjFdLCBwbC5GbG9hdDY0KSxcbiAgICAgIF0pXG4gICAgICAubGF6eSgpXG5cbiAgICBhd2FpdCBzYXZlRGF0YWJhc2VUYWJsZShzb3VyY2UsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0LFxuICAgICAgZm9ybWF0OiBcInBvc3RncmVzcWxcIixcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9KVxuXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW5mZXJEYXRhYmFzZVNjaGVtYSh7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdCxcbiAgICAgIGZvcm1hdDogXCJwb3N0Z3Jlc3FsXCIsXG4gICAgfSlcblxuICAgIGV4cGVjdChzY2hlbWEpLnRvRXF1YWwoe1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJzdHJpbmdcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiaW50ZWdlclwiLCB0eXBlOiBcImludGVnZXJcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibnVtYmVyXCIsIHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBzYXZlL2xvYWQgdGFibGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHBsLkRhdGFGcmFtZShbcmVjb3JkMSwgcmVjb3JkMl0pLmxhenkoKVxuXG4gICAgYXdhaXQgc2F2ZURhdGFiYXNlVGFibGUoc291cmNlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdCxcbiAgICAgIGZvcm1hdDogXCJwb3N0Z3Jlc3FsXCIsXG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWREYXRhYmFzZVRhYmxlKHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0LFxuICAgICAgZm9ybWF0OiBcInBvc3RncmVzcWxcIixcbiAgICB9KVxuXG4gICAgZXhwZWN0KChhd2FpdCB0YXJnZXQuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbcmVjb3JkMSwgcmVjb3JkMl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZS9sb2FkIHRhYmxlIHdpdGggdmFyaW91cyBkYXRhIHR5cGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBwbFxuICAgICAgLkRhdGFGcmFtZShbXG4gICAgICAgIHBsLlNlcmllcyhcImFycmF5XCIsIFtcIlsxLCAyLCAzXVwiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiYm9vbGVhblwiLCBbdHJ1ZV0sIHBsLkJvb2wpLFxuICAgICAgICBwbC5TZXJpZXMoXCJkYXRlXCIsIFtuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSldLCBwbC5EYXRlKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZGF0ZXRpbWVcIiwgW25ldyBEYXRlKERhdGUuVVRDKDIwMjUsIDAsIDEpKV0sIHBsLkRhdGV0aW1lKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZHVyYXRpb25cIiwgW1wiUDIzRFQyM0hcIl0sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcImdlb2pzb25cIiwgWyd7XCJ2YWx1ZVwiOiAxfSddLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJnZW9wb2ludFwiLCBbWzQwLjAsIDUwLjBdXSwgcGwuTGlzdChwbC5GbG9hdDMyKSksXG4gICAgICAgIHBsLlNlcmllcyhcImludGVnZXJcIiwgWzFdLCBwbC5JbnQzMiksXG4gICAgICAgIHBsLlNlcmllcyhcImxpc3RcIiwgW1sxLjAsIDIuMCwgMy4wXV0sIHBsLkxpc3QocGwuRmxvYXQzMikpLFxuICAgICAgICBwbC5TZXJpZXMoXCJudW1iZXJcIiwgWzEuMV0sIHBsLkZsb2F0NjQpLFxuICAgICAgICBwbC5TZXJpZXMoXCJvYmplY3RcIiwgWyd7XCJ2YWx1ZVwiOiAxfSddKSxcbiAgICAgICAgcGwuU2VyaWVzKFwic3RyaW5nXCIsIFtcInN0cmluZ1wiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwidGltZVwiLCBbbmV3IERhdGUoRGF0ZS5VVEMoMjAyNSwgMCwgMSkpXSwgcGwuVGltZSksXG4gICAgICAgIHBsLlNlcmllcyhcInllYXJcIiwgWzIwMjVdLCBwbC5JbnQzMiksXG4gICAgICAgIHBsLlNlcmllcyhcInllYXJtb250aFwiLCBbWzIwMjUsIDFdXSwgcGwuTGlzdChwbC5JbnQxNikpLFxuICAgICAgXSlcbiAgICAgIC5sYXp5KClcblxuICAgIGF3YWl0IHNhdmVEYXRhYmFzZVRhYmxlKHNvdXJjZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3QsXG4gICAgICBmb3JtYXQ6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgZmllbGRUeXBlczoge1xuICAgICAgICBnZW9qc29uOiBcImdlb2pzb25cIixcbiAgICAgICAgZ2VvcG9pbnQ6IFwiZ2VvcG9pbnRcIixcbiAgICAgICAgbGlzdDogXCJsaXN0XCIsXG4gICAgICAgIG9iamVjdDogXCJvYmplY3RcIixcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWUgYWZ0ZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzM2NFxuICAgICAgICB0aW1lOiBcInRpbWVcIixcbiAgICAgICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgICAgIHllYXJtb250aDogXCJ5ZWFybW9udGhcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWREYXRhYmFzZVRhYmxlKFxuICAgICAgeyBwYXRoLCBkaWFsZWN0LCBmb3JtYXQ6IFwicG9zdGdyZXNxbFwiIH0sXG4gICAgICB7IGRlbm9ybWFsaXplZDogdHJ1ZSB9LFxuICAgIClcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFyZ2V0LmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICBhcnJheTogXCJbMSwgMiwgM11cIixcbiAgICAgICAgYm9vbGVhbjogdHJ1ZSxcbiAgICAgICAgZGF0ZTogXCIyMDI1LTAxLTAxXCIsXG4gICAgICAgIGRhdGV0aW1lOiBuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSksXG4gICAgICAgIGR1cmF0aW9uOiBcIlAyM0RUMjNIXCIsXG4gICAgICAgIGdlb2pzb246ICd7XCJ2YWx1ZVwiOiAxfScsXG4gICAgICAgIGdlb3BvaW50OiBcIjQwLjAsNTAuMFwiLFxuICAgICAgICBpbnRlZ2VyOiAxLFxuICAgICAgICBsaXN0OiBcIjEuMCwyLjAsMy4wXCIsXG4gICAgICAgIG51bWJlcjogMS4xLFxuICAgICAgICBvYmplY3Q6ICd7XCJ2YWx1ZVwiOiAxfScsXG4gICAgICAgIHN0cmluZzogXCJzdHJpbmdcIixcbiAgICAgICAgdGltZTogXCIwMDowMDowMFwiLFxuICAgICAgICB5ZWFyOiAyMDI1LFxuICAgICAgICB5ZWFybW9udGg6IFwiMjAyNS0wMVwiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgcGFja2FnZSBmcm9tIGRhdGFiYXNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihcInBvc3RncmVzcWxcIilcbiAgICBjb25zdCBkYXRhYmFzZSA9IGF3YWl0IGFkYXB0ZXIuY29ubmVjdERhdGFiYXNlKHBhdGgpXG5cbiAgICBhd2FpdCBkYXRhYmFzZS5zY2hlbWEuZHJvcFRhYmxlKFwidGFibGUxXCIpLmlmRXhpc3RzKCkuZXhlY3V0ZSgpXG4gICAgYXdhaXQgZGF0YWJhc2Uuc2NoZW1hXG4gICAgICAuY3JlYXRlVGFibGUoXCJ0YWJsZTFcIilcbiAgICAgIC5pZk5vdEV4aXN0cygpXG4gICAgICAuYWRkQ29sdW1uKFwiaWRcIiwgXCJpbnRlZ2VyXCIsIGNvbHVtbiA9PiBjb2x1bW4ubm90TnVsbCgpKVxuICAgICAgLmFkZENvbHVtbihcIm5hbWVcIiwgXCJ0ZXh0XCIpXG4gICAgICAuZXhlY3V0ZSgpXG5cbiAgICBhd2FpdCBkYXRhYmFzZS5zY2hlbWEuZHJvcFRhYmxlKFwidGFibGUyXCIpLmlmRXhpc3RzKCkuZXhlY3V0ZSgpXG4gICAgYXdhaXQgZGF0YWJhc2Uuc2NoZW1hXG4gICAgICAuY3JlYXRlVGFibGUoXCJ0YWJsZTJcIilcbiAgICAgIC5pZk5vdEV4aXN0cygpXG4gICAgICAuYWRkQ29sdW1uKFwiaWRcIiwgXCJpbnRlZ2VyXCIsIGNvbHVtbiA9PiBjb2x1bW4ubm90TnVsbCgpKVxuICAgICAgLmFkZENvbHVtbihcIm51bWJlclwiLCBcIm51bWVyaWNcIilcbiAgICAgIC5hZGRDb2x1bW4oXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcFwiKVxuICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgY29uc3QgZGF0YXBhY2thZ2UgPSBhd2FpdCBsb2FkUGFja2FnZUZyb21EYXRhYmFzZShwYXRoLCB7XG4gICAgICBmb3JtYXQ6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgaW5jbHVkZVRhYmxlczogW1widGFibGUxXCIsIFwidGFibGUyXCJdLFxuICAgIH0pXG5cbiAgICBleHBlY3QoZGF0YXBhY2thZ2UpLnRvRXF1YWwoe1xuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG5hbWU6IFwidGFibGUxXCIsXG4gICAgICAgICAgZm9ybWF0OiBcInBvc3RncmVzcWxcIixcbiAgICAgICAgICBkaWFsZWN0OiB7IHRhYmxlOiBcInRhYmxlMVwiIH0sXG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiLCBjb25zdHJhaW50czogeyByZXF1aXJlZDogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbmFtZTogXCJ0YWJsZTJcIixcbiAgICAgICAgICBmb3JtYXQ6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgICAgIGRpYWxlY3Q6IHsgdGFibGU6IFwidGFibGUyXCIgfSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIGNvbnN0cmFpbnRzOiB7IHJlcXVpcmVkOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiBcIm51bWJlclwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJkYXRldGltZVwiLCB0eXBlOiBcImRhdGV0aW1lXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BunSqliteDialect } from "kysely-bun-sqlite";
|
|
2
|
+
export async function createBunSqliteDialect(path) {
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
const { Database } = await import("bun:sqlite");
|
|
5
|
+
return new BunSqliteDialect({ database: new Database(path) });
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLmJ1bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2FkYXB0ZXJzL3NxbGl0ZS5idW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFcEQsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxJQUFZO0lBQ3ZELGFBQWE7SUFDYixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDL0MsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVuU3FsaXRlRGlhbGVjdCB9IGZyb20gXCJreXNlbHktYnVuLXNxbGl0ZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVCdW5TcWxpdGVEaWFsZWN0KHBhdGg6IHN0cmluZykge1xuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IHsgRGF0YWJhc2UgfSA9IGF3YWl0IGltcG9ydChcImJ1bjpzcWxpdGVcIilcbiAgcmV0dXJuIG5ldyBCdW5TcWxpdGVEaWFsZWN0KHsgZGF0YWJhc2U6IG5ldyBEYXRhYmFzZShwYXRoKSB9KVxufVxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FieldType } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { DatabaseType } from "../field/index.ts";
|
|
3
|
+
import { BaseAdapter } from "./base.ts";
|
|
4
|
+
export declare class SqliteAdapter extends BaseAdapter {
|
|
5
|
+
nativeTypes: ("string" | "number" | "integer" | "year")[];
|
|
6
|
+
createDialect(path: string, options?: {
|
|
7
|
+
create?: boolean;
|
|
8
|
+
}): Promise<import("kysely-bun-sqlite").BunSqliteDialect | import("kysely-generic-sqlite").GenericSqliteDialect>;
|
|
9
|
+
normalizeType(databaseType: DatabaseType): FieldType;
|
|
10
|
+
denormalizeType(fieldType: FieldType): DatabaseType;
|
|
11
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { isLocalPathExist } from "@frictionless-ts/dataset";
|
|
2
|
+
import { BaseAdapter } from "./base.js";
|
|
3
|
+
// TODO: Currently, the solution is not optimal / hacky
|
|
4
|
+
// We need to rebase on proper sqlite dialect when it will be available
|
|
5
|
+
// - https://github.com/kysely-org/kysely/issues/1292
|
|
6
|
+
// - https://github.com/oven-sh/bun/issues/20412
|
|
7
|
+
export class SqliteAdapter extends BaseAdapter {
|
|
8
|
+
nativeTypes = ["integer", "number", "string", "year"];
|
|
9
|
+
async createDialect(path, options) {
|
|
10
|
+
path = path.replace(/^sqlite:\/\//, "");
|
|
11
|
+
if (!options?.create) {
|
|
12
|
+
const isExist = await isLocalPathExist(path);
|
|
13
|
+
if (!isExist) {
|
|
14
|
+
throw new Error(`Database file "${path}" does not exist`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
if (typeof Bun !== "undefined") {
|
|
19
|
+
const { createBunSqliteDialect } = await import("./sqlite.bun.js");
|
|
20
|
+
return await createBunSqliteDialect(path);
|
|
21
|
+
}
|
|
22
|
+
const { createNodeSqliteDialect } = await import("./sqlite.node.js");
|
|
23
|
+
return await createNodeSqliteDialect(path);
|
|
24
|
+
}
|
|
25
|
+
normalizeType(databaseType) {
|
|
26
|
+
switch (databaseType.toLowerCase()) {
|
|
27
|
+
case "blob":
|
|
28
|
+
return "string";
|
|
29
|
+
case "text":
|
|
30
|
+
return "string";
|
|
31
|
+
case "integer":
|
|
32
|
+
return "integer";
|
|
33
|
+
case "numeric":
|
|
34
|
+
case "real":
|
|
35
|
+
return "number";
|
|
36
|
+
default:
|
|
37
|
+
return "string";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
denormalizeType(fieldType) {
|
|
41
|
+
switch (fieldType) {
|
|
42
|
+
case "boolean":
|
|
43
|
+
return "integer";
|
|
44
|
+
case "integer":
|
|
45
|
+
return "integer";
|
|
46
|
+
case "number":
|
|
47
|
+
return "real";
|
|
48
|
+
case "string":
|
|
49
|
+
return "text";
|
|
50
|
+
case "year":
|
|
51
|
+
return "integer";
|
|
52
|
+
default:
|
|
53
|
+
return "text";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYWRhcHRlcnMvc3FsaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBRzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFdkMsdURBQXVEO0FBQ3ZELHVFQUF1RTtBQUN2RSxxREFBcUQ7QUFDckQsZ0RBQWdEO0FBRWhELE1BQU0sT0FBTyxhQUFjLFNBQVEsV0FBVztJQUM1QyxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQXVCLENBQUE7SUFFM0UsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFZLEVBQUUsT0FBOEI7UUFDOUQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRXZDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDckIsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM1QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxDQUFBO1lBQzNELENBQUM7UUFDSCxDQUFDO1FBRUQsYUFBYTtRQUNiLElBQUksT0FBTyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUNsRSxPQUFPLE1BQU0sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDcEUsT0FBTyxNQUFNLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxhQUFhLENBQUMsWUFBMEI7UUFDdEMsUUFBUSxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxRQUFRLENBQUE7WUFDakIsS0FBSyxNQUFNO2dCQUNULE9BQU8sUUFBUSxDQUFBO1lBQ2pCLEtBQUssU0FBUztnQkFDWixPQUFPLFNBQVMsQ0FBQTtZQUNsQixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxPQUFPLFFBQVEsQ0FBQTtZQUNqQjtnQkFDRSxPQUFPLFFBQVEsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxTQUFvQjtRQUNsQyxRQUFRLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLEtBQUssU0FBUztnQkFDWixPQUFPLFNBQVMsQ0FBQTtZQUNsQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxTQUFTLENBQUE7WUFDbEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sTUFBTSxDQUFBO1lBQ2YsS0FBSyxRQUFRO2dCQUNYLE9BQU8sTUFBTSxDQUFBO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sU0FBUyxDQUFBO1lBQ2xCO2dCQUNFLE9BQU8sTUFBTSxDQUFBO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0xvY2FsUGF0aEV4aXN0IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IEZpZWxkVHlwZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VUeXBlIH0gZnJvbSBcIi4uL2ZpZWxkL2luZGV4LnRzXCJcbmltcG9ydCB7IEJhc2VBZGFwdGVyIH0gZnJvbSBcIi4vYmFzZS50c1wiXG5cbi8vIFRPRE86IEN1cnJlbnRseSwgdGhlIHNvbHV0aW9uIGlzIG5vdCBvcHRpbWFsIC8gaGFja3lcbi8vIFdlIG5lZWQgdG8gcmViYXNlIG9uIHByb3BlciBzcWxpdGUgZGlhbGVjdCB3aGVuIGl0IHdpbGwgYmUgYXZhaWxhYmxlXG4vLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9reXNlbHktb3JnL2t5c2VseS9pc3N1ZXMvMTI5MlxuLy8gLSBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzIwNDEyXG5cbmV4cG9ydCBjbGFzcyBTcWxpdGVBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIge1xuICBuYXRpdmVUeXBlcyA9IFtcImludGVnZXJcIiwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJ5ZWFyXCJdIHNhdGlzZmllcyBGaWVsZFR5cGVbXVxuXG4gIGFzeW5jIGNyZWF0ZURpYWxlY3QocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuIH0pIHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9ec3FsaXRlOlxcL1xcLy8sIFwiXCIpXG5cbiAgICBpZiAoIW9wdGlvbnM/LmNyZWF0ZSkge1xuICAgICAgY29uc3QgaXNFeGlzdCA9IGF3YWl0IGlzTG9jYWxQYXRoRXhpc3QocGF0aClcbiAgICAgIGlmICghaXNFeGlzdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFiYXNlIGZpbGUgXCIke3BhdGh9XCIgZG9lcyBub3QgZXhpc3RgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgeyBjcmVhdGVCdW5TcWxpdGVEaWFsZWN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3NxbGl0ZS5idW4udHNcIilcbiAgICAgIHJldHVybiBhd2FpdCBjcmVhdGVCdW5TcWxpdGVEaWFsZWN0KHBhdGgpXG4gICAgfVxuXG4gICAgY29uc3QgeyBjcmVhdGVOb2RlU3FsaXRlRGlhbGVjdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9zcWxpdGUubm9kZS50c1wiKVxuICAgIHJldHVybiBhd2FpdCBjcmVhdGVOb2RlU3FsaXRlRGlhbGVjdChwYXRoKVxuICB9XG5cbiAgbm9ybWFsaXplVHlwZShkYXRhYmFzZVR5cGU6IERhdGFiYXNlVHlwZSk6IEZpZWxkVHlwZSB7XG4gICAgc3dpdGNoIChkYXRhYmFzZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCJcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCJpbnRlZ2VyXCJcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICByZXR1cm4gXCJudW1iZXJcIlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCJcbiAgICB9XG4gIH1cblxuICBkZW5vcm1hbGl6ZVR5cGUoZmllbGRUeXBlOiBGaWVsZFR5cGUpOiBEYXRhYmFzZVR5cGUge1xuICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJpbnRlZ2VyXCJcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBcImludGVnZXJcIlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gXCJyZWFsXCJcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIFwidGV4dFwiXG4gICAgICBjYXNlIFwieWVhclwiOlxuICAgICAgICByZXR1cm4gXCJpbnRlZ2VyXCJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcInRleHRcIlxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { buildQueryFn, parseBigInt } from "kysely-generic-sqlite";
|
|
3
|
+
import { GenericSqliteDialect } from "kysely-generic-sqlite";
|
|
4
|
+
export async function createNodeSqliteDialect(path) {
|
|
5
|
+
const { DatabaseSync } = await import("node:sqlite");
|
|
6
|
+
return new GenericSqliteDialect(() => createSqliteExecutor(new DatabaseSync(path)));
|
|
7
|
+
}
|
|
8
|
+
function createSqliteExecutor(db) {
|
|
9
|
+
const getStmt = (sql) => {
|
|
10
|
+
const stmt = db.prepare(sql);
|
|
11
|
+
// We change it from original to use plain numbers
|
|
12
|
+
//stmt.setReadBigInts(true)
|
|
13
|
+
return stmt;
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
db,
|
|
17
|
+
query: buildQueryFn({
|
|
18
|
+
all: (sql, parameters = []) => getStmt(sql)
|
|
19
|
+
.all(...parameters)
|
|
20
|
+
// We change it from original to make it work
|
|
21
|
+
// (by default it returns object with null prototype which breaks polars)
|
|
22
|
+
.map(row => ({ ...row })),
|
|
23
|
+
run: (sql, parameters = []) => {
|
|
24
|
+
const { changes, lastInsertRowid } = getStmt(sql).run(...parameters);
|
|
25
|
+
return {
|
|
26
|
+
insertId: parseBigInt(lastInsertRowid),
|
|
27
|
+
numAffectedRows: parseBigInt(changes),
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
}),
|
|
31
|
+
close: () => db.close(),
|
|
32
|
+
iterator: (isSelect, sql, parameters = []) => {
|
|
33
|
+
if (!isSelect) {
|
|
34
|
+
throw new Error("Only support select in stream()");
|
|
35
|
+
}
|
|
36
|
+
return getStmt(sql)
|
|
37
|
+
.iterate(...parameters) // We change it from original to make it work
|
|
38
|
+
// (by default it returns object with null prototype which breaks polars)
|
|
39
|
+
.map(row => ({ ...row }));
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9hZGFwdGVycy9zcWxpdGUubm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUc1RCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUFDLElBQVk7SUFDeEQsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRXBELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FDbkMsb0JBQW9CLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDN0MsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEVBQWdCO0lBQzVDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QixrREFBa0Q7UUFDbEQsMkJBQTJCO1FBQzNCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0lBRUQsT0FBTztRQUNMLEVBQUU7UUFDRixLQUFLLEVBQUUsWUFBWSxDQUFDO1lBQ2xCLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQztpQkFDVCxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ25CLDZDQUE2QztnQkFDN0MseUVBQXlFO2lCQUN4RSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRTdCLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFBO2dCQUNwRSxPQUFPO29CQUNMLFFBQVEsRUFBRSxXQUFXLENBQUMsZUFBZSxDQUFDO29CQUN0QyxlQUFlLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQztpQkFDdEMsQ0FBQTtZQUNILENBQUM7U0FDRixDQUFDO1FBQ0YsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtZQUNwRCxDQUFDO1lBQ0QsT0FDRSxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUNULE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLDZDQUE2QztnQkFDckUseUVBQXlFO2lCQUN4RSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUMzQixDQUFBO1FBQ0gsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7IGJ1aWxkUXVlcnlGbiwgcGFyc2VCaWdJbnQgfSBmcm9tIFwia3lzZWx5LWdlbmVyaWMtc3FsaXRlXCJcbmltcG9ydCB7IEdlbmVyaWNTcWxpdGVEaWFsZWN0IH0gZnJvbSBcImt5c2VseS1nZW5lcmljLXNxbGl0ZVwiXG5pbXBvcnQgdHlwZSB7IElHZW5lcmljU3FsaXRlIH0gZnJvbSBcImt5c2VseS1nZW5lcmljLXNxbGl0ZVwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb2RlU3FsaXRlRGlhbGVjdChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgeyBEYXRhYmFzZVN5bmMgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6c3FsaXRlXCIpXG5cbiAgcmV0dXJuIG5ldyBHZW5lcmljU3FsaXRlRGlhbGVjdCgoKSA9PlxuICAgIGNyZWF0ZVNxbGl0ZUV4ZWN1dG9yKG5ldyBEYXRhYmFzZVN5bmMocGF0aCkpLFxuICApXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNxbGl0ZUV4ZWN1dG9yKGRiOiBEYXRhYmFzZVN5bmMpOiBJR2VuZXJpY1NxbGl0ZTxEYXRhYmFzZVN5bmM+IHtcbiAgY29uc3QgZ2V0U3RtdCA9IChzcWw6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHN0bXQgPSBkYi5wcmVwYXJlKHNxbClcbiAgICAvLyBXZSBjaGFuZ2UgaXQgZnJvbSBvcmlnaW5hbCB0byB1c2UgcGxhaW4gbnVtYmVyc1xuICAgIC8vc3RtdC5zZXRSZWFkQmlnSW50cyh0cnVlKVxuICAgIHJldHVybiBzdG10XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRiLFxuICAgIHF1ZXJ5OiBidWlsZFF1ZXJ5Rm4oe1xuICAgICAgYWxsOiAoc3FsLCBwYXJhbWV0ZXJzID0gW10pID0+XG4gICAgICAgIGdldFN0bXQoc3FsKVxuICAgICAgICAgIC5hbGwoLi4ucGFyYW1ldGVycylcbiAgICAgICAgICAvLyBXZSBjaGFuZ2UgaXQgZnJvbSBvcmlnaW5hbCB0byBtYWtlIGl0IHdvcmtcbiAgICAgICAgICAvLyAoYnkgZGVmYXVsdCBpdCByZXR1cm5zIG9iamVjdCB3aXRoIG51bGwgcHJvdG90eXBlIHdoaWNoIGJyZWFrcyBwb2xhcnMpXG4gICAgICAgICAgLm1hcChyb3cgPT4gKHsgLi4ucm93IH0pKSxcblxuICAgICAgcnVuOiAoc3FsLCBwYXJhbWV0ZXJzID0gW10pID0+IHtcbiAgICAgICAgY29uc3QgeyBjaGFuZ2VzLCBsYXN0SW5zZXJ0Um93aWQgfSA9IGdldFN0bXQoc3FsKS5ydW4oLi4ucGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnNlcnRJZDogcGFyc2VCaWdJbnQobGFzdEluc2VydFJvd2lkKSxcbiAgICAgICAgICBudW1BZmZlY3RlZFJvd3M6IHBhcnNlQmlnSW50KGNoYW5nZXMpLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGNsb3NlOiAoKSA9PiBkYi5jbG9zZSgpLFxuICAgIGl0ZXJhdG9yOiAoaXNTZWxlY3QsIHNxbCwgcGFyYW1ldGVycyA9IFtdKSA9PiB7XG4gICAgICBpZiAoIWlzU2VsZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgc3VwcG9ydCBzZWxlY3QgaW4gc3RyZWFtKClcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGdldFN0bXQoc3FsKVxuICAgICAgICAgIC5pdGVyYXRlKC4uLnBhcmFtZXRlcnMpIC8vIFdlIGNoYW5nZSBpdCBmcm9tIG9yaWdpbmFsIHRvIG1ha2UgaXQgd29ya1xuICAgICAgICAgIC8vIChieSBkZWZhdWx0IGl0IHJldHVybnMgb2JqZWN0IHdpdGggbnVsbCBwcm90b3R5cGUgd2hpY2ggYnJlYWtzIHBvbGFycylcbiAgICAgICAgICAubWFwKHJvdyA9PiAoeyAuLi5yb3cgfSkpIGFzIGFueVxuICAgICAgKVxuICAgIH0sXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|