pqb 0.42.9 → 0.43.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
@@ -5465,10 +5465,7 @@ type SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = {
5465
5465
  }) & (T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K];
5466
5466
  } & QueryMetaHasSelect;
5467
5467
  type SelectResultObj<T extends SelectSelf, Obj> = Obj extends SelectAsCheckReturnTypes ? {
5468
- [K in keyof T]: K extends 'meta' ? T['meta'] & {
5469
- hasSelect: true;
5470
- selectable: SelectAsSelectable<Obj>;
5471
- } : K extends 'result' ? {
5468
+ [K in keyof T]: K extends 'meta' ? T['meta'] & SelectAsMeta<Obj> : K extends 'result' ? {
5472
5469
  [K in T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? keyof Obj | keyof T['result'] : keyof Obj]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : K extends keyof T['result'] ? T['result'][K] : never;
5473
5470
  } : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, {
5474
5471
  [K in T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? keyof Obj | keyof T['result'] : keyof Obj]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : K extends keyof T['result'] ? T['result'][K] : never;
@@ -5477,34 +5474,37 @@ type SelectResultObj<T extends SelectSelf, Obj> = Obj extends SelectAsCheckRetur
5477
5474
  [K in keyof Obj]: Obj[K] extends (...args: any[]) => any ? ReturnType<Obj[K]> extends SelectAsFnReturnType ? never : K : never;
5478
5475
  }[keyof Obj] & string}`;
5479
5476
  type SelectResultColumnsAndObj<T extends SelectSelf, Columns extends PropertyKey[], Obj> = {
5480
- [K in keyof T]: K extends 'meta' ? T['meta'] & {
5481
- hasSelect: true;
5482
- selectable: SelectAsSelectable<Obj>;
5483
- } : K extends 'result' ? // Combine previously selected items, all columns if * was provided,
5477
+ [K in keyof T]: K extends 'meta' ? T['meta'] & SelectAsMeta<Obj> : K extends 'result' ? // Combine previously selected items, all columns if * was provided,
5484
5478
  {
5485
5479
  [K in ('*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['meta']['defaultSelect'] : Columns[number]) | keyof Obj as K extends Columns[number] ? T['meta']['selectable'][K]['as'] : K]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : T['meta']['selectable'][K]['column'];
5486
5480
  } & (T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown) : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, {
5487
5481
  [K in ('*' extends Columns[number] ? Exclude<Columns[number], '*'> | T['meta']['defaultSelect'] : Columns[number]) | keyof Obj as K extends Columns[number] ? T['meta']['selectable'][K]['as'] : K]: K extends keyof Obj ? SelectAsValueResult<T, Obj[K]> : T['meta']['selectable'][K]['column'];
5488
5482
  } & (T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K];
5489
5483
  };
5490
- type SelectAsSelectable<Arg> = {
5491
- [K in keyof Arg]: Arg[K] extends (q: never) => {
5492
- returnType: 'value' | 'valueOrThrow';
5493
- result: QueryColumns;
5494
- } ? {
5495
- [P in K]: {
5496
- as: K;
5497
- column: ReturnType<Arg[K]>['result']['value'];
5498
- };
5499
- } : Arg[K] extends (q: never) => {
5500
- result: QueryColumns;
5501
- } ? {
5502
- [C in keyof ReturnType<Arg[K]>['result'] & string as `${K & string}.${C}`]: {
5503
- as: C;
5504
- column: ReturnType<Arg[K]>['result'][C];
5505
- };
5506
- } : never;
5507
- }[keyof Arg];
5484
+ type SelectAsMeta<Arg> = {
5485
+ hasSelect: true;
5486
+ selectable: {
5487
+ [K in keyof Arg]: Arg[K] extends (q: never) => {
5488
+ result: QueryColumns;
5489
+ returnType: QueryReturnType;
5490
+ } ? ReturnType<Arg[K]>['returnType'] extends 'value' | 'valueOrThrow' ? {
5491
+ [P in K]: {
5492
+ as: K;
5493
+ column: ReturnType<Arg[K]>['result']['value'];
5494
+ };
5495
+ } : {
5496
+ [C in keyof ReturnType<Arg[K]>['result'] & string as `${K & string}.${C}`]: {
5497
+ as: C;
5498
+ column: ReturnType<Arg[K]>['result'][C];
5499
+ };
5500
+ } : Arg[K] extends Expression ? {
5501
+ [P in K]: {
5502
+ as: K;
5503
+ column: Arg[K]['result']['value'];
5504
+ };
5505
+ } : EmptyObject;
5506
+ }[keyof Arg];
5507
+ };
5508
5508
  type SelectAsValueResult<T extends SelectSelf, Arg> = Arg extends keyof T['meta']['selectable'] ? T['meta']['selectable'][Arg]['column'] : Arg extends Expression ? Arg['result']['value'] : Arg extends (q: never) => IsQuery ? SelectSubQueryResult<ReturnType<Arg>> : Arg extends (q: never) => Expression ? ReturnType<Arg>['result']['value'] : Arg extends (q: never) => IsQuery | Expression ? SelectSubQueryResult<Exclude<ReturnType<Arg>, Expression>> | Exclude<ReturnType<Arg>, IsQuery>['result']['value'] : never;
5509
5509
  type SelectSubQueryResult<Arg extends SelectSelf> = Arg['returnType'] extends undefined | 'all' ? ColumnsShapeToObjectArray<Arg['result']> : Arg['returnType'] extends 'value' | 'valueOrThrow' ? Arg['result']['value'] : Arg['returnType'] extends 'pluck' ? ColumnsShapeToPluck<Arg['result']> : Arg['returnType'] extends 'one' ? ColumnsShapeToNullableObject<Arg['result']> : ColumnsShapeToObject<Arg['result']>;
5510
5510
  declare const addParserForRawExpression: (q: PickQueryQ, key: string | getValueKey, raw: Expression) => void;
@@ -7313,9 +7313,15 @@ declare class QueryMethods<ColumnTypes> {
7313
7313
  * .group('month');
7314
7314
  * ```
7315
7315
  *
7316
+ * Column aliases in `select` take precedence over table columns,
7317
+ * so if in the query above `db.product` had a column `month`,
7318
+ * the query would work in the exact same way, group by would reference the selected `month` expression.
7319
+ *
7316
7320
  * @param columns - column names or a raw SQL
7317
7321
  */
7318
- group<T extends PickQueryResult>(this: T, ...columns: GroupArgs<T>): T;
7322
+ group<T extends PickQueryMetaResult>(this: T, ...columns: T['meta']['hasSelect'] extends true ? GroupArgs<T> : {
7323
+ error: 'select is required for group';
7324
+ }[]): T;
7319
7325
  /**
7320
7326
  * Add a window with `window` and use it later by its name for aggregate or window functions:
7321
7327
  *
package/dist/index.js CHANGED
@@ -5650,11 +5650,18 @@ function queryJson(self, coalesce) {
5650
5650
  return q;
5651
5651
  }
5652
5652
 
5653
- const pushSelectSql = (ctx, table, query, quotedAs) => {
5654
- const sql = selectToSql(ctx, table, query, quotedAs);
5653
+ const pushSelectSql = (ctx, table, query, quotedAs, aliases) => {
5654
+ const sql = selectToSql(
5655
+ ctx,
5656
+ table,
5657
+ query,
5658
+ quotedAs,
5659
+ query.hookSelect,
5660
+ aliases
5661
+ );
5655
5662
  if (sql) ctx.sql.push(sql);
5656
5663
  };
5657
- const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect) => {
5664
+ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect, aliases) => {
5658
5665
  let selected;
5659
5666
  const list = [];
5660
5667
  if (query.select) {
@@ -5696,6 +5703,7 @@ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect)
5696
5703
  }
5697
5704
  }
5698
5705
  list.push(sql);
5706
+ aliases?.push("");
5699
5707
  } else if (item) {
5700
5708
  if ("selectAs" in item) {
5701
5709
  const obj = item.selectAs;
@@ -5705,8 +5713,9 @@ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect)
5705
5713
  if (typeof value === "object") {
5706
5714
  if (orchidCore.isExpression(value)) {
5707
5715
  list.push(`${value.toSQL(ctx, quotedAs)} "${as}"`);
5716
+ aliases?.push(as);
5708
5717
  } else {
5709
- pushSubQuerySql(ctx, value, as, list, quotedAs);
5718
+ pushSubQuerySql(ctx, value, as, list, quotedAs, aliases);
5710
5719
  }
5711
5720
  } else if (value) {
5712
5721
  list.push(
@@ -5719,10 +5728,12 @@ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect)
5719
5728
  true
5720
5729
  )
5721
5730
  );
5731
+ aliases?.push(as);
5722
5732
  }
5723
5733
  }
5724
5734
  } else {
5725
5735
  list.push(selectedObjectToSQL(ctx, quotedAs, item));
5736
+ aliases?.push("");
5726
5737
  }
5727
5738
  }
5728
5739
  }
@@ -5773,7 +5784,7 @@ function selectedObjectToSQL(ctx, quotedAs, item) {
5773
5784
  const selectAllSql = (query, quotedAs) => {
5774
5785
  return query.join?.length ? query.selectAllColumns?.map((item) => `${quotedAs}.${item}`).join(", ") || `${quotedAs}.*` : query.selectAllColumns?.join(", ") || "*";
5775
5786
  };
5776
- const pushSubQuerySql = (ctx, query, as, list, quotedAs) => {
5787
+ const pushSubQuerySql = (ctx, query, as, list, quotedAs, aliases) => {
5777
5788
  const { returnType = "all" } = query.q;
5778
5789
  if (isQueryNone(query)) {
5779
5790
  let sql;
@@ -5799,6 +5810,7 @@ const pushSubQuerySql = (ctx, query, as, list, quotedAs) => {
5799
5810
  throw new UnhandledTypeError(query, returnType);
5800
5811
  }
5801
5812
  list.push(`${sql} "${as}"`);
5813
+ aliases?.push(as);
5802
5814
  return;
5803
5815
  }
5804
5816
  if (query.q.joinedForSelect) {
@@ -5823,7 +5835,10 @@ const pushSubQuerySql = (ctx, query, as, list, quotedAs) => {
5823
5835
  default:
5824
5836
  throw new UnhandledTypeError(query, returnType);
5825
5837
  }
5826
- if (sql) list.push(`${coalesce(ctx, query, sql, quotedAs)} "${as}"`);
5838
+ if (sql) {
5839
+ list.push(`${coalesce(ctx, query, sql, quotedAs)} "${as}"`);
5840
+ aliases?.push(as);
5841
+ }
5827
5842
  return;
5828
5843
  }
5829
5844
  switch (returnType) {
@@ -6593,7 +6608,8 @@ const makeSQL = (table, options) => {
6593
6608
  if (query.distinct) {
6594
6609
  pushDistinctSql(ctx, table, query.distinct, quotedAs);
6595
6610
  }
6596
- pushSelectSql(ctx, table, query, quotedAs);
6611
+ const aliases = query.group ? [] : void 0;
6612
+ pushSelectSql(ctx, table, query, quotedAs, aliases);
6597
6613
  if (table.table || query.from) {
6598
6614
  pushFromAndAs(ctx, table, query, quotedAs);
6599
6615
  }
@@ -6609,9 +6625,14 @@ const makeSQL = (table, options) => {
6609
6625
  pushWhereStatementSql(ctx, table, query, quotedAs);
6610
6626
  }
6611
6627
  if (query.group) {
6612
- const group = query.group.map(
6613
- (item) => orchidCore.isExpression(item) ? item.toSQL(ctx, quotedAs) : maybeSelectedColumnToSql(ctx, table.q, item, quotedAs)
6614
- );
6628
+ const group = query.group.map((item) => {
6629
+ if (orchidCore.isExpression(item)) {
6630
+ return item.toSQL(ctx, quotedAs);
6631
+ } else {
6632
+ const i = aliases.indexOf(item);
6633
+ return i !== -1 ? i + 1 : columnToSql(ctx, table.q, table.shape, item, quotedAs);
6634
+ }
6635
+ });
6615
6636
  sql.push(`GROUP BY ${group.join(", ")}`);
6616
6637
  }
6617
6638
  if (query.having) pushHavingSql(ctx, query, quotedAs);
@@ -11722,6 +11743,10 @@ class QueryMethods {
11722
11743
  * .group('month');
11723
11744
  * ```
11724
11745
  *
11746
+ * Column aliases in `select` take precedence over table columns,
11747
+ * so if in the query above `db.product` had a column `month`,
11748
+ * the query would work in the exact same way, group by would reference the selected `month` expression.
11749
+ *
11725
11750
  * @param columns - column names or a raw SQL
11726
11751
  */
11727
11752
  group(...columns) {