@duffel/components 2.7.20 → 3.0.0

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.
Files changed (345) hide show
  1. package/.circleci/config.yml +67 -0
  2. package/.eslintrc.js +47 -0
  3. package/.github/renovate.json +16 -0
  4. package/.github/workflows/autoapprove.yml +18 -0
  5. package/.github/workflows/release.yml +89 -0
  6. package/.husky/post-commit +4 -0
  7. package/.husky/pre-commit +4 -0
  8. package/.nvmrc +1 -0
  9. package/.prettierignore +2 -0
  10. package/.storybook/Storyshots.test.js +3 -0
  11. package/.storybook/__snapshots__/Storyshots.test.js.snap +48318 -0
  12. package/.storybook/main.ts +33 -0
  13. package/.storybook/preview.tsx +28 -0
  14. package/.tool-versions +1 -0
  15. package/CONTRIBUTING.md +83 -0
  16. package/README.md +53 -15
  17. package/__mocks__/styleMock.js +6 -0
  18. package/babel.config.js +20 -0
  19. package/commitlint.config.js +4 -0
  20. package/config/esbuild.base.config.js +18 -0
  21. package/config/esbuild.cdn.config.js +51 -0
  22. package/config/esbuild.dev.config.js +46 -0
  23. package/config/esbuild.react.config.js +42 -0
  24. package/jest.config.ts +14 -0
  25. package/package.json +135 -193
  26. package/react-dist/components/DuffelAncillaries/Card.d.ts +14 -0
  27. package/react-dist/components/DuffelAncillaries/Counter.d.ts +10 -0
  28. package/react-dist/components/DuffelAncillaries/DuffelAncillaries.d.ts +3 -0
  29. package/react-dist/components/DuffelAncillaries/DuffelAncillariesCustomElement.d.ts +13 -0
  30. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionCard.d.ts +11 -0
  31. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionController.d.ts +13 -0
  32. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionModal.d.ts +11 -0
  33. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionModalBody.d.ts +11 -0
  34. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionModalBodyPassenger.d.ts +13 -0
  35. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionModalFooter.d.ts +14 -0
  36. package/react-dist/components/DuffelAncillaries/bags/BaggageSelectionModalHeader.d.ts +9 -0
  37. package/react-dist/components/DuffelAncillaries/bags/IncludedBaggageBanner.d.ts +7 -0
  38. package/react-dist/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionCard.d.ts +10 -0
  39. package/react-dist/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModal.d.ts +11 -0
  40. package/react-dist/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalBody.d.ts +7 -0
  41. package/react-dist/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalBodyListItem.d.ts +4 -0
  42. package/react-dist/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalFooter.d.ts +11 -0
  43. package/react-dist/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalHeader.d.ts +2 -0
  44. package/react-dist/components/DuffelAncillaries/seats/Amenity.d.ts +6 -0
  45. package/react-dist/components/DuffelAncillaries/seats/DeckSelect.d.ts +15 -0
  46. package/react-dist/components/DuffelAncillaries/seats/Element.d.ts +15 -0
  47. package/react-dist/components/DuffelAncillaries/seats/EmptyElement.d.ts +2 -0
  48. package/react-dist/components/DuffelAncillaries/seats/ExitElement.d.ts +6 -0
  49. package/react-dist/components/DuffelAncillaries/seats/Legend.d.ts +12 -0
  50. package/react-dist/components/DuffelAncillaries/seats/Row.d.ts +13 -0
  51. package/react-dist/components/DuffelAncillaries/seats/RowSection.d.ts +17 -0
  52. package/react-dist/components/DuffelAncillaries/seats/SeatElement.d.ts +13 -0
  53. package/react-dist/components/DuffelAncillaries/seats/SeatInfo.d.ts +7 -0
  54. package/react-dist/components/DuffelAncillaries/seats/SeatMap.d.ts +12 -0
  55. package/react-dist/components/DuffelAncillaries/seats/SeatMapUnavailable.d.ts +2 -0
  56. package/react-dist/components/DuffelAncillaries/seats/SeatSelectionCard.d.ts +13 -0
  57. package/react-dist/components/DuffelAncillaries/seats/SeatSelectionModal.d.ts +13 -0
  58. package/react-dist/components/DuffelAncillaries/seats/SeatSelectionModalBody.d.ts +4 -0
  59. package/react-dist/components/DuffelAncillaries/seats/SeatSelectionModalFooter.d.ts +16 -0
  60. package/react-dist/components/DuffelAncillaries/seats/SeatSelectionModalHeader.d.ts +10 -0
  61. package/react-dist/components/DuffelAncillaries/seats/SeatUnavailable.d.ts +5 -0
  62. package/react-dist/components/DuffelPayments/DuffelPayments.d.ts +11 -0
  63. package/react-dist/components/DuffelPayments/DuffelPaymentsCustomElement.d.ts +14 -0
  64. package/react-dist/components/shared/AnimatedLoaderEllipsis.d.ts +2 -0
  65. package/react-dist/components/shared/Button.d.ts +23 -0
  66. package/react-dist/components/shared/ErrorBoundary.d.ts +13 -0
  67. package/react-dist/components/shared/FetchOfferErrorState.d.ts +5 -0
  68. package/react-dist/components/shared/Icon.d.ts +44 -0
  69. package/react-dist/components/shared/IconButton.d.ts +16 -0
  70. package/react-dist/components/shared/Modal.d.ts +11 -0
  71. package/react-dist/components/shared/NonIdealState.d.ts +4 -0
  72. package/react-dist/components/shared/Stamp.d.ts +7 -0
  73. package/react-dist/components/shared/Tabs.d.ts +16 -0
  74. package/react-dist/custom-elements.d.ts +6 -0
  75. package/react-dist/custom-elements.js +37 -0
  76. package/react-dist/custom-elements.js.map +7 -0
  77. package/react-dist/index.d.ts +7 -0
  78. package/react-dist/index.js +37 -0
  79. package/react-dist/index.js.map +7 -0
  80. package/react-dist/lib/captureErrorInSentry.d.ts +1 -0
  81. package/react-dist/lib/compileCreateOrderPayload.d.ts +14 -0
  82. package/react-dist/lib/createPriceFormatters.d.ts +12 -0
  83. package/react-dist/lib/fetchFromDuffelAPI.d.ts +8 -0
  84. package/react-dist/lib/fetchFromFixtures.d.ts +4 -0
  85. package/react-dist/lib/formatAvailableServices.d.ts +12 -0
  86. package/react-dist/lib/formatDate.d.ts +2 -0
  87. package/react-dist/lib/formatSeatMaps.d.ts +4 -0
  88. package/react-dist/lib/getBaggageServiceDescription.d.ts +2 -0
  89. package/react-dist/lib/getCabinsForSegmentAndDeck.d.ts +2 -0
  90. package/react-dist/lib/getCurrencyForSeatMaps.d.ts +10 -0
  91. package/react-dist/lib/getCurrencyForServices.d.ts +11 -0
  92. package/react-dist/lib/getFirstSeatElementMatchingCriteria.d.ts +3 -0
  93. package/react-dist/lib/getPassengerBySegmentList.d.ts +6 -0
  94. package/react-dist/lib/getPassengerInitials.d.ts +1 -0
  95. package/react-dist/lib/getPassengerMapById.d.ts +3 -0
  96. package/react-dist/lib/getPassengerName.d.ts +3 -0
  97. package/react-dist/lib/getRowNumber.d.ts +2 -0
  98. package/react-dist/lib/getSegmentList.d.ts +2 -0
  99. package/react-dist/lib/getServicePriceMapById.d.ts +3 -0
  100. package/react-dist/lib/getSymbols.d.ts +2 -0
  101. package/react-dist/lib/getTotalAmountForServices.d.ts +6 -0
  102. package/react-dist/lib/getTotalQuantity.d.ts +2 -0
  103. package/react-dist/lib/hasService.d.ts +2 -0
  104. package/react-dist/lib/hasServiceOfSameMetadataTypeAlreadyBeenSelected.d.ts +3 -0
  105. package/react-dist/lib/hasWings.d.ts +2 -0
  106. package/react-dist/lib/isBaggageService.d.ts +2 -0
  107. package/react-dist/lib/isCancelForAnyReasonService.d.ts +2 -0
  108. package/react-dist/lib/isFixtureOfferId.d.ts +2 -0
  109. package/react-dist/lib/isPayloadComplete.d.ts +2 -0
  110. package/react-dist/lib/isSeatElement.d.ts +2 -0
  111. package/react-dist/lib/logging.d.ts +46 -0
  112. package/react-dist/lib/moneyStringFormatter.d.ts +8 -0
  113. package/react-dist/lib/offerIsExpired.d.ts +2 -0
  114. package/react-dist/lib/retrieveOffer.d.ts +2 -0
  115. package/react-dist/lib/retrieveOfferFromDuffelAPI.d.ts +1 -0
  116. package/react-dist/lib/retrieveSeatMaps.d.ts +2 -0
  117. package/react-dist/lib/retrieveSeatMapsFromDuffelAPI.d.ts +1 -0
  118. package/react-dist/lib/setBodyScrollability.d.ts +1 -0
  119. package/react-dist/lib/validateProps.d.ts +7 -0
  120. package/react-dist/lib/withPlural.d.ts +1 -0
  121. package/react-dist/types/Aircraft.d.ts +14 -0
  122. package/react-dist/types/Airline.d.ts +14 -0
  123. package/react-dist/types/Airport.d.ts +44 -0
  124. package/react-dist/types/City.d.ts +18 -0
  125. package/react-dist/types/CreateOrderPayload.d.ts +72 -0
  126. package/react-dist/types/CurrencyConversion.d.ts +10 -0
  127. package/react-dist/types/DuffelAncillariesProps.d.ts +70 -0
  128. package/react-dist/types/Offer.d.ts +711 -0
  129. package/react-dist/types/Order.d.ts +8 -0
  130. package/react-dist/types/Place.d.ts +8 -0
  131. package/react-dist/types/SeatMap.d.ts +190 -0
  132. package/react-dist/types/index.d.ts +11 -0
  133. package/scripts/generate-fixture.ts +200 -0
  134. package/scripts/upload-to-cdn.sh +34 -0
  135. package/scripts.tsconfig.json +11 -0
  136. package/src/components/DuffelAncillaries/Card.tsx +126 -0
  137. package/src/components/DuffelAncillaries/Counter.tsx +40 -0
  138. package/src/components/DuffelAncillaries/DuffelAncillaries.tsx +344 -0
  139. package/src/components/DuffelAncillaries/DuffelAncillariesCustomElement.tsx +124 -0
  140. package/src/components/DuffelAncillaries/bags/BaggageSelectionCard.tsx +96 -0
  141. package/src/components/DuffelAncillaries/bags/BaggageSelectionController.tsx +88 -0
  142. package/src/components/DuffelAncillaries/bags/BaggageSelectionModal.tsx +81 -0
  143. package/src/components/DuffelAncillaries/bags/BaggageSelectionModalBody.tsx +60 -0
  144. package/src/components/DuffelAncillaries/bags/BaggageSelectionModalBodyPassenger.tsx +122 -0
  145. package/src/components/DuffelAncillaries/bags/BaggageSelectionModalFooter.tsx +81 -0
  146. package/src/components/DuffelAncillaries/bags/BaggageSelectionModalHeader.tsx +76 -0
  147. package/src/components/DuffelAncillaries/bags/IncludedBaggageBanner.tsx +51 -0
  148. package/src/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionCard.tsx +90 -0
  149. package/src/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModal.tsx +63 -0
  150. package/src/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalBody.tsx +56 -0
  151. package/src/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalBodyListItem.tsx +11 -0
  152. package/src/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalFooter.tsx +74 -0
  153. package/src/components/DuffelAncillaries/cancel_for_any_reason/CfarSelectionModalHeader.tsx +9 -0
  154. package/src/components/DuffelAncillaries/seats/Amenity.tsx +21 -0
  155. package/src/components/DuffelAncillaries/seats/DeckSelect.tsx +27 -0
  156. package/src/components/DuffelAncillaries/seats/Element.tsx +52 -0
  157. package/src/components/DuffelAncillaries/seats/EmptyElement.tsx +5 -0
  158. package/src/components/DuffelAncillaries/seats/ExitElement.tsx +17 -0
  159. package/src/components/DuffelAncillaries/seats/Legend.tsx +60 -0
  160. package/src/components/DuffelAncillaries/seats/Row.tsx +47 -0
  161. package/src/components/DuffelAncillaries/seats/RowSection.tsx +78 -0
  162. package/src/components/DuffelAncillaries/seats/SeatElement.tsx +120 -0
  163. package/src/components/DuffelAncillaries/seats/SeatInfo.tsx +32 -0
  164. package/src/components/DuffelAncillaries/seats/SeatMap.tsx +81 -0
  165. package/src/components/DuffelAncillaries/seats/SeatMapUnavailable.tsx +21 -0
  166. package/src/components/DuffelAncillaries/seats/SeatSelectionCard.tsx +103 -0
  167. package/src/components/DuffelAncillaries/seats/SeatSelectionModal.tsx +142 -0
  168. package/src/components/DuffelAncillaries/seats/SeatSelectionModalBody.tsx +13 -0
  169. package/src/components/DuffelAncillaries/seats/SeatSelectionModalFooter.tsx +82 -0
  170. package/src/components/DuffelAncillaries/seats/SeatSelectionModalHeader.tsx +87 -0
  171. package/src/components/DuffelAncillaries/seats/SeatUnavailable.tsx +14 -0
  172. package/src/components/DuffelPayments/DuffelPayments.tsx +218 -0
  173. package/src/components/DuffelPayments/DuffelPaymentsCustomElement.tsx +130 -0
  174. package/src/components/shared/AnimatedLoaderEllipsis.tsx +5 -0
  175. package/src/components/shared/Button.tsx +63 -0
  176. package/src/components/shared/ErrorBoundary.tsx +54 -0
  177. package/src/components/shared/FetchOfferErrorState.tsx +35 -0
  178. package/src/components/shared/Icon.tsx +152 -0
  179. package/src/components/shared/IconButton.tsx +42 -0
  180. package/src/components/shared/Modal.tsx +40 -0
  181. package/src/components/shared/NonIdealState.tsx +28 -0
  182. package/src/components/shared/Stamp.tsx +29 -0
  183. package/src/components/shared/Tabs.tsx +36 -0
  184. package/src/custom-elements.ts +13 -0
  185. package/src/examples/client-side/README.md +30 -0
  186. package/src/examples/client-side/index.html +57 -0
  187. package/src/examples/full-stack/README.md +34 -0
  188. package/src/examples/full-stack/index.html +48 -0
  189. package/src/examples/full-stack/server.mjs +158 -0
  190. package/src/examples/just-typescript/README.md +37 -0
  191. package/src/examples/just-typescript/package.json +16 -0
  192. package/src/examples/just-typescript/src/index.html +23 -0
  193. package/src/examples/just-typescript/src/index.ts +36 -0
  194. package/src/examples/just-typescript/yarn.lock +154 -0
  195. package/src/examples/payments-custom-element/README.md +17 -0
  196. package/src/examples/payments-custom-element/index.html +43 -0
  197. package/src/examples/payments-just-typescript/README.md +37 -0
  198. package/src/examples/payments-just-typescript/package.json +16 -0
  199. package/src/examples/payments-just-typescript/src/index.html +23 -0
  200. package/src/examples/payments-just-typescript/src/index.ts +18 -0
  201. package/src/examples/payments-just-typescript/yarn.lock +154 -0
  202. package/src/examples/react-app/README.md +37 -0
  203. package/src/examples/react-app/package.json +20 -0
  204. package/src/examples/react-app/src/index.html +19 -0
  205. package/src/examples/react-app/src/index.tsx +48 -0
  206. package/src/examples/react-app/yarn.lock +219 -0
  207. package/src/fixtures/offers/off_0000AUde3KwTztSRK1cznH.json +497 -0
  208. package/src/fixtures/offers/off_0000AVx4lUFFKW8PsPeQeQ.json +307 -0
  209. package/src/fixtures/offers/off_1.json +497 -0
  210. package/src/fixtures/passengers/mock_passengers.ts +26 -0
  211. package/src/fixtures/seat-maps/off_0000AUde3KwTztSRK1cznH.json +6852 -0
  212. package/src/fixtures/seat-maps/off_0000AVx4lUFFKW8PsPeQeQ.json +1 -0
  213. package/src/fixtures/seat-maps/off_1.json +6852 -0
  214. package/src/index.ts +7 -0
  215. package/src/lib/captureErrorInSentry.ts +42 -0
  216. package/src/lib/compileCreateOrderPayload.ts +63 -0
  217. package/src/lib/createPriceFormatters.ts +73 -0
  218. package/src/lib/fetchFromDuffelAPI.ts +54 -0
  219. package/src/lib/fetchFromFixtures.ts +18 -0
  220. package/src/lib/formatAvailableServices.ts +91 -0
  221. package/src/lib/formatDate.ts +20 -0
  222. package/src/lib/formatSeatMaps.ts +81 -0
  223. package/src/lib/getBaggageServiceDescription.ts +42 -0
  224. package/src/lib/getCabinsForSegmentAndDeck.ts +4 -0
  225. package/src/lib/getCurrencyForSeatMaps.ts +22 -0
  226. package/src/lib/getCurrencyForServices.ts +24 -0
  227. package/src/lib/getFirstSeatElementMatchingCriteria.ts +22 -0
  228. package/src/lib/getPassengerBySegmentList.ts +10 -0
  229. package/src/lib/getPassengerInitials.ts +6 -0
  230. package/src/lib/getPassengerMapById.ts +17 -0
  231. package/src/lib/getPassengerName.ts +37 -0
  232. package/src/lib/getRowNumber.ts +16 -0
  233. package/src/lib/getSegmentList.ts +7 -0
  234. package/src/lib/getServicePriceMapById.ts +20 -0
  235. package/src/lib/getSymbols.ts +22 -0
  236. package/src/lib/getTotalAmountForServices.ts +72 -0
  237. package/src/lib/getTotalQuantity.ts +5 -0
  238. package/src/lib/hasService.ts +24 -0
  239. package/src/lib/hasServiceOfSameMetadataTypeAlreadyBeenSelected.ts +35 -0
  240. package/src/lib/hasWings.ts +8 -0
  241. package/src/lib/isBaggageService.ts +8 -0
  242. package/src/lib/isCancelForAnyReasonService.ts +9 -0
  243. package/src/lib/isFixtureOfferId.ts +4 -0
  244. package/src/lib/isPayloadComplete.ts +11 -0
  245. package/src/lib/isSeatElement.ts +10 -0
  246. package/src/lib/logging.ts +120 -0
  247. package/src/lib/moneyStringFormatter.ts +34 -0
  248. package/src/lib/offerIsExpired.ts +5 -0
  249. package/src/lib/retrieveOffer.ts +54 -0
  250. package/src/lib/retrieveOfferFromDuffelAPI.ts +13 -0
  251. package/src/lib/retrieveSeatMaps.ts +55 -0
  252. package/src/lib/retrieveSeatMapsFromDuffelAPI.ts +13 -0
  253. package/src/lib/setBodyScrollability.ts +7 -0
  254. package/src/lib/validateProps.ts +37 -0
  255. package/src/lib/withPlural.ts +8 -0
  256. package/src/stories/BaggageSelectionModalHeader.stories.tsx +21 -0
  257. package/src/stories/Button.stories.tsx +69 -0
  258. package/src/stories/DuffelAncillaries.stories.tsx +126 -0
  259. package/src/stories/DuffelPayments.stories.tsx +34 -0
  260. package/src/stories/Icon.stories.tsx +35 -0
  261. package/src/stories/IconButton.stories.tsx +25 -0
  262. package/src/styles/colors.css +22 -0
  263. package/src/styles/components/Amenity.css +23 -0
  264. package/src/styles/components/BaggageDisplay.css +25 -0
  265. package/src/styles/components/Button.css +161 -0
  266. package/src/styles/components/Card.css +52 -0
  267. package/src/styles/components/CfarSelectionModal.css +34 -0
  268. package/src/styles/components/Counter.css +18 -0
  269. package/src/styles/components/DuffelPayments.css +42 -0
  270. package/src/styles/components/IconButton.css +63 -0
  271. package/src/styles/components/Legend.css +58 -0
  272. package/src/styles/components/Loader.css +37 -0
  273. package/src/styles/components/LoadingState.css +81 -0
  274. package/src/styles/components/Modal.css +84 -0
  275. package/src/styles/components/PassengerSelect.css +93 -0
  276. package/src/styles/components/PassengersLayout.css +90 -0
  277. package/src/styles/components/Row.css +70 -0
  278. package/src/styles/components/Seat.css +57 -0
  279. package/src/styles/components/SeatInfo.css +61 -0
  280. package/src/styles/components/SeatMap.css +24 -0
  281. package/src/styles/components/SeatSelect.css +92 -0
  282. package/src/styles/components/Segment.css +17 -0
  283. package/src/styles/components/SelectionSegment.css +10 -0
  284. package/src/styles/components/Summary.css +70 -0
  285. package/src/styles/components/Tabs.css +49 -0
  286. package/src/styles/flex.css +5 -0
  287. package/src/styles/font-families.css +47 -0
  288. package/src/styles/global.css +51 -0
  289. package/src/styles/margin.css +3 -0
  290. package/src/styles/spacing.css +18 -0
  291. package/src/styles/transitions.css +3 -0
  292. package/src/styles/typography.css +13 -0
  293. package/src/tests/components/DuffelAncillaries.test.tsx +342 -0
  294. package/src/tests/lib/createPriceFormatters.test.tsx +152 -0
  295. package/src/tests/lib/formatAvailableServices.test.tsx +79 -0
  296. package/src/tests/lib/formatSeatMaps.test.tsx +49 -0
  297. package/src/tests/lib/getCurrencyForServices.test.tsx +44 -0
  298. package/src/tests/lib/hasServiceOfSameMetadataTypeAlreadyBeenSelected.test.ts +86 -0
  299. package/src/tests/lib/logging.test.tsx +32 -0
  300. package/src/tests/lib/moneyStringFormatter.test.tsx +12 -0
  301. package/src/tests/lib/validateProps.test.tsx +57 -0
  302. package/src/types/Aircraft.ts +16 -0
  303. package/src/types/Airline.ts +16 -0
  304. package/src/types/Airport.ts +54 -0
  305. package/src/types/City.ts +21 -0
  306. package/src/types/CreateOrderPayload.ts +99 -0
  307. package/src/types/CurrencyConversion.ts +10 -0
  308. package/src/types/DuffelAncillariesProps.ts +108 -0
  309. package/src/types/Offer.ts +851 -0
  310. package/src/types/Order.ts +6 -0
  311. package/src/types/Place.ts +6 -0
  312. package/src/types/SeatMap.ts +231 -0
  313. package/src/types/index.ts +11 -0
  314. package/tsconfig.json +52 -0
  315. package/LICENSE +0 -21
  316. package/dist/AdditionalBaggage.esm.js +0 -1
  317. package/dist/AdditionalBaggage.js +0 -1
  318. package/dist/AdditionalBaggage.min.css +0 -408
  319. package/dist/AdditionalBaggage.umd.min.js +0 -2
  320. package/dist/AdditionalBaggage.umd.min.js.LICENSE.txt +0 -60
  321. package/dist/AdditionalBaggageSelection.esm.js +0 -1
  322. package/dist/AdditionalBaggageSelection.js +0 -1
  323. package/dist/AdditionalBaggageSelection.min.css +0 -744
  324. package/dist/AdditionalBaggageSelection.umd.min.js +0 -2
  325. package/dist/AdditionalBaggageSelection.umd.min.js.LICENSE.txt +0 -93
  326. package/dist/CardPayment.esm.js +0 -2
  327. package/dist/CardPayment.esm.js.LICENSE.txt +0 -6
  328. package/dist/CardPayment.js +0 -2
  329. package/dist/CardPayment.js.LICENSE.txt +0 -6
  330. package/dist/CardPayment.min.css +0 -233
  331. package/dist/CardPayment.umd.min.js +0 -2
  332. package/dist/CardPayment.umd.min.js.LICENSE.txt +0 -61
  333. package/dist/SeatSelection.esm.js +0 -1
  334. package/dist/SeatSelection.js +0 -1
  335. package/dist/SeatSelection.min.css +0 -1127
  336. package/dist/SeatSelection.umd.min.js +0 -2
  337. package/dist/SeatSelection.umd.min.js.LICENSE.txt +0 -60
  338. package/dist/duffel-components.d.ts +0 -1614
  339. package/dist/duffel-components.esm.js +0 -2
  340. package/dist/duffel-components.esm.js.LICENSE.txt +0 -6
  341. package/dist/duffel-components.js +0 -2
  342. package/dist/duffel-components.js.LICENSE.txt +0 -6
  343. package/dist/duffel-components.min.css +0 -1280
  344. package/dist/duffel-components.umd.min.js +0 -2
  345. package/dist/duffel-components.umd.min.js.LICENSE.txt +0 -102
@@ -0,0 +1,30 @@
1
+ # duffel-components client-side example
2
+
3
+ ## Setup
4
+
5
+ ```sh
6
+ # .env.local
7
+
8
+ # The Duffel API environment we want to make requests to.
9
+ # Remember to update the key below if this value changes.
10
+ # DUFFEL_API_URL=https://api.duffel.com # production
11
+ DUFFEL_API_URL=https://localhost:4000 # development (for Duffel engineers only)
12
+
13
+ # Used to authenticate our
14
+ # example server to talk to Duffel
15
+ # DUFFEL_API_TOKEN=duffel_test_**** # production
16
+ DUFFEL_API_TOKEN=test_duffel_dev_rw # development (for Duffel engineers only)
17
+
18
+
19
+ # The url for the component CDN.
20
+ # This is used to load both the styles an
21
+ # COMPONENT_CDN=https://assets.duffel.com/components/ancillaries/VERSION # production
22
+ COMPONENT_CDN=http://localhost:8000 # development
23
+ ```
24
+
25
+ ## Run the example
26
+
27
+ This is a basic example that doesn't rely on the Duffel API, from the root of the repository run `yarn run-example:client-side`. This command will:
28
+
29
+ 1. Serve the Duffel component bundle and watch for changes to rebuild on port `8000`. This can also be done with `yarn dev`
30
+ 2. Host a basic `index.html` with `http-server`. The example page will be ready on port `6262`. This can be done with `yarn run-client-side-server`
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Checkout page example</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link
7
+ rel="icon"
8
+ type="image/png"
9
+ sizes="96x96"
10
+ href="https://duffel.com/images/favicon/favicon-96x96.png"
11
+ />
12
+
13
+ <!-- 1. This script loads duffel-components -->
14
+ <script src="http://localhost:8000/duffel-ancillaries.js"></script>
15
+ </head>
16
+
17
+ <body style="font-family: sans-serif">
18
+ <h1>Checkout page</h1>
19
+
20
+ <!-- 2. Add the custom element to your markup where you want to render the ancillaries card -->
21
+ <duffel-ancillaries></duffel-ancillaries>
22
+ </body>
23
+ <script>
24
+ const duffelAncillariesElement =
25
+ document.querySelector("duffel-ancillaries");
26
+
27
+ // 3. Render the component with the required data, you can safely call this function as many times as you want. E.g. when your passenger data changes.
28
+ duffelAncillariesElement.render({
29
+ offer_id: "fixture_off_1",
30
+ services: ["bags", "seats", "cancel_for_any_reason"],
31
+ passengers: [
32
+ {
33
+ given_name: "Mae",
34
+ family_name: "Jemison",
35
+ gender: "F",
36
+ title: "dr",
37
+ born_on: "1956-10-17",
38
+ email: "m.jemison@nasa.gov",
39
+ phone_number: "+16177562626",
40
+ },
41
+ {
42
+ given_name: "Dorothy",
43
+ family_name: "Green",
44
+ gender: "F",
45
+ title: "dr",
46
+ born_on: "1942-10-17",
47
+ },
48
+ ],
49
+ debug: true,
50
+ });
51
+
52
+ // 4. Listen to 'onPayloadReady' event on the component. `event.detail.data` contains the payload you need to send to Duffel's API to create an order.
53
+ duffelAncillariesElement.addEventListener("onPayloadReady", (event) =>
54
+ console.log("onPayloadReady\n", event.detail)
55
+ );
56
+ </script>
57
+ </html>
@@ -0,0 +1,34 @@
1
+ # duffel-components full-stack example
2
+
3
+ ## Setup
4
+
5
+ ```sh
6
+ # .env.local
7
+
8
+ # The Duffel API environment we want to make requests to.
9
+ # Remember to update the key below if this value changes.
10
+ # DUFFEL_API_URL=https://api.duffel.com # production
11
+ DUFFEL_API_URL=https://localhost:4000 # development (for Duffel engineers only)
12
+
13
+ # Used to authenticate our
14
+ # example server to talk to Duffel
15
+ # DUFFEL_API_TOKEN=duffel_test_**** # production (find it on https://app.duffel.com/YOUR_ORG/test/developers/tokens)
16
+ DUFFEL_API_TOKEN=test_duffel_dev_rw # development (for Duffel engineers only)
17
+
18
+
19
+ # The url for the component CDN.
20
+ # This is used to load both the styles an
21
+ # COMPONENT_CDN=https://assets.duffel.com/components/ancillaries/VERSION # production
22
+ COMPONENT_CDN=http://localhost:8000 # development
23
+ ```
24
+
25
+ ## Run the example
26
+
27
+ This example has a server that will reach out to the Duffel API to search and retrieve an offer.
28
+ To talk to the API we'll define the url to the API environment we want and .
29
+ Please add the following to `.env.local`:
30
+
31
+ This is a 'real life' example, where it uses a real offer ID and client key retrieved from the Duffel API. To run this, use `yarn run-example:full-stack`. This command will:
32
+
33
+ 1. Serve the Duffel component bundle and watch for changes to rebuild on port `8000`. This can also be done with `yarn dev`
34
+ 2. Run the full stack server using node. The example page will be ready on port `6262`. This can be done with `yarn run-full-stack-server`
@@ -0,0 +1,48 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Checkout page example</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link
7
+ rel="icon"
8
+ type="image/png"
9
+ sizes="96x96"
10
+ href="https://duffel.com/images/favicon/favicon-96x96.png"
11
+ />
12
+
13
+ <!-- 1. This script loads duffel-components -->
14
+ <script src="http://localhost:8000/duffel-ancillaries.js"></script>
15
+ </head>
16
+
17
+ <body style="font-family: sans-serif">
18
+ <h1>Checkout page</h1>
19
+
20
+ <!-- 2. Add the custom element to your markup where you want to render the ancillaries card -->
21
+ <duffel-ancillaries></duffel-ancillaries>
22
+ </body>
23
+ <script>
24
+ const duffelAncillariesElement =
25
+ document.querySelector("duffel-ancillaries");
26
+
27
+ // 3. Render the component with the required data, you can safely call this function as many times as you want. E.g. when your passenger data changes.
28
+ duffelAncillariesElement.render({
29
+ offer_id: "__OFFER_ID__",
30
+ client_key: "__CLIENT_KEY__",
31
+ passengers: "__PASSENGERS__",
32
+ services: ["seats", "bags", "cancel_for_any_reason"],
33
+ debug: true,
34
+ });
35
+
36
+ // 4. Listen to 'onPayloadReady' event on the component. `event.detail.data` contains the payload you need to send to Duffel's API to create an order.
37
+ duffelAncillariesElement.addEventListener("onPayloadReady", (event) => {
38
+ console.log("onPayloadReady\n", event.detail);
39
+ const body = JSON.stringify({ data: event.detail.data });
40
+
41
+ // 5. Send the order creation payload to your server to create an order with the Duffel API.
42
+ fetch("/book", { method: "POST", body })
43
+ .then((response) => response.json())
44
+ .then(({ data }) => console.log("Order created", data))
45
+ .catch((error) => console.error("Order creation failed", error));
46
+ });
47
+ </script>
48
+ </html>
@@ -0,0 +1,158 @@
1
+ import dotenv from "dotenv";
2
+ import { readFileSync } from "fs";
3
+ import http from "http";
4
+
5
+ /* https://nodejs.org/api/cli.html#node_tls_reject_unauthorizedvalue */
6
+ process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
7
+
8
+ dotenv.config({ path: ".env.local" });
9
+
10
+ if (process.env.DUFFEL_API_URL === undefined) {
11
+ throw new Error("process.env.DUFFEL_API_URL is required but missing");
12
+ }
13
+
14
+ if (process.env.DUFFEL_API_TOKEN === undefined) {
15
+ throw new Error("process.env.DUFFEL_API_TOKEN is required but missing");
16
+ }
17
+
18
+ const makeMockDateInTheFuture = (daysAhead) => {
19
+ const now = new Date(Date.now());
20
+ now.setDate(now.getDate() + daysAhead);
21
+ return now;
22
+ };
23
+
24
+ const duffelHeaders = {
25
+ "Duffel-Version": "v1",
26
+ "Accept-Encoding": "gzip",
27
+ Accept: "application/json",
28
+ "Content-Type": "application/json",
29
+ Authorization: `Bearer ${process.env.DUFFEL_API_TOKEN}`,
30
+ };
31
+
32
+ let searchRoundTripOnDuffelResultCache = null;
33
+ const searchRoundTripOnDuffel = async (origin, destination) => {
34
+ if (searchRoundTripOnDuffelResultCache !== null) {
35
+ return searchRoundTripOnDuffelResultCache;
36
+ }
37
+
38
+ const payload = {
39
+ data: {
40
+ slices: [
41
+ {
42
+ origin,
43
+ destination,
44
+ departure_date: makeMockDateInTheFuture(7)
45
+ .toISOString()
46
+ .split("T")[0],
47
+ },
48
+ {
49
+ origin: destination,
50
+ destination: origin,
51
+ departure_date: makeMockDateInTheFuture(14)
52
+ .toISOString()
53
+ .split("T")[0],
54
+ },
55
+ ],
56
+ passengers: [{ type: "adult" }],
57
+ requested_sources: ["duffel_airways"],
58
+ },
59
+ };
60
+
61
+ const { data: offerRequest } = await (
62
+ await fetch(
63
+ process.env.DUFFEL_API_URL + "/air/offer_requests?return_offers=true",
64
+ {
65
+ method: "POST",
66
+ body: JSON.stringify(payload),
67
+ headers: duffelHeaders,
68
+ }
69
+ )
70
+ ).json();
71
+
72
+ searchRoundTripOnDuffelResultCache = offerRequest;
73
+ return searchRoundTripOnDuffelResultCache;
74
+ };
75
+
76
+ const createOrderOnDuffel = async (request, response) => {
77
+ const createOrderOnDuffelResponse = await fetch(
78
+ process.env.DUFFEL_API_URL + "/air/orders",
79
+ {
80
+ method: "POST",
81
+ headers: duffelHeaders,
82
+ body: request,
83
+ duplex: "half",
84
+ }
85
+ );
86
+
87
+ response.writeHead(createOrderOnDuffelResponse.status, {
88
+ "Content-type": "application/json",
89
+ });
90
+ response.write(await createOrderOnDuffelResponse.text());
91
+ response.end();
92
+ };
93
+
94
+ const ROUTES = {
95
+ "/": async function index(request, response) {
96
+ const offerRequest = await searchRoundTripOnDuffel("JFK", "MIA");
97
+ const offer = offerRequest.offers[0];
98
+
99
+ if (!offer) {
100
+ response.writeHead(404);
101
+ response.end(http.STATUS_CODES[404]);
102
+ return;
103
+ }
104
+
105
+ const passengers = [
106
+ {
107
+ id: offer.passengers[0].id,
108
+ given_name: "Mae",
109
+ family_name: "Jemison",
110
+ gender: "F",
111
+ title: "dr",
112
+ born_on: "1956-10-17",
113
+ email: "m.jemison@nasa.gov",
114
+ phone_number: "+16177562626",
115
+ },
116
+ ];
117
+
118
+ const template = readFileSync("src/examples/full-stack/index.html", {
119
+ encoding: "utf-8",
120
+ });
121
+
122
+ const withOfferId = template.replace("__OFFER_ID__", offer.id);
123
+ const withclientKey = withOfferId.replace(
124
+ "__CLIENT_KEY__",
125
+ offerRequest.client_key
126
+ );
127
+ const withPassengers = withclientKey.replace(
128
+ `"__PASSENGERS__"`,
129
+ `${JSON.stringify(passengers)}`
130
+ );
131
+
132
+ response.writeHead(200);
133
+ response.end(withPassengers);
134
+ },
135
+ "/book": async function book(request, response) {
136
+ if (request.method != "POST") {
137
+ response.writeHead(404);
138
+ response.end(http.STATUS_CODES[404]);
139
+ return;
140
+ }
141
+
142
+ await createOrderOnDuffel(request, response);
143
+ },
144
+ };
145
+
146
+ http
147
+ .createServer(function (request, response) {
148
+ if (request.url in ROUTES) {
149
+ return ROUTES[request.url](request, response);
150
+ }
151
+
152
+ response.writeHead(404);
153
+ response.end(http.STATUS_CODES[404]);
154
+ })
155
+ .listen(6262);
156
+
157
+ // eslint-disable-next-line
158
+ console.log(`\n🐄 Serving example on http://localhost:6262`);
@@ -0,0 +1,37 @@
1
+ # duffel-components typescript example
2
+
3
+ ## TL;DR
4
+
5
+ Start on the root of the `duffel-components` repository:
6
+
7
+ ```sh
8
+ # build duffel-components for react env:
9
+ yarn react-build
10
+
11
+ # change directory to example folder
12
+ cd src/examples/just-typescript
13
+
14
+ # cleanup last install and build
15
+ rm -rf node_modules && rm -rf dist
16
+
17
+ # install new version
18
+ yarn
19
+
20
+ # build and watch example
21
+ yarn build
22
+
23
+ # open example
24
+ open src/index.html -a "Safari"
25
+ ```
26
+
27
+ ## Build duffel-components
28
+
29
+ First, navigate to the root folder of the duffel-components repository and run `yarn react-build` to build the package. It should output a react-dist folder on the root. This folder is the one we reference on `src/examples/just-typescript/package.json` dependencies under `duffel-components`
30
+
31
+ ## Install dependencies
32
+
33
+ Once the package is built, you can cd into this directory and run `yarn` to install all dependencies. If there are changes to `react-dist` since your last install, you'll need to `rm -rf node_modules`, otherwise the updates build will not be installed.
34
+
35
+ ## Run example
36
+
37
+ Finally, run `yarn dev` to build `src/examples/just-typescript/src/index.tsx`. This will produce `src/examples/just-typescript/dist` folder that is referenced by `src/examples/just-typescript/src/index.html`. You can then open `src/examples/just-typescript/src/index.html` on your browser to see the example up and running.
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "just-typescript",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "build": "esbuild src/index.ts --bundle --outfile=dist/index.js"
7
+ },
8
+ "dependencies": {
9
+ "@types/node": "20.2.5",
10
+ "typescript": "5.0.4",
11
+ "duffel-components": "../../../../duffel-components/react-dist"
12
+ },
13
+ "devDependencies": {
14
+ "esbuild": "^0.17.19"
15
+ }
16
+ }
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link
7
+ rel="icon"
8
+ type="image/png"
9
+ sizes="96x96"
10
+ href="https://duffel.com/images/favicon/favicon-96x96.png"
11
+ />
12
+
13
+ <script src="../dist/index.js" defer></script>
14
+ <title>ancillaries component just typescript example</title>
15
+ </head>
16
+ <body>
17
+ <h1 style="margin-bottom: 2rem">
18
+ Duffel ancillaries component just typescript example
19
+ </h1>
20
+
21
+ <duffel-ancillaries></duffel-ancillaries>
22
+ </body>
23
+ </html>
@@ -0,0 +1,36 @@
1
+ import {
2
+ onDuffelAncillariesPayloadReady,
3
+ renderDuffelAncillariesCustomElement,
4
+ } from "duffel-components/custom-elements";
5
+
6
+ window.onload = () => {
7
+ renderDuffelAncillariesCustomElement({
8
+ offer_id: "fixture_off_1",
9
+ services: ["bags", "seats", "cancel_for_any_reason"],
10
+ passengers: [
11
+ {
12
+ id: "pas_0000AUde3KY1SptM6ABSfT",
13
+ given_name: "Mae",
14
+ family_name: "Jemison",
15
+ gender: "F",
16
+ title: "dr",
17
+ born_on: "1956-10-17",
18
+ email: "m.jemison@nasa.gov",
19
+ phone_number: "+16177562626",
20
+ },
21
+ {
22
+ id: "pas_0000AUde3KY1SptM6ABSfU",
23
+ given_name: "Dorothy",
24
+ family_name: "Green",
25
+ gender: "F",
26
+ title: "dr",
27
+ born_on: "1942-10-17",
28
+ },
29
+ ],
30
+ });
31
+ onDuffelAncillariesPayloadReady((data, metadata) => {
32
+ /* eslint-disable */
33
+ console.table(data);
34
+ console.table(metadata);
35
+ });
36
+ };
@@ -0,0 +1,154 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@esbuild/android-arm64@0.17.19":
6
+ version "0.17.19"
7
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd"
8
+ integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==
9
+
10
+ "@esbuild/android-arm@0.17.19":
11
+ version "0.17.19"
12
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d"
13
+ integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==
14
+
15
+ "@esbuild/android-x64@0.17.19":
16
+ version "0.17.19"
17
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1"
18
+ integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==
19
+
20
+ "@esbuild/darwin-arm64@0.17.19":
21
+ version "0.17.19"
22
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276"
23
+ integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==
24
+
25
+ "@esbuild/darwin-x64@0.17.19":
26
+ version "0.17.19"
27
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb"
28
+ integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==
29
+
30
+ "@esbuild/freebsd-arm64@0.17.19":
31
+ version "0.17.19"
32
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2"
33
+ integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==
34
+
35
+ "@esbuild/freebsd-x64@0.17.19":
36
+ version "0.17.19"
37
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4"
38
+ integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==
39
+
40
+ "@esbuild/linux-arm64@0.17.19":
41
+ version "0.17.19"
42
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb"
43
+ integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==
44
+
45
+ "@esbuild/linux-arm@0.17.19":
46
+ version "0.17.19"
47
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a"
48
+ integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==
49
+
50
+ "@esbuild/linux-ia32@0.17.19":
51
+ version "0.17.19"
52
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a"
53
+ integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==
54
+
55
+ "@esbuild/linux-loong64@0.17.19":
56
+ version "0.17.19"
57
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72"
58
+ integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==
59
+
60
+ "@esbuild/linux-mips64el@0.17.19":
61
+ version "0.17.19"
62
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289"
63
+ integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==
64
+
65
+ "@esbuild/linux-ppc64@0.17.19":
66
+ version "0.17.19"
67
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7"
68
+ integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==
69
+
70
+ "@esbuild/linux-riscv64@0.17.19":
71
+ version "0.17.19"
72
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09"
73
+ integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==
74
+
75
+ "@esbuild/linux-s390x@0.17.19":
76
+ version "0.17.19"
77
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829"
78
+ integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==
79
+
80
+ "@esbuild/linux-x64@0.17.19":
81
+ version "0.17.19"
82
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4"
83
+ integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==
84
+
85
+ "@esbuild/netbsd-x64@0.17.19":
86
+ version "0.17.19"
87
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462"
88
+ integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==
89
+
90
+ "@esbuild/openbsd-x64@0.17.19":
91
+ version "0.17.19"
92
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691"
93
+ integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==
94
+
95
+ "@esbuild/sunos-x64@0.17.19":
96
+ version "0.17.19"
97
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273"
98
+ integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==
99
+
100
+ "@esbuild/win32-arm64@0.17.19":
101
+ version "0.17.19"
102
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f"
103
+ integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==
104
+
105
+ "@esbuild/win32-ia32@0.17.19":
106
+ version "0.17.19"
107
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03"
108
+ integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==
109
+
110
+ "@esbuild/win32-x64@0.17.19":
111
+ version "0.17.19"
112
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061"
113
+ integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==
114
+
115
+ "@types/node@20.2.5":
116
+ version "20.2.5"
117
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb"
118
+ integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==
119
+
120
+ duffel-components@../../../../duffel-components/react-dist:
121
+ version "0.0.0"
122
+
123
+ esbuild@^0.17.19:
124
+ version "0.17.19"
125
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955"
126
+ integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==
127
+ optionalDependencies:
128
+ "@esbuild/android-arm" "0.17.19"
129
+ "@esbuild/android-arm64" "0.17.19"
130
+ "@esbuild/android-x64" "0.17.19"
131
+ "@esbuild/darwin-arm64" "0.17.19"
132
+ "@esbuild/darwin-x64" "0.17.19"
133
+ "@esbuild/freebsd-arm64" "0.17.19"
134
+ "@esbuild/freebsd-x64" "0.17.19"
135
+ "@esbuild/linux-arm" "0.17.19"
136
+ "@esbuild/linux-arm64" "0.17.19"
137
+ "@esbuild/linux-ia32" "0.17.19"
138
+ "@esbuild/linux-loong64" "0.17.19"
139
+ "@esbuild/linux-mips64el" "0.17.19"
140
+ "@esbuild/linux-ppc64" "0.17.19"
141
+ "@esbuild/linux-riscv64" "0.17.19"
142
+ "@esbuild/linux-s390x" "0.17.19"
143
+ "@esbuild/linux-x64" "0.17.19"
144
+ "@esbuild/netbsd-x64" "0.17.19"
145
+ "@esbuild/openbsd-x64" "0.17.19"
146
+ "@esbuild/sunos-x64" "0.17.19"
147
+ "@esbuild/win32-arm64" "0.17.19"
148
+ "@esbuild/win32-ia32" "0.17.19"
149
+ "@esbuild/win32-x64" "0.17.19"
150
+
151
+ typescript@5.0.4:
152
+ version "5.0.4"
153
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"
154
+ integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==
@@ -0,0 +1,17 @@
1
+ # Duffel payments custom element example
2
+
3
+ ## Setup
4
+
5
+ ```sh
6
+ # .env.local
7
+
8
+ # The url for the component CDN.
9
+ # This is used to load both the styles an
10
+ # COMPONENT_CDN=https://assets.duffel.com/components/ancillaries/VERSION # production
11
+ COMPONENT_CDN=http://localhost:8000 # development
12
+ ```
13
+
14
+ ## Run the example
15
+
16
+ 1. Serve the Duffel component bundle and watch for changes to rebuild on port `8000` using `yarn dev`.
17
+ 2. Open `src/examples/payments-custom-element/index.html` on your browser.
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Payment page example</title>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link
7
+ rel="icon"
8
+ type="image/png"
9
+ sizes="96x96"
10
+ href="https://duffel.com/images/favicon/favicon-96x96.png"
11
+ />
12
+
13
+ <!-- 1. This script loads duffel-components -->
14
+ <script src="http://localhost:8000/duffel-payments.js"></script>
15
+ </head>
16
+
17
+ <body style="font-family: sans-serif">
18
+ <h1 style="margin-bottom: 2rem">Payment page example</h1>
19
+
20
+ <!-- 2. Add the custom element to your markup where you want to render the payments card -->
21
+ <duffel-payments></duffel-payments>
22
+ </body>
23
+ <script>
24
+ const duffelpaymentsElement = document.querySelector("duffel-payments");
25
+
26
+ // 3. Render the component with the required data, you can safely call this function as many times as you want.
27
+ duffelpaymentsElement.render({
28
+ paymentIntentClientToken:
29
+ "eyJjbGllbnRfc2VjcmV0IjoicGlfM0psczlVQWcySmhFeTh2WTBSTm1MU0JkX3NlY3JldF9QUW9yZXNuU3laeWJadGRiejZwNzBCbUdPIiwicHVibGlzaGFibGVfa2V5IjoicGtfdGVzdF9EQUJLY0E2Vzh6OTc0cTdPSWY0YmJ2MVQwMEpwRmMyOUpWIn0=",
30
+ debug: true,
31
+ });
32
+
33
+ // 4. Listen to 'onSuccessfulPayment' event on the component:
34
+ duffelpaymentsElement.addEventListener("onSuccessfulPayment", () =>
35
+ console.log("onPayloadReady\n")
36
+ );
37
+
38
+ // 5. If we run into an issue with the payment, you can listen to 'onFailedPayment' event:
39
+ duffelpaymentsElement.addEventListener("onFailedPayment", (event) =>
40
+ console.log("onPayloadReady\n", event.detail)
41
+ );
42
+ </script>
43
+ </html>