@colisweb/rescript-toolkit 3.7.2 → 4.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 (985) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/.secure_files/ci-functions-v16.5.0 +2384 -0
  3. package/.secure_files/ci-functions-v16.6.0 +2384 -0
  4. package/.secure_files/ci-functions-v16.7.0 +2422 -0
  5. package/.secure_files/ci-functions-v17.0.0 +2422 -0
  6. package/.secure_files/ci-functions-v17.0.1 +2422 -0
  7. package/.secure_files/ci-functions-v17.0.10 +2525 -0
  8. package/.secure_files/ci-functions-v17.0.2 +2422 -0
  9. package/.secure_files/ci-functions-v17.0.3 +2422 -0
  10. package/.secure_files/ci-functions-v17.0.4 +2422 -0
  11. package/.secure_files/ci-functions-v17.0.5 +2422 -0
  12. package/.secure_files/ci-functions-v17.0.6 +2422 -0
  13. package/.secure_files/ci-functions-v17.0.7 +2422 -0
  14. package/.secure_files/ci-functions-v17.0.8 +2422 -0
  15. package/.secure_files/ci-functions-v17.0.9 +2527 -0
  16. package/.secure_files/ci-functions-v17.1.0 +2525 -0
  17. package/.secure_files/ci-functions-v17.1.1 +2547 -0
  18. package/.secure_files/ci-functions-vTest +2384 -0
  19. package/locale/fr.json +25 -0
  20. package/package.json +5 -16
  21. package/src/form/Toolkit__Form.res +8 -5
  22. package/src/form/Toolkit__FormValidationFunctions.res +1 -0
  23. package/src/hooks/Toolkit__Hooks.res +168 -2
  24. package/src/tailwind/tailwind.config.cjs +6 -1
  25. package/src/ui/Toolkit__Ui.res +1 -2
  26. package/src/ui/Toolkit__Ui_Autocomplete.res +182 -0
  27. package/src/ui/Toolkit__Ui_Checkbox.res +20 -9
  28. package/src/ui/Toolkit__Ui_Checkbox.resi +1 -0
  29. package/src/ui/Toolkit__Ui_DropdownList.res +50 -45
  30. package/src/ui/Toolkit__Ui_Listbox.res +4 -1
  31. package/src/ui/Toolkit__Ui_Listbox.resi +3 -1
  32. package/src/ui/Toolkit__Ui_Modal.res +77 -47
  33. package/src/ui/Toolkit__Ui_MultiSelect.res +26 -4
  34. package/src/ui/Toolkit__Ui_MultiSelect.resi +1 -0
  35. package/src/ui/Toolkit__Ui_Portal.res +35 -0
  36. package/src/ui/Toolkit__Ui_PortalDropdown.res +4 -5
  37. package/src/ui/Toolkit__Ui_RadioGroup.res +1 -2
  38. package/src/ui/Toolkit__Ui_SearchListbox.res +126 -0
  39. package/src/ui/Toolkit__Ui_Snackbar.res +2 -2
  40. package/src/ui/Toolkit__Ui_Spinner.res +2 -4
  41. package/src/ui/Toolkit__Ui_Switch.res +2 -2
  42. package/src/ui/Toolkit__Ui_Tooltip.res +78 -63
  43. package/src/ui/Toolkit__Ui_Tooltip.resi +10 -5
  44. package/src/ui/Toolkit__Ui_VisuallyHidden.res +19 -0
  45. package/src/ui/styles.css +17 -127
  46. package/src/vendors/Browser.resi +9 -0
  47. package/src/vendors/DatadogLog.res +16 -0
  48. package/src/vendors/DatadogRum.res +49 -1
  49. package/src/vendors/Diff.res +11 -0
  50. package/src/vendors/GooglePlacesAutocomplete.res +96 -0
  51. package/src/vendors/Jest.res +23 -0
  52. package/src/vendors/PrismJs.res +9 -0
  53. package/src/vendors/ReactGoogleMaps.res +80 -18
  54. package/src/vendors/ReactIcons.res +30 -0
  55. package/src/vendors/headlessui/HeadlessUi.res +7 -0
  56. package/src/vendors/headlessui/HeadlessUi__Combobox.res +73 -0
  57. package/src/vendors/headlessui/HeadlessUi__Dialog.res +25 -0
  58. package/src/vendors/headlessui/HeadlessUi__Disclosure.res +52 -0
  59. package/src/vendors/headlessui/HeadlessUi__Listbox.res +54 -0
  60. package/src/vendors/headlessui/HeadlessUi__Menu.res +61 -0
  61. package/src/vendors/headlessui/HeadlessUi__Shared.res +5 -0
  62. package/src/vendors/headlessui/HeadlessUi__Tab.res +56 -0
  63. package/src/vendors/headlessui/HeadlessUi__Transition.res +30 -0
  64. package/.yarn/cache/@ampproject-remapping-npm-2.2.0-114878fa50-d74d170d06.zip +0 -0
  65. package/.yarn/cache/@babel-code-frame-npm-7.10.4-ab1ee3c93e-feb4543c8a.zip +0 -0
  66. package/.yarn/cache/@babel-code-frame-npm-7.18.6-25229a7e34-195e2be317.zip +0 -0
  67. package/.yarn/cache/@babel-compat-data-npm-7.20.10-b619ecdaef-6ed6c1bb6f.zip +0 -0
  68. package/.yarn/cache/@babel-compat-data-npm-7.20.5-d0c9bbe791-523790c43e.zip +0 -0
  69. package/.yarn/cache/@babel-core-npm-7.20.12-1f7c5fb4ea-62e6c3e214.zip +0 -0
  70. package/.yarn/cache/@babel-core-npm-7.20.5-b1e311b556-9547f1e636.zip +0 -0
  71. package/.yarn/cache/@babel-generator-npm-7.20.5-d08ff0a892-31c10d1e12.zip +0 -0
  72. package/.yarn/cache/@babel-generator-npm-7.20.7-6446968b78-84b6983ffd.zip +0 -0
  73. package/.yarn/cache/@babel-helper-annotate-as-pure-npm-7.14.5-28a60a464c-18cefedda6.zip +0 -0
  74. package/.yarn/cache/@babel-helper-compilation-targets-npm-7.20.0-f842a8700a-bc183f2109.zip +0 -0
  75. package/.yarn/cache/@babel-helper-compilation-targets-npm-7.20.7-fbd2fdfc71-8c32c873ba.zip +0 -0
  76. package/.yarn/cache/@babel-helper-environment-visitor-npm-7.18.9-9f5b3635a1-b25101f616.zip +0 -0
  77. package/.yarn/cache/@babel-helper-function-name-npm-7.19.0-5bcf55236f-eac1f5db42.zip +0 -0
  78. package/.yarn/cache/@babel-helper-hoist-variables-npm-7.18.6-6eb061f405-fd9c35bb43.zip +0 -0
  79. package/.yarn/cache/@babel-helper-module-imports-npm-7.14.5-11d168065b-b982799086.zip +0 -0
  80. package/.yarn/cache/@babel-helper-module-imports-npm-7.18.6-1031faa864-f393f8a3b3.zip +0 -0
  81. package/.yarn/cache/@babel-helper-module-transforms-npm-7.20.11-3e2102ac8a-29319ebafa.zip +0 -0
  82. package/.yarn/cache/@babel-helper-module-transforms-npm-7.20.2-9a4905d6a2-33a60ca115.zip +0 -0
  83. package/.yarn/cache/@babel-helper-plugin-utils-npm-7.14.5-e35eef11cb-fe20e90a24.zip +0 -0
  84. package/.yarn/cache/@babel-helper-plugin-utils-npm-7.18.6-12ee942c4e-3dbfceb6c1.zip +0 -0
  85. package/.yarn/cache/@babel-helper-plugin-utils-npm-7.20.2-63f605bb73-f6cae53b7f.zip +0 -0
  86. package/.yarn/cache/@babel-helper-simple-access-npm-7.20.2-842ec98fbb-ad1e96ee2e.zip +0 -0
  87. package/.yarn/cache/@babel-helper-split-export-declaration-npm-7.18.6-53ebf8ad4c-c6d3dede53.zip +0 -0
  88. package/.yarn/cache/@babel-helper-string-parser-npm-7.19.4-0db110dc3a-b2f8a3920b.zip +0 -0
  89. package/.yarn/cache/@babel-helper-validator-identifier-npm-7.10.4-0689d787fa-3cbfdff0ef.zip +0 -0
  90. package/.yarn/cache/@babel-helper-validator-identifier-npm-7.14.9-d7bb91b6de-58552531a7.zip +0 -0
  91. package/.yarn/cache/@babel-helper-validator-identifier-npm-7.18.6-357e4653ab-e295254d61.zip +0 -0
  92. package/.yarn/cache/@babel-helper-validator-identifier-npm-7.19.1-d84f19e1dc-0eca5e86a7.zip +0 -0
  93. package/.yarn/cache/@babel-helper-validator-option-npm-7.14.5-fd38dcf0bc-1b25c34a5c.zip +0 -0
  94. package/.yarn/cache/@babel-helper-validator-option-npm-7.18.6-cc7d1a3315-f9cc6eb7cc.zip +0 -0
  95. package/.yarn/cache/@babel-helpers-npm-7.20.6-cc6bdd4ba3-f03ec6eb2b.zip +0 -0
  96. package/.yarn/cache/@babel-helpers-npm-7.20.7-58121e4a26-3fb10df351.zip +0 -0
  97. package/.yarn/cache/@babel-highlight-npm-7.10.4-c7ff18fbba-6fab467916.zip +0 -0
  98. package/.yarn/cache/@babel-highlight-npm-7.18.6-9d35ad2e27-92d8ee6154.zip +0 -0
  99. package/.yarn/cache/@babel-parser-npm-7.20.5-2b25154357-e8d514ce0a.zip +0 -0
  100. package/.yarn/cache/@babel-parser-npm-7.20.7-3710a9bc4f-25b5266e3b.zip +0 -0
  101. package/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.14.5-14192e29dd-3a2ba87534.zip +0 -0
  102. package/.yarn/cache/@babel-plugin-syntax-jsx-npm-7.18.6-3e378d5f11-6d37ea9729.zip +0 -0
  103. package/.yarn/cache/@babel-plugin-transform-react-display-name-npm-7.15.1-c2e6a9c450-c3808762f5.zip +0 -0
  104. package/.yarn/cache/@babel-plugin-transform-react-jsx-development-npm-7.14.5-ec55736608-b49d6e703a.zip +0 -0
  105. package/.yarn/cache/@babel-plugin-transform-react-jsx-npm-7.14.9-58bb40c990-833426a5d3.zip +0 -0
  106. package/.yarn/cache/@babel-plugin-transform-react-jsx-self-npm-7.18.6-97bcab453d-7d24e29c63.zip +0 -0
  107. package/.yarn/cache/@babel-plugin-transform-react-jsx-source-npm-7.19.6-f7b8cba2b3-1e9e29a4ef.zip +0 -0
  108. package/.yarn/cache/@babel-plugin-transform-react-pure-annotations-npm-7.14.5-0f88cc95c7-3b62cc6af2.zip +0 -0
  109. package/.yarn/cache/@babel-preset-react-npm-7.14.5-0d65339ed0-413c507f85.zip +0 -0
  110. package/.yarn/cache/@babel-runtime-npm-7.11.2-f2cfabd212-8f3199cfb6.zip +0 -0
  111. package/.yarn/cache/@babel-runtime-npm-7.12.5-b3edb8ee8e-64964a0fd1.zip +0 -0
  112. package/.yarn/cache/@babel-runtime-npm-7.13.9-f5cea06d51-3ac9450e53.zip +0 -0
  113. package/.yarn/cache/@babel-runtime-npm-7.15.4-52ce5bf6ea-c408254304.zip +0 -0
  114. package/.yarn/cache/@babel-runtime-npm-7.18.6-6a59ef0d54-8b707b64ae.zip +0 -0
  115. package/.yarn/cache/@babel-runtime-npm-7.20.6-ef7cda3b78-42a8504db2.zip +0 -0
  116. package/.yarn/cache/@babel-template-npm-7.18.10-b6d6fdbaf8-93a6aa094a.zip +0 -0
  117. package/.yarn/cache/@babel-template-npm-7.20.7-c157fc5838-2eb1a0ab8d.zip +0 -0
  118. package/.yarn/cache/@babel-traverse-npm-7.20.12-68fa1c73c8-d758b355ab.zip +0 -0
  119. package/.yarn/cache/@babel-traverse-npm-7.20.5-dc0e9498d7-c7fed46861.zip +0 -0
  120. package/.yarn/cache/@babel-types-npm-7.15.0-20151d256a-6d6bcdfce9.zip +0 -0
  121. package/.yarn/cache/@babel-types-npm-7.18.7-ce70018628-3114ce161c.zip +0 -0
  122. package/.yarn/cache/@babel-types-npm-7.20.5-3ee242b980-773f0a1ad9.zip +0 -0
  123. package/.yarn/cache/@babel-types-npm-7.20.7-8dc703d95e-b39af241f0.zip +0 -0
  124. package/.yarn/cache/@colisweb-bs-react-intl-extractor-bin-npm-0.12.2-55147a5108-98c0eda3c9.zip +0 -0
  125. package/.yarn/cache/@colisweb-react-day-picker-npm-7.4.16-f0e6f2b15f-3998398d8d.zip +0 -0
  126. package/.yarn/cache/@colisweb-restorative-npm-1.0.0-5eac899f0c-6e80ecc641.zip +0 -0
  127. package/.yarn/cache/@csstools-cascade-layer-name-parser-npm-1.0.1-3c03e04847-ca85af36ab.zip +0 -0
  128. package/.yarn/cache/@csstools-css-parser-algorithms-npm-2.0.1-d93fd57f45-9f168cfc8f.zip +0 -0
  129. package/.yarn/cache/@csstools-css-tokenizer-npm-2.0.1-844d89aa1a-b52ac9fc19.zip +0 -0
  130. package/.yarn/cache/@csstools-media-query-list-parser-npm-2.0.1-6d8da9a941-f30b2a9e1a.zip +0 -0
  131. package/.yarn/cache/@csstools-postcss-cascade-layers-npm-3.0.1-fcae0e8d19-da39631e23.zip +0 -0
  132. package/.yarn/cache/@csstools-postcss-color-function-npm-2.0.1-34522e4c49-0e6ce71636.zip +0 -0
  133. package/.yarn/cache/@csstools-postcss-font-format-keywords-npm-2.0.1-f30ce2e0ea-b9e2fc83e2.zip +0 -0
  134. package/.yarn/cache/@csstools-postcss-hwb-function-npm-2.0.1-0a198205ed-8134c45bb9.zip +0 -0
  135. package/.yarn/cache/@csstools-postcss-ic-unit-npm-2.0.1-af9dff83ea-18a239451a.zip +0 -0
  136. package/.yarn/cache/@csstools-postcss-is-pseudo-class-npm-3.0.1-eee09c2887-c736b35cfd.zip +0 -0
  137. package/.yarn/cache/@csstools-postcss-logical-float-and-clear-npm-1.0.1-bcc4cd5492-5184cd62a6.zip +0 -0
  138. package/.yarn/cache/@csstools-postcss-logical-resize-npm-1.0.1-f2df14ea6f-b19f340d19.zip +0 -0
  139. package/.yarn/cache/@csstools-postcss-logical-viewport-units-npm-1.0.2-ffddbc4f90-8780dd03c1.zip +0 -0
  140. package/.yarn/cache/@csstools-postcss-media-queries-aspect-ratio-number-values-npm-1.0.1-c7c2022b49-cbcf01db72.zip +0 -0
  141. package/.yarn/cache/@csstools-postcss-nested-calc-npm-2.0.1-6a7c107213-0ab4774879.zip +0 -0
  142. package/.yarn/cache/@csstools-postcss-normalize-display-values-npm-2.0.1-6e35aa6dbe-d67779977b.zip +0 -0
  143. package/.yarn/cache/@csstools-postcss-oklab-function-npm-2.0.1-905b1f47ea-78a677492e.zip +0 -0
  144. package/.yarn/cache/@csstools-postcss-progressive-custom-properties-npm-2.0.1-dbdcdfdf80-4d0d8df31a.zip +0 -0
  145. package/.yarn/cache/@csstools-postcss-scope-pseudo-class-npm-2.0.1-edf946c1fb-e53d520130.zip +0 -0
  146. package/.yarn/cache/@csstools-postcss-stepped-value-functions-npm-2.0.1-fedf469bf1-907f9a30b9.zip +0 -0
  147. package/.yarn/cache/@csstools-postcss-text-decoration-shorthand-npm-2.1.0-17a49e6bd6-760f821ee3.zip +0 -0
  148. package/.yarn/cache/@csstools-postcss-trigonometric-functions-npm-2.0.1-0a04a18052-b2b7aa8d59.zip +0 -0
  149. package/.yarn/cache/@csstools-postcss-unset-value-npm-2.0.1-b5b03d712f-51fe220dad.zip +0 -0
  150. package/.yarn/cache/@csstools-selector-specificity-npm-2.0.2-cbab31242a-a2045a2727.zip +0 -0
  151. package/.yarn/cache/@csstools-selector-specificity-npm-2.1.1-1d0a01f035-392ab62732.zip +0 -0
  152. package/.yarn/cache/@datadog-browser-core-npm-4.26.0-1ddabfe61b-f524db6db3.zip +0 -0
  153. package/.yarn/cache/@datadog-browser-rum-core-npm-4.26.0-37e16940a6-3c2d27b0ce.zip +0 -0
  154. package/.yarn/cache/@datadog-browser-rum-npm-4.26.0-c980578a64-d85f50f575.zip +0 -0
  155. package/.yarn/cache/@emotion-babel-plugin-npm-11.9.2-9822f587b1-2d2c4fadd3.zip +0 -0
  156. package/.yarn/cache/@emotion-cache-npm-11.4.0-701cf41a62-bdef4c0ccc.zip +0 -0
  157. package/.yarn/cache/@emotion-cache-npm-11.9.3-19440f4c2c-6e0aab2fa5.zip +0 -0
  158. package/.yarn/cache/@emotion-hash-npm-0.8.0-0104f4bbf3-4b35d88a97.zip +0 -0
  159. package/.yarn/cache/@emotion-memoize-npm-0.7.5-e5e7e9eeca-83da8d4a76.zip +0 -0
  160. package/.yarn/cache/@emotion-react-npm-11.9.3-dcd9c32ac6-19bc7205e8.zip +0 -0
  161. package/.yarn/cache/@emotion-serialize-npm-1.0.4-5d4f6d63ee-e8cc342056.zip +0 -0
  162. package/.yarn/cache/@emotion-sheet-npm-1.0.1-f917bf7ec9-624e2ede03.zip +0 -0
  163. package/.yarn/cache/@emotion-sheet-npm-1.1.1-9e89b4e29a-b916ac6657.zip +0 -0
  164. package/.yarn/cache/@emotion-unitless-npm-0.7.5-14e1171640-f976e5345b.zip +0 -0
  165. package/.yarn/cache/@emotion-utils-npm-1.0.0-7f9809289c-3ce8048441.zip +0 -0
  166. package/.yarn/cache/@emotion-utils-npm-1.1.0-cab2893c1f-d3b681ca3a.zip +0 -0
  167. package/.yarn/cache/@emotion-weak-memoize-npm-0.2.5-9f2e49e7c8-27d402b0c6.zip +0 -0
  168. package/.yarn/cache/@esbuild-linux-x64-npm-0.16.17-05d9fa63ae-8.zip +0 -0
  169. package/.yarn/cache/@floating-ui-core-npm-1.0.4-73057dfc20-6362a625ad.zip +0 -0
  170. package/.yarn/cache/@floating-ui-dom-npm-1.0.9-76c3e5d592-188ce7fe6d.zip +0 -0
  171. package/.yarn/cache/@formatjs-ecma402-abstract-npm-1.14.3-0c3d1a26d2-504ae97750.zip +0 -0
  172. package/.yarn/cache/@formatjs-fast-memoize-npm-1.2.7-a6c0f2541c-ba372a3e93.zip +0 -0
  173. package/.yarn/cache/@formatjs-icu-messageformat-parser-npm-2.1.14-c0bb1bc4ac-4d13230af0.zip +0 -0
  174. package/.yarn/cache/@formatjs-icu-skeleton-parser-npm-1.3.18-3cbfc6044a-19655c452e.zip +0 -0
  175. package/.yarn/cache/@formatjs-intl-displaynames-npm-6.2.3-62645576d1-2e5fe38231.zip +0 -0
  176. package/.yarn/cache/@formatjs-intl-listformat-npm-7.1.7-ebce332137-96b45bcf0e.zip +0 -0
  177. package/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.32-1117c79148-477e18aaba.zip +0 -0
  178. package/.yarn/cache/@formatjs-intl-npm-2.6.3-33e1dda302-1922ec1d63.zip +0 -0
  179. package/.yarn/cache/@gar-promisify-npm-1.1.3-ac1a325862-4059f790e2.zip +0 -0
  180. package/.yarn/cache/@headlessui-react-npm-1.7.14-bf2f6f6d3e-9122114d7a.zip +0 -0
  181. package/.yarn/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip +0 -0
  182. package/.yarn/cache/@jihchi-vite-plugin-rescript-npm-5.0.0-8a5208fb25-ffeb8abe8a.zip +0 -0
  183. package/.yarn/cache/@jridgewell-gen-mapping-npm-0.1.1-3bad172ac6-3bcc21fe78.zip +0 -0
  184. package/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip +0 -0
  185. package/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip +0 -0
  186. package/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip +0 -0
  187. package/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip +0 -0
  188. package/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.14-c78fcccfdf-b9537b9630.zip +0 -0
  189. package/.yarn/cache/@mdx-js-mdx-npm-2.2.1-8775507cd2-3985e37a22.zip +0 -0
  190. package/.yarn/cache/@mdx-js-react-npm-2.2.1-4655499d67-4462dad1d7.zip +0 -0
  191. package/.yarn/cache/@mdx-js-rollup-npm-2.2.1-c2c2150f2c-a8390b5fd9.zip +0 -0
  192. package/.yarn/cache/@nodelib-fs.scandir-npm-2.1.4-6f6ddb2372-18c2150ab5.zip +0 -0
  193. package/.yarn/cache/@nodelib-fs.stat-npm-2.0.4-0b2acf9d70-d0d9745f87.zip +0 -0
  194. package/.yarn/cache/@nodelib-fs.walk-npm-1.2.6-b686194e9d-d156901823.zip +0 -0
  195. package/.yarn/cache/@npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip +0 -0
  196. package/.yarn/cache/@npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip +0 -0
  197. package/.yarn/cache/@originjs-vite-plugin-commonjs-npm-1.0.3-75b36e7757-e4cd22a73e.zip +0 -0
  198. package/.yarn/cache/@popperjs-core-npm-2.11.6-5bcdc104bd-47fb328cec.zip +0 -0
  199. package/.yarn/cache/@reach-accordion-npm-0.18.0-238ca47d81-8560ab881c.zip +0 -0
  200. package/.yarn/cache/@reach-alert-dialog-npm-0.18.0-35faccfb5e-34cd77249c.zip +0 -0
  201. package/.yarn/cache/@reach-auto-id-npm-0.18.0-f919ca8edd-75a37a0a09.zip +0 -0
  202. package/.yarn/cache/@reach-combobox-npm-0.18.0-27090f0970-c09061cb33.zip +0 -0
  203. package/.yarn/cache/@reach-descendants-npm-0.18.0-2af8f1f680-54e1e9302e.zip +0 -0
  204. package/.yarn/cache/@reach-dialog-npm-0.18.0-b83711f1cd-c87fe1a7be.zip +0 -0
  205. package/.yarn/cache/@reach-disclosure-npm-0.18.0-2fdc238043-7786674320.zip +0 -0
  206. package/.yarn/cache/@reach-dropdown-npm-0.18.0-acdaa7bebe-88b7eb0641.zip +0 -0
  207. package/.yarn/cache/@reach-listbox-npm-0.18.0-db0ff22061-ee759b9cd8.zip +0 -0
  208. package/.yarn/cache/@reach-machine-npm-0.18.0-8dce89c830-29e30ab0dd.zip +0 -0
  209. package/.yarn/cache/@reach-menu-button-npm-0.18.0-0f74afefa7-c3087f0dfe.zip +0 -0
  210. package/.yarn/cache/@reach-observe-rect-npm-1.2.0-ae7ce1a341-7dd903eeaa.zip +0 -0
  211. package/.yarn/cache/@reach-polymorphic-npm-0.18.0-31b4a0e8fe-0d62260a55.zip +0 -0
  212. package/.yarn/cache/@reach-popover-npm-0.18.0-2ecac00cd0-b25a7310c9.zip +0 -0
  213. package/.yarn/cache/@reach-portal-npm-0.18.0-efa3c9162e-bd54c69492.zip +0 -0
  214. package/.yarn/cache/@reach-rect-npm-0.18.0-eb408ad59e-5e9fbfb3b6.zip +0 -0
  215. package/.yarn/cache/@reach-tabs-npm-0.18.0-cf3486cc7a-fb61b757ca.zip +0 -0
  216. package/.yarn/cache/@reach-tooltip-npm-0.18.0-71fda5ed5f-4080b15c1b.zip +0 -0
  217. package/.yarn/cache/@reach-utils-npm-0.18.0-a458ed585d-eeda20a74c.zip +0 -0
  218. package/.yarn/cache/@reach-visually-hidden-npm-0.18.0-199c5bc693-675ad41121.zip +0 -0
  219. package/.yarn/cache/@rescript-react-npm-0.11.0-687f8fa3b5-c399d114f7.zip +0 -0
  220. package/.yarn/cache/@restart-hooks-npm-0.4.7-063edcfe32-1aec4bfb00.zip +0 -0
  221. package/.yarn/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip +0 -0
  222. package/.yarn/cache/@tailwindcss-line-clamp-npm-0.4.2-7e8725ef00-26b8135df2.zip +0 -0
  223. package/.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip +0 -0
  224. package/.yarn/cache/@types-acorn-npm-4.0.6-a81a5c57b1-60e1fd28af.zip +0 -0
  225. package/.yarn/cache/@types-color-name-npm-1.1.1-00b0925070-b71fcad728.zip +0 -0
  226. package/.yarn/cache/@types-debug-npm-4.1.7-f54c81f8db-0a7b89d8ed.zip +0 -0
  227. package/.yarn/cache/@types-estree-jsx-npm-1.0.0-8247cccc6c-851d7afb63.zip +0 -0
  228. package/.yarn/cache/@types-estree-npm-1.0.0-eddde5b631-910d97fb70.zip +0 -0
  229. package/.yarn/cache/@types-hast-npm-2.3.1-65e0b0f4b1-3e2ec0a56a.zip +0 -0
  230. package/.yarn/cache/@types-hoist-non-react-statics-npm-3.3.1-c0081332b2-2c0778570d.zip +0 -0
  231. package/.yarn/cache/@types-js-cookie-npm-2.2.6-dd551f922c-97c50ff6cd.zip +0 -0
  232. package/.yarn/cache/@types-json-schema-npm-7.0.5-6c7647c88d-4383d279e4.zip +0 -0
  233. package/.yarn/cache/@types-json-schema-npm-7.0.7-95fb8178d7-ea3b409235.zip +0 -0
  234. package/.yarn/cache/@types-mdast-npm-3.0.3-3eaccff045-5318624af8.zip +0 -0
  235. package/.yarn/cache/@types-mdx-npm-2.0.3-0b710c028d-41deb51c29.zip +0 -0
  236. package/.yarn/cache/@types-ms-npm-0.7.31-ea3b89342b-daadd354ae.zip +0 -0
  237. package/.yarn/cache/@types-parse-json-npm-4.0.0-298522afa6-fd6bce2b67.zip +0 -0
  238. package/.yarn/cache/@types-prop-types-npm-15.7.3-084e0015c6-41831d53c4.zip +0 -0
  239. package/.yarn/cache/@types-react-dom-npm-18.0.10-97fe360927-ff8282d500.zip +0 -0
  240. package/.yarn/cache/@types-react-npm-16.9.46-151d7789b5-34b08937f2.zip +0 -0
  241. package/.yarn/cache/@types-react-npm-18.0.15-5275c78b86-e22cc388d1.zip +0 -0
  242. package/.yarn/cache/@types-react-npm-18.0.26-d708995a34-b62f0ea3cd.zip +0 -0
  243. package/.yarn/cache/@types-react-transition-group-npm-4.4.4-258f9685b8-86e9ff9731.zip +0 -0
  244. package/.yarn/cache/@types-scheduler-npm-0.16.2-ba3a7d8c68-b6b4dcfeae.zip +0 -0
  245. package/.yarn/cache/@types-unist-npm-2.0.3-4b26dedfde-4427306b09.zip +0 -0
  246. package/.yarn/cache/@types-warning-npm-3.0.0-aafa4d7846-120dcf9060.zip +0 -0
  247. package/.yarn/cache/@vitejs-plugin-react-npm-3.0.1-facc0de25f-fde9dd4d3a.zip +0 -0
  248. package/.yarn/cache/@xobotyi-scrollbar-width-npm-1.9.5-00ae5c32d1-e880c8696b.zip +0 -0
  249. package/.yarn/cache/@xstate-fsm-npm-1.4.0-ddeed65ddf-518080d3dd.zip +0 -0
  250. package/.yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip +0 -0
  251. package/.yarn/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip +0 -0
  252. package/.yarn/cache/acorn-node-npm-1.8.2-b30b72c499-02e1564a1c.zip +0 -0
  253. package/.yarn/cache/acorn-npm-7.3.1-422605b2d6-5b0295c8a3.zip +0 -0
  254. package/.yarn/cache/acorn-npm-8.8.1-20e4aea981-4079b67283.zip +0 -0
  255. package/.yarn/cache/acorn-walk-npm-7.2.0-5f8b515308-9252158a79.zip +0 -0
  256. package/.yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip +0 -0
  257. package/.yarn/cache/agentkeepalive-npm-4.2.1-b86a9fb343-39cb49ed8c.zip +0 -0
  258. package/.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip +0 -0
  259. package/.yarn/cache/ajv-keywords-npm-3.5.2-0e391b70e2-7dc5e59316.zip +0 -0
  260. package/.yarn/cache/ajv-npm-6.12.2-7ff2bc9f1e-4a87256bbe.zip +0 -0
  261. package/.yarn/cache/ajv-npm-6.12.4-c4dcb5109f-8713e39b0e.zip +0 -0
  262. package/.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip +0 -0
  263. package/.yarn/cache/ansi-regex-npm-2.1.1-ddd24d102b-190abd03e4.zip +0 -0
  264. package/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip +0 -0
  265. package/.yarn/cache/ansi-styles-npm-2.2.1-f3297e782c-ebc0e00381.zip +0 -0
  266. package/.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip +0 -0
  267. package/.yarn/cache/ansi-styles-npm-4.2.1-de50ec308d-7c74dbc7ec.zip +0 -0
  268. package/.yarn/cache/anymatch-npm-3.1.1-7dcfa6178a-c951385862.zip +0 -0
  269. package/.yarn/cache/anymatch-npm-3.1.2-1d5471acfa-985163db22.zip +0 -0
  270. package/.yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip +0 -0
  271. package/.yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip +0 -0
  272. package/.yarn/cache/arg-npm-5.0.2-2f5805a547-6c69ada1a9.zip +0 -0
  273. package/.yarn/cache/array-union-npm-1.0.2-cc61ee268f-82cec6421b.zip +0 -0
  274. package/.yarn/cache/array-uniq-npm-1.0.3-e7f5d6f3a1-1625f06b09.zip +0 -0
  275. package/.yarn/cache/asn1-npm-0.2.4-219dd49411-aa5d6f77b1.zip +0 -0
  276. package/.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-19b4340cb8.zip +0 -0
  277. package/.yarn/cache/astring-npm-1.8.4-5643f65e66-bc0b980873.zip +0 -0
  278. package/.yarn/cache/async-npm-1.5.2-e971969e27-fe5d6214d8.zip +0 -0
  279. package/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip +0 -0
  280. package/.yarn/cache/autoprefixer-npm-10.4.13-261edbcee5-dcb1cb7ae9.zip +0 -0
  281. package/.yarn/cache/aws-sign2-npm-0.7.0-656c6cb84d-b148b0bb07.zip +0 -0
  282. package/.yarn/cache/aws4-npm-1.10.0-74d09999c1-e0d2a5e0c1.zip +0 -0
  283. package/.yarn/cache/axios-npm-0.19.2-e4e8599895-dcace11a0a.zip +0 -0
  284. package/.yarn/cache/axios-npm-0.24.0-39e5c1e79e-468cf496c0.zip +0 -0
  285. package/.yarn/cache/babel-loader-npm-8.2.5-e749e26bb5-a660555788.zip +0 -0
  286. package/.yarn/cache/babel-plugin-macros-npm-2.8.0-451367d7e7-59b09a21cf.zip +0 -0
  287. package/.yarn/cache/bail-npm-2.0.2-42130cb251-aab4e8ccdc.zip +0 -0
  288. package/.yarn/cache/balanced-match-npm-1.0.0-951a2ad706-9b67bfe558.zip +0 -0
  289. package/.yarn/cache/bcrypt-pbkdf-npm-1.0.2-80db8b16ed-4edfc9fe7d.zip +0 -0
  290. package/.yarn/cache/big.js-npm-5.2.2-e147c30820-b89b6e8419.zip +0 -0
  291. package/.yarn/cache/binary-extensions-npm-2.1.0-0681d7e2ce-16ef0ca9b8.zip +0 -0
  292. package/.yarn/cache/boolbase-npm-1.0.0-965fe9af6d-3e25c80ef6.zip +0 -0
  293. package/.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip +0 -0
  294. package/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip +0 -0
  295. package/.yarn/cache/braces-npm-3.0.2-782240b28a-e2a8e769a8.zip +0 -0
  296. package/.yarn/cache/browserslist-npm-4.21.4-7d64a96afc-4af3793704.zip +0 -0
  297. package/.yarn/cache/bs-axios-npm-0.0.43-6ef4168f1f-35e7761f11.zip +0 -0
  298. package/.yarn/cache/cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip +0 -0
  299. package/.yarn/cache/call-bind-npm-1.0.2-c957124861-f8e31de9d1.zip +0 -0
  300. package/.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip +0 -0
  301. package/.yarn/cache/camelcase-css-npm-2.0.1-90d1b6df08-1cec2b3b3d.zip +0 -0
  302. package/.yarn/cache/camelcase-npm-3.0.0-0c65af0c7f-ae4fe1c17c.zip +0 -0
  303. package/.yarn/cache/caniuse-lite-npm-1.0.30001416-1b23e541ac-4d93f449ae.zip +0 -0
  304. package/.yarn/cache/caniuse-lite-npm-1.0.30001436-0864011110-7928ac7d93.zip +0 -0
  305. package/.yarn/cache/case-npm-1.6.3-1bd3a50e38-febe73278f.zip +0 -0
  306. package/.yarn/cache/caseless-npm-0.12.0-e83bc5df83-b43bd4c440.zip +0 -0
  307. package/.yarn/cache/ccount-npm-2.0.1-f4b7827860-48193dada5.zip +0 -0
  308. package/.yarn/cache/chalk-npm-1.1.3-59144c3a87-9d2ea6b98f.zip +0 -0
  309. package/.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip +0 -0
  310. package/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip +0 -0
  311. package/.yarn/cache/character-entities-html4-npm-2.1.0-ff9355188e-7034aa7c7f.zip +0 -0
  312. package/.yarn/cache/character-entities-legacy-npm-3.0.0-ba39d6d541-7582af055c.zip +0 -0
  313. package/.yarn/cache/character-entities-npm-2.0.2-b5ef4d8fe2-cf16438140.zip +0 -0
  314. package/.yarn/cache/character-reference-invalid-npm-2.0.1-edca9dd17a-98d3b1a52a.zip +0 -0
  315. package/.yarn/cache/chokidar-npm-3.5.1-205217279e-b7774e6e3a.zip +0 -0
  316. package/.yarn/cache/chokidar-npm-3.5.3-c5f9b0a56a-b49fcde401.zip +0 -0
  317. package/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip +0 -0
  318. package/.yarn/cache/ci-info-npm-3.3.2-fb5617e149-fd81f1edd2.zip +0 -0
  319. package/.yarn/cache/classnames-npm-2.3.1-f2ae0a8d3c-14db8889d5.zip +0 -0
  320. package/.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip +0 -0
  321. package/.yarn/cache/click-outside-hook-npm-1.1.0-a7ee07665f-4981877eb9.zip +0 -0
  322. package/.yarn/cache/client-only-npm-0.0.1-07d3e9505c-0c16bf660d.zip +0 -0
  323. package/.yarn/cache/clsx-npm-1.2.1-77792dc182-30befca801.zip +0 -0
  324. package/.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip +0 -0
  325. package/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip +0 -0
  326. package/.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip +0 -0
  327. package/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip +0 -0
  328. package/.yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip +0 -0
  329. package/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip +0 -0
  330. package/.yarn/cache/comma-separated-tokens-npm-1.0.8-00dbbf3418-0adcb07174.zip +0 -0
  331. package/.yarn/cache/comma-separated-tokens-npm-2.0.3-a4a34086b3-e3bf9e0332.zip +0 -0
  332. package/.yarn/cache/commondir-npm-1.0.1-291b790340-59715f2fc4.zip +0 -0
  333. package/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip +0 -0
  334. package/.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip +0 -0
  335. package/.yarn/cache/convert-source-map-npm-1.7.0-f9727424f7-bcd2e3ea7d.zip +0 -0
  336. package/.yarn/cache/copy-to-clipboard-npm-3.3.1-18029bce99-3c7b1c333d.zip +0 -0
  337. package/.yarn/cache/copy-to-clipboard-npm-3.3.3-6964e6cfad-e0a325e39b.zip +0 -0
  338. package/.yarn/cache/core-util-is-npm-1.0.2-9fc2b94dc3-7a4c925b49.zip +0 -0
  339. package/.yarn/cache/cosmiconfig-npm-6.0.0-cb7d64a2b9-8eed7c854b.zip +0 -0
  340. package/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip +0 -0
  341. package/.yarn/cache/css-blank-pseudo-npm-5.0.1-b30f0dbdbd-d5e94c4bc4.zip +0 -0
  342. package/.yarn/cache/css-has-pseudo-npm-5.0.1-1e21124076-6674393fe7.zip +0 -0
  343. package/.yarn/cache/css-in-js-utils-npm-2.0.1-235acac2dc-c9964c4708.zip +0 -0
  344. package/.yarn/cache/css-prefers-color-scheme-npm-8.0.1-66ab97dc9a-766ff644d4.zip +0 -0
  345. package/.yarn/cache/css-selector-parser-npm-1.4.1-b8c642c4c5-31948754e5.zip +0 -0
  346. package/.yarn/cache/css-tree-npm-1.1.2-6640724d34-b92e643912.zip +0 -0
  347. package/.yarn/cache/cssdb-npm-7.4.1-8827244a56-c58803ce3e.zip +0 -0
  348. package/.yarn/cache/cssesc-npm-3.0.0-15ec56f86f-f8c4ababff.zip +0 -0
  349. package/.yarn/cache/csstype-npm-3.0.2-fe855324c2-9101a34a6b.zip +0 -0
  350. package/.yarn/cache/csstype-npm-3.0.7-10cebfb3bb-2f30c993be.zip +0 -0
  351. package/.yarn/cache/dashdash-npm-1.14.1-be8f10a286-3634c24957.zip +0 -0
  352. package/.yarn/cache/date-arithmetic-npm-4.1.0-0157142f17-656c099864.zip +0 -0
  353. package/.yarn/cache/date-fns-npm-2.27.0-8177de8a5e-db62036b38.zip +0 -0
  354. package/.yarn/cache/date-fns-npm-2.29.3-fef7e3c72c-e01cf5b62a.zip +0 -0
  355. package/.yarn/cache/debug-npm-3.1.0-9f0accb99b-0b52718ab9.zip +0 -0
  356. package/.yarn/cache/debug-npm-4.1.1-540248b3aa-1e681f5cce.zip +0 -0
  357. package/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip +0 -0
  358. package/.yarn/cache/decco-npm-1.6.0-d2ad70e765-5ffc15789e.zip +0 -0
  359. package/.yarn/cache/decode-named-character-reference-npm-1.0.2-db17a755fd-f4c71d3b93.zip +0 -0
  360. package/.yarn/cache/dedent-npm-0.7.0-2dbb45a4c5-87de191050.zip +0 -0
  361. package/.yarn/cache/deep-equal-npm-1.1.1-67ff9c29b9-f92686f2c5.zip +0 -0
  362. package/.yarn/cache/define-properties-npm-1.1.3-0f3115e2b9-da80dba55d.zip +0 -0
  363. package/.yarn/cache/defined-npm-1.0.0-891782ba77-77672997c5.zip +0 -0
  364. package/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip +0 -0
  365. package/.yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip +0 -0
  366. package/.yarn/cache/depd-npm-1.1.2-b0c8414da7-6b406620d2.zip +0 -0
  367. package/.yarn/cache/dequal-npm-2.0.2-370927eb6c-86c7a2c59f.zip +0 -0
  368. package/.yarn/cache/dequal-npm-2.0.3-53a630c60e-8679b850e1.zip +0 -0
  369. package/.yarn/cache/detect-node-es-npm-1.0.0-12fe886773-e058eee3fa.zip +0 -0
  370. package/.yarn/cache/detect-node-es-npm-1.1.0-2ad57e0b50-e46307d726.zip +0 -0
  371. package/.yarn/cache/detective-npm-5.2.1-6417517bd5-dc4601bbc6.zip +0 -0
  372. package/.yarn/cache/didyoumean-npm-1.2.2-fd568ec571-d5d98719d5.zip +0 -0
  373. package/.yarn/cache/diff-npm-5.1.0-d24d222280-c7bf0df7c9.zip +0 -0
  374. package/.yarn/cache/dlv-npm-1.1.3-187c903a21-d7381bca22.zip +0 -0
  375. package/.yarn/cache/dom-helpers-npm-5.2.0-4c13ee1a2c-bea3e7217c.zip +0 -0
  376. package/.yarn/cache/dom-helpers-npm-5.2.1-b38bb4470b-863ba9e086.zip +0 -0
  377. package/.yarn/cache/dom-serializer-npm-1.3.2-133de2b9ce-bff4871494.zip +0 -0
  378. package/.yarn/cache/domelementtype-npm-2.0.1-23794ee948-940c62d1c4.zip +0 -0
  379. package/.yarn/cache/domelementtype-npm-2.2.0-c37b3b15bf-24cb386198.zip +0 -0
  380. package/.yarn/cache/domhandler-npm-3.3.0-6417f7e17e-850e5e9fee.zip +0 -0
  381. package/.yarn/cache/domhandler-npm-4.3.0-d142f8b6f6-d2a2dbf40d.zip +0 -0
  382. package/.yarn/cache/domutils-npm-2.8.0-0325139e5c-abf7434315.zip +0 -0
  383. package/.yarn/cache/ecc-jsbn-npm-0.1.2-85b7a7be89-22fef4b620.zip +0 -0
  384. package/.yarn/cache/electron-to-chromium-npm-1.4.272-132166c45b-61774a4830.zip +0 -0
  385. package/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip +0 -0
  386. package/.yarn/cache/emojis-list-npm-3.0.0-7faa48e6fd-ddaaa02542.zip +0 -0
  387. package/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip +0 -0
  388. package/.yarn/cache/entities-npm-2.0.3-9763a6a3bc-5a7899fcc6.zip +0 -0
  389. package/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip +0 -0
  390. package/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip +0 -0
  391. package/.yarn/cache/error-ex-npm-1.3.2-5654f80c0f-c1c2b8b65f.zip +0 -0
  392. package/.yarn/cache/error-stack-parser-npm-2.0.6-1c5bf07f6c-bd8e048fcb.zip +0 -0
  393. package/.yarn/cache/esbuild-linux-64-npm-0.14.54-2cb8070ade-8.zip +0 -0
  394. package/.yarn/cache/esbuild-npm-0.14.54-b3dcd8a41e-49e360b118.zip +0 -0
  395. package/.yarn/cache/esbuild-npm-0.16.17-89fa4ab0dd-4c2cc609ec.zip +0 -0
  396. package/.yarn/cache/escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip +0 -0
  397. package/.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip +0 -0
  398. package/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip +0 -0
  399. package/.yarn/cache/estree-util-attach-comments-npm-2.1.0-f9cac2d67d-8489b977dc.zip +0 -0
  400. package/.yarn/cache/estree-util-build-jsx-npm-2.2.2-c3f1420348-d008ac36a4.zip +0 -0
  401. package/.yarn/cache/estree-util-is-identifier-name-npm-2.0.1-e45f824070-d91693dc1c.zip +0 -0
  402. package/.yarn/cache/estree-util-to-js-npm-1.1.0-2457dbf12d-3ce2ef2fd7.zip +0 -0
  403. package/.yarn/cache/estree-util-visit-npm-1.2.0-979c328a17-d36a36aed8.zip +0 -0
  404. package/.yarn/cache/estree-walker-npm-2.0.2-dfab42f65c-6151e6f982.zip +0 -0
  405. package/.yarn/cache/estree-walker-npm-3.0.2-c6ce7a346a-ecf457e8d4.zip +0 -0
  406. package/.yarn/cache/execa-npm-5.1.1-191347acf5-fba9022c8c.zip +0 -0
  407. package/.yarn/cache/extend-npm-3.0.2-e1ca07ac54-a50a8309ca.zip +0 -0
  408. package/.yarn/cache/extsprintf-npm-1.3.0-61a92b324c-cee7a4a1e3.zip +0 -0
  409. package/.yarn/cache/extsprintf-npm-1.4.0-2b015bcaab-184dc8a413.zip +0 -0
  410. package/.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip +0 -0
  411. package/.yarn/cache/fast-glob-npm-3.2.12-162763bbae-0b1990f6ce.zip +0 -0
  412. package/.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip +0 -0
  413. package/.yarn/cache/fast-shallow-equal-npm-1.0.0-b14ca484b4-ae89318ce4.zip +0 -0
  414. package/.yarn/cache/fastest-stable-stringify-npm-2.0.2-f2a059d214-5e2cb166c7.zip +0 -0
  415. package/.yarn/cache/fastq-npm-1.11.0-840a129ad5-9db0ceea92.zip +0 -0
  416. package/.yarn/cache/fault-npm-2.0.1-c462630f58-c9b30f47d9.zip +0 -0
  417. package/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-cc283f4e65.zip +0 -0
  418. package/.yarn/cache/find-cache-dir-npm-3.3.1-66916b4b23-0f7c22b65e.zip +0 -0
  419. package/.yarn/cache/find-root-npm-1.1.0-a16a94005f-b2a59fe4b6.zip +0 -0
  420. package/.yarn/cache/find-up-npm-4.1.0-c3ccf8d855-4c172680e8.zip +0 -0
  421. package/.yarn/cache/flatten-npm-1.0.3-87bf6559dd-5c57379816.zip +0 -0
  422. package/.yarn/cache/focus-lock-npm-0.9.2-6d20c4c409-7bb35e62c6.zip +0 -0
  423. package/.yarn/cache/follow-redirects-npm-1.14.4-19eb02e590-d4ce74cf5c.zip +0 -0
  424. package/.yarn/cache/follow-redirects-npm-1.5.10-bde6f43576-0edc4b74e3.zip +0 -0
  425. package/.yarn/cache/forever-agent-npm-0.6.1-01dae53bf9-766ae6e220.zip +0 -0
  426. package/.yarn/cache/form-data-npm-2.3.3-c016cc11c0-10c1780fa1.zip +0 -0
  427. package/.yarn/cache/format-npm-0.2.2-679f3acc64-646a60e133.zip +0 -0
  428. package/.yarn/cache/fraction.js-npm-4.2.0-28efe4afc7-8c76a6e21d.zip +0 -0
  429. package/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip +0 -0
  430. package/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip +0 -0
  431. package/.yarn/cache/fsevents-npm-2.3.1-02bd92e9f4-7992dac796.zip +0 -0
  432. package/.yarn/cache/fsevents-npm-2.3.2-a881d6ac9f-97ade64e75.zip +0 -0
  433. package/.yarn/cache/function-bind-npm-1.1.1-b56b322ae9-b32fbaebb3.zip +0 -0
  434. package/.yarn/cache/gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip +0 -0
  435. package/.yarn/cache/gensync-npm-1.0.0-beta.2-224666d72f-a7437e58c6.zip +0 -0
  436. package/.yarn/cache/get-intrinsic-npm-1.1.1-7e868745da-a9fe2ca8fa.zip +0 -0
  437. package/.yarn/cache/get-nonce-npm-1.0.1-6272950b34-e2614e43b4.zip +0 -0
  438. package/.yarn/cache/get-stream-npm-6.0.1-83e51a4642-e04ecece32.zip +0 -0
  439. package/.yarn/cache/getpass-npm-0.1.7-519164a3be-ab18d55661.zip +0 -0
  440. package/.yarn/cache/github-slugger-npm-2.0.0-3afba76e6c-250375cde2.zip +0 -0
  441. package/.yarn/cache/glob-npm-5.0.15-59b17ec4cb-f974244830.zip +0 -0
  442. package/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip +0 -0
  443. package/.yarn/cache/glob-npm-8.1.0-65f64af8b1-92fbea3221.zip +0 -0
  444. package/.yarn/cache/glob-parent-npm-5.1.1-57b061cd88-9f9a19c8d4.zip +0 -0
  445. package/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-f4f2bfe242.zip +0 -0
  446. package/.yarn/cache/glob-parent-npm-6.0.2-2cbef12738-c13ee97978.zip +0 -0
  447. package/.yarn/cache/globalize-npm-0.1.1-de06b5a11f-bc69e81c5f.zip +0 -0
  448. package/.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip +0 -0
  449. package/.yarn/cache/globby-npm-2.1.0-9c603a6897-66f792a99e.zip +0 -0
  450. package/.yarn/cache/graceful-fs-npm-4.2.10-79c70989ca-3f109d70ae.zip +0 -0
  451. package/.yarn/cache/gud-npm-1.0.0-9747ac46ec-3e2eb37cf7.zip +0 -0
  452. package/.yarn/cache/har-schema-npm-2.0.0-3a318c0ca5-d8946348f3.zip +0 -0
  453. package/.yarn/cache/har-validator-npm-5.1.3-f192d43c41-5903ddf55f.zip +0 -0
  454. package/.yarn/cache/has-ansi-npm-2.0.0-9bf0cff2af-1b51daa021.zip +0 -0
  455. package/.yarn/cache/has-flag-npm-1.0.0-9e0c397172-ce3f8ae978.zip +0 -0
  456. package/.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip +0 -0
  457. package/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip +0 -0
  458. package/.yarn/cache/has-npm-1.0.3-b7f00631c1-b9ad53d53b.zip +0 -0
  459. package/.yarn/cache/has-symbols-npm-1.0.1-b783bc25ec-4f09be6682.zip +0 -0
  460. package/.yarn/cache/has-symbols-npm-1.0.2-50e53af115-2309c42607.zip +0 -0
  461. package/.yarn/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-cc12eb28cb.zip +0 -0
  462. package/.yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip +0 -0
  463. package/.yarn/cache/hast-util-has-property-npm-1.0.4-a09b607810-23025cee66.zip +0 -0
  464. package/.yarn/cache/hast-util-has-property-npm-2.0.1-aa6919669c-cc909b7e29.zip +0 -0
  465. package/.yarn/cache/hast-util-heading-rank-npm-2.1.1-0d71da5801-a49233e9ac.zip +0 -0
  466. package/.yarn/cache/hast-util-is-element-npm-1.1.0-be10e62fa7-30fad3f65e.zip +0 -0
  467. package/.yarn/cache/hast-util-is-element-npm-2.1.3-3051d610ff-9d988f6839.zip +0 -0
  468. package/.yarn/cache/hast-util-select-npm-1.0.1-115974f390-9cdb20850f.zip +0 -0
  469. package/.yarn/cache/hast-util-to-estree-npm-2.2.1-a5b4ca1f7d-999107a387.zip +0 -0
  470. package/.yarn/cache/hast-util-to-string-npm-2.0.0-c6108aa2b8-0c087f8dee.zip +0 -0
  471. package/.yarn/cache/hast-util-to-text-npm-3.1.2-922eb1f623-d17cf3344c.zip +0 -0
  472. package/.yarn/cache/hast-util-whitespace-npm-1.0.4-43bb1ff3d0-b7f4a1942b.zip +0 -0
  473. package/.yarn/cache/hast-util-whitespace-npm-2.0.1-0cb2b36fdf-431be6b2f3.zip +0 -0
  474. package/.yarn/cache/highlight.js-npm-11.7.0-02dfe9a289-19e3fb8b56.zip +0 -0
  475. package/.yarn/cache/hoist-non-react-statics-npm-3.3.2-e7b709e6c1-b153827042.zip +0 -0
  476. package/.yarn/cache/htmlparser2-npm-4.1.0-484402b323-615fcf34ae.zip +0 -0
  477. package/.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-974de94a81.zip +0 -0
  478. package/.yarn/cache/http-proxy-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip +0 -0
  479. package/.yarn/cache/http-signature-npm-1.2.0-ee92426f34-3324598712.zip +0 -0
  480. package/.yarn/cache/https-proxy-agent-npm-5.0.1-42d65f358e-571fccdf38.zip +0 -0
  481. package/.yarn/cache/human-signals-npm-2.1.0-f75815481d-b87fd89fce.zip +0 -0
  482. package/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip +0 -0
  483. package/.yarn/cache/husky-npm-8.0.3-b0b59c5127-837bc7e441.zip +0 -0
  484. package/.yarn/cache/hyphenate-style-name-npm-1.0.4-a79c7da506-4f5bf4b055.zip +0 -0
  485. package/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip +0 -0
  486. package/.yarn/cache/immutable-npm-4.0.0-74b844f82e-4b5e9181e4.zip +0 -0
  487. package/.yarn/cache/import-fresh-npm-3.2.1-b4f6711244-caef42418a.zip +0 -0
  488. package/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip +0 -0
  489. package/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip +0 -0
  490. package/.yarn/cache/indexes-of-npm-1.0.1-5ce8500941-4f9799b173.zip +0 -0
  491. package/.yarn/cache/infer-owner-npm-1.0.4-685ac3d2af-181e732764.zip +0 -0
  492. package/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip +0 -0
  493. package/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip +0 -0
  494. package/.yarn/cache/inline-style-parser-npm-0.1.1-702eac409f-5d545056a3.zip +0 -0
  495. package/.yarn/cache/inline-style-prefixer-npm-6.0.0-1495b86fb7-1331a6184b.zip +0 -0
  496. package/.yarn/cache/intl-messageformat-npm-10.2.5-0d8dd1b0b8-048d6e3e74.zip +0 -0
  497. package/.yarn/cache/invariant-npm-2.2.4-717fbdb119-cc3182d793.zip +0 -0
  498. package/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip +0 -0
  499. package/.yarn/cache/is-alphabetical-npm-2.0.1-054fa4f335-56207db8d9.zip +0 -0
  500. package/.yarn/cache/is-alphanumerical-npm-2.0.1-33fafdbb47-87acc06800.zip +0 -0
  501. package/.yarn/cache/is-arguments-npm-1.0.4-c0da5c85ee-a40ce1580c.zip +0 -0
  502. package/.yarn/cache/is-arrayish-npm-0.2.1-23927dfb15-eef4417e3c.zip +0 -0
  503. package/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-84192eb88c.zip +0 -0
  504. package/.yarn/cache/is-buffer-npm-2.0.4-ce097f06a1-b1616ff40c.zip +0 -0
  505. package/.yarn/cache/is-ci-npm-3.0.1-d9aea361e1-192c66dc78.zip +0 -0
  506. package/.yarn/cache/is-core-module-npm-2.9.0-5ba77c35ae-b27034318b.zip +0 -0
  507. package/.yarn/cache/is-date-object-npm-1.0.2-461fbe93c0-ac859426e5.zip +0 -0
  508. package/.yarn/cache/is-decimal-npm-2.0.1-828eaaadd3-97132de7ac.zip +0 -0
  509. package/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip +0 -0
  510. package/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip +0 -0
  511. package/.yarn/cache/is-glob-npm-4.0.1-341760116f-84627cad11.zip +0 -0
  512. package/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip +0 -0
  513. package/.yarn/cache/is-hexadecimal-npm-2.0.1-00f396bd63-66a2ea8599.zip +0 -0
  514. package/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip +0 -0
  515. package/.yarn/cache/is-number-npm-7.0.0-060086935c-456ac6f8e0.zip +0 -0
  516. package/.yarn/cache/is-plain-obj-npm-4.1.0-a4f2a92b44-6dc45da70d.zip +0 -0
  517. package/.yarn/cache/is-reference-npm-3.0.1-6d25a4ca74-12c316d161.zip +0 -0
  518. package/.yarn/cache/is-regex-npm-1.1.4-cca193ef11-362399b335.zip +0 -0
  519. package/.yarn/cache/is-stream-npm-2.0.1-c802db55e7-b8e05ccdf9.zip +0 -0
  520. package/.yarn/cache/is-typedarray-npm-1.0.0-bbd99de5b6-3508c6cd0a.zip +0 -0
  521. package/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip +0 -0
  522. package/.yarn/cache/isobject-npm-3.0.1-8145901fd2-db85c4c970.zip +0 -0
  523. package/.yarn/cache/isstream-npm-0.1.2-8581c75385-1eb2fe63a7.zip +0 -0
  524. package/.yarn/cache/js-base64-npm-2.6.1-2ff91bc670-ec537fc08f.zip +0 -0
  525. package/.yarn/cache/js-cookie-npm-2.2.1-e879cd2148-9b1fb980a1.zip +0 -0
  526. package/.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip +0 -0
  527. package/.yarn/cache/jsbn-npm-0.1.1-0eb7132404-e5ff29c1b8.zip +0 -0
  528. package/.yarn/cache/jsesc-npm-2.5.2-c5acb78804-4dc1907711.zip +0 -0
  529. package/.yarn/cache/json-parse-better-errors-npm-1.0.2-7f37637d19-ff2b5ba2a7.zip +0 -0
  530. package/.yarn/cache/json-schema-npm-0.2.3-018ee3dfc9-bbc2070988.zip +0 -0
  531. package/.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip +0 -0
  532. package/.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-48ec0adad5.zip +0 -0
  533. package/.yarn/cache/json5-npm-2.1.3-b71ec6bcca-b2de57a665.zip +0 -0
  534. package/.yarn/cache/json5-npm-2.2.1-44675c859c-74b8a23b10.zip +0 -0
  535. package/.yarn/cache/json5-npm-2.2.3-9962c55073-2a7436a933.zip +0 -0
  536. package/.yarn/cache/jsprim-npm-1.4.1-948d2c9ec3-6bcb20ec26.zip +0 -0
  537. package/.yarn/cache/kleur-npm-4.1.5-46b6135f41-1dc476e327.zip +0 -0
  538. package/.yarn/cache/lenses-ppx-npm-6.1.10-b1b7660621-1f045ace4d.zip +0 -0
  539. package/.yarn/cache/lilconfig-npm-2.0.5-ba2b9195a0-f7bb9e4265.zip +0 -0
  540. package/.yarn/cache/lilconfig-npm-2.0.6-6231346eaf-40a3cd72f1.zip +0 -0
  541. package/.yarn/cache/lines-and-columns-npm-1.1.6-23e74fab67-198a5436b1.zip +0 -0
  542. package/.yarn/cache/list-selectors-npm-2.0.1-42168ab749-160ab40c65.zip +0 -0
  543. package/.yarn/cache/loader-utils-npm-2.0.0-cf7d5aadbf-6856423131.zip +0 -0
  544. package/.yarn/cache/locate-path-npm-5.0.0-46580c43e4-83e51725e6.zip +0 -0
  545. package/.yarn/cache/lodash-es-npm-4.17.21-b45832dfce-05cbffad6e.zip +0 -0
  546. package/.yarn/cache/lodash-npm-4.17.15-566d9324f7-bb689bc88c.zip +0 -0
  547. package/.yarn/cache/lodash-npm-4.17.21-6382451519-eb835a2e51.zip +0 -0
  548. package/.yarn/cache/log-symbols-npm-1.0.2-2224ede6fd-5214ade938.zip +0 -0
  549. package/.yarn/cache/longest-streak-npm-3.1.0-e2ab1c40ee-d7f952ed00.zip +0 -0
  550. package/.yarn/cache/loose-envify-npm-1.4.0-6307b72ccf-6517e24e0c.zip +0 -0
  551. package/.yarn/cache/lowlight-npm-2.8.0-c65abb6cac-c45a91e715.zip +0 -0
  552. package/.yarn/cache/lru-cache-npm-5.1.1-f475882a51-c154ae1cbb.zip +0 -0
  553. package/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip +0 -0
  554. package/.yarn/cache/lru-cache-npm-7.14.1-d3ba9407b6-d72c6713c6.zip +0 -0
  555. package/.yarn/cache/luxon-npm-2.4.0-53e53c605a-6071028d65.zip +0 -0
  556. package/.yarn/cache/magic-string-npm-0.27.0-a60a83c0b4-273faaa50b.zip +0 -0
  557. package/.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip +0 -0
  558. package/.yarn/cache/make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip +0 -0
  559. package/.yarn/cache/markdown-extensions-npm-1.1.1-633329e3d0-8a6dd128be.zip +0 -0
  560. package/.yarn/cache/mdast-util-definitions-npm-5.1.1-0d936c28d7-f8025e2c35.zip +0 -0
  561. package/.yarn/cache/mdast-util-from-markdown-npm-1.2.0-0e8d4c3b86-fadc3521a3.zip +0 -0
  562. package/.yarn/cache/mdast-util-mdx-expression-npm-1.3.1-91ad9dc9cc-456d59a616.zip +0 -0
  563. package/.yarn/cache/mdast-util-mdx-jsx-npm-2.1.0-24a19bddca-40520a2994.zip +0 -0
  564. package/.yarn/cache/mdast-util-mdx-npm-2.0.0-344d686584-4744bfbbd3.zip +0 -0
  565. package/.yarn/cache/mdast-util-mdxjs-esm-npm-1.3.0-9a00c4f560-df3902eb88.zip +0 -0
  566. package/.yarn/cache/mdast-util-phrasing-npm-3.0.0-762d27a73f-3cf0812c7f.zip +0 -0
  567. package/.yarn/cache/mdast-util-to-hast-npm-12.2.5-5a676b6a51-06337d66b3.zip +0 -0
  568. package/.yarn/cache/mdast-util-to-markdown-npm-1.5.0-43c48b6c48-64338eb33e.zip +0 -0
  569. package/.yarn/cache/mdast-util-to-string-npm-3.1.0-d888f00663-f42ddd4e22.zip +0 -0
  570. package/.yarn/cache/mdn-data-npm-2.0.14-0acd669f0d-9d0128ed42.zip +0 -0
  571. package/.yarn/cache/memoize-one-npm-6.0.0-8b2a2cd020-f185ea69f7.zip +0 -0
  572. package/.yarn/cache/merge-stream-npm-2.0.0-2ac83efea5-6fa4dcc8d8.zip +0 -0
  573. package/.yarn/cache/merge2-npm-1.4.1-a2507bd06c-7268db63ed.zip +0 -0
  574. package/.yarn/cache/micromark-core-commonmark-npm-1.0.6-fad8e6e27b-4b483c4607.zip +0 -0
  575. package/.yarn/cache/micromark-extension-mdx-expression-npm-1.0.3-079c475644-ef4b413789.zip +0 -0
  576. package/.yarn/cache/micromark-extension-mdx-jsx-npm-1.0.3-6fc8150033-1a5566890a.zip +0 -0
  577. package/.yarn/cache/micromark-extension-mdx-md-npm-1.0.0-4482adfb24-b4f205e1d5.zip +0 -0
  578. package/.yarn/cache/micromark-extension-mdxjs-esm-npm-1.0.3-61f0769b16-7560746563.zip +0 -0
  579. package/.yarn/cache/micromark-extension-mdxjs-npm-1.0.0-d2b6b69e4a-ba836c6d2d.zip +0 -0
  580. package/.yarn/cache/micromark-factory-destination-npm-1.0.0-ead4af0386-8e733ae9c1.zip +0 -0
  581. package/.yarn/cache/micromark-factory-label-npm-1.0.2-aa46281fdc-957e9366bd.zip +0 -0
  582. package/.yarn/cache/micromark-factory-mdx-expression-npm-1.0.6-52ec4ada2c-7b69f0e776.zip +0 -0
  583. package/.yarn/cache/micromark-factory-space-npm-1.0.0-e5fee5c60c-70d3aafde4.zip +0 -0
  584. package/.yarn/cache/micromark-factory-title-npm-1.0.2-3739fc0d5d-9a9cf66bab.zip +0 -0
  585. package/.yarn/cache/micromark-factory-whitespace-npm-1.0.0-ea665f7a7c-0888386e6e.zip +0 -0
  586. package/.yarn/cache/micromark-npm-3.1.0-2432407996-5fe5bc3bf9.zip +0 -0
  587. package/.yarn/cache/micromark-util-character-npm-1.1.0-fe6b5d2ff8-504a4e3321.zip +0 -0
  588. package/.yarn/cache/micromark-util-chunked-npm-1.0.0-456e2b513f-c1efd56e8c.zip +0 -0
  589. package/.yarn/cache/micromark-util-classify-character-npm-1.0.0-68787d9dc2-180446e6a1.zip +0 -0
  590. package/.yarn/cache/micromark-util-combine-extensions-npm-1.0.0-f13e57de5b-5304a820ef.zip +0 -0
  591. package/.yarn/cache/micromark-util-decode-numeric-character-reference-npm-1.0.0-68686444bf-f3ae2bb582.zip +0 -0
  592. package/.yarn/cache/micromark-util-decode-string-npm-1.0.2-6aaf8c3c42-2dbb41c969.zip +0 -0
  593. package/.yarn/cache/micromark-util-encode-npm-1.0.1-53c61ae1ae-9290583abf.zip +0 -0
  594. package/.yarn/cache/micromark-util-events-to-acorn-npm-1.2.0-71f0f7b778-422285d68c.zip +0 -0
  595. package/.yarn/cache/micromark-util-html-tag-name-npm-1.1.0-a218ca069f-a9b783cec8.zip +0 -0
  596. package/.yarn/cache/micromark-util-normalize-identifier-npm-1.0.0-79f4e82268-d7c09d5e83.zip +0 -0
  597. package/.yarn/cache/micromark-util-resolve-all-npm-1.0.0-cb1a6324ae-409667f2bd.zip +0 -0
  598. package/.yarn/cache/micromark-util-sanitize-uri-npm-1.1.0-4389b68137-fe6093faa0.zip +0 -0
  599. package/.yarn/cache/micromark-util-subtokenize-npm-1.0.2-9d0d437340-c32ee58a7e.zip +0 -0
  600. package/.yarn/cache/micromark-util-symbol-npm-1.0.1-e674dcf8f4-c6a3023b3a.zip +0 -0
  601. package/.yarn/cache/micromark-util-types-npm-1.0.2-83e6ddb6df-08dc901b7c.zip +0 -0
  602. package/.yarn/cache/micromatch-npm-4.0.4-9fdcbb7a0e-ef3d1c88e7.zip +0 -0
  603. package/.yarn/cache/micromatch-npm-4.0.5-cfab5d7669-02a17b671c.zip +0 -0
  604. package/.yarn/cache/mime-db-npm-1.44.0-d6ab7b4e20-b261399680.zip +0 -0
  605. package/.yarn/cache/mime-types-npm-2.1.27-bbebca8e17-4c1f596c6d.zip +0 -0
  606. package/.yarn/cache/mimic-fn-npm-2.1.0-4fbeb3abb4-d2421a3444.zip +0 -0
  607. package/.yarn/cache/minimatch-npm-3.0.4-6e76f51c23-66ac295f8a.zip +0 -0
  608. package/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip +0 -0
  609. package/.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-7564208ef8.zip +0 -0
  610. package/.yarn/cache/minimist-npm-1.2.5-ced0e1f617-86706ce5b3.zip +0 -0
  611. package/.yarn/cache/minimist-npm-1.2.6-f4cee4b4af-d15428cd1e.zip +0 -0
  612. package/.yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip +0 -0
  613. package/.yarn/cache/minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip +0 -0
  614. package/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip +0 -0
  615. package/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip +0 -0
  616. package/.yarn/cache/minipass-npm-4.0.0-2520d5ae3c-7a609afbf3.zip +0 -0
  617. package/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip +0 -0
  618. package/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip +0 -0
  619. package/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip +0 -0
  620. package/.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip +0 -0
  621. package/.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip +0 -0
  622. package/.yarn/cache/moment-timezone-npm-0.5.34-e4fe2d01f6-12a1d3d52e.zip +0 -0
  623. package/.yarn/cache/mri-npm-1.2.0-8ecee0357d-83f515abbc.zip +0 -0
  624. package/.yarn/cache/ms-npm-2.0.0-9e1101a471-0e6a22b8b7.zip +0 -0
  625. package/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip +0 -0
  626. package/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip +0 -0
  627. package/.yarn/cache/nano-css-npm-5.3.1-b5193932b9-45517871e8.zip +0 -0
  628. package/.yarn/cache/nanoid-npm-3.3.4-3d250377d6-2fddd6dee9.zip +0 -0
  629. package/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip +0 -0
  630. package/.yarn/cache/node-gyp-npm-9.3.1-43540bab9c-b860e9976f.zip +0 -0
  631. package/.yarn/cache/node-releases-npm-2.0.6-8accb3fefb-e86a926dc9.zip +0 -0
  632. package/.yarn/cache/nopt-npm-6.0.0-5ea8050815-82149371f8.zip +0 -0
  633. package/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip +0 -0
  634. package/.yarn/cache/normalize-range-npm-0.1.2-bec5e259e2-9b2f14f093.zip +0 -0
  635. package/.yarn/cache/not-npm-0.1.0-a1712708cd-8043bb53bc.zip +0 -0
  636. package/.yarn/cache/npm-run-path-npm-4.0.1-7aebd8bab3-5374c0cea4.zip +0 -0
  637. package/.yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip +0 -0
  638. package/.yarn/cache/nth-check-npm-1.0.2-3f6d0d22eb-59e115fdd7.zip +0 -0
  639. package/.yarn/cache/oauth-sign-npm-0.9.0-7aa9422221-8f5497a127.zip +0 -0
  640. package/.yarn/cache/object-assign-npm-3.0.0-8d79858461-56c66a7731.zip +0 -0
  641. package/.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip +0 -0
  642. package/.yarn/cache/object-hash-npm-3.0.0-d941e0cabe-80b4904bb3.zip +0 -0
  643. package/.yarn/cache/object-is-npm-1.1.5-48a862602b-989b18c4cb.zip +0 -0
  644. package/.yarn/cache/object-keys-npm-1.1.1-1bf2f1be93-b363c5e764.zip +0 -0
  645. package/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip +0 -0
  646. package/.yarn/cache/onetime-npm-5.1.2-3ed148fa42-2478859ef8.zip +0 -0
  647. package/.yarn/cache/p-limit-npm-2.3.0-94a0310039-84ff17f1a3.zip +0 -0
  648. package/.yarn/cache/p-locate-npm-4.1.0-eec6872537-513bd14a45.zip +0 -0
  649. package/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip +0 -0
  650. package/.yarn/cache/p-try-npm-2.2.0-e0390dbaf8-f8a8e9a769.zip +0 -0
  651. package/.yarn/cache/parent-module-npm-1.0.1-1fae11b095-6ba8b25514.zip +0 -0
  652. package/.yarn/cache/parse-entities-npm-4.0.0-fd521e2809-cd9fa53bc0.zip +0 -0
  653. package/.yarn/cache/parse-json-npm-5.0.1-84159e1d7f-63063f966e.zip +0 -0
  654. package/.yarn/cache/parse-srcset-npm-1.0.2-8acc142245-3a0380380c.zip +0 -0
  655. package/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip +0 -0
  656. package/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip +0 -0
  657. package/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip +0 -0
  658. package/.yarn/cache/path-parse-npm-1.0.6-4a4c90546c-962a85dd38.zip +0 -0
  659. package/.yarn/cache/path-parse-npm-1.0.7-09564527b7-49abf3d811.zip +0 -0
  660. package/.yarn/cache/path-type-npm-4.0.0-10d47fc86a-5b1e2daa24.zip +0 -0
  661. package/.yarn/cache/performance-now-npm-2.1.0-45e3ce7e49-534e641aa8.zip +0 -0
  662. package/.yarn/cache/periscopic-npm-3.0.4-d931e882c3-0920ea1b02.zip +0 -0
  663. package/.yarn/cache/picocolors-npm-0.2.1-fa0e648c44-3b0f441f00.zip +0 -0
  664. package/.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip +0 -0
  665. package/.yarn/cache/picomatch-npm-2.2.2-1ce736a913-897a589f94.zip +0 -0
  666. package/.yarn/cache/picomatch-npm-2.3.0-5e60e6c82d-16818720ea.zip +0 -0
  667. package/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-050c865ce8.zip +0 -0
  668. package/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip +0 -0
  669. package/.yarn/cache/pkg-dir-npm-4.2.0-2b5d0a8d32-9863e3f351.zip +0 -0
  670. package/.yarn/cache/popper.js-npm-1.16.1-a99192bd83-c56ae5001e.zip +0 -0
  671. package/.yarn/cache/postcss-attribute-case-insensitive-npm-6.0.1-53cf4e827e-1feb61c031.zip +0 -0
  672. package/.yarn/cache/postcss-clamp-npm-4.1.0-32ba814068-118eec936b.zip +0 -0
  673. package/.yarn/cache/postcss-color-functional-notation-npm-5.0.1-3124cba045-1525779b2d.zip +0 -0
  674. package/.yarn/cache/postcss-color-hex-alpha-npm-9.0.1-4de0057ece-3f35134833.zip +0 -0
  675. package/.yarn/cache/postcss-color-rebeccapurple-npm-8.0.1-60be592329-ea141bf9ca.zip +0 -0
  676. package/.yarn/cache/postcss-custom-media-npm-9.1.1-1a3a67cb63-3694c53423.zip +0 -0
  677. package/.yarn/cache/postcss-custom-properties-npm-13.1.1-31267ed000-21af14e82a.zip +0 -0
  678. package/.yarn/cache/postcss-custom-selectors-npm-7.1.1-74894a31ad-df79db6237.zip +0 -0
  679. package/.yarn/cache/postcss-dir-pseudo-class-npm-7.0.1-76e71e42f9-4d1c204e13.zip +0 -0
  680. package/.yarn/cache/postcss-double-position-gradients-npm-4.0.1-53c9bf55aa-8f17f35082.zip +0 -0
  681. package/.yarn/cache/postcss-focus-visible-npm-8.0.1-7126799e89-6d6734ba0a.zip +0 -0
  682. package/.yarn/cache/postcss-focus-within-npm-7.0.1-0434464641-c110a45427.zip +0 -0
  683. package/.yarn/cache/postcss-font-variant-npm-5.0.0-0a5e349320-a192865892.zip +0 -0
  684. package/.yarn/cache/postcss-gap-properties-npm-4.0.1-2b5cdc5f7e-21a5d5525d.zip +0 -0
  685. package/.yarn/cache/postcss-image-set-function-npm-5.0.1-f7dd97337c-bd55be8ee1.zip +0 -0
  686. package/.yarn/cache/postcss-import-npm-14.1.0-fa5b457156-cd45d406e9.zip +0 -0
  687. package/.yarn/cache/postcss-initial-npm-4.0.1-80cde7a815-6956953853.zip +0 -0
  688. package/.yarn/cache/postcss-js-npm-4.0.0-b053712bf0-14be8a5867.zip +0 -0
  689. package/.yarn/cache/postcss-lab-function-npm-5.0.1-7c27612597-bdca34254b.zip +0 -0
  690. package/.yarn/cache/postcss-load-config-npm-3.1.4-1cb8a7e276-1c589504c2.zip +0 -0
  691. package/.yarn/cache/postcss-logical-npm-6.0.1-3465206299-cb1812fb55.zip +0 -0
  692. package/.yarn/cache/postcss-media-minmax-npm-5.0.0-ba7d6b2179-2cd7283e07.zip +0 -0
  693. package/.yarn/cache/postcss-nested-npm-6.0.0-161af1b204-2105dc52cd.zip +0 -0
  694. package/.yarn/cache/postcss-nesting-npm-11.1.0-29caff6110-639392ca69.zip +0 -0
  695. package/.yarn/cache/postcss-npm-5.2.18-2800d4d3ec-0cb88e7c88.zip +0 -0
  696. package/.yarn/cache/postcss-npm-7.0.39-0f8737296e-4ac793f506.zip +0 -0
  697. package/.yarn/cache/postcss-npm-8.4.19-164042496a-62782723a3.zip +0 -0
  698. package/.yarn/cache/postcss-npm-8.4.21-9ad76bf58d-e39ac60ccd.zip +0 -0
  699. package/.yarn/cache/postcss-opacity-percentage-npm-1.1.3-552e884ed7-54d1b8ca68.zip +0 -0
  700. package/.yarn/cache/postcss-overflow-shorthand-npm-4.0.1-ca060456c3-f0efcea4fb.zip +0 -0
  701. package/.yarn/cache/postcss-page-break-npm-3.0.4-6892987dc4-a7d08c945f.zip +0 -0
  702. package/.yarn/cache/postcss-place-npm-8.0.1-b45b2668b9-c812c858aa.zip +0 -0
  703. package/.yarn/cache/postcss-preset-env-npm-8.0.1-a400fc01d4-18326a03dd.zip +0 -0
  704. package/.yarn/cache/postcss-pseudo-class-any-link-npm-8.0.1-c80df879bb-f84b0fe4c0.zip +0 -0
  705. package/.yarn/cache/postcss-replace-overflow-wrap-npm-4.0.0-e27e12bbc3-3ffe20b300.zip +0 -0
  706. package/.yarn/cache/postcss-reporter-npm-1.4.1-47ed19bd1b-836e7eac3b.zip +0 -0
  707. package/.yarn/cache/postcss-selector-not-npm-7.0.1-8f1507853b-4dec95f785.zip +0 -0
  708. package/.yarn/cache/postcss-selector-parser-npm-1.3.3-7660e6715e-1399993c50.zip +0 -0
  709. package/.yarn/cache/postcss-selector-parser-npm-6.0.10-a4d7aaa270-46afaa60e3.zip +0 -0
  710. package/.yarn/cache/postcss-selector-parser-npm-6.0.11-b2f8bf39d3-0b01aa9c2d.zip +0 -0
  711. package/.yarn/cache/postcss-value-parser-npm-4.2.0-3cef602a6a-819ffab0c9.zip +0 -0
  712. package/.yarn/cache/prismjs-npm-1.29.0-6faa5b04b8-007a8869d4.zip +0 -0
  713. package/.yarn/cache/promise-inflight-npm-1.0.1-5bb925afac-2274948309.zip +0 -0
  714. package/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip +0 -0
  715. package/.yarn/cache/prop-types-npm-15.7.2-d7a04f2274-5eef82fdda.zip +0 -0
  716. package/.yarn/cache/prop-types-npm-15.8.1-17c71ee7ee-c056d3f1c0.zip +0 -0
  717. package/.yarn/cache/property-information-npm-3.2.0-ae434c241d-ed2614520d.zip +0 -0
  718. package/.yarn/cache/property-information-npm-6.2.0-d3b6a6a493-23afce07ba.zip +0 -0
  719. package/.yarn/cache/psl-npm-1.8.0-226099d70e-6150048ed2.zip +0 -0
  720. package/.yarn/cache/punycode-npm-2.1.1-26eb3e15cf-823bf443c6.zip +0 -0
  721. package/.yarn/cache/qs-npm-6.5.2-dbf9d8386b-24af7b9928.zip +0 -0
  722. package/.yarn/cache/queue-microtask-npm-1.2.2-d942879a5d-94a7906b4e.zip +0 -0
  723. package/.yarn/cache/quick-lru-npm-5.1.1-e38e0edce3-a516faa255.zip +0 -0
  724. package/.yarn/cache/raw-loader-npm-4.0.2-94da6c700d-51cc1b0d0e.zip +0 -0
  725. package/.yarn/cache/react-big-calendar-npm-1.5.2-5c30f812ea-c4647cdb2e.zip +0 -0
  726. package/.yarn/cache/react-clientside-effect-npm-1.2.5-6162abd2d1-1ce12cabd7.zip +0 -0
  727. package/.yarn/cache/react-datepicker-npm-3.8.0-3483a19ee4-a6ba6d3a92.zip +0 -0
  728. package/.yarn/cache/react-dom-npm-18.2.0-dd675bca1c-7d323310be.zip +0 -0
  729. package/.yarn/cache/react-error-boundary-npm-3.1.4-2310dba89e-f36270a5d7.zip +0 -0
  730. package/.yarn/cache/react-fast-compare-npm-3.2.0-fbfa6627d9-8ef272c825.zip +0 -0
  731. package/.yarn/cache/react-focus-lock-npm-2.5.2-acf7c7a0c7-520b12a449.zip +0 -0
  732. package/.yarn/cache/react-helmet-npm-6.1.0-20fd5447ff-a4998479da.zip +0 -0
  733. package/.yarn/cache/react-icons-npm-4.7.1-27c284b383-ed3cbdc5fc.zip +0 -0
  734. package/.yarn/cache/react-intl-npm-6.2.5-5ae1877907-826b6ed593.zip +0 -0
  735. package/.yarn/cache/react-is-npm-16.13.1-a9b9382b4f-f7a19ac349.zip +0 -0
  736. package/.yarn/cache/react-is-npm-18.2.0-0cc5edb910-e72d0ba81b.zip +0 -0
  737. package/.yarn/cache/react-lifecycles-compat-npm-3.0.4-d5e285a39e-a904b0fc0a.zip +0 -0
  738. package/.yarn/cache/react-npm-18.2.0-1eae08fee2-88e38092da.zip +0 -0
  739. package/.yarn/cache/react-onclickoutside-npm-6.12.1-72fd42cce1-aae4c1c2e7.zip +0 -0
  740. package/.yarn/cache/react-overlays-npm-5.2.1-cf8f92c86d-ac43b38768.zip +0 -0
  741. package/.yarn/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip +0 -0
  742. package/.yarn/cache/react-portal-npm-4.2.2-bd632ca24a-dc7cd0c690.zip +0 -0
  743. package/.yarn/cache/react-refresh-npm-0.14.0-78ef5eeb73-dc69fa8c99.zip +0 -0
  744. package/.yarn/cache/react-remove-scroll-bar-npm-2.1.0-87a824b3ab-99aed7ab10.zip +0 -0
  745. package/.yarn/cache/react-remove-scroll-npm-2.4.3-7ae050ed05-c2f4277ee9.zip +0 -0
  746. package/.yarn/cache/react-select-npm-5.7.0-1bd3ca6f36-3d29f7bb6d.zip +0 -0
  747. package/.yarn/cache/react-side-effect-npm-2.1.2-c18e5fd8bd-c5eb1f42b4.zip +0 -0
  748. package/.yarn/cache/react-style-singleton-npm-2.1.0-4eed103b3d-ecd501508d.zip +0 -0
  749. package/.yarn/cache/react-table-npm-7.8.0-61488af438-44ca0fb848.zip +0 -0
  750. package/.yarn/cache/react-transition-group-npm-4.4.1-5b62a122ef-0bcd8af483.zip +0 -0
  751. package/.yarn/cache/react-universal-interface-npm-0.6.2-795659cd0e-070a7e9e3c.zip +0 -0
  752. package/.yarn/cache/react-use-npm-17.4.0-0ef4521544-0889da919b.zip +0 -0
  753. package/.yarn/cache/read-cache-npm-1.0.0-00fa89ed05-cffc728b9e.zip +0 -0
  754. package/.yarn/cache/readable-stream-npm-3.6.0-23a4a5eb56-d4ea81502d.zip +0 -0
  755. package/.yarn/cache/readdirp-npm-3.5.0-a1b1568d32-6b1a9341e2.zip +0 -0
  756. package/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-1ced032e6e.zip +0 -0
  757. package/.yarn/cache/reason-promise-npm-1.1.5-65b3775f1a-0d67a1a1e0.zip +0 -0
  758. package/.yarn/cache/regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip +0 -0
  759. package/.yarn/cache/regenerator-runtime-npm-0.13.7-41bcbe64ea-52b66e6669.zip +0 -0
  760. package/.yarn/cache/regexp.prototype.flags-npm-1.3.1-f0c34f894f-343595db5a.zip +0 -0
  761. package/.yarn/cache/rehype-add-classes-npm-1.0.0-ddf6b4e74d-25c0e2dbf5.zip +0 -0
  762. package/.yarn/cache/rehype-autolink-headings-npm-6.1.1-fe8058cc11-60782fb2e5.zip +0 -0
  763. package/.yarn/cache/rehype-highlight-npm-6.0.0-5179257139-5a70e7ad45.zip +0 -0
  764. package/.yarn/cache/rehype-slug-npm-5.1.0-ae08840ba8-2a7c17fd74.zip +0 -0
  765. package/.yarn/cache/remark-mdx-npm-2.2.1-e380f0c4f0-2e4488cd81.zip +0 -0
  766. package/.yarn/cache/remark-parse-npm-10.0.1-e654d7df78-505088e564.zip +0 -0
  767. package/.yarn/cache/remark-rehype-npm-10.1.0-bd8e6f7d8b-b9ac8acff3.zip +0 -0
  768. package/.yarn/cache/request-npm-2.88.2-f4a57c72c4-4e112c087f.zip +0 -0
  769. package/.yarn/cache/res-react-intl-npm-3.1.2-c5c7923d6a-60daed995f.zip +0 -0
  770. package/.yarn/cache/reschema-npm-1.3.1-ebecdb2423-f33c58cd6f.zip +0 -0
  771. package/.yarn/cache/rescript-classnames-npm-6.0.0-b989da1755-b7690a5fcf.zip +0 -0
  772. package/.yarn/cache/rescript-npm-10.1.2-eb312a329e-e70ae09da1.zip +0 -0
  773. package/.yarn/cache/rescript-react-update-npm-5.0.0-b690d3f05e-0aad3a39a5.zip +0 -0
  774. package/.yarn/cache/resize-observer-polyfill-npm-1.5.1-603120e8a0-57e7f79489.zip +0 -0
  775. package/.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip +0 -0
  776. package/.yarn/cache/resolve-npm-1.17.0-1c4c298f09-9ceaf83b34.zip +0 -0
  777. package/.yarn/cache/resolve-npm-1.22.1-3980488690-07af5fc1e8.zip +0 -0
  778. package/.yarn/cache/resolve-patch-0c52e0e4f7-5656f4d0be.zip +0 -0
  779. package/.yarn/cache/resolve-patch-2a6955419f-6fd799f282.zip +0 -0
  780. package/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip +0 -0
  781. package/.yarn/cache/reusify-npm-1.0.4-95ac4aec11-c3076ebcc2.zip +0 -0
  782. package/.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip +0 -0
  783. package/.yarn/cache/rollup-npm-3.10.0-a133550ae4-31a882689c.zip +0 -0
  784. package/.yarn/cache/rtl-css-js-npm-1.14.0-c83b18f1b7-46e7f52058.zip +0 -0
  785. package/.yarn/cache/run-parallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip +0 -0
  786. package/.yarn/cache/sade-npm-1.8.1-4759dc74c1-0756e5b04c.zip +0 -0
  787. package/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip +0 -0
  788. package/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip +0 -0
  789. package/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip +0 -0
  790. package/.yarn/cache/sanitize-html-npm-1.27.4-443c0c3400-4be0c123e9.zip +0 -0
  791. package/.yarn/cache/sass-npm-1.56.1-d5befb920f-78e693e599.zip +0 -0
  792. package/.yarn/cache/scheduler-npm-0.23.0-a379a6bc3b-d79192eeaa.zip +0 -0
  793. package/.yarn/cache/schema-utils-npm-2.7.0-b668f12427-8889325b0e.zip +0 -0
  794. package/.yarn/cache/schema-utils-npm-3.0.0-e97702da81-56dc93b4f6.zip +0 -0
  795. package/.yarn/cache/screenfull-npm-5.1.0-ec0248d046-e8ab486ba2.zip +0 -0
  796. package/.yarn/cache/semver-npm-6.3.0-b3eace8bfd-1b26ecf6db.zip +0 -0
  797. package/.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip +0 -0
  798. package/.yarn/cache/set-blocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip +0 -0
  799. package/.yarn/cache/set-harmonic-interval-npm-1.0.1-2f840592b2-c122b831c2.zip +0 -0
  800. package/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip +0 -0
  801. package/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip +0 -0
  802. package/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip +0 -0
  803. package/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip +0 -0
  804. package/.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip +0 -0
  805. package/.yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip +0 -0
  806. package/.yarn/cache/source-map-js-npm-1.0.1-c86a8e0dcb-22606113d6.zip +0 -0
  807. package/.yarn/cache/source-map-js-npm-1.0.2-ee4f9f9b30-c049a7fc4d.zip +0 -0
  808. package/.yarn/cache/source-map-npm-0.5.6-ac261b6171-390b3f5165.zip +0 -0
  809. package/.yarn/cache/source-map-npm-0.5.7-7c3f035429-5dc2043b93.zip +0 -0
  810. package/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip +0 -0
  811. package/.yarn/cache/source-map-npm-0.7.4-bc8d018ab6-01cc5a74b1.zip +0 -0
  812. package/.yarn/cache/sourcemap-codec-npm-1.4.8-3a1a9e60b1-b57981c056.zip +0 -0
  813. package/.yarn/cache/space-separated-tokens-npm-1.1.5-2352c83473-8ef68f1cfa.zip +0 -0
  814. package/.yarn/cache/space-separated-tokens-npm-2.0.2-b7ff42c9c6-202e97d7ca.zip +0 -0
  815. package/.yarn/cache/sshpk-npm-1.16.1-feb759e7e0-5e76afd1ce.zip +0 -0
  816. package/.yarn/cache/ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip +0 -0
  817. package/.yarn/cache/stack-generator-npm-2.0.5-61f6fcda09-a85c45a6f1.zip +0 -0
  818. package/.yarn/cache/stackframe-npm-1.2.0-89ca050ce4-37d659bdd5.zip +0 -0
  819. package/.yarn/cache/stacktrace-gps-npm-3.0.4-073ec5f443-b98cb77632.zip +0 -0
  820. package/.yarn/cache/stacktrace-js-npm-2.0.2-f022fac9f9-081e786d56.zip +0 -0
  821. package/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip +0 -0
  822. package/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip +0 -0
  823. package/.yarn/cache/stringify-entities-npm-4.0.3-4f70027330-59e8f523b4.zip +0 -0
  824. package/.yarn/cache/strip-ansi-npm-3.0.1-6aec1365b9-9b974de611.zip +0 -0
  825. package/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip +0 -0
  826. package/.yarn/cache/strip-final-newline-npm-2.0.0-340c4f7c66-69412b5e25.zip +0 -0
  827. package/.yarn/cache/style-to-object-npm-0.4.1-a811cc6cab-2ea213e98e.zip +0 -0
  828. package/.yarn/cache/stylis-npm-4.0.13-3f245d840f-8ea7a87028.zip +0 -0
  829. package/.yarn/cache/stylis-npm-4.0.7-ac28d33880-4f9fdc4b13.zip +0 -0
  830. package/.yarn/cache/supports-color-npm-2.0.0-22c0f0adbc-602538c581.zip +0 -0
  831. package/.yarn/cache/supports-color-npm-3.2.3-117b06af49-56afc05fa8.zip +0 -0
  832. package/.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip +0 -0
  833. package/.yarn/cache/supports-color-npm-7.1.0-df2ba1e338-899480ac85.zip +0 -0
  834. package/.yarn/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-53b1e247e6.zip +0 -0
  835. package/.yarn/cache/swr-npm-2.0.0-5b65435e95-4852d8318e.zip +0 -0
  836. package/.yarn/cache/tabbable-npm-5.3.3-baf35cffe9-1aa56e1bb6.zip +0 -0
  837. package/.yarn/cache/tailwindcss-npm-3.2.4-5ba810eab4-ec187d180c.zip +0 -0
  838. package/.yarn/cache/tar-npm-6.1.13-3234e72781-8a278bed12.zip +0 -0
  839. package/.yarn/cache/throttle-debounce-npm-3.0.1-1785e6b767-e34ef638e8.zip +0 -0
  840. package/.yarn/cache/tiny-invariant-npm-1.3.1-a8ca214e49-872dbd1ff2.zip +0 -0
  841. package/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip +0 -0
  842. package/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-f76fa01b3d.zip +0 -0
  843. package/.yarn/cache/toggle-selection-npm-1.0.6-c506b73005-a90dc80ed1.zip +0 -0
  844. package/.yarn/cache/tough-cookie-npm-2.5.0-79a2fe43fe-16a8cd0902.zip +0 -0
  845. package/.yarn/cache/trim-lines-npm-3.0.1-24471f7e84-e241da1046.zip +0 -0
  846. package/.yarn/cache/trough-npm-2.1.0-20e92f46fc-a577bb561c.zip +0 -0
  847. package/.yarn/cache/ts-easing-npm-0.2.0-988adf6a8d-e67ee862ac.zip +0 -0
  848. package/.yarn/cache/tslib-npm-1.13.0-f5e9ea9b66-50e9327361.zip +0 -0
  849. package/.yarn/cache/tslib-npm-2.1.0-81c9ac9b82-aa189c8179.zip +0 -0
  850. package/.yarn/cache/tslib-npm-2.3.1-0e21e18015-de17a98d46.zip +0 -0
  851. package/.yarn/cache/tslib-npm-2.4.1-36f0ed04db-19480d6e03.zip +0 -0
  852. package/.yarn/cache/tunnel-agent-npm-0.6.0-64345ab7eb-05f6510358.zip +0 -0
  853. package/.yarn/cache/tweetnacl-npm-0.14.5-a3f766c0d1-6061daba17.zip +0 -0
  854. package/.yarn/cache/typed-styles-npm-0.0.7-14151fdbae-36a6ad6bee.zip +0 -0
  855. package/.yarn/cache/uncontrollable-npm-7.2.1-85b30af5c9-3345c0c191.zip +0 -0
  856. package/.yarn/cache/unified-npm-10.1.2-731093c9be-053e7c65ed.zip +0 -0
  857. package/.yarn/cache/uniq-npm-1.0.1-5cab2dd0f3-8206535f83.zip +0 -0
  858. package/.yarn/cache/unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip +0 -0
  859. package/.yarn/cache/unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip +0 -0
  860. package/.yarn/cache/unist-builder-npm-3.0.0-7a683c2dbd-80459ee3c2.zip +0 -0
  861. package/.yarn/cache/unist-util-find-after-npm-4.0.0-11b3b7fb4f-8381ef0bad.zip +0 -0
  862. package/.yarn/cache/unist-util-generated-npm-2.0.0-9eb541f36f-3a806793fa.zip +0 -0
  863. package/.yarn/cache/unist-util-is-npm-5.1.1-eeef3df35f-e8743a19a3.zip +0 -0
  864. package/.yarn/cache/unist-util-position-from-estree-npm-1.1.1-a602307c4d-63808bdcb8.zip +0 -0
  865. package/.yarn/cache/unist-util-position-npm-4.0.3-061bc576b3-0d89973628.zip +0 -0
  866. package/.yarn/cache/unist-util-remove-position-npm-4.0.1-e1412e51bd-7d2808662a.zip +0 -0
  867. package/.yarn/cache/unist-util-stringify-position-npm-3.0.2-e0b49394fc-2dfd7a0fb2.zip +0 -0
  868. package/.yarn/cache/unist-util-visit-npm-4.1.1-d4ebc5dd61-c4a63734b0.zip +0 -0
  869. package/.yarn/cache/unist-util-visit-parents-npm-5.1.1-fe9eee5f6b-c699d18f5b.zip +0 -0
  870. package/.yarn/cache/update-browserslist-db-npm-1.0.9-b9b06a6669-f625899b23.zip +0 -0
  871. package/.yarn/cache/uri-js-npm-4.2.2-e6ac2fca26-5a91c55d8a.zip +0 -0
  872. package/.yarn/cache/use-callback-ref-npm-1.2.4-3db5a37dfc-dd9ca4cb46.zip +0 -0
  873. package/.yarn/cache/use-callback-ref-npm-1.2.5-a848856693-b002724231.zip +0 -0
  874. package/.yarn/cache/use-isomorphic-layout-effect-npm-1.1.2-65facd0a4b-a6532f7fc9.zip +0 -0
  875. package/.yarn/cache/use-local-storage-state-npm-18.1.2-f152114ef2-d296e35f1b.zip +0 -0
  876. package/.yarn/cache/use-sidecar-npm-1.0.3-a5649457be-e6c95181fe.zip +0 -0
  877. package/.yarn/cache/use-sidecar-npm-1.0.5-4a6f1a3ba3-9207ad8af7.zip +0 -0
  878. package/.yarn/cache/use-sync-external-store-npm-1.2.0-44f75d2564-5c639e0f8d.zip +0 -0
  879. package/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip +0 -0
  880. package/.yarn/cache/uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip +0 -0
  881. package/.yarn/cache/uvu-npm-0.5.6-c8507ad49b-09460a3797.zip +0 -0
  882. package/.yarn/cache/verror-npm-1.10.0-c3f839c579-c431df0bed.zip +0 -0
  883. package/.yarn/cache/vfile-location-npm-4.0.1-c53c414f48-cc0df62075.zip +0 -0
  884. package/.yarn/cache/vfile-message-npm-3.1.3-c0c26aab33-f5ec2afbc1.zip +0 -0
  885. package/.yarn/cache/vfile-npm-5.3.6-2fd46e1771-1aa5efff51.zip +0 -0
  886. package/.yarn/cache/vite-npm-4.0.4-33a47fc7a2-eb86c8cdfe.zip +0 -0
  887. package/.yarn/cache/warning-npm-4.0.3-291e921d6d-4f2cb6a957.zip +0 -0
  888. package/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip +0 -0
  889. package/.yarn/cache/wide-align-npm-1.1.5-889d77e592-d5fc37cd56.zip +0 -0
  890. package/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip +0 -0
  891. package/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip +0 -0
  892. package/.yarn/cache/yallist-npm-3.1.1-a568a556b4-48f7bb00dc.zip +0 -0
  893. package/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip +0 -0
  894. package/.yarn/cache/yaml-npm-1.10.0-3e2d763b45-ae81d29a82.zip +0 -0
  895. package/.yarn/cache/yaml-npm-1.10.2-0e780aebdf-ce4ada136e.zip +0 -0
  896. package/.yarn/cache/zwitch-npm-1.0.5-5911cef6ce-28a1bebaca.zip +0 -0
  897. package/.yarn/cache/zwitch-npm-2.0.4-13220031e2-f22ec5fc2d.zip +0 -0
  898. package/.yarn/install-state.gz +0 -0
  899. package/.yarn/releases/yarn-3.3.1.cjs +0 -823
  900. package/playground/PlaygroundApp.res +0 -153
  901. package/playground/PlaygroundBindings.res +0 -106
  902. package/playground/PlaygroundComponents.res +0 -142
  903. package/playground/PlaygroundHooks.res +0 -111
  904. package/playground/PlaygroundLocales.res +0 -10
  905. package/playground/PlaygroundRouter.res +0 -134
  906. package/playground/Playground_CodeBlock.res +0 -33
  907. package/playground/bindings/Playground_Bindings_Reach.res +0 -143
  908. package/playground/components/Playground_Accordion.res +0 -31
  909. package/playground/components/Playground_Alert.res +0 -25
  910. package/playground/components/Playground_Button.res +0 -97
  911. package/playground/components/Playground_ButtonGroup.res +0 -40
  912. package/playground/components/Playground_ButtonGroup2.res +0 -37
  913. package/playground/components/Playground_Card.res +0 -44
  914. package/playground/components/Playground_Checkbox.res +0 -60
  915. package/playground/components/Playground_Combobox.res +0 -38
  916. package/playground/components/Playground_Coordinates.res +0 -12
  917. package/playground/components/Playground_CopyWrapper.res +0 -17
  918. package/playground/components/Playground_Dropdown.res +0 -52
  919. package/playground/components/Playground_DropdownList.res +0 -40
  920. package/playground/components/Playground_Form.res +0 -195
  921. package/playground/components/Playground_IconButton.res +0 -65
  922. package/playground/components/Playground_Label.res +0 -16
  923. package/playground/components/Playground_Listbox.res +0 -61
  924. package/playground/components/Playground_Modal.res +0 -68
  925. package/playground/components/Playground_Modal2.res +0 -68
  926. package/playground/components/Playground_MultiSelect.res +0 -91
  927. package/playground/components/Playground_Notice.res +0 -34
  928. package/playground/components/Playground_PortalDropdown.res +0 -11
  929. package/playground/components/Playground_ProgressBar.res +0 -33
  930. package/playground/components/Playground_Radio.res +0 -23
  931. package/playground/components/Playground_Reference.res +0 -16
  932. package/playground/components/Playground_RichText.res +0 -22
  933. package/playground/components/Playground_Select.res +0 -96
  934. package/playground/components/Playground_Snackbar.res +0 -43
  935. package/playground/components/Playground_Spinner.res +0 -48
  936. package/playground/components/Playground_Switch.res +0 -69
  937. package/playground/components/Playground_Table.res +0 -45
  938. package/playground/components/Playground_Tabs.res +0 -53
  939. package/playground/components/Playground_Tag.res +0 -52
  940. package/playground/components/Playground_TextInput.res +0 -23
  941. package/playground/components/Playground_Tooltip.res +0 -90
  942. package/playground/custom.css +0 -171
  943. package/playground/design/DesignSystem_Colors.mdx +0 -5
  944. package/playground/design/DesignSystem_Fonts.mdx +0 -5
  945. package/playground/design/DesignSystem_MediaQueries.mdx +0 -5
  946. package/playground/design/Playground_DesignSystem.res +0 -12
  947. package/playground/design/TailwindConfigBreakpoints.jsx +0 -16
  948. package/playground/design/TailwindConfigColorsPreview.jsx +0 -58
  949. package/playground/design/TailwindConfigFontsPreview.jsx +0 -35
  950. package/playground/docs/ApiDecoding.mdx +0 -70
  951. package/playground/docs/Form.mdx +0 -109
  952. package/playground/docs/Identifiers.mdx +0 -38
  953. package/playground/docs/Playground_Docs.res +0 -32
  954. package/playground/docs/Primitives.mdx +0 -53
  955. package/playground/docs/Request.mdx +0 -281
  956. package/playground/docs/Router.mdx +0 -43
  957. package/playground/docs/Setup.mdx +0 -51
  958. package/playground/docs/Unleash.mdx +0 -53
  959. package/playground/hooks/Playground_Hooks_Clipboard.res +0 -19
  960. package/playground/hooks/Playground_Hooks_Disclosure.res +0 -24
  961. package/playground/hooks/Playground_Hooks_LazyLoad.res +0 -31
  962. package/playground/hooks/Playground_Hooks_MediaQueries.res +0 -11
  963. package/playground/main.jsx +0 -14
  964. package/playground/utils/rescript-highlight.js +0 -387
  965. package/public/_redirects +0 -1
  966. package/public/assets/logo.svg +0 -1
  967. package/public/vite.svg +0 -1
  968. package/src/ui/Toolkit__Ui_Modal2.res +0 -128
  969. package/src/ui/Toolkit__Ui_Modal2.resi +0 -15
  970. package/src/ui/Toolkit__Ui_TooltipV2.res +0 -85
  971. package/src/vendors/HeadlessUi.res +0 -118
  972. package/src/vendors/reach-ui/ReachUi.res +0 -55
  973. package/src/vendors/reach-ui/ReachUi_Accordion.res +0 -47
  974. package/src/vendors/reach-ui/ReachUi_AlertDialog.res +0 -76
  975. package/src/vendors/reach-ui/ReachUi_Combobox.res +0 -60
  976. package/src/vendors/reach-ui/ReachUi_Dialog.res +0 -77
  977. package/src/vendors/reach-ui/ReachUi_Disclosure.res +0 -21
  978. package/src/vendors/reach-ui/ReachUi_Listbox.res +0 -243
  979. package/src/vendors/reach-ui/ReachUi_MenuButton.res +0 -98
  980. package/src/vendors/reach-ui/ReachUi_Popover.res +0 -8
  981. package/src/vendors/reach-ui/ReachUi_Portal.res +0 -2
  982. package/src/vendors/reach-ui/ReachUi_Tabs.res +0 -57
  983. package/src/vendors/reach-ui/ReachUi_Tooltip.res +0 -37
  984. package/src/vendors/reach-ui/ReachUi_Utils.res +0 -4
  985. package/src/vendors/reach-ui/ReachUi_VisuallyHidden.res +0 -2
@@ -0,0 +1,2527 @@
1
+ #!/usr/bin/env bash
2
+
3
+ #VARIABLES
4
+ export SCRIPT_FULL_PATH=$(dirname "$0")
5
+
6
+ ##FUNCTIONS
7
+ # https://stackoverflow.com/questions/1527049/how-can-i-join-elements-of-an-array-in-bash
8
+ join_by() {
9
+ local d=${1-} f=${2-}
10
+ if shift 2; then
11
+ printf %s "$f" "${@/#/$d}"
12
+ fi
13
+ }
14
+
15
+ mkstring() {
16
+ local start=$1
17
+ local separator=$2
18
+ local end=$3
19
+ shift 3
20
+
21
+ if [ $# -gt 0 ]; then
22
+ printf $start
23
+ join_by $separator $*
24
+ printf $end
25
+ fi
26
+ }
27
+
28
+ md5all() {
29
+ all_hash=$(mktemp)
30
+ for name in $*; do
31
+ find $name -type f -exec cat {} \; | md5sum | cut -f1 -d ' ' >> $all_hash
32
+ done;
33
+ cat $all_hash | md5sum | cut -f1 -d ' '
34
+ }
35
+
36
+ log() {
37
+ echo "$*" >&2
38
+ }
39
+ #!/usr/bin/env bash
40
+
41
+ check_args() {
42
+ if [ -z $2 ] || [ "$1" != "$2" ]; then
43
+ echo >&2 "missing argument $1"
44
+ return 1
45
+ fi
46
+ }
47
+
48
+ check_env_vars() {
49
+ ArgsCount=$1 && shift
50
+ for ((i = 0; i < $ArgsCount; i++)); do
51
+ if [[ -z "${!1}" ]]; then
52
+ echo >&2 "missing ENV $1"
53
+ return 1
54
+ fi
55
+ shift
56
+ done
57
+ }
58
+
59
+ extract_arg() {
60
+ name=$1
61
+ passed=$2
62
+ value=$3
63
+ if [ "--$name" != "$passed" ]; then
64
+ echo "missing argument $name"
65
+ exit 1
66
+ fi
67
+ eval $name='$value'
68
+ }
69
+
70
+ extract_args() {
71
+ declare -a Array_Args
72
+ ArgsCount=$1 && shift
73
+ for ((i = 0; i < $ArgsCount; i++)); do
74
+ Array_Args[i]=$1 && shift
75
+ done
76
+ for ArgName in "${Array_Args[@]}"; do
77
+ extract_arg "$ArgName" $* && shift 2
78
+ done
79
+ }
80
+
81
+ #!/usr/bin/env bash
82
+
83
+ aws_ecr_login() {
84
+ PATH=/root/.local/bin:$PATH
85
+
86
+ aws ecr get-login-password \
87
+ | docker login --username AWS --password-stdin 949316342391.dkr.ecr.eu-west-1.amazonaws.com \
88
+ || (echo "you should update to AWS CLI version 2 https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html " $(aws ecr get-login --region=eu-west-1 --no-include-email) )
89
+ }
90
+
91
+ aws_ecr_token() {
92
+ aws ecr get-authorization-token --region=eu-west-1 --output text --query 'authorizationData[].authorizationToken'
93
+ }
94
+
95
+ # you will need jq to use these commands. You can install it using "brew install jq"
96
+ # delete_images colisweb_api 8
97
+ # will delete images older than 8 weeks
98
+ delete_images() {
99
+
100
+ REPO=$1
101
+ WEEKS=${2:-16}
102
+
103
+ WEEKS_AGO=$(date -v-${WEEKS}w +%F)
104
+
105
+ #Get all ecr images
106
+ IMAGES=$(aws ecr describe-images --repository-name $REPO --output json)
107
+
108
+ #Filter unnecessary values and map `imagePushedAt` to EPOCH
109
+ NON_LATEST_IMAGES=$(echo $IMAGES | jq '[.imageDetails[] | select(.imageTags | any(endswith("latest")) | not)]')
110
+
111
+ #Filter on EPOCH
112
+ OLD_IMAGES=$(echo $NON_LATEST_IMAGES | jq --arg date $WEEKS_AGO '.[] | select(.imagePushedAt[0:10] < $date).imageDigest')
113
+ while IFS= read -r IMAGE; do
114
+ if [ "$IMAGE" != "" ]; then
115
+ echo "Deleting $IMAGE from $REPO"
116
+ AWS_PAGER="" aws ecr batch-delete-image --repository-name $REPO --image-ids imageDigest=$IMAGE
117
+ fi
118
+ done <<< "$OLD_IMAGES"
119
+ }
120
+
121
+ # delete_images_all_repos 12
122
+ # will delete images in all repositories older than 12 weeks
123
+ delete_images_all_repos() {
124
+ REPOSITORIES=$(aws ecr describe-repositories --output json | jq -r '.[]|.[].repositoryName')
125
+
126
+ while IFS= read -r REPO; do
127
+ echo "processing ECR repository $REPO"
128
+ delete_images $REPO $1
129
+ done <<< "$REPOSITORIES"
130
+ }
131
+
132
+ #!/usr/bin/env bash
133
+
134
+ # If gitlab is down or pipeline are stuck, hotfixes need to be available
135
+ # This script will publish docker images to ECR using your current git HEAD, then deploy them to a given environment.
136
+ # Some local files (git-commit.conf and sentry.properties) will be updated, take caution.
137
+ # No trace of this will appear on Gitlab (no releases, no pipelines, no tags).
138
+ # create_hotfix_scala $ENVIRONMENT $CHART_NAME [ $MODULE_NAME $MODULE_PATH $DEPLOYMENT ]
139
+ # create_hotfix_scala testing crm main modules/3-executables/main crm
140
+ # create_hotfix_scala testing notification \
141
+ # main-http modules/3-executables/main-http notification-http \
142
+ # main-consumer modules/3-executables/main-consumer notification-consumer
143
+
144
+ create_hotfix_scala() {
145
+
146
+ ENVIRONMENT=$1
147
+ CHART_NAME=$2
148
+ shift 2
149
+
150
+ SHORT_SHA=$(git rev-parse --short HEAD)
151
+ HOTFIX_TAG="hotfix-$SHORT_SHA"
152
+
153
+ gum confirm "Preparing $HOTFIX_TAG for $CHART_NAME ?" || exit
154
+ prepare_hotfix_scala $HOTFIX_TAG
155
+
156
+ gum confirm "Building $HOTFIX_TAG for $CHART_NAME ?" || exit
157
+ while [[ $# -gt 2 ]] ; do
158
+ build_hotfix_scala $HOTFIX_TAG "$1" "$2" "$3"
159
+ shift 3
160
+ done
161
+
162
+ gum confirm "Deploying $HOTFIX_TAG for $CHART_NAME ?" || exit
163
+ deploy_hotfix $CHART_NAME $ENVIRONMENT $HOTFIX_TAG
164
+ }
165
+
166
+ # Update local git-commit.conf and sentry.properties files using git short sha
167
+ prepare_hotfix_scala() {
168
+ HOTFIX_TAG=$1
169
+
170
+ git secret reveal -f
171
+ aws_ecr_login
172
+
173
+ COMMIT_CONF_FILES=$(find . -name "git-commit.conf")
174
+ SENTRY_PROPERTIES_FILES=$(find . -name "sentry.properties")
175
+
176
+ for file in $(echo "$COMMIT_CONF_FILES\n$SENTRY_PROPERTIES_FILES"); do
177
+ sed -i '' -e 's&GIT_COMMIT&'"$HOTFIX_TAG&" $file
178
+ done
179
+
180
+ }
181
+
182
+ # Build docker images locally and publish them to AWS ECR.
183
+ build_hotfix_scala() {
184
+
185
+ HOTFIX_TAG=$1
186
+ SBT_MODULE=$2
187
+ DOCKER_PATH=$3
188
+ DEPLOYMENT=$4
189
+
190
+ DOCKER_REGISTRY_ID="949316342391"
191
+ DOCKER_REGISTRY="$DOCKER_REGISTRY_ID.dkr.ecr.eu-west-1.amazonaws.com"
192
+ DOCKER_IMAGE=$DOCKER_REGISTRY/$DEPLOYMENT
193
+ HOTFIX_IMAGE=$DOCKER_IMAGE:$HOTFIX_TAG
194
+
195
+ #Build
196
+ sbt "project $SBT_MODULE" "Docker / stage"
197
+
198
+ #Publish
199
+ docker build --platform "linux/amd64" -t $HOTFIX_IMAGE --cache-from $DOCKER_IMAGE "$DOCKER_PATH/target/docker/stage"
200
+ docker push $HOTFIX_IMAGE
201
+
202
+ echo "Created hotfix $HOTFIX_IMAGE"
203
+ }
204
+
205
+ # Deploy the project in the given environment
206
+ deploy_hotfix() {
207
+ source $colisweb_scripts/ci/helm.sh
208
+
209
+ CHART_NAME=$1
210
+ ENVIRONMENT=$2
211
+ HOTFIX_TAG=$3
212
+
213
+ CONFIG_PATH=deploy
214
+ CHART_PATH=$CONFIG_PATH/$CHART_NAME
215
+ ROOT_PATH=$(pwd)
216
+
217
+ # Unset Kubectl configuration made via the KUBECONFIG env variable
218
+ # it would override the config made by configure_kubectl_for
219
+ # for example, using Gitlab runners in Kubernetes sets this variable and causes conflict
220
+ unset KUBECONFIG
221
+
222
+ # Configure Kubectl
223
+ configure_kubectl_for $ENVIRONMENT
224
+
225
+ # Avoiding "no local-index.yaml" or "empty local-index.yaml" error
226
+ cat > $HOME/Library/Caches/helm/repository/local-index.yaml <<EOT
227
+ apiVersion: v1
228
+ entries:
229
+ cronjob:
230
+ EOT
231
+
232
+ # helm3 stable repo have changed and must be updated manually, in versions < v2.17.0
233
+ helm3 repo add colisweb s3://colisweb-helm-charts/colisweb --force-update
234
+ helm3 repo add stable https://charts.helm.sh/stable --force-update
235
+ helm3 repo update
236
+ helm3 dependency update ${ROOT_PATH}/${CHART_PATH}
237
+
238
+ # Gather values/*.yaml files
239
+ VALUES_PATH="${ROOT_PATH}/${CHART_NAME}/values"
240
+ VALUES_FILES=''
241
+ [ -d $VALUES_PATH ] && VALUES_FILES=$(find $VALUES_PATH -type f -maxdepth 1 -name "*.yaml" | sed 's/^/ -f /' | tr -d \\n | sed 's/%//')
242
+
243
+ # Deploy
244
+ helm3 upgrade --install \
245
+ --namespace ${ENVIRONMENT} \
246
+ ${VALUES_FILES} \
247
+ -f ${ROOT_PATH}/${CONFIG_PATH}/common.yaml \
248
+ -f ${ROOT_PATH}/${CONFIG_PATH}/${ENVIRONMENT}.yaml \
249
+ -f ${ROOT_PATH}/${CONFIG_PATH}/${ENVIRONMENT}-secrets.yaml \
250
+ --set global.version=$HOTFIX_TAG \
251
+ ${CHART_NAME} ${ROOT_PATH}/${CHART_PATH}
252
+
253
+
254
+ verify_deployments_v3 -t 10m $ENVIRONMENT $CHART_NAME
255
+
256
+ }
257
+
258
+ #!/usr/bin/env bash
259
+
260
+ image_exists() {
261
+ set -e
262
+
263
+ REGISTRY=$1
264
+ REPOSITORY=$2
265
+ IMAGE=$3
266
+
267
+ TAGGED_IMAGE="$REGISTRY/$REPOSITORY:$IMAGE"
268
+
269
+ aws ecr describe-images --registry-id $REGISTRY --repository-name $REPOSITORY --image-ids "imageTag=$IMAGE"
270
+
271
+ if [ $? -eq 0 ]
272
+ then
273
+ echo "Image $TAGGED_IMAGE already present in distant repo"
274
+ return 0
275
+ else
276
+ echo "Image $TAGGED_IMAGE NOT present in distant repo"
277
+ return 1
278
+ fi
279
+ }
280
+ #!/usr/bin/env bash
281
+
282
+ gmm() {
283
+ git checkout $1
284
+ git pull
285
+ git checkout $2
286
+ git pull
287
+ git merge $1
288
+ git push
289
+ }
290
+
291
+ git_damn_merge() {
292
+ git checkout $1
293
+ git pull
294
+ git checkout $2
295
+ git dammit
296
+ git merge $1
297
+ git push
298
+ }
299
+
300
+ git_prune_local_branches() {
301
+ git branch -r |
302
+ awk '{print $1}' |
303
+ egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) |
304
+ awk '{print $1}' |
305
+ xargs git branch -d
306
+ }
307
+
308
+ gum_checkout() {
309
+ git branch -a | cut -f3- -d "/" | gum filter | xargs git checkout
310
+ }
311
+
312
+ # useful option :
313
+ # export GIT_SUBLINE_MERGE_NON_INTERACTIVE_MODE=TRUE
314
+ # see https://github.com/paulaltin/git-subline-merge
315
+ setup_subline_merge() {
316
+ location=${1:-"--local"}
317
+
318
+ case $location in
319
+ --local)
320
+ if [ -d ".git" ]; then
321
+ echo "* merge=subline" >>.git/info/attributes
322
+ else
323
+ echo "Cannot use local option, not in a git repository"
324
+ return 1
325
+ fi
326
+ ;;
327
+ --global)
328
+ echo "* merge=subline" >>~/.gitattributes
329
+ ;;
330
+ *)
331
+ echo "unknown argument $location"
332
+ return 2
333
+ ;;
334
+ esac
335
+
336
+ git config $location merge.conflictStyle diff3
337
+ git config $location merge.subline.driver "$colisweb_scripts/shell-session/shell/dev/git-subline-merge %O %A %B %L %P"
338
+ git config $location merge.subline.recursive binary
339
+ }
340
+
341
+ rebase_from_ancestor() {
342
+ set -x
343
+ branch=$1
344
+ tip=$(git rev-parse HEAD)
345
+ ancestor=$(git merge-base $branch $tip)
346
+ commits=$(git log $ancestor..$tip)
347
+ git reset --hard $ancestor
348
+ git merge --squash $tip
349
+ git commit -m "squashed commmits $commits" || echo "nothing committed"
350
+ git rebase $branch -Xtheirs
351
+ }
352
+
353
+ #!/usr/bin/env bash
354
+
355
+ import_all_pgp_keys() {
356
+ echo "importing all PGP keys"
357
+ gpg --import $SCRIPT_FULL_PATH/pgp_keys/*.key
358
+ }
359
+
360
+ remove_all_persons_from_secrets() {
361
+ echo "cleanup git secret"
362
+ WHO_KNOWS=($(git secret whoknows))
363
+ git secret removeperson $WHO_KNOWS
364
+ echo "Removed secrets access for $WHO_KNOWS"
365
+ }
366
+
367
+ all_pgp_emails() {
368
+ gpg --show-key $SCRIPT_FULL_PATH/pgp_keys/*.key | sed -rn "s/.*<(.*)>/\1/p"
369
+ }
370
+
371
+ set_all_secret_keys() {
372
+
373
+ import_all_pgp_keys
374
+
375
+ git secret reveal -f
376
+
377
+ remove_all_persons_from_secrets
378
+
379
+ if [ $# -eq 0 ]; then
380
+ echo "No emails supplied, using dev-tools pgp keys as source"
381
+ IN_THE_KNOW=($(gum choose --no-limit $(all_pgp_emails)))
382
+ else
383
+ IN_THE_KNOW=($*)
384
+ fi
385
+
386
+ git secret tell $IN_THE_KNOW
387
+ git secret hide
388
+ git secret whoknows
389
+
390
+ echo "all secrets updated, you'll need to commit the changes"
391
+ }
392
+
393
+ #!/usr/bin/env bash
394
+
395
+ start_ssh_bastion() {
396
+ ENV=$1
397
+ SSH_LOCAL_PORT=$2
398
+ POD_NAME=ssh-bastion-$USERNAME
399
+ CONFIG_MAP_NAME=ssh-bastion-$USERNAME
400
+ configure_kubectl_for $ENV
401
+ kubectl get pods -o name | grep pod/$POD_NAME
402
+ if [ $? -eq 0 ]; then
403
+ echo "$POD_NAME is already running"
404
+ else
405
+ #configmap
406
+ kubectl get configmap $CONFIG_MAP_NAME && kubectl delete configmap $CONFIG_MAP_NAME
407
+ tempdir=$(mktemp -d)
408
+ cat <<EOF > $tempdir/sshd_config
409
+ AllowTcpForwarding yes
410
+ Port 2222
411
+ PermitRootLogin yes
412
+ AuthorizedKeysFile /etc/ssh/authorized_keys
413
+ EOF
414
+ cp ~/.ssh/id_rsa.pub $tempdir/authorized_keys
415
+ kubectl create configmap $CONFIG_MAP_NAME --from-file=$tempdir
416
+
417
+ #pod
418
+ kubectl get pod $POD_NAME && kubectl delete pod $POD_NAME
419
+ cat <<EOF | kubectl create -f -
420
+
421
+ apiVersion: v1
422
+ kind: Pod
423
+ metadata:
424
+ name: $POD_NAME
425
+ spec:
426
+ containers:
427
+ - name: $POD_NAME
428
+ image: sickp/alpine-sshd:7.4
429
+ ports:
430
+ - containerPort: 2222
431
+ volumeMounts:
432
+ - mountPath: /etc/ssh/sshd_config
433
+ name: ssh-config
434
+ subPath: sshd_config
435
+ - mountPath: /etc/ssh/authorized_keys
436
+ name: ssh-config
437
+ subPath: authorized_keys
438
+ volumes:
439
+ - name: ssh-config
440
+ configMap:
441
+ name: $CONFIG_MAP_NAME
442
+ EOF
443
+
444
+ fi
445
+
446
+ # You need a recent kubectl for wait to work (1.15 works), install or upgrade
447
+ # with brew :
448
+ # brew install kubernetes-cli
449
+ # brew upgrade kubernetes-cli
450
+ kubectl wait --for=condition=Ready pod/$POD_NAME
451
+
452
+ # kube port-forward
453
+ lsof -ti tcp:$SSH_LOCAL_PORT | xargs kill
454
+ kubectl port-forward $POD_NAME $SSH_LOCAL_PORT:2222 &
455
+ while ! nc -z 127.0.0.1 $SSH_LOCAL_PORT; do
456
+ sleep 1
457
+ done
458
+ echo "forwarding ssh via local port $SSH_LOCAL_PORT"
459
+ echo "remember to terminate the bastion with 'stop_ssh_bastion'"
460
+ }
461
+
462
+ stop_ssh_bastion() {
463
+ POD_NAME=ssh-bastion-$USERNAME
464
+ kubectl delete pod $POD_NAME
465
+ }
466
+
467
+ #!/usr/bin/env bash
468
+
469
+ configure_kubectl_for() {
470
+ local infra_env="$1"
471
+ local valid_envs="[testing][staging][production][performance][tests][recette]"
472
+ echo "$valid_envs" | grep -q "\[$infra_env\]"
473
+
474
+ if [ $? -ne 0 ]; then
475
+ echo "Cannot configure kubectl for invalid env : $infra_env"
476
+ echo "choose one of $valid_envs"
477
+ return 1
478
+ fi
479
+
480
+ aws eks update-kubeconfig --name "toutatis-$infra_env-eks" >&2
481
+ }
482
+
483
+ #!/usr/bin/env bash
484
+
485
+ # WARNING : never try to do a dump directly from the database_production_ca
486
+ # this could cause lot of lock database issues.
487
+ # always use database_production_read_replica_ca instead
488
+ database_k8s() {
489
+ MODE=$1
490
+ case $MODE in
491
+ "tests") SSH_LOCAL_PORT=2224;PG_LOCAL_PORT=24440;CA_LOCAL_PORT=25430;ENV="tests";;
492
+ "testing") SSH_LOCAL_PORT=2225;PG_LOCAL_PORT=24441;CA_LOCAL_PORT=25431;ENV="testing";;
493
+ "staging") SSH_LOCAL_PORT=2226;PG_LOCAL_PORT=24442;CA_LOCAL_PORT=25432;ENV="staging";;
494
+ "production") SSH_LOCAL_PORT=2227;PG_LOCAL_PORT=24443;CA_LOCAL_PORT=25433;ENV="production";;
495
+ "production_rw") SSH_LOCAL_PORT=2227;PG_LOCAL_PORT=24444;CA_LOCAL_PORT=25434;ENV="production";;
496
+ "recette") SSH_LOCAL_PORT=2228;PG_LOCAL_PORT=24446;CA_LOCAL_PORT=25436;ENV="recette";;
497
+ *) echo "Unsupported ENV : $MODE"; return 1 ;;
498
+ esac
499
+
500
+ start_ssh_bastion $ENV $SSH_LOCAL_PORT
501
+
502
+ lsof -ti tcp:$PG_LOCAL_PORT | xargs kill
503
+
504
+ bastion_config=$(mktemp)
505
+ cat > "$bastion_config" <<EOF
506
+ UserKnownHostsFile /dev/null
507
+ StrictHostKeyChecking no
508
+ User root
509
+ Host bastion_tests
510
+ HostName 127.0.0.1
511
+ Port 2224
512
+ LocalForward 24440 toutatis-tests-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
513
+ Host bastion_testing
514
+ HostName 127.0.0.1
515
+ Port 2225
516
+ LocalForward 24441 toutatis-testing-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
517
+ LocalForward 25431 testapirds.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
518
+ Host bastion_staging
519
+ HostName 127.0.0.1
520
+ Port 2226
521
+ LocalForward 24442 toutatis-staging-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
522
+ LocalForward 25432 testapirds.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
523
+ Host bastion_recette
524
+ HostName 127.0.0.1
525
+ Port 2228
526
+ LocalForward 24446 toutatis-recette-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
527
+ LocalForward 25436 testapirds.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
528
+ Host bastion_production
529
+ HostName 127.0.0.1
530
+ Port 2227
531
+ LocalForward 24443 toutatis-production-db-replica.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
532
+ LocalForward 25433 api-production-rds-read-replica.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
533
+ LocalForward 25435 archive-ca.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
534
+ EOF
535
+ if [ "$MODE" = "production_rw" ] ; then
536
+ cat >> "$bastion_config" <<EOF
537
+ LocalForward 24444 toutatis-production-db.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:5432
538
+ LocalForward 25434 api-production-rds.ca0rjdmnxf1x.eu-west-1.rds.amazonaws.com:3306
539
+ EOF
540
+ fi
541
+
542
+ ssh -f -N \
543
+ -F "$bastion_config" \
544
+ "bastion_$ENV"
545
+
546
+ echo "sample command : 'psql postgres://postgres@127.0.0.1:$PG_LOCAL_PORT'"
547
+ echo "sample command : 'mysql -u colisweb -h 127.0.0.1 -P $CA_LOCAL_PORT -p db_name'"
548
+
549
+ echo "run 'kubectl delete pod $POD_NAME' when you have finished"
550
+ }
551
+
552
+ psql_on_k8() {
553
+ NAMESPACE=$1
554
+ SERVICE=$2
555
+ CONNECTION=$3
556
+ shift 3
557
+
558
+ kubectl -n $NAMESPACE run ${SERVICE}-database-init \
559
+ --image jbergknoff/postgresql-client \
560
+ --restart=Never \
561
+ --attach --rm \
562
+ -- \
563
+ postgresql://${CONNECTION} \
564
+ "$*"
565
+ }
566
+
567
+ mysql_on_k8() {
568
+ local namespace=$1
569
+ local db_host=$2
570
+ local db_port=$3
571
+ local db_init_username=$4
572
+ local db_init_password=$5
573
+ local query=$6
574
+
575
+ kubectl -n ${namespace} run datadog-database-init \
576
+ --image widdpim/mysql-client \
577
+ --restart=Never \
578
+ --attach --rm \
579
+ -- \
580
+ mysql --host=$db_host --user=$db_init_username --password=$db_init_password --port=$db_port --execute="$query"
581
+ }
582
+ #!/usr/bin/env bash
583
+
584
+ kube_init_database_once() {
585
+
586
+ extract_args 8 namespace db_host db_port db_init_username db_init_password db_database db_username db_password $*
587
+
588
+ echo "======================="
589
+ echo " Initializing Database '$db_database' for namespace $namespace"
590
+ echo "======================="
591
+
592
+ set -x
593
+
594
+ echo "Checking if Database '$db_database' exists"
595
+ set +e
596
+ psql_on_k8 $namespace once "$db_init_username:$db_init_password@$db_host:$db_port" -lqtA | cut -d\| -f1 | grep "^$db_database$"
597
+ return_code=$?
598
+ set -e
599
+
600
+ if [ ${return_code} -eq 0 ]; then
601
+ echo "Database $db_database already exists - nothing to do"
602
+ else
603
+ echo "Database $db_database does not exist - initializing"
604
+
605
+ psql_on_k8 $namespace once "$db_init_username:$db_init_password@$db_host:$db_port" -c 'CREATE DATABASE '"$db_database"';'
606
+ echo "DB created $db_database"
607
+
608
+ psql_on_k8 $namespace once "$db_init_username:$db_init_password@$db_host:$db_port" -c 'CREATE USER '"$db_username"' WITH ENCRYPTED PASSWORD '"'$db_password'"';'
609
+ echo "USER created $db_username"
610
+
611
+ psql_on_k8 $namespace once "$db_init_username:$db_init_password@$db_host:$db_port" -c 'GRANT ALL PRIVILEGES ON DATABASE '"$db_database"' TO '"$db_username"';'
612
+ echo "Granted all privileges for $db_username on $db_database"
613
+ fi
614
+
615
+ echo "======================="
616
+ echo " Database '$db_database' Initialization complete for namespace $namespace"
617
+ echo "======================="
618
+ }
619
+
620
+ kube_init_database_readonly_account() {
621
+
622
+ extract_args 6 namespace service db_connection db_database db_readonly_username db_readonly_password $*
623
+
624
+ echo "======================="
625
+ echo " Initializing Readonly Account '$db_readonly_username' for '$db_database' for namespace $namespace"
626
+ echo "======================="
627
+
628
+ # Print commands before execution, except echo
629
+ trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG
630
+
631
+ echo "Checking if Readonly account '$db_readonly_username' for '$db_database' exists"
632
+ set +e
633
+ psql_on_k8 $namespace $service $db_connection -qtAc 'SELECT rolname FROM pg_roles;' | grep "^$db_readonly_username$"
634
+ return_code=$?
635
+ set -e
636
+
637
+ if [ ${return_code} -eq 0 ]; then
638
+ echo "Account $db_readonly_username already exists - nothing to do"
639
+ else
640
+ echo "Account $db_readonly_username does not exist - creating"
641
+
642
+ psql_on_k8 $namespace $service $db_connection -c 'CREATE USER '"$db_readonly_username"' WITH ENCRYPTED PASSWORD '"'$db_readonly_password'"';'
643
+ psql_on_k8 $namespace $service $db_connection -c 'GRANT CONNECT ON DATABASE '"$db_database"' TO '"$db_readonly_username"';'
644
+ psql_on_k8 $namespace $service $db_connection -c 'GRANT USAGE ON SCHEMA public TO '"$db_readonly_username"';'
645
+ psql_on_k8 $namespace $service $db_connection -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO '"$db_readonly_username"';'
646
+ psql_on_k8 $namespace $service $db_connection -c 'ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO '"$db_readonly_username"';'
647
+
648
+ echo "Created user with read-only permissions for $db_readonly_username on $db_database (schema public)"
649
+ fi
650
+ }
651
+
652
+ kube_init_datadog_in_database() {
653
+ extract_args 8 namespace db_host db_port db_init_username db_init_password db_datadog_username db_datadog_password db_datadog_schema $*
654
+
655
+ echo "======================="
656
+ echo " Initializing Datadog Agent Requiement for namespace $namespace"
657
+ echo "======================="
658
+
659
+ set -x
660
+
661
+ echo "Checking if User '$db_datadog_username' exists"
662
+ set +e
663
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'SELECT user FROM mysql.user;' | grep "^$db_datadog_username$"
664
+ return_code=$?
665
+ set -e
666
+
667
+ if [ ${return_code} -eq 0 ]; then
668
+ echo "User $db_datadog_username already exists - nothing to do"
669
+ else
670
+ echo "User $db_datadog_username does not exist - initializing"
671
+
672
+ # All the query come from this docs : https://docs.datadoghq.com/fr/database_monitoring/setup_mysql/selfhosted/?tab=mysql56
673
+
674
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'CREATE USER '"$db_datadog_username"'@"%" IDENTIFIED BY '"'$db_datadog_password'"';'
675
+ echo "USER created $db_datadog_username"
676
+
677
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'GRANT REPLICATION CLIENT ON *.* TO datadog@"%" WITH MAX_USER_CONNECTIONS 5;'
678
+ echo "ALTER USER $db_datadog_username"
679
+
680
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'GRANT PROCESS ON *.* TO '"$db_datadog_username"'@"%";'
681
+ echo "Granted PROCESS for $db_datadog_username"
682
+
683
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'GRANT SELECT ON performance_schema.* TO '"$db_datadog_username"'@"%";'
684
+ echo "Granted SELECT on performance_schema for $db_datadog_username"
685
+
686
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'CREATE SCHEMA IF NOT EXISTS datadog;'
687
+ echo "CREATE SCHEMA datadog"
688
+
689
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'GRANT EXECUTE ON datadog.* to '"$db_datadog_username"'@"%";'
690
+ echo "Granted 'GRANT EXECUTE for $db_datadog_username on datadog"
691
+
692
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'GRANT CREATE TEMPORARY TABLES ON datadog.* TO '"$db_datadog_username"'@"%";'
693
+ echo "Granted CREATE TEMPORARY TABLES for $db_datadog_username"
694
+
695
+
696
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'DROP PROCEDURE IF EXISTS datadog.explain_statement;
697
+ DELIMITER $$
698
+ CREATE PROCEDURE datadog.explain_statement(IN query TEXT)
699
+ SQL SECURITY DEFINER
700
+ BEGIN
701
+ SET @explain := CONCAT("EXPLAIN FORMAT=json ", query);
702
+ PREPARE stmt FROM @explain;
703
+ EXECUTE stmt;
704
+ DEALLOCATE PREPARE stmt;
705
+ END $$
706
+ DELIMITER ;'
707
+ echo "CREATE PROCEDURE PROCEDURE datadog.explain_statement"
708
+
709
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'DROP PROCEDURE IF EXISTS '"$db_datadog_username"'.explain_statement;
710
+ DELIMITER $$
711
+ CREATE PROCEDURE '"$db_datadog_username"'.explain_statement(IN query TEXT)
712
+ SQL SECURITY DEFINER
713
+ BEGIN
714
+ SET @explain := CONCAT("EXPLAIN FORMAT=json ", query);
715
+ PREPARE stmt FROM @explain;
716
+ EXECUTE stmt;
717
+ DEALLOCATE PREPARE stmt;
718
+ END $$
719
+ DELIMITER ;
720
+ GRANT EXECUTE ON PROCEDURE '"$db_datadog_username"'.explain_statement TO datadog@"%";'
721
+ echo "CREATE PROCEDURE on SCHEMA $db_datadog_schema for $db_datadog_username"
722
+
723
+ mysql_on_k8 $namespace $db_host $db_port $db_init_username $db_init_password 'DROP PROCEDURE IF EXISTS datadog.enable_events_statements_consumers;
724
+ DELIMITER $$
725
+ CREATE PROCEDURE datadog.enable_events_statements_consumers()
726
+ SQL SECURITY DEFINER
727
+ BEGIN
728
+ UPDATE performance_schema.setup_consumers SET enabled="YES" WHERE name LIKE "events_statements_%";
729
+ END $$
730
+ DELIMITER ;
731
+ GRANT EXECUTE ON PROCEDURE datadog.enable_events_statements_consumers TO datadog@"%";'
732
+
733
+ echo "CREATE PROCEDURE on datadog.enable_events_statements_consumers"
734
+ fi
735
+
736
+ echo "======================="
737
+ echo " Database '$db_datadog_schema' Initialization complete for namespace $namespace"
738
+ echo "======================="
739
+ }
740
+
741
+ kube_init_datadog_in_postgres_database() {
742
+ extract_args 7 namespace db_host db_port db_init_username db_init_password db_datadog_username db_datadog_password $*
743
+
744
+ local service="datadog"
745
+ local db_connection="$db_init_username:$db_init_password@$db_host:$db_port"
746
+
747
+ echo "======================="
748
+ echo " Initializing $service Agent On PostgresSQL Database Requirement for namespace $namespace"
749
+ echo "======================="
750
+
751
+ echo "Checking if User '$db_datadog_username' exists"
752
+
753
+ set +e
754
+ if psql_on_k8 $namespace $service $db_connection -qtAc 'SELECT usename FROM pg_catalog.pg_user;' | grep "^$db_datadog_username$";
755
+ then
756
+ echo "User $db_datadog_username already exists - nothing to do"
757
+ else
758
+ echo "User $db_datadog_username does not exist - initializing"
759
+
760
+ set -e
761
+ psql_on_k8 $namespace $service $db_connection -qc 'CREATE USER '"$db_datadog_username"' WITH password '"'$db_datadog_password'"';'
762
+ echo "User created $db_datadog_username"
763
+
764
+ psql_on_k8 $namespace $service $db_connection -qc 'CREATE SCHEMA datadog;'
765
+ echo "Schema datadog created"
766
+
767
+ psql_on_k8 $namespace $service $db_connection -qc 'GRANT USAGE ON SCHEMA datadog TO datadog;'
768
+ echo "Granted usage for datadog schema to datadog"
769
+
770
+ psql_on_k8 $namespace $service $db_connection -qc 'GRANT USAGE ON SCHEMA public TO datadog;'
771
+ echo "Granted usage for public schema to datadog"
772
+
773
+ psql_on_k8 $namespace $service $db_connection -qc 'GRANT pg_monitor TO datadog;'
774
+ echo "Granted pg_monitor to datadog"
775
+
776
+ psql_on_k8 $namespace $service $db_connection -qc 'CREATE EXTENSION IF NOT EXISTS pg_stat_statements schema public;'
777
+ echo "Extension pg_stat_statements created"
778
+
779
+ local datadog_function_path="/tmp/datatog-explain-statement-function.sql"
780
+ local datadog_function="CREATE OR REPLACE FUNCTION datadog.explain_statement(
781
+ l_query TEXT,
782
+ OUT explain JSON
783
+ )
784
+ RETURNS SETOF JSON AS
785
+ \\$\\$
786
+ DECLARE
787
+ curs REFCURSOR;
788
+ plan JSON;
789
+
790
+ BEGIN
791
+ OPEN curs FOR EXECUTE pg_catalog.concat('EXPLAIN (FORMAT JSON) ', l_query);
792
+ FETCH curs INTO plan;
793
+ CLOSE curs;
794
+ RETURN QUERY SELECT plan;
795
+ END;
796
+ \\$\\$
797
+ LANGUAGE 'plpgsql'
798
+ RETURNS NULL ON NULL INPUT
799
+ SECURITY DEFINER;"
800
+
801
+ kubectl -n $namespace run $service-database-init \
802
+ --image jbergknoff/postgresql-client \
803
+ --restart=Never \
804
+ --attach --rm \
805
+ --command \
806
+ -- \
807
+ /bin/sh -c "echo -e \"$datadog_function\" > $datadog_function_path; psql postgresql://$db_connection -qf $datadog_function_path"
808
+
809
+ echo "Function datadog.explain_statement created"
810
+ fi
811
+
812
+ echo "======================="
813
+ echo " Database $service Initialization complete for namespace $namespace"
814
+ echo "======================="
815
+ }
816
+
817
+ kube_init_service_database() {
818
+
819
+ extract_args 9 namespace service db_host db_port db_init_username db_init_password db_database db_username db_password $*
820
+
821
+ local db_connection="$db_init_username:$db_init_password@$db_host:$db_port"
822
+
823
+ set -x
824
+
825
+ echo "Checking if Database '$db_database' exists"
826
+ set +e
827
+ psql_on_k8 $namespace $service $db_connection -lqtA | cut -d\| -f1 | grep "^$db_database$"
828
+ return_code=$?
829
+ set -e
830
+
831
+ if [ ${return_code} -eq 0 ]; then
832
+ echo "Database $db_database already exists - nothing to do"
833
+ else
834
+ echo "Database $db_database does not exist - initializing"
835
+
836
+ psql_on_k8 $namespace $service $db_connection -c 'CREATE DATABASE '"$db_database"';'
837
+ echo "DB created $db_database"
838
+
839
+ psql_on_k8 $namespace $service $db_connection -c 'CREATE USER '"$db_datadog_username"' WITH ENCRYPTED PASSWORD '"'$db_password'"';'
840
+ echo "USER created $db_datadog_username"
841
+
842
+ psql_on_k8 $namespace $service $db_connection -c 'GRANT ALL PRIVILEGES ON DATABASE '"$db_database"' TO '"$db_datadog_username"';'
843
+ echo "Granted all privileges for $db_datadog_username on $db_database"
844
+ fi
845
+
846
+ echo "======================="
847
+ echo " Database '$db_database' Initialization complete for namespace $namespace"
848
+ echo "======================="
849
+ }
850
+ #!/usr/bin/env bash
851
+
852
+ # Port forward on the first matching pod
853
+ # Ex :
854
+ # pod_forward testing notification-http
855
+ # pod_forward testing colisweb-api-web 3333 3000
856
+ pod_forward() {
857
+ ENV=$1
858
+ POD_FILTER=$2
859
+ LOCAL_PORT=${3:-8080}
860
+ POD_PORT=${4:-8080}
861
+
862
+ if PID=$(lsof -ti tcp:$LOCAL_PORT); then
863
+ echo "killing process $PID which uses port $LOCAL_PORT"
864
+ kill $PID
865
+ fi
866
+
867
+ configure_kubectl_for $ENV
868
+
869
+ POD=`pick_pod $ENV $POD_FILTER`
870
+
871
+ echo "setting up forwarding to $POD"
872
+ kubectl -n $ENV port-forward $POD $LOCAL_PORT:$POD_PORT &
873
+ PID=$!
874
+
875
+ while ! echo exit | nc localhost $LOCAL_PORT > /dev/null; do
876
+ sleep 1
877
+ echo "waiting for port $LOCAL_PORT to be open locally"
878
+ done
879
+ echo "port $LOCAL_PORT is now available on localhost, forwarding to $ENV $POD:$POD_PORT"
880
+ echo 'you can terminate it with "kill '$PID'" or "kill $(lsof -ti tcp:'$LOCAL_PORT')"'
881
+ }
882
+
883
+ # prompts to pick a pod and run a command like bash inside
884
+ # pod_exec testing
885
+ # pod_exec testing bash
886
+ # pod_exec testing bash colisweb-api
887
+ pod_exec() {
888
+ ENV=$1
889
+ COMMAND=${2:-bash}
890
+ configure_kubectl_for $ENV
891
+ POD_FILTER=$3
892
+ POD=`pick_pod $ENV $POD_FILTER`
893
+ echo "running $COMMAND inside $POD"
894
+ kubectl -n $ENV exec -ti $POD -- $COMMAND
895
+ }
896
+
897
+ # prompts to pick a pod and copy from a local file to the pod
898
+ # pod_copy_to testing localfile remotefile
899
+ # pod_copy_to testing localfile remotefile colisweb-api
900
+ pod_copy_to() {
901
+ ENV=$1
902
+ LOCAL_FILE=$2
903
+ REMOTE_FILE=$3
904
+ configure_kubectl_for $ENV
905
+ POD_FILTER=$4
906
+ POD=`pick_pod $ENV $POD_FILTER`
907
+ kubectl cp $LOCAL_FILE $ENV/$POD:$REMOTE_FILE
908
+ }
909
+
910
+
911
+ pick_pod() {
912
+ ENV=$1
913
+ POD_FILTER="pod/$2"
914
+ configure_kubectl_for $ENV
915
+
916
+ if [ -z "$2" ] ; then
917
+ kubectl -n $ENV get pods | gum filter | cut -f1 -d" "
918
+ else
919
+ if PODS=$(kubectl -n $ENV get pods -o=name | grep "$POD_FILTER"); then
920
+ echo $PODS | head -1 | sed -e 's/pod\///'
921
+ else
922
+ echo "no pods found on $ENV matching $POD_FILTER" >&2
923
+ fi
924
+ fi
925
+ }
926
+
927
+ #!/usr/bin/env bash
928
+
929
+ redis_k8s() {
930
+ MODE=$1
931
+ case $MODE in
932
+ "testing") SSH_LOCAL_PORT=2225;REDIS_LOCAL_PORT=63791;ENV="testing";;
933
+ "staging") SSH_LOCAL_PORT=2226;REDIS_LOCAL_PORT=63792;ENV="staging";;
934
+ "production") SSH_LOCAL_PORT=2227;REDIS_LOCAL_PORT=63793;ENV="production";;
935
+ *) echo "Unsupported ENV : $MODE"; return 1 ;;
936
+ esac
937
+
938
+ start_ssh_bastion $ENV $SSH_LOCAL_PORT
939
+
940
+ lsof -ti tcp:$REDIS_LOCAL_PORT | xargs kill
941
+
942
+ bastion_config=$(mktemp)
943
+ cat > "$bastion_config" <<EOF
944
+ UserKnownHostsFile /dev/null
945
+ StrictHostKeyChecking no
946
+ User root
947
+ Host bastion_testing
948
+ HostName 127.0.0.1
949
+ Port 2225
950
+ LocalForward 63791 redis-testing.xufte6.0001.euw1.cache.amazonaws.com:6379
951
+ Host bastion_staging
952
+ HostName 127.0.0.1
953
+ Port 2226
954
+ LocalForward 63792 redis-sandbox.xufte6.0001.euw1.cache.amazonaws.com:6379
955
+ Host bastion_production
956
+ HostName 127.0.0.1
957
+ Port 2227
958
+ LocalForward 63793 redis-prod.xufte6.0001.euw1.cache.amazonaws.com:6379
959
+ EOF
960
+
961
+ ssh -f -N \
962
+ -F "$bastion_config" \
963
+ "bastion_$ENV"
964
+
965
+ echo "sample command : 'redis-cli -p $REDIS_LOCAL_PORT'"
966
+ echo "run 'kubectl delete pod $POD_NAME' when you have finished"
967
+
968
+ redis-cli -p $REDIS_LOCAL_PORT
969
+ }
970
+
971
+ #!/usr/bin/env bash
972
+
973
+ #Create a k8s cron jobs that will be run regularly
974
+ #See run_cron_job_k8s -h for more details
975
+
976
+ run_cron_job_k8s() {
977
+
978
+ #default values
979
+ local namespace="testing"
980
+ local name="$USERNAME"
981
+ local SCHEDULE="00 05 * * *"
982
+ local secret=""
983
+ local amm_folder=""
984
+ local amm_script=""
985
+
986
+ while getopts ":e:c:p:f:s:t:h" opt; do
987
+ case $opt in
988
+ e)
989
+ namespace="$OPTARG" >&2
990
+ ;;
991
+ t)
992
+ SCHEDULE="$OPTARG" >&2
993
+ ;;
994
+ p)
995
+ name="$OPTARG" >&2
996
+ ;;
997
+ c)
998
+ secret="$OPTARG" >&2
999
+ ;;
1000
+ f)
1001
+ amm_folder="$OPTARG" >&2
1002
+ ;;
1003
+ s)
1004
+ amm_script="$OPTARG" >&2
1005
+ ;;
1006
+ h)
1007
+ show_help_cron_job
1008
+ return 0
1009
+ ;;
1010
+ :)
1011
+ echo "Option -$OPTARG requires an argument. Run run_cron_job_k8s -h for help" >&2
1012
+ return 0
1013
+ ;;
1014
+ \?)
1015
+ echo "Invalid option: -$OPTARG. Run run_cron_job_k8s -h for help" >&2
1016
+ return 0
1017
+ ;;
1018
+ esac
1019
+ done
1020
+
1021
+ if [ -z "$amm_script" ]; then
1022
+ echo 'Missing -s. Run run_cron_job_k8s -h for help' >&2
1023
+ return 0
1024
+ fi
1025
+
1026
+ shift "$((OPTIND-1))"
1027
+
1028
+ local script_args=$(
1029
+ if [ "$#" -gt 0 ] ; then
1030
+ printf '"'
1031
+ join_by '", "' $*
1032
+ printf '"'
1033
+ fi
1034
+ )
1035
+
1036
+ local IMAGE="lolhens/ammonite:2.5.4"
1037
+ local CRONJOB_NAME="cronjob-ammonite-$name"
1038
+
1039
+
1040
+ configure_kubectl_for $namespace
1041
+
1042
+ if [[ ! -r "$amm_script" ]]; then
1043
+ echo "ammonite script not found $amm_script"
1044
+ return 2
1045
+ else
1046
+ local CONFIG_MAP="config-$CRONJOB_NAME"
1047
+ local SECRET_MAP="secret-$CRONJOB_NAME"
1048
+ local CONFIG_MAP_DIR="$(mktemp -d)"
1049
+
1050
+ if [[ ! -z $amm_folder && -d $amm_folder ]] ; then
1051
+ cp -r "$amm_folder/" "$CONFIG_MAP_DIR"
1052
+ fi
1053
+ cp "$amm_script" "$CONFIG_MAP_DIR/script.sc"
1054
+
1055
+ kubectl -n $namespace get configmap $CONFIG_MAP && kubectl -n $namespace delete configmap $CONFIG_MAP
1056
+ kubectl -n $namespace create configmap $CONFIG_MAP --from-file="$CONFIG_MAP_DIR"
1057
+
1058
+ kubectl -n $namespace get secret $SECRET_MAP && kubectl -n $namespace delete secret $SECRET_MAP
1059
+ kubectl -n $namespace create secret generic $SECRET_MAP --from-file="$secret"
1060
+
1061
+ kubectl -n $namespace get cronjob $CRONJOB_NAME && kubectl -n $namespace delete cronjob $CRONJOB_NAME
1062
+
1063
+ echo "starting $CRONJOB_NAME with $IMAGE"
1064
+
1065
+ JOB_DEFINITION='
1066
+ apiVersion: batch/v1
1067
+ kind: CronJob
1068
+ metadata:
1069
+ name: '$CRONJOB_NAME'
1070
+ namespace: '$namespace'
1071
+ spec:
1072
+ schedule: "'$SCHEDULE'"
1073
+ concurrencyPolicy: Forbid
1074
+ jobTemplate:
1075
+ spec:
1076
+ backoffLimit: 0
1077
+ template:
1078
+ spec:
1079
+ nodeSelector:
1080
+ workType: "workers"
1081
+ restartPolicy: Never
1082
+ volumes:
1083
+ - name: config
1084
+ configMap:
1085
+ name: '$CONFIG_MAP'
1086
+ - name: secret
1087
+ secret:
1088
+ secretName: '$SECRET_MAP'
1089
+ containers:
1090
+ - name: '$CRONJOB_NAME'
1091
+ command: ["amm", "/code/script.sc"]
1092
+ image: '$IMAGE'
1093
+ imagePullPolicy: IfNotPresent
1094
+ args: ['$script_args']
1095
+ env:
1096
+ - name: POD_NAME
1097
+ valueFrom:
1098
+ fieldRef:
1099
+ apiVersion: v1
1100
+ fieldPath: metadata.name
1101
+ - name: POD_NAMESPACE
1102
+ valueFrom:
1103
+ fieldRef:
1104
+ apiVersion: v1
1105
+ fieldPath: metadata.namespace
1106
+ - name: HOST_IP
1107
+ valueFrom:
1108
+ fieldRef:
1109
+ apiVersion: v1
1110
+ fieldPath: status.hostIP
1111
+ volumeMounts:
1112
+ - name: config
1113
+ mountPath: /code
1114
+ - name: secret
1115
+ mountPath: /conf
1116
+ readOnly: true
1117
+ resources:
1118
+ requests:
1119
+ cpu: 500m
1120
+ memory: 256Mi
1121
+ limits:
1122
+ cpu: 4000m
1123
+ memory: 512Mi
1124
+ envFrom:
1125
+ - configMapRef:
1126
+ name: '$CONFIG_MAP'
1127
+ - secretRef:
1128
+ name: '$SECRET_MAP'
1129
+ '
1130
+
1131
+ echo $JOB_DEFINITION > /tmp/job.yaml
1132
+
1133
+ kubectl -n $namespace apply -f /tmp/job.yaml
1134
+
1135
+ fi
1136
+ }
1137
+
1138
+ # Usage info
1139
+ show_help_cron_job() {
1140
+ #p:f:s
1141
+ local help="""Usage: run_cron_job_k8s -s SCRIPT [-t TIME] [-e ENV] [-c CONFIG] [-p POD] [-f FOLDER] [ARGS]
1142
+ Create a k8s cron job that will be run a script regularly
1143
+
1144
+ -h display this help and exit
1145
+ -s SCRIPT run script SCRIPT on a pod (SCRIPT must be a .sc file)
1146
+ -t TIME opt. time when the job will be launched. TIME should be in CRON syntax (default to 00 05 * * *, ie 5AM UTC)
1147
+ -e ENV opt. set execution environment (default to testing)
1148
+ -c CONFIG opt. secret file needed for the script (must be a .sc file, not a .secret file)
1149
+ -p POD opt. name of the pod to create (default to $USERNAME)
1150
+ -f FOLDER opt. name of the folder containing the scripts to execute (if SCRIPT needs other files)
1151
+ ARGS opt. additional arguments for SCRIPT
1152
+ """
1153
+ echo "$help"
1154
+ }
1155
+
1156
+ #!/usr/bin/env bash
1157
+
1158
+ # Usage info
1159
+ show_help_job() {
1160
+ local help="""Usage: run_job_k8s -s SCRIPT [-e ENV] [-c CONFIG] [-p POD] [-f FOLDER] [ARGS]
1161
+ Create a k8s job executing a script
1162
+
1163
+ -h display this help and exit
1164
+ -s SCRIPT run script SCRIPT on a pod (SCRIPT must be a .sc file)
1165
+ -e ENV opt. set execution environment (default to testing)
1166
+ -c CONFIG opt. secret file needed for the script (must be a .sc file, not a .secret file)
1167
+ -p POD opt. name of the pod to create (default to $USERNAME)
1168
+ -f FOLDER opt. name of the folder containing the scripts to execute (if SCRIPT needs other files)
1169
+ ARGS opt. additional arguments for SCRIPT
1170
+
1171
+ The organisation of the files must be the same locally as on the pod :
1172
+ - /code containing the script to execute (arg -s) and the other needed files (if the arg -f is used, it must reference this directory)
1173
+ - /conf containing the secret file (arg -c if used)
1174
+ E.g. in the script \"/code/script.sc\", to use a secret file \"/conf/secret.sc\", the import should look like \"import \$file.^.conf.secret.sc\"
1175
+ """
1176
+ echo "$help"
1177
+ }
1178
+
1179
+ run_job_k8s() {
1180
+
1181
+ #default values
1182
+ local namespace="testing"
1183
+ local name="$USERNAME"
1184
+ local secret=""
1185
+ local amm_folder=""
1186
+ local amm_script=""
1187
+
1188
+ while getopts ":e:c:p:f:s:h" opt; do
1189
+ case $opt in
1190
+ e)
1191
+ namespace="$OPTARG" >&2
1192
+ ;;
1193
+ p)
1194
+ name="$OPTARG" >&2
1195
+ ;;
1196
+ c)
1197
+ secret="$OPTARG" >&2
1198
+ ;;
1199
+ f)
1200
+ amm_folder="$OPTARG" >&2
1201
+ ;;
1202
+ s)
1203
+ amm_script="$OPTARG" >&2
1204
+ ;;
1205
+ h)
1206
+ show_help_job
1207
+ return 0
1208
+ ;;
1209
+ :)
1210
+ echo "Option -$OPTARG requires an argument. Run run_cron_job_k8s -h for help" >&2
1211
+ return 0
1212
+ ;;
1213
+ \?)
1214
+ echo "Invalid option: -$OPTARG. Run run_cron_job_k8s -h for help" >&2
1215
+ return 0
1216
+ ;;
1217
+ esac
1218
+ done
1219
+
1220
+ if [ -z "$amm_script" ]; then
1221
+ echo 'Missing -s. Run run_job_k8s -h for help' >&2
1222
+ return 0
1223
+ fi
1224
+
1225
+ shift "$((OPTIND-1))"
1226
+
1227
+ local script_args=$(
1228
+ if [ "$#" -gt 0 ] ; then
1229
+ printf '"'
1230
+ join_by '", "' $*
1231
+ printf '"'
1232
+ fi
1233
+ )
1234
+
1235
+ local IMAGE="lolhens/ammonite:2.5.4"
1236
+ local JOB_NAME="job-ammonite-$name"
1237
+
1238
+ if [[ ! -r "$amm_script" ]]; then
1239
+ echo "ammonite script not found $amm_script"
1240
+ return 2
1241
+ else
1242
+ local CONFIG_MAP="config-$JOB_NAME"
1243
+ local CONFIG_MAP_DIR="$(mktemp -d)"
1244
+ local SECRET_MAP="secret-$JOB_NAME"
1245
+
1246
+ configure_kubectl_for $namespace
1247
+
1248
+ if [[ ! -z $amm_folder && -d $amm_folder ]] ; then
1249
+ cp -r "$amm_folder/" "$CONFIG_MAP_DIR"
1250
+ fi
1251
+ cp "$amm_script" "$CONFIG_MAP_DIR/script.sc"
1252
+
1253
+ kubectl -n $namespace get configmap $CONFIG_MAP && kubectl -n $namespace delete configmap $CONFIG_MAP
1254
+ kubectl -n $namespace create configmap $CONFIG_MAP --from-file="$CONFIG_MAP_DIR"
1255
+
1256
+ kubectl -n $namespace get secret $SECRET_MAP && kubectl -n $namespace delete secret $SECRET_MAP
1257
+ kubectl -n $namespace create secret generic $SECRET_MAP --from-file="$secret"
1258
+
1259
+ kubectl -n $namespace get job $JOB_NAME && kubectl -n $namespace delete job $JOB_NAME
1260
+
1261
+ echo "starting $JOB_NAME with $IMAGE"
1262
+ fi
1263
+
1264
+ JOB_DEFINITION='
1265
+ apiVersion: batch/v1
1266
+ kind: Job
1267
+ metadata:
1268
+ name: '$JOB_NAME'
1269
+ namespace: '$namespace'
1270
+ spec:
1271
+ template:
1272
+ spec:
1273
+ containers:
1274
+ - name: '$JOB_NAME'
1275
+ command: ["amm", "/code/script.sc"]
1276
+ image: '$IMAGE'
1277
+ args: ['$script_args']
1278
+ env:
1279
+ - name: POD_NAME
1280
+ valueFrom:
1281
+ fieldRef:
1282
+ apiVersion: v1
1283
+ fieldPath: metadata.name
1284
+ - name: POD_NAMESPACE
1285
+ valueFrom:
1286
+ fieldRef:
1287
+ apiVersion: v1
1288
+ fieldPath: metadata.namespace
1289
+ - name: HOST_IP
1290
+ valueFrom:
1291
+ fieldRef:
1292
+ apiVersion: v1
1293
+ fieldPath: status.hostIP
1294
+ volumeMounts:
1295
+ - name: config
1296
+ mountPath: /code
1297
+ - name: secret
1298
+ mountPath: /conf
1299
+ readOnly: true
1300
+ resources:
1301
+ requests:
1302
+ cpu: 500m
1303
+ memory: 256Mi
1304
+ limits:
1305
+ cpu: 4000m
1306
+ memory: 1Gi
1307
+ nodeSelector:
1308
+ workType: workers
1309
+ restartPolicy: Never
1310
+ volumes:
1311
+ - name: config
1312
+ configMap:
1313
+ name: '$CONFIG_MAP'
1314
+ - name: secret
1315
+ secret:
1316
+ secretName: '$SECRET_MAP'
1317
+ '
1318
+
1319
+
1320
+ echo $JOB_DEFINITION > /tmp/job.yaml
1321
+
1322
+ kubectl -n $namespace apply -f /tmp/job.yaml
1323
+
1324
+ }
1325
+
1326
+
1327
+ #!/usr/bin/env bash
1328
+
1329
+ run_task() {
1330
+ set -e
1331
+
1332
+ check_args "--namespace" $1
1333
+ shift
1334
+ NAMESPACE=$1
1335
+ shift
1336
+ check_args "--image" $1
1337
+ shift
1338
+ IMAGE=$1
1339
+ shift
1340
+ check_args "--name" $1
1341
+ shift
1342
+ NAME=$1
1343
+ shift
1344
+
1345
+ set -x
1346
+
1347
+ kubectl -n ${NAMESPACE} run ${NAME} \
1348
+ --image ${IMAGE} \
1349
+ --restart=Never \
1350
+ --attach --rm \
1351
+ $*
1352
+ }
1353
+ geocode_address() {
1354
+ ADDRESS=$(sed -e 's: :%20:g' <(echo "$*"))
1355
+ URL="https://maps.googleapis.com/maps/api/geocode/json?address=${ADDRESS}&key=${GOOGLE_API_KEY}"
1356
+ curl $URL
1357
+ }
1358
+
1359
+ search_business() {
1360
+ SIREN=$1
1361
+ shift
1362
+ QUERY=$(sed -e 's: :+:g' <(echo "$*"))
1363
+ URL="https://data.opendatasoft.com/api/records/1.0/search/?dataset=sirene_v3%40public&q=${QUERY}&sort=datederniertraitementetablissement&facet=trancheeffectifsetablissement&facet=libellecommuneetablissement&facet=departementetablissementi&refine.siren=${SIREN}"
1364
+ curl $URL
1365
+ }
1366
+
1367
+ #!/bin/bash
1368
+
1369
+ # source tolls.sh ; tolls antoine.thomas@colisweb.com
1370
+ function tolls() {
1371
+ USER=${1:-first.last@colisweb.com}
1372
+ FROM_DATE=${2:-"2023-02-01"}
1373
+ TO_DATE=${3:-"2023-02-28"}
1374
+
1375
+ USER=$(gum input --prompt "username : " --value $USER)
1376
+ TOKEN=$(./tour_details.sc login --user $USER --password $(gum input --password --placeholder password))
1377
+ [ "$TOKEN" != "" ] && echo "connected" || return 1
1378
+
1379
+ FROM_DATE=$(gum input --prompt "Date start : " --value $FROM_DATE)
1380
+ TO_DATE=$(gum input --prompt "Date end : " --value $TO_DATE)
1381
+ FILENAME="tours-${FROM_DATE}-TO-${TO_DATE}.json"
1382
+ curl --cookie "session=$TOKEN" "https://api.production.colisweb.com/api/v6/routes-plans/external?from=${FROM_DATE}&to=${TO_DATE}" > ~/Downloads/$FILENAME
1383
+ echo "Tournées téléchargées"
1384
+
1385
+ projectIds=$(./tour_details.sc allProjects --file ~/Downloads/$FILENAME | gum choose --no-limit | cut -d "," -f 2)
1386
+ echo "projets sélectionnés : $projectIds"
1387
+ tourIds=$(./tour_details.sc allTours --file ~/Downloads/$FILENAME --projectIds "$projectIds")
1388
+ echo "tournées sélectionnées : $tourIds"
1389
+
1390
+ TARGET="${FROM_DATE}-TO-${TO_DATE}.csv"
1391
+ echo "appels à HERE, écriture dans $TARGET"
1392
+ ./tour_details.sc allToursDetails --token $TOKEN --hereApiKey $HERE_API_KEY --routeIds "$tourIds" > "$TARGET"
1393
+
1394
+ echo "terminé"
1395
+ }
1396
+
1397
+ #!/usr/bin/env bash
1398
+
1399
+ # possible syntax:
1400
+ # login
1401
+ # login testing
1402
+ # login testing userid
1403
+ login() {
1404
+ ENV=${1:-`gum choose testing staging production recette`} && \
1405
+ USER=${2:-`gum input --placeholder username`} && \
1406
+ PASSWORD=`gum input --password --placeholder password` && \
1407
+ TOKEN=`$SCRIPT_FULL_PATH/scala/auth.sc login --env $ENV --user $USER --password $PASSWORD` && \
1408
+ export TOKEN_$ENV=$TOKEN && \
1409
+ echo "login success for $USER on $ENV" >&2
1410
+ }
1411
+
1412
+ # you need to call login first (see above)
1413
+ # possible syntax:
1414
+ # recompute_tour
1415
+ # recompute_tour testing
1416
+ # recompute_tour testing draft
1417
+ # recompute_tour testing draft 28bf9967-b5f3-4294-8855-cfd2fa36ec09
1418
+ # recompute_tour testing draft 28bf9967-b5f3-4294-8855-cfd2fa36ec09 TODAY
1419
+ # recompute_tour testing draft 28bf9967-b5f3-4294-8855-cfd2fa36ec09 FRIDAY
1420
+ recompute_tour() {
1421
+ ENV=${1:-`gum choose testing staging production recette`}
1422
+ MODE=${2:-`gum choose draft definitive`}
1423
+ PROJECT_ID=${3:-`pick_project $ENV`}
1424
+ DAY=${4:-`gum choose TODAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY`}
1425
+ jwt_token $ENV
1426
+ scala/tour_config.sc $MODE -t $TOKEN -p $PROJECT_ID -d $DAY
1427
+ }
1428
+
1429
+ pick_project() {
1430
+ ENV=${1:-`gum choose testing staging production recette`}
1431
+ jwt_token $ENV
1432
+ scala/tour_config.sc list -t $TOKEN -e $ENV | gum filter | cut -f1
1433
+ }
1434
+
1435
+ jwt_token() {
1436
+ ENV=${1:-`gum choose testing staging production recette`}
1437
+ eval 'TOKEN=$TOKEN_'$ENV
1438
+ if ! $SCRIPT_FULL_PATH/scala/auth.sc check -t $TOKEN -e $ENV ; then
1439
+ login $ENV
1440
+ fi
1441
+ }
1442
+
1443
+ #!/usr/bin/env bash
1444
+
1445
+ ftp_ikea_k8s() {
1446
+ SSH_LOCAL_PORT=2230
1447
+ FTP_LOCAL_PORT=25500
1448
+ start_ssh_bastion testing $SSH_LOCAL_PORT
1449
+
1450
+ lsof -ti tcp:$FTP_LOCAL_PORT | xargs kill
1451
+
1452
+ bastion_config=$(mktemp)
1453
+ cat > "$bastion_config" <<EOF
1454
+ UserKnownHostsFile /dev/null
1455
+ StrictHostKeyChecking no
1456
+ User root
1457
+ Host bastion_ftp
1458
+ HostName 127.0.0.1
1459
+ Port 2230
1460
+ LocalForward 25500 ft.centiro.ikea.com:22
1461
+ EOF
1462
+
1463
+ ssh -f -N \
1464
+ -F "$bastion_config" \
1465
+ "bastion_ftp"
1466
+
1467
+ sftp -P $FTP_LOCAL_PORT colisweb.fr@127.0.0.1
1468
+ }
1469
+
1470
+ #!/usr/bin/env bash
1471
+
1472
+ # usage:
1473
+ # jconsole_k8s testing colisweb-api-web
1474
+
1475
+ jconsole_k8s() {
1476
+ ENV=$1
1477
+ NAME=$2
1478
+
1479
+ start_ssh_bastion $ENV 2242
1480
+ POD_IP=$( \
1481
+ kubectl -n $ENV get pods -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.status.podIP}{"\n"}{end}' \
1482
+ | grep "$NAME" | cut -d' ' -f2 | head -1 \
1483
+ )
1484
+ echo "selected POD with ip $POD_IP"
1485
+ echo "use 'root' as password"
1486
+ ssh -f -N -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -D 7777 root@127.0.0.1 -p 2242
1487
+
1488
+ jconsole \
1489
+ -J-DsocksProxyHost=localhost \
1490
+ -J-DsocksProxyPort=7777 \
1491
+ -J-DsocksNonProxyHosts= \
1492
+ service:jmx:rmi:///jndi/rmi://$POD_IP:7199/jmxrmi \
1493
+ &
1494
+
1495
+ echo "remember to stop with 'stop_ssh_bastion'"
1496
+
1497
+ }
1498
+
1499
+ #!/usr/bin/env bash
1500
+
1501
+ # Interactive console on an existing pod. See also run_ruby_k8s
1502
+ # Ex :
1503
+ # railsc_k8s_old production
1504
+ # railsc_k8s_old production "User.where(email:'toni@colisweb.com')"
1505
+ railsc_k8s_old() {
1506
+ ENV=$1
1507
+ COMMAND=$2
1508
+ configure_kubectl_for $ENV
1509
+ POD=$(kubectl -n $ENV get pods -o=name | grep colisweb-api-web | head -1 | sed -e 's/pod\///')
1510
+ KUBERAILS="kubectl -n $ENV exec -ti $POD -- /usr/src/app/bin/rails c"
1511
+ [ -z "$COMMAND" ] && eval $KUBERAILS || echo $COMMAND | eval $KUBERAILS
1512
+ }
1513
+
1514
+ # Interactive console on an new pod. See also run_ruby_k8s
1515
+ # Ex :
1516
+ # railsc_k8s production
1517
+ railsc_k8s() {
1518
+ ENV=$1
1519
+ [[ $ENV = "production" || $ENV = "staging" ]] && default_tag="master-latest" || default_tag="${ENV}-latest"
1520
+ local image_tag=${5:-$default_tag}
1521
+ local IMAGE="949316342391.dkr.ecr.eu-west-1.amazonaws.com/colisweb-api:$image_tag"
1522
+ local POD_NAME="colisweb-api-rails-console-$image_tag-$USERNAME"
1523
+
1524
+ kubectl -n $ENV get pod $POD_NAME && kubectl -n $ENV delete pod $POD_NAME
1525
+
1526
+ configure_kubectl_for $ENV
1527
+ echo "starting with $IMAGE"
1528
+
1529
+ kubectl -n $ENV run $POD_NAME \
1530
+ --image $IMAGE \
1531
+ --restart=Never \
1532
+ --overrides='{
1533
+ "spec":{
1534
+ "nodeSelector":{
1535
+ "workType": "workers"
1536
+ },
1537
+ "containers":[
1538
+ {
1539
+ "name":"'$POD_NAME'",
1540
+ "image":"'$IMAGE'",
1541
+ "imagePullPolicy":"Always",
1542
+ "command":[
1543
+ "sleep",
1544
+ "infinity"
1545
+ ],
1546
+ "resources":{
1547
+ "limits":{
1548
+ "memory": "2048Mi"
1549
+ }
1550
+ },
1551
+ "envFrom": [ {
1552
+ "configMapRef": {
1553
+ "name": "colisweb-api"
1554
+ }
1555
+ }, {
1556
+ "secretRef": {
1557
+ "name": "colisweb-api"
1558
+ }
1559
+ }
1560
+ ]
1561
+ }
1562
+ ]
1563
+ }
1564
+ }
1565
+ '
1566
+
1567
+ sleep 5
1568
+ kubectl -n $ENV exec -it $POD_NAME -- /usr/src/app/bin/rails c
1569
+
1570
+ print "End of $POD_NAME "
1571
+ kubectl -n $ENV delete pods $POD_NAME
1572
+ }
1573
+
1574
+ # Ex :
1575
+ # create_user testing claire.lien@colisweb.com super_admin clairemdp
1576
+ create_user() {
1577
+ ENV=$1
1578
+ EMAIL=$2
1579
+ ROLE=$3
1580
+ PASSWORD=$4
1581
+ railsc_k8s $ENV "User.where(email:'$EMAIL', role:'$ROLE').first_or_create.update_attributes!(password: '$PASSWORD')"
1582
+ }
1583
+
1584
+ # Ex :
1585
+ # delete_user testing claire.lien@colisweb.com
1586
+ delete_user() {
1587
+ ENV=$1
1588
+ EMAIL=$2
1589
+ railsc_k8s $ENV "User.find_by(email:'$EMAIL').destroy"
1590
+ }
1591
+
1592
+ # NON Interactive console on an new pod, for long-running tasks (a few minutes)
1593
+ # See also railsc_k8s
1594
+ # file.txt will be available from /conf/data.txt in the ruby code
1595
+ # examples :
1596
+ # run_ruby_k8s testing demo <(echo "pp JSON.parse(File.read('/conf/data.txt'))") <(echo '{ "content": 123 }')
1597
+ # run_ruby_k8s testing demo ~/.oh-my-zsh/custom/dev-tools/shell-session/ruby/demo.rb <(echo '{ "content": 123 }')
1598
+ run_ruby_k8s() {
1599
+ if [ $# -lt 4 ]; then
1600
+ echo "usage : run_ruby_k8s production name-for-pod script.rb file.txt"
1601
+ return 1
1602
+ fi
1603
+ local namespace=$1
1604
+ local name=$2
1605
+ local ruby_script=$3
1606
+ local input_data=$4
1607
+ [[ $namespace = "production" || $namespace = "staging" ]] && default_tag="master-latest" || default_tag="${namespace}-latest"
1608
+ local image_tag=${5:-$default_tag}
1609
+
1610
+ if [ ! -r "$ruby_script" ]; then
1611
+ echo "ruby script not found $ruby_script"
1612
+ return 2
1613
+ fi
1614
+
1615
+ if [ ! -r "$input_data" ]; then
1616
+ echo "data not found $input_data"
1617
+ return 3
1618
+ fi
1619
+
1620
+
1621
+ local IMAGE="949316342391.dkr.ecr.eu-west-1.amazonaws.com/colisweb-api:$image_tag"
1622
+ local POD_NAME="colisweb-api-script-$name"
1623
+ local CONFIG_MAP="config-$POD_NAME"
1624
+ local CONFIG_MAP_DIR="$(mktemp -d)"
1625
+
1626
+
1627
+ configure_kubectl_for $namespace
1628
+
1629
+
1630
+ cp "$ruby_script" "$CONFIG_MAP_DIR/script.rb"
1631
+ cp "$input_data" "$CONFIG_MAP_DIR/data.txt"
1632
+
1633
+ kubectl -n $namespace get configmap $CONFIG_MAP && kubectl -n $namespace delete configmap $CONFIG_MAP
1634
+ kubectl -n $namespace create configmap $CONFIG_MAP --from-file="$CONFIG_MAP_DIR"
1635
+
1636
+ kubectl -n $namespace get pod $POD_NAME && kubectl -n $namespace delete pod $POD_NAME
1637
+
1638
+ echo "starting with $IMAGE"
1639
+ kubectl -n $namespace run $POD_NAME \
1640
+ --image $IMAGE \
1641
+ -ti \
1642
+ --restart=Never \
1643
+ --attach \
1644
+ --rm \
1645
+ --overrides='{
1646
+ "spec":{
1647
+ "nodeSelector":{
1648
+ "workType": "workers"
1649
+ },
1650
+ "containers":[
1651
+ {
1652
+ "name":"'$POD_NAME'",
1653
+ "image":"'$IMAGE'",
1654
+ "imagePullPolicy":"Always",
1655
+ "command":[
1656
+ "/usr/src/app/bin/rails",
1657
+ "r",
1658
+ "/conf/script.rb"
1659
+ ],
1660
+ "resources":{
1661
+ "limits":{
1662
+ "memory": "4096Mi"
1663
+ }
1664
+ },
1665
+ "volumeMounts":[
1666
+ {
1667
+ "name":"conf",
1668
+ "mountPath":"/conf"
1669
+ }
1670
+ ],
1671
+ "envFrom": [ {
1672
+ "configMapRef": {
1673
+ "name": "colisweb-api"
1674
+ }
1675
+ }, {
1676
+ "secretRef": {
1677
+ "name": "colisweb-api"
1678
+ }
1679
+ }
1680
+ ]
1681
+ }
1682
+ ],
1683
+ "volumes":[
1684
+ {
1685
+ "name":"conf",
1686
+ "configMap":{ "name":"'$CONFIG_MAP'" }
1687
+ }
1688
+ ]
1689
+ }
1690
+ }
1691
+ '
1692
+
1693
+ kubectl -n $namespace delete configmap $CONFIG_MAP
1694
+ }
1695
+
1696
+ # example:
1697
+ # update_pickup_cp testing <( echo '{"wrong_cp": "59123", "corrected_cp": "59223", "delivery_ids": ["4192421", "4192425"]}' )
1698
+ update_pickup_cp() {
1699
+ run_ruby_k8s $1 update-pickup-cp "$SCRIPT_FULL_PATH/ruby/update_pickup_cp.rb" $2
1700
+ }
1701
+
1702
+
1703
+
1704
+ update_all_prices() {
1705
+ local namespace=$1
1706
+ local json_prices=$2
1707
+
1708
+ local json_size=$(wc -c < "$json_prices")
1709
+
1710
+ if ((json_size > 940000)); then
1711
+ command -v jq || (echo "jq not found (use brew install jq)" && return 1)
1712
+ local max_lines=3000
1713
+ local total_lines=$(jq '. | length' $json_prices)
1714
+ local iterations=$((total_lines / max_lines + 1))
1715
+ echo "$json_prices is too big, I'll split it for you in blocks of $max_lines lines. It will take $iterations runs"
1716
+ for (( i = 0 ; i < iterations ; i++ )) ; do
1717
+ local start=$((i * max_lines))
1718
+ local end=$(( (i + 1) * max_lines))
1719
+ local split_file=$(mktemp)
1720
+ jq -c ".[$start:$end]" $json_prices > $split_file
1721
+ local split_lines=$(jq '. | length' $split_file)
1722
+ echo "starting iteration $i from $start to $end with $split_file command -v has $split_lines lines"
1723
+ run_ruby_k8s $namespace "update-prices-$i" "$SCRIPT_FULL_PATH/ruby/update_prices.rb" $split_file
1724
+ done
1725
+ else
1726
+ run_ruby_k8s $namespace "update-prices" "$SCRIPT_FULL_PATH/ruby/update_prices.rb" $json_prices
1727
+ fi
1728
+ }
1729
+
1730
+
1731
+ update_surveys() {
1732
+ local namespace=$1
1733
+ local csv_surveys=$2
1734
+
1735
+ local csv_size=$(wc -c < "$csv_surveys")
1736
+
1737
+
1738
+ if ((csv_size > 940000)); then
1739
+ local max_lines=400
1740
+ local total_lines=$(wc -l < $csv_surveys)
1741
+ local iterations=$((total_lines / max_lines + 1))
1742
+ echo "$csv_surveys is too big, I'll split it for you in blocks of $max_lines lines. It will take $iterations runs"
1743
+ for (( i = 0 ; i < iterations ; i++ )) ; do
1744
+ local start=$((i * max_lines + 2))
1745
+ local end=$(( (i + 1) * max_lines + 1))
1746
+ local split_file=$(mktemp)
1747
+ head -1 $csv_surveys > $split_file
1748
+ sed -n ''"$start,${end}p" $csv_surveys >> $split_file
1749
+
1750
+
1751
+ local split_lines=$(wc -l < $split_file)
1752
+ echo "starting iteration $i from $start to $end with $split_file command -v has $split_lines lines"
1753
+ run_ruby_k8s $namespace "reimport-surveys-$i" "$SCRIPT_FULL_PATH/ruby/feedback_kpi_reuploader.rb" $split_file
1754
+ done
1755
+ else
1756
+ run_ruby_k8s $namespace "reimport-surveys" "$SCRIPT_FULL_PATH/ruby/feedback_kpi_reuploader.rb" $csv_surveys
1757
+ fi
1758
+ }
1759
+
1760
+ #!/usr/bin/env bash
1761
+
1762
+ configure_gitlab_ssh() {
1763
+ tmp_dir=$(mktemp -d)
1764
+ ssh-keyscan gitlab.com > $tmp_dir/known_hosts
1765
+ echo "$SSH_PRIVATE_KEY" > $tmp_dir/id_rsa
1766
+ chmod 600 $tmp_dir/id_rsa
1767
+ ssh -i $tmp_dir/id_rsa -T git@gitlab.com
1768
+ rm -Rf $tmp_dir
1769
+ }
1770
+
1771
+
1772
+ configure_gitlab_ssh_home() {
1773
+ mkdir ~/.ssh
1774
+ ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
1775
+ echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
1776
+ chmod 600 ~/.ssh/id_rsa
1777
+ ssh -T git@gitlab.com
1778
+ }
1779
+ #!/usr/bin/env bash
1780
+
1781
+ datadog_schedule_downtime() {
1782
+ SERVICES=$1
1783
+ DOWNTIME_MINUTES=${2:-30}
1784
+
1785
+ if [[ "$ENVIRONMENT" == "production" ]] ; then
1786
+ log "scheduling downtime for $SERVICES in $ENVIRONMENT"
1787
+ else
1788
+ return 0
1789
+ fi
1790
+
1791
+ for SERVICE in $SERVICES ; do
1792
+ datadog_schedule_downtime_single $SERVICE $DOWNTIME_MINUTES
1793
+ done
1794
+ }
1795
+
1796
+ datadog_schedule_downtime_single() {
1797
+ local SERVICE=$1
1798
+ local DOWNTIME_MINUTES=$2
1799
+
1800
+ START=$(date +%s)
1801
+ END=$((START + 60 * DOWNTIME_MINUTES))
1802
+
1803
+ log "scheduling a downtime on datadog for $SERVICE ($DOWNTIME_MINUTES minutes)"
1804
+ curl -X POST "https://api.datadoghq.com/api/v1/downtime" \
1805
+ -H "Content-Type: application/json" \
1806
+ -H "DD-API-KEY: ${DD_API_KEY}" \
1807
+ -H "DD-APPLICATION-KEY: ${DD_APP_KEY}" \
1808
+ -d '
1809
+ {
1810
+ "active": true,
1811
+ "downtime_type": 0,
1812
+ "start": $START,
1813
+ "end": $END,
1814
+ "message": "CA Deployment - performance for $SERVICE may be lower for next $DOWNTIME_MINUTES min",
1815
+ "monitor_tags": [
1816
+ "service:$SERVICE",
1817
+ "performance"
1818
+ ],
1819
+ "scope": [
1820
+ "env:production"
1821
+ ],
1822
+ "timezone": "Europe/Paris"
1823
+ }
1824
+ '
1825
+ }
1826
+ #!/usr/bin/env bash
1827
+
1828
+ docker_build_push() {
1829
+ read -r -a BUILD_ARGS <<< "$1"
1830
+ DOCKER_BUILD_ARGS="--build-arg VCS_REF=$(git rev-parse --short HEAD)"
1831
+ for ARG_NAME in "${BUILD_ARGS[@]}"
1832
+ do
1833
+ DOCKER_BUILD_ARGS="$DOCKER_BUILD_ARGS --build-arg $ARG_NAME=${!ARG_NAME}"
1834
+ done
1835
+
1836
+ if ! image_exists $DOCKER_REGISTRY_ID $APPLICATION $CI_COMMIT_SHORT_SHA ; then
1837
+ docker pull $DOCKER_IMAGE || true
1838
+ docker build $DOCKER_BUILD_ARGS -t $DOCKER_IMAGE_SHA --cache-from $DOCKER_IMAGE $DOCKER_STAGE_PATH
1839
+ docker push $DOCKER_IMAGE_SHA
1840
+ fi
1841
+ }
1842
+
1843
+ docker_promote() {
1844
+ # inspired by https://dille.name/blog/2018/09/20/how-to-tag-docker-images-without-pulling-them/
1845
+ OLD_TAG=${1//[^0-9a-zA-Z-.]/_}
1846
+ NEW_TAG=${2//[^0-9a-zA-Z-.]/_}
1847
+ echo "promoting from $OLD_TAG to $NEW_TAG"
1848
+ TOKEN=$(aws_ecr_token)
1849
+ CONTENT_TYPE="application/vnd.docker.distribution.manifest.v2+json"
1850
+ MANIFESTS_API="https://${DOCKER_REGISTRY}/v2/${APPLICATION}/manifests"
1851
+
1852
+ if MANIFEST=$(curl --fail -H "Authorization: Basic $TOKEN" -H "Accept: ${CONTENT_TYPE}" "$MANIFESTS_API/${OLD_TAG}"); then
1853
+ echo "authenticated on $MANIFESTS_API"
1854
+ else
1855
+ return 1
1856
+ fi
1857
+ if curl --fail -H "Authorization: Basic $TOKEN" -X PUT -H "Content-Type: ${CONTENT_TYPE}" -d "${MANIFEST}" "$MANIFESTS_API/$NEW_TAG" ; then
1858
+ echo "promoted ${APPLICATION} from $OLD_TAG to $NEW_TAG"
1859
+ else
1860
+ return 2
1861
+ fi
1862
+ }
1863
+
1864
+ ensure_images_exists() {
1865
+ for IMAGE_TO_CHECK in $(echo $1 | tr "," "\n"); do
1866
+ image_exists ${DOCKER_REGISTRY_ID} ${IMAGE_TO_CHECK} ${VERSION} || return 1
1867
+ done
1868
+ }
1869
+ #!/usr/bin/env bash
1870
+
1871
+ extract_yaml_config_variable() {
1872
+ set +e
1873
+ set +x
1874
+
1875
+ check_args "--environment" $1
1876
+ shift
1877
+ ENVIRONMENT=$1
1878
+ shift
1879
+
1880
+ check_args "--configs-path" $1
1881
+ shift
1882
+ CONFIGS_PATH=$1
1883
+ shift
1884
+
1885
+ check_args "--variable" $1
1886
+ shift
1887
+ VARIABLE=$1
1888
+ shift
1889
+
1890
+ [[ "$1" == "--optional" ]] && OPTIONAL=true || OPTIONAL=false
1891
+
1892
+ if [ ! -f ${CONFIGS_PATH}/common.yaml ]; then
1893
+ echo >&2 "Missing $CONFIGS_PATH/common.yaml configuration file"
1894
+ exit 1
1895
+ fi
1896
+ if [ ! -f ${CONFIGS_PATH}/${ENVIRONMENT}.yaml ]; then
1897
+ echo >&2 "Missing $CONFIGS_PATH/$ENVIRONMENT.yaml configuration file"
1898
+ exit 1
1899
+ fi
1900
+ if [ ! -f ${CONFIGS_PATH}/${ENVIRONMENT}-secrets.yaml ]; then
1901
+ echo >&2 "Missing $CONFIGS_PATH/$ENVIRONMENT-secrets.yaml configuration file"
1902
+ exit 1
1903
+ fi
1904
+
1905
+ result=$(yq -r ${VARIABLE} "$CONFIGS_PATH/$ENVIRONMENT-secrets.yaml")
1906
+ if [ $? -ne 0 ] || [ "$result" = "null" ]; then
1907
+ result=$(yq -r ${VARIABLE} "$CONFIGS_PATH/$ENVIRONMENT.yaml")
1908
+ if [ $? -ne 0 ] || [ "$result" = "null" ]; then
1909
+ result=$(yq -r ${VARIABLE} "$CONFIGS_PATH/common.yaml")
1910
+ if [ $? -ne 0 ] || [ "$result" = "null" ]; then
1911
+ if [ $OPTIONAL = true ]; then
1912
+ echo ""
1913
+ exit 0
1914
+ else
1915
+ echo >&2 "Missing path $VARIABLE in $CONFIGS_PATH/$ENVIRONMENT-secrets.yaml, $CONFIGS_PATH/$ENVIRONMENT.yaml or $CONFIGS_PATH/common.yaml"
1916
+ exit 1
1917
+ fi
1918
+ fi
1919
+ fi
1920
+ fi
1921
+ echo ${result}
1922
+ }
1923
+ #!/usr/bin/env bash
1924
+
1925
+ flyway_clean() {
1926
+ HOST="$1"
1927
+ PORT="$2"
1928
+ DATABASE="$3"
1929
+ USER="$4"
1930
+ PASSWORD="$5"
1931
+
1932
+ kubectl run -it --rm flywayclean \
1933
+ --image=flyway/flyway \
1934
+ --restart=Never \
1935
+ -- \
1936
+ -cleanDisabled=false \
1937
+ -url="jdbc:postgresql://$HOST:$PORT/$DATABASE" \
1938
+ -user="$USER" \
1939
+ -password="$PASSWORD" \
1940
+ clean
1941
+ }
1942
+
1943
+ #!/usr/bin/env bash
1944
+
1945
+ FLYWAY_VERSION="5.2.4"
1946
+
1947
+
1948
+ get_yaml_variable() {
1949
+ extract_yaml_config_variable --environment ${ENVIRONMENT} --configs-path $(pwd)/deploy --variable $@
1950
+ }
1951
+
1952
+ init_migrate_db() {
1953
+ set -e
1954
+
1955
+ check_env_vars 4 "APPLICATION" "ENVIRONMENT" "FLYWAY_VERSION" "MIGRATION_SQL_PATH"
1956
+
1957
+ PG_YAML_PATH=".${APPLICATION}config.postgres"
1958
+
1959
+ DB_PORT="5432"
1960
+ DB_HOST=$(get_yaml_variable "${PG_YAML_PATH}.host")
1961
+ DB_INIT_USERNAME=$(get_yaml_variable "${PG_YAML_PATH}.initUsername")
1962
+ DB_INIT_PASSWORD=$(get_yaml_variable "${PG_YAML_PATH}.initPassword")
1963
+ DB_DATABASE=$(get_yaml_variable "${PG_YAML_PATH}.database")
1964
+ DB_USER=$(get_yaml_variable "${PG_YAML_PATH}.user")
1965
+ DB_PASSWORD=$(get_yaml_variable "${PG_YAML_PATH}.password")
1966
+ DB_URL="jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}"
1967
+
1968
+ DB_RO_USER=$(get_yaml_variable "${PG_YAML_PATH}.readOnlyUser" --optional)
1969
+ DB_RO_PASSWORD=$(get_yaml_variable "${PG_YAML_PATH}.readOnlyPassword" --optional)
1970
+
1971
+ unset KUBECONFIG
1972
+
1973
+ configure_kubectl_for_ci ${ENVIRONMENT}
1974
+
1975
+ kube_init_service_database \
1976
+ --namespace ${ENVIRONMENT} \
1977
+ --service ${APPLICATION} \
1978
+ --db_host ${DB_HOST} \
1979
+ --db_port ${DB_PORT} \
1980
+ --db_init_username ${DB_INIT_USERNAME} \
1981
+ --db_init_password ${DB_INIT_PASSWORD} \
1982
+ --db_database ${DB_DATABASE} \
1983
+ --db_username ${DB_USER} \
1984
+ --db_password ${DB_PASSWORD}
1985
+
1986
+ if [[ ! -z "$DB_RO_USER" ]] && [[ ! -z "$DB_RO_USER" ]]; then
1987
+ kube_init_database_readonly_account \
1988
+ --namespace ${ENVIRONMENT} \
1989
+ --service ${APPLICATION} \
1990
+ --db_connection "$DB_INIT_USERNAME:$DB_INIT_PASSWORD@$DB_HOST:$DB_PORT" \
1991
+ --db_database ${DB_DATABASE} \
1992
+ --db_readonly_username ${DB_RO_USER} \
1993
+ --db_readonly_password ${DB_RO_PASSWORD}
1994
+ fi
1995
+
1996
+ flyway_migrate \
1997
+ --environment ${ENVIRONMENT} \
1998
+ --namespace ${ENVIRONMENT} \
1999
+ --service ${APPLICATION} \
2000
+ --db_url ${DB_URL} \
2001
+ --db_user ${DB_USER} \
2002
+ --db_password ${DB_PASSWORD} \
2003
+ --flyway_version ${FLYWAY_VERSION} \
2004
+ --flyway_sql_folder $(pwd)/${MIGRATION_SQL_PATH}
2005
+ }
2006
+
2007
+ flyway_migrate() {
2008
+ set -e
2009
+
2010
+ extract_args 8 \
2011
+ environment namespace service db_url db_user db_password flyway_version flyway_sql_folder $*
2012
+
2013
+ echo "running flyway migrations for service $service in environment $environment namespace $namespace for db_url $db_url with user $db_user"
2014
+ echo "migration files expected in $flyway_sql_folder"
2015
+
2016
+ CONFIGMAP_NAME="$service-flyway-migration-sql"
2017
+ POD_NAME="$service-flyway-migration"
2018
+
2019
+ configure_kubectl_for_ci $environment
2020
+
2021
+ kubectl -n $namespace delete configmap $CONFIGMAP_NAME --ignore-not-found
2022
+ kubectl -n $namespace delete pod $POD_NAME --ignore-not-found
2023
+ kubectl -n $namespace create configmap $CONFIGMAP_NAME --from-file=$flyway_sql_folder
2024
+
2025
+ kubectl -n $namespace run $POD_NAME --image ignored -ti --restart=Never --attach --rm --overrides='
2026
+ {
2027
+ "spec":{
2028
+ "containers":[
2029
+ {
2030
+ "name":"'$POD_NAME'",
2031
+ "image":"boxfuse/flyway:'$flyway_version'",
2032
+ "command":["flyway", "-url='$db_url'", "-user='$db_user'", "-password='$db_password'", "migrate"],
2033
+ "volumeMounts":[
2034
+ {
2035
+ "name":"sql",
2036
+ "mountPath":"/flyway/sql"
2037
+ }
2038
+ ]
2039
+ }
2040
+ ],
2041
+ "volumes":[
2042
+ {
2043
+ "name":"sql",
2044
+ "configMap":{
2045
+ "name":"'$CONFIGMAP_NAME'"
2046
+ }
2047
+ }
2048
+ ]
2049
+ }
2050
+ }
2051
+ '
2052
+
2053
+ kubectl -n $namespace delete configmap $CONFIGMAP_NAME
2054
+ }
2055
+
2056
+ #!/usr/bin/env bash
2057
+
2058
+ record_git_commit() {
2059
+ for file in $GIT_COMMIT_FILES; do
2060
+ sed -i 's&GIT_COMMIT&'"${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}&" "$file"
2061
+ done
2062
+ }
2063
+
2064
+ gitlab_import_pgp_key() {
2065
+ if [ "$GITLAB_PGP_PRIVATE_KEY" != "" ]
2066
+ then
2067
+ KEY_FOLDER=<(echo "$GITLAB_PGP_PRIVATE_KEY")
2068
+ gpg --import $KEY_FOLDER > /dev/null
2069
+ else
2070
+ echo '$GITLAB_PGP_PRIVATE_KEY is not set'
2071
+ return 1
2072
+ fi
2073
+ }
2074
+
2075
+ git_reveal() {
2076
+ gitlab_import_pgp_key
2077
+ gpg --decrypt $1
2078
+ }
2079
+ #!/usr/bin/env bash
2080
+
2081
+ helm_deploy_v3() {
2082
+ APPLICATION=$1
2083
+ ENVIRONMENT=$2
2084
+ VERSION=$3
2085
+ deploy_chart_v3 \
2086
+ --path_configs deploy \
2087
+ --path_chart deploy/$APPLICATION \
2088
+ --application $APPLICATION \
2089
+ --environment $ENVIRONMENT \
2090
+ --namespace $ENVIRONMENT \
2091
+ --helm_extra_args --set global.version=$VERSION
2092
+ }
2093
+
2094
+ deploy_chart_v3() {
2095
+ set -e
2096
+ set -x
2097
+
2098
+ # Rigid parsing, but all args are mandatory (expect last) and flexible order is unnecessary
2099
+ check_args "--path_configs" $1; shift
2100
+ path_configs=$1; shift
2101
+ check_args "--path_chart" $1; shift
2102
+ path_chart=$1; shift
2103
+ check_args "--application" $1; shift
2104
+ application=$1; shift
2105
+ check_args "--environment" $1; shift
2106
+ environment=$1; shift
2107
+ check_args "--namespace" $1; shift
2108
+ namespace=$1; shift
2109
+ if [ $# -ne 0 ]; then
2110
+ check_args "--helm_extra_args" $1; shift
2111
+ helm_extra_args=$*
2112
+ fi
2113
+
2114
+ echo "================================"
2115
+ echo " Deploying $application"
2116
+ echo " - Environment: $environment"
2117
+ echo " - Namespace: $namespace"
2118
+ echo "================================"
2119
+
2120
+ root_path=$(pwd)
2121
+
2122
+ # Check the configs exists
2123
+
2124
+ check_config_file ${root_path}/${path_configs}/common.yaml
2125
+ check_config_file ${root_path}/${path_configs}/${namespace}.yaml
2126
+ check_config_file ${root_path}/${path_configs}/${namespace}-secrets.yaml
2127
+
2128
+ # Check the chart exists
2129
+ if [ ! -d ${root_path}/${path_chart} ] || [ ! -f ${root_path}/${path_chart}/Chart.yaml ]; then
2130
+ echo "Bad Chart $root_path/$path_chart : does not exists or missing Chart.yaml"
2131
+ print_usage
2132
+ exit 1
2133
+ fi
2134
+
2135
+ # Unset Kubectl configuration made via the KUBECONFIG env variable
2136
+ # it would override the config made by configure_kubectl_for
2137
+ # for example, using Gitlab runners in Kubernetes sets this variable and causes conflict
2138
+ unset KUBECONFIG
2139
+
2140
+ # Configure Kubectl
2141
+ configure_kubectl_for_ci ${environment}
2142
+
2143
+ # Configure helm3
2144
+ helm3 version --namespace ${namespace} || true
2145
+ # helm3 stable repo have changed and must be updated manually, in versions < v2.17.0
2146
+ helm3 repo add colisweb s3://colisweb-helm-charts/colisweb
2147
+ helm3 repo add stable https://charts.helm.sh/stable
2148
+ helm3 repo update
2149
+ helm3 dependency update ${root_path}/${path_chart}
2150
+
2151
+ # Gather values/*.yaml files
2152
+ values_path="${root_path}/${path_chart}/values"
2153
+ values_files=''
2154
+ [ -d $values_path ] && values_files=$(find $values_path -type f -maxdepth 1 -name "*.yaml" | sed 's/^/ -f /' | tr -d \\n | sed 's/%//')
2155
+
2156
+ # Deploy
2157
+ helm3 upgrade --install \
2158
+ --namespace ${namespace} \
2159
+ ${values_files} \
2160
+ -f ${root_path}/${path_configs}/common.yaml \
2161
+ -f ${root_path}/${path_configs}/${namespace}.yaml \
2162
+ -f ${root_path}/${path_configs}/${namespace}-secrets.yaml \
2163
+ ${helm_extra_args} \
2164
+ ${application} ${root_path}/${path_chart}
2165
+
2166
+ #send event to dd
2167
+ PUBLISHED_VERSION="$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA"
2168
+ emit_datadog_deploy_event --environment $environment --service $application --version $PUBLISHED_VERSION
2169
+
2170
+ echo "================================"
2171
+ echo " Deployed $application"
2172
+ echo " - Environment: $environment"
2173
+ echo " - Namespace: $namespace"
2174
+ echo "================================"
2175
+
2176
+ set +x
2177
+ }
2178
+
2179
+ verify_deployments_v3() {
2180
+ set -e
2181
+
2182
+ # usage :
2183
+ # verify_deployments staging price
2184
+ # verify_deployments -t 15m testing price
2185
+
2186
+ if [ "$1" = "-t" ] ; then
2187
+ TIMEOUT=$2
2188
+ shift
2189
+ shift
2190
+ else
2191
+ TIMEOUT=5m
2192
+ fi
2193
+
2194
+ NAMESPACE=$1
2195
+ RELEASE=$2
2196
+
2197
+ # Get all Deployments names from the deployed chart
2198
+ DEPLOYMENTS=(
2199
+ $(helm3 get manifest --namespace $NAMESPACE $RELEASE | yq -rs '.[] | select(.kind=="Deployment") | .metadata.name')
2200
+ )
2201
+
2202
+ echo "verifying on $NAMESPACE deployments ${DEPLOYMENTS[@]} with a timeout of $TIMEOUT"
2203
+
2204
+ PIDS=()
2205
+ for D in "${DEPLOYMENTS[@]}"; do
2206
+ kubectl -n ${NAMESPACE} rollout status deployment ${D} --timeout=${TIMEOUT} &
2207
+ PIDS+=($!)
2208
+ done
2209
+
2210
+ for P in ${PIDS[@]}; do
2211
+ wait $P
2212
+
2213
+ if [ $? -ne 0 ]; then
2214
+ echo "at least one deployment failed or timed out (after $TIMEOUT)"
2215
+ exit 1
2216
+ fi
2217
+ done
2218
+
2219
+ }
2220
+
2221
+ print_usage() {
2222
+ echo "Usage:"
2223
+ echo "deploy_chart \\"
2224
+ echo " --path_configs <path to .yaml namespaces and secret config files>"
2225
+ echo " --path_chart <path to Helm Chart>"
2226
+ echo " --application <application name used by Helm>"
2227
+ echo " --environment <infrastructure environment>"
2228
+ echo " --namespace <namespace>"
2229
+ echo " --helm-extra-args <extra args to pass to helm, ex: --set my.value=42 --set your.setting=on>"
2230
+ echo ""
2231
+ }
2232
+
2233
+ check_config_file() {
2234
+ local filename=$1
2235
+ if [ ! -f ${filename} ]; then
2236
+ echo "Missing $filename configuration file"
2237
+ print_usage
2238
+ exit 1
2239
+ fi
2240
+ }
2241
+
2242
+ #!/usr/bin/env bash
2243
+
2244
+ configure_kubectl_for_ci() {
2245
+ if [ -z ${GITLAB_PAT} ]; then
2246
+ echo "Cannot configure kubectl: no GITLAB_PAT configured"
2247
+ exit 1
2248
+ fi
2249
+
2250
+ infra_env="$1"
2251
+ valid_envs="[testing][staging][production][performance][tests][recette]"
2252
+ echo "$valid_envs" | grep -q "\[$infra_env\]"
2253
+
2254
+ if [ $? -ne 0 ]; then
2255
+ echo "Cannot configure kubectl for invalid env : $infra_env"
2256
+ echo "choose one of $valid_envs"
2257
+ exit 1
2258
+ fi
2259
+
2260
+ mkdir -p ~/.kube
2261
+ curl -fsS \
2262
+ --header "PRIVATE-TOKEN: $GITLAB_PAT" \
2263
+ "https://gitlab.com/api/v4/projects/8141053/jobs/artifacts/$infra_env/raw/$infra_env.kubeconfig?job=4_kubernetes_config_output" \
2264
+ > ~/.kube/$infra_env.kubeconfig
2265
+
2266
+ curl_return_code=$?
2267
+ if [ ${curl_return_code} -ne 0 ]; then
2268
+ echo "Cannot configure kubectl for $infra_env, get configuration failed with code $curl_return_code"
2269
+ exit ${curl_return_code}
2270
+ fi
2271
+
2272
+ rm -f ~/.kube/config
2273
+ ln -s ~/.kube/$infra_env.kubeconfig ~/.kube/config
2274
+ echo "Configured kubectl for env : $infra_env"
2275
+ }
2276
+ notify_new_deployment() {
2277
+ jq --version || (apt update && apt install -y jq)
2278
+
2279
+ CHAT_URL=${1:-$DEFAULT_CHAT_URL}
2280
+
2281
+ STATUS=$(echo $CI_JOB_STATUS | tr '[:lower:]' '[:upper:]' )
2282
+ ENV_NAME=$(echo $ENVIRONMENT | tr '[:lower:]' '[:upper:]' )
2283
+
2284
+ JOB_LINK="<$CI_JOB_URL| $CI_JOB_NAME $CI_JOB_ID>"
2285
+
2286
+ DESCRIPTION="
2287
+ $STATUS : Deployment for $CI_PROJECT_NAME on $ENV_NAME
2288
+ $JOB_LINK
2289
+ $CI_COMMIT_TITLE
2290
+ "
2291
+
2292
+ JSON_MESSAGE=$(jq -n --arg text "$DESCRIPTION" '{text: $text }')
2293
+ curl -X POST $CHAT_URL \
2294
+ --header "Content-Type: application/json" \
2295
+ --data "$JSON_MESSAGE"
2296
+ }
2297
+ notify_new_version() {
2298
+
2299
+ ! test -z $CI_COMMIT_TAG || exit 0
2300
+
2301
+ jq --version || (apt update && apt install -y jq)
2302
+
2303
+ KIND=$1
2304
+ CHAT_URL=${2:-$DEFAULT_CHAT_URL}
2305
+
2306
+ STATUS=$(echo $CI_JOB_STATUS | tr '[:lower:]' '[:upper:]' )
2307
+ ENV_NAME=$(echo $ENVIRONMENT | tr '[:lower:]' '[:upper:]' )
2308
+ TITLE="$ENV_NAME *$STATUS* $KIND for version *$CI_COMMIT_TAG* of *$CI_PROJECT_NAME* "
2309
+
2310
+ RELEASE_URL="https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/releases/$CI_COMMIT_TAG"
2311
+
2312
+ NOTES=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" $RELEASE_URL |
2313
+ jq .description |
2314
+ sed -e 's/^"//' -e 's/"$//' |
2315
+ sed -E 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g' |
2316
+ sed -E 's/\\n/\'$'\n/g')
2317
+
2318
+ JOB_LINK="<$CI_JOB_URL| $CI_JOB_NAME $CI_JOB_ID>"
2319
+
2320
+ DESCRIPTION="
2321
+ $TITLE
2322
+ $JOB_LINK
2323
+ $NOTES
2324
+ "
2325
+
2326
+ JSON_MESSAGE=$(jq -n --arg text "$DESCRIPTION" '{text: $text }')
2327
+ curl -X POST $CHAT_URL \
2328
+ --header "Content-Type: application/json" \
2329
+ --data "$JSON_MESSAGE"
2330
+ }
2331
+ #!/usr/bin/env bash
2332
+
2333
+ skip_sbt_compile_cache() {
2334
+ COMPARED_BRANCH="${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-$CI_DEFAULT_BRANCH}"
2335
+ echo "branch to compare to: $COMPARED_BRANCH"
2336
+ git fetch origin $COMPARED_BRANCH
2337
+ echo "fetched $COMPARED_BRANCH"
2338
+ [[ "$CI_COMMIT_REF_NAME" =~ ^(master|develop)$ || $(git diff origin/$COMPARED_BRANCH --exit-code -- project) ]]
2339
+ }
2340
+ #!/usr/bin/env bash
2341
+
2342
+ # in case of trouble with functions for update history during import
2343
+ # https://stackoverflow.com/questions/56729192/pg-restore-fails-when-trying-to-create-function-referencing-table-that-does-not
2344
+
2345
+ # example: clone_databases --source_env testing --destination_env recette --services "order,notification,parcel,ikea"
2346
+ clone_databases() {
2347
+ export USERNAME="database-cloner"
2348
+
2349
+ set -e
2350
+
2351
+ extract_args 3 source_env destination_env services $*
2352
+
2353
+ dump_databases "$source_env" "$services"
2354
+ import_databases "$destination_env" "$services"
2355
+ }
2356
+
2357
+ dump_databases() {
2358
+ local env="$1"
2359
+ local services=$(echo -n "$2" | tr ',' '\n')
2360
+
2361
+ database_k8s_output_dump_path="/tmp/database_k8s_output_dump"
2362
+
2363
+ configure_kubectl_for "$env"
2364
+ set +e
2365
+ database_k8s "$env" > "$database_k8s_output_dump_path"
2366
+ set -e
2367
+
2368
+ source_pg_local_port=$(extract_pg_local_port "$database_k8s_output_dump_path")
2369
+
2370
+ for service in $services
2371
+ do
2372
+ service_path="/tmp/$service"
2373
+
2374
+ set +e
2375
+ git clone "git@gitlab.com:colisweb/back/$service.git" "$service_path"
2376
+ set -e
2377
+
2378
+ if cd "$service_path"; then
2379
+ echo "dump the database for service $service.."
2380
+
2381
+ git secret reveal -f
2382
+
2383
+ PG_YAML_PATH=".${service}config.postgres"
2384
+
2385
+ SOURCE_DB_DATABASE=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.database")
2386
+ SOURCE_DB_USER=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.user")
2387
+ SOURCE_DB_PASSWORD=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.password")
2388
+
2389
+ export PGPASSWORD="$SOURCE_DB_PASSWORD"
2390
+
2391
+ DUMP_PATH="/tmp/db_dump_${service}.sql"
2392
+ pg_dump --no-owner -h localhost -p "$source_pg_local_port" -U "$SOURCE_DB_USER" "$SOURCE_DB_DATABASE" > "$DUMP_PATH"
2393
+
2394
+ cd ..
2395
+ rm -rf "$service_path"
2396
+ else
2397
+ echo "WARN: failed to clone $service - skipping"
2398
+ fi
2399
+ done
2400
+ }
2401
+
2402
+ import_databases() {
2403
+ local env="$1"
2404
+ local services=$(echo -n "$2" | tr ',' '\n')
2405
+
2406
+ database_k8s_output_import_path="/tmp/database_k8s_output_import"
2407
+
2408
+ configure_kubectl_for "$env"
2409
+ set +e
2410
+ database_k8s "$env" > "$database_k8s_output_import_path"
2411
+ set -e
2412
+
2413
+ destination_pg_local_port=$(extract_pg_local_port "$database_k8s_output_import_path")
2414
+
2415
+ for service in $services
2416
+ do
2417
+ service_path="/tmp/$service"
2418
+
2419
+ set +e
2420
+ git clone "git@gitlab.com:colisweb/back/$service.git" "$service_path"
2421
+ set -e
2422
+
2423
+ if cd "$service_path"; then
2424
+ echo "create and import database for $service.."
2425
+
2426
+ git secret reveal -f
2427
+
2428
+ PG_YAML_PATH=".${service}config.postgres"
2429
+
2430
+ DB_PORT="5432"
2431
+ DB_HOST=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.host")
2432
+ DB_INIT_USERNAME=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.initUsername")
2433
+ DB_INIT_PASSWORD=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.initPassword")
2434
+ DB_DATABASE=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.database")
2435
+ DB_USER=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.user")
2436
+ DB_PASSWORD=$(extract_yaml_config_variable --environment "$env" --configsPath ./deploy --variable "${PG_YAML_PATH}.password")
2437
+
2438
+ kube_init_service_database \
2439
+ --namespace ${env} \
2440
+ --service ${service} \
2441
+ --db_host ${DB_HOST} \
2442
+ --db_port ${DB_PORT} \
2443
+ --db_init_username ${DB_INIT_USERNAME} \
2444
+ --db_init_password ${DB_INIT_PASSWORD} \
2445
+ --db_database ${DB_DATABASE} \
2446
+ --db_username ${DB_USER} \
2447
+ --db_password ${DB_PASSWORD}
2448
+
2449
+ echo "WARN: A complete clean of $DB_DATABASE on $DB_HOST will be operated"
2450
+ read -rsn1 -p"Press any key to continue";echo
2451
+ flyway_clean "$DB_HOST" "$DB_PORT" "$DB_DATABASE" "$DB_USER" "$DB_PASSWORD"
2452
+
2453
+ DUMP_PATH="/tmp/db_dump_${service}.sql"
2454
+ export PGPASSWORD="$DB_PASSWORD"
2455
+ set +e
2456
+ psql "postgres://$DB_USER@127.0.0.1:$destination_pg_local_port" -p "$DB_DATABASE" -f "$DUMP_PATH"
2457
+ set -e
2458
+
2459
+ cd ..
2460
+ rm -rf "$service_path"
2461
+ else
2462
+ echo "WARN: failed to clone $service - skipping"
2463
+ fi
2464
+ done
2465
+ }
2466
+
2467
+ extract_pg_local_port() {
2468
+ cat "$1" | grep 'postgres@127.0.0.1:' | sed 's/.*postgres@127.0.0.1:\(.*[0-9]\).*/\1/g'
2469
+ }
2470
+ #!/usr/bin/env bash
2471
+
2472
+ emit_datadog_deploy_event() {
2473
+ extract_args 3 environment service version $*
2474
+ check_env_vars 1 "DD_API_KEY"
2475
+
2476
+ response=$(
2477
+ curl -X POST -H "Content-type: application/json" \
2478
+ -d '{
2479
+ "title": "deploying '"$service"' to '"$environment"'",
2480
+ "text": "deploying '"$service"' version '"$version"' to '"$environment"'",
2481
+ "priority": "normal",
2482
+ "tags": ["service:'"$service"' ", "env:'"$environment"'" ,"action:'"deployment"'"] ,
2483
+
2484
+ "alert_type": "Info"
2485
+ }' \
2486
+ "https://api.datadoghq.com/api/v1/events?api_key=$DD_API_KEY"
2487
+ )
2488
+
2489
+ #echo $response
2490
+ EventID=$(echo $response | jq ".event.id")
2491
+ url=$(echo $response | jq ".event.url")
2492
+
2493
+ if [[ $EventID -ne 0 ]]; then
2494
+ echo "event successfully created check in datadog UI : $url"
2495
+ else
2496
+ echo " failed to create event "
2497
+ exit 1
2498
+ fi
2499
+ }
2500
+
2501
+ #!/usr/bin/env bash
2502
+
2503
+ # DEPRECATED
2504
+ emit_datadog_error_events() {
2505
+ set -e
2506
+ extract_args 4 title text priority environment $*
2507
+ check_env_vars 1 "DD_API_KEY"
2508
+
2509
+ curl -X POST -H "Content-type: application/json" \
2510
+ -d '{
2511
+ "title": "'"$title"'",
2512
+ "text": "'"$text"'",
2513
+ "priority": "'"$priority"'",
2514
+ "tags": ["environment:'"$environment"'"],
2515
+ "alert_type": "Error"
2516
+ }' \
2517
+ "https://api.datadoghq.com/api/v1/events?api_key=$DD_API_KEY"
2518
+ }
2519
+
2520
+ #!/usr/bin/env bash
2521
+ terraform_init() {
2522
+ SECTION=$1
2523
+ ENV=$2
2524
+ cd $SECTION
2525
+ terraform init -input=false
2526
+ terraform workspace select $ENV || terraform workspace new $ENV
2527
+ }