@contractspec/example.integration-hub 3.8.9 → 3.8.10

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 (89) hide show
  1. package/dist/connection/connection.enum.js +1 -29
  2. package/dist/connection/connection.operation.js +1 -124
  3. package/dist/connection/connection.presentation.js +1 -125
  4. package/dist/connection/connection.schema.js +1 -71
  5. package/dist/connection/index.js +1 -127
  6. package/dist/docs/index.js +5 -49
  7. package/dist/docs/integration-hub.docblock.js +5 -49
  8. package/dist/events.js +1 -211
  9. package/dist/example.js +1 -42
  10. package/dist/handlers/index.js +5 -292
  11. package/dist/handlers/integration.handlers.js +5 -292
  12. package/dist/index.js +8 -2355
  13. package/dist/integration/index.js +1 -92
  14. package/dist/integration/integration.enum.js +1 -12
  15. package/dist/integration/integration.operations.js +1 -89
  16. package/dist/integration/integration.presentation.js +1 -120
  17. package/dist/integration/integration.schema.js +1 -42
  18. package/dist/integration-hub.capability.js +1 -43
  19. package/dist/integration-hub.feature.js +1 -330
  20. package/dist/mcp-example.js +1 -154
  21. package/dist/node/connection/connection.enum.js +1 -29
  22. package/dist/node/connection/connection.operation.js +1 -124
  23. package/dist/node/connection/connection.presentation.js +1 -125
  24. package/dist/node/connection/connection.schema.js +1 -71
  25. package/dist/node/connection/index.js +1 -127
  26. package/dist/node/docs/index.js +5 -49
  27. package/dist/node/docs/integration-hub.docblock.js +5 -49
  28. package/dist/node/events.js +1 -211
  29. package/dist/node/example.js +1 -42
  30. package/dist/node/handlers/index.js +5 -292
  31. package/dist/node/handlers/integration.handlers.js +5 -292
  32. package/dist/node/index.js +8 -2355
  33. package/dist/node/integration/index.js +1 -92
  34. package/dist/node/integration/integration.enum.js +1 -12
  35. package/dist/node/integration/integration.operations.js +1 -89
  36. package/dist/node/integration/integration.presentation.js +1 -120
  37. package/dist/node/integration/integration.schema.js +1 -42
  38. package/dist/node/integration-hub.capability.js +1 -43
  39. package/dist/node/integration-hub.feature.js +1 -330
  40. package/dist/node/mcp-example.js +1 -154
  41. package/dist/node/run-mcp.js +1 -159
  42. package/dist/node/seeders/index.js +6 -60
  43. package/dist/node/sync/index.js +1 -332
  44. package/dist/node/sync/sync.enum.js +1 -26
  45. package/dist/node/sync/sync.operations.js +1 -321
  46. package/dist/node/sync/sync.presentation.js +1 -301
  47. package/dist/node/sync/sync.schema.js +1 -154
  48. package/dist/node/sync-engine/index.js +1 -186
  49. package/dist/node/tests/operations.test-spec.js +1 -85
  50. package/dist/node/ui/IntegrationDashboard.js +1 -886
  51. package/dist/node/ui/IntegrationDashboard.visualizations.js +1 -250
  52. package/dist/node/ui/IntegrationHubChat.js +1 -34
  53. package/dist/node/ui/hooks/index.js +1 -57
  54. package/dist/node/ui/hooks/useIntegrationData.js +1 -54
  55. package/dist/node/ui/index.js +4 -1173
  56. package/dist/node/ui/renderers/index.js +4 -484
  57. package/dist/node/ui/renderers/integration.markdown.js +4 -484
  58. package/dist/node/ui/tables/ConnectionsTable.js +1 -211
  59. package/dist/node/ui/tables/IntegrationTables.js +1 -361
  60. package/dist/node/ui/tables/SyncConfigsTable.js +1 -230
  61. package/dist/node/ui/tables/integration-table.shared.js +1 -84
  62. package/dist/node/visualizations/catalog.js +1 -137
  63. package/dist/node/visualizations/index.js +1 -211
  64. package/dist/node/visualizations/selectors.js +1 -204
  65. package/dist/run-mcp.js +1 -159
  66. package/dist/seeders/index.js +6 -60
  67. package/dist/sync/index.js +1 -332
  68. package/dist/sync/sync.enum.js +1 -26
  69. package/dist/sync/sync.operations.js +1 -321
  70. package/dist/sync/sync.presentation.js +1 -301
  71. package/dist/sync/sync.schema.js +1 -154
  72. package/dist/sync-engine/index.js +1 -186
  73. package/dist/tests/operations.test-spec.js +1 -85
  74. package/dist/ui/IntegrationDashboard.js +1 -886
  75. package/dist/ui/IntegrationDashboard.visualizations.js +1 -250
  76. package/dist/ui/IntegrationHubChat.js +1 -34
  77. package/dist/ui/hooks/index.js +1 -57
  78. package/dist/ui/hooks/useIntegrationData.js +1 -54
  79. package/dist/ui/index.js +4 -1173
  80. package/dist/ui/renderers/index.js +4 -484
  81. package/dist/ui/renderers/integration.markdown.js +4 -484
  82. package/dist/ui/tables/ConnectionsTable.js +1 -211
  83. package/dist/ui/tables/IntegrationTables.js +1 -361
  84. package/dist/ui/tables/SyncConfigsTable.js +1 -230
  85. package/dist/ui/tables/integration-table.shared.js +1 -84
  86. package/dist/visualizations/catalog.js +1 -137
  87. package/dist/visualizations/index.js +1 -211
  88. package/dist/visualizations/selectors.js +1 -204
  89. package/package.json +11 -11
@@ -1,154 +1 @@
1
- // src/sync/sync.enum.ts
2
- import { defineEnum } from "@contractspec/lib.schema";
3
- var SyncDirectionEnum = defineEnum("SyncDirection", [
4
- "INBOUND",
5
- "OUTBOUND",
6
- "BIDIRECTIONAL"
7
- ]);
8
- var SyncStatusEnum = defineEnum("SyncStatus", [
9
- "PENDING",
10
- "RUNNING",
11
- "COMPLETED",
12
- "FAILED",
13
- "CANCELLED"
14
- ]);
15
- var MappingTypeEnum = defineEnum("MappingType", [
16
- "DIRECT",
17
- "TRANSFORM",
18
- "LOOKUP",
19
- "CONSTANT",
20
- "COMPUTED"
21
- ]);
22
-
23
- // src/sync/sync.schema.ts
24
- import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
25
- var FieldMappingModel = defineSchemaModel({
26
- name: "FieldMappingModel",
27
- fields: {
28
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
29
- sourceField: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
30
- targetField: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
31
- mappingType: { type: MappingTypeEnum, isOptional: false },
32
- transformExpression: {
33
- type: ScalarTypeEnum.String_unsecure(),
34
- isOptional: true
35
- },
36
- isRequired: { type: ScalarTypeEnum.Boolean(), isOptional: false }
37
- }
38
- });
39
- var SyncConfigModel = defineSchemaModel({
40
- name: "SyncConfigModel",
41
- fields: {
42
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
43
- integrationId: {
44
- type: ScalarTypeEnum.String_unsecure(),
45
- isOptional: false
46
- },
47
- connectionId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
48
- name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
49
- direction: { type: SyncDirectionEnum, isOptional: false },
50
- sourceObject: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
51
- targetObject: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
52
- scheduleEnabled: { type: ScalarTypeEnum.Boolean(), isOptional: false },
53
- scheduleCron: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
54
- isActive: { type: ScalarTypeEnum.Boolean(), isOptional: false },
55
- lastSyncAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
56
- fieldMappings: { type: FieldMappingModel, isArray: true, isOptional: true }
57
- }
58
- });
59
- var SyncRunModel = defineSchemaModel({
60
- name: "SyncRunModel",
61
- fields: {
62
- id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
63
- syncConfigId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
64
- status: { type: SyncStatusEnum, isOptional: false },
65
- direction: { type: SyncDirectionEnum, isOptional: false },
66
- trigger: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
67
- recordsProcessed: {
68
- type: ScalarTypeEnum.Int_unsecure(),
69
- isOptional: false
70
- },
71
- recordsCreated: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
72
- recordsUpdated: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
73
- recordsFailed: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },
74
- errorMessage: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
75
- startedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
76
- completedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
77
- createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false }
78
- }
79
- });
80
- var CreateSyncConfigInputModel = defineSchemaModel({
81
- name: "CreateSyncConfigInput",
82
- fields: {
83
- integrationId: {
84
- type: ScalarTypeEnum.String_unsecure(),
85
- isOptional: false
86
- },
87
- connectionId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
88
- name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
89
- direction: { type: SyncDirectionEnum, isOptional: false },
90
- sourceObject: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
91
- targetObject: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
92
- scheduleEnabled: { type: ScalarTypeEnum.Boolean(), isOptional: true },
93
- scheduleCron: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
94
- }
95
- });
96
- var AddFieldMappingInputModel = defineSchemaModel({
97
- name: "AddFieldMappingInput",
98
- fields: {
99
- syncConfigId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
100
- sourceField: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
101
- targetField: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
102
- mappingType: { type: MappingTypeEnum, isOptional: false },
103
- transformExpression: {
104
- type: ScalarTypeEnum.String_unsecure(),
105
- isOptional: true
106
- },
107
- lookupConfig: { type: ScalarTypeEnum.JSON(), isOptional: true },
108
- constantValue: { type: ScalarTypeEnum.JSON(), isOptional: true },
109
- isRequired: { type: ScalarTypeEnum.Boolean(), isOptional: true },
110
- defaultValue: { type: ScalarTypeEnum.JSON(), isOptional: true }
111
- }
112
- });
113
- var TriggerSyncInputModel = defineSchemaModel({
114
- name: "TriggerSyncInput",
115
- fields: {
116
- syncConfigId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
117
- direction: { type: SyncDirectionEnum, isOptional: true },
118
- fullSync: { type: ScalarTypeEnum.Boolean(), isOptional: true }
119
- }
120
- });
121
- var ListSyncRunsInputModel = defineSchemaModel({
122
- name: "ListSyncRunsInput",
123
- fields: {
124
- syncConfigId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
125
- status: { type: SyncStatusEnum, isOptional: true },
126
- limit: {
127
- type: ScalarTypeEnum.Int_unsecure(),
128
- isOptional: true,
129
- defaultValue: 20
130
- },
131
- offset: {
132
- type: ScalarTypeEnum.Int_unsecure(),
133
- isOptional: true,
134
- defaultValue: 0
135
- }
136
- }
137
- });
138
- var ListSyncRunsOutputModel = defineSchemaModel({
139
- name: "ListSyncRunsOutput",
140
- fields: {
141
- runs: { type: SyncRunModel, isArray: true, isOptional: false },
142
- total: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false }
143
- }
144
- });
145
- export {
146
- TriggerSyncInputModel,
147
- SyncRunModel,
148
- SyncConfigModel,
149
- ListSyncRunsOutputModel,
150
- ListSyncRunsInputModel,
151
- FieldMappingModel,
152
- CreateSyncConfigInputModel,
153
- AddFieldMappingInputModel
154
- };
1
+ import{defineEnum as C}from"@contractspec/lib.schema";var I=C("SyncDirection",["INBOUND","OUTBOUND","BIDIRECTIONAL"]),D=C("SyncStatus",["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED"]),L=C("MappingType",["DIRECT","TRANSFORM","LOOKUP","CONSTANT","COMPUTED"]);import{defineSchemaModel as O,ScalarTypeEnum as N}from"@contractspec/lib.schema";var U=O({name:"FieldMappingModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},sourceField:{type:N.String_unsecure(),isOptional:!1},targetField:{type:N.String_unsecure(),isOptional:!1},mappingType:{type:L,isOptional:!1},transformExpression:{type:N.String_unsecure(),isOptional:!0},isRequired:{type:N.Boolean(),isOptional:!1}}}),G=O({name:"SyncConfigModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},integrationId:{type:N.String_unsecure(),isOptional:!1},connectionId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.String_unsecure(),isOptional:!1},direction:{type:I,isOptional:!1},sourceObject:{type:N.String_unsecure(),isOptional:!1},targetObject:{type:N.String_unsecure(),isOptional:!1},scheduleEnabled:{type:N.Boolean(),isOptional:!1},scheduleCron:{type:N.String_unsecure(),isOptional:!0},isActive:{type:N.Boolean(),isOptional:!1},lastSyncAt:{type:N.DateTime(),isOptional:!0},fieldMappings:{type:U,isArray:!0,isOptional:!0}}}),A=O({name:"SyncRunModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},syncConfigId:{type:N.String_unsecure(),isOptional:!1},status:{type:D,isOptional:!1},direction:{type:I,isOptional:!1},trigger:{type:N.String_unsecure(),isOptional:!1},recordsProcessed:{type:N.Int_unsecure(),isOptional:!1},recordsCreated:{type:N.Int_unsecure(),isOptional:!1},recordsUpdated:{type:N.Int_unsecure(),isOptional:!1},recordsFailed:{type:N.Int_unsecure(),isOptional:!1},errorMessage:{type:N.String_unsecure(),isOptional:!0},startedAt:{type:N.DateTime(),isOptional:!0},completedAt:{type:N.DateTime(),isOptional:!0},createdAt:{type:N.DateTime(),isOptional:!1}}}),F=O({name:"CreateSyncConfigInput",fields:{integrationId:{type:N.String_unsecure(),isOptional:!1},connectionId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.NonEmptyString(),isOptional:!1},direction:{type:I,isOptional:!1},sourceObject:{type:N.NonEmptyString(),isOptional:!1},targetObject:{type:N.NonEmptyString(),isOptional:!1},scheduleEnabled:{type:N.Boolean(),isOptional:!0},scheduleCron:{type:N.String_unsecure(),isOptional:!0}}}),K=O({name:"AddFieldMappingInput",fields:{syncConfigId:{type:N.String_unsecure(),isOptional:!1},sourceField:{type:N.NonEmptyString(),isOptional:!1},targetField:{type:N.NonEmptyString(),isOptional:!1},mappingType:{type:L,isOptional:!1},transformExpression:{type:N.String_unsecure(),isOptional:!0},lookupConfig:{type:N.JSON(),isOptional:!0},constantValue:{type:N.JSON(),isOptional:!0},isRequired:{type:N.Boolean(),isOptional:!0},defaultValue:{type:N.JSON(),isOptional:!0}}}),j=O({name:"TriggerSyncInput",fields:{syncConfigId:{type:N.String_unsecure(),isOptional:!1},direction:{type:I,isOptional:!0},fullSync:{type:N.Boolean(),isOptional:!0}}}),k=O({name:"ListSyncRunsInput",fields:{syncConfigId:{type:N.String_unsecure(),isOptional:!1},status:{type:D,isOptional:!0},limit:{type:N.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:N.Int_unsecure(),isOptional:!0,defaultValue:0}}}),q=O({name:"ListSyncRunsOutput",fields:{runs:{type:A,isArray:!0,isOptional:!1},total:{type:N.Int_unsecure(),isOptional:!1}}});export{j as TriggerSyncInputModel,A as SyncRunModel,G as SyncConfigModel,q as ListSyncRunsOutputModel,k as ListSyncRunsInputModel,U as FieldMappingModel,F as CreateSyncConfigInputModel,K as AddFieldMappingInputModel};
@@ -1,186 +1 @@
1
- // src/sync-engine/index.ts
2
- class BasicFieldTransformer {
3
- transform(value, expression) {
4
- try {
5
- if (expression.startsWith("uppercase")) {
6
- return typeof value === "string" ? value.toUpperCase() : value;
7
- }
8
- if (expression.startsWith("lowercase")) {
9
- return typeof value === "string" ? value.toLowerCase() : value;
10
- }
11
- if (expression.startsWith("trim")) {
12
- return typeof value === "string" ? value.trim() : value;
13
- }
14
- if (expression.startsWith("default:")) {
15
- const defaultVal = expression.replace("default:", "");
16
- return value ?? JSON.parse(defaultVal);
17
- }
18
- if (expression.startsWith("concat:")) {
19
- const separator = expression.replace("concat:", "") || " ";
20
- if (Array.isArray(value)) {
21
- return value.join(separator);
22
- }
23
- return value;
24
- }
25
- if (expression.startsWith("split:")) {
26
- const separator = expression.replace("split:", "") || ",";
27
- if (typeof value === "string") {
28
- return value.split(separator);
29
- }
30
- return value;
31
- }
32
- if (expression.startsWith("number")) {
33
- return Number(value);
34
- }
35
- if (expression.startsWith("boolean")) {
36
- return Boolean(value);
37
- }
38
- if (expression.startsWith("string")) {
39
- return String(value);
40
- }
41
- return value;
42
- } catch {
43
- return value;
44
- }
45
- }
46
- }
47
-
48
- class BasicSyncEngine {
49
- transformer;
50
- constructor(transformer) {
51
- this.transformer = transformer ?? new BasicFieldTransformer;
52
- }
53
- async sync(_context) {
54
- const result = {
55
- success: true,
56
- recordsProcessed: 0,
57
- recordsCreated: 0,
58
- recordsUpdated: 0,
59
- recordsDeleted: 0,
60
- recordsFailed: 0,
61
- recordsSkipped: 0,
62
- errors: []
63
- };
64
- return result;
65
- }
66
- transformRecord(sourceRecord, mappings, _context) {
67
- const targetData = {};
68
- for (const mapping of mappings) {
69
- let value;
70
- let sourceValue;
71
- switch (mapping.mappingType) {
72
- case "DIRECT":
73
- value = this.getNestedValue(sourceRecord.data, mapping.sourceField);
74
- break;
75
- case "TRANSFORM":
76
- sourceValue = this.getNestedValue(sourceRecord.data, mapping.sourceField);
77
- value = mapping.transformExpression ? this.transformer.transform(sourceValue, mapping.transformExpression) : sourceValue;
78
- break;
79
- case "CONSTANT":
80
- value = mapping.constantValue;
81
- break;
82
- case "LOOKUP":
83
- value = this.getNestedValue(sourceRecord.data, mapping.sourceField);
84
- break;
85
- case "COMPUTED":
86
- value = mapping.transformExpression ? this.evaluateComputed(sourceRecord.data, mapping.transformExpression) : null;
87
- break;
88
- default:
89
- value = this.getNestedValue(sourceRecord.data, mapping.sourceField);
90
- }
91
- if (value === undefined || value === null) {
92
- value = mapping.defaultValue;
93
- }
94
- this.setNestedValue(targetData, mapping.targetField, value);
95
- }
96
- return {
97
- id: sourceRecord.id,
98
- data: targetData
99
- };
100
- }
101
- validateRecord(record, mappings) {
102
- const errors = [];
103
- for (const mapping of mappings) {
104
- if (mapping.isRequired) {
105
- const value = this.getNestedValue(record.data, mapping.targetField);
106
- if (value === undefined || value === null) {
107
- errors.push({
108
- recordId: record.id,
109
- field: mapping.targetField,
110
- message: `Required field ${mapping.targetField} is missing`,
111
- code: "REQUIRED_FIELD_MISSING"
112
- });
113
- }
114
- }
115
- }
116
- return {
117
- valid: errors.length === 0,
118
- errors
119
- };
120
- }
121
- getNestedValue(obj, path) {
122
- const parts = path.split(".");
123
- let current = obj;
124
- for (const part of parts) {
125
- if (current === null || current === undefined) {
126
- return;
127
- }
128
- current = current[part];
129
- }
130
- return current;
131
- }
132
- setNestedValue(obj, path, value) {
133
- const parts = path.split(".");
134
- let current = obj;
135
- for (let i = 0;i < parts.length - 1; i++) {
136
- const part = parts[i];
137
- if (part === undefined)
138
- continue;
139
- if (!(part in current)) {
140
- current[part] = {};
141
- }
142
- current = current[part];
143
- }
144
- const lastPart = parts[parts.length - 1];
145
- if (lastPart !== undefined) {
146
- current[lastPart] = value;
147
- }
148
- }
149
- evaluateComputed(data, expression) {
150
- try {
151
- const result = expression.replace(/\$\{([^}]+)\}/g, (_, path) => {
152
- const value = this.getNestedValue(data, path);
153
- return String(value ?? "");
154
- });
155
- return result;
156
- } catch {
157
- return null;
158
- }
159
- }
160
- }
161
- function createSyncEngine(transformer) {
162
- return new BasicSyncEngine(transformer);
163
- }
164
- function computeChecksum(data) {
165
- const str = JSON.stringify(data, Object.keys(data).sort());
166
- let hash = 0;
167
- for (let i = 0;i < str.length; i++) {
168
- const char = str.charCodeAt(i);
169
- hash = (hash << 5) - hash + char;
170
- hash = hash & hash;
171
- }
172
- return hash.toString(16);
173
- }
174
- function hasChanges(sourceChecksum, targetChecksum) {
175
- if (!sourceChecksum || !targetChecksum) {
176
- return true;
177
- }
178
- return sourceChecksum !== targetChecksum;
179
- }
180
- export {
181
- hasChanges,
182
- createSyncEngine,
183
- computeChecksum,
184
- BasicSyncEngine,
185
- BasicFieldTransformer
186
- };
1
+ class L{transform(q,w){try{if(w.startsWith("uppercase"))return typeof q==="string"?q.toUpperCase():q;if(w.startsWith("lowercase"))return typeof q==="string"?q.toLowerCase():q;if(w.startsWith("trim"))return typeof q==="string"?q.trim():q;if(w.startsWith("default:")){let A=w.replace("default:","");return q??JSON.parse(A)}if(w.startsWith("concat:")){let A=w.replace("concat:","")||" ";if(Array.isArray(q))return q.join(A);return q}if(w.startsWith("split:")){let A=w.replace("split:","")||",";if(typeof q==="string")return q.split(A);return q}if(w.startsWith("number"))return Number(q);if(w.startsWith("boolean"))return Boolean(q);if(w.startsWith("string"))return String(q);return q}catch{return q}}}class M{transformer;constructor(q){this.transformer=q??new L}async sync(q){return{success:!0,recordsProcessed:0,recordsCreated:0,recordsUpdated:0,recordsDeleted:0,recordsFailed:0,recordsSkipped:0,errors:[]}}transformRecord(q,w,A){let G={};for(let z of w){let H,J;switch(z.mappingType){case"DIRECT":H=this.getNestedValue(q.data,z.sourceField);break;case"TRANSFORM":J=this.getNestedValue(q.data,z.sourceField),H=z.transformExpression?this.transformer.transform(J,z.transformExpression):J;break;case"CONSTANT":H=z.constantValue;break;case"LOOKUP":H=this.getNestedValue(q.data,z.sourceField);break;case"COMPUTED":H=z.transformExpression?this.evaluateComputed(q.data,z.transformExpression):null;break;default:H=this.getNestedValue(q.data,z.sourceField)}if(H===void 0||H===null)H=z.defaultValue;this.setNestedValue(G,z.targetField,H)}return{id:q.id,data:G}}validateRecord(q,w){let A=[];for(let G of w)if(G.isRequired){let z=this.getNestedValue(q.data,G.targetField);if(z===void 0||z===null)A.push({recordId:q.id,field:G.targetField,message:`Required field ${G.targetField} is missing`,code:"REQUIRED_FIELD_MISSING"})}return{valid:A.length===0,errors:A}}getNestedValue(q,w){let A=w.split("."),G=q;for(let z of A){if(G===null||G===void 0)return;G=G[z]}return G}setNestedValue(q,w,A){let G=w.split("."),z=q;for(let J=0;J<G.length-1;J++){let K=G[J];if(K===void 0)continue;if(!(K in z))z[K]={};z=z[K]}let H=G[G.length-1];if(H!==void 0)z[H]=A}evaluateComputed(q,w){try{return w.replace(/\$\{([^}]+)\}/g,(G,z)=>{let H=this.getNestedValue(q,z);return String(H??"")})}catch{return null}}}function N(q){return new M(q)}function O(q){let w=JSON.stringify(q,Object.keys(q).sort()),A=0;for(let G=0;G<w.length;G++){let z=w.charCodeAt(G);A=(A<<5)-A+z,A=A&A}return A.toString(16)}function Q(q,w){if(!q||!w)return!0;return q!==w}export{Q as hasChanges,N as createSyncEngine,O as computeChecksum,M as BasicSyncEngine,L as BasicFieldTransformer};
@@ -1,85 +1 @@
1
- // src/tests/operations.test-spec.ts
2
- import { defineTestSpec } from "@contractspec/lib.contracts-spec/tests";
3
- var SyncConfigCreateTest = defineTestSpec({
4
- meta: {
5
- key: "integration.syncConfig.create.test",
6
- version: "1.0.0",
7
- stability: "experimental",
8
- owners: ["@example.integration-hub"],
9
- description: "Test for creating sync config",
10
- tags: ["test"]
11
- },
12
- target: {
13
- type: "operation",
14
- operation: { key: "integration.syncConfig.create", version: "1.0.0" }
15
- },
16
- scenarios: [
17
- {
18
- key: "success",
19
- when: { operation: { key: "integration.syncConfig.create" } },
20
- then: [{ type: "expectOutput", match: {} }]
21
- },
22
- {
23
- key: "error",
24
- when: { operation: { key: "integration.syncConfig.create" } },
25
- then: [{ type: "expectError" }]
26
- }
27
- ]
28
- });
29
- var FieldMappingAddTest = defineTestSpec({
30
- meta: {
31
- key: "integration.fieldMapping.add.test",
32
- version: "1.0.0",
33
- stability: "experimental",
34
- owners: ["@example.integration-hub"],
35
- description: "Test for adding field mapping",
36
- tags: ["test"]
37
- },
38
- target: {
39
- type: "operation",
40
- operation: { key: "integration.fieldMapping.add", version: "1.0.0" }
41
- },
42
- scenarios: [
43
- {
44
- key: "success",
45
- when: { operation: { key: "integration.fieldMapping.add" } },
46
- then: [{ type: "expectOutput", match: {} }]
47
- },
48
- {
49
- key: "error",
50
- when: { operation: { key: "integration.fieldMapping.add" } },
51
- then: [{ type: "expectError" }]
52
- }
53
- ]
54
- });
55
- var SyncRunListTest = defineTestSpec({
56
- meta: {
57
- key: "integration.syncRun.list.test",
58
- version: "1.0.0",
59
- stability: "experimental",
60
- owners: ["@example.integration-hub"],
61
- description: "Test for listing sync runs",
62
- tags: ["test"]
63
- },
64
- target: {
65
- type: "operation",
66
- operation: { key: "integration.syncRun.list", version: "1.0.0" }
67
- },
68
- scenarios: [
69
- {
70
- key: "success",
71
- when: { operation: { key: "integration.syncRun.list" } },
72
- then: [{ type: "expectOutput", match: {} }]
73
- },
74
- {
75
- key: "error",
76
- when: { operation: { key: "integration.syncRun.list" } },
77
- then: [{ type: "expectError" }]
78
- }
79
- ]
80
- });
81
- export {
82
- SyncRunListTest,
83
- SyncConfigCreateTest,
84
- FieldMappingAddTest
85
- };
1
+ import{defineTestSpec as g}from"@contractspec/lib.contracts-spec/tests";var j=g({meta:{key:"integration.syncConfig.create.test",version:"1.0.0",stability:"experimental",owners:["@example.integration-hub"],description:"Test for creating sync config",tags:["test"]},target:{type:"operation",operation:{key:"integration.syncConfig.create",version:"1.0.0"}},scenarios:[{key:"success",when:{operation:{key:"integration.syncConfig.create"}},then:[{type:"expectOutput",match:{}}]},{key:"error",when:{operation:{key:"integration.syncConfig.create"}},then:[{type:"expectError"}]}]}),k=g({meta:{key:"integration.fieldMapping.add.test",version:"1.0.0",stability:"experimental",owners:["@example.integration-hub"],description:"Test for adding field mapping",tags:["test"]},target:{type:"operation",operation:{key:"integration.fieldMapping.add",version:"1.0.0"}},scenarios:[{key:"success",when:{operation:{key:"integration.fieldMapping.add"}},then:[{type:"expectOutput",match:{}}]},{key:"error",when:{operation:{key:"integration.fieldMapping.add"}},then:[{type:"expectError"}]}]}),m=g({meta:{key:"integration.syncRun.list.test",version:"1.0.0",stability:"experimental",owners:["@example.integration-hub"],description:"Test for listing sync runs",tags:["test"]},target:{type:"operation",operation:{key:"integration.syncRun.list",version:"1.0.0"}},scenarios:[{key:"success",when:{operation:{key:"integration.syncRun.list"}},then:[{type:"expectOutput",match:{}}]},{key:"error",when:{operation:{key:"integration.syncRun.list"}},then:[{type:"expectError"}]}]});export{m as SyncRunListTest,j as SyncConfigCreateTest,k as FieldMappingAddTest};