@clivly/core 0.11.0-next.0 → 0.12.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/adapter.d.cts +62 -7
- package/dist/adapter.d.mts +62 -7
- package/dist/auth-adapter.d.cts +6 -7
- package/dist/auth-adapter.d.mts +6 -7
- package/dist/builder.d.cts +12 -12
- package/dist/builder.d.mts +12 -12
- package/dist/drizzle.d.cts +5 -6
- package/dist/drizzle.d.mts +5 -6
- package/dist/{entity-config-BTAJe1Zj.mjs → entity-config-C0rtu-K_.mjs} +19 -2
- package/dist/{entity-config-CqJknGOn.cjs → entity-config-C2sKAti2.cjs} +19 -2
- package/dist/{entity-config-Ddgukq_E.d.cts → entity-config-OhC4Otkz.d.cts} +3 -1
- package/dist/{entity-config-Ddgukq_E.d.mts → entity-config-OhC4Otkz.d.mts} +3 -1
- package/dist/entity-config.cjs +1 -1
- package/dist/entity-config.d.cts +1 -1
- package/dist/entity-config.d.mts +1 -1
- package/dist/entity-config.mjs +1 -1
- package/dist/entity-heuristics.cjs +9 -7
- package/dist/entity-heuristics.d.cts +21 -21
- package/dist/entity-heuristics.d.mts +21 -21
- package/dist/entity-heuristics.mjs +9 -7
- package/dist/env-file.d.cts +6 -7
- package/dist/env-file.d.mts +6 -7
- package/dist/index.cjs +112 -1
- package/dist/index.d.cts +124 -22
- package/dist/index.d.mts +124 -22
- package/dist/index.mjs +108 -2
- package/dist/integration-state.d.cts +30 -31
- package/dist/integration-state.d.mts +30 -31
- package/dist/mapping-form.d.cts +6 -7
- package/dist/mapping-form.d.mts +6 -7
- package/dist/mapping-score.d.cts +14 -15
- package/dist/mapping-score.d.mts +14 -15
- package/dist/mappings-config.cjs +2 -1
- package/dist/mappings-config.d.cts +8 -7
- package/dist/mappings-config.d.mts +8 -7
- package/dist/mappings-config.mjs +2 -1
- package/dist/sync-engine.d.cts +15 -16
- package/dist/sync-engine.d.mts +15 -16
- package/dist/types.d.cts +132 -33
- package/dist/types.d.mts +132 -33
- package/dist/view-compiler.d.cts +10 -11
- package/dist/view-compiler.d.mts +10 -11
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as ProjectionMapping, S as RelationshipsMap, a as ClivlyEntitiesConfig, h as FilterExpr } from "./entity-config-
|
|
1
|
+
import { R as ProjectionMapping, S as RelationshipsMap, a as ClivlyEntitiesConfig, h as FilterExpr } from "./entity-config-OhC4Otkz.cjs";
|
|
2
2
|
//#region src/mappings-config.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* Mappings → Entity Config bridge.
|
|
@@ -20,7 +20,7 @@ import { R as ProjectionMapping, S as RelationshipsMap, a as ClivlyEntitiesConfi
|
|
|
20
20
|
* reads. Structurally compatible with the Drizzle row (jsonb columns typed
|
|
21
21
|
* loosely) so the API layer can pass `db.select()` results straight in.
|
|
22
22
|
*/
|
|
23
|
-
interface EntityMappingRow {
|
|
23
|
+
export interface EntityMappingRow {
|
|
24
24
|
fieldMap: Record<string, string>;
|
|
25
25
|
filter?: Record<string, unknown> | null;
|
|
26
26
|
/**
|
|
@@ -42,7 +42,7 @@ interface EntityMappingRow {
|
|
|
42
42
|
* unmapped rows are skipped. Returns `{ entities: {} }` when nothing is
|
|
43
43
|
* eligible — a no-op the view compiler and sync engine both tolerate.
|
|
44
44
|
*/
|
|
45
|
-
declare function mappingsToEntitiesConfig(rows: EntityMappingRow[]): ClivlyEntitiesConfig;
|
|
45
|
+
export declare function mappingsToEntitiesConfig(rows: EntityMappingRow[]): ClivlyEntitiesConfig;
|
|
46
46
|
/**
|
|
47
47
|
* Entity Config → Mappings, the inverse of `mappingsToEntitiesConfig`.
|
|
48
48
|
*
|
|
@@ -57,7 +57,7 @@ declare function mappingsToEntitiesConfig(rows: EntityMappingRow[]): ClivlyEntit
|
|
|
57
57
|
* ("client-accounts" derived from "accounts"). So the key travels explicitly on
|
|
58
58
|
* every row rather than being left for the reverse derivation to guess.
|
|
59
59
|
*/
|
|
60
|
-
interface MappingFromConfig {
|
|
60
|
+
export interface MappingFromConfig {
|
|
61
61
|
/**
|
|
62
62
|
* The config entity key this row came from. Not a row column — the caller
|
|
63
63
|
* needs it to resolve a custom object type and to report what it wrote.
|
|
@@ -65,6 +65,8 @@ interface MappingFromConfig {
|
|
|
65
65
|
entityKey: string;
|
|
66
66
|
fieldMap: Record<string, string>;
|
|
67
67
|
filter?: FilterExpr;
|
|
68
|
+
/** Rows from this entity are their company's point of contact. */
|
|
69
|
+
isPrimaryContact?: boolean;
|
|
68
70
|
/** Declared custom object, when the config declares one rather than pinning an id. */
|
|
69
71
|
objectType?: {
|
|
70
72
|
iconKey?: string;
|
|
@@ -80,6 +82,5 @@ interface MappingFromConfig {
|
|
|
80
82
|
targetConcept: string;
|
|
81
83
|
targetObjectTypeId?: string;
|
|
82
84
|
}
|
|
83
|
-
declare function entitiesToMappings(config: ClivlyEntitiesConfig): MappingFromConfig[];
|
|
84
|
-
//#endregion
|
|
85
|
-
export { EntityMappingRow, MappingFromConfig, entitiesToMappings, mappingsToEntitiesConfig };
|
|
85
|
+
export declare function entitiesToMappings(config: ClivlyEntitiesConfig): MappingFromConfig[];
|
|
86
|
+
//#endregion
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as ProjectionMapping, S as RelationshipsMap, a as ClivlyEntitiesConfig, h as FilterExpr } from "./entity-config-
|
|
1
|
+
import { R as ProjectionMapping, S as RelationshipsMap, a as ClivlyEntitiesConfig, h as FilterExpr } from "./entity-config-OhC4Otkz.mjs";
|
|
2
2
|
//#region src/mappings-config.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* Mappings → Entity Config bridge.
|
|
@@ -20,7 +20,7 @@ import { R as ProjectionMapping, S as RelationshipsMap, a as ClivlyEntitiesConfi
|
|
|
20
20
|
* reads. Structurally compatible with the Drizzle row (jsonb columns typed
|
|
21
21
|
* loosely) so the API layer can pass `db.select()` results straight in.
|
|
22
22
|
*/
|
|
23
|
-
interface EntityMappingRow {
|
|
23
|
+
export interface EntityMappingRow {
|
|
24
24
|
fieldMap: Record<string, string>;
|
|
25
25
|
filter?: Record<string, unknown> | null;
|
|
26
26
|
/**
|
|
@@ -42,7 +42,7 @@ interface EntityMappingRow {
|
|
|
42
42
|
* unmapped rows are skipped. Returns `{ entities: {} }` when nothing is
|
|
43
43
|
* eligible — a no-op the view compiler and sync engine both tolerate.
|
|
44
44
|
*/
|
|
45
|
-
declare function mappingsToEntitiesConfig(rows: EntityMappingRow[]): ClivlyEntitiesConfig;
|
|
45
|
+
export declare function mappingsToEntitiesConfig(rows: EntityMappingRow[]): ClivlyEntitiesConfig;
|
|
46
46
|
/**
|
|
47
47
|
* Entity Config → Mappings, the inverse of `mappingsToEntitiesConfig`.
|
|
48
48
|
*
|
|
@@ -57,7 +57,7 @@ declare function mappingsToEntitiesConfig(rows: EntityMappingRow[]): ClivlyEntit
|
|
|
57
57
|
* ("client-accounts" derived from "accounts"). So the key travels explicitly on
|
|
58
58
|
* every row rather than being left for the reverse derivation to guess.
|
|
59
59
|
*/
|
|
60
|
-
interface MappingFromConfig {
|
|
60
|
+
export interface MappingFromConfig {
|
|
61
61
|
/**
|
|
62
62
|
* The config entity key this row came from. Not a row column — the caller
|
|
63
63
|
* needs it to resolve a custom object type and to report what it wrote.
|
|
@@ -65,6 +65,8 @@ interface MappingFromConfig {
|
|
|
65
65
|
entityKey: string;
|
|
66
66
|
fieldMap: Record<string, string>;
|
|
67
67
|
filter?: FilterExpr;
|
|
68
|
+
/** Rows from this entity are their company's point of contact. */
|
|
69
|
+
isPrimaryContact?: boolean;
|
|
68
70
|
/** Declared custom object, when the config declares one rather than pinning an id. */
|
|
69
71
|
objectType?: {
|
|
70
72
|
iconKey?: string;
|
|
@@ -80,6 +82,5 @@ interface MappingFromConfig {
|
|
|
80
82
|
targetConcept: string;
|
|
81
83
|
targetObjectTypeId?: string;
|
|
82
84
|
}
|
|
83
|
-
declare function entitiesToMappings(config: ClivlyEntitiesConfig): MappingFromConfig[];
|
|
84
|
-
//#endregion
|
|
85
|
-
export { EntityMappingRow, MappingFromConfig, entitiesToMappings, mappingsToEntitiesConfig };
|
|
85
|
+
export declare function entitiesToMappings(config: ClivlyEntitiesConfig): MappingFromConfig[];
|
|
86
|
+
//#endregion
|
package/dist/mappings-config.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as projectionFields, t as CANONICAL_FIELDS } from "./entity-config-
|
|
1
|
+
import { f as projectionFields, t as CANONICAL_FIELDS } from "./entity-config-C0rtu-K_.mjs";
|
|
2
2
|
//#region src/mappings-config.ts
|
|
3
3
|
const RESERVED_FIELD = "id";
|
|
4
4
|
/**
|
|
@@ -119,6 +119,7 @@ function entitiesToMappings(config) {
|
|
|
119
119
|
fieldMap: entity.projection ? {} : entity.fields
|
|
120
120
|
};
|
|
121
121
|
if (entity.filter) row.filter = entity.filter;
|
|
122
|
+
if (entity.isPrimaryContact) row.isPrimaryContact = true;
|
|
122
123
|
if (entity.relationships) row.relationships = entity.relationships;
|
|
123
124
|
if (entity.projection) row.projection = entity.projection;
|
|
124
125
|
if (entity.concept === CUSTOM_CONCEPT) {
|
package/dist/sync-engine.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ClivlyEntitiesConfig } from "./entity-config-
|
|
1
|
+
import { a as ClivlyEntitiesConfig } from "./entity-config-OhC4Otkz.cjs";
|
|
2
2
|
import { CompileOptions, CompiledView } from "./view-compiler.cjs";
|
|
3
3
|
//#region src/sync-engine.d.ts
|
|
4
4
|
/**
|
|
@@ -19,7 +19,7 @@ import { CompileOptions, CompiledView } from "./view-compiler.cjs";
|
|
|
19
19
|
* package provides the concrete store.
|
|
20
20
|
*/
|
|
21
21
|
/** A row read from a compiled view (what Postgres returns). */
|
|
22
|
-
interface SourceRow {
|
|
22
|
+
export interface SourceRow {
|
|
23
23
|
/** Host-side company key from `<relationship>_ref`; resolved before persist. */
|
|
24
24
|
companyRef?: string | null;
|
|
25
25
|
/** Mapped identity fields (clivly field → value). */
|
|
@@ -28,14 +28,14 @@ interface SourceRow {
|
|
|
28
28
|
sourceRef: string;
|
|
29
29
|
}
|
|
30
30
|
/** An existing mirror row, as far as reconciliation needs to know. */
|
|
31
|
-
interface MirrorRecord {
|
|
31
|
+
export interface MirrorRecord {
|
|
32
32
|
archivedAt: Date | null;
|
|
33
33
|
/** Host-side company key; only consulted in composite (join-table) mode. */
|
|
34
34
|
companyRef: string | null;
|
|
35
35
|
id: string;
|
|
36
36
|
sourceRef: string;
|
|
37
37
|
}
|
|
38
|
-
type SyncAction = {
|
|
38
|
+
export type SyncAction = {
|
|
39
39
|
kind: "create";
|
|
40
40
|
sourceRef: string;
|
|
41
41
|
fields: Record<string, string | null>;
|
|
@@ -58,7 +58,7 @@ type SyncAction = {
|
|
|
58
58
|
sourceRef: string;
|
|
59
59
|
};
|
|
60
60
|
/** A persist action with the company ref resolved to a `crm_companies.id`. */
|
|
61
|
-
type PersistAction = {
|
|
61
|
+
export type PersistAction = {
|
|
62
62
|
kind: "create";
|
|
63
63
|
sourceRef: string;
|
|
64
64
|
fields: Record<string, string | null>;
|
|
@@ -99,11 +99,11 @@ type PersistAction = {
|
|
|
99
99
|
* person in several companies materializes one mirror row per company and a
|
|
100
100
|
* single membership leaving archives only that one row.
|
|
101
101
|
*/
|
|
102
|
-
declare function reconcile(source: SourceRow[], mirror: MirrorRecord[], opts?: {
|
|
102
|
+
export declare function reconcile(source: SourceRow[], mirror: MirrorRecord[], opts?: {
|
|
103
103
|
composite?: boolean;
|
|
104
104
|
}): SyncAction[];
|
|
105
105
|
/** DB I/O port. The concrete store lives in the SDK/drizzle package. */
|
|
106
|
-
interface SyncStore {
|
|
106
|
+
export interface SyncStore {
|
|
107
107
|
/** Current mirror rows for a concept + role (including archived). */
|
|
108
108
|
listMirror(input: {
|
|
109
109
|
concept: string;
|
|
@@ -129,7 +129,7 @@ interface SyncStore {
|
|
|
129
129
|
/** Map host-side company refs → `crm_companies.id` (already-synced companies only). */
|
|
130
130
|
resolveCompanyRefs(refs: string[]): Promise<Map<string, string>>;
|
|
131
131
|
}
|
|
132
|
-
interface EntitySyncResult {
|
|
132
|
+
export interface EntitySyncResult {
|
|
133
133
|
archived: number;
|
|
134
134
|
concept: string;
|
|
135
135
|
created: number;
|
|
@@ -138,7 +138,7 @@ interface EntitySyncResult {
|
|
|
138
138
|
role: string;
|
|
139
139
|
updated: number;
|
|
140
140
|
}
|
|
141
|
-
interface SyncResult {
|
|
141
|
+
export interface SyncResult {
|
|
142
142
|
entities: EntitySyncResult[];
|
|
143
143
|
totals: {
|
|
144
144
|
created: number;
|
|
@@ -151,12 +151,12 @@ interface SyncResult {
|
|
|
151
151
|
* Run a full sync: compile the config's views, then reconcile + persist each,
|
|
152
152
|
* companies first. Returns per-entity and total action counts.
|
|
153
153
|
*/
|
|
154
|
-
declare function runSync(config: ClivlyEntitiesConfig, store: SyncStore, options?: CompileOptions): Promise<SyncResult>;
|
|
155
|
-
interface PreviewWarning {
|
|
154
|
+
export declare function runSync(config: ClivlyEntitiesConfig, store: SyncStore, options?: CompileOptions): Promise<SyncResult>;
|
|
155
|
+
export interface PreviewWarning {
|
|
156
156
|
field?: string;
|
|
157
157
|
message: string;
|
|
158
158
|
}
|
|
159
|
-
interface PreviewResult {
|
|
159
|
+
export interface PreviewResult {
|
|
160
160
|
rows: SourceRow[];
|
|
161
161
|
sampledCount: number;
|
|
162
162
|
warnings: PreviewWarning[];
|
|
@@ -167,7 +167,7 @@ interface PreviewResult {
|
|
|
167
167
|
* a required field empty in ≥1 row → `K/N` form; an optional field empty in
|
|
168
168
|
* ALL rows → all-empty form; zero source rows → a single table-level warning.
|
|
169
169
|
*/
|
|
170
|
-
declare function computeSampleWarnings(rows: SourceRow[], requiredFields: string[], sourceTable: string): PreviewWarning[];
|
|
170
|
+
export declare function computeSampleWarnings(rows: SourceRow[], requiredFields: string[], sourceTable: string): PreviewWarning[];
|
|
171
171
|
/**
|
|
172
172
|
* Zero-write preview: read ≤`limit` rows through the compiled view (a pure
|
|
173
173
|
* SELECT whose SQL already projects each row into its mapped fields) and
|
|
@@ -175,10 +175,9 @@ declare function computeSampleWarnings(rows: SourceRow[], requiredFields: string
|
|
|
175
175
|
* so it can never mutate the mirror. The distinct, write-one-row sibling is
|
|
176
176
|
* `runSync`'s sample mode (T13).
|
|
177
177
|
*/
|
|
178
|
-
declare function previewSync(store: SyncStore, view: CompiledView, opts: {
|
|
178
|
+
export declare function previewSync(store: SyncStore, view: CompiledView, opts: {
|
|
179
179
|
limit: number;
|
|
180
180
|
requiredFields: string[];
|
|
181
181
|
sourceTable: string;
|
|
182
182
|
}): Promise<PreviewResult>;
|
|
183
|
-
//#endregion
|
|
184
|
-
export { EntitySyncResult, MirrorRecord, PersistAction, PreviewResult, PreviewWarning, SourceRow, SyncAction, SyncResult, SyncStore, computeSampleWarnings, previewSync, reconcile, runSync };
|
|
183
|
+
//#endregion
|
package/dist/sync-engine.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ClivlyEntitiesConfig } from "./entity-config-
|
|
1
|
+
import { a as ClivlyEntitiesConfig } from "./entity-config-OhC4Otkz.mjs";
|
|
2
2
|
import { CompileOptions, CompiledView } from "./view-compiler.mjs";
|
|
3
3
|
//#region src/sync-engine.d.ts
|
|
4
4
|
/**
|
|
@@ -19,7 +19,7 @@ import { CompileOptions, CompiledView } from "./view-compiler.mjs";
|
|
|
19
19
|
* package provides the concrete store.
|
|
20
20
|
*/
|
|
21
21
|
/** A row read from a compiled view (what Postgres returns). */
|
|
22
|
-
interface SourceRow {
|
|
22
|
+
export interface SourceRow {
|
|
23
23
|
/** Host-side company key from `<relationship>_ref`; resolved before persist. */
|
|
24
24
|
companyRef?: string | null;
|
|
25
25
|
/** Mapped identity fields (clivly field → value). */
|
|
@@ -28,14 +28,14 @@ interface SourceRow {
|
|
|
28
28
|
sourceRef: string;
|
|
29
29
|
}
|
|
30
30
|
/** An existing mirror row, as far as reconciliation needs to know. */
|
|
31
|
-
interface MirrorRecord {
|
|
31
|
+
export interface MirrorRecord {
|
|
32
32
|
archivedAt: Date | null;
|
|
33
33
|
/** Host-side company key; only consulted in composite (join-table) mode. */
|
|
34
34
|
companyRef: string | null;
|
|
35
35
|
id: string;
|
|
36
36
|
sourceRef: string;
|
|
37
37
|
}
|
|
38
|
-
type SyncAction = {
|
|
38
|
+
export type SyncAction = {
|
|
39
39
|
kind: "create";
|
|
40
40
|
sourceRef: string;
|
|
41
41
|
fields: Record<string, string | null>;
|
|
@@ -58,7 +58,7 @@ type SyncAction = {
|
|
|
58
58
|
sourceRef: string;
|
|
59
59
|
};
|
|
60
60
|
/** A persist action with the company ref resolved to a `crm_companies.id`. */
|
|
61
|
-
type PersistAction = {
|
|
61
|
+
export type PersistAction = {
|
|
62
62
|
kind: "create";
|
|
63
63
|
sourceRef: string;
|
|
64
64
|
fields: Record<string, string | null>;
|
|
@@ -99,11 +99,11 @@ type PersistAction = {
|
|
|
99
99
|
* person in several companies materializes one mirror row per company and a
|
|
100
100
|
* single membership leaving archives only that one row.
|
|
101
101
|
*/
|
|
102
|
-
declare function reconcile(source: SourceRow[], mirror: MirrorRecord[], opts?: {
|
|
102
|
+
export declare function reconcile(source: SourceRow[], mirror: MirrorRecord[], opts?: {
|
|
103
103
|
composite?: boolean;
|
|
104
104
|
}): SyncAction[];
|
|
105
105
|
/** DB I/O port. The concrete store lives in the SDK/drizzle package. */
|
|
106
|
-
interface SyncStore {
|
|
106
|
+
export interface SyncStore {
|
|
107
107
|
/** Current mirror rows for a concept + role (including archived). */
|
|
108
108
|
listMirror(input: {
|
|
109
109
|
concept: string;
|
|
@@ -129,7 +129,7 @@ interface SyncStore {
|
|
|
129
129
|
/** Map host-side company refs → `crm_companies.id` (already-synced companies only). */
|
|
130
130
|
resolveCompanyRefs(refs: string[]): Promise<Map<string, string>>;
|
|
131
131
|
}
|
|
132
|
-
interface EntitySyncResult {
|
|
132
|
+
export interface EntitySyncResult {
|
|
133
133
|
archived: number;
|
|
134
134
|
concept: string;
|
|
135
135
|
created: number;
|
|
@@ -138,7 +138,7 @@ interface EntitySyncResult {
|
|
|
138
138
|
role: string;
|
|
139
139
|
updated: number;
|
|
140
140
|
}
|
|
141
|
-
interface SyncResult {
|
|
141
|
+
export interface SyncResult {
|
|
142
142
|
entities: EntitySyncResult[];
|
|
143
143
|
totals: {
|
|
144
144
|
created: number;
|
|
@@ -151,12 +151,12 @@ interface SyncResult {
|
|
|
151
151
|
* Run a full sync: compile the config's views, then reconcile + persist each,
|
|
152
152
|
* companies first. Returns per-entity and total action counts.
|
|
153
153
|
*/
|
|
154
|
-
declare function runSync(config: ClivlyEntitiesConfig, store: SyncStore, options?: CompileOptions): Promise<SyncResult>;
|
|
155
|
-
interface PreviewWarning {
|
|
154
|
+
export declare function runSync(config: ClivlyEntitiesConfig, store: SyncStore, options?: CompileOptions): Promise<SyncResult>;
|
|
155
|
+
export interface PreviewWarning {
|
|
156
156
|
field?: string;
|
|
157
157
|
message: string;
|
|
158
158
|
}
|
|
159
|
-
interface PreviewResult {
|
|
159
|
+
export interface PreviewResult {
|
|
160
160
|
rows: SourceRow[];
|
|
161
161
|
sampledCount: number;
|
|
162
162
|
warnings: PreviewWarning[];
|
|
@@ -167,7 +167,7 @@ interface PreviewResult {
|
|
|
167
167
|
* a required field empty in ≥1 row → `K/N` form; an optional field empty in
|
|
168
168
|
* ALL rows → all-empty form; zero source rows → a single table-level warning.
|
|
169
169
|
*/
|
|
170
|
-
declare function computeSampleWarnings(rows: SourceRow[], requiredFields: string[], sourceTable: string): PreviewWarning[];
|
|
170
|
+
export declare function computeSampleWarnings(rows: SourceRow[], requiredFields: string[], sourceTable: string): PreviewWarning[];
|
|
171
171
|
/**
|
|
172
172
|
* Zero-write preview: read ≤`limit` rows through the compiled view (a pure
|
|
173
173
|
* SELECT whose SQL already projects each row into its mapped fields) and
|
|
@@ -175,10 +175,9 @@ declare function computeSampleWarnings(rows: SourceRow[], requiredFields: string
|
|
|
175
175
|
* so it can never mutate the mirror. The distinct, write-one-row sibling is
|
|
176
176
|
* `runSync`'s sample mode (T13).
|
|
177
177
|
*/
|
|
178
|
-
declare function previewSync(store: SyncStore, view: CompiledView, opts: {
|
|
178
|
+
export declare function previewSync(store: SyncStore, view: CompiledView, opts: {
|
|
179
179
|
limit: number;
|
|
180
180
|
requiredFields: string[];
|
|
181
181
|
sourceTable: string;
|
|
182
182
|
}): Promise<PreviewResult>;
|
|
183
|
-
//#endregion
|
|
184
|
-
export { EntitySyncResult, MirrorRecord, PersistAction, PreviewResult, PreviewWarning, SourceRow, SyncAction, SyncResult, SyncStore, computeSampleWarnings, previewSync, reconcile, runSync };
|
|
183
|
+
//#endregion
|
package/dist/types.d.cts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
//#region src/types.d.ts
|
|
2
|
-
type ContactStatus = "lead" | "active" | "customer" | "churned";
|
|
3
|
-
type DealStage = string;
|
|
4
|
-
type StageType = "open" | "won" | "lost";
|
|
5
|
-
type PipelineKind = "standard" | "recurring";
|
|
6
|
-
type ValueInterval = "one_time" | "monthly" | "annual";
|
|
2
|
+
export type ContactStatus = "lead" | "active" | "customer" | "churned";
|
|
3
|
+
export type DealStage = string;
|
|
4
|
+
export type StageType = "open" | "won" | "lost";
|
|
5
|
+
export type PipelineKind = "standard" | "recurring";
|
|
6
|
+
export type ValueInterval = "one_time" | "monthly" | "annual";
|
|
7
7
|
/** Named once so SQL predicates and UI fallbacks cannot drift apart. */
|
|
8
|
-
declare const OPEN_STAGE_TYPE: "open";
|
|
8
|
+
export declare const OPEN_STAGE_TYPE: "open";
|
|
9
9
|
/** A closed deal is a historical fact: automation never reopens one. */
|
|
10
|
-
declare function isClosedStageType(type: StageType): boolean;
|
|
11
|
-
interface PipelineStageConfig {
|
|
10
|
+
export declare function isClosedStageType(type: StageType): boolean;
|
|
11
|
+
export interface PipelineStageConfig {
|
|
12
12
|
color: string | null;
|
|
13
13
|
id: string;
|
|
14
14
|
key: DealStage;
|
|
@@ -17,7 +17,7 @@ interface PipelineStageConfig {
|
|
|
17
17
|
type: StageType;
|
|
18
18
|
valueFixed: number | null;
|
|
19
19
|
}
|
|
20
|
-
interface PipelineConfig {
|
|
20
|
+
export interface PipelineConfig {
|
|
21
21
|
id: string;
|
|
22
22
|
isDefault: boolean;
|
|
23
23
|
kind: PipelineKind;
|
|
@@ -26,12 +26,12 @@ interface PipelineConfig {
|
|
|
26
26
|
sourceMappingId: string | null;
|
|
27
27
|
stages: PipelineStageConfig[];
|
|
28
28
|
}
|
|
29
|
-
type TaskStatus = "todo" | "in_progress" | "done" | "cancelled";
|
|
30
|
-
type TaskPriority = "low" | "medium" | "high";
|
|
31
|
-
type TaskEntityType = "contact" | "company" | "deal";
|
|
32
|
-
type ActivityType = "note" | "email" | "task" | "deal" | "call";
|
|
33
|
-
type CrmRole = "owner" | "admin" | "member" | "developer" | "support_agent";
|
|
34
|
-
interface Contact {
|
|
29
|
+
export type TaskStatus = "todo" | "in_progress" | "done" | "cancelled";
|
|
30
|
+
export type TaskPriority = "low" | "medium" | "high";
|
|
31
|
+
export type TaskEntityType = "contact" | "company" | "custom" | "deal";
|
|
32
|
+
export type ActivityType = "note" | "email" | "task" | "deal" | "call";
|
|
33
|
+
export type CrmRole = "owner" | "admin" | "member" | "developer" | "support_agent";
|
|
34
|
+
export interface Contact {
|
|
35
35
|
companyId: string | null;
|
|
36
36
|
createdAt: Date;
|
|
37
37
|
email: string;
|
|
@@ -40,19 +40,49 @@ interface Contact {
|
|
|
40
40
|
name: string;
|
|
41
41
|
orgId: string;
|
|
42
42
|
phone: string | null;
|
|
43
|
+
/**
|
|
44
|
+
* The host row this contact mirrors, or null when it was created in the CRM.
|
|
45
|
+
*
|
|
46
|
+
* Carried on the domain type because it decides whether a user may edit the
|
|
47
|
+
* identity fields: sync rewrites them from the host view on every run, so an
|
|
48
|
+
* edit to a sourced row would be silently reverted. See `host-owned-fields`.
|
|
49
|
+
*/
|
|
50
|
+
sourceRef: string | null;
|
|
43
51
|
status: ContactStatus;
|
|
44
52
|
title: string | null;
|
|
45
53
|
}
|
|
46
|
-
interface Company {
|
|
54
|
+
export interface Company {
|
|
55
|
+
/**
|
|
56
|
+
* How many non-archived contacts are attached to this company.
|
|
57
|
+
*
|
|
58
|
+
* Derived per read, never stored — distinct from {@link Company.size}, which
|
|
59
|
+
* is the mappable headcount of the business itself. A provider with 400 staff
|
|
60
|
+
* and 4 CRM contacts has `size: "400"` and `contactCount: 4`; conflating them
|
|
61
|
+
* would state a falsehood in the authoritative-looking direction.
|
|
62
|
+
*/
|
|
63
|
+
contactCount: number;
|
|
47
64
|
createdAt: Date;
|
|
48
65
|
domain: string | null;
|
|
66
|
+
email: string | null;
|
|
49
67
|
id: string;
|
|
50
68
|
industry: string | null;
|
|
51
69
|
name: string;
|
|
52
70
|
orgId: string;
|
|
71
|
+
phone: string | null;
|
|
72
|
+
/**
|
|
73
|
+
* The one contact to talk to at this company, if chosen.
|
|
74
|
+
*
|
|
75
|
+
* Constrained to a contact of this same company, and cleared when that
|
|
76
|
+
* contact is archived — so a non-null value always names someone live and
|
|
77
|
+
* attached here. Unlike the other fields it is never host-owned: it is a CRM
|
|
78
|
+
* judgement, so it stays editable on synced rows.
|
|
79
|
+
*/
|
|
80
|
+
primaryContactId: string | null;
|
|
53
81
|
size: string | null;
|
|
82
|
+
/** See {@link Contact.sourceRef}. */
|
|
83
|
+
sourceRef: string | null;
|
|
54
84
|
}
|
|
55
|
-
interface Deal {
|
|
85
|
+
export interface Deal {
|
|
56
86
|
closeDate: Date | null;
|
|
57
87
|
contactId: string | null;
|
|
58
88
|
createdAt: Date;
|
|
@@ -62,9 +92,23 @@ interface Deal {
|
|
|
62
92
|
owner: string | null;
|
|
63
93
|
position: number | null;
|
|
64
94
|
stage: DealStage;
|
|
95
|
+
/**
|
|
96
|
+
* When a human last moved this deal by hand. Non-null means stage derivation
|
|
97
|
+
* no longer touches it, so a board must be able to mark it as overridden and
|
|
98
|
+
* offer a way back — otherwise an overridden deal is indistinguishable from
|
|
99
|
+
* one the rules simply never matched.
|
|
100
|
+
*/
|
|
101
|
+
stageOverrideAt: Date | null;
|
|
65
102
|
value: number;
|
|
103
|
+
/**
|
|
104
|
+
* When a human last set this deal's value by hand. Non-null means value
|
|
105
|
+
* derivation no longer touches it. Mirrors {@link Deal.stageOverrideAt} — and
|
|
106
|
+
* needs the same visibility, since an honoured-but-invisible override reads
|
|
107
|
+
* as a stuck deal rather than a pinned one.
|
|
108
|
+
*/
|
|
109
|
+
valueOverrideAt: Date | null;
|
|
66
110
|
}
|
|
67
|
-
interface Task {
|
|
111
|
+
export interface Task {
|
|
68
112
|
archivedAt: Date | null;
|
|
69
113
|
assignee: string | null;
|
|
70
114
|
completedAt: Date | null;
|
|
@@ -81,7 +125,7 @@ interface Task {
|
|
|
81
125
|
status: TaskStatus;
|
|
82
126
|
title: string;
|
|
83
127
|
}
|
|
84
|
-
interface Note {
|
|
128
|
+
export interface Note {
|
|
85
129
|
archivedAt: Date | null;
|
|
86
130
|
author: string | null;
|
|
87
131
|
body: string;
|
|
@@ -96,7 +140,7 @@ interface Note {
|
|
|
96
140
|
title: string;
|
|
97
141
|
updatedAt: Date;
|
|
98
142
|
}
|
|
99
|
-
interface Activity {
|
|
143
|
+
export interface Activity {
|
|
100
144
|
actor: string | null;
|
|
101
145
|
contactId: string | null;
|
|
102
146
|
createdAt: Date;
|
|
@@ -105,7 +149,7 @@ interface Activity {
|
|
|
105
149
|
summary: string;
|
|
106
150
|
type: ActivityType;
|
|
107
151
|
}
|
|
108
|
-
interface CreateContactInput {
|
|
152
|
+
export interface CreateContactInput {
|
|
109
153
|
companyId?: string;
|
|
110
154
|
email: string;
|
|
111
155
|
name: string;
|
|
@@ -113,7 +157,7 @@ interface CreateContactInput {
|
|
|
113
157
|
status?: ContactStatus;
|
|
114
158
|
title?: string;
|
|
115
159
|
}
|
|
116
|
-
interface UpdateContactInput {
|
|
160
|
+
export interface UpdateContactInput {
|
|
117
161
|
companyId?: string | null;
|
|
118
162
|
email?: string;
|
|
119
163
|
name?: string;
|
|
@@ -121,13 +165,25 @@ interface UpdateContactInput {
|
|
|
121
165
|
status?: ContactStatus;
|
|
122
166
|
title?: string | null;
|
|
123
167
|
}
|
|
124
|
-
interface CreateCompanyInput {
|
|
168
|
+
export interface CreateCompanyInput {
|
|
125
169
|
domain?: string;
|
|
170
|
+
email?: string;
|
|
126
171
|
industry?: string;
|
|
127
172
|
name: string;
|
|
173
|
+
phone?: string;
|
|
128
174
|
size?: string;
|
|
129
175
|
}
|
|
130
|
-
interface
|
|
176
|
+
export interface UpdateCompanyInput {
|
|
177
|
+
domain?: string | null;
|
|
178
|
+
email?: string | null;
|
|
179
|
+
industry?: string | null;
|
|
180
|
+
name?: string;
|
|
181
|
+
phone?: string | null;
|
|
182
|
+
/** Null clears the point of contact; see {@link Company.primaryContactId}. */
|
|
183
|
+
primaryContactId?: string | null;
|
|
184
|
+
size?: string | null;
|
|
185
|
+
}
|
|
186
|
+
export interface CreateDealInput {
|
|
131
187
|
contactId?: string;
|
|
132
188
|
name: string;
|
|
133
189
|
owner?: string;
|
|
@@ -135,7 +191,7 @@ interface CreateDealInput {
|
|
|
135
191
|
stage?: DealStage;
|
|
136
192
|
value?: number;
|
|
137
193
|
}
|
|
138
|
-
interface UpdateDealInput {
|
|
194
|
+
export interface UpdateDealInput {
|
|
139
195
|
closeDate?: Date | null;
|
|
140
196
|
contactId?: string | null;
|
|
141
197
|
name?: string;
|
|
@@ -143,7 +199,7 @@ interface UpdateDealInput {
|
|
|
143
199
|
stage?: DealStage;
|
|
144
200
|
value?: number;
|
|
145
201
|
}
|
|
146
|
-
interface CreateTaskInput {
|
|
202
|
+
export interface CreateTaskInput {
|
|
147
203
|
assignee?: string;
|
|
148
204
|
createdBy?: string;
|
|
149
205
|
description?: string;
|
|
@@ -153,7 +209,7 @@ interface CreateTaskInput {
|
|
|
153
209
|
priority?: TaskPriority;
|
|
154
210
|
title: string;
|
|
155
211
|
}
|
|
156
|
-
interface UpdateTaskInput {
|
|
212
|
+
export interface UpdateTaskInput {
|
|
157
213
|
assignee?: string | null;
|
|
158
214
|
description?: string | null;
|
|
159
215
|
dueAt?: Date | null;
|
|
@@ -162,20 +218,64 @@ interface UpdateTaskInput {
|
|
|
162
218
|
priority?: TaskPriority;
|
|
163
219
|
title?: string;
|
|
164
220
|
}
|
|
165
|
-
interface CreateActivityInput {
|
|
221
|
+
export interface CreateActivityInput {
|
|
166
222
|
actor?: string;
|
|
167
223
|
contactId?: string;
|
|
168
224
|
summary: string;
|
|
169
225
|
type: ActivityType;
|
|
170
226
|
}
|
|
171
|
-
type RecordSource = "all" | "synced";
|
|
172
|
-
interface ContactFilters {
|
|
227
|
+
export type RecordSource = "all" | "synced";
|
|
228
|
+
export interface ContactFilters {
|
|
173
229
|
companyId?: string;
|
|
230
|
+
/**
|
|
231
|
+
* Exclude archived rows. Defaults to false — the adapter returns everything
|
|
232
|
+
* — because most callers are lookup maps, not user-facing lists:
|
|
233
|
+
* `importContacts` builds its dedup set from this (hiding archived rows
|
|
234
|
+
* would resurrect a contact the user archived as a duplicate) and
|
|
235
|
+
* `deals.list` builds its contact-name map from it (an archived contact on
|
|
236
|
+
* a live deal would render blank).
|
|
237
|
+
*
|
|
238
|
+
* The user-facing `contacts.list` / `companies.list` routes opt in, because
|
|
239
|
+
* there `archiveContact` is the delete affordance and a row still visible
|
|
240
|
+
* after archiving reads as a failed delete.
|
|
241
|
+
*
|
|
242
|
+
* Independent of `source`: `source: "synced"` already excludes archived
|
|
243
|
+
* rows, since sync archives a row when it leaves the host view and such a
|
|
244
|
+
* row is no longer sync-provenanced.
|
|
245
|
+
*/
|
|
246
|
+
excludeArchived?: boolean;
|
|
174
247
|
search?: string;
|
|
175
248
|
source?: RecordSource;
|
|
176
249
|
status?: ContactStatus;
|
|
177
250
|
}
|
|
178
|
-
|
|
251
|
+
/**
|
|
252
|
+
* One page of a keyset-paginated read.
|
|
253
|
+
*
|
|
254
|
+
* Keyset, not offset: `LIMIT/OFFSET` re-scans every skipped row, so page 200
|
|
255
|
+
* costs 200 pages of work, and a row inserted mid-listing shifts everything
|
|
256
|
+
* after it — the reader sees a record twice or never. A cursor anchored to
|
|
257
|
+
* `(createdAt, id)` is stable under concurrent writes and costs the same at
|
|
258
|
+
* page 1 and page 200.
|
|
259
|
+
*
|
|
260
|
+
* `audit.list` already does this; these types generalise its shape so the CRM
|
|
261
|
+
* lists cannot drift into a second convention.
|
|
262
|
+
*/
|
|
263
|
+
export interface PageRequest {
|
|
264
|
+
/** Opaque `${createdAtISO}|${id}`. Rows strictly older than this. */
|
|
265
|
+
cursor?: string;
|
|
266
|
+
limit?: number;
|
|
267
|
+
}
|
|
268
|
+
export interface Page<T> {
|
|
269
|
+
/** Null when this is the last page. */
|
|
270
|
+
nextCursor: string | null;
|
|
271
|
+
rows: T[];
|
|
272
|
+
}
|
|
273
|
+
export interface CompanyFilters {
|
|
274
|
+
/** See {@link ContactFilters.excludeArchived}. */
|
|
275
|
+
excludeArchived?: boolean;
|
|
276
|
+
source?: RecordSource;
|
|
277
|
+
}
|
|
278
|
+
export interface TaskFilters {
|
|
179
279
|
assignee?: string;
|
|
180
280
|
entityId?: string;
|
|
181
281
|
entityType?: TaskEntityType;
|
|
@@ -184,5 +284,4 @@ interface TaskFilters {
|
|
|
184
284
|
priority?: TaskPriority;
|
|
185
285
|
status?: TaskStatus;
|
|
186
286
|
}
|
|
187
|
-
//#endregion
|
|
188
|
-
export { Activity, ActivityType, Company, Contact, ContactFilters, ContactStatus, CreateActivityInput, CreateCompanyInput, CreateContactInput, CreateDealInput, CreateTaskInput, CrmRole, Deal, DealStage, Note, OPEN_STAGE_TYPE, PipelineConfig, PipelineKind, PipelineStageConfig, RecordSource, StageType, Task, TaskEntityType, TaskFilters, TaskPriority, TaskStatus, UpdateContactInput, UpdateDealInput, UpdateTaskInput, ValueInterval, isClosedStageType };
|
|
287
|
+
//#endregion
|