@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,854 +1,854 @@
|
|
|
1
|
-
# Resolver Troubleshooting Guide
|
|
2
|
-
|
|
3
|
-
**Common issues, solutions, and debugging tips**
|
|
4
|
-
|
|
5
|
-
Version: 2.0.0
|
|
6
|
-
Last Updated: 2025-01-14
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Table of Contents
|
|
11
|
-
|
|
12
|
-
1. [Quick Diagnostics](#quick-diagnostics)
|
|
13
|
-
2. [Common Issues](#common-issues)
|
|
14
|
-
3. [Debugging Techniques](#debugging-techniques)
|
|
15
|
-
4. [Error Patterns](#error-patterns)
|
|
16
|
-
5. [Performance Problems](#performance-problems)
|
|
17
|
-
6. [Testing Issues](#testing-issues)
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Quick Diagnostics
|
|
22
|
-
|
|
23
|
-
### Checklist Before Debugging
|
|
24
|
-
|
|
25
|
-
✅ **Check these first:**
|
|
26
|
-
|
|
27
|
-
1. **Resolver registered?**
|
|
28
|
-
```typescript
|
|
29
|
-
console.log(Object.keys(resolvers));
|
|
30
|
-
// Should include your resolver path
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
2. **Path correct?**
|
|
34
|
-
```typescript
|
|
35
|
-
// If you want: { input: { ref: 'value' } }
|
|
36
|
-
// Use path: 'input.ref'
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
3. **Data structure matches?**
|
|
40
|
-
```typescript
|
|
41
|
-
console.log(JSON.stringify(data, null, 2));
|
|
42
|
-
// Verify paths exist
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
4. **Helpers imported?**
|
|
46
|
-
```typescript
|
|
47
|
-
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
48
|
-
const result = resolver(data, config, ResolverHelpers);
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
5. **Async resolved?**
|
|
52
|
-
```typescript
|
|
53
|
-
const result = await resolver(...); // Don't forget await!
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Common Issues
|
|
59
|
-
|
|
60
|
-
### Issue #1: Resolver Not Executing
|
|
61
|
-
|
|
62
|
-
**Symptom:** Field is missing in output, no errors.
|
|
63
|
-
|
|
64
|
-
**Possible Causes:**
|
|
65
|
-
|
|
66
|
-
#### Cause A: Path Mismatch
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
// ❌ Wrong path
|
|
70
|
-
builder.from('ref', 'order.orderNo');
|
|
71
|
-
// Creates: { ref: '...' }
|
|
72
|
-
|
|
73
|
-
// ✅ Correct path for nested structure
|
|
74
|
-
builder.from('input.ref', 'order.orderNo');
|
|
75
|
-
// Creates: { input: { ref: '...' } }
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Solution:** Verify target path matches desired output structure.
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
#### Cause B: Resolver Not in Registry
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
// ❌ Forgot to add to builder
|
|
86
|
-
const resolvers = builder
|
|
87
|
-
.from('input.ref', 'order.orderNo')
|
|
88
|
-
.build();
|
|
89
|
-
|
|
90
|
-
// Missing: .from('input.totalPrice', ...)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**Solution:** Check all resolvers are added before `.build()`.
|
|
94
|
-
|
|
95
|
-
```typescript
|
|
96
|
-
console.log(Object.keys(resolvers));
|
|
97
|
-
// Should print: ['input.ref', 'input.totalPrice', ...]
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
#### Cause C: Execution Order
|
|
103
|
-
|
|
104
|
-
**Problem:** Resolver executes but value not set in output.
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
// ❌ Not awaiting async resolver
|
|
108
|
-
const result = resolver(data, config, helpers); // Returns Promise
|
|
109
|
-
console.log(result); // Promise { <pending> }
|
|
110
|
-
|
|
111
|
-
// ✅ Await async resolver
|
|
112
|
-
const result = await resolver(data, config, helpers);
|
|
113
|
-
console.log(result); // Actual value
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**Solution:** Always await async resolvers.
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
### Issue #2: `helpers.xxx is not a function`
|
|
121
|
-
|
|
122
|
-
**Symptom:** `TypeError: helpers.parseFloatSafe is not a function`
|
|
123
|
-
|
|
124
|
-
**Cause:** Helpers not passed correctly.
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
// ❌ Wrong - empty object
|
|
128
|
-
const result = resolver(data, config, {});
|
|
129
|
-
|
|
130
|
-
// ❌ Wrong - undefined
|
|
131
|
-
const result = resolver(data, config);
|
|
132
|
-
|
|
133
|
-
// ✅ Correct - pass ResolverHelpers
|
|
134
|
-
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
135
|
-
const result = resolver(data, config, ResolverHelpers);
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**Solution:** Always pass `ResolverHelpers` as the fourth parameter.
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
### Issue #3: Array Not Mapping Correctly
|
|
143
|
-
|
|
144
|
-
**Symptom:** Getting single object instead of array, or empty array.
|
|
145
|
-
|
|
146
|
-
#### Cause A: XML Single vs Multiple Elements
|
|
147
|
-
|
|
148
|
-
XML parsers return:
|
|
149
|
-
- **Single element** → Object
|
|
150
|
-
- **Multiple elements** → Array
|
|
151
|
-
|
|
152
|
-
```typescript
|
|
153
|
-
// ❌ Breaks with single item
|
|
154
|
-
const items = data.order.items.item;
|
|
155
|
-
items.map(item => { ... }); // ERROR if items is object
|
|
156
|
-
|
|
157
|
-
// ✅ Always works
|
|
158
|
-
const items = helpers.ensureArray(data.order.items.item);
|
|
159
|
-
items.map(item => { ... });
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
**Solution:** Always use `helpers.ensureArray()` when processing XML arrays.
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
#### Cause B: Wrong Source Path
|
|
167
|
-
|
|
168
|
-
```typescript
|
|
169
|
-
// ❌ Wrong path
|
|
170
|
-
builder.mapArray('input.items', 'order.items', ...)
|
|
171
|
-
// But actual path is: 'orders.order.product-lineitems.product-lineitem'
|
|
172
|
-
|
|
173
|
-
// ✅ Correct path
|
|
174
|
-
builder.mapArray(
|
|
175
|
-
'input.items',
|
|
176
|
-
'orders.order.product-lineitems.product-lineitem',
|
|
177
|
-
(item) => ({ ... })
|
|
178
|
-
);
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Solution:** Verify source path with:
|
|
182
|
-
```typescript
|
|
183
|
-
console.log(helpers.get(data, 'orders.order.product-lineitems.product-lineitem'));
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
### Issue #4: Validation Failing
|
|
189
|
-
|
|
190
|
-
**Symptom:** `Error: Validation failed for input.email`
|
|
191
|
-
|
|
192
|
-
**Debug Steps:**
|
|
193
|
-
|
|
194
|
-
1. **Check the value:**
|
|
195
|
-
```typescript
|
|
196
|
-
builder.validate(
|
|
197
|
-
'input.email',
|
|
198
|
-
(data, config, helpers) => {
|
|
199
|
-
const email = helpers.get(data, 'customer.email');
|
|
200
|
-
console.log('Email value:', email); // Debug
|
|
201
|
-
return email;
|
|
202
|
-
},
|
|
203
|
-
(value) => helpers.isValidEmail(value)
|
|
204
|
-
);
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
2. **Make validation more lenient:**
|
|
208
|
-
```typescript
|
|
209
|
-
// Add default value
|
|
210
|
-
builder.validate(
|
|
211
|
-
'input.email',
|
|
212
|
-
(data, config, helpers) => {
|
|
213
|
-
return helpers.get(data, 'customer.email', 'no-reply@example.com');
|
|
214
|
-
},
|
|
215
|
-
(value) => helpers.isValidEmail(value) || 'Email format invalid'
|
|
216
|
-
);
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
3. **Check validation logic:**
|
|
220
|
-
```typescript
|
|
221
|
-
// Test validator separately
|
|
222
|
-
const testEmail = 'test@example.com';
|
|
223
|
-
console.log(helpers.isValidEmail(testEmail)); // Should be true
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
### Issue #5: Config Not Available
|
|
229
|
-
|
|
230
|
-
**Symptom:** `TypeError: Cannot read property 'defaultRetailerId' of undefined`
|
|
231
|
-
|
|
232
|
-
**Cause:** Config not passed when executing resolvers.
|
|
233
|
-
|
|
234
|
-
```typescript
|
|
235
|
-
// ❌ Wrong - no config
|
|
236
|
-
const result = resolvers\['input.ref'](data);
|
|
237
|
-
|
|
238
|
-
// ✅ Correct - pass config
|
|
239
|
-
const config = {
|
|
240
|
-
defaultRetailerId: '1',
|
|
241
|
-
defaultCurrency: 'USD'
|
|
242
|
-
};
|
|
243
|
-
const result = resolvers\['input.ref'](data, config, helpers);
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**Solution:** Always pass config as second parameter.
|
|
247
|
-
|
|
248
|
-
---
|
|
249
|
-
|
|
250
|
-
### Issue #6: Async Resolver Not Awaiting
|
|
251
|
-
|
|
252
|
-
**Symptom:** Promise returned instead of value.
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
// ❌ Wrong - not awaiting
|
|
256
|
-
const customerId = resolvers\['input.customer.id'](data, config, helpers);
|
|
257
|
-
console.log(customerId); // Promise { <pending> }
|
|
258
|
-
|
|
259
|
-
// ✅ Correct - await async resolver
|
|
260
|
-
const customerId = await resolvers\['input.customer.id'](data, config, helpers);
|
|
261
|
-
console.log(customerId); // Actual customer ID
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
**Solution:**
|
|
265
|
-
- Mark your function `async`
|
|
266
|
-
- Always `await` async resolvers
|
|
267
|
-
- Check if resolver returns `Promise` in definition
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
### Issue #7: Path Not Resolving (XML Attributes)
|
|
272
|
-
|
|
273
|
-
**Symptom:** XML attribute returns `undefined`.
|
|
274
|
-
|
|
275
|
-
**Cause:** Incorrect attribute syntax.
|
|
276
|
-
|
|
277
|
-
```typescript
|
|
278
|
-
// ❌ Wrong - dot before @
|
|
279
|
-
const orderNo = helpers.get(data, 'orders.order.@order-no');
|
|
280
|
-
|
|
281
|
-
// ✅ Correct - NO dot before @
|
|
282
|
-
const orderNo = helpers.get(data, 'orders.order@order-no');
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
**XML Attribute Syntax:**
|
|
286
|
-
```xml
|
|
287
|
-
<order order-no="123">
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
```typescript
|
|
291
|
-
// Access attribute
|
|
292
|
-
helpers.get(data, 'orders.order@order-no') // => "123"
|
|
293
|
-
|
|
294
|
-
// Access nested attribute
|
|
295
|
-
helpers.get(data, 'orders.order.customer@id') // => customer id
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
### Issue #8: Nested Object Not Created
|
|
301
|
-
|
|
302
|
-
**Symptom:** `TypeError: Cannot set property 'ref' of undefined`
|
|
303
|
-
|
|
304
|
-
**Cause:** Parent object not initialized.
|
|
305
|
-
|
|
306
|
-
```typescript
|
|
307
|
-
// ❌ Wrong - obj.input doesn't exist
|
|
308
|
-
const obj = {};
|
|
309
|
-
obj.input.ref = 'ORD-001'; // ERROR!
|
|
310
|
-
|
|
311
|
-
// ✅ Correct - initialize parent
|
|
312
|
-
const obj = {};
|
|
313
|
-
obj.input = {};
|
|
314
|
-
obj.input.ref = 'ORD-001';
|
|
315
|
-
|
|
316
|
-
// ✅ Better - use helper
|
|
317
|
-
helpers.set(obj, 'input.ref', 'ORD-001');
|
|
318
|
-
// Creates: { input: { ref: 'ORD-001' } }
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
**Solution:** Use `helpers.set()` for nested paths or ensure parent objects exist.
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
|
|
325
|
-
### Issue #9: Data Structure Mismatch
|
|
326
|
-
|
|
327
|
-
**Symptom:** `undefined` when accessing expected field.
|
|
328
|
-
|
|
329
|
-
**Debug Steps:**
|
|
330
|
-
|
|
331
|
-
1. **Inspect actual structure:**
|
|
332
|
-
```typescript
|
|
333
|
-
console.log(JSON.stringify(data, null, 2));
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
2. **Check for common XML quirks:**
|
|
337
|
-
- Attributes use `@` prefix: `order@order-no`
|
|
338
|
-
- Text content uses `#text`: `customAttribute['#text']`
|
|
339
|
-
- Single vs array: Use `ensureArray()`
|
|
340
|
-
- Hyphenated keys: `'order-date'` not `'orderDate'`
|
|
341
|
-
|
|
342
|
-
3. **Test path incrementally:**
|
|
343
|
-
```typescript
|
|
344
|
-
console.log(helpers.get(data, 'orders')); // Does this exist?
|
|
345
|
-
console.log(helpers.get(data, 'orders.order')); // How about this?
|
|
346
|
-
console.log(helpers.get(data, 'orders.order@order-no')); // Final path
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
---
|
|
350
|
-
|
|
351
|
-
### Issue #10: "Cannot Read Property of Null"
|
|
352
|
-
|
|
353
|
-
**Symptom:** `TypeError: Cannot read property 'X' of null`
|
|
354
|
-
|
|
355
|
-
**Cause:** Not using safe accessors.
|
|
356
|
-
|
|
357
|
-
```typescript
|
|
358
|
-
// ❌ Unsafe - crashes if null
|
|
359
|
-
const email = data.order.customer.email;
|
|
360
|
-
|
|
361
|
-
// ✅ Safe - returns undefined
|
|
362
|
-
const email = helpers.get(data, 'order.customer.email');
|
|
363
|
-
|
|
364
|
-
// ✅ Safe with default
|
|
365
|
-
const email = helpers.get(data, 'order.customer.email', 'unknown@example.com');
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
**Solution:** Always use `helpers.get()` for nested access.
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## Debugging Techniques
|
|
373
|
-
|
|
374
|
-
### Technique #1: Enable Verbose Logging
|
|
375
|
-
|
|
376
|
-
```typescript
|
|
377
|
-
builder.field('input.totalPrice', (data, config, helpers) => {
|
|
378
|
-
helpers.log?.debug('Calculating total price', {
|
|
379
|
-
data: helpers.get(data, 'orders.order.totals'),
|
|
380
|
-
config
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
const grossPrice = helpers.get(data, 'orders.order.totals.order-total.gross-price');
|
|
384
|
-
helpers.log?.debug('Extracted gross price', { grossPrice });
|
|
385
|
-
|
|
386
|
-
const result = helpers.parseFloatSafe(grossPrice, 0);
|
|
387
|
-
helpers.log?.debug('Parsed result', { result });
|
|
388
|
-
|
|
389
|
-
return result;
|
|
390
|
-
});
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
**Run with logging:**
|
|
394
|
-
```typescript
|
|
395
|
-
import { log } from '@versori/run';
|
|
396
|
-
|
|
397
|
-
const logger = {
|
|
398
|
-
debug: (msg, meta) => log.debug(msg, meta),
|
|
399
|
-
info: (msg, meta) => log.info(msg, meta),
|
|
400
|
-
warn: (msg, meta) => log.warn(msg, meta),
|
|
401
|
-
error: (msg, meta) => log.error(msg, meta)
|
|
402
|
-
};
|
|
403
|
-
|
|
404
|
-
// Pass logger in helpers
|
|
405
|
-
const helpers = { ...ResolverHelpers, log: logger };
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
---
|
|
409
|
-
|
|
410
|
-
### Technique #2: Test Resolvers in Isolation
|
|
411
|
-
|
|
412
|
-
```typescript
|
|
413
|
-
import { canonicalOrder } from '../../../03-PATTERN-GUIDES/examples/test-data/canonical-order.json';
|
|
414
|
-
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
415
|
-
import { orderResolvers } from './order-resolvers';
|
|
416
|
-
|
|
417
|
-
// Test single resolver
|
|
418
|
-
const config = { defaultRetailerId: '1' };
|
|
419
|
-
const result = orderResolvers\['input.ref'](canonicalOrder, config, ResolverHelpers);
|
|
420
|
-
|
|
421
|
-
console.log('Result:', result);
|
|
422
|
-
console.log('Expected:', 'ORD-2025-001');
|
|
423
|
-
console.log('Match:', result === 'ORD-2025-001');
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
### Technique #3: Add Debug Breakpoints
|
|
429
|
-
|
|
430
|
-
```typescript
|
|
431
|
-
builder.field('input.items', (data, config, helpers) => {
|
|
432
|
-
const items = helpers.get(data, 'orders.order.product-lineitems.product-lineitem');
|
|
433
|
-
|
|
434
|
-
debugger; // Pause here in debugger
|
|
435
|
-
|
|
436
|
-
const itemsArray = helpers.ensureArray(items);
|
|
437
|
-
|
|
438
|
-
return itemsArray.map((item, index) => {
|
|
439
|
-
debugger; // Pause for each item
|
|
440
|
-
|
|
441
|
-
return {
|
|
442
|
-
ref: item['@lineitem-id'],
|
|
443
|
-
quantity: helpers.parseIntSafe(item.quantity, 1)
|
|
444
|
-
};
|
|
445
|
-
});
|
|
446
|
-
});
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
**Run with:**
|
|
450
|
-
```bash
|
|
451
|
-
node --inspect-brk your-script.js
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
---
|
|
455
|
-
|
|
456
|
-
### Technique #4: Compare Expected vs Actual
|
|
457
|
-
|
|
458
|
-
```typescript
|
|
459
|
-
const expected = {
|
|
460
|
-
ref: 'ORD-2025-001',
|
|
461
|
-
totalPrice: 151.17,
|
|
462
|
-
customer: { email: 'john.doe@example.com' }
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
const actual = {
|
|
466
|
-
ref: resolvers\['input.ref'](data, config, helpers),
|
|
467
|
-
totalPrice: resolvers\['input.totalPrice'](data, config, helpers),
|
|
468
|
-
customer: {
|
|
469
|
-
email: resolvers\['input.customer.email'](data, config, helpers)
|
|
470
|
-
}
|
|
471
|
-
};
|
|
472
|
-
|
|
473
|
-
console.log('Expected:', JSON.stringify(expected, null, 2));
|
|
474
|
-
console.log('Actual:', JSON.stringify(actual, null, 2));
|
|
475
|
-
|
|
476
|
-
// Find differences
|
|
477
|
-
Object.keys(expected).forEach(key => {
|
|
478
|
-
if (JSON.stringify(expected[key]) !== JSON.stringify(actual[key])) {
|
|
479
|
-
console.log(`❌ Mismatch in ${key}:`, {
|
|
480
|
-
expected: expected[key],
|
|
481
|
-
actual: actual[key]
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
---
|
|
488
|
-
|
|
489
|
-
### Technique #5: Use TypeScript for Type Safety
|
|
490
|
-
|
|
491
|
-
```typescript
|
|
492
|
-
import type { ResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
493
|
-
|
|
494
|
-
interface OrderData {
|
|
495
|
-
orders: {
|
|
496
|
-
order: {
|
|
497
|
-
'@order-no': string;
|
|
498
|
-
'totals': {
|
|
499
|
-
'order-total': {
|
|
500
|
-
'gross-price': string;
|
|
501
|
-
};
|
|
502
|
-
};
|
|
503
|
-
};
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
const orderRefResolver: ResolverFunction = (data: OrderData, config, helpers) => {
|
|
508
|
-
// TypeScript will catch typos
|
|
509
|
-
return helpers.get(data, 'orders.order@order-no');
|
|
510
|
-
};
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
---
|
|
514
|
-
|
|
515
|
-
## Error Patterns
|
|
516
|
-
|
|
517
|
-
### Pattern #1: "Cannot Find Module"
|
|
518
|
-
|
|
519
|
-
```
|
|
520
|
-
Error: Cannot find module '@fluentcommerce/fc-connect-sdk'
|
|
521
|
-
```
|
|
522
|
-
|
|
523
|
-
**Solutions:**
|
|
524
|
-
|
|
525
|
-
1. **Install SDK:**
|
|
526
|
-
```bash
|
|
527
|
-
npm install @fluentcommerce/fc-connect-sdk
|
|
528
|
-
```
|
|
529
|
-
|
|
530
|
-
2. **Link local SDK (development):**
|
|
531
|
-
```bash
|
|
532
|
-
cd fc-connect-sdk && npm link
|
|
533
|
-
cd ../your-project && npm link @fluentcommerce/fc-connect-sdk
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
3. **Check package.json:**
|
|
537
|
-
```json
|
|
538
|
-
{
|
|
539
|
-
"dependencies": {
|
|
540
|
-
"@fluentcommerce/fc-connect-sdk": "^1.5.0"
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
---
|
|
546
|
-
|
|
547
|
-
### Pattern #2: "Unexpected Token" in Resolver
|
|
548
|
-
|
|
549
|
-
```
|
|
550
|
-
SyntaxError: Unexpected token '.'
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
**Cause:** Trying to use optional chaining in older Node versions.
|
|
554
|
-
|
|
555
|
-
```typescript
|
|
556
|
-
// ❌ Optional chaining (requires Node 14+)
|
|
557
|
-
const email = data.order?.customer?.email;
|
|
558
|
-
|
|
559
|
-
// ✅ Use helpers.get() (works everywhere)
|
|
560
|
-
const email = helpers.get(data, 'order.customer.email');
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
---
|
|
564
|
-
|
|
565
|
-
### Pattern #3: "Maximum Call Stack Size Exceeded"
|
|
566
|
-
|
|
567
|
-
```
|
|
568
|
-
RangeError: Maximum call stack size exceeded
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
**Cause:** Circular reference or infinite recursion.
|
|
572
|
-
|
|
573
|
-
```typescript
|
|
574
|
-
// ❌ Circular reference
|
|
575
|
-
const obj = { a: {} };
|
|
576
|
-
obj.a = obj; // Circular!
|
|
577
|
-
helpers.deepClone(obj); // ERROR
|
|
578
|
-
|
|
579
|
-
// ❌ Infinite recursion
|
|
580
|
-
builder.field('input.ref', (data, config, helpers) => {
|
|
581
|
-
return resolvers\['input.ref'](data, config, helpers); // Calls itself!
|
|
582
|
-
});
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
**Solution:** Check for circular references and recursive calls.
|
|
586
|
-
|
|
587
|
-
---
|
|
588
|
-
|
|
589
|
-
### Pattern #4: "Headers Already Sent"
|
|
590
|
-
|
|
591
|
-
```
|
|
592
|
-
Error: Cannot set headers after they are sent to the client
|
|
593
|
-
```
|
|
594
|
-
|
|
595
|
-
**Cause:** Multiple response attempts in Versori workflow.
|
|
596
|
-
|
|
597
|
-
```typescript
|
|
598
|
-
// ❌ Wrong - multiple returns
|
|
599
|
-
export default async function process(activation) {
|
|
600
|
-
try {
|
|
601
|
-
const result = await processOrder(data);
|
|
602
|
-
return http.respond({ status: 200, body: result });
|
|
603
|
-
} catch (error) {
|
|
604
|
-
return http.respond({ status: 500, body: { error } }); // Second return!
|
|
605
|
-
}
|
|
606
|
-
return http.respond({ status: 200, body: 'done' }); // Third return!
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
// ✅ Correct - single return path
|
|
610
|
-
export default async function process(activation) {
|
|
611
|
-
try {
|
|
612
|
-
const result = await processOrder(data);
|
|
613
|
-
return http.respond({ status: 200, body: result });
|
|
614
|
-
} catch (error) {
|
|
615
|
-
return http.respond({ status: 500, body: { error } });
|
|
616
|
-
}
|
|
617
|
-
// No additional return
|
|
618
|
-
}
|
|
619
|
-
```
|
|
620
|
-
|
|
621
|
-
---
|
|
622
|
-
|
|
623
|
-
## Performance Problems
|
|
624
|
-
|
|
625
|
-
### Problem #1: Slow Resolver Execution
|
|
626
|
-
|
|
627
|
-
**Symptoms:**
|
|
628
|
-
- Timeout errors
|
|
629
|
-
- High latency
|
|
630
|
-
- Memory issues
|
|
631
|
-
|
|
632
|
-
**Common Causes:**
|
|
633
|
-
|
|
634
|
-
#### Cause A: Not Using Memoization
|
|
635
|
-
|
|
636
|
-
```typescript
|
|
637
|
-
// ❌ Slow - recalculates every time
|
|
638
|
-
builder.field('input.discount', (data, config, helpers) => {
|
|
639
|
-
const items = helpers.get(data, 'order.items', []);
|
|
640
|
-
return calculateComplexDiscount(items, config.rules); // Expensive!
|
|
641
|
-
});
|
|
642
|
-
|
|
643
|
-
// ✅ Fast - caches result
|
|
644
|
-
const memoizedCalculate = helpers.memoize(calculateComplexDiscount);
|
|
645
|
-
|
|
646
|
-
builder.field('input.discount', (data, config, helpers) => {
|
|
647
|
-
const items = helpers.get(data, 'order.items', []);
|
|
648
|
-
return memoizedCalculate(items, config.rules); // Cached!
|
|
649
|
-
});
|
|
650
|
-
```
|
|
651
|
-
|
|
652
|
-
---
|
|
653
|
-
|
|
654
|
-
#### Cause B: Sequential Async Operations
|
|
655
|
-
|
|
656
|
-
```typescript
|
|
657
|
-
// ❌ Slow - sequential (waits for each)
|
|
658
|
-
const customer = await lookupCustomer(id);
|
|
659
|
-
const inventory = await checkInventory(sku);
|
|
660
|
-
const pricing = await getPricing(sku);
|
|
661
|
-
|
|
662
|
-
// ✅ Fast - parallel
|
|
663
|
-
const [customer, inventory, pricing] = await Promise.all([
|
|
664
|
-
lookupCustomer(id),
|
|
665
|
-
checkInventory(sku),
|
|
666
|
-
getPricing(sku)
|
|
667
|
-
]);
|
|
668
|
-
```
|
|
669
|
-
|
|
670
|
-
---
|
|
671
|
-
|
|
672
|
-
#### Cause C: Large Data Processing
|
|
673
|
-
|
|
674
|
-
```typescript
|
|
675
|
-
// ❌ Slow - processes all at once
|
|
676
|
-
const results = await Promise.all(
|
|
677
|
-
items.map(item => enrichItem(item)) // 1000 items!
|
|
678
|
-
);
|
|
679
|
-
|
|
680
|
-
// ✅ Fast - batch processing
|
|
681
|
-
const results = await helpers.batchProcess(
|
|
682
|
-
items,
|
|
683
|
-
async (item) => await enrichItem(item),
|
|
684
|
-
10 // Process 10 at a time
|
|
685
|
-
);
|
|
686
|
-
```
|
|
687
|
-
|
|
688
|
-
---
|
|
689
|
-
|
|
690
|
-
### Problem #2: Memory Leaks
|
|
691
|
-
|
|
692
|
-
**Cause:** Not cleaning up resources.
|
|
693
|
-
|
|
694
|
-
```typescript
|
|
695
|
-
// ❌ Memory leak - cache grows forever
|
|
696
|
-
const cache = new Map();
|
|
697
|
-
|
|
698
|
-
builder.field('input.enrichedData', async (data, config, helpers) => {
|
|
699
|
-
const key = data.id;
|
|
700
|
-
if (cache.has(key)) {
|
|
701
|
-
return cache.get(key);
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
const result = await fetchData(key);
|
|
705
|
-
cache.set(key, result); // Never removed!
|
|
706
|
-
return result;
|
|
707
|
-
});
|
|
708
|
-
|
|
709
|
-
// ✅ Better - use LRU cache with max size
|
|
710
|
-
import LRU from 'lru-cache';
|
|
711
|
-
|
|
712
|
-
const cache = new LRU({ max: 100 }); // Max 100 entries
|
|
713
|
-
|
|
714
|
-
builder.field('input.enrichedData', async (data, config, helpers) => {
|
|
715
|
-
const key = data.id;
|
|
716
|
-
if (cache.has(key)) {
|
|
717
|
-
return cache.get(key);
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
const result = await fetchData(key);
|
|
721
|
-
cache.set(key, result); // Automatically evicts old entries
|
|
722
|
-
return result;
|
|
723
|
-
});
|
|
724
|
-
```
|
|
725
|
-
|
|
726
|
-
---
|
|
727
|
-
|
|
728
|
-
## Testing Issues
|
|
729
|
-
|
|
730
|
-
### Issue: Tests Failing with "undefined"
|
|
731
|
-
|
|
732
|
-
**Cause:** Test data doesn't match expected structure.
|
|
733
|
-
|
|
734
|
-
```typescript
|
|
735
|
-
// ❌ Wrong - minimal test data
|
|
736
|
-
const testData = {
|
|
737
|
-
order: {
|
|
738
|
-
orderNo: '123'
|
|
739
|
-
}
|
|
740
|
-
};
|
|
741
|
-
|
|
742
|
-
// ✅ Correct - use canonical data
|
|
743
|
-
import { canonicalOrder } from '../../../03-PATTERN-GUIDES/examples/test-data/canonical-order.json';
|
|
744
|
-
|
|
745
|
-
it('should extract order reference', () => {
|
|
746
|
-
const result = resolvers\['input.ref'](canonicalOrder, config, helpers);
|
|
747
|
-
expect(result).toBe('ORD-2025-001');
|
|
748
|
-
});
|
|
749
|
-
```
|
|
750
|
-
|
|
751
|
-
**Solution:** Use canonical test data for consistency.
|
|
752
|
-
|
|
753
|
-
---
|
|
754
|
-
|
|
755
|
-
### Issue: Mock Helpers Not Working
|
|
756
|
-
|
|
757
|
-
**Cause:** Mock doesn't implement all required methods.
|
|
758
|
-
|
|
759
|
-
```typescript
|
|
760
|
-
// ❌ Incomplete mock
|
|
761
|
-
const mockHelpers = {
|
|
762
|
-
get: jest.fn()
|
|
763
|
-
};
|
|
764
|
-
|
|
765
|
-
// ✅ Complete mock (or use real ResolverHelpers)
|
|
766
|
-
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
767
|
-
|
|
768
|
-
const mockHelpers = {
|
|
769
|
-
...ResolverHelpers,
|
|
770
|
-
log: {
|
|
771
|
-
debug: jest.fn(),
|
|
772
|
-
info: jest.fn(),
|
|
773
|
-
warn: jest.fn(),
|
|
774
|
-
error: jest.fn()
|
|
775
|
-
}
|
|
776
|
-
};
|
|
777
|
-
```
|
|
778
|
-
|
|
779
|
-
---
|
|
780
|
-
|
|
781
|
-
## Getting Help
|
|
782
|
-
|
|
783
|
-
### Steps Before Asking for Help
|
|
784
|
-
|
|
785
|
-
1. ✅ Check this troubleshooting guide
|
|
786
|
-
2. ✅ Read the [Main Guide](./mapping-resolvers-resolver-guide.md)
|
|
787
|
-
3. ✅ Review [API Reference](./mapping-resolvers-resolver-api-reference.md)
|
|
788
|
-
4. ✅ Test with canonical data
|
|
789
|
-
5. ✅ Enable debug logging
|
|
790
|
-
6. ✅ Isolate the failing resolver
|
|
791
|
-
|
|
792
|
-
### Provide This Information
|
|
793
|
-
|
|
794
|
-
When asking for help, include:
|
|
795
|
-
|
|
796
|
-
```markdown
|
|
797
|
-
## Issue Description
|
|
798
|
-
[Brief description of the problem]
|
|
799
|
-
|
|
800
|
-
## Expected Behavior
|
|
801
|
-
[What should happen]
|
|
802
|
-
|
|
803
|
-
## Actual Behavior
|
|
804
|
-
[What actually happens]
|
|
805
|
-
|
|
806
|
-
## Minimal Reproducible Example
|
|
807
|
-
\`\`\`typescript
|
|
808
|
-
// Resolver code
|
|
809
|
-
const resolver = (data, config, helpers) => {
|
|
810
|
-
// ...
|
|
811
|
-
};
|
|
812
|
-
|
|
813
|
-
// Test data
|
|
814
|
-
const testData = { ... };
|
|
815
|
-
|
|
816
|
-
// Config
|
|
817
|
-
const config = { ... };
|
|
818
|
-
|
|
819
|
-
// Error
|
|
820
|
-
// [Error message and stack trace]
|
|
821
|
-
\`\`\`
|
|
822
|
-
|
|
823
|
-
## Environment
|
|
824
|
-
- SDK Version: 1.5.0
|
|
825
|
-
- Node Version: 18.0.0
|
|
826
|
-
- Platform: Versori / Standalone
|
|
827
|
-
```
|
|
828
|
-
|
|
829
|
-
### Support Channels
|
|
830
|
-
|
|
831
|
-
- **GitHub Issues:** https://github.com/fluentcommerce/fc-connect-sdk/issues
|
|
832
|
-
- **Documentation:** https://docs.fluentcommerce.com
|
|
833
|
-
- **Email:** support@fluentcommerce.com
|
|
834
|
-
|
|
835
|
-
---
|
|
836
|
-
|
|
837
|
-
## See Also
|
|
838
|
-
|
|
839
|
-
- [Main Resolver Guide](./mapping-resolvers-resolver-guide.md)
|
|
840
|
-
- [API Reference](./mapping-resolvers-resolver-api-reference.md)
|
|
841
|
-
- [Helper Functions Reference](./mapping-resolvers-resolver-helpers-reference.md)
|
|
842
|
-
- [Parameters Reference](./mapping-resolvers-resolver-parameters-reference.md)
|
|
843
|
-
- [Cookbook](./mapping-resolvers-resolver-cookbook.md)
|
|
844
|
-
|
|
845
|
-
---
|
|
846
|
-
|
|
847
|
-
**Document Version:** 2.0.0
|
|
848
|
-
**SDK Version:** 1.5.0+
|
|
849
|
-
**Last Updated:** 2025-01-14
|
|
850
|
-
|
|
851
|
-
---
|
|
852
|
-
|
|
853
|
-
**License:** MIT
|
|
854
|
-
**Copyright:** © 2025 Fluent Commerce
|
|
1
|
+
# Resolver Troubleshooting Guide
|
|
2
|
+
|
|
3
|
+
**Common issues, solutions, and debugging tips**
|
|
4
|
+
|
|
5
|
+
Version: 2.0.0
|
|
6
|
+
Last Updated: 2025-01-14
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Table of Contents
|
|
11
|
+
|
|
12
|
+
1. [Quick Diagnostics](#quick-diagnostics)
|
|
13
|
+
2. [Common Issues](#common-issues)
|
|
14
|
+
3. [Debugging Techniques](#debugging-techniques)
|
|
15
|
+
4. [Error Patterns](#error-patterns)
|
|
16
|
+
5. [Performance Problems](#performance-problems)
|
|
17
|
+
6. [Testing Issues](#testing-issues)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Quick Diagnostics
|
|
22
|
+
|
|
23
|
+
### Checklist Before Debugging
|
|
24
|
+
|
|
25
|
+
✅ **Check these first:**
|
|
26
|
+
|
|
27
|
+
1. **Resolver registered?**
|
|
28
|
+
```typescript
|
|
29
|
+
console.log(Object.keys(resolvers));
|
|
30
|
+
// Should include your resolver path
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. **Path correct?**
|
|
34
|
+
```typescript
|
|
35
|
+
// If you want: { input: { ref: 'value' } }
|
|
36
|
+
// Use path: 'input.ref'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
3. **Data structure matches?**
|
|
40
|
+
```typescript
|
|
41
|
+
console.log(JSON.stringify(data, null, 2));
|
|
42
|
+
// Verify paths exist
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
4. **Helpers imported?**
|
|
46
|
+
```typescript
|
|
47
|
+
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
48
|
+
const result = resolver(data, config, ResolverHelpers);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
5. **Async resolved?**
|
|
52
|
+
```typescript
|
|
53
|
+
const result = await resolver(...); // Don't forget await!
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Common Issues
|
|
59
|
+
|
|
60
|
+
### Issue #1: Resolver Not Executing
|
|
61
|
+
|
|
62
|
+
**Symptom:** Field is missing in output, no errors.
|
|
63
|
+
|
|
64
|
+
**Possible Causes:**
|
|
65
|
+
|
|
66
|
+
#### Cause A: Path Mismatch
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// ❌ Wrong path
|
|
70
|
+
builder.from('ref', 'order.orderNo');
|
|
71
|
+
// Creates: { ref: '...' }
|
|
72
|
+
|
|
73
|
+
// ✅ Correct path for nested structure
|
|
74
|
+
builder.from('input.ref', 'order.orderNo');
|
|
75
|
+
// Creates: { input: { ref: '...' } }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Solution:** Verify target path matches desired output structure.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
#### Cause B: Resolver Not in Registry
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// ❌ Forgot to add to builder
|
|
86
|
+
const resolvers = builder
|
|
87
|
+
.from('input.ref', 'order.orderNo')
|
|
88
|
+
.build();
|
|
89
|
+
|
|
90
|
+
// Missing: .from('input.totalPrice', ...)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Solution:** Check all resolvers are added before `.build()`.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
console.log(Object.keys(resolvers));
|
|
97
|
+
// Should print: ['input.ref', 'input.totalPrice', ...]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
#### Cause C: Execution Order
|
|
103
|
+
|
|
104
|
+
**Problem:** Resolver executes but value not set in output.
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
// ❌ Not awaiting async resolver
|
|
108
|
+
const result = resolver(data, config, helpers); // Returns Promise
|
|
109
|
+
console.log(result); // Promise { <pending> }
|
|
110
|
+
|
|
111
|
+
// ✅ Await async resolver
|
|
112
|
+
const result = await resolver(data, config, helpers);
|
|
113
|
+
console.log(result); // Actual value
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Solution:** Always await async resolvers.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### Issue #2: `helpers.xxx is not a function`
|
|
121
|
+
|
|
122
|
+
**Symptom:** `TypeError: helpers.parseFloatSafe is not a function`
|
|
123
|
+
|
|
124
|
+
**Cause:** Helpers not passed correctly.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// ❌ Wrong - empty object
|
|
128
|
+
const result = resolver(data, config, {});
|
|
129
|
+
|
|
130
|
+
// ❌ Wrong - undefined
|
|
131
|
+
const result = resolver(data, config);
|
|
132
|
+
|
|
133
|
+
// ✅ Correct - pass ResolverHelpers
|
|
134
|
+
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
135
|
+
const result = resolver(data, config, ResolverHelpers);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Solution:** Always pass `ResolverHelpers` as the fourth parameter.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### Issue #3: Array Not Mapping Correctly
|
|
143
|
+
|
|
144
|
+
**Symptom:** Getting single object instead of array, or empty array.
|
|
145
|
+
|
|
146
|
+
#### Cause A: XML Single vs Multiple Elements
|
|
147
|
+
|
|
148
|
+
XML parsers return:
|
|
149
|
+
- **Single element** → Object
|
|
150
|
+
- **Multiple elements** → Array
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
// ❌ Breaks with single item
|
|
154
|
+
const items = data.order.items.item;
|
|
155
|
+
items.map(item => { ... }); // ERROR if items is object
|
|
156
|
+
|
|
157
|
+
// ✅ Always works
|
|
158
|
+
const items = helpers.ensureArray(data.order.items.item);
|
|
159
|
+
items.map(item => { ... });
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Solution:** Always use `helpers.ensureArray()` when processing XML arrays.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
#### Cause B: Wrong Source Path
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
// ❌ Wrong path
|
|
170
|
+
builder.mapArray('input.items', 'order.items', ...)
|
|
171
|
+
// But actual path is: 'orders.order.product-lineitems.product-lineitem'
|
|
172
|
+
|
|
173
|
+
// ✅ Correct path
|
|
174
|
+
builder.mapArray(
|
|
175
|
+
'input.items',
|
|
176
|
+
'orders.order.product-lineitems.product-lineitem',
|
|
177
|
+
(item) => ({ ... })
|
|
178
|
+
);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Solution:** Verify source path with:
|
|
182
|
+
```typescript
|
|
183
|
+
console.log(helpers.get(data, 'orders.order.product-lineitems.product-lineitem'));
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### Issue #4: Validation Failing
|
|
189
|
+
|
|
190
|
+
**Symptom:** `Error: Validation failed for input.email`
|
|
191
|
+
|
|
192
|
+
**Debug Steps:**
|
|
193
|
+
|
|
194
|
+
1. **Check the value:**
|
|
195
|
+
```typescript
|
|
196
|
+
builder.validate(
|
|
197
|
+
'input.email',
|
|
198
|
+
(data, config, helpers) => {
|
|
199
|
+
const email = helpers.get(data, 'customer.email');
|
|
200
|
+
console.log('Email value:', email); // Debug
|
|
201
|
+
return email;
|
|
202
|
+
},
|
|
203
|
+
(value) => helpers.isValidEmail(value)
|
|
204
|
+
);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
2. **Make validation more lenient:**
|
|
208
|
+
```typescript
|
|
209
|
+
// Add default value
|
|
210
|
+
builder.validate(
|
|
211
|
+
'input.email',
|
|
212
|
+
(data, config, helpers) => {
|
|
213
|
+
return helpers.get(data, 'customer.email', 'no-reply@example.com');
|
|
214
|
+
},
|
|
215
|
+
(value) => helpers.isValidEmail(value) || 'Email format invalid'
|
|
216
|
+
);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
3. **Check validation logic:**
|
|
220
|
+
```typescript
|
|
221
|
+
// Test validator separately
|
|
222
|
+
const testEmail = 'test@example.com';
|
|
223
|
+
console.log(helpers.isValidEmail(testEmail)); // Should be true
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### Issue #5: Config Not Available
|
|
229
|
+
|
|
230
|
+
**Symptom:** `TypeError: Cannot read property 'defaultRetailerId' of undefined`
|
|
231
|
+
|
|
232
|
+
**Cause:** Config not passed when executing resolvers.
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// ❌ Wrong - no config
|
|
236
|
+
const result = resolvers\['input.ref'](data);
|
|
237
|
+
|
|
238
|
+
// ✅ Correct - pass config
|
|
239
|
+
const config = {
|
|
240
|
+
defaultRetailerId: '1',
|
|
241
|
+
defaultCurrency: 'USD'
|
|
242
|
+
};
|
|
243
|
+
const result = resolvers\['input.ref'](data, config, helpers);
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Solution:** Always pass config as second parameter.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### Issue #6: Async Resolver Not Awaiting
|
|
251
|
+
|
|
252
|
+
**Symptom:** Promise returned instead of value.
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// ❌ Wrong - not awaiting
|
|
256
|
+
const customerId = resolvers\['input.customer.id'](data, config, helpers);
|
|
257
|
+
console.log(customerId); // Promise { <pending> }
|
|
258
|
+
|
|
259
|
+
// ✅ Correct - await async resolver
|
|
260
|
+
const customerId = await resolvers\['input.customer.id'](data, config, helpers);
|
|
261
|
+
console.log(customerId); // Actual customer ID
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Solution:**
|
|
265
|
+
- Mark your function `async`
|
|
266
|
+
- Always `await` async resolvers
|
|
267
|
+
- Check if resolver returns `Promise` in definition
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### Issue #7: Path Not Resolving (XML Attributes)
|
|
272
|
+
|
|
273
|
+
**Symptom:** XML attribute returns `undefined`.
|
|
274
|
+
|
|
275
|
+
**Cause:** Incorrect attribute syntax.
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// ❌ Wrong - dot before @
|
|
279
|
+
const orderNo = helpers.get(data, 'orders.order.@order-no');
|
|
280
|
+
|
|
281
|
+
// ✅ Correct - NO dot before @
|
|
282
|
+
const orderNo = helpers.get(data, 'orders.order@order-no');
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**XML Attribute Syntax:**
|
|
286
|
+
```xml
|
|
287
|
+
<order order-no="123">
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
// Access attribute
|
|
292
|
+
helpers.get(data, 'orders.order@order-no') // => "123"
|
|
293
|
+
|
|
294
|
+
// Access nested attribute
|
|
295
|
+
helpers.get(data, 'orders.order.customer@id') // => customer id
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
### Issue #8: Nested Object Not Created
|
|
301
|
+
|
|
302
|
+
**Symptom:** `TypeError: Cannot set property 'ref' of undefined`
|
|
303
|
+
|
|
304
|
+
**Cause:** Parent object not initialized.
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
// ❌ Wrong - obj.input doesn't exist
|
|
308
|
+
const obj = {};
|
|
309
|
+
obj.input.ref = 'ORD-001'; // ERROR!
|
|
310
|
+
|
|
311
|
+
// ✅ Correct - initialize parent
|
|
312
|
+
const obj = {};
|
|
313
|
+
obj.input = {};
|
|
314
|
+
obj.input.ref = 'ORD-001';
|
|
315
|
+
|
|
316
|
+
// ✅ Better - use helper
|
|
317
|
+
helpers.set(obj, 'input.ref', 'ORD-001');
|
|
318
|
+
// Creates: { input: { ref: 'ORD-001' } }
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**Solution:** Use `helpers.set()` for nested paths or ensure parent objects exist.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### Issue #9: Data Structure Mismatch
|
|
326
|
+
|
|
327
|
+
**Symptom:** `undefined` when accessing expected field.
|
|
328
|
+
|
|
329
|
+
**Debug Steps:**
|
|
330
|
+
|
|
331
|
+
1. **Inspect actual structure:**
|
|
332
|
+
```typescript
|
|
333
|
+
console.log(JSON.stringify(data, null, 2));
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
2. **Check for common XML quirks:**
|
|
337
|
+
- Attributes use `@` prefix: `order@order-no`
|
|
338
|
+
- Text content uses `#text`: `customAttribute['#text']`
|
|
339
|
+
- Single vs array: Use `ensureArray()`
|
|
340
|
+
- Hyphenated keys: `'order-date'` not `'orderDate'`
|
|
341
|
+
|
|
342
|
+
3. **Test path incrementally:**
|
|
343
|
+
```typescript
|
|
344
|
+
console.log(helpers.get(data, 'orders')); // Does this exist?
|
|
345
|
+
console.log(helpers.get(data, 'orders.order')); // How about this?
|
|
346
|
+
console.log(helpers.get(data, 'orders.order@order-no')); // Final path
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
### Issue #10: "Cannot Read Property of Null"
|
|
352
|
+
|
|
353
|
+
**Symptom:** `TypeError: Cannot read property 'X' of null`
|
|
354
|
+
|
|
355
|
+
**Cause:** Not using safe accessors.
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
// ❌ Unsafe - crashes if null
|
|
359
|
+
const email = data.order.customer.email;
|
|
360
|
+
|
|
361
|
+
// ✅ Safe - returns undefined
|
|
362
|
+
const email = helpers.get(data, 'order.customer.email');
|
|
363
|
+
|
|
364
|
+
// ✅ Safe with default
|
|
365
|
+
const email = helpers.get(data, 'order.customer.email', 'unknown@example.com');
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Solution:** Always use `helpers.get()` for nested access.
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## Debugging Techniques
|
|
373
|
+
|
|
374
|
+
### Technique #1: Enable Verbose Logging
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
builder.field('input.totalPrice', (data, config, helpers) => {
|
|
378
|
+
helpers.log?.debug('Calculating total price', {
|
|
379
|
+
data: helpers.get(data, 'orders.order.totals'),
|
|
380
|
+
config
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
const grossPrice = helpers.get(data, 'orders.order.totals.order-total.gross-price');
|
|
384
|
+
helpers.log?.debug('Extracted gross price', { grossPrice });
|
|
385
|
+
|
|
386
|
+
const result = helpers.parseFloatSafe(grossPrice, 0);
|
|
387
|
+
helpers.log?.debug('Parsed result', { result });
|
|
388
|
+
|
|
389
|
+
return result;
|
|
390
|
+
});
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Run with logging:**
|
|
394
|
+
```typescript
|
|
395
|
+
import { log } from '@versori/run';
|
|
396
|
+
|
|
397
|
+
const logger = {
|
|
398
|
+
debug: (msg, meta) => log.debug(msg, meta),
|
|
399
|
+
info: (msg, meta) => log.info(msg, meta),
|
|
400
|
+
warn: (msg, meta) => log.warn(msg, meta),
|
|
401
|
+
error: (msg, meta) => log.error(msg, meta)
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
// Pass logger in helpers
|
|
405
|
+
const helpers = { ...ResolverHelpers, log: logger };
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
### Technique #2: Test Resolvers in Isolation
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
import { canonicalOrder } from '../../../03-PATTERN-GUIDES/examples/test-data/canonical-order.json';
|
|
414
|
+
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
415
|
+
import { orderResolvers } from './order-resolvers';
|
|
416
|
+
|
|
417
|
+
// Test single resolver
|
|
418
|
+
const config = { defaultRetailerId: '1' };
|
|
419
|
+
const result = orderResolvers\['input.ref'](canonicalOrder, config, ResolverHelpers);
|
|
420
|
+
|
|
421
|
+
console.log('Result:', result);
|
|
422
|
+
console.log('Expected:', 'ORD-2025-001');
|
|
423
|
+
console.log('Match:', result === 'ORD-2025-001');
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
### Technique #3: Add Debug Breakpoints
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
builder.field('input.items', (data, config, helpers) => {
|
|
432
|
+
const items = helpers.get(data, 'orders.order.product-lineitems.product-lineitem');
|
|
433
|
+
|
|
434
|
+
debugger; // Pause here in debugger
|
|
435
|
+
|
|
436
|
+
const itemsArray = helpers.ensureArray(items);
|
|
437
|
+
|
|
438
|
+
return itemsArray.map((item, index) => {
|
|
439
|
+
debugger; // Pause for each item
|
|
440
|
+
|
|
441
|
+
return {
|
|
442
|
+
ref: item['@lineitem-id'],
|
|
443
|
+
quantity: helpers.parseIntSafe(item.quantity, 1)
|
|
444
|
+
};
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
**Run with:**
|
|
450
|
+
```bash
|
|
451
|
+
node --inspect-brk your-script.js
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### Technique #4: Compare Expected vs Actual
|
|
457
|
+
|
|
458
|
+
```typescript
|
|
459
|
+
const expected = {
|
|
460
|
+
ref: 'ORD-2025-001',
|
|
461
|
+
totalPrice: 151.17,
|
|
462
|
+
customer: { email: 'john.doe@example.com' }
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
const actual = {
|
|
466
|
+
ref: resolvers\['input.ref'](data, config, helpers),
|
|
467
|
+
totalPrice: resolvers\['input.totalPrice'](data, config, helpers),
|
|
468
|
+
customer: {
|
|
469
|
+
email: resolvers\['input.customer.email'](data, config, helpers)
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
console.log('Expected:', JSON.stringify(expected, null, 2));
|
|
474
|
+
console.log('Actual:', JSON.stringify(actual, null, 2));
|
|
475
|
+
|
|
476
|
+
// Find differences
|
|
477
|
+
Object.keys(expected).forEach(key => {
|
|
478
|
+
if (JSON.stringify(expected[key]) !== JSON.stringify(actual[key])) {
|
|
479
|
+
console.log(`❌ Mismatch in ${key}:`, {
|
|
480
|
+
expected: expected[key],
|
|
481
|
+
actual: actual[key]
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
### Technique #5: Use TypeScript for Type Safety
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
import type { ResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
493
|
+
|
|
494
|
+
interface OrderData {
|
|
495
|
+
orders: {
|
|
496
|
+
order: {
|
|
497
|
+
'@order-no': string;
|
|
498
|
+
'totals': {
|
|
499
|
+
'order-total': {
|
|
500
|
+
'gross-price': string;
|
|
501
|
+
};
|
|
502
|
+
};
|
|
503
|
+
};
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const orderRefResolver: ResolverFunction = (data: OrderData, config, helpers) => {
|
|
508
|
+
// TypeScript will catch typos
|
|
509
|
+
return helpers.get(data, 'orders.order@order-no');
|
|
510
|
+
};
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## Error Patterns
|
|
516
|
+
|
|
517
|
+
### Pattern #1: "Cannot Find Module"
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
Error: Cannot find module '@fluentcommerce/fc-connect-sdk'
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**Solutions:**
|
|
524
|
+
|
|
525
|
+
1. **Install SDK:**
|
|
526
|
+
```bash
|
|
527
|
+
npm install @fluentcommerce/fc-connect-sdk
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
2. **Link local SDK (development):**
|
|
531
|
+
```bash
|
|
532
|
+
cd fc-connect-sdk && npm link
|
|
533
|
+
cd ../your-project && npm link @fluentcommerce/fc-connect-sdk
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
3. **Check package.json:**
|
|
537
|
+
```json
|
|
538
|
+
{
|
|
539
|
+
"dependencies": {
|
|
540
|
+
"@fluentcommerce/fc-connect-sdk": "^1.5.0"
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
### Pattern #2: "Unexpected Token" in Resolver
|
|
548
|
+
|
|
549
|
+
```
|
|
550
|
+
SyntaxError: Unexpected token '.'
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
**Cause:** Trying to use optional chaining in older Node versions.
|
|
554
|
+
|
|
555
|
+
```typescript
|
|
556
|
+
// ❌ Optional chaining (requires Node 14+)
|
|
557
|
+
const email = data.order?.customer?.email;
|
|
558
|
+
|
|
559
|
+
// ✅ Use helpers.get() (works everywhere)
|
|
560
|
+
const email = helpers.get(data, 'order.customer.email');
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
### Pattern #3: "Maximum Call Stack Size Exceeded"
|
|
566
|
+
|
|
567
|
+
```
|
|
568
|
+
RangeError: Maximum call stack size exceeded
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
**Cause:** Circular reference or infinite recursion.
|
|
572
|
+
|
|
573
|
+
```typescript
|
|
574
|
+
// ❌ Circular reference
|
|
575
|
+
const obj = { a: {} };
|
|
576
|
+
obj.a = obj; // Circular!
|
|
577
|
+
helpers.deepClone(obj); // ERROR
|
|
578
|
+
|
|
579
|
+
// ❌ Infinite recursion
|
|
580
|
+
builder.field('input.ref', (data, config, helpers) => {
|
|
581
|
+
return resolvers\['input.ref'](data, config, helpers); // Calls itself!
|
|
582
|
+
});
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
**Solution:** Check for circular references and recursive calls.
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
|
|
589
|
+
### Pattern #4: "Headers Already Sent"
|
|
590
|
+
|
|
591
|
+
```
|
|
592
|
+
Error: Cannot set headers after they are sent to the client
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
**Cause:** Multiple response attempts in Versori workflow.
|
|
596
|
+
|
|
597
|
+
```typescript
|
|
598
|
+
// ❌ Wrong - multiple returns
|
|
599
|
+
export default async function process(activation) {
|
|
600
|
+
try {
|
|
601
|
+
const result = await processOrder(data);
|
|
602
|
+
return http.respond({ status: 200, body: result });
|
|
603
|
+
} catch (error) {
|
|
604
|
+
return http.respond({ status: 500, body: { error } }); // Second return!
|
|
605
|
+
}
|
|
606
|
+
return http.respond({ status: 200, body: 'done' }); // Third return!
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// ✅ Correct - single return path
|
|
610
|
+
export default async function process(activation) {
|
|
611
|
+
try {
|
|
612
|
+
const result = await processOrder(data);
|
|
613
|
+
return http.respond({ status: 200, body: result });
|
|
614
|
+
} catch (error) {
|
|
615
|
+
return http.respond({ status: 500, body: { error } });
|
|
616
|
+
}
|
|
617
|
+
// No additional return
|
|
618
|
+
}
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## Performance Problems
|
|
624
|
+
|
|
625
|
+
### Problem #1: Slow Resolver Execution
|
|
626
|
+
|
|
627
|
+
**Symptoms:**
|
|
628
|
+
- Timeout errors
|
|
629
|
+
- High latency
|
|
630
|
+
- Memory issues
|
|
631
|
+
|
|
632
|
+
**Common Causes:**
|
|
633
|
+
|
|
634
|
+
#### Cause A: Not Using Memoization
|
|
635
|
+
|
|
636
|
+
```typescript
|
|
637
|
+
// ❌ Slow - recalculates every time
|
|
638
|
+
builder.field('input.discount', (data, config, helpers) => {
|
|
639
|
+
const items = helpers.get(data, 'order.items', []);
|
|
640
|
+
return calculateComplexDiscount(items, config.rules); // Expensive!
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
// ✅ Fast - caches result
|
|
644
|
+
const memoizedCalculate = helpers.memoize(calculateComplexDiscount);
|
|
645
|
+
|
|
646
|
+
builder.field('input.discount', (data, config, helpers) => {
|
|
647
|
+
const items = helpers.get(data, 'order.items', []);
|
|
648
|
+
return memoizedCalculate(items, config.rules); // Cached!
|
|
649
|
+
});
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
---
|
|
653
|
+
|
|
654
|
+
#### Cause B: Sequential Async Operations
|
|
655
|
+
|
|
656
|
+
```typescript
|
|
657
|
+
// ❌ Slow - sequential (waits for each)
|
|
658
|
+
const customer = await lookupCustomer(id);
|
|
659
|
+
const inventory = await checkInventory(sku);
|
|
660
|
+
const pricing = await getPricing(sku);
|
|
661
|
+
|
|
662
|
+
// ✅ Fast - parallel
|
|
663
|
+
const [customer, inventory, pricing] = await Promise.all([
|
|
664
|
+
lookupCustomer(id),
|
|
665
|
+
checkInventory(sku),
|
|
666
|
+
getPricing(sku)
|
|
667
|
+
]);
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
#### Cause C: Large Data Processing
|
|
673
|
+
|
|
674
|
+
```typescript
|
|
675
|
+
// ❌ Slow - processes all at once
|
|
676
|
+
const results = await Promise.all(
|
|
677
|
+
items.map(item => enrichItem(item)) // 1000 items!
|
|
678
|
+
);
|
|
679
|
+
|
|
680
|
+
// ✅ Fast - batch processing
|
|
681
|
+
const results = await helpers.batchProcess(
|
|
682
|
+
items,
|
|
683
|
+
async (item) => await enrichItem(item),
|
|
684
|
+
10 // Process 10 at a time
|
|
685
|
+
);
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
---
|
|
689
|
+
|
|
690
|
+
### Problem #2: Memory Leaks
|
|
691
|
+
|
|
692
|
+
**Cause:** Not cleaning up resources.
|
|
693
|
+
|
|
694
|
+
```typescript
|
|
695
|
+
// ❌ Memory leak - cache grows forever
|
|
696
|
+
const cache = new Map();
|
|
697
|
+
|
|
698
|
+
builder.field('input.enrichedData', async (data, config, helpers) => {
|
|
699
|
+
const key = data.id;
|
|
700
|
+
if (cache.has(key)) {
|
|
701
|
+
return cache.get(key);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const result = await fetchData(key);
|
|
705
|
+
cache.set(key, result); // Never removed!
|
|
706
|
+
return result;
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
// ✅ Better - use LRU cache with max size
|
|
710
|
+
import LRU from 'lru-cache';
|
|
711
|
+
|
|
712
|
+
const cache = new LRU({ max: 100 }); // Max 100 entries
|
|
713
|
+
|
|
714
|
+
builder.field('input.enrichedData', async (data, config, helpers) => {
|
|
715
|
+
const key = data.id;
|
|
716
|
+
if (cache.has(key)) {
|
|
717
|
+
return cache.get(key);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
const result = await fetchData(key);
|
|
721
|
+
cache.set(key, result); // Automatically evicts old entries
|
|
722
|
+
return result;
|
|
723
|
+
});
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
---
|
|
727
|
+
|
|
728
|
+
## Testing Issues
|
|
729
|
+
|
|
730
|
+
### Issue: Tests Failing with "undefined"
|
|
731
|
+
|
|
732
|
+
**Cause:** Test data doesn't match expected structure.
|
|
733
|
+
|
|
734
|
+
```typescript
|
|
735
|
+
// ❌ Wrong - minimal test data
|
|
736
|
+
const testData = {
|
|
737
|
+
order: {
|
|
738
|
+
orderNo: '123'
|
|
739
|
+
}
|
|
740
|
+
};
|
|
741
|
+
|
|
742
|
+
// ✅ Correct - use canonical data
|
|
743
|
+
import { canonicalOrder } from '../../../03-PATTERN-GUIDES/examples/test-data/canonical-order.json';
|
|
744
|
+
|
|
745
|
+
it('should extract order reference', () => {
|
|
746
|
+
const result = resolvers\['input.ref'](canonicalOrder, config, helpers);
|
|
747
|
+
expect(result).toBe('ORD-2025-001');
|
|
748
|
+
});
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
**Solution:** Use canonical test data for consistency.
|
|
752
|
+
|
|
753
|
+
---
|
|
754
|
+
|
|
755
|
+
### Issue: Mock Helpers Not Working
|
|
756
|
+
|
|
757
|
+
**Cause:** Mock doesn't implement all required methods.
|
|
758
|
+
|
|
759
|
+
```typescript
|
|
760
|
+
// ❌ Incomplete mock
|
|
761
|
+
const mockHelpers = {
|
|
762
|
+
get: jest.fn()
|
|
763
|
+
};
|
|
764
|
+
|
|
765
|
+
// ✅ Complete mock (or use real ResolverHelpers)
|
|
766
|
+
import { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
767
|
+
|
|
768
|
+
const mockHelpers = {
|
|
769
|
+
...ResolverHelpers,
|
|
770
|
+
log: {
|
|
771
|
+
debug: jest.fn(),
|
|
772
|
+
info: jest.fn(),
|
|
773
|
+
warn: jest.fn(),
|
|
774
|
+
error: jest.fn()
|
|
775
|
+
}
|
|
776
|
+
};
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
---
|
|
780
|
+
|
|
781
|
+
## Getting Help
|
|
782
|
+
|
|
783
|
+
### Steps Before Asking for Help
|
|
784
|
+
|
|
785
|
+
1. ✅ Check this troubleshooting guide
|
|
786
|
+
2. ✅ Read the [Main Guide](./mapping-resolvers-resolver-guide.md)
|
|
787
|
+
3. ✅ Review [API Reference](./mapping-resolvers-resolver-api-reference.md)
|
|
788
|
+
4. ✅ Test with canonical data
|
|
789
|
+
5. ✅ Enable debug logging
|
|
790
|
+
6. ✅ Isolate the failing resolver
|
|
791
|
+
|
|
792
|
+
### Provide This Information
|
|
793
|
+
|
|
794
|
+
When asking for help, include:
|
|
795
|
+
|
|
796
|
+
```markdown
|
|
797
|
+
## Issue Description
|
|
798
|
+
[Brief description of the problem]
|
|
799
|
+
|
|
800
|
+
## Expected Behavior
|
|
801
|
+
[What should happen]
|
|
802
|
+
|
|
803
|
+
## Actual Behavior
|
|
804
|
+
[What actually happens]
|
|
805
|
+
|
|
806
|
+
## Minimal Reproducible Example
|
|
807
|
+
\`\`\`typescript
|
|
808
|
+
// Resolver code
|
|
809
|
+
const resolver = (data, config, helpers) => {
|
|
810
|
+
// ...
|
|
811
|
+
};
|
|
812
|
+
|
|
813
|
+
// Test data
|
|
814
|
+
const testData = { ... };
|
|
815
|
+
|
|
816
|
+
// Config
|
|
817
|
+
const config = { ... };
|
|
818
|
+
|
|
819
|
+
// Error
|
|
820
|
+
// [Error message and stack trace]
|
|
821
|
+
\`\`\`
|
|
822
|
+
|
|
823
|
+
## Environment
|
|
824
|
+
- SDK Version: 1.5.0
|
|
825
|
+
- Node Version: 18.0.0
|
|
826
|
+
- Platform: Versori / Standalone
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
### Support Channels
|
|
830
|
+
|
|
831
|
+
- **GitHub Issues:** https://github.com/fluentcommerce/fc-connect-sdk/issues
|
|
832
|
+
- **Documentation:** https://docs.fluentcommerce.com
|
|
833
|
+
- **Email:** support@fluentcommerce.com
|
|
834
|
+
|
|
835
|
+
---
|
|
836
|
+
|
|
837
|
+
## See Also
|
|
838
|
+
|
|
839
|
+
- [Main Resolver Guide](./mapping-resolvers-resolver-guide.md)
|
|
840
|
+
- [API Reference](./mapping-resolvers-resolver-api-reference.md)
|
|
841
|
+
- [Helper Functions Reference](./mapping-resolvers-resolver-helpers-reference.md)
|
|
842
|
+
- [Parameters Reference](./mapping-resolvers-resolver-parameters-reference.md)
|
|
843
|
+
- [Cookbook](./mapping-resolvers-resolver-cookbook.md)
|
|
844
|
+
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
**Document Version:** 2.0.0
|
|
848
|
+
**SDK Version:** 1.5.0+
|
|
849
|
+
**Last Updated:** 2025-01-14
|
|
850
|
+
|
|
851
|
+
---
|
|
852
|
+
|
|
853
|
+
**License:** MIT
|
|
854
|
+
**Copyright:** © 2025 Fluent Commerce
|