@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.
Files changed (63) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/adapters/base.d.ts +20 -0
  4. package/build/adapters/base.js +66 -0
  5. package/build/adapters/create.d.ts +5 -0
  6. package/build/adapters/create.js +17 -0
  7. package/build/adapters/mysql.d.ts +10 -0
  8. package/build/adapters/mysql.js +90 -0
  9. package/build/adapters/mysql.spec.d.ts +1 -0
  10. package/build/adapters/mysql.spec.js +170 -0
  11. package/build/adapters/postgresql.d.ts +10 -0
  12. package/build/adapters/postgresql.js +100 -0
  13. package/build/adapters/postgresql.spec.d.ts +1 -0
  14. package/build/adapters/postgresql.spec.js +170 -0
  15. package/build/adapters/sqlite.bun.d.ts +2 -0
  16. package/build/adapters/sqlite.bun.js +7 -0
  17. package/build/adapters/sqlite.d.ts +11 -0
  18. package/build/adapters/sqlite.js +57 -0
  19. package/build/adapters/sqlite.node.d.ts +2 -0
  20. package/build/adapters/sqlite.node.js +43 -0
  21. package/build/adapters/sqlite.spec.d.ts +1 -0
  22. package/build/adapters/sqlite.spec.js +252 -0
  23. package/build/field/Field.d.ts +3 -0
  24. package/build/field/Field.js +2 -0
  25. package/build/field/Type.d.ts +2 -0
  26. package/build/field/Type.js +2 -0
  27. package/build/field/index.d.ts +2 -0
  28. package/build/field/index.js +2 -0
  29. package/build/index.d.ts +6 -0
  30. package/build/index.js +7 -0
  31. package/build/package/index.d.ts +2 -0
  32. package/build/package/index.js +3 -0
  33. package/build/package/load.d.ts +7 -0
  34. package/build/package/load.js +30 -0
  35. package/build/package/save.d.ts +10 -0
  36. package/build/package/save.js +28 -0
  37. package/build/plugin.d.ts +15 -0
  38. package/build/plugin.js +54 -0
  39. package/build/plugin.spec.d.ts +1 -0
  40. package/build/plugin.spec.js +328 -0
  41. package/build/resource/Format.d.ts +1 -0
  42. package/build/resource/Format.js +2 -0
  43. package/build/resource/index.d.ts +1 -0
  44. package/build/resource/index.js +2 -0
  45. package/build/schema/Schema.d.ts +4 -0
  46. package/build/schema/Schema.js +2 -0
  47. package/build/schema/index.d.ts +2 -0
  48. package/build/schema/index.js +2 -0
  49. package/build/schema/infer.d.ts +4 -0
  50. package/build/schema/infer.js +24 -0
  51. package/build/schema/infer.spec.d.ts +1 -0
  52. package/build/schema/infer.spec.js +25 -0
  53. package/build/table/index.d.ts +2 -0
  54. package/build/table/index.js +3 -0
  55. package/build/table/load.d.ts +6 -0
  56. package/build/table/load.js +29 -0
  57. package/build/table/load.spec.d.ts +1 -0
  58. package/build/table/load.spec.js +24 -0
  59. package/build/table/save.d.ts +4 -0
  60. package/build/table/save.js +57 -0
  61. package/build/table/save.spec.d.ts +1 -0
  62. package/build/table/save.spec.js +20 -0
  63. package/package.json +45 -0
@@ -0,0 +1,252 @@
1
+ import { getTempFilePath } from "@frictionless-ts/dataset";
2
+ import * as pl from "nodejs-polars";
3
+ import { describe, expect, it } from "vitest";
4
+ import { useRecording } from "vitest-polly";
5
+ import { loadPackageFromDatabase } from "../package/index.js";
6
+ import { savePackageToDatabase } from "../package/index.js";
7
+ import { inferDatabaseSchema } from "../schema/index.js";
8
+ import { loadDatabaseTable, saveDatabaseTable } from "../table/index.js";
9
+ import { createAdapter } from "./create.js";
10
+ useRecording();
11
+ const dialect = { table: "dpkit" };
12
+ const record1 = { id: 1, name: "english" };
13
+ const record2 = { id: 2, name: "中文" };
14
+ // TODO: Enable when libsql@0.6 is fixed
15
+ describe("SqliteAdapter", () => {
16
+ it("should infer schema", async () => {
17
+ const path = getTempFilePath();
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: "sqlite",
29
+ overwrite: true,
30
+ });
31
+ const schema = await inferDatabaseSchema({
32
+ path,
33
+ dialect,
34
+ format: "sqlite",
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 path = getTempFilePath();
46
+ const source = pl.DataFrame([record1, record2]).lazy();
47
+ await saveDatabaseTable(source, {
48
+ path,
49
+ dialect,
50
+ format: "sqlite",
51
+ overwrite: true,
52
+ });
53
+ const target = await loadDatabaseTable({ path, dialect, format: "sqlite" });
54
+ expect((await target.collect()).toRecords()).toEqual([record1, record2]);
55
+ });
56
+ it("should save/load table with protocol", async () => {
57
+ const path = `sqlite://${getTempFilePath()}`;
58
+ const source = pl.DataFrame([record1, record2]).lazy();
59
+ await saveDatabaseTable(source, {
60
+ path,
61
+ dialect,
62
+ format: "sqlite",
63
+ overwrite: true,
64
+ });
65
+ const target = await loadDatabaseTable({ path, dialect, format: "sqlite" });
66
+ expect((await target.collect()).toRecords()).toEqual([record1, record2]);
67
+ });
68
+ it("should save/load table with various data types", async () => {
69
+ const path = `sqlite://${getTempFilePath()}`;
70
+ const source = pl
71
+ .DataFrame([
72
+ pl.Series("array", ["[1, 2, 3]"], pl.String),
73
+ pl.Series("boolean", [true], pl.Bool),
74
+ pl.Series("date", [new Date(Date.UTC(2025, 0, 1))], pl.Date),
75
+ pl.Series("datetime", [new Date(Date.UTC(2025, 0, 1))], pl.Datetime),
76
+ pl.Series("duration", ["P23DT23H"], pl.String),
77
+ pl.Series("geojson", ['{"value": 1}'], pl.String),
78
+ pl.Series("geopoint", [[40.0, 50.0]], pl.List(pl.Float32)),
79
+ pl.Series("integer", [1], pl.Int32),
80
+ pl.Series("list", [[1.0, 2.0, 3.0]], pl.List(pl.Float32)),
81
+ pl.Series("number", [1.1], pl.Float64),
82
+ pl.Series("object", ['{"value": 1}']),
83
+ pl.Series("string", ["string"], pl.String),
84
+ pl.Series("time", [new Date(Date.UTC(2025, 0, 1))], pl.Time),
85
+ pl.Series("year", [2025], pl.Int32),
86
+ pl.Series("yearmonth", [[2025, 1]], pl.List(pl.Int16)),
87
+ ])
88
+ .lazy();
89
+ await saveDatabaseTable(source, {
90
+ path,
91
+ dialect,
92
+ format: "sqlite",
93
+ overwrite: true,
94
+ fieldTypes: {
95
+ geojson: "geojson",
96
+ geopoint: "geopoint",
97
+ list: "list",
98
+ object: "object",
99
+ // TODO: Remove time after:
100
+ // https://github.com/pola-rs/nodejs-polars/issues/364
101
+ time: "time",
102
+ year: "year",
103
+ yearmonth: "yearmonth",
104
+ },
105
+ });
106
+ const target = await loadDatabaseTable({ path, dialect, format: "sqlite" }, { denormalized: true });
107
+ expect((await target.collect()).toRecords()).toEqual([
108
+ {
109
+ array: "[1, 2, 3]",
110
+ boolean: "true",
111
+ date: "2025-01-01",
112
+ datetime: "2025-01-01T00:00:00",
113
+ duration: "P23DT23H",
114
+ geojson: '{"value": 1}',
115
+ geopoint: "40.0,50.0",
116
+ integer: 1,
117
+ list: "1.0,2.0,3.0",
118
+ number: 1.1,
119
+ object: '{"value": 1}',
120
+ string: "string",
121
+ time: "00:00:00",
122
+ year: 2025,
123
+ yearmonth: "2025-01",
124
+ },
125
+ ]);
126
+ });
127
+ it("should load package from database", async () => {
128
+ const path = getTempFilePath();
129
+ const adapter = createAdapter("sqlite");
130
+ const database = await adapter.connectDatabase(path, { create: true });
131
+ await database.schema
132
+ .createTable("table1")
133
+ .addColumn("id", "integer", column => column.notNull())
134
+ .addColumn("name", "text")
135
+ .execute();
136
+ await database.schema
137
+ .createTable("table2")
138
+ .addColumn("id", "integer", column => column.notNull())
139
+ .addColumn("number", "numeric")
140
+ .addColumn("boolean", "boolean")
141
+ .execute();
142
+ const datapackage = await loadPackageFromDatabase(path, {
143
+ format: "sqlite",
144
+ });
145
+ expect(datapackage).toEqual({
146
+ resources: [
147
+ {
148
+ path,
149
+ name: "table1",
150
+ format: "sqlite",
151
+ dialect: { table: "table1" },
152
+ schema: {
153
+ fields: [
154
+ { name: "id", type: "integer", constraints: { required: true } },
155
+ { name: "name", type: "string" },
156
+ ],
157
+ },
158
+ },
159
+ {
160
+ path,
161
+ name: "table2",
162
+ format: "sqlite",
163
+ dialect: { table: "table2" },
164
+ schema: {
165
+ fields: [
166
+ { name: "id", type: "integer", constraints: { required: true } },
167
+ { name: "number", type: "number" },
168
+ { name: "boolean", type: "string" },
169
+ ],
170
+ },
171
+ },
172
+ ],
173
+ });
174
+ });
175
+ it("should save package to database", async () => {
176
+ const path = getTempFilePath();
177
+ const dataPackage = {
178
+ resources: [
179
+ {
180
+ path: "table1.csv",
181
+ name: "table1",
182
+ format: "sqlite",
183
+ dialect: { table: "table1" },
184
+ schema: {
185
+ fields: [
186
+ { name: "id", type: "integer", constraints: { required: true } },
187
+ { name: "name", type: "string" },
188
+ ],
189
+ },
190
+ },
191
+ {
192
+ path: "table2.csv",
193
+ name: "table2",
194
+ format: "sqlite",
195
+ dialect: { table: "table2" },
196
+ schema: {
197
+ fields: [
198
+ { name: "id", type: "integer", constraints: { required: true } },
199
+ { name: "number", type: "number" },
200
+ { name: "boolean", type: "string" },
201
+ ],
202
+ },
203
+ },
204
+ ],
205
+ };
206
+ await savePackageToDatabase(dataPackage, {
207
+ target: path,
208
+ format: "sqlite",
209
+ plugins: [
210
+ {
211
+ loadTable: async (resource) => {
212
+ if (resource.name === "table1") {
213
+ return pl
214
+ .DataFrame([
215
+ pl.Series("id", [1, 2]),
216
+ pl.Series("name", ["english", "中文"]),
217
+ ])
218
+ .lazy();
219
+ }
220
+ if (resource.name === "table2") {
221
+ return pl
222
+ .DataFrame([
223
+ pl.Series("id", [1, 2]),
224
+ pl.Series("number", [1.1, 2.2]),
225
+ pl.Series("boolean", ["true", "false"]),
226
+ ])
227
+ .lazy();
228
+ }
229
+ return undefined;
230
+ },
231
+ },
232
+ ],
233
+ });
234
+ const adapter = createAdapter("sqlite");
235
+ const database = await adapter.connectDatabase(path);
236
+ const records1 = await database.selectFrom("table1").selectAll().execute();
237
+ const records2 = await database.selectFrom("table2").selectAll().execute();
238
+ expect(records1).toEqual([
239
+ { id: 1, name: "english" },
240
+ { id: 2, name: "中文" },
241
+ ]);
242
+ expect(records2).toEqual([
243
+ { id: 1, number: 1.1, boolean: "true" },
244
+ { id: 2, number: 2.2, boolean: "false" },
245
+ ]);
246
+ });
247
+ it("should throw error when loading from non-existent database", async () => {
248
+ const path = "non-existent-database.db";
249
+ await expect(loadDatabaseTable({ path, format: "sqlite", dialect })).rejects.toThrow('Database file "non-existent-database.db" does not exist');
250
+ });
251
+ });
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9hZGFwdGVycy9zcWxpdGUuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFMUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUUzQyxZQUFZLEVBQUUsQ0FBQTtBQUVkLE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUE7QUFDMUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtBQUVyQyx3Q0FBd0M7QUFDeEMsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDN0IsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25DLE1BQU0sSUFBSSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBRTlCLE1BQU0sTUFBTSxHQUFHLEVBQUU7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QUFJLEVBQUU7UUFDOUQsTUFBTSxJQUFJLEdBQUcsWUFBWSxlQUFlLEVBQUUsRUFBRSxDQUFBO1FBRTVDLE1BQU0sTUFBTSxHQUFHLEVBQUU7YUFDZCxTQUFTLENBQUM7WUFDVCxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDNUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQyxFQUFFLENBQUMsTUFBTSxD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LFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUN2RCxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMseURBQXlELENBQUMsQ0FBQTtJQUM5RSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0VGVtcEZpbGVQYXRoIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgdXNlUmVjb3JkaW5nIH0gZnJvbSBcInZpdGVzdC1wb2xseVwiXG5pbXBvcnQgeyBsb2FkUGFja2FnZUZyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9wYWNrYWdlL2luZGV4LnRzXCJcbmltcG9ydCB7IHNhdmVQYWNrYWdlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi9wYWNrYWdlL2luZGV4LnRzXCJcbmltcG9ydCB7IGluZmVyRGF0YWJhc2VTY2hlbWEgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGxvYWREYXRhYmFzZVRhYmxlLCBzYXZlRGF0YWJhc2VUYWJsZSB9IGZyb20gXCIuLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBjcmVhdGVBZGFwdGVyIH0gZnJvbSBcIi4vY3JlYXRlLnRzXCJcblxudXNlUmVjb3JkaW5nKClcblxuY29uc3QgZGlhbGVjdCA9IHsgdGFibGU6IFwiZHBraXRcIiB9XG5jb25zdCByZWNvcmQxID0geyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfVxuY29uc3QgcmVjb3JkMiA9IHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfVxuXG4vLyBUT0RPOiBFbmFibGUgd2hlbiBsaWJzcWxAMC42IGlzIGZpeGVkXG5kZXNjcmliZShcIlNxbGl0ZUFkYXB0ZXJcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBzY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRUZW1wRmlsZVBhdGgoKVxuXG4gICAgY29uc3Qgc291cmNlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoW1xuICAgICAgICBwbC5TZXJpZXMoXCJzdHJpbmdcIiwgW1wic3RyaW5nXCJdLCBwbC5VdGY4KSxcbiAgICAgICAgcGwuU2VyaWVzKFwiaW50ZWdlclwiLCBbMV0sIHBsLkludDMyKSxcbiAgICAgICAgcGwuU2VyaWVzKFwibnVtYmVyXCIsIFsxLjFdLCBwbC5GbG9hdDY0KSxcbiAgICAgIF0pXG4gICAgICAubGF6eSgpXG5cbiAgICBhd2FpdCBzYXZlRGF0YWJhc2VUYWJsZShzb3VyY2UsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0LFxuICAgICAgZm9ybWF0OiBcInNxbGl0ZVwiLFxuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pXG5cbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlckRhdGFiYXNlU2NoZW1hKHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0LFxuICAgICAgZm9ybWF0OiBcInNxbGl0ZVwiLFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2NoZW1hKS50b0VxdWFsKHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IG5hbWU6IFwic3RyaW5nXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImludGVnZXJcIiwgdHlwZTogXCJpbnRlZ2VyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm51bWJlclwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICBdLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZS9sb2FkIHRhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcblxuICAgIGNvbnN0IHNvdXJjZSA9IHBsLkRhdGFGcmFtZShbcmVjb3JkMSwgcmVjb3JkMl0pLmxhenkoKVxuICAgIGF3YWl0IHNhdmVEYXRhYmFzZVRhYmxlKHNvdXJjZSwge1xuICAgICAgcGF0aCxcbiAgICAgIGRpYWxlY3QsXG4gICAgICBmb3JtYXQ6IFwic3FsaXRlXCIsXG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSlcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IGxvYWREYXRhYmFzZVRhYmxlKHsgcGF0aCwgZGlhbGVjdCwgZm9ybWF0OiBcInNxbGl0ZVwiIH0pXG4gICAgZXhwZWN0KChhd2FpdCB0YXJnZXQuY29sbGVjdCgpKS50b1JlY29yZHMoKSkudG9FcXVhbChbcmVjb3JkMSwgcmVjb3JkMl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZS9sb2FkIHRhYmxlIHdpdGggcHJvdG9jb2xcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBgc3FsaXRlOi8vJHtnZXRUZW1wRmlsZVBhdGgoKX1gXG5cbiAgICBjb25zdCBzb3VyY2UgPSBwbC5EYXRhRnJhbWUoW3JlY29yZDEsIHJlY29yZDJdKS5sYXp5KClcbiAgICBhd2FpdCBzYXZlRGF0YWJhc2VUYWJsZShzb3VyY2UsIHtcbiAgICAgIHBhdGgsXG4gICAgICBkaWFsZWN0LFxuICAgICAgZm9ybWF0OiBcInNxbGl0ZVwiLFxuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pXG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCBsb2FkRGF0YWJhc2VUYWJsZSh7IHBhdGgsIGRpYWxlY3QsIGZvcm1hdDogXCJzcWxpdGVcIiB9KVxuICAgIGV4cGVjdCgoYXdhaXQgdGFyZ2V0LmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW3JlY29yZDEsIHJlY29yZDJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUvbG9hZCB0YWJsZSB3aXRoIHZhcmlvdXMgZGF0YSB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGBzcWxpdGU6Ly8ke2dldFRlbXBGaWxlUGF0aCgpfWBcblxuICAgIGNvbnN0IHNvdXJjZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKFtcbiAgICAgICAgcGwuU2VyaWVzKFwiYXJyYXlcIiwgW1wiWzEsIDIsIDNdXCJdLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJib29sZWFuXCIsIFt0cnVlXSwgcGwuQm9vbCksXG4gICAgICAgIHBsLlNlcmllcyhcImRhdGVcIiwgW25ldyBEYXRlKERhdGUuVVRDKDIwMjUsIDAsIDEpKV0sIHBsLkRhdGUpLFxuICAgICAgICBwbC5TZXJpZXMoXCJkYXRldGltZVwiLCBbbmV3IERhdGUoRGF0ZS5VVEMoMjAyNSwgMCwgMSkpXSwgcGwuRGF0ZXRpbWUpLFxuICAgICAgICBwbC5TZXJpZXMoXCJkdXJhdGlvblwiLCBbXCJQMjNEVDIzSFwiXSwgcGwuU3RyaW5nKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiZ2VvanNvblwiLCBbJ3tcInZhbHVlXCI6IDF9J10sIHBsLlN0cmluZyksXG4gICAgICAgIHBsLlNlcmllcyhcImdlb3BvaW50XCIsIFtbNDAuMCwgNTAuMF1dLCBwbC5MaXN0KHBsLkZsb2F0MzIpKSxcbiAgICAgICAgcGwuU2VyaWVzKFwiaW50ZWdlclwiLCBbMV0sIHBsLkludDMyKSxcbiAgICAgICAgcGwuU2VyaWVzKFwibGlzdFwiLCBbWzEuMCwgMi4wLCAzLjBdXSwgcGwuTGlzdChwbC5GbG9hdDMyKSksXG4gICAgICAgIHBsLlNlcmllcyhcIm51bWJlclwiLCBbMS4xXSwgcGwuRmxvYXQ2NCksXG4gICAgICAgIHBsLlNlcmllcyhcIm9iamVjdFwiLCBbJ3tcInZhbHVlXCI6IDF9J10pLFxuICAgICAgICBwbC5TZXJpZXMoXCJzdHJpbmdcIiwgW1wic3RyaW5nXCJdLCBwbC5TdHJpbmcpLFxuICAgICAgICBwbC5TZXJpZXMoXCJ0aW1lXCIsIFtuZXcgRGF0ZShEYXRlLlVUQygyMDI1LCAwLCAxKSldLCBwbC5UaW1lKSxcbiAgICAgICAgcGwuU2VyaWVzKFwieWVhclwiLCBbMjAyNV0sIHBsLkludDMyKSxcbiAgICAgICAgcGwuU2VyaWVzKFwieWVhcm1vbnRoXCIsIFtbMjAyNSwgMV1dLCBwbC5MaXN0KHBsLkludDE2KSksXG4gICAgICBdKVxuICAgICAgLmxhenkoKVxuXG4gICAgYXdhaXQgc2F2ZURhdGFiYXNlVGFibGUoc291cmNlLCB7XG4gICAgICBwYXRoLFxuICAgICAgZGlhbGVjdCxcbiAgICAgIGZvcm1hdDogXCJzcWxpdGVcIixcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgIGZpZWxkVHlwZXM6IHtcbiAgICAgICAgZ2VvanNvbjogXCJnZW9qc29uXCIsXG4gICAgICAgIGdlb3BvaW50OiBcImdlb3BvaW50XCIsXG4gICAgICAgIGxpc3Q6IFwibGlzdFwiLFxuICAgICAgICBvYmplY3Q6IFwib2JqZWN0XCIsXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aW1lIGFmdGVyOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9sYS1ycy9ub2RlanMtcG9sYXJzL2lzc3Vlcy8zNjRcbiAgICAgICAgdGltZTogXCJ0aW1lXCIsXG4gICAgICAgIHllYXI6IFwieWVhclwiLFxuICAgICAgICB5ZWFybW9udGg6IFwieWVhcm1vbnRoXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCBsb2FkRGF0YWJhc2VUYWJsZShcbiAgICAgIHsgcGF0aCwgZGlhbGVjdCwgZm9ybWF0OiBcInNxbGl0ZVwiIH0sXG4gICAgICB7IGRlbm9ybWFsaXplZDogdHJ1ZSB9LFxuICAgIClcblxuICAgIGV4cGVjdCgoYXdhaXQgdGFyZ2V0LmNvbGxlY3QoKSkudG9SZWNvcmRzKCkpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICBhcnJheTogXCJbMSwgMiwgM11cIixcbiAgICAgICAgYm9vbGVhbjogXCJ0cnVlXCIsXG4gICAgICAgIGRhdGU6IFwiMjAyNS0wMS0wMVwiLFxuICAgICAgICBkYXRldGltZTogXCIyMDI1LTAxLTAxVDAwOjAwOjAwXCIsXG4gICAgICAgIGR1cmF0aW9uOiBcIlAyM0RUMjNIXCIsXG4gICAgICAgIGdlb2pzb246ICd7XCJ2YWx1ZVwiOiAxfScsXG4gICAgICAgIGdlb3BvaW50OiBcIjQwLjAsNTAuMFwiLFxuICAgICAgICBpbnRlZ2VyOiAxLFxuICAgICAgICBsaXN0OiBcIjEuMCwyLjAsMy4wXCIsXG4gICAgICAgIG51bWJlcjogMS4xLFxuICAgICAgICBvYmplY3Q6ICd7XCJ2YWx1ZVwiOiAxfScsXG4gICAgICAgIHN0cmluZzogXCJzdHJpbmdcIixcbiAgICAgICAgdGltZTogXCIwMDowMDowMFwiLFxuICAgICAgICB5ZWFyOiAyMDI1LFxuICAgICAgICB5ZWFybW9udGg6IFwiMjAyNS0wMVwiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgcGFja2FnZSBmcm9tIGRhdGFiYXNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcbiAgICBjb25zdCBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihcInNxbGl0ZVwiKVxuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgYWRhcHRlci5jb25uZWN0RGF0YWJhc2UocGF0aCwgeyBjcmVhdGU6IHRydWUgfSlcblxuICAgIGF3YWl0IGRhdGFiYXNlLnNjaGVtYVxuICAgICAgLmNyZWF0ZVRhYmxlKFwidGFibGUxXCIpXG4gICAgICAuYWRkQ29sdW1uKFwiaWRcIiwgXCJpbnRlZ2VyXCIsIGNvbHVtbiA9PiBjb2x1bW4ubm90TnVsbCgpKVxuICAgICAgLmFkZENvbHVtbihcIm5hbWVcIiwgXCJ0ZXh0XCIpXG4gICAgICAuZXhlY3V0ZSgpXG5cbiAgICBhd2FpdCBkYXRhYmFzZS5zY2hlbWFcbiAgICAgIC5jcmVhdGVUYWJsZShcInRhYmxlMlwiKVxuICAgICAgLmFkZENvbHVtbihcImlkXCIsIFwiaW50ZWdlclwiLCBjb2x1bW4gPT4gY29sdW1uLm5vdE51bGwoKSlcbiAgICAgIC5hZGRDb2x1bW4oXCJudW1iZXJcIiwgXCJudW1lcmljXCIpXG4gICAgICAuYWRkQ29sdW1uKFwiYm9vbGVhblwiLCBcImJvb2xlYW5cIilcbiAgICAgIC5leGVjdXRlKClcblxuICAgIGNvbnN0IGRhdGFwYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2VGcm9tRGF0YWJhc2UocGF0aCwge1xuICAgICAgZm9ybWF0OiBcInNxbGl0ZVwiLFxuICAgIH0pXG5cbiAgICBleHBlY3QoZGF0YXBhY2thZ2UpLnRvRXF1YWwoe1xuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG5hbWU6IFwidGFibGUxXCIsXG4gICAgICAgICAgZm9ybWF0OiBcInNxbGl0ZVwiLFxuICAgICAgICAgIGRpYWxlY3Q6IHsgdGFibGU6IFwidGFibGUxXCIgfSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIGNvbnN0cmFpbnRzOiB7IHJlcXVpcmVkOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBuYW1lOiBcInRhYmxlMlwiLFxuICAgICAgICAgIGZvcm1hdDogXCJzcWxpdGVcIixcbiAgICAgICAgICBkaWFsZWN0OiB7IHRhYmxlOiBcInRhYmxlMlwiIH0sXG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiLCBjb25zdHJhaW50czogeyByZXF1aXJlZDogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJudW1iZXJcIiwgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICAgICAgICB7IG5hbWU6IFwiYm9vbGVhblwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2F2ZSBwYWNrYWdlIHRvIGRhdGFiYXNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0VGVtcEZpbGVQYXRoKClcblxuICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiBcInRhYmxlMS5jc3ZcIixcbiAgICAgICAgICBuYW1lOiBcInRhYmxlMVwiLFxuICAgICAgICAgIGZvcm1hdDogXCJzcWxpdGVcIixcbiAgICAgICAgICBkaWFsZWN0OiB7IHRhYmxlOiBcInRhYmxlMVwiIH0sXG4gICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiLCBjb25zdHJhaW50czogeyByZXF1aXJlZDogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJuYW1lXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6IFwidGFibGUyLmNzdlwiLFxuICAgICAgICAgIG5hbWU6IFwidGFibGUyXCIsXG4gICAgICAgICAgZm9ybWF0OiBcInNxbGl0ZVwiLFxuICAgICAgICAgIGRpYWxlY3Q6IHsgdGFibGU6IFwidGFibGUyXCIgfSxcbiAgICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIGNvbnN0cmFpbnRzOiB7IHJlcXVpcmVkOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiBcIm51bWJlclwiLCB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJib29sZWFuXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVBhY2thZ2VUb0RhdGFiYXNlKGRhdGFQYWNrYWdlLCB7XG4gICAgICB0YXJnZXQ6IHBhdGgsXG4gICAgICBmb3JtYXQ6IFwic3FsaXRlXCIsXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsb2FkVGFibGU6IGFzeW5jIHJlc291cmNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvdXJjZS5uYW1lID09PSBcInRhYmxlMVwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwbFxuICAgICAgICAgICAgICAgIC5EYXRhRnJhbWUoW1xuICAgICAgICAgICAgICAgICAgcGwuU2VyaWVzKFwiaWRcIiwgWzEsIDJdKSxcbiAgICAgICAgICAgICAgICAgIHBsLlNlcmllcyhcIm5hbWVcIiwgW1wiZW5nbGlzaFwiLCBcIuS4reaWh1wiXSksXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAubGF6eSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXNvdXJjZS5uYW1lID09PSBcInRhYmxlMlwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwbFxuICAgICAgICAgICAgICAgIC5EYXRhRnJhbWUoW1xuICAgICAgICAgICAgICAgICAgcGwuU2VyaWVzKFwiaWRcIiwgWzEsIDJdKSxcbiAgICAgICAgICAgICAgICAgIHBsLlNlcmllcyhcIm51bWJlclwiLCBbMS4xLCAyLjJdKSxcbiAgICAgICAgICAgICAgICAgIHBsLlNlcmllcyhcImJvb2xlYW5cIiwgW1widHJ1ZVwiLCBcImZhbHNlXCJdKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIC5sYXp5KClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG5cbiAgICBjb25zdCBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihcInNxbGl0ZVwiKVxuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgYWRhcHRlci5jb25uZWN0RGF0YWJhc2UocGF0aClcblxuICAgIGNvbnN0IHJlY29yZHMxID0gYXdhaXQgZGF0YWJhc2Uuc2VsZWN0RnJvbShcInRhYmxlMVwiKS5zZWxlY3RBbGwoKS5leGVjdXRlKClcbiAgICBjb25zdCByZWNvcmRzMiA9IGF3YWl0IGRhdGFiYXNlLnNlbGVjdEZyb20oXCJ0YWJsZTJcIikuc2VsZWN0QWxsKCkuZXhlY3V0ZSgpXG5cbiAgICBleHBlY3QocmVjb3JkczEpLnRvRXF1YWwoW1xuICAgICAgeyBpZDogMSwgbmFtZTogXCJlbmdsaXNoXCIgfSxcbiAgICAgIHsgaWQ6IDIsIG5hbWU6IFwi5Lit5paHXCIgfSxcbiAgICBdKVxuXG4gICAgZXhwZWN0KHJlY29yZHMyKS50b0VxdWFsKFtcbiAgICAgIHsgaWQ6IDEsIG51bWJlcjogMS4xLCBib29sZWFuOiBcInRydWVcIiB9LFxuICAgICAgeyBpZDogMiwgbnVtYmVyOiAyLjIsIGJvb2xlYW46IFwiZmFsc2VcIiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBsb2FkaW5nIGZyb20gbm9uLWV4aXN0ZW50IGRhdGFiYXNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXRoID0gXCJub24tZXhpc3RlbnQtZGF0YWJhc2UuZGJcIlxuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgbG9hZERhdGFiYXNlVGFibGUoeyBwYXRoLCBmb3JtYXQ6IFwic3FsaXRlXCIsIGRpYWxlY3QgfSksXG4gICAgKS5yZWplY3RzLnRvVGhyb3coJ0RhdGFiYXNlIGZpbGUgXCJub24tZXhpc3RlbnQtZGF0YWJhc2UuZGJcIiBkb2VzIG5vdCBleGlzdCcpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,3 @@
1
+ import type { ColumnMetadata } from "kysely";
2
+ export interface DatabaseField extends ColumnMetadata {
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWVsZC9GaWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gXCJreXNlbHlcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlRmllbGQgZXh0ZW5kcyBDb2x1bW5NZXRhZGF0YSB7fVxuIl19
@@ -0,0 +1,2 @@
1
+ import type { DatabaseField } from "./Field.ts";
2
+ export type DatabaseType = DatabaseField["dataType"];
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2ZpZWxkL1R5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGF0YWJhc2VGaWVsZCB9IGZyb20gXCIuL0ZpZWxkLnRzXCJcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VUeXBlID0gRGF0YWJhc2VGaWVsZFtcImRhdGFUeXBlXCJdXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export type { DatabaseField } from "./Field.ts";
2
+ export type { DatabaseType } from "./Type.ts";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9maWVsZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBEYXRhYmFzZUZpZWxkIH0gZnJvbSBcIi4vRmllbGQudHNcIlxuZXhwb3J0IHR5cGUgeyBEYXRhYmFzZVR5cGUgfSBmcm9tIFwiLi9UeXBlLnRzXCJcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ export { DatabasePlugin } from "./plugin.ts";
2
+ export { inferDatabaseSchema } from "./schema/index.ts";
3
+ export { loadDatabaseTable } from "./table/index.ts";
4
+ export { loadPackageFromDatabase } from "./package/index.ts";
5
+ export { saveDatabaseTable } from "./table/index.ts";
6
+ export { savePackageToDatabase } from "./package/index.ts";
package/build/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { DatabasePlugin } from "./plugin.js";
2
+ export { inferDatabaseSchema } from "./schema/index.js";
3
+ export { loadDatabaseTable } from "./table/index.js";
4
+ export { loadPackageFromDatabase } from "./package/index.js";
5
+ export { saveDatabaseTable } from "./table/index.js";
6
+ export { savePackageToDatabase } from "./package/index.js";
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRTVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3BELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRGF0YWJhc2VQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW4udHNcIlxuXG5leHBvcnQgeyBpbmZlckRhdGFiYXNlU2NoZW1hIH0gZnJvbSBcIi4vc2NoZW1hL2luZGV4LnRzXCJcbmV4cG9ydCB7IGxvYWREYXRhYmFzZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZFBhY2thZ2VGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi9wYWNrYWdlL2luZGV4LnRzXCJcbmV4cG9ydCB7IHNhdmVEYXRhYmFzZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0IHsgc2F2ZVBhY2thZ2VUb0RhdGFiYXNlIH0gZnJvbSBcIi4vcGFja2FnZS9pbmRleC50c1wiXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { loadPackageFromDatabase } from "./load.ts";
2
+ export { savePackageToDatabase } from "./save.ts";
@@ -0,0 +1,3 @@
1
+ export { loadPackageFromDatabase } from "./load.js";
2
+ export { savePackageToDatabase } from "./save.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBsb2FkUGFja2FnZUZyb21EYXRhYmFzZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuZXhwb3J0IHsgc2F2ZVBhY2thZ2VUb0RhdGFiYXNlIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG4iXX0=
@@ -0,0 +1,7 @@
1
+ import type { Package } from "@frictionless-ts/metadata";
2
+ import type { DatabaseFormat } from "../resource/index.ts";
3
+ export declare function loadPackageFromDatabase(connectionString: string, options: {
4
+ format: DatabaseFormat;
5
+ includeTables?: string[];
6
+ excludeTables?: string[];
7
+ }): Promise<Package>;
@@ -0,0 +1,30 @@
1
+ import { createAdapter } from "../adapters/create.js";
2
+ export async function loadPackageFromDatabase(connectionString, options) {
3
+ const { includeTables, excludeTables } = options;
4
+ const adapter = createAdapter(options.format);
5
+ const database = await adapter.connectDatabase(connectionString);
6
+ const databaseSchemas = await database.introspection.getTables();
7
+ const dataPackage = {
8
+ resources: [],
9
+ };
10
+ for (const databaseSchema of databaseSchemas) {
11
+ const name = databaseSchema.name;
12
+ if (includeTables && !includeTables.includes(name)) {
13
+ continue;
14
+ }
15
+ if (excludeTables?.includes(name)) {
16
+ continue;
17
+ }
18
+ const schema = adapter.normalizeSchema(databaseSchema);
19
+ const dialect = { table: name };
20
+ dataPackage.resources.push({
21
+ name,
22
+ path: connectionString,
23
+ format: options.format,
24
+ dialect,
25
+ schema,
26
+ });
27
+ }
28
+ return dataPackage;
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFHckQsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsZ0JBQXdCLEVBQ3hCLE9BSUM7SUFFRCxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUVoRCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUVoRSxNQUFNLFdBQVcsR0FBWTtRQUMzQixTQUFTLEVBQUUsRUFBRTtLQUNkLENBQUE7SUFFRCxLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUE7UUFFaEMsSUFBSSxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkQsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLGFBQWEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxTQUFRO1FBQ1YsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDdEQsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUE7UUFFL0IsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDekIsSUFBSTtZQUNKLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLE9BQU87WUFDUCxNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBjcmVhdGVBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJzL2NyZWF0ZS50c1wiXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlRm9ybWF0IH0gZnJvbSBcIi4uL3Jlc291cmNlL2luZGV4LnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQYWNrYWdlRnJvbURhdGFiYXNlKFxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBmb3JtYXQ6IERhdGFiYXNlRm9ybWF0XG4gICAgaW5jbHVkZVRhYmxlcz86IHN0cmluZ1tdXG4gICAgZXhjbHVkZVRhYmxlcz86IHN0cmluZ1tdXG4gIH0sXG4pIHtcbiAgY29uc3QgeyBpbmNsdWRlVGFibGVzLCBleGNsdWRlVGFibGVzIH0gPSBvcHRpb25zXG5cbiAgY29uc3QgYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIob3B0aW9ucy5mb3JtYXQpXG4gIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgYWRhcHRlci5jb25uZWN0RGF0YWJhc2UoY29ubmVjdGlvblN0cmluZylcbiAgY29uc3QgZGF0YWJhc2VTY2hlbWFzID0gYXdhaXQgZGF0YWJhc2UuaW50cm9zcGVjdGlvbi5nZXRUYWJsZXMoKVxuXG4gIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgIHJlc291cmNlczogW10sXG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFiYXNlU2NoZW1hIG9mIGRhdGFiYXNlU2NoZW1hcykge1xuICAgIGNvbnN0IG5hbWUgPSBkYXRhYmFzZVNjaGVtYS5uYW1lXG5cbiAgICBpZiAoaW5jbHVkZVRhYmxlcyAmJiAhaW5jbHVkZVRhYmxlcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZXhjbHVkZVRhYmxlcz8uaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gYWRhcHRlci5ub3JtYWxpemVTY2hlbWEoZGF0YWJhc2VTY2hlbWEpXG4gICAgY29uc3QgZGlhbGVjdCA9IHsgdGFibGU6IG5hbWUgfVxuXG4gICAgZGF0YVBhY2thZ2UucmVzb3VyY2VzLnB1c2goe1xuICAgICAgbmFtZSxcbiAgICAgIHBhdGg6IGNvbm5lY3Rpb25TdHJpbmcsXG4gICAgICBmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0LFxuICAgICAgZGlhbGVjdCxcbiAgICAgIHNjaGVtYSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGRhdGFQYWNrYWdlXG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import type { SavePackageOptions } from "@frictionless-ts/dataset";
2
+ import type { Package } from "@frictionless-ts/metadata";
3
+ import type { TablePlugin } from "@frictionless-ts/table";
4
+ import type { DatabaseFormat } from "../resource/index.ts";
5
+ export declare function savePackageToDatabase(dataPackage: Package, options: SavePackageOptions & {
6
+ format: DatabaseFormat;
7
+ plugins?: TablePlugin[];
8
+ }): Promise<{
9
+ path: string;
10
+ }>;
@@ -0,0 +1,28 @@
1
+ import { resolveSchema } from "@frictionless-ts/metadata";
2
+ import { isRemoteResource } from "@frictionless-ts/metadata";
3
+ import { saveDatabaseTable } from "../table/index.js";
4
+ export async function savePackageToDatabase(dataPackage, options) {
5
+ for (const resource of dataPackage.resources) {
6
+ for (const plugin of options.plugins ?? []) {
7
+ const isRemote = isRemoteResource(resource);
8
+ if (isRemote && !options.withRemote) {
9
+ continue;
10
+ }
11
+ const table = await plugin.loadTable?.(resource);
12
+ if (table) {
13
+ const dialect = { table: resource.name };
14
+ const schema = await resolveSchema(resource.schema);
15
+ // TODO: support parallel saving?
16
+ await saveDatabaseTable(table, {
17
+ path: options.target,
18
+ format: options.format,
19
+ dialect,
20
+ schema,
21
+ });
22
+ break;
23
+ }
24
+ }
25
+ }
26
+ return { path: options.target };
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2Uvc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFHNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFckQsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsV0FBb0IsRUFDcEIsT0FHQztJQUVELEtBQUssTUFBTSxRQUFRLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzQyxJQUFJLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEMsU0FBUTtZQUNWLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUVoRCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUVuRCxpQ0FBaUM7Z0JBQ2pDLE1BQU0saUJBQWlCLENBQUMsS0FBSyxFQUFFO29CQUM3QixJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDdEIsT0FBTztvQkFDUCxNQUFNO2lCQUNQLENBQUMsQ0FBQTtnQkFFRixNQUFLO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2F2ZVBhY2thZ2VPcHRpb25zIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyByZXNvbHZlU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaXNSZW1vdGVSZXNvdXJjZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgVGFibGVQbHVnaW4gfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlRm9ybWF0IH0gZnJvbSBcIi4uL3Jlc291cmNlL2luZGV4LnRzXCJcbmltcG9ydCB7IHNhdmVEYXRhYmFzZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlL2luZGV4LnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVQYWNrYWdlVG9EYXRhYmFzZShcbiAgZGF0YVBhY2thZ2U6IFBhY2thZ2UsXG4gIG9wdGlvbnM6IFNhdmVQYWNrYWdlT3B0aW9ucyAmIHtcbiAgICBmb3JtYXQ6IERhdGFiYXNlRm9ybWF0XG4gICAgcGx1Z2lucz86IFRhYmxlUGx1Z2luW11cbiAgfSxcbikge1xuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGRhdGFQYWNrYWdlLnJlc291cmNlcykge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIG9wdGlvbnMucGx1Z2lucyA/PyBbXSkge1xuICAgICAgY29uc3QgaXNSZW1vdGUgPSBpc1JlbW90ZVJlc291cmNlKHJlc291cmNlKVxuICAgICAgaWYgKGlzUmVtb3RlICYmICFvcHRpb25zLndpdGhSZW1vdGUpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBwbHVnaW4ubG9hZFRhYmxlPy4ocmVzb3VyY2UpXG5cbiAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICBjb25zdCBkaWFsZWN0ID0geyB0YWJsZTogcmVzb3VyY2UubmFtZSB9XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEocmVzb3VyY2Uuc2NoZW1hKVxuXG4gICAgICAgIC8vIFRPRE86IHN1cHBvcnQgcGFyYWxsZWwgc2F2aW5nP1xuICAgICAgICBhd2FpdCBzYXZlRGF0YWJhc2VUYWJsZSh0YWJsZSwge1xuICAgICAgICAgIHBhdGg6IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQsXG4gICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgIH0pXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBwYXRoOiBvcHRpb25zLnRhcmdldCB9XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import type { SavePackageOptions } from "@frictionless-ts/dataset";
2
+ import type { Package, Resource } from "@frictionless-ts/metadata";
3
+ import type { TablePlugin } from "@frictionless-ts/table";
4
+ import type { SaveTableOptions, Table } from "@frictionless-ts/table";
5
+ export declare class DatabasePlugin implements TablePlugin {
6
+ savePackage(dataPackage: Package, options: SavePackageOptions & {
7
+ plugins?: TablePlugin[];
8
+ }): Promise<{
9
+ path: string;
10
+ } | undefined>;
11
+ loadPackage(source: string): Promise<Package | undefined>;
12
+ inferSchema(resource: Partial<Resource>): Promise<import("@frictionless-ts/metadata").Schema | undefined>;
13
+ loadTable(resource: Partial<Resource>): Promise<import("nodejs-polars").LazyDataFrame<any> | undefined>;
14
+ saveTable(table: Table, options: SaveTableOptions): Promise<string | undefined>;
15
+ }
@@ -0,0 +1,54 @@
1
+ import { inferFormat } from "@frictionless-ts/metadata";
2
+ import { loadPackageFromDatabase } from "./package/index.js";
3
+ import { savePackageToDatabase } from "./package/index.js";
4
+ import { inferDatabaseSchema } from "./schema/index.js";
5
+ import { loadDatabaseTable } from "./table/index.js";
6
+ import { saveDatabaseTable } from "./table/index.js";
7
+ export class DatabasePlugin {
8
+ async savePackage(dataPackage, options) {
9
+ const databaseFormat = getDatabaseFormat({ path: options.target });
10
+ if (!databaseFormat)
11
+ return undefined;
12
+ return await savePackageToDatabase(dataPackage, {
13
+ format: databaseFormat,
14
+ ...options,
15
+ });
16
+ }
17
+ async loadPackage(source) {
18
+ const databaseFormat = getDatabaseFormat({ path: source });
19
+ if (!databaseFormat)
20
+ return undefined;
21
+ return await loadPackageFromDatabase(source, {
22
+ format: databaseFormat,
23
+ });
24
+ }
25
+ async inferSchema(resource) {
26
+ const databaseFormat = getDatabaseFormat(resource);
27
+ if (!databaseFormat)
28
+ return undefined;
29
+ return await inferDatabaseSchema({ ...resource, format: databaseFormat });
30
+ }
31
+ async loadTable(resource) {
32
+ const databaseFormat = getDatabaseFormat(resource);
33
+ if (!databaseFormat)
34
+ return undefined;
35
+ return await loadDatabaseTable({ ...resource, format: databaseFormat });
36
+ }
37
+ async saveTable(table, options) {
38
+ const { path, format } = options;
39
+ const databaseFormat = getDatabaseFormat({ path, format });
40
+ if (!databaseFormat)
41
+ return undefined;
42
+ return await saveDatabaseTable(table, {
43
+ ...options,
44
+ format: databaseFormat,
45
+ });
46
+ }
47
+ }
48
+ function getDatabaseFormat(resource) {
49
+ const format = inferFormat(resource);
50
+ return format === "postgresql" || format === "mysql" || format === "sqlite"
51
+ ? format
52
+ : undefined;
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUd2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVwRCxNQUFNLE9BQU8sY0FBYztJQUN6QixLQUFLLENBQUMsV0FBVyxDQUNmLFdBQW9CLEVBQ3BCLE9BQXlEO1FBRXpELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2xFLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFckMsT0FBTyxNQUFNLHFCQUFxQixDQUFDLFdBQVcsRUFBRTtZQUM5QyxNQUFNLEVBQUUsY0FBYztZQUN0QixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQzlCLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDMUQsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVyQyxPQUFPLE1BQU0sdUJBQXVCLENBQUMsTUFBTSxFQUFFO1lBQzNDLE1BQU0sRUFBRSxjQUFjO1NBQ3ZCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQTJCO1FBQzNDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xELElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFckMsT0FBTyxNQUFNLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBMkI7UUFDekMsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbEQsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVyQyxPQUFPLE1BQU0saUJBQWlCLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFZLEVBQUUsT0FBeUI7UUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUE7UUFFaEMsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUMxRCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRXJDLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7WUFDcEMsR0FBRyxPQUFPO1lBQ1YsTUFBTSxFQUFFLGNBQWM7U0FDdkIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxRQUEyQjtJQUNwRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDcEMsT0FBTyxNQUFNLEtBQUssWUFBWSxJQUFJLE1BQU0sS0FBSyxPQUFPLElBQUksTUFBTSxLQUFLLFFBQVE7UUFDekUsQ0FBQyxDQUFDLE1BQU07UUFDUixDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2F2ZVBhY2thZ2VPcHRpb25zIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YXNldFwiXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2UsIFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgaW5mZXJGb3JtYXQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFRhYmxlUGx1Z2luIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHR5cGUgeyBTYXZlVGFibGVPcHRpb25zLCBUYWJsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL3RhYmxlXCJcbmltcG9ydCB7IGxvYWRQYWNrYWdlRnJvbURhdGFiYXNlIH0gZnJvbSBcIi4vcGFja2FnZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzYXZlUGFja2FnZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi9wYWNrYWdlL2luZGV4LnRzXCJcbmltcG9ydCB7IGluZmVyRGF0YWJhc2VTY2hlbWEgfSBmcm9tIFwiLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHsgbG9hZERhdGFiYXNlVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzYXZlRGF0YWJhc2VUYWJsZSB9IGZyb20gXCIuL3RhYmxlL2luZGV4LnRzXCJcblxuZXhwb3J0IGNsYXNzIERhdGFiYXNlUGx1Z2luIGltcGxlbWVudHMgVGFibGVQbHVnaW4ge1xuICBhc3luYyBzYXZlUGFja2FnZShcbiAgICBkYXRhUGFja2FnZTogUGFja2FnZSxcbiAgICBvcHRpb25zOiBTYXZlUGFja2FnZU9wdGlvbnMgJiB7IHBsdWdpbnM/OiBUYWJsZVBsdWdpbltdIH0sXG4gICkge1xuICAgIGNvbnN0IGRhdGFiYXNlRm9ybWF0ID0gZ2V0RGF0YWJhc2VGb3JtYXQoeyBwYXRoOiBvcHRpb25zLnRhcmdldCB9KVxuICAgIGlmICghZGF0YWJhc2VGb3JtYXQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiBhd2FpdCBzYXZlUGFja2FnZVRvRGF0YWJhc2UoZGF0YVBhY2thZ2UsIHtcbiAgICAgIGZvcm1hdDogZGF0YWJhc2VGb3JtYXQsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBsb2FkUGFja2FnZShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGFiYXNlRm9ybWF0ID0gZ2V0RGF0YWJhc2VGb3JtYXQoeyBwYXRoOiBzb3VyY2UgfSlcbiAgICBpZiAoIWRhdGFiYXNlRm9ybWF0KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gYXdhaXQgbG9hZFBhY2thZ2VGcm9tRGF0YWJhc2Uoc291cmNlLCB7XG4gICAgICBmb3JtYXQ6IGRhdGFiYXNlRm9ybWF0LFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBpbmZlclNjaGVtYShyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgICBjb25zdCBkYXRhYmFzZUZvcm1hdCA9IGdldERhdGFiYXNlRm9ybWF0KHJlc291cmNlKVxuICAgIGlmICghZGF0YWJhc2VGb3JtYXQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiBhd2FpdCBpbmZlckRhdGFiYXNlU2NoZW1hKHsgLi4ucmVzb3VyY2UsIGZvcm1hdDogZGF0YWJhc2VGb3JtYXQgfSlcbiAgfVxuXG4gIGFzeW5jIGxvYWRUYWJsZShyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgICBjb25zdCBkYXRhYmFzZUZvcm1hdCA9IGdldERhdGFiYXNlRm9ybWF0KHJlc291cmNlKVxuICAgIGlmICghZGF0YWJhc2VGb3JtYXQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiBhd2FpdCBsb2FkRGF0YWJhc2VUYWJsZSh7IC4uLnJlc291cmNlLCBmb3JtYXQ6IGRhdGFiYXNlRm9ybWF0IH0pXG4gIH1cblxuICBhc3luYyBzYXZlVGFibGUodGFibGU6IFRhYmxlLCBvcHRpb25zOiBTYXZlVGFibGVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBwYXRoLCBmb3JtYXQgfSA9IG9wdGlvbnNcblxuICAgIGNvbnN0IGRhdGFiYXNlRm9ybWF0ID0gZ2V0RGF0YWJhc2VGb3JtYXQoeyBwYXRoLCBmb3JtYXQgfSlcbiAgICBpZiAoIWRhdGFiYXNlRm9ybWF0KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gYXdhaXQgc2F2ZURhdGFiYXNlVGFibGUodGFibGUsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBmb3JtYXQ6IGRhdGFiYXNlRm9ybWF0LFxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VGb3JtYXQocmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+KSB7XG4gIGNvbnN0IGZvcm1hdCA9IGluZmVyRm9ybWF0KHJlc291cmNlKVxuICByZXR1cm4gZm9ybWF0ID09PSBcInBvc3RncmVzcWxcIiB8fCBmb3JtYXQgPT09IFwibXlzcWxcIiB8fCBmb3JtYXQgPT09IFwic3FsaXRlXCJcbiAgICA/IGZvcm1hdFxuICAgIDogdW5kZWZpbmVkXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};