@platforma-sdk/ui-vue 1.63.1 → 1.63.8

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 (247) hide show
  1. package/.turbo/turbo-build.log +160 -162
  2. package/.turbo/turbo-formatter$colon$check.log +2 -2
  3. package/.turbo/turbo-linter$colon$check.log +2 -2
  4. package/.turbo/turbo-types$colon$check.log +1 -1
  5. package/CHANGELOG.md +18 -0
  6. package/dist/AgGridVue/AgGridTheme.js +3 -1
  7. package/dist/AgGridVue/AgGridTheme.js.map +1 -1
  8. package/dist/AgGridVue/ag-override.js +2 -0
  9. package/dist/AgGridVue/ag-override.js.map +1 -1
  10. package/dist/AgGridVue/createAgGridColDef.js +2 -35
  11. package/dist/AgGridVue/createAgGridColDef.js.map +1 -1
  12. package/dist/AgGridVue/selection.js +2 -23
  13. package/dist/AgGridVue/selection.js.map +1 -1
  14. package/dist/AgGridVue/useAgGridOptions.js +2 -83
  15. package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
  16. package/dist/_virtual/_plugin-vue_export-helper.js +2 -0
  17. package/dist/_virtual/_rolldown/runtime.js +2 -0
  18. package/dist/components/BlockLayout.js +1 -0
  19. package/dist/components/BlockLayout.style.js +1 -0
  20. package/dist/components/BlockLayout.vue2.js +2 -0
  21. package/dist/components/BlockLayout.vue2.js.map +1 -1
  22. package/dist/components/BlockLoader.js +2 -0
  23. package/dist/components/BlockLoader.vue2.js +2 -0
  24. package/dist/components/BlockLoader.vue2.js.map +1 -1
  25. package/dist/components/LoaderPage.js +2 -0
  26. package/dist/components/LoaderPage.js.map +1 -1
  27. package/dist/components/NotFound.js +2 -0
  28. package/dist/components/NotFound.vue2.js +2 -0
  29. package/dist/components/NotFound.vue2.js.map +1 -1
  30. package/dist/components/PlAdvancedFilter/FilterEditor.js +1 -0
  31. package/dist/components/PlAdvancedFilter/FilterEditor.style.js +1 -0
  32. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +2 -0
  33. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
  34. package/dist/components/PlAdvancedFilter/OperandButton.js +1 -0
  35. package/dist/components/PlAdvancedFilter/OperandButton.style.js +1 -0
  36. package/dist/components/PlAdvancedFilter/OperandButton.vue2.js +2 -0
  37. package/dist/components/PlAdvancedFilter/OperandButton.vue2.js.map +1 -1
  38. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.js +1 -0
  39. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js +1 -0
  40. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +2 -0
  41. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -1
  42. package/dist/components/PlAdvancedFilter/constants.js +4 -4
  43. package/dist/components/PlAdvancedFilter/constants.js.map +1 -1
  44. package/dist/components/PlAdvancedFilter/index.js +3 -1
  45. package/dist/components/PlAdvancedFilter/index.js.map +1 -1
  46. package/dist/components/PlAdvancedFilter/utils.js +2 -0
  47. package/dist/components/PlAdvancedFilter/utils.js.map +1 -1
  48. package/dist/components/PlAgCellFile/PlAgCellFile.js +2 -0
  49. package/dist/components/PlAgCellFile/PlAgCellFile.vue2.js +2 -4
  50. package/dist/components/PlAgCellFile/PlAgCellFile.vue2.js.map +1 -1
  51. package/dist/components/PlAgCellProgress/PlAgCellProgress.js +2 -0
  52. package/dist/components/PlAgCellProgress/PlAgCellProgress.vue2.js +2 -0
  53. package/dist/components/PlAgCellProgress/PlAgCellProgress.vue2.js.map +1 -1
  54. package/dist/components/PlAgCellStatusTag/PlAgCellStatusTag.js +2 -0
  55. package/dist/components/PlAgCellStatusTag/PlAgCellStatusTag.vue2.js +2 -0
  56. package/dist/components/PlAgCellStatusTag/PlAgCellStatusTag.vue2.js.map +1 -1
  57. package/dist/components/PlAgChartHistogramCell/PlAgChartHistogramCell.js +2 -0
  58. package/dist/components/PlAgChartHistogramCell/PlAgChartHistogramCell.vue2.js +2 -0
  59. package/dist/components/PlAgChartHistogramCell/PlAgChartHistogramCell.vue2.js.map +1 -1
  60. package/dist/components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.js +2 -0
  61. package/dist/components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.vue2.js +2 -0
  62. package/dist/components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.vue2.js.map +1 -1
  63. package/dist/components/PlAgColumnHeader/PlAgColumnHeader.js +2 -0
  64. package/dist/components/PlAgColumnHeader/PlAgColumnHeader.vue2.js +2 -0
  65. package/dist/components/PlAgColumnHeader/PlAgColumnHeader.vue2.js.map +1 -1
  66. package/dist/components/PlAgCsvExporter/PlAgCsvExporter.js +2 -0
  67. package/dist/components/PlAgCsvExporter/PlAgCsvExporter.vue2.js +2 -0
  68. package/dist/components/PlAgCsvExporter/PlAgCsvExporter.vue2.js.map +1 -1
  69. package/dist/components/PlAgCsvExporter/export-csv.js +2 -0
  70. package/dist/components/PlAgCsvExporter/export-csv.js.map +1 -1
  71. package/dist/components/PlAgDataTable/PlAgDataTableSheets.js +1 -0
  72. package/dist/components/PlAgDataTable/PlAgDataTableSheets.style.js +1 -0
  73. package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js +2 -0
  74. package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js.map +1 -1
  75. package/dist/components/PlAgDataTable/PlAgDataTableV2.js +1 -0
  76. package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js +1 -0
  77. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +2 -0
  78. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  79. package/dist/components/PlAgDataTable/PlAgOverlayLoading.js +2 -0
  80. package/dist/components/PlAgDataTable/PlAgOverlayLoading.vue2.js +2 -0
  81. package/dist/components/PlAgDataTable/PlAgOverlayLoading.vue2.js.map +1 -1
  82. package/dist/components/PlAgDataTable/PlAgOverlayNoRows.js +2 -0
  83. package/dist/components/PlAgDataTable/PlAgOverlayNoRows.vue2.js +2 -0
  84. package/dist/components/PlAgDataTable/PlAgOverlayNoRows.vue2.js.map +1 -1
  85. package/dist/components/PlAgDataTable/PlAgRowCount.js +2 -0
  86. package/dist/components/PlAgDataTable/PlAgRowCount.vue2.js +2 -0
  87. package/dist/components/PlAgDataTable/PlAgRowCount.vue2.js.map +1 -1
  88. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js +2 -0
  89. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js.map +1 -1
  90. package/dist/components/PlAgDataTable/compositions/useGrid.js +2 -0
  91. package/dist/components/PlAgDataTable/compositions/useGrid.js.map +1 -1
  92. package/dist/components/PlAgDataTable/index.js +2 -0
  93. package/dist/components/PlAgDataTable/index.js.map +1 -1
  94. package/dist/components/PlAgDataTable/pl-ag-overlay-loading.module.js +1 -0
  95. package/dist/components/PlAgDataTable/sources/common.js +3 -1
  96. package/dist/components/PlAgDataTable/sources/common.js.map +1 -1
  97. package/dist/components/PlAgDataTable/sources/focus-row.js +2 -0
  98. package/dist/components/PlAgDataTable/sources/focus-row.js.map +1 -1
  99. package/dist/components/PlAgDataTable/sources/menu-items.js +2 -0
  100. package/dist/components/PlAgDataTable/sources/menu-items.js.map +1 -1
  101. package/dist/components/PlAgDataTable/sources/row-number.js +3 -2
  102. package/dist/components/PlAgDataTable/sources/row-number.js.map +1 -1
  103. package/dist/components/PlAgDataTable/sources/table-source-v2.js +2 -5
  104. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  105. package/dist/components/PlAgDataTable/sources/table-state-v2.js +2 -0
  106. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  107. package/dist/components/PlAgDataTable/sources/value-rendering.js +2 -0
  108. package/dist/components/PlAgDataTable/sources/value-rendering.js.map +1 -1
  109. package/dist/components/PlAgDataTable/types.js +2 -0
  110. package/dist/components/PlAgDataTable/types.js.map +1 -1
  111. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.js +1 -0
  112. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.style.js +1 -0
  113. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js +2 -0
  114. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js.map +1 -1
  115. package/dist/components/PlAgGridColumnManager/useFilteredItems.js +2 -0
  116. package/dist/components/PlAgGridColumnManager/useFilteredItems.js.map +1 -1
  117. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.js +2 -0
  118. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue2.js +2 -0
  119. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue2.js.map +1 -1
  120. package/dist/components/PlAgRowNumCheckbox/pl-ag-row-num-checkbox.module.js +1 -0
  121. package/dist/components/PlAgRowNumHeader.js +2 -0
  122. package/dist/components/PlAgRowNumHeader.vue2.js +2 -0
  123. package/dist/components/PlAgRowNumHeader.vue2.js.map +1 -1
  124. package/dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.js +2 -0
  125. package/dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue2.js +2 -0
  126. package/dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue2.js.map +1 -1
  127. package/dist/components/PlAnnotations/components/AnnotationsSidebar.js +1 -0
  128. package/dist/components/PlAnnotations/components/AnnotationsSidebar.style.js +1 -0
  129. package/dist/components/PlAnnotations/components/AnnotationsSidebar.vue2.js +2 -0
  130. package/dist/components/PlAnnotations/components/AnnotationsSidebar.vue2.js.map +1 -1
  131. package/dist/components/PlAnnotations/components/FilterSidebar.js +1 -0
  132. package/dist/components/PlAnnotations/components/FilterSidebar.style.js +1 -0
  133. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +2 -0
  134. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
  135. package/dist/components/PlAnnotations/components/PlAnnotations.js +1 -0
  136. package/dist/components/PlAnnotations/components/PlAnnotations.style.js +1 -0
  137. package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js +2 -0
  138. package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js.map +1 -1
  139. package/dist/components/PlAnnotations/components/PlAnnotationsModal.js +1 -0
  140. package/dist/components/PlAnnotations/components/PlAnnotationsModal.style.js +1 -0
  141. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js +2 -0
  142. package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js.map +1 -1
  143. package/dist/components/PlAnnotations/components/style.module.js +1 -0
  144. package/dist/components/PlAnnotations/utils.js +2 -0
  145. package/dist/components/PlAnnotations/utils.js.map +1 -1
  146. package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.js +2 -0
  147. package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue2.js +2 -0
  148. package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue2.js.map +1 -1
  149. package/dist/components/PlBtnExportArchive/Item.js +1 -0
  150. package/dist/components/PlBtnExportArchive/Item.style.js +1 -0
  151. package/dist/components/PlBtnExportArchive/Item.vue2.js +2 -0
  152. package/dist/components/PlBtnExportArchive/Item.vue2.js.map +1 -1
  153. package/dist/components/PlBtnExportArchive/PlBtnExportArchive.js +1 -0
  154. package/dist/components/PlBtnExportArchive/PlBtnExportArchive.style.js +1 -0
  155. package/dist/components/PlBtnExportArchive/PlBtnExportArchive.vue2.js +2 -0
  156. package/dist/components/PlBtnExportArchive/PlBtnExportArchive.vue2.js.map +1 -1
  157. package/dist/components/PlBtnExportArchive/Summary.js +1 -0
  158. package/dist/components/PlBtnExportArchive/Summary.style.js +1 -0
  159. package/dist/components/PlBtnExportArchive/Summary.vue2.js +2 -0
  160. package/dist/components/PlBtnExportArchive/Summary.vue2.js.map +1 -1
  161. package/dist/components/PlTableFastSearch/PlTableFastSearch.js +2 -0
  162. package/dist/components/PlTableFastSearch/PlTableFastSearch.vue2.js +2 -0
  163. package/dist/components/PlTableFastSearch/PlTableFastSearch.vue2.js.map +1 -1
  164. package/dist/components/PlTableFilters/PlTableFiltersV2.js +1 -0
  165. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js +1 -0
  166. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +2 -0
  167. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  168. package/dist/composition/AgGrid/index.js +2 -0
  169. package/dist/composition/AgGrid/index.js.map +1 -1
  170. package/dist/composition/fileContent.js +2 -38
  171. package/dist/composition/fileContent.js.map +1 -1
  172. package/dist/computedResult.js +2 -30
  173. package/dist/computedResult.js.map +1 -1
  174. package/dist/createModel.js +2 -0
  175. package/dist/createModel.js.map +1 -1
  176. package/dist/defineApp.js +3 -2
  177. package/dist/defineApp.js.map +1 -1
  178. package/dist/defineStore.js +2 -0
  179. package/dist/defineStore.js.map +1 -1
  180. package/dist/index.js +1 -0
  181. package/dist/internal/UpdateSerializer.js +2 -6
  182. package/dist/internal/UpdateSerializer.js.map +1 -1
  183. package/dist/internal/createAppModel.js +2 -0
  184. package/dist/internal/createAppModel.js.map +1 -1
  185. package/dist/internal/createAppV1.js +2 -14
  186. package/dist/internal/createAppV1.js.map +1 -1
  187. package/dist/internal/createAppV2.js +3 -17
  188. package/dist/internal/createAppV2.js.map +1 -1
  189. package/dist/internal/createAppV3.js +3 -17
  190. package/dist/internal/createAppV3.js.map +1 -1
  191. package/dist/internal/service_factories.js +2 -8
  192. package/dist/internal/service_factories.js.map +1 -1
  193. package/dist/lib/util/helpers/dist/functions.js +2 -3
  194. package/dist/lib/util/helpers/dist/functions.js.map +1 -1
  195. package/dist/lib/util/helpers/dist/hash.js +1 -1
  196. package/dist/lib/util/helpers/dist/hash.js.map +1 -1
  197. package/dist/lib/util/helpers/dist/index.js +0 -2
  198. package/dist/lib/util/helpers/dist/objects.js +2 -45
  199. package/dist/lib/util/helpers/dist/objects.js.map +1 -1
  200. package/dist/lib/util/helpers/dist/prettyBytes.js +2 -0
  201. package/dist/lib/util/helpers/dist/prettyBytes.js.map +1 -1
  202. package/dist/lib/util/helpers/dist/random.js +2 -0
  203. package/dist/lib/util/helpers/dist/random.js.map +1 -1
  204. package/dist/lib/util/helpers/dist/strings.js +2 -0
  205. package/dist/lib/util/helpers/dist/strings.js.map +1 -1
  206. package/dist/lib/util/helpers/dist/uniqId.js +2 -0
  207. package/dist/lib/util/helpers/dist/uniqId.js.map +1 -1
  208. package/dist/lib/util/helpers/dist/utils.js +2 -1
  209. package/dist/lib/util/helpers/dist/utils.js.map +1 -1
  210. package/dist/objectHash.js +2 -5
  211. package/dist/objectHash.js.map +1 -1
  212. package/dist/plugins/Monetization/EndOfPeriod.js +1 -0
  213. package/dist/plugins/Monetization/EndOfPeriod.style.js +1 -0
  214. package/dist/plugins/Monetization/EndOfPeriod.vue2.js +2 -0
  215. package/dist/plugins/Monetization/EndOfPeriod.vue2.js.map +1 -1
  216. package/dist/plugins/Monetization/LimitCard.js +1 -0
  217. package/dist/plugins/Monetization/LimitCard.style.js +1 -0
  218. package/dist/plugins/Monetization/LimitCard.vue2.js +2 -0
  219. package/dist/plugins/Monetization/LimitCard.vue2.js.map +1 -1
  220. package/dist/plugins/Monetization/MonetizationSidebar.js +2 -0
  221. package/dist/plugins/Monetization/MonetizationSidebar.vue2.js +2 -0
  222. package/dist/plugins/Monetization/MonetizationSidebar.vue2.js.map +1 -1
  223. package/dist/plugins/Monetization/RunStatus.js +1 -0
  224. package/dist/plugins/Monetization/RunStatus.style.js +1 -0
  225. package/dist/plugins/Monetization/RunStatus.vue2.js +2 -0
  226. package/dist/plugins/Monetization/RunStatus.vue2.js.map +1 -1
  227. package/dist/plugins/Monetization/UserCabinetCard.js +1 -0
  228. package/dist/plugins/Monetization/UserCabinetCard.style.js +1 -0
  229. package/dist/plugins/Monetization/UserCabinetCard.vue2.js +2 -0
  230. package/dist/plugins/Monetization/UserCabinetCard.vue2.js.map +1 -1
  231. package/dist/plugins/Monetization/useButtonTarget.js +2 -0
  232. package/dist/plugins/Monetization/useButtonTarget.js.map +1 -1
  233. package/dist/plugins/Monetization/useInfo.js +2 -0
  234. package/dist/plugins/Monetization/useInfo.js.map +1 -1
  235. package/dist/plugins/Monetization/validation.js +4 -4
  236. package/dist/plugins/Monetization/validation.js.map +1 -1
  237. package/dist/urls.js +3 -1
  238. package/dist/urls.js.map +1 -1
  239. package/dist/usePlugin.js +2 -24
  240. package/dist/usePlugin.js.map +1 -1
  241. package/dist/utils.js +3 -1
  242. package/dist/utils.js.map +1 -1
  243. package/package.json +11 -11
  244. package/dist/lib/util/helpers/dist/disposable.js +0 -9
  245. package/dist/lib/util/helpers/dist/disposable.js.map +0 -1
  246. package/dist/lib/util/helpers/dist/ref_count_pool.js +0 -4
  247. package/dist/lib/util/helpers/dist/ref_count_pool.js.map +0 -1
@@ -1,7 +1,9 @@
1
+ //#region ../../lib/util/helpers/dist/random.js
1
2
  var e = Math.random;
2
3
  function t() {
3
4
  return e() * (2 ** 53 - 1) | 0;
4
5
  }
6
+ //#endregion
5
7
  export { e as random, t as randomInt };
6
8
 
7
9
  //# sourceMappingURL=random.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"random.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/random.ts"],"sourcesContent":["export const random = Math.random;\n\nexport function randomInt(): number {\n return (random() * Number.MAX_SAFE_INTEGER) | 0;\n}\n\nexport function randomRangeFloat(min: number, max: number): number {\n return random() * (max - min) + min;\n}\n\nexport function randomRangeInt(min: number, max: number): number {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(randomRangeFloat(min, max));\n}\n\nexport function randomSign(): number {\n return random() > 0.5 ? 1 : -1;\n}\n"],"mappings":"AAAA,IAAa,IAAS,KAAK;AAE3B,SAAgB,IAAoB;AAClC,QAAQ,GAAQ,mBAA8B"}
1
+ {"version":3,"file":"random.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/random.ts"],"sourcesContent":["export const random = Math.random;\n\nexport function randomInt(): number {\n return (random() * Number.MAX_SAFE_INTEGER) | 0;\n}\n\nexport function randomRangeFloat(min: number, max: number): number {\n return random() * (max - min) + min;\n}\n\nexport function randomRangeInt(min: number, max: number): number {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(randomRangeFloat(min, max));\n}\n\nexport function randomSign(): number {\n return random() > 0.5 ? 1 : -1;\n}\n"],"mappings":";AAAA,IAAa,IAAS,KAAK;AAE3B,SAAgB,IAAoB;AAClC,QAAQ,GAAQ,mBAA8B"}
@@ -1,3 +1,4 @@
1
+ //#region ../../lib/util/helpers/dist/strings.js
1
2
  function e(e, t) {
2
3
  return e = Math.ceil(e), t = Math.floor(t), Math.floor(Math.random() * (t - e)) + e;
3
4
  }
@@ -9,6 +10,7 @@ function t(t) {
9
10
  function n(e = 42) {
10
11
  return t(e);
11
12
  }
13
+ //#endregion
12
14
  export { t as randomString, n as uniqueId };
13
15
 
14
16
  //# sourceMappingURL=strings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/strings.ts"],"sourcesContent":["function getRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n}\n\nexport function camelToKebab(str: string) {\n str = str.replace(\" \", \"-\");\n return (\n (str[0] || \"\").toLowerCase() + str.slice(1).replace(/[A-Z]/g, (l) => `-${l.toLowerCase()}`)\n );\n}\n\nexport function trimChars(str: string, chars: string[] = []) {\n str = str ? String(str) : \"\";\n while (chars.includes(str.charAt(0))) str = str.substr(1);\n while (chars.includes(str.charAt(str.length - 1))) str = str.substr(0, str.length - 1);\n return str;\n}\n\nexport function trimCharsLeft(str: string, chars: string[] = []) {\n str = str ? String(str) : \"\";\n while (chars.includes(str.charAt(0))) str = str.substring(1);\n return str;\n}\n\nexport function extractFileName(filePath: string) {\n return filePath.replace(/^.*[\\\\/]/, \"\");\n}\n\nexport function extractExtension(fileName: string) {\n return fileName.replace(/^.*?[.]/, \"\");\n}\n\nfunction hasDataTransfer(\n e: unknown,\n): e is { dataTransfer: { items: { kind: string; getAsFile(): unknown }[] } } {\n return (\n typeof e === \"object\" &&\n e !== null &&\n \"dataTransfer\" in e &&\n typeof e.dataTransfer === \"object\" &&\n e.dataTransfer !== null &&\n \"items\" in e.dataTransfer &&\n Array.isArray(e.dataTransfer.items)\n );\n}\n\n// @TODO move from here\nexport function extractPaths(e: unknown, extensions?: string[]) {\n const paths: string[] = [];\n\n if (hasDataTransfer(e)) {\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n if (e.dataTransfer.items[i].kind !== \"file\") {\n continue;\n }\n const file = e.dataTransfer.items[i].getAsFile() as (File & { path: string }) | null; // @TODO electron specific\n if (file && file.path) {\n paths.push(file.path);\n }\n }\n }\n\n if (extensions) {\n return paths.filter((p) => extensions.includes(extractExtension(extractFileName(p))));\n }\n\n return paths;\n}\n\nexport const pluralize = (count: number, noun: string, suffix = \"s\") =>\n `${count} ${noun}${count !== 1 ? suffix : \"\"}`;\n\nexport function isRegexpValid(exp: string) {\n try {\n new RegExp(exp);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function ucFirst(str: string) {\n if (!str) {\n return \"\";\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function lcFirst(str: string) {\n if (!str) {\n return \"\";\n }\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\nexport function randomString(length: number) {\n let s = \"\";\n for (let i = 0; i < length; i++) {\n s += String.fromCharCode(getRandomInt(65, 91));\n }\n return s;\n}\n\nexport function uniqueId(length: number = 42) {\n return randomString(length);\n}\n\nexport function before(str: string, sub: string) {\n return str.substring(0, str.indexOf(sub));\n}\n\nexport function beforeLast(str: string, sub: string) {\n return str.substring(0, str.lastIndexOf(sub));\n}\n\nexport function after(str: string, sub: string) {\n return str.substring(str.indexOf(sub) + sub.length, str.length);\n}\n\nexport function assertString(v: unknown): asserts v is string {\n if (typeof v !== \"string\") {\n throw Error(\"Expect string value, got: \" + typeof v);\n }\n}\n\nexport function hashCode(str: string) {\n let hash = 0,\n i,\n chr;\n if (str.length === 0) return hash;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n}\n"],"mappings":"AAAA,SAAS,EAAa,GAAa,GAAa;AAG9C,QAFA,IAAM,KAAK,KAAK,EAAI,EACpB,IAAM,KAAK,MAAM,EAAI,EACd,KAAK,MAAM,KAAK,QAAQ,IAAI,IAAM,GAAK,GAAG;;AA8FnD,SAAgB,EAAa,GAAgB;CAC3C,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,IAC1B,MAAK,OAAO,aAAa,EAAa,IAAI,GAAG,CAAC;AAEhD,QAAO;;AAGT,SAAgB,EAAS,IAAiB,IAAI;AAC5C,QAAO,EAAa,EAAO"}
1
+ {"version":3,"file":"strings.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/strings.ts"],"sourcesContent":["function getRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min)) + min;\n}\n\nexport function camelToKebab(str: string) {\n str = str.replace(\" \", \"-\");\n return (\n (str[0] || \"\").toLowerCase() + str.slice(1).replace(/[A-Z]/g, (l) => `-${l.toLowerCase()}`)\n );\n}\n\nexport function trimChars(str: string, chars: string[] = []) {\n str = str ? String(str) : \"\";\n while (chars.includes(str.charAt(0))) str = str.substr(1);\n while (chars.includes(str.charAt(str.length - 1))) str = str.substr(0, str.length - 1);\n return str;\n}\n\nexport function trimCharsLeft(str: string, chars: string[] = []) {\n str = str ? String(str) : \"\";\n while (chars.includes(str.charAt(0))) str = str.substring(1);\n return str;\n}\n\nexport function extractFileName(filePath: string) {\n return filePath.replace(/^.*[\\\\/]/, \"\");\n}\n\nexport function extractExtension(fileName: string) {\n return fileName.replace(/^.*?[.]/, \"\");\n}\n\nfunction hasDataTransfer(\n e: unknown,\n): e is { dataTransfer: { items: { kind: string; getAsFile(): unknown }[] } } {\n return (\n typeof e === \"object\" &&\n e !== null &&\n \"dataTransfer\" in e &&\n typeof e.dataTransfer === \"object\" &&\n e.dataTransfer !== null &&\n \"items\" in e.dataTransfer &&\n Array.isArray(e.dataTransfer.items)\n );\n}\n\n// @TODO move from here\nexport function extractPaths(e: unknown, extensions?: string[]) {\n const paths: string[] = [];\n\n if (hasDataTransfer(e)) {\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n if (e.dataTransfer.items[i].kind !== \"file\") {\n continue;\n }\n const file = e.dataTransfer.items[i].getAsFile() as (File & { path: string }) | null; // @TODO electron specific\n if (file && file.path) {\n paths.push(file.path);\n }\n }\n }\n\n if (extensions) {\n return paths.filter((p) => extensions.includes(extractExtension(extractFileName(p))));\n }\n\n return paths;\n}\n\nexport const pluralize = (count: number, noun: string, suffix = \"s\") =>\n `${count} ${noun}${count !== 1 ? suffix : \"\"}`;\n\nexport function isRegexpValid(exp: string) {\n try {\n new RegExp(exp);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function ucFirst(str: string) {\n if (!str) {\n return \"\";\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function lcFirst(str: string) {\n if (!str) {\n return \"\";\n }\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\nexport function randomString(length: number) {\n let s = \"\";\n for (let i = 0; i < length; i++) {\n s += String.fromCharCode(getRandomInt(65, 91));\n }\n return s;\n}\n\nexport function uniqueId(length: number = 42) {\n return randomString(length);\n}\n\nexport function before(str: string, sub: string) {\n return str.substring(0, str.indexOf(sub));\n}\n\nexport function beforeLast(str: string, sub: string) {\n return str.substring(0, str.lastIndexOf(sub));\n}\n\nexport function after(str: string, sub: string) {\n return str.substring(str.indexOf(sub) + sub.length, str.length);\n}\n\nexport function assertString(v: unknown): asserts v is string {\n if (typeof v !== \"string\") {\n throw Error(\"Expect string value, got: \" + typeof v);\n }\n}\n\nexport function hashCode(str: string) {\n let hash = 0,\n i,\n chr;\n if (str.length === 0) return hash;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n}\n"],"mappings":";AAAA,SAAS,EAAa,GAAa,GAAa;AAG9C,QAFA,IAAM,KAAK,KAAK,EAAI,EACpB,IAAM,KAAK,MAAM,EAAI,EACd,KAAK,MAAM,KAAK,QAAQ,IAAI,IAAM,GAAK,GAAG;;AA8FnD,SAAgB,EAAa,GAAgB;CAC3C,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,GAAQ,IAC1B,MAAK,OAAO,aAAa,EAAa,IAAI,GAAG,CAAC;AAEhD,QAAO;;AAGT,SAAgB,EAAS,IAAiB,IAAI;AAC5C,QAAO,EAAa,EAAO"}
@@ -1,7 +1,9 @@
1
+ //#region ../../lib/util/helpers/dist/uniqId.js
1
2
  function e() {
2
3
  let e = 0n;
3
4
  return () => e++;
4
5
  }
6
+ //#endregion
5
7
  export { e as createGetIncrementalId };
6
8
 
7
9
  //# sourceMappingURL=uniqId.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uniqId.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/uniqId.ts"],"sourcesContent":["export function createGetIncrementalId() {\n let idx = 0n;\n return () => idx++;\n}\n"],"mappings":"AAAA,SAAgB,IAAyB;CACvC,IAAI,IAAM;AACV,cAAa"}
1
+ {"version":3,"file":"uniqId.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/uniqId.ts"],"sourcesContent":["export function createGetIncrementalId() {\n let idx = 0n;\n return () => idx++;\n}\n"],"mappings":";AAAA,SAAgB,IAAyB;CACvC,IAAI,IAAM;AACV,cAAa"}
@@ -1,3 +1,4 @@
1
+ //#region ../../lib/util/helpers/dist/utils.js
1
2
  function e(e) {
2
3
  return e == null;
3
4
  }
@@ -24,7 +25,6 @@ function i(e, t) {
24
25
  function a(e, t) {
25
26
  if (e != null) return t(e);
26
27
  }
27
- Symbol.asyncIterator;
28
28
  var o = class {
29
29
  promises = /* @__PURE__ */ new Map();
30
30
  fetch(e, t) {
@@ -35,6 +35,7 @@ var o = class {
35
35
  return this.promises.set(e, n), n;
36
36
  }
37
37
  };
38
+ //#endregion
38
39
  export { n as Deferred, o as Fetcher, r as delay, e as isNil, t as notEmpty, i as tap, a as tapIf };
39
40
 
40
41
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/utils.ts"],"sourcesContent":["import type { AwaitedStruct, Option, Primitive, Result, Unionize } from \"./types\";\n\nexport function isNil(v: unknown): v is null | undefined | void {\n return v === null || v === undefined;\n}\n\nexport function isPrimitive(v: unknown): v is Primitive {\n return (\n isNil(v) ||\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"boolean\" ||\n typeof v === \"bigint\"\n );\n}\n\nexport function notEmpty<T>(v: T | null | undefined, message?: string): T {\n if (v === null || v === undefined) {\n throw Error(message ?? \"Empty (null | undefined) value\");\n }\n\n return v;\n}\n\nexport function notUndef<T>(v: T | undefined, message?: string): T {\n if (v === undefined) {\n throw Error(message ?? \"Undefined value\");\n }\n\n return v;\n}\n\nexport function undef<V>(v: V | undefined = undefined): V | undefined {\n return v;\n}\n\nexport function bool<V extends boolean>(v: V): boolean {\n return v;\n}\n\nexport function uniqueValues<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function checkIfNotEmpty<T>(v: T | null | undefined, message?: string): asserts v is T {\n if (v === undefined || v === null) {\n throw Error(message ?? \"Empty (null | undefined) value\");\n }\n}\n\nexport function checkIfDefined<T>(v: T | undefined, message?: string): asserts v is T {\n if (v === undefined) {\n throw Error(message ?? \"Undefined value\");\n }\n}\n\nexport function between(n: number, a: number, b: number) {\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n\n return n >= min && n <= max;\n}\n\nexport function listToOptions<T>(list: T[] | readonly T[]): Option<T>[] {\n return list.map((value) => ({ text: String(value), value }));\n}\n\nexport function async<A extends unknown[]>(gf: (...args: A) => Generator) {\n return function (...args: A) {\n const generator = gf(...args);\n\n async function handle(result: IteratorResult<unknown>): Promise<unknown> {\n if (result.done) {\n return Promise.resolve(result.value);\n }\n\n return Promise.resolve(result.value)\n .then((res) => {\n return handle(generator.next(res));\n })\n .catch((err) => {\n return handle(generator.throw(err));\n });\n }\n\n try {\n return handle(generator.next());\n } catch (ex) {\n return Promise.reject(ex instanceof Error ? ex : Error(String(ex)));\n }\n };\n}\n\nexport class Deferred<T> {\n public readonly promise: Promise<T>;\n\n constructor() {\n this.promise = new Promise<T>((res, rej) => {\n this.resolve = res;\n this.reject = rej;\n });\n }\n\n public resolve: (v: T) => void = () => {};\n\n public reject: (err: Error) => void = () => {};\n}\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function tear() {\n return new Promise<void>((r) => queueMicrotask(r));\n}\n\nexport function timer() {\n const t = new Date().getTime();\n return function () {\n return new Date().getTime() - t;\n };\n}\n\nexport function performanceTimer() {\n const t = performance.now();\n return function () {\n return performance.now() - t;\n };\n}\n\nexport function call<R>(f: () => R): R {\n return f();\n}\n\nexport function clamp(n: number, lo: number, up: number) {\n return lo > n ? lo : n > up ? up : n;\n}\n\nexport function tap<T, R>(v: T, cb: (v: T) => R) {\n return cb(v);\n}\n\nexport function tapIf<T, R>(v: T | null | undefined, cb: (v: T) => R) {\n if (v !== null && v !== undefined) {\n return cb(v);\n }\n\n return;\n}\n\nexport function* range(from: number, to: number, step = 1) {\n for (let i = from; i < to; i += step) {\n yield i;\n }\n}\n\nexport function toList<T>(iterable: Iterable<T>): T[] {\n const lst: T[] = [];\n for (const it of iterable) {\n lst.push(it);\n }\n\n return lst;\n}\n\nexport function times<R>(n: number, cb: (i: number) => R): R[] {\n return toList(range(0, n)).map(cb);\n}\n\nexport class Interval {\n constructor(private _delay: number) {}\n\n async *generate(): AsyncGenerator<number> {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n\n async *[Symbol.asyncIterator]() {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n}\n\nexport function arrayFrom<T>(length: number, cb: (i: number) => T) {\n return Array.from({ length }, (_, i) => cb(i));\n}\n\nexport function exhaustive(v: never, message: string): never {\n throw Error(message);\n}\n\nexport type Matcher<T extends string, R = unknown> = {\n [P in T]: () => R;\n};\n\nexport function match<T extends string, R = unknown>(matcher: Matcher<T, R>) {\n return (key: T) => matcher[key]();\n}\n\nexport function okOptional<V>(v: { ok: true; value: V } | { ok: false } | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (v.ok) {\n return v.value;\n }\n}\n\nexport function errorOptional<V>(v: Result<V> | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (!v.ok) {\n return v.error;\n }\n}\n\nexport function unwrap<T>(r: Result<T>): T {\n if (r.ok) {\n return r.value;\n }\n\n throw Error(r.error);\n}\n\nexport function flatValue<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nexport async function resolveAwaited<O extends Record<string, unknown>>(\n obj: O,\n): Promise<AwaitedStruct<O>> {\n return Object.fromEntries(\n await Promise.all(Object.entries(obj).map(async ([k, v]) => [k, await v])),\n ) as Promise<AwaitedStruct<O>>;\n}\n\nexport function alike(obj: Record<string, unknown>, to: Record<string, unknown>) {\n return Object.keys(to).every((bKey) => obj[bKey] === to[bKey]);\n}\n\nexport const identity = <T>(v: T): T => v;\n\nexport function asConst<const T>(v: T) {\n return v;\n}\n\nexport function unionize<K extends keyof O, V, O extends Record<K, V>>(obj: O): Unionize<O>[] {\n return Object.entries(obj).map(([key, value]) => ({\n key,\n value,\n })) as Unionize<O>[];\n}\n\nexport class Fetcher<K, V> {\n private promises = new Map<K, Promise<V>>();\n fetch(key: K, callback: () => Promise<V>) {\n if (this.promises.has(key)) {\n return this.promises.get(key)!;\n }\n const promise = callback().finally(() => {\n this.promises.delete(key);\n });\n this.promises.set(key, promise);\n return promise;\n }\n}\n"],"mappings":"AAEA,SAAgB,EAAM,GAA0C;AAC9D,QAAO,KAAM;;AAaf,SAAgB,EAAY,GAAyB,GAAqB;AACxE,KAAI,KAAM,KACR,OAAM,MAAM,KAAW,iCAAiC;AAG1D,QAAO;;AAwET,IAAa,IAAb,MAAyB;CACvB;CAEA,cAAc;AACZ,OAAK,UAAU,IAAI,SAAY,GAAK,MAAQ;AAE1C,GADA,KAAK,UAAU,GACf,KAAK,SAAS;IACd;;CAGJ,gBAAuC;CAEvC,eAA4C;;AAG9C,SAAgB,EAAM,GAAY;AAChC,QAAO,IAAI,SAAS,MAAY,WAAW,GAAS,EAAG,CAAC;;AA6B1D,SAAgB,EAAU,GAAM,GAAiB;AAC/C,QAAO,EAAG,EAAE;;AAGd,SAAgB,EAAY,GAAyB,GAAiB;AACpE,KAAI,KAAM,KACR,QAAO,EAAG,EAAE;;AAoCN,OAAO;AAkFjB,IAAa,IAAb,MAA2B;CACzB,2BAAmB,IAAI,KAAoB;CAC3C,MAAM,GAAQ,GAA4B;AACxC,MAAI,KAAK,SAAS,IAAI,EAAI,CACxB,QAAO,KAAK,SAAS,IAAI,EAAI;EAE/B,IAAM,IAAU,GAAU,CAAC,cAAc;AACvC,QAAK,SAAS,OAAO,EAAI;IACzB;AAEF,SADA,KAAK,SAAS,IAAI,GAAK,EAAQ,EACxB"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../lib/util/helpers/src/utils.ts"],"sourcesContent":["import type { AwaitedStruct, Option, Primitive, Result, Unionize } from \"./types\";\n\nexport function isNil(v: unknown): v is null | undefined | void {\n return v === null || v === undefined;\n}\n\nexport function isPrimitive(v: unknown): v is Primitive {\n return (\n isNil(v) ||\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"boolean\" ||\n typeof v === \"bigint\"\n );\n}\n\nexport function notEmpty<T>(v: T | null | undefined, message?: string): T {\n if (v === null || v === undefined) {\n throw Error(message ?? \"Empty (null | undefined) value\");\n }\n\n return v;\n}\n\nexport function notUndef<T>(v: T | undefined, message?: string): T {\n if (v === undefined) {\n throw Error(message ?? \"Undefined value\");\n }\n\n return v;\n}\n\nexport function undef<V>(v: V | undefined = undefined): V | undefined {\n return v;\n}\n\nexport function bool<V extends boolean>(v: V): boolean {\n return v;\n}\n\nexport function uniqueValues<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function checkIfNotEmpty<T>(v: T | null | undefined, message?: string): asserts v is T {\n if (v === undefined || v === null) {\n throw Error(message ?? \"Empty (null | undefined) value\");\n }\n}\n\nexport function checkIfDefined<T>(v: T | undefined, message?: string): asserts v is T {\n if (v === undefined) {\n throw Error(message ?? \"Undefined value\");\n }\n}\n\nexport function between(n: number, a: number, b: number) {\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n\n return n >= min && n <= max;\n}\n\nexport function listToOptions<T>(list: T[] | readonly T[]): Option<T>[] {\n return list.map((value) => ({ text: String(value), value }));\n}\n\nexport function async<A extends unknown[]>(gf: (...args: A) => Generator) {\n return function (...args: A) {\n const generator = gf(...args);\n\n async function handle(result: IteratorResult<unknown>): Promise<unknown> {\n if (result.done) {\n return Promise.resolve(result.value);\n }\n\n return Promise.resolve(result.value)\n .then((res) => {\n return handle(generator.next(res));\n })\n .catch((err) => {\n return handle(generator.throw(err));\n });\n }\n\n try {\n return handle(generator.next());\n } catch (ex) {\n return Promise.reject(ex instanceof Error ? ex : Error(String(ex)));\n }\n };\n}\n\nexport class Deferred<T> {\n public readonly promise: Promise<T>;\n\n constructor() {\n this.promise = new Promise<T>((res, rej) => {\n this.resolve = res;\n this.reject = rej;\n });\n }\n\n public resolve: (v: T) => void = () => {};\n\n public reject: (err: Error) => void = () => {};\n}\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function tear() {\n return new Promise<void>((r) => queueMicrotask(r));\n}\n\nexport function timer() {\n const t = new Date().getTime();\n return function () {\n return new Date().getTime() - t;\n };\n}\n\nexport function performanceTimer() {\n const t = performance.now();\n return function () {\n return performance.now() - t;\n };\n}\n\nexport function call<R>(f: () => R): R {\n return f();\n}\n\nexport function clamp(n: number, lo: number, up: number) {\n return lo > n ? lo : n > up ? up : n;\n}\n\nexport function tap<T, R>(v: T, cb: (v: T) => R) {\n return cb(v);\n}\n\nexport function tapIf<T, R>(v: T | null | undefined, cb: (v: T) => R) {\n if (v !== null && v !== undefined) {\n return cb(v);\n }\n\n return;\n}\n\nexport function* range(from: number, to: number, step = 1) {\n for (let i = from; i < to; i += step) {\n yield i;\n }\n}\n\nexport function toList<T>(iterable: Iterable<T>): T[] {\n const lst: T[] = [];\n for (const it of iterable) {\n lst.push(it);\n }\n\n return lst;\n}\n\nexport function times<R>(n: number, cb: (i: number) => R): R[] {\n return toList(range(0, n)).map(cb);\n}\n\nexport class Interval {\n constructor(private _delay: number) {}\n\n async *generate(): AsyncGenerator<number> {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n\n async *[Symbol.asyncIterator]() {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n}\n\nexport function arrayFrom<T>(length: number, cb: (i: number) => T) {\n return Array.from({ length }, (_, i) => cb(i));\n}\n\nexport function exhaustive(v: never, message: string): never {\n throw Error(message);\n}\n\nexport type Matcher<T extends string, R = unknown> = {\n [P in T]: () => R;\n};\n\nexport function match<T extends string, R = unknown>(matcher: Matcher<T, R>) {\n return (key: T) => matcher[key]();\n}\n\nexport function okOptional<V>(v: { ok: true; value: V } | { ok: false } | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (v.ok) {\n return v.value;\n }\n}\n\nexport function errorOptional<V>(v: Result<V> | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (!v.ok) {\n return v.error;\n }\n}\n\nexport function unwrap<T>(r: Result<T>): T {\n if (r.ok) {\n return r.value;\n }\n\n throw Error(r.error);\n}\n\nexport function flatValue<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nexport async function resolveAwaited<O extends Record<string, unknown>>(\n obj: O,\n): Promise<AwaitedStruct<O>> {\n return Object.fromEntries(\n await Promise.all(Object.entries(obj).map(async ([k, v]) => [k, await v])),\n ) as Promise<AwaitedStruct<O>>;\n}\n\nexport function alike(obj: Record<string, unknown>, to: Record<string, unknown>) {\n return Object.keys(to).every((bKey) => obj[bKey] === to[bKey]);\n}\n\nexport const identity = <T>(v: T): T => v;\n\nexport function asConst<const T>(v: T) {\n return v;\n}\n\nexport function unionize<K extends keyof O, V, O extends Record<K, V>>(obj: O): Unionize<O>[] {\n return Object.entries(obj).map(([key, value]) => ({\n key,\n value,\n })) as Unionize<O>[];\n}\n\nexport class Fetcher<K, V> {\n private promises = new Map<K, Promise<V>>();\n fetch(key: K, callback: () => Promise<V>) {\n if (this.promises.has(key)) {\n return this.promises.get(key)!;\n }\n const promise = callback().finally(() => {\n this.promises.delete(key);\n });\n this.promises.set(key, promise);\n return promise;\n }\n}\n"],"mappings":";AAEA,SAAgB,EAAM,GAA0C;AAC9D,QAAO,KAAM;;AAaf,SAAgB,EAAY,GAAyB,GAAqB;AACxE,KAAI,KAAM,KACR,OAAM,MAAM,KAAW,iCAAiC;AAG1D,QAAO;;AAwET,IAAa,IAAb,MAAyB;CACvB;CAEA,cAAc;AACZ,OAAK,UAAU,IAAI,SAAY,GAAK,MAAQ;AAE1C,GADA,KAAK,UAAU,GACf,KAAK,SAAS;IACd;;CAGJ,gBAAuC;CAEvC,eAA4C;;AAG9C,SAAgB,EAAM,GAAY;AAChC,QAAO,IAAI,SAAS,MAAY,WAAW,GAAS,EAAG,CAAC;;AA6B1D,SAAgB,EAAU,GAAM,GAAiB;AAC/C,QAAO,EAAG,EAAE;;AAGd,SAAgB,EAAY,GAAyB,GAAiB;AACpE,KAAI,KAAM,KACR,QAAO,EAAG,EAAE;;AAsHhB,IAAa,IAAb,MAA2B;CACzB,2BAAmB,IAAI,KAAoB;CAC3C,MAAM,GAAQ,GAA4B;AACxC,MAAI,KAAK,SAAS,IAAI,EAAI,CACxB,QAAO,KAAK,SAAS,IAAI,EAAI;EAE/B,IAAM,IAAU,GAAU,CAAC,cAAc;AACvC,QAAK,SAAS,OAAO,EAAI;IACzB;AAEF,SADA,KAAK,SAAS,IAAI,GAAK,EAAQ,EACxB"}
@@ -1,15 +1,12 @@
1
1
  import e from "canonicalize";
2
- /**
3
- * Calculate a hash of a JSON object
4
- * @param jsonObject - The JSON object to hash
5
- * @returns A hash of the JSON object
6
- */
2
+ //#region src/objectHash.ts
7
3
  async function t(t) {
8
4
  let n = e(t);
9
5
  if (n === void 0) throw Error("Failed to canonicalize object: Invalid input type or structure");
10
6
  let r = new TextEncoder().encode(n), i = await crypto.subtle.digest("SHA-256", r);
11
7
  return Array.from(new Uint8Array(i)).map((e) => e.toString(16).padStart(2, "0")).join("");
12
8
  }
9
+ //#endregion
13
10
  export { t as objectHash };
14
11
 
15
12
  //# sourceMappingURL=objectHash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"objectHash.js","names":[],"sources":["../src/objectHash.ts"],"sourcesContent":["import canonicalize from \"canonicalize\";\n\n/**\n * Calculate a hash of a JSON object\n * @param jsonObject - The JSON object to hash\n * @returns A hash of the JSON object\n */\nexport async function objectHash(jsonObject: NonNullable<unknown>) {\n const canonicalJson = canonicalize(jsonObject);\n\n if (canonicalJson === undefined) {\n throw new Error(\"Failed to canonicalize object: Invalid input type or structure\");\n }\n\n const encoder = new TextEncoder();\n\n const data = encoder.encode(canonicalJson);\n\n const digest = await crypto.subtle.digest(\"SHA-256\", data);\n\n const hashArray = Array.from(new Uint8Array(digest));\n\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n"],"mappings":";;;;;;AAOA,eAAsB,EAAW,GAAkC;CACjE,IAAM,IAAgB,EAAa,EAAW;AAE9C,KAAI,MAAkB,KAAA,EACpB,OAAU,MAAM,iEAAiE;CAKnF,IAAM,IAFU,IAAI,aAAa,CAEZ,OAAO,EAAc,EAEpC,IAAS,MAAM,OAAO,OAAO,OAAO,WAAW,EAAK;AAI1D,QAFkB,MAAM,KAAK,IAAI,WAAW,EAAO,CAAC,CAEnC,KAAK,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG"}
1
+ {"version":3,"file":"objectHash.js","names":[],"sources":["../src/objectHash.ts"],"sourcesContent":["import canonicalize from \"canonicalize\";\n\n/**\n * Calculate a hash of a JSON object\n * @param jsonObject - The JSON object to hash\n * @returns A hash of the JSON object\n */\nexport async function objectHash(jsonObject: NonNullable<unknown>) {\n const canonicalJson = canonicalize(jsonObject);\n\n if (canonicalJson === undefined) {\n throw new Error(\"Failed to canonicalize object: Invalid input type or structure\");\n }\n\n const encoder = new TextEncoder();\n\n const data = encoder.encode(canonicalJson);\n\n const digest = await crypto.subtle.digest(\"SHA-256\", data);\n\n const hashArray = Array.from(new Uint8Array(digest));\n\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n"],"mappings":";;AAOA,eAAsB,EAAW,GAAkC;CACjE,IAAM,IAAgB,EAAa,EAAW;AAE9C,KAAI,MAAkB,KAAA,EACpB,OAAU,MAAM,iEAAiE;CAKnF,IAAM,IAFU,IAAI,aAAa,CAEZ,OAAO,EAAc,EAEpC,IAAS,MAAM,OAAO,OAAO,OAAO,WAAW,EAAK;AAI1D,QAFkB,MAAM,KAAK,IAAI,WAAW,EAAO,CAAC,CAEnC,KAAK,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG"}
@@ -2,6 +2,7 @@ import e from "../../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./EndOfPeriod.vue2.js";
3
3
  import n from "./EndOfPeriod.style.js";
4
4
  var r = /* @__PURE__ */ e(t, [["__cssModules", { $style: n }]]);
5
+ //#endregion
5
6
  export { r as default };
6
7
 
7
8
  //# sourceMappingURL=EndOfPeriod.js.map
@@ -1,4 +1,5 @@
1
1
  import './EndOfPeriod.vue.css';var e = { container: "_container_1ki68_2" };
2
+ //#endregion
2
3
  export { e as default };
3
4
 
4
5
  //# sourceMappingURL=EndOfPeriod.style.js.map
@@ -1,4 +1,5 @@
1
1
  import { createElementBlock as e, createElementVNode as t, defineComponent as n, normalizeClass as r, openBlock as i, toDisplayString as a } from "vue";
2
+ //#region src/plugins/Monetization/EndOfPeriod.vue?vue&type=script&setup=true&lang.ts
2
3
  var o = /* @__PURE__ */ n({
3
4
  __name: "EndOfPeriod",
4
5
  props: { endOfPeriod: {} },
@@ -11,6 +12,7 @@ var o = /* @__PURE__ */ n({
11
12
  return (s, c) => (i(), e("div", { class: r(s.$style.container) }, [c[0] ||= t("span", null, "End of period", -1), t("span", null, a(o(n.endOfPeriod)), 1)], 2));
12
13
  }
13
14
  });
15
+ //#endregion
14
16
  export { o as default };
15
17
 
16
18
  //# sourceMappingURL=EndOfPeriod.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EndOfPeriod.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/EndOfPeriod.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{\n endOfPeriod: string | null;\n}>();\n\nconst formateStringDate = (date: string | null) => {\n if (!date) return \"N/A\";\n const dateObj = new Date(date);\n const day = dateObj.getDate().toString().padStart(2, \"0\");\n const month = (dateObj.getMonth() + 1).toString().padStart(2, \"0\"); // Month is 0-indexed\n const year = dateObj.getFullYear();\n return `${day}.${month}.${year}`;\n};\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <span>End of period</span>\n <span>{{ formateStringDate(endOfPeriod) }}</span>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n background-color: #f7f8fa;\n border-radius: 6px;\n min-height: 40px;\n padding: 0 12px 0 12px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 500;\n border: 1px solid var(--border-color-div-grey);\n span:first-child {\n overflow: hidden;\n font-weight: 600;\n }\n}\n</style>\n"],"mappings":";;;;;EAKA,IAAM,KAAqB,MAAwB;AACjD,OAAI,CAAC,EAAM,QAAO;GAClB,IAAM,IAAU,IAAI,KAAK,EAAK;AAI9B,UAAO,GAHK,EAAQ,SAAS,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAG3C,IAFC,EAAQ,UAAU,GAAG,GAAG,UAAU,CAAC,SAAS,GAAG,IAAI,CAE3C,GADV,EAAQ,aAAa;;yBAMlC,EAGM,OAAA,EAHA,OAAK,EAAEA,EAAAA,OAAO,UAAS,EAAA,EAAA,CAAA,AAAA,EAAA,OAC3B,EAA0B,QAAA,MAApB,iBAAa,GAAA,EACnB,EAAiD,QAAA,MAAA,EAAxC,EAAkB,EAAA,YAAW,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA"}
1
+ {"version":3,"file":"EndOfPeriod.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/EndOfPeriod.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{\n endOfPeriod: string | null;\n}>();\n\nconst formateStringDate = (date: string | null) => {\n if (!date) return \"N/A\";\n const dateObj = new Date(date);\n const day = dateObj.getDate().toString().padStart(2, \"0\");\n const month = (dateObj.getMonth() + 1).toString().padStart(2, \"0\"); // Month is 0-indexed\n const year = dateObj.getFullYear();\n return `${day}.${month}.${year}`;\n};\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <span>End of period</span>\n <span>{{ formateStringDate(endOfPeriod) }}</span>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n background-color: #f7f8fa;\n border-radius: 6px;\n min-height: 40px;\n padding: 0 12px 0 12px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 500;\n border: 1px solid var(--border-color-div-grey);\n span:first-child {\n overflow: hidden;\n font-weight: 600;\n }\n}\n</style>\n"],"mappings":";;;;;;EAKA,IAAM,KAAqB,MAAwB;AACjD,OAAI,CAAC,EAAM,QAAO;GAClB,IAAM,IAAU,IAAI,KAAK,EAAK;AAI9B,UAAO,GAHK,EAAQ,SAAS,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAG3C,IAFC,EAAQ,UAAU,GAAG,GAAG,UAAU,CAAC,SAAS,GAAG,IAAI,CAE3C,GADV,EAAQ,aAAa;;yBAMlC,EAGM,OAAA,EAHA,OAAK,EAAEA,EAAAA,OAAO,UAAS,EAAA,EAAA,CAAA,AAAA,EAAA,OAC3B,EAA0B,QAAA,MAApB,iBAAa,GAAA,EACnB,EAAiD,QAAA,MAAA,EAAxC,EAAkB,EAAA,YAAW,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA"}
@@ -2,6 +2,7 @@ import e from "../../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./LimitCard.vue2.js";
3
3
  import n from "./LimitCard.style.js";
4
4
  var r = /* @__PURE__ */ e(t, [["__cssModules", { $style: n }]]);
5
+ //#endregion
5
6
  export { r as default };
6
7
 
7
8
  //# sourceMappingURL=LimitCard.js.map
@@ -13,6 +13,7 @@ import './LimitCard.vue.css';var e = {
13
13
  usedLegend: "_usedLegend_7c2y8_108",
14
14
  toSpendLegend: "_toSpendLegend_7c2y8_117"
15
15
  };
16
+ //#endregion
16
17
  export { e as default };
17
18
 
18
19
  //# sourceMappingURL=LimitCard.style.js.map
@@ -1,4 +1,5 @@
1
1
  import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, createTextVNode as i, defineComponent as a, normalizeClass as o, normalizeStyle as s, openBlock as c, toDisplayString as l } from "vue";
2
+ //#region src/plugins/Monetization/LimitCard.vue?vue&type=script&setup=true&lang.ts
2
3
  var u = { key: 0 }, d = { key: 1 }, f = { key: 0 }, p = { key: 1 }, m = /* @__PURE__ */ a({
3
4
  __name: "LimitCard",
4
5
  props: {
@@ -43,6 +44,7 @@ var u = { key: 0 }, d = { key: 1 }, f = { key: 0 }, p = { key: 1 }, m = /* @__PU
43
44
  ], 2), r("div", { class: o(e.$style.legends) }, [r("div", { class: o(e.$style.toSpendLegend) }, [m[4] ||= r("span", null, null, -1), i(" To spend: " + l(w(a.toSpend)), 1)], 2), r("div", { class: o(e.$style.usedLegend) }, [m[5] ||= r("span", null, null, -1), i(" Used: " + l(w(a.used)), 1)], 2)], 2)], 2)], 2));
44
45
  }
45
46
  });
47
+ //#endregion
46
48
  export { m as default };
47
49
 
48
50
  //# sourceMappingURL=LimitCard.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LimitCard.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/LimitCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n type: \"unique_launches\" | \"volume_limit\";\n label: string;\n used: number;\n toSpend: number;\n available: number | null; // If available is null it means Unlimited\n unit?: string;\n}>();\n\nconst total = computed(() => {\n if (props.available === null) return null;\n return props.available + props.toSpend + props.used;\n});\n\nconst exceeded = computed(() => {\n if (props.available === null) return false;\n return props.available < 0;\n});\n\nconst availableNow = computed(() => {\n if (props.available === null) return null;\n return props.available + props.toSpend;\n});\n\nconst clampPercentage = (n: number) => Math.max(0, Math.min(100, n));\n\nconst toSpendPercentage = computed(() => {\n if (total.value === null) return 0;\n if (total.value === 0) return 0;\n if (exceeded.value) return 0;\n return clampPercentage((props.toSpend / total.value) * 100);\n});\n\nconst usedPercentage = computed(() => {\n if (total.value === null) return 0;\n if (total.value === 0) return 0;\n return clampPercentage((props.used / total.value) * 100);\n});\n\nconst availablePercentage = computed(() => {\n if (props.available === null) return 100;\n if (total.value === null) return 100;\n if (total.value === 0) return 100;\n if (exceeded.value) return 0;\n return clampPercentage((props.available / total.value) * 100);\n});\n\nconst computedLabel = computed(() => {\n if (props.type === \"unique_launches\") return \"Runs Limits\";\n if (props.type === \"volume_limit\") return \"Volume Limits\";\n return props.label;\n});\n\nconst toGB = (v: number) => {\n return (v / 1024 / 1024 / 1024).toFixed(2) + \" GB\";\n};\n\nconst formatUnit = (v: number) => {\n if (props.type === \"volume_limit\") return toGB(v);\n return v;\n};\n\nconst showBar = (n: number) => {\n return Number(n.toFixed(2)) > 0;\n};\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <span :class=\"$style.label\">{{ computedLabel }}</span>\n <div :class=\"$style.content\">\n <div :class=\"$style.contentAvailable\">\n <div>\n Available:\n <div style=\"flex: 1\" />\n <span v-if=\"availableNow !== null\"\n ><strong>{{ formatUnit(availableNow) }}</strong> /\n {{ formatUnit(available! + toSpend + used) }}</span\n >\n <span v-else>Unlimited</span>\n </div>\n <div :class=\"[$style.afterRun, { [$style.exceeded]: exceeded }]\">\n <span v-if=\"exceeded\">Too many files selected</span>\n <span style=\"flex: 1\" />\n <span>After run:</span>\n <span v-if=\"available !== null\"\n >{{ formatUnit(available) }} / {{ formatUnit(available + toSpend + used) }}</span\n >\n </div>\n <div :class=\"[$style.progressBar, { [$style.exceeded]: exceeded }]\">\n <span\n v-if=\"showBar(availablePercentage)\"\n :class=\"$style.progressBarAvailable\"\n :style=\"{ width: `${availablePercentage.toFixed(2)}%` }\"\n />\n <span\n v-if=\"showBar(toSpendPercentage)\"\n :class=\"$style.progressBarToSpend\"\n :style=\"{ width: `${toSpendPercentage.toFixed(2)}%` }\"\n />\n <span\n v-if=\"showBar(usedPercentage)\"\n :class=\"$style.progressBarUsed\"\n :style=\"{ width: `${usedPercentage.toFixed(2)}%` }\"\n />\n </div>\n </div>\n <div :class=\"$style.legends\">\n <div :class=\"$style.toSpendLegend\">\n <span />\n To spend: {{ formatUnit(toSpend) }}\n </div>\n <div :class=\"$style.usedLegend\">\n <span />\n Used: {{ formatUnit(used) }}\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n flex-direction: column;\n background-color: var(--bg-base-light);\n border-radius: 6px;\n padding: 10px 12px 16px 12px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n border: 1px solid var(--border-color-div-grey);\n}\n\n.label {\n display: block;\n min-height: 36px;\n margin-bottom: 8px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 600;\n line-height: 20px; /* 142.857% */\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.contentAvailable {\n display: flex;\n flex-direction: column;\n gap: 6px;\n > div {\n display: flex;\n align-items: flex-start;\n }\n > div:first-child {\n gap: 8px;\n strong {\n font-size: 28px;\n font-weight: 500;\n line-height: 36px; /* 128.571% */\n letter-spacing: -0.56px;\n }\n }\n}\n\n.afterRun {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px;\n color: var(--txt-03);\n &.exceeded {\n color: var(--txt-error);\n }\n}\n\n.progressBar {\n width: 100%;\n height: 12px;\n background-color: #e0e0e0;\n display: flex;\n align-items: center;\n border: 1px solid var(--border-color-default);\n > span {\n display: block;\n height: 100%;\n outline: 1px solid var(--border-color-default);\n }\n &.exceeded {\n opacity: 0.2;\n }\n}\n\n.progressBarAvailable {\n background: linear-gradient(270deg, #a1e59c 0%, #d0f5b0 98.81%);\n}\n\n.progressBarUsed {\n background-color: #ffcecc;\n}\n\n.progressBarToSpend {\n background-color: #faf5aa;\n}\n\n.legends {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n\n span {\n display: block;\n border-radius: 1px;\n border: 1px solid var(--border-color-default);\n width: 12px;\n height: 12px;\n }\n}\n\n.usedLegend {\n display: flex;\n align-items: center;\n gap: 8px;\n span {\n background: #ffcecc;\n }\n}\n\n.toSpendLegend {\n display: flex;\n align-items: center;\n gap: 8px;\n span {\n background: #faf5aa;\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"LimitCard.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/LimitCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n type: \"unique_launches\" | \"volume_limit\";\n label: string;\n used: number;\n toSpend: number;\n available: number | null; // If available is null it means Unlimited\n unit?: string;\n}>();\n\nconst total = computed(() => {\n if (props.available === null) return null;\n return props.available + props.toSpend + props.used;\n});\n\nconst exceeded = computed(() => {\n if (props.available === null) return false;\n return props.available < 0;\n});\n\nconst availableNow = computed(() => {\n if (props.available === null) return null;\n return props.available + props.toSpend;\n});\n\nconst clampPercentage = (n: number) => Math.max(0, Math.min(100, n));\n\nconst toSpendPercentage = computed(() => {\n if (total.value === null) return 0;\n if (total.value === 0) return 0;\n if (exceeded.value) return 0;\n return clampPercentage((props.toSpend / total.value) * 100);\n});\n\nconst usedPercentage = computed(() => {\n if (total.value === null) return 0;\n if (total.value === 0) return 0;\n return clampPercentage((props.used / total.value) * 100);\n});\n\nconst availablePercentage = computed(() => {\n if (props.available === null) return 100;\n if (total.value === null) return 100;\n if (total.value === 0) return 100;\n if (exceeded.value) return 0;\n return clampPercentage((props.available / total.value) * 100);\n});\n\nconst computedLabel = computed(() => {\n if (props.type === \"unique_launches\") return \"Runs Limits\";\n if (props.type === \"volume_limit\") return \"Volume Limits\";\n return props.label;\n});\n\nconst toGB = (v: number) => {\n return (v / 1024 / 1024 / 1024).toFixed(2) + \" GB\";\n};\n\nconst formatUnit = (v: number) => {\n if (props.type === \"volume_limit\") return toGB(v);\n return v;\n};\n\nconst showBar = (n: number) => {\n return Number(n.toFixed(2)) > 0;\n};\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <span :class=\"$style.label\">{{ computedLabel }}</span>\n <div :class=\"$style.content\">\n <div :class=\"$style.contentAvailable\">\n <div>\n Available:\n <div style=\"flex: 1\" />\n <span v-if=\"availableNow !== null\"\n ><strong>{{ formatUnit(availableNow) }}</strong> /\n {{ formatUnit(available! + toSpend + used) }}</span\n >\n <span v-else>Unlimited</span>\n </div>\n <div :class=\"[$style.afterRun, { [$style.exceeded]: exceeded }]\">\n <span v-if=\"exceeded\">Too many files selected</span>\n <span style=\"flex: 1\" />\n <span>After run:</span>\n <span v-if=\"available !== null\"\n >{{ formatUnit(available) }} / {{ formatUnit(available + toSpend + used) }}</span\n >\n </div>\n <div :class=\"[$style.progressBar, { [$style.exceeded]: exceeded }]\">\n <span\n v-if=\"showBar(availablePercentage)\"\n :class=\"$style.progressBarAvailable\"\n :style=\"{ width: `${availablePercentage.toFixed(2)}%` }\"\n />\n <span\n v-if=\"showBar(toSpendPercentage)\"\n :class=\"$style.progressBarToSpend\"\n :style=\"{ width: `${toSpendPercentage.toFixed(2)}%` }\"\n />\n <span\n v-if=\"showBar(usedPercentage)\"\n :class=\"$style.progressBarUsed\"\n :style=\"{ width: `${usedPercentage.toFixed(2)}%` }\"\n />\n </div>\n </div>\n <div :class=\"$style.legends\">\n <div :class=\"$style.toSpendLegend\">\n <span />\n To spend: {{ formatUnit(toSpend) }}\n </div>\n <div :class=\"$style.usedLegend\">\n <span />\n Used: {{ formatUnit(used) }}\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n flex-direction: column;\n background-color: var(--bg-base-light);\n border-radius: 6px;\n padding: 10px 12px 16px 12px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n border: 1px solid var(--border-color-div-grey);\n}\n\n.label {\n display: block;\n min-height: 36px;\n margin-bottom: 8px;\n color: var(--txt-01);\n font-size: 14px;\n font-weight: 600;\n line-height: 20px; /* 142.857% */\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.contentAvailable {\n display: flex;\n flex-direction: column;\n gap: 6px;\n > div {\n display: flex;\n align-items: flex-start;\n }\n > div:first-child {\n gap: 8px;\n strong {\n font-size: 28px;\n font-weight: 500;\n line-height: 36px; /* 128.571% */\n letter-spacing: -0.56px;\n }\n }\n}\n\n.afterRun {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px;\n color: var(--txt-03);\n &.exceeded {\n color: var(--txt-error);\n }\n}\n\n.progressBar {\n width: 100%;\n height: 12px;\n background-color: #e0e0e0;\n display: flex;\n align-items: center;\n border: 1px solid var(--border-color-default);\n > span {\n display: block;\n height: 100%;\n outline: 1px solid var(--border-color-default);\n }\n &.exceeded {\n opacity: 0.2;\n }\n}\n\n.progressBarAvailable {\n background: linear-gradient(270deg, #a1e59c 0%, #d0f5b0 98.81%);\n}\n\n.progressBarUsed {\n background-color: #ffcecc;\n}\n\n.progressBarToSpend {\n background-color: #faf5aa;\n}\n\n.legends {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n\n span {\n display: block;\n border-radius: 1px;\n border: 1px solid var(--border-color-default);\n width: 12px;\n height: 12px;\n }\n}\n\n.usedLegend {\n display: flex;\n align-items: center;\n gap: 8px;\n span {\n background: #ffcecc;\n }\n}\n\n.toSpendLegend {\n display: flex;\n align-items: center;\n gap: 8px;\n span {\n background: #faf5aa;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;EAGA,IAAM,IAAQ,GASR,IAAQ,QACR,EAAM,cAAc,OAAa,OAC9B,EAAM,YAAY,EAAM,UAAU,EAAM,KAC/C,EAEI,IAAW,QACX,EAAM,cAAc,OAAa,KAC9B,EAAM,YAAY,EACzB,EAEI,IAAe,QACf,EAAM,cAAc,OAAa,OAC9B,EAAM,YAAY,EAAM,QAC/B,EAEI,KAAmB,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,EAE9D,IAAoB,QACpB,EAAM,UAAU,QAChB,EAAM,UAAU,KAChB,EAAS,QAAc,IACpB,EAAiB,EAAM,UAAU,EAAM,QAAS,IAAI,CAC3D,EAEI,IAAiB,QACjB,EAAM,UAAU,QAChB,EAAM,UAAU,IAAU,IACvB,EAAiB,EAAM,OAAO,EAAM,QAAS,IAAI,CACxD,EAEI,IAAsB,QACtB,EAAM,cAAc,QACpB,EAAM,UAAU,QAChB,EAAM,UAAU,IAAU,MAC1B,EAAS,QAAc,IACpB,EAAiB,EAAM,YAAY,EAAM,QAAS,IAAI,CAC7D,EAEI,IAAgB,QAChB,EAAM,SAAS,oBAA0B,gBACzC,EAAM,SAAS,iBAAuB,kBACnC,EAAM,MACb,EAEI,KAAQ,OACJ,IAAI,OAAO,OAAO,MAAM,QAAQ,EAAE,GAAG,OAGzC,KAAc,MACd,EAAM,SAAS,iBAAuB,EAAK,EAAE,GAC1C,GAGH,KAAW,MACR,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG;yBAK9B,EAkDM,OAAA,EAlDA,OAAK,EAAEA,EAAAA,OAAO,UAAS,EAAA,EAAA,CAC3B,EAAsD,QAAA,EAA/C,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAA,EAAK,EAAA,MAAa,EAAA,EAAA,EAC5C,EA+CM,OAAA,EA/CA,OAAK,EAAEA,EAAAA,OAAO,QAAO,EAAA,EAAA,CACzB,EAmCM,OAAA,EAnCA,OAAK,EAAEA,EAAAA,OAAO,iBAAgB,EAAA,EAAA;GAClC,EAQM,OAAA,MAAA;eARD,gBAEH,GAAA;aAAA,EAAuB,OAAA,EAAlB,OAAA,EAAA,MAAA,KAAe,EAAA,EAAA,MAAA,GAAA;IACR,EAAA,UAAY,QAEmB,GAAA,EAE3C,EAA6B,QAAA,GAAhB,YAAS,KAJE,GAAA,EAAxB,EAGC,QAAA,GAAA,CAFE,EAA+C,UAAA,MAAA,EAApC,EAAW,EAAA,MAAY,CAAA,EAAA,EAAA,EAAA,EAAa,QAChD,EAAG,EAAW,EAAA,YAAa,EAAA,UAAU,EAAA,KAAI,CAAA,EAAA,EAAA,CAAA,CAAA;;GAI7C,EAOM,OAAA,EAPA,OAAK,EAAA,CAAGA,EAAAA,OAAO,UAAQ,GAAKA,EAAAA,OAAO,WAAW,EAAA,OAAQ,CAAA,CAAA,EAAA,EAAA;IAC9C,EAAA,SAAA,GAAA,EAAZ,EAAoD,QAAA,GAA9B,0BAAuB,IAAA,EAAA,IAAA,GAAA;aAC7C,EAAwB,QAAA,EAAlB,OAAA,EAAA,MAAA,KAAe,EAAA,EAAA,MAAA,GAAA;aACrB,EAAuB,QAAA,MAAjB,cAAU,GAAA;IACJ,EAAA,cAAS,OACoD,EAAA,IAAA,GAAA,IADpD,GAAA,EAArB,EAEC,QAAA,GAAA,EADK,EAAW,EAAA,UAAS,CAAA,GAAI,QAAG,EAAG,EAAW,EAAA,YAAY,EAAA,UAAU,EAAA,KAAI,CAAA,EAAA,EAAA;;GAG3E,EAgBM,OAAA,EAhBA,OAAK,EAAA,CAAGA,EAAAA,OAAO,aAAW,GAAKA,EAAAA,OAAO,WAAW,EAAA,OAAQ,CAAA,CAAA,EAAA,EAAA;IAErD,EAAQ,EAAA,MAAmB,IAAA,GAAA,EADnC,EAIE,QAAA;;KAFC,OAAK,EAAEA,EAAAA,OAAO,qBAAoB;KAClC,OAAK,EAAA,EAAA,OAAA,GAAc,EAAA,MAAoB,QAAO,EAAA,CAAA,IAAA,CAAA;;IAGzC,EAAQ,EAAA,MAAiB,IAAA,GAAA,EADjC,EAIE,QAAA;;KAFC,OAAK,EAAEA,EAAAA,OAAO,mBAAkB;KAChC,OAAK,EAAA,EAAA,OAAA,GAAc,EAAA,MAAkB,QAAO,EAAA,CAAA,IAAA,CAAA;;IAGvC,EAAQ,EAAA,MAAc,IAAA,GAAA,EAD9B,EAIE,QAAA;;KAFC,OAAK,EAAEA,EAAAA,OAAO,gBAAe;KAC7B,OAAK,EAAA,EAAA,OAAA,GAAc,EAAA,MAAe,QAAO,EAAA,CAAA,IAAA,CAAA;;;SAIhD,EASM,OAAA,EATA,OAAK,EAAEA,EAAAA,OAAO,QAAO,EAAA,EAAA,CACzB,EAGM,OAAA,EAHA,OAAK,EAAEA,EAAAA,OAAO,cAAa,EAAA,EAAA,CAAA,AAAA,EAAA,OAC/B,EAAQ,QAAA,MAAA,MAAA,GAAA,EAAA,EAAA,gBACE,EAAG,EAAW,EAAA,QAAO,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,EAEjC,EAGM,OAAA,EAHA,OAAK,EAAEA,EAAAA,OAAO,WAAU,EAAA,EAAA,CAAA,AAAA,EAAA,OAC5B,EAAQ,QAAA,MAAA,MAAA,GAAA,EAAA,EAAA,YACF,EAAG,EAAW,EAAA,KAAI,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA"}
@@ -1,5 +1,7 @@
1
1
  import e from "./MonetizationSidebar.vue2.js";
2
+ //#region src/plugins/Monetization/MonetizationSidebar.vue
2
3
  var t = e;
4
+ //#endregion
3
5
  export { t as default };
4
6
 
5
7
  //# sourceMappingURL=MonetizationSidebar.js.map
@@ -6,6 +6,7 @@ import i from "./LimitCard.js";
6
6
  import a from "./EndOfPeriod.js";
7
7
  import { Fragment as o, Teleport as s, computed as c, createBlock as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createTextVNode as p, createVNode as m, defineComponent as h, openBlock as g, ref as _, renderList as v, toDisplayString as y, unref as b, withCtx as x, withModifiers as S } from "vue";
8
8
  import { PlAlert as C, PlBtnGhost as w, PlBtnSecondary as T, PlDropdown as E, PlIcon24 as D, PlSlideModal as O } from "@milaboratories/uikit";
9
+ //#region src/plugins/Monetization/MonetizationSidebar.vue?vue&type=script&setup=true&lang.ts
9
10
  var k = /* @__PURE__ */ h({
10
11
  __name: "MonetizationSidebar",
11
12
  setup(h) {
@@ -101,6 +102,7 @@ var k = /* @__PURE__ */ h({
101
102
  })], 8, ["to"])) : u("", !0)], 64));
102
103
  }
103
104
  });
105
+ //#endregion
104
106
  export { k as default };
105
107
 
106
108
  //# sourceMappingURL=MonetizationSidebar.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MonetizationSidebar.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/plugins/Monetization/MonetizationSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from \"vue\";\nimport {\n PlSlideModal,\n PlBtnGhost,\n PlDropdown,\n PlAlert,\n PlIcon24,\n PlBtnSecondary,\n} from \"@milaboratories/uikit\";\nimport { useButtonTarget } from \"./useButtonTarget\";\nimport { useInfo } from \"./useInfo\";\nimport UserCabinetCard from \"./UserCabinetCard.vue\";\nimport RunStatus from \"./RunStatus.vue\";\nimport LimitCard from \"./LimitCard.vue\";\nimport EndOfPeriod from \"./EndOfPeriod.vue\";\n\nconst isOpen = ref(false);\n\nconst {\n result,\n error,\n hasMonetization,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n isLoading,\n} = useInfo();\n\nconst teleportTarget = useButtonTarget(hasMonetization);\n\nconst productName = computed(() => result.value?.productName);\n\nconst userCabinetUrl = computed(() => {\n if (!result.value) return undefined;\n\n const u = new URL(`https://scientist.platforma.bio/product/${result.value.productKey}`);\n\n if (customerEmail.value) {\n u.searchParams.set(\"email\", customerEmail.value);\n }\n\n return u.toString();\n});\n\nconst options = computed(() => {\n if (!result.value) return [];\n\n return [\n {\n label: result.value.productName,\n value: result.value.productName,\n },\n ];\n});\n\nconst statusText = computed(() => {\n switch (status.value) {\n case \"active\":\n return \"\";\n case \"limits_exceeded\":\n return \"Usage limits exceeded for the current billing period.\";\n case \"payment_required\":\n return \"Payment required to continue using the service.\";\n case \"select-tariff\":\n return \"Select a subscription plan in the Scientist Cabinet.\";\n case \"inactive\":\n return \"Not found billing period.\";\n default:\n return \"\";\n }\n});\n\nconst btnIcon = computed(() => {\n if (canRun.value) return \"monetization-on\";\n return \"monetization-off\";\n});\n</script>\n\n<template>\n <PlSlideModal v-if=\"hasMonetization\" v-model=\"isOpen\">\n <template #title>\n <div class=\"flex items-center gap-2\">\n <span>Subscription</span>\n </div>\n </template>\n <PlDropdown label=\"Product\" readonly :model-value=\"productName\" :options=\"options\" />\n <RunStatus :can-run=\"canRun\" :is-loading=\"isLoading\" :status-text=\"statusText\">\n <PlBtnSecondary\n title=\"Refresh status\"\n round\n size=\"small\"\n style=\"margin-left: auto\"\n icon=\"loading\"\n :loading=\"isLoading\"\n @click=\"refresh\"\n />\n </RunStatus>\n <PlAlert v-if=\"error\" type=\"error\">\n {{ error }}\n </PlAlert>\n <UserCabinetCard\n v-if=\"userCabinetUrl\"\n :email=\"customerEmail\"\n :user-cabinet-url=\"userCabinetUrl\"\n />\n <EndOfPeriod v-if=\"endOfBillingPeriod\" :end-of-period=\"endOfBillingPeriod\" />\n <template v-if=\"limits\">\n <LimitCard\n v-for=\"limit in limits\"\n :key=\"limit.type\"\n :type=\"limit.type\"\n :label=\"limit.type\"\n :used=\"limit.used\"\n :to-spend=\"limit.toSpend\"\n :available=\"limit.available\"\n />\n </template>\n </PlSlideModal>\n <!-- Teleport to the title slot -->\n <Teleport v-if=\"hasMonetization && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost @click.stop=\"isOpen = true\">\n Subscription\n <template #append>\n <PlIcon24 :name=\"btnIcon\" />\n </template>\n </PlBtnGhost>\n </Teleport>\n</template>\n"],"mappings":";;;;;;;;;;;EAiBA,IAAM,IAAS,EAAI,GAAM,EAEnB,EACJ,WACA,UACA,oBACA,WACA,WACA,kBACA,uBACA,WACA,YACA,iBACE,GAAS,EAEP,IAAiB,EAAgB,EAAgB,EAEjD,IAAc,QAAe,EAAO,OAAO,YAAY,EAEvD,IAAiB,QAAe;AACpC,OAAI,CAAC,EAAO,MAAO;GAEnB,IAAM,IAAI,IAAI,IAAI,2CAA2C,EAAO,MAAM,aAAa;AAMvF,UAJI,EAAc,SAChB,EAAE,aAAa,IAAI,SAAS,EAAc,MAAM,EAG3C,EAAE,UAAU;IACnB,EAEI,IAAU,QACT,EAAO,QAEL,CACL;GACE,OAAO,EAAO,MAAM;GACpB,OAAO,EAAO,MAAM;GACrB,CACF,GAPyB,EAAE,CAQ5B,EAEI,IAAa,QAAe;AAChC,WAAQ,EAAO,OAAf;IACE,KAAK,SACH,QAAO;IACT,KAAK,kBACH,QAAO;IACT,KAAK,mBACH,QAAO;IACT,KAAK,gBACH,QAAO;IACT,KAAK,WACH,QAAO;IACT,QACE,QAAO;;IAEX,EAEI,IAAU,QACV,EAAO,QAAc,oBAClB,mBACP;qCAIoB,EAAA,EAAe,IAAA,GAAA,EAAnC,EAsCe,EAAA,EAAA,EAAA;;eAtC+B,EAAA;4CAAM,QAAA;;GACvC,OAAK,QAGR,CAAA,GAAA,AAAA,EAAA,OAAA,CAFN,EAEM,OAAA,EAFD,OAAM,2BAAyB,EAAA,CAClC,EAAyB,QAAA,MAAnB,eAAY,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA;oBAG+D;IAArF,EAAqF,EAAA,EAAA,EAAA;KAAzE,OAAM;KAAU,UAAA;KAAU,eAAa,EAAA;KAAc,SAAS,EAAA;;IAC1E,EAUY,GAAA;KAVA,WAAS,EAAA,EAAM;KAAG,cAAY,EAAA,EAAS;KAAG,eAAa,EAAA;;sBAS/D,CARF,EAQE,EAAA,EAAA,EAAA;MAPA,OAAM;MACN,OAAA;MACA,MAAK;MACL,OAAA,EAAA,eAAA,QAAyB;MACzB,MAAK;MACJ,SAAS,EAAA,EAAS;MAClB,SAAO,EAAA,EAAO;;;;;;;;IAGJ,EAAA,EAAK,IAAA,GAAA,EAApB,EAEU,EAAA,EAAA,EAAA;;KAFY,MAAK;;sBACd,CAAA,EAAA,EAAR,EAAA,EAAK,CAAA,EAAA,EAAA,CAAA,CAAA;;;IAGF,EAAA,SAAA,GAAA,EADR,EAIE,GAAA;;KAFC,OAAO,EAAA,EAAa;KACpB,oBAAkB,EAAA;;IAEF,EAAA,EAAkB,IAAA,GAAA,EAArC,EAA6E,GAAA;;KAArC,iBAAe,EAAA,EAAkB;;IACzD,EAAA,EAAM,IAAA,EAAA,GAAA,EACpB,EAQE,GAAA,EAAA,KAAA,GAAA,EAAA,EAPgB,EAAA,EAAM,GAAf,YADT,EAQE,GAAA;KANC,KAAK,EAAM;KACX,MAAM,EAAM;KACZ,OAAO,EAAM;KACb,MAAM,EAAM;KACZ,YAAU,EAAM;KAChB,WAAW,EAAM;;;;;;;;;;sCAKR,EAAA,EAAe,IAAI,EAAA,EAAc,IAAA,GAAA,EAAjD,EAOW,GAAA;;GAPyC,IAAI,EAAA,EAAc;MACpE,EAKa,EAAA,EAAA,EAAA,EALA,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAM,IAAA,CAAA,OAAA,CAAA,EAAA,EAAA;GAElB,QAAM,QACa,CAA5B,EAA4B,EAAA,EAAA,EAAA,EAAjB,MAAM,EAAA,OAAO,EAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,CAAA;oBAD1B,CAAA,AAAA,EAAA,OAAA,EAFsC,kBAEtC,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"MonetizationSidebar.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/plugins/Monetization/MonetizationSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from \"vue\";\nimport {\n PlSlideModal,\n PlBtnGhost,\n PlDropdown,\n PlAlert,\n PlIcon24,\n PlBtnSecondary,\n} from \"@milaboratories/uikit\";\nimport { useButtonTarget } from \"./useButtonTarget\";\nimport { useInfo } from \"./useInfo\";\nimport UserCabinetCard from \"./UserCabinetCard.vue\";\nimport RunStatus from \"./RunStatus.vue\";\nimport LimitCard from \"./LimitCard.vue\";\nimport EndOfPeriod from \"./EndOfPeriod.vue\";\n\nconst isOpen = ref(false);\n\nconst {\n result,\n error,\n hasMonetization,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n isLoading,\n} = useInfo();\n\nconst teleportTarget = useButtonTarget(hasMonetization);\n\nconst productName = computed(() => result.value?.productName);\n\nconst userCabinetUrl = computed(() => {\n if (!result.value) return undefined;\n\n const u = new URL(`https://scientist.platforma.bio/product/${result.value.productKey}`);\n\n if (customerEmail.value) {\n u.searchParams.set(\"email\", customerEmail.value);\n }\n\n return u.toString();\n});\n\nconst options = computed(() => {\n if (!result.value) return [];\n\n return [\n {\n label: result.value.productName,\n value: result.value.productName,\n },\n ];\n});\n\nconst statusText = computed(() => {\n switch (status.value) {\n case \"active\":\n return \"\";\n case \"limits_exceeded\":\n return \"Usage limits exceeded for the current billing period.\";\n case \"payment_required\":\n return \"Payment required to continue using the service.\";\n case \"select-tariff\":\n return \"Select a subscription plan in the Scientist Cabinet.\";\n case \"inactive\":\n return \"Not found billing period.\";\n default:\n return \"\";\n }\n});\n\nconst btnIcon = computed(() => {\n if (canRun.value) return \"monetization-on\";\n return \"monetization-off\";\n});\n</script>\n\n<template>\n <PlSlideModal v-if=\"hasMonetization\" v-model=\"isOpen\">\n <template #title>\n <div class=\"flex items-center gap-2\">\n <span>Subscription</span>\n </div>\n </template>\n <PlDropdown label=\"Product\" readonly :model-value=\"productName\" :options=\"options\" />\n <RunStatus :can-run=\"canRun\" :is-loading=\"isLoading\" :status-text=\"statusText\">\n <PlBtnSecondary\n title=\"Refresh status\"\n round\n size=\"small\"\n style=\"margin-left: auto\"\n icon=\"loading\"\n :loading=\"isLoading\"\n @click=\"refresh\"\n />\n </RunStatus>\n <PlAlert v-if=\"error\" type=\"error\">\n {{ error }}\n </PlAlert>\n <UserCabinetCard\n v-if=\"userCabinetUrl\"\n :email=\"customerEmail\"\n :user-cabinet-url=\"userCabinetUrl\"\n />\n <EndOfPeriod v-if=\"endOfBillingPeriod\" :end-of-period=\"endOfBillingPeriod\" />\n <template v-if=\"limits\">\n <LimitCard\n v-for=\"limit in limits\"\n :key=\"limit.type\"\n :type=\"limit.type\"\n :label=\"limit.type\"\n :used=\"limit.used\"\n :to-spend=\"limit.toSpend\"\n :available=\"limit.available\"\n />\n </template>\n </PlSlideModal>\n <!-- Teleport to the title slot -->\n <Teleport v-if=\"hasMonetization && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost @click.stop=\"isOpen = true\">\n Subscription\n <template #append>\n <PlIcon24 :name=\"btnIcon\" />\n </template>\n </PlBtnGhost>\n </Teleport>\n</template>\n"],"mappings":";;;;;;;;;;;;EAiBA,IAAM,IAAS,EAAI,GAAM,EAEnB,EACJ,WACA,UACA,oBACA,WACA,WACA,kBACA,uBACA,WACA,YACA,iBACE,GAAS,EAEP,IAAiB,EAAgB,EAAgB,EAEjD,IAAc,QAAe,EAAO,OAAO,YAAY,EAEvD,IAAiB,QAAe;AACpC,OAAI,CAAC,EAAO,MAAO;GAEnB,IAAM,IAAI,IAAI,IAAI,2CAA2C,EAAO,MAAM,aAAa;AAMvF,UAJI,EAAc,SAChB,EAAE,aAAa,IAAI,SAAS,EAAc,MAAM,EAG3C,EAAE,UAAU;IACnB,EAEI,IAAU,QACT,EAAO,QAEL,CACL;GACE,OAAO,EAAO,MAAM;GACpB,OAAO,EAAO,MAAM;GACrB,CACF,GAPyB,EAAE,CAQ5B,EAEI,IAAa,QAAe;AAChC,WAAQ,EAAO,OAAf;IACE,KAAK,SACH,QAAO;IACT,KAAK,kBACH,QAAO;IACT,KAAK,mBACH,QAAO;IACT,KAAK,gBACH,QAAO;IACT,KAAK,WACH,QAAO;IACT,QACE,QAAO;;IAEX,EAEI,IAAU,QACV,EAAO,QAAc,oBAClB,mBACP;qCAIoB,EAAA,EAAe,IAAA,GAAA,EAAnC,EAsCe,EAAA,EAAA,EAAA;;eAtC+B,EAAA;4CAAM,QAAA;;GACvC,OAAK,QAGR,CAAA,GAAA,AAAA,EAAA,OAAA,CAFN,EAEM,OAAA,EAFD,OAAM,2BAAyB,EAAA,CAClC,EAAyB,QAAA,MAAnB,eAAY,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA;oBAG+D;IAArF,EAAqF,EAAA,EAAA,EAAA;KAAzE,OAAM;KAAU,UAAA;KAAU,eAAa,EAAA;KAAc,SAAS,EAAA;;IAC1E,EAUY,GAAA;KAVA,WAAS,EAAA,EAAM;KAAG,cAAY,EAAA,EAAS;KAAG,eAAa,EAAA;;sBAS/D,CARF,EAQE,EAAA,EAAA,EAAA;MAPA,OAAM;MACN,OAAA;MACA,MAAK;MACL,OAAA,EAAA,eAAA,QAAyB;MACzB,MAAK;MACJ,SAAS,EAAA,EAAS;MAClB,SAAO,EAAA,EAAO;;;;;;;;IAGJ,EAAA,EAAK,IAAA,GAAA,EAApB,EAEU,EAAA,EAAA,EAAA;;KAFY,MAAK;;sBACd,CAAA,EAAA,EAAR,EAAA,EAAK,CAAA,EAAA,EAAA,CAAA,CAAA;;;IAGF,EAAA,SAAA,GAAA,EADR,EAIE,GAAA;;KAFC,OAAO,EAAA,EAAa;KACpB,oBAAkB,EAAA;;IAEF,EAAA,EAAkB,IAAA,GAAA,EAArC,EAA6E,GAAA;;KAArC,iBAAe,EAAA,EAAkB;;IACzD,EAAA,EAAM,IAAA,EAAA,GAAA,EACpB,EAQE,GAAA,EAAA,KAAA,GAAA,EAAA,EAPgB,EAAA,EAAM,GAAf,YADT,EAQE,GAAA;KANC,KAAK,EAAM;KACX,MAAM,EAAM;KACZ,OAAO,EAAM;KACb,MAAM,EAAM;KACZ,YAAU,EAAM;KAChB,WAAW,EAAM;;;;;;;;;;sCAKR,EAAA,EAAe,IAAI,EAAA,EAAc,IAAA,GAAA,EAAjD,EAOW,GAAA;;GAPyC,IAAI,EAAA,EAAc;MACpE,EAKa,EAAA,EAAA,EAAA,EALA,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAM,IAAA,CAAA,OAAA,CAAA,EAAA,EAAA;GAElB,QAAM,QACa,CAA5B,EAA4B,EAAA,EAAA,EAAA,EAAjB,MAAM,EAAA,OAAO,EAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,CAAA;oBAD1B,CAAA,AAAA,EAAA,OAAA,EAFsC,kBAEtC,GAAA,CAAA,CAAA"}
@@ -2,6 +2,7 @@ import e from "../../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./RunStatus.vue2.js";
3
3
  import n from "./RunStatus.style.js";
4
4
  var r = /* @__PURE__ */ e(t, [["__cssModules", { $style: n }]]);
5
+ //#endregion
5
6
  export { r as default };
6
7
 
7
8
  //# sourceMappingURL=RunStatus.js.map
@@ -8,6 +8,7 @@ import './RunStatus.vue.css';var e = {
8
8
  "pulse-glob": "_pulse-glob_13j78_1",
9
9
  dot: "_dot_13j78_56"
10
10
  };
11
+ //#endregion
11
12
  export { e as default };
12
13
 
13
14
  //# sourceMappingURL=RunStatus.style.js.map
@@ -1,4 +1,5 @@
1
1
  import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeClass as a, openBlock as o, renderSlot as s, toDisplayString as c } from "vue";
2
+ //#region src/plugins/Monetization/RunStatus.vue?vue&type=script&setup=true&lang.ts
2
3
  var l = /* @__PURE__ */ i({
3
4
  __name: "RunStatus",
4
5
  props: {
@@ -17,6 +18,7 @@ var l = /* @__PURE__ */ i({
17
18
  }, c(i.statusText), 3)) : t("", !0)]));
18
19
  }
19
20
  });
21
+ //#endregion
20
22
  export { l as default };
21
23
 
22
24
  //# sourceMappingURL=RunStatus.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunStatus.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/RunStatus.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n canRun: boolean | undefined;\n statusText: string | undefined;\n isLoading?: boolean;\n}>();\n\nconst badgeText = computed(() => {\n if (props.isLoading) {\n return \"Updating...\";\n }\n\n if (props.canRun) {\n return \"Ready to run\";\n }\n\n return \"Cannot run\";\n});\n</script>\n\n<template>\n <div>\n <div :class=\"[{ [$style['can-run']]: canRun, [$style.loading]: isLoading }, $style.container]\">\n <div :class=\"$style.badge\">\n <i :class=\"$style.blob\">\n <span>\n <span :class=\"$style.dot\" />\n </span>\n </i>\n <span>{{ badgeText }}</span>\n </div>\n <slot />\n </div>\n <div v-if=\"statusText\" :class=\"$style.statusText\">{{ statusText }}</div>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n align-items: center;\n gap: 8px;\n --blob-color: #ff5c5c;\n --badge-background: rgba(255, 92, 92, 0.12);\n\n &.can-run {\n --blob-color: #49cc49;\n --badge-background: rgba(99, 224, 36, 0.12);\n }\n\n &.loading {\n --blob-color: #ffad0a;\n --badge-background: rgba(255, 173, 10, 0.12);\n }\n}\n\n.statusText {\n margin-top: 6px;\n color: var(--txt-error);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.badge {\n display: flex;\n gap: 6px;\n height: 40px;\n padding: 6px 16px 6px 8px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--badge-background);\n background: var(--badge-background);\n}\n\n.blob {\n width: 24px;\n height: 24px;\n display: flex;\n place-items: center;\n place-content: center;\n\n > span {\n display: flex;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n place-content: center;\n place-items: center;\n background-color: rgb(from var(--blob-color) r g b / 0.24);\n }\n\n .dot {\n border-radius: 50%;\n height: 8px;\n width: 8px;\n transform: scale(1);\n\n background: var(--blob-color);\n box-shadow: 0 0 0 0 var(--blob-color);\n animation: pulse-glob 1s infinite;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;EAGA,IAAM,IAAQ,GAMR,IAAY,QACZ,EAAM,YACD,gBAGL,EAAM,SACD,iBAGF,aACP;yBAIA,EAaM,OAAA,MAAA,CAZJ,EAUM,OAAA,EAVA,OAAK,EAAA,CAAA;IAAMA,EAAAA,OAAM,aAAc,EAAA;IAASA,EAAAA,OAAO,UAAU,EAAA;GAAS,EAAIA,EAAAA,OAAO,UAAS,CAAA,EAAA,EAAA,CAC1F,EAOM,OAAA,EAPA,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAA,CACvB,EAII,KAAA,EAJA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACpB,EAEO,QAAA,MAAA,CADL,EAA4B,QAAA,EAArB,OAAK,EAAEA,EAAAA,OAAO,IAAG,EAAA,EAAA,MAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAG5B,EAA4B,QAAA,MAAA,EAAnB,EAAA,MAAS,EAAA,EAAA,CAAA,EAAA,EAAA,EAEpB,EAAQ,EAAA,QAAA,UAAA,CAAA,EAAA,EAAA,EAEC,EAAA,cAAA,GAAA,EAAX,EAAwE,OAAA;;GAAhD,OAAK,EAAEA,EAAAA,OAAO,WAAU;OAAK,EAAA,WAAU,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"RunStatus.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/RunStatus.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n canRun: boolean | undefined;\n statusText: string | undefined;\n isLoading?: boolean;\n}>();\n\nconst badgeText = computed(() => {\n if (props.isLoading) {\n return \"Updating...\";\n }\n\n if (props.canRun) {\n return \"Ready to run\";\n }\n\n return \"Cannot run\";\n});\n</script>\n\n<template>\n <div>\n <div :class=\"[{ [$style['can-run']]: canRun, [$style.loading]: isLoading }, $style.container]\">\n <div :class=\"$style.badge\">\n <i :class=\"$style.blob\">\n <span>\n <span :class=\"$style.dot\" />\n </span>\n </i>\n <span>{{ badgeText }}</span>\n </div>\n <slot />\n </div>\n <div v-if=\"statusText\" :class=\"$style.statusText\">{{ statusText }}</div>\n </div>\n</template>\n\n<style module>\n.container {\n display: flex;\n align-items: center;\n gap: 8px;\n --blob-color: #ff5c5c;\n --badge-background: rgba(255, 92, 92, 0.12);\n\n &.can-run {\n --blob-color: #49cc49;\n --badge-background: rgba(99, 224, 36, 0.12);\n }\n\n &.loading {\n --blob-color: #ffad0a;\n --badge-background: rgba(255, 173, 10, 0.12);\n }\n}\n\n.statusText {\n margin-top: 6px;\n color: var(--txt-error);\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.badge {\n display: flex;\n gap: 6px;\n height: 40px;\n padding: 6px 16px 6px 8px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--badge-background);\n background: var(--badge-background);\n}\n\n.blob {\n width: 24px;\n height: 24px;\n display: flex;\n place-items: center;\n place-content: center;\n\n > span {\n display: flex;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n place-content: center;\n place-items: center;\n background-color: rgb(from var(--blob-color) r g b / 0.24);\n }\n\n .dot {\n border-radius: 50%;\n height: 8px;\n width: 8px;\n transform: scale(1);\n\n background: var(--blob-color);\n box-shadow: 0 0 0 0 var(--blob-color);\n animation: pulse-glob 1s infinite;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;EAGA,IAAM,IAAQ,GAMR,IAAY,QACZ,EAAM,YACD,gBAGL,EAAM,SACD,iBAGF,aACP;yBAIA,EAaM,OAAA,MAAA,CAZJ,EAUM,OAAA,EAVA,OAAK,EAAA,CAAA;IAAMA,EAAAA,OAAM,aAAc,EAAA;IAASA,EAAAA,OAAO,UAAU,EAAA;GAAS,EAAIA,EAAAA,OAAO,UAAS,CAAA,EAAA,EAAA,CAC1F,EAOM,OAAA,EAPA,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAA,CACvB,EAII,KAAA,EAJA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACpB,EAEO,QAAA,MAAA,CADL,EAA4B,QAAA,EAArB,OAAK,EAAEA,EAAAA,OAAO,IAAG,EAAA,EAAA,MAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAG5B,EAA4B,QAAA,MAAA,EAAnB,EAAA,MAAS,EAAA,EAAA,CAAA,EAAA,EAAA,EAEpB,EAAQ,EAAA,QAAA,UAAA,CAAA,EAAA,EAAA,EAEC,EAAA,cAAA,GAAA,EAAX,EAAwE,OAAA;;GAAhD,OAAK,EAAEA,EAAAA,OAAO,WAAU;OAAK,EAAA,WAAU,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA,CAAA,CAAA"}
@@ -2,6 +2,7 @@ import e from "../../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./UserCabinetCard.vue2.js";
3
3
  import n from "./UserCabinetCard.style.js";
4
4
  var r = /* @__PURE__ */ e(t, [["__cssModules", { $style: n }]]);
5
+ //#endregion
5
6
  export { r as default };
6
7
 
7
8
  //# sourceMappingURL=UserCabinetCard.js.map
@@ -7,6 +7,7 @@ import './UserCabinetCard.vue.css';var e = {
7
7
  urlActions: "_urlActions_19ht8_45",
8
8
  urlDisplay: "_urlDisplay_19ht8_52"
9
9
  };
10
+ //#endregion
10
11
  export { e as default };
11
12
 
12
13
  //# sourceMappingURL=UserCabinetCard.style.js.map
@@ -1,5 +1,6 @@
1
1
  import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, createTextVNode as i, createVNode as a, defineComponent as o, normalizeClass as s, openBlock as c, ref as l, toDisplayString as u, unref as d, withCtx as f } from "vue";
2
2
  import { PlMaskIcon24 as p, PlTooltip as m } from "@milaboratories/uikit";
3
+ //#region src/plugins/Monetization/UserCabinetCard.vue?vue&type=script&setup=true&lang.ts
3
4
  var h = ["title"], g = /* @__PURE__ */ o({
4
5
  __name: "UserCabinetCard",
5
6
  props: {
@@ -46,6 +47,7 @@ var h = ["title"], g = /* @__PURE__ */ o({
46
47
  ], 2)) : t("", !0), r("div", { class: s(e.$style.hint) }, "* Copy and paste the link into your browser", 2)]));
47
48
  }
48
49
  });
50
+ //#endregion
49
51
  export { g as default };
50
52
 
51
53
  //# sourceMappingURL=UserCabinetCard.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCabinetCard.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/UserCabinetCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from \"vue\";\nimport { PlTooltip, PlMaskIcon24 } from \"@milaboratories/uikit\";\n\nconst props = defineProps<{\n userCabinetUrl: string;\n email?: string;\n}>();\n\nconst copiedMessage = ref(\"\");\n\nconst iconName = computed(() => (copiedMessage.value ? \"clipboard-copied\" : \"clipboard\"));\n\nconst copyToClipboard = () => {\n if (props.userCabinetUrl) {\n navigator.clipboard\n .writeText(props.userCabinetUrl)\n .then(() => {\n copiedMessage.value = \"URL copied!\";\n setTimeout(() => {\n copiedMessage.value = \"\";\n }, 2000);\n })\n .catch((err) => {\n console.error(\"Failed to copy text: \", err);\n copiedMessage.value = \"Copy failed\";\n setTimeout(() => {\n copiedMessage.value = \"\";\n }, 2000);\n });\n }\n};\n</script>\n\n<template>\n <div>\n <div v-if=\"userCabinetUrl\" :class=\"$style.urlSection\">\n <div :class=\"$style.urlLabel\">Scientist cabinet URL:</div>\n <div :class=\"$style.urlActions\">\n <div :class=\"$style.urlDisplay\" :title=\"userCabinetUrl\">{{ userCabinetUrl }}</div>\n <PlTooltip :close-delay=\"800\" position=\"top\">\n <PlMaskIcon24\n :class=\"$style.copyIcon\"\n title=\"Copy content\"\n :name=\"iconName\"\n @click=\"copyToClipboard\"\n />\n <template #tooltip>{{ copiedMessage ? copiedMessage : \"Copy\" }}</template>\n </PlTooltip>\n </div>\n <div v-if=\"email\" :class=\"$style.email\">\n <span>License owner:</span>\n <span>{{ email }}</span>\n </div>\n </div>\n <div :class=\"$style.hint\">* Copy and paste the link into your browser</div>\n </div>\n</template>\n\n<style module>\n.hint {\n margin-top: 6px;\n color: var(--txt-03);\n font-size: 12px;\n font-weight: 500;\n line-height: 16px;\n}\n\n.email {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n color: var(--txt-03);\n\n > span:last-child {\n max-width: 200px;\n text-overflow: ellipsis;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n }\n}\n\n.copyIcon {\n cursor: pointer;\n}\n\n.urlSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background-color: #f7f8fa;\n border-radius: 6px;\n border: 1px solid #e1e3eb;\n}\n\n.urlLabel {\n font-weight: 500;\n color: #555;\n}\n\n.urlActions {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: nowrap;\n}\n\n.urlDisplay {\n font-family: monospace;\n font-size: 14px;\n color: #0066cc;\n padding: 6px 10px 6px 0;\n border-radius: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 300px;\n}\n</style>\n"],"mappings":";;;;;;;;;EAIA,IAAM,IAAQ,GAKR,IAAgB,EAAI,GAAG,EAEvB,IAAW,QAAgB,EAAc,QAAQ,qBAAqB,YAAa,EAEnF,UAAwB;AAC5B,GAAI,EAAM,kBACR,UAAU,UACP,UAAU,EAAM,eAAc,CAC9B,WAAW;AAEV,IADA,EAAc,QAAQ,eACtB,iBAAiB;AACf,OAAc,QAAQ;OACrB,IAAK;KACT,CACA,OAAO,MAAQ;AAGd,IAFA,QAAQ,MAAM,yBAAyB,EAAI,EAC3C,EAAc,QAAQ,eACtB,iBAAiB;AACf,OAAc,QAAQ;OACrB,IAAK;KACR;;yBAMN,EAqBM,OAAA,MAAA,CApBO,EAAA,kBAAA,GAAA,EAAX,EAkBM,OAAA;;GAlBsB,OAAK,EAAEA,EAAAA,OAAO,WAAU;;GAClD,EAA0D,OAAA,EAApD,OAAK,EAAEA,EAAAA,OAAO,SAAQ,EAAA,EAAE,0BAAsB,EAAA;GACpD,EAWM,OAAA,EAXA,OAAK,EAAEA,EAAAA,OAAO,WAAU,EAAA,EAAA,CAC5B,EAAkF,OAAA;IAA5E,OAAK,EAAEA,EAAAA,OAAO,WAAU;IAAG,OAAO,EAAA;QAAmB,EAAA,eAAc,EAAA,IAAA,EAAA,EACzE,EAQY,EAAA,EAAA,EAAA;IARA,eAAa;IAAK,UAAS;;IAO1B,SAAO,QAA6C,CAAA,EAAA,EAAzC,EAAA,QAAgB,EAAA,QAAa,OAAA,EAAA,EAAA,CAAA,CAAA;qBADjD,CALF,EAKE,EAAA,EAAA,EAAA;KAJC,OAAK,EAAEA,EAAAA,OAAO,SAAQ;KACvB,OAAM;KACL,MAAM,EAAA;KACN,SAAO;;;;GAKH,EAAA,SAAA,GAAA,EAAX,EAGM,OAAA;;IAHa,OAAK,EAAEA,EAAAA,OAAO,MAAK;gBACpC,EAA2B,QAAA,MAArB,kBAAc,GAAA,EACpB,EAAwB,QAAA,MAAA,EAAf,EAAA,MAAK,EAAA,EAAA,CAAA,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA;sBAGlB,EAA2E,OAAA,EAArE,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAE,+CAA2C,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"UserCabinetCard.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/plugins/Monetization/UserCabinetCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from \"vue\";\nimport { PlTooltip, PlMaskIcon24 } from \"@milaboratories/uikit\";\n\nconst props = defineProps<{\n userCabinetUrl: string;\n email?: string;\n}>();\n\nconst copiedMessage = ref(\"\");\n\nconst iconName = computed(() => (copiedMessage.value ? \"clipboard-copied\" : \"clipboard\"));\n\nconst copyToClipboard = () => {\n if (props.userCabinetUrl) {\n navigator.clipboard\n .writeText(props.userCabinetUrl)\n .then(() => {\n copiedMessage.value = \"URL copied!\";\n setTimeout(() => {\n copiedMessage.value = \"\";\n }, 2000);\n })\n .catch((err) => {\n console.error(\"Failed to copy text: \", err);\n copiedMessage.value = \"Copy failed\";\n setTimeout(() => {\n copiedMessage.value = \"\";\n }, 2000);\n });\n }\n};\n</script>\n\n<template>\n <div>\n <div v-if=\"userCabinetUrl\" :class=\"$style.urlSection\">\n <div :class=\"$style.urlLabel\">Scientist cabinet URL:</div>\n <div :class=\"$style.urlActions\">\n <div :class=\"$style.urlDisplay\" :title=\"userCabinetUrl\">{{ userCabinetUrl }}</div>\n <PlTooltip :close-delay=\"800\" position=\"top\">\n <PlMaskIcon24\n :class=\"$style.copyIcon\"\n title=\"Copy content\"\n :name=\"iconName\"\n @click=\"copyToClipboard\"\n />\n <template #tooltip>{{ copiedMessage ? copiedMessage : \"Copy\" }}</template>\n </PlTooltip>\n </div>\n <div v-if=\"email\" :class=\"$style.email\">\n <span>License owner:</span>\n <span>{{ email }}</span>\n </div>\n </div>\n <div :class=\"$style.hint\">* Copy and paste the link into your browser</div>\n </div>\n</template>\n\n<style module>\n.hint {\n margin-top: 6px;\n color: var(--txt-03);\n font-size: 12px;\n font-weight: 500;\n line-height: 16px;\n}\n\n.email {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n color: var(--txt-03);\n\n > span:last-child {\n max-width: 200px;\n text-overflow: ellipsis;\n display: block;\n white-space: nowrap;\n overflow: hidden;\n }\n}\n\n.copyIcon {\n cursor: pointer;\n}\n\n.urlSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background-color: #f7f8fa;\n border-radius: 6px;\n border: 1px solid #e1e3eb;\n}\n\n.urlLabel {\n font-weight: 500;\n color: #555;\n}\n\n.urlActions {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: nowrap;\n}\n\n.urlDisplay {\n font-family: monospace;\n font-size: 14px;\n color: #0066cc;\n padding: 6px 10px 6px 0;\n border-radius: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 300px;\n}\n</style>\n"],"mappings":";;;;;;;;;;EAIA,IAAM,IAAQ,GAKR,IAAgB,EAAI,GAAG,EAEvB,IAAW,QAAgB,EAAc,QAAQ,qBAAqB,YAAa,EAEnF,UAAwB;AAC5B,GAAI,EAAM,kBACR,UAAU,UACP,UAAU,EAAM,eAAc,CAC9B,WAAW;AAEV,IADA,EAAc,QAAQ,eACtB,iBAAiB;AACf,OAAc,QAAQ;OACrB,IAAK;KACT,CACA,OAAO,MAAQ;AAGd,IAFA,QAAQ,MAAM,yBAAyB,EAAI,EAC3C,EAAc,QAAQ,eACtB,iBAAiB;AACf,OAAc,QAAQ;OACrB,IAAK;KACR;;yBAMN,EAqBM,OAAA,MAAA,CApBO,EAAA,kBAAA,GAAA,EAAX,EAkBM,OAAA;;GAlBsB,OAAK,EAAEA,EAAAA,OAAO,WAAU;;GAClD,EAA0D,OAAA,EAApD,OAAK,EAAEA,EAAAA,OAAO,SAAQ,EAAA,EAAE,0BAAsB,EAAA;GACpD,EAWM,OAAA,EAXA,OAAK,EAAEA,EAAAA,OAAO,WAAU,EAAA,EAAA,CAC5B,EAAkF,OAAA;IAA5E,OAAK,EAAEA,EAAAA,OAAO,WAAU;IAAG,OAAO,EAAA;QAAmB,EAAA,eAAc,EAAA,IAAA,EAAA,EACzE,EAQY,EAAA,EAAA,EAAA;IARA,eAAa;IAAK,UAAS;;IAO1B,SAAO,QAA6C,CAAA,EAAA,EAAzC,EAAA,QAAgB,EAAA,QAAa,OAAA,EAAA,EAAA,CAAA,CAAA;qBADjD,CALF,EAKE,EAAA,EAAA,EAAA;KAJC,OAAK,EAAEA,EAAAA,OAAO,SAAQ;KACvB,OAAM;KACL,MAAM,EAAA;KACN,SAAO;;;;GAKH,EAAA,SAAA,GAAA,EAAX,EAGM,OAAA;;IAHa,OAAK,EAAEA,EAAAA,OAAO,MAAK;gBACpC,EAA2B,QAAA,MAArB,kBAAc,GAAA,EACpB,EAAwB,QAAA,MAAA,EAAf,EAAA,MAAK,EAAA,EAAA,CAAA,EAAA,EAAA,IAAA,EAAA,IAAA,GAAA;sBAGlB,EAA2E,OAAA,EAArE,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAE,+CAA2C,EAAA,CAAA,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { nextTick as e, onMounted as t, onUpdated as n, ref as r } from "vue";
2
+ //#region src/plugins/Monetization/useButtonTarget.ts
2
3
  function i(i) {
3
4
  let a = r(), o = ".pl-block-page__title__append", s = () => {
4
5
  e(() => {
@@ -11,6 +12,7 @@ function i(i) {
11
12
  };
12
13
  return t(s), n(s), a;
13
14
  }
15
+ //#endregion
14
16
  export { i as useButtonTarget };
15
17
 
16
18
  //# sourceMappingURL=useButtonTarget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useButtonTarget.js","names":[],"sources":["../../../src/plugins/Monetization/useButtonTarget.ts"],"sourcesContent":["import type { Ref } from \"vue\";\nimport { ref, nextTick, onMounted, onUpdated } from \"vue\";\n\nexport function useButtonTarget(hasMonetization: Ref<boolean>) {\n const target = ref<string>();\n\n const selector = \".pl-block-page__title__append\";\n\n const check = () => {\n nextTick(() => {\n if (!hasMonetization.value) {\n target.value = undefined;\n return;\n }\n\n target.value = document.querySelector(selector) ? selector : undefined;\n if (!target.value) {\n console.error(`[Monetization] use #title slot to place monetization button`);\n }\n });\n };\n\n onMounted(check);\n onUpdated(check);\n\n return target;\n}\n"],"mappings":";AAGA,SAAgB,EAAgB,GAA+B;CAC7D,IAAM,IAAS,GAAa,EAEtB,IAAW,iCAEX,UAAc;AAClB,UAAe;AACb,OAAI,CAAC,EAAgB,OAAO;AAC1B,MAAO,QAAQ,KAAA;AACf;;AAIF,GADA,EAAO,QAAQ,SAAS,cAAc,EAAS,GAAG,IAAW,KAAA,GACxD,EAAO,SACV,QAAQ,MAAM,8DAA8D;IAE9E;;AAMJ,QAHA,EAAU,EAAM,EAChB,EAAU,EAAM,EAET"}
1
+ {"version":3,"file":"useButtonTarget.js","names":[],"sources":["../../../src/plugins/Monetization/useButtonTarget.ts"],"sourcesContent":["import type { Ref } from \"vue\";\nimport { ref, nextTick, onMounted, onUpdated } from \"vue\";\n\nexport function useButtonTarget(hasMonetization: Ref<boolean>) {\n const target = ref<string>();\n\n const selector = \".pl-block-page__title__append\";\n\n const check = () => {\n nextTick(() => {\n if (!hasMonetization.value) {\n target.value = undefined;\n return;\n }\n\n target.value = document.querySelector(selector) ? selector : undefined;\n if (!target.value) {\n console.error(`[Monetization] use #title slot to place monetization button`);\n }\n });\n };\n\n onMounted(check);\n onUpdated(check);\n\n return target;\n}\n"],"mappings":";;AAGA,SAAgB,EAAgB,GAA+B;CAC7D,IAAM,IAAS,GAAa,EAEtB,IAAW,iCAEX,UAAc;AAClB,UAAe;AACb,OAAI,CAAC,EAAgB,OAAO;AAC1B,MAAO,QAAQ,KAAA;AACf;;AAIF,GADA,EAAO,QAAQ,SAAS,cAAc,EAAS,GAAG,IAAW,KAAA,GACxD,EAAO,SACV,QAAQ,MAAM,8DAA8D;IAE9E;;AAMJ,QAHA,EAAU,EAAM,EAChB,EAAU,EAAM,EAET"}
@@ -2,6 +2,7 @@ import { useSdkPlugin as e } from "../../defineApp.js";
2
2
  import { Response as t } from "./validation.js";
3
3
  import { computed as n, ref as r, watch as i } from "vue";
4
4
  import { useIntervalFn as a } from "@vueuse/core";
5
+ //#region src/plugins/Monetization/useInfo.ts
5
6
  function o() {
6
7
  let o = e(), s = n(() => o.loaded ? o.useApp() : void 0), c = (e) => e ? "data" in e ? e.data : "args" in e ? e.args : {} : {}, l = n(() => c(s.value?.model)), u = n(() => l.value && "__mnzDate" in l.value), d = n(() => t.safeParse(s.value?.model.outputs.__mnzInfo)), f = n(() => d.value?.data), p = n(() => d.value?.error ?? m.value?.response?.error), m = r(void 0), h = r(!1), g = r(0);
7
8
  i([f], ([e]) => {
@@ -32,6 +33,7 @@ function o() {
32
33
  isLoading: h
33
34
  };
34
35
  }
36
+ //#endregion
35
37
  export { o as useInfo };
36
38
 
37
39
  //# sourceMappingURL=useInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useInfo.js","names":[],"sources":["../../../src/plugins/Monetization/useInfo.ts"],"sourcesContent":["import { computed, watch, ref } from \"vue\";\nimport { useSdkPlugin } from \"../../defineApp\";\nimport { Response } from \"./validation\";\nimport { useIntervalFn } from \"@vueuse/core\";\n\nexport function useInfo() {\n const sdk = useSdkPlugin();\n\n const app = computed(() => (sdk.loaded ? sdk.useApp() : undefined));\n\n // TODO use a separate plugin state when it's implemented\n const getModelArgsOrState = (model: Record<string, unknown> | undefined) => {\n if (!model) return {};\n if (\"data\" in model) {\n return model.data as Record<string, unknown>;\n } else if (\"args\" in model) {\n return model.args as Record<string, unknown>;\n }\n return {};\n };\n\n const inputData = computed(() => getModelArgsOrState(app.value?.model));\n\n const hasMonetization = computed(() => {\n return inputData.value && \"__mnzDate\" in inputData.value;\n });\n\n const parsed = computed(() => Response.safeParse(app.value?.model.outputs[\"__mnzInfo\"]));\n\n const currentInfo = computed<Response | undefined>(() => parsed.value?.data);\n\n const error = computed(() => parsed.value?.error ?? info.value?.response?.error);\n\n const info = ref<Response | undefined>(undefined);\n\n const isLoading = ref(false);\n\n const version = ref(0);\n\n watch(\n [currentInfo],\n ([i]) => {\n if (i) {\n info.value = i;\n const v = ++version.value;\n setTimeout(() => {\n if (version.value === v) {\n isLoading.value = false;\n }\n }, 1000);\n }\n },\n { immediate: true },\n );\n\n const result = computed(() => info.value?.response?.result);\n\n const canRun = computed(() => !!result.value?.canRun);\n\n const status = computed(() => (currentInfo.value ? result.value?.status : \"\"));\n\n const customerEmail = computed(() => result.value?.customerEmail);\n\n const endOfBillingPeriod = computed(() => result.value?.mnz.endOfBillingPeriod);\n\n const limits = computed(() => result.value?.mnz.limits);\n\n const refresh = () => {\n isLoading.value = true;\n inputData.value[\"__mnzDate\"] = new Date().toISOString();\n };\n\n watch(canRun, (v) => {\n if (hasMonetization.value) {\n (inputData.value as Record<string, unknown>)[\"__mnzCanRun\"] = v;\n }\n });\n\n if (hasMonetization.value) {\n useIntervalFn(refresh, 60_000); // 1 minute\n }\n\n return {\n hasMonetization,\n result,\n error,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n version,\n isLoading,\n };\n}\n"],"mappings":";;;;AAKA,SAAgB,IAAU;CACxB,IAAM,IAAM,GAAc,EAEpB,IAAM,QAAgB,EAAI,SAAS,EAAI,QAAQ,GAAG,KAAA,EAAW,EAG7D,KAAuB,MACtB,IACD,UAAU,IACL,EAAM,OACJ,UAAU,IACZ,EAAM,OAER,EAAE,GANU,EAAE,EASjB,IAAY,QAAe,EAAoB,EAAI,OAAO,MAAM,CAAC,EAEjE,IAAkB,QACf,EAAU,SAAS,eAAe,EAAU,MACnD,EAEI,IAAS,QAAe,EAAS,UAAU,EAAI,OAAO,MAAM,QAAQ,UAAa,CAAC,EAElF,IAAc,QAAqC,EAAO,OAAO,KAAK,EAEtE,IAAQ,QAAe,EAAO,OAAO,SAAS,EAAK,OAAO,UAAU,MAAM,EAE1E,IAAO,EAA0B,KAAA,EAAU,EAE3C,IAAY,EAAI,GAAM,EAEtB,IAAU,EAAI,EAAE;AAEtB,GACE,CAAC,EAAY,GACZ,CAAC,OAAO;AACP,MAAI,GAAG;AACL,KAAK,QAAQ;GACb,IAAM,IAAI,EAAE,EAAQ;AACpB,oBAAiB;AACf,IAAI,EAAQ,UAAU,MACpB,EAAU,QAAQ;MAEnB,IAAK;;IAGZ,EAAE,WAAW,IAAM,CACpB;CAED,IAAM,IAAS,QAAe,EAAK,OAAO,UAAU,OAAO,EAErD,IAAS,QAAe,CAAC,CAAC,EAAO,OAAO,OAAO,EAE/C,IAAS,QAAgB,EAAY,QAAQ,EAAO,OAAO,SAAS,GAAI,EAExE,IAAgB,QAAe,EAAO,OAAO,cAAc,EAE3D,IAAqB,QAAe,EAAO,OAAO,IAAI,mBAAmB,EAEzE,IAAS,QAAe,EAAO,OAAO,IAAI,OAAO,EAEjD,UAAgB;AAEpB,EADA,EAAU,QAAQ,IAClB,EAAU,MAAM,6BAAe,IAAI,MAAM,EAAC,aAAa;;AAazD,QAVA,EAAM,IAAS,MAAM;AACnB,EAAI,EAAgB,UACjB,EAAU,MAAkC,cAAiB;GAEhE,EAEE,EAAgB,SAClB,EAAc,GAAS,IAAO,EAGzB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"useInfo.js","names":[],"sources":["../../../src/plugins/Monetization/useInfo.ts"],"sourcesContent":["import { computed, watch, ref } from \"vue\";\nimport { useSdkPlugin } from \"../../defineApp\";\nimport { Response } from \"./validation\";\nimport { useIntervalFn } from \"@vueuse/core\";\n\nexport function useInfo() {\n const sdk = useSdkPlugin();\n\n const app = computed(() => (sdk.loaded ? sdk.useApp() : undefined));\n\n // TODO use a separate plugin state when it's implemented\n const getModelArgsOrState = (model: Record<string, unknown> | undefined) => {\n if (!model) return {};\n if (\"data\" in model) {\n return model.data as Record<string, unknown>;\n } else if (\"args\" in model) {\n return model.args as Record<string, unknown>;\n }\n return {};\n };\n\n const inputData = computed(() => getModelArgsOrState(app.value?.model));\n\n const hasMonetization = computed(() => {\n return inputData.value && \"__mnzDate\" in inputData.value;\n });\n\n const parsed = computed(() => Response.safeParse(app.value?.model.outputs[\"__mnzInfo\"]));\n\n const currentInfo = computed<Response | undefined>(() => parsed.value?.data);\n\n const error = computed(() => parsed.value?.error ?? info.value?.response?.error);\n\n const info = ref<Response | undefined>(undefined);\n\n const isLoading = ref(false);\n\n const version = ref(0);\n\n watch(\n [currentInfo],\n ([i]) => {\n if (i) {\n info.value = i;\n const v = ++version.value;\n setTimeout(() => {\n if (version.value === v) {\n isLoading.value = false;\n }\n }, 1000);\n }\n },\n { immediate: true },\n );\n\n const result = computed(() => info.value?.response?.result);\n\n const canRun = computed(() => !!result.value?.canRun);\n\n const status = computed(() => (currentInfo.value ? result.value?.status : \"\"));\n\n const customerEmail = computed(() => result.value?.customerEmail);\n\n const endOfBillingPeriod = computed(() => result.value?.mnz.endOfBillingPeriod);\n\n const limits = computed(() => result.value?.mnz.limits);\n\n const refresh = () => {\n isLoading.value = true;\n inputData.value[\"__mnzDate\"] = new Date().toISOString();\n };\n\n watch(canRun, (v) => {\n if (hasMonetization.value) {\n (inputData.value as Record<string, unknown>)[\"__mnzCanRun\"] = v;\n }\n });\n\n if (hasMonetization.value) {\n useIntervalFn(refresh, 60_000); // 1 minute\n }\n\n return {\n hasMonetization,\n result,\n error,\n canRun,\n status,\n customerEmail,\n endOfBillingPeriod,\n limits,\n refresh,\n version,\n isLoading,\n };\n}\n"],"mappings":";;;;;AAKA,SAAgB,IAAU;CACxB,IAAM,IAAM,GAAc,EAEpB,IAAM,QAAgB,EAAI,SAAS,EAAI,QAAQ,GAAG,KAAA,EAAW,EAG7D,KAAuB,MACtB,IACD,UAAU,IACL,EAAM,OACJ,UAAU,IACZ,EAAM,OAER,EAAE,GANU,EAAE,EASjB,IAAY,QAAe,EAAoB,EAAI,OAAO,MAAM,CAAC,EAEjE,IAAkB,QACf,EAAU,SAAS,eAAe,EAAU,MACnD,EAEI,IAAS,QAAe,EAAS,UAAU,EAAI,OAAO,MAAM,QAAQ,UAAa,CAAC,EAElF,IAAc,QAAqC,EAAO,OAAO,KAAK,EAEtE,IAAQ,QAAe,EAAO,OAAO,SAAS,EAAK,OAAO,UAAU,MAAM,EAE1E,IAAO,EAA0B,KAAA,EAAU,EAE3C,IAAY,EAAI,GAAM,EAEtB,IAAU,EAAI,EAAE;AAEtB,GACE,CAAC,EAAY,GACZ,CAAC,OAAO;AACP,MAAI,GAAG;AACL,KAAK,QAAQ;GACb,IAAM,IAAI,EAAE,EAAQ;AACpB,oBAAiB;AACf,IAAI,EAAQ,UAAU,MACpB,EAAU,QAAQ;MAEnB,IAAK;;IAGZ,EAAE,WAAW,IAAM,CACpB;CAED,IAAM,IAAS,QAAe,EAAK,OAAO,UAAU,OAAO,EAErD,IAAS,QAAe,CAAC,CAAC,EAAO,OAAO,OAAO,EAE/C,IAAS,QAAgB,EAAY,QAAQ,EAAO,OAAO,SAAS,GAAI,EAExE,IAAgB,QAAe,EAAO,OAAO,cAAc,EAE3D,IAAqB,QAAe,EAAO,OAAO,IAAI,mBAAmB,EAEzE,IAAS,QAAe,EAAO,OAAO,IAAI,OAAO,EAEjD,UAAgB;AAEpB,EADA,EAAU,QAAQ,IAClB,EAAU,MAAM,6BAAe,IAAI,MAAM,EAAC,aAAa;;AAazD,QAVA,EAAM,IAAS,MAAM;AACnB,EAAI,EAAgB,UACjB,EAAU,MAAkC,cAAiB;GAEhE,EAEE,EAAgB,SAClB,EAAc,GAAS,IAAO,EAGzB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
@@ -1,18 +1,17 @@
1
1
  import { z as e } from "zod";
2
+ //#region src/plugins/Monetization/validation.ts
2
3
  var t = e.literal("trial"), n = e.literal("free"), r = e.literal("single_payment"), i = e.literal("subscription"), a = e.union([
3
4
  t,
4
5
  n,
5
6
  r,
6
7
  i,
7
8
  e.literal("base")
8
- ]);
9
- const o = e.object({
9
+ ]), o = e.object({
10
10
  type: e.union([e.literal("unique_launches"), e.literal("volume_limit")]),
11
11
  used: e.number(),
12
12
  toSpend: e.number(),
13
13
  available: e.number().nullable()
14
- });
15
- var s = e.object({
14
+ }), s = e.object({
16
15
  productKey: e.string(),
17
16
  productName: e.string().default("Unknown product"),
18
17
  customerEmail: e.string().optional(),
@@ -30,6 +29,7 @@ var s = e.object({
30
29
  error: e.unknown().optional()
31
30
  }).optional()
32
31
  }).optional();
32
+ //#endregion
33
33
  export { c as Response };
34
34
 
35
35
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":[],"sources":["../../../src/plugins/Monetization/validation.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst MonetizationTrial = z.literal(\"trial\");\nconst MonetizationFree = z.literal(\"free\");\nconst MonetizationSinglePayment = z.literal(\"single_payment\");\nconst MonetizationSubscription = z.literal(\"subscription\");\n\nconst MonetizationType = z.union([\n MonetizationTrial,\n MonetizationFree,\n MonetizationSinglePayment,\n MonetizationSubscription,\n z.literal(\"base\"), // outdated\n]);\n\nexport const Limit = z.object({\n type: z.union([z.literal(\"unique_launches\"), z.literal(\"volume_limit\")]),\n used: z.number(),\n toSpend: z.number(),\n available: z.number().nullable(), // null if unlimited\n});\n\nconst DryRunResult = z.object(\n {\n productKey: z.string(),\n productName: z.string().default(\"Unknown product\"),\n customerEmail: z.string().optional(),\n canRun: z.boolean(),\n status: z.string(), // 'select-tariff', 'active', 'payment_required', 'limits_exceeded', 'inactive', 'unknown',\n mnz: z.object({\n type: MonetizationType.optional(),\n endOfBillingPeriod: z.string().nullable().optional(),\n limits: z.array(Limit).optional(),\n }),\n },\n { message: \"Invalid DryRunResult\" },\n);\n\ntype DryRunResult = z.infer<typeof DryRunResult>;\n\nconst Response = z\n .object({\n httpError: z.string().optional(),\n response: z\n .object({\n result: DryRunResult.optional(),\n error: z.unknown().optional(),\n })\n .optional(),\n })\n .optional();\n\ntype Response = z.infer<typeof Response>;\n\nexport { MonetizationType, DryRunResult, Response };\n"],"mappings":";AAEA,IAAM,IAAoB,EAAE,QAAQ,QAAQ,EACtC,IAAmB,EAAE,QAAQ,OAAO,EACpC,IAA4B,EAAE,QAAQ,iBAAiB,EACvD,IAA2B,EAAE,QAAQ,eAAe,EAEpD,IAAmB,EAAE,MAAM;CAC/B;CACA;CACA;CACA;CACA,EAAE,QAAQ,OAAO;CAClB,CAAC;AAEF,MAAa,IAAQ,EAAE,OAAO;CAC5B,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,eAAe,CAAC,CAAC;CACxE,MAAM,EAAE,QAAQ;CAChB,SAAS,EAAE,QAAQ;CACnB,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC;AAEF,IAAM,IAAe,EAAE,OACrB;CACE,YAAY,EAAE,QAAQ;CACtB,aAAa,EAAE,QAAQ,CAAC,QAAQ,kBAAkB;CAClD,eAAe,EAAE,QAAQ,CAAC,UAAU;CACpC,QAAQ,EAAE,SAAS;CACnB,QAAQ,EAAE,QAAQ;CAClB,KAAK,EAAE,OAAO;EACZ,MAAM,EAAiB,UAAU;EACjC,oBAAoB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;EACpD,QAAQ,EAAE,MAAM,EAAM,CAAC,UAAU;EAClC,CAAC;CACH,EACD,EAAE,SAAS,wBAAwB,CACpC,EAIK,IAAW,EACd,OAAO;CACN,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,UAAU,EACP,OAAO;EACN,QAAQ,EAAa,UAAU;EAC/B,OAAO,EAAE,SAAS,CAAC,UAAU;EAC9B,CAAC,CACD,UAAU;CACd,CAAC,CACD,UAAU"}
1
+ {"version":3,"file":"validation.js","names":[],"sources":["../../../src/plugins/Monetization/validation.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst MonetizationTrial = z.literal(\"trial\");\nconst MonetizationFree = z.literal(\"free\");\nconst MonetizationSinglePayment = z.literal(\"single_payment\");\nconst MonetizationSubscription = z.literal(\"subscription\");\n\nconst MonetizationType = z.union([\n MonetizationTrial,\n MonetizationFree,\n MonetizationSinglePayment,\n MonetizationSubscription,\n z.literal(\"base\"), // outdated\n]);\n\nexport const Limit = z.object({\n type: z.union([z.literal(\"unique_launches\"), z.literal(\"volume_limit\")]),\n used: z.number(),\n toSpend: z.number(),\n available: z.number().nullable(), // null if unlimited\n});\n\nconst DryRunResult = z.object(\n {\n productKey: z.string(),\n productName: z.string().default(\"Unknown product\"),\n customerEmail: z.string().optional(),\n canRun: z.boolean(),\n status: z.string(), // 'select-tariff', 'active', 'payment_required', 'limits_exceeded', 'inactive', 'unknown',\n mnz: z.object({\n type: MonetizationType.optional(),\n endOfBillingPeriod: z.string().nullable().optional(),\n limits: z.array(Limit).optional(),\n }),\n },\n { message: \"Invalid DryRunResult\" },\n);\n\ntype DryRunResult = z.infer<typeof DryRunResult>;\n\nconst Response = z\n .object({\n httpError: z.string().optional(),\n response: z\n .object({\n result: DryRunResult.optional(),\n error: z.unknown().optional(),\n })\n .optional(),\n })\n .optional();\n\ntype Response = z.infer<typeof Response>;\n\nexport { MonetizationType, DryRunResult, Response };\n"],"mappings":";;AAEA,IAAM,IAAoB,EAAE,QAAQ,QAAQ,EACtC,IAAmB,EAAE,QAAQ,OAAO,EACpC,IAA4B,EAAE,QAAQ,iBAAiB,EACvD,IAA2B,EAAE,QAAQ,eAAe,EAEpD,IAAmB,EAAE,MAAM;CAC/B;CACA;CACA;CACA;CACA,EAAE,QAAQ,OAAO;CAClB,CAAC,EAEW,IAAQ,EAAE,OAAO;CAC5B,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,eAAe,CAAC,CAAC;CACxE,MAAM,EAAE,QAAQ;CAChB,SAAS,EAAE,QAAQ;CACnB,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC,EAEI,IAAe,EAAE,OACrB;CACE,YAAY,EAAE,QAAQ;CACtB,aAAa,EAAE,QAAQ,CAAC,QAAQ,kBAAkB;CAClD,eAAe,EAAE,QAAQ,CAAC,UAAU;CACpC,QAAQ,EAAE,SAAS;CACnB,QAAQ,EAAE,QAAQ;CAClB,KAAK,EAAE,OAAO;EACZ,MAAM,EAAiB,UAAU;EACjC,oBAAoB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;EACpD,QAAQ,EAAE,MAAM,EAAM,CAAC,UAAU;EAClC,CAAC;CACH,EACD,EAAE,SAAS,wBAAwB,CACpC,EAIK,IAAW,EACd,OAAO;CACN,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,UAAU,EACP,OAAO;EACN,QAAQ,EAAa,UAAU;EAC/B,OAAO,EAAE,SAAS,CAAC,UAAU;EAC9B,CAAC,CACD,UAAU;CACd,CAAC,CACD,UAAU"}
package/dist/urls.js CHANGED
@@ -1,4 +1,6 @@
1
- const e = (e) => Object.fromEntries(new URL(e, "http://dummy").searchParams);
1
+ //#region src/urls.ts
2
+ var e = (e) => Object.fromEntries(new URL(e, "http://dummy").searchParams);
3
+ //#endregion
2
4
  export { e as parseQuery };
3
5
 
4
6
  //# sourceMappingURL=urls.js.map
package/dist/urls.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","names":[],"sources":["../src/urls.ts"],"sourcesContent":["import type { ParseQuery } from \"./types\";\n\nexport const parsePathname = (href: `/${string}`) => {\n try {\n return new URL(href, \"http://dummy\").pathname as `/${string}`;\n } catch {\n console.error(\"Invalid href\", href);\n return undefined;\n }\n};\n\nexport const parseQuery = <Href extends `/${string}`>(href: Href) => {\n return Object.fromEntries(new URL(href, \"http://dummy\").searchParams) as ParseQuery<Href>;\n};\n"],"mappings":"AAWA,MAAa,KAAyC,MAC7C,OAAO,YAAY,IAAI,IAAI,GAAM,eAAe,CAAC,aAAa"}
1
+ {"version":3,"file":"urls.js","names":[],"sources":["../src/urls.ts"],"sourcesContent":["import type { ParseQuery } from \"./types\";\n\nexport const parsePathname = (href: `/${string}`) => {\n try {\n return new URL(href, \"http://dummy\").pathname as `/${string}`;\n } catch {\n console.error(\"Invalid href\", href);\n return undefined;\n }\n};\n\nexport const parseQuery = <Href extends `/${string}`>(href: Href) => {\n return Object.fromEntries(new URL(href, \"http://dummy\").searchParams) as ParseQuery<Href>;\n};\n"],"mappings":";AAWA,IAAa,KAAyC,MAC7C,OAAO,YAAY,IAAI,IAAI,GAAM,eAAe,CAAC,aAAa"}