@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,544 +1,544 @@
|
|
|
1
|
-
# Custom Resolvers
|
|
2
|
-
|
|
3
|
-
[← Back to GraphQL Mutation Mapping Guide](../graphql-mutation-mapping-readme.md)
|
|
4
|
-
|
|
5
|
-
**Module 8 of 13** | **Level**: Advanced | **Time**: 20 minutes
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Custom Resolvers
|
|
10
|
-
|
|
11
|
-
**For GraphQL mutation mapping, use custom resolver functions.** Resolvers provide full access to source data, helper functions, and async operations.
|
|
12
|
-
|
|
13
|
-
**⚠️ CRITICAL:** Custom resolvers **ONLY work with `mapWithNodes()`**. The `map()` method does **NOT** accept a resolvers parameter. If you need custom resolvers, you must use `mapWithNodes()`.
|
|
14
|
-
|
|
15
|
-
### Why Resolvers?
|
|
16
|
-
|
|
17
|
-
- ✅ Access full source data context via `helpers.get(data, 'any.path')`
|
|
18
|
-
- ✅ 57 helper functions (parseIntSafe, formatDate, groupBy, getXmlAttribute, getXmlTextContent, normalizeEmpty, etc.)
|
|
19
|
-
- ✅ Async operations (API calls, database lookups)
|
|
20
|
-
- ✅ Complex business logic and conditional transformations
|
|
21
|
-
- ✅ Better testability and maintainability
|
|
22
|
-
|
|
23
|
-
### Resolver Example
|
|
24
|
-
|
|
25
|
-
**Mapping configuration:**
|
|
26
|
-
|
|
27
|
-
```json
|
|
28
|
-
{
|
|
29
|
-
"quantity": {
|
|
30
|
-
"source": "qty",
|
|
31
|
-
"resolver": "custom.parseQuantity"
|
|
32
|
-
},
|
|
33
|
-
"customer.id": {
|
|
34
|
-
"resolver": "custom.lookupOrCreateCustomer"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Resolver implementation:**
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
import { GraphQLMutationMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
43
|
-
|
|
44
|
-
// Define custom resolvers (Record<string, Function>)
|
|
45
|
-
const customResolvers = {
|
|
46
|
-
// Simple transformation
|
|
47
|
-
'custom.parseQuantity': (value, data, config, helpers) => {
|
|
48
|
-
void data; void config; // Unused parameters
|
|
49
|
-
return helpers.parseIntSafe(value, 0);
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
// Complex logic with data access
|
|
53
|
-
'custom.calculateTotal': (value, data, config, helpers) => {
|
|
54
|
-
void value; void config; // Unused parameters
|
|
55
|
-
const items = helpers.ensureArray(helpers.get(data, 'order.items.item'));
|
|
56
|
-
return items.reduce(
|
|
57
|
-
(sum, item) =>
|
|
58
|
-
sum + helpers.parseFloatSafe(item.price, 0) * helpers.parseIntSafe(item.quantity, 0),
|
|
59
|
-
0
|
|
60
|
-
);
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
// Async operations
|
|
64
|
-
'custom.lookupOrCreateCustomer': async (value, data, config, helpers) => {
|
|
65
|
-
void value; void config; // Unused parameters
|
|
66
|
-
const customerId = helpers.get(data, 'order.customer.id');
|
|
67
|
-
|
|
68
|
-
// Query Fluent API
|
|
69
|
-
const existing = await helpers.fluentClient.graphql({
|
|
70
|
-
query: `query { customers(id: "${customerId}") { id } }`,
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
if (existing.data?.customers?.length > 0) {
|
|
74
|
-
return existing.data.customers[0].id;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Create new customer
|
|
78
|
-
const created = await helpers.fluentClient.graphql({
|
|
79
|
-
query: `mutation { createCustomer(input: { id: "${customerId}" }) { id } }`,
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
return created.data?.createCustomer?.id;
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// ✅ CORRECT: Resolvers in constructor (primary pattern - consistent with UniversalMapper)
|
|
87
|
-
const mapper = new GraphQLMutationMapper(
|
|
88
|
-
mappingConfig,
|
|
89
|
-
logger,
|
|
90
|
-
{
|
|
91
|
-
customResolvers, // Resolvers registered in constructor
|
|
92
|
-
fluentClient: fluentClient
|
|
93
|
-
}
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
// Pass resolverContext with config - resolvers access via helpers.context.config
|
|
97
|
-
const resolverContext = {
|
|
98
|
-
fluentClient,
|
|
99
|
-
config: {
|
|
100
|
-
retailerId: '1',
|
|
101
|
-
defaultOrderType: 'HD'
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
const result = await mapper.mapWithNodes(xmlData, undefined, resolverContext);
|
|
105
|
-
// Constructor resolvers are automatically used
|
|
106
|
-
// Resolvers can access config via helpers.context.config or config parameter
|
|
107
|
-
|
|
108
|
-
// ✅ CORRECT: Method call resolvers override constructor resolvers (for per-call customization)
|
|
109
|
-
const mapper = new GraphQLMutationMapper(
|
|
110
|
-
mappingConfig,
|
|
111
|
-
logger,
|
|
112
|
-
{
|
|
113
|
-
customResolvers: baseResolvers, // Base resolvers in constructor
|
|
114
|
-
fluentClient: fluentClient
|
|
115
|
-
}
|
|
116
|
-
);
|
|
117
|
-
const result = await mapper.mapWithNodes(xmlData, overrideResolvers, { fluentClient });
|
|
118
|
-
// overrideResolvers take precedence over baseResolvers
|
|
119
|
-
|
|
120
|
-
// ❌ WRONG: map() does NOT accept custom resolvers parameter
|
|
121
|
-
// const payload = await mapper.map(xmlData, customResolvers); // ❌ This will fail!
|
|
122
|
-
// const exec = await fluentClient.graphql(payload);
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Available Helper Functions
|
|
126
|
-
|
|
127
|
-
Resolvers have access to 57 helper functions:
|
|
128
|
-
|
|
129
|
-
### Data Access
|
|
130
|
-
|
|
131
|
-
**`get(obj, path)`** - Safe path resolution
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
const email = helpers.get(data, 'order.customer.email');
|
|
135
|
-
const firstItemSku = helpers.get(data, 'order.items[0].sku');
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**`set(obj, path, value)`** - Set nested values
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
helpers.set(data, 'order.calculatedTotal', 199.99);
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
**`ensureArray(value)`** - Normalize to array
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
const items = helpers.ensureArray(helpers.get(data, 'order.items.item'));
|
|
148
|
-
// Single object → [object]
|
|
149
|
-
// Array → array (unchanged)
|
|
150
|
-
// null/undefined → []
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Parsing
|
|
154
|
-
|
|
155
|
-
**`parseIntSafe(value, default)`** - Safe integer parsing
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
const quantity = helpers.parseIntSafe(value, 0);
|
|
159
|
-
// "123" → 123
|
|
160
|
-
// "abc" → 0 (default)
|
|
161
|
-
// null → 0 (default)
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**`parseFloatSafe(value, default)`** - Safe float parsing
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
const price = helpers.parseFloatSafe(value, 0.0);
|
|
168
|
-
// "19.99" → 19.99
|
|
169
|
-
// "abc" → 0.0 (default)
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
**`safeJsonParse(str, default)`** - Safe JSON parsing
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
const metadata = helpers.safeJsonParse(value, {});
|
|
176
|
-
// Valid JSON → parsed object
|
|
177
|
-
// Invalid JSON → {} (default)
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### String Operations
|
|
181
|
-
|
|
182
|
-
**`trim(str)`** - Remove whitespace
|
|
183
|
-
|
|
184
|
-
```typescript
|
|
185
|
-
const clean = helpers.trim(value);
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
**`truncate(str, len)`** - Truncate to length
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
const short = helpers.truncate(value, 100);
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
**`normalizeWhitespace(str)`** - Normalize multiple spaces
|
|
195
|
-
|
|
196
|
-
```typescript
|
|
197
|
-
const normalized = helpers.normalizeWhitespace('Hello World');
|
|
198
|
-
// → "Hello World"
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**`toCamelCase(str)`**, **`toSnakeCase(str)`**, **`slugify(str)`** - Case conversion
|
|
202
|
-
|
|
203
|
-
```typescript
|
|
204
|
-
helpers.toCamelCase('first-name'); // → "firstName"
|
|
205
|
-
helpers.toSnakeCase('firstName'); // → "first_name"
|
|
206
|
-
helpers.slugify('Product Name!'); // → "product-name"
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**`template(str, vars)`** - String interpolation
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
const message = helpers.template('Order {orderNo} for {customer}', {
|
|
213
|
-
orderNo: 'ORD-123',
|
|
214
|
-
customer: 'John Doe',
|
|
215
|
-
});
|
|
216
|
-
// → "Order ORD-123 for John Doe"
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### Array Operations
|
|
220
|
-
|
|
221
|
-
**`groupBy(arr, key)`** - Group array by key
|
|
222
|
-
|
|
223
|
-
```typescript
|
|
224
|
-
const byStatus = helpers.groupBy(orders, 'status');
|
|
225
|
-
// → { OPEN: [...], CLOSED: [...] }
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
**`keyBy(arr, key)`** - Index array by key
|
|
229
|
-
|
|
230
|
-
```typescript
|
|
231
|
-
const byId = helpers.keyBy(items, 'id');
|
|
232
|
-
// → { "123": {...}, "456": {...} }
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
**`chunk(arr, size)`** - Split into chunks
|
|
236
|
-
|
|
237
|
-
```typescript
|
|
238
|
-
const batches = helpers.chunk(items, 10);
|
|
239
|
-
// → [[1..10], [11..20], ...]
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
**`unique(arr, key)`** - Remove duplicates
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
const uniqueSkus = helpers.unique(items, 'sku');
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
**`sortBy(arr, key)`** - Sort by key
|
|
249
|
-
|
|
250
|
-
```typescript
|
|
251
|
-
const sorted = helpers.sortBy(items, 'price');
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
**`compact(arr)`** - Remove falsy values
|
|
255
|
-
|
|
256
|
-
```typescript
|
|
257
|
-
const clean = helpers.compact([1, null, 2, undefined, 3]);
|
|
258
|
-
// → [1, 2, 3]
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
**`sum(arr, key)`**, **`avg(arr, key)`**, **`min(arr)`**, **`max(arr)`** - Array math
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
const total = helpers.sum(items, 'price');
|
|
265
|
-
const average = helpers.avg(items, 'quantity');
|
|
266
|
-
const lowest = helpers.min(prices);
|
|
267
|
-
const highest = helpers.max(prices);
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Date Operations
|
|
271
|
-
|
|
272
|
-
**`formatDate(date)`** - Format to ISO 8601
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
const formatted = helpers.formatDate(new Date());
|
|
276
|
-
// → "2025-10-19T12:00:00Z"
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
**`parseDate(str)`** - Parse date string
|
|
280
|
-
|
|
281
|
-
```typescript
|
|
282
|
-
const date = helpers.parseDate('2025-10-19');
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
**`addDays(date, n)`**, **`subtractDays(date, n)`** - Date arithmetic
|
|
286
|
-
|
|
287
|
-
```typescript
|
|
288
|
-
const future = helpers.addDays(new Date(), 7);
|
|
289
|
-
const past = helpers.subtractDays(new Date(), 30);
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**`dateDiff(d1, d2)`** - Difference in days
|
|
293
|
-
|
|
294
|
-
```typescript
|
|
295
|
-
const days = helpers.dateDiff(endDate, startDate);
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
### Validation
|
|
299
|
-
|
|
300
|
-
**`isValidEmail(str)`** - Email validation
|
|
301
|
-
|
|
302
|
-
```typescript
|
|
303
|
-
if (helpers.isValidEmail(email)) {
|
|
304
|
-
// Valid email
|
|
305
|
-
}
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
**`requireField(value, name)`** - Throw if missing
|
|
309
|
-
|
|
310
|
-
```typescript
|
|
311
|
-
helpers.requireField(value, 'customerId');
|
|
312
|
-
// Throws if value is null/undefined/empty
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
**`isString(val)`**, **`isNumber(val)`**, **`isArray(val)`**, **`isObject(val)`** - Type checking
|
|
316
|
-
|
|
317
|
-
```typescript
|
|
318
|
-
if (helpers.isArray(value)) {
|
|
319
|
-
// Handle array
|
|
320
|
-
}
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
### Utilities
|
|
324
|
-
|
|
325
|
-
**`deepClone(obj)`** - Deep copy
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
const copy = helpers.deepClone(original);
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
**`deepMerge(obj1, obj2)`** - Deep merge
|
|
332
|
-
|
|
333
|
-
```typescript
|
|
334
|
-
const merged = helpers.deepMerge(defaults, overrides);
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
**`pick(obj, keys)`**, **`omit(obj, keys)`** - Select/exclude keys
|
|
338
|
-
|
|
339
|
-
```typescript
|
|
340
|
-
const subset = helpers.pick(order, ['id', 'ref', 'status']);
|
|
341
|
-
const cleaned = helpers.omit(order, ['internalField']);
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
**`merge(...objs)`** - Shallow merge
|
|
345
|
-
|
|
346
|
-
```typescript
|
|
347
|
-
const combined = helpers.merge(obj1, obj2, obj3);
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
**`coalesce(...values)`** - First non-null value
|
|
351
|
-
|
|
352
|
-
```typescript
|
|
353
|
-
const value = helpers.coalesce(null, undefined, 'default');
|
|
354
|
-
// → "default"
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
**`defaultTo(value, default)`** - Default value
|
|
358
|
-
|
|
359
|
-
```typescript
|
|
360
|
-
const quantity = helpers.defaultTo(value, 1);
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
**`retry(fn, maxRetries)`** - Retry async function
|
|
364
|
-
|
|
365
|
-
```typescript
|
|
366
|
-
const result = await helpers.retry(async () => {
|
|
367
|
-
return await api.call();
|
|
368
|
-
}, 3);
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
**`batchProcess(items, fn)`** - Process in batches
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
await helpers.batchProcess(items, async batch => {
|
|
375
|
-
await processBatch(batch);
|
|
376
|
-
});
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
## Accessing Runtime Configuration
|
|
380
|
-
|
|
381
|
-
**Important:** When you pass `resolverContext` to `mapWithNodes()`, resolvers can access it via `helpers.context`.
|
|
382
|
-
|
|
383
|
-
**Example: Accessing retailerId from resolverContext**
|
|
384
|
-
|
|
385
|
-
```typescript
|
|
386
|
-
// Pass config in resolverContext
|
|
387
|
-
const resolverContext = {
|
|
388
|
-
fluentClient,
|
|
389
|
-
config: {
|
|
390
|
-
retailerId: '1',
|
|
391
|
-
defaultOrderType: 'HD',
|
|
392
|
-
defaultCountry: 'US'
|
|
393
|
-
}
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
const result = await mapper.mapWithNodes(xmlData, undefined, resolverContext);
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
**In your custom resolver:**
|
|
400
|
-
|
|
401
|
-
```typescript
|
|
402
|
-
const customResolvers = {
|
|
403
|
-
'custom.getRetailerId': (value, sourceData, config, helpers) => {
|
|
404
|
-
// Access resolverContext.config via helpers.context.config
|
|
405
|
-
return helpers.context?.config?.retailerId || config?.retailerId;
|
|
406
|
-
},
|
|
407
|
-
|
|
408
|
-
'custom.getOrderType': (value, sourceData, config, helpers) => {
|
|
409
|
-
// Access nested config values
|
|
410
|
-
return helpers.context?.config?.defaultOrderType || 'STANDARD';
|
|
411
|
-
}
|
|
412
|
-
};
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
**In your mapping config JSON:**
|
|
416
|
-
|
|
417
|
-
```json
|
|
418
|
-
{
|
|
419
|
-
"fields": {
|
|
420
|
-
"retailer": {
|
|
421
|
-
"fields": {
|
|
422
|
-
"id": {
|
|
423
|
-
"resolver": "custom.getRetailerId",
|
|
424
|
-
"required": true
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
},
|
|
428
|
-
"type": {
|
|
429
|
-
"resolver": "custom.getOrderType"
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
**Note:** The `config` parameter (3rd param) and `helpers.context.config` both reference the same `resolverContext.config` object. Use whichever is more convenient.
|
|
436
|
-
|
|
437
|
-
---
|
|
438
|
-
|
|
439
|
-
## Resolver Patterns
|
|
440
|
-
|
|
441
|
-
### Pattern 1: Data Enrichment
|
|
442
|
-
|
|
443
|
-
```typescript
|
|
444
|
-
'custom.enrichProduct': async (value, data, config, helpers) => {
|
|
445
|
-
const sku = helpers.get(data, 'item.sku');
|
|
446
|
-
|
|
447
|
-
// Lookup product details from API
|
|
448
|
-
const product = await helpers.fluentClient.graphql({
|
|
449
|
-
query: `query { products(sku: "${sku}") { id name category } }`
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
return {
|
|
453
|
-
sku,
|
|
454
|
-
productId: product.data.products[0].id,
|
|
455
|
-
name: product.data.products[0].name
|
|
456
|
-
};
|
|
457
|
-
}
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
### Pattern 2: Conditional Logic
|
|
461
|
-
|
|
462
|
-
```typescript
|
|
463
|
-
'custom.determineOrderType': (value, data, config, helpers) => {
|
|
464
|
-
const totalPrice = helpers.parseFloatSafe(
|
|
465
|
-
helpers.get(data, 'order.total'),
|
|
466
|
-
0
|
|
467
|
-
);
|
|
468
|
-
|
|
469
|
-
const isExpress = helpers.get(data, 'order.shipping.express') === 'true';
|
|
470
|
-
|
|
471
|
-
if (isExpress) {
|
|
472
|
-
return 'EXPRESS';
|
|
473
|
-
} else if (totalPrice > 1000) {
|
|
474
|
-
return 'PREMIUM';
|
|
475
|
-
} else {
|
|
476
|
-
return 'STANDARD';
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
### Pattern 3: Complex Calculations
|
|
482
|
-
|
|
483
|
-
```typescript
|
|
484
|
-
'custom.calculateOrderTotal': (value, data, config, helpers) => {
|
|
485
|
-
const items = helpers.ensureArray(helpers.get(data, 'order.items.item'));
|
|
486
|
-
|
|
487
|
-
const subtotal = helpers.sum(items.map(item => ({
|
|
488
|
-
total: helpers.parseFloatSafe(item.price, 0) *
|
|
489
|
-
helpers.parseIntSafe(item.quantity, 0)
|
|
490
|
-
})), 'total');
|
|
491
|
-
|
|
492
|
-
const taxRate = helpers.parseFloatSafe(
|
|
493
|
-
helpers.get(data, 'order.taxRate'),
|
|
494
|
-
0.1
|
|
495
|
-
);
|
|
496
|
-
|
|
497
|
-
const shippingCost = helpers.parseFloatSafe(
|
|
498
|
-
helpers.get(data, 'order.shipping.cost'),
|
|
499
|
-
0
|
|
500
|
-
);
|
|
501
|
-
|
|
502
|
-
return subtotal * (1 + taxRate) + shippingCost;
|
|
503
|
-
}
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
### Pattern 4: Error Handling
|
|
507
|
-
|
|
508
|
-
```typescript
|
|
509
|
-
'custom.safeParseCustomer': (value, data, config, helpers) => {
|
|
510
|
-
try {
|
|
511
|
-
const customerId = helpers.requireField(
|
|
512
|
-
helpers.get(data, 'order.customer.id'),
|
|
513
|
-
'customerId'
|
|
514
|
-
);
|
|
515
|
-
|
|
516
|
-
const email = helpers.get(data, 'order.customer.email');
|
|
517
|
-
if (!helpers.isValidEmail(email)) {
|
|
518
|
-
throw new Error('Invalid customer email');
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
return {
|
|
522
|
-
id: customerId,
|
|
523
|
-
email: email.toLowerCase()
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
} catch (error) {
|
|
527
|
-
helpers.logger.error('Failed to parse customer:', error);
|
|
528
|
-
throw error;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
```
|
|
532
|
-
|
|
533
|
-
---
|
|
534
|
-
|
|
535
|
-
## Navigation
|
|
536
|
-
|
|
537
|
-
[← Previous: Array Handling](./graphql-mutation-mapping-07-array-handling.md) | [Back to Guide](../graphql-mutation-mapping-readme.md) | [Next: Advanced Patterns →](./graphql-mutation-mapping-09-advanced-patterns.md)
|
|
538
|
-
|
|
539
|
-
## Related Documentation
|
|
540
|
-
|
|
541
|
-
- [Resolver Helpers Reference](../../../mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md) - Complete helper function documentation
|
|
542
|
-
- [Module 09: Advanced Patterns](./graphql-mutation-mapping-09-advanced-patterns.md) - Advanced resolver use cases
|
|
543
|
-
- [Module 10: Hooks and Variables](./graphql-mutation-mapping-10-hooks-and-variables.md) - Pre/post-processing hooks
|
|
544
|
-
- [API Reference](../../../api-reference/api-reference-readme.md) - Complete API documentation
|
|
1
|
+
# Custom Resolvers
|
|
2
|
+
|
|
3
|
+
[← Back to GraphQL Mutation Mapping Guide](../graphql-mutation-mapping-readme.md)
|
|
4
|
+
|
|
5
|
+
**Module 8 of 13** | **Level**: Advanced | **Time**: 20 minutes
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Custom Resolvers
|
|
10
|
+
|
|
11
|
+
**For GraphQL mutation mapping, use custom resolver functions.** Resolvers provide full access to source data, helper functions, and async operations.
|
|
12
|
+
|
|
13
|
+
**⚠️ CRITICAL:** Custom resolvers **ONLY work with `mapWithNodes()`**. The `map()` method does **NOT** accept a resolvers parameter. If you need custom resolvers, you must use `mapWithNodes()`.
|
|
14
|
+
|
|
15
|
+
### Why Resolvers?
|
|
16
|
+
|
|
17
|
+
- ✅ Access full source data context via `helpers.get(data, 'any.path')`
|
|
18
|
+
- ✅ 57 helper functions (parseIntSafe, formatDate, groupBy, getXmlAttribute, getXmlTextContent, normalizeEmpty, etc.)
|
|
19
|
+
- ✅ Async operations (API calls, database lookups)
|
|
20
|
+
- ✅ Complex business logic and conditional transformations
|
|
21
|
+
- ✅ Better testability and maintainability
|
|
22
|
+
|
|
23
|
+
### Resolver Example
|
|
24
|
+
|
|
25
|
+
**Mapping configuration:**
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"quantity": {
|
|
30
|
+
"source": "qty",
|
|
31
|
+
"resolver": "custom.parseQuantity"
|
|
32
|
+
},
|
|
33
|
+
"customer.id": {
|
|
34
|
+
"resolver": "custom.lookupOrCreateCustomer"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Resolver implementation:**
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import { GraphQLMutationMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
43
|
+
|
|
44
|
+
// Define custom resolvers (Record<string, Function>)
|
|
45
|
+
const customResolvers = {
|
|
46
|
+
// Simple transformation
|
|
47
|
+
'custom.parseQuantity': (value, data, config, helpers) => {
|
|
48
|
+
void data; void config; // Unused parameters
|
|
49
|
+
return helpers.parseIntSafe(value, 0);
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
// Complex logic with data access
|
|
53
|
+
'custom.calculateTotal': (value, data, config, helpers) => {
|
|
54
|
+
void value; void config; // Unused parameters
|
|
55
|
+
const items = helpers.ensureArray(helpers.get(data, 'order.items.item'));
|
|
56
|
+
return items.reduce(
|
|
57
|
+
(sum, item) =>
|
|
58
|
+
sum + helpers.parseFloatSafe(item.price, 0) * helpers.parseIntSafe(item.quantity, 0),
|
|
59
|
+
0
|
|
60
|
+
);
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Async operations
|
|
64
|
+
'custom.lookupOrCreateCustomer': async (value, data, config, helpers) => {
|
|
65
|
+
void value; void config; // Unused parameters
|
|
66
|
+
const customerId = helpers.get(data, 'order.customer.id');
|
|
67
|
+
|
|
68
|
+
// Query Fluent API
|
|
69
|
+
const existing = await helpers.fluentClient.graphql({
|
|
70
|
+
query: `query { customers(id: "${customerId}") { id } }`,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
if (existing.data?.customers?.length > 0) {
|
|
74
|
+
return existing.data.customers[0].id;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Create new customer
|
|
78
|
+
const created = await helpers.fluentClient.graphql({
|
|
79
|
+
query: `mutation { createCustomer(input: { id: "${customerId}" }) { id } }`,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
return created.data?.createCustomer?.id;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// ✅ CORRECT: Resolvers in constructor (primary pattern - consistent with UniversalMapper)
|
|
87
|
+
const mapper = new GraphQLMutationMapper(
|
|
88
|
+
mappingConfig,
|
|
89
|
+
logger,
|
|
90
|
+
{
|
|
91
|
+
customResolvers, // Resolvers registered in constructor
|
|
92
|
+
fluentClient: fluentClient
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// Pass resolverContext with config - resolvers access via helpers.context.config
|
|
97
|
+
const resolverContext = {
|
|
98
|
+
fluentClient,
|
|
99
|
+
config: {
|
|
100
|
+
retailerId: '1',
|
|
101
|
+
defaultOrderType: 'HD'
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const result = await mapper.mapWithNodes(xmlData, undefined, resolverContext);
|
|
105
|
+
// Constructor resolvers are automatically used
|
|
106
|
+
// Resolvers can access config via helpers.context.config or config parameter
|
|
107
|
+
|
|
108
|
+
// ✅ CORRECT: Method call resolvers override constructor resolvers (for per-call customization)
|
|
109
|
+
const mapper = new GraphQLMutationMapper(
|
|
110
|
+
mappingConfig,
|
|
111
|
+
logger,
|
|
112
|
+
{
|
|
113
|
+
customResolvers: baseResolvers, // Base resolvers in constructor
|
|
114
|
+
fluentClient: fluentClient
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
const result = await mapper.mapWithNodes(xmlData, overrideResolvers, { fluentClient });
|
|
118
|
+
// overrideResolvers take precedence over baseResolvers
|
|
119
|
+
|
|
120
|
+
// ❌ WRONG: map() does NOT accept custom resolvers parameter
|
|
121
|
+
// const payload = await mapper.map(xmlData, customResolvers); // ❌ This will fail!
|
|
122
|
+
// const exec = await fluentClient.graphql(payload);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Available Helper Functions
|
|
126
|
+
|
|
127
|
+
Resolvers have access to 57 helper functions:
|
|
128
|
+
|
|
129
|
+
### Data Access
|
|
130
|
+
|
|
131
|
+
**`get(obj, path)`** - Safe path resolution
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const email = helpers.get(data, 'order.customer.email');
|
|
135
|
+
const firstItemSku = helpers.get(data, 'order.items[0].sku');
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**`set(obj, path, value)`** - Set nested values
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
helpers.set(data, 'order.calculatedTotal', 199.99);
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**`ensureArray(value)`** - Normalize to array
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
const items = helpers.ensureArray(helpers.get(data, 'order.items.item'));
|
|
148
|
+
// Single object → [object]
|
|
149
|
+
// Array → array (unchanged)
|
|
150
|
+
// null/undefined → []
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Parsing
|
|
154
|
+
|
|
155
|
+
**`parseIntSafe(value, default)`** - Safe integer parsing
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
const quantity = helpers.parseIntSafe(value, 0);
|
|
159
|
+
// "123" → 123
|
|
160
|
+
// "abc" → 0 (default)
|
|
161
|
+
// null → 0 (default)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**`parseFloatSafe(value, default)`** - Safe float parsing
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
const price = helpers.parseFloatSafe(value, 0.0);
|
|
168
|
+
// "19.99" → 19.99
|
|
169
|
+
// "abc" → 0.0 (default)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**`safeJsonParse(str, default)`** - Safe JSON parsing
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const metadata = helpers.safeJsonParse(value, {});
|
|
176
|
+
// Valid JSON → parsed object
|
|
177
|
+
// Invalid JSON → {} (default)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### String Operations
|
|
181
|
+
|
|
182
|
+
**`trim(str)`** - Remove whitespace
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
const clean = helpers.trim(value);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**`truncate(str, len)`** - Truncate to length
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
const short = helpers.truncate(value, 100);
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**`normalizeWhitespace(str)`** - Normalize multiple spaces
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
const normalized = helpers.normalizeWhitespace('Hello World');
|
|
198
|
+
// → "Hello World"
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**`toCamelCase(str)`**, **`toSnakeCase(str)`**, **`slugify(str)`** - Case conversion
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
helpers.toCamelCase('first-name'); // → "firstName"
|
|
205
|
+
helpers.toSnakeCase('firstName'); // → "first_name"
|
|
206
|
+
helpers.slugify('Product Name!'); // → "product-name"
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**`template(str, vars)`** - String interpolation
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
const message = helpers.template('Order {orderNo} for {customer}', {
|
|
213
|
+
orderNo: 'ORD-123',
|
|
214
|
+
customer: 'John Doe',
|
|
215
|
+
});
|
|
216
|
+
// → "Order ORD-123 for John Doe"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Array Operations
|
|
220
|
+
|
|
221
|
+
**`groupBy(arr, key)`** - Group array by key
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
const byStatus = helpers.groupBy(orders, 'status');
|
|
225
|
+
// → { OPEN: [...], CLOSED: [...] }
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**`keyBy(arr, key)`** - Index array by key
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
const byId = helpers.keyBy(items, 'id');
|
|
232
|
+
// → { "123": {...}, "456": {...} }
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**`chunk(arr, size)`** - Split into chunks
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
const batches = helpers.chunk(items, 10);
|
|
239
|
+
// → [[1..10], [11..20], ...]
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**`unique(arr, key)`** - Remove duplicates
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
const uniqueSkus = helpers.unique(items, 'sku');
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**`sortBy(arr, key)`** - Sort by key
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
const sorted = helpers.sortBy(items, 'price');
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**`compact(arr)`** - Remove falsy values
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
const clean = helpers.compact([1, null, 2, undefined, 3]);
|
|
258
|
+
// → [1, 2, 3]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**`sum(arr, key)`**, **`avg(arr, key)`**, **`min(arr)`**, **`max(arr)`** - Array math
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
const total = helpers.sum(items, 'price');
|
|
265
|
+
const average = helpers.avg(items, 'quantity');
|
|
266
|
+
const lowest = helpers.min(prices);
|
|
267
|
+
const highest = helpers.max(prices);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Date Operations
|
|
271
|
+
|
|
272
|
+
**`formatDate(date)`** - Format to ISO 8601
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const formatted = helpers.formatDate(new Date());
|
|
276
|
+
// → "2025-10-19T12:00:00Z"
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**`parseDate(str)`** - Parse date string
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
const date = helpers.parseDate('2025-10-19');
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**`addDays(date, n)`**, **`subtractDays(date, n)`** - Date arithmetic
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
const future = helpers.addDays(new Date(), 7);
|
|
289
|
+
const past = helpers.subtractDays(new Date(), 30);
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**`dateDiff(d1, d2)`** - Difference in days
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
const days = helpers.dateDiff(endDate, startDate);
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Validation
|
|
299
|
+
|
|
300
|
+
**`isValidEmail(str)`** - Email validation
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
if (helpers.isValidEmail(email)) {
|
|
304
|
+
// Valid email
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**`requireField(value, name)`** - Throw if missing
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
helpers.requireField(value, 'customerId');
|
|
312
|
+
// Throws if value is null/undefined/empty
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**`isString(val)`**, **`isNumber(val)`**, **`isArray(val)`**, **`isObject(val)`** - Type checking
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
if (helpers.isArray(value)) {
|
|
319
|
+
// Handle array
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Utilities
|
|
324
|
+
|
|
325
|
+
**`deepClone(obj)`** - Deep copy
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
const copy = helpers.deepClone(original);
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**`deepMerge(obj1, obj2)`** - Deep merge
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
const merged = helpers.deepMerge(defaults, overrides);
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**`pick(obj, keys)`**, **`omit(obj, keys)`** - Select/exclude keys
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
const subset = helpers.pick(order, ['id', 'ref', 'status']);
|
|
341
|
+
const cleaned = helpers.omit(order, ['internalField']);
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**`merge(...objs)`** - Shallow merge
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
const combined = helpers.merge(obj1, obj2, obj3);
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
**`coalesce(...values)`** - First non-null value
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
const value = helpers.coalesce(null, undefined, 'default');
|
|
354
|
+
// → "default"
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**`defaultTo(value, default)`** - Default value
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
const quantity = helpers.defaultTo(value, 1);
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**`retry(fn, maxRetries)`** - Retry async function
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
const result = await helpers.retry(async () => {
|
|
367
|
+
return await api.call();
|
|
368
|
+
}, 3);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**`batchProcess(items, fn)`** - Process in batches
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
await helpers.batchProcess(items, async batch => {
|
|
375
|
+
await processBatch(batch);
|
|
376
|
+
});
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Accessing Runtime Configuration
|
|
380
|
+
|
|
381
|
+
**Important:** When you pass `resolverContext` to `mapWithNodes()`, resolvers can access it via `helpers.context`.
|
|
382
|
+
|
|
383
|
+
**Example: Accessing retailerId from resolverContext**
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
// Pass config in resolverContext
|
|
387
|
+
const resolverContext = {
|
|
388
|
+
fluentClient,
|
|
389
|
+
config: {
|
|
390
|
+
retailerId: '1',
|
|
391
|
+
defaultOrderType: 'HD',
|
|
392
|
+
defaultCountry: 'US'
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
const result = await mapper.mapWithNodes(xmlData, undefined, resolverContext);
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**In your custom resolver:**
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
const customResolvers = {
|
|
403
|
+
'custom.getRetailerId': (value, sourceData, config, helpers) => {
|
|
404
|
+
// Access resolverContext.config via helpers.context.config
|
|
405
|
+
return helpers.context?.config?.retailerId || config?.retailerId;
|
|
406
|
+
},
|
|
407
|
+
|
|
408
|
+
'custom.getOrderType': (value, sourceData, config, helpers) => {
|
|
409
|
+
// Access nested config values
|
|
410
|
+
return helpers.context?.config?.defaultOrderType || 'STANDARD';
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**In your mapping config JSON:**
|
|
416
|
+
|
|
417
|
+
```json
|
|
418
|
+
{
|
|
419
|
+
"fields": {
|
|
420
|
+
"retailer": {
|
|
421
|
+
"fields": {
|
|
422
|
+
"id": {
|
|
423
|
+
"resolver": "custom.getRetailerId",
|
|
424
|
+
"required": true
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
"type": {
|
|
429
|
+
"resolver": "custom.getOrderType"
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**Note:** The `config` parameter (3rd param) and `helpers.context.config` both reference the same `resolverContext.config` object. Use whichever is more convenient.
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Resolver Patterns
|
|
440
|
+
|
|
441
|
+
### Pattern 1: Data Enrichment
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
'custom.enrichProduct': async (value, data, config, helpers) => {
|
|
445
|
+
const sku = helpers.get(data, 'item.sku');
|
|
446
|
+
|
|
447
|
+
// Lookup product details from API
|
|
448
|
+
const product = await helpers.fluentClient.graphql({
|
|
449
|
+
query: `query { products(sku: "${sku}") { id name category } }`
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
return {
|
|
453
|
+
sku,
|
|
454
|
+
productId: product.data.products[0].id,
|
|
455
|
+
name: product.data.products[0].name
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### Pattern 2: Conditional Logic
|
|
461
|
+
|
|
462
|
+
```typescript
|
|
463
|
+
'custom.determineOrderType': (value, data, config, helpers) => {
|
|
464
|
+
const totalPrice = helpers.parseFloatSafe(
|
|
465
|
+
helpers.get(data, 'order.total'),
|
|
466
|
+
0
|
|
467
|
+
);
|
|
468
|
+
|
|
469
|
+
const isExpress = helpers.get(data, 'order.shipping.express') === 'true';
|
|
470
|
+
|
|
471
|
+
if (isExpress) {
|
|
472
|
+
return 'EXPRESS';
|
|
473
|
+
} else if (totalPrice > 1000) {
|
|
474
|
+
return 'PREMIUM';
|
|
475
|
+
} else {
|
|
476
|
+
return 'STANDARD';
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Pattern 3: Complex Calculations
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
'custom.calculateOrderTotal': (value, data, config, helpers) => {
|
|
485
|
+
const items = helpers.ensureArray(helpers.get(data, 'order.items.item'));
|
|
486
|
+
|
|
487
|
+
const subtotal = helpers.sum(items.map(item => ({
|
|
488
|
+
total: helpers.parseFloatSafe(item.price, 0) *
|
|
489
|
+
helpers.parseIntSafe(item.quantity, 0)
|
|
490
|
+
})), 'total');
|
|
491
|
+
|
|
492
|
+
const taxRate = helpers.parseFloatSafe(
|
|
493
|
+
helpers.get(data, 'order.taxRate'),
|
|
494
|
+
0.1
|
|
495
|
+
);
|
|
496
|
+
|
|
497
|
+
const shippingCost = helpers.parseFloatSafe(
|
|
498
|
+
helpers.get(data, 'order.shipping.cost'),
|
|
499
|
+
0
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
return subtotal * (1 + taxRate) + shippingCost;
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Pattern 4: Error Handling
|
|
507
|
+
|
|
508
|
+
```typescript
|
|
509
|
+
'custom.safeParseCustomer': (value, data, config, helpers) => {
|
|
510
|
+
try {
|
|
511
|
+
const customerId = helpers.requireField(
|
|
512
|
+
helpers.get(data, 'order.customer.id'),
|
|
513
|
+
'customerId'
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
const email = helpers.get(data, 'order.customer.email');
|
|
517
|
+
if (!helpers.isValidEmail(email)) {
|
|
518
|
+
throw new Error('Invalid customer email');
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
return {
|
|
522
|
+
id: customerId,
|
|
523
|
+
email: email.toLowerCase()
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
} catch (error) {
|
|
527
|
+
helpers.logger.error('Failed to parse customer:', error);
|
|
528
|
+
throw error;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
## Navigation
|
|
536
|
+
|
|
537
|
+
[← Previous: Array Handling](./graphql-mutation-mapping-07-array-handling.md) | [Back to Guide](../graphql-mutation-mapping-readme.md) | [Next: Advanced Patterns →](./graphql-mutation-mapping-09-advanced-patterns.md)
|
|
538
|
+
|
|
539
|
+
## Related Documentation
|
|
540
|
+
|
|
541
|
+
- [Resolver Helpers Reference](../../../mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md) - Complete helper function documentation
|
|
542
|
+
- [Module 09: Advanced Patterns](./graphql-mutation-mapping-09-advanced-patterns.md) - Advanced resolver use cases
|
|
543
|
+
- [Module 10: Hooks and Variables](./graphql-mutation-mapping-10-hooks-and-variables.md) - Pre/post-processing hooks
|
|
544
|
+
- [API Reference](../../../api-reference/api-reference-readme.md) - Complete API documentation
|