@lssm/example.integration-hub 0.0.0-canary-20251219202229 → 0.0.0-canary-20251220002821

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 (69) hide show
  1. package/README.md +1 -0
  2. package/dist/connection/connection.schema.d.ts +16 -16
  3. package/dist/integration/integration.contracts.d.ts +24 -24
  4. package/dist/integration/integration.schema.d.ts +16 -16
  5. package/dist/libs/contracts/dist/capabilities/openbanking.js.map +1 -1
  6. package/dist/libs/contracts/dist/contract-registry/schemas.js.map +1 -1
  7. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js.map +1 -1
  8. package/dist/libs/contracts/dist/docs/meta.docs.js.map +1 -1
  9. package/dist/libs/contracts/dist/docs/presentations.js.map +1 -1
  10. package/dist/libs/contracts/dist/docs/registry.js.map +1 -1
  11. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js.map +1 -1
  12. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js.map +1 -1
  13. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js.map +1 -1
  14. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -1
  15. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js.map +1 -1
  16. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js.map +1 -1
  17. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js.map +1 -1
  18. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js.map +1 -1
  19. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js.map +1 -1
  20. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js.map +1 -1
  21. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js.map +1 -1
  22. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js.map +1 -1
  23. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js.map +1 -1
  24. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js.map +1 -1
  25. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js.map +1 -1
  26. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js.map +1 -1
  27. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js.map +1 -1
  28. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js.map +1 -1
  29. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js.map +1 -1
  30. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js.map +1 -1
  31. package/dist/libs/contracts/dist/docs/tech-contracts.docs.js.map +1 -1
  32. package/dist/libs/contracts/dist/events.js.map +1 -1
  33. package/dist/libs/contracts/dist/integrations/contracts.js.map +1 -1
  34. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js.map +1 -1
  35. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js.map +1 -1
  36. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js.map +1 -1
  37. package/dist/libs/contracts/dist/integrations/openbanking/models.js.map +1 -1
  38. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js.map +1 -1
  39. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js.map +1 -1
  40. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js.map +1 -1
  41. package/dist/libs/contracts/dist/integrations/providers/gmail.js.map +1 -1
  42. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js.map +1 -1
  43. package/dist/libs/contracts/dist/integrations/providers/mistral.js.map +1 -1
  44. package/dist/libs/contracts/dist/integrations/providers/postmark.js.map +1 -1
  45. package/dist/libs/contracts/dist/integrations/providers/powens.js.map +1 -1
  46. package/dist/libs/contracts/dist/integrations/providers/qdrant.js.map +1 -1
  47. package/dist/libs/contracts/dist/integrations/providers/stripe.js.map +1 -1
  48. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js.map +1 -1
  49. package/dist/libs/contracts/dist/knowledge/contracts.js.map +1 -1
  50. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js.map +1 -1
  51. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js.map +1 -1
  52. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js.map +1 -1
  53. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js.map +1 -1
  54. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js.map +1 -1
  55. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js.map +1 -1
  56. package/dist/libs/contracts/dist/llm/exporters.js.map +1 -1
  57. package/dist/libs/contracts/dist/onboarding-base.js.map +1 -1
  58. package/dist/libs/contracts/dist/ownership.js.map +1 -1
  59. package/dist/libs/contracts/dist/presentations.v2.js.map +1 -1
  60. package/dist/libs/contracts/dist/regenerator/service.js.map +1 -1
  61. package/dist/libs/contracts/dist/schema/dist/index.js.map +1 -1
  62. package/dist/libs/contracts/dist/spec.js.map +1 -1
  63. package/dist/sync/sync.contracts.d.ts +125 -125
  64. package/dist/sync/sync.enum.d.ts +4 -4
  65. package/dist/sync-engine/index.d.ts +1 -1
  66. package/dist/sync-engine/index.d.ts.map +1 -1
  67. package/dist/sync-engine/index.js +3 -2
  68. package/dist/sync-engine/index.js.map +1 -1
  69. package/package.json +20 -14
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/sync-engine/index.ts"],"sourcesContent":[],"mappings":";;AAQA;AAWA;AAMA;AAYA;AAUiB,UAvCA,YAAA,CA+CP;EAGO,WAAA,EAAS,MAAA;EAOT,WAAA,EAAA,MAAY;EAMZ,WAAA,EAAA,QAAY,GAAA,WAEf,GAAA,QAAA,GAAA,UAAA,GAAA,UAAA;EAMG,mBAAW,CAAA,EAAA,MAAA;EAIZ,YAAA,CAAA,EAtEC,YAsED;EAAsB,aAAA,CAAA,EAAA,OAAA;EAAR,UAAA,EAAA,OAAA;EAMZ,YAAA,CAAA,EAAA,OAAA;;AAEL,UAxEI,YAAA,CAwEJ;EACR,YAAA,EAAA,MAAA;EAMO,WAAA,EAAA,MAAA;EACE,WAAA,EAAA,MAAA;;AAC0B,UA3EvB,UAAA,CA2EuB;EAKvB,EAAA,EAAA,MAAA;EAIJ,SAAA,EAAA,SAAA,GAAA,UAAsB,GAAW,eAAA;EAoDjC,YAAA,EAAA,MAAgB;EAGD,YAAA,EAAA,MAAA;EAIN,aAAA,EA1IL,YA0IK,EAAA;EAAsB,SAAA,EAAA,OAAA;EAAR,cAAA,EAAA,OAAA;EAuBlB,aAAA,EAAA,OAAA;EACJ,YAAA,CAAA,EA9JG,MA8JH,CAAA,MAAA,EAAA,OAAA,CAAA;;AAET,UA7JY,WAAA,CA6JZ;EA+DO,KAAA,EAAA,MAAA;EACE,MAAA,EA3NJ,UA2NI;EACiB,UAAA,EAAA;IAlGS,EAAA,EAAA,MAAA;IAAW,QAAA,EAAA,MAAA;IAmLnC,WAAA,CAAA,EAzSE,MAySc,CAAA,MAAe,EAAA,OAAA,CAAA;EAM/B,CAAA;AAahB;UAxTiB,UAAA;;;;;;;;UAQP;;UAGO,SAAA;;;;;;UAOA,YAAA;;QAET;;;UAIS,YAAA;;QAET;;;UAMS,WAAA;;;;gBAID,cAAc,QAAQ;;;;gCAMpB,wBACJ,yBACD,cACR;;;;yBAMO,wBACE;;YACiB;;;UAKd,iBAAA;;;cAIJ,qBAAA,YAAiC;;;cAoDjC,eAAA,YAA2B;;4BAGZ;gBAIN,cAAc,QAAQ;gCAuB1B,wBACJ,0BACA,cACT;yBA+DO,wBACE;;YACiB;;;;;;iBAiFf,gBAAA,eAA+B,oBAAoB;iBAMnD,eAAA,OAAsB;iBAatB,UAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/sync-engine/index.ts"],"sourcesContent":[],"mappings":";;AAQA;AAWA;AAMA;AAYA;AAUiB,UAvCA,YAAA,CA+CP;EAGO,WAAA,EAAS,MAAA;EAOT,WAAA,EAAA,MAAY;EAMZ,WAAA,EAAA,QAAY,GAAA,WAEf,GAAA,QAAA,GAAA,UAAA,GAAA,UAAA;EAMG,mBAAW,CAAA,EAAA,MAAA;EAIZ,YAAA,CAAA,EAtEC,YAsED;EAAsB,aAAA,CAAA,EAAA,OAAA;EAAR,UAAA,EAAA,OAAA;EAMZ,YAAA,CAAA,EAAA,OAAA;;AAEL,UAxEI,YAAA,CAwEJ;EACR,YAAA,EAAA,MAAA;EAMO,WAAA,EAAA,MAAA;EACE,WAAA,EAAA,MAAA;;AAC0B,UA3EvB,UAAA,CA2EuB;EAKvB,EAAA,EAAA,MAAA;EAIJ,SAAA,EAAA,SAAA,GAAA,UAAsB,GAAW,eAAA;EAoDjC,YAAA,EAAA,MAAgB;EAGD,YAAA,EAAA,MAAA;EAIL,aAAA,EA1IN,YA0IM,EAAA;EAAsB,SAAA,EAAA,OAAA;EAAR,cAAA,EAAA,OAAA;EAuBnB,aAAA,EAAA,OAAA;EACJ,YAAA,CAAA,EA9JG,MA8JH,CAAA,MAAA,EAAA,OAAA,CAAA;;AAET,UA7JY,WAAA,CA6JZ;EAgEO,KAAA,EAAA,MAAA;EACE,MAAA,EA5NJ,UA4NI;EACiB,UAAA,EAAA;IAnGS,EAAA,EAAA,MAAA;IAAW,QAAA,EAAA,MAAA;IAoLnC,WAAA,CAAA,EA1SE,MA0Sc,CAAA,MAAe,EAAA,OAAA,CAAA;EAM/B,CAAA;AAahB;UAzTiB,UAAA;;;;;;;;UAQP;;UAGO,SAAA;;;;;;UAOA,YAAA;;QAET;;;UAIS,YAAA;;QAET;;;UAMS,WAAA;;;;gBAID,cAAc,QAAQ;;;;gCAMpB,wBACJ,yBACD,cACR;;;;yBAMO,wBACE;;YACiB;;;UAKd,iBAAA;;;cAIJ,qBAAA,YAAiC;;;cAoDjC,eAAA,YAA2B;;4BAGZ;iBAIL,cAAc,QAAQ;gCAuB3B,wBACJ,0BACA,cACT;yBAgEO,wBACE;;YACiB;;;;;;iBAiFf,gBAAA,eAA+B,oBAAoB;iBAMnD,eAAA,OAAsB;iBAatB,UAAA"}
@@ -33,7 +33,7 @@ var BasicSyncEngine = class {
33
33
  constructor(transformer) {
34
34
  this.transformer = transformer ?? new BasicFieldTransformer();
35
35
  }
36
- async sync(context) {
36
+ async sync(_context) {
37
37
  return {
38
38
  success: true,
39
39
  recordsProcessed: 0,
@@ -49,12 +49,13 @@ var BasicSyncEngine = class {
49
49
  const targetData = {};
50
50
  for (const mapping of mappings) {
51
51
  let value;
52
+ let sourceValue;
52
53
  switch (mapping.mappingType) {
53
54
  case "DIRECT":
54
55
  value = this.getNestedValue(sourceRecord.data, mapping.sourceField);
55
56
  break;
56
57
  case "TRANSFORM":
57
- const sourceValue = this.getNestedValue(sourceRecord.data, mapping.sourceField);
58
+ sourceValue = this.getNestedValue(sourceRecord.data, mapping.sourceField);
58
59
  value = mapping.transformExpression ? this.transformer.transform(sourceValue, mapping.transformExpression) : sourceValue;
59
60
  break;
60
61
  case "CONSTANT":
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["targetData: Record<string, unknown>","value: unknown","errors: SyncError[]","current: unknown"],"sources":["../../src/sync-engine/index.ts"],"sourcesContent":["/**\n * Sync Engine\n *\n * Core sync logic for the Integration Hub.\n */\n\n// ============ Types ============\n\nexport interface FieldMapping {\n sourceField: string;\n targetField: string;\n mappingType: 'DIRECT' | 'TRANSFORM' | 'LOOKUP' | 'CONSTANT' | 'COMPUTED';\n transformExpression?: string;\n lookupConfig?: LookupConfig;\n constantValue?: unknown;\n isRequired: boolean;\n defaultValue?: unknown;\n}\n\nexport interface LookupConfig {\n sourceObject: string;\n lookupField: string;\n returnField: string;\n}\n\nexport interface SyncConfig {\n id: string;\n direction: 'INBOUND' | 'OUTBOUND' | 'BIDIRECTIONAL';\n sourceObject: string;\n targetObject: string;\n fieldMappings: FieldMapping[];\n createNew: boolean;\n updateExisting: boolean;\n deleteRemoved: boolean;\n sourceFilter?: Record<string, unknown>;\n}\n\nexport interface SyncContext {\n runId: string;\n config: SyncConfig;\n connection: {\n id: string;\n authType: string;\n credentials?: Record<string, unknown>;\n };\n}\n\nexport interface SyncResult {\n success: boolean;\n recordsProcessed: number;\n recordsCreated: number;\n recordsUpdated: number;\n recordsDeleted: number;\n recordsFailed: number;\n recordsSkipped: number;\n errors: SyncError[];\n}\n\nexport interface SyncError {\n recordId?: string;\n field?: string;\n message: string;\n code: string;\n}\n\nexport interface SourceRecord {\n id: string;\n data: Record<string, unknown>;\n checksum?: string;\n}\n\nexport interface TargetRecord {\n id: string;\n data: Record<string, unknown>;\n checksum?: string;\n}\n\n// ============ Sync Engine Interface ============\n\nexport interface ISyncEngine {\n /**\n * Execute a sync operation.\n */\n sync(context: SyncContext): Promise<SyncResult>;\n\n /**\n * Transform a source record to target format.\n */\n transformRecord(\n sourceRecord: SourceRecord,\n mappings: FieldMapping[],\n context: SyncContext\n ): TargetRecord;\n\n /**\n * Validate a transformed record.\n */\n validateRecord(\n record: TargetRecord,\n mappings: FieldMapping[]\n ): { valid: boolean; errors: SyncError[] };\n}\n\n// ============ Field Transformer ============\n\nexport interface IFieldTransformer {\n transform(value: unknown, expression: string): unknown;\n}\n\nexport class BasicFieldTransformer implements IFieldTransformer {\n transform(value: unknown, expression: string): unknown {\n // Simple expression evaluation\n // In production, use a proper expression language\n try {\n if (expression.startsWith('uppercase')) {\n return typeof value === 'string' ? value.toUpperCase() : value;\n }\n if (expression.startsWith('lowercase')) {\n return typeof value === 'string' ? value.toLowerCase() : value;\n }\n if (expression.startsWith('trim')) {\n return typeof value === 'string' ? value.trim() : value;\n }\n if (expression.startsWith('default:')) {\n const defaultVal = expression.replace('default:', '');\n return value ?? JSON.parse(defaultVal);\n }\n if (expression.startsWith('concat:')) {\n const separator = expression.replace('concat:', '') || ' ';\n if (Array.isArray(value)) {\n return value.join(separator);\n }\n return value;\n }\n if (expression.startsWith('split:')) {\n const separator = expression.replace('split:', '') || ',';\n if (typeof value === 'string') {\n return value.split(separator);\n }\n return value;\n }\n if (expression.startsWith('number')) {\n return Number(value);\n }\n if (expression.startsWith('boolean')) {\n return Boolean(value);\n }\n if (expression.startsWith('string')) {\n return String(value);\n }\n\n // Return as-is if no transformation matches\n return value;\n } catch {\n return value;\n }\n }\n}\n\n// ============ Basic Sync Engine ============\n\nexport class BasicSyncEngine implements ISyncEngine {\n private transformer: IFieldTransformer;\n\n constructor(transformer?: IFieldTransformer) {\n this.transformer = transformer ?? new BasicFieldTransformer();\n }\n\n async sync(context: SyncContext): Promise<SyncResult> {\n const result: SyncResult = {\n success: true,\n recordsProcessed: 0,\n recordsCreated: 0,\n recordsUpdated: 0,\n recordsDeleted: 0,\n recordsFailed: 0,\n recordsSkipped: 0,\n errors: [],\n };\n\n // In a real implementation, this would:\n // 1. Fetch records from source\n // 2. Transform each record\n // 3. Validate each record\n // 4. Upsert to target\n // 5. Track sync records for deduplication\n\n return result;\n }\n\n transformRecord(\n sourceRecord: SourceRecord,\n mappings: FieldMapping[],\n _context: SyncContext\n ): TargetRecord {\n const targetData: Record<string, unknown> = {};\n\n for (const mapping of mappings) {\n let value: unknown;\n\n switch (mapping.mappingType) {\n case 'DIRECT':\n value = this.getNestedValue(sourceRecord.data, mapping.sourceField);\n break;\n\n case 'TRANSFORM':\n const sourceValue = this.getNestedValue(\n sourceRecord.data,\n mapping.sourceField\n );\n value = mapping.transformExpression\n ? this.transformer.transform(\n sourceValue,\n mapping.transformExpression\n )\n : sourceValue;\n break;\n\n case 'CONSTANT':\n value = mapping.constantValue;\n break;\n\n case 'LOOKUP':\n // In production, this would fetch from a lookup table\n value = this.getNestedValue(sourceRecord.data, mapping.sourceField);\n break;\n\n case 'COMPUTED':\n // In production, this would evaluate a computed expression\n value = mapping.transformExpression\n ? this.evaluateComputed(\n sourceRecord.data,\n mapping.transformExpression\n )\n : null;\n break;\n\n default:\n value = this.getNestedValue(sourceRecord.data, mapping.sourceField);\n }\n\n // Apply default value if needed\n if (value === undefined || value === null) {\n value = mapping.defaultValue;\n }\n\n // Set the target field\n this.setNestedValue(targetData, mapping.targetField, value);\n }\n\n return {\n id: sourceRecord.id,\n data: targetData,\n };\n }\n\n validateRecord(\n record: TargetRecord,\n mappings: FieldMapping[]\n ): { valid: boolean; errors: SyncError[] } {\n const errors: SyncError[] = [];\n\n for (const mapping of mappings) {\n if (mapping.isRequired) {\n const value = this.getNestedValue(record.data, mapping.targetField);\n if (value === undefined || value === null) {\n errors.push({\n recordId: record.id,\n field: mapping.targetField,\n message: `Required field ${mapping.targetField} is missing`,\n code: 'REQUIRED_FIELD_MISSING',\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n private getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n }\n\n private setNestedValue(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n ): void {\n const parts = path.split('.');\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined) {\n current[lastPart] = value;\n }\n }\n\n private evaluateComputed(\n data: Record<string, unknown>,\n expression: string\n ): unknown {\n // Simple computed field evaluation\n // In production, use a proper expression evaluator\n try {\n // Support simple field references like ${field.path}\n const result = expression.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n const value = this.getNestedValue(data, path);\n return String(value ?? '');\n });\n return result;\n } catch {\n return null;\n }\n }\n}\n\n// ============ Factory ============\n\nexport function createSyncEngine(transformer?: IFieldTransformer): ISyncEngine {\n return new BasicSyncEngine(transformer);\n}\n\n// ============ Checksum Utilities ============\n\nexport function computeChecksum(data: Record<string, unknown>): string {\n // Simple checksum based on JSON serialization\n // In production, use a proper hash function\n const str = JSON.stringify(data, Object.keys(data).sort());\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return hash.toString(16);\n}\n\nexport function hasChanges(\n sourceChecksum: string | undefined,\n targetChecksum: string | undefined\n): boolean {\n if (!sourceChecksum || !targetChecksum) {\n return true;\n }\n return sourceChecksum !== targetChecksum;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["targetData: Record<string, unknown>","value: unknown","sourceValue: unknown","errors: SyncError[]","current: unknown"],"sources":["../../src/sync-engine/index.ts"],"sourcesContent":["/**\n * Sync Engine\n *\n * Core sync logic for the Integration Hub.\n */\n\n// ============ Types ============\n\nexport interface FieldMapping {\n sourceField: string;\n targetField: string;\n mappingType: 'DIRECT' | 'TRANSFORM' | 'LOOKUP' | 'CONSTANT' | 'COMPUTED';\n transformExpression?: string;\n lookupConfig?: LookupConfig;\n constantValue?: unknown;\n isRequired: boolean;\n defaultValue?: unknown;\n}\n\nexport interface LookupConfig {\n sourceObject: string;\n lookupField: string;\n returnField: string;\n}\n\nexport interface SyncConfig {\n id: string;\n direction: 'INBOUND' | 'OUTBOUND' | 'BIDIRECTIONAL';\n sourceObject: string;\n targetObject: string;\n fieldMappings: FieldMapping[];\n createNew: boolean;\n updateExisting: boolean;\n deleteRemoved: boolean;\n sourceFilter?: Record<string, unknown>;\n}\n\nexport interface SyncContext {\n runId: string;\n config: SyncConfig;\n connection: {\n id: string;\n authType: string;\n credentials?: Record<string, unknown>;\n };\n}\n\nexport interface SyncResult {\n success: boolean;\n recordsProcessed: number;\n recordsCreated: number;\n recordsUpdated: number;\n recordsDeleted: number;\n recordsFailed: number;\n recordsSkipped: number;\n errors: SyncError[];\n}\n\nexport interface SyncError {\n recordId?: string;\n field?: string;\n message: string;\n code: string;\n}\n\nexport interface SourceRecord {\n id: string;\n data: Record<string, unknown>;\n checksum?: string;\n}\n\nexport interface TargetRecord {\n id: string;\n data: Record<string, unknown>;\n checksum?: string;\n}\n\n// ============ Sync Engine Interface ============\n\nexport interface ISyncEngine {\n /**\n * Execute a sync operation.\n */\n sync(context: SyncContext): Promise<SyncResult>;\n\n /**\n * Transform a source record to target format.\n */\n transformRecord(\n sourceRecord: SourceRecord,\n mappings: FieldMapping[],\n context: SyncContext\n ): TargetRecord;\n\n /**\n * Validate a transformed record.\n */\n validateRecord(\n record: TargetRecord,\n mappings: FieldMapping[]\n ): { valid: boolean; errors: SyncError[] };\n}\n\n// ============ Field Transformer ============\n\nexport interface IFieldTransformer {\n transform(value: unknown, expression: string): unknown;\n}\n\nexport class BasicFieldTransformer implements IFieldTransformer {\n transform(value: unknown, expression: string): unknown {\n // Simple expression evaluation\n // In production, use a proper expression language\n try {\n if (expression.startsWith('uppercase')) {\n return typeof value === 'string' ? value.toUpperCase() : value;\n }\n if (expression.startsWith('lowercase')) {\n return typeof value === 'string' ? value.toLowerCase() : value;\n }\n if (expression.startsWith('trim')) {\n return typeof value === 'string' ? value.trim() : value;\n }\n if (expression.startsWith('default:')) {\n const defaultVal = expression.replace('default:', '');\n return value ?? JSON.parse(defaultVal);\n }\n if (expression.startsWith('concat:')) {\n const separator = expression.replace('concat:', '') || ' ';\n if (Array.isArray(value)) {\n return value.join(separator);\n }\n return value;\n }\n if (expression.startsWith('split:')) {\n const separator = expression.replace('split:', '') || ',';\n if (typeof value === 'string') {\n return value.split(separator);\n }\n return value;\n }\n if (expression.startsWith('number')) {\n return Number(value);\n }\n if (expression.startsWith('boolean')) {\n return Boolean(value);\n }\n if (expression.startsWith('string')) {\n return String(value);\n }\n\n // Return as-is if no transformation matches\n return value;\n } catch {\n return value;\n }\n }\n}\n\n// ============ Basic Sync Engine ============\n\nexport class BasicSyncEngine implements ISyncEngine {\n private transformer: IFieldTransformer;\n\n constructor(transformer?: IFieldTransformer) {\n this.transformer = transformer ?? new BasicFieldTransformer();\n }\n\n async sync(_context: SyncContext): Promise<SyncResult> {\n const result: SyncResult = {\n success: true,\n recordsProcessed: 0,\n recordsCreated: 0,\n recordsUpdated: 0,\n recordsDeleted: 0,\n recordsFailed: 0,\n recordsSkipped: 0,\n errors: [],\n };\n\n // In a real implementation, this would:\n // 1. Fetch records from source\n // 2. Transform each record\n // 3. Validate each record\n // 4. Upsert to target\n // 5. Track sync records for deduplication\n\n return result;\n }\n\n transformRecord(\n sourceRecord: SourceRecord,\n mappings: FieldMapping[],\n _context: SyncContext\n ): TargetRecord {\n const targetData: Record<string, unknown> = {};\n\n for (const mapping of mappings) {\n let value: unknown;\n let sourceValue: unknown;\n\n switch (mapping.mappingType) {\n case 'DIRECT':\n value = this.getNestedValue(sourceRecord.data, mapping.sourceField);\n break;\n\n case 'TRANSFORM':\n sourceValue = this.getNestedValue(\n sourceRecord.data,\n mapping.sourceField\n );\n value = mapping.transformExpression\n ? this.transformer.transform(\n sourceValue,\n mapping.transformExpression\n )\n : sourceValue;\n break;\n\n case 'CONSTANT':\n value = mapping.constantValue;\n break;\n\n case 'LOOKUP':\n // In production, this would fetch from a lookup table\n value = this.getNestedValue(sourceRecord.data, mapping.sourceField);\n break;\n\n case 'COMPUTED':\n // In production, this would evaluate a computed expression\n value = mapping.transformExpression\n ? this.evaluateComputed(\n sourceRecord.data,\n mapping.transformExpression\n )\n : null;\n break;\n\n default:\n value = this.getNestedValue(sourceRecord.data, mapping.sourceField);\n }\n\n // Apply default value if needed\n if (value === undefined || value === null) {\n value = mapping.defaultValue;\n }\n\n // Set the target field\n this.setNestedValue(targetData, mapping.targetField, value);\n }\n\n return {\n id: sourceRecord.id,\n data: targetData,\n };\n }\n\n validateRecord(\n record: TargetRecord,\n mappings: FieldMapping[]\n ): { valid: boolean; errors: SyncError[] } {\n const errors: SyncError[] = [];\n\n for (const mapping of mappings) {\n if (mapping.isRequired) {\n const value = this.getNestedValue(record.data, mapping.targetField);\n if (value === undefined || value === null) {\n errors.push({\n recordId: record.id,\n field: mapping.targetField,\n message: `Required field ${mapping.targetField} is missing`,\n code: 'REQUIRED_FIELD_MISSING',\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n private getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n }\n\n private setNestedValue(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n ): void {\n const parts = path.split('.');\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined) {\n current[lastPart] = value;\n }\n }\n\n private evaluateComputed(\n data: Record<string, unknown>,\n expression: string\n ): unknown {\n // Simple computed field evaluation\n // In production, use a proper expression evaluator\n try {\n // Support simple field references like ${field.path}\n const result = expression.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n const value = this.getNestedValue(data, path);\n return String(value ?? '');\n });\n return result;\n } catch {\n return null;\n }\n }\n}\n\n// ============ Factory ============\n\nexport function createSyncEngine(transformer?: IFieldTransformer): ISyncEngine {\n return new BasicSyncEngine(transformer);\n}\n\n// ============ Checksum Utilities ============\n\nexport function computeChecksum(data: Record<string, unknown>): string {\n // Simple checksum based on JSON serialization\n // In production, use a proper hash function\n const str = JSON.stringify(data, Object.keys(data).sort());\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return hash.toString(16);\n}\n\nexport function hasChanges(\n sourceChecksum: string | undefined,\n targetChecksum: string | undefined\n): boolean {\n if (!sourceChecksum || !targetChecksum) {\n return true;\n }\n return sourceChecksum !== targetChecksum;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/example.integration-hub",
3
- "version": "0.0.0-canary-20251219202229",
3
+ "version": "0.0.0-canary-20251220002821",
4
4
  "description": "Integration Hub example with sync engine and field mappings for ContractSpec",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,20 +18,20 @@
18
18
  "lint:check": "eslint src"
19
19
  },
20
20
  "dependencies": {
21
- "@lssm/lib.schema": "0.0.0-canary-20251219202229",
22
- "@lssm/lib.contracts": "0.0.0-canary-20251219202229",
23
- "@lssm/lib.bus": "0.0.0-canary-20251219202229",
24
- "@lssm/lib.identity-rbac": "0.0.0-canary-20251219202229",
25
- "@lssm/lib.files": "0.0.0-canary-20251219202229",
26
- "@lssm/lib.feature-flags": "0.0.0-canary-20251219202229",
27
- "@lssm/lib.jobs": "0.0.0-canary-20251219202229",
28
- "@lssm/module.audit-trail": "0.0.0-canary-20251219202229",
29
- "@lssm/module.notifications": "0.0.0-canary-20251219202229",
21
+ "@lssm/lib.schema": "0.0.0-canary-20251220002821",
22
+ "@lssm/lib.contracts": "0.0.0-canary-20251220002821",
23
+ "@lssm/lib.bus": "0.0.0-canary-20251220002821",
24
+ "@lssm/lib.identity-rbac": "0.0.0-canary-20251220002821",
25
+ "@lssm/lib.files": "0.0.0-canary-20251220002821",
26
+ "@lssm/lib.feature-flags": "0.0.0-canary-20251220002821",
27
+ "@lssm/lib.jobs": "0.0.0-canary-20251220002821",
28
+ "@lssm/module.audit-trail": "0.0.0-canary-20251220002821",
29
+ "@lssm/module.notifications": "0.0.0-canary-20251220002821",
30
30
  "zod": "^4.1.13"
31
31
  },
32
32
  "devDependencies": {
33
- "@lssm/tool.typescript": "0.0.0-canary-20251219202229",
34
- "@lssm/tool.tsdown": "0.0.0-canary-20251219202229",
33
+ "@lssm/tool.typescript": "0.0.0-canary-20251220002821",
34
+ "@lssm/tool.tsdown": "0.0.0-canary-20251220002821",
35
35
  "typescript": "^5.9.3"
36
36
  },
37
37
  "exports": {
@@ -90,7 +90,13 @@
90
90
  "./sync/sync.presentation": "./dist/sync/sync.presentation.js",
91
91
  "./sync/sync.schema": "./dist/sync/sync.schema.js",
92
92
  "./*": "./*"
93
- }
93
+ },
94
+ "registry": "https://registry.npmjs.org/"
94
95
  },
95
- "license": "MIT"
96
+ "license": "MIT",
97
+ "repository": {
98
+ "type": "git",
99
+ "url": "https://github.com/lssm-tech/contractspec.git",
100
+ "directory": "packages/examples/integration-hub"
101
+ }
96
102
  }