orchid-orm 1.78.3 → 1.78.5

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.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { DynamicRawSQL, QueryHooks, RawSql, VirtualColumn, _appendQuery, _appendQueryOnUpsertCreate, _clone, _createDbSqlMethod, _hookSelectColumns, _initQueryBuilder, _onUpsertUpdate, _orCreate, _prependWith, _prependWithOnUpsertCreate, _queryCreate, _queryCreateMany, _queryCreateManyFrom, _queryDefaults, _queryDelete, _queryFindBy, _queryFindByOptional, _queryHookAfterCreate, _queryHookAfterUpdate, _queryInsert, _queryInsertForEachFrom, _queryInsertMany, _queryInsertManyFrom, _queryJoinOn, _querySelect, _queryTake, _queryTakeOptional, _queryUpdate, _queryUpdateOrThrow, _queryUpsert, _queryWhere, _queryWhereExists, _queryWhereIn, applyMixins, cloneQueryBaseUnscoped, defaultSchemaConfig, emptyArray, emptyObject, getCallerFilePath, getClonedQueryData, getColumnTypes, getForeignKeyTableInstance, getFreeAlias, getPrimaryKeys, getQueryAs, getShapeFromSelect, getStackTrace, internalSchemaConfig, isExpression, isQueryReturnsAll, makeColumnTypes, noop, objectHasValues, parseTableData, parseTableDataInput, prepareSubQueryForSql, pushQueryOnForOuter, setQueryObjectValueImmutable, tableDataMethods, toArray, toSnakeCase } from "pqb/internal";
2
- import { Db, NotFoundError, OrchidOrmInternalError } from "pqb";
1
+ import { DynamicRawSQL, QueryHooks, RawSql, ValExpression, VirtualColumn, _appendQuery, _appendQueryOnUpsertCreate, _clone, _createDbSqlMethod, _hookSelectColumns, _initQueryBuilder, _onUpsertUpdate, _orCreate, _prependWith, _prependWithOnUpsertCreate, _queryCreate, _queryCreateMany, _queryCreateManyFrom, _queryDefaults, _queryDelete, _queryFindBy, _queryFindByOptional, _queryHookAfterCreate, _queryHookAfterUpdate, _queryInsert, _queryInsertForEachFrom, _queryInsertMany, _queryInsertManyFrom, _queryJoinOn, _querySelect, _queryTake, _queryTakeOptional, _queryUpdate, _queryUpdateOrThrow, _queryUpsert, _queryWhere, _queryWhereExists, _queryWhereIn, applyMixins, cloneQueryBaseUnscoped, defaultSchemaConfig, emptyArray, emptyObject, getCallerFilePath, getClonedQueryData, getColumnTypes, getForeignKeyTableInstance, getFreeAlias, getPrimaryKeys, getQueryAs, getShapeFromSelect, getStackTrace, internalSchemaConfig, isExpression, isQueryReturnsAll, makeColumnTypes, noop, objectHasValues, parseTableData, parseTableDataInput, prepareSubQueryForSql, pushQueryOnForOuter, setQueryObjectValueImmutable, tableDataMethods, toArray, toSnakeCase } from "pqb/internal";
2
+ import { Db, Expression, NotFoundError, OrchidOrmInternalError } from "pqb";
3
3
  import { AsyncLocalStorage } from "node:async_hooks";
4
4
  export * from "pqb";
5
5
  function createBaseTable({ schemaConfig = defaultSchemaConfig, columnTypes: columnTypesArg, snakeCase, filePath: filePathArg, nowSQL, exportAs = "BaseTable", language, autoForeignKeys } = {}) {
@@ -2616,6 +2616,81 @@ function isInTransaction() {
2616
2616
  function afterCommit(hook) {
2617
2617
  this.$qb.afterCommit(hook);
2618
2618
  }
2619
+ const ormSelect = (qb) => (async (selection) => {
2620
+ const q = qb.select(selection);
2621
+ const [{ selectAs }] = q.q.select;
2622
+ const values = Object.entries(selectAs);
2623
+ if (values.every(([, val]) => val instanceof ValExpression)) return Object.fromEntries(values.map(([key, expr]) => [key, expr.value]));
2624
+ const valExpressions = {};
2625
+ for (const [key, value] of values) if (value instanceof ValExpression) {
2626
+ valExpressions[key] = value.value;
2627
+ delete selectAs[key];
2628
+ }
2629
+ const result = await q.take();
2630
+ return Object.assign(result, valExpressions);
2631
+ });
2632
+ var PreparedParamExpression = class extends Expression {
2633
+ constructor(key) {
2634
+ super();
2635
+ this.key = key;
2636
+ this.result = { value: emptyObject };
2637
+ this.q = { expr: this };
2638
+ }
2639
+ makeSQL(ctx) {
2640
+ ctx.values.push(this);
2641
+ return `$${ctx.values.length}`;
2642
+ }
2643
+ };
2644
+ const prepareSqlItem = (sql, params) => {
2645
+ const values = sql.values?.map((value) => {
2646
+ return value instanceof PreparedParamExpression ? params[value.key] : value;
2647
+ });
2648
+ return {
2649
+ ...sql,
2650
+ values,
2651
+ prepare: true
2652
+ };
2653
+ };
2654
+ const prepareSql = (sql, params) => {
2655
+ if ("text" in sql) return prepareSqlItem(sql, params);
2656
+ return {
2657
+ ...sql,
2658
+ batch: sql.batch.map((item) => prepareSqlItem(item, params))
2659
+ };
2660
+ };
2661
+ const createPreparedParams = () => {
2662
+ return new Proxy(Object.create(null), { get(expressions, key) {
2663
+ if (typeof key !== "string") return;
2664
+ let expression = expressions[key];
2665
+ if (!expression) {
2666
+ expression = new PreparedParamExpression(key);
2667
+ expressions[key] = expression;
2668
+ }
2669
+ return expression;
2670
+ } });
2671
+ };
2672
+ const ormPrepare = () => {
2673
+ return ((callback) => {
2674
+ const query = callback(createPreparedParams());
2675
+ const emptyParams = {};
2676
+ let prepared;
2677
+ return (params) => {
2678
+ let cached;
2679
+ if (prepared) cached = prepared;
2680
+ else {
2681
+ const sql = query.toSQL(true);
2682
+ cached = {
2683
+ query: Object.create(query),
2684
+ sql
2685
+ };
2686
+ prepared = cached;
2687
+ }
2688
+ const executionQuery = Object.create(cached.query);
2689
+ Object.defineProperty(executionQuery, "toSQL", { value: () => prepareSql(cached.sql, params ?? emptyParams) });
2690
+ return executionQuery.then();
2691
+ };
2692
+ });
2693
+ };
2619
2694
  /**
2620
2695
  * Identity helper for table row-level security configuration.
2621
2696
  */
@@ -2765,7 +2840,8 @@ const privateOrchidORMWithAdapter = ({ log, logger, autoPreparedStatements, noPr
2765
2840
  $withRecursive: qb.withRecursive.bind(qb),
2766
2841
  $withSql: qb.withSql.bind(qb),
2767
2842
  $from: qb.from.bind(qb),
2768
- $select: ((selection) => qb.select(selection).take()),
2843
+ $select: ormSelect(qb),
2844
+ $prepare: ormPrepare(),
2769
2845
  $close: adapter.close.bind(adapter),
2770
2846
  $withOptions: qb.withOptions.bind(qb)
2771
2847
  };