pqb 0.66.2 → 0.66.4
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/dist/index.d.ts +33 -13
- package/dist/index.js +68 -55
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +68 -55
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.ts +2 -2
- package/dist/node-postgres.js +59 -14
- package/dist/node-postgres.js.map +1 -1
- package/dist/node-postgres.mjs +59 -14
- package/dist/node-postgres.mjs.map +1 -1
- package/dist/postgres-js.js +52 -18
- package/dist/postgres-js.js.map +1 -1
- package/dist/postgres-js.mjs +53 -19
- package/dist/postgres-js.mjs.map +1 -1
- package/package.json +1 -1
package/dist/internal.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Adapter, AdapterClass, AdapterConfigBase, AdapterParams, AfterCommitStandaloneHook, AfterHook, ArrayColumn, ArrayColumnValue, ArrayData, AsyncState, BaseNumberData, BigIntColumn, BigSerialColumn, BitColumn, BitVaryingColumn, BooleanColumn, BoxColumn, ByteaColumn, CidrColumn, CircleColumn, CitextColumn, Code, Codes, Column, ColumnFromDbParams, ColumnSchemaConfig, ColumnSchemaGetterColumns, ColumnSchemaGetterTableClass, ColumnToCodeCtx, ColumnTypeSchemaArg, ColumnsByType, ColumnsShape, ComputedColumnsFromOptions, ComputedOptionsConfig, ComputedOptionsFactory, CreateCtx, CreateData, CreateManyMethodsNames, CreateMethodsNames, CreateSelf, CustomTypeColumn, DateColumn, DateColumnData, DbDomainArg, DbExtension, DbOptions, DbResult, DbRlsOptions, DbSharedOptions, DbSqlMethod, DbStructureDomainsMap, DbTableOptionScopes, DbTableOptions, DecimalColumn, DecimalColumnData, DefaultColumnTypes, DefaultPrivileges, DefaultSchemaConfig, DeleteMethodsNames, DomainColumn, DoublePrecisionColumn, DriverAdapter, DynamicRawSQL, EmptyObject, EmptyTuple, EnumColumn, Expression, FromArg, FromResult, GeneratorIgnore, HookSelectValue, InetColumn, IntegerColumn, IntervalColumn, IsQuery, IsolationLevel, JSONColumn, JSONTextColumn, JoinQueryMethod, JoinedShapes, LineColumn, LsegColumn, MacAddr8Column, MacAddrColumn, MapTableScopesOption, MaybeArray, MaybePromise, MergeQuery, MoneyColumn, NoPrimaryKeyOption, NonUniqDataItem, NumberColumnData, Operators, OperatorsArray, OperatorsJson, OperatorsOrdinalText, Ord, PathColumn, PickQueryInputType, PickQueryInternal, PickQueryQ, PickQueryRelations, PickQuerySelectableRelations, PickQueryShape, PointColumn, PolygonColumn, PostgisGeographyPointColumn, QueryAfterHook, QueryArraysResult, QueryBeforeActionHook, QueryBeforeHook, QueryData, QueryHasWhere, QueryHookUtils, QueryHooks, QueryInternal, QueryLogObject, QueryLogOptions, QueryLogger, QueryManyTake, QueryManyTakeOptional, QueryOrExpression, QueryResult, QueryResultRow, QueryReturnType, QuerySchema, QueryScopes, RawSql, RawSqlBase, RealColumn, RecordKeyTrue, RecordOptionalString, RecordString, RecordStringOrNumber, RecordUnknown, RelationConfigBase, RelationJoinQuery, RelationsBase, SearchWeight, SelectableFromShape, SerialColumn, SerialColumnData, ShallowSimplify, ShapeColumnPrimaryKeys, ShapeUniqueColumns, SingleSql, SingleSqlItem, SmallIntColumn, SmallSerialColumn, Sql, SqlFn, SqlSessionState, StorageOptions, StringColumn, StringData, TableData, TableDataFn, TableDataInput, TableDataItem, TableDataItemsUniqueColumnTuples, TableDataItemsUniqueColumns, TableDataItemsUniqueConstraints, TableDataMethods, TableRlsConfig, TemplateLiteralArgs, TextColumn, TimeColumn, TimestampColumn, TimestampTZColumn, Timestamps, TransactionAdapterClass, TransactionOptions, TsQueryColumn, TsVectorColumn, UUIDColumn, UniqueConstraints, UniqueTableDataItem, UnknownColumn, UpdateData, UpsertData, UpsertThis, VarCharColumn, VirtualColumn, WhereArg, XMLColumn, _appendQuery, _clone, _createDbSqlMethod, _hookSelectColumns, _initQueryBuilder, _orCreate, _prependWith, _queryCreate, _queryCreateMany, _queryCreateManyFrom, _queryDefaults, _queryDelete, _queryFindBy, _queryFindByOptional, _queryHookAfterCreate, _queryHookAfterUpdate, _queryInsert, _queryInsertMany, _queryJoinOn, _queryRows, _querySelect, _queryTake, _queryTakeOptional, _queryUpdate, _queryUpdateOrThrow, _queryUpsert, _queryWhere, _queryWhereExists, _queryWhereIn, addCode, addTopCte, addTopCteSql, applyMixins, assignDbDataToColumn, backtickQuote, cloneQueryBaseUnscoped, codeToString, colors, columnsShapeToCode, constraintInnerToCode, consumeColumnName, deepCompare, defaultSchemaConfig, emptyArray, emptyObject, escapeForMigration, escapeString, excludeInnerToCode, exhaustive, getCallerFilePath, getClonedQueryData, getColumnBaseType, getColumnTypes, getFreeAlias, getFreeSetAlias, getImportPath, getPrimaryKeys, getQueryAs, getQuerySchema, getShapeFromSelect, getSqlText, getStackTrace, getSupportedDefaultPrivileges, indexInnerToCode, isExpression, isQueryReturnsAll, isRawSQL, logColors, logParamToLogObject, makeColumnNullable, makeColumnTypes, makeColumnsByType, makeConnectRetryConfig, noop, objectHasValues, omit, parseTableData, parseTableDataInput, pathToLog, pick, pluralize, prepareSubQueryForSql, primaryKeyInnerToCode, pushQueryOnForOuter, pushQueryValueImmutable, pushTableDataCode, quoteObjectKey, quoteTableWithSchema, raw, rawSqlToCode, referencesArgsToCode, returnArg, setColumnData, setColumnEncode, setColumnParse, setColumnParseNull, setCurrentColumnName, setDataValue, setDefaultLanguage, setFreeAlias, setQueryObjectValueImmutable, singleQuote, tableDataMethods, toArray, toCamelCase, toPascalCase, toSnakeCase, wrapAdapterFnWithConnectRetry } from "./index.d.ts";
|
|
1
|
+
import { Adapter, AdapterClass, AdapterConfigBase, AdapterParams, AfterCommitStandaloneHook, AfterHook, ArrayColumn, ArrayColumnValue, ArrayData, AsyncState, BaseNumberData, BigIntColumn, BigSerialColumn, BitColumn, BitVaryingColumn, BooleanColumn, BoxColumn, ByteaColumn, CidrColumn, CircleColumn, CitextColumn, Code, Codes, Column, ColumnFromDbParams, ColumnSchemaConfig, ColumnSchemaGetterColumns, ColumnSchemaGetterTableClass, ColumnToCodeCtx, ColumnTypeSchemaArg, ColumnsByType, ColumnsShape, ComputedColumnsFromOptions, ComputedOptionsConfig, ComputedOptionsFactory, CreateCtx, CreateData, CreateManyMethodsNames, CreateMethodsNames, CreateSelf, CustomTypeColumn, DateColumn, DateColumnData, DbDomainArg, DbExtension, DbOptions, DbResult, DbRlsOptions, DbSharedOptions, DbSqlMethod, DbStructureDomainsMap, DbTableOptionScopes, DbTableOptions, DecimalColumn, DecimalColumnData, DefaultColumnTypes, DefaultPrivileges, DefaultSchemaConfig, DeleteMethodsNames, DomainColumn, DoublePrecisionColumn, DriverAdapter, DynamicRawSQL, EmptyObject, EmptyTuple, EnumColumn, Expression, FromArg, FromResult, GeneratorIgnore, HookSelectValue, InetColumn, IntegerColumn, IntervalColumn, IsQuery, IsolationLevel, JSONColumn, JSONTextColumn, JoinQueryMethod, JoinedShapes, LineColumn, LsegColumn, MacAddr8Column, MacAddrColumn, MapTableScopesOption, MaybeArray, MaybePromise, MergeQuery, MoneyColumn, NoPrimaryKeyOption, NonUniqDataItem, NumberColumnData, Operators, OperatorsArray, OperatorsJson, OperatorsOrdinalText, Ord, PathColumn, PickQueryInputType, PickQueryInternal, PickQueryQ, PickQueryRelations, PickQuerySelectableRelations, PickQueryShape, PointColumn, PolygonColumn, PostgisGeographyPointColumn, QueryAfterHook, QueryArraysResult, QueryBeforeActionHook, QueryBeforeHook, QueryData, QueryHasWhere, QueryHookUtils, QueryHooks, QueryInternal, QueryLogObject, QueryLogOptions, QueryLogger, QueryManyTake, QueryManyTakeOptional, QueryOrExpression, QueryResult, QueryResultRow, QueryReturnType, QuerySchema, QueryScopes, RawSql, RawSqlBase, RealColumn, RecordKeyTrue, RecordOptionalString, RecordString, RecordStringOrNumber, RecordUnknown, RelationConfigBase, RelationJoinQuery, RelationsBase, SearchWeight, SelectableFromShape, SerialColumn, SerialColumnData, ShallowSimplify, ShapeColumnPrimaryKeys, ShapeUniqueColumns, SingleSql, SingleSqlItem, SmallIntColumn, SmallSerialColumn, Sql, SqlFn, SqlSessionState, StorageOptions, StringColumn, StringData, TableData, TableDataFn, TableDataInput, TableDataItem, TableDataItemsUniqueColumnTuples, TableDataItemsUniqueColumns, TableDataItemsUniqueConstraints, TableDataMethods, TableRlsConfig, TemplateLiteralArgs, TextColumn, TimeColumn, TimestampColumn, TimestampTZColumn, Timestamps, TransactionAdapter, TransactionAdapterClass, TransactionOptions, TsQueryColumn, TsVectorColumn, UUIDColumn, UniqueConstraints, UniqueTableDataItem, UnknownColumn, UpdateData, UpsertData, UpsertThis, VarCharColumn, VirtualColumn, WhereArg, XMLColumn, _appendQuery, _clone, _createDbSqlMethod, _hookSelectColumns, _initQueryBuilder, _orCreate, _prependWith, _queryCreate, _queryCreateMany, _queryCreateManyFrom, _queryDefaults, _queryDelete, _queryFindBy, _queryFindByOptional, _queryHookAfterCreate, _queryHookAfterUpdate, _queryInsert, _queryInsertMany, _queryJoinOn, _queryRows, _querySelect, _queryTake, _queryTakeOptional, _queryUpdate, _queryUpdateOrThrow, _queryUpsert, _queryWhere, _queryWhereExists, _queryWhereIn, addCode, addTopCte, addTopCteSql, applyMixins, assignDbDataToColumn, backtickQuote, cloneQueryBaseUnscoped, codeToString, colors, columnsShapeToCode, constraintInnerToCode, consumeColumnName, deepCompare, defaultSchemaConfig, emptyArray, emptyObject, escapeForMigration, escapeString, excludeInnerToCode, exhaustive, getCallerFilePath, getClonedQueryData, getColumnBaseType, getColumnTypes, getFreeAlias, getFreeSetAlias, getImportPath, getPrimaryKeys, getQueryAs, getQuerySchema, getShapeFromSelect, getSqlText, getStackTrace, getSupportedDefaultPrivileges, indexInnerToCode, isExpression, isQueryReturnsAll, isRawSQL, logColors, logParamToLogObject, makeColumnNullable, makeColumnTypes, makeColumnsByType, makeConnectRetryConfig, noop, objectHasValues, omit, parseTableData, parseTableDataInput, pathToLog, pick, pluralize, prepareSubQueryForSql, primaryKeyInnerToCode, pushQueryOnForOuter, pushQueryValueImmutable, pushTableDataCode, quoteObjectKey, quoteTableWithSchema, raw, rawSqlToCode, referencesArgsToCode, returnArg, setColumnData, setColumnEncode, setColumnParse, setColumnParseNull, setCurrentColumnName, setDataValue, setDefaultLanguage, setFreeAlias, setQueryObjectValueImmutable, singleQuote, tableDataMethods, toArray, toCamelCase, toPascalCase, toSnakeCase, wrapAdapterFnWithConnectRetry } from "./index.d.ts";
|
|
2
2
|
declare abstract class OrchidOrmError extends Error {}
|
|
3
|
-
export { type Adapter, AdapterClass, type AdapterConfigBase, type AdapterParams, type AfterCommitStandaloneHook, type AfterHook, ArrayColumn, type ArrayColumnValue, type ArrayData, type AsyncState, type BaseNumberData, BigIntColumn, BigSerialColumn, BitColumn, BitVaryingColumn, BooleanColumn, BoxColumn, ByteaColumn, CidrColumn, CircleColumn, CitextColumn, type Code, type Codes, Column, type ColumnFromDbParams, type ColumnSchemaConfig, type ColumnSchemaGetterColumns, type ColumnSchemaGetterTableClass, type ColumnToCodeCtx, type ColumnTypeSchemaArg, type ColumnsByType, type ColumnsShape, type ComputedColumnsFromOptions, type ComputedOptionsConfig, type ComputedOptionsFactory, type CreateCtx, type CreateData, type CreateManyMethodsNames, type CreateMethodsNames, type CreateSelf, CustomTypeColumn, DateColumn, type DateColumnData, type DbDomainArg, type DbExtension, type DbOptions, type DbResult, type DbRlsOptions, type DbSharedOptions, type DbSqlMethod, type DbStructureDomainsMap, type DbTableOptionScopes, type DbTableOptions, DecimalColumn, type DecimalColumnData, type DefaultColumnTypes, type DefaultPrivileges, type DefaultSchemaConfig, type DeleteMethodsNames, DomainColumn, DoublePrecisionColumn, type DriverAdapter, DynamicRawSQL, type EmptyObject, type EmptyTuple, EnumColumn, Expression, type FromArg, type FromResult, type GeneratorIgnore, type HookSelectValue, InetColumn, IntegerColumn, IntervalColumn, type IsQuery, type IsolationLevel, JSONColumn, JSONTextColumn, type JoinQueryMethod, type JoinedShapes, LineColumn, LsegColumn, MacAddr8Column, MacAddrColumn, type MapTableScopesOption, type MaybeArray, type MaybePromise, type MergeQuery, MoneyColumn, type NoPrimaryKeyOption, type NonUniqDataItem, type NumberColumnData, Operators, type OperatorsArray, type OperatorsJson, type OperatorsOrdinalText, OrchidOrmError, type Ord, PathColumn, type PickQueryInputType, type PickQueryInternal, type PickQueryQ, type PickQueryRelations, type PickQuerySelectableRelations, type PickQueryShape, PointColumn, PolygonColumn, PostgisGeographyPointColumn, type QueryAfterHook, type QueryArraysResult, type QueryBeforeActionHook, type QueryBeforeHook, type QueryData, type QueryHasWhere, QueryHookUtils, QueryHooks, type QueryInternal, type QueryLogObject, type QueryLogOptions, type QueryLogger, type QueryManyTake, type QueryManyTakeOptional, type QueryOrExpression, type QueryResult, type QueryResultRow, type QueryReturnType, type QuerySchema, type QueryScopes, RawSql, type RawSqlBase, RealColumn, type RecordKeyTrue, type RecordOptionalString, type RecordString, type RecordStringOrNumber, type RecordUnknown, type RelationConfigBase, type RelationJoinQuery, type RelationsBase, type SearchWeight, type SelectableFromShape, SerialColumn, type SerialColumnData, type ShallowSimplify, type ShapeColumnPrimaryKeys, type ShapeUniqueColumns, type SingleSql, type SingleSqlItem, SmallIntColumn, SmallSerialColumn, type Sql, type SqlFn, type SqlSessionState, type StorageOptions, StringColumn, type StringData, type TableData, type TableDataFn, type TableDataInput, type TableDataItem, type TableDataItemsUniqueColumnTuples, type TableDataItemsUniqueColumns, type TableDataItemsUniqueConstraints, type TableDataMethods, type TableRlsConfig, type TemplateLiteralArgs, TextColumn, TimeColumn, TimestampColumn, TimestampTZColumn, type Timestamps, TransactionAdapterClass, type TransactionOptions, TsQueryColumn, TsVectorColumn, UUIDColumn, type UniqueConstraints, type UniqueTableDataItem, UnknownColumn, type UpdateData, type UpsertData, type UpsertThis, VarCharColumn, VirtualColumn, type WhereArg, XMLColumn, _appendQuery, _clone, _createDbSqlMethod, _hookSelectColumns, _initQueryBuilder, _orCreate, _prependWith, _queryCreate, _queryCreateMany, _queryCreateManyFrom, _queryDefaults, _queryDelete, _queryFindBy, _queryFindByOptional, _queryHookAfterCreate, _queryHookAfterUpdate, _queryInsert, _queryInsertMany, _queryJoinOn, _queryRows, _querySelect, _queryTake, _queryTakeOptional, _queryUpdate, _queryUpdateOrThrow, _queryUpsert, _queryWhere, _queryWhereExists, _queryWhereIn, addCode, addTopCte, addTopCteSql, applyMixins, assignDbDataToColumn, backtickQuote, cloneQueryBaseUnscoped, codeToString, colors, columnsShapeToCode, constraintInnerToCode, consumeColumnName, deepCompare, defaultSchemaConfig, emptyArray, emptyObject, escapeForMigration, escapeString, excludeInnerToCode, exhaustive, getCallerFilePath, getClonedQueryData, getColumnBaseType, getColumnTypes, getFreeAlias, getFreeSetAlias, getImportPath, getPrimaryKeys, getQueryAs, getQuerySchema, getShapeFromSelect, getSqlText, getStackTrace, getSupportedDefaultPrivileges, indexInnerToCode, isExpression, isQueryReturnsAll, isRawSQL, logColors, logParamToLogObject, makeColumnNullable, makeColumnTypes, makeColumnsByType, makeConnectRetryConfig, noop, objectHasValues, omit, parseTableData, parseTableDataInput, pathToLog, pick, pluralize, prepareSubQueryForSql, primaryKeyInnerToCode, pushQueryOnForOuter, pushQueryValueImmutable, pushTableDataCode, quoteObjectKey, quoteTableWithSchema, raw, rawSqlToCode, referencesArgsToCode, returnArg, setColumnData, setColumnEncode, setColumnParse, setColumnParseNull, setCurrentColumnName, setDataValue, setDefaultLanguage, setFreeAlias, setQueryObjectValueImmutable, singleQuote, tableDataMethods, toArray, toCamelCase, toPascalCase, toSnakeCase, wrapAdapterFnWithConnectRetry };
|
|
3
|
+
export { type Adapter, AdapterClass, type AdapterConfigBase, type AdapterParams, type AfterCommitStandaloneHook, type AfterHook, ArrayColumn, type ArrayColumnValue, type ArrayData, type AsyncState, type BaseNumberData, BigIntColumn, BigSerialColumn, BitColumn, BitVaryingColumn, BooleanColumn, BoxColumn, ByteaColumn, CidrColumn, CircleColumn, CitextColumn, type Code, type Codes, Column, type ColumnFromDbParams, type ColumnSchemaConfig, type ColumnSchemaGetterColumns, type ColumnSchemaGetterTableClass, type ColumnToCodeCtx, type ColumnTypeSchemaArg, type ColumnsByType, type ColumnsShape, type ComputedColumnsFromOptions, type ComputedOptionsConfig, type ComputedOptionsFactory, type CreateCtx, type CreateData, type CreateManyMethodsNames, type CreateMethodsNames, type CreateSelf, CustomTypeColumn, DateColumn, type DateColumnData, type DbDomainArg, type DbExtension, type DbOptions, type DbResult, type DbRlsOptions, type DbSharedOptions, type DbSqlMethod, type DbStructureDomainsMap, type DbTableOptionScopes, type DbTableOptions, DecimalColumn, type DecimalColumnData, type DefaultColumnTypes, type DefaultPrivileges, type DefaultSchemaConfig, type DeleteMethodsNames, DomainColumn, DoublePrecisionColumn, type DriverAdapter, DynamicRawSQL, type EmptyObject, type EmptyTuple, EnumColumn, Expression, type FromArg, type FromResult, type GeneratorIgnore, type HookSelectValue, InetColumn, IntegerColumn, IntervalColumn, type IsQuery, type IsolationLevel, JSONColumn, JSONTextColumn, type JoinQueryMethod, type JoinedShapes, LineColumn, LsegColumn, MacAddr8Column, MacAddrColumn, type MapTableScopesOption, type MaybeArray, type MaybePromise, type MergeQuery, MoneyColumn, type NoPrimaryKeyOption, type NonUniqDataItem, type NumberColumnData, Operators, type OperatorsArray, type OperatorsJson, type OperatorsOrdinalText, OrchidOrmError, type Ord, PathColumn, type PickQueryInputType, type PickQueryInternal, type PickQueryQ, type PickQueryRelations, type PickQuerySelectableRelations, type PickQueryShape, PointColumn, PolygonColumn, PostgisGeographyPointColumn, type QueryAfterHook, type QueryArraysResult, type QueryBeforeActionHook, type QueryBeforeHook, type QueryData, type QueryHasWhere, QueryHookUtils, QueryHooks, type QueryInternal, type QueryLogObject, type QueryLogOptions, type QueryLogger, type QueryManyTake, type QueryManyTakeOptional, type QueryOrExpression, type QueryResult, type QueryResultRow, type QueryReturnType, type QuerySchema, type QueryScopes, RawSql, type RawSqlBase, RealColumn, type RecordKeyTrue, type RecordOptionalString, type RecordString, type RecordStringOrNumber, type RecordUnknown, type RelationConfigBase, type RelationJoinQuery, type RelationsBase, type SearchWeight, type SelectableFromShape, SerialColumn, type SerialColumnData, type ShallowSimplify, type ShapeColumnPrimaryKeys, type ShapeUniqueColumns, type SingleSql, type SingleSqlItem, SmallIntColumn, SmallSerialColumn, type Sql, type SqlFn, type SqlSessionState, type StorageOptions, StringColumn, type StringData, type TableData, type TableDataFn, type TableDataInput, type TableDataItem, type TableDataItemsUniqueColumnTuples, type TableDataItemsUniqueColumns, type TableDataItemsUniqueConstraints, type TableDataMethods, type TableRlsConfig, type TemplateLiteralArgs, TextColumn, TimeColumn, TimestampColumn, TimestampTZColumn, type Timestamps, type TransactionAdapter, TransactionAdapterClass, type TransactionOptions, TsQueryColumn, TsVectorColumn, UUIDColumn, type UniqueConstraints, type UniqueTableDataItem, UnknownColumn, type UpdateData, type UpsertData, type UpsertThis, VarCharColumn, VirtualColumn, type WhereArg, XMLColumn, _appendQuery, _clone, _createDbSqlMethod, _hookSelectColumns, _initQueryBuilder, _orCreate, _prependWith, _queryCreate, _queryCreateMany, _queryCreateManyFrom, _queryDefaults, _queryDelete, _queryFindBy, _queryFindByOptional, _queryHookAfterCreate, _queryHookAfterUpdate, _queryInsert, _queryInsertMany, _queryJoinOn, _queryRows, _querySelect, _queryTake, _queryTakeOptional, _queryUpdate, _queryUpdateOrThrow, _queryUpsert, _queryWhere, _queryWhereExists, _queryWhereIn, addCode, addTopCte, addTopCteSql, applyMixins, assignDbDataToColumn, backtickQuote, cloneQueryBaseUnscoped, codeToString, colors, columnsShapeToCode, constraintInnerToCode, consumeColumnName, deepCompare, defaultSchemaConfig, emptyArray, emptyObject, escapeForMigration, escapeString, excludeInnerToCode, exhaustive, getCallerFilePath, getClonedQueryData, getColumnBaseType, getColumnTypes, getFreeAlias, getFreeSetAlias, getImportPath, getPrimaryKeys, getQueryAs, getQuerySchema, getShapeFromSelect, getSqlText, getStackTrace, getSupportedDefaultPrivileges, indexInnerToCode, isExpression, isQueryReturnsAll, isRawSQL, logColors, logParamToLogObject, makeColumnNullable, makeColumnTypes, makeColumnsByType, makeConnectRetryConfig, noop, objectHasValues, omit, parseTableData, parseTableDataInput, pathToLog, pick, pluralize, prepareSubQueryForSql, primaryKeyInnerToCode, pushQueryOnForOuter, pushQueryValueImmutable, pushTableDataCode, quoteObjectKey, quoteTableWithSchema, raw, rawSqlToCode, referencesArgsToCode, returnArg, setColumnData, setColumnEncode, setColumnParse, setColumnParseNull, setCurrentColumnName, setDataValue, setDefaultLanguage, setFreeAlias, setQueryObjectValueImmutable, singleQuote, tableDataMethods, toArray, toCamelCase, toPascalCase, toSnakeCase, wrapAdapterFnWithConnectRetry };
|
package/dist/node-postgres.js
CHANGED
|
@@ -48,7 +48,7 @@ for (const key in types.builtins) {
|
|
|
48
48
|
].forEach((id) => {
|
|
49
49
|
delete defaultTypeParsers[id];
|
|
50
50
|
});
|
|
51
|
-
const queryClient = (client, text, values,
|
|
51
|
+
const queryClient = (client, text, values, arraysMode) => {
|
|
52
52
|
const params = {
|
|
53
53
|
text,
|
|
54
54
|
values,
|
|
@@ -64,12 +64,12 @@ const queryClient = (client, text, values, startingSavepoint, releasingSavepoint
|
|
|
64
64
|
};
|
|
65
65
|
});
|
|
66
66
|
return __lock.then(() => {
|
|
67
|
-
const promise =
|
|
67
|
+
const promise = client.query(params);
|
|
68
68
|
promise.then(resolve, resolve);
|
|
69
69
|
return promise;
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
|
-
const promise =
|
|
72
|
+
const promise = client.query(params);
|
|
73
73
|
client.__lock = promise.catch(pqb_internal.noop);
|
|
74
74
|
return promise;
|
|
75
75
|
};
|
|
@@ -129,6 +129,62 @@ const NodePostgresAdapter = {
|
|
|
129
129
|
client.release();
|
|
130
130
|
}
|
|
131
131
|
},
|
|
132
|
+
async savepoint(client, _setClient, name, cb) {
|
|
133
|
+
const safeName = name.replaceAll("\"", "\"\"");
|
|
134
|
+
try {
|
|
135
|
+
await queryClient(client, `SAVEPOINT "${safeName}"`);
|
|
136
|
+
const res = await cb();
|
|
137
|
+
await queryClient(client, `RELEASE SAVEPOINT "${safeName}"`);
|
|
138
|
+
return res;
|
|
139
|
+
} catch (err) {
|
|
140
|
+
await queryClient(client, `ROLLBACK TO SAVEPOINT "${safeName}"`);
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
async hackySavepoint(client, _setClient, state, text, values, arraysMode) {
|
|
145
|
+
const safeName = state.name.replaceAll("\"", "\"\"");
|
|
146
|
+
let resolve;
|
|
147
|
+
let reject;
|
|
148
|
+
const promise = new Promise((res, rej) => {
|
|
149
|
+
resolve = res;
|
|
150
|
+
reject = rej;
|
|
151
|
+
});
|
|
152
|
+
let resultResolve;
|
|
153
|
+
let resultReject;
|
|
154
|
+
const resultPromise = new Promise((res, rej) => {
|
|
155
|
+
resultResolve = res;
|
|
156
|
+
resultReject = rej;
|
|
157
|
+
});
|
|
158
|
+
const savepointPromise = (async () => {
|
|
159
|
+
try {
|
|
160
|
+
await queryClient(client, `SAVEPOINT "${safeName}"`);
|
|
161
|
+
try {
|
|
162
|
+
const res = await queryClient(client, text, values, arraysMode);
|
|
163
|
+
resultResolve(res);
|
|
164
|
+
} catch (err) {
|
|
165
|
+
resultReject(err);
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
const result = await promise;
|
|
169
|
+
await queryClient(client, `RELEASE SAVEPOINT "${safeName}"`);
|
|
170
|
+
return result;
|
|
171
|
+
} catch (err) {
|
|
172
|
+
await queryClient(client, `ROLLBACK TO SAVEPOINT "${safeName}"`);
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
})();
|
|
176
|
+
state.activeSavepoint = {
|
|
177
|
+
async release() {
|
|
178
|
+
resolve();
|
|
179
|
+
await savepointPromise;
|
|
180
|
+
},
|
|
181
|
+
async rollback(err) {
|
|
182
|
+
reject(err);
|
|
183
|
+
await savepointPromise.catch(pqb_internal.noop);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
return resultPromise;
|
|
187
|
+
},
|
|
132
188
|
close(pool) {
|
|
133
189
|
return pool.end();
|
|
134
190
|
}
|
|
@@ -136,17 +192,6 @@ const NodePostgresAdapter = {
|
|
|
136
192
|
const defaultTypesConfig = { getTypeParser(id) {
|
|
137
193
|
return defaultTypeParsers[id] || pqb_internal.returnArg;
|
|
138
194
|
} };
|
|
139
|
-
const performQueryOnClientWithSavepoint = (client, params, startingSavepoint, releasingSavepoint) => {
|
|
140
|
-
let promise = startingSavepoint ? client.query(`SAVEPOINT "${startingSavepoint}"`).then(() => client.query(params)) : client.query(params);
|
|
141
|
-
if (releasingSavepoint) promise = promise.then(async (res) => {
|
|
142
|
-
await client.query(`RELEASE SAVEPOINT "${releasingSavepoint}"`);
|
|
143
|
-
return res;
|
|
144
|
-
}, async (err) => {
|
|
145
|
-
await client.query(`ROLLBACK TO SAVEPOINT "${releasingSavepoint}"`);
|
|
146
|
-
throw err;
|
|
147
|
-
});
|
|
148
|
-
return promise;
|
|
149
|
-
};
|
|
150
195
|
exports.NodePostgresAdapter = NodePostgresAdapter;
|
|
151
196
|
exports.createDb = createDb;
|
|
152
197
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-postgres.js","names":["AdapterClass","noop","DatabaseError","returnArg"],"sources":["../src/adapters/node-postgres.ts"],"sourcesContent":["import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterConfigBase,\n ColumnSchemaConfig,\n noop,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n QuerySchema,\n AdapterClass,\n DriverAdapter,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: NodePostgresAdapter,\n config: options,\n }),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends\n Omit<AdapterConfigBase, 'searchPath' | 'ssl'>,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n databaseURL?: string;\n}\n\nexport interface NodePostgresAdapterOptions extends Omit<AdapterConfig, 'log'> {\n schema?: QuerySchema;\n}\n\nconst queryClient = <T extends QueryResultRow = QueryResultRow>(\n client: PoolClient,\n text: string,\n values?: unknown[],\n // only has effect in a transaction\n startingSavepoint?: string,\n releasingSavepoint?: string,\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n): Promise<QueryResult<T>> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode: arraysMode ? 'array' : undefined,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: () => void | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nexport const NodePostgresAdapter: DriverAdapter = {\n manualPool: true,\n\n errorClass: DatabaseError,\n errorFields: {\n message: 'message',\n length: 'length',\n name: 'name',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: NodePostgresAdapterOptions): pg.Pool {\n if (config.databaseURL) {\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (config.setConfig?.search_path) {\n config = {\n ...config,\n options: `${config.options ? `${config.options} ` : ''}-c search_path=\"${config.setConfig.search_path}\"`,\n };\n }\n\n return new pg.Pool(config);\n },\n\n queryClient,\n\n borrow(pool: Pool): Promise<PoolClient> {\n return pool.connect();\n },\n\n release(client: PoolClient): void {\n client.release();\n },\n\n async begin<DriverClient, Result>(\n pool: Pool,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await pool.connect();\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n client.release();\n }\n },\n\n close(pool: Pool): Promise<void> {\n return pool.end();\n },\n};\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\nconst performQueryOnClientWithSavepoint = (\n client: PoolClient,\n params: unknown,\n startingSavepoint?: string,\n releasingSavepoint?: string,\n) => {\n let promise = startingSavepoint\n ? client\n .query(`SAVEPOINT \"${startingSavepoint}\"`)\n .then(() => client.query(params as never))\n : client.query(params as never);\n\n if (releasingSavepoint) {\n promise = promise.then(\n async (res) => {\n await client.query(`RELEASE SAVEPOINT \"${releasingSavepoint}\"`);\n return res;\n },\n async (err) => {\n await client.query(`ROLLBACK TO SAVEPOINT \"${releasingSavepoint}\"`);\n throw err;\n },\n );\n }\n\n return promise;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-postgres.js","names":["AdapterClass","noop","DatabaseError","returnArg"],"sources":["../src/adapters/node-postgres.ts"],"sourcesContent":["import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterConfigBase,\n ColumnSchemaConfig,\n noop,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n QuerySchema,\n AdapterClass,\n DriverAdapter,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState } from './adapter';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: NodePostgresAdapter,\n config: options,\n }),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends\n Omit<AdapterConfigBase, 'searchPath' | 'ssl'>,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n databaseURL?: string;\n}\n\nexport interface NodePostgresAdapterOptions extends Omit<AdapterConfig, 'log'> {\n schema?: QuerySchema;\n}\n\nconst queryClient = <T extends QueryResultRow = QueryResultRow>(\n client: PoolClient,\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n): Promise<QueryResult<T>> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode: arraysMode ? 'array' : undefined,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: () => void | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise = client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nexport const NodePostgresAdapter: DriverAdapter = {\n manualPool: true,\n\n errorClass: DatabaseError,\n errorFields: {\n message: 'message',\n length: 'length',\n name: 'name',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: NodePostgresAdapterOptions): pg.Pool {\n if (config.databaseURL) {\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (config.setConfig?.search_path) {\n config = {\n ...config,\n options: `${config.options ? `${config.options} ` : ''}-c search_path=\"${config.setConfig.search_path}\"`,\n };\n }\n\n return new pg.Pool(config);\n },\n\n queryClient,\n\n borrow(pool: Pool): Promise<PoolClient> {\n return pool.connect();\n },\n\n release(client: PoolClient): void {\n client.release();\n },\n\n async begin<DriverClient, Result>(\n pool: Pool,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await pool.connect();\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n client.release();\n }\n },\n\n async savepoint<T>(\n client: PoolClient,\n // node-postgres doesn't need to switch the client in a savepoint\n _setClient: (client: PoolClient) => void,\n name: string,\n cb: () => Promise<T>,\n ): Promise<T> {\n const safeName = name.replaceAll('\"', '\"\"');\n try {\n await queryClient(client, `SAVEPOINT \"${safeName}\"`);\n const res = await cb();\n await queryClient(client, `RELEASE SAVEPOINT \"${safeName}\"`);\n return res;\n } catch (err) {\n await queryClient(client, `ROLLBACK TO SAVEPOINT \"${safeName}\"`);\n throw err;\n }\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: PoolClient,\n // node-postgres doesn't need to switch the client in a savepoint\n _setClient: (client: PoolClient) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n const safeName = state.name.replaceAll('\"', '\"\"');\n\n let resolve: () => void;\n let reject: (err: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: (res: QueryResult<T>) => void;\n let resultReject: (err: unknown) => void;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = (async () => {\n try {\n await queryClient(client, `SAVEPOINT \"${safeName}\"`);\n\n try {\n const res = await queryClient<T>(client, text, values, arraysMode);\n resultResolve!(res);\n } catch (err) {\n resultReject!(err);\n throw err;\n }\n\n const result = await promise;\n await queryClient(client, `RELEASE SAVEPOINT \"${safeName}\"`);\n return result;\n } catch (err) {\n await queryClient(client, `ROLLBACK TO SAVEPOINT \"${safeName}\"`);\n throw err;\n }\n })();\n\n state.activeSavepoint = {\n async release() {\n resolve();\n await savepointPromise;\n },\n async rollback(err) {\n reject(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(pool: Pool): Promise<void> {\n return pool.end();\n },\n};\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n"],"mappings":"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"}
|
package/dist/node-postgres.mjs
CHANGED
|
@@ -26,7 +26,7 @@ for (const key in types.builtins) {
|
|
|
26
26
|
].forEach((id) => {
|
|
27
27
|
delete defaultTypeParsers[id];
|
|
28
28
|
});
|
|
29
|
-
const queryClient = (client, text, values,
|
|
29
|
+
const queryClient = (client, text, values, arraysMode) => {
|
|
30
30
|
const params = {
|
|
31
31
|
text,
|
|
32
32
|
values,
|
|
@@ -42,12 +42,12 @@ const queryClient = (client, text, values, startingSavepoint, releasingSavepoint
|
|
|
42
42
|
};
|
|
43
43
|
});
|
|
44
44
|
return __lock.then(() => {
|
|
45
|
-
const promise =
|
|
45
|
+
const promise = client.query(params);
|
|
46
46
|
promise.then(resolve, resolve);
|
|
47
47
|
return promise;
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
const promise =
|
|
50
|
+
const promise = client.query(params);
|
|
51
51
|
client.__lock = promise.catch(noop);
|
|
52
52
|
return promise;
|
|
53
53
|
};
|
|
@@ -107,6 +107,62 @@ const NodePostgresAdapter = {
|
|
|
107
107
|
client.release();
|
|
108
108
|
}
|
|
109
109
|
},
|
|
110
|
+
async savepoint(client, _setClient, name, cb) {
|
|
111
|
+
const safeName = name.replaceAll("\"", "\"\"");
|
|
112
|
+
try {
|
|
113
|
+
await queryClient(client, `SAVEPOINT "${safeName}"`);
|
|
114
|
+
const res = await cb();
|
|
115
|
+
await queryClient(client, `RELEASE SAVEPOINT "${safeName}"`);
|
|
116
|
+
return res;
|
|
117
|
+
} catch (err) {
|
|
118
|
+
await queryClient(client, `ROLLBACK TO SAVEPOINT "${safeName}"`);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
async hackySavepoint(client, _setClient, state, text, values, arraysMode) {
|
|
123
|
+
const safeName = state.name.replaceAll("\"", "\"\"");
|
|
124
|
+
let resolve;
|
|
125
|
+
let reject;
|
|
126
|
+
const promise = new Promise((res, rej) => {
|
|
127
|
+
resolve = res;
|
|
128
|
+
reject = rej;
|
|
129
|
+
});
|
|
130
|
+
let resultResolve;
|
|
131
|
+
let resultReject;
|
|
132
|
+
const resultPromise = new Promise((res, rej) => {
|
|
133
|
+
resultResolve = res;
|
|
134
|
+
resultReject = rej;
|
|
135
|
+
});
|
|
136
|
+
const savepointPromise = (async () => {
|
|
137
|
+
try {
|
|
138
|
+
await queryClient(client, `SAVEPOINT "${safeName}"`);
|
|
139
|
+
try {
|
|
140
|
+
const res = await queryClient(client, text, values, arraysMode);
|
|
141
|
+
resultResolve(res);
|
|
142
|
+
} catch (err) {
|
|
143
|
+
resultReject(err);
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
const result = await promise;
|
|
147
|
+
await queryClient(client, `RELEASE SAVEPOINT "${safeName}"`);
|
|
148
|
+
return result;
|
|
149
|
+
} catch (err) {
|
|
150
|
+
await queryClient(client, `ROLLBACK TO SAVEPOINT "${safeName}"`);
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
})();
|
|
154
|
+
state.activeSavepoint = {
|
|
155
|
+
async release() {
|
|
156
|
+
resolve();
|
|
157
|
+
await savepointPromise;
|
|
158
|
+
},
|
|
159
|
+
async rollback(err) {
|
|
160
|
+
reject(err);
|
|
161
|
+
await savepointPromise.catch(noop);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
return resultPromise;
|
|
165
|
+
},
|
|
110
166
|
close(pool) {
|
|
111
167
|
return pool.end();
|
|
112
168
|
}
|
|
@@ -114,17 +170,6 @@ const NodePostgresAdapter = {
|
|
|
114
170
|
const defaultTypesConfig = { getTypeParser(id) {
|
|
115
171
|
return defaultTypeParsers[id] || returnArg;
|
|
116
172
|
} };
|
|
117
|
-
const performQueryOnClientWithSavepoint = (client, params, startingSavepoint, releasingSavepoint) => {
|
|
118
|
-
let promise = startingSavepoint ? client.query(`SAVEPOINT "${startingSavepoint}"`).then(() => client.query(params)) : client.query(params);
|
|
119
|
-
if (releasingSavepoint) promise = promise.then(async (res) => {
|
|
120
|
-
await client.query(`RELEASE SAVEPOINT "${releasingSavepoint}"`);
|
|
121
|
-
return res;
|
|
122
|
-
}, async (err) => {
|
|
123
|
-
await client.query(`ROLLBACK TO SAVEPOINT "${releasingSavepoint}"`);
|
|
124
|
-
throw err;
|
|
125
|
-
});
|
|
126
|
-
return promise;
|
|
127
|
-
};
|
|
128
173
|
export { NodePostgresAdapter, createDb };
|
|
129
174
|
|
|
130
175
|
//# sourceMappingURL=node-postgres.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-postgres.mjs","names":[],"sources":["../src/adapters/node-postgres.ts"],"sourcesContent":["import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterConfigBase,\n ColumnSchemaConfig,\n noop,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n QuerySchema,\n AdapterClass,\n DriverAdapter,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: NodePostgresAdapter,\n config: options,\n }),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends\n Omit<AdapterConfigBase, 'searchPath' | 'ssl'>,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n databaseURL?: string;\n}\n\nexport interface NodePostgresAdapterOptions extends Omit<AdapterConfig, 'log'> {\n schema?: QuerySchema;\n}\n\nconst queryClient = <T extends QueryResultRow = QueryResultRow>(\n client: PoolClient,\n text: string,\n values?: unknown[],\n // only has effect in a transaction\n startingSavepoint?: string,\n releasingSavepoint?: string,\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n): Promise<QueryResult<T>> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode: arraysMode ? 'array' : undefined,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: () => void | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nexport const NodePostgresAdapter: DriverAdapter = {\n manualPool: true,\n\n errorClass: DatabaseError,\n errorFields: {\n message: 'message',\n length: 'length',\n name: 'name',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: NodePostgresAdapterOptions): pg.Pool {\n if (config.databaseURL) {\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (config.setConfig?.search_path) {\n config = {\n ...config,\n options: `${config.options ? `${config.options} ` : ''}-c search_path=\"${config.setConfig.search_path}\"`,\n };\n }\n\n return new pg.Pool(config);\n },\n\n queryClient,\n\n borrow(pool: Pool): Promise<PoolClient> {\n return pool.connect();\n },\n\n release(client: PoolClient): void {\n client.release();\n },\n\n async begin<DriverClient, Result>(\n pool: Pool,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await pool.connect();\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n client.release();\n }\n },\n\n close(pool: Pool): Promise<void> {\n return pool.end();\n },\n};\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\nconst performQueryOnClientWithSavepoint = (\n client: PoolClient,\n params: unknown,\n startingSavepoint?: string,\n releasingSavepoint?: string,\n) => {\n let promise = startingSavepoint\n ? client\n .query(`SAVEPOINT \"${startingSavepoint}\"`)\n .then(() => client.query(params as never))\n : client.query(params as never);\n\n if (releasingSavepoint) {\n promise = promise.then(\n async (res) => {\n await client.query(`RELEASE SAVEPOINT \"${releasingSavepoint}\"`);\n return res;\n },\n async (err) => {\n await client.query(`ROLLBACK TO SAVEPOINT \"${releasingSavepoint}\"`);\n throw err;\n },\n );\n }\n\n return promise;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-postgres.mjs","names":[],"sources":["../src/adapters/node-postgres.ts"],"sourcesContent":["import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterConfigBase,\n ColumnSchemaConfig,\n noop,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n QuerySchema,\n AdapterClass,\n DriverAdapter,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState } from './adapter';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: NodePostgresAdapter,\n config: options,\n }),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends\n Omit<AdapterConfigBase, 'searchPath' | 'ssl'>,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n databaseURL?: string;\n}\n\nexport interface NodePostgresAdapterOptions extends Omit<AdapterConfig, 'log'> {\n schema?: QuerySchema;\n}\n\nconst queryClient = <T extends QueryResultRow = QueryResultRow>(\n client: PoolClient,\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n): Promise<QueryResult<T>> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode: arraysMode ? 'array' : undefined,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: () => void | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise = client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nexport const NodePostgresAdapter: DriverAdapter = {\n manualPool: true,\n\n errorClass: DatabaseError,\n errorFields: {\n message: 'message',\n length: 'length',\n name: 'name',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: NodePostgresAdapterOptions): pg.Pool {\n if (config.databaseURL) {\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (config.setConfig?.search_path) {\n config = {\n ...config,\n options: `${config.options ? `${config.options} ` : ''}-c search_path=\"${config.setConfig.search_path}\"`,\n };\n }\n\n return new pg.Pool(config);\n },\n\n queryClient,\n\n borrow(pool: Pool): Promise<PoolClient> {\n return pool.connect();\n },\n\n release(client: PoolClient): void {\n client.release();\n },\n\n async begin<DriverClient, Result>(\n pool: Pool,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await pool.connect();\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n client.release();\n }\n },\n\n async savepoint<T>(\n client: PoolClient,\n // node-postgres doesn't need to switch the client in a savepoint\n _setClient: (client: PoolClient) => void,\n name: string,\n cb: () => Promise<T>,\n ): Promise<T> {\n const safeName = name.replaceAll('\"', '\"\"');\n try {\n await queryClient(client, `SAVEPOINT \"${safeName}\"`);\n const res = await cb();\n await queryClient(client, `RELEASE SAVEPOINT \"${safeName}\"`);\n return res;\n } catch (err) {\n await queryClient(client, `ROLLBACK TO SAVEPOINT \"${safeName}\"`);\n throw err;\n }\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: PoolClient,\n // node-postgres doesn't need to switch the client in a savepoint\n _setClient: (client: PoolClient) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n const safeName = state.name.replaceAll('\"', '\"\"');\n\n let resolve: () => void;\n let reject: (err: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: (res: QueryResult<T>) => void;\n let resultReject: (err: unknown) => void;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = (async () => {\n try {\n await queryClient(client, `SAVEPOINT \"${safeName}\"`);\n\n try {\n const res = await queryClient<T>(client, text, values, arraysMode);\n resultResolve!(res);\n } catch (err) {\n resultReject!(err);\n throw err;\n }\n\n const result = await promise;\n await queryClient(client, `RELEASE SAVEPOINT \"${safeName}\"`);\n return result;\n } catch (err) {\n await queryClient(client, `ROLLBACK TO SAVEPOINT \"${safeName}\"`);\n throw err;\n }\n })();\n\n state.activeSavepoint = {\n async release() {\n resolve();\n await savepointPromise;\n },\n async rollback(err) {\n reject(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(pool: Pool): Promise<void> {\n return pool.end();\n },\n};\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n"],"mappings":"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"}
|
package/dist/postgres-js.js
CHANGED
|
@@ -39,10 +39,6 @@ var PostgresJsResult = class {
|
|
|
39
39
|
this.fields = result.statement.columns;
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
|
-
const wrapResult = (result) => {
|
|
43
|
-
if (result.constructor === Array) return result.map((res) => new PostgresJsResult(res));
|
|
44
|
-
else return new PostgresJsResult(result);
|
|
45
|
-
};
|
|
46
42
|
const types = {
|
|
47
43
|
bytea: {
|
|
48
44
|
to: 17,
|
|
@@ -115,22 +111,12 @@ const PostgresJsAdapter = {
|
|
|
115
111
|
else sql = (0, postgres.default)(config);
|
|
116
112
|
return sql;
|
|
117
113
|
},
|
|
118
|
-
queryClient(client, text, values,
|
|
114
|
+
async queryClient(client, text, values, arraysMode) {
|
|
119
115
|
let query = client.unsafe(text, values);
|
|
120
116
|
if (arraysMode) query = query.values();
|
|
121
|
-
|
|
122
|
-
return
|
|
123
|
-
|
|
124
|
-
query,
|
|
125
|
-
releasingSavepoint && client.unsafe(`RELEASE SAVEPOINT "${releasingSavepoint}"`)
|
|
126
|
-
]).then((results) => {
|
|
127
|
-
return wrapResult(results[1]);
|
|
128
|
-
}, (err) => {
|
|
129
|
-
if (!releasingSavepoint) throw err;
|
|
130
|
-
return client.unsafe(`ROLLBACK TO SAVEPOINT "${releasingSavepoint}"`).then(() => {
|
|
131
|
-
throw err;
|
|
132
|
-
});
|
|
133
|
-
});
|
|
117
|
+
const result = await query;
|
|
118
|
+
if (result.constructor === Array) return result.map((res) => new PostgresJsResult(res));
|
|
119
|
+
else return new PostgresJsResult(result);
|
|
134
120
|
},
|
|
135
121
|
borrow(client) {
|
|
136
122
|
return client.reserve();
|
|
@@ -150,6 +136,54 @@ const PostgresJsAdapter = {
|
|
|
150
136
|
throw err;
|
|
151
137
|
});
|
|
152
138
|
},
|
|
139
|
+
async savepoint(client, setClient, name, cb) {
|
|
140
|
+
let result;
|
|
141
|
+
await client.savepoint(name, async (savepointClient) => {
|
|
142
|
+
setClient(savepointClient);
|
|
143
|
+
result = await cb();
|
|
144
|
+
}).finally(() => {
|
|
145
|
+
setClient(client);
|
|
146
|
+
});
|
|
147
|
+
return result;
|
|
148
|
+
},
|
|
149
|
+
async hackySavepoint(client, setClient, state, text, values, arraysMode) {
|
|
150
|
+
let resolve;
|
|
151
|
+
let reject;
|
|
152
|
+
const promise = new Promise((res, rej) => {
|
|
153
|
+
resolve = res;
|
|
154
|
+
reject = rej;
|
|
155
|
+
});
|
|
156
|
+
let resultResolve;
|
|
157
|
+
let resultReject;
|
|
158
|
+
const resultPromise = new Promise((res, rej) => {
|
|
159
|
+
resultResolve = res;
|
|
160
|
+
resultReject = rej;
|
|
161
|
+
});
|
|
162
|
+
const savepointPromise = client.savepoint(state.name, async (savepointClient) => {
|
|
163
|
+
try {
|
|
164
|
+
setClient(savepointClient);
|
|
165
|
+
const res = await this.queryClient(savepointClient, text, values, arraysMode);
|
|
166
|
+
resultResolve(res);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
resultReject(err);
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
return promise;
|
|
172
|
+
}).finally(() => {
|
|
173
|
+
setClient(client);
|
|
174
|
+
});
|
|
175
|
+
state.activeSavepoint = {
|
|
176
|
+
async release() {
|
|
177
|
+
resolve();
|
|
178
|
+
await savepointPromise;
|
|
179
|
+
},
|
|
180
|
+
async rollback(err) {
|
|
181
|
+
reject(err);
|
|
182
|
+
await savepointPromise.catch(pqb_internal.noop);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
return resultPromise;
|
|
186
|
+
},
|
|
153
187
|
close(client) {
|
|
154
188
|
return client.end();
|
|
155
189
|
}
|
package/dist/postgres-js.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-js.js","names":["AdapterClass","returnArg"],"sources":["../src/adapters/postgres-js.ts"],"sourcesContent":["import postgres, { Row, RowList, TransactionSql } from 'postgres';\nimport {\n AdapterConfigBase,\n MaybeArray,\n QueryArraysResult,\n QueryResult,\n QueryResultRow,\n returnArg,\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbResult,\n ColumnSchemaConfig,\n AdapterClass,\n DriverAdapter,\n QuerySchema,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\n\nexport interface CreatePostgresJsDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends PostgresJsAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>(\n options: CreatePostgresJsDbOptions<SchemaConfig, ColumnTypes>,\n): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n adapter: new AdapterClass({\n driverAdapter: PostgresJsAdapter,\n config: options,\n }),\n });\n};\n\nexport interface PostgresJsAdapterOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extends postgres.Options<any>, Omit<AdapterConfigBase, 'searchPath' | 'ssl'> {\n databaseURL?: string;\n schema?: QuerySchema;\n}\n\ntype RawResult = RowList<(Row & Iterable<Row>)[]>;\n\nclass PostgresJsResult<T extends QueryResultRow> implements QueryResult<T> {\n rowCount: number;\n rows: T[];\n fields: QueryResult<T>['fields'];\n\n constructor(result: RawResult) {\n this.rowCount = result.count;\n this.rows = result as never;\n this.fields = result.statement.columns;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst wrapResult = (result: MaybeArray<RawResult>): QueryArraysResult<any> => {\n if (result.constructor === Array) {\n return (result as RawResult[]).map(\n (res) => new PostgresJsResult(res),\n ) as never;\n } else {\n return new PostgresJsResult(result as RawResult);\n }\n};\n\nconst types: Record<string, Partial<postgres.PostgresType>> = {\n bytea: {\n to: 17,\n from: 17 as never,\n serialize: (x) => '\\\\x' + Buffer.from(x).toString('hex'),\n // omit parse, let bytea return a string, so it remains consistent with when it's selected via JSON\n },\n dateAndTimestampAsStrings: {\n to: 25,\n from: [1082, 1114, 1184],\n parse: returnArg,\n },\n interval: {\n from: [1186],\n serialize: returnArg,\n parse(str: string) {\n const [years, , months, , days, , time] = str.split(' ');\n const [hours, minutes, seconds] = time.split(':');\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? Number(hours) : 0,\n minutes: minutes ? Number(minutes) : 0,\n seconds: seconds ? Number(seconds) : 0,\n };\n },\n },\n // overrides the built-in json type to not serialize it, because it incorrectly serializes\n json: {\n to: 114,\n from: [114, 3802],\n serialize: returnArg,\n parse: (x) => {\n return JSON.parse(x);\n },\n },\n};\n\nexport const PostgresJsAdapter: DriverAdapter = {\n manualPool: false,\n\n errorClass: postgres.PostgresError,\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n schema: 'schema_name',\n table: 'table_name',\n constraint: 'constraint_name',\n hint: 'hint',\n position: 'position',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(params: PostgresJsAdapterOptions): postgres.Sql {\n const config: PostgresJsAdapterOptions = { ...params, types };\n\n if (config.setConfig?.search_path) {\n config.connection = {\n ...config.connection,\n search_path: config.setConfig.search_path,\n };\n }\n\n let sql;\n if (config.databaseURL) {\n sql = postgres(config.databaseURL, config);\n } else {\n sql = postgres(config);\n }\n\n return sql;\n },\n\n queryClient<T extends QueryResultRow = QueryResultRow>(\n client: TransactionSql,\n text: string,\n values?: unknown[],\n // only has effect in a transaction\n startingSavepoint?: string,\n releasingSavepoint?: string,\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let query = client.unsafe(text, values as never) as any;\n\n if (arraysMode) query = query.values();\n\n if (!startingSavepoint && !releasingSavepoint) {\n return query.then(wrapResult);\n }\n\n return Promise.all([\n startingSavepoint && client.unsafe(`SAVEPOINT \"${startingSavepoint}\"`),\n query,\n releasingSavepoint &&\n client.unsafe(`RELEASE SAVEPOINT \"${releasingSavepoint}\"`),\n ]).then(\n (results: RawResult[]) => {\n return wrapResult(results[1]);\n },\n (err) => {\n if (!releasingSavepoint) {\n throw err;\n }\n\n return client\n .unsafe(`ROLLBACK TO SAVEPOINT \"${releasingSavepoint}\"`)\n .then(() => {\n throw err;\n });\n },\n );\n },\n\n borrow(client: postgres.Sql): Promise<postgres.ReservedSql> {\n return client.reserve();\n },\n\n release(client: postgres.ReservedSql): void {\n client.release();\n },\n\n begin<DriverClient, Result>(\n client: postgres.Sql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n let ok: boolean | undefined;\n let result: unknown;\n\n const fn = (sql: TransactionSql): Promise<Result> =>\n cb(sql as DriverClient).then((res) => {\n ok = true;\n return (result = res);\n });\n\n return (options ? client.begin(options, fn) : client.begin(fn)).catch(\n (err) => {\n if (ok) return result;\n\n throw err;\n },\n ) as never;\n },\n\n close(client: postgres.Sql): Promise<void> {\n return client.end();\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-js.js","names":["AdapterClass","returnArg","noop"],"sources":["../src/adapters/postgres-js.ts"],"sourcesContent":["import postgres, { Row, RowList, TransactionSql } from 'postgres';\nimport {\n AdapterConfigBase,\n QueryResult,\n QueryResultRow,\n returnArg,\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbResult,\n ColumnSchemaConfig,\n AdapterClass,\n DriverAdapter,\n QuerySchema,\n noop,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState } from './adapter';\n\nexport interface CreatePostgresJsDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends PostgresJsAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>(\n options: CreatePostgresJsDbOptions<SchemaConfig, ColumnTypes>,\n): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n adapter: new AdapterClass({\n driverAdapter: PostgresJsAdapter,\n config: options,\n }),\n });\n};\n\nexport interface PostgresJsAdapterOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extends postgres.Options<any>, Omit<AdapterConfigBase, 'searchPath' | 'ssl'> {\n databaseURL?: string;\n schema?: QuerySchema;\n}\n\ntype RawResult = RowList<(Row & Iterable<Row>)[]>;\n\nclass PostgresJsResult<T extends QueryResultRow> implements QueryResult<T> {\n rowCount: number;\n rows: T[];\n fields: QueryResult<T>['fields'];\n\n constructor(result: RawResult) {\n this.rowCount = result.count;\n this.rows = result as never;\n this.fields = result.statement.columns;\n }\n}\n\nconst types: Record<string, Partial<postgres.PostgresType>> = {\n bytea: {\n to: 17,\n from: 17 as never,\n serialize: (x) => '\\\\x' + Buffer.from(x).toString('hex'),\n // omit parse, let bytea return a string, so it remains consistent with when it's selected via JSON\n },\n dateAndTimestampAsStrings: {\n to: 25,\n from: [1082, 1114, 1184],\n parse: returnArg,\n },\n interval: {\n from: [1186],\n serialize: returnArg,\n parse(str: string) {\n const [years, , months, , days, , time] = str.split(' ');\n const [hours, minutes, seconds] = time.split(':');\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? Number(hours) : 0,\n minutes: minutes ? Number(minutes) : 0,\n seconds: seconds ? Number(seconds) : 0,\n };\n },\n },\n // overrides the built-in json type to not serialize it, because it incorrectly serializes\n json: {\n to: 114,\n from: [114, 3802],\n serialize: returnArg,\n parse: (x) => {\n return JSON.parse(x);\n },\n },\n};\n\nexport const PostgresJsAdapter: DriverAdapter = {\n manualPool: false,\n\n errorClass: postgres.PostgresError,\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n schema: 'schema_name',\n table: 'table_name',\n constraint: 'constraint_name',\n hint: 'hint',\n position: 'position',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(params: PostgresJsAdapterOptions): postgres.Sql {\n const config: PostgresJsAdapterOptions = { ...params, types };\n\n if (config.setConfig?.search_path) {\n config.connection = {\n ...config.connection,\n search_path: config.setConfig.search_path,\n };\n }\n\n let sql;\n if (config.databaseURL) {\n sql = postgres(config.databaseURL, config);\n } else {\n sql = postgres(config);\n }\n\n return sql;\n },\n\n async queryClient<T extends QueryResultRow = QueryResultRow>(\n client: TransactionSql,\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let query = client.unsafe(text, values as never) as any;\n\n if (arraysMode) query = query.values();\n\n const result = await query;\n if (result.constructor === Array) {\n return (result as RawResult[]).map(\n (res) => new PostgresJsResult(res),\n ) as never;\n } else {\n return new PostgresJsResult(result as RawResult);\n }\n },\n\n borrow(client: postgres.Sql): Promise<postgres.ReservedSql> {\n return client.reserve();\n },\n\n release(client: postgres.ReservedSql): void {\n client.release();\n },\n\n begin<DriverClient, Result>(\n client: postgres.Sql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n let ok: boolean | undefined;\n let result: unknown;\n\n const fn = (sql: TransactionSql): Promise<Result> =>\n cb(sql as DriverClient).then((res) => {\n ok = true;\n return (result = res);\n });\n\n return (options ? client.begin(options, fn) : client.begin(fn)).catch(\n (err) => {\n if (ok) return result;\n\n throw err;\n },\n ) as never;\n },\n\n async savepoint<T>(\n client: postgres.TransactionSql,\n setClient: (client: postgres.TransactionSql) => void,\n name: string,\n cb: () => Promise<T>,\n ): Promise<T> {\n let result: T | undefined;\n await client\n .savepoint(name, async (savepointClient) => {\n setClient(savepointClient);\n result = await cb();\n })\n .finally(() => {\n setClient(client);\n });\n return result as T;\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: postgres.TransactionSql,\n setClient: (client: postgres.TransactionSql) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n let resolve: () => void;\n let reject: (err: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: (res: QueryResult<T>) => void;\n let resultReject: (err: unknown) => void;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = client\n .savepoint<void>(state.name, async (savepointClient) => {\n try {\n setClient(savepointClient);\n\n const res = await this.queryClient<T>(\n savepointClient,\n text,\n values,\n arraysMode,\n );\n resultResolve(res);\n } catch (err) {\n resultReject(err);\n throw err;\n }\n\n return promise;\n })\n .finally(() => {\n setClient(client);\n });\n\n state.activeSavepoint = {\n async release() {\n resolve();\n await savepointPromise;\n },\n async rollback(err) {\n reject(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(client: postgres.Sql): Promise<void> {\n return client.end();\n },\n};\n"],"mappings":"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"}
|
package/dist/postgres-js.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import postgres from "postgres";
|
|
2
|
-
import { AdapterClass, returnArg } from "pqb/internal";
|
|
2
|
+
import { AdapterClass, noop, returnArg } from "pqb/internal";
|
|
3
3
|
import { createDbWithAdapter } from "pqb";
|
|
4
4
|
const createDb = (options) => {
|
|
5
5
|
return createDbWithAdapter({
|
|
@@ -17,10 +17,6 @@ var PostgresJsResult = class {
|
|
|
17
17
|
this.fields = result.statement.columns;
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
|
-
const wrapResult = (result) => {
|
|
21
|
-
if (result.constructor === Array) return result.map((res) => new PostgresJsResult(res));
|
|
22
|
-
else return new PostgresJsResult(result);
|
|
23
|
-
};
|
|
24
20
|
const types = {
|
|
25
21
|
bytea: {
|
|
26
22
|
to: 17,
|
|
@@ -93,22 +89,12 @@ const PostgresJsAdapter = {
|
|
|
93
89
|
else sql = postgres(config);
|
|
94
90
|
return sql;
|
|
95
91
|
},
|
|
96
|
-
queryClient(client, text, values,
|
|
92
|
+
async queryClient(client, text, values, arraysMode) {
|
|
97
93
|
let query = client.unsafe(text, values);
|
|
98
94
|
if (arraysMode) query = query.values();
|
|
99
|
-
|
|
100
|
-
return
|
|
101
|
-
|
|
102
|
-
query,
|
|
103
|
-
releasingSavepoint && client.unsafe(`RELEASE SAVEPOINT "${releasingSavepoint}"`)
|
|
104
|
-
]).then((results) => {
|
|
105
|
-
return wrapResult(results[1]);
|
|
106
|
-
}, (err) => {
|
|
107
|
-
if (!releasingSavepoint) throw err;
|
|
108
|
-
return client.unsafe(`ROLLBACK TO SAVEPOINT "${releasingSavepoint}"`).then(() => {
|
|
109
|
-
throw err;
|
|
110
|
-
});
|
|
111
|
-
});
|
|
95
|
+
const result = await query;
|
|
96
|
+
if (result.constructor === Array) return result.map((res) => new PostgresJsResult(res));
|
|
97
|
+
else return new PostgresJsResult(result);
|
|
112
98
|
},
|
|
113
99
|
borrow(client) {
|
|
114
100
|
return client.reserve();
|
|
@@ -128,6 +114,54 @@ const PostgresJsAdapter = {
|
|
|
128
114
|
throw err;
|
|
129
115
|
});
|
|
130
116
|
},
|
|
117
|
+
async savepoint(client, setClient, name, cb) {
|
|
118
|
+
let result;
|
|
119
|
+
await client.savepoint(name, async (savepointClient) => {
|
|
120
|
+
setClient(savepointClient);
|
|
121
|
+
result = await cb();
|
|
122
|
+
}).finally(() => {
|
|
123
|
+
setClient(client);
|
|
124
|
+
});
|
|
125
|
+
return result;
|
|
126
|
+
},
|
|
127
|
+
async hackySavepoint(client, setClient, state, text, values, arraysMode) {
|
|
128
|
+
let resolve;
|
|
129
|
+
let reject;
|
|
130
|
+
const promise = new Promise((res, rej) => {
|
|
131
|
+
resolve = res;
|
|
132
|
+
reject = rej;
|
|
133
|
+
});
|
|
134
|
+
let resultResolve;
|
|
135
|
+
let resultReject;
|
|
136
|
+
const resultPromise = new Promise((res, rej) => {
|
|
137
|
+
resultResolve = res;
|
|
138
|
+
resultReject = rej;
|
|
139
|
+
});
|
|
140
|
+
const savepointPromise = client.savepoint(state.name, async (savepointClient) => {
|
|
141
|
+
try {
|
|
142
|
+
setClient(savepointClient);
|
|
143
|
+
const res = await this.queryClient(savepointClient, text, values, arraysMode);
|
|
144
|
+
resultResolve(res);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
resultReject(err);
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
return promise;
|
|
150
|
+
}).finally(() => {
|
|
151
|
+
setClient(client);
|
|
152
|
+
});
|
|
153
|
+
state.activeSavepoint = {
|
|
154
|
+
async release() {
|
|
155
|
+
resolve();
|
|
156
|
+
await savepointPromise;
|
|
157
|
+
},
|
|
158
|
+
async rollback(err) {
|
|
159
|
+
reject(err);
|
|
160
|
+
await savepointPromise.catch(noop);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
return resultPromise;
|
|
164
|
+
},
|
|
131
165
|
close(client) {
|
|
132
166
|
return client.end();
|
|
133
167
|
}
|
package/dist/postgres-js.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-js.mjs","names":[],"sources":["../src/adapters/postgres-js.ts"],"sourcesContent":["import postgres, { Row, RowList, TransactionSql } from 'postgres';\nimport {\n AdapterConfigBase,\n
|
|
1
|
+
{"version":3,"file":"postgres-js.mjs","names":[],"sources":["../src/adapters/postgres-js.ts"],"sourcesContent":["import postgres, { Row, RowList, TransactionSql } from 'postgres';\nimport {\n AdapterConfigBase,\n QueryResult,\n QueryResultRow,\n returnArg,\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbResult,\n ColumnSchemaConfig,\n AdapterClass,\n DriverAdapter,\n QuerySchema,\n noop,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState } from './adapter';\n\nexport interface CreatePostgresJsDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends PostgresJsAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>(\n options: CreatePostgresJsDbOptions<SchemaConfig, ColumnTypes>,\n): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n adapter: new AdapterClass({\n driverAdapter: PostgresJsAdapter,\n config: options,\n }),\n });\n};\n\nexport interface PostgresJsAdapterOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extends postgres.Options<any>, Omit<AdapterConfigBase, 'searchPath' | 'ssl'> {\n databaseURL?: string;\n schema?: QuerySchema;\n}\n\ntype RawResult = RowList<(Row & Iterable<Row>)[]>;\n\nclass PostgresJsResult<T extends QueryResultRow> implements QueryResult<T> {\n rowCount: number;\n rows: T[];\n fields: QueryResult<T>['fields'];\n\n constructor(result: RawResult) {\n this.rowCount = result.count;\n this.rows = result as never;\n this.fields = result.statement.columns;\n }\n}\n\nconst types: Record<string, Partial<postgres.PostgresType>> = {\n bytea: {\n to: 17,\n from: 17 as never,\n serialize: (x) => '\\\\x' + Buffer.from(x).toString('hex'),\n // omit parse, let bytea return a string, so it remains consistent with when it's selected via JSON\n },\n dateAndTimestampAsStrings: {\n to: 25,\n from: [1082, 1114, 1184],\n parse: returnArg,\n },\n interval: {\n from: [1186],\n serialize: returnArg,\n parse(str: string) {\n const [years, , months, , days, , time] = str.split(' ');\n const [hours, minutes, seconds] = time.split(':');\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? Number(hours) : 0,\n minutes: minutes ? Number(minutes) : 0,\n seconds: seconds ? Number(seconds) : 0,\n };\n },\n },\n // overrides the built-in json type to not serialize it, because it incorrectly serializes\n json: {\n to: 114,\n from: [114, 3802],\n serialize: returnArg,\n parse: (x) => {\n return JSON.parse(x);\n },\n },\n};\n\nexport const PostgresJsAdapter: DriverAdapter = {\n manualPool: false,\n\n errorClass: postgres.PostgresError,\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'code',\n detail: 'detail',\n schema: 'schema_name',\n table: 'table_name',\n constraint: 'constraint_name',\n hint: 'hint',\n position: 'position',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(params: PostgresJsAdapterOptions): postgres.Sql {\n const config: PostgresJsAdapterOptions = { ...params, types };\n\n if (config.setConfig?.search_path) {\n config.connection = {\n ...config.connection,\n search_path: config.setConfig.search_path,\n };\n }\n\n let sql;\n if (config.databaseURL) {\n sql = postgres(config.databaseURL, config);\n } else {\n sql = postgres(config);\n }\n\n return sql;\n },\n\n async queryClient<T extends QueryResultRow = QueryResultRow>(\n client: TransactionSql,\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let query = client.unsafe(text, values as never) as any;\n\n if (arraysMode) query = query.values();\n\n const result = await query;\n if (result.constructor === Array) {\n return (result as RawResult[]).map(\n (res) => new PostgresJsResult(res),\n ) as never;\n } else {\n return new PostgresJsResult(result as RawResult);\n }\n },\n\n borrow(client: postgres.Sql): Promise<postgres.ReservedSql> {\n return client.reserve();\n },\n\n release(client: postgres.ReservedSql): void {\n client.release();\n },\n\n begin<DriverClient, Result>(\n client: postgres.Sql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n let ok: boolean | undefined;\n let result: unknown;\n\n const fn = (sql: TransactionSql): Promise<Result> =>\n cb(sql as DriverClient).then((res) => {\n ok = true;\n return (result = res);\n });\n\n return (options ? client.begin(options, fn) : client.begin(fn)).catch(\n (err) => {\n if (ok) return result;\n\n throw err;\n },\n ) as never;\n },\n\n async savepoint<T>(\n client: postgres.TransactionSql,\n setClient: (client: postgres.TransactionSql) => void,\n name: string,\n cb: () => Promise<T>,\n ): Promise<T> {\n let result: T | undefined;\n await client\n .savepoint(name, async (savepointClient) => {\n setClient(savepointClient);\n result = await cb();\n })\n .finally(() => {\n setClient(client);\n });\n return result as T;\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: postgres.TransactionSql,\n setClient: (client: postgres.TransactionSql) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n let resolve: () => void;\n let reject: (err: unknown) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: (res: QueryResult<T>) => void;\n let resultReject: (err: unknown) => void;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = client\n .savepoint<void>(state.name, async (savepointClient) => {\n try {\n setClient(savepointClient);\n\n const res = await this.queryClient<T>(\n savepointClient,\n text,\n values,\n arraysMode,\n );\n resultResolve(res);\n } catch (err) {\n resultReject(err);\n throw err;\n }\n\n return promise;\n })\n .finally(() => {\n setClient(client);\n });\n\n state.activeSavepoint = {\n async release() {\n resolve();\n await savepointPromise;\n },\n async rollback(err) {\n reject(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(client: postgres.Sql): Promise<void> {\n return client.end();\n },\n};\n"],"mappings":"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"}
|