@windwalker-io/unicorn-next 0.1.13 → 0.1.15

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.
@@ -1,4 +1,4 @@
1
- import { a as useUniDirective, x as getBoundedInstance, v as selectOne, a7 as mergeDeep, A as h, w as selectAll, ac as data } from "./unicorn.js";
1
+ import { a as useUniDirective, x as getBoundedInstance, v as selectOne, a6 as mergeDeep, A as h, w as selectAll, ae as data } from "./unicorn.js";
2
2
  const defaultOptions = {
3
3
  selector: ".btn-group .radio",
4
4
  buttonClass: "btn",
@@ -1,5 +1,5 @@
1
1
  import { g as getDefaultExportFromCjs } from "./_commonjsHelpers.js";
2
- import { a6 as prepareAlpineDefer, f as initAlpineComponent, a7 as mergeDeep, K as uid, z as module$1, u as useHttpClient } from "./unicorn.js";
2
+ import { a9 as prepareAlpineDefer, f as initAlpineComponent, a6 as mergeDeep, K as uid, z as module$1, u as useHttpClient } from "./unicorn.js";
3
3
  var alpineComponent = {};
4
4
  var hasRequiredAlpineComponent;
5
5
  function requireAlpineComponent() {
@@ -1,4 +1,4 @@
1
- import { a8 as injectCssToDocument, a as useUniDirective, a9 as watchAttributes, a7 as mergeDeep, _ as __, K as uid, B as html, G as simpleAlert } from "./unicorn.js";
1
+ import { aa as watchAttributes, a6 as mergeDeep, _ as __, K as uid, B as html, G as simpleAlert, ab as injectCssToDocument, a as useUniDirective } from "./unicorn.js";
2
2
  const css = ".c-file-drag {\n --bs-card-border-color: var(--bs-gray-400);\n --fd-delete-color: var(--bs-danger);\n overflow: hidden;\n border: 1px solid var(--bs-card-border-color, #ddd);\n}\n.c-file-drag label {\n border: none;\n}\n\n.c-file-drag-input {\n position: relative;\n display: inline-block;\n width: 100%;\n min-height: 100px;\n cursor: pointer;\n}\n.c-file-drag-input input {\n position: relative;\n z-index: 2;\n width: 100%;\n margin: 0;\n overflow: hidden;\n opacity: 0;\n height: 100%;\n cursor: pointer;\n}\n.c-file-drag-input input.hover + label {\n background-color: #efefef;\n}\n.c-file-drag-input input.is-invalid ~ .c-file-drag-input__label {\n border-color: var(--bs-danger);\n}\n.c-file-drag-input input:disabled {\n opacity: 0;\n cursor: no-drop;\n}\n.c-file-drag-input input:disabled + label {\n background-color: #eee;\n color: #999;\n}\n.c-file-drag-input input:disabled + label button {\n display: none;\n}\n.c-file-drag-input__label {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n padding: 0.375rem 0.75rem;\n color: #495057;\n background-color: #fff;\n border: 1px solid var(--bs-gray-400);\n border-radius: 0.25rem;\n height: 100%;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n transition: all 0.3s;\n cursor: pointer;\n}\n.c-file-drag-input__label > span {\n display: inline-block;\n width: 100%;\n}\n.c-file-drag-input label::after {\n content: none !important;\n}\n.c-file-drag-preview .c-file-drag-preview__delete {\n --bs-link-color-rgb: var(--bs-dark-rgb);\n}\n.c-file-drag-preview .c-file-drag-preview__delete.active {\n --bs-link-color-rgb: var(--bs-primary-rgb);\n}";
3
3
  const defaultOptions = {
4
4
  maxFiles: void 0,
@@ -1,5 +1,5 @@
1
1
  import flatpickr from "flatpickr";
2
- import { aa as useImport, ab as useCssImport, a8 as injectCssToDocument } from "./unicorn.js";
2
+ import { ac as useImport, ad as useCssImport, ab as injectCssToDocument } from "./unicorn.js";
3
3
  const css = `.flatpickr-calendar {
4
4
  background: transparent;
5
5
  opacity: 0;
@@ -1,4 +1,4 @@
1
- import { v as selectOne, U as highlight, G as simpleAlert, _ as __, ac as data, B as html, P as slideUp } from "./unicorn.js";
1
+ import { v as selectOne, U as highlight, G as simpleAlert, _ as __, ae as data, B as html, P as slideUp } from "./unicorn.js";
2
2
  import { b as baseAssignValue, a as assignValue, i as isIndex, c as isPrototype, d as arrayLikeKeys, g as getPrototype, k as keys } from "./_getPrototype.js";
3
3
  import { b as baseRest, a as apply } from "./_baseRest.js";
4
4
  import { i as isObjectLike, b as baseGetTag, a as isArray, S as Symbol$1, c as isObject, d as isArrayLike, e as eq } from "./isArguments.js";
@@ -1,5 +1,5 @@
1
- import { ad as forceArray, u as useHttpClient, ab as useCssImport, ac as data } from "./unicorn.js";
2
- import { defineComponent, ref, computed, h, Transition, withDirectives, mergeProps, vShow, unref, inject, watch, onBeforeUpdate, nextTick, onMounted, createElementBlock, openBlock, normalizeClass, createElementVNode, createBlock, createCommentVNode, normalizeStyle, vModelDynamic, withModifiers, createTextVNode, toDisplayString, withCtx, Fragment, renderList, useTemplateRef, onUnmounted, provide, vModelText, createVNode, TransitionGroup, createApp } from "vue";
1
+ import { af as forceArray, u as useHttpClient, ad as useCssImport, ae as data } from "./unicorn.js";
2
+ import { defineComponent, ref, computed, h, Transition, withDirectives, mergeProps, vShow, unref, inject, watch, onBeforeUpdate, nextTick, onMounted, openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle, vModelDynamic, withModifiers, createTextVNode, toDisplayString, createCommentVNode, createBlock, withCtx, Fragment, renderList, useTemplateRef, onUnmounted, provide, vModelText, createVNode, TransitionGroup, createApp } from "vue";
3
3
  import { Modal } from "bootstrap";
4
4
  import { c as cloneDeep } from "./cloneDeep.js";
5
5
  function flattenChildren(children) {
@@ -2,7 +2,7 @@ import { Modal } from "bootstrap";
2
2
  import { createApp, defineComponent, ref, getCurrentInstance, useTemplateRef, computed, onMounted, nextTick } from "vue";
3
3
  import { VueDraggable } from "vue-draggable-plus";
4
4
  import { ItemCardPlaceholder, ItemCard, MultiUploader, createItem } from "vue-multi-uploader";
5
- import { a8 as injectCssToDocument, a7 as mergeDeep, ad as forceArray, ac as data, m as useStack } from "./unicorn.js";
5
+ import { a6 as mergeDeep, ab as injectCssToDocument, af as forceArray, ae as data, m as useStack } from "./unicorn.js";
6
6
  const css = ".vue-drag-uploader {\n --vmu-img-size: 155px;\n display: flex;\n flex-wrap: wrap;\n padding: 1rem;\n border: 1px dotted #999;\n border-radius: 4px;\n cursor: pointer;\n color: #999;\n min-height: 250px;\n}\n.vue-drag-uploader--readonly {\n border: 1px solid #999;\n}\n.vue-drag-uploader.h-ondrag {\n border: 1px dotted #666;\n background-color: rgba(0, 0, 0, 0.05);\n color: #666;\n}\n.vue-drag-uploader__wrapper {\n width: 100%;\n}\n.vue-drag-uploader__draggable-wrapper, .vue-drag-uploader__transition-wrapper {\n display: flex;\n flex-wrap: wrap;\n}\n.vue-drag-uploader-item {\n width: var(--vmu-img-size);\n height: var(--vmu-img-size);\n border: 1px solid rgba(0, 0, 0, 0.25);\n border-radius: 3px;\n cursor: pointer;\n padding: 0.5rem;\n}\n.vue-drag-uploader .add-button {\n display: flex;\n align-items: center;\n text-align: center;\n transition: background-color 0.5s;\n}\n.vue-drag-uploader .add-button:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n.vue-drag-uploader .add-button__body {\n margin: 0 auto;\n}\n.vue-drag-uploader .add-button__icon {\n margin-bottom: 10px;\n}\n.vue-drag-uploader .add-button__text {\n font-size: 14px;\n}\n.vue-drag-uploader .preview-img {\n position: relative;\n cursor: pointer;\n padding: 1px;\n}\n.vue-drag-uploader .preview-img > * {\n position: absolute;\n}\n.vue-drag-uploader .preview-img:hover .error-message__message {\n display: block;\n padding: 10px;\n}\n.vue-drag-uploader .preview-img__body {\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background: transparent no-repeat center center;\n background-size: cover;\n}\n.vue-drag-uploader .preview-img__title {\n margin: 0 auto;\n}\n.vue-drag-uploader .preview-img__overlay {\n display: flex;\n align-items: center;\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.35);\n opacity: 0;\n transition: opacity 0.5s;\n}\n.vue-drag-uploader .preview-img__overlay:hover {\n opacity: 1;\n}\n.vue-drag-uploader .preview-img__remove-icon {\n position: absolute;\n top: 5px;\n right: 5px;\n color: white;\n opacity: 0.75;\n transition: opacity 0.5s;\n}\n.vue-drag-uploader .preview-img__remove-icon:hover {\n opacity: 1;\n}\n.vue-drag-uploader .preview-img__progress {\n height: 5px;\n background-color: rgba(255, 255, 255, 0.8);\n width: 100%;\n bottom: 0;\n left: 0;\n}\n.vue-drag-uploader .preview-img__progress-bar {\n background-color: var(--bs-primary, #007bff);\n width: 0;\n height: 100%;\n}\n.vue-drag-uploader .error-message {\n width: 100%;\n background-color: #dc3545;\n color: white;\n font-size: 14px;\n word-break: break-all;\n top: calc(100% - 26px);\n min-height: 26px;\n}\n.vue-drag-uploader .error-message__notice {\n display: inline-block;\n padding: 3px;\n text-align: center;\n width: 100%;\n}\n.vue-drag-uploader .error-message__message {\n display: none;\n}";
7
7
  const defaultOptions = {
8
8
  readonly: false,
@@ -1,5 +1,5 @@
1
1
  import { c as cloneDeep } from "./cloneDeep.js";
2
- import { a6 as prepareAlpineDefer, ab as useCssImport, a7 as mergeDeep, f as initAlpineComponent, K as uid } from "./unicorn.js";
2
+ import { a9 as prepareAlpineDefer, ad as useCssImport, a6 as mergeDeep, f as initAlpineComponent, K as uid } from "./unicorn.js";
3
3
  const defaultOptions = {
4
4
  id: "",
5
5
  fieldName: "",
@@ -1,5 +1,5 @@
1
1
  import { Modal } from "bootstrap";
2
- import { a8 as injectCssToDocument, a7 as mergeDeep, w as selectAll, _ as __, G as simpleAlert, u as useHttpClient } from "./unicorn.js";
2
+ import { a6 as mergeDeep, w as selectAll, _ as __, G as simpleAlert, u as useHttpClient, ab as injectCssToDocument } from "./unicorn.js";
3
3
  const css = ".c-sid-default__left-col {\n width: 30%;\n margin-right: 15px;\n justify-content: center;\n}\n.c-sid-default__left-col img {\n max-height: 250px;\n}\n.c-sid-default__right-col {\n overflow: hidden;\n}\n.c-sid-default__dragarea {\n font-weight: bold;\n text-align: center;\n padding: 9% 0;\n color: #ccc;\n border: 2px dashed #ccc;\n border-radius: 7px;\n cursor: default;\n}\n.c-sid-default__dragarea.hover {\n color: #333;\n border-color: #333;\n background-color: #f9f9f9;\n}\n.c-sid-default__img-loader {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 180px;\n}\n.c-sid-default__size-info {\n margin-top: 5px;\n font-size: 13px;\n}\n.c-sid-default__remove {\n margin-left: 5px;\n}\n.c-sid-default__modal .btn {\n position: relative;\n}\n\n.c-sid-modal .modal-body {\n position: relative;\n}\n.c-sid-modal__content {\n position: relative;\n z-index: 3;\n}\n.c-sid-modal__loading {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1;\n}\n.is-invalid[uni-field-validate] > uni-sid ~ [data-field-error] {\n display: block;\n}";
4
4
  const defaultOptions = {
5
5
  accept: [
@@ -1,4 +1,4 @@
1
- import { o as useSystemUri, ac as data, l as loadAlpine } from "./unicorn.js";
1
+ import { o as useSystemUri, ae as data, l as loadAlpine } from "./unicorn.js";
2
2
  class UnicornFormElement {
3
3
  element;
4
4
  options;
@@ -1,4 +1,4 @@
1
- import { l as loadAlpine, Q as slideDown, P as slideUp, A as h, _ as __, F as simpleConfirm, ae as deleteConfirm, G as simpleAlert } from "./unicorn.js";
1
+ import { l as loadAlpine, Q as slideDown, P as slideUp, A as h, _ as __, F as simpleConfirm, ag as deleteConfirm, G as simpleAlert } from "./unicorn.js";
2
2
  class UnicornGridElement {
3
3
  constructor(selector, element, form, options = {}) {
4
4
  this.element = element;
@@ -1,5 +1,5 @@
1
1
  import AxiosStatic, { isAxiosError, AxiosError, isCancel } from "axios";
2
- import { ac as data, r as route } from "./unicorn.js";
2
+ import { ae as data, r as route } from "./unicorn.js";
3
3
  function encodeReserved(str) {
4
4
  return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {
5
5
  if (!/%[0-9A-Fa-f]/.test(part)) {
@@ -1,4 +1,4 @@
1
- import { a as useUniDirective, a7 as mergeDeep } from "./unicorn.js";
1
+ import { a6 as mergeDeep, a as useUniDirective } from "./unicorn.js";
2
2
  class IFrameModalElement extends HTMLElement {
3
3
  static is = "uni-iframe-modal";
4
4
  options;
@@ -1,4 +1,23 @@
1
1
  import { g as getDefaultExportFromCjs } from "./_commonjsHelpers.js";
2
+ function _mergeNamespaces(n, m) {
3
+ for (var i = 0; i < m.length; i++) {
4
+ const e = m[i];
5
+ if (typeof e !== "string" && !Array.isArray(e)) {
6
+ for (const k in e) {
7
+ if (k !== "default" && !(k in n)) {
8
+ const d = Object.getOwnPropertyDescriptor(e, k);
9
+ if (d) {
10
+ Object.defineProperty(n, k, d.get ? d : {
11
+ enumerable: true,
12
+ get: () => e[k]
13
+ });
14
+ }
15
+ }
16
+ }
17
+ }
18
+ }
19
+ return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }));
20
+ }
2
21
  var monthSelect$1 = { exports: {} };
3
22
  var monthSelect = /* @__PURE__ */ (() => monthSelect$1.exports)();
4
23
  var hasRequiredMonthSelect;
@@ -285,10 +304,10 @@ function requireMonthSelect() {
285
304
  }
286
305
  var monthSelectExports = /* @__PURE__ */ requireMonthSelect();
287
306
  const index = /* @__PURE__ */ getDefaultExportFromCjs(monthSelectExports);
288
- const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
307
+ const index$1 = /* @__PURE__ */ _mergeNamespaces({
289
308
  __proto__: null,
290
309
  default: index
291
- }, /* @__PURE__ */ (() => Symbol.toStringTag)(), { value: "Module" }));
310
+ }, [monthSelectExports]);
292
311
  export {
293
312
  index$1 as i
294
313
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../node_modules/flatpickr/dist/plugins/monthSelect/index.js"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.monthSelectPlugin = factory());\n}(this, (function () { 'use strict';\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation.\r\n\r\n Permission to use, copy, modify, and/or distribute this software for any\r\n purpose with or without fee is hereby granted.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\n REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\n AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\n INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\n LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\n OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\n PERFORMANCE OF THIS SOFTWARE.\r\n ***************************************************************************** */\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\n\n var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber]; };\n\n function clearNode(node) {\n while (node.firstChild)\n node.removeChild(node.firstChild);\n }\n function getEventTarget(event) {\n try {\n if (typeof event.composedPath === \"function\") {\n var path = event.composedPath();\n return path[0];\n }\n return event.target;\n }\n catch (error) {\n return event.target;\n }\n }\n\n var defaultConfig = {\n shorthand: false,\n dateFormat: \"F Y\",\n altFormat: \"F Y\",\n theme: \"light\",\n };\n function monthSelectPlugin(pluginConfig) {\n var config = __assign(__assign({}, defaultConfig), pluginConfig);\n return function (fp) {\n fp.config.dateFormat = config.dateFormat;\n fp.config.altFormat = config.altFormat;\n var self = { monthsContainer: null };\n function clearUnnecessaryDOMElements() {\n if (!fp.rContainer)\n return;\n clearNode(fp.rContainer);\n for (var index = 0; index < fp.monthElements.length; index++) {\n var element = fp.monthElements[index];\n if (!element.parentNode)\n continue;\n element.parentNode.removeChild(element);\n }\n }\n function build() {\n if (!fp.rContainer)\n return;\n self.monthsContainer = fp._createElement(\"div\", \"flatpickr-monthSelect-months\");\n self.monthsContainer.tabIndex = -1;\n buildMonths();\n fp.rContainer.appendChild(self.monthsContainer);\n fp.calendarContainer.classList.add(\"flatpickr-monthSelect-theme-\" + config.theme);\n }\n function buildMonths() {\n if (!self.monthsContainer)\n return;\n clearNode(self.monthsContainer);\n var frag = document.createDocumentFragment();\n for (var i = 0; i < 12; i++) {\n var month = fp.createDay(\"flatpickr-monthSelect-month\", new Date(fp.currentYear, i), 0, i);\n if (month.dateObj.getMonth() === new Date().getMonth() &&\n month.dateObj.getFullYear() === new Date().getFullYear())\n month.classList.add(\"today\");\n month.textContent = monthToStr(i, config.shorthand, fp.l10n);\n month.addEventListener(\"click\", selectMonth);\n frag.appendChild(month);\n }\n self.monthsContainer.appendChild(frag);\n if (fp.config.minDate &&\n fp.currentYear === fp.config.minDate.getFullYear())\n fp.prevMonthNav.classList.add(\"flatpickr-disabled\");\n else\n fp.prevMonthNav.classList.remove(\"flatpickr-disabled\");\n if (fp.config.maxDate &&\n fp.currentYear === fp.config.maxDate.getFullYear())\n fp.nextMonthNav.classList.add(\"flatpickr-disabled\");\n else\n fp.nextMonthNav.classList.remove(\"flatpickr-disabled\");\n }\n function bindEvents() {\n fp._bind(fp.prevMonthNav, \"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n fp.changeYear(fp.currentYear - 1);\n selectYear();\n buildMonths();\n });\n fp._bind(fp.nextMonthNav, \"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n fp.changeYear(fp.currentYear + 1);\n selectYear();\n buildMonths();\n });\n fp._bind(self.monthsContainer, \"mouseover\", function (e) {\n if (fp.config.mode === \"range\")\n fp.onMouseOver(getEventTarget(e), \"flatpickr-monthSelect-month\");\n });\n }\n function setCurrentlySelected() {\n if (!fp.rContainer)\n return;\n if (!fp.selectedDates.length)\n return;\n var currentlySelected = fp.rContainer.querySelectorAll(\".flatpickr-monthSelect-month.selected\");\n for (var index = 0; index < currentlySelected.length; index++) {\n currentlySelected[index].classList.remove(\"selected\");\n }\n var targetMonth = fp.selectedDates[0].getMonth();\n var month = fp.rContainer.querySelector(\".flatpickr-monthSelect-month:nth-child(\" + (targetMonth + 1) + \")\");\n if (month) {\n month.classList.add(\"selected\");\n }\n }\n function selectYear() {\n var selectedDate = fp.selectedDates[0];\n if (selectedDate) {\n selectedDate = new Date(selectedDate);\n selectedDate.setFullYear(fp.currentYear);\n if (fp.config.minDate && selectedDate < fp.config.minDate) {\n selectedDate = fp.config.minDate;\n }\n if (fp.config.maxDate && selectedDate > fp.config.maxDate) {\n selectedDate = fp.config.maxDate;\n }\n fp.currentYear = selectedDate.getFullYear();\n }\n fp.currentYearElement.value = String(fp.currentYear);\n if (fp.rContainer) {\n var months = fp.rContainer.querySelectorAll(\".flatpickr-monthSelect-month\");\n months.forEach(function (month) {\n month.dateObj.setFullYear(fp.currentYear);\n if ((fp.config.minDate && month.dateObj < fp.config.minDate) ||\n (fp.config.maxDate && month.dateObj > fp.config.maxDate)) {\n month.classList.add(\"flatpickr-disabled\");\n }\n else {\n month.classList.remove(\"flatpickr-disabled\");\n }\n });\n }\n setCurrentlySelected();\n }\n function selectMonth(e) {\n e.preventDefault();\n e.stopPropagation();\n var eventTarget = getEventTarget(e);\n if (!(eventTarget instanceof Element))\n return;\n if (eventTarget.classList.contains(\"flatpickr-disabled\"))\n return;\n if (eventTarget.classList.contains(\"notAllowed\"))\n return; // necessary??\n setMonth(eventTarget.dateObj);\n if (fp.config.closeOnSelect) {\n var single = fp.config.mode === \"single\";\n var range = fp.config.mode === \"range\" && fp.selectedDates.length === 2;\n if (single || range)\n fp.close();\n }\n }\n function setMonth(date) {\n var selectedDate = new Date(fp.currentYear, date.getMonth(), date.getDate());\n var selectedDates = [];\n switch (fp.config.mode) {\n case \"single\":\n selectedDates = [selectedDate];\n break;\n case \"multiple\":\n selectedDates.push(selectedDate);\n break;\n case \"range\":\n if (fp.selectedDates.length === 2) {\n selectedDates = [selectedDate];\n }\n else {\n selectedDates = fp.selectedDates.concat([selectedDate]);\n selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n }\n break;\n }\n fp.setDate(selectedDates, true);\n setCurrentlySelected();\n }\n var shifts = {\n 37: -1,\n 39: 1,\n 40: 3,\n 38: -3,\n };\n function onKeyDown(_, __, ___, e) {\n var shouldMove = shifts[e.keyCode] !== undefined;\n if (!shouldMove && e.keyCode !== 13) {\n return;\n }\n if (!fp.rContainer || !self.monthsContainer)\n return;\n var currentlySelected = fp.rContainer.querySelector(\".flatpickr-monthSelect-month.selected\");\n var index = Array.prototype.indexOf.call(self.monthsContainer.children, document.activeElement);\n if (index === -1) {\n var target = currentlySelected || self.monthsContainer.firstElementChild;\n target.focus();\n index = target.$i;\n }\n if (shouldMove) {\n self.monthsContainer.children[(12 + index + shifts[e.keyCode]) % 12].focus();\n }\n else if (e.keyCode === 13 &&\n self.monthsContainer.contains(document.activeElement)) {\n setMonth(document.activeElement.dateObj);\n }\n }\n function closeHook() {\n var _a;\n if (((_a = fp.config) === null || _a === void 0 ? void 0 : _a.mode) === \"range\" && fp.selectedDates.length === 1)\n fp.clear(false);\n if (!fp.selectedDates.length)\n buildMonths();\n }\n // Help the prev/next year nav honor config.minDate (see 3fa5a69)\n function stubCurrentMonth() {\n config._stubbedCurrentMonth = fp._initialDate.getMonth();\n fp._initialDate.setMonth(config._stubbedCurrentMonth);\n fp.currentMonth = config._stubbedCurrentMonth;\n }\n function unstubCurrentMonth() {\n if (!config._stubbedCurrentMonth)\n return;\n fp._initialDate.setMonth(config._stubbedCurrentMonth);\n fp.currentMonth = config._stubbedCurrentMonth;\n delete config._stubbedCurrentMonth;\n }\n function destroyPluginInstance() {\n if (self.monthsContainer !== null) {\n var months = self.monthsContainer.querySelectorAll(\".flatpickr-monthSelect-month\");\n for (var index = 0; index < months.length; index++) {\n months[index].removeEventListener(\"click\", selectMonth);\n }\n }\n }\n return {\n onParseConfig: function () {\n fp.config.enableTime = false;\n },\n onValueUpdate: setCurrentlySelected,\n onKeyDown: onKeyDown,\n onReady: [\n stubCurrentMonth,\n clearUnnecessaryDOMElements,\n build,\n bindEvents,\n setCurrentlySelected,\n function () {\n fp.config.onClose.push(closeHook);\n fp.loadedPlugins.push(\"monthSelect\");\n },\n ],\n onDestroy: [\n unstubCurrentMonth,\n destroyPluginInstance,\n function () {\n fp.config.onClose = fp.config.onClose.filter(function (hook) { return hook !== closeHook; });\n },\n ],\n };\n };\n }\n\n return monthSelectPlugin;\n\n})));\n"],"names":["this","__assign","index"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../node_modules/flatpickr/dist/plugins/monthSelect/index.js"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.monthSelectPlugin = factory());\n}(this, (function () { 'use strict';\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation.\r\n\r\n Permission to use, copy, modify, and/or distribute this software for any\r\n purpose with or without fee is hereby granted.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\n REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\n AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\n INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\n LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\n OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\n PERFORMANCE OF THIS SOFTWARE.\r\n ***************************************************************************** */\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\n\n var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber]; };\n\n function clearNode(node) {\n while (node.firstChild)\n node.removeChild(node.firstChild);\n }\n function getEventTarget(event) {\n try {\n if (typeof event.composedPath === \"function\") {\n var path = event.composedPath();\n return path[0];\n }\n return event.target;\n }\n catch (error) {\n return event.target;\n }\n }\n\n var defaultConfig = {\n shorthand: false,\n dateFormat: \"F Y\",\n altFormat: \"F Y\",\n theme: \"light\",\n };\n function monthSelectPlugin(pluginConfig) {\n var config = __assign(__assign({}, defaultConfig), pluginConfig);\n return function (fp) {\n fp.config.dateFormat = config.dateFormat;\n fp.config.altFormat = config.altFormat;\n var self = { monthsContainer: null };\n function clearUnnecessaryDOMElements() {\n if (!fp.rContainer)\n return;\n clearNode(fp.rContainer);\n for (var index = 0; index < fp.monthElements.length; index++) {\n var element = fp.monthElements[index];\n if (!element.parentNode)\n continue;\n element.parentNode.removeChild(element);\n }\n }\n function build() {\n if (!fp.rContainer)\n return;\n self.monthsContainer = fp._createElement(\"div\", \"flatpickr-monthSelect-months\");\n self.monthsContainer.tabIndex = -1;\n buildMonths();\n fp.rContainer.appendChild(self.monthsContainer);\n fp.calendarContainer.classList.add(\"flatpickr-monthSelect-theme-\" + config.theme);\n }\n function buildMonths() {\n if (!self.monthsContainer)\n return;\n clearNode(self.monthsContainer);\n var frag = document.createDocumentFragment();\n for (var i = 0; i < 12; i++) {\n var month = fp.createDay(\"flatpickr-monthSelect-month\", new Date(fp.currentYear, i), 0, i);\n if (month.dateObj.getMonth() === new Date().getMonth() &&\n month.dateObj.getFullYear() === new Date().getFullYear())\n month.classList.add(\"today\");\n month.textContent = monthToStr(i, config.shorthand, fp.l10n);\n month.addEventListener(\"click\", selectMonth);\n frag.appendChild(month);\n }\n self.monthsContainer.appendChild(frag);\n if (fp.config.minDate &&\n fp.currentYear === fp.config.minDate.getFullYear())\n fp.prevMonthNav.classList.add(\"flatpickr-disabled\");\n else\n fp.prevMonthNav.classList.remove(\"flatpickr-disabled\");\n if (fp.config.maxDate &&\n fp.currentYear === fp.config.maxDate.getFullYear())\n fp.nextMonthNav.classList.add(\"flatpickr-disabled\");\n else\n fp.nextMonthNav.classList.remove(\"flatpickr-disabled\");\n }\n function bindEvents() {\n fp._bind(fp.prevMonthNav, \"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n fp.changeYear(fp.currentYear - 1);\n selectYear();\n buildMonths();\n });\n fp._bind(fp.nextMonthNav, \"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n fp.changeYear(fp.currentYear + 1);\n selectYear();\n buildMonths();\n });\n fp._bind(self.monthsContainer, \"mouseover\", function (e) {\n if (fp.config.mode === \"range\")\n fp.onMouseOver(getEventTarget(e), \"flatpickr-monthSelect-month\");\n });\n }\n function setCurrentlySelected() {\n if (!fp.rContainer)\n return;\n if (!fp.selectedDates.length)\n return;\n var currentlySelected = fp.rContainer.querySelectorAll(\".flatpickr-monthSelect-month.selected\");\n for (var index = 0; index < currentlySelected.length; index++) {\n currentlySelected[index].classList.remove(\"selected\");\n }\n var targetMonth = fp.selectedDates[0].getMonth();\n var month = fp.rContainer.querySelector(\".flatpickr-monthSelect-month:nth-child(\" + (targetMonth + 1) + \")\");\n if (month) {\n month.classList.add(\"selected\");\n }\n }\n function selectYear() {\n var selectedDate = fp.selectedDates[0];\n if (selectedDate) {\n selectedDate = new Date(selectedDate);\n selectedDate.setFullYear(fp.currentYear);\n if (fp.config.minDate && selectedDate < fp.config.minDate) {\n selectedDate = fp.config.minDate;\n }\n if (fp.config.maxDate && selectedDate > fp.config.maxDate) {\n selectedDate = fp.config.maxDate;\n }\n fp.currentYear = selectedDate.getFullYear();\n }\n fp.currentYearElement.value = String(fp.currentYear);\n if (fp.rContainer) {\n var months = fp.rContainer.querySelectorAll(\".flatpickr-monthSelect-month\");\n months.forEach(function (month) {\n month.dateObj.setFullYear(fp.currentYear);\n if ((fp.config.minDate && month.dateObj < fp.config.minDate) ||\n (fp.config.maxDate && month.dateObj > fp.config.maxDate)) {\n month.classList.add(\"flatpickr-disabled\");\n }\n else {\n month.classList.remove(\"flatpickr-disabled\");\n }\n });\n }\n setCurrentlySelected();\n }\n function selectMonth(e) {\n e.preventDefault();\n e.stopPropagation();\n var eventTarget = getEventTarget(e);\n if (!(eventTarget instanceof Element))\n return;\n if (eventTarget.classList.contains(\"flatpickr-disabled\"))\n return;\n if (eventTarget.classList.contains(\"notAllowed\"))\n return; // necessary??\n setMonth(eventTarget.dateObj);\n if (fp.config.closeOnSelect) {\n var single = fp.config.mode === \"single\";\n var range = fp.config.mode === \"range\" && fp.selectedDates.length === 2;\n if (single || range)\n fp.close();\n }\n }\n function setMonth(date) {\n var selectedDate = new Date(fp.currentYear, date.getMonth(), date.getDate());\n var selectedDates = [];\n switch (fp.config.mode) {\n case \"single\":\n selectedDates = [selectedDate];\n break;\n case \"multiple\":\n selectedDates.push(selectedDate);\n break;\n case \"range\":\n if (fp.selectedDates.length === 2) {\n selectedDates = [selectedDate];\n }\n else {\n selectedDates = fp.selectedDates.concat([selectedDate]);\n selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n }\n break;\n }\n fp.setDate(selectedDates, true);\n setCurrentlySelected();\n }\n var shifts = {\n 37: -1,\n 39: 1,\n 40: 3,\n 38: -3,\n };\n function onKeyDown(_, __, ___, e) {\n var shouldMove = shifts[e.keyCode] !== undefined;\n if (!shouldMove && e.keyCode !== 13) {\n return;\n }\n if (!fp.rContainer || !self.monthsContainer)\n return;\n var currentlySelected = fp.rContainer.querySelector(\".flatpickr-monthSelect-month.selected\");\n var index = Array.prototype.indexOf.call(self.monthsContainer.children, document.activeElement);\n if (index === -1) {\n var target = currentlySelected || self.monthsContainer.firstElementChild;\n target.focus();\n index = target.$i;\n }\n if (shouldMove) {\n self.monthsContainer.children[(12 + index + shifts[e.keyCode]) % 12].focus();\n }\n else if (e.keyCode === 13 &&\n self.monthsContainer.contains(document.activeElement)) {\n setMonth(document.activeElement.dateObj);\n }\n }\n function closeHook() {\n var _a;\n if (((_a = fp.config) === null || _a === void 0 ? void 0 : _a.mode) === \"range\" && fp.selectedDates.length === 1)\n fp.clear(false);\n if (!fp.selectedDates.length)\n buildMonths();\n }\n // Help the prev/next year nav honor config.minDate (see 3fa5a69)\n function stubCurrentMonth() {\n config._stubbedCurrentMonth = fp._initialDate.getMonth();\n fp._initialDate.setMonth(config._stubbedCurrentMonth);\n fp.currentMonth = config._stubbedCurrentMonth;\n }\n function unstubCurrentMonth() {\n if (!config._stubbedCurrentMonth)\n return;\n fp._initialDate.setMonth(config._stubbedCurrentMonth);\n fp.currentMonth = config._stubbedCurrentMonth;\n delete config._stubbedCurrentMonth;\n }\n function destroyPluginInstance() {\n if (self.monthsContainer !== null) {\n var months = self.monthsContainer.querySelectorAll(\".flatpickr-monthSelect-month\");\n for (var index = 0; index < months.length; index++) {\n months[index].removeEventListener(\"click\", selectMonth);\n }\n }\n }\n return {\n onParseConfig: function () {\n fp.config.enableTime = false;\n },\n onValueUpdate: setCurrentlySelected,\n onKeyDown: onKeyDown,\n onReady: [\n stubCurrentMonth,\n clearUnnecessaryDOMElements,\n build,\n bindEvents,\n setCurrentlySelected,\n function () {\n fp.config.onClose.push(closeHook);\n fp.loadedPlugins.push(\"monthSelect\");\n },\n ],\n onDestroy: [\n unstubCurrentMonth,\n destroyPluginInstance,\n function () {\n fp.config.onClose = fp.config.onClose.filter(function (hook) { return hook !== closeHook; });\n },\n ],\n };\n };\n }\n\n return monthSelectPlugin;\n\n})));\n"],"names":["this","__assign","index"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,5 +1,5 @@
1
1
  import { Tab } from "bootstrap";
2
- import { a as useUniDirective, z as module$1, a7 as mergeDeep, v as selectOne, al as sleep, w as selectAll } from "./unicorn.js";
2
+ import { a as useUniDirective, z as module$1, a6 as mergeDeep, v as selectOne, al as sleep, w as selectAll } from "./unicorn.js";
3
3
  const defaultOptions = {
4
4
  tabItemSelector: "[data-toggle=tab],[data-bs-toggle=tab],[data-toggle=pill],[data-bs-toggle=pill]",
5
5
  delay: 0
@@ -1,4 +1,4 @@
1
- import { a as useUniDirective, x as getBoundedInstance, v as selectOne, u as useHttpClient, B as html, a7 as mergeDeep } from "./unicorn.js";
1
+ import { a as useUniDirective, x as getBoundedInstance, v as selectOne, u as useHttpClient, B as html, a6 as mergeDeep } from "./unicorn.js";
2
2
  const nope = () => {
3
3
  };
4
4
  const defaultOptions = {
@@ -1,4 +1,4 @@
1
- import { af as Mixin, a7 as mergeDeep, ah as createQueue, u as useHttpClient, ag as EventMixin } from "./unicorn.js";
1
+ import { ah as Mixin, a6 as mergeDeep, aj as createQueue, u as useHttpClient, ai as EventMixin } from "./unicorn.js";
2
2
  const defaultOptions = {
3
3
  chunkSize: 5 * 1024 * 1024,
4
4
  // 5MB
@@ -40,12 +40,21 @@ class S3MultipartUploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
40
40
  if (this.options.leaveAlert === true) {
41
41
  window.addEventListener("beforeunload", beforeUnloadHandler);
42
42
  }
43
- const { id } = await this.request(
44
- "init",
45
- initData
46
- );
47
- this.trigger("inited", { id, path });
43
+ let uploadId = null;
44
+ let isCancel = false;
45
+ let signal = options.abortController?.signal;
46
+ if (signal) {
47
+ signal.addEventListener("abort", (e) => {
48
+ isCancel = true;
49
+ });
50
+ }
48
51
  try {
52
+ const { id } = await this.request(
53
+ "init",
54
+ initData
55
+ );
56
+ uploadId = id;
57
+ this.trigger("inited", { id, path });
49
58
  const chunkSize = this.options.chunkSize;
50
59
  const chunks = Math.ceil(file.size / chunkSize);
51
60
  let uploadedBytes = 0;
@@ -64,6 +73,7 @@ class S3MultipartUploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
64
73
  path,
65
74
  partNumber,
66
75
  chunkSize,
76
+ abortController: options.abortController,
67
77
  onUploadProgress: (e) => {
68
78
  partsUploaded[partNumber] = e.loaded;
69
79
  const uploaded = Object.values(partsUploaded).reduce((sum, a) => sum + a, 0);
@@ -78,6 +88,11 @@ class S3MultipartUploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
78
88
  currentPart++;
79
89
  }
80
90
  await Promise.all(promises);
91
+ if (isCancel) {
92
+ const e = new Error("Upload cancelled");
93
+ e.name = "CanceledError";
94
+ throw e;
95
+ }
81
96
  const { url } = await this.request(
82
97
  "complete",
83
98
  {
@@ -90,8 +105,10 @@ class S3MultipartUploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
90
105
  this.trigger("success", { id, path, url });
91
106
  return { url, id, path };
92
107
  } catch (e) {
93
- await this.abort(id, path);
94
- this.trigger("failure", { error: e, id, path });
108
+ if (uploadId) {
109
+ await this.abort(uploadId, path);
110
+ }
111
+ this.trigger("failure", { error: e, uploadId, path });
95
112
  throw e;
96
113
  } finally {
97
114
  if (this.options.leaveAlert === true) {
@@ -112,6 +129,9 @@ class S3MultipartUploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
112
129
  path,
113
130
  partNumber,
114
131
  profile: this.options.profile
132
+ },
133
+ {
134
+ signal: payload.abortController?.signal
115
135
  }
116
136
  );
117
137
  const res = await http.put(
@@ -124,12 +144,12 @@ class S3MultipartUploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
124
144
  const etag = String(res.headers.get("ETag") || "");
125
145
  return { blob, etag };
126
146
  }
127
- async request(action, body) {
147
+ async request(action, body, config = {}) {
128
148
  if (this.options.requestHandler) {
129
149
  return this.options.requestHandler(action, body);
130
150
  }
131
151
  const http = await useHttpClient();
132
- const res = await http.post(await this.resolveRoute(action), body);
152
+ const res = await http.post(await this.resolveRoute(action), body, config);
133
153
  return res.data.data;
134
154
  }
135
155
  // protected async abortBeacon(id: string, path: string): Promise<void> {
@@ -1 +1 @@
1
- {"version":3,"file":"s3-multipart-uploader.js","sources":["../../src/module/s3-multipart-uploader.ts"],"sourcesContent":["import { AxiosProgressEvent, AxiosResponseHeaders } from 'axios';\nimport { Mixin } from 'ts-mixer';\nimport { createQueue, useHttpClient } from '../composable';\nimport { EventHandler, EventMixin } from '../events';\nimport { route } from '../service';\nimport type { MaybePromise } from '../types';\nimport { mergeDeep } from '../utilities';\nimport { ApiReturn } from './http-client';\n\ndeclare type RoutingOptions = {\n init: string;\n sign: string;\n complete: string;\n abort: string;\n} | ((action: RouteActions) => MaybePromise<string>);\n\ndeclare type RouteActions = 'init' | 'sign' | 'complete' | 'abort';\ndeclare type RequestHandler = <T = Record<string, any>>(action: RouteActions, data: Record<string, any>) => Promise<T>;\n\nexport interface S3MultipartUploaderOptions {\n profile?: string;\n chunkSize: number;\n concurrency: number;\n leaveAlert?: boolean;\n routes: RoutingOptions;\n requestHandler?: RequestHandler;\n onProgress?: ProgressEventHandler;\n ACL?: string;\n extra?: Record<string, any>;\n\n // maxRetries?: number;\n // endpoint: string;\n // subfolder?: string;\n}\n\nconst defaultOptions: Partial<S3MultipartUploaderOptions> = {\n chunkSize: 5 * 1024 * 1024, // 5MB\n concurrency: 2,\n};\n\nexport interface S3MultipartUploaderRequestOptions {\n onProgress?: ProgressEventHandler;\n filename?: string;\n ContentType?: string;\n ContentDisposition?: string;\n ACL?: 'public-read' | 'private' | 'authenticated-read' | 'public-read-write' | string;\n extra?: Record<string, any>;\n}\n\nexport class S3MultipartUploader extends Mixin(EventMixin) {\n options: S3MultipartUploaderOptions;\n\n constructor(options: Partial<S3MultipartUploaderOptions>) {\n super();\n this.options = mergeDeep({}, defaultOptions, options);\n }\n\n async upload(\n file: string | File | Blob,\n path: string,\n options: S3MultipartUploaderRequestOptions = {}\n ): Promise<{ url: string; id: string; path: string; }> {\n const extra: Record<string, any> = { ...(this.options.extra ?? {}), ...(options.extra ?? {}) };\n\n if (typeof file === 'string') {\n file = new Blob([file], { type: options['ContentType'] || 'text/plain' });\n }\n\n if (file instanceof Blob && !(file instanceof File)) {\n if (path.endsWith('.{ext}')) {\n throw new Error('If using Blob or file data string, you must provide a valid file extension in the path.');\n }\n\n file = new File([file], 'blob', { type: file.type });\n }\n\n if (file instanceof File) {\n extra['ContentType'] = options['ContentType'] || file.type;\n }\n\n if (options.ACL || this.options.ACL) {\n extra.ACL = options.ACL || this.options.ACL;\n }\n\n path = this.replaceExt(path, file);\n\n const initData: Record<string, any> = { extra, path, profile: this.options.profile };\n\n if (options['filename']) {\n initData['filename'] = options['filename'];\n }\n\n this.trigger('start', file, initData);\n\n // Prepare unload\n const beforeUnloadHandler = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = '';\n };\n if (this.options.leaveAlert === true) {\n window.addEventListener('beforeunload', beforeUnloadHandler);\n }\n\n // @Request init\n const { id } = await this.request<{ id: string; }>(\n 'init',\n initData\n );\n\n this.trigger('inited', { id, path });\n\n try {\n const chunkSize = this.options.chunkSize;\n const chunks = Math.ceil(file.size / chunkSize);\n\n let uploadedBytes = 0;\n let parts: { ETag: string, PartNumber: number }[] = [];\n let currentPart = 1;\n const queue = createQueue(this.options.concurrency);\n const promises = [];\n const partsUploaded: Record<number, number> = {};\n\n // Loop from 1 to chunks\n while (currentPart <= chunks) {\n const partNumber = currentPart;\n\n // Push to queue\n const p = queue.push(async () => {\n const { blob, etag } = await this.uploadPart(\n file as File,\n {\n id,\n path,\n partNumber,\n chunkSize,\n onUploadProgress: (e) => {\n partsUploaded[partNumber] = e.loaded;\n\n const uploaded = Object.values(partsUploaded).reduce((sum, a) => sum + a, 0);\n\n this.updateProgress(uploaded, file.size, options);\n }\n }\n );\n\n uploadedBytes += blob.size;\n\n // Use parts progress, ignore the overall progress, which may be inaccurate due to retries or concurrency\n // this.updateProgress(uploadedBytes, file.size, options);\n\n parts.push({ ETag: etag, PartNumber: partNumber });\n });\n\n promises.push(p);\n\n currentPart++;\n }\n\n await Promise.all(promises);\n\n // @Request sign\n const { url } = await this.request<{ url: string }>(\n 'complete',\n {\n id,\n path,\n parts: parts.sort((a, b) => a.PartNumber - b.PartNumber),\n profile: this.options.profile,\n },\n );\n\n this.trigger('success', { id, path, url });\n\n return { url, id, path };\n } catch (e) {\n await this.abort(id, path);\n\n this.trigger('failure', { error: e as Error, id, path });\n\n throw e;\n } finally {\n if (this.options.leaveAlert === true) {\n window.removeEventListener('beforeunload', beforeUnloadHandler);\n }\n }\n }\n\n protected async uploadPart(\n file: File,\n payload: {\n id: string;\n path: string;\n partNumber: number;\n chunkSize: number;\n onUploadProgress: (e: AxiosProgressEvent) => void;\n }\n ) {\n const http = await useHttpClient();\n const { id, path, partNumber, chunkSize, onUploadProgress } = payload;\n\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(partNumber * chunkSize, file.size);\n\n const blob = file.slice(start, end);\n\n // @Request sign\n const { url } = await this.request<{ url: string; }>(\n 'sign',\n {\n id,\n path,\n partNumber,\n profile: this.options.profile,\n }\n );\n\n // PUT to S3\n const res = await http.put(\n url,\n blob,\n {\n onUploadProgress,\n }\n );\n\n const etag = String((res.headers as AxiosResponseHeaders).get('ETag') || '');\n\n return { blob, etag };\n }\n\n protected async request<T = Record<string, any>>(action: RouteActions, body: Record<string, any>): Promise<T> {\n if (this.options.requestHandler) {\n return this.options.requestHandler<T>(action, body);\n }\n\n const http = await useHttpClient();\n\n const res = await http.post<ApiReturn<T>>(await this.resolveRoute(action), body);\n\n return res.data.data;\n }\n\n // protected async abortBeacon(id: string, path: string): Promise<void> {\n // const data = new FormData();\n // data.append('id', id);\n // data.append('path', path);\n // data.append('profile', this.options.profile || '');\n //\n // await navigator.sendBeacon(route(await this.resolveRoute('abort')), data);\n // }\n\n async abort(id: string, path: string) {\n await this.request(\n 'abort',\n {\n id,\n path,\n profile: this.options.profile,\n }\n );\n }\n\n updateProgress(loaded: number, total: number, options: S3MultipartUploaderRequestOptions) {\n const percentage = (loaded / total) * 100;\n\n const event: ProgressEvent = { percentage, loaded, total };\n\n this.trigger('progress', event);\n\n this.options.onProgress?.(event);\n\n if (options.onProgress) {\n options.onProgress(event);\n }\n }\n\n async resolveRoute(action: RouteActions): Promise<string> {\n if (typeof this.options.routes === 'function') {\n return this.options.routes(action);\n }\n\n return this.options.routes[action];\n }\n\n setChunkSize(size: number): this {\n this.options.chunkSize = size;\n\n return this;\n }\n\n setChunkSizeInMiB(size: number): this {\n this.options.chunkSize = size * 1024 * 1024;\n\n return this;\n }\n\n replaceExt(path: string, file: File | Blob): string {\n if (file instanceof File) {\n const fileExt = file.name.split('.').pop();\n\n if (path.endsWith('.{ext}')) {\n return path.replace(/\\.{ext}$/, fileExt ? '.' + fileExt : '');\n }\n }\n\n return path;\n }\n\n on(\n event: 'start',\n handler: (file: File, data: { path: string; extra: Record<string, any>; [name: string]: any; }) => void\n ): this;\n on(event: 'inited', handler: (event: { id: string; path: string; }) => void): this;\n on(event: 'success', handler: (event: { url: string; id: string; path: string; }) => void): this;\n on(event: 'progress', handler: (event: ProgressEvent) => void): this;\n on(event: 'failure', handler: (event: { error: Error; id: string; path: string; }) => void): this;\n on(event: string | string[], handler: EventHandler): this {\n return super.on(event, handler);\n }\n}\n\ntype ProgressEvent = {\n percentage: number;\n loaded: number;\n total: number;\n};\ntype ProgressEventHandler = (e: ProgressEvent) => void;\n\nexport interface S3MultipartUploaderModule {\n S3MultipartUploader: typeof S3MultipartUploader;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s3-multipart-uploader.js","sources":["../../src/module/s3-multipart-uploader.ts"],"sourcesContent":["import { AxiosProgressEvent, type AxiosRequestConfig, AxiosResponseHeaders } from 'axios';\nimport { Mixin } from 'ts-mixer';\nimport { createQueue, useHttpClient } from '../composable';\nimport { EventHandler, EventMixin } from '../events';\nimport type { MaybePromise } from '../types';\nimport { mergeDeep } from '../utilities';\nimport { ApiReturn } from './http-client';\n\ndeclare type RoutingOptions = {\n init: string;\n sign: string;\n complete: string;\n abort: string;\n} | ((action: RouteActions) => MaybePromise<string>);\n\ndeclare type RouteActions = 'init' | 'sign' | 'complete' | 'abort';\ndeclare type RequestHandler = <T = Record<string, any>>(action: RouteActions, data: Record<string, any>) => Promise<T>;\n\nexport interface S3MultipartUploaderOptions {\n profile?: string;\n chunkSize: number;\n concurrency: number;\n leaveAlert?: boolean;\n routes: RoutingOptions;\n requestHandler?: RequestHandler;\n onProgress?: ProgressEventHandler;\n ACL?: string;\n extra?: Record<string, any>;\n\n // maxRetries?: number;\n // endpoint: string;\n // subfolder?: string;\n}\n\nconst defaultOptions: Partial<S3MultipartUploaderOptions> = {\n chunkSize: 5 * 1024 * 1024, // 5MB\n concurrency: 2,\n};\n\nexport interface S3MultipartUploaderRequestOptions {\n onProgress?: ProgressEventHandler;\n filename?: string;\n ContentType?: string;\n ContentDisposition?: string;\n ACL?: 'public-read' | 'private' | 'authenticated-read' | 'public-read-write' | string;\n extra?: Record<string, any>;\n abortController?: AbortController;\n}\n\nexport class S3MultipartUploader extends Mixin(EventMixin) {\n options: S3MultipartUploaderOptions;\n\n constructor(options: Partial<S3MultipartUploaderOptions>) {\n super();\n this.options = mergeDeep({}, defaultOptions, options);\n }\n\n async upload(\n file: string | File | Blob,\n path: string,\n options: S3MultipartUploaderRequestOptions = {}\n ): Promise<{ url: string; id: string; path: string; }> {\n const extra: Record<string, any> = { ...(this.options.extra ?? {}), ...(options.extra ?? {}) };\n\n if (typeof file === 'string') {\n file = new Blob([file], { type: options['ContentType'] || 'text/plain' });\n }\n\n if (file instanceof Blob && !(file instanceof File)) {\n if (path.endsWith('.{ext}')) {\n throw new Error('If using Blob or file data string, you must provide a valid file extension in the path.');\n }\n\n file = new File([file], 'blob', { type: file.type });\n }\n\n if (file instanceof File) {\n extra['ContentType'] = options['ContentType'] || file.type;\n }\n\n if (options.ACL || this.options.ACL) {\n extra.ACL = options.ACL || this.options.ACL;\n }\n\n path = this.replaceExt(path, file);\n\n const initData: Record<string, any> = { extra, path, profile: this.options.profile };\n\n if (options['filename']) {\n initData['filename'] = options['filename'];\n }\n\n this.trigger('start', file, initData);\n\n // Prepare unload\n const beforeUnloadHandler = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = '';\n };\n\n if (this.options.leaveAlert === true) {\n window.addEventListener('beforeunload', beforeUnloadHandler);\n }\n\n let uploadId: string | null = null;\n let isCancel = false;\n let signal = options.abortController?.signal;\n\n if (signal) {\n signal.addEventListener('abort', (e) => {\n isCancel = true;\n });\n }\n\n try {\n // @Request init\n const { id } = await this.request<{ id: string; }>(\n 'init',\n initData\n );\n\n uploadId = id;\n\n this.trigger('inited', { id, path });\n\n const chunkSize = this.options.chunkSize;\n const chunks = Math.ceil(file.size / chunkSize);\n\n let uploadedBytes = 0;\n let parts: { ETag: string, PartNumber: number }[] = [];\n let currentPart = 1;\n const queue = createQueue(this.options.concurrency);\n const promises = [];\n const partsUploaded: Record<number, number> = {};\n\n // Loop from 1 to chunks\n while (currentPart <= chunks) {\n const partNumber = currentPart;\n\n // Push to queue\n const p = queue.push(async () => {\n const { blob, etag } = await this.uploadPart(\n file as File,\n {\n id,\n path,\n partNumber,\n chunkSize,\n abortController: options.abortController,\n onUploadProgress: (e) => {\n partsUploaded[partNumber] = e.loaded;\n\n const uploaded = Object.values(partsUploaded).reduce((sum, a) => sum + a, 0);\n\n this.updateProgress(uploaded, file.size, options);\n }\n }\n );\n\n uploadedBytes += blob.size;\n\n // Use parts progress, ignore the overall progress, which may be inaccurate due to retries or concurrency\n // this.updateProgress(uploadedBytes, file.size, options);\n\n parts.push({ ETag: etag, PartNumber: partNumber });\n });\n\n promises.push(p);\n\n currentPart++;\n }\n\n await Promise.all(promises);\n\n if (isCancel) {\n const e = new Error('Upload cancelled');\n e.name = 'CanceledError';\n\n throw e;\n }\n\n // @Request complete\n const { url } = await this.request<{ url: string }>(\n 'complete',\n {\n id,\n path,\n parts: parts.sort((a, b) => a.PartNumber - b.PartNumber),\n profile: this.options.profile,\n },\n );\n\n this.trigger('success', { id, path, url });\n\n return { url, id, path };\n } catch (e) {\n if (uploadId) {\n await this.abort(uploadId, path);\n }\n\n this.trigger('failure', { error: e as Error, uploadId, path });\n\n throw e;\n } finally {\n if (this.options.leaveAlert === true) {\n window.removeEventListener('beforeunload', beforeUnloadHandler);\n }\n }\n }\n\n protected async uploadPart(\n file: File,\n payload: {\n id: string;\n path: string;\n partNumber: number;\n chunkSize: number;\n abortController?: AbortController;\n onUploadProgress: (e: AxiosProgressEvent) => void;\n }\n ) {\n const http = await useHttpClient();\n const { id, path, partNumber, chunkSize, onUploadProgress } = payload;\n\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(partNumber * chunkSize, file.size);\n\n const blob = file.slice(start, end);\n\n // @Request sign\n const { url } = await this.request<{ url: string; }>(\n 'sign',\n {\n id,\n path,\n partNumber,\n profile: this.options.profile,\n },\n {\n signal: payload.abortController?.signal,\n }\n );\n\n // PUT to S3\n const res = await http.put(\n url,\n blob,\n {\n onUploadProgress,\n }\n );\n\n const etag = String((res.headers as AxiosResponseHeaders).get('ETag') || '');\n\n return { blob, etag };\n }\n\n protected async request<T = Record<string, any>>(\n action: RouteActions,\n body: Record<string, any>,\n config: Partial<AxiosRequestConfig> = {}\n ): Promise<T> {\n if (this.options.requestHandler) {\n return this.options.requestHandler<T>(action, body);\n }\n\n const http = await useHttpClient();\n\n const res = await http.post<ApiReturn<T>>(await this.resolveRoute(action), body, config);\n\n return res.data.data;\n }\n\n // protected async abortBeacon(id: string, path: string): Promise<void> {\n // const data = new FormData();\n // data.append('id', id);\n // data.append('path', path);\n // data.append('profile', this.options.profile || '');\n //\n // await navigator.sendBeacon(route(await this.resolveRoute('abort')), data);\n // }\n\n async abort(id: string, path: string) {\n await this.request(\n 'abort',\n {\n id,\n path,\n profile: this.options.profile,\n }\n );\n }\n\n updateProgress(loaded: number, total: number, options: S3MultipartUploaderRequestOptions) {\n const percentage = (loaded / total) * 100;\n\n const event: ProgressEvent = { percentage, loaded, total };\n\n this.trigger('progress', event);\n\n this.options.onProgress?.(event);\n\n if (options.onProgress) {\n options.onProgress(event);\n }\n }\n\n async resolveRoute(action: RouteActions): Promise<string> {\n if (typeof this.options.routes === 'function') {\n return this.options.routes(action);\n }\n\n return this.options.routes[action];\n }\n\n setChunkSize(size: number): this {\n this.options.chunkSize = size;\n\n return this;\n }\n\n setChunkSizeInMiB(size: number): this {\n this.options.chunkSize = size * 1024 * 1024;\n\n return this;\n }\n\n replaceExt(path: string, file: File | Blob): string {\n if (file instanceof File) {\n const fileExt = file.name.split('.').pop();\n\n if (path.endsWith('.{ext}')) {\n return path.replace(/\\.{ext}$/, fileExt ? '.' + fileExt : '');\n }\n }\n\n return path;\n }\n\n on(\n event: 'start',\n handler: (file: File, data: { path: string; extra: Record<string, any>; [name: string]: any; }) => void\n ): this;\n on(event: 'inited', handler: (event: { id: string; path: string; }) => void): this;\n on(event: 'success', handler: (event: { url: string; id: string; path: string; }) => void): this;\n on(event: 'progress', handler: (event: ProgressEvent) => void): this;\n on(event: 'failure', handler: (event: { error: Error; id: string; path: string; }) => void): this;\n on(event: string | string[], handler: EventHandler): this {\n return super.on(event, handler);\n }\n}\n\ntype ProgressEvent = {\n percentage: number;\n loaded: number;\n total: number;\n};\ntype ProgressEventHandler = (e: ProgressEvent) => void;\n\nexport interface S3MultipartUploaderModule {\n S3MultipartUploader: typeof S3MultipartUploader;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { af as Mixin, ac as data, a7 as mergeDeep, u as useHttpClient, ag as EventMixin } from "./unicorn.js";
1
+ import { ah as Mixin, ae as data, a6 as mergeDeep, u as useHttpClient, ai as EventMixin } from "./unicorn.js";
2
2
  const instances = {};
3
3
  function get(name, options = {}) {
4
4
  return instances[name] ??= create(name, options);
@@ -77,6 +77,7 @@ class S3Uploader extends (/* @__PURE__ */ Mixin(EventMixin)) {
77
77
  this.options.endpoint || "",
78
78
  fileData,
79
79
  {
80
+ signal: options.signal,
80
81
  onUploadProgress: (e) => {
81
82
  if (options.onUploadProgress) {
82
83
  options.onUploadProgress(e);
@@ -1 +1 @@
1
- {"version":3,"file":"s3-uploader.js","sources":["../../src/module/s3-uploader.ts"],"sourcesContent":["import { useHttpClient } from '../composable';\nimport { data } from '../data';\nimport { EventAwareInterface, EventHandler, EventMixin } from '../events';\nimport type { UnicornHttpClient } from './http-client';\nimport { mergeDeep } from '../utilities';\nimport { AxiosProgressEvent, AxiosResponse } from 'axios';\nimport { Mixin } from 'ts-mixer';\n\nconst instances: Record<string, S3Uploader> = {};\nexport function get(name: string, options?: Partial<S3UploaderGlobalOptions>): S3Uploader;\nexport function get(\n name: string,\n options: Partial<S3UploaderGlobalOptions> = {}\n): S3Uploader | void {\n return instances[name] ??= create(name, options);\n}\n\nexport function create(name: string, options: Partial<S3UploaderGlobalOptions> = {}): S3Uploader {\n return new S3Uploader(name, options);\n}\n\nexport function destroy(name: string) {\n delete instances[name];\n}\n\nconst defaultOptions: S3UploaderGlobalOptions = {\n endpoint: '',\n subfolder: '',\n viewerHost: '',\n starts_with: [],\n formInputs: {\n acl: '',\n bucket: '',\n key: '',\n Policy: '',\n 'X-Amz-Algorithm': '',\n 'X-Amz-Credential': '',\n 'X-Amz-Date': '',\n 'X-Amz-Signature': '',\n }\n};\n\nexport class S3Uploader extends Mixin(EventMixin) implements EventAwareInterface {\n options: S3UploaderGlobalOptions;\n http?: UnicornHttpClient;\n\n constructor(protected name: string, options: Partial<S3UploaderGlobalOptions> = {}) {\n super();\n\n const awsOptions = data('@s3.uploader.' + name) || {};\n\n this.options = mergeDeep<S3UploaderGlobalOptions>({}, defaultOptions, awsOptions, options);\n }\n\n async getHttpClient() {\n return this.http ??= await useHttpClient();\n }\n\n /**\n * Do upload.\n */\n async upload(\n file: string | File | Blob,\n path: string,\n options: Partial<S3UploaderRequestOptions> = {}\n ): Promise<S3UploaderResponse> {\n const httpClient = await this.getHttpClient();\n\n const fileData = new FormData();\n const inputs = mergeDeep({}, this.options.formInputs, options.formInputs || {});\n\n if (typeof file === 'string') {\n file = new Blob([file], { type: options['Content-Type'] || 'text/plain' });\n }\n\n if (file instanceof Blob && path.endsWith('.{ext}')) {\n throw new Error('If using Blob or file data string, you must provide a valid file extension in the path.');\n }\n\n if ((file instanceof Blob) || (file as any) instanceof File) {\n options['Content-Type'] = options['Content-Type'] || file.type;\n }\n\n if (options['filename']) {\n const filename = this.replaceExt(options['filename'], file);\n options['Content-Disposition'] = 'attachment; filename*=UTF-8\\'\\'' + encodeURIComponent(filename);\n }\n\n path = this.replaceExt(path, file);\n\n options['key'] = trimSlashes(this.options.subfolder || '') + '/'\n + trimSlashes(path);\n options['key'] = trimSlashes(options['key']);\n options['Content-Type'] = options['Content-Type'] || undefined;\n options['Content-Disposition'] = options['Content-Disposition'] || undefined;\n\n // Prepare pre-signed data\n for (let key in inputs) {\n fileData.set(key, inputs[key]);\n }\n\n // Prepare custom data\n for (let key of Object.keys(this.options.starts_with)) {\n if (options[key]) {\n fileData.set(key, options[key]);\n }\n }\n\n fileData.append('file', file);\n\n this.trigger('start', fileData);\n\n try {\n let res = await httpClient.post(\n this.options.endpoint || '',\n fileData,\n {\n onUploadProgress: (e) => {\n if (options.onUploadProgress) {\n options.onUploadProgress(e);\n }\n\n this.trigger('upload-progress', e);\n\n if (e.total != null) {\n this.trigger('progress', e.loaded / e.total, e);\n }\n }\n }\n ) as S3UploaderResponse;\n\n const url = this.options.viewerHost + '/'\n + trimSlashes(path);\n\n this.trigger('success', url, res);\n\n res.url = url;\n\n return res;\n } finally {\n this.trigger('end');\n }\n }\n\n replaceExt(path: string, file: File | Blob): string {\n if (file instanceof File) {\n const fileExt = file.name.split('.').pop();\n\n if (path.endsWith('.{ext}')) {\n return path.replace(/\\.{ext}$/, fileExt ? '.' + fileExt : '');\n }\n }\n\n return path;\n }\n\n on(event: 'start', handler: StartEventHandler): this;\n on(event: 'success', handler: SuccessEventHandler): this;\n on(event: 'end', handler: EndEventHandler): this;\n on(event: 'upload-progress', handler: UploadProgressEventHandler): this;\n on(event: 'progress', handler: ProgressEventHandler): this;\n on(event: string | string[], handler: EventHandler): this {\n return super.on(event, handler);\n }\n\n onStart(handler: StartEventHandler): this {\n return this.on('start', handler);\n }\n\n onSuccess(handler: SuccessEventHandler): this {\n return this.on('success', handler);\n }\n\n onEnd(handler: EndEventHandler): this {\n return this.on('end', handler);\n }\n\n onProgress(handler: UploadProgressEventHandler): this {\n return this.on('upload-progress', handler);\n }\n\n onProgressWithTotal(handler: ProgressEventHandler): this {\n return this.on('progress', handler);\n }\n}\n\ntype EndEventHandler = () => void;\ntype SuccessEventHandler = (url: string, res: S3UploaderResponse) => void;\ntype StartEventHandler = (fileData: FormData) => void;\ntype UploadProgressEventHandler = (e: AxiosProgressEvent) => void;\ntype ProgressEventHandler = (total: number, e: AxiosProgressEvent) => void;\n\nfunction trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, '');\n}\n\nexport interface S3UploaderResponse extends AxiosResponse {\n url: string;\n}\n\nexport interface S3UploaderGlobalOptions {\n endpoint?: string;\n subfolder?: string;\n viewerHost?: string;\n starts_with: any[];\n formInputs?: {\n acl: string;\n bucket: string;\n key: string;\n Policy: string;\n 'X-Amz-Algorithm': string;\n 'X-Amz-Credential': string;\n 'X-Amz-Date': string;\n 'X-Amz-Signature': string;\n [name: string]: any\n },\n}\n\nexport interface S3UploaderRequestOptions {\n formInputs?: { [name: string]: any };\n onUploadProgress?: (e: AxiosProgressEvent) => void;\n 'Content-Type'?: string;\n 'Content-Disposition'?: string;\n key?: string;\n\n [name: string]: any;\n}\n\nexport interface S3UploaderModule {\n get(name: string, options?: Partial<S3UploaderGlobalOptions>): S3Uploader;\n create(name: string, options?: Partial<S3UploaderGlobalOptions>): S3Uploader;\n destroy(name: string): void;\n S3Uploader: typeof S3Uploader;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s3-uploader.js","sources":["../../src/module/s3-uploader.ts"],"sourcesContent":["import { useHttpClient } from '../composable';\nimport { data } from '../data';\nimport { EventAwareInterface, EventHandler, EventMixin } from '../events';\nimport type { UnicornHttpClient } from './http-client';\nimport { mergeDeep } from '../utilities';\nimport { AxiosProgressEvent, AxiosResponse } from 'axios';\nimport { Mixin } from 'ts-mixer';\n\nconst instances: Record<string, S3Uploader> = {};\nexport function get(name: string, options?: Partial<S3UploaderGlobalOptions>): S3Uploader;\nexport function get(\n name: string,\n options: Partial<S3UploaderGlobalOptions> = {}\n): S3Uploader | void {\n return instances[name] ??= create(name, options);\n}\n\nexport function create(name: string, options: Partial<S3UploaderGlobalOptions> = {}): S3Uploader {\n return new S3Uploader(name, options);\n}\n\nexport function destroy(name: string) {\n delete instances[name];\n}\n\nconst defaultOptions: S3UploaderGlobalOptions = {\n endpoint: '',\n subfolder: '',\n viewerHost: '',\n starts_with: [],\n formInputs: {\n acl: '',\n bucket: '',\n key: '',\n Policy: '',\n 'X-Amz-Algorithm': '',\n 'X-Amz-Credential': '',\n 'X-Amz-Date': '',\n 'X-Amz-Signature': '',\n }\n};\n\nexport class S3Uploader extends Mixin(EventMixin) implements EventAwareInterface {\n options: S3UploaderGlobalOptions;\n http?: UnicornHttpClient;\n\n constructor(protected name: string, options: Partial<S3UploaderGlobalOptions> = {}) {\n super();\n\n const awsOptions = data('@s3.uploader.' + name) || {};\n\n this.options = mergeDeep<S3UploaderGlobalOptions>({}, defaultOptions, awsOptions, options);\n }\n\n async getHttpClient() {\n return this.http ??= await useHttpClient();\n }\n\n /**\n * Do upload.\n */\n async upload(\n file: string | File | Blob,\n path: string,\n options: Partial<S3UploaderRequestOptions> = {}\n ): Promise<S3UploaderResponse> {\n const httpClient = await this.getHttpClient();\n\n const fileData = new FormData();\n const inputs = mergeDeep({}, this.options.formInputs, options.formInputs || {});\n\n if (typeof file === 'string') {\n file = new Blob([file], { type: options['Content-Type'] || 'text/plain' });\n }\n\n if (file instanceof Blob && path.endsWith('.{ext}')) {\n throw new Error('If using Blob or file data string, you must provide a valid file extension in the path.');\n }\n\n if ((file instanceof Blob) || (file as any) instanceof File) {\n options['Content-Type'] = options['Content-Type'] || file.type;\n }\n\n if (options['filename']) {\n const filename = this.replaceExt(options['filename'], file);\n options['Content-Disposition'] = 'attachment; filename*=UTF-8\\'\\'' + encodeURIComponent(filename);\n }\n\n path = this.replaceExt(path, file);\n\n options['key'] = trimSlashes(this.options.subfolder || '') + '/'\n + trimSlashes(path);\n options['key'] = trimSlashes(options['key']);\n options['Content-Type'] = options['Content-Type'] || undefined;\n options['Content-Disposition'] = options['Content-Disposition'] || undefined;\n\n // Prepare pre-signed data\n for (let key in inputs) {\n fileData.set(key, inputs[key]);\n }\n\n // Prepare custom data\n for (let key of Object.keys(this.options.starts_with)) {\n if (options[key]) {\n fileData.set(key, options[key]);\n }\n }\n\n fileData.append('file', file);\n\n this.trigger('start', fileData);\n\n try {\n let res = await httpClient.post(\n this.options.endpoint || '',\n fileData,\n {\n signal: options.signal,\n onUploadProgress: (e) => {\n if (options.onUploadProgress) {\n options.onUploadProgress(e);\n }\n\n this.trigger('upload-progress', e);\n\n if (e.total != null) {\n this.trigger('progress', e.loaded / e.total, e);\n }\n }\n }\n ) as S3UploaderResponse;\n\n const url = this.options.viewerHost + '/'\n + trimSlashes(path);\n\n this.trigger('success', url, res);\n\n res.url = url;\n\n return res;\n } finally {\n this.trigger('end');\n }\n }\n\n replaceExt(path: string, file: File | Blob): string {\n if (file instanceof File) {\n const fileExt = file.name.split('.').pop();\n\n if (path.endsWith('.{ext}')) {\n return path.replace(/\\.{ext}$/, fileExt ? '.' + fileExt : '');\n }\n }\n\n return path;\n }\n\n on(event: 'start', handler: StartEventHandler): this;\n on(event: 'success', handler: SuccessEventHandler): this;\n on(event: 'end', handler: EndEventHandler): this;\n on(event: 'upload-progress', handler: UploadProgressEventHandler): this;\n on(event: 'progress', handler: ProgressEventHandler): this;\n on(event: string | string[], handler: EventHandler): this {\n return super.on(event, handler);\n }\n\n onStart(handler: StartEventHandler): this {\n return this.on('start', handler);\n }\n\n onSuccess(handler: SuccessEventHandler): this {\n return this.on('success', handler);\n }\n\n onEnd(handler: EndEventHandler): this {\n return this.on('end', handler);\n }\n\n onProgress(handler: UploadProgressEventHandler): this {\n return this.on('upload-progress', handler);\n }\n\n onProgressWithTotal(handler: ProgressEventHandler): this {\n return this.on('progress', handler);\n }\n}\n\ntype EndEventHandler = () => void;\ntype SuccessEventHandler = (url: string, res: S3UploaderResponse) => void;\ntype StartEventHandler = (fileData: FormData) => void;\ntype UploadProgressEventHandler = (e: AxiosProgressEvent) => void;\ntype ProgressEventHandler = (total: number, e: AxiosProgressEvent) => void;\n\nfunction trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, '');\n}\n\nexport interface S3UploaderResponse extends AxiosResponse {\n url: string;\n}\n\nexport interface S3UploaderGlobalOptions {\n endpoint?: string;\n subfolder?: string;\n viewerHost?: string;\n starts_with: any[];\n formInputs?: {\n acl: string;\n bucket: string;\n key: string;\n Policy: string;\n 'X-Amz-Algorithm': string;\n 'X-Amz-Credential': string;\n 'X-Amz-Date': string;\n 'X-Amz-Signature': string;\n [name: string]: any\n },\n}\n\nexport interface S3UploaderRequestOptions {\n formInputs?: { [name: string]: any };\n onUploadProgress?: (e: AxiosProgressEvent) => void;\n 'Content-Type'?: string;\n 'Content-Disposition'?: string;\n key?: string;\n signal?: AbortSignal;\n\n [name: string]: any;\n}\n\nexport interface S3UploaderModule {\n get(name: string, options?: Partial<S3UploaderGlobalOptions>): S3Uploader;\n create(name: string, options?: Partial<S3UploaderGlobalOptions>): S3Uploader;\n destroy(name: string): void;\n S3Uploader: typeof S3Uploader;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { v as selectOne, a7 as mergeDeep, m as useStack, u as useHttpClient, ai as useScriptImport } from "./unicorn.js";
1
+ import { v as selectOne, a6 as mergeDeep, m as useStack, u as useHttpClient, ak as useScriptImport } from "./unicorn.js";
2
2
  const instances = {};
3
3
  let hooks = [];
4
4
  let imported;