@palbase/backend 27.0.0 → 27.1.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/bin/palbase-backend.cjs +32 -1
- package/dist/bin/palbase-backend.cjs.map +1 -1
- package/dist/bin/palbase-backend.js +4 -4
- package/dist/{chunk-I3C4PFIW.js → chunk-BQN723PL.js} +3 -3
- package/dist/{chunk-OO7R25AI.js → chunk-EB3TUX5J.js} +20 -5
- package/dist/chunk-EB3TUX5J.js.map +1 -0
- package/dist/{chunk-GYK6QYS4.js → chunk-JVZQCC77.js} +21 -1
- package/dist/chunk-JVZQCC77.js.map +1 -0
- package/dist/{chunk-DRZFQRJI.js → chunk-OZKSM3JW.js} +2 -2
- package/dist/chunk-OZKSM3JW.js.map +1 -0
- package/dist/{chunk-TS4U7NBD.js → chunk-XABHGMUT.js} +2 -2
- package/dist/db/index.cjs +26 -0
- package/dist/db/index.cjs.map +1 -1
- package/dist/db/index.d.cts +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.js +3 -3
- package/dist/engine/index.cjs +32 -1
- package/dist/engine/index.cjs.map +1 -1
- package/dist/engine/index.d.cts +3 -3
- package/dist/engine/index.d.ts +3 -3
- package/dist/engine/index.js +4 -4
- package/dist/{index-NuzRCuxe.d.ts → index-CAKOgAlP.d.ts} +2 -2
- package/dist/{index-Bve7BBTL.d.cts → index-CgE4sVhg.d.cts} +32 -12
- package/dist/{index-VtToZmUm.d.cts → index-H-0qv5d4.d.cts} +2 -2
- package/dist/{index-BrvvxSpn.d.ts → index-V7QRh1wg.d.ts} +32 -12
- package/dist/index.cjs +26 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +4 -4
- package/dist/openapi/index.d.cts +2 -2
- package/dist/openapi/index.d.ts +2 -2
- package/dist/{registry-B0eyOF9x.d.ts → registry-4EI8aaFs.d.ts} +1 -1
- package/dist/{registry-Bk9_rbNd.d.cts → registry-DHsPDY0_.d.cts} +1 -1
- package/dist/test/index.cjs +27 -0
- package/dist/test/index.cjs.map +1 -1
- package/dist/test/index.d.cts +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.js +19 -1
- package/dist/test/index.js.map +1 -1
- package/docs/database.md +35 -1
- package/docs/llms-full.txt +35 -1
- package/package.json +1 -1
- package/dist/chunk-DRZFQRJI.js.map +0 -1
- package/dist/chunk-GYK6QYS4.js.map +0 -1
- package/dist/chunk-OO7R25AI.js.map +0 -1
- /package/dist/{chunk-I3C4PFIW.js.map → chunk-BQN723PL.js.map} +0 -0
- /package/dist/{chunk-TS4U7NBD.js.map → chunk-XABHGMUT.js.map} +0 -0
package/dist/engine/index.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import '../index-
|
|
2
|
-
export { A as App, e as AuthVerifier, B as BootRefused, f as CreateAppOptions, E as EgressPolicy, g as EngineConfig, M as ModuleClients, R as RateLimiter, h as RequestDatabase, i as RouteEntry, j as RuntimeHooks, S as ScrubResult, k as SqlDriver, l as SqlTx, m as buildRouteTable, n as createApp, o as createLazyTransaction, p as createOps, q as createRequestDatabase, r as effectiveAuth, s as hostAllowed, t as installEgressFence, u as loadConfig, v as makeMemoryCache, w as matchRoute, x as quoteIdent, y as scrubSecrets, z as withTables } from '../index-
|
|
1
|
+
import '../index-CgE4sVhg.cjs';
|
|
2
|
+
export { A as App, e as AuthVerifier, B as BootRefused, f as CreateAppOptions, E as EgressPolicy, g as EngineConfig, M as ModuleClients, R as RateLimiter, h as RequestDatabase, i as RouteEntry, j as RuntimeHooks, S as ScrubResult, k as SqlDriver, l as SqlTx, m as buildRouteTable, n as createApp, o as createLazyTransaction, p as createOps, q as createRequestDatabase, r as effectiveAuth, s as hostAllowed, t as installEgressFence, u as loadConfig, v as makeMemoryCache, w as matchRoute, x as quoteIdent, y as scrubSecrets, z as withTables } from '../index-H-0qv5d4.cjs';
|
|
3
3
|
import '../db/env.cjs';
|
|
4
4
|
import '../stack.cjs';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'node:async_hooks';
|
|
7
7
|
import '../module-Dl1KFVtc.cjs';
|
|
8
|
-
import '../registry-
|
|
8
|
+
import '../registry-DHsPDY0_.cjs';
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import '../index-
|
|
2
|
-
export { A as App, e as AuthVerifier, B as BootRefused, f as CreateAppOptions, E as EgressPolicy, g as EngineConfig, M as ModuleClients, R as RateLimiter, h as RequestDatabase, i as RouteEntry, j as RuntimeHooks, S as ScrubResult, k as SqlDriver, l as SqlTx, m as buildRouteTable, n as createApp, o as createLazyTransaction, p as createOps, q as createRequestDatabase, r as effectiveAuth, s as hostAllowed, t as installEgressFence, u as loadConfig, v as makeMemoryCache, w as matchRoute, x as quoteIdent, y as scrubSecrets, z as withTables } from '../index-
|
|
1
|
+
import '../index-V7QRh1wg.js';
|
|
2
|
+
export { A as App, e as AuthVerifier, B as BootRefused, f as CreateAppOptions, E as EgressPolicy, g as EngineConfig, M as ModuleClients, R as RateLimiter, h as RequestDatabase, i as RouteEntry, j as RuntimeHooks, S as ScrubResult, k as SqlDriver, l as SqlTx, m as buildRouteTable, n as createApp, o as createLazyTransaction, p as createOps, q as createRequestDatabase, r as effectiveAuth, s as hostAllowed, t as installEgressFence, u as loadConfig, v as makeMemoryCache, w as matchRoute, x as quoteIdent, y as scrubSecrets, z as withTables } from '../index-CAKOgAlP.js';
|
|
3
3
|
import '../db/env.js';
|
|
4
4
|
import '../stack.js';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'node:async_hooks';
|
|
7
7
|
import '../module-Dl1KFVtc.js';
|
|
8
|
-
import '../registry-
|
|
8
|
+
import '../registry-4EI8aaFs.js';
|
package/dist/engine/index.js
CHANGED
|
@@ -16,10 +16,10 @@ import {
|
|
|
16
16
|
quoteIdent,
|
|
17
17
|
scrubSecrets,
|
|
18
18
|
withTables
|
|
19
|
-
} from "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
19
|
+
} from "../chunk-EB3TUX5J.js";
|
|
20
|
+
import "../chunk-BQN723PL.js";
|
|
21
|
+
import "../chunk-OZKSM3JW.js";
|
|
22
|
+
import "../chunk-JVZQCC77.js";
|
|
23
23
|
import "../chunk-VVMJEVQP.js";
|
|
24
24
|
import "../chunk-CGNN2PUH.js";
|
|
25
25
|
import "../chunk-VXPNPVAG.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { D as DBClient, a as DBOps, T as TxPlanBody, b as TxPlanResponse, A as AuthSpec, C as CacheClient, c as RuntimeServices, _ as __runWithRuntime, d as __requestALS } from './index-
|
|
1
|
+
import { D as DBClient, a as DBOps, T as TxPlanBody, b as TxPlanResponse, A as AuthSpec, C as CacheClient, c as RuntimeServices, _ as __runWithRuntime, d as __requestALS } from './index-V7QRh1wg.js';
|
|
2
2
|
import { T as Token } from './module-Dl1KFVtc.js';
|
|
3
|
-
import { R as RouteMeta } from './registry-
|
|
3
|
+
import { R as RouteMeta } from './registry-4EI8aaFs.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* engine/config.ts — settings from the environment, and the gate that refuses
|
|
@@ -3052,12 +3052,24 @@ type TextOps<V> = V extends string ? {
|
|
|
3052
3052
|
* `C` bir parametre, çünkü `ColRefOf<Row, V>` aksi hâlde altı operatör
|
|
3053
3053
|
* konumunda AYRI AYRI instantiate edilirdi — kolon başına altı mapped type.
|
|
3054
3054
|
* Böyle kolon başına BİR tane (N-2). */
|
|
3055
|
+
/**
|
|
3056
|
+
* `now()` HANGİ kolonlarda karşılaştırma değeri olabilir.
|
|
3057
|
+
*
|
|
3058
|
+
* `timestamp` TypeScript'e `string` olarak geliyor — `text` ile aynı tip. Yani
|
|
3059
|
+
* "yalnız zaman kolonları" tip düzeyinde İFADE EDİLEMEZ (D-021'in tam olarak
|
|
3060
|
+
* kaydettiği sınır: TS numeric/bigint/text/uuid/timestamp'ı `string`'e
|
|
3061
|
+
* çöktürüyor). İki seçenekten yanlış KABUL, yanlış RET'e tercih ediliyor:
|
|
3062
|
+
* `now()`'ı bir metin kolonunda yazmak Postgres hatası verir, ama zaman
|
|
3063
|
+
* kolonunda YASAKLAMAK yazarı bu yüzden `sqlFragment`e düşürürdü — ve bu
|
|
3064
|
+
* özelliğin var olma nedeni tam olarak o düşüşü kaldırmak.
|
|
3065
|
+
*/
|
|
3066
|
+
type NowComparable<V> = [NonNullable<V>] extends [string | Date] ? TxNow : never;
|
|
3055
3067
|
type WhereOpBody<V, C> = {
|
|
3056
|
-
gt?: V | C
|
|
3057
|
-
gte?: V | C
|
|
3058
|
-
lt?: V | C
|
|
3059
|
-
lte?: V | C
|
|
3060
|
-
neq?: V | C
|
|
3068
|
+
gt?: V | C | NowComparable<V>;
|
|
3069
|
+
gte?: V | C | NowComparable<V>;
|
|
3070
|
+
lt?: V | C | NowComparable<V>;
|
|
3071
|
+
lte?: V | C | NowComparable<V>;
|
|
3072
|
+
neq?: V | C | NowComparable<V>;
|
|
3061
3073
|
in?: V[];
|
|
3062
3074
|
/** `IS NULL` / `IS NOT NULL` (FR-006) — `= NULL` SQL'de her zaman UNKNOWN'dır. */
|
|
3063
3075
|
isNull?: boolean;
|
|
@@ -3072,7 +3084,7 @@ type WhereOp<V, Row = unknown> = WhereOpWith<V, ColRefOf<Row, V>>;
|
|
|
3072
3084
|
* `TextOps<V>` `V extends string` diye soruyor ve `string | Ref<string>` o
|
|
3073
3085
|
* soruya HAYIR der, yani `contains`/`startsWith` sessizce KAYBOLURDU.
|
|
3074
3086
|
*/
|
|
3075
|
-
type WhereOpWith<V, C> = V | C | WhereOpBody<V, C>;
|
|
3087
|
+
type WhereOpWith<V, C> = V | C | NowComparable<V> | WhereOpBody<V, C>;
|
|
3076
3088
|
/**
|
|
3077
3089
|
* A filter over a row: every field optional, each one a plain value (equality)
|
|
3078
3090
|
* or an operator object. THE filter language — `findMany`, `updateMany`,
|
|
@@ -3089,10 +3101,18 @@ type WhereFilter<Row> = {
|
|
|
3089
3101
|
* Kysely'nin TS7'de 9,8M instantiation üreten vakası derin generic
|
|
3090
3102
|
* özyinelemeydi. Burada derinlik yazarın filtresi kadardır ve pratikte
|
|
3091
3103
|
* bir-iki seviyedir; tip maliyeti T001'in tavanına karşı ölçülür.
|
|
3104
|
+
*
|
|
3105
|
+
* Dal bir `sqlFragment` DE olabilir. Motor bunu zaten derliyordu — parantezli
|
|
3106
|
+
* ve parametreli (`… AND (((expires_at > now())) AND (t."city" = $2))`) —
|
|
3107
|
+
* ama tip yalnız üst düzey `where`'de fragment'e izin veriyordu. Yani
|
|
3108
|
+
* "fragment sorgudan KAÇMAK için değil, sorgunun İÇİNE girmek için" sözü tam
|
|
3109
|
+
* da bileşim anında kırılıyordu: bir koşulu bir fragment'le birleştirmek
|
|
3110
|
+
* isteyen yazar SORGUNUN TAMAMINI ham SQL'e taşımak zorunda kalıyordu.
|
|
3111
|
+
* Ölçüldü: bir müşteri sorgusunda tam olarak bu oldu.
|
|
3092
3112
|
*/
|
|
3093
|
-
OR?: WhereFilter<Row>[];
|
|
3094
|
-
AND?: WhereFilter<Row>[];
|
|
3095
|
-
NOT?: WhereFilter<Row
|
|
3113
|
+
OR?: (WhereFilter<Row> | SqlFragment)[];
|
|
3114
|
+
AND?: (WhereFilter<Row> | SqlFragment)[];
|
|
3115
|
+
NOT?: WhereFilter<Row> | SqlFragment;
|
|
3096
3116
|
};
|
|
3097
3117
|
/**
|
|
3098
3118
|
* Ordering and paging for a read.
|
|
@@ -3960,9 +3980,9 @@ type TxWhereField<Row, K extends keyof Row> = WhereOpWith<Row[K], ColRefOf<Row,
|
|
|
3960
3980
|
type TxWhere<Row, Rels = unknown> = {
|
|
3961
3981
|
[K in keyof Row]?: TxWhereField<Row, K>;
|
|
3962
3982
|
} & {
|
|
3963
|
-
OR?: TxWhere<Row, Rels>[];
|
|
3964
|
-
AND?: TxWhere<Row, Rels>[];
|
|
3965
|
-
NOT?: TxWhere<Row, Rels
|
|
3983
|
+
OR?: (TxWhere<Row, Rels> | SqlFragment)[];
|
|
3984
|
+
AND?: (TxWhere<Row, Rels> | SqlFragment)[];
|
|
3985
|
+
NOT?: TxWhere<Row, Rels> | SqlFragment;
|
|
3966
3986
|
} & HasOnly<Rels>;
|
|
3967
3987
|
/** Options for a plan `select`. */
|
|
3968
3988
|
interface TxSelectOptions {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { D as DBClient, a as DBOps, T as TxPlanBody, b as TxPlanResponse, A as AuthSpec, C as CacheClient, c as RuntimeServices, _ as __runWithRuntime, d as __requestALS } from './index-
|
|
1
|
+
import { D as DBClient, a as DBOps, T as TxPlanBody, b as TxPlanResponse, A as AuthSpec, C as CacheClient, c as RuntimeServices, _ as __runWithRuntime, d as __requestALS } from './index-CgE4sVhg.cjs';
|
|
2
2
|
import { T as Token } from './module-Dl1KFVtc.cjs';
|
|
3
|
-
import { R as RouteMeta } from './registry-
|
|
3
|
+
import { R as RouteMeta } from './registry-DHsPDY0_.cjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* engine/config.ts — settings from the environment, and the gate that refuses
|
|
@@ -3052,12 +3052,24 @@ type TextOps<V> = V extends string ? {
|
|
|
3052
3052
|
* `C` bir parametre, çünkü `ColRefOf<Row, V>` aksi hâlde altı operatör
|
|
3053
3053
|
* konumunda AYRI AYRI instantiate edilirdi — kolon başına altı mapped type.
|
|
3054
3054
|
* Böyle kolon başına BİR tane (N-2). */
|
|
3055
|
+
/**
|
|
3056
|
+
* `now()` HANGİ kolonlarda karşılaştırma değeri olabilir.
|
|
3057
|
+
*
|
|
3058
|
+
* `timestamp` TypeScript'e `string` olarak geliyor — `text` ile aynı tip. Yani
|
|
3059
|
+
* "yalnız zaman kolonları" tip düzeyinde İFADE EDİLEMEZ (D-021'in tam olarak
|
|
3060
|
+
* kaydettiği sınır: TS numeric/bigint/text/uuid/timestamp'ı `string`'e
|
|
3061
|
+
* çöktürüyor). İki seçenekten yanlış KABUL, yanlış RET'e tercih ediliyor:
|
|
3062
|
+
* `now()`'ı bir metin kolonunda yazmak Postgres hatası verir, ama zaman
|
|
3063
|
+
* kolonunda YASAKLAMAK yazarı bu yüzden `sqlFragment`e düşürürdü — ve bu
|
|
3064
|
+
* özelliğin var olma nedeni tam olarak o düşüşü kaldırmak.
|
|
3065
|
+
*/
|
|
3066
|
+
type NowComparable<V> = [NonNullable<V>] extends [string | Date] ? TxNow : never;
|
|
3055
3067
|
type WhereOpBody<V, C> = {
|
|
3056
|
-
gt?: V | C
|
|
3057
|
-
gte?: V | C
|
|
3058
|
-
lt?: V | C
|
|
3059
|
-
lte?: V | C
|
|
3060
|
-
neq?: V | C
|
|
3068
|
+
gt?: V | C | NowComparable<V>;
|
|
3069
|
+
gte?: V | C | NowComparable<V>;
|
|
3070
|
+
lt?: V | C | NowComparable<V>;
|
|
3071
|
+
lte?: V | C | NowComparable<V>;
|
|
3072
|
+
neq?: V | C | NowComparable<V>;
|
|
3061
3073
|
in?: V[];
|
|
3062
3074
|
/** `IS NULL` / `IS NOT NULL` (FR-006) — `= NULL` SQL'de her zaman UNKNOWN'dır. */
|
|
3063
3075
|
isNull?: boolean;
|
|
@@ -3072,7 +3084,7 @@ type WhereOp<V, Row = unknown> = WhereOpWith<V, ColRefOf<Row, V>>;
|
|
|
3072
3084
|
* `TextOps<V>` `V extends string` diye soruyor ve `string | Ref<string>` o
|
|
3073
3085
|
* soruya HAYIR der, yani `contains`/`startsWith` sessizce KAYBOLURDU.
|
|
3074
3086
|
*/
|
|
3075
|
-
type WhereOpWith<V, C> = V | C | WhereOpBody<V, C>;
|
|
3087
|
+
type WhereOpWith<V, C> = V | C | NowComparable<V> | WhereOpBody<V, C>;
|
|
3076
3088
|
/**
|
|
3077
3089
|
* A filter over a row: every field optional, each one a plain value (equality)
|
|
3078
3090
|
* or an operator object. THE filter language — `findMany`, `updateMany`,
|
|
@@ -3089,10 +3101,18 @@ type WhereFilter<Row> = {
|
|
|
3089
3101
|
* Kysely'nin TS7'de 9,8M instantiation üreten vakası derin generic
|
|
3090
3102
|
* özyinelemeydi. Burada derinlik yazarın filtresi kadardır ve pratikte
|
|
3091
3103
|
* bir-iki seviyedir; tip maliyeti T001'in tavanına karşı ölçülür.
|
|
3104
|
+
*
|
|
3105
|
+
* Dal bir `sqlFragment` DE olabilir. Motor bunu zaten derliyordu — parantezli
|
|
3106
|
+
* ve parametreli (`… AND (((expires_at > now())) AND (t."city" = $2))`) —
|
|
3107
|
+
* ama tip yalnız üst düzey `where`'de fragment'e izin veriyordu. Yani
|
|
3108
|
+
* "fragment sorgudan KAÇMAK için değil, sorgunun İÇİNE girmek için" sözü tam
|
|
3109
|
+
* da bileşim anında kırılıyordu: bir koşulu bir fragment'le birleştirmek
|
|
3110
|
+
* isteyen yazar SORGUNUN TAMAMINI ham SQL'e taşımak zorunda kalıyordu.
|
|
3111
|
+
* Ölçüldü: bir müşteri sorgusunda tam olarak bu oldu.
|
|
3092
3112
|
*/
|
|
3093
|
-
OR?: WhereFilter<Row>[];
|
|
3094
|
-
AND?: WhereFilter<Row>[];
|
|
3095
|
-
NOT?: WhereFilter<Row
|
|
3113
|
+
OR?: (WhereFilter<Row> | SqlFragment)[];
|
|
3114
|
+
AND?: (WhereFilter<Row> | SqlFragment)[];
|
|
3115
|
+
NOT?: WhereFilter<Row> | SqlFragment;
|
|
3096
3116
|
};
|
|
3097
3117
|
/**
|
|
3098
3118
|
* Ordering and paging for a read.
|
|
@@ -3960,9 +3980,9 @@ type TxWhereField<Row, K extends keyof Row> = WhereOpWith<Row[K], ColRefOf<Row,
|
|
|
3960
3980
|
type TxWhere<Row, Rels = unknown> = {
|
|
3961
3981
|
[K in keyof Row]?: TxWhereField<Row, K>;
|
|
3962
3982
|
} & {
|
|
3963
|
-
OR?: TxWhere<Row, Rels>[];
|
|
3964
|
-
AND?: TxWhere<Row, Rels>[];
|
|
3965
|
-
NOT?: TxWhere<Row, Rels
|
|
3983
|
+
OR?: (TxWhere<Row, Rels> | SqlFragment)[];
|
|
3984
|
+
AND?: (TxWhere<Row, Rels> | SqlFragment)[];
|
|
3985
|
+
NOT?: TxWhere<Row, Rels> | SqlFragment;
|
|
3966
3986
|
} & HasOnly<Rels>;
|
|
3967
3987
|
/** Options for a plan `select`. */
|
|
3968
3988
|
interface TxSelectOptions {
|
package/dist/index.cjs
CHANGED
|
@@ -192,6 +192,27 @@ function isSqlFragment(v) {
|
|
|
192
192
|
return f !== void 0 && Array.isArray(f.text) && Array.isArray(f.values);
|
|
193
193
|
}
|
|
194
194
|
__name(isSqlFragment, "isSqlFragment");
|
|
195
|
+
var TX_EXPR = /* @__PURE__ */ Symbol.for("palbase.tx.expr");
|
|
196
|
+
function isNowExpr(v) {
|
|
197
|
+
if (!isColumnExpr(v)) return false;
|
|
198
|
+
try {
|
|
199
|
+
const e = v[TX_EXPR];
|
|
200
|
+
return typeof e === "object" && e !== null && e.fn === "now";
|
|
201
|
+
} catch {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
__name(isNowExpr, "isNowExpr");
|
|
206
|
+
function isColumnExpr(v) {
|
|
207
|
+
if (typeof v !== "object" && typeof v !== "function") return false;
|
|
208
|
+
if (v === null) return false;
|
|
209
|
+
try {
|
|
210
|
+
return v[TX_EXPR] !== void 0;
|
|
211
|
+
} catch {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
__name(isColumnExpr, "isColumnExpr");
|
|
195
216
|
|
|
196
217
|
// src/db/tx-plan.ts
|
|
197
218
|
var TxRefError = class extends Error {
|
|
@@ -349,6 +370,11 @@ function encodeValue(value, column, allowColumnExpr) {
|
|
|
349
370
|
field: ref.field
|
|
350
371
|
}
|
|
351
372
|
}, "ref");
|
|
373
|
+
if (isNowExpr(value)) return {
|
|
374
|
+
$expr: {
|
|
375
|
+
fn: "now"
|
|
376
|
+
}
|
|
377
|
+
};
|
|
352
378
|
const expr = exprOf(value);
|
|
353
379
|
if (expr) {
|
|
354
380
|
if (expr.fn !== "now" && !allowColumnExpr) {
|