pqb 0.1.8 → 0.2.0

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 CHANGED
@@ -7,7 +7,7 @@ declare type RawExpression<C extends ColumnType = ColumnType> = {
7
7
  __values: unknown[];
8
8
  __column: C;
9
9
  };
10
- declare type Expression<T extends Query = Query, C extends ColumnType = ColumnType> = keyof T['selectable'] | RawExpression<C>;
10
+ declare type Expression<T extends Query = Query, C extends ColumnType = ColumnType> = StringKey<keyof T['selectable']> | RawExpression<C>;
11
11
  declare type ExpressionOfType<T extends Query, C extends ColumnType, Type> = {
12
12
  [K in keyof T['selectable']]: ColumnOutput<T['selectable'][K]['column']> extends Type | null ? K : never;
13
13
  }[Selectable<T>] | RawExpression<C>;
@@ -153,7 +153,7 @@ declare type WhereInValues<T extends QueryBase, Column extends WhereInColumn<T>>
153
153
  length: number;
154
154
  } ? Column['length'] : never;
155
155
  })[] | Query | RawExpression;
156
- declare type WhereResult<T extends QueryBase> = Omit<T, 'hasWhere'> & {
156
+ declare type WhereResult<T extends QueryBase> = T & {
157
157
  hasWhere: true;
158
158
  };
159
159
  declare type WhereInArg<T extends Pick<Query, 'selectable'>> = {
@@ -1011,9 +1011,7 @@ declare class From {
1011
1011
  _from<T extends Query, Args extends FromArgs<T>>(this: T, ...args: Args): FromResult<T, Args>;
1012
1012
  }
1013
1013
 
1014
- declare type GetArg<T extends QueryBase> = keyof T['selectable'] | (RelationQueryBase & {
1015
- returnType: 'value' | 'valueOrThrow';
1016
- }) | RawExpression;
1014
+ declare type GetArg<T extends QueryBase> = StringKey<keyof T['selectable']> | RawExpression;
1017
1015
  declare type UnwrapRaw<T extends Query, Arg extends GetArg<T>> = Arg extends RawExpression ? Arg['__column'] : Exclude<Arg, RawExpression>;
1018
1016
  declare type GetResult<T extends Query, Arg extends GetArg<T>> = SetQueryReturnsValue<T, UnwrapRaw<T, Arg>>;
1019
1017
  declare type GetOptionalResult<T extends Query, Arg extends GetArg<T>> = SetQueryReturnsValueOptional<T, UnwrapRaw<T, Arg>>;
@@ -1099,20 +1097,20 @@ declare class Json {
1099
1097
  }): JsonPathQueryResult<T, As, Type>;
1100
1098
  }
1101
1099
 
1102
- declare type SelectArg<T extends QueryBase> = keyof T['selectable'] | (T['relations'] extends Record<string, Relation> ? keyof T['relations'] : never) | RelationQueryBase | SelectAsArg<T>;
1103
- declare type SelectAsArg<T extends QueryBase> = Record<string, keyof T['selectable'] | Query | RawExpression>;
1104
- declare type SelectResult<T extends Query, Args extends SelectArg<T>[], SelectAsArgs = SimpleSpread<FilterTuple<Args, SelectAsArg<QueryBase>>>> = AddQuerySelect<T, {
1105
- [Arg in Args[number] as Arg extends keyof T['selectable'] ? T['selectable'][Arg]['as'] : Arg extends keyof T['relations'] ? Arg : Arg extends RelationQueryBase ? Arg['tableAlias'] extends string ? Arg['tableAlias'] : never : never]: Arg extends keyof T['selectable'] ? T['selectable'][Arg]['column'] : Arg extends RelationQueryBase ? SelectSubQueryResult<Arg> : T['relations'] extends Record<string, Relation> ? Arg extends keyof T['relations'] ? T['relations'][Arg]['returns'] extends 'many' ? ArrayOfColumnsObjects<T['relations'][Arg]['model']['result']> : T['relations'][Arg]['options']['required'] extends true ? ColumnsObject<T['relations'][Arg]['model']['result']> : NullableColumn<ColumnsObject<T['relations'][Arg]['model']['result']>> : never : never;
1100
+ declare type SelectArg<T extends QueryBase> = StringKey<keyof T['selectable']> | (T['relations'] extends Record<string, Relation> ? StringKey<keyof T['relations']> : never) | SelectAsArg<T>;
1101
+ declare type SelectAsArg<T extends QueryBase> = Record<string, StringKey<keyof T['selectable']> | RawExpression | ((q: T) => Query)>;
1102
+ declare type SelectResult<T extends Query, Args extends SelectArg<T>[], SelectAsArgs = SimpleSpread<FilterTuple<Args, SelectAsArg<T>>>> = AddQuerySelect<T, {
1103
+ [Arg in Args[number] as Arg extends keyof T['selectable'] ? T['selectable'][Arg]['as'] : Arg extends keyof T['relations'] ? Arg : never]: Arg extends keyof T['selectable'] ? T['selectable'][Arg]['column'] : T['relations'] extends Record<string, Relation> ? Arg extends keyof T['relations'] ? T['relations'][Arg]['returns'] extends 'many' ? ArrayOfColumnsObjects<T['relations'][Arg]['model']['result']> : T['relations'][Arg]['options']['required'] extends true ? ColumnsObject<T['relations'][Arg]['model']['result']> : NullableColumn<ColumnsObject<T['relations'][Arg]['model']['result']>> : never : never;
1106
1104
  } & {
1107
- [K in keyof SelectAsArgs]: SelectAsArgs[K] extends keyof T['selectable'] ? T['selectable'][SelectAsArgs[K]]['column'] : SelectAsArgs[K] extends RawExpression ? SelectAsArgs[K]['__column'] : SelectAsArgs[K] extends Query ? SelectSubQueryResult<SelectAsArgs[K]> : never;
1105
+ [K in keyof SelectAsArgs]: SelectAsArgs[K] extends keyof T['selectable'] ? T['selectable'][SelectAsArgs[K]]['column'] : SelectAsArgs[K] extends RawExpression ? SelectAsArgs[K]['__column'] : SelectAsArgs[K] extends (q: T) => Query ? SelectSubQueryResult<ReturnType<SelectAsArgs[K]>> : never;
1108
1106
  }>;
1109
1107
  declare type SelectSubQueryResult<Arg extends Query & {
1110
1108
  [isRequiredRelationKey]?: boolean;
1111
1109
  }> = Arg['returnType'] extends 'all' ? ArrayOfColumnsObjects<Arg['result']> : Arg['returnType'] extends 'valueOrThrow' ? Arg['result']['value'] : Arg['returnType'] extends 'pluck' ? PluckResultColumnType<Arg['result']['pluck']> : Arg[isRequiredRelationKey] extends true ? ColumnsObject<Arg['result']> : NullableColumn<ColumnsObject<Arg['result']>>;
1112
1110
  declare const addParserForRawExpression: (q: Query, key: string | getValueKey, raw: RawExpression) => void;
1113
- declare const addParserForSelectItem: <T extends Query>(q: T, as: string | getValueKey | undefined, key: string, item: Query | RawExpression<ColumnType<unknown, Operators, unknown>> | keyof T["selectable"]) => void;
1111
+ declare const addParserForSelectItem: <T extends Query>(q: T, as: string | getValueKey | undefined, key: string, arg: RawExpression<ColumnType<unknown, Operators, unknown>> | Exclude<keyof T["selectable"], number | symbol> | ((q: T) => Query)) => string | RawExpression | Query;
1114
1112
  declare const addParserToQuery: (query: QueryData, key: string | getValueKey, parser: ColumnParser) => void;
1115
- declare const processSelectArg: <T extends Query>(q: T, as: string | undefined, item: SelectArg<T>, columnAs?: string | getValueKey) => SelectItem;
1113
+ declare const processSelectArg: <T extends Query>(q: T, as: string | undefined, arg: SelectArg<T>, columnAs?: string | getValueKey) => SelectItem;
1116
1114
  declare class Select {
1117
1115
  select<T extends Query, K extends SelectArg<T>[]>(this: T, ...args: K): SelectResult<T, K>;
1118
1116
  _select<T extends Query, K extends SelectArg<T>[]>(this: T, ...args: K): SelectResult<T, K>;
@@ -1187,7 +1185,7 @@ interface Db<Table extends string | undefined = undefined, Shape extends Columns
1187
1185
  columnsParsers?: ColumnsParsers;
1188
1186
  result: Pick<Shape, DefaultSelectColumns<Shape>[number]>;
1189
1187
  hasSelect: false;
1190
- hasWhere: false;
1188
+ hasWhere: boolean;
1191
1189
  selectable: {
1192
1190
  [K in keyof Shape]: {
1193
1191
  as: K;
package/dist/index.esm.js CHANGED
@@ -2375,9 +2375,6 @@ const aggregateToSql = (ctx, model, item, quotedAs) => {
2375
2375
  return sql.join("");
2376
2376
  };
2377
2377
 
2378
- const relationQueryKey = Symbol("relationQuery");
2379
- const isRequiredRelationKey = Symbol("isRequiredRelation");
2380
-
2381
2378
  class PormError extends Error {
2382
2379
  }
2383
2380
  class NotFoundError extends PormError {
@@ -2439,22 +2436,17 @@ const selectToSql = (ctx, model, query, quotedAs) => {
2439
2436
  if (query.select) {
2440
2437
  const list = [];
2441
2438
  query.select.forEach((item) => {
2442
- var _a2, _b;
2439
+ var _a2;
2443
2440
  if (typeof item === "string") {
2444
2441
  list.push(
2445
2442
  item === "*" ? ((_a2 = query.join) == null ? void 0 : _a2.length) ? `${quotedAs}.*` : "*" : quoteFullColumn(item, quotedAs)
2446
2443
  );
2447
- } else if ((_b = item.query) == null ? void 0 : _b[relationQueryKey]) {
2448
- const relationQuery = item.clone();
2449
- const as = getQueryAs(relationQuery);
2450
- relationQuery._as(relationQuery.query[relationQueryKey]);
2451
- pushSubQuerySql(relationQuery, as, ctx.values, list);
2452
2444
  } else {
2453
2445
  if ("selectAs" in item) {
2454
2446
  const obj = item.selectAs;
2455
2447
  for (const as in obj) {
2456
2448
  const value = obj[as];
2457
- if (typeof value === "object") {
2449
+ if (typeof value === "object" || typeof value === "function") {
2458
2450
  if (isRaw(value)) {
2459
2451
  list.push(`${getRaw(value, ctx.values)} AS ${q(as)}`);
2460
2452
  } else {
@@ -3101,30 +3093,31 @@ const addParserForRawExpression = (q, key, raw) => {
3101
3093
  if (parser)
3102
3094
  addParserToQuery(q.query, key, parser);
3103
3095
  };
3104
- const addParserForSelectItem = (q, as, key, item) => {
3096
+ const addParserForSelectItem = (q, as, key, arg) => {
3105
3097
  var _a, _b, _c, _d;
3106
- if (typeof item === "object") {
3107
- if (isRaw(item)) {
3108
- addParserForRawExpression(q, key, item);
3109
- } else {
3110
- const parsers = getQueryParsers(item);
3111
- if (parsers) {
3112
- if (item.query.take) {
3113
- addParserToQuery(q.query, key, (item2) => parseRecord(parsers, item2));
3114
- } else {
3115
- addParserToQuery(
3116
- q.query,
3117
- key,
3118
- (items) => items.map((item2) => parseRecord(parsers, item2))
3119
- );
3120
- }
3098
+ if (typeof arg === "object") {
3099
+ addParserForRawExpression(q, key, arg);
3100
+ return arg;
3101
+ } else if (typeof arg === "function") {
3102
+ const rel = arg(q);
3103
+ const parsers = getQueryParsers(rel);
3104
+ if (parsers) {
3105
+ if (rel.query.take) {
3106
+ addParserToQuery(q.query, key, (item) => parseRecord(parsers, item));
3107
+ } else {
3108
+ addParserToQuery(
3109
+ q.query,
3110
+ key,
3111
+ (items) => items.map((item) => parseRecord(parsers, item))
3112
+ );
3121
3113
  }
3122
3114
  }
3115
+ return rel;
3123
3116
  } else {
3124
- const index = item.indexOf(".");
3117
+ const index = arg.indexOf(".");
3125
3118
  if (index !== -1) {
3126
- const table = item.slice(0, index);
3127
- const column = item.slice(index + 1);
3119
+ const table = arg.slice(0, index);
3120
+ const column = arg.slice(index + 1);
3128
3121
  if (table === as) {
3129
3122
  const parser = (_a = q.columnsParsers) == null ? void 0 : _a[column];
3130
3123
  if (parser)
@@ -3135,10 +3128,11 @@ const addParserForSelectItem = (q, as, key, item) => {
3135
3128
  addParserToQuery(q.query, key, parser);
3136
3129
  }
3137
3130
  } else {
3138
- const parser = (_d = q.columnsParsers) == null ? void 0 : _d[item];
3131
+ const parser = (_d = q.columnsParsers) == null ? void 0 : _d[arg];
3139
3132
  if (parser)
3140
3133
  addParserToQuery(q.query, key, parser);
3141
3134
  }
3135
+ return arg;
3142
3136
  }
3143
3137
  };
3144
3138
  const addParserToQuery = (query, key, parser) => {
@@ -3147,65 +3141,47 @@ const addParserToQuery = (query, key, parser) => {
3147
3141
  else
3148
3142
  query.parsers = { [key]: parser };
3149
3143
  };
3150
- const processSelectArg = (q, as, item, columnAs) => {
3151
- var _a, _b, _c, _d, _e;
3152
- if (typeof item === "string") {
3153
- if (q.relations[item]) {
3154
- item = q[item];
3144
+ const processSelectArg = (q, as, arg, columnAs) => {
3145
+ if (typeof arg === "string") {
3146
+ if (q.relations[arg]) {
3147
+ const rel = q.relations[arg];
3148
+ arg = {
3149
+ [arg]: () => rel.joinQuery(q, rel.query)
3150
+ };
3155
3151
  } else {
3156
- const index = item.indexOf(".");
3157
- if (index !== -1) {
3158
- const table = item.slice(0, index);
3159
- const column = item.slice(index + 1);
3160
- if (table === as) {
3161
- const parser = (_a = q.columnsParsers) == null ? void 0 : _a[column];
3162
- if (parser)
3163
- addParserToQuery(q.query, columnAs || column, parser);
3164
- } else {
3165
- const parser = (_c = (_b = q.query.joinedParsers) == null ? void 0 : _b[table]) == null ? void 0 : _c[column];
3166
- if (parser)
3167
- addParserToQuery(q.query, columnAs || column, parser);
3168
- }
3169
- } else {
3170
- const parser = (_d = q.columnsParsers) == null ? void 0 : _d[item];
3171
- if (parser)
3172
- addParserToQuery(q.query, columnAs || item, parser);
3173
- }
3174
- return item;
3152
+ return processSelectColumnArg(q, arg, as, columnAs);
3175
3153
  }
3176
3154
  }
3177
- if ((_e = item.query) == null ? void 0 : _e[relationQueryKey]) {
3178
- const relation = item;
3179
- const parsers = relation.query.parsers || relation.columnsParsers;
3180
- if (parsers) {
3181
- addParserToQuery(q.query, getQueryAs(relation), (input) => {
3182
- if (Array.isArray(input)) {
3183
- input.forEach((record) => {
3184
- for (const key in parsers) {
3185
- const value = record[key];
3186
- if (value !== null) {
3187
- record[key] = parsers[key](value);
3188
- }
3189
- }
3190
- });
3191
- } else {
3192
- for (const key in parsers) {
3193
- const value = input[key];
3194
- if (value !== null) {
3195
- input[key] = parsers[key](value);
3196
- }
3197
- }
3198
- }
3199
- return input;
3200
- });
3155
+ return processSelectAsArg(q, arg, as);
3156
+ };
3157
+ const processSelectColumnArg = (q, arg, as, columnAs) => {
3158
+ var _a, _b, _c, _d;
3159
+ const index = arg.indexOf(".");
3160
+ if (index !== -1) {
3161
+ const table = arg.slice(0, index);
3162
+ const column = arg.slice(index + 1);
3163
+ if (table === as) {
3164
+ const parser = (_a = q.columnsParsers) == null ? void 0 : _a[column];
3165
+ if (parser)
3166
+ addParserToQuery(q.query, columnAs || column, parser);
3167
+ } else {
3168
+ const parser = (_c = (_b = q.query.joinedParsers) == null ? void 0 : _b[table]) == null ? void 0 : _c[column];
3169
+ if (parser)
3170
+ addParserToQuery(q.query, columnAs || column, parser);
3201
3171
  }
3202
3172
  } else {
3203
- for (const key in item) {
3204
- addParserForSelectItem(q, as, key, item[key]);
3205
- }
3206
- return { selectAs: item };
3173
+ const parser = (_d = q.columnsParsers) == null ? void 0 : _d[arg];
3174
+ if (parser)
3175
+ addParserToQuery(q.query, columnAs || arg, parser);
3207
3176
  }
3208
- return item;
3177
+ return arg;
3178
+ };
3179
+ const processSelectAsArg = (q, arg, as) => {
3180
+ const selectAs = {};
3181
+ for (const key in arg) {
3182
+ selectAs[key] = addParserForSelectItem(q, as, key, arg[key]);
3183
+ }
3184
+ return { selectAs };
3209
3185
  };
3210
3186
  class Select {
3211
3187
  select(...args) {
@@ -5122,7 +5098,7 @@ class QueryUpsert {
5122
5098
 
5123
5099
  class QueryMethods {
5124
5100
  all() {
5125
- return this.query.returnType === "all" ? this : this.clone()._all();
5101
+ return this.clone()._all();
5126
5102
  }
5127
5103
  _all() {
5128
5104
  this.query.returnType = "all";
@@ -5130,7 +5106,7 @@ class QueryMethods {
5130
5106
  return this;
5131
5107
  }
5132
5108
  take() {
5133
- return this.query.returnType === "oneOrThrow" ? this : this.clone()._take();
5109
+ return this.clone()._take();
5134
5110
  }
5135
5111
  _take() {
5136
5112
  this.query.returnType = "oneOrThrow";
@@ -5138,7 +5114,7 @@ class QueryMethods {
5138
5114
  return this;
5139
5115
  }
5140
5116
  takeOptional() {
5141
- return this.query.returnType === "one" ? this : this.clone()._takeOptional();
5117
+ return this.clone()._takeOptional();
5142
5118
  }
5143
5119
  _takeOptional() {
5144
5120
  this.query.returnType = "one";
@@ -5146,7 +5122,7 @@ class QueryMethods {
5146
5122
  return this;
5147
5123
  }
5148
5124
  rows() {
5149
- return this.query.returnType === "rows" ? this : this.clone()._rows();
5125
+ return this.clone()._rows();
5150
5126
  }
5151
5127
  _rows() {
5152
5128
  this.query.returnType = "rows";
@@ -5154,7 +5130,7 @@ class QueryMethods {
5154
5130
  return this;
5155
5131
  }
5156
5132
  pluck(select) {
5157
- return this.query.returnType === "pluck" ? this : this.clone()._pluck(select);
5133
+ return this.clone()._pluck(select);
5158
5134
  }
5159
5135
  _pluck(select) {
5160
5136
  this.query.returnType = "pluck";
@@ -5164,7 +5140,7 @@ class QueryMethods {
5164
5140
  return this;
5165
5141
  }
5166
5142
  exec() {
5167
- return this.query.returnType === "void" ? this : this.clone()._exec();
5143
+ return this.clone()._exec();
5168
5144
  }
5169
5145
  _exec() {
5170
5146
  this.query.returnType = "void";
@@ -5441,5 +5417,8 @@ const createDb = (_a) => {
5441
5417
 
5442
5418
  const defaultsKey = Symbol("defaults");
5443
5419
 
5420
+ const relationQueryKey = Symbol("relationQuery");
5421
+ const isRequiredRelationKey = Symbol("isRequiredRelation");
5422
+
5444
5423
  export { Adapter, Aggregate, ArrayColumn, ArrayOfColumnsObjects, BigIntColumn, BigSerialColumn, BitColumn, BitVaryingColumn, BooleanColumn, BoxColumn, ByteaColumn, CharColumn, CidrColumn, CircleColumn, Clear, ColumnInfoMethods, ColumnType, ColumnsObject, DateBaseColumn, DateColumn, DateTimeBaseClass, DateTimeWithTimeZoneBaseClass, Db, DecimalBaseColumn, DecimalColumn, Delete, DoublePrecisionColumn, EMPTY_OBJECT, EnumColumn, For, From, Having, InetColumn, Insert, IntegerBaseColumn, IntegerColumn, IntervalColumn, JSONColumn, JSONTextColumn, Join, Json, LimitedTextBaseColumn, LineColumn, LsegColumn, MacAddr8Column, MacAddrColumn, MoneyColumn, MoreThanOneRowError, NotFoundError, NumberAsStringBaseColumn, NumberBaseColumn, OnConflictQueryBuilder, OnQueryBuilder, Operators, PathColumn, PluckResultColumnType, PointColumn, PolygonColumn, PormError, PormInternalError, QueryCallbacks, QueryGet, QueryLog, QueryMethods, QueryUpsert, RealColumn, Select, SerialColumn, SmallIntColumn, SmallSerialColumn, TableSchema, TextBaseColumn, TextColumn, Then, TimeColumn, TimeWithTimeZoneColumn, TimestampColumn, TimestampWithTimeZoneColumn, Transaction, TransactionAdapter, TsQueryColumn, TsVectorColumn, UUIDColumn, UnhandledTypeError, Union, Update, VarCharColumn, Where, WhereQueryBuilder, With, XMLColumn, addOr, addOrNot, addParserForRawExpression, addParserForSelectItem, addParserToQuery, addQueryOn, addQueryOrOn, addWhere, addWhereIn, addWhereNot, aggregate1FunctionNames, applyMixins, array, arrayToEnum, columnTypes, utils as columnUtils, constructType, createDb, createOperator, defaultsKey, discriminatedUnion, emptyObject, enumType, getClonedQueryData, getColumnTypes, getQueryAs, getQueryParsers, getRaw, getTableData, getValidEnumValues, getValueKey, handleResult, instanceOf, intersection, isRaw, isRequiredRelationKey, joinTruthy, jsonTypes, lazy, literal, logColors, logParamToLogObject, map, nativeEnum, newTableData, noop, notNullable, notNullish, nullable, nullish, object, optional, parseRecord, parseResult, processSelectArg, pushQueryArray, pushQueryOn, pushQueryOrOn, pushQueryValue, queryKeysOfNotSimpleQuery, queryMethodByReturnType, quote, raw, record, relationQueryKey, removeFromQuery, required, resetTableData, scalarTypes, set, setQueryObjectValue, toArray, toSql, tuple, union };
5445
5424
  //# sourceMappingURL=index.esm.js.map