@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md
CHANGED
|
@@ -1,766 +1,766 @@
|
|
|
1
|
-
# Module 9: Complete TypeScript Signature Reference
|
|
2
|
-
|
|
3
|
-
[← Back to Versori Platform Guide](../platforms-versori-readme.md)
|
|
4
|
-
|
|
5
|
-
**Module 9 of 8** | **Level**: Reference | **Time**: Quick Reference
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
This module provides the complete, authoritative TypeScript signatures for all @versori/run v0.4.4 functions, types, and interfaces. Use this as a quick reference when building Versori connectors.
|
|
12
|
-
|
|
13
|
-
**Based on**: @versori/run v0.4.4
|
|
14
|
-
**Last Updated**: 2025-10-30
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Trigger Functions
|
|
19
|
-
|
|
20
|
-
### webhook()
|
|
21
|
-
|
|
22
|
-
**Purpose**: Create HTTP webhook endpoint
|
|
23
|
-
|
|
24
|
-
**Signature**:
|
|
25
|
-
```typescript
|
|
26
|
-
function webhook(
|
|
27
|
-
id: string,
|
|
28
|
-
options?: WebhookOptions
|
|
29
|
-
): Trigger<WebhookData>
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
**Parameters**:
|
|
33
|
-
- `id: string` - Unique workflow identifier (used in URL path)
|
|
34
|
-
- `options?: WebhookOptions` - Optional configuration
|
|
35
|
-
|
|
36
|
-
**Returns**: `Trigger<WebhookData>` - Must be chained with `.then()`
|
|
37
|
-
|
|
38
|
-
**WebhookOptions**:
|
|
39
|
-
```typescript
|
|
40
|
-
type WebhookOptions = {
|
|
41
|
-
cors?: WebhookCorsOptions;
|
|
42
|
-
response?: WebhookResponseOptions;
|
|
43
|
-
connection?: string; // Optional - for webhook authentication
|
|
44
|
-
method?: 'all' | 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head';
|
|
45
|
-
request?: WebhookRequestOptions;
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**WebhookResponseOptions**:
|
|
50
|
-
```typescript
|
|
51
|
-
type WebhookResponseOptions = {
|
|
52
|
-
mode?: 'sync' | 'async';
|
|
53
|
-
onSuccess?: <T>(ctx: Context<T>) => Response;
|
|
54
|
-
onError?: <T>(ctx: Context<T>) => Response;
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**Usage**:
|
|
59
|
-
```typescript
|
|
60
|
-
// Basic webhook
|
|
61
|
-
export const basic = webhook('my-webhook')
|
|
62
|
-
.then(fn('handler', async (ctx) => { /* ... */ }));
|
|
63
|
-
|
|
64
|
-
// With XML response
|
|
65
|
-
export const xmlWebhook = webhook('xml-webhook', {
|
|
66
|
-
response: {
|
|
67
|
-
mode: 'sync',
|
|
68
|
-
onSuccess: (ctx) => new Response(ctx.data, {
|
|
69
|
-
status: 200,
|
|
70
|
-
headers: { 'Content-Type': 'application/xml; charset=utf-8' }
|
|
71
|
-
})
|
|
72
|
-
}
|
|
73
|
-
})
|
|
74
|
-
.then(fn('generate-xml', () => '<?xml version="1.0"?><response>...</response>'));
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
### schedule()
|
|
80
|
-
|
|
81
|
-
**Purpose**: Create time-based recurring workflow
|
|
82
|
-
|
|
83
|
-
**⚠️ CRITICAL**: schedule() does NOT accept handler or options as parameters!
|
|
84
|
-
|
|
85
|
-
**Signature**:
|
|
86
|
-
```typescript
|
|
87
|
-
function schedule(
|
|
88
|
-
id: string,
|
|
89
|
-
schedule: string,
|
|
90
|
-
activationPredicate?: ActivationPredicate
|
|
91
|
-
): Workflow<ScheduleData>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**Parameters**:
|
|
95
|
-
- `id: string` - Workflow identifier
|
|
96
|
-
- `schedule: string` - Cron expression (e.g., `'0 0 * * *'`)
|
|
97
|
-
- `activationPredicate?: ActivationPredicate` - Optional filter for activations
|
|
98
|
-
|
|
99
|
-
**Returns**: `Workflow<ScheduleData>` where `ScheduleData = Record<string, never>` (empty object)
|
|
100
|
-
|
|
101
|
-
**ActivationPredicate**:
|
|
102
|
-
```typescript
|
|
103
|
-
type ActivationPredicate =
|
|
104
|
-
| 'all' // Run for all activations
|
|
105
|
-
| ((a?: Activation) => boolean) // Custom filter function
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**Common Cron Patterns**:
|
|
109
|
-
```typescript
|
|
110
|
-
'* * * * *' // Every minute
|
|
111
|
-
'0 * * * *' // Every hour
|
|
112
|
-
'0 */6 * * *' // Every 6 hours
|
|
113
|
-
'0 0 * * *' // Daily at midnight
|
|
114
|
-
'0 2 * * *' // Daily at 2 AM
|
|
115
|
-
'0 9 * * 1-5' // Weekdays at 9 AM
|
|
116
|
-
'0 0 1 * *' // First of month at midnight
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**Usage**:
|
|
120
|
-
```typescript
|
|
121
|
-
// ❌ WRONG - schedule does NOT accept handler as 4th parameter
|
|
122
|
-
export const wrong = schedule('daily', '0 0 * * *', { connection: 'fluent' }, handler);
|
|
123
|
-
|
|
124
|
-
// ✅ CORRECT - schedule + fn (KV only)
|
|
125
|
-
export const dailyTask = schedule('daily', '0 0 * * *')
|
|
126
|
-
.then(fn('task', async (ctx) => {
|
|
127
|
-
// Only KV and logging
|
|
128
|
-
}));
|
|
129
|
-
|
|
130
|
-
// ✅ CORRECT - schedule + http (with API access)
|
|
131
|
-
export const dailySync = schedule('daily-sync', '0 0 * * *')
|
|
132
|
-
.then(http('sync', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
133
|
-
const client = await createClient(ctx);
|
|
134
|
-
// ... sync logic
|
|
135
|
-
}));
|
|
136
|
-
|
|
137
|
-
// ✅ CORRECT - with activation predicate
|
|
138
|
-
export const prodOnly = schedule('prod-only', '0 * * * *', (a) => a?.id?.startsWith('prod'))
|
|
139
|
-
.then(fn('task', async (ctx) => { /* ... */ }));
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Task Functions
|
|
145
|
-
|
|
146
|
-
### fn()
|
|
147
|
-
|
|
148
|
-
**Purpose**: Internal processing task (no external API access)
|
|
149
|
-
|
|
150
|
-
**Signature**:
|
|
151
|
-
```typescript
|
|
152
|
-
function fn<I, O, Index = void>(
|
|
153
|
-
id: string,
|
|
154
|
-
fn: ContextFunc<I, O, Index>
|
|
155
|
-
): Task<I, O>
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
**Parameters**:
|
|
159
|
-
- `id: string` - Task identifier (for tracing/logging)
|
|
160
|
-
- `fn: ContextFunc<I, O, Index>` - Handler function (sync or async)
|
|
161
|
-
|
|
162
|
-
**Returns**: `Task<I, O>` - Can be chained with `.then()`, `.catch()`
|
|
163
|
-
|
|
164
|
-
**ContextFunc**:
|
|
165
|
-
```typescript
|
|
166
|
-
type ContextFunc<Input, Output, Index> =
|
|
167
|
-
| ((ctx: Context<Input>, idx: Index) => Promise<Output>)
|
|
168
|
-
| ((ctx: Context<Input>, idx: Index) => Output)
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
**Context Available**:
|
|
172
|
-
- ✅ `ctx.data` - Input data
|
|
173
|
-
- ✅ `ctx.log` - Logger
|
|
174
|
-
- ✅ `ctx.activation` - Activation variables
|
|
175
|
-
- ✅ `ctx.openKv()` - KV storage access
|
|
176
|
-
- ✅ `ctx.request()` - HTTP request object (when in webhook chain)
|
|
177
|
-
- ❌ `ctx.fetch` - NOT available (no external API)
|
|
178
|
-
- ❌ `ctx.connectionVariables` - NOT available
|
|
179
|
-
|
|
180
|
-
**Usage**:
|
|
181
|
-
```typescript
|
|
182
|
-
// Simple transformation
|
|
183
|
-
const transform = fn('transform', (ctx) => {
|
|
184
|
-
return { transformed: ctx.data.value * 2 };
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
// Async with KV storage
|
|
188
|
-
const trackFile = fn('track', async (ctx) => {
|
|
189
|
-
const kv = ctx.openKv(':project:');
|
|
190
|
-
await kv.set('file', ctx.data.fileName);
|
|
191
|
-
return { tracked: true };
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
// With index (for array processing)
|
|
195
|
-
const processItem = fn('process', (ctx, idx: number) => {
|
|
196
|
-
ctx.log.info(`Processing item ${idx}`);
|
|
197
|
-
return { index: idx, data: ctx.data };
|
|
198
|
-
});
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
### http()
|
|
204
|
-
|
|
205
|
-
**Purpose**: External API call task (with authentication)
|
|
206
|
-
|
|
207
|
-
**Signature**:
|
|
208
|
-
```typescript
|
|
209
|
-
function http<In = any, Out = any, PageParams = unknown>(
|
|
210
|
-
taskId: string,
|
|
211
|
-
opts: HttpOptions<PageParams>,
|
|
212
|
-
fn: HttpContextFunc<In, Out, PageParams>
|
|
213
|
-
): Task<In, Out>
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
**Parameters**:
|
|
217
|
-
- `taskId: string` - Task identifier
|
|
218
|
-
- `opts: HttpOptions<PageParams>` - Configuration with connection
|
|
219
|
-
- `fn: HttpContextFunc<In, Out, PageParams>` - Handler function
|
|
220
|
-
|
|
221
|
-
**Returns**: `Task<In, Out>` - Can be chained
|
|
222
|
-
|
|
223
|
-
**HttpOptions**:
|
|
224
|
-
```typescript
|
|
225
|
-
type HttpOptions<PageParams> = {
|
|
226
|
-
connection: string; // REQUIRED - connection name
|
|
227
|
-
pagination?: PaginateOptions<PageParams>;
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**HttpContextFunc**:
|
|
232
|
-
```typescript
|
|
233
|
-
type HttpContextFunc<In, Out, PageParams> = (
|
|
234
|
-
ctx: HttpContext<In, PageParams>
|
|
235
|
-
) => Promise<Out>
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
**HttpContext Interface** (extends Context):
|
|
239
|
-
```typescript
|
|
240
|
-
interface HttpContext<Data, PageParams = undefined> extends Context<Data> {
|
|
241
|
-
// All Context properties plus:
|
|
242
|
-
fetch: typeof fetch; // ✅ Authenticated fetch
|
|
243
|
-
connectionVariables: Record<string, any>; // ✅ Connection config vars
|
|
244
|
-
pageParams?: PageParams; // ✅ Current pagination params
|
|
245
|
-
nextPage: (nextParams: PageParams) => Promise<void>;
|
|
246
|
-
baseUrl: Promise<string>; // ✅ Connection base URL
|
|
247
|
-
}
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
**Usage**:
|
|
251
|
-
```typescript
|
|
252
|
-
// Call Fluent API
|
|
253
|
-
const callAPI = http(
|
|
254
|
-
'call-fluent',
|
|
255
|
-
{ connection: 'fluent_commerce' },
|
|
256
|
-
async (ctx) => {
|
|
257
|
-
// ctx.fetch is authenticated
|
|
258
|
-
const client = await createClient(ctx);
|
|
259
|
-
const result = await client.graphql({ query: '...' });
|
|
260
|
-
return { data: result.data };
|
|
261
|
-
}
|
|
262
|
-
);
|
|
263
|
-
|
|
264
|
-
// Access connection variables
|
|
265
|
-
http('use-vars', { connection: 'fluent' }, async (ctx) => {
|
|
266
|
-
const retailerId = ctx.connectionVariables.retailerId;
|
|
267
|
-
const baseUrl = await ctx.baseUrl;
|
|
268
|
-
ctx.log.info('Connection info', { retailerId, baseUrl });
|
|
269
|
-
});
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
## Array Processing Methods
|
|
275
|
-
|
|
276
|
-
### `.unpack()` and `.parallel()`
|
|
277
|
-
|
|
278
|
-
**Purpose**: Process arrays in parallel
|
|
279
|
-
|
|
280
|
-
**Signatures**:
|
|
281
|
-
```typescript
|
|
282
|
-
// On Task<In, Out[]>
|
|
283
|
-
unpack<NextOut = Out extends Array<infer Elem> ? Elem : Out>(): ArrayTask<In, NextOut>
|
|
284
|
-
|
|
285
|
-
// On ArrayTask<In, OutElem>
|
|
286
|
-
parallel<NextOut>(task: Taskable<OutElem, NextOut, number>): Task<In, NextOut[]>
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
**⚠️ CRITICAL LIMITATION**: `.parallel()` has all-or-nothing error behavior. If ANY task fails, the ENTIRE workflow fails with NO partial results. For batch processing with expected failures, use `Promise.allSettled` instead. See [Module 4: Error Behavior Warning](./platforms-versori-04-workflows.md#-critical-parallel-error-behavior).
|
|
290
|
-
|
|
291
|
-
**Usage**:
|
|
292
|
-
```typescript
|
|
293
|
-
// ❌ RISKY - One failure loses ALL results
|
|
294
|
-
schedule('process', '0 2 * * *')
|
|
295
|
-
.then(fn('fetch', () => ['item1', 'item2', 'item3']))
|
|
296
|
-
.unpack()
|
|
297
|
-
.parallel(fn('process', async (ctx) => {
|
|
298
|
-
return await processItem(ctx.data); // If ANY fails, all results lost
|
|
299
|
-
}));
|
|
300
|
-
|
|
301
|
-
// ✅ SAFER - Return error objects instead of throwing
|
|
302
|
-
schedule('process', '0 2 * * *')
|
|
303
|
-
.then(fn('fetch', () => ['item1', 'item2', 'item3']))
|
|
304
|
-
.unpack()
|
|
305
|
-
.parallel(fn('process', async (ctx) => {
|
|
306
|
-
try {
|
|
307
|
-
const result = await processItem(ctx.data);
|
|
308
|
-
return { success: true, item: ctx.data, result };
|
|
309
|
-
} catch (error) {
|
|
310
|
-
return { success: false, item: ctx.data, error: error.message };
|
|
311
|
-
}
|
|
312
|
-
}))
|
|
313
|
-
.then(fn('handle-results', (ctx) => {
|
|
314
|
-
const successes = ctx.data.filter(r => r.success);
|
|
315
|
-
const failures = ctx.data.filter(r => !r.success);
|
|
316
|
-
return { successes, failures };
|
|
317
|
-
}));
|
|
318
|
-
|
|
319
|
-
// ✅ RECOMMENDED - Use Promise.allSettled for fault tolerance
|
|
320
|
-
schedule('process', '0 2 * * *')
|
|
321
|
-
.then(fn('process-all', async (ctx) => {
|
|
322
|
-
const items = ['item1', 'item2', 'item3'];
|
|
323
|
-
|
|
324
|
-
const results = await Promise.allSettled(
|
|
325
|
-
items.map(item => processItem(item))
|
|
326
|
-
);
|
|
327
|
-
|
|
328
|
-
const successes = results.filter(r => r.status === 'fulfilled');
|
|
329
|
-
const failures = results.filter(r => r.status === 'rejected');
|
|
330
|
-
|
|
331
|
-
return { successes, failures };
|
|
332
|
-
}));
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
**When to use `.parallel()`:**
|
|
336
|
-
- ✅ Small number of items (3-10)
|
|
337
|
-
- ✅ All tasks MUST succeed (transactional)
|
|
338
|
-
- ✅ Fast, reliable operations
|
|
339
|
-
- ❌ NOT for batch processing with expected failures
|
|
340
|
-
|
|
341
|
-
**See also**: [workflow-task-types.md](../platforms-versori-workflow-task-types.md#recommended-parallel-processing-patterns)
|
|
342
|
-
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
## Context Types
|
|
346
|
-
|
|
347
|
-
### Base Context Interface
|
|
348
|
-
|
|
349
|
-
**Used by**: `fn()`, webhook handlers
|
|
350
|
-
|
|
351
|
-
```typescript
|
|
352
|
-
interface Context<D> {
|
|
353
|
-
// Read-only properties
|
|
354
|
-
readonly log: Logger;
|
|
355
|
-
readonly executionId: string;
|
|
356
|
-
readonly startTime: Date;
|
|
357
|
-
readonly data: D;
|
|
358
|
-
|
|
359
|
-
// Mutable property
|
|
360
|
-
activation: ActivationImpl;
|
|
361
|
-
|
|
362
|
-
// Methods
|
|
363
|
-
openKv(scope?: KeyValueScope): KeyValue;
|
|
364
|
-
start(workflowId: string, workflowOpts: WorkflowOpts): Promise<AsyncWorkflow>;
|
|
365
|
-
// Note: For connection access, use activation.connections (recommended)
|
|
366
|
-
// See: ../s3-sftp-configuration-guide.md for complete credential patterns
|
|
367
|
-
destroy(scope: KeyValueScope): Promise<void>;
|
|
368
|
-
createIssue(issue: CreateIssue, options?: { deduplicate?: boolean }): Promise<Issue | null>;
|
|
369
|
-
request(): express.Request | undefined;
|
|
370
|
-
}
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
**Key Methods**:
|
|
374
|
-
|
|
375
|
-
#### `openKv(scope?: KeyValueScope)`
|
|
376
|
-
Opens KV storage at specified scope.
|
|
377
|
-
|
|
378
|
-
**Scopes**:
|
|
379
|
-
- `':execution:'` - Per execution (ephemeral)
|
|
380
|
-
- `':project:'` - Project-wide (persistent)
|
|
381
|
-
- `':organization:'` - Organization-wide (shared)
|
|
382
|
-
|
|
383
|
-
**Example**:
|
|
384
|
-
```typescript
|
|
385
|
-
const kv = ctx.openKv(':project:');
|
|
386
|
-
await kv.set('key', 'value');
|
|
387
|
-
const value = await kv.get('key');
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
#### `request(): express.Request | undefined`
|
|
391
|
-
Access raw HTTP request (when in webhook/HTTP workflow).
|
|
392
|
-
|
|
393
|
-
**Example**:
|
|
394
|
-
```typescript
|
|
395
|
-
const req = ctx.request();
|
|
396
|
-
const apiKey = req?.headers['x-api-key'] as string;
|
|
397
|
-
const contentType = req?.headers['content-type'];
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
### HttpContext Interface
|
|
403
|
-
|
|
404
|
-
**Used by**: `http()` tasks
|
|
405
|
-
|
|
406
|
-
```typescript
|
|
407
|
-
interface HttpContext<Data, PageParams = undefined> extends Context<Data> {
|
|
408
|
-
// Additional HTTP-specific properties
|
|
409
|
-
fetch: typeof fetch;
|
|
410
|
-
connectionVariables: Record<string, any>;
|
|
411
|
-
pageParams?: PageParams;
|
|
412
|
-
nextPage: (nextParams: PageParams) => Promise<void>;
|
|
413
|
-
baseUrl: Promise<string>;
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
**Properties**:
|
|
418
|
-
|
|
419
|
-
#### `fetch: typeof fetch`
|
|
420
|
-
Authenticated fetch function with connection credentials.
|
|
421
|
-
|
|
422
|
-
**Example**:
|
|
423
|
-
```typescript
|
|
424
|
-
http('call-api', { connection: 'my-api' }, async (ctx) => {
|
|
425
|
-
// fetch is pre-authenticated with connection
|
|
426
|
-
const response = await ctx.fetch('/users');
|
|
427
|
-
return response.json();
|
|
428
|
-
});
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
#### `connectionVariables: Record<string, any>`
|
|
432
|
-
Connection configuration variables.
|
|
433
|
-
|
|
434
|
-
**Example**:
|
|
435
|
-
```typescript
|
|
436
|
-
http('use-vars', { connection: 'fluent' }, async (ctx) => {
|
|
437
|
-
const retailerId = ctx.connectionVariables.retailerId;
|
|
438
|
-
const apiVersion = ctx.connectionVariables.version;
|
|
439
|
-
ctx.log.info('Connection vars', { retailerId, apiVersion });
|
|
440
|
-
});
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
#### `baseUrl: Promise<string>`
|
|
444
|
-
Connection's base URL (resolved asynchronously).
|
|
445
|
-
|
|
446
|
-
**Example**:
|
|
447
|
-
```typescript
|
|
448
|
-
http('show-url', { connection: 'fluent' }, async (ctx) => {
|
|
449
|
-
const url = await ctx.baseUrl;
|
|
450
|
-
ctx.log.info('Base URL', { url });
|
|
451
|
-
// url = 'https://api.fluentcommerce.com'
|
|
452
|
-
});
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
---
|
|
456
|
-
|
|
457
|
-
### ActivationImpl
|
|
458
|
-
|
|
459
|
-
**Access via**: `ctx.activation`
|
|
460
|
-
|
|
461
|
-
```typescript
|
|
462
|
-
class ActivationImpl implements Activation {
|
|
463
|
-
// Properties
|
|
464
|
-
get id(): string;
|
|
465
|
-
get user(): EndUser;
|
|
466
|
-
get environment(): ProjectEnvironment | undefined; // ✅ NEW in v0.4.x
|
|
467
|
-
get connections(): Array<Connection> | undefined; // ✅ NEW in v0.4.x
|
|
468
|
-
get dynamicVariables(): DynamicVariables | undefined; // ✅ NEW in v0.4.x
|
|
469
|
-
|
|
470
|
-
// Methods
|
|
471
|
-
getVariable<T = unknown>(name: string): T | undefined;
|
|
472
|
-
setVariable(name: string, value: unknown): Promise<void>;
|
|
473
|
-
}
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
**EndUser**:
|
|
477
|
-
```typescript
|
|
478
|
-
type EndUser = {
|
|
479
|
-
id: string;
|
|
480
|
-
createdAt: string;
|
|
481
|
-
updatedAt: string;
|
|
482
|
-
displayName: string;
|
|
483
|
-
externalId: string;
|
|
484
|
-
organisationId: string;
|
|
485
|
-
}
|
|
486
|
-
```
|
|
487
|
-
|
|
488
|
-
**Connection** (v0.4.x+):
|
|
489
|
-
```typescript
|
|
490
|
-
type Connection = {
|
|
491
|
-
id: string;
|
|
492
|
-
name: string;
|
|
493
|
-
templateId: string;
|
|
494
|
-
dynamic: boolean;
|
|
495
|
-
baseUrl: string;
|
|
496
|
-
createdAt: string;
|
|
497
|
-
updatedAt: string;
|
|
498
|
-
credentials: ConnectionCredential[];
|
|
499
|
-
}
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
**Usage Examples**:
|
|
503
|
-
```typescript
|
|
504
|
-
// Access user info
|
|
505
|
-
fn('log-user', (ctx) => {
|
|
506
|
-
const user = ctx.activation.user;
|
|
507
|
-
ctx.log.info('User', {
|
|
508
|
-
displayName: user.displayName,
|
|
509
|
-
externalId: user.externalId
|
|
510
|
-
});
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
// Access all connections (NEW in v0.4.x)
|
|
514
|
-
fn('list-connections', (ctx) => {
|
|
515
|
-
const connections = ctx.activation.connections;
|
|
516
|
-
ctx.log.info('Available connections', {
|
|
517
|
-
count: connections?.length,
|
|
518
|
-
names: connections?.map(c => c.name)
|
|
519
|
-
});
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
// Get/set variables
|
|
523
|
-
fn('use-variables', async (ctx) => {
|
|
524
|
-
// Get variable
|
|
525
|
-
const apiKey = ctx.activation.getVariable<string>('API_KEY');
|
|
526
|
-
|
|
527
|
-
// Set variable
|
|
528
|
-
await ctx.activation.setVariable('LAST_RUN', Date.now());
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
// Access environment (NEW in v0.4.x)
|
|
532
|
-
fn('check-env', (ctx) => {
|
|
533
|
-
const env = ctx.activation.environment;
|
|
534
|
-
ctx.log.info('Environment', {
|
|
535
|
-
id: env?.id,
|
|
536
|
-
name: env?.name
|
|
537
|
-
});
|
|
538
|
-
});
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
---
|
|
542
|
-
|
|
543
|
-
## Helper Types
|
|
544
|
-
|
|
545
|
-
### KeyValueScope
|
|
546
|
-
|
|
547
|
-
```typescript
|
|
548
|
-
type KeyValueScope = ':execution:' | ':project:' | ':organization:'
|
|
549
|
-
```
|
|
550
|
-
|
|
551
|
-
**Usage**:
|
|
552
|
-
- `':execution:'` - Ephemeral, cleared after execution
|
|
553
|
-
- `':project:'` - Persistent, shared across executions in project
|
|
554
|
-
- `':organization:'` - Persistent, shared across projects in organization
|
|
555
|
-
|
|
556
|
-
---
|
|
557
|
-
|
|
558
|
-
### WebhookData & ScheduleData
|
|
559
|
-
|
|
560
|
-
```typescript
|
|
561
|
-
type WebhookData = Record<string, never> // Empty object
|
|
562
|
-
type ScheduleData = Record<string, never> // Empty object
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
**Note**: These are empty because actual data comes from:
|
|
566
|
-
- **Webhook**: `ctx.data` contains parsed request body
|
|
567
|
-
- **Schedule**: `ctx.data` is empty, use activation variables instead
|
|
568
|
-
|
|
569
|
-
---
|
|
570
|
-
|
|
571
|
-
## Complete Workflow Patterns
|
|
572
|
-
|
|
573
|
-
### Pattern 1: webhook() + fn() + http()
|
|
574
|
-
|
|
575
|
-
```typescript
|
|
576
|
-
export const processOrder = webhook('process-order')
|
|
577
|
-
// Step 1: Parse and validate (fn - no API)
|
|
578
|
-
.then(fn('validate', (ctx) => {
|
|
579
|
-
if (!ctx.data?.orderId) {
|
|
580
|
-
throw new Error('Missing orderId');
|
|
581
|
-
}
|
|
582
|
-
return { orderId: ctx.data.orderId, items: ctx.data.items };
|
|
583
|
-
}))
|
|
584
|
-
|
|
585
|
-
// Step 2: Send to Fluent (http - API access)
|
|
586
|
-
.then(http('send-to-fluent', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
587
|
-
const client = await createClient(ctx);
|
|
588
|
-
// ... create order
|
|
589
|
-
return { success: true, fluentOrderId: '...' };
|
|
590
|
-
}))
|
|
591
|
-
|
|
592
|
-
.catch(({ data }) => ({
|
|
593
|
-
success: false,
|
|
594
|
-
error: data instanceof Error ? data.message : 'Unknown error'
|
|
595
|
-
}));
|
|
596
|
-
```
|
|
597
|
-
|
|
598
|
-
### Pattern 2: schedule() + fn() (KV only)
|
|
599
|
-
|
|
600
|
-
```typescript
|
|
601
|
-
export const dailyCleanup = schedule('daily-cleanup', '0 3 * * *')
|
|
602
|
-
.then(fn('cleanup', async (ctx) => {
|
|
603
|
-
const kv = ctx.openKv(':project:');
|
|
604
|
-
// ... cleanup logic
|
|
605
|
-
return { cleaned: true };
|
|
606
|
-
}));
|
|
607
|
-
```
|
|
608
|
-
|
|
609
|
-
### Pattern 3: schedule() + http() (API access)
|
|
610
|
-
|
|
611
|
-
```typescript
|
|
612
|
-
export const hourlySync = schedule('hourly-sync', '0 * * * *')
|
|
613
|
-
.then(http('sync', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
614
|
-
const client = await createClient(ctx);
|
|
615
|
-
// ... sync logic
|
|
616
|
-
return { synced: true };
|
|
617
|
-
}));
|
|
618
|
-
```
|
|
619
|
-
|
|
620
|
-
### Pattern 4: Multi-step with state
|
|
621
|
-
|
|
622
|
-
```typescript
|
|
623
|
-
export const statefulWorkflow = schedule('stateful', '0 * * * *')
|
|
624
|
-
// Check state
|
|
625
|
-
.then(fn('check-state', async (ctx) => {
|
|
626
|
-
const kv = ctx.openKv(':project:');
|
|
627
|
-
const lastRun = await kv.get('last-run');
|
|
628
|
-
if (Date.now() - lastRun < 3600000) {
|
|
629
|
-
throw new Error('SKIP');
|
|
630
|
-
}
|
|
631
|
-
return { shouldProcess: true };
|
|
632
|
-
}))
|
|
633
|
-
|
|
634
|
-
// Process
|
|
635
|
-
.then(http('process', { connection: 'fluent' }, async (ctx) => {
|
|
636
|
-
const client = await createClient(ctx);
|
|
637
|
-
// ... process
|
|
638
|
-
return { processed: true };
|
|
639
|
-
}))
|
|
640
|
-
|
|
641
|
-
// Update state
|
|
642
|
-
.then(fn('update-state', async (ctx) => {
|
|
643
|
-
const kv = ctx.openKv(':project:');
|
|
644
|
-
await kv.set('last-run', Date.now());
|
|
645
|
-
return { stateUpdated: true };
|
|
646
|
-
}))
|
|
647
|
-
|
|
648
|
-
.catch(({ data }) => {
|
|
649
|
-
if (data.message === 'SKIP') {
|
|
650
|
-
return { skipped: true };
|
|
651
|
-
}
|
|
652
|
-
return { error: data.message };
|
|
653
|
-
});
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
---
|
|
657
|
-
|
|
658
|
-
## Decision Tree
|
|
659
|
-
|
|
660
|
-
### When to use each workflow type?
|
|
661
|
-
|
|
662
|
-
```
|
|
663
|
-
Need to receive HTTP requests?
|
|
664
|
-
├─ Yes → webhook()
|
|
665
|
-
└─ No → Continue
|
|
666
|
-
|
|
667
|
-
Run on schedule?
|
|
668
|
-
├─ Yes → schedule()
|
|
669
|
-
└─ No → http() (for on-demand API calls)
|
|
670
|
-
|
|
671
|
-
Need external API access (Fluent, S3 presigned URLs)?
|
|
672
|
-
├─ Yes → Use http() task
|
|
673
|
-
└─ No → Use fn() task
|
|
674
|
-
|
|
675
|
-
Need to access HTTP headers?
|
|
676
|
-
→ Use ctx.request() in any task type
|
|
677
|
-
→ Available in fn(), webhook handlers, and http()
|
|
678
|
-
|
|
679
|
-
Need multiple connections?
|
|
680
|
-
→ Access via ctx.activation.connections (v0.4.x+)
|
|
681
|
-
|
|
682
|
-
Need environment-specific logic?
|
|
683
|
-
→ Use ctx.activation.environment (v0.4.x+)
|
|
684
|
-
```
|
|
685
|
-
|
|
686
|
-
---
|
|
687
|
-
|
|
688
|
-
## Common Mistakes to Avoid
|
|
689
|
-
|
|
690
|
-
### ❌ WRONG: schedule() with 4th parameter
|
|
691
|
-
|
|
692
|
-
```typescript
|
|
693
|
-
// This does NOT work in @versori/run v0.4.4
|
|
694
|
-
export const wrong = schedule('daily', '0 0 * * *', { connection: 'fluent' }, async (ctx) => {
|
|
695
|
-
// ...
|
|
696
|
-
});
|
|
697
|
-
```
|
|
698
|
-
|
|
699
|
-
### ✅ CORRECT: schedule() + .then()
|
|
700
|
-
|
|
701
|
-
```typescript
|
|
702
|
-
export const correct = schedule('daily', '0 0 * * *')
|
|
703
|
-
.then(http('task', { connection: 'fluent' }, async (ctx) => {
|
|
704
|
-
// ...
|
|
705
|
-
}));
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
---
|
|
709
|
-
|
|
710
|
-
### ❌ WRONG: Accessing ctx.headers
|
|
711
|
-
|
|
712
|
-
```typescript
|
|
713
|
-
// ctx.headers doesn't exist!
|
|
714
|
-
const apiKey = ctx.headers?.get?.('x-api-key');
|
|
715
|
-
```
|
|
716
|
-
|
|
717
|
-
### ✅ CORRECT: Using ctx.request()
|
|
718
|
-
|
|
719
|
-
```typescript
|
|
720
|
-
const req = ctx.request();
|
|
721
|
-
const apiKey = req?.headers['x-api-key'];
|
|
722
|
-
```
|
|
723
|
-
|
|
724
|
-
---
|
|
725
|
-
|
|
726
|
-
### ❌ WRONG: Using fn() for external API
|
|
727
|
-
|
|
728
|
-
```typescript
|
|
729
|
-
// fn() doesn't have ctx.fetch - this will fail!
|
|
730
|
-
fn('call-api', async (ctx) => {
|
|
731
|
-
const client = await createClient(ctx); // ❌ Error!
|
|
732
|
-
});
|
|
733
|
-
```
|
|
734
|
-
|
|
735
|
-
### ✅ CORRECT: Using http() for external API
|
|
736
|
-
|
|
737
|
-
```typescript
|
|
738
|
-
http('call-api', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
739
|
-
const client = await createClient(ctx); // ✅ Works!
|
|
740
|
-
});
|
|
741
|
-
```
|
|
742
|
-
|
|
743
|
-
---
|
|
744
|
-
|
|
745
|
-
## Version Compatibility
|
|
746
|
-
|
|
747
|
-
This reference is based on **@versori/run v0.4.4**.
|
|
748
|
-
|
|
749
|
-
**Major changes from v0.3.x**:
|
|
750
|
-
- ✅ Added `activation.connections` array
|
|
751
|
-
- ✅ Added `activation.environment` property
|
|
752
|
-
- ✅ Added `activation.dynamicVariables` property
|
|
753
|
-
- ⚠️ `schedule()` signature unchanged (never had 4th parameter)
|
|
754
|
-
|
|
755
|
-
**Migration**: If you're using old patterns from unofficial docs, update to correct patterns shown above.
|
|
756
|
-
|
|
757
|
-
---
|
|
758
|
-
|
|
759
|
-
## Related Documentation
|
|
760
|
-
|
|
761
|
-
- [Module 4: Workflows](./platforms-versori-04-workflows.md) - Practical workflow examples
|
|
762
|
-
- [Module 5: Connections](./platforms-versori-05-connections.md) - Connection management
|
|
763
|
-
|
|
764
|
-
---
|
|
765
|
-
|
|
766
|
-
[← Back to Versori Platform Guide](../platforms-versori-readme.md)
|
|
1
|
+
# Module 9: Complete TypeScript Signature Reference
|
|
2
|
+
|
|
3
|
+
[← Back to Versori Platform Guide](../platforms-versori-readme.md)
|
|
4
|
+
|
|
5
|
+
**Module 9 of 8** | **Level**: Reference | **Time**: Quick Reference
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
This module provides the complete, authoritative TypeScript signatures for all @versori/run v0.4.4 functions, types, and interfaces. Use this as a quick reference when building Versori connectors.
|
|
12
|
+
|
|
13
|
+
**Based on**: @versori/run v0.4.4
|
|
14
|
+
**Last Updated**: 2025-10-30
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Trigger Functions
|
|
19
|
+
|
|
20
|
+
### webhook()
|
|
21
|
+
|
|
22
|
+
**Purpose**: Create HTTP webhook endpoint
|
|
23
|
+
|
|
24
|
+
**Signature**:
|
|
25
|
+
```typescript
|
|
26
|
+
function webhook(
|
|
27
|
+
id: string,
|
|
28
|
+
options?: WebhookOptions
|
|
29
|
+
): Trigger<WebhookData>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Parameters**:
|
|
33
|
+
- `id: string` - Unique workflow identifier (used in URL path)
|
|
34
|
+
- `options?: WebhookOptions` - Optional configuration
|
|
35
|
+
|
|
36
|
+
**Returns**: `Trigger<WebhookData>` - Must be chained with `.then()`
|
|
37
|
+
|
|
38
|
+
**WebhookOptions**:
|
|
39
|
+
```typescript
|
|
40
|
+
type WebhookOptions = {
|
|
41
|
+
cors?: WebhookCorsOptions;
|
|
42
|
+
response?: WebhookResponseOptions;
|
|
43
|
+
connection?: string; // Optional - for webhook authentication
|
|
44
|
+
method?: 'all' | 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head';
|
|
45
|
+
request?: WebhookRequestOptions;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**WebhookResponseOptions**:
|
|
50
|
+
```typescript
|
|
51
|
+
type WebhookResponseOptions = {
|
|
52
|
+
mode?: 'sync' | 'async';
|
|
53
|
+
onSuccess?: <T>(ctx: Context<T>) => Response;
|
|
54
|
+
onError?: <T>(ctx: Context<T>) => Response;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Usage**:
|
|
59
|
+
```typescript
|
|
60
|
+
// Basic webhook
|
|
61
|
+
export const basic = webhook('my-webhook')
|
|
62
|
+
.then(fn('handler', async (ctx) => { /* ... */ }));
|
|
63
|
+
|
|
64
|
+
// With XML response
|
|
65
|
+
export const xmlWebhook = webhook('xml-webhook', {
|
|
66
|
+
response: {
|
|
67
|
+
mode: 'sync',
|
|
68
|
+
onSuccess: (ctx) => new Response(ctx.data, {
|
|
69
|
+
status: 200,
|
|
70
|
+
headers: { 'Content-Type': 'application/xml; charset=utf-8' }
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.then(fn('generate-xml', () => '<?xml version="1.0"?><response>...</response>'));
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### schedule()
|
|
80
|
+
|
|
81
|
+
**Purpose**: Create time-based recurring workflow
|
|
82
|
+
|
|
83
|
+
**⚠️ CRITICAL**: schedule() does NOT accept handler or options as parameters!
|
|
84
|
+
|
|
85
|
+
**Signature**:
|
|
86
|
+
```typescript
|
|
87
|
+
function schedule(
|
|
88
|
+
id: string,
|
|
89
|
+
schedule: string,
|
|
90
|
+
activationPredicate?: ActivationPredicate
|
|
91
|
+
): Workflow<ScheduleData>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Parameters**:
|
|
95
|
+
- `id: string` - Workflow identifier
|
|
96
|
+
- `schedule: string` - Cron expression (e.g., `'0 0 * * *'`)
|
|
97
|
+
- `activationPredicate?: ActivationPredicate` - Optional filter for activations
|
|
98
|
+
|
|
99
|
+
**Returns**: `Workflow<ScheduleData>` where `ScheduleData = Record<string, never>` (empty object)
|
|
100
|
+
|
|
101
|
+
**ActivationPredicate**:
|
|
102
|
+
```typescript
|
|
103
|
+
type ActivationPredicate =
|
|
104
|
+
| 'all' // Run for all activations
|
|
105
|
+
| ((a?: Activation) => boolean) // Custom filter function
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Common Cron Patterns**:
|
|
109
|
+
```typescript
|
|
110
|
+
'* * * * *' // Every minute
|
|
111
|
+
'0 * * * *' // Every hour
|
|
112
|
+
'0 */6 * * *' // Every 6 hours
|
|
113
|
+
'0 0 * * *' // Daily at midnight
|
|
114
|
+
'0 2 * * *' // Daily at 2 AM
|
|
115
|
+
'0 9 * * 1-5' // Weekdays at 9 AM
|
|
116
|
+
'0 0 1 * *' // First of month at midnight
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Usage**:
|
|
120
|
+
```typescript
|
|
121
|
+
// ❌ WRONG - schedule does NOT accept handler as 4th parameter
|
|
122
|
+
export const wrong = schedule('daily', '0 0 * * *', { connection: 'fluent' }, handler);
|
|
123
|
+
|
|
124
|
+
// ✅ CORRECT - schedule + fn (KV only)
|
|
125
|
+
export const dailyTask = schedule('daily', '0 0 * * *')
|
|
126
|
+
.then(fn('task', async (ctx) => {
|
|
127
|
+
// Only KV and logging
|
|
128
|
+
}));
|
|
129
|
+
|
|
130
|
+
// ✅ CORRECT - schedule + http (with API access)
|
|
131
|
+
export const dailySync = schedule('daily-sync', '0 0 * * *')
|
|
132
|
+
.then(http('sync', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
133
|
+
const client = await createClient(ctx);
|
|
134
|
+
// ... sync logic
|
|
135
|
+
}));
|
|
136
|
+
|
|
137
|
+
// ✅ CORRECT - with activation predicate
|
|
138
|
+
export const prodOnly = schedule('prod-only', '0 * * * *', (a) => a?.id?.startsWith('prod'))
|
|
139
|
+
.then(fn('task', async (ctx) => { /* ... */ }));
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Task Functions
|
|
145
|
+
|
|
146
|
+
### fn()
|
|
147
|
+
|
|
148
|
+
**Purpose**: Internal processing task (no external API access)
|
|
149
|
+
|
|
150
|
+
**Signature**:
|
|
151
|
+
```typescript
|
|
152
|
+
function fn<I, O, Index = void>(
|
|
153
|
+
id: string,
|
|
154
|
+
fn: ContextFunc<I, O, Index>
|
|
155
|
+
): Task<I, O>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Parameters**:
|
|
159
|
+
- `id: string` - Task identifier (for tracing/logging)
|
|
160
|
+
- `fn: ContextFunc<I, O, Index>` - Handler function (sync or async)
|
|
161
|
+
|
|
162
|
+
**Returns**: `Task<I, O>` - Can be chained with `.then()`, `.catch()`
|
|
163
|
+
|
|
164
|
+
**ContextFunc**:
|
|
165
|
+
```typescript
|
|
166
|
+
type ContextFunc<Input, Output, Index> =
|
|
167
|
+
| ((ctx: Context<Input>, idx: Index) => Promise<Output>)
|
|
168
|
+
| ((ctx: Context<Input>, idx: Index) => Output)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Context Available**:
|
|
172
|
+
- ✅ `ctx.data` - Input data
|
|
173
|
+
- ✅ `ctx.log` - Logger
|
|
174
|
+
- ✅ `ctx.activation` - Activation variables
|
|
175
|
+
- ✅ `ctx.openKv()` - KV storage access
|
|
176
|
+
- ✅ `ctx.request()` - HTTP request object (when in webhook chain)
|
|
177
|
+
- ❌ `ctx.fetch` - NOT available (no external API)
|
|
178
|
+
- ❌ `ctx.connectionVariables` - NOT available
|
|
179
|
+
|
|
180
|
+
**Usage**:
|
|
181
|
+
```typescript
|
|
182
|
+
// Simple transformation
|
|
183
|
+
const transform = fn('transform', (ctx) => {
|
|
184
|
+
return { transformed: ctx.data.value * 2 };
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// Async with KV storage
|
|
188
|
+
const trackFile = fn('track', async (ctx) => {
|
|
189
|
+
const kv = ctx.openKv(':project:');
|
|
190
|
+
await kv.set('file', ctx.data.fileName);
|
|
191
|
+
return { tracked: true };
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// With index (for array processing)
|
|
195
|
+
const processItem = fn('process', (ctx, idx: number) => {
|
|
196
|
+
ctx.log.info(`Processing item ${idx}`);
|
|
197
|
+
return { index: idx, data: ctx.data };
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### http()
|
|
204
|
+
|
|
205
|
+
**Purpose**: External API call task (with authentication)
|
|
206
|
+
|
|
207
|
+
**Signature**:
|
|
208
|
+
```typescript
|
|
209
|
+
function http<In = any, Out = any, PageParams = unknown>(
|
|
210
|
+
taskId: string,
|
|
211
|
+
opts: HttpOptions<PageParams>,
|
|
212
|
+
fn: HttpContextFunc<In, Out, PageParams>
|
|
213
|
+
): Task<In, Out>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Parameters**:
|
|
217
|
+
- `taskId: string` - Task identifier
|
|
218
|
+
- `opts: HttpOptions<PageParams>` - Configuration with connection
|
|
219
|
+
- `fn: HttpContextFunc<In, Out, PageParams>` - Handler function
|
|
220
|
+
|
|
221
|
+
**Returns**: `Task<In, Out>` - Can be chained
|
|
222
|
+
|
|
223
|
+
**HttpOptions**:
|
|
224
|
+
```typescript
|
|
225
|
+
type HttpOptions<PageParams> = {
|
|
226
|
+
connection: string; // REQUIRED - connection name
|
|
227
|
+
pagination?: PaginateOptions<PageParams>;
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**HttpContextFunc**:
|
|
232
|
+
```typescript
|
|
233
|
+
type HttpContextFunc<In, Out, PageParams> = (
|
|
234
|
+
ctx: HttpContext<In, PageParams>
|
|
235
|
+
) => Promise<Out>
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**HttpContext Interface** (extends Context):
|
|
239
|
+
```typescript
|
|
240
|
+
interface HttpContext<Data, PageParams = undefined> extends Context<Data> {
|
|
241
|
+
// All Context properties plus:
|
|
242
|
+
fetch: typeof fetch; // ✅ Authenticated fetch
|
|
243
|
+
connectionVariables: Record<string, any>; // ✅ Connection config vars
|
|
244
|
+
pageParams?: PageParams; // ✅ Current pagination params
|
|
245
|
+
nextPage: (nextParams: PageParams) => Promise<void>;
|
|
246
|
+
baseUrl: Promise<string>; // ✅ Connection base URL
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Usage**:
|
|
251
|
+
```typescript
|
|
252
|
+
// Call Fluent API
|
|
253
|
+
const callAPI = http(
|
|
254
|
+
'call-fluent',
|
|
255
|
+
{ connection: 'fluent_commerce' },
|
|
256
|
+
async (ctx) => {
|
|
257
|
+
// ctx.fetch is authenticated
|
|
258
|
+
const client = await createClient(ctx);
|
|
259
|
+
const result = await client.graphql({ query: '...' });
|
|
260
|
+
return { data: result.data };
|
|
261
|
+
}
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
// Access connection variables
|
|
265
|
+
http('use-vars', { connection: 'fluent' }, async (ctx) => {
|
|
266
|
+
const retailerId = ctx.connectionVariables.retailerId;
|
|
267
|
+
const baseUrl = await ctx.baseUrl;
|
|
268
|
+
ctx.log.info('Connection info', { retailerId, baseUrl });
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Array Processing Methods
|
|
275
|
+
|
|
276
|
+
### `.unpack()` and `.parallel()`
|
|
277
|
+
|
|
278
|
+
**Purpose**: Process arrays in parallel
|
|
279
|
+
|
|
280
|
+
**Signatures**:
|
|
281
|
+
```typescript
|
|
282
|
+
// On Task<In, Out[]>
|
|
283
|
+
unpack<NextOut = Out extends Array<infer Elem> ? Elem : Out>(): ArrayTask<In, NextOut>
|
|
284
|
+
|
|
285
|
+
// On ArrayTask<In, OutElem>
|
|
286
|
+
parallel<NextOut>(task: Taskable<OutElem, NextOut, number>): Task<In, NextOut[]>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**⚠️ CRITICAL LIMITATION**: `.parallel()` has all-or-nothing error behavior. If ANY task fails, the ENTIRE workflow fails with NO partial results. For batch processing with expected failures, use `Promise.allSettled` instead. See [Module 4: Error Behavior Warning](./platforms-versori-04-workflows.md#-critical-parallel-error-behavior).
|
|
290
|
+
|
|
291
|
+
**Usage**:
|
|
292
|
+
```typescript
|
|
293
|
+
// ❌ RISKY - One failure loses ALL results
|
|
294
|
+
schedule('process', '0 2 * * *')
|
|
295
|
+
.then(fn('fetch', () => ['item1', 'item2', 'item3']))
|
|
296
|
+
.unpack()
|
|
297
|
+
.parallel(fn('process', async (ctx) => {
|
|
298
|
+
return await processItem(ctx.data); // If ANY fails, all results lost
|
|
299
|
+
}));
|
|
300
|
+
|
|
301
|
+
// ✅ SAFER - Return error objects instead of throwing
|
|
302
|
+
schedule('process', '0 2 * * *')
|
|
303
|
+
.then(fn('fetch', () => ['item1', 'item2', 'item3']))
|
|
304
|
+
.unpack()
|
|
305
|
+
.parallel(fn('process', async (ctx) => {
|
|
306
|
+
try {
|
|
307
|
+
const result = await processItem(ctx.data);
|
|
308
|
+
return { success: true, item: ctx.data, result };
|
|
309
|
+
} catch (error) {
|
|
310
|
+
return { success: false, item: ctx.data, error: error.message };
|
|
311
|
+
}
|
|
312
|
+
}))
|
|
313
|
+
.then(fn('handle-results', (ctx) => {
|
|
314
|
+
const successes = ctx.data.filter(r => r.success);
|
|
315
|
+
const failures = ctx.data.filter(r => !r.success);
|
|
316
|
+
return { successes, failures };
|
|
317
|
+
}));
|
|
318
|
+
|
|
319
|
+
// ✅ RECOMMENDED - Use Promise.allSettled for fault tolerance
|
|
320
|
+
schedule('process', '0 2 * * *')
|
|
321
|
+
.then(fn('process-all', async (ctx) => {
|
|
322
|
+
const items = ['item1', 'item2', 'item3'];
|
|
323
|
+
|
|
324
|
+
const results = await Promise.allSettled(
|
|
325
|
+
items.map(item => processItem(item))
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
const successes = results.filter(r => r.status === 'fulfilled');
|
|
329
|
+
const failures = results.filter(r => r.status === 'rejected');
|
|
330
|
+
|
|
331
|
+
return { successes, failures };
|
|
332
|
+
}));
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**When to use `.parallel()`:**
|
|
336
|
+
- ✅ Small number of items (3-10)
|
|
337
|
+
- ✅ All tasks MUST succeed (transactional)
|
|
338
|
+
- ✅ Fast, reliable operations
|
|
339
|
+
- ❌ NOT for batch processing with expected failures
|
|
340
|
+
|
|
341
|
+
**See also**: [workflow-task-types.md](../platforms-versori-workflow-task-types.md#recommended-parallel-processing-patterns)
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Context Types
|
|
346
|
+
|
|
347
|
+
### Base Context Interface
|
|
348
|
+
|
|
349
|
+
**Used by**: `fn()`, webhook handlers
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
interface Context<D> {
|
|
353
|
+
// Read-only properties
|
|
354
|
+
readonly log: Logger;
|
|
355
|
+
readonly executionId: string;
|
|
356
|
+
readonly startTime: Date;
|
|
357
|
+
readonly data: D;
|
|
358
|
+
|
|
359
|
+
// Mutable property
|
|
360
|
+
activation: ActivationImpl;
|
|
361
|
+
|
|
362
|
+
// Methods
|
|
363
|
+
openKv(scope?: KeyValueScope): KeyValue;
|
|
364
|
+
start(workflowId: string, workflowOpts: WorkflowOpts): Promise<AsyncWorkflow>;
|
|
365
|
+
// Note: For connection access, use activation.connections (recommended)
|
|
366
|
+
// See: ../s3-sftp-configuration-guide.md for complete credential patterns
|
|
367
|
+
destroy(scope: KeyValueScope): Promise<void>;
|
|
368
|
+
createIssue(issue: CreateIssue, options?: { deduplicate?: boolean }): Promise<Issue | null>;
|
|
369
|
+
request(): express.Request | undefined;
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
**Key Methods**:
|
|
374
|
+
|
|
375
|
+
#### `openKv(scope?: KeyValueScope)`
|
|
376
|
+
Opens KV storage at specified scope.
|
|
377
|
+
|
|
378
|
+
**Scopes**:
|
|
379
|
+
- `':execution:'` - Per execution (ephemeral)
|
|
380
|
+
- `':project:'` - Project-wide (persistent)
|
|
381
|
+
- `':organization:'` - Organization-wide (shared)
|
|
382
|
+
|
|
383
|
+
**Example**:
|
|
384
|
+
```typescript
|
|
385
|
+
const kv = ctx.openKv(':project:');
|
|
386
|
+
await kv.set('key', 'value');
|
|
387
|
+
const value = await kv.get('key');
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
#### `request(): express.Request | undefined`
|
|
391
|
+
Access raw HTTP request (when in webhook/HTTP workflow).
|
|
392
|
+
|
|
393
|
+
**Example**:
|
|
394
|
+
```typescript
|
|
395
|
+
const req = ctx.request();
|
|
396
|
+
const apiKey = req?.headers['x-api-key'] as string;
|
|
397
|
+
const contentType = req?.headers['content-type'];
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
### HttpContext Interface
|
|
403
|
+
|
|
404
|
+
**Used by**: `http()` tasks
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
interface HttpContext<Data, PageParams = undefined> extends Context<Data> {
|
|
408
|
+
// Additional HTTP-specific properties
|
|
409
|
+
fetch: typeof fetch;
|
|
410
|
+
connectionVariables: Record<string, any>;
|
|
411
|
+
pageParams?: PageParams;
|
|
412
|
+
nextPage: (nextParams: PageParams) => Promise<void>;
|
|
413
|
+
baseUrl: Promise<string>;
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**Properties**:
|
|
418
|
+
|
|
419
|
+
#### `fetch: typeof fetch`
|
|
420
|
+
Authenticated fetch function with connection credentials.
|
|
421
|
+
|
|
422
|
+
**Example**:
|
|
423
|
+
```typescript
|
|
424
|
+
http('call-api', { connection: 'my-api' }, async (ctx) => {
|
|
425
|
+
// fetch is pre-authenticated with connection
|
|
426
|
+
const response = await ctx.fetch('/users');
|
|
427
|
+
return response.json();
|
|
428
|
+
});
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
#### `connectionVariables: Record<string, any>`
|
|
432
|
+
Connection configuration variables.
|
|
433
|
+
|
|
434
|
+
**Example**:
|
|
435
|
+
```typescript
|
|
436
|
+
http('use-vars', { connection: 'fluent' }, async (ctx) => {
|
|
437
|
+
const retailerId = ctx.connectionVariables.retailerId;
|
|
438
|
+
const apiVersion = ctx.connectionVariables.version;
|
|
439
|
+
ctx.log.info('Connection vars', { retailerId, apiVersion });
|
|
440
|
+
});
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
#### `baseUrl: Promise<string>`
|
|
444
|
+
Connection's base URL (resolved asynchronously).
|
|
445
|
+
|
|
446
|
+
**Example**:
|
|
447
|
+
```typescript
|
|
448
|
+
http('show-url', { connection: 'fluent' }, async (ctx) => {
|
|
449
|
+
const url = await ctx.baseUrl;
|
|
450
|
+
ctx.log.info('Base URL', { url });
|
|
451
|
+
// url = 'https://api.fluentcommerce.com'
|
|
452
|
+
});
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
### ActivationImpl
|
|
458
|
+
|
|
459
|
+
**Access via**: `ctx.activation`
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
class ActivationImpl implements Activation {
|
|
463
|
+
// Properties
|
|
464
|
+
get id(): string;
|
|
465
|
+
get user(): EndUser;
|
|
466
|
+
get environment(): ProjectEnvironment | undefined; // ✅ NEW in v0.4.x
|
|
467
|
+
get connections(): Array<Connection> | undefined; // ✅ NEW in v0.4.x
|
|
468
|
+
get dynamicVariables(): DynamicVariables | undefined; // ✅ NEW in v0.4.x
|
|
469
|
+
|
|
470
|
+
// Methods
|
|
471
|
+
getVariable<T = unknown>(name: string): T | undefined;
|
|
472
|
+
setVariable(name: string, value: unknown): Promise<void>;
|
|
473
|
+
}
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
**EndUser**:
|
|
477
|
+
```typescript
|
|
478
|
+
type EndUser = {
|
|
479
|
+
id: string;
|
|
480
|
+
createdAt: string;
|
|
481
|
+
updatedAt: string;
|
|
482
|
+
displayName: string;
|
|
483
|
+
externalId: string;
|
|
484
|
+
organisationId: string;
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**Connection** (v0.4.x+):
|
|
489
|
+
```typescript
|
|
490
|
+
type Connection = {
|
|
491
|
+
id: string;
|
|
492
|
+
name: string;
|
|
493
|
+
templateId: string;
|
|
494
|
+
dynamic: boolean;
|
|
495
|
+
baseUrl: string;
|
|
496
|
+
createdAt: string;
|
|
497
|
+
updatedAt: string;
|
|
498
|
+
credentials: ConnectionCredential[];
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Usage Examples**:
|
|
503
|
+
```typescript
|
|
504
|
+
// Access user info
|
|
505
|
+
fn('log-user', (ctx) => {
|
|
506
|
+
const user = ctx.activation.user;
|
|
507
|
+
ctx.log.info('User', {
|
|
508
|
+
displayName: user.displayName,
|
|
509
|
+
externalId: user.externalId
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
// Access all connections (NEW in v0.4.x)
|
|
514
|
+
fn('list-connections', (ctx) => {
|
|
515
|
+
const connections = ctx.activation.connections;
|
|
516
|
+
ctx.log.info('Available connections', {
|
|
517
|
+
count: connections?.length,
|
|
518
|
+
names: connections?.map(c => c.name)
|
|
519
|
+
});
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
// Get/set variables
|
|
523
|
+
fn('use-variables', async (ctx) => {
|
|
524
|
+
// Get variable
|
|
525
|
+
const apiKey = ctx.activation.getVariable<string>('API_KEY');
|
|
526
|
+
|
|
527
|
+
// Set variable
|
|
528
|
+
await ctx.activation.setVariable('LAST_RUN', Date.now());
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
// Access environment (NEW in v0.4.x)
|
|
532
|
+
fn('check-env', (ctx) => {
|
|
533
|
+
const env = ctx.activation.environment;
|
|
534
|
+
ctx.log.info('Environment', {
|
|
535
|
+
id: env?.id,
|
|
536
|
+
name: env?.name
|
|
537
|
+
});
|
|
538
|
+
});
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
## Helper Types
|
|
544
|
+
|
|
545
|
+
### KeyValueScope
|
|
546
|
+
|
|
547
|
+
```typescript
|
|
548
|
+
type KeyValueScope = ':execution:' | ':project:' | ':organization:'
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
**Usage**:
|
|
552
|
+
- `':execution:'` - Ephemeral, cleared after execution
|
|
553
|
+
- `':project:'` - Persistent, shared across executions in project
|
|
554
|
+
- `':organization:'` - Persistent, shared across projects in organization
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
### WebhookData & ScheduleData
|
|
559
|
+
|
|
560
|
+
```typescript
|
|
561
|
+
type WebhookData = Record<string, never> // Empty object
|
|
562
|
+
type ScheduleData = Record<string, never> // Empty object
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
**Note**: These are empty because actual data comes from:
|
|
566
|
+
- **Webhook**: `ctx.data` contains parsed request body
|
|
567
|
+
- **Schedule**: `ctx.data` is empty, use activation variables instead
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## Complete Workflow Patterns
|
|
572
|
+
|
|
573
|
+
### Pattern 1: webhook() + fn() + http()
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
export const processOrder = webhook('process-order')
|
|
577
|
+
// Step 1: Parse and validate (fn - no API)
|
|
578
|
+
.then(fn('validate', (ctx) => {
|
|
579
|
+
if (!ctx.data?.orderId) {
|
|
580
|
+
throw new Error('Missing orderId');
|
|
581
|
+
}
|
|
582
|
+
return { orderId: ctx.data.orderId, items: ctx.data.items };
|
|
583
|
+
}))
|
|
584
|
+
|
|
585
|
+
// Step 2: Send to Fluent (http - API access)
|
|
586
|
+
.then(http('send-to-fluent', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
587
|
+
const client = await createClient(ctx);
|
|
588
|
+
// ... create order
|
|
589
|
+
return { success: true, fluentOrderId: '...' };
|
|
590
|
+
}))
|
|
591
|
+
|
|
592
|
+
.catch(({ data }) => ({
|
|
593
|
+
success: false,
|
|
594
|
+
error: data instanceof Error ? data.message : 'Unknown error'
|
|
595
|
+
}));
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
### Pattern 2: schedule() + fn() (KV only)
|
|
599
|
+
|
|
600
|
+
```typescript
|
|
601
|
+
export const dailyCleanup = schedule('daily-cleanup', '0 3 * * *')
|
|
602
|
+
.then(fn('cleanup', async (ctx) => {
|
|
603
|
+
const kv = ctx.openKv(':project:');
|
|
604
|
+
// ... cleanup logic
|
|
605
|
+
return { cleaned: true };
|
|
606
|
+
}));
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### Pattern 3: schedule() + http() (API access)
|
|
610
|
+
|
|
611
|
+
```typescript
|
|
612
|
+
export const hourlySync = schedule('hourly-sync', '0 * * * *')
|
|
613
|
+
.then(http('sync', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
614
|
+
const client = await createClient(ctx);
|
|
615
|
+
// ... sync logic
|
|
616
|
+
return { synced: true };
|
|
617
|
+
}));
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
### Pattern 4: Multi-step with state
|
|
621
|
+
|
|
622
|
+
```typescript
|
|
623
|
+
export const statefulWorkflow = schedule('stateful', '0 * * * *')
|
|
624
|
+
// Check state
|
|
625
|
+
.then(fn('check-state', async (ctx) => {
|
|
626
|
+
const kv = ctx.openKv(':project:');
|
|
627
|
+
const lastRun = await kv.get('last-run');
|
|
628
|
+
if (Date.now() - lastRun < 3600000) {
|
|
629
|
+
throw new Error('SKIP');
|
|
630
|
+
}
|
|
631
|
+
return { shouldProcess: true };
|
|
632
|
+
}))
|
|
633
|
+
|
|
634
|
+
// Process
|
|
635
|
+
.then(http('process', { connection: 'fluent' }, async (ctx) => {
|
|
636
|
+
const client = await createClient(ctx);
|
|
637
|
+
// ... process
|
|
638
|
+
return { processed: true };
|
|
639
|
+
}))
|
|
640
|
+
|
|
641
|
+
// Update state
|
|
642
|
+
.then(fn('update-state', async (ctx) => {
|
|
643
|
+
const kv = ctx.openKv(':project:');
|
|
644
|
+
await kv.set('last-run', Date.now());
|
|
645
|
+
return { stateUpdated: true };
|
|
646
|
+
}))
|
|
647
|
+
|
|
648
|
+
.catch(({ data }) => {
|
|
649
|
+
if (data.message === 'SKIP') {
|
|
650
|
+
return { skipped: true };
|
|
651
|
+
}
|
|
652
|
+
return { error: data.message };
|
|
653
|
+
});
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## Decision Tree
|
|
659
|
+
|
|
660
|
+
### When to use each workflow type?
|
|
661
|
+
|
|
662
|
+
```
|
|
663
|
+
Need to receive HTTP requests?
|
|
664
|
+
├─ Yes → webhook()
|
|
665
|
+
└─ No → Continue
|
|
666
|
+
|
|
667
|
+
Run on schedule?
|
|
668
|
+
├─ Yes → schedule()
|
|
669
|
+
└─ No → http() (for on-demand API calls)
|
|
670
|
+
|
|
671
|
+
Need external API access (Fluent, S3 presigned URLs)?
|
|
672
|
+
├─ Yes → Use http() task
|
|
673
|
+
└─ No → Use fn() task
|
|
674
|
+
|
|
675
|
+
Need to access HTTP headers?
|
|
676
|
+
→ Use ctx.request() in any task type
|
|
677
|
+
→ Available in fn(), webhook handlers, and http()
|
|
678
|
+
|
|
679
|
+
Need multiple connections?
|
|
680
|
+
→ Access via ctx.activation.connections (v0.4.x+)
|
|
681
|
+
|
|
682
|
+
Need environment-specific logic?
|
|
683
|
+
→ Use ctx.activation.environment (v0.4.x+)
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
---
|
|
687
|
+
|
|
688
|
+
## Common Mistakes to Avoid
|
|
689
|
+
|
|
690
|
+
### ❌ WRONG: schedule() with 4th parameter
|
|
691
|
+
|
|
692
|
+
```typescript
|
|
693
|
+
// This does NOT work in @versori/run v0.4.4
|
|
694
|
+
export const wrong = schedule('daily', '0 0 * * *', { connection: 'fluent' }, async (ctx) => {
|
|
695
|
+
// ...
|
|
696
|
+
});
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
### ✅ CORRECT: schedule() + .then()
|
|
700
|
+
|
|
701
|
+
```typescript
|
|
702
|
+
export const correct = schedule('daily', '0 0 * * *')
|
|
703
|
+
.then(http('task', { connection: 'fluent' }, async (ctx) => {
|
|
704
|
+
// ...
|
|
705
|
+
}));
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
### ❌ WRONG: Accessing ctx.headers
|
|
711
|
+
|
|
712
|
+
```typescript
|
|
713
|
+
// ctx.headers doesn't exist!
|
|
714
|
+
const apiKey = ctx.headers?.get?.('x-api-key');
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
### ✅ CORRECT: Using ctx.request()
|
|
718
|
+
|
|
719
|
+
```typescript
|
|
720
|
+
const req = ctx.request();
|
|
721
|
+
const apiKey = req?.headers['x-api-key'];
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
---
|
|
725
|
+
|
|
726
|
+
### ❌ WRONG: Using fn() for external API
|
|
727
|
+
|
|
728
|
+
```typescript
|
|
729
|
+
// fn() doesn't have ctx.fetch - this will fail!
|
|
730
|
+
fn('call-api', async (ctx) => {
|
|
731
|
+
const client = await createClient(ctx); // ❌ Error!
|
|
732
|
+
});
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
### ✅ CORRECT: Using http() for external API
|
|
736
|
+
|
|
737
|
+
```typescript
|
|
738
|
+
http('call-api', { connection: 'fluent_commerce' }, async (ctx) => {
|
|
739
|
+
const client = await createClient(ctx); // ✅ Works!
|
|
740
|
+
});
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
---
|
|
744
|
+
|
|
745
|
+
## Version Compatibility
|
|
746
|
+
|
|
747
|
+
This reference is based on **@versori/run v0.4.4**.
|
|
748
|
+
|
|
749
|
+
**Major changes from v0.3.x**:
|
|
750
|
+
- ✅ Added `activation.connections` array
|
|
751
|
+
- ✅ Added `activation.environment` property
|
|
752
|
+
- ✅ Added `activation.dynamicVariables` property
|
|
753
|
+
- ⚠️ `schedule()` signature unchanged (never had 4th parameter)
|
|
754
|
+
|
|
755
|
+
**Migration**: If you're using old patterns from unofficial docs, update to correct patterns shown above.
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
759
|
+
## Related Documentation
|
|
760
|
+
|
|
761
|
+
- [Module 4: Workflows](./platforms-versori-04-workflows.md) - Practical workflow examples
|
|
762
|
+
- [Module 5: Connections](./platforms-versori-05-connections.md) - Connection management
|
|
763
|
+
|
|
764
|
+
---
|
|
765
|
+
|
|
766
|
+
[← Back to Versori Platform Guide](../platforms-versori-readme.md)
|