@xata.io/drizzle 0.0.0-next.v8f0b7eb0f7b8e6548d2d4a1f2d5c089e8e46863e → 0.0.0-next.v96c0efcf2b6fc9674a4a1e547d0b9c665f255e80
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/.turbo/turbo-build.log +16 -5
- package/CHANGELOG.md +24 -4
- package/dist/index.cjs +98 -124
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +47 -65
- package/dist/index.mjs +95 -123
- package/dist/index.mjs.map +1 -1
- package/dist/pg.cjs +215 -0
- package/dist/pg.cjs.map +1 -0
- package/dist/pg.d.ts +61 -0
- package/dist/pg.mjs +209 -0
- package/dist/pg.mjs.map +1 -0
- package/package.json +11 -4
- package/test/drizzle.test.ts +6295 -0
- package/test/schema.ts +85 -0
package/dist/pg.d.ts
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
import { entityKind, Logger, SelectedFieldsOrdered, TablesRelationalConfig, RelationalSchemaConfig, Query, Assume, DrizzleConfig } from 'drizzle-orm';
|
2
|
+
import { PreparedQueryConfig, PgPreparedQuery, PgColumn, PgSession, PgDialect, PgTransactionConfig, PgTransaction, QueryResultHKT, PgDatabase } from 'drizzle-orm/pg-core';
|
3
|
+
import { Pool, PoolClient, Client, QueryResult, QueryResultRow } from 'pg';
|
4
|
+
|
5
|
+
type XataClient = Pool | PoolClient | Client;
|
6
|
+
declare class XataPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {
|
7
|
+
private client;
|
8
|
+
private params;
|
9
|
+
private logger;
|
10
|
+
private fields;
|
11
|
+
private _isResponseInArrayMode;
|
12
|
+
private customResultMapper?;
|
13
|
+
static readonly [entityKind]: string;
|
14
|
+
private rawQueryConfig;
|
15
|
+
private queryConfig;
|
16
|
+
constructor(client: XataClient, queryString: string, params: unknown[], logger: Logger, fields: SelectedFieldsOrdered<PgColumn> | undefined, name: string | undefined, _isResponseInArrayMode: boolean, customResultMapper?: ((rows: unknown[][]) => T['execute']) | undefined);
|
17
|
+
execute(placeholderValues?: Record<string, unknown> | undefined): Promise<T['execute']>;
|
18
|
+
all(placeholderValues?: Record<string, unknown> | undefined): Promise<T['all']>;
|
19
|
+
values(placeholderValues?: Record<string, unknown> | undefined): Promise<T['values']>;
|
20
|
+
/** @internal */
|
21
|
+
isResponseInArrayMode(): boolean;
|
22
|
+
}
|
23
|
+
interface XataSessionOptions {
|
24
|
+
logger?: Logger;
|
25
|
+
}
|
26
|
+
declare class XataSession<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig> extends PgSession<XataQueryResultHKT, TFullSchema, TSchema> {
|
27
|
+
private client;
|
28
|
+
private schema;
|
29
|
+
private options;
|
30
|
+
static readonly [entityKind]: string;
|
31
|
+
private logger;
|
32
|
+
constructor(client: XataClient, dialect: PgDialect, schema: RelationalSchemaConfig<TSchema> | undefined, options?: XataSessionOptions);
|
33
|
+
prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(query: Query, fields: SelectedFieldsOrdered<PgColumn> | undefined, name: string | undefined, isResponseInArrayMode: boolean, customResultMapper?: (rows: unknown[][]) => T['execute']): PgPreparedQuery<T>;
|
34
|
+
query(query: string, params: unknown[]): Promise<QueryResult>;
|
35
|
+
queryObjects<T extends QueryResultRow>(query: string, params: unknown[]): Promise<QueryResult<T>>;
|
36
|
+
transaction<T>(transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>, config?: PgTransactionConfig): Promise<T>;
|
37
|
+
}
|
38
|
+
declare class XataTransaction<TFullSchema extends Record<string, unknown>, TSchema extends TablesRelationalConfig> extends PgTransaction<XataQueryResultHKT, TFullSchema, TSchema> {
|
39
|
+
static readonly [entityKind]: string;
|
40
|
+
transaction<T>(transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T>;
|
41
|
+
}
|
42
|
+
interface XataQueryResultHKT extends QueryResultHKT {
|
43
|
+
type: QueryResult<Assume<this['row'], QueryResultRow>>;
|
44
|
+
}
|
45
|
+
|
46
|
+
interface XataDriverOptions {
|
47
|
+
logger?: Logger;
|
48
|
+
}
|
49
|
+
declare class XataDriver {
|
50
|
+
private client;
|
51
|
+
private dialect;
|
52
|
+
private options;
|
53
|
+
static readonly [entityKind]: string;
|
54
|
+
constructor(client: XataClient, dialect: PgDialect, options?: XataDriverOptions);
|
55
|
+
createSession(schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined): XataSession<Record<string, unknown>, TablesRelationalConfig>;
|
56
|
+
initMappers(): void;
|
57
|
+
}
|
58
|
+
type XataDatabase<TSchema extends Record<string, unknown> = Record<string, never>> = PgDatabase<XataQueryResultHKT, TSchema>;
|
59
|
+
declare function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(client: XataClient, config?: DrizzleConfig<TSchema>): XataDatabase<TSchema>;
|
60
|
+
|
61
|
+
export { type XataClient, type XataDatabase, XataDriver, type XataDriverOptions, XataPreparedQuery, type XataQueryResultHKT, XataSession, type XataSessionOptions, XataTransaction, drizzle };
|
package/dist/pg.mjs
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
import { is, Column, SQL, getTableName, fillPlaceholders, entityKind, NoopLogger, sql, DefaultLogger, extractTablesRelationalConfig, createTableRelationsHelpers } from 'drizzle-orm';
|
2
|
+
import { PgPreparedQuery, PgSession, PgTransaction, PgDialect, PgDatabase } from 'drizzle-orm/pg-core';
|
3
|
+
import { Pool } from 'pg';
|
4
|
+
|
5
|
+
function mapResultRow(columns, row, joinsNotNullableMap) {
|
6
|
+
const nullifyMap = {};
|
7
|
+
const result = columns.reduce((result2, { path, field }, columnIndex) => {
|
8
|
+
let decoder;
|
9
|
+
if (is(field, Column)) {
|
10
|
+
decoder = field;
|
11
|
+
} else if (is(field, SQL)) {
|
12
|
+
decoder = field.decoder;
|
13
|
+
} else {
|
14
|
+
decoder = field.sql.decoder;
|
15
|
+
}
|
16
|
+
let node = result2;
|
17
|
+
for (const [pathChunkIndex, pathChunk] of path.entries()) {
|
18
|
+
if (pathChunkIndex < path.length - 1) {
|
19
|
+
if (!(pathChunk in node)) {
|
20
|
+
node[pathChunk] = {};
|
21
|
+
}
|
22
|
+
node = node[pathChunk];
|
23
|
+
} else {
|
24
|
+
const rawValue = row[columnIndex];
|
25
|
+
const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
|
26
|
+
if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
|
27
|
+
const objectName = path[0];
|
28
|
+
if (!(objectName in nullifyMap)) {
|
29
|
+
nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
|
30
|
+
} else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
|
31
|
+
nullifyMap[objectName] = false;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
return result2;
|
37
|
+
}, {});
|
38
|
+
if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
|
39
|
+
for (const [objectName, tableName] of Object.entries(nullifyMap)) {
|
40
|
+
if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
|
41
|
+
result[objectName] = null;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
return result;
|
46
|
+
}
|
47
|
+
|
48
|
+
var _a$1, _b, _c;
|
49
|
+
class XataPreparedQuery extends PgPreparedQuery {
|
50
|
+
constructor(client, queryString, params, logger, fields, name, _isResponseInArrayMode, customResultMapper) {
|
51
|
+
super({ sql: queryString, params });
|
52
|
+
this.client = client;
|
53
|
+
this.params = params;
|
54
|
+
this.logger = logger;
|
55
|
+
this.fields = fields;
|
56
|
+
this._isResponseInArrayMode = _isResponseInArrayMode;
|
57
|
+
this.customResultMapper = customResultMapper;
|
58
|
+
this.rawQueryConfig = {
|
59
|
+
name,
|
60
|
+
text: queryString
|
61
|
+
};
|
62
|
+
this.queryConfig = {
|
63
|
+
name,
|
64
|
+
text: queryString,
|
65
|
+
rowMode: "array"
|
66
|
+
};
|
67
|
+
}
|
68
|
+
async execute(placeholderValues = {}) {
|
69
|
+
const params = fillPlaceholders(this.params, placeholderValues);
|
70
|
+
this.logger.logQuery(this.rawQueryConfig.text, params);
|
71
|
+
const {
|
72
|
+
fields,
|
73
|
+
client,
|
74
|
+
rawQueryConfig: rawQuery,
|
75
|
+
queryConfig: query,
|
76
|
+
// @ts-expect-error joinsNotNullableMap is internal
|
77
|
+
joinsNotNullableMap,
|
78
|
+
customResultMapper
|
79
|
+
} = this;
|
80
|
+
if (!fields && !customResultMapper) {
|
81
|
+
return await client.query(rawQuery, params);
|
82
|
+
}
|
83
|
+
const result = await client.query(query, params);
|
84
|
+
return customResultMapper ? customResultMapper(result.rows) : result.rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
|
85
|
+
}
|
86
|
+
all(placeholderValues = {}) {
|
87
|
+
const params = fillPlaceholders(this.params, placeholderValues);
|
88
|
+
this.logger.logQuery(this.rawQueryConfig.text, params);
|
89
|
+
return this.client.query(this.rawQueryConfig, params).then((result) => result.rows);
|
90
|
+
}
|
91
|
+
values(placeholderValues = {}) {
|
92
|
+
const params = fillPlaceholders(this.params, placeholderValues);
|
93
|
+
this.logger.logQuery(this.rawQueryConfig.text, params);
|
94
|
+
return this.client.query(this.queryConfig, params).then((result) => result.rows);
|
95
|
+
}
|
96
|
+
/** @internal */
|
97
|
+
isResponseInArrayMode() {
|
98
|
+
return this._isResponseInArrayMode;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
_a$1 = entityKind;
|
102
|
+
XataPreparedQuery[_a$1] = "XataPreparedQuery";
|
103
|
+
const _XataSession = class _XataSession extends PgSession {
|
104
|
+
constructor(client, dialect, schema, options = {}) {
|
105
|
+
super(dialect);
|
106
|
+
this.client = client;
|
107
|
+
this.schema = schema;
|
108
|
+
this.options = options;
|
109
|
+
this.logger = options.logger ?? new NoopLogger();
|
110
|
+
}
|
111
|
+
prepareQuery(query, fields, name, isResponseInArrayMode, customResultMapper) {
|
112
|
+
return new XataPreparedQuery(
|
113
|
+
this.client,
|
114
|
+
query.sql,
|
115
|
+
query.params,
|
116
|
+
this.logger,
|
117
|
+
fields,
|
118
|
+
name,
|
119
|
+
isResponseInArrayMode,
|
120
|
+
customResultMapper
|
121
|
+
);
|
122
|
+
}
|
123
|
+
async query(query, params) {
|
124
|
+
this.logger.logQuery(query, params);
|
125
|
+
return await this.client.query({ rowMode: "array", text: query, values: params });
|
126
|
+
}
|
127
|
+
async queryObjects(query, params) {
|
128
|
+
return await this.client.query(query, params);
|
129
|
+
}
|
130
|
+
async transaction(transaction, config = {}) {
|
131
|
+
const session = this.client instanceof Pool ? new _XataSession(await this.client.connect(), this.dialect, this.schema, this.options) : this;
|
132
|
+
const tx = new XataTransaction(this.dialect, session, this.schema);
|
133
|
+
await tx.execute(sql`begin ${tx.getTransactionConfigSQL(config)}`);
|
134
|
+
try {
|
135
|
+
const result = await transaction(tx);
|
136
|
+
await tx.execute(sql`commit`);
|
137
|
+
return result;
|
138
|
+
} catch (error) {
|
139
|
+
await tx.execute(sql`rollback`);
|
140
|
+
throw error;
|
141
|
+
} finally {
|
142
|
+
if (this.client instanceof Pool) {
|
143
|
+
session.client.release();
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
};
|
148
|
+
_b = entityKind;
|
149
|
+
_XataSession[_b] = "XataSession";
|
150
|
+
let XataSession = _XataSession;
|
151
|
+
const _XataTransaction = class _XataTransaction extends PgTransaction {
|
152
|
+
async transaction(transaction) {
|
153
|
+
const savepointName = `sp${this.nestedIndex + 1}`;
|
154
|
+
const tx = new _XataTransaction(this.dialect, this.session, this.schema, this.nestedIndex + 1);
|
155
|
+
await tx.execute(sql.raw(`savepoint ${savepointName}`));
|
156
|
+
try {
|
157
|
+
const result = await transaction(tx);
|
158
|
+
await tx.execute(sql.raw(`release savepoint ${savepointName}`));
|
159
|
+
return result;
|
160
|
+
} catch (e) {
|
161
|
+
await tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));
|
162
|
+
throw e;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
};
|
166
|
+
_c = entityKind;
|
167
|
+
_XataTransaction[_c] = "XataTransaction";
|
168
|
+
let XataTransaction = _XataTransaction;
|
169
|
+
|
170
|
+
var _a;
|
171
|
+
class XataDriver {
|
172
|
+
constructor(client, dialect, options = {}) {
|
173
|
+
this.client = client;
|
174
|
+
this.dialect = dialect;
|
175
|
+
this.options = options;
|
176
|
+
this.initMappers();
|
177
|
+
}
|
178
|
+
createSession(schema) {
|
179
|
+
return new XataSession(this.client, this.dialect, schema, { logger: this.options.logger });
|
180
|
+
}
|
181
|
+
initMappers() {
|
182
|
+
}
|
183
|
+
}
|
184
|
+
_a = entityKind;
|
185
|
+
XataDriver[_a] = "XataDriver";
|
186
|
+
function drizzle(client, config = {}) {
|
187
|
+
const dialect = new PgDialect();
|
188
|
+
let logger;
|
189
|
+
if (config.logger === true) {
|
190
|
+
logger = new DefaultLogger();
|
191
|
+
} else if (config.logger !== false) {
|
192
|
+
logger = config.logger;
|
193
|
+
}
|
194
|
+
let schema;
|
195
|
+
if (config.schema) {
|
196
|
+
const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
|
197
|
+
schema = {
|
198
|
+
fullSchema: config.schema,
|
199
|
+
schema: tablesConfig.tables,
|
200
|
+
tableNamesMap: tablesConfig.tableNamesMap
|
201
|
+
};
|
202
|
+
}
|
203
|
+
const driver = new XataDriver(client, dialect, { logger });
|
204
|
+
const session = driver.createSession(schema);
|
205
|
+
return new PgDatabase(dialect, session, schema);
|
206
|
+
}
|
207
|
+
|
208
|
+
export { XataDriver, XataPreparedQuery, XataSession, XataTransaction, drizzle };
|
209
|
+
//# sourceMappingURL=pg.mjs.map
|
package/dist/pg.mjs.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"pg.mjs","sources":["../src/shared/utils.ts","../src/pg/session.ts","../src/pg/driver.ts"],"sourcesContent":["import { AnyColumn, Column, DriverValueDecoder, SQL, SelectedFieldsOrdered, getTableName, is } from 'drizzle-orm';\n\nexport function mapResultRow<TResult>(\n columns: SelectedFieldsOrdered<AnyColumn>,\n row: unknown[],\n joinsNotNullableMap: Record<string, boolean> | undefined\n): TResult {\n // Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n const nullifyMap: Record<string, string | false> = {};\n\n const result = columns.reduce<Record<string, any>>((result, { path, field }, columnIndex) => {\n let decoder: DriverValueDecoder<unknown, unknown>;\n if (is(field, Column)) {\n decoder = field;\n } else if (is(field, SQL)) {\n decoder = (field as any).decoder;\n } else {\n decoder = (field.sql as any).decoder;\n }\n let node = result;\n for (const [pathChunkIndex, pathChunk] of path.entries()) {\n if (pathChunkIndex < path.length - 1) {\n if (!(pathChunk in node)) {\n node[pathChunk] = {};\n }\n node = node[pathChunk];\n } else {\n const rawValue = row[columnIndex]!;\n const value = (node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue));\n\n if (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n const objectName = path[0]!;\n if (!(objectName in nullifyMap)) {\n nullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n } else if (\n typeof nullifyMap[objectName] === 'string' &&\n nullifyMap[objectName] !== getTableName(field.table)\n ) {\n nullifyMap[objectName] = false;\n }\n }\n }\n }\n return result;\n }, {});\n\n // Nullify all nested objects from nullifyMap that are nullable\n if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n for (const [objectName, tableName] of Object.entries(nullifyMap)) {\n if (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n result[objectName] = null;\n }\n }\n }\n\n return result as TResult;\n}\n","import {\n Assume,\n Logger,\n NoopLogger,\n Query,\n RelationalSchemaConfig,\n SelectedFieldsOrdered,\n TablesRelationalConfig,\n entityKind,\n fillPlaceholders,\n sql\n} from 'drizzle-orm';\nimport {\n PgColumn,\n PgDialect,\n PgSession,\n PgTransaction,\n PgTransactionConfig,\n PgPreparedQuery,\n PreparedQueryConfig,\n QueryResultHKT\n} from 'drizzle-orm/pg-core';\nimport { Client, Pool, PoolClient, QueryArrayConfig, QueryConfig, QueryResult, QueryResultRow } from 'pg';\nimport { mapResultRow } from '../shared/utils';\n\nexport type XataClient = Pool | PoolClient | Client;\n\nexport class XataPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n static readonly [entityKind]: string = 'XataPreparedQuery';\n\n private rawQueryConfig: QueryConfig;\n private queryConfig: QueryArrayConfig;\n\n constructor(\n private client: XataClient,\n queryString: string,\n private params: unknown[],\n private logger: Logger,\n private fields: SelectedFieldsOrdered<PgColumn> | undefined,\n name: string | undefined,\n private _isResponseInArrayMode: boolean,\n private customResultMapper?: (rows: unknown[][]) => T['execute']\n ) {\n super({ sql: queryString, params });\n this.rawQueryConfig = {\n name,\n text: queryString\n };\n this.queryConfig = {\n name,\n text: queryString,\n rowMode: 'array'\n };\n }\n\n async execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n const params = fillPlaceholders(this.params, placeholderValues);\n\n this.logger.logQuery(this.rawQueryConfig.text, params);\n\n const {\n fields,\n client,\n rawQueryConfig: rawQuery,\n queryConfig: query,\n // @ts-expect-error joinsNotNullableMap is internal\n joinsNotNullableMap,\n customResultMapper\n } = this;\n if (!fields && !customResultMapper) {\n return await client.query(rawQuery, params);\n }\n\n const result = await client.query(query, params);\n\n return customResultMapper\n ? customResultMapper(result.rows)\n : result.rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n }\n\n all(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n const params = fillPlaceholders(this.params, placeholderValues);\n this.logger.logQuery(this.rawQueryConfig.text, params);\n return this.client.query(this.rawQueryConfig, params).then((result) => result.rows);\n }\n\n values(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['values']> {\n const params = fillPlaceholders(this.params, placeholderValues);\n this.logger.logQuery(this.rawQueryConfig.text, params);\n return this.client.query(this.queryConfig, params).then((result) => result.rows);\n }\n\n /** @internal */\n isResponseInArrayMode() {\n return this._isResponseInArrayMode;\n }\n}\n\nexport interface XataSessionOptions {\n logger?: Logger;\n}\n\nexport class XataSession<\n TFullSchema extends Record<string, unknown>,\n TSchema extends TablesRelationalConfig\n> extends PgSession<XataQueryResultHKT, TFullSchema, TSchema> {\n static readonly [entityKind]: string = 'XataSession';\n\n private logger: Logger;\n\n constructor(\n private client: XataClient,\n dialect: PgDialect,\n private schema: RelationalSchemaConfig<TSchema> | undefined,\n private options: XataSessionOptions = {}\n ) {\n super(dialect);\n this.logger = options.logger ?? new NoopLogger();\n }\n\n prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n query: Query,\n fields: SelectedFieldsOrdered<PgColumn> | undefined,\n name: string | undefined,\n isResponseInArrayMode: boolean,\n customResultMapper?: (rows: unknown[][]) => T['execute']\n ): PgPreparedQuery<T> {\n return new XataPreparedQuery(\n this.client,\n query.sql,\n query.params,\n this.logger,\n fields,\n name,\n isResponseInArrayMode,\n customResultMapper\n );\n }\n\n async query(query: string, params: unknown[]): Promise<QueryResult> {\n this.logger.logQuery(query, params);\n return await this.client.query({ rowMode: 'array', text: query, values: params });\n }\n\n async queryObjects<T extends QueryResultRow>(query: string, params: unknown[]): Promise<QueryResult<T>> {\n return await this.client.query<T>(query, params);\n }\n\n override async transaction<T>(\n transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>,\n config: PgTransactionConfig = {}\n ): Promise<T> {\n const session =\n this.client instanceof Pool\n ? new XataSession(await this.client.connect(), this.dialect, this.schema, this.options)\n : this;\n const tx = new XataTransaction(this.dialect, session, this.schema);\n // @ts-expect-error getTransactionConfigSQL is internal\n await tx.execute(sql`begin ${tx.getTransactionConfigSQL(config)}`);\n try {\n const result = await transaction(tx);\n await tx.execute(sql`commit`);\n return result;\n } catch (error) {\n await tx.execute(sql`rollback`);\n throw error;\n } finally {\n if (this.client instanceof Pool) {\n (session.client as PoolClient).release();\n }\n }\n }\n}\n\nexport class XataTransaction<\n TFullSchema extends Record<string, unknown>,\n TSchema extends TablesRelationalConfig\n> extends PgTransaction<XataQueryResultHKT, TFullSchema, TSchema> {\n static readonly [entityKind]: string = 'XataTransaction';\n\n override async transaction<T>(transaction: (tx: XataTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T> {\n const savepointName = `sp${this.nestedIndex + 1}`;\n // @ts-expect-error session and dialect are internal\n const tx = new XataTransaction(this.dialect, this.session, this.schema, this.nestedIndex + 1);\n await tx.execute(sql.raw(`savepoint ${savepointName}`));\n try {\n const result = await transaction(tx);\n await tx.execute(sql.raw(`release savepoint ${savepointName}`));\n return result;\n } catch (e) {\n await tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n throw e;\n }\n }\n}\n\nexport interface XataQueryResultHKT extends QueryResultHKT {\n type: QueryResult<Assume<this['row'], QueryResultRow>>;\n}\n","import {\n DefaultLogger,\n DrizzleConfig,\n Logger,\n RelationalSchemaConfig,\n TablesRelationalConfig,\n createTableRelationsHelpers,\n entityKind,\n extractTablesRelationalConfig\n} from 'drizzle-orm';\nimport type { XataClient, XataQueryResultHKT } from './session.js';\nimport { XataSession } from './session.js';\nimport { PgDatabase, PgDialect } from 'drizzle-orm/pg-core';\n\nexport interface XataDriverOptions {\n logger?: Logger;\n}\n\nexport class XataDriver {\n static readonly [entityKind]: string = 'XataDriver';\n\n constructor(private client: XataClient, private dialect: PgDialect, private options: XataDriverOptions = {}) {\n this.initMappers();\n }\n\n createSession(\n schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined\n ): XataSession<Record<string, unknown>, TablesRelationalConfig> {\n return new XataSession(this.client, this.dialect, schema, { logger: this.options.logger });\n }\n\n initMappers() {\n // TODO: Add custom type parsers\n }\n}\n\nexport type XataDatabase<TSchema extends Record<string, unknown> = Record<string, never>> = PgDatabase<\n XataQueryResultHKT,\n TSchema\n>;\n\nexport function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(\n client: XataClient,\n config: DrizzleConfig<TSchema> = {}\n): XataDatabase<TSchema> {\n const dialect = new PgDialect();\n let logger;\n if (config.logger === true) {\n logger = new DefaultLogger();\n } else if (config.logger !== false) {\n logger = config.logger;\n }\n\n let schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n if (config.schema) {\n const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);\n schema = {\n fullSchema: config.schema,\n schema: tablesConfig.tables,\n tableNamesMap: tablesConfig.tableNamesMap\n };\n }\n\n const driver = new XataDriver(client, dialect, { logger });\n const session = driver.createSession(schema);\n return new PgDatabase(dialect, session, schema) as XataDatabase<TSchema>;\n}\n"],"names":["result","_a"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@xata.io/drizzle",
|
3
|
-
"version": "0.0.0-next.
|
3
|
+
"version": "0.0.0-next.v96c0efcf2b6fc9674a4a1e547d0b9c665f255e80",
|
4
4
|
"description": "",
|
5
5
|
"main": "./dist/index.cjs",
|
6
6
|
"module": "./dist/index.mjs",
|
@@ -10,6 +10,11 @@
|
|
10
10
|
"import": "./dist/index.mjs",
|
11
11
|
"require": "./dist/index.cjs",
|
12
12
|
"types": "./dist/index.d.ts"
|
13
|
+
},
|
14
|
+
"./pg": {
|
15
|
+
"import": "./dist/pg.mjs",
|
16
|
+
"require": "./dist/pg.cjs",
|
17
|
+
"types": "./dist/pg.d.ts"
|
13
18
|
}
|
14
19
|
},
|
15
20
|
"author": "",
|
@@ -18,13 +23,15 @@
|
|
18
23
|
"url": "https://github.com/xataio/client-ts/issues"
|
19
24
|
},
|
20
25
|
"dependencies": {
|
21
|
-
"@xata.io/client": "0.0.0-next.
|
26
|
+
"@xata.io/client": "0.0.0-next.v96c0efcf2b6fc9674a4a1e547d0b9c665f255e80"
|
22
27
|
},
|
23
28
|
"devDependencies": {
|
24
|
-
"
|
29
|
+
"@types/pg": "^8.11.4",
|
30
|
+
"drizzle-orm": "^0.30.7",
|
31
|
+
"pg": "^8.11.5"
|
25
32
|
},
|
26
33
|
"peerDependencies": {
|
27
|
-
"drizzle-orm": "
|
34
|
+
"drizzle-orm": "*"
|
28
35
|
},
|
29
36
|
"scripts": {
|
30
37
|
"build": "rimraf dist && rollup -c",
|