@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
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/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,442 +1,442 @@
|
|
|
1
|
-
# Module 6: Production Patterns
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 30 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module covers production-ready patterns for error handling, monitoring, testing, and deployment of connectors in real-world environments.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Implement layered error handling strategies
|
|
14
|
-
- ✅ Add monitoring and metrics collection
|
|
15
|
-
- ✅ Test connectors effectively
|
|
16
|
-
- ✅ Deploy with proper configuration management
|
|
17
|
-
- ✅ Handle secrets securely
|
|
18
|
-
- ✅ Implement retry logic and circuit breakers
|
|
19
|
-
|
|
20
|
-
## Best Practices
|
|
21
|
-
|
|
22
|
-
### 1. Error Handling
|
|
23
|
-
|
|
24
|
-
**Three-Level Error Strategy:**
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
// Record-Level: Continue processing
|
|
28
|
-
const { validRecords, errors } = records.reduce((acc, record) => {
|
|
29
|
-
try {
|
|
30
|
-
const transformed = mapper.map(record);
|
|
31
|
-
if (transformed.success) {
|
|
32
|
-
acc.validRecords.push(transformed.data);
|
|
33
|
-
} else {
|
|
34
|
-
acc.errors.push({ record, errors: transformed.errors });
|
|
35
|
-
}
|
|
36
|
-
} catch (error) {
|
|
37
|
-
acc.errors.push({ record, error: error.message });
|
|
38
|
-
}
|
|
39
|
-
return acc;
|
|
40
|
-
}, { validRecords: [], errors: [] });
|
|
41
|
-
|
|
42
|
-
logger.warn(`Skipped ${errors.length} invalid records`);
|
|
43
|
-
|
|
44
|
-
// File-Level: Skip file, continue batch
|
|
45
|
-
try {
|
|
46
|
-
await processFile(file);
|
|
47
|
-
} catch (error) {
|
|
48
|
-
logger.error(`File failed: ${file.name}`, error);
|
|
49
|
-
await moveToErrorFolder(file);
|
|
50
|
-
// Continue with next file
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Job-Level: Fail fast
|
|
54
|
-
try {
|
|
55
|
-
await syncInventory();
|
|
56
|
-
} catch (error) {
|
|
57
|
-
logger.error('Critical failure', error);
|
|
58
|
-
await notifyAdministrators(error);
|
|
59
|
-
throw error; // Stop execution
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 2. State Management
|
|
64
|
-
|
|
65
|
-
**Track Processing State:**
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
const kv = openKv(); // Or VersoriKVAdapter for Versori platform
|
|
69
|
-
|
|
70
|
-
// File-level tracking (simple)
|
|
71
|
-
await stateService.updateSyncState(kv, [{
|
|
72
|
-
fileName: 'inventory_2025-01-15.csv',
|
|
73
|
-
lastModified: new Date().toISOString(),
|
|
74
|
-
recordCount: 1000
|
|
75
|
-
}], 'workflow-id');
|
|
76
|
-
|
|
77
|
-
// Record-level checkpoints (advanced) - Use KV directly
|
|
78
|
-
await kv.set(['checkpoint', 'job-123'], {
|
|
79
|
-
file: currentFile,
|
|
80
|
-
lastRecordId: record.id,
|
|
81
|
-
recordsProcessed: count,
|
|
82
|
-
lastProcessedAt: new Date().toISOString()
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// Resume from checkpoint
|
|
86
|
-
const checkpointData = await kv.get(['checkpoint', 'job-123']);
|
|
87
|
-
const checkpoint = checkpointData?.value;
|
|
88
|
-
if (checkpoint) {
|
|
89
|
-
startFrom = checkpoint.lastRecordId;
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### 3. Validation
|
|
94
|
-
|
|
95
|
-
**Validate Before Transformation:**
|
|
96
|
-
|
|
97
|
-
```typescript
|
|
98
|
-
// Required field validation
|
|
99
|
-
if (!record.sku || !record.location || record.quantity === undefined) {
|
|
100
|
-
return { valid: false, error: 'Missing required fields' };
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Type validation
|
|
104
|
-
if (isNaN(Number(record.quantity))) {
|
|
105
|
-
return { valid: false, error: 'Invalid quantity type' };
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Format validation
|
|
109
|
-
if (!/^[A-Z0-9-]+$/i.test(record.sku)) {
|
|
110
|
-
return { valid: false, error: 'Invalid SKU format' };
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Business rule validation
|
|
114
|
-
if (Number(record.quantity) < 0) {
|
|
115
|
-
return { valid: false, error: 'Quantity cannot be negative' };
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### 4. Batch Processing
|
|
120
|
-
|
|
121
|
-
**Process in Manageable Chunks:**
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
const BATCH_SIZE = 100;
|
|
125
|
-
|
|
126
|
-
for (let i = 0; i < records.length; i += BATCH_SIZE) {
|
|
127
|
-
const batch = records.slice(i, i + BATCH_SIZE);
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
await processBatch(batch);
|
|
131
|
-
logger.info(`Batch ${i / BATCH_SIZE + 1} completed`);
|
|
132
|
-
} catch (error) {
|
|
133
|
-
logger.error(`Batch ${i / BATCH_SIZE + 1} failed`, error);
|
|
134
|
-
// Save failed batch for retry
|
|
135
|
-
await saveFailedBatch(batch, error);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### 5. Monitoring
|
|
141
|
-
|
|
142
|
-
**Collect and Report Metrics:**
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
const metrics = {
|
|
146
|
-
startTime: Date.now(),
|
|
147
|
-
filesProcessed: 0,
|
|
148
|
-
recordsProcessed: 0,
|
|
149
|
-
recordsFailed: 0,
|
|
150
|
-
errors: [] as any[],
|
|
151
|
-
duration: 0
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
// Track during processing
|
|
155
|
-
metrics.filesProcessed++;
|
|
156
|
-
metrics.recordsProcessed += validRecords.length;
|
|
157
|
-
metrics.recordsFailed += invalidRecords.length;
|
|
158
|
-
|
|
159
|
-
// Calculate duration
|
|
160
|
-
metrics.duration = Date.now() - metrics.startTime;
|
|
161
|
-
|
|
162
|
-
// Log final metrics
|
|
163
|
-
logger.info('Processing complete', {
|
|
164
|
-
...metrics,
|
|
165
|
-
avgTimePerFile: metrics.duration / metrics.filesProcessed,
|
|
166
|
-
successRate: (metrics.recordsProcessed / (metrics.recordsProcessed + metrics.recordsFailed)) * 100
|
|
167
|
-
});
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### 6. Retry Logic
|
|
171
|
-
|
|
172
|
-
**Implement Exponential Backoff:**
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
async function retryWithBackoff<T>(
|
|
176
|
-
fn: () => Promise<T>,
|
|
177
|
-
maxRetries: number = 3,
|
|
178
|
-
baseDelay: number = 1000
|
|
179
|
-
): Promise<T> {
|
|
180
|
-
let lastError: Error;
|
|
181
|
-
|
|
182
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
183
|
-
try {
|
|
184
|
-
return await fn();
|
|
185
|
-
} catch (error) {
|
|
186
|
-
lastError = error as Error;
|
|
187
|
-
logger.warn(`Attempt ${attempt + 1} failed: ${error.message}`);
|
|
188
|
-
|
|
189
|
-
if (attempt < maxRetries - 1) {
|
|
190
|
-
const delay = baseDelay * Math.pow(2, attempt);
|
|
191
|
-
logger.info(`Retrying in ${delay}ms...`);
|
|
192
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
throw lastError!;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Usage
|
|
201
|
-
await retryWithBackoff(
|
|
202
|
-
() => fluentClient.sendBatch(jobId, entities),
|
|
203
|
-
3, // max retries
|
|
204
|
-
2000 // base delay (2s)
|
|
205
|
-
);
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Testing Your Connector
|
|
209
|
-
|
|
210
|
-
### Unit Testing
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
describe('Inventory Connector', () => {
|
|
214
|
-
it('should parse CSV correctly', async () => {
|
|
215
|
-
const csv = 'sku,qty\nPROD1,100';
|
|
216
|
-
const records = await parser.parse(csv);
|
|
217
|
-
|
|
218
|
-
expect(records).toHaveLength(1);
|
|
219
|
-
expect(records[0].sku).toBe('PROD1');
|
|
220
|
-
expect(records[0].qty).toBe('100');
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('should transform fields correctly', async () => {
|
|
224
|
-
const input = { sku: 'prod1', quantity: '100' };
|
|
225
|
-
const output = await mapper.map(input);
|
|
226
|
-
|
|
227
|
-
expect(output.success).toBe(true);
|
|
228
|
-
expect(output.data.ref).toBe('PROD1');
|
|
229
|
-
expect(output.data.qty).toBe(100);
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('should validate required fields', () => {
|
|
233
|
-
const invalid = { sku: 'PROD1' }; // missing quantity
|
|
234
|
-
const result = validateRecord(invalid);
|
|
235
|
-
|
|
236
|
-
expect(result.valid).toBe(false);
|
|
237
|
-
expect(result.error).toContain('Missing required fields');
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### Integration Testing
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
describe('SFTP Integration', () => {
|
|
246
|
-
let sftpSource: SftpDataSource;
|
|
247
|
-
|
|
248
|
-
beforeAll(async () => {
|
|
249
|
-
sftpSource = new SftpDataSource({
|
|
250
|
-
type: 'SFTP_CSV',
|
|
251
|
-
connectionId: 'test-sftp',
|
|
252
|
-
name: 'Test SFTP',
|
|
253
|
-
settings: {
|
|
254
|
-
host: process.env.TEST_SFTP_HOST!,
|
|
255
|
-
username: process.env.TEST_SFTP_USER!,
|
|
256
|
-
password: process.env.TEST_SFTP_PASS!,
|
|
257
|
-
remotePath: '/test'
|
|
258
|
-
}
|
|
259
|
-
}, logger);
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('should connect and list files', async () => {
|
|
263
|
-
const files = await sftpSource.listFiles();
|
|
264
|
-
expect(files).toBeDefined();
|
|
265
|
-
expect(Array.isArray(files)).toBe(true);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it('should download and parse file', async () => {
|
|
269
|
-
const content = await sftpSource.downloadFile('test.csv');
|
|
270
|
-
expect(content).toBeDefined();
|
|
271
|
-
expect(content.length).toBeGreaterThan(0);
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### End-to-End Testing
|
|
277
|
-
|
|
278
|
-
```typescript
|
|
279
|
-
describe('Full Inventory Sync', () => {
|
|
280
|
-
it('should sync inventory from SFTP to Fluent', async () => {
|
|
281
|
-
// Upload test file
|
|
282
|
-
await sftpSource.uploadFile('test-inventory.csv', testCsvContent);
|
|
283
|
-
|
|
284
|
-
// Run sync
|
|
285
|
-
const result = await syncInventory();
|
|
286
|
-
|
|
287
|
-
// Verify results
|
|
288
|
-
expect(result.filesProcessed).toBe(1);
|
|
289
|
-
expect(result.recordsProcessed).toBeGreaterThan(0);
|
|
290
|
-
expect(result.errors.length).toBe(0);
|
|
291
|
-
|
|
292
|
-
// Verify in Fluent
|
|
293
|
-
const inventory = await fluentClient.graphql({
|
|
294
|
-
query: getInventoryQuery,
|
|
295
|
-
variables: { productRef: 'TEST-SKU' }
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
expect(inventory.data.inventoryPositions.edges.length).toBeGreaterThan(0);
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
## Deployment Considerations
|
|
304
|
-
|
|
305
|
-
### 1. Environment Variables
|
|
306
|
-
|
|
307
|
-
**Use environment-specific configs:**
|
|
308
|
-
|
|
309
|
-
```typescript
|
|
310
|
-
// .env.production
|
|
311
|
-
FLUENT_BASE_URL=https://api.fluentcommerce.com
|
|
312
|
-
FLUENT_CLIENT_ID=prod-client-id
|
|
313
|
-
FLUENT_CLIENT_SECRET=***SECRET***
|
|
314
|
-
FLUENT_RETAILER_ID=1
|
|
315
|
-
|
|
316
|
-
SFTP_HOST=sftp.partner.com
|
|
317
|
-
SFTP_USERNAME=prod-user
|
|
318
|
-
SFTP_PASSWORD=***SECRET***
|
|
319
|
-
|
|
320
|
-
S3_BUCKET=prod-inventory-data
|
|
321
|
-
AWS_REGION=us-east-1
|
|
322
|
-
|
|
323
|
-
LOG_LEVEL=info
|
|
324
|
-
STATE_STORAGE_TYPE=s3
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
### 2. Secret Management
|
|
328
|
-
|
|
329
|
-
**Never hardcode secrets:**
|
|
330
|
-
|
|
331
|
-
```typescript
|
|
332
|
-
// ❌ WRONG
|
|
333
|
-
const config = {
|
|
334
|
-
password: 'mypassword123'
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
// ✅ CORRECT
|
|
338
|
-
const config = {
|
|
339
|
-
password: process.env.SFTP_PASSWORD!
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// ✅ BETTER - Use secret management service
|
|
343
|
-
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
|
|
344
|
-
|
|
345
|
-
const secretsManager = new SecretsManager({ region: 'us-east-1' });
|
|
346
|
-
const secret = await secretsManager.getSecretValue({ SecretId: 'sftp-credentials' });
|
|
347
|
-
const config = JSON.parse(secret.SecretString);
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### 3. Logging Strategy
|
|
351
|
-
|
|
352
|
-
**Structured logging for production:**
|
|
353
|
-
|
|
354
|
-
```typescript
|
|
355
|
-
import { createConsoleLogger, toStructuredLogger } from '@fluentcommerce/fc-connect-sdk';
|
|
356
|
-
|
|
357
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
358
|
-
service: 'inventory-sync',
|
|
359
|
-
module: 'production-workflow',
|
|
360
|
-
environment: process.env.NODE_ENV
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// Log with context
|
|
364
|
-
logger.info('Processing file', {
|
|
365
|
-
fileName: file.name,
|
|
366
|
-
fileSize: file.size,
|
|
367
|
-
source: 'SFTP'
|
|
368
|
-
});
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### 4. Health Checks
|
|
372
|
-
|
|
373
|
-
**Implement health check endpoints:**
|
|
374
|
-
|
|
375
|
-
```typescript
|
|
376
|
-
// Health check endpoint
|
|
377
|
-
app.get('/health', async (req, res) => {
|
|
378
|
-
const checks = {
|
|
379
|
-
sftpConnection: await checkSftpConnection(),
|
|
380
|
-
s3Access: await checkS3Access(),
|
|
381
|
-
fluentApi: await checkFluentConnection(),
|
|
382
|
-
lastSuccessfulRun: await getLastSuccessfulRun()
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
const healthy = Object.values(checks).every(c => c === true || c.success);
|
|
386
|
-
|
|
387
|
-
res.status(healthy ? 200 : 503).json({
|
|
388
|
-
status: healthy ? 'healthy' : 'unhealthy',
|
|
389
|
-
checks,
|
|
390
|
-
timestamp: new Date().toISOString()
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
### 5. Alerts and Notifications
|
|
396
|
-
|
|
397
|
-
**Notify on failures:**
|
|
398
|
-
|
|
399
|
-
```typescript
|
|
400
|
-
async function notifyOnError(error: Error, context: any) {
|
|
401
|
-
// Send to monitoring service
|
|
402
|
-
await sendToDatadog({
|
|
403
|
-
type: 'error',
|
|
404
|
-
message: error.message,
|
|
405
|
-
stack: error.stack,
|
|
406
|
-
context
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
// Send email alert
|
|
410
|
-
await sendEmail({
|
|
411
|
-
to: process.env.ALERT_EMAIL!,
|
|
412
|
-
subject: 'Connector Failure',
|
|
413
|
-
body: `
|
|
414
|
-
Error: ${error.message}
|
|
415
|
-
Context: ${JSON.stringify(context, null, 2)}
|
|
416
|
-
Timestamp: ${new Date().toISOString()}
|
|
417
|
-
`
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
// Send Slack notification
|
|
421
|
-
await sendSlackMessage({
|
|
422
|
-
channel: '#alerts',
|
|
423
|
-
text: `🚨 Connector failed: ${error.message}`
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
## Key Takeaways
|
|
429
|
-
|
|
430
|
-
- 🎯 Implement three-level error handling (record, file, job)
|
|
431
|
-
- 🎯 Track state for recovery and duplicate prevention
|
|
432
|
-
- 🎯 Validate data at multiple stages (structure, types, business rules)
|
|
433
|
-
- 🎯 Process in batches with retry logic
|
|
434
|
-
- 🎯 Collect metrics for monitoring and optimization
|
|
435
|
-
- 🎯 Test at unit, integration, and end-to-end levels
|
|
436
|
-
- 🎯 Use environment variables for configuration
|
|
437
|
-
- 🎯 Never log or commit secrets
|
|
438
|
-
- 🎯 Implement health checks and alerts
|
|
439
|
-
|
|
440
|
-
## Next Steps
|
|
441
|
-
|
|
442
|
-
Continue to [Module 7: Reference](./connector-scenarios-07-reference.md) for a complete pattern catalog and quick reference guide.
|
|
1
|
+
# Module 6: Production Patterns
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 30 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module covers production-ready patterns for error handling, monitoring, testing, and deployment of connectors in real-world environments.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Implement layered error handling strategies
|
|
14
|
+
- ✅ Add monitoring and metrics collection
|
|
15
|
+
- ✅ Test connectors effectively
|
|
16
|
+
- ✅ Deploy with proper configuration management
|
|
17
|
+
- ✅ Handle secrets securely
|
|
18
|
+
- ✅ Implement retry logic and circuit breakers
|
|
19
|
+
|
|
20
|
+
## Best Practices
|
|
21
|
+
|
|
22
|
+
### 1. Error Handling
|
|
23
|
+
|
|
24
|
+
**Three-Level Error Strategy:**
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// Record-Level: Continue processing
|
|
28
|
+
const { validRecords, errors } = records.reduce((acc, record) => {
|
|
29
|
+
try {
|
|
30
|
+
const transformed = mapper.map(record);
|
|
31
|
+
if (transformed.success) {
|
|
32
|
+
acc.validRecords.push(transformed.data);
|
|
33
|
+
} else {
|
|
34
|
+
acc.errors.push({ record, errors: transformed.errors });
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
acc.errors.push({ record, error: error.message });
|
|
38
|
+
}
|
|
39
|
+
return acc;
|
|
40
|
+
}, { validRecords: [], errors: [] });
|
|
41
|
+
|
|
42
|
+
logger.warn(`Skipped ${errors.length} invalid records`);
|
|
43
|
+
|
|
44
|
+
// File-Level: Skip file, continue batch
|
|
45
|
+
try {
|
|
46
|
+
await processFile(file);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.error(`File failed: ${file.name}`, error);
|
|
49
|
+
await moveToErrorFolder(file);
|
|
50
|
+
// Continue with next file
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Job-Level: Fail fast
|
|
54
|
+
try {
|
|
55
|
+
await syncInventory();
|
|
56
|
+
} catch (error) {
|
|
57
|
+
logger.error('Critical failure', error);
|
|
58
|
+
await notifyAdministrators(error);
|
|
59
|
+
throw error; // Stop execution
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 2. State Management
|
|
64
|
+
|
|
65
|
+
**Track Processing State:**
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
const kv = openKv(); // Or VersoriKVAdapter for Versori platform
|
|
69
|
+
|
|
70
|
+
// File-level tracking (simple)
|
|
71
|
+
await stateService.updateSyncState(kv, [{
|
|
72
|
+
fileName: 'inventory_2025-01-15.csv',
|
|
73
|
+
lastModified: new Date().toISOString(),
|
|
74
|
+
recordCount: 1000
|
|
75
|
+
}], 'workflow-id');
|
|
76
|
+
|
|
77
|
+
// Record-level checkpoints (advanced) - Use KV directly
|
|
78
|
+
await kv.set(['checkpoint', 'job-123'], {
|
|
79
|
+
file: currentFile,
|
|
80
|
+
lastRecordId: record.id,
|
|
81
|
+
recordsProcessed: count,
|
|
82
|
+
lastProcessedAt: new Date().toISOString()
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Resume from checkpoint
|
|
86
|
+
const checkpointData = await kv.get(['checkpoint', 'job-123']);
|
|
87
|
+
const checkpoint = checkpointData?.value;
|
|
88
|
+
if (checkpoint) {
|
|
89
|
+
startFrom = checkpoint.lastRecordId;
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Validation
|
|
94
|
+
|
|
95
|
+
**Validate Before Transformation:**
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Required field validation
|
|
99
|
+
if (!record.sku || !record.location || record.quantity === undefined) {
|
|
100
|
+
return { valid: false, error: 'Missing required fields' };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Type validation
|
|
104
|
+
if (isNaN(Number(record.quantity))) {
|
|
105
|
+
return { valid: false, error: 'Invalid quantity type' };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Format validation
|
|
109
|
+
if (!/^[A-Z0-9-]+$/i.test(record.sku)) {
|
|
110
|
+
return { valid: false, error: 'Invalid SKU format' };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Business rule validation
|
|
114
|
+
if (Number(record.quantity) < 0) {
|
|
115
|
+
return { valid: false, error: 'Quantity cannot be negative' };
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 4. Batch Processing
|
|
120
|
+
|
|
121
|
+
**Process in Manageable Chunks:**
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
const BATCH_SIZE = 100;
|
|
125
|
+
|
|
126
|
+
for (let i = 0; i < records.length; i += BATCH_SIZE) {
|
|
127
|
+
const batch = records.slice(i, i + BATCH_SIZE);
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
await processBatch(batch);
|
|
131
|
+
logger.info(`Batch ${i / BATCH_SIZE + 1} completed`);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
logger.error(`Batch ${i / BATCH_SIZE + 1} failed`, error);
|
|
134
|
+
// Save failed batch for retry
|
|
135
|
+
await saveFailedBatch(batch, error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 5. Monitoring
|
|
141
|
+
|
|
142
|
+
**Collect and Report Metrics:**
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
const metrics = {
|
|
146
|
+
startTime: Date.now(),
|
|
147
|
+
filesProcessed: 0,
|
|
148
|
+
recordsProcessed: 0,
|
|
149
|
+
recordsFailed: 0,
|
|
150
|
+
errors: [] as any[],
|
|
151
|
+
duration: 0
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// Track during processing
|
|
155
|
+
metrics.filesProcessed++;
|
|
156
|
+
metrics.recordsProcessed += validRecords.length;
|
|
157
|
+
metrics.recordsFailed += invalidRecords.length;
|
|
158
|
+
|
|
159
|
+
// Calculate duration
|
|
160
|
+
metrics.duration = Date.now() - metrics.startTime;
|
|
161
|
+
|
|
162
|
+
// Log final metrics
|
|
163
|
+
logger.info('Processing complete', {
|
|
164
|
+
...metrics,
|
|
165
|
+
avgTimePerFile: metrics.duration / metrics.filesProcessed,
|
|
166
|
+
successRate: (metrics.recordsProcessed / (metrics.recordsProcessed + metrics.recordsFailed)) * 100
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 6. Retry Logic
|
|
171
|
+
|
|
172
|
+
**Implement Exponential Backoff:**
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
async function retryWithBackoff<T>(
|
|
176
|
+
fn: () => Promise<T>,
|
|
177
|
+
maxRetries: number = 3,
|
|
178
|
+
baseDelay: number = 1000
|
|
179
|
+
): Promise<T> {
|
|
180
|
+
let lastError: Error;
|
|
181
|
+
|
|
182
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
183
|
+
try {
|
|
184
|
+
return await fn();
|
|
185
|
+
} catch (error) {
|
|
186
|
+
lastError = error as Error;
|
|
187
|
+
logger.warn(`Attempt ${attempt + 1} failed: ${error.message}`);
|
|
188
|
+
|
|
189
|
+
if (attempt < maxRetries - 1) {
|
|
190
|
+
const delay = baseDelay * Math.pow(2, attempt);
|
|
191
|
+
logger.info(`Retrying in ${delay}ms...`);
|
|
192
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
throw lastError!;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Usage
|
|
201
|
+
await retryWithBackoff(
|
|
202
|
+
() => fluentClient.sendBatch(jobId, entities),
|
|
203
|
+
3, // max retries
|
|
204
|
+
2000 // base delay (2s)
|
|
205
|
+
);
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Testing Your Connector
|
|
209
|
+
|
|
210
|
+
### Unit Testing
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
describe('Inventory Connector', () => {
|
|
214
|
+
it('should parse CSV correctly', async () => {
|
|
215
|
+
const csv = 'sku,qty\nPROD1,100';
|
|
216
|
+
const records = await parser.parse(csv);
|
|
217
|
+
|
|
218
|
+
expect(records).toHaveLength(1);
|
|
219
|
+
expect(records[0].sku).toBe('PROD1');
|
|
220
|
+
expect(records[0].qty).toBe('100');
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('should transform fields correctly', async () => {
|
|
224
|
+
const input = { sku: 'prod1', quantity: '100' };
|
|
225
|
+
const output = await mapper.map(input);
|
|
226
|
+
|
|
227
|
+
expect(output.success).toBe(true);
|
|
228
|
+
expect(output.data.ref).toBe('PROD1');
|
|
229
|
+
expect(output.data.qty).toBe(100);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('should validate required fields', () => {
|
|
233
|
+
const invalid = { sku: 'PROD1' }; // missing quantity
|
|
234
|
+
const result = validateRecord(invalid);
|
|
235
|
+
|
|
236
|
+
expect(result.valid).toBe(false);
|
|
237
|
+
expect(result.error).toContain('Missing required fields');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Integration Testing
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
describe('SFTP Integration', () => {
|
|
246
|
+
let sftpSource: SftpDataSource;
|
|
247
|
+
|
|
248
|
+
beforeAll(async () => {
|
|
249
|
+
sftpSource = new SftpDataSource({
|
|
250
|
+
type: 'SFTP_CSV',
|
|
251
|
+
connectionId: 'test-sftp',
|
|
252
|
+
name: 'Test SFTP',
|
|
253
|
+
settings: {
|
|
254
|
+
host: process.env.TEST_SFTP_HOST!,
|
|
255
|
+
username: process.env.TEST_SFTP_USER!,
|
|
256
|
+
password: process.env.TEST_SFTP_PASS!,
|
|
257
|
+
remotePath: '/test'
|
|
258
|
+
}
|
|
259
|
+
}, logger);
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
it('should connect and list files', async () => {
|
|
263
|
+
const files = await sftpSource.listFiles();
|
|
264
|
+
expect(files).toBeDefined();
|
|
265
|
+
expect(Array.isArray(files)).toBe(true);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('should download and parse file', async () => {
|
|
269
|
+
const content = await sftpSource.downloadFile('test.csv');
|
|
270
|
+
expect(content).toBeDefined();
|
|
271
|
+
expect(content.length).toBeGreaterThan(0);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### End-to-End Testing
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
describe('Full Inventory Sync', () => {
|
|
280
|
+
it('should sync inventory from SFTP to Fluent', async () => {
|
|
281
|
+
// Upload test file
|
|
282
|
+
await sftpSource.uploadFile('test-inventory.csv', testCsvContent);
|
|
283
|
+
|
|
284
|
+
// Run sync
|
|
285
|
+
const result = await syncInventory();
|
|
286
|
+
|
|
287
|
+
// Verify results
|
|
288
|
+
expect(result.filesProcessed).toBe(1);
|
|
289
|
+
expect(result.recordsProcessed).toBeGreaterThan(0);
|
|
290
|
+
expect(result.errors.length).toBe(0);
|
|
291
|
+
|
|
292
|
+
// Verify in Fluent
|
|
293
|
+
const inventory = await fluentClient.graphql({
|
|
294
|
+
query: getInventoryQuery,
|
|
295
|
+
variables: { productRef: 'TEST-SKU' }
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
expect(inventory.data.inventoryPositions.edges.length).toBeGreaterThan(0);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Deployment Considerations
|
|
304
|
+
|
|
305
|
+
### 1. Environment Variables
|
|
306
|
+
|
|
307
|
+
**Use environment-specific configs:**
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
// .env.production
|
|
311
|
+
FLUENT_BASE_URL=https://api.fluentcommerce.com
|
|
312
|
+
FLUENT_CLIENT_ID=prod-client-id
|
|
313
|
+
FLUENT_CLIENT_SECRET=***SECRET***
|
|
314
|
+
FLUENT_RETAILER_ID=1
|
|
315
|
+
|
|
316
|
+
SFTP_HOST=sftp.partner.com
|
|
317
|
+
SFTP_USERNAME=prod-user
|
|
318
|
+
SFTP_PASSWORD=***SECRET***
|
|
319
|
+
|
|
320
|
+
S3_BUCKET=prod-inventory-data
|
|
321
|
+
AWS_REGION=us-east-1
|
|
322
|
+
|
|
323
|
+
LOG_LEVEL=info
|
|
324
|
+
STATE_STORAGE_TYPE=s3
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### 2. Secret Management
|
|
328
|
+
|
|
329
|
+
**Never hardcode secrets:**
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
// ❌ WRONG
|
|
333
|
+
const config = {
|
|
334
|
+
password: 'mypassword123'
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
// ✅ CORRECT
|
|
338
|
+
const config = {
|
|
339
|
+
password: process.env.SFTP_PASSWORD!
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
// ✅ BETTER - Use secret management service
|
|
343
|
+
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
|
|
344
|
+
|
|
345
|
+
const secretsManager = new SecretsManager({ region: 'us-east-1' });
|
|
346
|
+
const secret = await secretsManager.getSecretValue({ SecretId: 'sftp-credentials' });
|
|
347
|
+
const config = JSON.parse(secret.SecretString);
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 3. Logging Strategy
|
|
351
|
+
|
|
352
|
+
**Structured logging for production:**
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
import { createConsoleLogger, toStructuredLogger } from '@fluentcommerce/fc-connect-sdk';
|
|
356
|
+
|
|
357
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
358
|
+
service: 'inventory-sync',
|
|
359
|
+
module: 'production-workflow',
|
|
360
|
+
environment: process.env.NODE_ENV
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// Log with context
|
|
364
|
+
logger.info('Processing file', {
|
|
365
|
+
fileName: file.name,
|
|
366
|
+
fileSize: file.size,
|
|
367
|
+
source: 'SFTP'
|
|
368
|
+
});
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 4. Health Checks
|
|
372
|
+
|
|
373
|
+
**Implement health check endpoints:**
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
// Health check endpoint
|
|
377
|
+
app.get('/health', async (req, res) => {
|
|
378
|
+
const checks = {
|
|
379
|
+
sftpConnection: await checkSftpConnection(),
|
|
380
|
+
s3Access: await checkS3Access(),
|
|
381
|
+
fluentApi: await checkFluentConnection(),
|
|
382
|
+
lastSuccessfulRun: await getLastSuccessfulRun()
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
const healthy = Object.values(checks).every(c => c === true || c.success);
|
|
386
|
+
|
|
387
|
+
res.status(healthy ? 200 : 503).json({
|
|
388
|
+
status: healthy ? 'healthy' : 'unhealthy',
|
|
389
|
+
checks,
|
|
390
|
+
timestamp: new Date().toISOString()
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### 5. Alerts and Notifications
|
|
396
|
+
|
|
397
|
+
**Notify on failures:**
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
async function notifyOnError(error: Error, context: any) {
|
|
401
|
+
// Send to monitoring service
|
|
402
|
+
await sendToDatadog({
|
|
403
|
+
type: 'error',
|
|
404
|
+
message: error.message,
|
|
405
|
+
stack: error.stack,
|
|
406
|
+
context
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// Send email alert
|
|
410
|
+
await sendEmail({
|
|
411
|
+
to: process.env.ALERT_EMAIL!,
|
|
412
|
+
subject: 'Connector Failure',
|
|
413
|
+
body: `
|
|
414
|
+
Error: ${error.message}
|
|
415
|
+
Context: ${JSON.stringify(context, null, 2)}
|
|
416
|
+
Timestamp: ${new Date().toISOString()}
|
|
417
|
+
`
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
// Send Slack notification
|
|
421
|
+
await sendSlackMessage({
|
|
422
|
+
channel: '#alerts',
|
|
423
|
+
text: `🚨 Connector failed: ${error.message}`
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
## Key Takeaways
|
|
429
|
+
|
|
430
|
+
- 🎯 Implement three-level error handling (record, file, job)
|
|
431
|
+
- 🎯 Track state for recovery and duplicate prevention
|
|
432
|
+
- 🎯 Validate data at multiple stages (structure, types, business rules)
|
|
433
|
+
- 🎯 Process in batches with retry logic
|
|
434
|
+
- 🎯 Collect metrics for monitoring and optimization
|
|
435
|
+
- 🎯 Test at unit, integration, and end-to-end levels
|
|
436
|
+
- 🎯 Use environment variables for configuration
|
|
437
|
+
- 🎯 Never log or commit secrets
|
|
438
|
+
- 🎯 Implement health checks and alerts
|
|
439
|
+
|
|
440
|
+
## Next Steps
|
|
441
|
+
|
|
442
|
+
Continue to [Module 7: Reference](./connector-scenarios-07-reference.md) for a complete pattern catalog and quick reference guide.
|