@fluentcommerce/fc-connect-sdk 0.1.54 → 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 +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,407 +1,407 @@
|
|
|
1
|
-
# Pattern: Custom Resolvers
|
|
2
|
-
|
|
3
|
-
**FC Connect SDK Use Case Guide**
|
|
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
|
-
**Context**: Focused guide on writing custom transformation resolvers
|
|
9
|
-
|
|
10
|
-
**Type**: Reusable Pattern
|
|
11
|
-
|
|
12
|
-
**Complexity**: Low-Medium
|
|
13
|
-
|
|
14
|
-
**Lines**: ~140 lines
|
|
15
|
-
|
|
16
|
-
## When to Use This Pattern
|
|
17
|
-
|
|
18
|
-
- Complex data transformations beyond SDK resolvers
|
|
19
|
-
- API lookups during mapping (enrichment)
|
|
20
|
-
- Conditional logic based on multiple fields
|
|
21
|
-
- Data enrichment from external systems
|
|
22
|
-
- Custom validation and business rules
|
|
23
|
-
- Multi-field calculations
|
|
24
|
-
|
|
25
|
-
## Resolver Signature
|
|
26
|
-
|
|
27
|
-
All resolvers across ALL mappers use a consistent 4-parameter signature:
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
type ResolverFunction = (
|
|
31
|
-
value: any, // Source field value being transformed
|
|
32
|
-
sourceData: any, // Complete source record for context
|
|
33
|
-
config: any, // Resolver configuration (from mapper context)
|
|
34
|
-
helpers: ResolverHelpers // SDK helper functions (48+ utilities)
|
|
35
|
-
) => any | Promise<any>;
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
**Parameter Breakdown:**
|
|
39
|
-
|
|
40
|
-
1. **value**: The extracted field value (from `source` path or `value` literal)
|
|
41
|
-
2. **sourceData**: Full source object - access sibling fields via `helpers.get()`
|
|
42
|
-
3. **config**: User-provided context passed to mapper constructor via `options.context` (business rules, settings)
|
|
43
|
-
4. **helpers**: SDK utilities + fluentClient + logger + context
|
|
44
|
-
|
|
45
|
-
> **💡 Note**: The `config` parameter and `helpers.context` both reference the same object you passed to the mapper constructor. Use whichever is more convenient.
|
|
46
|
-
>
|
|
47
|
-
> **Resolver usage notes**:
|
|
48
|
-
>
|
|
49
|
-
> - UniversalMapper accepts a single resolver name per field (string). To compose multiple steps, create one custom resolver that performs them in order.
|
|
50
|
-
> - If a resolver derives its value from the full record, you may omit `source` in the field config; the resolver receives `sourceData` and can access any fields via `helpers.get()`.
|
|
51
|
-
|
|
52
|
-
## Pattern Examples
|
|
53
|
-
|
|
54
|
-
### 1. Simple String Transformation
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
export const customResolvers = {
|
|
58
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
59
|
-
const prefix = config.skuPrefix || 'SKU';
|
|
60
|
-
return `${prefix}-${helpers.toString(value).toUpperCase()}`;
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
// Usage
|
|
65
|
-
const mapper = new UniversalMapper(mapping, {
|
|
66
|
-
customResolvers,
|
|
67
|
-
context: { skuPrefix: 'PROD' },
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### 2. Context-Aware Resolver (Use sourceData)
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
export const customResolvers = {
|
|
75
|
-
'custom.calculatePrice': (basePrice, sourceData, config, helpers) => {
|
|
76
|
-
// Access sibling fields from sourceData
|
|
77
|
-
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
78
|
-
const discount = helpers.get(sourceData, 'discountPercent') || 0;
|
|
79
|
-
|
|
80
|
-
// Use config for business rules
|
|
81
|
-
const taxRate = config.taxRate || 0;
|
|
82
|
-
|
|
83
|
-
// Calculate final price
|
|
84
|
-
const subtotal = basePrice * quantity;
|
|
85
|
-
const afterDiscount = subtotal * (1 - discount / 100);
|
|
86
|
-
const withTax = afterDiscount * (1 + taxRate);
|
|
87
|
-
|
|
88
|
-
return helpers.parseFloatSafe(withTax, 0);
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### 3. Async Resolver (API Call)
|
|
94
|
-
|
|
95
|
-
```typescript
|
|
96
|
-
export const customResolvers = {
|
|
97
|
-
'custom.enrichWithCustomer': async (customerId, sourceData, config, helpers) => {
|
|
98
|
-
if (!helpers.fluentClient) {
|
|
99
|
-
helpers.log.warn('FluentClient not available');
|
|
100
|
-
return customerId;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
const result = await helpers.fluentClient.graphql({
|
|
105
|
-
query: `query { customer(id: "${customerId}") { id name email } }`,
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
id: customerId,
|
|
110
|
-
...result.data.customer,
|
|
111
|
-
};
|
|
112
|
-
} catch (error) {
|
|
113
|
-
helpers.log.error('Failed to fetch customer', error);
|
|
114
|
-
return customerId; // Safe fallback
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### 4. Conditional Resolver (If/Else Logic)
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
export const customResolvers = {
|
|
124
|
-
'custom.formatRadialDate': (value, sourceData, config, helpers) => {
|
|
125
|
-
if (!value) return '';
|
|
126
|
-
|
|
127
|
-
try {
|
|
128
|
-
const date = new Date(value);
|
|
129
|
-
return date.toISOString().replace(/\.\d{3}Z$/, '+00:00');
|
|
130
|
-
} catch {
|
|
131
|
-
return value; // Return original on error
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### 5. Array Processing (Extract from Attributes)
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
export const customResolvers = {
|
|
141
|
-
'custom.extractColorId': (value, sourceData, config, helpers) => {
|
|
142
|
-
const item = value || sourceData;
|
|
143
|
-
const product = helpers.get(item, 'product') || {};
|
|
144
|
-
const attributes = product.attributes || [];
|
|
145
|
-
|
|
146
|
-
const colorAttr = attributes.find(
|
|
147
|
-
(a: any) => a.name?.toLowerCase().includes('color') || a.name === 'COLOR_CODE'
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
return colorAttr?.value || '';
|
|
151
|
-
},
|
|
152
|
-
};
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### 6. Multi-Field Aggregation
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
export const customResolvers = {
|
|
159
|
-
'custom.extractDestinations': (value, sourceData, config, helpers) => {
|
|
160
|
-
const destinations = [];
|
|
161
|
-
|
|
162
|
-
// Extract delivery address
|
|
163
|
-
const deliveryAddress = helpers.get(sourceData, 'fulfilmentChoice.deliveryAddress');
|
|
164
|
-
if (deliveryAddress) {
|
|
165
|
-
destinations.push({
|
|
166
|
-
id: `s-${deliveryAddress.id || 'delivery'}`,
|
|
167
|
-
firstName: deliveryAddress.firstName || '',
|
|
168
|
-
lastName: deliveryAddress.lastName || deliveryAddress.name || '',
|
|
169
|
-
street: deliveryAddress.street || deliveryAddress.line1 || '',
|
|
170
|
-
city: deliveryAddress.city || '',
|
|
171
|
-
state: deliveryAddress.state || '',
|
|
172
|
-
country: deliveryAddress.country || 'US',
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Extract billing address (if different)
|
|
177
|
-
const billingAddress = helpers.get(sourceData, 'billingAddress');
|
|
178
|
-
if (billingAddress && billingAddress.id !== deliveryAddress?.id) {
|
|
179
|
-
destinations.push({
|
|
180
|
-
id: `b-${billingAddress.id || 'billing'}`,
|
|
181
|
-
// ... similar mapping
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return destinations;
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### 7. Helper Function Usage
|
|
191
|
-
|
|
192
|
-
```typescript
|
|
193
|
-
export const customResolvers = {
|
|
194
|
-
'custom.complexTransform': (value, sourceData, config, helpers) => {
|
|
195
|
-
// Null-safe parsing
|
|
196
|
-
const numericValue = helpers.parseFloatSafe(value, 0);
|
|
197
|
-
|
|
198
|
-
// Coalesce multiple values
|
|
199
|
-
const category = helpers.coalesce(
|
|
200
|
-
helpers.get(sourceData, 'product.category'),
|
|
201
|
-
config.defaultCategory,
|
|
202
|
-
'UNKNOWN'
|
|
203
|
-
);
|
|
204
|
-
|
|
205
|
-
// Config-based business rules
|
|
206
|
-
const multiplier = config.multipliers?.[category] || 1;
|
|
207
|
-
|
|
208
|
-
// Safe calculation
|
|
209
|
-
const result = numericValue * multiplier;
|
|
210
|
-
return helpers.parseFloatSafe(result, 0);
|
|
211
|
-
},
|
|
212
|
-
};
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
### 8. Error Handling Pattern
|
|
216
|
-
|
|
217
|
-
```typescript
|
|
218
|
-
export const customResolvers = {
|
|
219
|
-
'custom.safeTransform': (value, sourceData, config, helpers) => {
|
|
220
|
-
try {
|
|
221
|
-
// Complex transformation logic
|
|
222
|
-
const processed = performComplexOperation(value);
|
|
223
|
-
|
|
224
|
-
// Validate result
|
|
225
|
-
if (!processed || helpers.isEmpty(processed)) {
|
|
226
|
-
helpers.log.warn('Transformation produced empty result', { value });
|
|
227
|
-
return config.defaultValue || null;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
return processed;
|
|
231
|
-
} catch (error) {
|
|
232
|
-
helpers.log.error('Transformation failed', error, { value, sourceData });
|
|
233
|
-
return config.defaultValue || null;
|
|
234
|
-
}
|
|
235
|
-
},
|
|
236
|
-
};
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
## Available Helper Functions
|
|
240
|
-
|
|
241
|
-
**Path Access:**
|
|
242
|
-
|
|
243
|
-
- `get(obj, 'path.to.field[0]', defaultValue)` - Multi-format path access
|
|
244
|
-
- `set(obj, 'path.to.field', value)` - Set nested value
|
|
245
|
-
|
|
246
|
-
**Type Coercion:**
|
|
247
|
-
|
|
248
|
-
- `parseFloatSafe(value, 0)` - Safe float parsing with fallback
|
|
249
|
-
- `parseIntSafe(value, 0)` - Safe integer parsing
|
|
250
|
-
- `toString(value)` - Safe string conversion
|
|
251
|
-
- `defaultTo(value, fallback)` - Return fallback if null/undefined
|
|
252
|
-
|
|
253
|
-
**Date Operations:**
|
|
254
|
-
|
|
255
|
-
- `formatDate(date)` - ISO8601 format
|
|
256
|
-
- `parseDate(str)` - Parse date string
|
|
257
|
-
- `addDays(date, days)` - Add days to date
|
|
258
|
-
- `subtractDays(date, days)` - Subtract days
|
|
259
|
-
- `dateDiff(date1, date2)` - Days between dates
|
|
260
|
-
|
|
261
|
-
**Array Operations:**
|
|
262
|
-
|
|
263
|
-
- `ensureArray(value)` - Convert to array
|
|
264
|
-
- `coalesce(...values)` - First non-null value
|
|
265
|
-
- `groupBy(array, key)` - Group by field
|
|
266
|
-
- `keyBy(array, key)` - Index by field
|
|
267
|
-
- `chunk(array, size)` - Split into chunks
|
|
268
|
-
- `flatten(array, depth)` - Flatten nested arrays
|
|
269
|
-
- `unique(array, key?)` - Remove duplicates
|
|
270
|
-
- `sortBy(array, key, desc?)` - Sort by field
|
|
271
|
-
- `compact(array)` - Remove falsy values
|
|
272
|
-
|
|
273
|
-
**String Operations:**
|
|
274
|
-
|
|
275
|
-
- `toCamelCase(str)` - Convert to camelCase
|
|
276
|
-
- `toSnakeCase(str)` - Convert to snake_case
|
|
277
|
-
- `template(str, vars)` - Replace {{placeholders}}
|
|
278
|
-
- `slugify(str)` - URL-safe slug
|
|
279
|
-
- `truncate(str, maxLen)` - Limit length
|
|
280
|
-
- `normalizeWhitespace(str)` - Clean whitespace
|
|
281
|
-
|
|
282
|
-
**Object Operations:**
|
|
283
|
-
|
|
284
|
-
- `deepClone(obj)` - Deep copy object
|
|
285
|
-
- `deepMerge(target, source)` - Merge objects
|
|
286
|
-
- `pick(obj, keys)` - Select fields
|
|
287
|
-
- `omit(obj, keys)` - Exclude fields
|
|
288
|
-
- `isEmpty(value)` - Check if empty
|
|
289
|
-
|
|
290
|
-
**Math Operations:**
|
|
291
|
-
|
|
292
|
-
- `sum(array, key?)` - Sum values
|
|
293
|
-
- `avg(array, key?)` - Average
|
|
294
|
-
- `min(array, key?)` - Minimum value
|
|
295
|
-
- `max(array, key?)` - Maximum value
|
|
296
|
-
- `clamp(num, min, max)` - Constrain range
|
|
297
|
-
|
|
298
|
-
**Validation:**
|
|
299
|
-
|
|
300
|
-
- `isValidEmail(email)` - Email validation
|
|
301
|
-
- `requireField(value, name)` - Throw if missing
|
|
302
|
-
- `isString(value)` - Type check
|
|
303
|
-
- `isNumber(value)` - Type check
|
|
304
|
-
- `isArray(value)` - Type check
|
|
305
|
-
- `isObject(value)` - Type check
|
|
306
|
-
- `isDate(value)` - Type check
|
|
307
|
-
|
|
308
|
-
**Additional Context:**
|
|
309
|
-
|
|
310
|
-
- `helpers.log` - Logger instance (info, error, warn, debug)
|
|
311
|
-
- `helpers.fluentClient` - Fluent API client (for queries)
|
|
312
|
-
- `helpers.context` - User-provided shared config
|
|
313
|
-
|
|
314
|
-
## Best Practices
|
|
315
|
-
|
|
316
|
-
1. **Always Use 4 Parameters** - Even if unused, include all for consistency
|
|
317
|
-
2. **Use Helpers for Safety** - `helpers.parseFloatSafe()` instead of `parseFloat()`
|
|
318
|
-
3. **Never Throw Errors** - Return safe fallbacks instead
|
|
319
|
-
4. **Log Errors** - Use `helpers.log.error()` for debugging
|
|
320
|
-
5. **Access Config via 3rd Param** - Use the `config` parameter instead of `helpers.context`
|
|
321
|
-
6. **Null-Safety** - Check for null/undefined before operations
|
|
322
|
-
7. **Document Resolvers** - Add JSDoc comments explaining logic
|
|
323
|
-
8. **Test Edge Cases** - Handle empty arrays, null values, missing fields
|
|
324
|
-
|
|
325
|
-
## Common Patterns
|
|
326
|
-
|
|
327
|
-
**Pattern 1: Fallback Chain**
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
const value = helpers.coalesce(
|
|
331
|
-
helpers.get(sourceData, 'primary.field'),
|
|
332
|
-
helpers.get(sourceData, 'secondary.field'),
|
|
333
|
-
config.defaultValue,
|
|
334
|
-
'UNKNOWN'
|
|
335
|
-
);
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
**Pattern 2: Attribute Extraction**
|
|
339
|
-
|
|
340
|
-
```typescript
|
|
341
|
-
const attributes = helpers.get(sourceData, 'attributes') || [];
|
|
342
|
-
const targetAttr = attributes.find(a => a.name === 'TargetName');
|
|
343
|
-
return targetAttr?.value || '';
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
**Pattern 3: Conditional Format**
|
|
347
|
-
|
|
348
|
-
```typescript
|
|
349
|
-
if (!value) return '';
|
|
350
|
-
|
|
351
|
-
try {
|
|
352
|
-
return formatValue(value);
|
|
353
|
-
} catch {
|
|
354
|
-
return value; // Return original on error
|
|
355
|
-
}
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
**Pattern 4: Multi-Source Calculation**
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
const base = helpers.parseFloatSafe(value, 0);
|
|
362
|
-
const multiplier = helpers.get(sourceData, 'multiplier') || 1;
|
|
363
|
-
const adjustment = config.adjustments?.[sourceData.type] || 0;
|
|
364
|
-
return base * multiplier + adjustment;
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
## Usage Example
|
|
368
|
-
|
|
369
|
-
```typescript
|
|
370
|
-
// FC Connect SDK (latest)
|
|
371
|
-
// Install: npm install @fluentcommerce/fc-connect-sdk@latest
|
|
372
|
-
// Docs: https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk
|
|
373
|
-
// GitHub: https://github.com/fluentcommerce/fc-connect-sdk
|
|
374
|
-
|
|
375
|
-
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
376
|
-
import { customResolvers } from './resolvers';
|
|
377
|
-
|
|
378
|
-
const mapper = new UniversalMapper(
|
|
379
|
-
{
|
|
380
|
-
fields: {
|
|
381
|
-
skuRef: { source: 'sku_id', resolver: 'custom.formatSKU' },
|
|
382
|
-
price: { source: 'base_price', resolver: 'custom.calculatePrice' },
|
|
383
|
-
},
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
customResolvers, // Your custom resolvers
|
|
387
|
-
fluentClient: myClient, // Available as helpers.fluentClient
|
|
388
|
-
logger: myLogger, // Available as helpers.log
|
|
389
|
-
context: {
|
|
390
|
-
// Available as config parameter
|
|
391
|
-
skuPrefix: 'PROD',
|
|
392
|
-
taxRate: 0.1,
|
|
393
|
-
multipliers: { electronics: 1.5 },
|
|
394
|
-
},
|
|
395
|
-
}
|
|
396
|
-
);
|
|
397
|
-
|
|
398
|
-
const result = await mapper.map(sourceData);
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
**See Also:**
|
|
404
|
-
|
|
405
|
-
- [Resolver Signature Guide](../../02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md)
|
|
406
|
-
- [Universal Mapping Guide](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
407
|
-
- [SFCC Connector Resolvers](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
1
|
+
# Pattern: Custom Resolvers
|
|
2
|
+
|
|
3
|
+
**FC Connect SDK Use Case Guide**
|
|
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
|
+
**Context**: Focused guide on writing custom transformation resolvers
|
|
9
|
+
|
|
10
|
+
**Type**: Reusable Pattern
|
|
11
|
+
|
|
12
|
+
**Complexity**: Low-Medium
|
|
13
|
+
|
|
14
|
+
**Lines**: ~140 lines
|
|
15
|
+
|
|
16
|
+
## When to Use This Pattern
|
|
17
|
+
|
|
18
|
+
- Complex data transformations beyond SDK resolvers
|
|
19
|
+
- API lookups during mapping (enrichment)
|
|
20
|
+
- Conditional logic based on multiple fields
|
|
21
|
+
- Data enrichment from external systems
|
|
22
|
+
- Custom validation and business rules
|
|
23
|
+
- Multi-field calculations
|
|
24
|
+
|
|
25
|
+
## Resolver Signature
|
|
26
|
+
|
|
27
|
+
All resolvers across ALL mappers use a consistent 4-parameter signature:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
type ResolverFunction = (
|
|
31
|
+
value: any, // Source field value being transformed
|
|
32
|
+
sourceData: any, // Complete source record for context
|
|
33
|
+
config: any, // Resolver configuration (from mapper context)
|
|
34
|
+
helpers: ResolverHelpers // SDK helper functions (48+ utilities)
|
|
35
|
+
) => any | Promise<any>;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Parameter Breakdown:**
|
|
39
|
+
|
|
40
|
+
1. **value**: The extracted field value (from `source` path or `value` literal)
|
|
41
|
+
2. **sourceData**: Full source object - access sibling fields via `helpers.get()`
|
|
42
|
+
3. **config**: User-provided context passed to mapper constructor via `options.context` (business rules, settings)
|
|
43
|
+
4. **helpers**: SDK utilities + fluentClient + logger + context
|
|
44
|
+
|
|
45
|
+
> **💡 Note**: The `config` parameter and `helpers.context` both reference the same object you passed to the mapper constructor. Use whichever is more convenient.
|
|
46
|
+
>
|
|
47
|
+
> **Resolver usage notes**:
|
|
48
|
+
>
|
|
49
|
+
> - UniversalMapper accepts a single resolver name per field (string). To compose multiple steps, create one custom resolver that performs them in order.
|
|
50
|
+
> - If a resolver derives its value from the full record, you may omit `source` in the field config; the resolver receives `sourceData` and can access any fields via `helpers.get()`.
|
|
51
|
+
|
|
52
|
+
## Pattern Examples
|
|
53
|
+
|
|
54
|
+
### 1. Simple String Transformation
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
export const customResolvers = {
|
|
58
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
59
|
+
const prefix = config.skuPrefix || 'SKU';
|
|
60
|
+
return `${prefix}-${helpers.toString(value).toUpperCase()}`;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Usage
|
|
65
|
+
const mapper = new UniversalMapper(mapping, {
|
|
66
|
+
customResolvers,
|
|
67
|
+
context: { skuPrefix: 'PROD' },
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2. Context-Aware Resolver (Use sourceData)
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
export const customResolvers = {
|
|
75
|
+
'custom.calculatePrice': (basePrice, sourceData, config, helpers) => {
|
|
76
|
+
// Access sibling fields from sourceData
|
|
77
|
+
const quantity = helpers.get(sourceData, 'quantity') || 1;
|
|
78
|
+
const discount = helpers.get(sourceData, 'discountPercent') || 0;
|
|
79
|
+
|
|
80
|
+
// Use config for business rules
|
|
81
|
+
const taxRate = config.taxRate || 0;
|
|
82
|
+
|
|
83
|
+
// Calculate final price
|
|
84
|
+
const subtotal = basePrice * quantity;
|
|
85
|
+
const afterDiscount = subtotal * (1 - discount / 100);
|
|
86
|
+
const withTax = afterDiscount * (1 + taxRate);
|
|
87
|
+
|
|
88
|
+
return helpers.parseFloatSafe(withTax, 0);
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Async Resolver (API Call)
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
export const customResolvers = {
|
|
97
|
+
'custom.enrichWithCustomer': async (customerId, sourceData, config, helpers) => {
|
|
98
|
+
if (!helpers.fluentClient) {
|
|
99
|
+
helpers.log.warn('FluentClient not available');
|
|
100
|
+
return customerId;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const result = await helpers.fluentClient.graphql({
|
|
105
|
+
query: `query { customer(id: "${customerId}") { id name email } }`,
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
id: customerId,
|
|
110
|
+
...result.data.customer,
|
|
111
|
+
};
|
|
112
|
+
} catch (error) {
|
|
113
|
+
helpers.log.error('Failed to fetch customer', error);
|
|
114
|
+
return customerId; // Safe fallback
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 4. Conditional Resolver (If/Else Logic)
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
export const customResolvers = {
|
|
124
|
+
'custom.formatRadialDate': (value, sourceData, config, helpers) => {
|
|
125
|
+
if (!value) return '';
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
const date = new Date(value);
|
|
129
|
+
return date.toISOString().replace(/\.\d{3}Z$/, '+00:00');
|
|
130
|
+
} catch {
|
|
131
|
+
return value; // Return original on error
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 5. Array Processing (Extract from Attributes)
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
export const customResolvers = {
|
|
141
|
+
'custom.extractColorId': (value, sourceData, config, helpers) => {
|
|
142
|
+
const item = value || sourceData;
|
|
143
|
+
const product = helpers.get(item, 'product') || {};
|
|
144
|
+
const attributes = product.attributes || [];
|
|
145
|
+
|
|
146
|
+
const colorAttr = attributes.find(
|
|
147
|
+
(a: any) => a.name?.toLowerCase().includes('color') || a.name === 'COLOR_CODE'
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
return colorAttr?.value || '';
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 6. Multi-Field Aggregation
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
export const customResolvers = {
|
|
159
|
+
'custom.extractDestinations': (value, sourceData, config, helpers) => {
|
|
160
|
+
const destinations = [];
|
|
161
|
+
|
|
162
|
+
// Extract delivery address
|
|
163
|
+
const deliveryAddress = helpers.get(sourceData, 'fulfilmentChoice.deliveryAddress');
|
|
164
|
+
if (deliveryAddress) {
|
|
165
|
+
destinations.push({
|
|
166
|
+
id: `s-${deliveryAddress.id || 'delivery'}`,
|
|
167
|
+
firstName: deliveryAddress.firstName || '',
|
|
168
|
+
lastName: deliveryAddress.lastName || deliveryAddress.name || '',
|
|
169
|
+
street: deliveryAddress.street || deliveryAddress.line1 || '',
|
|
170
|
+
city: deliveryAddress.city || '',
|
|
171
|
+
state: deliveryAddress.state || '',
|
|
172
|
+
country: deliveryAddress.country || 'US',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Extract billing address (if different)
|
|
177
|
+
const billingAddress = helpers.get(sourceData, 'billingAddress');
|
|
178
|
+
if (billingAddress && billingAddress.id !== deliveryAddress?.id) {
|
|
179
|
+
destinations.push({
|
|
180
|
+
id: `b-${billingAddress.id || 'billing'}`,
|
|
181
|
+
// ... similar mapping
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return destinations;
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 7. Helper Function Usage
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
export const customResolvers = {
|
|
194
|
+
'custom.complexTransform': (value, sourceData, config, helpers) => {
|
|
195
|
+
// Null-safe parsing
|
|
196
|
+
const numericValue = helpers.parseFloatSafe(value, 0);
|
|
197
|
+
|
|
198
|
+
// Coalesce multiple values
|
|
199
|
+
const category = helpers.coalesce(
|
|
200
|
+
helpers.get(sourceData, 'product.category'),
|
|
201
|
+
config.defaultCategory,
|
|
202
|
+
'UNKNOWN'
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
// Config-based business rules
|
|
206
|
+
const multiplier = config.multipliers?.[category] || 1;
|
|
207
|
+
|
|
208
|
+
// Safe calculation
|
|
209
|
+
const result = numericValue * multiplier;
|
|
210
|
+
return helpers.parseFloatSafe(result, 0);
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 8. Error Handling Pattern
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
export const customResolvers = {
|
|
219
|
+
'custom.safeTransform': (value, sourceData, config, helpers) => {
|
|
220
|
+
try {
|
|
221
|
+
// Complex transformation logic
|
|
222
|
+
const processed = performComplexOperation(value);
|
|
223
|
+
|
|
224
|
+
// Validate result
|
|
225
|
+
if (!processed || helpers.isEmpty(processed)) {
|
|
226
|
+
helpers.log.warn('Transformation produced empty result', { value });
|
|
227
|
+
return config.defaultValue || null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return processed;
|
|
231
|
+
} catch (error) {
|
|
232
|
+
helpers.log.error('Transformation failed', error, { value, sourceData });
|
|
233
|
+
return config.defaultValue || null;
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Available Helper Functions
|
|
240
|
+
|
|
241
|
+
**Path Access:**
|
|
242
|
+
|
|
243
|
+
- `get(obj, 'path.to.field[0]', defaultValue)` - Multi-format path access
|
|
244
|
+
- `set(obj, 'path.to.field', value)` - Set nested value
|
|
245
|
+
|
|
246
|
+
**Type Coercion:**
|
|
247
|
+
|
|
248
|
+
- `parseFloatSafe(value, 0)` - Safe float parsing with fallback
|
|
249
|
+
- `parseIntSafe(value, 0)` - Safe integer parsing
|
|
250
|
+
- `toString(value)` - Safe string conversion
|
|
251
|
+
- `defaultTo(value, fallback)` - Return fallback if null/undefined
|
|
252
|
+
|
|
253
|
+
**Date Operations:**
|
|
254
|
+
|
|
255
|
+
- `formatDate(date)` - ISO8601 format
|
|
256
|
+
- `parseDate(str)` - Parse date string
|
|
257
|
+
- `addDays(date, days)` - Add days to date
|
|
258
|
+
- `subtractDays(date, days)` - Subtract days
|
|
259
|
+
- `dateDiff(date1, date2)` - Days between dates
|
|
260
|
+
|
|
261
|
+
**Array Operations:**
|
|
262
|
+
|
|
263
|
+
- `ensureArray(value)` - Convert to array
|
|
264
|
+
- `coalesce(...values)` - First non-null value
|
|
265
|
+
- `groupBy(array, key)` - Group by field
|
|
266
|
+
- `keyBy(array, key)` - Index by field
|
|
267
|
+
- `chunk(array, size)` - Split into chunks
|
|
268
|
+
- `flatten(array, depth)` - Flatten nested arrays
|
|
269
|
+
- `unique(array, key?)` - Remove duplicates
|
|
270
|
+
- `sortBy(array, key, desc?)` - Sort by field
|
|
271
|
+
- `compact(array)` - Remove falsy values
|
|
272
|
+
|
|
273
|
+
**String Operations:**
|
|
274
|
+
|
|
275
|
+
- `toCamelCase(str)` - Convert to camelCase
|
|
276
|
+
- `toSnakeCase(str)` - Convert to snake_case
|
|
277
|
+
- `template(str, vars)` - Replace {{placeholders}}
|
|
278
|
+
- `slugify(str)` - URL-safe slug
|
|
279
|
+
- `truncate(str, maxLen)` - Limit length
|
|
280
|
+
- `normalizeWhitespace(str)` - Clean whitespace
|
|
281
|
+
|
|
282
|
+
**Object Operations:**
|
|
283
|
+
|
|
284
|
+
- `deepClone(obj)` - Deep copy object
|
|
285
|
+
- `deepMerge(target, source)` - Merge objects
|
|
286
|
+
- `pick(obj, keys)` - Select fields
|
|
287
|
+
- `omit(obj, keys)` - Exclude fields
|
|
288
|
+
- `isEmpty(value)` - Check if empty
|
|
289
|
+
|
|
290
|
+
**Math Operations:**
|
|
291
|
+
|
|
292
|
+
- `sum(array, key?)` - Sum values
|
|
293
|
+
- `avg(array, key?)` - Average
|
|
294
|
+
- `min(array, key?)` - Minimum value
|
|
295
|
+
- `max(array, key?)` - Maximum value
|
|
296
|
+
- `clamp(num, min, max)` - Constrain range
|
|
297
|
+
|
|
298
|
+
**Validation:**
|
|
299
|
+
|
|
300
|
+
- `isValidEmail(email)` - Email validation
|
|
301
|
+
- `requireField(value, name)` - Throw if missing
|
|
302
|
+
- `isString(value)` - Type check
|
|
303
|
+
- `isNumber(value)` - Type check
|
|
304
|
+
- `isArray(value)` - Type check
|
|
305
|
+
- `isObject(value)` - Type check
|
|
306
|
+
- `isDate(value)` - Type check
|
|
307
|
+
|
|
308
|
+
**Additional Context:**
|
|
309
|
+
|
|
310
|
+
- `helpers.log` - Logger instance (info, error, warn, debug)
|
|
311
|
+
- `helpers.fluentClient` - Fluent API client (for queries)
|
|
312
|
+
- `helpers.context` - User-provided shared config
|
|
313
|
+
|
|
314
|
+
## Best Practices
|
|
315
|
+
|
|
316
|
+
1. **Always Use 4 Parameters** - Even if unused, include all for consistency
|
|
317
|
+
2. **Use Helpers for Safety** - `helpers.parseFloatSafe()` instead of `parseFloat()`
|
|
318
|
+
3. **Never Throw Errors** - Return safe fallbacks instead
|
|
319
|
+
4. **Log Errors** - Use `helpers.log.error()` for debugging
|
|
320
|
+
5. **Access Config via 3rd Param** - Use the `config` parameter instead of `helpers.context`
|
|
321
|
+
6. **Null-Safety** - Check for null/undefined before operations
|
|
322
|
+
7. **Document Resolvers** - Add JSDoc comments explaining logic
|
|
323
|
+
8. **Test Edge Cases** - Handle empty arrays, null values, missing fields
|
|
324
|
+
|
|
325
|
+
## Common Patterns
|
|
326
|
+
|
|
327
|
+
**Pattern 1: Fallback Chain**
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
const value = helpers.coalesce(
|
|
331
|
+
helpers.get(sourceData, 'primary.field'),
|
|
332
|
+
helpers.get(sourceData, 'secondary.field'),
|
|
333
|
+
config.defaultValue,
|
|
334
|
+
'UNKNOWN'
|
|
335
|
+
);
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Pattern 2: Attribute Extraction**
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
const attributes = helpers.get(sourceData, 'attributes') || [];
|
|
342
|
+
const targetAttr = attributes.find(a => a.name === 'TargetName');
|
|
343
|
+
return targetAttr?.value || '';
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Pattern 3: Conditional Format**
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
if (!value) return '';
|
|
350
|
+
|
|
351
|
+
try {
|
|
352
|
+
return formatValue(value);
|
|
353
|
+
} catch {
|
|
354
|
+
return value; // Return original on error
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
**Pattern 4: Multi-Source Calculation**
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
const base = helpers.parseFloatSafe(value, 0);
|
|
362
|
+
const multiplier = helpers.get(sourceData, 'multiplier') || 1;
|
|
363
|
+
const adjustment = config.adjustments?.[sourceData.type] || 0;
|
|
364
|
+
return base * multiplier + adjustment;
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
## Usage Example
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
// FC Connect SDK (latest)
|
|
371
|
+
// Install: npm install @fluentcommerce/fc-connect-sdk@latest
|
|
372
|
+
// Docs: https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk
|
|
373
|
+
// GitHub: https://github.com/fluentcommerce/fc-connect-sdk
|
|
374
|
+
|
|
375
|
+
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
376
|
+
import { customResolvers } from './resolvers';
|
|
377
|
+
|
|
378
|
+
const mapper = new UniversalMapper(
|
|
379
|
+
{
|
|
380
|
+
fields: {
|
|
381
|
+
skuRef: { source: 'sku_id', resolver: 'custom.formatSKU' },
|
|
382
|
+
price: { source: 'base_price', resolver: 'custom.calculatePrice' },
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
customResolvers, // Your custom resolvers
|
|
387
|
+
fluentClient: myClient, // Available as helpers.fluentClient
|
|
388
|
+
logger: myLogger, // Available as helpers.log
|
|
389
|
+
context: {
|
|
390
|
+
// Available as config parameter
|
|
391
|
+
skuPrefix: 'PROD',
|
|
392
|
+
taxRate: 0.1,
|
|
393
|
+
multipliers: { electronics: 1.5 },
|
|
394
|
+
},
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
const result = await mapper.map(sourceData);
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
**See Also:**
|
|
404
|
+
|
|
405
|
+
- [Resolver Signature Guide](../../02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md)
|
|
406
|
+
- [Universal Mapping Guide](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
407
|
+
- [SFCC Connector Resolvers](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|