@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,794 +1,794 @@
|
|
|
1
|
-
# Module 7: API Reference
|
|
2
|
-
|
|
3
|
-
**Level:** Reference
|
|
4
|
-
**Estimated Time:** As needed
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module provides complete TypeScript type definitions, interfaces, and testing utilities for the 4-parameter resolver signature. Use this as a reference when building production resolvers.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Know the exact TypeScript types for resolvers
|
|
14
|
-
- ✅ Understand the ResolverHelpers interface
|
|
15
|
-
- ✅ Use type-safe resolver development
|
|
16
|
-
- ✅ Test resolvers with proper type checking
|
|
17
|
-
- ✅ Access complete helper function reference
|
|
18
|
-
|
|
19
|
-
## Type Definitions
|
|
20
|
-
|
|
21
|
-
### ResolverFunction
|
|
22
|
-
|
|
23
|
-
The standard resolver function type:
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
/**
|
|
27
|
-
* Standard resolver function signature
|
|
28
|
-
*
|
|
29
|
-
* @param value - The extracted field value to transform
|
|
30
|
-
* @param sourceData - Complete source object for context-aware transformations
|
|
31
|
-
* @param config - Resolver-specific configuration passed via mapper context
|
|
32
|
-
* @param helpers - SDK utilities and user-provided context
|
|
33
|
-
* @returns Transformed value or Promise of transformed value
|
|
34
|
-
*/
|
|
35
|
-
type ResolverFunction = (
|
|
36
|
-
value: any,
|
|
37
|
-
sourceData: any,
|
|
38
|
-
config: any,
|
|
39
|
-
helpers: ResolverHelpers
|
|
40
|
-
) => any | Promise<any>;
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### FieldResolverFunction
|
|
44
|
-
|
|
45
|
-
Alias for ResolverFunction used in field mapping contexts:
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
type FieldResolverFunction = ResolverFunction;
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Resolver Collection Type
|
|
52
|
-
|
|
53
|
-
For defining multiple resolvers:
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
type ResolverCollection = Record<string, FieldResolverFunction>;
|
|
57
|
-
|
|
58
|
-
// Example usage
|
|
59
|
-
const myResolvers: ResolverCollection = {
|
|
60
|
-
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
61
|
-
return String(value).toUpperCase();
|
|
62
|
-
},
|
|
63
|
-
'custom.parsePrice': (value, sourceData, config, helpers) => {
|
|
64
|
-
return helpers.parseFloatSafe(value, 0);
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## ResolverHelpers Interface
|
|
70
|
-
|
|
71
|
-
Complete interface with all 54 helper functions:
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
interface ResolverHelpers {
|
|
75
|
-
// ===== Core Utilities =====
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Safely get nested property from object
|
|
79
|
-
* @param obj - Source object
|
|
80
|
-
* @param path - Dot-notation path (e.g., 'customer.address.city')
|
|
81
|
-
* @param defaultValue - Value to return if path doesn't exist
|
|
82
|
-
*/
|
|
83
|
-
get(obj: any, path: string, defaultValue?: any): any;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Safely set nested property on object
|
|
87
|
-
* @param obj - Target object
|
|
88
|
-
* @param path - Dot-notation path
|
|
89
|
-
* @param value - Value to set
|
|
90
|
-
*/
|
|
91
|
-
set(obj: any, path: string, value: any): any;
|
|
92
|
-
|
|
93
|
-
// Note: toString() is not a helper function
|
|
94
|
-
// Use native String(value) or sdk.toString resolver instead
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Safely parse integer with fallback
|
|
98
|
-
* @param value - Value to parse
|
|
99
|
-
* @param defaultValue - Default if parsing fails (default: 0)
|
|
100
|
-
*/
|
|
101
|
-
parseIntSafe(value: any, defaultValue?: number): number;
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Safely parse float with fallback
|
|
105
|
-
* @param value - Value to parse
|
|
106
|
-
* @param defaultValue - Default if parsing fails (default: 0)
|
|
107
|
-
*/
|
|
108
|
-
parseFloatSafe(value: any, defaultValue?: number): number;
|
|
109
|
-
|
|
110
|
-
// ===== Date Operations =====
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Format date to ISO8601 string
|
|
114
|
-
* @param date - Date to format (string or Date object)
|
|
115
|
-
* @returns ISO8601 formatted date string
|
|
116
|
-
*/
|
|
117
|
-
formatDate(date: string | Date): string;
|
|
118
|
-
|
|
119
|
-
// Note: formatDateShort() is not a helper function
|
|
120
|
-
// It's available as sdk.formatDateShort resolver instead
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Parse date string to Date object
|
|
124
|
-
* @param dateStr - Date string to parse
|
|
125
|
-
*/
|
|
126
|
-
parseDate(dateStr: string): Date | null;
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Add days to a date
|
|
130
|
-
* @param date - Starting date
|
|
131
|
-
* @param days - Number of days to add
|
|
132
|
-
*/
|
|
133
|
-
addDays(date: Date, days: number): Date;
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Subtract days from a date
|
|
137
|
-
* @param date - Starting date
|
|
138
|
-
* @param days - Number of days to subtract
|
|
139
|
-
*/
|
|
140
|
-
subtractDays(date: Date, days: number): Date;
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Calculate difference between dates in days
|
|
144
|
-
* @param date1 - First date
|
|
145
|
-
* @param date2 - Second date
|
|
146
|
-
*/
|
|
147
|
-
dateDiff(date1: Date, date2: Date): number;
|
|
148
|
-
|
|
149
|
-
// ===== String Operations =====
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Normalize whitespace (collapse multiple spaces to one)
|
|
153
|
-
* @param str - String to normalize
|
|
154
|
-
*/
|
|
155
|
-
normalizeWhitespace(str: string): string;
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Convert string to camelCase
|
|
159
|
-
* @param str - String to convert
|
|
160
|
-
*/
|
|
161
|
-
toCamelCase(str: string): string;
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Convert string to snake_case
|
|
165
|
-
* @param str - String to convert
|
|
166
|
-
*/
|
|
167
|
-
toSnakeCase(str: string): string;
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Truncate string to max length
|
|
171
|
-
* @param str - String to truncate
|
|
172
|
-
* @param maxLength - Maximum length (includes '...' suffix)
|
|
173
|
-
* @returns Truncated string with '...' appended if needed
|
|
174
|
-
*/
|
|
175
|
-
truncate(str: string, maxLength: number): string;
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Create slug from string (lowercase, hyphenated)
|
|
179
|
-
* @param str - String to slugify
|
|
180
|
-
*/
|
|
181
|
-
slugify(str: string): string;
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Simple string template replacement
|
|
185
|
-
* @param template - Template string with {{placeholders}}
|
|
186
|
-
* @param values - Object with replacement values
|
|
187
|
-
*/
|
|
188
|
-
template(template: string, values: Record<string, any>): string;
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Hash string using simple algorithm
|
|
192
|
-
* @param str - String to hash
|
|
193
|
-
*/
|
|
194
|
-
hashString(str: string): string;
|
|
195
|
-
|
|
196
|
-
// ===== Array Operations =====
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Ensure value is an array (wraps non-arrays)
|
|
200
|
-
* @param value - Value to convert to array
|
|
201
|
-
*/
|
|
202
|
-
ensureArray(value: any): any[];
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Return first non-null/non-undefined value from array
|
|
206
|
-
* @param values - Array of values to check
|
|
207
|
-
*/
|
|
208
|
-
coalesce(values: any[]): any;
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Group array items by key
|
|
212
|
-
* @param array - Array to group
|
|
213
|
-
* @param key - Property to group by
|
|
214
|
-
*/
|
|
215
|
-
groupBy<T>(array: T[], key: string | ((item: T) => string)): Record<string, T[]>;
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Convert array to object keyed by property
|
|
219
|
-
* @param array - Array to convert
|
|
220
|
-
* @param key - Property to use as key
|
|
221
|
-
*/
|
|
222
|
-
keyBy<T>(array: T[], key: string | ((item: T) => string)): Record<string, T>;
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Split array into chunks
|
|
226
|
-
* @param array - Array to chunk
|
|
227
|
-
* @param size - Chunk size
|
|
228
|
-
*/
|
|
229
|
-
chunk<T>(array: T[], size: number): T[][];
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Flatten nested arrays
|
|
233
|
-
* @param array - Array to flatten
|
|
234
|
-
* @param depth - Depth to flatten (default: 1)
|
|
235
|
-
*/
|
|
236
|
-
flatten<T>(array: any[], depth?: number): T[];
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Get unique values from array
|
|
240
|
-
* @param array - Array to deduplicate
|
|
241
|
-
*/
|
|
242
|
-
unique<T>(array: T[]): T[];
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Sort array by property
|
|
246
|
-
* @param array - Array to sort
|
|
247
|
-
* @param key - Property to sort by
|
|
248
|
-
* @param order - Sort order ('asc' or 'desc')
|
|
249
|
-
*/
|
|
250
|
-
sortBy<T>(array: T[], key: string | ((item: T) => any), order?: 'asc' | 'desc'): T[];
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Remove null/undefined values from array
|
|
254
|
-
* @param array - Array to compact
|
|
255
|
-
*/
|
|
256
|
-
compact<T>(array: (T | null | undefined)[]): T[];
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Sum numeric array values
|
|
260
|
-
* @param array - Array of numbers
|
|
261
|
-
*/
|
|
262
|
-
sum(array: number[]): number;
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Calculate average of numeric array
|
|
266
|
-
* @param array - Array of numbers
|
|
267
|
-
*/
|
|
268
|
-
avg(array: number[]): number;
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Find minimum value in array
|
|
272
|
-
* @param array - Array of numbers
|
|
273
|
-
*/
|
|
274
|
-
min(array: number[]): number;
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Find maximum value in array
|
|
278
|
-
* @param array - Array of numbers
|
|
279
|
-
*/
|
|
280
|
-
max(array: number[]): number;
|
|
281
|
-
|
|
282
|
-
// ===== Object Operations =====
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Deep clone an object
|
|
286
|
-
* @param obj - Object to clone
|
|
287
|
-
*/
|
|
288
|
-
deepClone<T>(obj: T): T;
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Deep merge objects
|
|
292
|
-
* @param target - Target object
|
|
293
|
-
* @param sources - Source objects to merge
|
|
294
|
-
*/
|
|
295
|
-
deepMerge(target: any, ...sources: any[]): any;
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Merge multiple objects
|
|
299
|
-
* @param objects - Objects to merge
|
|
300
|
-
*/
|
|
301
|
-
merge(...objects: any[]): any;
|
|
302
|
-
|
|
303
|
-
// ===== Validation =====
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Validate email address format
|
|
307
|
-
* @param email - Email to validate
|
|
308
|
-
*/
|
|
309
|
-
isValidEmail(email: string): boolean;
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Require field to be non-null/non-undefined
|
|
313
|
-
* @param value - Value to check
|
|
314
|
-
* @param fieldName - Field name for error message
|
|
315
|
-
* @throws Error if value is null/undefined
|
|
316
|
-
*/
|
|
317
|
-
requireField(value: any, fieldName: string): any;
|
|
318
|
-
|
|
319
|
-
// ===== Number Operations =====
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Clamp number between min and max
|
|
323
|
-
* @param value - Value to clamp
|
|
324
|
-
* @param min - Minimum value
|
|
325
|
-
* @param max - Maximum value
|
|
326
|
-
*/
|
|
327
|
-
clamp(value: number, min: number, max: number): number;
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* Format number as currency with fixed decimal places
|
|
331
|
-
* @param amount - Number to format
|
|
332
|
-
* @param scale - Number of decimal places (default: 2)
|
|
333
|
-
* @returns Formatted currency string
|
|
334
|
-
*/
|
|
335
|
-
formatCurrency(amount: number, scale?: number): string;
|
|
336
|
-
|
|
337
|
-
// ===== Type Checks =====
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Check if value is a string
|
|
341
|
-
*/
|
|
342
|
-
isString(value: any): value is string;
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Check if value is a number
|
|
346
|
-
*/
|
|
347
|
-
isNumber(value: any): value is number;
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Check if value is an array
|
|
351
|
-
*/
|
|
352
|
-
isArray(value: any): value is any[];
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Check if value is an object
|
|
356
|
-
*/
|
|
357
|
-
isObject(value: any): value is object;
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* Check if value is a Date
|
|
361
|
-
*/
|
|
362
|
-
isDate(value: any): value is Date;
|
|
363
|
-
|
|
364
|
-
// ===== JSON Operations =====
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Safely parse JSON with fallback
|
|
368
|
-
* @param str - JSON string to parse
|
|
369
|
-
* @param defaultValue - Default if parsing fails
|
|
370
|
-
*/
|
|
371
|
-
safeJsonParse(str: string, defaultValue?: any): any;
|
|
372
|
-
|
|
373
|
-
// ===== Performance =====
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Memoize function results (caches based on JSON.stringify of arguments)
|
|
377
|
-
* @param fn - Function to memoize
|
|
378
|
-
* @returns Memoized version of function
|
|
379
|
-
*/
|
|
380
|
-
memoize<T extends (...args: any[]) => any>(fn: T): T;
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Process array in batches with async operations
|
|
384
|
-
* @param items - Array items to process
|
|
385
|
-
* @param processor - Async function to process each item (receives item and index)
|
|
386
|
-
* @param batchSize - Number of items per batch (default: 50)
|
|
387
|
-
* @returns Array of results in original order
|
|
388
|
-
*/
|
|
389
|
-
batchProcess<T, R>(
|
|
390
|
-
items: T[],
|
|
391
|
-
processor: (item: T, index: number) => Promise<R>,
|
|
392
|
-
batchSize?: number
|
|
393
|
-
): Promise<R[]>;
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Retry async function with exponential backoff
|
|
397
|
-
* @param fn - Async function to retry
|
|
398
|
-
* @param maxRetries - Maximum retry attempts (default: 3)
|
|
399
|
-
* @param delayMs - Initial delay in milliseconds (default: 100)
|
|
400
|
-
* @returns Result of successful function call
|
|
401
|
-
* @throws Last error if all retries fail
|
|
402
|
-
*/
|
|
403
|
-
retry<T>(
|
|
404
|
-
fn: () => Promise<T>,
|
|
405
|
-
maxRetries?: number,
|
|
406
|
-
delayMs?: number
|
|
407
|
-
): Promise<T>;
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* Debounce function calls
|
|
411
|
-
* @param fn - Function to debounce
|
|
412
|
-
* @param delayMs - Delay in milliseconds
|
|
413
|
-
*/
|
|
414
|
-
debounce<T extends (...args: any[]) => any>(fn: T, delayMs: number): T;
|
|
415
|
-
|
|
416
|
-
/**
|
|
417
|
-
* Throttle function calls
|
|
418
|
-
* @param fn - Function to throttle
|
|
419
|
-
* @param limitMs - Throttle limit in milliseconds
|
|
420
|
-
*/
|
|
421
|
-
throttle<T extends (...args: any[]) => any>(fn: T, limitMs: number): T;
|
|
422
|
-
|
|
423
|
-
// ===== Utility Functions =====
|
|
424
|
-
|
|
425
|
-
/**
|
|
426
|
-
* Extract custom attribute from attributes array
|
|
427
|
-
* @param attributes - Array of {name, value} objects
|
|
428
|
-
* @param attrName - Attribute name to extract
|
|
429
|
-
* @param defaultValue - Default if not found
|
|
430
|
-
*/
|
|
431
|
-
extractCustomAttribute(
|
|
432
|
-
attributes: Array<{ name: string; value: any }>,
|
|
433
|
-
attrName: string,
|
|
434
|
-
defaultValue?: any
|
|
435
|
-
): any;
|
|
436
|
-
|
|
437
|
-
/**
|
|
438
|
-
* Map value using lookup table
|
|
439
|
-
* @param value - Value to map
|
|
440
|
-
* @param mapping - Lookup table
|
|
441
|
-
* @param defaultValue - Default if not in mapping
|
|
442
|
-
*/
|
|
443
|
-
mapValue(value: any, mapping: Record<string, any>, defaultValue?: any): any;
|
|
444
|
-
|
|
445
|
-
/**
|
|
446
|
-
* Combine first and last name
|
|
447
|
-
* @param firstName - First name
|
|
448
|
-
* @param lastName - Last name
|
|
449
|
-
*/
|
|
450
|
-
fullName(firstName: string, lastName: string): string;
|
|
451
|
-
|
|
452
|
-
/**
|
|
453
|
-
* Generate UUID v4
|
|
454
|
-
*/
|
|
455
|
-
uuid(): string;
|
|
456
|
-
|
|
457
|
-
// ===== Context Objects =====
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Logger instance for debugging
|
|
461
|
-
*/
|
|
462
|
-
log: {
|
|
463
|
-
debug(message: string, ...args: any[]): void;
|
|
464
|
-
info(message: string, ...args: any[]): void;
|
|
465
|
-
warn(message: string, ...args: any[]): void;
|
|
466
|
-
error(message: string, ...args: any[]): void;
|
|
467
|
-
};
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* FluentClient instance for GraphQL queries (optional)
|
|
471
|
-
*/
|
|
472
|
-
fluentClient?: {
|
|
473
|
-
graphql(params: { query: string; variables?: any }): Promise<any>;
|
|
474
|
-
};
|
|
475
|
-
|
|
476
|
-
/**
|
|
477
|
-
* User-provided shared configuration object
|
|
478
|
-
* Prefer using the config parameter for custom settings
|
|
479
|
-
*/
|
|
480
|
-
context?: any;
|
|
481
|
-
}
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
## Typed Resolver Examples
|
|
485
|
-
|
|
486
|
-
### Basic Typed Resolver
|
|
487
|
-
|
|
488
|
-
```typescript
|
|
489
|
-
import type { FieldResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
490
|
-
|
|
491
|
-
const formatSKU: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
492
|
-
const prefix = config?.prefix || 'SKU';
|
|
493
|
-
return `${prefix}-${String(value).toUpperCase()}`;
|
|
494
|
-
};
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
### Typed Resolver with Config Interface
|
|
498
|
-
|
|
499
|
-
```typescript
|
|
500
|
-
interface SKUConfig {
|
|
501
|
-
prefix?: string;
|
|
502
|
-
separator?: string;
|
|
503
|
-
includeTimestamp?: boolean;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
const formatSKU = (
|
|
507
|
-
value: any,
|
|
508
|
-
sourceData: any,
|
|
509
|
-
config: SKUConfig,
|
|
510
|
-
helpers: ResolverHelpers
|
|
511
|
-
): string => {
|
|
512
|
-
const prefix = config.prefix || 'SKU';
|
|
513
|
-
const separator = config.separator || '-';
|
|
514
|
-
|
|
515
|
-
let result = `${prefix}${separator}${String(value).toUpperCase()}`;
|
|
516
|
-
|
|
517
|
-
if (config.includeTimestamp) {
|
|
518
|
-
const timestamp = helpers.formatDate(new Date(), 'YYYYMMDD');
|
|
519
|
-
result += `${separator}${timestamp}`;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
return result;
|
|
523
|
-
};
|
|
524
|
-
```
|
|
525
|
-
|
|
526
|
-
### Async Typed Resolver
|
|
527
|
-
|
|
528
|
-
```typescript
|
|
529
|
-
interface EnrichmentConfig {
|
|
530
|
-
enableEnrichment?: boolean;
|
|
531
|
-
timeout?: number;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
const enrichProduct = async (
|
|
535
|
-
sku: string,
|
|
536
|
-
sourceData: any,
|
|
537
|
-
config: EnrichmentConfig,
|
|
538
|
-
helpers: ResolverHelpers
|
|
539
|
-
): Promise<any> => {
|
|
540
|
-
if (!helpers.fluentClient || !config.enableEnrichment) {
|
|
541
|
-
return { sku };
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
try {
|
|
545
|
-
const result = await helpers.fluentClient.graphql({
|
|
546
|
-
query: `query { product(ref: "${sku}") { id name } }`
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
return result.data.product || { sku, found: false };
|
|
550
|
-
} catch (error) {
|
|
551
|
-
helpers.log.error('Enrichment failed', error);
|
|
552
|
-
return { sku, error: (error as Error).message };
|
|
553
|
-
}
|
|
554
|
-
};
|
|
555
|
-
```
|
|
556
|
-
|
|
557
|
-
## Testing Utilities
|
|
558
|
-
|
|
559
|
-
### Mock ResolverHelpers
|
|
560
|
-
|
|
561
|
-
```typescript
|
|
562
|
-
import type { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
563
|
-
|
|
564
|
-
function createMockHelpers(): ResolverHelpers {
|
|
565
|
-
return {
|
|
566
|
-
// Core utilities
|
|
567
|
-
get: (obj: any, path: string, defaultValue?: any) => {
|
|
568
|
-
// Simple implementation for testing
|
|
569
|
-
const keys = path.split('.');
|
|
570
|
-
let result = obj;
|
|
571
|
-
for (const key of keys) {
|
|
572
|
-
if (result === null || result === undefined) {
|
|
573
|
-
return defaultValue;
|
|
574
|
-
}
|
|
575
|
-
result = result[key];
|
|
576
|
-
}
|
|
577
|
-
return result ?? defaultValue;
|
|
578
|
-
},
|
|
579
|
-
set: (obj: any, path: string, value: any) => {
|
|
580
|
-
const keys = path.split('.');
|
|
581
|
-
let current = obj;
|
|
582
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
583
|
-
current[keys[i]] = current[keys[i]] || {};
|
|
584
|
-
current = current[keys[i]];
|
|
585
|
-
}
|
|
586
|
-
current[keys[keys.length - 1]] = value;
|
|
587
|
-
return obj;
|
|
588
|
-
},
|
|
589
|
-
toString: (value: any) => String(value ?? ''),
|
|
590
|
-
parseIntSafe: (value: any, defaultValue: number = 0) => {
|
|
591
|
-
const parsed = parseInt(value, 10);
|
|
592
|
-
return isNaN(parsed) ? defaultValue : parsed;
|
|
593
|
-
},
|
|
594
|
-
parseFloatSafe: (value: any, defaultValue: number = 0) => {
|
|
595
|
-
const parsed = parseFloat(value);
|
|
596
|
-
return isNaN(parsed) ? defaultValue : parsed;
|
|
597
|
-
},
|
|
598
|
-
// ... implement other helpers as needed for testing
|
|
599
|
-
log: {
|
|
600
|
-
debug: jest.fn(),
|
|
601
|
-
info: jest.fn(),
|
|
602
|
-
warn: jest.fn(),
|
|
603
|
-
error: jest.fn()
|
|
604
|
-
}
|
|
605
|
-
} as any as ResolverHelpers;
|
|
606
|
-
}
|
|
607
|
-
```
|
|
608
|
-
|
|
609
|
-
### Unit Test Template
|
|
610
|
-
|
|
611
|
-
```typescript
|
|
612
|
-
import type { FieldResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
613
|
-
|
|
614
|
-
describe('Custom Resolver', () => {
|
|
615
|
-
let helpers: ResolverHelpers;
|
|
616
|
-
|
|
617
|
-
beforeEach(() => {
|
|
618
|
-
helpers = createMockHelpers();
|
|
619
|
-
});
|
|
620
|
-
|
|
621
|
-
it('should transform value correctly', () => {
|
|
622
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
623
|
-
return String(value).toUpperCase();
|
|
624
|
-
};
|
|
625
|
-
|
|
626
|
-
const result = resolver('test', {}, {}, helpers);
|
|
627
|
-
|
|
628
|
-
expect(result).toBe('TEST');
|
|
629
|
-
});
|
|
630
|
-
|
|
631
|
-
it('should use config parameter', () => {
|
|
632
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
633
|
-
const prefix = config.prefix || 'DEFAULT';
|
|
634
|
-
return `${prefix}-${value}`;
|
|
635
|
-
};
|
|
636
|
-
|
|
637
|
-
const result = resolver('test', {}, { prefix: 'CUSTOM' }, helpers);
|
|
638
|
-
|
|
639
|
-
expect(result).toBe('CUSTOM-test');
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
it('should access sourceData', () => {
|
|
643
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
644
|
-
const quantity = helpers.get(sourceData, 'quantity', 1);
|
|
645
|
-
return value * quantity;
|
|
646
|
-
};
|
|
647
|
-
|
|
648
|
-
const result = resolver(10, { quantity: 5 }, {}, helpers);
|
|
649
|
-
|
|
650
|
-
expect(result).toBe(50);
|
|
651
|
-
});
|
|
652
|
-
});
|
|
653
|
-
```
|
|
654
|
-
|
|
655
|
-
### Integration Test Template
|
|
656
|
-
|
|
657
|
-
```typescript
|
|
658
|
-
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
659
|
-
|
|
660
|
-
describe('Resolver Integration', () => {
|
|
661
|
-
it('should work with UniversalMapper', async () => {
|
|
662
|
-
const customResolvers = {
|
|
663
|
-
'custom.transform': (value, sourceData, config, helpers) => {
|
|
664
|
-
return `${config.prefix}-${value}`;
|
|
665
|
-
}
|
|
666
|
-
};
|
|
667
|
-
|
|
668
|
-
const mapper = new UniversalMapper(
|
|
669
|
-
{
|
|
670
|
-
fields: {
|
|
671
|
-
result: { source: 'input', resolver: 'custom.transform' }
|
|
672
|
-
}
|
|
673
|
-
},
|
|
674
|
-
{
|
|
675
|
-
customResolvers,
|
|
676
|
-
context: { prefix: 'TEST' }
|
|
677
|
-
}
|
|
678
|
-
);
|
|
679
|
-
|
|
680
|
-
const result = await mapper.map({ input: 'value' });
|
|
681
|
-
|
|
682
|
-
expect(result.success).toBe(true);
|
|
683
|
-
expect(result.data.result).toBe('TEST-value');
|
|
684
|
-
});
|
|
685
|
-
});
|
|
686
|
-
```
|
|
687
|
-
|
|
688
|
-
## Production Best Practices
|
|
689
|
-
|
|
690
|
-
### 1. Always Type Your Resolvers
|
|
691
|
-
|
|
692
|
-
```typescript
|
|
693
|
-
// ✅ GOOD: Fully typed
|
|
694
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
695
|
-
return String(value).toUpperCase();
|
|
696
|
-
};
|
|
697
|
-
|
|
698
|
-
// ❌ BAD: No types
|
|
699
|
-
const resolver = (value, sourceData, config, helpers) => {
|
|
700
|
-
return String(value).toUpperCase();
|
|
701
|
-
};
|
|
702
|
-
```
|
|
703
|
-
|
|
704
|
-
### 2. Document Config Requirements
|
|
705
|
-
|
|
706
|
-
```typescript
|
|
707
|
-
/**
|
|
708
|
-
* Format SKU with configurable prefix
|
|
709
|
-
*
|
|
710
|
-
* @param value - SKU to format
|
|
711
|
-
* @param sourceData - Source data context
|
|
712
|
-
* @param config - Configuration
|
|
713
|
-
* @param config.prefix - SKU prefix (default: 'SKU')
|
|
714
|
-
* @param config.separator - Separator (default: '-')
|
|
715
|
-
* @param helpers - SDK helpers
|
|
716
|
-
*/
|
|
717
|
-
const formatSKU: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
718
|
-
// Implementation
|
|
719
|
-
};
|
|
720
|
-
```
|
|
721
|
-
|
|
722
|
-
### 3. Handle Edge Cases
|
|
723
|
-
|
|
724
|
-
```typescript
|
|
725
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
726
|
-
// Handle null/undefined
|
|
727
|
-
if (value === null || value === undefined) {
|
|
728
|
-
return config.defaultValue || null;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
// Handle empty string
|
|
732
|
-
if (String(value).trim() === '') {
|
|
733
|
-
return config.defaultValue || null;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
// Proceed with transformation
|
|
737
|
-
return String(value).toUpperCase();
|
|
738
|
-
};
|
|
739
|
-
```
|
|
740
|
-
|
|
741
|
-
### 4. Use Type Guards
|
|
742
|
-
|
|
743
|
-
```typescript
|
|
744
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
745
|
-
if (!helpers.isString(value) && !helpers.isNumber(value)) {
|
|
746
|
-
helpers.log.warn(`Unexpected value type: ${typeof value}`);
|
|
747
|
-
return null;
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
return String(value).toUpperCase();
|
|
751
|
-
};
|
|
752
|
-
```
|
|
753
|
-
|
|
754
|
-
## Key Takeaways
|
|
755
|
-
|
|
756
|
-
- 🎯 **Use TypeScript types** - `FieldResolverFunction` for type safety
|
|
757
|
-
- 🎯 **Know ResolverHelpers** - 48+ utility functions available
|
|
758
|
-
- 🎯 **Test thoroughly** - Unit and integration tests
|
|
759
|
-
- 🎯 **Document config** - Clear JSDoc comments
|
|
760
|
-
- 🎯 **Handle edge cases** - Null, undefined, empty values
|
|
761
|
-
|
|
762
|
-
## Quick Reference
|
|
763
|
-
|
|
764
|
-
```typescript
|
|
765
|
-
// Standard signature
|
|
766
|
-
(value: any, sourceData: any, config: any, helpers: ResolverHelpers) => any | Promise<any>
|
|
767
|
-
|
|
768
|
-
// Typed version
|
|
769
|
-
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
770
|
-
// Implementation
|
|
771
|
-
};
|
|
772
|
-
|
|
773
|
-
// With config interface
|
|
774
|
-
interface MyConfig {
|
|
775
|
-
option?: string;
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
const resolver = (
|
|
779
|
-
value: any,
|
|
780
|
-
sourceData: any,
|
|
781
|
-
config: MyConfig,
|
|
782
|
-
helpers: ResolverHelpers
|
|
783
|
-
): any => {
|
|
784
|
-
// Implementation
|
|
785
|
-
};
|
|
786
|
-
```
|
|
787
|
-
|
|
788
|
-
## Conclusion
|
|
789
|
-
|
|
790
|
-
You now have complete reference documentation for the 4-parameter resolver signature. Use this module as a reference when building production resolvers.
|
|
791
|
-
|
|
792
|
-
---
|
|
793
|
-
|
|
794
|
-
**Next:** Return to the [Main Guide](../resolver-signature-readme.md) or explore the [Examples Directory](../examples/) for practical implementations.
|
|
1
|
+
# Module 7: API Reference
|
|
2
|
+
|
|
3
|
+
**Level:** Reference
|
|
4
|
+
**Estimated Time:** As needed
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module provides complete TypeScript type definitions, interfaces, and testing utilities for the 4-parameter resolver signature. Use this as a reference when building production resolvers.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Know the exact TypeScript types for resolvers
|
|
14
|
+
- ✅ Understand the ResolverHelpers interface
|
|
15
|
+
- ✅ Use type-safe resolver development
|
|
16
|
+
- ✅ Test resolvers with proper type checking
|
|
17
|
+
- ✅ Access complete helper function reference
|
|
18
|
+
|
|
19
|
+
## Type Definitions
|
|
20
|
+
|
|
21
|
+
### ResolverFunction
|
|
22
|
+
|
|
23
|
+
The standard resolver function type:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
/**
|
|
27
|
+
* Standard resolver function signature
|
|
28
|
+
*
|
|
29
|
+
* @param value - The extracted field value to transform
|
|
30
|
+
* @param sourceData - Complete source object for context-aware transformations
|
|
31
|
+
* @param config - Resolver-specific configuration passed via mapper context
|
|
32
|
+
* @param helpers - SDK utilities and user-provided context
|
|
33
|
+
* @returns Transformed value or Promise of transformed value
|
|
34
|
+
*/
|
|
35
|
+
type ResolverFunction = (
|
|
36
|
+
value: any,
|
|
37
|
+
sourceData: any,
|
|
38
|
+
config: any,
|
|
39
|
+
helpers: ResolverHelpers
|
|
40
|
+
) => any | Promise<any>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### FieldResolverFunction
|
|
44
|
+
|
|
45
|
+
Alias for ResolverFunction used in field mapping contexts:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
type FieldResolverFunction = ResolverFunction;
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Resolver Collection Type
|
|
52
|
+
|
|
53
|
+
For defining multiple resolvers:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
type ResolverCollection = Record<string, FieldResolverFunction>;
|
|
57
|
+
|
|
58
|
+
// Example usage
|
|
59
|
+
const myResolvers: ResolverCollection = {
|
|
60
|
+
'custom.formatSKU': (value, sourceData, config, helpers) => {
|
|
61
|
+
return String(value).toUpperCase();
|
|
62
|
+
},
|
|
63
|
+
'custom.parsePrice': (value, sourceData, config, helpers) => {
|
|
64
|
+
return helpers.parseFloatSafe(value, 0);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## ResolverHelpers Interface
|
|
70
|
+
|
|
71
|
+
Complete interface with all 54 helper functions:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
interface ResolverHelpers {
|
|
75
|
+
// ===== Core Utilities =====
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Safely get nested property from object
|
|
79
|
+
* @param obj - Source object
|
|
80
|
+
* @param path - Dot-notation path (e.g., 'customer.address.city')
|
|
81
|
+
* @param defaultValue - Value to return if path doesn't exist
|
|
82
|
+
*/
|
|
83
|
+
get(obj: any, path: string, defaultValue?: any): any;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Safely set nested property on object
|
|
87
|
+
* @param obj - Target object
|
|
88
|
+
* @param path - Dot-notation path
|
|
89
|
+
* @param value - Value to set
|
|
90
|
+
*/
|
|
91
|
+
set(obj: any, path: string, value: any): any;
|
|
92
|
+
|
|
93
|
+
// Note: toString() is not a helper function
|
|
94
|
+
// Use native String(value) or sdk.toString resolver instead
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Safely parse integer with fallback
|
|
98
|
+
* @param value - Value to parse
|
|
99
|
+
* @param defaultValue - Default if parsing fails (default: 0)
|
|
100
|
+
*/
|
|
101
|
+
parseIntSafe(value: any, defaultValue?: number): number;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Safely parse float with fallback
|
|
105
|
+
* @param value - Value to parse
|
|
106
|
+
* @param defaultValue - Default if parsing fails (default: 0)
|
|
107
|
+
*/
|
|
108
|
+
parseFloatSafe(value: any, defaultValue?: number): number;
|
|
109
|
+
|
|
110
|
+
// ===== Date Operations =====
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Format date to ISO8601 string
|
|
114
|
+
* @param date - Date to format (string or Date object)
|
|
115
|
+
* @returns ISO8601 formatted date string
|
|
116
|
+
*/
|
|
117
|
+
formatDate(date: string | Date): string;
|
|
118
|
+
|
|
119
|
+
// Note: formatDateShort() is not a helper function
|
|
120
|
+
// It's available as sdk.formatDateShort resolver instead
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Parse date string to Date object
|
|
124
|
+
* @param dateStr - Date string to parse
|
|
125
|
+
*/
|
|
126
|
+
parseDate(dateStr: string): Date | null;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Add days to a date
|
|
130
|
+
* @param date - Starting date
|
|
131
|
+
* @param days - Number of days to add
|
|
132
|
+
*/
|
|
133
|
+
addDays(date: Date, days: number): Date;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Subtract days from a date
|
|
137
|
+
* @param date - Starting date
|
|
138
|
+
* @param days - Number of days to subtract
|
|
139
|
+
*/
|
|
140
|
+
subtractDays(date: Date, days: number): Date;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Calculate difference between dates in days
|
|
144
|
+
* @param date1 - First date
|
|
145
|
+
* @param date2 - Second date
|
|
146
|
+
*/
|
|
147
|
+
dateDiff(date1: Date, date2: Date): number;
|
|
148
|
+
|
|
149
|
+
// ===== String Operations =====
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Normalize whitespace (collapse multiple spaces to one)
|
|
153
|
+
* @param str - String to normalize
|
|
154
|
+
*/
|
|
155
|
+
normalizeWhitespace(str: string): string;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Convert string to camelCase
|
|
159
|
+
* @param str - String to convert
|
|
160
|
+
*/
|
|
161
|
+
toCamelCase(str: string): string;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Convert string to snake_case
|
|
165
|
+
* @param str - String to convert
|
|
166
|
+
*/
|
|
167
|
+
toSnakeCase(str: string): string;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Truncate string to max length
|
|
171
|
+
* @param str - String to truncate
|
|
172
|
+
* @param maxLength - Maximum length (includes '...' suffix)
|
|
173
|
+
* @returns Truncated string with '...' appended if needed
|
|
174
|
+
*/
|
|
175
|
+
truncate(str: string, maxLength: number): string;
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Create slug from string (lowercase, hyphenated)
|
|
179
|
+
* @param str - String to slugify
|
|
180
|
+
*/
|
|
181
|
+
slugify(str: string): string;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Simple string template replacement
|
|
185
|
+
* @param template - Template string with {{placeholders}}
|
|
186
|
+
* @param values - Object with replacement values
|
|
187
|
+
*/
|
|
188
|
+
template(template: string, values: Record<string, any>): string;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Hash string using simple algorithm
|
|
192
|
+
* @param str - String to hash
|
|
193
|
+
*/
|
|
194
|
+
hashString(str: string): string;
|
|
195
|
+
|
|
196
|
+
// ===== Array Operations =====
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Ensure value is an array (wraps non-arrays)
|
|
200
|
+
* @param value - Value to convert to array
|
|
201
|
+
*/
|
|
202
|
+
ensureArray(value: any): any[];
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Return first non-null/non-undefined value from array
|
|
206
|
+
* @param values - Array of values to check
|
|
207
|
+
*/
|
|
208
|
+
coalesce(values: any[]): any;
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Group array items by key
|
|
212
|
+
* @param array - Array to group
|
|
213
|
+
* @param key - Property to group by
|
|
214
|
+
*/
|
|
215
|
+
groupBy<T>(array: T[], key: string | ((item: T) => string)): Record<string, T[]>;
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Convert array to object keyed by property
|
|
219
|
+
* @param array - Array to convert
|
|
220
|
+
* @param key - Property to use as key
|
|
221
|
+
*/
|
|
222
|
+
keyBy<T>(array: T[], key: string | ((item: T) => string)): Record<string, T>;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Split array into chunks
|
|
226
|
+
* @param array - Array to chunk
|
|
227
|
+
* @param size - Chunk size
|
|
228
|
+
*/
|
|
229
|
+
chunk<T>(array: T[], size: number): T[][];
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Flatten nested arrays
|
|
233
|
+
* @param array - Array to flatten
|
|
234
|
+
* @param depth - Depth to flatten (default: 1)
|
|
235
|
+
*/
|
|
236
|
+
flatten<T>(array: any[], depth?: number): T[];
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get unique values from array
|
|
240
|
+
* @param array - Array to deduplicate
|
|
241
|
+
*/
|
|
242
|
+
unique<T>(array: T[]): T[];
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Sort array by property
|
|
246
|
+
* @param array - Array to sort
|
|
247
|
+
* @param key - Property to sort by
|
|
248
|
+
* @param order - Sort order ('asc' or 'desc')
|
|
249
|
+
*/
|
|
250
|
+
sortBy<T>(array: T[], key: string | ((item: T) => any), order?: 'asc' | 'desc'): T[];
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Remove null/undefined values from array
|
|
254
|
+
* @param array - Array to compact
|
|
255
|
+
*/
|
|
256
|
+
compact<T>(array: (T | null | undefined)[]): T[];
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Sum numeric array values
|
|
260
|
+
* @param array - Array of numbers
|
|
261
|
+
*/
|
|
262
|
+
sum(array: number[]): number;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Calculate average of numeric array
|
|
266
|
+
* @param array - Array of numbers
|
|
267
|
+
*/
|
|
268
|
+
avg(array: number[]): number;
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Find minimum value in array
|
|
272
|
+
* @param array - Array of numbers
|
|
273
|
+
*/
|
|
274
|
+
min(array: number[]): number;
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Find maximum value in array
|
|
278
|
+
* @param array - Array of numbers
|
|
279
|
+
*/
|
|
280
|
+
max(array: number[]): number;
|
|
281
|
+
|
|
282
|
+
// ===== Object Operations =====
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Deep clone an object
|
|
286
|
+
* @param obj - Object to clone
|
|
287
|
+
*/
|
|
288
|
+
deepClone<T>(obj: T): T;
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Deep merge objects
|
|
292
|
+
* @param target - Target object
|
|
293
|
+
* @param sources - Source objects to merge
|
|
294
|
+
*/
|
|
295
|
+
deepMerge(target: any, ...sources: any[]): any;
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Merge multiple objects
|
|
299
|
+
* @param objects - Objects to merge
|
|
300
|
+
*/
|
|
301
|
+
merge(...objects: any[]): any;
|
|
302
|
+
|
|
303
|
+
// ===== Validation =====
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Validate email address format
|
|
307
|
+
* @param email - Email to validate
|
|
308
|
+
*/
|
|
309
|
+
isValidEmail(email: string): boolean;
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Require field to be non-null/non-undefined
|
|
313
|
+
* @param value - Value to check
|
|
314
|
+
* @param fieldName - Field name for error message
|
|
315
|
+
* @throws Error if value is null/undefined
|
|
316
|
+
*/
|
|
317
|
+
requireField(value: any, fieldName: string): any;
|
|
318
|
+
|
|
319
|
+
// ===== Number Operations =====
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Clamp number between min and max
|
|
323
|
+
* @param value - Value to clamp
|
|
324
|
+
* @param min - Minimum value
|
|
325
|
+
* @param max - Maximum value
|
|
326
|
+
*/
|
|
327
|
+
clamp(value: number, min: number, max: number): number;
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Format number as currency with fixed decimal places
|
|
331
|
+
* @param amount - Number to format
|
|
332
|
+
* @param scale - Number of decimal places (default: 2)
|
|
333
|
+
* @returns Formatted currency string
|
|
334
|
+
*/
|
|
335
|
+
formatCurrency(amount: number, scale?: number): string;
|
|
336
|
+
|
|
337
|
+
// ===== Type Checks =====
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Check if value is a string
|
|
341
|
+
*/
|
|
342
|
+
isString(value: any): value is string;
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Check if value is a number
|
|
346
|
+
*/
|
|
347
|
+
isNumber(value: any): value is number;
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Check if value is an array
|
|
351
|
+
*/
|
|
352
|
+
isArray(value: any): value is any[];
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Check if value is an object
|
|
356
|
+
*/
|
|
357
|
+
isObject(value: any): value is object;
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Check if value is a Date
|
|
361
|
+
*/
|
|
362
|
+
isDate(value: any): value is Date;
|
|
363
|
+
|
|
364
|
+
// ===== JSON Operations =====
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Safely parse JSON with fallback
|
|
368
|
+
* @param str - JSON string to parse
|
|
369
|
+
* @param defaultValue - Default if parsing fails
|
|
370
|
+
*/
|
|
371
|
+
safeJsonParse(str: string, defaultValue?: any): any;
|
|
372
|
+
|
|
373
|
+
// ===== Performance =====
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Memoize function results (caches based on JSON.stringify of arguments)
|
|
377
|
+
* @param fn - Function to memoize
|
|
378
|
+
* @returns Memoized version of function
|
|
379
|
+
*/
|
|
380
|
+
memoize<T extends (...args: any[]) => any>(fn: T): T;
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Process array in batches with async operations
|
|
384
|
+
* @param items - Array items to process
|
|
385
|
+
* @param processor - Async function to process each item (receives item and index)
|
|
386
|
+
* @param batchSize - Number of items per batch (default: 50)
|
|
387
|
+
* @returns Array of results in original order
|
|
388
|
+
*/
|
|
389
|
+
batchProcess<T, R>(
|
|
390
|
+
items: T[],
|
|
391
|
+
processor: (item: T, index: number) => Promise<R>,
|
|
392
|
+
batchSize?: number
|
|
393
|
+
): Promise<R[]>;
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Retry async function with exponential backoff
|
|
397
|
+
* @param fn - Async function to retry
|
|
398
|
+
* @param maxRetries - Maximum retry attempts (default: 3)
|
|
399
|
+
* @param delayMs - Initial delay in milliseconds (default: 100)
|
|
400
|
+
* @returns Result of successful function call
|
|
401
|
+
* @throws Last error if all retries fail
|
|
402
|
+
*/
|
|
403
|
+
retry<T>(
|
|
404
|
+
fn: () => Promise<T>,
|
|
405
|
+
maxRetries?: number,
|
|
406
|
+
delayMs?: number
|
|
407
|
+
): Promise<T>;
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Debounce function calls
|
|
411
|
+
* @param fn - Function to debounce
|
|
412
|
+
* @param delayMs - Delay in milliseconds
|
|
413
|
+
*/
|
|
414
|
+
debounce<T extends (...args: any[]) => any>(fn: T, delayMs: number): T;
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Throttle function calls
|
|
418
|
+
* @param fn - Function to throttle
|
|
419
|
+
* @param limitMs - Throttle limit in milliseconds
|
|
420
|
+
*/
|
|
421
|
+
throttle<T extends (...args: any[]) => any>(fn: T, limitMs: number): T;
|
|
422
|
+
|
|
423
|
+
// ===== Utility Functions =====
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Extract custom attribute from attributes array
|
|
427
|
+
* @param attributes - Array of {name, value} objects
|
|
428
|
+
* @param attrName - Attribute name to extract
|
|
429
|
+
* @param defaultValue - Default if not found
|
|
430
|
+
*/
|
|
431
|
+
extractCustomAttribute(
|
|
432
|
+
attributes: Array<{ name: string; value: any }>,
|
|
433
|
+
attrName: string,
|
|
434
|
+
defaultValue?: any
|
|
435
|
+
): any;
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Map value using lookup table
|
|
439
|
+
* @param value - Value to map
|
|
440
|
+
* @param mapping - Lookup table
|
|
441
|
+
* @param defaultValue - Default if not in mapping
|
|
442
|
+
*/
|
|
443
|
+
mapValue(value: any, mapping: Record<string, any>, defaultValue?: any): any;
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Combine first and last name
|
|
447
|
+
* @param firstName - First name
|
|
448
|
+
* @param lastName - Last name
|
|
449
|
+
*/
|
|
450
|
+
fullName(firstName: string, lastName: string): string;
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Generate UUID v4
|
|
454
|
+
*/
|
|
455
|
+
uuid(): string;
|
|
456
|
+
|
|
457
|
+
// ===== Context Objects =====
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Logger instance for debugging
|
|
461
|
+
*/
|
|
462
|
+
log: {
|
|
463
|
+
debug(message: string, ...args: any[]): void;
|
|
464
|
+
info(message: string, ...args: any[]): void;
|
|
465
|
+
warn(message: string, ...args: any[]): void;
|
|
466
|
+
error(message: string, ...args: any[]): void;
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* FluentClient instance for GraphQL queries (optional)
|
|
471
|
+
*/
|
|
472
|
+
fluentClient?: {
|
|
473
|
+
graphql(params: { query: string; variables?: any }): Promise<any>;
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* User-provided shared configuration object
|
|
478
|
+
* Prefer using the config parameter for custom settings
|
|
479
|
+
*/
|
|
480
|
+
context?: any;
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
## Typed Resolver Examples
|
|
485
|
+
|
|
486
|
+
### Basic Typed Resolver
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
import type { FieldResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
490
|
+
|
|
491
|
+
const formatSKU: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
492
|
+
const prefix = config?.prefix || 'SKU';
|
|
493
|
+
return `${prefix}-${String(value).toUpperCase()}`;
|
|
494
|
+
};
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### Typed Resolver with Config Interface
|
|
498
|
+
|
|
499
|
+
```typescript
|
|
500
|
+
interface SKUConfig {
|
|
501
|
+
prefix?: string;
|
|
502
|
+
separator?: string;
|
|
503
|
+
includeTimestamp?: boolean;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
const formatSKU = (
|
|
507
|
+
value: any,
|
|
508
|
+
sourceData: any,
|
|
509
|
+
config: SKUConfig,
|
|
510
|
+
helpers: ResolverHelpers
|
|
511
|
+
): string => {
|
|
512
|
+
const prefix = config.prefix || 'SKU';
|
|
513
|
+
const separator = config.separator || '-';
|
|
514
|
+
|
|
515
|
+
let result = `${prefix}${separator}${String(value).toUpperCase()}`;
|
|
516
|
+
|
|
517
|
+
if (config.includeTimestamp) {
|
|
518
|
+
const timestamp = helpers.formatDate(new Date(), 'YYYYMMDD');
|
|
519
|
+
result += `${separator}${timestamp}`;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
return result;
|
|
523
|
+
};
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
### Async Typed Resolver
|
|
527
|
+
|
|
528
|
+
```typescript
|
|
529
|
+
interface EnrichmentConfig {
|
|
530
|
+
enableEnrichment?: boolean;
|
|
531
|
+
timeout?: number;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const enrichProduct = async (
|
|
535
|
+
sku: string,
|
|
536
|
+
sourceData: any,
|
|
537
|
+
config: EnrichmentConfig,
|
|
538
|
+
helpers: ResolverHelpers
|
|
539
|
+
): Promise<any> => {
|
|
540
|
+
if (!helpers.fluentClient || !config.enableEnrichment) {
|
|
541
|
+
return { sku };
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
try {
|
|
545
|
+
const result = await helpers.fluentClient.graphql({
|
|
546
|
+
query: `query { product(ref: "${sku}") { id name } }`
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
return result.data.product || { sku, found: false };
|
|
550
|
+
} catch (error) {
|
|
551
|
+
helpers.log.error('Enrichment failed', error);
|
|
552
|
+
return { sku, error: (error as Error).message };
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
## Testing Utilities
|
|
558
|
+
|
|
559
|
+
### Mock ResolverHelpers
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
import type { ResolverHelpers } from '@fluentcommerce/fc-connect-sdk';
|
|
563
|
+
|
|
564
|
+
function createMockHelpers(): ResolverHelpers {
|
|
565
|
+
return {
|
|
566
|
+
// Core utilities
|
|
567
|
+
get: (obj: any, path: string, defaultValue?: any) => {
|
|
568
|
+
// Simple implementation for testing
|
|
569
|
+
const keys = path.split('.');
|
|
570
|
+
let result = obj;
|
|
571
|
+
for (const key of keys) {
|
|
572
|
+
if (result === null || result === undefined) {
|
|
573
|
+
return defaultValue;
|
|
574
|
+
}
|
|
575
|
+
result = result[key];
|
|
576
|
+
}
|
|
577
|
+
return result ?? defaultValue;
|
|
578
|
+
},
|
|
579
|
+
set: (obj: any, path: string, value: any) => {
|
|
580
|
+
const keys = path.split('.');
|
|
581
|
+
let current = obj;
|
|
582
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
583
|
+
current[keys[i]] = current[keys[i]] || {};
|
|
584
|
+
current = current[keys[i]];
|
|
585
|
+
}
|
|
586
|
+
current[keys[keys.length - 1]] = value;
|
|
587
|
+
return obj;
|
|
588
|
+
},
|
|
589
|
+
toString: (value: any) => String(value ?? ''),
|
|
590
|
+
parseIntSafe: (value: any, defaultValue: number = 0) => {
|
|
591
|
+
const parsed = parseInt(value, 10);
|
|
592
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
593
|
+
},
|
|
594
|
+
parseFloatSafe: (value: any, defaultValue: number = 0) => {
|
|
595
|
+
const parsed = parseFloat(value);
|
|
596
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
597
|
+
},
|
|
598
|
+
// ... implement other helpers as needed for testing
|
|
599
|
+
log: {
|
|
600
|
+
debug: jest.fn(),
|
|
601
|
+
info: jest.fn(),
|
|
602
|
+
warn: jest.fn(),
|
|
603
|
+
error: jest.fn()
|
|
604
|
+
}
|
|
605
|
+
} as any as ResolverHelpers;
|
|
606
|
+
}
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### Unit Test Template
|
|
610
|
+
|
|
611
|
+
```typescript
|
|
612
|
+
import type { FieldResolverFunction } from '@fluentcommerce/fc-connect-sdk';
|
|
613
|
+
|
|
614
|
+
describe('Custom Resolver', () => {
|
|
615
|
+
let helpers: ResolverHelpers;
|
|
616
|
+
|
|
617
|
+
beforeEach(() => {
|
|
618
|
+
helpers = createMockHelpers();
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
it('should transform value correctly', () => {
|
|
622
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
623
|
+
return String(value).toUpperCase();
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
const result = resolver('test', {}, {}, helpers);
|
|
627
|
+
|
|
628
|
+
expect(result).toBe('TEST');
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
it('should use config parameter', () => {
|
|
632
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
633
|
+
const prefix = config.prefix || 'DEFAULT';
|
|
634
|
+
return `${prefix}-${value}`;
|
|
635
|
+
};
|
|
636
|
+
|
|
637
|
+
const result = resolver('test', {}, { prefix: 'CUSTOM' }, helpers);
|
|
638
|
+
|
|
639
|
+
expect(result).toBe('CUSTOM-test');
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
it('should access sourceData', () => {
|
|
643
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
644
|
+
const quantity = helpers.get(sourceData, 'quantity', 1);
|
|
645
|
+
return value * quantity;
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
const result = resolver(10, { quantity: 5 }, {}, helpers);
|
|
649
|
+
|
|
650
|
+
expect(result).toBe(50);
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
### Integration Test Template
|
|
656
|
+
|
|
657
|
+
```typescript
|
|
658
|
+
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
659
|
+
|
|
660
|
+
describe('Resolver Integration', () => {
|
|
661
|
+
it('should work with UniversalMapper', async () => {
|
|
662
|
+
const customResolvers = {
|
|
663
|
+
'custom.transform': (value, sourceData, config, helpers) => {
|
|
664
|
+
return `${config.prefix}-${value}`;
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
const mapper = new UniversalMapper(
|
|
669
|
+
{
|
|
670
|
+
fields: {
|
|
671
|
+
result: { source: 'input', resolver: 'custom.transform' }
|
|
672
|
+
}
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
customResolvers,
|
|
676
|
+
context: { prefix: 'TEST' }
|
|
677
|
+
}
|
|
678
|
+
);
|
|
679
|
+
|
|
680
|
+
const result = await mapper.map({ input: 'value' });
|
|
681
|
+
|
|
682
|
+
expect(result.success).toBe(true);
|
|
683
|
+
expect(result.data.result).toBe('TEST-value');
|
|
684
|
+
});
|
|
685
|
+
});
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
## Production Best Practices
|
|
689
|
+
|
|
690
|
+
### 1. Always Type Your Resolvers
|
|
691
|
+
|
|
692
|
+
```typescript
|
|
693
|
+
// ✅ GOOD: Fully typed
|
|
694
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
695
|
+
return String(value).toUpperCase();
|
|
696
|
+
};
|
|
697
|
+
|
|
698
|
+
// ❌ BAD: No types
|
|
699
|
+
const resolver = (value, sourceData, config, helpers) => {
|
|
700
|
+
return String(value).toUpperCase();
|
|
701
|
+
};
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
### 2. Document Config Requirements
|
|
705
|
+
|
|
706
|
+
```typescript
|
|
707
|
+
/**
|
|
708
|
+
* Format SKU with configurable prefix
|
|
709
|
+
*
|
|
710
|
+
* @param value - SKU to format
|
|
711
|
+
* @param sourceData - Source data context
|
|
712
|
+
* @param config - Configuration
|
|
713
|
+
* @param config.prefix - SKU prefix (default: 'SKU')
|
|
714
|
+
* @param config.separator - Separator (default: '-')
|
|
715
|
+
* @param helpers - SDK helpers
|
|
716
|
+
*/
|
|
717
|
+
const formatSKU: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
718
|
+
// Implementation
|
|
719
|
+
};
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
### 3. Handle Edge Cases
|
|
723
|
+
|
|
724
|
+
```typescript
|
|
725
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
726
|
+
// Handle null/undefined
|
|
727
|
+
if (value === null || value === undefined) {
|
|
728
|
+
return config.defaultValue || null;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Handle empty string
|
|
732
|
+
if (String(value).trim() === '') {
|
|
733
|
+
return config.defaultValue || null;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Proceed with transformation
|
|
737
|
+
return String(value).toUpperCase();
|
|
738
|
+
};
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
### 4. Use Type Guards
|
|
742
|
+
|
|
743
|
+
```typescript
|
|
744
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
745
|
+
if (!helpers.isString(value) && !helpers.isNumber(value)) {
|
|
746
|
+
helpers.log.warn(`Unexpected value type: ${typeof value}`);
|
|
747
|
+
return null;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
return String(value).toUpperCase();
|
|
751
|
+
};
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
## Key Takeaways
|
|
755
|
+
|
|
756
|
+
- 🎯 **Use TypeScript types** - `FieldResolverFunction` for type safety
|
|
757
|
+
- 🎯 **Know ResolverHelpers** - 48+ utility functions available
|
|
758
|
+
- 🎯 **Test thoroughly** - Unit and integration tests
|
|
759
|
+
- 🎯 **Document config** - Clear JSDoc comments
|
|
760
|
+
- 🎯 **Handle edge cases** - Null, undefined, empty values
|
|
761
|
+
|
|
762
|
+
## Quick Reference
|
|
763
|
+
|
|
764
|
+
```typescript
|
|
765
|
+
// Standard signature
|
|
766
|
+
(value: any, sourceData: any, config: any, helpers: ResolverHelpers) => any | Promise<any>
|
|
767
|
+
|
|
768
|
+
// Typed version
|
|
769
|
+
const resolver: FieldResolverFunction = (value, sourceData, config, helpers) => {
|
|
770
|
+
// Implementation
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
// With config interface
|
|
774
|
+
interface MyConfig {
|
|
775
|
+
option?: string;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
const resolver = (
|
|
779
|
+
value: any,
|
|
780
|
+
sourceData: any,
|
|
781
|
+
config: MyConfig,
|
|
782
|
+
helpers: ResolverHelpers
|
|
783
|
+
): any => {
|
|
784
|
+
// Implementation
|
|
785
|
+
};
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
## Conclusion
|
|
789
|
+
|
|
790
|
+
You now have complete reference documentation for the 4-parameter resolver signature. Use this module as a reference when building production resolvers.
|
|
791
|
+
|
|
792
|
+
---
|
|
793
|
+
|
|
794
|
+
**Next:** Return to the [Main Guide](../resolver-signature-readme.md) or explore the [Examples Directory](../examples/) for practical implementations.
|