@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
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 +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- 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/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -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 -482
- 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
|
@@ -1,646 +1,646 @@
|
|
|
1
|
-
# Versori Scheduled Workflows - Use Case Guide
|
|
2
|
-
|
|
3
|
-
**FC Connect SDK** - Production-ready patterns for scheduled workflows on the Versori platform.
|
|
4
|
-
|
|
5
|
-
> **SDK**: [@fluentcommerce/fc-connect-sdk](https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk)
|
|
6
|
-
> **Version**: Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Overview
|
|
11
|
-
|
|
12
|
-
This directory contains verified, production-ready use case guides organized by entity type. Each guide includes:
|
|
13
|
-
|
|
14
|
-
✅ **Complete working code** - Copy-paste ready
|
|
15
|
-
✅ **SDK method verification** - All signatures checked against SDK source
|
|
16
|
-
✅ **Best practices** - Error handling, state management, archiving
|
|
17
|
-
✅ **Configuration examples** - Activation variables, mappings, resolvers
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Quick Navigation by Entity Type
|
|
22
|
-
|
|
23
|
-
### 🔗 Rubix Webhook Patterns ⭐ NEW
|
|
24
|
-
|
|
25
|
-
**Location**: `rubix-webhooks/`
|
|
26
|
-
|
|
27
|
-
| Use Case | Description | Complexity | File |
|
|
28
|
-
|----------|-------------|------------|------|
|
|
29
|
-
| Fluent Rubix Webhook Pattern | Receive webhooks from Rubix workflows, validate signature, query entity, do logic | Medium | [template-fluent-rubix-webhook-pattern.md](rubix-webhooks/template-fluent-rubix-webhook-pattern.md) |
|
|
30
|
-
|
|
31
|
-
**Key Features:**
|
|
32
|
-
- ✅ Complete Rubix workflow configuration guide
|
|
33
|
-
- ✅ Webhook signature validation using FluentClient
|
|
34
|
-
- ✅ Entity extraction from payload
|
|
35
|
-
- ✅ GraphQL queries to fetch entity details
|
|
36
|
-
- ✅ Business logic processing
|
|
37
|
-
- ✅ Structured response handling
|
|
38
|
-
|
|
39
|
-
### 📦 Inventory Management
|
|
40
|
-
|
|
41
|
-
**Location**: `inventory/`
|
|
42
|
-
|
|
43
|
-
| Use Case | Source | Format | API | Complexity | File |
|
|
44
|
-
| -------------------------- | -------------- | ------ | ------------- | ---------- | ---------------------------------------------------------------------------- |
|
|
45
|
-
| S3 → Inventory Batch | S3 | CSV | Batch API | Medium | [template-ingestion-s3-csv-inventory-batch.md](ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md) |
|
|
46
|
-
| SFTP → Inventory Batch | SFTP | CSV | Batch API | Medium | [template-ingestion-sftp-csv-inventory-batch.md](ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md) |
|
|
47
|
-
| Cycle Count Reconciliation | S3 | CSV | GraphQL | High | [cycle-count-reconciliation.md](ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md) |
|
|
48
|
-
| Multi-Channel Sync | Fluent GraphQL | - | External APIs | High | [multi-channel-inventory-sync.md](ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md) |
|
|
49
|
-
|
|
50
|
-
### 🏷️ Product Management
|
|
51
|
-
|
|
52
|
-
**Location**: `ingestion/event-api/`
|
|
53
|
-
|
|
54
|
-
| Use Case | Source | Format | API | Complexity | File |
|
|
55
|
-
| ---------------------------- | ------ | ---------- | --------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
|
|
56
|
-
| SFTP CSV → Product Event | SFTP | CSV | Event API | Medium | [template-ingestion-sftp-csv-product-event.md](ingestion/event-api/template-ingestion-sftp-csv-product-event.md) ✅ |
|
|
57
|
-
| SFTP JSON → Product Event | SFTP | JSON/JSONL | Event API | Medium | [template-ingestion-sftp-json-product-event.md](ingestion/event-api/template-ingestion-sftp-json-product-event.md) ✅ |
|
|
58
|
-
| S3 CSV → Product Event | S3 | CSV | Event API | Medium | [s3-csv-product-event.md](ingestion/event-api/template-ingestion-s3-csv-product-event.md) |
|
|
59
|
-
| S3 JSON → Product Event | S3 | JSON | Event API | Medium | [s3-json-product-event.md](ingestion/event-api/template-ingestion-s3-json-product-event.md) |
|
|
60
|
-
| S3 XML → Product Event | S3 | XML | Event API | Medium | [s3-xml-product-event.md](ingestion/event-api/template-ingestion-s3-xml-product-event.md) |
|
|
61
|
-
| S3 Parquet → Product Event | S3 | Parquet | Event API | Medium | [s3-parquet-product-event.md](ingestion/event-api/template-ingestion-s3-parquet-product-event.md) |
|
|
62
|
-
| SFTP XML → Product Event | SFTP | XML | Event API | Medium | [sftp-xml-product-event.md](ingestion/event-api/template-ingestion-sftp-xml-product-event.md) |
|
|
63
|
-
| SFTP Parquet → Product Event | SFTP | Parquet | Event API | Medium | [sftp-parquet-product-event.md](ingestion/event-api/template-ingestion-sftp-parquet-product-event.md) |
|
|
64
|
-
|
|
65
|
-
### 🎛️ Control Management ⭐ NEW
|
|
66
|
-
|
|
67
|
-
**Location**: `ingestion/graphql-mutations/`
|
|
68
|
-
|
|
69
|
-
| Use Case | Source | Format | API | Complexity | File |
|
|
70
|
-
| -------------------------- | ------ | ------ | ----------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
71
|
-
| S3 CSV → Control GraphQL | S3 | CSV | GraphQL Mutations | Medium-High | [template-ingestion-s3-csv-control-graphql.md](ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md) ✅ |
|
|
72
|
-
| SFTP CSV → Control GraphQL | SFTP | CSV | GraphQL Mutations | Medium-High | [template-ingestion-sftp-csv-control-graphql.md](ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md) ✅ |
|
|
73
|
-
|
|
74
|
-
**Key Features:**
|
|
75
|
-
|
|
76
|
-
- ✅ **Simplified CSV format** - Single `catalogRef` field (works for both EXCLUSION and QUANTITY_BUFFER)
|
|
77
|
-
- ✅ **3 CSV pattern options** - Pre-built refs, component-based, hybrid
|
|
78
|
-
- ✅ **Bulk GraphQL queries** - 5x faster than individual queries, pagination-aware
|
|
79
|
-
- ✅ **Schema validation** - ControlSchemaValidator ensures spec compliance
|
|
80
|
-
- ✅ **3-level duplicate detection** - File-level, row-level, cross-file tracking
|
|
81
|
-
- ✅ **20+ metrics** - Comprehensive ControlMetricsCollector
|
|
82
|
-
- ✅ **Smart upsert** - Auto-detect create vs update with ControlRefTracker
|
|
83
|
-
- ✅ **Batch mutations** - 12x faster than sequential processing
|
|
84
|
-
|
|
85
|
-
**SFTP-Specific Enhancements:**
|
|
86
|
-
|
|
87
|
-
- ✅ Connection pooling with keep-alive
|
|
88
|
-
- ✅ Automatic retry logic with exponential backoff
|
|
89
|
-
- ✅ Network resilience (handles timeouts, disconnects)
|
|
90
|
-
- ✅ Proper connection disposal in finally blocks
|
|
91
|
-
|
|
92
|
-
### 💰 Price Management
|
|
93
|
-
|
|
94
|
-
**Location**: `price/`
|
|
95
|
-
|
|
96
|
-
| Use Case | Source | Format | API | Complexity | File |
|
|
97
|
-
| ---------------------- | ------ | ------ | ----------------- | ---------- | -------------------------------------------------------------- |
|
|
98
|
-
| S3 CSV → Price GraphQL | S3 | CSV | GraphQL Mutations | Medium | [s3-csv-price-to-graphql.md](ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md) |
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Pattern Matrix
|
|
103
|
-
|
|
104
|
-
### By Data Source
|
|
105
|
-
|
|
106
|
-
| Source | Inventory | Product | Control | Price |
|
|
107
|
-
| ------------------ | --------------------- | ------------------------------- | ---------------- | ---------------- |
|
|
108
|
-
| **S3** | ✅ CSV → Batch | ✅ CSV/JSON/XML/Parquet → Event | ✅ CSV → GraphQL | ✅ CSV → GraphQL |
|
|
109
|
-
| **SFTP** | ✅ CSV → Batch | ✅ CSV/JSON/XML/Parquet → Event | ✅ CSV → GraphQL | - |
|
|
110
|
-
| **Fluent GraphQL** | ✅ Multi-channel sync | - | - | - |
|
|
111
|
-
|
|
112
|
-
### By File Format
|
|
113
|
-
|
|
114
|
-
| Format | Inventory | Product | Control | Price | Parser |
|
|
115
|
-
| -------------- | ----------- | ----------- | ----------- | ----- | ---------------------- |
|
|
116
|
-
| **CSV** | ✅ S3, SFTP | ✅ S3, SFTP | ✅ S3, SFTP | ✅ S3 | `CSVParserService` |
|
|
117
|
-
| **JSON/JSONL** | - | ✅ S3, SFTP | - | - | `JSONParserService` |
|
|
118
|
-
| **XML** | - | ✅ S3, SFTP | - | - | `XMLParserService` |
|
|
119
|
-
| **Parquet** | - | ✅ S3, SFTP | - | - | `ParquetParserService` |
|
|
120
|
-
|
|
121
|
-
### By API Pattern
|
|
122
|
-
|
|
123
|
-
| API | Use Cases | When to Use |
|
|
124
|
-
| --------------------- | ----------------------------------- | ----------------------------------------------------------- |
|
|
125
|
-
| **Batch API** | Inventory sync (S3, SFTP) | High-volume inventory updates with BPP change detection |
|
|
126
|
-
| **Event API** | Product sync (all sources) | Product/location/customer upserts needing workflow triggers |
|
|
127
|
-
| **GraphQL Mutations** | Control, price updates, cycle count | Control groups, rules, prices, single-entity operations |
|
|
128
|
-
| **GraphQL Queries** | Multi-channel sync, control lookup | Extraction, ATP calculations, bulk control existence checks |
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Common Patterns Across All Use Cases
|
|
133
|
-
|
|
134
|
-
### 1. Universal Client Creation
|
|
135
|
-
|
|
136
|
-
All workflows use the same client factory:
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
140
|
-
|
|
141
|
-
// Auto-detects Versori context and configures OAuth2 from connections
|
|
142
|
-
const client = await createClient(ctx);
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### 2. Data Source Configuration
|
|
146
|
-
|
|
147
|
-
**S3DataSource:**
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
import { S3DataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
151
|
-
|
|
152
|
-
const s3 = new S3DataSource(
|
|
153
|
-
{
|
|
154
|
-
type: 'S3_CSV', // or S3_JSON, S3_XML, S3_PARQUET
|
|
155
|
-
connectionId: 'unique-id',
|
|
156
|
-
name: 'Human-readable name',
|
|
157
|
-
s3Config: {
|
|
158
|
-
bucket: 'bucket-name',
|
|
159
|
-
region: 'us-east-1',
|
|
160
|
-
accessKeyId: 'xxx',
|
|
161
|
-
secretAccessKey: 'yyy',
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
logger
|
|
165
|
-
);
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
**SftpDataSource:**
|
|
169
|
-
|
|
170
|
-
```typescript
|
|
171
|
-
import { SftpDataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
172
|
-
|
|
173
|
-
const sftp = new SftpDataSource(
|
|
174
|
-
{
|
|
175
|
-
type: 'SFTP_CSV', // or SFTP_JSON, SFTP_JSONL, SFTP_XML, SFTP_PARQUET
|
|
176
|
-
connectionId: 'unique-id',
|
|
177
|
-
name: 'Human-readable name',
|
|
178
|
-
settings: {
|
|
179
|
-
host: 'sftp.example.com',
|
|
180
|
-
port: 22,
|
|
181
|
-
username: 'user',
|
|
182
|
-
password: 'pass', // OR privateKey
|
|
183
|
-
remotePath: '/incoming',
|
|
184
|
-
filePattern: '*.csv',
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
logger
|
|
188
|
-
);
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### 3. Universal Mapping Pattern
|
|
192
|
-
|
|
193
|
-
One mapping engine for all formats (CSV, JSON, XML, Parquet):
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
197
|
-
|
|
198
|
-
const mapper = new UniversalMapper(
|
|
199
|
-
{
|
|
200
|
-
fields: {
|
|
201
|
-
locationRef: { source: 'location', required: true, resolver: 'sdk.trim' },
|
|
202
|
-
skuRef: { source: 'sku', required: true, resolver: 'sdk.trim' },
|
|
203
|
-
qty: { source: 'quantity', required: true, resolver: 'sdk.parseInt' },
|
|
204
|
-
type: { value: 'ADJUSTMENT', required: true },
|
|
205
|
-
status: { source: 'status', resolver: 'sdk.uppercase', defaultValue: 'ACTIVE' },
|
|
206
|
-
},
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
customResolvers: {
|
|
210
|
-
'custom.splitByPipe': (value, sourceData, config, helpers) => {
|
|
211
|
-
return helpers.ensureArray(value?.split('|') || []);
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
}
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
// Transform data
|
|
218
|
-
const result = await mapper.map(sourceData);
|
|
219
|
-
// Returns: { success: boolean, data: any, errors?: string[] }
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### 4. State Management (Duplicate Prevention)
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
226
|
-
|
|
227
|
-
const fileTracker = new VersoriFileTracker(ctx.openKv(':project:'), 'workflow-prefix');
|
|
228
|
-
|
|
229
|
-
// Check if already processed
|
|
230
|
-
const alreadyProcessed = await fileTracker.wasFileProcessed(fileName);
|
|
231
|
-
if (alreadyProcessed) {
|
|
232
|
-
console.log('Skipping duplicate file');
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// Mark as processed after success
|
|
237
|
-
await fileTracker.markFileProcessed(fileName, { recordCount: 100 });
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### 5. File Operations (All Data Sources)
|
|
241
|
-
|
|
242
|
-
**List Files:**
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
const files = await dataSource.listFiles({
|
|
246
|
-
remotePath: '/path', // SFTP only
|
|
247
|
-
prefix: 'prefix/', // S3 only
|
|
248
|
-
filePattern: '*.csv', // SFTP only
|
|
249
|
-
});
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
**Download File:**
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
const content = await dataSource.downloadFile(filePath, {
|
|
256
|
-
encoding: 'utf8', // For text files
|
|
257
|
-
});
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
**Archive/Move File:**
|
|
261
|
-
|
|
262
|
-
```typescript
|
|
263
|
-
await dataSource.moveFile(
|
|
264
|
-
'/incoming/file.csv',
|
|
265
|
-
'/archive/file.csv',
|
|
266
|
-
true // overwrite if exists
|
|
267
|
-
);
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**Copy File:**
|
|
271
|
-
|
|
272
|
-
```typescript
|
|
273
|
-
await dataSource.copyFile(
|
|
274
|
-
'/incoming/file.csv',
|
|
275
|
-
'/backup/file.csv',
|
|
276
|
-
false // don't overwrite
|
|
277
|
-
);
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
**Delete File:**
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
await dataSource.deleteFile('/temp/file.csv');
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
## API Decision Guide
|
|
289
|
-
|
|
290
|
-
### When to Use Batch API (Inventory Only)
|
|
291
|
-
|
|
292
|
-
✅ **Use Batch API for:**
|
|
293
|
-
|
|
294
|
-
- High-volume inventory updates (1000s+ records)
|
|
295
|
-
- Full inventory snapshots
|
|
296
|
-
- Daily/hourly inventory sync
|
|
297
|
-
- Scenarios needing BPP (Batch Pre-Processing) change detection
|
|
298
|
-
|
|
299
|
-
❌ **Don't Use Batch API for:**
|
|
300
|
-
|
|
301
|
-
- Products, Locations, Customers (use Event API)
|
|
302
|
-
- Low-volume updates (<100 records)
|
|
303
|
-
- Real-time updates
|
|
304
|
-
|
|
305
|
-
**Example:**
|
|
306
|
-
|
|
307
|
-
```typescript
|
|
308
|
-
const job = await client.createJob({
|
|
309
|
-
name: 'Daily Inventory Sync',
|
|
310
|
-
retailerId: 'my-retailer',
|
|
311
|
-
// BPP enabled by default
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
await client.sendBatch(job.id, {
|
|
315
|
-
action: 'UPSERT',
|
|
316
|
-
entityType: 'INVENTORY',
|
|
317
|
-
source: 'S3_CSV',
|
|
318
|
-
event: 'INVENTORY_SYNC',
|
|
319
|
-
entities: inventoryRecords,
|
|
320
|
-
});
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
### When to Use Event API
|
|
324
|
-
|
|
325
|
-
✅ **Use Event API for:**
|
|
326
|
-
|
|
327
|
-
- **Products**: Catalog sync, variant updates
|
|
328
|
-
- **Locations**: Store/warehouse setup
|
|
329
|
-
- **Customers**: Registration, profile updates
|
|
330
|
-
- **Orders**: Single order creation
|
|
331
|
-
- **Custom Entities**: Any entity needing workflow triggers
|
|
332
|
-
|
|
333
|
-
**Example:**
|
|
334
|
-
|
|
335
|
-
```typescript
|
|
336
|
-
await client.sendEvent(
|
|
337
|
-
{
|
|
338
|
-
name: 'UPSERT_PRODUCT',
|
|
339
|
-
entityType: 'PRODUCT',
|
|
340
|
-
entitySubtype: 'VARIANT',
|
|
341
|
-
entityRef: catalogueRef,
|
|
342
|
-
rootEntityType: 'PRODUCT_CATALOGUE',
|
|
343
|
-
rootEntityRef: catalogueRef,
|
|
344
|
-
attributes: productData,
|
|
345
|
-
},
|
|
346
|
-
'async' // or 'sync'
|
|
347
|
-
);
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### When to Use GraphQL Mutations
|
|
351
|
-
|
|
352
|
-
✅ **Use GraphQL for:**
|
|
353
|
-
|
|
354
|
-
- Price updates (no Event API support)
|
|
355
|
-
- Single-entity operations
|
|
356
|
-
- Complex queries with relationships
|
|
357
|
-
- Testing/debugging
|
|
358
|
-
|
|
359
|
-
**Example:**
|
|
360
|
-
|
|
361
|
-
```typescript
|
|
362
|
-
await client.graphql({
|
|
363
|
-
query: `
|
|
364
|
-
mutation UpdatePrice($input: UpdatePriceInput!) {
|
|
365
|
-
updatePrice(input: $input) {
|
|
366
|
-
id
|
|
367
|
-
ref
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
`,
|
|
371
|
-
variables: { input: priceData },
|
|
372
|
-
});
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
---
|
|
376
|
-
|
|
377
|
-
## Troubleshooting Common Issues
|
|
378
|
-
|
|
379
|
-
### Issue: "Missing required field: connectionId"
|
|
380
|
-
|
|
381
|
-
**Solution**: All data sources now require `connectionId` and `name` fields:
|
|
382
|
-
|
|
383
|
-
```typescript
|
|
384
|
-
new S3DataSource({
|
|
385
|
-
type: 'S3_CSV',
|
|
386
|
-
connectionId: 'unique-id', // ← Required
|
|
387
|
-
name: 'Friendly Name', // ← Required
|
|
388
|
-
s3Config: { ... }
|
|
389
|
-
}, logger);
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
### Issue: "sendBatch requires action, entityType, source, event"
|
|
393
|
-
|
|
394
|
-
**Solution**: Batch API payloads must include all required fields:
|
|
395
|
-
|
|
396
|
-
```typescript
|
|
397
|
-
await client.sendBatch(jobId, {
|
|
398
|
-
action: 'UPSERT', // ← Required
|
|
399
|
-
entityType: 'INVENTORY', // ← Required
|
|
400
|
-
source: 'S3_CSV', // ← Required
|
|
401
|
-
event: 'INVENTORY_SYNC', // ← Required
|
|
402
|
-
entities: records,
|
|
403
|
-
});
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
### Issue: "UniversalMapper: cannot use logger option"
|
|
407
|
-
|
|
408
|
-
**Solution**: UniversalMapper constructor changed - no longer accepts `{ logger, fluentClient }`:
|
|
409
|
-
|
|
410
|
-
```typescript
|
|
411
|
-
// ❌ Old (incorrect):
|
|
412
|
-
new UniversalMapper(config, { logger, fluentClient });
|
|
413
|
-
|
|
414
|
-
// ✅ New (correct):
|
|
415
|
-
new UniversalMapper(config, { customResolvers });
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
### Issue: "wasFileProcessed is not a function"
|
|
419
|
-
|
|
420
|
-
**Solution**: Use correct method name:
|
|
421
|
-
|
|
422
|
-
```typescript
|
|
423
|
-
// ❌ Old:
|
|
424
|
-
await fileTracker.isFileProcessed(fileName);
|
|
425
|
-
|
|
426
|
-
// ✅ Correct:
|
|
427
|
-
await fileTracker.wasFileProcessed(fileName);
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
---
|
|
431
|
-
|
|
432
|
-
## Best Practices
|
|
433
|
-
|
|
434
|
-
### 1. Always Use State Management
|
|
435
|
-
|
|
436
|
-
Prevent duplicate processing across workflow runs:
|
|
437
|
-
|
|
438
|
-
```typescript
|
|
439
|
-
const fileTracker = new VersoriFileTracker(ctx.openKv(':project:'), 'unique-prefix');
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### 2. Archive Files After Processing
|
|
443
|
-
|
|
444
|
-
```typescript
|
|
445
|
-
// file.name contains just filename, file.path contains full path
|
|
446
|
-
await dataSource.moveFile(file.path, `${archivePath}/${file.name}`);
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
### 3. Use BPP for Full Snapshots
|
|
450
|
-
|
|
451
|
-
For full inventory snapshots, let BPP filter unchanged records:
|
|
452
|
-
|
|
453
|
-
```typescript
|
|
454
|
-
const job = await client.createJob({
|
|
455
|
-
name: 'Daily Full Inventory',
|
|
456
|
-
retailerId: 'my-retailer',
|
|
457
|
-
// BPP enabled by default
|
|
458
|
-
});
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### 4. Skip BPP for Delta Feeds
|
|
462
|
-
|
|
463
|
-
For pre-filtered delta feeds:
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
const job = await client.createJob({
|
|
467
|
-
name: 'Hourly Deltas',
|
|
468
|
-
retailerId: 'my-retailer',
|
|
469
|
-
meta: {
|
|
470
|
-
preprocessing: 'skip', // Skip BPP
|
|
471
|
-
},
|
|
472
|
-
});
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
### 5. Use Async Mode for Events
|
|
476
|
-
|
|
477
|
-
For scalability and throughput:
|
|
478
|
-
|
|
479
|
-
```typescript
|
|
480
|
-
await client.sendEvent(event, 'async'); // Recommended
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
### 6. MemoryInterpreter Pattern (Local Testing)
|
|
484
|
-
|
|
485
|
-
When developing workflows locally, use MemoryInterpreter for testing:
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
// index.ts - Entry point for local development/testing
|
|
489
|
-
import { MemoryInterpreter } from '@versori/run';
|
|
490
|
-
import { dailyInventorySync } from './src/workflows/scheduled/daily-inventory-sync';
|
|
491
|
-
import { adhocInventorySync } from './src/workflows/webhook/adhoc-inventory-sync';
|
|
492
|
-
|
|
493
|
-
async function main(): Promise<void> {
|
|
494
|
-
const mi = await MemoryInterpreter.newInstance();
|
|
495
|
-
mi.register(dailyInventorySync);
|
|
496
|
-
mi.register(adhocInventorySync);
|
|
497
|
-
await mi.start();
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
main().then().catch((err) => console.error('Failed to run main()', err));
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
**Important:** MemoryInterpreter is for local development only - Versori platform handles workflow registration automatically when deployed.
|
|
504
|
-
|
|
505
|
-
### 7. Optional Feature Toggles
|
|
506
|
-
|
|
507
|
-
Use activation variables to enable/disable optional features:
|
|
508
|
-
|
|
509
|
-
```typescript
|
|
510
|
-
// Optional: Disable file tracking for testing (enabled by default)
|
|
511
|
-
const enableFileTracking = activation.getVariable('enableFileTracking') !== 'false';
|
|
512
|
-
|
|
513
|
-
if (enableFileTracking) {
|
|
514
|
-
const alreadyProcessed = await fileTracker.wasFileProcessed(fileName);
|
|
515
|
-
if (alreadyProcessed) {
|
|
516
|
-
log.info('Skipping duplicate file');
|
|
517
|
-
continue;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
// Optional: Enable detailed logging for debugging (disabled by default)
|
|
522
|
-
const detailedLogging = activation.getVariable('detailedLogging') === 'true';
|
|
523
|
-
|
|
524
|
-
if (detailedLogging) {
|
|
525
|
-
log.info('Detailed processing metrics', {
|
|
526
|
-
fileSize: file.size,
|
|
527
|
-
parseTime: parseEndTime - parseStartTime,
|
|
528
|
-
mappingTime: mapEndTime - mapStartTime,
|
|
529
|
-
uploadTime: uploadEndTime - uploadStartTime,
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
// Optional: Control BPP behavior
|
|
534
|
-
const bppEnabled = activation.getVariable('bppEnabled') !== 'false';
|
|
535
|
-
|
|
536
|
-
const job = await client.createJob({
|
|
537
|
-
name: 'Inventory Sync',
|
|
538
|
-
retailerId: 'my-retailer',
|
|
539
|
-
meta: bppEnabled ? {} : { preprocessing: 'skip' },
|
|
540
|
-
});
|
|
541
|
-
```
|
|
542
|
-
|
|
543
|
-
**Common Feature Toggles:**
|
|
544
|
-
|
|
545
|
-
| Variable | Default | Purpose |
|
|
546
|
-
|----------|---------|---------|
|
|
547
|
-
| `enableFileTracking` | `true` | Prevent duplicate file processing |
|
|
548
|
-
| `detailedLogging` | `false` | Enable verbose logging for debugging |
|
|
549
|
-
| `bppEnabled` | `true` | Enable Batch Pre-Processing change detection |
|
|
550
|
-
| `maxFilesPerRun` | `10` | Limit files processed per workflow execution |
|
|
551
|
-
|
|
552
|
-
### 8. Emoji Logging Best Practices
|
|
553
|
-
|
|
554
|
-
Use emojis in logs for better readability in Versori UI:
|
|
555
|
-
|
|
556
|
-
```typescript
|
|
557
|
-
// Execution status
|
|
558
|
-
log.info('✅ EXECUTION COMPLETED', { jobId, filesProcessed: 5 });
|
|
559
|
-
log.error('❌ EXECUTION FAILED', { jobId, error: 'Connection timeout' });
|
|
560
|
-
log.warn('⚠️ PARTIAL SUCCESS', { jobId, filesProcessed: 3, filesFailed: 2 });
|
|
561
|
-
|
|
562
|
-
// Processing stages
|
|
563
|
-
log.info('📦 Starting file processing', { fileName: 'inventory.xml' });
|
|
564
|
-
log.info('✅ File processed successfully', { fileName: 'inventory.xml', recordCount: 1000 });
|
|
565
|
-
log.error('❌ File processing failed', { fileName: 'inventory.xml', error: 'Parse error' });
|
|
566
|
-
|
|
567
|
-
// Configuration
|
|
568
|
-
log.info('⚙️ Configuration loaded', { sftpHost, remotePath, batchSize });
|
|
569
|
-
log.warn('⚠️ Using default configuration', { reason: 'Missing activation variable' });
|
|
570
|
-
|
|
571
|
-
// State management
|
|
572
|
-
log.info('🔍 Checking file status', { fileName: 'inventory.xml' });
|
|
573
|
-
log.info('⏭️ Skipping duplicate file', { fileName: 'inventory.xml' });
|
|
574
|
-
log.info('📝 Marking file as processed', { fileName: 'inventory.xml' });
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
**Recommended Emojis:**
|
|
578
|
-
|
|
579
|
-
| Emoji | Use Case | Example |
|
|
580
|
-
|-------|----------|---------|
|
|
581
|
-
| ✅ | Success | `'✅ File uploaded successfully'` |
|
|
582
|
-
| ❌ | Error | `'❌ Failed to connect to SFTP'` |
|
|
583
|
-
| ⚠️ | Warning | `'⚠️ File already exists, skipping'` |
|
|
584
|
-
| 📦 | Processing | `'📦 Processing batch 1 of 10'` |
|
|
585
|
-
| 🔍 | Discovery | `'🔍 Found 5 files to process'` |
|
|
586
|
-
| ⏭️ | Skipping | `'⏭️ Skipping already processed file'` |
|
|
587
|
-
| 📝 | State change | `'📝 Marking file as processed'` |
|
|
588
|
-
| ⚙️ | Configuration | `'⚙️ Initializing SFTP connection'` |
|
|
589
|
-
|
|
590
|
-
**Guidelines:**
|
|
591
|
-
|
|
592
|
-
- Use emojis for high-level status logs (execution start/end, major milestones)
|
|
593
|
-
- Don't overuse - limit to important log entries
|
|
594
|
-
- Be consistent across workflows (same emoji = same meaning)
|
|
595
|
-
- Combine with structured data for filtering: `log.info('✅ Success', { status: 'completed' })`
|
|
596
|
-
|
|
597
|
-
---
|
|
598
|
-
|
|
599
|
-
## Caveats and gotchas (S3 and SFTP)
|
|
600
|
-
|
|
601
|
-
Use these safeguards across all scheduled guides to avoid common pitfalls:
|
|
602
|
-
|
|
603
|
-
- S3 cross-bucket moves: `moveFile(sourceKey, destKey, { sourceBucket })` is required when the source object is not in the configured destination bucket. Copy succeeds cross-bucket, but delete must be signed against the source bucket. The SDK handles this via a temporary presigner when you pass `sourceBucket`.
|
|
604
|
-
- S3 move semantics: There is no native move; it's copy then delete. If delete fails after copy, the destination remains. Treat moves as idempotent; retries may leave the destination already present. Prefer archive paths that are safe to overwrite or add timestamps.
|
|
605
|
-
- S3 metadata on copy: Use `copyFile(source, dest, { metadata })` to replace metadata; S3 "metadata-directive: REPLACE" behavior is applied. If omitted, S3 copies existing metadata.
|
|
606
|
-
- S3 content encodings: For text files use `{ encoding: 'utf8' }`. For binary (Parquet) omit encoding to receive a Buffer.
|
|
607
|
-
- SFTP overwrite: `moveFile`, `copyFile` support an `overwrite` boolean. Set `true` to replace existing files at the destination.
|
|
608
|
-
- SFTP directory creation: Use `createDirectory(path, true)` before uploads if parent folders may not exist, or pass `{ createDirectories: true }` in `uploadFile()` options.
|
|
609
|
-
- SFTP path format: Paths are POSIX-style with forward slashes. Avoid Windows backslashes in remote paths.
|
|
610
|
-
- Disposing SFTP connections: Always `await sftp.dispose()` in a `finally` block to close sockets in scheduled workflows.
|
|
611
|
-
- CSV delimiters: Respect `csvDelimiter` activation variable; defaults to `,`. Mismatches cause mapping errors.
|
|
612
|
-
- Batch API BPP: Enabled by default. For delta feeds, set `meta: { preprocessing: 'skip' }` when creating the job.
|
|
613
|
-
- Mapping imports: When importing mapping JSON in TypeScript, ensure `tsconfig.json` has `"resolveJsonModule": true`.
|
|
614
|
-
- Attributes array vs object: Fluent APIs often expect arrays (e.g., attributes). If mapping to an object, convert to array before sending, or use a custom resolver to emit an array.
|
|
615
|
-
|
|
616
|
-
Referenced guides with examples implementing these:
|
|
617
|
-
|
|
618
|
-
- Inventory (S3): `ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md` → Advanced S3 file operations
|
|
619
|
-
- Inventory (SFTP): `ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md` → Advanced SFTP file operations and `dispose()`
|
|
620
|
-
|
|
621
|
-
---
|
|
622
|
-
|
|
623
|
-
## Additional Resources
|
|
624
|
-
|
|
625
|
-
- **SDK Documentation**: [fc-connect-sdk README](../../../../readme.md)
|
|
626
|
-
- **Universal Mapping Guide**: [UNIVERSAL-MAPPING.md](../../../02-CORE-GUIDES/mapping/mapping-readme.md)
|
|
627
|
-
- **Decision Tree**: [DECISION-TREE.md](../../../00-START-HERE/decision-tree.md)
|
|
628
|
-
- **Troubleshooting**: [troubleshooting-quick-reference.md](../../../00-START-HERE/troubleshooting-quick-reference.md)
|
|
629
|
-
- **SDK Philosophy**: [SDK-PHILOSOPHY.md](../../../00-START-HERE/sdk-philosophy.md)
|
|
630
|
-
|
|
631
|
-
---
|
|
632
|
-
|
|
633
|
-
## Contributing
|
|
634
|
-
|
|
635
|
-
When adding new use cases:
|
|
636
|
-
|
|
637
|
-
1. Place in appropriate category folder (inventory/, product/, price/)
|
|
638
|
-
2. Follow naming convention: `{source}-{format}-{entity}-to-{api}.md`
|
|
639
|
-
3. Include complete working code
|
|
640
|
-
4. Verify all SDK method signatures
|
|
641
|
-
5. Add entry to this README
|
|
642
|
-
|
|
643
|
-
---
|
|
644
|
-
|
|
645
|
-
**✅ All use cases verified against SDK ^0.1.27**
|
|
646
|
-
**📅 Last updated**: 2025-10-30
|
|
1
|
+
# Versori Scheduled Workflows - Use Case Guide
|
|
2
|
+
|
|
3
|
+
**FC Connect SDK** - Production-ready patterns for scheduled workflows on the Versori platform.
|
|
4
|
+
|
|
5
|
+
> **SDK**: [@fluentcommerce/fc-connect-sdk](https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk)
|
|
6
|
+
> **Version**: Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
This directory contains verified, production-ready use case guides organized by entity type. Each guide includes:
|
|
13
|
+
|
|
14
|
+
✅ **Complete working code** - Copy-paste ready
|
|
15
|
+
✅ **SDK method verification** - All signatures checked against SDK source
|
|
16
|
+
✅ **Best practices** - Error handling, state management, archiving
|
|
17
|
+
✅ **Configuration examples** - Activation variables, mappings, resolvers
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Quick Navigation by Entity Type
|
|
22
|
+
|
|
23
|
+
### 🔗 Rubix Webhook Patterns ⭐ NEW
|
|
24
|
+
|
|
25
|
+
**Location**: `rubix-webhooks/`
|
|
26
|
+
|
|
27
|
+
| Use Case | Description | Complexity | File |
|
|
28
|
+
|----------|-------------|------------|------|
|
|
29
|
+
| Fluent Rubix Webhook Pattern | Receive webhooks from Rubix workflows, validate signature, query entity, do logic | Medium | [template-fluent-rubix-webhook-pattern.md](rubix-webhooks/template-fluent-rubix-webhook-pattern.md) |
|
|
30
|
+
|
|
31
|
+
**Key Features:**
|
|
32
|
+
- ✅ Complete Rubix workflow configuration guide
|
|
33
|
+
- ✅ Webhook signature validation using FluentClient
|
|
34
|
+
- ✅ Entity extraction from payload
|
|
35
|
+
- ✅ GraphQL queries to fetch entity details
|
|
36
|
+
- ✅ Business logic processing
|
|
37
|
+
- ✅ Structured response handling
|
|
38
|
+
|
|
39
|
+
### 📦 Inventory Management
|
|
40
|
+
|
|
41
|
+
**Location**: `inventory/`
|
|
42
|
+
|
|
43
|
+
| Use Case | Source | Format | API | Complexity | File |
|
|
44
|
+
| -------------------------- | -------------- | ------ | ------------- | ---------- | ---------------------------------------------------------------------------- |
|
|
45
|
+
| S3 → Inventory Batch | S3 | CSV | Batch API | Medium | [template-ingestion-s3-csv-inventory-batch.md](ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md) |
|
|
46
|
+
| SFTP → Inventory Batch | SFTP | CSV | Batch API | Medium | [template-ingestion-sftp-csv-inventory-batch.md](ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md) |
|
|
47
|
+
| Cycle Count Reconciliation | S3 | CSV | GraphQL | High | [cycle-count-reconciliation.md](ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md) |
|
|
48
|
+
| Multi-Channel Sync | Fluent GraphQL | - | External APIs | High | [multi-channel-inventory-sync.md](ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md) |
|
|
49
|
+
|
|
50
|
+
### 🏷️ Product Management
|
|
51
|
+
|
|
52
|
+
**Location**: `ingestion/event-api/`
|
|
53
|
+
|
|
54
|
+
| Use Case | Source | Format | API | Complexity | File |
|
|
55
|
+
| ---------------------------- | ------ | ---------- | --------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
|
|
56
|
+
| SFTP CSV → Product Event | SFTP | CSV | Event API | Medium | [template-ingestion-sftp-csv-product-event.md](ingestion/event-api/template-ingestion-sftp-csv-product-event.md) ✅ |
|
|
57
|
+
| SFTP JSON → Product Event | SFTP | JSON/JSONL | Event API | Medium | [template-ingestion-sftp-json-product-event.md](ingestion/event-api/template-ingestion-sftp-json-product-event.md) ✅ |
|
|
58
|
+
| S3 CSV → Product Event | S3 | CSV | Event API | Medium | [s3-csv-product-event.md](ingestion/event-api/template-ingestion-s3-csv-product-event.md) |
|
|
59
|
+
| S3 JSON → Product Event | S3 | JSON | Event API | Medium | [s3-json-product-event.md](ingestion/event-api/template-ingestion-s3-json-product-event.md) |
|
|
60
|
+
| S3 XML → Product Event | S3 | XML | Event API | Medium | [s3-xml-product-event.md](ingestion/event-api/template-ingestion-s3-xml-product-event.md) |
|
|
61
|
+
| S3 Parquet → Product Event | S3 | Parquet | Event API | Medium | [s3-parquet-product-event.md](ingestion/event-api/template-ingestion-s3-parquet-product-event.md) |
|
|
62
|
+
| SFTP XML → Product Event | SFTP | XML | Event API | Medium | [sftp-xml-product-event.md](ingestion/event-api/template-ingestion-sftp-xml-product-event.md) |
|
|
63
|
+
| SFTP Parquet → Product Event | SFTP | Parquet | Event API | Medium | [sftp-parquet-product-event.md](ingestion/event-api/template-ingestion-sftp-parquet-product-event.md) |
|
|
64
|
+
|
|
65
|
+
### 🎛️ Control Management ⭐ NEW
|
|
66
|
+
|
|
67
|
+
**Location**: `ingestion/graphql-mutations/`
|
|
68
|
+
|
|
69
|
+
| Use Case | Source | Format | API | Complexity | File |
|
|
70
|
+
| -------------------------- | ------ | ------ | ----------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
71
|
+
| S3 CSV → Control GraphQL | S3 | CSV | GraphQL Mutations | Medium-High | [template-ingestion-s3-csv-control-graphql.md](ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md) ✅ |
|
|
72
|
+
| SFTP CSV → Control GraphQL | SFTP | CSV | GraphQL Mutations | Medium-High | [template-ingestion-sftp-csv-control-graphql.md](ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md) ✅ |
|
|
73
|
+
|
|
74
|
+
**Key Features:**
|
|
75
|
+
|
|
76
|
+
- ✅ **Simplified CSV format** - Single `catalogRef` field (works for both EXCLUSION and QUANTITY_BUFFER)
|
|
77
|
+
- ✅ **3 CSV pattern options** - Pre-built refs, component-based, hybrid
|
|
78
|
+
- ✅ **Bulk GraphQL queries** - 5x faster than individual queries, pagination-aware
|
|
79
|
+
- ✅ **Schema validation** - ControlSchemaValidator ensures spec compliance
|
|
80
|
+
- ✅ **3-level duplicate detection** - File-level, row-level, cross-file tracking
|
|
81
|
+
- ✅ **20+ metrics** - Comprehensive ControlMetricsCollector
|
|
82
|
+
- ✅ **Smart upsert** - Auto-detect create vs update with ControlRefTracker
|
|
83
|
+
- ✅ **Batch mutations** - 12x faster than sequential processing
|
|
84
|
+
|
|
85
|
+
**SFTP-Specific Enhancements:**
|
|
86
|
+
|
|
87
|
+
- ✅ Connection pooling with keep-alive
|
|
88
|
+
- ✅ Automatic retry logic with exponential backoff
|
|
89
|
+
- ✅ Network resilience (handles timeouts, disconnects)
|
|
90
|
+
- ✅ Proper connection disposal in finally blocks
|
|
91
|
+
|
|
92
|
+
### 💰 Price Management
|
|
93
|
+
|
|
94
|
+
**Location**: `price/`
|
|
95
|
+
|
|
96
|
+
| Use Case | Source | Format | API | Complexity | File |
|
|
97
|
+
| ---------------------- | ------ | ------ | ----------------- | ---------- | -------------------------------------------------------------- |
|
|
98
|
+
| S3 CSV → Price GraphQL | S3 | CSV | GraphQL Mutations | Medium | [s3-csv-price-to-graphql.md](ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md) |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Pattern Matrix
|
|
103
|
+
|
|
104
|
+
### By Data Source
|
|
105
|
+
|
|
106
|
+
| Source | Inventory | Product | Control | Price |
|
|
107
|
+
| ------------------ | --------------------- | ------------------------------- | ---------------- | ---------------- |
|
|
108
|
+
| **S3** | ✅ CSV → Batch | ✅ CSV/JSON/XML/Parquet → Event | ✅ CSV → GraphQL | ✅ CSV → GraphQL |
|
|
109
|
+
| **SFTP** | ✅ CSV → Batch | ✅ CSV/JSON/XML/Parquet → Event | ✅ CSV → GraphQL | - |
|
|
110
|
+
| **Fluent GraphQL** | ✅ Multi-channel sync | - | - | - |
|
|
111
|
+
|
|
112
|
+
### By File Format
|
|
113
|
+
|
|
114
|
+
| Format | Inventory | Product | Control | Price | Parser |
|
|
115
|
+
| -------------- | ----------- | ----------- | ----------- | ----- | ---------------------- |
|
|
116
|
+
| **CSV** | ✅ S3, SFTP | ✅ S3, SFTP | ✅ S3, SFTP | ✅ S3 | `CSVParserService` |
|
|
117
|
+
| **JSON/JSONL** | - | ✅ S3, SFTP | - | - | `JSONParserService` |
|
|
118
|
+
| **XML** | - | ✅ S3, SFTP | - | - | `XMLParserService` |
|
|
119
|
+
| **Parquet** | - | ✅ S3, SFTP | - | - | `ParquetParserService` |
|
|
120
|
+
|
|
121
|
+
### By API Pattern
|
|
122
|
+
|
|
123
|
+
| API | Use Cases | When to Use |
|
|
124
|
+
| --------------------- | ----------------------------------- | ----------------------------------------------------------- |
|
|
125
|
+
| **Batch API** | Inventory sync (S3, SFTP) | High-volume inventory updates with BPP change detection |
|
|
126
|
+
| **Event API** | Product sync (all sources) | Product/location/customer upserts needing workflow triggers |
|
|
127
|
+
| **GraphQL Mutations** | Control, price updates, cycle count | Control groups, rules, prices, single-entity operations |
|
|
128
|
+
| **GraphQL Queries** | Multi-channel sync, control lookup | Extraction, ATP calculations, bulk control existence checks |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Common Patterns Across All Use Cases
|
|
133
|
+
|
|
134
|
+
### 1. Universal Client Creation
|
|
135
|
+
|
|
136
|
+
All workflows use the same client factory:
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
140
|
+
|
|
141
|
+
// Auto-detects Versori context and configures OAuth2 from connections
|
|
142
|
+
const client = await createClient(ctx);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 2. Data Source Configuration
|
|
146
|
+
|
|
147
|
+
**S3DataSource:**
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
import { S3DataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
151
|
+
|
|
152
|
+
const s3 = new S3DataSource(
|
|
153
|
+
{
|
|
154
|
+
type: 'S3_CSV', // or S3_JSON, S3_XML, S3_PARQUET
|
|
155
|
+
connectionId: 'unique-id',
|
|
156
|
+
name: 'Human-readable name',
|
|
157
|
+
s3Config: {
|
|
158
|
+
bucket: 'bucket-name',
|
|
159
|
+
region: 'us-east-1',
|
|
160
|
+
accessKeyId: 'xxx',
|
|
161
|
+
secretAccessKey: 'yyy',
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
logger
|
|
165
|
+
);
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**SftpDataSource:**
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
import { SftpDataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
172
|
+
|
|
173
|
+
const sftp = new SftpDataSource(
|
|
174
|
+
{
|
|
175
|
+
type: 'SFTP_CSV', // or SFTP_JSON, SFTP_JSONL, SFTP_XML, SFTP_PARQUET
|
|
176
|
+
connectionId: 'unique-id',
|
|
177
|
+
name: 'Human-readable name',
|
|
178
|
+
settings: {
|
|
179
|
+
host: 'sftp.example.com',
|
|
180
|
+
port: 22,
|
|
181
|
+
username: 'user',
|
|
182
|
+
password: 'pass', // OR privateKey
|
|
183
|
+
remotePath: '/incoming',
|
|
184
|
+
filePattern: '*.csv',
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
logger
|
|
188
|
+
);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 3. Universal Mapping Pattern
|
|
192
|
+
|
|
193
|
+
One mapping engine for all formats (CSV, JSON, XML, Parquet):
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
197
|
+
|
|
198
|
+
const mapper = new UniversalMapper(
|
|
199
|
+
{
|
|
200
|
+
fields: {
|
|
201
|
+
locationRef: { source: 'location', required: true, resolver: 'sdk.trim' },
|
|
202
|
+
skuRef: { source: 'sku', required: true, resolver: 'sdk.trim' },
|
|
203
|
+
qty: { source: 'quantity', required: true, resolver: 'sdk.parseInt' },
|
|
204
|
+
type: { value: 'ADJUSTMENT', required: true },
|
|
205
|
+
status: { source: 'status', resolver: 'sdk.uppercase', defaultValue: 'ACTIVE' },
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
customResolvers: {
|
|
210
|
+
'custom.splitByPipe': (value, sourceData, config, helpers) => {
|
|
211
|
+
return helpers.ensureArray(value?.split('|') || []);
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
// Transform data
|
|
218
|
+
const result = await mapper.map(sourceData);
|
|
219
|
+
// Returns: { success: boolean, data: any, errors?: string[] }
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### 4. State Management (Duplicate Prevention)
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
226
|
+
|
|
227
|
+
const fileTracker = new VersoriFileTracker(ctx.openKv(':project:'), 'workflow-prefix');
|
|
228
|
+
|
|
229
|
+
// Check if already processed
|
|
230
|
+
const alreadyProcessed = await fileTracker.wasFileProcessed(fileName);
|
|
231
|
+
if (alreadyProcessed) {
|
|
232
|
+
console.log('Skipping duplicate file');
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Mark as processed after success
|
|
237
|
+
await fileTracker.markFileProcessed(fileName, { recordCount: 100 });
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 5. File Operations (All Data Sources)
|
|
241
|
+
|
|
242
|
+
**List Files:**
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
const files = await dataSource.listFiles({
|
|
246
|
+
remotePath: '/path', // SFTP only
|
|
247
|
+
prefix: 'prefix/', // S3 only
|
|
248
|
+
filePattern: '*.csv', // SFTP only
|
|
249
|
+
});
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Download File:**
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
const content = await dataSource.downloadFile(filePath, {
|
|
256
|
+
encoding: 'utf8', // For text files
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Archive/Move File:**
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
await dataSource.moveFile(
|
|
264
|
+
'/incoming/file.csv',
|
|
265
|
+
'/archive/file.csv',
|
|
266
|
+
true // overwrite if exists
|
|
267
|
+
);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Copy File:**
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
await dataSource.copyFile(
|
|
274
|
+
'/incoming/file.csv',
|
|
275
|
+
'/backup/file.csv',
|
|
276
|
+
false // don't overwrite
|
|
277
|
+
);
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Delete File:**
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
await dataSource.deleteFile('/temp/file.csv');
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## API Decision Guide
|
|
289
|
+
|
|
290
|
+
### When to Use Batch API (Inventory Only)
|
|
291
|
+
|
|
292
|
+
✅ **Use Batch API for:**
|
|
293
|
+
|
|
294
|
+
- High-volume inventory updates (1000s+ records)
|
|
295
|
+
- Full inventory snapshots
|
|
296
|
+
- Daily/hourly inventory sync
|
|
297
|
+
- Scenarios needing BPP (Batch Pre-Processing) change detection
|
|
298
|
+
|
|
299
|
+
❌ **Don't Use Batch API for:**
|
|
300
|
+
|
|
301
|
+
- Products, Locations, Customers (use Event API)
|
|
302
|
+
- Low-volume updates (<100 records)
|
|
303
|
+
- Real-time updates
|
|
304
|
+
|
|
305
|
+
**Example:**
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
const job = await client.createJob({
|
|
309
|
+
name: 'Daily Inventory Sync',
|
|
310
|
+
retailerId: 'my-retailer',
|
|
311
|
+
// BPP enabled by default
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
await client.sendBatch(job.id, {
|
|
315
|
+
action: 'UPSERT',
|
|
316
|
+
entityType: 'INVENTORY',
|
|
317
|
+
source: 'S3_CSV',
|
|
318
|
+
event: 'INVENTORY_SYNC',
|
|
319
|
+
entities: inventoryRecords,
|
|
320
|
+
});
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### When to Use Event API
|
|
324
|
+
|
|
325
|
+
✅ **Use Event API for:**
|
|
326
|
+
|
|
327
|
+
- **Products**: Catalog sync, variant updates
|
|
328
|
+
- **Locations**: Store/warehouse setup
|
|
329
|
+
- **Customers**: Registration, profile updates
|
|
330
|
+
- **Orders**: Single order creation
|
|
331
|
+
- **Custom Entities**: Any entity needing workflow triggers
|
|
332
|
+
|
|
333
|
+
**Example:**
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
await client.sendEvent(
|
|
337
|
+
{
|
|
338
|
+
name: 'UPSERT_PRODUCT',
|
|
339
|
+
entityType: 'PRODUCT',
|
|
340
|
+
entitySubtype: 'VARIANT',
|
|
341
|
+
entityRef: catalogueRef,
|
|
342
|
+
rootEntityType: 'PRODUCT_CATALOGUE',
|
|
343
|
+
rootEntityRef: catalogueRef,
|
|
344
|
+
attributes: productData,
|
|
345
|
+
},
|
|
346
|
+
'async' // or 'sync'
|
|
347
|
+
);
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### When to Use GraphQL Mutations
|
|
351
|
+
|
|
352
|
+
✅ **Use GraphQL for:**
|
|
353
|
+
|
|
354
|
+
- Price updates (no Event API support)
|
|
355
|
+
- Single-entity operations
|
|
356
|
+
- Complex queries with relationships
|
|
357
|
+
- Testing/debugging
|
|
358
|
+
|
|
359
|
+
**Example:**
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
await client.graphql({
|
|
363
|
+
query: `
|
|
364
|
+
mutation UpdatePrice($input: UpdatePriceInput!) {
|
|
365
|
+
updatePrice(input: $input) {
|
|
366
|
+
id
|
|
367
|
+
ref
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
`,
|
|
371
|
+
variables: { input: priceData },
|
|
372
|
+
});
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Troubleshooting Common Issues
|
|
378
|
+
|
|
379
|
+
### Issue: "Missing required field: connectionId"
|
|
380
|
+
|
|
381
|
+
**Solution**: All data sources now require `connectionId` and `name` fields:
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
new S3DataSource({
|
|
385
|
+
type: 'S3_CSV',
|
|
386
|
+
connectionId: 'unique-id', // ← Required
|
|
387
|
+
name: 'Friendly Name', // ← Required
|
|
388
|
+
s3Config: { ... }
|
|
389
|
+
}, logger);
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Issue: "sendBatch requires action, entityType, source, event"
|
|
393
|
+
|
|
394
|
+
**Solution**: Batch API payloads must include all required fields:
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
await client.sendBatch(jobId, {
|
|
398
|
+
action: 'UPSERT', // ← Required
|
|
399
|
+
entityType: 'INVENTORY', // ← Required
|
|
400
|
+
source: 'S3_CSV', // ← Required
|
|
401
|
+
event: 'INVENTORY_SYNC', // ← Required
|
|
402
|
+
entities: records,
|
|
403
|
+
});
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Issue: "UniversalMapper: cannot use logger option"
|
|
407
|
+
|
|
408
|
+
**Solution**: UniversalMapper constructor changed - no longer accepts `{ logger, fluentClient }`:
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
// ❌ Old (incorrect):
|
|
412
|
+
new UniversalMapper(config, { logger, fluentClient });
|
|
413
|
+
|
|
414
|
+
// ✅ New (correct):
|
|
415
|
+
new UniversalMapper(config, { customResolvers });
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Issue: "wasFileProcessed is not a function"
|
|
419
|
+
|
|
420
|
+
**Solution**: Use correct method name:
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
// ❌ Old:
|
|
424
|
+
await fileTracker.isFileProcessed(fileName);
|
|
425
|
+
|
|
426
|
+
// ✅ Correct:
|
|
427
|
+
await fileTracker.wasFileProcessed(fileName);
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## Best Practices
|
|
433
|
+
|
|
434
|
+
### 1. Always Use State Management
|
|
435
|
+
|
|
436
|
+
Prevent duplicate processing across workflow runs:
|
|
437
|
+
|
|
438
|
+
```typescript
|
|
439
|
+
const fileTracker = new VersoriFileTracker(ctx.openKv(':project:'), 'unique-prefix');
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### 2. Archive Files After Processing
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
// file.name contains just filename, file.path contains full path
|
|
446
|
+
await dataSource.moveFile(file.path, `${archivePath}/${file.name}`);
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### 3. Use BPP for Full Snapshots
|
|
450
|
+
|
|
451
|
+
For full inventory snapshots, let BPP filter unchanged records:
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
const job = await client.createJob({
|
|
455
|
+
name: 'Daily Full Inventory',
|
|
456
|
+
retailerId: 'my-retailer',
|
|
457
|
+
// BPP enabled by default
|
|
458
|
+
});
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 4. Skip BPP for Delta Feeds
|
|
462
|
+
|
|
463
|
+
For pre-filtered delta feeds:
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
const job = await client.createJob({
|
|
467
|
+
name: 'Hourly Deltas',
|
|
468
|
+
retailerId: 'my-retailer',
|
|
469
|
+
meta: {
|
|
470
|
+
preprocessing: 'skip', // Skip BPP
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### 5. Use Async Mode for Events
|
|
476
|
+
|
|
477
|
+
For scalability and throughput:
|
|
478
|
+
|
|
479
|
+
```typescript
|
|
480
|
+
await client.sendEvent(event, 'async'); // Recommended
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### 6. MemoryInterpreter Pattern (Local Testing)
|
|
484
|
+
|
|
485
|
+
When developing workflows locally, use MemoryInterpreter for testing:
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
// index.ts - Entry point for local development/testing
|
|
489
|
+
import { MemoryInterpreter } from '@versori/run';
|
|
490
|
+
import { dailyInventorySync } from './src/workflows/scheduled/daily-inventory-sync';
|
|
491
|
+
import { adhocInventorySync } from './src/workflows/webhook/adhoc-inventory-sync';
|
|
492
|
+
|
|
493
|
+
async function main(): Promise<void> {
|
|
494
|
+
const mi = await MemoryInterpreter.newInstance();
|
|
495
|
+
mi.register(dailyInventorySync);
|
|
496
|
+
mi.register(adhocInventorySync);
|
|
497
|
+
await mi.start();
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
main().then().catch((err) => console.error('Failed to run main()', err));
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**Important:** MemoryInterpreter is for local development only - Versori platform handles workflow registration automatically when deployed.
|
|
504
|
+
|
|
505
|
+
### 7. Optional Feature Toggles
|
|
506
|
+
|
|
507
|
+
Use activation variables to enable/disable optional features:
|
|
508
|
+
|
|
509
|
+
```typescript
|
|
510
|
+
// Optional: Disable file tracking for testing (enabled by default)
|
|
511
|
+
const enableFileTracking = activation.getVariable('enableFileTracking') !== 'false';
|
|
512
|
+
|
|
513
|
+
if (enableFileTracking) {
|
|
514
|
+
const alreadyProcessed = await fileTracker.wasFileProcessed(fileName);
|
|
515
|
+
if (alreadyProcessed) {
|
|
516
|
+
log.info('Skipping duplicate file');
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// Optional: Enable detailed logging for debugging (disabled by default)
|
|
522
|
+
const detailedLogging = activation.getVariable('detailedLogging') === 'true';
|
|
523
|
+
|
|
524
|
+
if (detailedLogging) {
|
|
525
|
+
log.info('Detailed processing metrics', {
|
|
526
|
+
fileSize: file.size,
|
|
527
|
+
parseTime: parseEndTime - parseStartTime,
|
|
528
|
+
mappingTime: mapEndTime - mapStartTime,
|
|
529
|
+
uploadTime: uploadEndTime - uploadStartTime,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Optional: Control BPP behavior
|
|
534
|
+
const bppEnabled = activation.getVariable('bppEnabled') !== 'false';
|
|
535
|
+
|
|
536
|
+
const job = await client.createJob({
|
|
537
|
+
name: 'Inventory Sync',
|
|
538
|
+
retailerId: 'my-retailer',
|
|
539
|
+
meta: bppEnabled ? {} : { preprocessing: 'skip' },
|
|
540
|
+
});
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
**Common Feature Toggles:**
|
|
544
|
+
|
|
545
|
+
| Variable | Default | Purpose |
|
|
546
|
+
|----------|---------|---------|
|
|
547
|
+
| `enableFileTracking` | `true` | Prevent duplicate file processing |
|
|
548
|
+
| `detailedLogging` | `false` | Enable verbose logging for debugging |
|
|
549
|
+
| `bppEnabled` | `true` | Enable Batch Pre-Processing change detection |
|
|
550
|
+
| `maxFilesPerRun` | `10` | Limit files processed per workflow execution |
|
|
551
|
+
|
|
552
|
+
### 8. Emoji Logging Best Practices
|
|
553
|
+
|
|
554
|
+
Use emojis in logs for better readability in Versori UI:
|
|
555
|
+
|
|
556
|
+
```typescript
|
|
557
|
+
// Execution status
|
|
558
|
+
log.info('✅ EXECUTION COMPLETED', { jobId, filesProcessed: 5 });
|
|
559
|
+
log.error('❌ EXECUTION FAILED', { jobId, error: 'Connection timeout' });
|
|
560
|
+
log.warn('⚠️ PARTIAL SUCCESS', { jobId, filesProcessed: 3, filesFailed: 2 });
|
|
561
|
+
|
|
562
|
+
// Processing stages
|
|
563
|
+
log.info('📦 Starting file processing', { fileName: 'inventory.xml' });
|
|
564
|
+
log.info('✅ File processed successfully', { fileName: 'inventory.xml', recordCount: 1000 });
|
|
565
|
+
log.error('❌ File processing failed', { fileName: 'inventory.xml', error: 'Parse error' });
|
|
566
|
+
|
|
567
|
+
// Configuration
|
|
568
|
+
log.info('⚙️ Configuration loaded', { sftpHost, remotePath, batchSize });
|
|
569
|
+
log.warn('⚠️ Using default configuration', { reason: 'Missing activation variable' });
|
|
570
|
+
|
|
571
|
+
// State management
|
|
572
|
+
log.info('🔍 Checking file status', { fileName: 'inventory.xml' });
|
|
573
|
+
log.info('⏭️ Skipping duplicate file', { fileName: 'inventory.xml' });
|
|
574
|
+
log.info('📝 Marking file as processed', { fileName: 'inventory.xml' });
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
**Recommended Emojis:**
|
|
578
|
+
|
|
579
|
+
| Emoji | Use Case | Example |
|
|
580
|
+
|-------|----------|---------|
|
|
581
|
+
| ✅ | Success | `'✅ File uploaded successfully'` |
|
|
582
|
+
| ❌ | Error | `'❌ Failed to connect to SFTP'` |
|
|
583
|
+
| ⚠️ | Warning | `'⚠️ File already exists, skipping'` |
|
|
584
|
+
| 📦 | Processing | `'📦 Processing batch 1 of 10'` |
|
|
585
|
+
| 🔍 | Discovery | `'🔍 Found 5 files to process'` |
|
|
586
|
+
| ⏭️ | Skipping | `'⏭️ Skipping already processed file'` |
|
|
587
|
+
| 📝 | State change | `'📝 Marking file as processed'` |
|
|
588
|
+
| ⚙️ | Configuration | `'⚙️ Initializing SFTP connection'` |
|
|
589
|
+
|
|
590
|
+
**Guidelines:**
|
|
591
|
+
|
|
592
|
+
- Use emojis for high-level status logs (execution start/end, major milestones)
|
|
593
|
+
- Don't overuse - limit to important log entries
|
|
594
|
+
- Be consistent across workflows (same emoji = same meaning)
|
|
595
|
+
- Combine with structured data for filtering: `log.info('✅ Success', { status: 'completed' })`
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
## Caveats and gotchas (S3 and SFTP)
|
|
600
|
+
|
|
601
|
+
Use these safeguards across all scheduled guides to avoid common pitfalls:
|
|
602
|
+
|
|
603
|
+
- S3 cross-bucket moves: `moveFile(sourceKey, destKey, { sourceBucket })` is required when the source object is not in the configured destination bucket. Copy succeeds cross-bucket, but delete must be signed against the source bucket. The SDK handles this via a temporary presigner when you pass `sourceBucket`.
|
|
604
|
+
- S3 move semantics: There is no native move; it's copy then delete. If delete fails after copy, the destination remains. Treat moves as idempotent; retries may leave the destination already present. Prefer archive paths that are safe to overwrite or add timestamps.
|
|
605
|
+
- S3 metadata on copy: Use `copyFile(source, dest, { metadata })` to replace metadata; S3 "metadata-directive: REPLACE" behavior is applied. If omitted, S3 copies existing metadata.
|
|
606
|
+
- S3 content encodings: For text files use `{ encoding: 'utf8' }`. For binary (Parquet) omit encoding to receive a Buffer.
|
|
607
|
+
- SFTP overwrite: `moveFile`, `copyFile` support an `overwrite` boolean. Set `true` to replace existing files at the destination.
|
|
608
|
+
- SFTP directory creation: Use `createDirectory(path, true)` before uploads if parent folders may not exist, or pass `{ createDirectories: true }` in `uploadFile()` options.
|
|
609
|
+
- SFTP path format: Paths are POSIX-style with forward slashes. Avoid Windows backslashes in remote paths.
|
|
610
|
+
- Disposing SFTP connections: Always `await sftp.dispose()` in a `finally` block to close sockets in scheduled workflows.
|
|
611
|
+
- CSV delimiters: Respect `csvDelimiter` activation variable; defaults to `,`. Mismatches cause mapping errors.
|
|
612
|
+
- Batch API BPP: Enabled by default. For delta feeds, set `meta: { preprocessing: 'skip' }` when creating the job.
|
|
613
|
+
- Mapping imports: When importing mapping JSON in TypeScript, ensure `tsconfig.json` has `"resolveJsonModule": true`.
|
|
614
|
+
- Attributes array vs object: Fluent APIs often expect arrays (e.g., attributes). If mapping to an object, convert to array before sending, or use a custom resolver to emit an array.
|
|
615
|
+
|
|
616
|
+
Referenced guides with examples implementing these:
|
|
617
|
+
|
|
618
|
+
- Inventory (S3): `ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md` → Advanced S3 file operations
|
|
619
|
+
- Inventory (SFTP): `ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md` → Advanced SFTP file operations and `dispose()`
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## Additional Resources
|
|
624
|
+
|
|
625
|
+
- **SDK Documentation**: [fc-connect-sdk README](../../../../readme.md)
|
|
626
|
+
- **Universal Mapping Guide**: [UNIVERSAL-MAPPING.md](../../../02-CORE-GUIDES/mapping/mapping-readme.md)
|
|
627
|
+
- **Decision Tree**: [DECISION-TREE.md](../../../00-START-HERE/decision-tree.md)
|
|
628
|
+
- **Troubleshooting**: [troubleshooting-quick-reference.md](../../../00-START-HERE/troubleshooting-quick-reference.md)
|
|
629
|
+
- **SDK Philosophy**: [SDK-PHILOSOPHY.md](../../../00-START-HERE/sdk-philosophy.md)
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
## Contributing
|
|
634
|
+
|
|
635
|
+
When adding new use cases:
|
|
636
|
+
|
|
637
|
+
1. Place in appropriate category folder (inventory/, product/, price/)
|
|
638
|
+
2. Follow naming convention: `{source}-{format}-{entity}-to-{api}.md`
|
|
639
|
+
3. Include complete working code
|
|
640
|
+
4. Verify all SDK method signatures
|
|
641
|
+
5. Add entry to this README
|
|
642
|
+
|
|
643
|
+
---
|
|
644
|
+
|
|
645
|
+
**✅ All use cases verified against SDK ^0.1.27**
|
|
646
|
+
**📅 Last updated**: 2025-10-30
|