pqb 0.1.7 → 0.1.9

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>;
@@ -223,8 +223,8 @@ declare class WhereQueryBuilder<Q extends QueryBase = QueryBase> extends Where i
223
223
  query: QueryData;
224
224
  selectable: Q['selectable'];
225
225
  shape: Q['shape'];
226
+ relations: Q['relations'];
226
227
  __model: Query;
227
- relations: {};
228
228
  withData: {};
229
229
  constructor(q: QueryBase | string, shape: ColumnsShape);
230
230
  clone<T extends this>(this: T): T;
@@ -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>;
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);
3176
+ }
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]);
3207
3183
  }
3208
- return item;
3184
+ return { selectAs };
3209
3185
  };
3210
3186
  class Select {
3211
3187
  select(...args) {
@@ -3918,7 +3894,6 @@ class WhereQueryBuilder extends Where {
3918
3894
  constructor(q, shape) {
3919
3895
  super();
3920
3896
  this.query = {};
3921
- this.relations = {};
3922
3897
  this.withData = {};
3923
3898
  this.table = typeof q === "object" ? q.table : q;
3924
3899
  this.shape = shape;
@@ -5442,5 +5417,8 @@ const createDb = (_a) => {
5442
5417
 
5443
5418
  const defaultsKey = Symbol("defaults");
5444
5419
 
5420
+ const relationQueryKey = Symbol("relationQuery");
5421
+ const isRequiredRelationKey = Symbol("isRequiredRelation");
5422
+
5445
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 };
5446
5424
  //# sourceMappingURL=index.esm.js.map