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 +39 -31
- package/dist/index.js +41 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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
|
|
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
|
|
5491
|
-
|
|
5492
|
-
|
|
5493
|
-
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5502
|
-
|
|
5503
|
-
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
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
|
|
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,
|
|
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,
|
|
816
|
-
return
|
|
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.
|
|
901
|
-
orchidCore.addCode(code, columnCheckToCode(ctx, data.
|
|
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(
|
|
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)
|
|
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
|
-
|
|
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
|
-
(
|
|
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) {
|