clivly 0.9.1 → 0.9.3

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 (86) hide show
  1. package/README.md +79 -13
  2. package/core-drizzle.d.cts +1 -1
  3. package/core-drizzle.d.mts +1 -1
  4. package/core-entity-config.cjs +2 -1
  5. package/core-entity-config.d.cts +2 -2
  6. package/core-entity-config.d.mts +2 -2
  7. package/core-entity-config.mjs +2 -2
  8. package/core-entity-heuristics.d.cts +1 -1
  9. package/core-entity-heuristics.d.mts +1 -1
  10. package/core-mapping-form.d.cts +1 -1
  11. package/core-mapping-form.d.mts +1 -1
  12. package/core-mappings-config.cjs +2 -1
  13. package/core-mappings-config.d.cts +2 -2
  14. package/core-mappings-config.d.mts +2 -2
  15. package/core-mappings-config.mjs +2 -2
  16. package/core-sync-engine.d.cts +1 -1
  17. package/core-sync-engine.d.mts +1 -1
  18. package/core-view-compiler.d.cts +1 -1
  19. package/core-view-compiler.d.mts +1 -1
  20. package/core.cjs +3 -3
  21. package/core.d.cts +8 -7
  22. package/core.d.mts +8 -7
  23. package/core.mjs +3 -3
  24. package/{drizzle-DooDUGqO.d.mts → drizzle-CiK8MMEZ.d.mts} +1 -1
  25. package/{drizzle-jz0lrAgl.d.cts → drizzle-DEtRrqtc.d.cts} +1 -1
  26. package/drizzle.d.cts +2 -2
  27. package/drizzle.d.mts +2 -2
  28. package/{entity-config-fKQhimtD.d.mts → entity-config-B2RA53nw.d.cts} +25 -1
  29. package/{entity-config-fKQhimtD.d.cts → entity-config-B2RA53nw.d.mts} +25 -1
  30. package/{entity-config-nuXge6rY.cjs → entity-config-DtBsl2MQ.cjs} +36 -12
  31. package/{entity-config-D08zAeFY.mjs → entity-config-kUHri9yA.mjs} +31 -13
  32. package/index.cjs +452 -38
  33. package/index.d.cts +3 -1
  34. package/index.d.mts +3 -1
  35. package/index.mjs +452 -39
  36. package/integration-state-BK-riZnm.d.cts +130 -0
  37. package/integration-state-BK-riZnm.d.mts +130 -0
  38. package/{internal-C-YBW2DB.d.cts → internal-CDY8g9Ic.d.mts} +1 -1
  39. package/{internal-D4HDi2GC.cjs → internal-CwnEG6Wl.cjs} +1 -1
  40. package/{internal-BLCK81kB.d.mts → internal-Da_dlcQ_.d.cts} +1 -1
  41. package/{internal-BGVUG312.mjs → internal-Df-PtOH_.mjs} +1 -1
  42. package/internal-drizzle.d.cts +1 -1
  43. package/internal-drizzle.d.mts +1 -1
  44. package/internal-entity-config.cjs +2 -1
  45. package/internal-entity-config.d.cts +2 -2
  46. package/internal-entity-config.d.mts +2 -2
  47. package/internal-entity-config.mjs +2 -2
  48. package/internal-entity-heuristics.cjs +1 -1
  49. package/internal-entity-heuristics.d.cts +1 -1
  50. package/internal-entity-heuristics.d.mts +1 -1
  51. package/internal-entity-heuristics.mjs +1 -1
  52. package/internal-mapping-form.d.cts +1 -1
  53. package/internal-mapping-form.d.mts +1 -1
  54. package/internal-mappings-config.cjs +2 -1
  55. package/internal-mappings-config.d.cts +2 -2
  56. package/internal-mappings-config.d.mts +2 -2
  57. package/internal-mappings-config.mjs +2 -2
  58. package/internal-sync-engine.d.cts +1 -1
  59. package/internal-sync-engine.d.mts +1 -1
  60. package/internal-view-compiler.d.cts +1 -1
  61. package/internal-view-compiler.d.mts +1 -1
  62. package/internal.cjs +3 -3
  63. package/internal.d.cts +8 -7
  64. package/internal.d.mts +8 -7
  65. package/internal.mjs +3 -3
  66. package/{mapping-form-Du36VZr1.d.mts → mapping-form-DH77BXLv.d.mts} +1 -1
  67. package/{mapping-form-DhY0iFmN.d.cts → mapping-form-J0aU6O7l.d.cts} +1 -1
  68. package/{mappings-config-C8ynKmDK.cjs → mappings-config-B0RqFLxu.cjs} +30 -1
  69. package/{mappings-config-DNaYGyKN.mjs → mappings-config-B1b1HVBg.mjs} +25 -2
  70. package/{mappings-config-B1qNM8VL.d.cts → mappings-config-D9dsonoi.d.mts} +40 -2
  71. package/{mappings-config-BChZsany.d.mts → mappings-config-RQLGx8ub.d.cts} +40 -2
  72. package/{namespace-probe-BkUs8raG.d.mts → namespace-probe-BmdGnYMn.d.mts} +72 -3
  73. package/{namespace-probe-aRFmpU85.d.cts → namespace-probe-EYyxWZnf.d.cts} +72 -3
  74. package/package.json +1 -1
  75. package/{sdk-Bj-ZDf4u.cjs → sdk-COLUHhJq.cjs} +755 -44
  76. package/{sdk-BvRD2jAp.mjs → sdk-CZNXBsgA.mjs} +755 -44
  77. package/sdk.cjs +4 -2
  78. package/sdk.d.cts +3 -3
  79. package/sdk.d.mts +3 -3
  80. package/sdk.mjs +3 -3
  81. package/{sync-engine-DHQ7rXZe.d.mts → sync-engine-BG2O1an2.d.cts} +2 -2
  82. package/{sync-engine-DiPjH53O.d.cts → sync-engine-DgQbrJON.d.mts} +2 -2
  83. package/{view-compiler-CcUwzZut.d.mts → view-compiler-Bo7pqXW3.d.mts} +1 -1
  84. package/{view-compiler-DqAdVxLq.d.cts → view-compiler-CmEdAMwj.d.cts} +1 -1
  85. package/vite.d.cts +1 -1
  86. package/vite.d.mts +1 -1
@@ -437,10 +437,23 @@ const entitySchema = require_projection.strictObject({
437
437
  relationships: require_projection.record(require_projection.string(), relationshipSchema).optional(),
438
438
  /**
439
439
  * For a "custom" entity, the crm_object_types row this materializes into.
440
- * Required for custom (enforced at the API layer), unused for standard concepts.
440
+ * Server-generated, so pasting one into config couples the file to a
441
+ * specific workspace. Prefer declaring `objectType` and letting
442
+ * `clivly push-schema` resolve the id by slug.
441
443
  */
442
444
  targetObjectTypeId: require_projection.string().min(1).optional(),
443
445
  /**
446
+ * Declares the custom object this entity materializes into, so config is
447
+ * self-contained: the entity key is the slug (unique per org and immutable),
448
+ * and `clivly push-schema` creates the object type if the workspace does not
449
+ * have it yet. An alternative to pasting a `targetObjectTypeId`.
450
+ */
451
+ objectType: require_projection.strictObject({
452
+ name: require_projection.string().min(1),
453
+ pluralName: require_projection.string().min(1).optional(),
454
+ iconKey: require_projection.string().min(1).optional()
455
+ }).optional(),
456
+ /**
444
457
  * Advanced mapping: derive this entity from a base table plus explicit joins
445
458
  * instead of a single source table. Valid only for `concept: "custom"`.
446
459
  *
@@ -482,17 +495,22 @@ function defaultWarn(message) {
482
495
  console.warn(message);
483
496
  }
484
497
  /**
485
- * Structural helper for `clivly.config.ts`. Gives full type inference on the
486
- * literal you pass and eagerly parses it, so shape errors surface at config
487
- * load rather than at sync time.
488
- *
489
- * It also catches the silent-data-loss footgun: a non-canonical field key for a
490
- * materialised concept (e.g. `fullName` instead of `name` on a `contact`) has no
491
- * destination column, so the store would write an empty value. By default these
492
- * are reported via `onWarn` (a `console.warn`); pass `{ strict: true }` to throw
493
- * a `ClivlyConfigError` instead. Does NOT validate against the host schema — that
494
- * needs the discovered schema; see `validateEntitiesConfig`.
498
+ * The custom objects a config declares, keyed by entity slug. Entities that
499
+ * already carry an explicit `targetObjectTypeId` are omitted: their object type
500
+ * exists server-side and re-declaring it would be a no-op at best.
495
501
  */
502
+ function customObjectDeclarations(config) {
503
+ const declarations = [];
504
+ for (const [slug, entity] of Object.entries(config.entities)) {
505
+ if (entity.concept !== "custom" || entity.targetObjectTypeId) continue;
506
+ if (!entity.objectType) continue;
507
+ declarations.push({
508
+ slug,
509
+ ...entity.objectType
510
+ });
511
+ }
512
+ return declarations;
513
+ }
496
514
  /**
497
515
  * The `fields` entry a projection binding implies, qualified as `ref.column`.
498
516
  * Qualified rather than bare: two bindings can pull the same column name from
@@ -632,7 +650,7 @@ function validateEntity(v, config, key, entity, schema) {
632
650
  }
633
651
  if (entity.projection) {
634
652
  if (entity.concept !== "custom") v.report(`${base}.projection`, `projection mappings are only supported for concept "${CUSTOM_CONCEPT}"`);
635
- if (!entity.targetObjectTypeId) v.report(`${base}.targetObjectTypeId`, "a projection mapping must target a custom object type");
653
+ if (!(entity.targetObjectTypeId || entity.objectType)) v.report(`${base}.targetObjectTypeId`, "a projection mapping must target a custom object type — declare `objectType: { name: \"…\" }` (recommended: the entity key becomes its slug) or set an explicit `targetObjectTypeId`");
636
654
  if (entity.source !== entity.projection.baseTable) v.report(`${base}.source`, `"source" ("${entity.source}") must match "projection.baseTable" ("${entity.projection.baseTable}") — the view compiler reads baseTable and the sync engine reads source, so a mismatch makes them disagree about which table this entity is`);
637
655
  for (const error of validateProjection(entity.projection, schema, base)) v.report(error.path, error.message);
638
656
  validateReadOnly(v, base, entity);
@@ -704,6 +722,12 @@ Object.defineProperty(exports, "coversUniqueKey", {
704
722
  return coversUniqueKey;
705
723
  }
706
724
  });
725
+ Object.defineProperty(exports, "customObjectDeclarations", {
726
+ enumerable: true,
727
+ get: function() {
728
+ return customObjectDeclarations;
729
+ }
730
+ });
707
731
  Object.defineProperty(exports, "defineClivlyConfig", {
708
732
  enumerable: true,
709
733
  get: function() {
@@ -429,10 +429,23 @@ const entitySchema = strictObject({
429
429
  relationships: record(string(), relationshipSchema).optional(),
430
430
  /**
431
431
  * For a "custom" entity, the crm_object_types row this materializes into.
432
- * Required for custom (enforced at the API layer), unused for standard concepts.
432
+ * Server-generated, so pasting one into config couples the file to a
433
+ * specific workspace. Prefer declaring `objectType` and letting
434
+ * `clivly push-schema` resolve the id by slug.
433
435
  */
434
436
  targetObjectTypeId: string().min(1).optional(),
435
437
  /**
438
+ * Declares the custom object this entity materializes into, so config is
439
+ * self-contained: the entity key is the slug (unique per org and immutable),
440
+ * and `clivly push-schema` creates the object type if the workspace does not
441
+ * have it yet. An alternative to pasting a `targetObjectTypeId`.
442
+ */
443
+ objectType: strictObject({
444
+ name: string().min(1),
445
+ pluralName: string().min(1).optional(),
446
+ iconKey: string().min(1).optional()
447
+ }).optional(),
448
+ /**
436
449
  * Advanced mapping: derive this entity from a base table plus explicit joins
437
450
  * instead of a single source table. Valid only for `concept: "custom"`.
438
451
  *
@@ -474,17 +487,22 @@ function defaultWarn(message) {
474
487
  console.warn(message);
475
488
  }
476
489
  /**
477
- * Structural helper for `clivly.config.ts`. Gives full type inference on the
478
- * literal you pass and eagerly parses it, so shape errors surface at config
479
- * load rather than at sync time.
480
- *
481
- * It also catches the silent-data-loss footgun: a non-canonical field key for a
482
- * materialised concept (e.g. `fullName` instead of `name` on a `contact`) has no
483
- * destination column, so the store would write an empty value. By default these
484
- * are reported via `onWarn` (a `console.warn`); pass `{ strict: true }` to throw
485
- * a `ClivlyConfigError` instead. Does NOT validate against the host schema — that
486
- * needs the discovered schema; see `validateEntitiesConfig`.
490
+ * The custom objects a config declares, keyed by entity slug. Entities that
491
+ * already carry an explicit `targetObjectTypeId` are omitted: their object type
492
+ * exists server-side and re-declaring it would be a no-op at best.
487
493
  */
494
+ function customObjectDeclarations(config) {
495
+ const declarations = [];
496
+ for (const [slug, entity] of Object.entries(config.entities)) {
497
+ if (entity.concept !== "custom" || entity.targetObjectTypeId) continue;
498
+ if (!entity.objectType) continue;
499
+ declarations.push({
500
+ slug,
501
+ ...entity.objectType
502
+ });
503
+ }
504
+ return declarations;
505
+ }
488
506
  /**
489
507
  * The `fields` entry a projection binding implies, qualified as `ref.column`.
490
508
  * Qualified rather than bare: two bindings can pull the same column name from
@@ -624,7 +642,7 @@ function validateEntity(v, config, key, entity, schema) {
624
642
  }
625
643
  if (entity.projection) {
626
644
  if (entity.concept !== "custom") v.report(`${base}.projection`, `projection mappings are only supported for concept "${CUSTOM_CONCEPT}"`);
627
- if (!entity.targetObjectTypeId) v.report(`${base}.targetObjectTypeId`, "a projection mapping must target a custom object type");
645
+ if (!(entity.targetObjectTypeId || entity.objectType)) v.report(`${base}.targetObjectTypeId`, "a projection mapping must target a custom object type — declare `objectType: { name: \"…\" }` (recommended: the entity key becomes its slug) or set an explicit `targetObjectTypeId`");
628
646
  if (entity.source !== entity.projection.baseTable) v.report(`${base}.source`, `"source" ("${entity.source}") must match "projection.baseTable" ("${entity.projection.baseTable}") — the view compiler reads baseTable and the sync engine reads source, so a mismatch makes them disagree about which table this entity is`);
629
647
  for (const error of validateProjection(entity.projection, schema, base)) v.report(error.path, error.message);
630
648
  validateReadOnly(v, base, entity);
@@ -654,4 +672,4 @@ function validateEntitiesConfig(config, schema) {
654
672
  };
655
673
  }
656
674
  //#endregion
657
- export { coversUniqueKey as _, MATERIALIZING_CONCEPTS as a, filterSchema as c, relationshipsSchema as d, validateEntitiesConfig as f, columnMetaFor as g, joinFansOut as h, ClivlyConfigError as i, projectionFields as l, fanOutJoins as m, CRM_CONCEPTS as n, defineClivlyConfig as o, validateProjection as p, CUSTOM_CONCEPT as r, entitiesConfigSchema as s, CANONICAL_FIELDS as t, relationshipSchema as u, hasRichMeta as v, primaryKeyColumns as y };
675
+ export { columnMetaFor as _, MATERIALIZING_CONCEPTS as a, primaryKeyColumns as b, entitiesConfigSchema as c, relationshipSchema as d, relationshipsSchema as f, joinFansOut as g, fanOutJoins as h, ClivlyConfigError as i, filterSchema as l, validateProjection as m, CRM_CONCEPTS as n, customObjectDeclarations as o, validateEntitiesConfig as p, CUSTOM_CONCEPT as r, defineClivlyConfig as s, CANONICAL_FIELDS as t, projectionFields as u, coversUniqueKey as v, hasRichMeta as y };