@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.
Files changed (48) hide show
  1. package/dist/bin/palbase-backend.cjs +32 -1
  2. package/dist/bin/palbase-backend.cjs.map +1 -1
  3. package/dist/bin/palbase-backend.js +4 -4
  4. package/dist/{chunk-I3C4PFIW.js → chunk-BQN723PL.js} +3 -3
  5. package/dist/{chunk-OO7R25AI.js → chunk-EB3TUX5J.js} +20 -5
  6. package/dist/chunk-EB3TUX5J.js.map +1 -0
  7. package/dist/{chunk-GYK6QYS4.js → chunk-JVZQCC77.js} +21 -1
  8. package/dist/chunk-JVZQCC77.js.map +1 -0
  9. package/dist/{chunk-DRZFQRJI.js → chunk-OZKSM3JW.js} +2 -2
  10. package/dist/chunk-OZKSM3JW.js.map +1 -0
  11. package/dist/{chunk-TS4U7NBD.js → chunk-XABHGMUT.js} +2 -2
  12. package/dist/db/index.cjs +26 -0
  13. package/dist/db/index.cjs.map +1 -1
  14. package/dist/db/index.d.cts +1 -1
  15. package/dist/db/index.d.ts +1 -1
  16. package/dist/db/index.js +3 -3
  17. package/dist/engine/index.cjs +32 -1
  18. package/dist/engine/index.cjs.map +1 -1
  19. package/dist/engine/index.d.cts +3 -3
  20. package/dist/engine/index.d.ts +3 -3
  21. package/dist/engine/index.js +4 -4
  22. package/dist/{index-NuzRCuxe.d.ts → index-CAKOgAlP.d.ts} +2 -2
  23. package/dist/{index-Bve7BBTL.d.cts → index-CgE4sVhg.d.cts} +32 -12
  24. package/dist/{index-VtToZmUm.d.cts → index-H-0qv5d4.d.cts} +2 -2
  25. package/dist/{index-BrvvxSpn.d.ts → index-V7QRh1wg.d.ts} +32 -12
  26. package/dist/index.cjs +26 -0
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +6 -6
  29. package/dist/index.d.ts +6 -6
  30. package/dist/index.js +4 -4
  31. package/dist/openapi/index.d.cts +2 -2
  32. package/dist/openapi/index.d.ts +2 -2
  33. package/dist/{registry-B0eyOF9x.d.ts → registry-4EI8aaFs.d.ts} +1 -1
  34. package/dist/{registry-Bk9_rbNd.d.cts → registry-DHsPDY0_.d.cts} +1 -1
  35. package/dist/test/index.cjs +27 -0
  36. package/dist/test/index.cjs.map +1 -1
  37. package/dist/test/index.d.cts +1 -1
  38. package/dist/test/index.d.ts +1 -1
  39. package/dist/test/index.js +19 -1
  40. package/dist/test/index.js.map +1 -1
  41. package/docs/database.md +35 -1
  42. package/docs/llms-full.txt +35 -1
  43. package/package.json +1 -1
  44. package/dist/chunk-DRZFQRJI.js.map +0 -1
  45. package/dist/chunk-GYK6QYS4.js.map +0 -1
  46. package/dist/chunk-OO7R25AI.js.map +0 -1
  47. /package/dist/{chunk-I3C4PFIW.js.map → chunk-BQN723PL.js.map} +0 -0
  48. /package/dist/{chunk-TS4U7NBD.js.map → chunk-XABHGMUT.js.map} +0 -0
@@ -1,8 +1,8 @@
1
- import '../index-Bve7BBTL.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-VtToZmUm.cjs';
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-Bk9_rbNd.cjs';
8
+ import '../registry-DHsPDY0_.cjs';
@@ -1,8 +1,8 @@
1
- import '../index-BrvvxSpn.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-NuzRCuxe.js';
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-B0eyOF9x.js';
8
+ import '../registry-4EI8aaFs.js';
@@ -16,10 +16,10 @@ import {
16
16
  quoteIdent,
17
17
  scrubSecrets,
18
18
  withTables
19
- } from "../chunk-OO7R25AI.js";
20
- import "../chunk-I3C4PFIW.js";
21
- import "../chunk-DRZFQRJI.js";
22
- import "../chunk-GYK6QYS4.js";
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-BrvvxSpn.js';
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-B0eyOF9x.js';
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-Bve7BBTL.cjs';
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-Bk9_rbNd.cjs';
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) {