clivly 0.9.5 → 0.9.7

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 (78) hide show
  1. package/README.md +22 -3
  2. package/core-auth-adapter.cjs +1 -1
  3. package/core-auth-adapter.mjs +1 -1
  4. package/core-drizzle.cjs +1 -1
  5. package/core-drizzle.d.cts +1 -1
  6. package/core-drizzle.d.mts +1 -1
  7. package/core-drizzle.mjs +1 -1
  8. package/core-entity-config.cjs +1 -1
  9. package/core-entity-config.mjs +1 -1
  10. package/core-mapping-form.cjs +1 -1
  11. package/core-mapping-form.mjs +1 -1
  12. package/core-mappings-config.cjs +1 -1
  13. package/core-mappings-config.mjs +1 -1
  14. package/core-sync-engine.cjs +1 -1
  15. package/core-sync-engine.mjs +1 -1
  16. package/core-view-compiler.cjs +1 -1
  17. package/core-view-compiler.mjs +1 -1
  18. package/core.cjs +14 -9
  19. package/core.d.cts +2 -2
  20. package/core.d.mts +2 -2
  21. package/core.mjs +9 -9
  22. package/{drizzle-CiK8MMEZ.d.mts → drizzle-BmDDgAIF.d.mts} +3 -1
  23. package/{drizzle-bfjVzYR6.cjs → drizzle-DcB7OfBp.cjs} +9 -1
  24. package/{drizzle-DEtRrqtc.d.cts → drizzle-ixVV4pPN.d.cts} +3 -1
  25. package/{drizzle-3kvhkwO7.mjs → drizzle-wbcuG-cy.mjs} +9 -1
  26. package/drizzle.cjs +61 -10
  27. package/drizzle.d.cts +9 -3
  28. package/drizzle.d.mts +9 -3
  29. package/drizzle.mjs +61 -10
  30. package/{entity-config-B74SPOUZ.mjs → entity-config-C8IIkrmX.mjs} +34 -5
  31. package/{entity-config-7sGCk_nw.cjs → entity-config-CPM-Tp-d.cjs} +34 -5
  32. package/index.cjs +41 -9
  33. package/index.mjs +41 -9
  34. package/internal-BLKMnIIZ.cjs +259 -0
  35. package/internal-BpVh_J77.mjs +212 -0
  36. package/{internal-o2M7FGlR.d.mts → internal-CvlFk3KC.d.mts} +82 -2
  37. package/{internal-wCXSELDN.d.cts → internal-DGUOLQAq.d.cts} +82 -2
  38. package/internal-drizzle.cjs +1 -1
  39. package/internal-drizzle.d.cts +1 -1
  40. package/internal-drizzle.d.mts +1 -1
  41. package/internal-drizzle.mjs +1 -1
  42. package/internal-entity-config.cjs +1 -1
  43. package/internal-entity-config.mjs +1 -1
  44. package/internal-entity-heuristics.cjs +1 -1
  45. package/internal-entity-heuristics.mjs +1 -1
  46. package/internal-mappings-config.cjs +1 -1
  47. package/internal-mappings-config.mjs +1 -1
  48. package/internal-sync-engine.cjs +1 -1
  49. package/internal-sync-engine.mjs +1 -1
  50. package/internal-view-compiler.cjs +1 -1
  51. package/internal-view-compiler.mjs +1 -1
  52. package/internal.cjs +13 -7
  53. package/internal.d.cts +2 -2
  54. package/internal.d.mts +2 -2
  55. package/internal.mjs +8 -8
  56. package/{mappings-config-CLyEg0sf.cjs → mappings-config-CBwL3FVh.cjs} +1 -1
  57. package/{mappings-config-DQS_s4dg.mjs → mappings-config-DUKBe6OS.mjs} +1 -1
  58. package/{namespace-probe-Cn7voAd0.d.mts → namespace-probe-BQ4imnV7.d.mts} +85 -2
  59. package/{namespace-probe-BoGI18dQ.d.cts → namespace-probe-DZIGdvlm.d.cts} +85 -2
  60. package/package.json +1 -1
  61. package/{projection-Dz6_i1-w.cjs → projection-DEwL-D8R.cjs} +6 -0
  62. package/{projection-CSGJbZlZ.mjs → projection-hnPSgH6G.mjs} +1 -1
  63. package/{projection-sql-BgnfiGqF.mjs → projection-sql-9zzTVGvf.mjs} +34 -2
  64. package/{projection-sql-Cl1qIn8m.cjs → projection-sql-iHy-Cx6V.cjs} +45 -1
  65. package/{sdk-CM1UO-I7.cjs → sdk-BL9BCzyD.cjs} +354 -20
  66. package/{sdk-DYBDR939.mjs → sdk-CubnsyD9.mjs} +354 -20
  67. package/sdk.cjs +2 -2
  68. package/sdk.d.cts +2 -2
  69. package/sdk.d.mts +2 -2
  70. package/sdk.mjs +2 -2
  71. package/{sync-engine-C4A5jgA4.cjs → sync-engine-BLgwLpR6.cjs} +1 -1
  72. package/{sync-engine-Dt5QQSKO.mjs → sync-engine-B_IzoUSx.mjs} +1 -1
  73. package/{view-compiler-B5nDal14.cjs → view-compiler-BHI5E4QI.cjs} +2 -2
  74. package/{view-compiler-CSYwEWf5.mjs → view-compiler-D_6gfXFr.mjs} +2 -2
  75. package/vite.d.cts +1 -1
  76. package/vite.d.mts +1 -1
  77. package/internal-CykXpEGk.mjs +0 -68
  78. package/internal-DqduZU3l.cjs +0 -97
package/README.md CHANGED
@@ -92,6 +92,12 @@ empty, for you or `clivly login` to fill; the trigger URL gets a visible
92
92
  `https://<yourDomain.com>/api/clivly/tick` template, because there the shape is
93
93
  the documentation.
94
94
 
95
+ From `0.9.7` the scaffolded config also sets `introspector:
96
+ drizzleIntrospector(db)`. Clivly never connects to your database, so that handle
97
+ is what lets your app run a **derived object** authored in Clivly's dashboard —
98
+ scaffolding it by default is what makes such an object sync with no further code
99
+ on your side. It costs nothing if you never author one.
100
+
95
101
  | Flag | Purpose |
96
102
  | --- | --- |
97
103
  | `--dry-run` | Show what would be written; write nothing |
@@ -268,7 +274,7 @@ It answers two questions under two headings:
268
274
  scope; `clivly doctor` is local by definition and omits it.
269
275
  - **This project** — the local ladder, run here on your machine: credential →
270
276
  Clivly reachable → `clivly.config` loads → `clivly.config` is edge-safe →
271
- boot hook wired → setup checks → sync trigger URL.
277
+ boot hook wired → setup checks → dashboard-authored objects → sync trigger URL.
272
278
 
273
279
  ```text
274
280
  Clivly status
@@ -281,11 +287,17 @@ Workspace
281
287
  🔒 Let Clivly start a sync
282
288
 
283
289
  This project
284
- ✅ Step 1 of 7 · API key present
285
- ✅ Step 2 of 7 · Clivly reachable — Acme
290
+ ✅ Step 1 of 8 · API key present
291
+ ✅ Step 2 of 8 · Clivly reachable — Acme
286
292
  ...
287
293
  ```
288
294
 
295
+ **Dashboard-authored objects** is new in `0.9.7`. It reports how many derived
296
+ objects authored in Clivly ran on the last sync and how many were quarantined —
297
+ and, when your config has no `introspector`, warns that such objects cannot run
298
+ at all here and names the one line to add. An app whose installed `clivly`
299
+ predates the feature reports nothing rather than a failure.
300
+
289
301
  **Boot hook wired** is the rung to know about. It finds the boot site for your
290
302
  framework and confirms something there actually starts Clivly — and on Next.js
291
303
  below 15, that `experimental.instrumentationHook` is set in `next.config`,
@@ -298,6 +310,13 @@ above it fails to load. A framework the CLI does not recognise shows it as
298
310
  skipped rather than passed — there is nowhere known to look, and a green step
299
311
  for an unasked question is what made this worth adding.
300
312
 
313
+ **Sync trigger URL** distinguishes three states, which it previously could not:
314
+ a real URL passes, no URL at all warns, and the
315
+ `https://<yourDomain.com>/api/clivly/tick` template that `clivly login` writes
316
+ into `.env` reports as *still the scaffolded placeholder* — a value that is
317
+ present but cannot resolve. Reading that as "not set" sent people hunting for a
318
+ missing variable sitting in their own `.env`.
319
+
301
320
  If the Workspace section reads
302
321
  `⚠️ This Clivly server does not report setup progress`, or names a rejected key
303
322
  or an unreachable host, that means the question could not be asked — not that
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
3
2
  const require_auth_adapter = require("./auth-adapter-CiEXcweZ.cjs");
3
+ const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
4
4
  require("./internal-auth-adapter.cjs");
5
5
  //#region src/core-auth-adapter.ts
6
6
  require_deprecate_subpath.warnDeprecatedSubpath("clivly/core/auth-adapter", "clivly/internal/auth-adapter");
@@ -1,5 +1,5 @@
1
- import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
2
1
  import { t as authCustom } from "./auth-adapter-gfVDxf3d.mjs";
2
+ import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
3
3
  import "./internal-auth-adapter.mjs";
4
4
  //#region src/core-auth-adapter.ts
5
5
  warnDeprecatedSubpath("clivly/core/auth-adapter", "clivly/internal/auth-adapter");
package/core-drizzle.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
3
- const require_drizzle = require("./drizzle-bfjVzYR6.cjs");
3
+ const require_drizzle = require("./drizzle-DcB7OfBp.cjs");
4
4
  require("./internal-drizzle.cjs");
5
5
  //#region src/core-drizzle.ts
6
6
  require_deprecate_subpath.warnDeprecatedSubpath("clivly/core/drizzle", "clivly/internal/drizzle");
@@ -1,3 +1,3 @@
1
- import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-DEtRrqtc.cjs";
1
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-ixVV4pPN.cjs";
2
2
  import "./internal-drizzle.cjs";
3
3
  export { buildColumnsMeta, buildUniqueConstraints, discoverFromDrizzle };
@@ -1,3 +1,3 @@
1
- import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-CiK8MMEZ.mjs";
1
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-BmDDgAIF.mjs";
2
2
  import "./internal-drizzle.mjs";
3
3
  export { buildColumnsMeta, buildUniqueConstraints, discoverFromDrizzle };
package/core-drizzle.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
2
- import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-3kvhkwO7.mjs";
2
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle, t as buildColumnsMeta } from "./drizzle-wbcuG-cy.mjs";
3
3
  import "./internal-drizzle.mjs";
4
4
  //#region src/core-drizzle.ts
5
5
  warnDeprecatedSubpath("clivly/core/drizzle", "clivly/internal/drizzle");
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_entity_config = require("./entity-config-7sGCk_nw.cjs");
2
+ const require_entity_config = require("./entity-config-CPM-Tp-d.cjs");
3
3
  //#region src/core-entity-config.ts
4
4
  require("./deprecate-subpath-B9ngvizt.cjs").warnDeprecatedSubpath("clivly/core/entity-config", "clivly/internal/entity-config");
5
5
  //#endregion
@@ -1,4 +1,4 @@
1
- import { a as MATERIALIZING_CONCEPTS, c as entitiesConfigSchema, d as relationshipSchema, f as relationshipsSchema, i as ClivlyConfigError, l as filterSchema, n as CRM_CONCEPTS, o as customObjectDeclarations, p as validateEntitiesConfig, r as CUSTOM_CONCEPT, s as defineClivlyConfig, t as CANONICAL_FIELDS, u as projectionFields } from "./entity-config-B74SPOUZ.mjs";
1
+ import { a as MATERIALIZING_CONCEPTS, c as entitiesConfigSchema, d as relationshipSchema, f as relationshipsSchema, i as ClivlyConfigError, l as filterSchema, n as CRM_CONCEPTS, o as customObjectDeclarations, p as validateEntitiesConfig, r as CUSTOM_CONCEPT, s as defineClivlyConfig, t as CANONICAL_FIELDS, u as projectionFields } from "./entity-config-C8IIkrmX.mjs";
2
2
  import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
3
3
  //#region src/core-entity-config.ts
4
4
  warnDeprecatedSubpath("clivly/core/entity-config", "clivly/internal/entity-config");
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
3
2
  const require_mapping_form = require("./mapping-form-BpfON_ME.cjs");
3
+ const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
4
4
  require("./internal-mapping-form.cjs");
5
5
  //#region src/core-mapping-form.ts
6
6
  require_deprecate_subpath.warnDeprecatedSubpath("clivly/core/mapping-form", "clivly/internal/mapping-form");
@@ -1,5 +1,5 @@
1
- import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
2
1
  import { n as buildRelationships, r as relationshipViaSignature, t as buildFilterFromDiscriminator } from "./mapping-form-DigkuvFc.mjs";
2
+ import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
3
3
  import "./internal-mapping-form.mjs";
4
4
  //#region src/core-mapping-form.ts
5
5
  warnDeprecatedSubpath("clivly/core/mapping-form", "clivly/internal/mapping-form");
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_mappings_config = require("./mappings-config-CLyEg0sf.cjs");
2
+ const require_mappings_config = require("./mappings-config-CBwL3FVh.cjs");
3
3
  const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
4
4
  require("./internal-mappings-config.cjs");
5
5
  //#region src/core-mappings-config.ts
@@ -1,4 +1,4 @@
1
- import { n as mappingsToEntitiesConfig, t as entitiesToMappings } from "./mappings-config-DQS_s4dg.mjs";
1
+ import { n as mappingsToEntitiesConfig, t as entitiesToMappings } from "./mappings-config-DUKBe6OS.mjs";
2
2
  import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
3
3
  import "./internal-mappings-config.mjs";
4
4
  //#region src/core-mappings-config.ts
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_sync_engine = require("./sync-engine-BLgwLpR6.cjs");
2
3
  const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
3
- const require_sync_engine = require("./sync-engine-C4A5jgA4.cjs");
4
4
  require("./internal-sync-engine.cjs");
5
5
  //#region src/core-sync-engine.ts
6
6
  require_deprecate_subpath.warnDeprecatedSubpath("clivly/core/sync-engine", "clivly/internal/sync-engine");
@@ -1,5 +1,5 @@
1
+ import { i as runSync, n as previewSync, r as reconcile, t as computeSampleWarnings } from "./sync-engine-B_IzoUSx.mjs";
1
2
  import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
2
- import { i as runSync, n as previewSync, r as reconcile, t as computeSampleWarnings } from "./sync-engine-Dt5QQSKO.mjs";
3
3
  import "./internal-sync-engine.mjs";
4
4
  //#region src/core-sync-engine.ts
5
5
  warnDeprecatedSubpath("clivly/core/sync-engine", "clivly/internal/sync-engine");
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_view_compiler = require("./view-compiler-BHI5E4QI.cjs");
2
3
  const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
3
- const require_view_compiler = require("./view-compiler-B5nDal14.cjs");
4
4
  require("./internal-view-compiler.cjs");
5
5
  //#region src/core-view-compiler.ts
6
6
  require_deprecate_subpath.warnDeprecatedSubpath("clivly/core/view-compiler", "clivly/internal/view-compiler");
@@ -1,5 +1,5 @@
1
+ import { a as explainViewExecutionError, i as explainEntitiesConfig, n as compileEntityView, r as compileEntityViews, t as DEFAULT_VIEW_PREFIX } from "./view-compiler-D_6gfXFr.mjs";
1
2
  import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
2
- import { a as explainViewExecutionError, i as explainEntitiesConfig, n as compileEntityView, r as compileEntityViews, t as DEFAULT_VIEW_PREFIX } from "./view-compiler-CSYwEWf5.mjs";
3
3
  import "./internal-view-compiler.mjs";
4
4
  //#region src/core-view-compiler.ts
5
5
  warnDeprecatedSubpath("clivly/core/view-compiler", "clivly/internal/view-compiler");
package/core.cjs CHANGED
@@ -1,16 +1,15 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_projection = require("./projection-Dz6_i1-w.cjs");
3
- const require_entity_config = require("./entity-config-7sGCk_nw.cjs");
4
- const require_mappings_config = require("./mappings-config-CLyEg0sf.cjs");
5
- const require_deprecate_subpath = require("./deprecate-subpath-B9ngvizt.cjs");
2
+ const require_projection = require("./projection-DEwL-D8R.cjs");
3
+ const require_entity_config = require("./entity-config-CPM-Tp-d.cjs");
4
+ const require_mappings_config = require("./mappings-config-CBwL3FVh.cjs");
6
5
  const require_auth_adapter = require("./auth-adapter-CiEXcweZ.cjs");
7
6
  const require_mapping_form = require("./mapping-form-BpfON_ME.cjs");
8
- const require_internal = require("./internal-DqduZU3l.cjs");
9
- const require_projection_sql = require("./projection-sql-Cl1qIn8m.cjs");
10
- const require_view_compiler = require("./view-compiler-B5nDal14.cjs");
11
- const require_sync_engine = require("./sync-engine-C4A5jgA4.cjs");
7
+ const require_internal = require("./internal-BLKMnIIZ.cjs");
8
+ const require_projection_sql = require("./projection-sql-iHy-Cx6V.cjs");
9
+ const require_view_compiler = require("./view-compiler-BHI5E4QI.cjs");
10
+ const require_sync_engine = require("./sync-engine-BLgwLpR6.cjs");
12
11
  //#region src/core.ts
13
- require_deprecate_subpath.warnDeprecatedSubpath("clivly/core", "clivly/sdk", "Import \"defineClivlyConfig\" and its config types from \"clivly/sdk\"; import everything else from \"clivly/internal\" (no stability guarantee — see STABILITY.md).");
12
+ require("./deprecate-subpath-B9ngvizt.cjs").warnDeprecatedSubpath("clivly/core", "clivly/sdk", "Import \"defineClivlyConfig\" and its config types from \"clivly/sdk\"; import everything else from \"clivly/internal\" (no stability guarantee — see STABILITY.md).");
14
13
  //#endregion
15
14
  exports.BASE_REF = require_projection.BASE_REF;
16
15
  exports.CANONICAL_FIELDS = require_entity_config.CANONICAL_FIELDS;
@@ -18,6 +17,8 @@ exports.CRM_CONCEPTS = require_entity_config.CRM_CONCEPTS;
18
17
  exports.ClivlyConfigError = require_entity_config.ClivlyConfigError;
19
18
  exports.DEFAULT_VIEW_PREFIX = require_view_compiler.DEFAULT_VIEW_PREFIX;
20
19
  exports.MATERIALIZING_CONCEPTS = require_entity_config.MATERIALIZING_CONCEPTS;
20
+ exports.PREVIEW_MAX_ROWS = require_projection_sql.PREVIEW_MAX_ROWS;
21
+ exports.addDraftJoin = require_internal.addDraftJoin;
21
22
  exports.authCustom = require_auth_adapter.authCustom;
22
23
  exports.buildFilterFromDiscriminator = require_mapping_form.buildFilterFromDiscriminator;
23
24
  exports.buildRelationships = require_mapping_form.buildRelationships;
@@ -27,10 +28,13 @@ exports.compileEntityViews = require_view_compiler.compileEntityViews;
27
28
  exports.compileProjectionFrom = require_projection_sql.compileProjectionFrom;
28
29
  exports.compileProjectionIdentity = require_projection_sql.compileProjectionIdentity;
29
30
  exports.compileProjectionJoins = require_projection_sql.compileProjectionJoins;
31
+ exports.compileProjectionPreview = require_projection_sql.compileProjectionPreview;
32
+ exports.compileProjectionSelect = require_projection_sql.compileProjectionSelect;
30
33
  exports.coversUniqueKey = require_entity_config.coversUniqueKey;
31
34
  exports.defineClivlyConfig = require_entity_config.defineClivlyConfig;
32
35
  exports.describeCardinality = require_internal.describeCardinality;
33
36
  exports.draftErrors = require_internal.draftErrors;
37
+ exports.draftRefOptions = require_internal.draftRefOptions;
34
38
  exports.draftToProjection = require_internal.draftToProjection;
35
39
  exports.emptyProjectionDraft = require_internal.emptyProjectionDraft;
36
40
  exports.entitiesConfigSchema = require_entity_config.entitiesConfigSchema;
@@ -48,6 +52,7 @@ exports.reconcile = require_sync_engine.reconcile;
48
52
  exports.relationshipSchema = require_entity_config.relationshipSchema;
49
53
  exports.relationshipViaSignature = require_mapping_form.relationshipViaSignature;
50
54
  exports.relationshipsSchema = require_entity_config.relationshipsSchema;
55
+ exports.removeDraftJoin = require_internal.removeDraftJoin;
51
56
  exports.runSync = require_sync_engine.runSync;
52
57
  exports.suggestJoinConditions = require_internal.suggestJoinConditions;
53
58
  exports.validateEntitiesConfig = require_entity_config.validateEntitiesConfig;
package/core.d.cts CHANGED
@@ -7,5 +7,5 @@ import { i as mappingsToEntitiesConfig, t as EntityMappingRow } from "./mappings
7
7
  import { a as compileEntityView, i as ExplainResult, n as CompiledView, o as compileEntityViews, r as DEFAULT_VIEW_PREFIX, s as explainEntitiesConfig, t as CompileOptions } from "./view-compiler-CmEdAMwj.cjs";
8
8
  import { c as SyncResult, f as reconcile, l as SyncStore, n as MirrorRecord, o as SourceRow, p as runSync, r as PersistAction, s as SyncAction, t as EntitySyncResult } from "./sync-engine-BG2O1an2.cjs";
9
9
  import { a as IntegrationStep, c as StepProblem, i as IntegrationStatus, l as StepState, n as IntegrationFacts, o as NextAction, r as IntegrationState, s as StepId, t as ConnectionLiveness } from "./integration-state-BK-riZnm.cjs";
10
- import { _ as joinFansOut, a as validateProjection, c as compileProjectionJoins, d as describeCardinality, f as draftErrors, g as fanOutJoins, h as suggestJoinConditions, i as primaryKeyColumns, l as quoteIdent, m as emptyProjectionDraft, n as coversUniqueKey, o as compileProjectionFrom, p as draftToProjection, r as hasRichMeta, s as compileProjectionIdentity, t as columnMetaFor, u as ProjectionDraft } from "./internal-wCXSELDN.cjs";
11
- export { type Activity, type ActivityType, BASE_REF, CANONICAL_FIELDS, type CRMAdapter, CRM_CONCEPTS, type ClivlyAuthAdapter, ClivlyConfigError, type ClivlyEntitiesConfig, type ClivlyEntityConfig, type ClivlyUser, type Company, type CompileOptions, type CompiledView, type ConfigValidationError, type ConfigValidationResult, type ConnectionLiveness, type Contact, type ContactFilters, type ContactStatus, type CreateActivityInput, type CreateCompanyInput, type CreateContactInput, type CreateDealInput, type CreateTaskInput, type CrmConcept, type CrmMembership, type CrmRole, DEFAULT_VIEW_PREFIX, type Deal, type DealStage, type DiscoveredColumnMeta, type DiscoveredSchemaTable, type EntityMappingRow, type EntitySyncResult, type ExplainResult, type FilterExpr, type FilterValue, type IntegrationFacts, type IntegrationState, type IntegrationStatus, type IntegrationStep, MATERIALIZING_CONCEPTS, type MaterializingConcept, type MembershipResolver, type MirrorRecord, type NextAction, type Note, type PersistAction, type ProjectionDraft, type ProjectionFieldBinding, type ProjectionIdentity, type ProjectionJoin, type ProjectionMapping, type ProjectionRef, type RecordSource, type RelationshipCandidate, type RelationshipSpec, type RelationshipVia, type RelationshipsMap, type SourceRow, type StepId, type StepProblem, type StepState, type SyncAction, type SyncResult, type SyncStore, type Task, type TaskEntityType, type TaskFilters, type TaskPriority, type TaskStatus, type UpdateContactInput, type UpdateDealInput, type UpdateTaskInput, authCustom, buildFilterFromDiscriminator, buildRelationships, columnMetaFor, compileEntityView, compileEntityViews, compileProjectionFrom, compileProjectionIdentity, compileProjectionJoins, coversUniqueKey, defineClivlyConfig, describeCardinality, draftErrors, draftToProjection, emptyProjectionDraft, entitiesConfigSchema, explainEntitiesConfig, fanOutJoins, filterSchema, hasRichMeta, identityRefs, joinFansOut, mappingsToEntitiesConfig, primaryKeyColumns, projectionSchema, quoteIdent, reconcile, relationshipSchema, relationshipViaSignature, relationshipsSchema, runSync, suggestJoinConditions, validateEntitiesConfig, validateProjection };
10
+ import { C as fanOutJoins, S as suggestJoinConditions, _ as draftErrors, a as validateProjection, b as emptyProjectionDraft, c as compileProjectionIdentity, d as compileProjectionSelect, f as quoteIdent, g as describeCardinality, h as addDraftJoin, i as primaryKeyColumns, l as compileProjectionJoins, m as ProjectionDraft, n as coversUniqueKey, o as PREVIEW_MAX_ROWS, p as DraftRefOption, r as hasRichMeta, s as compileProjectionFrom, t as columnMetaFor, u as compileProjectionPreview, v as draftRefOptions, w as joinFansOut, x as removeDraftJoin, y as draftToProjection } from "./internal-DGUOLQAq.cjs";
11
+ export { type Activity, type ActivityType, BASE_REF, CANONICAL_FIELDS, type CRMAdapter, CRM_CONCEPTS, type ClivlyAuthAdapter, ClivlyConfigError, type ClivlyEntitiesConfig, type ClivlyEntityConfig, type ClivlyUser, type Company, type CompileOptions, type CompiledView, type ConfigValidationError, type ConfigValidationResult, type ConnectionLiveness, type Contact, type ContactFilters, type ContactStatus, type CreateActivityInput, type CreateCompanyInput, type CreateContactInput, type CreateDealInput, type CreateTaskInput, type CrmConcept, type CrmMembership, type CrmRole, DEFAULT_VIEW_PREFIX, type Deal, type DealStage, type DiscoveredColumnMeta, type DiscoveredSchemaTable, type DraftRefOption, type EntityMappingRow, type EntitySyncResult, type ExplainResult, type FilterExpr, type FilterValue, type IntegrationFacts, type IntegrationState, type IntegrationStatus, type IntegrationStep, MATERIALIZING_CONCEPTS, type MaterializingConcept, type MembershipResolver, type MirrorRecord, type NextAction, type Note, PREVIEW_MAX_ROWS, type PersistAction, type ProjectionDraft, type ProjectionFieldBinding, type ProjectionIdentity, type ProjectionJoin, type ProjectionMapping, type ProjectionRef, type RecordSource, type RelationshipCandidate, type RelationshipSpec, type RelationshipVia, type RelationshipsMap, type SourceRow, type StepId, type StepProblem, type StepState, type SyncAction, type SyncResult, type SyncStore, type Task, type TaskEntityType, type TaskFilters, type TaskPriority, type TaskStatus, type UpdateContactInput, type UpdateDealInput, type UpdateTaskInput, addDraftJoin, authCustom, buildFilterFromDiscriminator, buildRelationships, columnMetaFor, compileEntityView, compileEntityViews, compileProjectionFrom, compileProjectionIdentity, compileProjectionJoins, compileProjectionPreview, compileProjectionSelect, coversUniqueKey, defineClivlyConfig, describeCardinality, draftErrors, draftRefOptions, draftToProjection, emptyProjectionDraft, entitiesConfigSchema, explainEntitiesConfig, fanOutJoins, filterSchema, hasRichMeta, identityRefs, joinFansOut, mappingsToEntitiesConfig, primaryKeyColumns, projectionSchema, quoteIdent, reconcile, relationshipSchema, relationshipViaSignature, relationshipsSchema, removeDraftJoin, runSync, suggestJoinConditions, validateEntitiesConfig, validateProjection };
package/core.d.mts CHANGED
@@ -7,5 +7,5 @@ import { i as mappingsToEntitiesConfig, t as EntityMappingRow } from "./mappings
7
7
  import { a as compileEntityView, i as ExplainResult, n as CompiledView, o as compileEntityViews, r as DEFAULT_VIEW_PREFIX, s as explainEntitiesConfig, t as CompileOptions } from "./view-compiler-Bo7pqXW3.mjs";
8
8
  import { c as SyncResult, f as reconcile, l as SyncStore, n as MirrorRecord, o as SourceRow, p as runSync, r as PersistAction, s as SyncAction, t as EntitySyncResult } from "./sync-engine-DgQbrJON.mjs";
9
9
  import { a as IntegrationStep, c as StepProblem, i as IntegrationStatus, l as StepState, n as IntegrationFacts, o as NextAction, r as IntegrationState, s as StepId, t as ConnectionLiveness } from "./integration-state-BK-riZnm.mjs";
10
- import { _ as joinFansOut, a as validateProjection, c as compileProjectionJoins, d as describeCardinality, f as draftErrors, g as fanOutJoins, h as suggestJoinConditions, i as primaryKeyColumns, l as quoteIdent, m as emptyProjectionDraft, n as coversUniqueKey, o as compileProjectionFrom, p as draftToProjection, r as hasRichMeta, s as compileProjectionIdentity, t as columnMetaFor, u as ProjectionDraft } from "./internal-o2M7FGlR.mjs";
11
- export { type Activity, type ActivityType, BASE_REF, CANONICAL_FIELDS, type CRMAdapter, CRM_CONCEPTS, type ClivlyAuthAdapter, ClivlyConfigError, type ClivlyEntitiesConfig, type ClivlyEntityConfig, type ClivlyUser, type Company, type CompileOptions, type CompiledView, type ConfigValidationError, type ConfigValidationResult, type ConnectionLiveness, type Contact, type ContactFilters, type ContactStatus, type CreateActivityInput, type CreateCompanyInput, type CreateContactInput, type CreateDealInput, type CreateTaskInput, type CrmConcept, type CrmMembership, type CrmRole, DEFAULT_VIEW_PREFIX, type Deal, type DealStage, type DiscoveredColumnMeta, type DiscoveredSchemaTable, type EntityMappingRow, type EntitySyncResult, type ExplainResult, type FilterExpr, type FilterValue, type IntegrationFacts, type IntegrationState, type IntegrationStatus, type IntegrationStep, MATERIALIZING_CONCEPTS, type MaterializingConcept, type MembershipResolver, type MirrorRecord, type NextAction, type Note, type PersistAction, type ProjectionDraft, type ProjectionFieldBinding, type ProjectionIdentity, type ProjectionJoin, type ProjectionMapping, type ProjectionRef, type RecordSource, type RelationshipCandidate, type RelationshipSpec, type RelationshipVia, type RelationshipsMap, type SourceRow, type StepId, type StepProblem, type StepState, type SyncAction, type SyncResult, type SyncStore, type Task, type TaskEntityType, type TaskFilters, type TaskPriority, type TaskStatus, type UpdateContactInput, type UpdateDealInput, type UpdateTaskInput, authCustom, buildFilterFromDiscriminator, buildRelationships, columnMetaFor, compileEntityView, compileEntityViews, compileProjectionFrom, compileProjectionIdentity, compileProjectionJoins, coversUniqueKey, defineClivlyConfig, describeCardinality, draftErrors, draftToProjection, emptyProjectionDraft, entitiesConfigSchema, explainEntitiesConfig, fanOutJoins, filterSchema, hasRichMeta, identityRefs, joinFansOut, mappingsToEntitiesConfig, primaryKeyColumns, projectionSchema, quoteIdent, reconcile, relationshipSchema, relationshipViaSignature, relationshipsSchema, runSync, suggestJoinConditions, validateEntitiesConfig, validateProjection };
10
+ import { C as fanOutJoins, S as suggestJoinConditions, _ as draftErrors, a as validateProjection, b as emptyProjectionDraft, c as compileProjectionIdentity, d as compileProjectionSelect, f as quoteIdent, g as describeCardinality, h as addDraftJoin, i as primaryKeyColumns, l as compileProjectionJoins, m as ProjectionDraft, n as coversUniqueKey, o as PREVIEW_MAX_ROWS, p as DraftRefOption, r as hasRichMeta, s as compileProjectionFrom, t as columnMetaFor, u as compileProjectionPreview, v as draftRefOptions, w as joinFansOut, x as removeDraftJoin, y as draftToProjection } from "./internal-CvlFk3KC.mjs";
11
+ export { type Activity, type ActivityType, BASE_REF, CANONICAL_FIELDS, type CRMAdapter, CRM_CONCEPTS, type ClivlyAuthAdapter, ClivlyConfigError, type ClivlyEntitiesConfig, type ClivlyEntityConfig, type ClivlyUser, type Company, type CompileOptions, type CompiledView, type ConfigValidationError, type ConfigValidationResult, type ConnectionLiveness, type Contact, type ContactFilters, type ContactStatus, type CreateActivityInput, type CreateCompanyInput, type CreateContactInput, type CreateDealInput, type CreateTaskInput, type CrmConcept, type CrmMembership, type CrmRole, DEFAULT_VIEW_PREFIX, type Deal, type DealStage, type DiscoveredColumnMeta, type DiscoveredSchemaTable, type DraftRefOption, type EntityMappingRow, type EntitySyncResult, type ExplainResult, type FilterExpr, type FilterValue, type IntegrationFacts, type IntegrationState, type IntegrationStatus, type IntegrationStep, MATERIALIZING_CONCEPTS, type MaterializingConcept, type MembershipResolver, type MirrorRecord, type NextAction, type Note, PREVIEW_MAX_ROWS, type PersistAction, type ProjectionDraft, type ProjectionFieldBinding, type ProjectionIdentity, type ProjectionJoin, type ProjectionMapping, type ProjectionRef, type RecordSource, type RelationshipCandidate, type RelationshipSpec, type RelationshipVia, type RelationshipsMap, type SourceRow, type StepId, type StepProblem, type StepState, type SyncAction, type SyncResult, type SyncStore, type Task, type TaskEntityType, type TaskFilters, type TaskPriority, type TaskStatus, type UpdateContactInput, type UpdateDealInput, type UpdateTaskInput, addDraftJoin, authCustom, buildFilterFromDiscriminator, buildRelationships, columnMetaFor, compileEntityView, compileEntityViews, compileProjectionFrom, compileProjectionIdentity, compileProjectionJoins, compileProjectionPreview, compileProjectionSelect, coversUniqueKey, defineClivlyConfig, describeCardinality, draftErrors, draftRefOptions, draftToProjection, emptyProjectionDraft, entitiesConfigSchema, explainEntitiesConfig, fanOutJoins, filterSchema, hasRichMeta, identityRefs, joinFansOut, mappingsToEntitiesConfig, primaryKeyColumns, projectionSchema, quoteIdent, reconcile, relationshipSchema, relationshipViaSignature, relationshipsSchema, removeDraftJoin, runSync, suggestJoinConditions, validateEntitiesConfig, validateProjection };
package/core.mjs CHANGED
@@ -1,14 +1,14 @@
1
- import { i as projectionSchema, r as identityRefs, t as BASE_REF } from "./projection-CSGJbZlZ.mjs";
2
- import { _ as columnMetaFor, a as MATERIALIZING_CONCEPTS, b as primaryKeyColumns, c as entitiesConfigSchema, d as relationshipSchema, f as relationshipsSchema, g as joinFansOut, h as fanOutJoins, i as ClivlyConfigError, l as filterSchema, m as validateProjection, n as CRM_CONCEPTS, p as validateEntitiesConfig, s as defineClivlyConfig, t as CANONICAL_FIELDS, v as coversUniqueKey, y as hasRichMeta } from "./entity-config-B74SPOUZ.mjs";
3
- import { n as mappingsToEntitiesConfig } from "./mappings-config-DQS_s4dg.mjs";
4
- import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
1
+ import { a as projectionSchema, i as identityRefs, t as BASE_REF } from "./projection-hnPSgH6G.mjs";
2
+ import { _ as columnMetaFor, a as MATERIALIZING_CONCEPTS, b as primaryKeyColumns, c as entitiesConfigSchema, d as relationshipSchema, f as relationshipsSchema, g as joinFansOut, h as fanOutJoins, i as ClivlyConfigError, l as filterSchema, m as validateProjection, n as CRM_CONCEPTS, p as validateEntitiesConfig, s as defineClivlyConfig, t as CANONICAL_FIELDS, v as coversUniqueKey, y as hasRichMeta } from "./entity-config-C8IIkrmX.mjs";
3
+ import { n as mappingsToEntitiesConfig } from "./mappings-config-DUKBe6OS.mjs";
5
4
  import { t as authCustom } from "./auth-adapter-gfVDxf3d.mjs";
6
5
  import { n as buildRelationships, r as relationshipViaSignature, t as buildFilterFromDiscriminator } from "./mapping-form-DigkuvFc.mjs";
7
- import { a as suggestJoinConditions, i as emptyProjectionDraft, n as draftErrors, r as draftToProjection, t as describeCardinality } from "./internal-CykXpEGk.mjs";
8
- import { a as quoteIdent, n as compileProjectionIdentity, r as compileProjectionJoins, t as compileProjectionFrom } from "./projection-sql-BgnfiGqF.mjs";
9
- import { i as explainEntitiesConfig, n as compileEntityView, r as compileEntityViews, t as DEFAULT_VIEW_PREFIX } from "./view-compiler-CSYwEWf5.mjs";
10
- import { i as runSync, r as reconcile } from "./sync-engine-Dt5QQSKO.mjs";
6
+ import { a as draftToProjection, c as suggestJoinConditions, i as draftRefOptions, n as describeCardinality, o as emptyProjectionDraft, r as draftErrors, s as removeDraftJoin, t as addDraftJoin } from "./internal-BpVh_J77.mjs";
7
+ import { a as compileProjectionPreview, i as compileProjectionJoins, n as compileProjectionFrom, o as compileProjectionSelect, r as compileProjectionIdentity, s as quoteIdent, t as PREVIEW_MAX_ROWS } from "./projection-sql-9zzTVGvf.mjs";
8
+ import { i as explainEntitiesConfig, n as compileEntityView, r as compileEntityViews, t as DEFAULT_VIEW_PREFIX } from "./view-compiler-D_6gfXFr.mjs";
9
+ import { i as runSync, r as reconcile } from "./sync-engine-B_IzoUSx.mjs";
10
+ import { t as warnDeprecatedSubpath } from "./deprecate-subpath-CmvZtCpE.mjs";
11
11
  //#region src/core.ts
12
12
  warnDeprecatedSubpath("clivly/core", "clivly/sdk", "Import \"defineClivlyConfig\" and its config types from \"clivly/sdk\"; import everything else from \"clivly/internal\" (no stability guarantee — see STABILITY.md).");
13
13
  //#endregion
14
- export { BASE_REF, CANONICAL_FIELDS, CRM_CONCEPTS, ClivlyConfigError, DEFAULT_VIEW_PREFIX, MATERIALIZING_CONCEPTS, authCustom, buildFilterFromDiscriminator, buildRelationships, columnMetaFor, compileEntityView, compileEntityViews, compileProjectionFrom, compileProjectionIdentity, compileProjectionJoins, coversUniqueKey, defineClivlyConfig, describeCardinality, draftErrors, draftToProjection, emptyProjectionDraft, entitiesConfigSchema, explainEntitiesConfig, fanOutJoins, filterSchema, hasRichMeta, identityRefs, joinFansOut, mappingsToEntitiesConfig, primaryKeyColumns, projectionSchema, quoteIdent, reconcile, relationshipSchema, relationshipViaSignature, relationshipsSchema, runSync, suggestJoinConditions, validateEntitiesConfig, validateProjection };
14
+ export { BASE_REF, CANONICAL_FIELDS, CRM_CONCEPTS, ClivlyConfigError, DEFAULT_VIEW_PREFIX, MATERIALIZING_CONCEPTS, PREVIEW_MAX_ROWS, addDraftJoin, authCustom, buildFilterFromDiscriminator, buildRelationships, columnMetaFor, compileEntityView, compileEntityViews, compileProjectionFrom, compileProjectionIdentity, compileProjectionJoins, compileProjectionPreview, compileProjectionSelect, coversUniqueKey, defineClivlyConfig, describeCardinality, draftErrors, draftRefOptions, draftToProjection, emptyProjectionDraft, entitiesConfigSchema, explainEntitiesConfig, fanOutJoins, filterSchema, hasRichMeta, identityRefs, joinFansOut, mappingsToEntitiesConfig, primaryKeyColumns, projectionSchema, quoteIdent, reconcile, relationshipSchema, relationshipViaSignature, relationshipsSchema, removeDraftJoin, runSync, suggestJoinConditions, validateEntitiesConfig, validateProjection };
@@ -36,6 +36,8 @@ declare function buildColumnsMeta(table: Table): DiscoveredColumnMeta[];
36
36
  * when you import this entry (`@clivly/core/drizzle`); the rest of `@clivly/core`
37
37
  * stays dependency-free.
38
38
  */
39
- declare function discoverFromDrizzle(schema: Record<string, unknown>): DiscoveredSchemaTable[];
39
+ declare function discoverFromDrizzle(schema: Record<string, unknown>, options?: {
40
+ allowEmpty?: boolean;
41
+ }): DiscoveredSchemaTable[];
40
42
  //#endregion
41
43
  export { buildUniqueConstraints as n, discoverFromDrizzle as r, buildColumnsMeta as t };
@@ -91,7 +91,7 @@ function buildColumnsMeta(table) {
91
91
  * when you import this entry (`@clivly/core/drizzle`); the rest of `@clivly/core`
92
92
  * stays dependency-free.
93
93
  */
94
- function discoverFromDrizzle(schema) {
94
+ function discoverFromDrizzle(schema, options = {}) {
95
95
  const tables = [];
96
96
  for (const value of Object.values(schema)) {
97
97
  if (!(0, drizzle_orm.is)(value, drizzle_orm.Table)) continue;
@@ -104,8 +104,16 @@ function discoverFromDrizzle(schema) {
104
104
  ...uniqueConstraints === void 0 ? {} : { uniqueConstraints }
105
105
  });
106
106
  }
107
+ if (tables.length === 0 && !options.allowEmpty) throw new Error(`discoverFromDrizzle: found no Drizzle tables in the object it was given (${describeKeys(schema)}). Import the schema module's tables directly — \`import * as schema from "./db/schema"\` — rather than a barrel or a default export, which can collapse to \`{ default }\` under ESM/CJS interop. Pass { allowEmpty: true } if an empty schema is genuinely intended.`);
107
108
  return tables;
108
109
  }
110
+ /** The keys actually present, so the message names what was handed over. */
111
+ function describeKeys(schema) {
112
+ const keys = Object.keys(schema);
113
+ if (keys.length === 0) return "it was empty";
114
+ const shown = keys.slice(0, 5).join(", ");
115
+ return keys.length > 5 ? `keys: ${shown}, +${keys.length - 5} more` : `keys: ${shown}`;
116
+ }
109
117
  //#endregion
110
118
  Object.defineProperty(exports, "buildColumnsMeta", {
111
119
  enumerable: true,
@@ -36,6 +36,8 @@ declare function buildColumnsMeta(table: Table): DiscoveredColumnMeta[];
36
36
  * when you import this entry (`@clivly/core/drizzle`); the rest of `@clivly/core`
37
37
  * stays dependency-free.
38
38
  */
39
- declare function discoverFromDrizzle(schema: Record<string, unknown>): DiscoveredSchemaTable[];
39
+ declare function discoverFromDrizzle(schema: Record<string, unknown>, options?: {
40
+ allowEmpty?: boolean;
41
+ }): DiscoveredSchemaTable[];
40
42
  //#endregion
41
43
  export { buildUniqueConstraints as n, discoverFromDrizzle as r, buildColumnsMeta as t };
@@ -91,7 +91,7 @@ function buildColumnsMeta(table) {
91
91
  * when you import this entry (`@clivly/core/drizzle`); the rest of `@clivly/core`
92
92
  * stays dependency-free.
93
93
  */
94
- function discoverFromDrizzle(schema) {
94
+ function discoverFromDrizzle(schema, options = {}) {
95
95
  const tables = [];
96
96
  for (const value of Object.values(schema)) {
97
97
  if (!is(value, Table)) continue;
@@ -104,7 +104,15 @@ function discoverFromDrizzle(schema) {
104
104
  ...uniqueConstraints === void 0 ? {} : { uniqueConstraints }
105
105
  });
106
106
  }
107
+ if (tables.length === 0 && !options.allowEmpty) throw new Error(`discoverFromDrizzle: found no Drizzle tables in the object it was given (${describeKeys(schema)}). Import the schema module's tables directly — \`import * as schema from "./db/schema"\` — rather than a barrel or a default export, which can collapse to \`{ default }\` under ESM/CJS interop. Pass { allowEmpty: true } if an empty schema is genuinely intended.`);
107
108
  return tables;
108
109
  }
110
+ /** The keys actually present, so the message names what was handed over. */
111
+ function describeKeys(schema) {
112
+ const keys = Object.keys(schema);
113
+ if (keys.length === 0) return "it was empty";
114
+ const shown = keys.slice(0, 5).join(", ");
115
+ return keys.length > 5 ? `keys: ${shown}, +${keys.length - 5} more` : `keys: ${shown}`;
116
+ }
109
117
  //#endregion
110
118
  export { buildUniqueConstraints as n, discoverFromDrizzle as r, buildColumnsMeta as t };
package/drizzle.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_projection = require("./projection-Dz6_i1-w.cjs");
2
+ const require_projection = require("./projection-DEwL-D8R.cjs");
3
3
  const require_drizzle_meta = require("./drizzle-meta-Bb1JWYqf.cjs");
4
- const require_projection_sql = require("./projection-sql-Cl1qIn8m.cjs");
5
- const require_drizzle = require("./drizzle-bfjVzYR6.cjs");
4
+ const require_projection_sql = require("./projection-sql-iHy-Cx6V.cjs");
5
+ const require_drizzle = require("./drizzle-DcB7OfBp.cjs");
6
6
  let drizzle_orm = require("drizzle-orm");
7
7
  //#region ../sdk/src/drizzle-projection.ts
8
8
  /** `<ref>.<column>` — the token `fields` carries and cloud-ingest reads. */
@@ -40,10 +40,12 @@ function fromDrizzleProjection(db, projection, opts) {
40
40
  const client = db;
41
41
  const known = /* @__PURE__ */ new Set([require_projection.BASE_REF, ...projection.joins.map((j) => j.key)]);
42
42
  if (projection.identity.kind === "base_pk" && projection.identity.column === void 0 && opts.basePkColumn === void 0) throw new Error(`fromDrizzleProjection: projection "${projection.entityKey}" has a base_pk identity with no column — pass { basePkColumn }.`);
43
- const cursorRef = parseRef(opts.cursorField);
44
- assertKnownRef(cursorRef, known, "cursorField");
45
43
  for (const [field, binding] of Object.entries(projection.fieldBindings)) assertKnownRef(binding.from, known, `field "${field}"`);
46
44
  const identityExpr = require_projection_sql.compileProjectionIdentity(projection, opts.basePkColumn ?? "");
45
+ const fromClause = [require_projection_sql.compileProjectionFrom(projection), ...require_projection_sql.compileProjectionJoins(projection)].join(" ");
46
+ if (opts.cursorField === void 0) return fromDrizzleProjectionByIdentity(client, projection, identityExpr, fromClause, opts);
47
+ const cursorRef = parseRef(opts.cursorField);
48
+ assertKnownRef(cursorRef, known, "cursorField");
47
49
  const cursorToken = refToken(cursorRef);
48
50
  const cursorExpr = `CAST(${refSql(cursorRef)} AS timestamptz)`;
49
51
  const cursorRead = `to_char(${cursorExpr} AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`;
@@ -55,11 +57,7 @@ function fromDrizzleProjection(db, projection, opts) {
55
57
  emitted.add(token);
56
58
  selectItems.push(`${refSql(binding.from)} AS ${require_projection_sql.quoteIdent(token)}`);
57
59
  }
58
- const head = [
59
- `select ${selectItems.join(", ")}`,
60
- require_projection_sql.compileProjectionFrom(projection),
61
- ...require_projection_sql.compileProjectionJoins(projection)
62
- ].join(" ");
60
+ const head = [`select ${selectItems.join(", ")}`, fromClause].join(" ");
63
61
  return {
64
62
  entity: opts.entity,
65
63
  cursorField: cursorToken,
@@ -72,6 +70,49 @@ function fromDrizzleProjection(db, projection, opts) {
72
70
  }
73
71
  };
74
72
  }
73
+ /**
74
+ * The identity-only paging path `fromDrizzleProjection` takes when
75
+ * `cursorField` is omitted. Deliberately not a generalisation of the
76
+ * timestamp path above — it selects no timestamp cursor, pages on the
77
+ * identity expression alone, and always reports `cursorField`/`idField` as
78
+ * `"id"`, the alias every row carries either way.
79
+ */
80
+ function fromDrizzleProjectionByIdentity(client, projection, identityExpr, fromClause, opts) {
81
+ const selectItems = [`${identityExpr} AS ${require_projection_sql.quoteIdent("id")}`];
82
+ const emitted = /* @__PURE__ */ new Set();
83
+ for (const binding of Object.values(projection.fieldBindings)) {
84
+ const token = refToken(binding.from);
85
+ if (emitted.has(token)) continue;
86
+ emitted.add(token);
87
+ selectItems.push(`${refSql(binding.from)} AS ${require_projection_sql.quoteIdent(token)}`);
88
+ }
89
+ const head = [`select ${selectItems.join(", ")}`, fromClause].join(" ");
90
+ return {
91
+ entity: opts.entity,
92
+ cursorField: "id",
93
+ idField: "id",
94
+ ...opts.objectType === void 0 ? {} : { objectType: opts.objectType },
95
+ fetchPage: async ({ since, limit }) => {
96
+ const where = since ? drizzle_orm.sql` where ${drizzle_orm.sql.raw(identityExpr)} > ${since.id}` : drizzle_orm.sql``;
97
+ const query = drizzle_orm.sql`${drizzle_orm.sql.raw(head)}${where} order by ${drizzle_orm.sql.raw(identityExpr)} asc limit ${limit}`;
98
+ return normalizeRows(await client.execute(query));
99
+ }
100
+ };
101
+ }
102
+ //#endregion
103
+ //#region ../sdk/src/projection-preview.ts
104
+ /** `db.execute` returns either an array or `{ rows }`, depending on driver. */
105
+ function rowsOf(result) {
106
+ if (Array.isArray(result)) return result;
107
+ const rows = result.rows;
108
+ if (Array.isArray(rows)) return rows;
109
+ throw new Error("previewProjection: db.execute() returned neither an array of rows nor { rows }.");
110
+ }
111
+ async function previewProjection(db, projection, opts) {
112
+ const client = db;
113
+ const { sql } = await import("drizzle-orm");
114
+ return rowsOf(await client.execute(sql.raw(require_projection_sql.compileProjectionPreview(projection, opts.limit))));
115
+ }
75
116
  //#endregion
76
117
  //#region ../sdk/src/drizzle.ts
77
118
  function inferIdField(table) {
@@ -135,6 +176,16 @@ function drizzleIntrospector(db) {
135
176
  },
136
177
  async sampleSelect(table) {
137
178
  await client.execute(drizzle_orm.sql`select 1 from ${drizzle_orm.sql.identifier(table)} limit 1`);
179
+ },
180
+ runProjection(projection, opts) {
181
+ return previewProjection(db, projection, opts);
182
+ },
183
+ projectionSource(projection, opts) {
184
+ return fromDrizzleProjection(db, projection, {
185
+ entity: opts.objectType,
186
+ objectType: opts.objectType,
187
+ ...opts.basePkColumn ? { basePkColumn: opts.basePkColumn } : {}
188
+ });
138
189
  }
139
190
  };
140
191
  }
package/drizzle.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { F as ProjectionRef, P as ProjectionMapping } from "./entity-config-B2RA53nw.cjs";
2
- import { n as buildUniqueConstraints, r as discoverFromDrizzle } from "./drizzle-DEtRrqtc.cjs";
3
- import { _ as SyncSource, t as NamespaceIntrospector } from "./namespace-probe-BoGI18dQ.cjs";
2
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle } from "./drizzle-ixVV4pPN.cjs";
3
+ import { t as NamespaceIntrospector, v as SyncSource } from "./namespace-probe-DZIGdvlm.cjs";
4
4
  import { Table } from "drizzle-orm";
5
5
  //#region ../sdk/src/drizzle-projection.d.ts
6
6
  /**
@@ -37,8 +37,14 @@ interface FromDrizzleProjectionOptions {
37
37
  * The column to keyset-paginate on, as a ref token (`"base.updated_at"`) or
38
38
  * a `ProjectionRef`. A projection spans several tables, so there is no
39
39
  * single table to infer a cursor from.
40
+ *
41
+ * Omit it to page by identity alone — the mode a dashboard-authored
42
+ * projection uses, since it has no timestamp column and no UI to nominate
43
+ * one. `checkIdentitySafety` (`@clivly/core`) already proves the identity
44
+ * uniquely identifies a row, which makes it a sound keyset cursor with no
45
+ * timestamp involved.
40
46
  */
41
- cursorField: string | ProjectionRef;
47
+ cursorField?: string | ProjectionRef;
42
48
  /** The source name rows are pushed under. */
43
49
  entity: string;
44
50
  /**
package/drizzle.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { F as ProjectionRef, P as ProjectionMapping } from "./entity-config-B2RA53nw.mjs";
2
- import { n as buildUniqueConstraints, r as discoverFromDrizzle } from "./drizzle-CiK8MMEZ.mjs";
3
- import { _ as SyncSource, t as NamespaceIntrospector } from "./namespace-probe-Cn7voAd0.mjs";
2
+ import { n as buildUniqueConstraints, r as discoverFromDrizzle } from "./drizzle-BmDDgAIF.mjs";
3
+ import { t as NamespaceIntrospector, v as SyncSource } from "./namespace-probe-BQ4imnV7.mjs";
4
4
  import { Table } from "drizzle-orm";
5
5
  //#region ../sdk/src/drizzle-projection.d.ts
6
6
  /**
@@ -37,8 +37,14 @@ interface FromDrizzleProjectionOptions {
37
37
  * The column to keyset-paginate on, as a ref token (`"base.updated_at"`) or
38
38
  * a `ProjectionRef`. A projection spans several tables, so there is no
39
39
  * single table to infer a cursor from.
40
+ *
41
+ * Omit it to page by identity alone — the mode a dashboard-authored
42
+ * projection uses, since it has no timestamp column and no UI to nominate
43
+ * one. `checkIdentitySafety` (`@clivly/core`) already proves the identity
44
+ * uniquely identifies a row, which makes it a sound keyset cursor with no
45
+ * timestamp involved.
40
46
  */
41
- cursorField: string | ProjectionRef;
47
+ cursorField?: string | ProjectionRef;
42
48
  /** The source name rows are pushed under. */
43
49
  entity: string;
44
50
  /**