pqb 0.42.9 → 0.43.1

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
@@ -2835,13 +2835,15 @@ declare namespace TableData {
2835
2835
  * - SET DEFAULT Set all the referencing columns, or a specified subset of the referencing columns, to their default values. A subset of columns can only be specified for ON DELETE actions. (There must be a row in the referenced table matching the default values, if they are not null, or the operation will fail.)
2836
2836
  */
2837
2837
  type Action = 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';
2838
- interface Options {
2839
- name?: string;
2838
+ interface BaseOptions {
2840
2839
  match?: Match;
2841
2840
  onUpdate?: Action;
2842
2841
  onDelete?: Action;
2843
2842
  dropMode?: TableData.DropMode;
2844
2843
  }
2844
+ interface Options extends BaseOptions {
2845
+ name?: string;
2846
+ }
2845
2847
  }
2846
2848
  export { };
2847
2849
  }
@@ -2971,7 +2973,7 @@ declare const tableDataMethods: TableDataMethods<string>;
2971
2973
  declare const parseTableData: (dataFn?: TableDataFn<unknown, any>) => TableData;
2972
2974
  declare const parseTableDataInput: (tableData: TableData, item: TableDataInput) => void;
2973
2975
 
2974
- interface NumberColumnData extends BaseNumberData {
2976
+ interface NumberColumnData extends BaseNumberData, ColumnData {
2975
2977
  identity?: TableData.Identity;
2976
2978
  }
2977
2979
  interface SerialColumnData extends NumberColumnData {
@@ -5465,10 +5467,7 @@ type SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = {
5465
5467
  }) & (T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K];
5466
5468
  } & QueryMetaHasSelect;
5467
5469
  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' ? {
5470
+ [K in keyof T]: K extends 'meta' ? T['meta'] & SelectAsMeta<Obj> : K extends 'result' ? {
5472
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;
5473
5472
  } : K extends 'returnType' ? SelectReturnType<T> : K extends 'then' ? QueryThenByReturnType<SelectReturnType<T>, {
5474
5473
  [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 +5476,37 @@ type SelectResultObj<T extends SelectSelf, Obj> = Obj extends SelectAsCheckRetur
5477
5476
  [K in keyof Obj]: Obj[K] extends (...args: any[]) => any ? ReturnType<Obj[K]> extends SelectAsFnReturnType ? never : K : never;
5478
5477
  }[keyof Obj] & string}`;
5479
5478
  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,
5479
+ [K in keyof T]: K extends 'meta' ? T['meta'] & SelectAsMeta<Obj> : K extends 'result' ? // Combine previously selected items, all columns if * was provided,
5484
5480
  {
5485
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'];
5486
5482
  } & (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
5483
  [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
5484
  } & (T['meta']['hasSelect'] extends (T['returnType'] extends 'value' | 'valueOrThrow' ? never : true) ? Omit<T['result'], Columns[number]> : unknown)> : T[K];
5489
5485
  };
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];
5486
+ type SelectAsMeta<Arg> = {
5487
+ hasSelect: true;
5488
+ selectable: {
5489
+ [K in keyof Arg]: Arg[K] extends (q: never) => {
5490
+ result: QueryColumns;
5491
+ returnType: QueryReturnType;
5492
+ } ? ReturnType<Arg[K]>['returnType'] extends 'value' | 'valueOrThrow' ? {
5493
+ [P in K]: {
5494
+ as: K;
5495
+ column: ReturnType<Arg[K]>['result']['value'];
5496
+ };
5497
+ } : {
5498
+ [C in keyof ReturnType<Arg[K]>['result'] & string as `${K & string}.${C}`]: {
5499
+ as: C;
5500
+ column: ReturnType<Arg[K]>['result'][C];
5501
+ };
5502
+ } : Arg[K] extends Expression ? {
5503
+ [P in K]: {
5504
+ as: K;
5505
+ column: Arg[K]['result']['value'];
5506
+ };
5507
+ } : EmptyObject;
5508
+ }[keyof Arg];
5509
+ };
5508
5510
  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
5511
  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
5512
  declare const addParserForRawExpression: (q: PickQueryQ, key: string | getValueKey, raw: Expression) => void;
@@ -7313,9 +7315,15 @@ declare class QueryMethods<ColumnTypes> {
7313
7315
  * .group('month');
7314
7316
  * ```
7315
7317
  *
7318
+ * Column aliases in `select` take precedence over table columns,
7319
+ * so if in the query above `db.product` had a column `month`,
7320
+ * the query would work in the exact same way, group by would reference the selected `month` expression.
7321
+ *
7316
7322
  * @param columns - column names or a raw SQL
7317
7323
  */
7318
- group<T extends PickQueryResult>(this: T, ...columns: GroupArgs<T>): T;
7324
+ group<T extends PickQueryMetaResult>(this: T, ...columns: T['meta']['hasSelect'] extends true ? GroupArgs<T> : {
7325
+ error: 'select is required for group';
7326
+ }[]): T;
7319
7327
  /**
7320
7328
  * Add a window with `window` and use it later by its name for aggregate or window functions:
7321
7329
  *
@@ -8464,7 +8472,7 @@ declare const columnForeignKeysToCode: (foreignKeys: TableData.ColumnReferences[
8464
8472
  declare const foreignKeyArgumentToCode: ({ fnOrTable, foreignColumns, options, }: TableData.ColumnReferences, migration: boolean | undefined) => Codes;
8465
8473
  declare const columnIndexesToCode: (items: Exclude<ColumnData['indexes'], undefined>) => Codes;
8466
8474
  declare const columnExcludesToCode: (items: Exclude<ColumnData['excludes'], undefined>) => Codes;
8467
- declare const columnCheckToCode: (ctx: ColumnToCodeCtx, { sql, name }: ColumnDataCheckBase, columnName: string) => string;
8475
+ declare const columnCheckToCode: (ctx: ColumnToCodeCtx, checks: ColumnDataCheckBase[]) => string;
8468
8476
  declare const identityToCode: (identity: TableData.Identity, dataType?: string) => Codes;
8469
8477
  declare const columnCode: (type: ColumnType, ctx: ColumnToCodeCtx, key: string, code: Code) => Code;
8470
8478
 
package/dist/index.js CHANGED
@@ -812,8 +812,10 @@ const columnExcludesToCode = (items) => {
812
812
  }
813
813
  return code;
814
814
  };
815
- const columnCheckToCode = (ctx, { sql, name }, columnName) => {
816
- return `.check(${sql.toCode(ctx.t)}${name && name !== `${ctx.table}_${columnName}_check` ? `, { name: '${name}' }` : ""})`;
815
+ const columnCheckToCode = (ctx, checks) => {
816
+ return checks.map(
817
+ ({ sql, name }) => `.check(${sql.toCode(ctx.t)}${name ? `, '${name}'` : ""})`
818
+ ).join("");
817
819
  };
818
820
  const identityToCode = (identity, dataType) => {
819
821
  const code = [];
@@ -897,8 +899,8 @@ const columnCode = (type, ctx, key, code) => {
897
899
  }
898
900
  }
899
901
  if (data.comment) orchidCore.addCode(code, `.comment(${orchidCore.singleQuote(data.comment)})`);
900
- if (data.check) {
901
- orchidCore.addCode(code, columnCheckToCode(ctx, data.check, name));
902
+ if (data.checks) {
903
+ orchidCore.addCode(code, columnCheckToCode(ctx, data.checks));
902
904
  }
903
905
  if (data.errors) {
904
906
  for (const part of orchidCore.columnErrorMessagesToCode(data.errors)) {
@@ -5650,11 +5652,18 @@ function queryJson(self, coalesce) {
5650
5652
  return q;
5651
5653
  }
5652
5654
 
5653
- const pushSelectSql = (ctx, table, query, quotedAs) => {
5654
- const sql = selectToSql(ctx, table, query, quotedAs);
5655
+ const pushSelectSql = (ctx, table, query, quotedAs, aliases) => {
5656
+ const sql = selectToSql(
5657
+ ctx,
5658
+ table,
5659
+ query,
5660
+ quotedAs,
5661
+ query.hookSelect,
5662
+ aliases
5663
+ );
5655
5664
  if (sql) ctx.sql.push(sql);
5656
5665
  };
5657
- const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect) => {
5666
+ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect, aliases) => {
5658
5667
  let selected;
5659
5668
  const list = [];
5660
5669
  if (query.select) {
@@ -5696,6 +5705,7 @@ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect)
5696
5705
  }
5697
5706
  }
5698
5707
  list.push(sql);
5708
+ aliases?.push("");
5699
5709
  } else if (item) {
5700
5710
  if ("selectAs" in item) {
5701
5711
  const obj = item.selectAs;
@@ -5705,8 +5715,9 @@ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect)
5705
5715
  if (typeof value === "object") {
5706
5716
  if (orchidCore.isExpression(value)) {
5707
5717
  list.push(`${value.toSQL(ctx, quotedAs)} "${as}"`);
5718
+ aliases?.push(as);
5708
5719
  } else {
5709
- pushSubQuerySql(ctx, value, as, list, quotedAs);
5720
+ pushSubQuerySql(ctx, value, as, list, quotedAs, aliases);
5710
5721
  }
5711
5722
  } else if (value) {
5712
5723
  list.push(
@@ -5719,10 +5730,12 @@ const selectToSql = (ctx, table, query, quotedAs, hookSelect = query.hookSelect)
5719
5730
  true
5720
5731
  )
5721
5732
  );
5733
+ aliases?.push(as);
5722
5734
  }
5723
5735
  }
5724
5736
  } else {
5725
5737
  list.push(selectedObjectToSQL(ctx, quotedAs, item));
5738
+ aliases?.push("");
5726
5739
  }
5727
5740
  }
5728
5741
  }
@@ -5773,7 +5786,7 @@ function selectedObjectToSQL(ctx, quotedAs, item) {
5773
5786
  const selectAllSql = (query, quotedAs) => {
5774
5787
  return query.join?.length ? query.selectAllColumns?.map((item) => `${quotedAs}.${item}`).join(", ") || `${quotedAs}.*` : query.selectAllColumns?.join(", ") || "*";
5775
5788
  };
5776
- const pushSubQuerySql = (ctx, query, as, list, quotedAs) => {
5789
+ const pushSubQuerySql = (ctx, query, as, list, quotedAs, aliases) => {
5777
5790
  const { returnType = "all" } = query.q;
5778
5791
  if (isQueryNone(query)) {
5779
5792
  let sql;
@@ -5799,6 +5812,7 @@ const pushSubQuerySql = (ctx, query, as, list, quotedAs) => {
5799
5812
  throw new UnhandledTypeError(query, returnType);
5800
5813
  }
5801
5814
  list.push(`${sql} "${as}"`);
5815
+ aliases?.push(as);
5802
5816
  return;
5803
5817
  }
5804
5818
  if (query.q.joinedForSelect) {
@@ -5823,7 +5837,10 @@ const pushSubQuerySql = (ctx, query, as, list, quotedAs) => {
5823
5837
  default:
5824
5838
  throw new UnhandledTypeError(query, returnType);
5825
5839
  }
5826
- if (sql) list.push(`${coalesce(ctx, query, sql, quotedAs)} "${as}"`);
5840
+ if (sql) {
5841
+ list.push(`${coalesce(ctx, query, sql, quotedAs)} "${as}"`);
5842
+ aliases?.push(as);
5843
+ }
5827
5844
  return;
5828
5845
  }
5829
5846
  switch (returnType) {
@@ -6593,7 +6610,8 @@ const makeSQL = (table, options) => {
6593
6610
  if (query.distinct) {
6594
6611
  pushDistinctSql(ctx, table, query.distinct, quotedAs);
6595
6612
  }
6596
- pushSelectSql(ctx, table, query, quotedAs);
6613
+ const aliases = query.group ? [] : void 0;
6614
+ pushSelectSql(ctx, table, query, quotedAs, aliases);
6597
6615
  if (table.table || query.from) {
6598
6616
  pushFromAndAs(ctx, table, query, quotedAs);
6599
6617
  }
@@ -6609,9 +6627,14 @@ const makeSQL = (table, options) => {
6609
6627
  pushWhereStatementSql(ctx, table, query, quotedAs);
6610
6628
  }
6611
6629
  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
- );
6630
+ const group = query.group.map((item) => {
6631
+ if (orchidCore.isExpression(item)) {
6632
+ return item.toSQL(ctx, quotedAs);
6633
+ } else {
6634
+ const i = aliases.indexOf(item);
6635
+ return i !== -1 ? i + 1 : columnToSql(ctx, table.q, table.shape, item, quotedAs);
6636
+ }
6637
+ });
6615
6638
  sql.push(`GROUP BY ${group.join(", ")}`);
6616
6639
  }
6617
6640
  if (query.having) pushHavingSql(ctx, query, quotedAs);
@@ -11722,6 +11745,10 @@ class QueryMethods {
11722
11745
  * .group('month');
11723
11746
  * ```
11724
11747
  *
11748
+ * Column aliases in `select` take precedence over table columns,
11749
+ * so if in the query above `db.product` had a column `month`,
11750
+ * the query would work in the exact same way, group by would reference the selected `month` expression.
11751
+ *
11725
11752
  * @param columns - column names or a raw SQL
11726
11753
  */
11727
11754
  group(...columns) {