@knime/product-features 1.1.3 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/dataTransfer.js +8 -116
- package/dist/dataTransfer.js.map +1 -1
- package/dist/index-B3ql6hun.js +2695 -0
- package/dist/index-B3ql6hun.js.map +1 -0
- package/dist/nodes.css +119 -0
- package/dist/nodes.js +270 -101
- package/dist/nodes.js.map +1 -1
- package/dist/rfcErrors.js +1 -1
- package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/index.d.ts +1 -1
- package/dist/src/dataTransfer/shared/ui/CollapsiblePanel/index.d.ts.map +1 -1
- package/dist/src/dataTransfer/shared/ui/ProgressItem/index.d.ts +1 -1
- package/dist/src/dataTransfer/shared/ui/ProgressItem/index.d.ts.map +1 -1
- package/dist/src/nodes/NodePreview/NodePreview.vue.d.ts +4 -0
- package/dist/src/nodes/NodePreview/NodePreview.vue.d.ts.map +1 -0
- package/dist/src/nodes/NodePreview/SVGNodeTorso.vue.d.ts +4 -0
- package/dist/src/nodes/NodePreview/SVGNodeTorso.vue.d.ts.map +1 -0
- package/dist/src/nodes/NodePreview/constants.d.ts +2 -0
- package/dist/src/nodes/NodePreview/constants.d.ts.map +1 -0
- package/dist/src/nodes/NodePreview/enums.d.ts +27 -0
- package/dist/src/nodes/NodePreview/enums.d.ts.map +1 -0
- package/dist/src/nodes/NodePreview/index.d.ts +3 -0
- package/dist/src/nodes/NodePreview/index.d.ts.map +1 -0
- package/dist/src/nodes/NodePreview/types.d.ts +68 -0
- package/dist/src/nodes/NodePreview/types.d.ts.map +1 -0
- package/dist/src/nodes/PortIcon/PortIcon.vue.d.ts.map +1 -1
- package/dist/src/nodes/PortIcon/SVGPortIcon.vue.d.ts +4 -0
- package/dist/src/nodes/PortIcon/SVGPortIcon.vue.d.ts.map +1 -0
- package/dist/src/nodes/PortIcon/constants.d.ts +3 -0
- package/dist/src/nodes/PortIcon/constants.d.ts.map +1 -0
- package/dist/src/nodes/index.d.ts +2 -0
- package/dist/src/nodes/index.d.ts.map +1 -1
- package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts +6 -4
- package/dist/src/versions/VersionHistory/VersionLabel.vue.d.ts.map +1 -1
- package/dist/toasts.js +2 -9
- package/dist/toasts.js.map +1 -1
- package/dist/versions.js +1 -1
- package/package.json +8 -8
- package/dist/format-ra_vlnN7.js +0 -238
- package/dist/format-ra_vlnN7.js.map +0 -1
package/dist/dataTransfer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataTransfer.js","sources":["../src/dataTransfer/shared/ui/CollapsiblePanel/useIconFlipper.ts","../src/dataTransfer/shared/ui/CollapsiblePanel/CollapsiblePanel.vue","../src/dataTransfer/shared/ui/ProgressItem/ProgressItem.vue","../src/dataTransfer/shared/ui/ProgressList/ProgressList.vue","../../../node_modules/.pnpm/@knime+utils@1.11.1_consola@3.4.2/node_modules/@knime/utils/src/promise/createAbortablePromise.ts","../../../node_modules/.pnpm/@knime+utils@1.11.1_consola@3.4.2/node_modules/@knime/utils/src/sleep.ts","../../../node_modules/.pnpm/@knime+utils@1.11.1_consola@3.4.2/node_modules/@knime/utils/src/promise/retryPromise.ts","../../../node_modules/.pnpm/@knime+utils@1.11.1_consola@3.4.2/node_modules/@knime/utils/src/fileExtensions.ts","../src/dataTransfer/upload/ui/UploadProgressPanelItem.vue","../src/dataTransfer/upload/ui/UploadProgressPanel.vue","../src/dataTransfer/download/ui/DownloadProgressPanelItem.vue","../src/dataTransfer/download/ui/DownloadProgressPanel.vue","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/object/merge.mjs","../src/dataTransfer/shared/httpClient/constants.ts","../src/dataTransfer/shared/httpClient/createHttpClient.ts","../src/dataTransfer/upload/manager/index.ts","../src/dataTransfer/upload/ui/useUploadManager.ts","../src/dataTransfer/upload/useFileUpload.ts","../src/dataTransfer/download/useDownloadArtifact.ts"],"sourcesContent":["import { type CSSProperties, type ComputedRef, computed } from \"vue\";\n\ntype UseIconFlipperOptions = {\n active: ComputedRef<boolean>;\n initialRotation?: `${string}deg`;\n};\n\nexport const useIconFlipper = (options: UseIconFlipperOptions) => {\n const iconFlipStyles = computed<CSSProperties>(() => {\n const declaration: Partial<CSSProperties> = {\n transition: \"transform 0.2s linear\",\n transform: \"scaleY(1)\",\n };\n\n if (options.initialRotation) {\n declaration.rotate = `${options.initialRotation}`;\n }\n\n const transform = options.active.value ? \"scaleY(-1)\" : undefined;\n\n return { ...declaration, transform };\n });\n\n return { iconFlipStyles };\n};\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nimport { KdsButton } from \"@knime/kds-components\";\n\nimport type { CollapsiblePanelProps } from \"./types\";\nimport { useIconFlipper } from \"./useIconFlipper\";\n\nconst { headline, canBeDismissed = false } =\n defineProps<CollapsiblePanelProps>();\n\nconst emit = defineEmits<{\n close: [];\n}>();\n\nconst modelValue = defineModel<boolean>({ default: true });\n\nconst { iconFlipStyles } = useIconFlipper({\n active: computed(() => modelValue.value),\n initialRotation: \"180deg\",\n});\nconst panelContentId = useId();\n</script>\n\n<template>\n <div class=\"collapsible-panel\" :class=\"{ collapsed: !modelValue }\">\n <div class=\"title-bar\">\n {{ headline }}\n <div class=\"actions\">\n <KdsButton\n size=\"small\"\n variant=\"transparent\"\n leading-icon=\"chevron-up\"\n :aria-expanded=\"modelValue\"\n :aria-controls=\"panelContentId\"\n :ariaLabel=\"modelValue ? 'Collapse' : 'Expand'\"\n :style=\"iconFlipStyles\"\n @click=\"modelValue = !modelValue\"\n />\n\n <KdsButton\n v-if=\"canBeDismissed\"\n size=\"small\"\n variant=\"transparent\"\n ariaLabel=\"Close\"\n leading-icon=\"x-close\"\n @click=\"emit('close')\"\n />\n </div>\n </div>\n\n <Transition name=\"expand\">\n <div v-show=\"modelValue\" :id=\"panelContentId\" class=\"panel-content\">\n <slot />\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped>\n.collapsible-panel {\n background: var(--kds-color-surface-default);\n border-radius: var(--kds-spacing-container-0-25x);\n box-shadow: var(--kds-elevation-level-3);\n\n & .title-bar {\n display: flex;\n align-items: center;\n height: var(--kds-dimension-component-height-2-5x);\n padding: var(--kds-spacing-container-0-5x)\n var(--kds-spacing-container-0-75x);\n font: var(--kds-font-base-title-small-strong);\n color: var(--kds-color-text-and-icon-neutral);\n\n & .actions {\n display: flex;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n margin-left: auto;\n }\n }\n\n &:not(.collapsed) {\n & .title-bar {\n border-bottom: var(--kds-border-base-subtle);\n }\n }\n}\n\n.panel-content {\n overflow: hidden;\n}\n\n.expand-enter-active,\n.expand-leave-active {\n display: grid;\n overflow: hidden;\n transition:\n grid-template-rows 0.2s ease-in-out,\n opacity 0.2s ease-in-out;\n}\n\n.expand-enter-from,\n.expand-leave-to {\n grid-template-rows: 0fr;\n opacity: 0;\n}\n\n.expand-enter-to,\n.expand-leave-from {\n grid-template-rows: 1fr;\n opacity: 1;\n}\n\n.panel-content > :deep(*) {\n min-height: 0;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport {\n KdsBadge,\n KdsButton,\n KdsIcon,\n KdsProgressBar,\n vKdsTooltip,\n} from \"@knime/kds-components\";\n\nimport { type ProgressItemProps } from \"./types\";\n\ndefineProps<ProgressItemProps>();\n</script>\n\n<template>\n <div class=\"progress-wrapper\">\n <div :class=\"['progress-item', { padded: progress === undefined }]\">\n <div class=\"item-info\">\n <KdsIcon :name=\"icon\" />\n\n <div class=\"item-name\">\n <div v-kds-tooltip:truncated=\"headline\" class=\"title\">\n {{ headline }}\n </div>\n <span v-if=\"subtitle\" class=\"subtitle\">\n {{ subtitle }}\n </span>\n </div>\n </div>\n\n <div class=\"item-action\">\n <KdsBadge\n v-if=\"badge\"\n :variant=\"badge.variant\"\n :label=\"badge.text\"\n :leading-icon=\"badge.icon\"\n size=\"xxsmall\"\n />\n\n <template v-for=\"action in actions.slice(0, 2)\" :key=\"action.id\">\n <KdsButton\n :leading-icon=\"action.icon\"\n :ariaLabel=\"action.label\"\n variant=\"transparent\"\n @click=\"action.handler\"\n />\n </template>\n </div>\n </div>\n\n <div v-if=\"typeof progress === 'number'\" class=\"progress\">\n <KdsProgressBar :percentage=\"progress\" size=\"medium\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.progress-wrapper {\n --base-padding: var(--kds-spacing-container-1x);\n --progress-bar-height: var(--kds-dimension-component-height-0-25x);\n --progress-bar-distance: var(--kds-spacing-container-0-25x);\n\n display: flex;\n flex-direction: column;\n gap: var(--progress-bar-distance);\n height: var(--kds-dimension-component-height-4x);\n padding: var(--base-padding);\n}\n\n.progress-item {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n\n /* add extra margin to prevent content jump when a progress bars appears/disappears */\n &.padded {\n margin-bottom: calc(\n var(--progress-bar-height) + var(--progress-bar-distance)\n );\n }\n}\n\n.progress {\n min-height: var(--progress-bar-height);\n}\n\n.item-info {\n display: flex;\n flex-grow: 1;\n gap: var(--kds-spacing-container-0-25x);\n overflow: hidden;\n\n & .item-name {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-25x);\n justify-content: center;\n overflow: hidden;\n color: var(--kds-color-text-and-icon-neutral);\n\n & .title {\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n font: var(--kds-font-base-interactive-small);\n white-space: nowrap;\n }\n\n & .subtitle {\n font: var(--kds-font-base-subtext-small);\n }\n }\n}\n\n.item-action {\n display: flex;\n flex-shrink: 0;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n}\n</style>\n","<template>\n <div class=\"progress-list\" tabindex=\"0\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.progress-list {\n max-height: var(--kds-dimension-component-height-20x);\n overflow-y: auto;\n\n &:deep(.progress-wrapper):not(:first-child) {\n border-top: var(--kds-border-base-subtle);\n }\n}\n</style>\n","export class AbortError extends Error {}\n\n/**\n * Helper to create an abortable promise. Returns an AbortController and a Function\n * that you can pass your async handler to. Whenever the AbortController signal is\n * aborted then the async handler's promise will reject with an AbortError\n *\n * Example:\n * ```\n * import { abortUtils } from \"@knime/utils\"\n * const myFetchCall = async (params...) => {...};\n *\n * try {\n * const { runAbortablePromise, abortController } = createAbortablePromise(() =>\n * myFetchCall(params...),\n * );\n * } catch (e) {\n * if (e instanceof abortUtils.AbortError) {\n * console.info('ignore due to abort');\n * return;\n * }\n * }\n *\n * // somewhere else (while request is in-flight)\n * abortController.abort(new abortUtils.AbortError('reason here'))\n * ```\n */\nexport const createAbortablePromise = () => {\n const abortController: AbortController = new AbortController();\n\n const runAbortablePromise = <T = unknown>(request: () => Promise<T>) => {\n return new Promise<T>((resolve, reject) => {\n // abort logic\n const abortListener = ({ target }: Event) => {\n abortController.signal.removeEventListener(\"abort\", abortListener);\n const reason = (target as AbortSignal).reason;\n reject(reason instanceof AbortError ? reason : new AbortError(reason));\n };\n\n // the actual call\n request()\n .then(resolve)\n .catch((error) => {\n if (error instanceof AbortError) {\n return;\n }\n\n reject(error);\n });\n\n abortController.signal.addEventListener(\"abort\", abortListener);\n });\n };\n\n return { abortController, runAbortablePromise };\n};\n","/**\n * Returns promise that resolves after ms.\n */\nexport default function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import sleep from \"../sleep\";\n\nexport const DEFAULT_RETRY_DELAY_MS = 0;\nexport const DEFAULT_RETRY_COUNT = 5;\n\n/**\n * Helper to add retry capability to an async function\n * @param fn async function\n * @param retryCount max number of retries. defaults to 5\n * @param retryDelayMS delay in-between retries in millisecs. defaults to 0\n * @param excludeError predicate fn to exclude specific errors from causing a retry\n */\nexport async function retryPromise<T>({\n fn,\n retryCount = DEFAULT_RETRY_COUNT,\n retryDelayMS = DEFAULT_RETRY_DELAY_MS,\n excludeError,\n}: {\n fn: () => Promise<T>;\n retryCount?: number;\n retryDelayMS?: number;\n excludeError?: (error: Error) => boolean;\n}) {\n try {\n return await fn();\n } catch (error) {\n if (excludeError?.(error as Error)) {\n throw error;\n }\n\n if (retryCount > 0) {\n await sleep(retryDelayMS);\n\n // eslint-disable-next-line no-return-await\n return await retryPromise({\n fn,\n retryCount: retryCount - 1,\n retryDelayMS,\n excludeError,\n });\n }\n\n throw error;\n }\n}\n","/**\n * Gets the file extension\n * @param nameOrPath can take a full file name (e.g \"file.txt\") or a path to a file\n * (e.g \"file://path/to/file.txt\" OR \"/path/to/file.txt\")\n * @returns just the file extension (e.g \"txt\")\n */\nexport const getFileExtension = (nameOrPath: string): string => {\n const basename = nameOrPath.split(/[\\\\/]/).pop() ?? \"\";\n\n const parts = basename.split(\".\");\n\n if (basename === \"\" || parts.length === 1) {\n return \"\";\n }\n\n return parts.at(-1) ?? \"\";\n};\n\n/**\n * Metadata for .knar files, which corresponds to exported KNIME Workflow Groups\n * or Components\n */\nconst KNAR = Object.freeze({\n extension: \"knar\",\n mimeType: \"application/vnd.knime.workflow-group+zip\",\n matches(file: File) {\n const extension = getFileExtension(file.name);\n return extension === this.extension;\n },\n});\n\n/**\n * Metadata for .knwf files, which corresponds to exported KNIME Workflows\n */\nconst KNWF = Object.freeze({\n extension: \"knwf\",\n mimeType: \"application/vnd.knime.workflow+zip\",\n matches(file: File) {\n const extension = getFileExtension(file.name);\n return extension === this.extension;\n },\n /**\n * Gets the name of a .knwf file without the extension. If the file is not\n * matched as a .knwf file then this function will return the default value,\n * which is empty string (\"\") if param is not provided\n */\n getNameOrDefault(file: File, defaultValue = \"\"): string {\n if (!this.matches(file)) {\n return defaultValue;\n }\n\n return file.name.replace(`.${this.extension}`, \"\");\n },\n});\n\nexport const knimeFileFormats = { KNAR, KNWF };\n\n/**\n * Gets the mime type from a given file. Defaults to `application/octet-stream`\n * if mimeType cannot be detected\n * @param file File\n * @returns mimeType\n */\nexport const getFileMimeType = (file: File): string => {\n const DEFAULT_MIMETYPE = \"application/octet-stream\";\n\n const extension = getFileExtension(file.name);\n\n if (!extension) {\n return DEFAULT_MIMETYPE;\n }\n\n if (KNWF.matches(file)) {\n return KNWF.mimeType;\n }\n\n if (KNAR.matches(file)) {\n return KNAR.mimeType;\n }\n\n // file has extension but unrecognizable mime type\n if (!file.type) {\n return DEFAULT_MIMETYPE;\n }\n\n return file.type;\n};\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { KdsBadgeVariant, KdsIconName } from \"@knime/kds-components\";\nimport {\n formatFileSize,\n getFileExtension,\n knimeFileFormats,\n} from \"@knime/utils\";\n\nimport {\n ProgressItem,\n type ProgressItemAction,\n type ProgressItemBadge,\n} from \"../../shared/ui\";\n\nimport type { UploadItem, UploadItemStatus, WithProgress } from \"./types\";\n\ntype Props = {\n item: UploadItem;\n allowCancel: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n cancel: [];\n}>();\n\nconst hasProgress = (item: UploadItem): item is WithProgress => {\n return item.status === \"inprogress\" || item.status === \"complete\";\n};\n\nconst totalFormatted = computed(() => {\n return formatFileSize(props.item.size);\n});\n\nconst progressedFormatted = computed(() => {\n if (hasProgress(props.item)) {\n const sizePercentage = (props.item.size / 100) * (props.item.progress ?? 0);\n return formatFileSize(sizePercentage);\n }\n\n return 0;\n});\n\nconst subtitle = computed(() =>\n props.item.status === \"inprogress\"\n ? `${progressedFormatted.value} of ${totalFormatted.value}`\n : `${totalFormatted.value}`,\n);\n\nconst statusMapper = {\n inprogress: [\"Uploading\", \"info\", \"reload\"],\n failed: [\"Failed\", \"error\", \"circle-error\"],\n complete: [\"Uploaded\", \"success\", \"circle-success\"],\n cancelled: [\"Cancelled\", \"error\", \"circle-error\"],\n processing: [\"Processing\", \"info\", \"reload\"],\n} satisfies Record<UploadItemStatus, [string, KdsBadgeVariant, KdsIconName]>;\n\nconst itemIcon = computed<KdsIconName>(() => {\n const extension = getFileExtension(props.item.name);\n return extension === knimeFileFormats.KNWF.extension ? \"workflow\" : \"file\";\n});\n\nconst badge = computed<ProgressItemBadge | undefined>(() => {\n if (!props.item.status) {\n return undefined;\n }\n\n const [text, variant, icon] = statusMapper[props.item.status];\n\n return { text, variant, icon } satisfies ProgressItemBadge;\n});\n\nconst shouldShowCancelAction = computed(\n () => props.allowCancel && props.item.status === \"inprogress\",\n);\n\nconst actions = computed<Array<ProgressItemAction>>(() => {\n return shouldShowCancelAction.value\n ? ([\n {\n id: \"cancel\",\n icon: \"x-close\",\n label: \"Cancel\",\n handler: () => emit(\"cancel\"),\n },\n ] satisfies ProgressItemAction[])\n : [];\n});\n</script>\n\n<template>\n <ProgressItem\n :id=\"item.id\"\n :headline=\"item.name\"\n :subtitle=\"subtitle\"\n :icon=\"itemIcon\"\n :progress=\"hasProgress(item) ? item.progress : undefined\"\n :badge=\"badge\"\n :actions=\"actions\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { KdsLoadingSkeleton } from \"@knime/kds-components\";\n\nimport { CollapsiblePanel, ProgressList } from \"../../shared/ui\";\n\nimport UploadProgressPanelItem from \"./UploadProgressPanelItem.vue\";\nimport type { UploadItem, UploadProgressPanelProps } from \"./types\";\n\nconst {\n items,\n allowCancel = true,\n placeholderItems = 0,\n} = defineProps<UploadProgressPanelProps>();\n\nconst emit = defineEmits<{\n cancel: [item: UploadItem];\n close: [];\n}>();\n\nconst expanded = defineModel<boolean>(\"expanded\", { default: true });\n\nconst totalItems = computed(() => items.length);\nconst uploadedItems = computed(\n () => items.filter(({ status }) => status === \"complete\").length,\n);\n\nconst headline = computed(() => {\n const suffix = `file${totalItems.value > 1 ? \"s\" : \"\"}`;\n return `Uploaded ${uploadedItems.value} of ${totalItems.value} ${suffix}`;\n});\n\nconst hasSomeItemInProgress = computed(\n () =>\n items.some(\n ({ status }) => status === \"inprogress\" || status === \"processing\",\n ) || placeholderItems > 0,\n);\n</script>\n\n<template>\n <CollapsiblePanel\n v-model=\"expanded\"\n :headline=\"headline\"\n class=\"upload-panel\"\n :can-be-dismissed=\"!hasSomeItemInProgress\"\n @close=\"emit('close')\"\n >\n <div class=\"upload-panel-content\">\n <ProgressList>\n <UploadProgressPanelItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :item=\"item\"\n :allow-cancel=\"allowCancel\"\n @cancel=\"emit('cancel', item)\"\n />\n </ProgressList>\n\n <template v-if=\"placeholderItems > 0\">\n <div\n v-for=\"skeleton in placeholderItems\"\n :key=\"skeleton\"\n class=\"skeleton-container\"\n >\n <KdsLoadingSkeleton variant=\"icon-large\" />\n <div class=\"skeleton-text-content\">\n <KdsLoadingSkeleton variant=\"label\" />\n <KdsLoadingSkeleton variant=\"text\" />\n </div>\n </div>\n </template>\n </div>\n </CollapsiblePanel>\n</template>\n\n<style scoped>\n.upload-panel {\n width: var(--kds-dimension-component-width-20x);\n max-width: var(--kds-dimension-component-width-20x);\n}\n\n.upload-panel-content {\n max-height: var(--kds-dimension-component-height-20x);\n}\n\n.skeleton-container {\n display: grid;\n grid-template-columns: min-content 1fr;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n min-height: var(--kds-dimension-component-height-4x);\n padding: 0 var(--kds-spacing-container-1x);\n border-top: var(--kds-border-base-subtle);\n\n & .skeleton-text-content {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-25x);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { KdsBadgeVariant, KdsIconName } from \"@knime/kds-components\";\n\nimport {\n ProgressItem,\n type ProgressItemAction,\n type ProgressItemBadge,\n} from \"../../shared/ui\";\n\nimport type { DownloadItem } from \"./types\";\n\ntype Props = {\n item: DownloadItem;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n cancel: [];\n download: [];\n}>();\n\nconst statusMapper = {\n IN_PROGRESS: [\"Zipping\", \"info\", \"reload\"],\n READY: [\"Ready\", \"success\", \"circle-info\"],\n CANCELLED: [\"Cancelled\", \"error\", \"circle-error\"],\n FAILED: [\"Failed\", \"error\", \"circle-error\"],\n} satisfies Record<\n DownloadItem[\"status\"],\n [string, KdsBadgeVariant, KdsIconName]\n>;\n\nconst badge = computed<ProgressItemBadge>(() => {\n const [text, variant, icon] = statusMapper[props.item.status];\n\n return {\n text,\n variant,\n icon,\n } satisfies ProgressItemBadge;\n});\n\nconst isCancellable = computed(() => props.item.status === \"IN_PROGRESS\");\nconst isReady = computed(() => props.item.status === \"READY\");\n\nconst actions = computed<Array<ProgressItemAction>>(() => {\n const actions: ProgressItemAction[] = [];\n\n if (isCancellable.value) {\n actions.push({\n id: \"cancel\",\n icon: \"x-close\",\n label: \"Cancel\",\n handler: () => emit(\"cancel\"),\n });\n }\n\n if (isReady.value) {\n actions.push({\n id: \"download\",\n icon: \"cloud-download\",\n label: \"Download again\",\n handler: () => emit(\"download\"),\n });\n }\n\n return actions;\n});\n</script>\n\n<template>\n <ProgressItem\n :id=\"item.downloadId\"\n icon=\"file\"\n :headline=\"item.name\"\n :badge=\"badge\"\n :actions=\"actions\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, watch } from \"vue\";\n\nimport { CollapsiblePanel, ProgressList } from \"../../shared/ui\";\n\nimport DownloadProgressPanelItem from \"./DownloadProgressPanelItem.vue\";\nimport type { DownloadItem } from \"./types\";\n\ntype Props = {\n /**\n * List of current download items that should be displayed\n */\n items: DownloadItem[];\n};\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n cancel: [item: DownloadItem];\n download: [item: DownloadItem];\n close: [];\n}>();\n\nconst expanded = defineModel<boolean>(\"expanded\", { default: true });\n\nconst totalItems = computed(() => props.items.length);\nconst totalDownloadedItems = computed(\n () => props.items.filter(({ status }) => status === \"READY\").length,\n);\n\nconst headline = computed(() => {\n const suffix = `file${totalItems.value > 1 ? \"s\" : \"\"}`;\n return `Downloaded ${totalDownloadedItems.value} of ${totalItems.value} ${suffix}`;\n});\n\nconst hasItemsInProgress = computed(() =>\n props.items.some(({ status }) => status === \"IN_PROGRESS\"),\n);\n\nwatch(\n () => props.items?.length,\n (newValue, oldValue) => {\n if (oldValue > 0 && !newValue) {\n emit(\"close\");\n }\n },\n);\n</script>\n\n<template>\n <CollapsiblePanel\n v-model=\"expanded\"\n :headline=\"headline\"\n class=\"download-panel\"\n :can-be-dismissed=\"!hasItemsInProgress\"\n @close=\"emit('close')\"\n >\n <div class=\"download-panel-content\">\n <ProgressList>\n <DownloadProgressPanelItem\n v-for=\"item in items\"\n :key=\"item.downloadId\"\n :item=\"item\"\n @cancel=\"emit('cancel', item)\"\n @download=\"emit('download', item)\"\n />\n </ProgressList>\n </div>\n </CollapsiblePanel>\n</template>\n\n<style scoped>\n.download-panel {\n width: var(--kds-dimension-component-width-20x);\n max-width: var(--kds-dimension-component-width-20x);\n}\n\n.download-panel-content {\n max-height: var(--kds-dimension-component-height-20x);\n}\n</style>\n","//#region src/predicate/isPlainObject.ts\n/**\n* Checks if a given value is a plain object.\n*\n* @param value - The value to check.\n* @returns True if the value is a plain object, otherwise false.\n*\n* @example\n* ```typescript\n* // ✅👇 True\n*\n* isPlainObject({ }); // ✅\n* isPlainObject({ key: 'value' }); // ✅\n* isPlainObject({ key: new Date() }); // ✅\n* isPlainObject(new Object()); // ✅\n* isPlainObject(Object.create(null)); // ✅\n* isPlainObject({ nested: { key: true} }); // ✅\n* isPlainObject(new Proxy({}, {})); // ✅\n* isPlainObject({ [Symbol('tag')]: 'A' }); // ✅\n*\n* // ✅👇 (cross-realms, node context, workers, ...)\n* const runInNewContext = await import('node:vm').then(\n* (mod) => mod.runInNewContext\n* );\n* isPlainObject(runInNewContext('({})')); // ✅\n*\n* // ❌👇 False\n*\n* class Test { };\n* isPlainObject(new Test()) // ❌\n* isPlainObject(10); // ❌\n* isPlainObject(null); // ❌\n* isPlainObject('hello'); // ❌\n* isPlainObject([]); // ❌\n* isPlainObject(new Date()); // ❌\n* isPlainObject(new Uint8Array([1])); // ❌\n* isPlainObject(Buffer.from('ABC')); // ❌\n* isPlainObject(Promise.resolve({})); // ❌\n* isPlainObject(Object.create({})); // ❌\n* isPlainObject(new (class Cls {})); // ❌\n* isPlainObject(globalThis); // ❌,\n* ```\n*/\nfunction isPlainObject(value) {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;\n\treturn Object.prototype.toString.call(value) === \"[object Object]\";\n}\n//#endregion\nexport { isPlainObject };\n","//#region src/_internal/isUnsafeProperty.ts\n/**\n* Checks if a property key is unsafe to modify directly.\n*\n* This function is used in functions like `merge` to prevent prototype pollution attacks\n* by identifying property keys that could modify the object's prototype chain or constructor.\n*\n* @param key - The property key to check\n* @returns `true` if the property is unsafe to modify directly, `false` otherwise\n* @internal\n*/\nfunction isUnsafeProperty(key) {\n\treturn key === \"__proto__\";\n}\n//#endregion\nexport { isUnsafeProperty };\n","import { isPlainObject } from \"../predicate/isPlainObject.mjs\";\nimport { isUnsafeProperty } from \"../_internal/isUnsafeProperty.mjs\";\n//#region src/object/merge.ts\n/**\n* Merges the properties of the source object into the target object.\n*\n* This function performs a deep merge, meaning nested objects and arrays are merged recursively.\n* If a property in the source object is an array or an object and the corresponding property in the target object is also an array or object, they will be merged.\n* If a property in the source object is undefined, it will not overwrite a defined property in the target object.\n*\n* Note that this function mutates the target object.\n*\n* @param target - The target object into which the source object properties will be merged. This object is modified in place.\n* @param source - The source object whose properties will be merged into the target object.\n* @returns The updated target object with properties from the source object merged in.\n*\n* @template T - Type of the target object.\n* @template S - Type of the source object.\n*\n* @example\n* const target = { a: 1, b: { x: 1, y: 2 } };\n* const source = { b: { y: 3, z: 4 }, c: 5 };\n*\n* const result = merge(target, source);\n* console.log(result);\n* // Output: { a: 1, b: { x: 1, y: 3, z: 4 }, c: 5 }\n*\n* @example\n* const target = { a: [1, 2], b: { x: 1 } };\n* const source = { a: [3], b: { y: 2 } };\n*\n* const result = merge(target, source);\n* console.log(result);\n* // Output: { a: [3, 2], b: { x: 1, y: 2 } }\n*\n* @example\n* const target = { a: null };\n* const source = { a: [1, 2, 3] };\n*\n* const result = merge(target, source);\n* console.log(result);\n* // Output: { a: [1, 2, 3] }\n*/\nfunction merge(target, source) {\n\tconst sourceKeys = Object.keys(source);\n\tfor (let i = 0; i < sourceKeys.length; i++) {\n\t\tconst key = sourceKeys[i];\n\t\tif (isUnsafeProperty(key)) continue;\n\t\tconst sourceValue = source[key];\n\t\tconst targetValue = target[key];\n\t\tif (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) target[key] = merge(targetValue, sourceValue);\n\t\telse if (Array.isArray(sourceValue)) target[key] = merge([], sourceValue);\n\t\telse if (isPlainObject(sourceValue)) target[key] = merge({}, sourceValue);\n\t\telse if (targetValue === void 0 || sourceValue !== void 0) target[key] = sourceValue;\n\t}\n\treturn target;\n}\nfunction isMergeableValue(value) {\n\treturn isPlainObject(value) || Array.isArray(value);\n}\n//#endregion\nexport { merge };\n","export const API_BASE_URL = \"/_/api\";\n","import { merge } from \"es-toolkit/object\";\nimport { type FetchOptions, ofetch } from \"ofetch\";\n\nimport { API_BASE_URL } from \"./constants\";\n\nconst defaultConfig: FetchOptions = {\n baseURL: API_BASE_URL,\n headers: {\n \"Content-Type\": \"application/json\",\n\n // see: https://knime-com.atlassian.net/wiki/spaces/SPECS/pages/4126769212/API+Errors#Client-Request-Headers\n Accept: \"application/json; application/problem+json\",\n },\n} as const;\n\nconst createHttpClient = (customOptions?: FetchOptions) => {\n const { baseURL = API_BASE_URL, ...otherCustomOptions } = customOptions ?? {};\n\n return ofetch.create(\n merge({ baseURL, ...otherCustomOptions }, defaultConfig),\n );\n};\n\nexport { type FetchOptions, defaultConfig, createHttpClient };\n","import { promise as promiseUtils } from \"@knime/utils\";\n\n// eslint-disable-next-line no-magic-numbers\nconst CHUNK_SIZE = 50 * 1024 * 1024; // 50 MB per chunk\n\nconst DEFAULT_RETRY_COUNT = 5;\nconst DEFAULT_RETRY_DELAY_MS = 50;\n\nexport const UploadStates = {\n IDLE: \"idle\",\n IN_PROGRESS: \"inprogress\",\n CANCELLED: \"cancelled\",\n FAILED: \"failed\",\n COMPLETE: \"complete\",\n} as const;\n\nexport type UploadStateName = (typeof UploadStates)[keyof typeof UploadStates];\n\nexport type PartUploadResponse = {\n partId: string;\n};\n\nconst uploadChunkWithProgress = (params: {\n method: string;\n url: string;\n chunk: Blob;\n chunkIndex: number;\n onProgress: (progress: number) => void;\n abortSignal: AbortSignal;\n}) => {\n const { method, url, chunk, chunkIndex, onProgress, abortSignal } = params;\n\n const OK = 200;\n const CREATED = 201;\n\n return new Promise<{ partId: string }>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.open(method, url, true);\n\n abortSignal.addEventListener(\"abort\", () => xhr.abort());\n\n // Track the upload progress of the current chunk\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n onProgress(event.loaded);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status === OK || xhr.status === CREATED) {\n const etag = xhr.getResponseHeader(\"ETag\");\n\n // 1. note that some backends don't return the etag header, then we just set an empty string\n // 2. remove possible doublequotes (\") around the etag and/or weak identifier (if either is present)\n // https://datatracker.ietf.org/doc/html/rfc7232#section-2.3\n resolve({ partId: etag?.replace(/^(?:W\\/)?\"|\"$/g, \"\") ?? \"\" });\n } else {\n consola.error(\"Failed or unexpected XHR response\", {\n xhrStatus: xhr.status,\n xhrResponse: xhr.response,\n chunkIndex,\n });\n reject(new Error(\"Failed to upload file\"));\n }\n };\n\n xhr.onerror = (event) => {\n consola.error(\"Failed to upload chunk\", {\n xhrErrorEvent: event,\n chunkIndex,\n });\n reject(new Error(\"Failed to upload file\"));\n };\n\n xhr.send(chunk);\n });\n};\n\nexport type UploaderManagerConfig = {\n /**\n * Function to resolve the metadata for a request to upload a file part\n * @param uploadId\n * @param partNumber\n * @returns\n */\n resolveFilePartUploadURL: (\n uploadId: string,\n partNumber: number,\n ) => Promise<{ method: string; url: string }>;\n\n /**\n * Callback that gets triggered when the whole file is uploaded.\n * @param\n * @returns\n */\n onFileUploadComplete?: (payload: {\n /**\n * Identifier of the upload for this file (must be unique)\n */\n uploadId: string;\n /**\n * Ids of all the uploaded file parts\n */\n filePartIds: Record<number, string>;\n }) => void;\n\n /**\n * Callback that gets triggered when an upload has failed.\n * @param uploadId\n * @param error the error that cause the failure if it exists\n * @returns\n */\n onFileUploadFailed?: (payload: { uploadId: string; error: Error }) => void;\n\n /**\n * Callback that gets triggered when the progress of a file part upload\n * for a specific upload id is updated\n * @param uploadId\n * @param progress\n * @returns\n */\n onProgress?: (uploadId: string, progress: number) => void;\n};\n\ntype UploadState = {\n uploadId: string;\n file: File;\n completedChunkCount: number;\n uploadedByteCount: number;\n state: UploadStateName;\n abortController: AbortController;\n};\n\n/**\n * Creates and returns an `uploadManager`, a comprehensive multi-file, multi-part upload handler.\n *\n * The `uploadManager` offers functionality for handling file uploads in parts and provides\n * several built-in mechanisms to ensure the process is reliable and adaptable.\n *\n * Key features include:\n *\n * - **Chunked File Uploads**: Splits provided files into manageable chunks and initiates the upload\n * for each part using the `resolveFilePartUploadURL` function provided in the configuration.\n *\n * - **Retry Mechanism**: Automatically retries failed upload attempts up to a maximum of 5 times\n * per failed request.\n *\n * - **Upload Cancellation**: Allows cancellation of ongoing uploads, giving users control over the process.\n *\n * - **Progress Tracking**: Monitors the progress of each file part upload and triggers the `onProgress`\n * callback to provide updates.\n *\n * - **Error Handling**: The returned `uploadFiles` function does not throw errors directly. Instead,\n * it manages retries and stops any failed uploads after the retry limit is reached, marking them as failed.\n * This ensures that the promise it returns completes gracefully without uncaught exceptions.\n *\n */\nexport const createUploadManager = (config: UploaderManagerConfig) => {\n const {\n resolveFilePartUploadURL: getUploadFilePartUrl,\n onFileUploadComplete,\n onFileUploadFailed,\n } = config;\n const uploadStateMap = new Map<string, UploadState>();\n\n const completedUploads = new Set<string>();\n const cancelledUploads = new Set<string>();\n const failedUploads = new Set<string>();\n\n const assertState = (uploadId: string, state: UploadStateName) =>\n uploadStateMap.has(uploadId) &&\n uploadStateMap.get(uploadId)!.state === state;\n\n const getUploadState = (uploadId: string) => uploadStateMap.get(uploadId);\n const setUploadState = (uploadId: string, state: Partial<UploadState>) => {\n uploadStateMap.set(uploadId, {\n ...uploadStateMap.get(uploadId)!,\n ...state,\n });\n };\n\n const isFailed = (uploadId: string) => assertState(uploadId, \"failed\");\n const isCancelled = (uploadId: string) => assertState(uploadId, \"cancelled\");\n\n const getTotalFileParts = (file: File) => Math.ceil(file.size / CHUNK_SIZE);\n\n const abortInFlightUpload = (uploadId: string, reason: string) => {\n const currentState = uploadStateMap.get(uploadId);\n\n if (!currentState) {\n return;\n }\n\n currentState.abortController.abort(\n new promiseUtils.AbortError(\n `Upload (${currentState.uploadId}) for file \"${currentState.file.name}\" aborted. Reason: \"${reason}\"`,\n ),\n );\n };\n\n const cancel = (uploadId: string) => {\n if (!uploadStateMap.has(uploadId)) {\n consola.error(\"cancel:: Invalid upload id\");\n return;\n }\n\n setUploadState(uploadId, { state: \"cancelled\" });\n\n abortInFlightUpload(uploadId, \"upload cancelled\");\n cancelledUploads.add(uploadId);\n };\n\n const setFailed = (uploadId: string, error: Error) => {\n if (!uploadStateMap.has(uploadId)) {\n consola.error(\"failed:: Invalid upload id\");\n return;\n }\n\n setUploadState(uploadId, { state: \"failed\" });\n onFileUploadFailed?.({ uploadId, error });\n failedUploads.add(uploadId);\n\n if (completedUploads.has(uploadId)) {\n completedUploads.delete(uploadId);\n }\n };\n\n const uploadFileFromChunkIndex = async (\n uploadId: string,\n file: File,\n initialChunkIndex = 0,\n ) => {\n const totalChunks = getTotalFileParts(file);\n const totalBytes = file.size;\n const completedPartIds: Record<number, string> = {};\n\n const { abortController, runAbortablePromise } =\n promiseUtils.createAbortablePromise();\n\n uploadStateMap.set(uploadId, {\n uploadId,\n file,\n state: \"inprogress\",\n uploadedByteCount: uploadStateMap.get(uploadId)?.uploadedByteCount ?? 0,\n completedChunkCount:\n uploadStateMap.get(uploadId)?.completedChunkCount ?? 0,\n abortController,\n });\n\n let chunkIndex = initialChunkIndex;\n let uploadedBytes = uploadStateMap.get(uploadId)?.uploadedByteCount;\n\n while (chunkIndex < totalChunks) {\n if (isCancelled(uploadId) || isFailed(uploadId)) {\n break;\n }\n\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, file.size);\n\n const chunk = file.slice(start, end);\n\n try {\n const { method, url } = await promiseUtils.retryPromise({\n fn: () => getUploadFilePartUrl(uploadId, chunkIndex + 1),\n retryCount: DEFAULT_RETRY_COUNT,\n retryDelayMS: DEFAULT_RETRY_DELAY_MS,\n });\n\n consola.trace(\"File part upload url resolved\", { method, url });\n\n const onChunkUploadProgress = (uploadedChunkBytes: number) => {\n uploadedBytes = uploadedChunkBytes + start;\n setUploadState(uploadId, { uploadedByteCount: uploadedBytes });\n\n const progress = Math.round((uploadedBytes / totalBytes) * 100);\n\n config.onProgress?.(uploadId, progress);\n };\n\n const filePartResponse = await runAbortablePromise(() =>\n promiseUtils.retryPromise({\n fn: () =>\n uploadChunkWithProgress({\n method,\n url,\n chunk,\n chunkIndex,\n onProgress: onChunkUploadProgress,\n abortSignal: abortController.signal,\n }),\n retryCount: DEFAULT_RETRY_COUNT,\n retryDelayMS: DEFAULT_RETRY_DELAY_MS,\n }),\n );\n\n consola.trace(\n `${file.name}: Chunk ${chunkIndex + 1} of ${totalChunks} uploaded successfully`,\n );\n\n completedPartIds[chunkIndex + 1] = filePartResponse.partId;\n\n setUploadState(uploadId, {\n completedChunkCount:\n uploadStateMap.get(uploadId)!.completedChunkCount + 1,\n });\n } catch (error) {\n if (error instanceof promiseUtils.AbortError) {\n consola.info(\"Aborted::\", error);\n return;\n }\n\n setFailed(\n uploadId,\n error instanceof Error ? error : new Error(error as string),\n );\n return;\n }\n\n chunkIndex++;\n }\n\n if (isCancelled(uploadId) || isFailed(uploadId)) {\n return;\n }\n\n setUploadState(uploadId, {\n completedChunkCount: totalChunks,\n state: \"complete\",\n });\n completedUploads.add(uploadId);\n onFileUploadComplete?.({ uploadId, filePartIds: completedPartIds });\n };\n\n const uploadFiles = (files: Array<{ uploadId: string; file: File }>) => {\n const result: Array<Promise<unknown>> = [];\n\n for (const { uploadId, file } of files) {\n result.push(uploadFileFromChunkIndex(uploadId, file));\n }\n\n return Promise.allSettled(result).then(() => {\n // state cleanup\n const completed = [...completedUploads.values()];\n const cancelled = [...cancelledUploads.values()];\n const failed = [...failedUploads.values()];\n\n [...completed, ...cancelled, ...failed].forEach((uploadId) =>\n uploadStateMap.delete(uploadId),\n );\n\n completedUploads.clear();\n cancelledUploads.clear();\n failedUploads.clear();\n\n return {\n completed,\n cancelled,\n failed,\n };\n });\n };\n\n return {\n uploadFiles,\n\n getUploadState,\n isFailed,\n isCancelled,\n cancel,\n setFailed,\n };\n};\n","import { computed, ref } from \"vue\";\n\nimport { type UploaderManagerConfig, createUploadManager } from \"../manager\";\n\nimport type { UploadItem } from \"./types\";\n\ntype OnCompletePayload = Parameters<\n NonNullable<UploaderManagerConfig[\"onFileUploadComplete\"]>\n>[0] & { parentId: string; name: string };\n\ntype OnFailedPayload = Parameters<\n NonNullable<UploaderManagerConfig[\"onFileUploadFailed\"]>\n>[0] & { parentId: string };\n\ntype UseUploadManagerOptions = Omit<\n UploaderManagerConfig,\n \"onProgress\" | \"onFileUploadComplete\" | \"onFileUploadFailed\"\n> & {\n onFileUploadComplete?: (payload: OnCompletePayload) => void;\n onFileUploadFailed?: (payload: OnFailedPayload) => void;\n};\n\n/**\n * This composable wraps the `uploadManager` utility\n * in order to provide reactive state which will work tightly with the `UploadProgressPanel` component\n *\n * The reactive state returned (`uploadItems`) will update whenever the progress\n * or status of each item being uploaded changes\n */\nexport const useUploadManager = (options: UseUploadManagerOptions) => {\n const uploadState = ref<Record<string, UploadItem>>({});\n\n const { uploadFiles, cancel, setFailed } = createUploadManager({\n ...options,\n\n onFileUploadComplete: (params) => {\n const { parentId, name } = uploadState.value[params.uploadId];\n uploadState.value[params.uploadId].status = \"complete\";\n options.onFileUploadComplete?.({ ...params, parentId, name });\n },\n\n onFileUploadFailed: ({ uploadId, error }) => {\n const { parentId } = uploadState.value[uploadId];\n uploadState.value[uploadId] = {\n ...uploadState.value[uploadId],\n status: \"failed\",\n failureDetails: error.message,\n };\n options.onFileUploadFailed?.({ uploadId, error, parentId });\n },\n\n onProgress: (uploadId, progress) => {\n if (uploadState.value[uploadId].status === \"inprogress\") {\n uploadState.value[uploadId].progress = progress;\n }\n },\n });\n\n const start = async (\n parentId: string,\n uploadPayload: Array<{ uploadId: string; file: File }>,\n ) => {\n try {\n uploadPayload.forEach(({ uploadId, file }) => {\n uploadState.value[uploadId] = {\n id: uploadId,\n name: file.name,\n size: file.size,\n progress: 0,\n status: \"inprogress\",\n parentId,\n };\n });\n\n await uploadFiles(uploadPayload);\n } catch (error) {\n consola.error(\"Error uploading files\", error);\n }\n };\n\n const canCancel = (uploadId: string) =>\n uploadState.value[uploadId]?.status === \"inprogress\" ||\n uploadState.value[uploadId]?.status === \"failed\";\n\n const removeItem = (uploadId: string) => {\n if (canCancel(uploadId)) {\n cancel(uploadId);\n }\n\n delete uploadState.value[uploadId];\n };\n\n const resetState = () => {\n uploadState.value = {};\n };\n\n const uploadItems = computed(() => Object.values(uploadState.value));\n\n const hasPendingUploads = computed(() =>\n uploadItems.value.some(({ status }) => status === \"inprogress\"),\n );\n\n const totalPendingUploads = computed(\n () =>\n uploadItems.value.filter(({ status }) => status === \"inprogress\").length,\n );\n\n return {\n uploadState,\n hasPendingUploads,\n totalPendingUploads,\n start,\n cancel: (uploadId: string) => {\n cancel(uploadId);\n uploadState.value[uploadId].status = \"cancelled\";\n },\n canCancel,\n removeItem,\n resetState,\n setFailed: (uploadId: string, error: Error) => {\n uploadState.value[uploadId] = {\n ...uploadState.value[uploadId],\n status: \"failed\",\n failureDetails: error.message,\n };\n setFailed(uploadId, error);\n },\n };\n};\n","import { computed, reactive, readonly, ref } from \"vue\";\nimport type { FetchError, FetchOptions } from \"ofetch\";\n\nimport {\n formatFileSize,\n getFileMimeType,\n knimeFileFormats,\n promise,\n} from \"@knime/utils\";\n\nimport { rfcErrors } from \"../../rfcErrors\";\nimport { createHttpClient } from \"../shared/httpClient\";\n\nimport type { UploadItem } from \"./ui\";\nimport { useUploadManager } from \"./ui/useUploadManager\";\n\nconst DEFAULT_MAX_UPLOAD_QUEUE_SIZE = 10;\n// eslint-disable-next-line no-magic-numbers\nconst DEFAULT_UPLOAD_SIZE_LIMIT_BYTES = 5 * 1024 * 1024 * 1024;\n\nconst DEFAULT_RETRY_DELAY_MS = 50;\n\n// Catalog & artifacts services currently have a limit for 5 GiB for\n// upload and copy/move operations but it is not communicated to clients.\n// Repeat the constant here to be able to still make a pre-check. See NXT-4510.\nconst getUploadSizeLimitBytes = () => DEFAULT_UPLOAD_SIZE_LIMIT_BYTES;\n\ntype UseFileUploadOptions = {\n /**\n * Max number of concurrent uploads allowed in the upload queue.\n * When an upload is started with a number of files that exceed the pending\n * uploads then only files up-to the max queue size will be processed and the rest\n * will be ignored. This will also call the `onUploadQueueSizeExceeded` callback\n */\n maxUploadQueueSize?: number;\n /**\n * Callback that triggers every time any file in the queue completes its upload\n * @returns\n */\n onFileUploadComplete?: (payload: {\n uploadId: string;\n filePartIds: Record<number, string>;\n parentId: string;\n name: string;\n }) => void;\n /**\n * Callback that triggers every time any file in the queue fails its upload\n * @returns\n */\n onFileUploadFailed?: (payload: {\n uploadId: string;\n error: Error;\n parentId: string;\n }) => void;\n /**\n * Callback that triggers when a upload batch is started (via the `start` function) but the amount\n * of items to upload exceed the max configured size of the queue.\n * @returns\n */\n onUploadQueueSizeExceeded?: (maxQueueSize: number) => void;\n /**\n * Options to customize the fetch client used internally to make http requests.\n * e.g: headers, baseUrl, etc\n */\n customFetchClientOptions?: FetchOptions;\n};\n\n/**\n * This composable handles uploads of data to a hub repository item (space or workflow group).\n * It is a multi-step process which is described as follows:\n *\n * Step 1:\n * First we need to prepare an upload. The items will be uploaded to a `parent` container\n * identified by its id. Then, for each file we want to upload, we must provide paths relative\n * to the parent that identify each file. Example:\n * ```\n * {\n * \"items\": {\n * \"my-file.txt\": { itemContentType: \"text/plain\", itemContentSize: 5000 },\n * \"folder/my-file.zip\": { itemContentType: \"application/zip\", itemContentSize: 5000 },\n * }\n * }\n * ```\n * This describes 2 items, one placed in the parent's root and another inside a folder.\n * The response for this would look like:\n * ```\n * {\n * \"items\": {\n * \"my-file.txt\": { uploadId: \"id1\" },\n * \"folder/my-file.zip\": { uploadId: \"id2\" },\n * }\n * }\n * ```\n * Now, each corresponding `uploadId` uniquely identifies the upload process for\n * their respective files.\n *\n * Step 2:\n * Next, we need to start uploading the file parts. Technically, you _can_ just upload\n * each file as one big file \"part\", but practically that is not recommended because a hiccup\n * in the connection means you would have to start the upload from scratch; instead, we split\n * the files in smaller parts.\n * The upload manager helper will take care of splitting the file. However, the responsibility\n * of this composable is to supply a function to resolve the upload URL. This upload URL is obtained\n * by POSTing to an endpoint with the `uploadId` and the `partNumber` and this will return\n * the data required to make an upload to a presigned URL; this will be called for each file part.\n *\n * Step 3:\n * Completion:\n * Once the upload of a single file is complete, the upload manager will trigger the `onFileUploadComplete`\n * callback, which then will supply the ids of all the different parts that got uploaded for a given `uploadId`\n * Then we need to \"complete\" the upload by sending a request which provides the `uploadId` and a list of\n * the ids of all the parts. Note that some backends don't return the ids of the file parts after a successful\n * upload of a part, in this case empty strings or null can be used instead of the part id.\n *\n * Cancellation:\n * Alternative to completion, you can also cancel an upload. For this, the composable makes a DELETE request\n * providing the corresponding `uploadId` which will effectively cancel it.\n *\n *\n * For a usage example, refer to the Docs page in storybook.\n */\nexport const useFileUpload = (options: UseFileUploadOptions = {}) => {\n const $ofetch = createHttpClient(options.customFetchClientOptions);\n\n const prepareUpload = (\n parentId: string,\n files: Array<File>,\n ): Promise<Array<{ uploadId: string; file: File }>> => {\n const fileDictionary = Object.fromEntries(\n files.map((file) => {\n // strip extension for workflows\n const name = knimeFileFormats.KNWF.getNameOrDefault(file, file.name);\n\n return [name, file];\n }),\n );\n\n // map file dictionary to body payload of the prepare upload request\n const items: Record<\n string,\n { itemContentType: string; itemContentSize: number }\n > = Object.fromEntries(\n Object.entries(fileDictionary).map(([name, file]) => [\n name,\n {\n itemContentType: getFileMimeType(file),\n itemContentSize: file.size,\n },\n ]),\n );\n\n type PrepareUploadResponse = {\n items: Record<string, { uploadId: string }>;\n };\n\n return $ofetch<PrepareUploadResponse>(`/repository/${parentId}/manifest`, {\n method: \"POST\",\n body: { items },\n }).then(({ items }) => {\n return Object.keys(items).map((name) => {\n const { uploadId } = items[name];\n const file = fileDictionary[name];\n return { uploadId, file };\n });\n });\n };\n\n const resolveFilePartUploadURL = (uploadId: string, partNumber: number) => {\n type UploadURLResponse = {\n method: string;\n url: string;\n header: { Host: string };\n };\n\n return $ofetch<UploadURLResponse>(\n `/uploads/${uploadId}/parts/?partNumber=${partNumber}`,\n { method: \"POST\" },\n );\n };\n\n const completeUpload = (\n uploadId: string,\n partIds: Record<number, string>,\n ) => {\n return $ofetch(`/uploads/${uploadId}`, {\n method: \"POST\",\n body: partIds,\n });\n };\n\n const cancelUpload = (uploadId: string) => {\n return $ofetch(`/uploads/${uploadId}`, {\n method: \"DELETE\",\n });\n };\n\n // contains upload ids for files that have a processing step which was not finished yet\n const unprocessedUploads = reactive<Set<string>>(new Set());\n const isKNWFFile = (file: File) => knimeFileFormats.KNWF.matches(file);\n\n let useUploadManagerResult: ReturnType<typeof useUploadManager> | null = null;\n\n const setProcessingCompleted = ({ uploadId }: { uploadId: string }) => {\n unprocessedUploads.delete(uploadId);\n };\n\n const setProcessingFailed = ({\n uploadId,\n error,\n }: {\n uploadId: string;\n error?: Error;\n }) => {\n unprocessedUploads.delete(uploadId);\n useUploadManagerResult?.setFailed(\n uploadId,\n error ?? new Error(\"An error occurred when processing the file\"),\n );\n };\n\n useUploadManagerResult = useUploadManager({\n resolveFilePartUploadURL,\n\n onFileUploadComplete: ({ uploadId, filePartIds, parentId, name }) => {\n promise\n .retryPromise({ fn: () => completeUpload(uploadId, filePartIds) })\n .then(() => {\n options.onFileUploadComplete?.({\n uploadId,\n filePartIds,\n parentId,\n name,\n });\n })\n .catch((error) => {\n consola.error(\"Error attempting to complete upload\", { error });\n setProcessingFailed({ uploadId, error });\n });\n },\n\n onFileUploadFailed: ({ uploadId, error, parentId }) => {\n options?.onFileUploadFailed?.({ uploadId, error, parentId });\n },\n });\n\n const getEnqueueableFiles = (files: File[]): File[] => {\n const { totalPendingUploads } = useUploadManagerResult;\n\n const { maxUploadQueueSize = DEFAULT_MAX_UPLOAD_QUEUE_SIZE } = options;\n\n if (files.length + totalPendingUploads.value > maxUploadQueueSize) {\n options.onUploadQueueSizeExceeded?.(maxUploadQueueSize);\n }\n\n // only keep as many files as the queue allows\n const effectiveQueueSize = Math.max(\n 0,\n maxUploadQueueSize - totalPendingUploads.value,\n );\n return files.slice(0, effectiveQueueSize);\n };\n\n const { uploadState, ...uploadManagerResultRest } = useUploadManagerResult;\n\n const uploadQueue = computed<UploadItem[]>(() => {\n return Object.values(uploadState.value).map((uploadItem) => {\n if (\n uploadItem.status === \"complete\" &&\n unprocessedUploads.has(uploadItem.id)\n ) {\n return {\n id: uploadItem.id,\n name: uploadItem.name,\n parentId: uploadItem.parentId,\n size: uploadItem.size,\n status: \"processing\" as const,\n };\n }\n\n return uploadItem;\n });\n });\n\n const prepareQueueSize = ref(0);\n\n return {\n ...uploadManagerResultRest,\n uploadQueue,\n unprocessedUploads: readonly(unprocessedUploads),\n setProcessingCompleted,\n setProcessingFailed,\n\n isPreparingUpload: computed(() => prepareQueueSize.value > 0),\n totalFilesBeingPrepared: computed(() => prepareQueueSize.value),\n\n start: async (\n parentId: string,\n files: File[],\n options: { isFileWithProcessing?: typeof isKNWFFile } = {},\n ) => {\n const { isFileWithProcessing = isKNWFFile } = options;\n const enqueueableFiles = getEnqueueableFiles(files);\n const uploadSizeLimitBytes = getUploadSizeLimitBytes();\n const oversizedFiles = enqueueableFiles.filter(\n (file) => file.size > uploadSizeLimitBytes,\n );\n\n if (oversizedFiles.length > 0) {\n throw new rfcErrors.RFCError({\n title: \"Upload size limit exceeded\",\n status: 413,\n details: oversizedFiles.map(\n (file) =>\n `${file.name} (${formatFileSize(file.size)}) exceeds the upload limit of ${formatFileSize(uploadSizeLimitBytes)}.`,\n ),\n });\n }\n\n try {\n if (enqueueableFiles.length === 0) {\n return [];\n }\n\n prepareQueueSize.value += enqueueableFiles.length;\n\n const uploadPayload = await promise.retryPromise({\n fn: () => prepareUpload(parentId, enqueueableFiles),\n excludeError: (error: FetchError) =>\n // eslint-disable-next-line no-magic-numbers\n Boolean(error.statusCode && error.statusCode < 500),\n retryDelayMS: DEFAULT_RETRY_DELAY_MS,\n });\n\n uploadPayload.forEach(({ uploadId, file }) => {\n if (isFileWithProcessing(file)) {\n unprocessedUploads.add(uploadId);\n }\n });\n\n const uploadIds = uploadPayload.map((upload) => upload.uploadId);\n\n // accept floating promise, errors are handled inside the function\n\n useUploadManagerResult.start(parentId, uploadPayload);\n\n return uploadIds;\n } catch (error) {\n throw rfcErrors.tryParse(error) ?? error;\n } finally {\n // errors can only be thrown in the prepareUpload call, useUploadManagerResult.start does its own error handling\n prepareQueueSize.value -= enqueueableFiles.length;\n }\n },\n\n cancel: (uploadId: string) => {\n useUploadManagerResult.cancel(uploadId);\n cancelUpload(uploadId).catch((error: unknown) => {\n consola.error(\"There was a problem cancelling the upload\", { error });\n });\n },\n };\n};\n","import { computed, ref } from \"vue\";\nimport { FetchError, type FetchOptions } from \"ofetch\";\n\nimport { sleep } from \"@knime/utils\";\n\nimport { rfcErrors } from \"../../rfcErrors\";\nimport { createHttpClient } from \"../shared/httpClient\";\n\nimport type { DownloadItem as DownloadItemExternal } from \"./ui/types\";\n\nconst DEFAULT_MAX_RETRIES = null;\nconst DEFAULT_POLLING_INTERVAL = 2000;\n\ntype ArtifactStatusResponse = {\n downloadId?: string;\n status?: string;\n statusMessage?: string;\n lastUpdated?: string;\n downloadUrl?: string;\n};\n\n// Initial request can have either download url (if it can be downloaded immediately) or download id (to poll for the status)\ntype RequestDownloadResponse =\n | {\n downloadId: string;\n }\n | {\n downloadUrl: string;\n };\n\n// type guard\nconst hasDownloadUrl = (\n response: RequestDownloadResponse,\n): response is { downloadUrl: string } => {\n return \"downloadUrl\" in response;\n};\n\n/**\n * The version of the artifact to download.\n */\ntype ItemVersion = number | \"current-state\" | \"most-recent\";\n\n/**\n * Tracks the state of each concurrent download.\n */\ntype DownloadItem = DownloadItemExternal & {\n itemId: string;\n version?: ItemVersion;\n};\n\nexport type UseDownloadArtifactOptions = {\n /**\n * The maximum number of times to poll for the download URL. Default is `null` (no limit).\n */\n maxRetries?: number;\n /**\n * The interval in milliseconds between each poll. Default is `2000` ms.\n */\n pollingInterval?: number;\n /**\n * Options to customize the fetch client used internally to make http requests.\n * e.g: headers, baseUrl, etc\n */\n customFetchClientOptions?: FetchOptions;\n};\n\nconst isAbortError = (error: unknown) =>\n error instanceof DOMException && error.name === \"AbortError\";\n\n/**\n * This composable supports multiple concurrent downloads. Each time you call ```start```, the following behavior applies:\n *\n * 1. **Immediate-ready artifact**: If the first status check for the artifact returns `READY`, then there's no polling and no need\n * to add it to `downloadItems`. The download URL is opened in the same tab immediately.\n *\n * 2. **Not-ready artifact**: If the artifact is not yet ready (e.g. needs zipping), then we add a record to `downloadItems` with status `IN_PROGRESS`\n * and repeatedly poll until it becomes `READY`, the polling times out, or the user aborts.\n *\n * **Usage**:\n * ```\n * const { start, cancel, downloadItems } = useDownloadArtifact({ ...options });\n *\n * // start a download\n * await start({ itemId: \"1234\", version: 1 });\n *\n * // if needed, cancel it:\n * cancel(\"1234\");\n *\n * // downloadItems (as a computed array) will reflect the current statuses.\n * ```\n */\nexport const useDownloadArtifact = (\n options: UseDownloadArtifactOptions = {},\n) => {\n const $ofetch = createHttpClient(options.customFetchClientOptions);\n\n const downloadItems = ref<Record<string, DownloadItem>>({});\n const abortControllers: Record<string, AbortController> = {};\n\n // Use fallback values if none are provided\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const pollingInterval = options.pollingInterval ?? DEFAULT_POLLING_INTERVAL;\n\n const cancel = (downloadId: string) => {\n const itemController = abortControllers[downloadId];\n if (itemController) {\n itemController.abort();\n delete abortControllers[downloadId];\n }\n };\n\n const removeItem = (downloadId: string) => {\n cancel(downloadId);\n delete downloadItems.value[downloadId];\n };\n\n const fetchDownloadStatus = ({\n downloadId,\n signal,\n }: {\n downloadId: string;\n signal?: AbortSignal;\n }) => {\n return $ofetch<ArtifactStatusResponse>(`/downloads/${downloadId}/status`, {\n method: \"GET\",\n signal,\n });\n };\n\n const openDownload = (downloadUrl: string) => {\n const a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = downloadUrl;\n a.download = \"\";\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n /**\n * Makes a request to the download status endpoint for the given download item.\n * Returns a boolean that is true if a terminal state has been reached (download is ready,\n * download failed, or user aborted download)\n * @param downloadId the `downloadId`\n * @param signal the abort signal passed to the request to be able to abort it\n * @returns a boolean indicating whether a terminal state has been reached\n */\n const handlePollingResult = async ({\n downloadId,\n signal,\n }: {\n downloadId: string;\n signal: AbortSignal;\n }) => {\n try {\n const statusResponse = await fetchDownloadStatus({\n downloadId,\n signal,\n });\n\n if (statusResponse?.status === \"READY\" && statusResponse?.downloadUrl) {\n downloadItems.value[downloadId].status = \"READY\";\n downloadItems.value[downloadId].downloadUrl =\n statusResponse.downloadUrl;\n // open download in a new tab\n openDownload(statusResponse.downloadUrl);\n return true;\n } else if (statusResponse?.status === \"FAILED\") {\n let details = \"Download failed\";\n if (statusResponse?.statusMessage) {\n details += `: ${statusResponse.statusMessage}`;\n }\n throw new Error(details);\n }\n } catch (error: unknown) {\n consola.error(\"Error fetching status:\", error);\n // https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort\n const isAborted =\n isAbortError(error) ||\n (error instanceof FetchError && isAbortError(error.cause));\n\n if (!isAborted) {\n downloadItems.value[downloadId].status = \"FAILED\";\n downloadItems.value[downloadId].failureDetails =\n error instanceof Error ? error.message : (error as string);\n }\n return true;\n }\n return false;\n };\n\n const pollDownloadItem = async ({\n itemId,\n downloadId,\n version,\n name,\n }: {\n itemId: string;\n downloadId: string;\n version?: ItemVersion;\n name: string;\n }) => {\n const controller = new AbortController();\n abortControllers[downloadId] = controller;\n\n const signal = controller.signal;\n\n let itemName = `${name}`;\n if (version) {\n itemName += ` (${version})`;\n }\n\n downloadItems.value[downloadId] = {\n itemId,\n ...(version && { version }),\n downloadId,\n name: itemName,\n status: \"IN_PROGRESS\",\n };\n\n const abortListener = () => {\n controller.signal.removeEventListener(\"abort\", abortListener);\n if (!downloadItems.value[downloadId]) {\n return;\n }\n downloadItems.value[downloadId].status = \"CANCELLED\";\n downloadItems.value[downloadId].failureDetails =\n \"Download was cancelled manually\";\n };\n controller.signal.addEventListener(\"abort\", abortListener);\n\n let tries = 0;\n // eslint-disable-next-line no-unmodified-loop-condition\n while (maxRetries === null || tries < maxRetries) {\n tries++;\n await sleep(pollingInterval);\n\n const isTerminalState = await handlePollingResult({ downloadId, signal });\n\n if (isTerminalState) {\n break;\n }\n }\n\n delete abortControllers[downloadId];\n\n if (maxRetries !== null && tries >= maxRetries) {\n downloadItems.value[downloadId].status = \"FAILED\";\n downloadItems.value[downloadId].failureDetails = \"Download timed out\";\n }\n };\n\n const start = async ({\n itemId,\n version,\n name,\n }: {\n itemId: string;\n name: string;\n version?: ItemVersion;\n }) => {\n try {\n const response = await $ofetch<RequestDownloadResponse>(\n `/repository/${itemId}/artifact`,\n {\n method: \"GET\",\n query: { version },\n },\n );\n\n // if download is ready, open url immediately\n if (hasDownloadUrl(response)) {\n openDownload(response.downloadUrl);\n return;\n }\n\n // otherwise start polling download status\n await pollDownloadItem({\n itemId,\n version,\n downloadId: response.downloadId,\n name,\n });\n } catch (error: unknown) {\n // here only errors thrown by the initial requests are caught;\n // errors occurring while polling will be handled in pollDownloadItem\n throw rfcErrors.tryParse(error) ?? error;\n }\n };\n\n const totalItemsBeingZipped = computed(\n () =>\n Object.values(downloadItems.value).filter(\n ({ status }) => status === \"IN_PROGRESS\",\n ).length,\n );\n\n const resetState = () => {\n for (const [downloadId, controller] of Object.entries(abortControllers)) {\n controller?.abort();\n delete abortControllers[downloadId];\n }\n downloadItems.value = {};\n };\n\n const downloadItemsArray = computed(() => Object.values(downloadItems.value));\n\n return {\n /**\n * Initiates a download of the given itemId and version.\n */\n start,\n\n /**\n * Cancels the ongoing download for a given itemId (if any).\n * Sets the status in `downloadItems` to `CANCELLED`.\n */\n cancel,\n\n /**\n * Removes item from `downloadItems`.\n */\n removeItem,\n\n /**\n * A computed array of all current items that are being zipped and prepared for download.\n */\n downloadItems: downloadItemsArray,\n\n /**\n * The total number of zipping items in progress.\n */\n totalItemsBeingZipped,\n\n /**\n * Resets the state of the composable, clearing all downloads and controllers.\n */\n resetState,\n\n /**\n * Opens a download from the given url\n */\n openDownload,\n };\n};\n"],"names":["_useModel","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createTextVNode","_toDisplayString","_hoisted_2","_createVNode","_unref","_createBlock","_Transition","_renderSlot","_openBlock","_withDirectives","_Fragment","_renderList","DEFAULT_RETRY_DELAY_MS","DEFAULT_RETRY_COUNT","UploadProgressPanelItem","actions","DownloadProgressPanelItem","promiseUtils.AbortError","promiseUtils.createAbortablePromise","promiseUtils.retryPromise","items","promise.retryPromise","options"],"mappings":"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","x_google_ignoreList":[4,5,6,7,12,13,14]}
|
|
1
|
+
{"version":3,"file":"dataTransfer.js","sources":["../src/dataTransfer/shared/ui/CollapsiblePanel/useIconFlipper.ts","../src/dataTransfer/shared/ui/CollapsiblePanel/CollapsiblePanel.vue","../src/dataTransfer/shared/ui/ProgressItem/ProgressItem.vue","../src/dataTransfer/shared/ui/ProgressList/ProgressList.vue","../src/dataTransfer/upload/ui/UploadProgressPanelItem.vue","../src/dataTransfer/upload/ui/UploadProgressPanel.vue","../src/dataTransfer/download/ui/DownloadProgressPanelItem.vue","../src/dataTransfer/download/ui/DownloadProgressPanel.vue","../../../node_modules/.pnpm/es-toolkit@1.49.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../../node_modules/.pnpm/es-toolkit@1.49.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../../../node_modules/.pnpm/es-toolkit@1.49.0/node_modules/es-toolkit/dist/object/merge.mjs","../src/dataTransfer/shared/httpClient/constants.ts","../src/dataTransfer/shared/httpClient/createHttpClient.ts","../src/dataTransfer/upload/manager/index.ts","../src/dataTransfer/upload/ui/useUploadManager.ts","../src/dataTransfer/upload/useFileUpload.ts","../src/dataTransfer/download/useDownloadArtifact.ts"],"sourcesContent":["import { type CSSProperties, type ComputedRef, computed } from \"vue\";\n\ntype UseIconFlipperOptions = {\n active: ComputedRef<boolean>;\n initialRotation?: `${string}deg`;\n};\n\nexport const useIconFlipper = (options: UseIconFlipperOptions) => {\n const iconFlipStyles = computed<CSSProperties>(() => {\n const declaration: Partial<CSSProperties> = {\n transition: \"transform 0.2s linear\",\n transform: \"scaleY(1)\",\n };\n\n if (options.initialRotation) {\n declaration.rotate = `${options.initialRotation}`;\n }\n\n const transform = options.active.value ? \"scaleY(-1)\" : undefined;\n\n return { ...declaration, transform };\n });\n\n return { iconFlipStyles };\n};\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nimport { KdsButton } from \"@knime/kds-components\";\n\nimport type { CollapsiblePanelProps } from \"./types\";\nimport { useIconFlipper } from \"./useIconFlipper\";\n\nconst { headline, canBeDismissed = false } =\n defineProps<CollapsiblePanelProps>();\n\nconst emit = defineEmits<{\n close: [];\n}>();\n\nconst modelValue = defineModel<boolean>({ default: true });\n\nconst { iconFlipStyles } = useIconFlipper({\n active: computed(() => modelValue.value),\n initialRotation: \"180deg\",\n});\nconst panelContentId = useId();\n</script>\n\n<template>\n <div class=\"collapsible-panel\" :class=\"{ collapsed: !modelValue }\">\n <div class=\"title-bar\">\n {{ headline }}\n <div class=\"actions\">\n <KdsButton\n size=\"small\"\n variant=\"transparent\"\n leading-icon=\"chevron-up\"\n :aria-expanded=\"modelValue\"\n :aria-controls=\"panelContentId\"\n :ariaLabel=\"modelValue ? 'Collapse' : 'Expand'\"\n :style=\"iconFlipStyles\"\n @click=\"modelValue = !modelValue\"\n />\n\n <KdsButton\n v-if=\"canBeDismissed\"\n size=\"small\"\n variant=\"transparent\"\n ariaLabel=\"Close\"\n leading-icon=\"x-close\"\n @click=\"emit('close')\"\n />\n </div>\n </div>\n\n <Transition name=\"expand\">\n <div v-show=\"modelValue\" :id=\"panelContentId\" class=\"panel-content\">\n <slot />\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped>\n.collapsible-panel {\n background: var(--kds-color-surface-default);\n border-radius: var(--kds-spacing-container-0-25x);\n box-shadow: var(--kds-elevation-level-3);\n\n & .title-bar {\n display: flex;\n align-items: center;\n height: var(--kds-dimension-component-height-2-5x);\n padding: var(--kds-spacing-container-0-5x)\n var(--kds-spacing-container-0-75x);\n font: var(--kds-font-base-title-small-strong);\n color: var(--kds-color-text-and-icon-neutral);\n\n & .actions {\n display: flex;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n margin-left: auto;\n }\n }\n\n &:not(.collapsed) {\n & .title-bar {\n border-bottom: var(--kds-border-base-subtle);\n }\n }\n}\n\n.panel-content {\n overflow: hidden;\n}\n\n.expand-enter-active,\n.expand-leave-active {\n display: grid;\n overflow: hidden;\n transition:\n grid-template-rows 0.2s ease-in-out,\n opacity 0.2s ease-in-out;\n}\n\n.expand-enter-from,\n.expand-leave-to {\n grid-template-rows: 0fr;\n opacity: 0;\n}\n\n.expand-enter-to,\n.expand-leave-from {\n grid-template-rows: 1fr;\n opacity: 1;\n}\n\n.panel-content > :deep(*) {\n min-height: 0;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport {\n KdsBadge,\n KdsButton,\n KdsIcon,\n KdsProgressBar,\n vKdsTooltip,\n} from \"@knime/kds-components\";\n\nimport { type ProgressItemProps } from \"./types\";\n\ndefineProps<ProgressItemProps>();\n</script>\n\n<template>\n <div class=\"progress-wrapper\">\n <div :class=\"['progress-item', { padded: progress === undefined }]\">\n <div class=\"item-info\">\n <KdsIcon :name=\"icon\" />\n\n <div class=\"item-name\">\n <div v-kds-tooltip:truncated=\"headline\" class=\"title\">\n {{ headline }}\n </div>\n <span v-if=\"subtitle\" class=\"subtitle\">\n {{ subtitle }}\n </span>\n </div>\n </div>\n\n <div class=\"item-action\">\n <KdsBadge\n v-if=\"badge\"\n :variant=\"badge.variant\"\n :label=\"badge.text\"\n :leading-icon=\"badge.icon\"\n size=\"xxsmall\"\n />\n\n <template v-for=\"action in actions.slice(0, 2)\" :key=\"action.id\">\n <KdsButton\n :leading-icon=\"action.icon\"\n :ariaLabel=\"action.label\"\n variant=\"transparent\"\n @click=\"action.handler\"\n />\n </template>\n </div>\n </div>\n\n <div v-if=\"typeof progress === 'number'\" class=\"progress\">\n <KdsProgressBar :percentage=\"progress\" size=\"medium\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.progress-wrapper {\n --base-padding: var(--kds-spacing-container-1x);\n --progress-bar-height: var(--kds-dimension-component-height-0-25x);\n --progress-bar-distance: var(--kds-spacing-container-0-25x);\n\n display: flex;\n flex-direction: column;\n gap: var(--progress-bar-distance);\n height: var(--kds-dimension-component-height-4x);\n padding: var(--base-padding);\n}\n\n.progress-item {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n\n /* add extra margin to prevent content jump when a progress bars appears/disappears */\n &.padded {\n margin-bottom: calc(\n var(--progress-bar-height) + var(--progress-bar-distance)\n );\n }\n}\n\n.progress {\n min-height: var(--progress-bar-height);\n}\n\n.item-info {\n display: flex;\n flex-grow: 1;\n gap: var(--kds-spacing-container-0-25x);\n overflow: hidden;\n\n & .item-name {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-25x);\n justify-content: center;\n overflow: hidden;\n color: var(--kds-color-text-and-icon-neutral);\n\n & .title {\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n font: var(--kds-font-base-interactive-small);\n white-space: nowrap;\n }\n\n & .subtitle {\n font: var(--kds-font-base-subtext-small);\n }\n }\n}\n\n.item-action {\n display: flex;\n flex-shrink: 0;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n}\n</style>\n","<template>\n <div class=\"progress-list\" tabindex=\"0\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.progress-list {\n max-height: var(--kds-dimension-component-height-20x);\n overflow-y: auto;\n\n &:deep(.progress-wrapper):not(:first-child) {\n border-top: var(--kds-border-base-subtle);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { KdsBadgeVariant, KdsIconName } from \"@knime/kds-components\";\nimport {\n formatFileSize,\n getFileExtension,\n knimeFileFormats,\n} from \"@knime/utils\";\n\nimport {\n ProgressItem,\n type ProgressItemAction,\n type ProgressItemBadge,\n} from \"../../shared/ui\";\n\nimport type { UploadItem, UploadItemStatus, WithProgress } from \"./types\";\n\ntype Props = {\n item: UploadItem;\n allowCancel: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n cancel: [];\n}>();\n\nconst hasProgress = (item: UploadItem): item is WithProgress => {\n return item.status === \"inprogress\" || item.status === \"complete\";\n};\n\nconst totalFormatted = computed(() => {\n return formatFileSize(props.item.size);\n});\n\nconst progressedFormatted = computed(() => {\n if (hasProgress(props.item)) {\n const sizePercentage = (props.item.size / 100) * (props.item.progress ?? 0);\n return formatFileSize(sizePercentage);\n }\n\n return 0;\n});\n\nconst subtitle = computed(() =>\n props.item.status === \"inprogress\"\n ? `${progressedFormatted.value} of ${totalFormatted.value}`\n : `${totalFormatted.value}`,\n);\n\nconst statusMapper = {\n inprogress: [\"Uploading\", \"info\", \"reload\"],\n failed: [\"Failed\", \"error\", \"circle-error\"],\n complete: [\"Uploaded\", \"success\", \"circle-success\"],\n cancelled: [\"Cancelled\", \"error\", \"circle-error\"],\n processing: [\"Processing\", \"info\", \"reload\"],\n} satisfies Record<UploadItemStatus, [string, KdsBadgeVariant, KdsIconName]>;\n\nconst itemIcon = computed<KdsIconName>(() => {\n const extension = getFileExtension(props.item.name);\n return extension === knimeFileFormats.KNWF.extension ? \"workflow\" : \"file\";\n});\n\nconst badge = computed<ProgressItemBadge | undefined>(() => {\n if (!props.item.status) {\n return undefined;\n }\n\n const [text, variant, icon] = statusMapper[props.item.status];\n\n return { text, variant, icon } satisfies ProgressItemBadge;\n});\n\nconst shouldShowCancelAction = computed(\n () => props.allowCancel && props.item.status === \"inprogress\",\n);\n\nconst actions = computed<Array<ProgressItemAction>>(() => {\n return shouldShowCancelAction.value\n ? ([\n {\n id: \"cancel\",\n icon: \"x-close\",\n label: \"Cancel\",\n handler: () => emit(\"cancel\"),\n },\n ] satisfies ProgressItemAction[])\n : [];\n});\n</script>\n\n<template>\n <ProgressItem\n :id=\"item.id\"\n :headline=\"item.name\"\n :subtitle=\"subtitle\"\n :icon=\"itemIcon\"\n :progress=\"hasProgress(item) ? item.progress : undefined\"\n :badge=\"badge\"\n :actions=\"actions\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { KdsLoadingSkeleton } from \"@knime/kds-components\";\n\nimport { CollapsiblePanel, ProgressList } from \"../../shared/ui\";\n\nimport UploadProgressPanelItem from \"./UploadProgressPanelItem.vue\";\nimport type { UploadItem, UploadProgressPanelProps } from \"./types\";\n\nconst {\n items,\n allowCancel = true,\n placeholderItems = 0,\n} = defineProps<UploadProgressPanelProps>();\n\nconst emit = defineEmits<{\n cancel: [item: UploadItem];\n close: [];\n}>();\n\nconst expanded = defineModel<boolean>(\"expanded\", { default: true });\n\nconst totalItems = computed(() => items.length);\nconst uploadedItems = computed(\n () => items.filter(({ status }) => status === \"complete\").length,\n);\n\nconst headline = computed(() => {\n const suffix = `file${totalItems.value > 1 ? \"s\" : \"\"}`;\n return `Uploaded ${uploadedItems.value} of ${totalItems.value} ${suffix}`;\n});\n\nconst hasSomeItemInProgress = computed(\n () =>\n items.some(\n ({ status }) => status === \"inprogress\" || status === \"processing\",\n ) || placeholderItems > 0,\n);\n</script>\n\n<template>\n <CollapsiblePanel\n v-model=\"expanded\"\n :headline=\"headline\"\n class=\"upload-panel\"\n :can-be-dismissed=\"!hasSomeItemInProgress\"\n @close=\"emit('close')\"\n >\n <div class=\"upload-panel-content\">\n <ProgressList>\n <UploadProgressPanelItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :item=\"item\"\n :allow-cancel=\"allowCancel\"\n @cancel=\"emit('cancel', item)\"\n />\n </ProgressList>\n\n <template v-if=\"placeholderItems > 0\">\n <div\n v-for=\"skeleton in placeholderItems\"\n :key=\"skeleton\"\n class=\"skeleton-container\"\n >\n <KdsLoadingSkeleton variant=\"icon-large\" />\n <div class=\"skeleton-text-content\">\n <KdsLoadingSkeleton variant=\"label\" />\n <KdsLoadingSkeleton variant=\"text\" />\n </div>\n </div>\n </template>\n </div>\n </CollapsiblePanel>\n</template>\n\n<style scoped>\n.upload-panel {\n width: var(--kds-dimension-component-width-20x);\n max-width: var(--kds-dimension-component-width-20x);\n}\n\n.upload-panel-content {\n max-height: var(--kds-dimension-component-height-20x);\n}\n\n.skeleton-container {\n display: grid;\n grid-template-columns: min-content 1fr;\n gap: var(--kds-spacing-container-0-25x);\n align-items: center;\n min-height: var(--kds-dimension-component-height-4x);\n padding: 0 var(--kds-spacing-container-1x);\n border-top: var(--kds-border-base-subtle);\n\n & .skeleton-text-content {\n display: flex;\n flex-direction: column;\n gap: var(--kds-spacing-container-0-25x);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { KdsBadgeVariant, KdsIconName } from \"@knime/kds-components\";\n\nimport {\n ProgressItem,\n type ProgressItemAction,\n type ProgressItemBadge,\n} from \"../../shared/ui\";\n\nimport type { DownloadItem } from \"./types\";\n\ntype Props = {\n item: DownloadItem;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n cancel: [];\n download: [];\n}>();\n\nconst statusMapper = {\n IN_PROGRESS: [\"Zipping\", \"info\", \"reload\"],\n READY: [\"Ready\", \"success\", \"circle-info\"],\n CANCELLED: [\"Cancelled\", \"error\", \"circle-error\"],\n FAILED: [\"Failed\", \"error\", \"circle-error\"],\n} satisfies Record<\n DownloadItem[\"status\"],\n [string, KdsBadgeVariant, KdsIconName]\n>;\n\nconst badge = computed<ProgressItemBadge>(() => {\n const [text, variant, icon] = statusMapper[props.item.status];\n\n return {\n text,\n variant,\n icon,\n } satisfies ProgressItemBadge;\n});\n\nconst isCancellable = computed(() => props.item.status === \"IN_PROGRESS\");\nconst isReady = computed(() => props.item.status === \"READY\");\n\nconst actions = computed<Array<ProgressItemAction>>(() => {\n const actions: ProgressItemAction[] = [];\n\n if (isCancellable.value) {\n actions.push({\n id: \"cancel\",\n icon: \"x-close\",\n label: \"Cancel\",\n handler: () => emit(\"cancel\"),\n });\n }\n\n if (isReady.value) {\n actions.push({\n id: \"download\",\n icon: \"cloud-download\",\n label: \"Download again\",\n handler: () => emit(\"download\"),\n });\n }\n\n return actions;\n});\n</script>\n\n<template>\n <ProgressItem\n :id=\"item.downloadId\"\n icon=\"file\"\n :headline=\"item.name\"\n :badge=\"badge\"\n :actions=\"actions\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, watch } from \"vue\";\n\nimport { CollapsiblePanel, ProgressList } from \"../../shared/ui\";\n\nimport DownloadProgressPanelItem from \"./DownloadProgressPanelItem.vue\";\nimport type { DownloadItem } from \"./types\";\n\ntype Props = {\n /**\n * List of current download items that should be displayed\n */\n items: DownloadItem[];\n};\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n cancel: [item: DownloadItem];\n download: [item: DownloadItem];\n close: [];\n}>();\n\nconst expanded = defineModel<boolean>(\"expanded\", { default: true });\n\nconst totalItems = computed(() => props.items.length);\nconst totalDownloadedItems = computed(\n () => props.items.filter(({ status }) => status === \"READY\").length,\n);\n\nconst headline = computed(() => {\n const suffix = `file${totalItems.value > 1 ? \"s\" : \"\"}`;\n return `Downloaded ${totalDownloadedItems.value} of ${totalItems.value} ${suffix}`;\n});\n\nconst hasItemsInProgress = computed(() =>\n props.items.some(({ status }) => status === \"IN_PROGRESS\"),\n);\n\nwatch(\n () => props.items?.length,\n (newValue, oldValue) => {\n if (oldValue > 0 && !newValue) {\n emit(\"close\");\n }\n },\n);\n</script>\n\n<template>\n <CollapsiblePanel\n v-model=\"expanded\"\n :headline=\"headline\"\n class=\"download-panel\"\n :can-be-dismissed=\"!hasItemsInProgress\"\n @close=\"emit('close')\"\n >\n <div class=\"download-panel-content\">\n <ProgressList>\n <DownloadProgressPanelItem\n v-for=\"item in items\"\n :key=\"item.downloadId\"\n :item=\"item\"\n @cancel=\"emit('cancel', item)\"\n @download=\"emit('download', item)\"\n />\n </ProgressList>\n </div>\n </CollapsiblePanel>\n</template>\n\n<style scoped>\n.download-panel {\n width: var(--kds-dimension-component-width-20x);\n max-width: var(--kds-dimension-component-width-20x);\n}\n\n.download-panel-content {\n max-height: var(--kds-dimension-component-height-20x);\n}\n</style>\n","//#region src/predicate/isPlainObject.ts\n/**\n* Checks if a given value is a plain object.\n*\n* @param value - The value to check.\n* @returns True if the value is a plain object, otherwise false.\n*\n* @example\n* ```typescript\n* // ✅👇 True\n*\n* isPlainObject({ }); // ✅\n* isPlainObject({ key: 'value' }); // ✅\n* isPlainObject({ key: new Date() }); // ✅\n* isPlainObject(new Object()); // ✅\n* isPlainObject(Object.create(null)); // ✅\n* isPlainObject({ nested: { key: true} }); // ✅\n* isPlainObject(new Proxy({}, {})); // ✅\n* isPlainObject({ [Symbol('tag')]: 'A' }); // ✅\n*\n* // ✅👇 (cross-realms, node context, workers, ...)\n* const runInNewContext = await import('node:vm').then(\n* (mod) => mod.runInNewContext\n* );\n* isPlainObject(runInNewContext('({})')); // ✅\n*\n* // ❌👇 False\n*\n* class Test { };\n* isPlainObject(new Test()) // ❌\n* isPlainObject(10); // ❌\n* isPlainObject(null); // ❌\n* isPlainObject('hello'); // ❌\n* isPlainObject([]); // ❌\n* isPlainObject(new Date()); // ❌\n* isPlainObject(new Uint8Array([1])); // ❌\n* isPlainObject(Buffer.from('ABC')); // ❌\n* isPlainObject(Promise.resolve({})); // ❌\n* isPlainObject(Object.create({})); // ❌\n* isPlainObject(new (class Cls {})); // ❌\n* isPlainObject(globalThis); // ❌,\n* ```\n*/\nfunction isPlainObject(value) {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;\n\treturn Object.prototype.toString.call(value) === \"[object Object]\";\n}\n//#endregion\nexport { isPlainObject };\n","//#region src/_internal/isUnsafeProperty.ts\n/**\n* Checks if a property key is unsafe to modify directly.\n*\n* This function is used in functions like `merge` to prevent prototype pollution attacks\n* by identifying property keys that could modify the object's prototype chain or constructor.\n*\n* @param key - The property key to check\n* @returns `true` if the property is unsafe to modify directly, `false` otherwise\n* @internal\n*/\nfunction isUnsafeProperty(key) {\n\treturn key === \"__proto__\";\n}\n//#endregion\nexport { isUnsafeProperty };\n","import { isPlainObject } from \"../predicate/isPlainObject.mjs\";\nimport { isUnsafeProperty } from \"../_internal/isUnsafeProperty.mjs\";\n//#region src/object/merge.ts\n/**\n* Merges the properties of the source object into the target object.\n*\n* This function performs a deep merge, meaning nested objects and arrays are merged recursively.\n* If a property in the source object is an array or an object and the corresponding property in the target object is also an array or object, they will be merged.\n* If a property in the source object is undefined, it will not overwrite a defined property in the target object.\n*\n* Note that this function mutates the target object.\n*\n* @param target - The target object into which the source object properties will be merged. This object is modified in place.\n* @param source - The source object whose properties will be merged into the target object.\n* @returns The updated target object with properties from the source object merged in.\n*\n* @template T - Type of the target object.\n* @template S - Type of the source object.\n*\n* @example\n* const target = { a: 1, b: { x: 1, y: 2 } };\n* const source = { b: { y: 3, z: 4 }, c: 5 };\n*\n* const result = merge(target, source);\n* console.log(result);\n* // Output: { a: 1, b: { x: 1, y: 3, z: 4 }, c: 5 }\n*\n* @example\n* const target = { a: [1, 2], b: { x: 1 } };\n* const source = { a: [3], b: { y: 2 } };\n*\n* const result = merge(target, source);\n* console.log(result);\n* // Output: { a: [3, 2], b: { x: 1, y: 2 } }\n*\n* @example\n* const target = { a: null };\n* const source = { a: [1, 2, 3] };\n*\n* const result = merge(target, source);\n* console.log(result);\n* // Output: { a: [1, 2, 3] }\n*/\nfunction merge(target, source) {\n\tconst sourceKeys = Object.keys(source);\n\tfor (let i = 0; i < sourceKeys.length; i++) {\n\t\tconst key = sourceKeys[i];\n\t\tif (isUnsafeProperty(key)) continue;\n\t\tconst sourceValue = source[key];\n\t\tconst targetValue = target[key];\n\t\tif (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) target[key] = merge(targetValue, sourceValue);\n\t\telse if (Array.isArray(sourceValue)) target[key] = merge([], sourceValue);\n\t\telse if (isPlainObject(sourceValue)) target[key] = merge({}, sourceValue);\n\t\telse if (targetValue === void 0 || sourceValue !== void 0) target[key] = sourceValue;\n\t}\n\treturn target;\n}\nfunction isMergeableValue(value) {\n\treturn isPlainObject(value) || Array.isArray(value);\n}\n//#endregion\nexport { merge };\n","export const API_BASE_URL = \"/_/api\";\n","import { merge } from \"es-toolkit/object\";\nimport { type FetchOptions, ofetch } from \"ofetch\";\n\nimport { API_BASE_URL } from \"./constants\";\n\nconst defaultConfig: FetchOptions = {\n baseURL: API_BASE_URL,\n headers: {\n \"Content-Type\": \"application/json\",\n\n // see: https://knime-com.atlassian.net/wiki/spaces/SPECS/pages/4126769212/API+Errors#Client-Request-Headers\n Accept: \"application/json; application/problem+json\",\n },\n} as const;\n\nconst createHttpClient = (customOptions?: FetchOptions) => {\n const { baseURL = API_BASE_URL, ...otherCustomOptions } = customOptions ?? {};\n\n return ofetch.create(\n merge({ baseURL, ...otherCustomOptions }, defaultConfig),\n );\n};\n\nexport { type FetchOptions, defaultConfig, createHttpClient };\n","import { promise as promiseUtils } from \"@knime/utils\";\n\n// eslint-disable-next-line no-magic-numbers\nconst CHUNK_SIZE = 50 * 1024 * 1024; // 50 MB per chunk\n\nconst DEFAULT_RETRY_COUNT = 5;\nconst DEFAULT_RETRY_DELAY_MS = 50;\n\nexport const UploadStates = {\n IDLE: \"idle\",\n IN_PROGRESS: \"inprogress\",\n CANCELLED: \"cancelled\",\n FAILED: \"failed\",\n COMPLETE: \"complete\",\n} as const;\n\nexport type UploadStateName = (typeof UploadStates)[keyof typeof UploadStates];\n\nexport type PartUploadResponse = {\n partId: string;\n};\n\nconst uploadChunkWithProgress = (params: {\n method: string;\n url: string;\n chunk: Blob;\n chunkIndex: number;\n onProgress: (progress: number) => void;\n abortSignal: AbortSignal;\n}) => {\n const { method, url, chunk, chunkIndex, onProgress, abortSignal } = params;\n\n const OK = 200;\n const CREATED = 201;\n\n return new Promise<{ partId: string }>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.open(method, url, true);\n\n abortSignal.addEventListener(\"abort\", () => xhr.abort());\n\n // Track the upload progress of the current chunk\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n onProgress(event.loaded);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status === OK || xhr.status === CREATED) {\n const etag = xhr.getResponseHeader(\"ETag\");\n\n // 1. note that some backends don't return the etag header, then we just set an empty string\n // 2. remove possible doublequotes (\") around the etag and/or weak identifier (if either is present)\n // https://datatracker.ietf.org/doc/html/rfc7232#section-2.3\n resolve({ partId: etag?.replace(/^(?:W\\/)?\"|\"$/g, \"\") ?? \"\" });\n } else {\n consola.error(\"Failed or unexpected XHR response\", {\n xhrStatus: xhr.status,\n xhrResponse: xhr.response,\n chunkIndex,\n });\n reject(new Error(\"Failed to upload file\"));\n }\n };\n\n xhr.onerror = (event) => {\n consola.error(\"Failed to upload chunk\", {\n xhrErrorEvent: event,\n chunkIndex,\n });\n reject(new Error(\"Failed to upload file\"));\n };\n\n xhr.send(chunk);\n });\n};\n\nexport type UploaderManagerConfig = {\n /**\n * Function to resolve the metadata for a request to upload a file part\n * @param uploadId\n * @param partNumber\n * @returns\n */\n resolveFilePartUploadURL: (\n uploadId: string,\n partNumber: number,\n ) => Promise<{ method: string; url: string }>;\n\n /**\n * Callback that gets triggered when the whole file is uploaded.\n * @param\n * @returns\n */\n onFileUploadComplete?: (payload: {\n /**\n * Identifier of the upload for this file (must be unique)\n */\n uploadId: string;\n /**\n * Ids of all the uploaded file parts\n */\n filePartIds: Record<number, string>;\n }) => void;\n\n /**\n * Callback that gets triggered when an upload has failed.\n * @param uploadId\n * @param error the error that cause the failure if it exists\n * @returns\n */\n onFileUploadFailed?: (payload: { uploadId: string; error: Error }) => void;\n\n /**\n * Callback that gets triggered when the progress of a file part upload\n * for a specific upload id is updated\n * @param uploadId\n * @param progress\n * @returns\n */\n onProgress?: (uploadId: string, progress: number) => void;\n};\n\ntype UploadState = {\n uploadId: string;\n file: File;\n completedChunkCount: number;\n uploadedByteCount: number;\n state: UploadStateName;\n abortController: AbortController;\n};\n\n/**\n * Creates and returns an `uploadManager`, a comprehensive multi-file, multi-part upload handler.\n *\n * The `uploadManager` offers functionality for handling file uploads in parts and provides\n * several built-in mechanisms to ensure the process is reliable and adaptable.\n *\n * Key features include:\n *\n * - **Chunked File Uploads**: Splits provided files into manageable chunks and initiates the upload\n * for each part using the `resolveFilePartUploadURL` function provided in the configuration.\n *\n * - **Retry Mechanism**: Automatically retries failed upload attempts up to a maximum of 5 times\n * per failed request.\n *\n * - **Upload Cancellation**: Allows cancellation of ongoing uploads, giving users control over the process.\n *\n * - **Progress Tracking**: Monitors the progress of each file part upload and triggers the `onProgress`\n * callback to provide updates.\n *\n * - **Error Handling**: The returned `uploadFiles` function does not throw errors directly. Instead,\n * it manages retries and stops any failed uploads after the retry limit is reached, marking them as failed.\n * This ensures that the promise it returns completes gracefully without uncaught exceptions.\n *\n */\nexport const createUploadManager = (config: UploaderManagerConfig) => {\n const {\n resolveFilePartUploadURL: getUploadFilePartUrl,\n onFileUploadComplete,\n onFileUploadFailed,\n } = config;\n const uploadStateMap = new Map<string, UploadState>();\n\n const completedUploads = new Set<string>();\n const cancelledUploads = new Set<string>();\n const failedUploads = new Set<string>();\n\n const assertState = (uploadId: string, state: UploadStateName) =>\n uploadStateMap.has(uploadId) &&\n uploadStateMap.get(uploadId)!.state === state;\n\n const getUploadState = (uploadId: string) => uploadStateMap.get(uploadId);\n const setUploadState = (uploadId: string, state: Partial<UploadState>) => {\n uploadStateMap.set(uploadId, {\n ...uploadStateMap.get(uploadId)!,\n ...state,\n });\n };\n\n const isFailed = (uploadId: string) => assertState(uploadId, \"failed\");\n const isCancelled = (uploadId: string) => assertState(uploadId, \"cancelled\");\n\n const getTotalFileParts = (file: File) => Math.ceil(file.size / CHUNK_SIZE);\n\n const abortInFlightUpload = (uploadId: string, reason: string) => {\n const currentState = uploadStateMap.get(uploadId);\n\n if (!currentState) {\n return;\n }\n\n currentState.abortController.abort(\n new promiseUtils.AbortError(\n `Upload (${currentState.uploadId}) for file \"${currentState.file.name}\" aborted. Reason: \"${reason}\"`,\n ),\n );\n };\n\n const cancel = (uploadId: string) => {\n if (!uploadStateMap.has(uploadId)) {\n consola.error(\"cancel:: Invalid upload id\");\n return;\n }\n\n setUploadState(uploadId, { state: \"cancelled\" });\n\n abortInFlightUpload(uploadId, \"upload cancelled\");\n cancelledUploads.add(uploadId);\n };\n\n const setFailed = (uploadId: string, error: Error) => {\n if (!uploadStateMap.has(uploadId)) {\n consola.error(\"failed:: Invalid upload id\");\n return;\n }\n\n setUploadState(uploadId, { state: \"failed\" });\n onFileUploadFailed?.({ uploadId, error });\n failedUploads.add(uploadId);\n\n if (completedUploads.has(uploadId)) {\n completedUploads.delete(uploadId);\n }\n };\n\n const uploadFileFromChunkIndex = async (\n uploadId: string,\n file: File,\n initialChunkIndex = 0,\n ) => {\n const totalChunks = getTotalFileParts(file);\n const totalBytes = file.size;\n const completedPartIds: Record<number, string> = {};\n\n const { abortController, runAbortablePromise } =\n promiseUtils.createAbortablePromise();\n\n uploadStateMap.set(uploadId, {\n uploadId,\n file,\n state: \"inprogress\",\n uploadedByteCount: uploadStateMap.get(uploadId)?.uploadedByteCount ?? 0,\n completedChunkCount:\n uploadStateMap.get(uploadId)?.completedChunkCount ?? 0,\n abortController,\n });\n\n let chunkIndex = initialChunkIndex;\n let uploadedBytes = uploadStateMap.get(uploadId)?.uploadedByteCount;\n\n while (chunkIndex < totalChunks) {\n if (isCancelled(uploadId) || isFailed(uploadId)) {\n break;\n }\n\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, file.size);\n\n const chunk = file.slice(start, end);\n\n try {\n const { method, url } = await promiseUtils.retryPromise({\n fn: () => getUploadFilePartUrl(uploadId, chunkIndex + 1),\n retryCount: DEFAULT_RETRY_COUNT,\n retryDelayMS: DEFAULT_RETRY_DELAY_MS,\n });\n\n consola.trace(\"File part upload url resolved\", { method, url });\n\n const onChunkUploadProgress = (uploadedChunkBytes: number) => {\n uploadedBytes = uploadedChunkBytes + start;\n setUploadState(uploadId, { uploadedByteCount: uploadedBytes });\n\n const progress = Math.round((uploadedBytes / totalBytes) * 100);\n\n config.onProgress?.(uploadId, progress);\n };\n\n const filePartResponse = await runAbortablePromise(() =>\n promiseUtils.retryPromise({\n fn: () =>\n uploadChunkWithProgress({\n method,\n url,\n chunk,\n chunkIndex,\n onProgress: onChunkUploadProgress,\n abortSignal: abortController.signal,\n }),\n retryCount: DEFAULT_RETRY_COUNT,\n retryDelayMS: DEFAULT_RETRY_DELAY_MS,\n }),\n );\n\n consola.trace(\n `${file.name}: Chunk ${chunkIndex + 1} of ${totalChunks} uploaded successfully`,\n );\n\n completedPartIds[chunkIndex + 1] = filePartResponse.partId;\n\n setUploadState(uploadId, {\n completedChunkCount:\n uploadStateMap.get(uploadId)!.completedChunkCount + 1,\n });\n } catch (error) {\n if (error instanceof promiseUtils.AbortError) {\n consola.info(\"Aborted::\", error);\n return;\n }\n\n setFailed(\n uploadId,\n error instanceof Error ? error : new Error(error as string),\n );\n return;\n }\n\n chunkIndex++;\n }\n\n if (isCancelled(uploadId) || isFailed(uploadId)) {\n return;\n }\n\n setUploadState(uploadId, {\n completedChunkCount: totalChunks,\n state: \"complete\",\n });\n completedUploads.add(uploadId);\n onFileUploadComplete?.({ uploadId, filePartIds: completedPartIds });\n };\n\n const uploadFiles = (files: Array<{ uploadId: string; file: File }>) => {\n const result: Array<Promise<unknown>> = [];\n\n for (const { uploadId, file } of files) {\n result.push(uploadFileFromChunkIndex(uploadId, file));\n }\n\n return Promise.allSettled(result).then(() => {\n // state cleanup\n const completed = [...completedUploads.values()];\n const cancelled = [...cancelledUploads.values()];\n const failed = [...failedUploads.values()];\n\n [...completed, ...cancelled, ...failed].forEach((uploadId) =>\n uploadStateMap.delete(uploadId),\n );\n\n completedUploads.clear();\n cancelledUploads.clear();\n failedUploads.clear();\n\n return {\n completed,\n cancelled,\n failed,\n };\n });\n };\n\n return {\n uploadFiles,\n\n getUploadState,\n isFailed,\n isCancelled,\n cancel,\n setFailed,\n };\n};\n","import { computed, ref } from \"vue\";\n\nimport { type UploaderManagerConfig, createUploadManager } from \"../manager\";\n\nimport type { UploadItem } from \"./types\";\n\ntype OnCompletePayload = Parameters<\n NonNullable<UploaderManagerConfig[\"onFileUploadComplete\"]>\n>[0] & { parentId: string; name: string };\n\ntype OnFailedPayload = Parameters<\n NonNullable<UploaderManagerConfig[\"onFileUploadFailed\"]>\n>[0] & { parentId: string };\n\ntype UseUploadManagerOptions = Omit<\n UploaderManagerConfig,\n \"onProgress\" | \"onFileUploadComplete\" | \"onFileUploadFailed\"\n> & {\n onFileUploadComplete?: (payload: OnCompletePayload) => void;\n onFileUploadFailed?: (payload: OnFailedPayload) => void;\n};\n\n/**\n * This composable wraps the `uploadManager` utility\n * in order to provide reactive state which will work tightly with the `UploadProgressPanel` component\n *\n * The reactive state returned (`uploadItems`) will update whenever the progress\n * or status of each item being uploaded changes\n */\nexport const useUploadManager = (options: UseUploadManagerOptions) => {\n const uploadState = ref<Record<string, UploadItem>>({});\n\n const { uploadFiles, cancel, setFailed } = createUploadManager({\n ...options,\n\n onFileUploadComplete: (params) => {\n const { parentId, name } = uploadState.value[params.uploadId];\n uploadState.value[params.uploadId].status = \"complete\";\n options.onFileUploadComplete?.({ ...params, parentId, name });\n },\n\n onFileUploadFailed: ({ uploadId, error }) => {\n const { parentId } = uploadState.value[uploadId];\n uploadState.value[uploadId] = {\n ...uploadState.value[uploadId],\n status: \"failed\",\n failureDetails: error.message,\n };\n options.onFileUploadFailed?.({ uploadId, error, parentId });\n },\n\n onProgress: (uploadId, progress) => {\n if (uploadState.value[uploadId].status === \"inprogress\") {\n uploadState.value[uploadId].progress = progress;\n }\n },\n });\n\n const start = async (\n parentId: string,\n uploadPayload: Array<{ uploadId: string; file: File }>,\n ) => {\n try {\n uploadPayload.forEach(({ uploadId, file }) => {\n uploadState.value[uploadId] = {\n id: uploadId,\n name: file.name,\n size: file.size,\n progress: 0,\n status: \"inprogress\",\n parentId,\n };\n });\n\n await uploadFiles(uploadPayload);\n } catch (error) {\n consola.error(\"Error uploading files\", error);\n }\n };\n\n const canCancel = (uploadId: string) =>\n uploadState.value[uploadId]?.status === \"inprogress\" ||\n uploadState.value[uploadId]?.status === \"failed\";\n\n const removeItem = (uploadId: string) => {\n if (canCancel(uploadId)) {\n cancel(uploadId);\n }\n\n delete uploadState.value[uploadId];\n };\n\n const resetState = () => {\n uploadState.value = {};\n };\n\n const uploadItems = computed(() => Object.values(uploadState.value));\n\n const hasPendingUploads = computed(() =>\n uploadItems.value.some(({ status }) => status === \"inprogress\"),\n );\n\n const totalPendingUploads = computed(\n () =>\n uploadItems.value.filter(({ status }) => status === \"inprogress\").length,\n );\n\n return {\n uploadState,\n hasPendingUploads,\n totalPendingUploads,\n start,\n cancel: (uploadId: string) => {\n cancel(uploadId);\n uploadState.value[uploadId].status = \"cancelled\";\n },\n canCancel,\n removeItem,\n resetState,\n setFailed: (uploadId: string, error: Error) => {\n uploadState.value[uploadId] = {\n ...uploadState.value[uploadId],\n status: \"failed\",\n failureDetails: error.message,\n };\n setFailed(uploadId, error);\n },\n };\n};\n","import { computed, reactive, readonly, ref } from \"vue\";\nimport type { FetchError, FetchOptions } from \"ofetch\";\n\nimport {\n formatFileSize,\n getFileMimeType,\n knimeFileFormats,\n promise,\n} from \"@knime/utils\";\n\nimport { rfcErrors } from \"../../rfcErrors\";\nimport { createHttpClient } from \"../shared/httpClient\";\n\nimport type { UploadItem } from \"./ui\";\nimport { useUploadManager } from \"./ui/useUploadManager\";\n\nconst DEFAULT_MAX_UPLOAD_QUEUE_SIZE = 10;\n// eslint-disable-next-line no-magic-numbers\nconst DEFAULT_UPLOAD_SIZE_LIMIT_BYTES = 5 * 1024 * 1024 * 1024;\n\nconst DEFAULT_RETRY_DELAY_MS = 50;\n\n// Catalog & artifacts services currently have a limit for 5 GiB for\n// upload and copy/move operations but it is not communicated to clients.\n// Repeat the constant here to be able to still make a pre-check. See NXT-4510.\nconst getUploadSizeLimitBytes = () => DEFAULT_UPLOAD_SIZE_LIMIT_BYTES;\n\ntype UseFileUploadOptions = {\n /**\n * Max number of concurrent uploads allowed in the upload queue.\n * When an upload is started with a number of files that exceed the pending\n * uploads then only files up-to the max queue size will be processed and the rest\n * will be ignored. This will also call the `onUploadQueueSizeExceeded` callback\n */\n maxUploadQueueSize?: number;\n /**\n * Callback that triggers every time any file in the queue completes its upload\n * @returns\n */\n onFileUploadComplete?: (payload: {\n uploadId: string;\n filePartIds: Record<number, string>;\n parentId: string;\n name: string;\n }) => void;\n /**\n * Callback that triggers every time any file in the queue fails its upload\n * @returns\n */\n onFileUploadFailed?: (payload: {\n uploadId: string;\n error: Error;\n parentId: string;\n }) => void;\n /**\n * Callback that triggers when a upload batch is started (via the `start` function) but the amount\n * of items to upload exceed the max configured size of the queue.\n * @returns\n */\n onUploadQueueSizeExceeded?: (maxQueueSize: number) => void;\n /**\n * Options to customize the fetch client used internally to make http requests.\n * e.g: headers, baseUrl, etc\n */\n customFetchClientOptions?: FetchOptions;\n};\n\n/**\n * This composable handles uploads of data to a hub repository item (space or workflow group).\n * It is a multi-step process which is described as follows:\n *\n * Step 1:\n * First we need to prepare an upload. The items will be uploaded to a `parent` container\n * identified by its id. Then, for each file we want to upload, we must provide paths relative\n * to the parent that identify each file. Example:\n * ```\n * {\n * \"items\": {\n * \"my-file.txt\": { itemContentType: \"text/plain\", itemContentSize: 5000 },\n * \"folder/my-file.zip\": { itemContentType: \"application/zip\", itemContentSize: 5000 },\n * }\n * }\n * ```\n * This describes 2 items, one placed in the parent's root and another inside a folder.\n * The response for this would look like:\n * ```\n * {\n * \"items\": {\n * \"my-file.txt\": { uploadId: \"id1\" },\n * \"folder/my-file.zip\": { uploadId: \"id2\" },\n * }\n * }\n * ```\n * Now, each corresponding `uploadId` uniquely identifies the upload process for\n * their respective files.\n *\n * Step 2:\n * Next, we need to start uploading the file parts. Technically, you _can_ just upload\n * each file as one big file \"part\", but practically that is not recommended because a hiccup\n * in the connection means you would have to start the upload from scratch; instead, we split\n * the files in smaller parts.\n * The upload manager helper will take care of splitting the file. However, the responsibility\n * of this composable is to supply a function to resolve the upload URL. This upload URL is obtained\n * by POSTing to an endpoint with the `uploadId` and the `partNumber` and this will return\n * the data required to make an upload to a presigned URL; this will be called for each file part.\n *\n * Step 3:\n * Completion:\n * Once the upload of a single file is complete, the upload manager will trigger the `onFileUploadComplete`\n * callback, which then will supply the ids of all the different parts that got uploaded for a given `uploadId`\n * Then we need to \"complete\" the upload by sending a request which provides the `uploadId` and a list of\n * the ids of all the parts. Note that some backends don't return the ids of the file parts after a successful\n * upload of a part, in this case empty strings or null can be used instead of the part id.\n *\n * Cancellation:\n * Alternative to completion, you can also cancel an upload. For this, the composable makes a DELETE request\n * providing the corresponding `uploadId` which will effectively cancel it.\n *\n *\n * For a usage example, refer to the Docs page in storybook.\n */\nexport const useFileUpload = (options: UseFileUploadOptions = {}) => {\n const $ofetch = createHttpClient(options.customFetchClientOptions);\n\n const prepareUpload = (\n parentId: string,\n files: Array<File>,\n ): Promise<Array<{ uploadId: string; file: File }>> => {\n const fileDictionary = Object.fromEntries(\n files.map((file) => {\n // strip extension for workflows\n const name = knimeFileFormats.KNWF.getNameOrDefault(file, file.name);\n\n return [name, file];\n }),\n );\n\n // map file dictionary to body payload of the prepare upload request\n const items: Record<\n string,\n { itemContentType: string; itemContentSize: number }\n > = Object.fromEntries(\n Object.entries(fileDictionary).map(([name, file]) => [\n name,\n {\n itemContentType: getFileMimeType(file),\n itemContentSize: file.size,\n },\n ]),\n );\n\n type PrepareUploadResponse = {\n items: Record<string, { uploadId: string }>;\n };\n\n return $ofetch<PrepareUploadResponse>(`/repository/${parentId}/manifest`, {\n method: \"POST\",\n body: { items },\n }).then(({ items }) => {\n return Object.keys(items).map((name) => {\n const { uploadId } = items[name];\n const file = fileDictionary[name];\n return { uploadId, file };\n });\n });\n };\n\n const resolveFilePartUploadURL = (uploadId: string, partNumber: number) => {\n type UploadURLResponse = {\n method: string;\n url: string;\n header: { Host: string };\n };\n\n return $ofetch<UploadURLResponse>(\n `/uploads/${uploadId}/parts/?partNumber=${partNumber}`,\n { method: \"POST\" },\n );\n };\n\n const completeUpload = (\n uploadId: string,\n partIds: Record<number, string>,\n ) => {\n return $ofetch(`/uploads/${uploadId}`, {\n method: \"POST\",\n body: partIds,\n });\n };\n\n const cancelUpload = (uploadId: string) => {\n return $ofetch(`/uploads/${uploadId}`, {\n method: \"DELETE\",\n });\n };\n\n // contains upload ids for files that have a processing step which was not finished yet\n const unprocessedUploads = reactive<Set<string>>(new Set());\n const isKNWFFile = (file: File) => knimeFileFormats.KNWF.matches(file);\n\n let useUploadManagerResult: ReturnType<typeof useUploadManager> | null = null;\n\n const setProcessingCompleted = ({ uploadId }: { uploadId: string }) => {\n unprocessedUploads.delete(uploadId);\n };\n\n const setProcessingFailed = ({\n uploadId,\n error,\n }: {\n uploadId: string;\n error?: Error;\n }) => {\n unprocessedUploads.delete(uploadId);\n useUploadManagerResult?.setFailed(\n uploadId,\n error ?? new Error(\"An error occurred when processing the file\"),\n );\n };\n\n useUploadManagerResult = useUploadManager({\n resolveFilePartUploadURL,\n\n onFileUploadComplete: ({ uploadId, filePartIds, parentId, name }) => {\n promise\n .retryPromise({ fn: () => completeUpload(uploadId, filePartIds) })\n .then(() => {\n options.onFileUploadComplete?.({\n uploadId,\n filePartIds,\n parentId,\n name,\n });\n })\n .catch((error) => {\n consola.error(\"Error attempting to complete upload\", { error });\n setProcessingFailed({ uploadId, error });\n });\n },\n\n onFileUploadFailed: ({ uploadId, error, parentId }) => {\n options?.onFileUploadFailed?.({ uploadId, error, parentId });\n },\n });\n\n const getEnqueueableFiles = (files: File[]): File[] => {\n const { totalPendingUploads } = useUploadManagerResult;\n\n const { maxUploadQueueSize = DEFAULT_MAX_UPLOAD_QUEUE_SIZE } = options;\n\n if (files.length + totalPendingUploads.value > maxUploadQueueSize) {\n options.onUploadQueueSizeExceeded?.(maxUploadQueueSize);\n }\n\n // only keep as many files as the queue allows\n const effectiveQueueSize = Math.max(\n 0,\n maxUploadQueueSize - totalPendingUploads.value,\n );\n return files.slice(0, effectiveQueueSize);\n };\n\n const { uploadState, ...uploadManagerResultRest } = useUploadManagerResult;\n\n const uploadQueue = computed<UploadItem[]>(() => {\n return Object.values(uploadState.value).map((uploadItem) => {\n if (\n uploadItem.status === \"complete\" &&\n unprocessedUploads.has(uploadItem.id)\n ) {\n return {\n id: uploadItem.id,\n name: uploadItem.name,\n parentId: uploadItem.parentId,\n size: uploadItem.size,\n status: \"processing\" as const,\n };\n }\n\n return uploadItem;\n });\n });\n\n const prepareQueueSize = ref(0);\n\n return {\n ...uploadManagerResultRest,\n uploadQueue,\n unprocessedUploads: readonly(unprocessedUploads),\n setProcessingCompleted,\n setProcessingFailed,\n\n isPreparingUpload: computed(() => prepareQueueSize.value > 0),\n totalFilesBeingPrepared: computed(() => prepareQueueSize.value),\n\n start: async (\n parentId: string,\n files: File[],\n options: { isFileWithProcessing?: typeof isKNWFFile } = {},\n ) => {\n const { isFileWithProcessing = isKNWFFile } = options;\n const enqueueableFiles = getEnqueueableFiles(files);\n const uploadSizeLimitBytes = getUploadSizeLimitBytes();\n const oversizedFiles = enqueueableFiles.filter(\n (file) => file.size > uploadSizeLimitBytes,\n );\n\n if (oversizedFiles.length > 0) {\n throw new rfcErrors.RFCError({\n title: \"Upload size limit exceeded\",\n status: 413,\n details: oversizedFiles.map(\n (file) =>\n `${file.name} (${formatFileSize(file.size)}) exceeds the upload limit of ${formatFileSize(uploadSizeLimitBytes)}.`,\n ),\n });\n }\n\n try {\n if (enqueueableFiles.length === 0) {\n return [];\n }\n\n prepareQueueSize.value += enqueueableFiles.length;\n\n const uploadPayload = await promise.retryPromise({\n fn: () => prepareUpload(parentId, enqueueableFiles),\n excludeError: (error: FetchError) =>\n // eslint-disable-next-line no-magic-numbers\n Boolean(error.statusCode && error.statusCode < 500),\n retryDelayMS: DEFAULT_RETRY_DELAY_MS,\n });\n\n uploadPayload.forEach(({ uploadId, file }) => {\n if (isFileWithProcessing(file)) {\n unprocessedUploads.add(uploadId);\n }\n });\n\n const uploadIds = uploadPayload.map((upload) => upload.uploadId);\n\n // accept floating promise, errors are handled inside the function\n\n useUploadManagerResult.start(parentId, uploadPayload);\n\n return uploadIds;\n } catch (error) {\n throw rfcErrors.tryParse(error) ?? error;\n } finally {\n // errors can only be thrown in the prepareUpload call, useUploadManagerResult.start does its own error handling\n prepareQueueSize.value -= enqueueableFiles.length;\n }\n },\n\n cancel: (uploadId: string) => {\n useUploadManagerResult.cancel(uploadId);\n cancelUpload(uploadId).catch((error: unknown) => {\n consola.error(\"There was a problem cancelling the upload\", { error });\n });\n },\n };\n};\n","import { computed, ref } from \"vue\";\nimport { FetchError, type FetchOptions } from \"ofetch\";\n\nimport { sleep } from \"@knime/utils\";\n\nimport { rfcErrors } from \"../../rfcErrors\";\nimport { createHttpClient } from \"../shared/httpClient\";\n\nimport type { DownloadItem as DownloadItemExternal } from \"./ui/types\";\n\nconst DEFAULT_MAX_RETRIES = null;\nconst DEFAULT_POLLING_INTERVAL = 2000;\n\ntype ArtifactStatusResponse = {\n downloadId?: string;\n status?: string;\n statusMessage?: string;\n lastUpdated?: string;\n downloadUrl?: string;\n};\n\n// Initial request can have either download url (if it can be downloaded immediately) or download id (to poll for the status)\ntype RequestDownloadResponse =\n | {\n downloadId: string;\n }\n | {\n downloadUrl: string;\n };\n\n// type guard\nconst hasDownloadUrl = (\n response: RequestDownloadResponse,\n): response is { downloadUrl: string } => {\n return \"downloadUrl\" in response;\n};\n\n/**\n * The version of the artifact to download.\n */\ntype ItemVersion = number | \"current-state\" | \"most-recent\";\n\n/**\n * Tracks the state of each concurrent download.\n */\ntype DownloadItem = DownloadItemExternal & {\n itemId: string;\n version?: ItemVersion;\n};\n\nexport type UseDownloadArtifactOptions = {\n /**\n * The maximum number of times to poll for the download URL. Default is `null` (no limit).\n */\n maxRetries?: number;\n /**\n * The interval in milliseconds between each poll. Default is `2000` ms.\n */\n pollingInterval?: number;\n /**\n * Options to customize the fetch client used internally to make http requests.\n * e.g: headers, baseUrl, etc\n */\n customFetchClientOptions?: FetchOptions;\n};\n\nconst isAbortError = (error: unknown) =>\n error instanceof DOMException && error.name === \"AbortError\";\n\n/**\n * This composable supports multiple concurrent downloads. Each time you call ```start```, the following behavior applies:\n *\n * 1. **Immediate-ready artifact**: If the first status check for the artifact returns `READY`, then there's no polling and no need\n * to add it to `downloadItems`. The download URL is opened in the same tab immediately.\n *\n * 2. **Not-ready artifact**: If the artifact is not yet ready (e.g. needs zipping), then we add a record to `downloadItems` with status `IN_PROGRESS`\n * and repeatedly poll until it becomes `READY`, the polling times out, or the user aborts.\n *\n * **Usage**:\n * ```\n * const { start, cancel, downloadItems } = useDownloadArtifact({ ...options });\n *\n * // start a download\n * await start({ itemId: \"1234\", version: 1 });\n *\n * // if needed, cancel it:\n * cancel(\"1234\");\n *\n * // downloadItems (as a computed array) will reflect the current statuses.\n * ```\n */\nexport const useDownloadArtifact = (\n options: UseDownloadArtifactOptions = {},\n) => {\n const $ofetch = createHttpClient(options.customFetchClientOptions);\n\n const downloadItems = ref<Record<string, DownloadItem>>({});\n const abortControllers: Record<string, AbortController> = {};\n\n // Use fallback values if none are provided\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const pollingInterval = options.pollingInterval ?? DEFAULT_POLLING_INTERVAL;\n\n const cancel = (downloadId: string) => {\n const itemController = abortControllers[downloadId];\n if (itemController) {\n itemController.abort();\n delete abortControllers[downloadId];\n }\n };\n\n const removeItem = (downloadId: string) => {\n cancel(downloadId);\n delete downloadItems.value[downloadId];\n };\n\n const fetchDownloadStatus = ({\n downloadId,\n signal,\n }: {\n downloadId: string;\n signal?: AbortSignal;\n }) => {\n return $ofetch<ArtifactStatusResponse>(`/downloads/${downloadId}/status`, {\n method: \"GET\",\n signal,\n });\n };\n\n const openDownload = (downloadUrl: string) => {\n const a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = downloadUrl;\n a.download = \"\";\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n /**\n * Makes a request to the download status endpoint for the given download item.\n * Returns a boolean that is true if a terminal state has been reached (download is ready,\n * download failed, or user aborted download)\n * @param downloadId the `downloadId`\n * @param signal the abort signal passed to the request to be able to abort it\n * @returns a boolean indicating whether a terminal state has been reached\n */\n const handlePollingResult = async ({\n downloadId,\n signal,\n }: {\n downloadId: string;\n signal: AbortSignal;\n }) => {\n try {\n const statusResponse = await fetchDownloadStatus({\n downloadId,\n signal,\n });\n\n if (statusResponse?.status === \"READY\" && statusResponse?.downloadUrl) {\n downloadItems.value[downloadId].status = \"READY\";\n downloadItems.value[downloadId].downloadUrl =\n statusResponse.downloadUrl;\n // open download in a new tab\n openDownload(statusResponse.downloadUrl);\n return true;\n } else if (statusResponse?.status === \"FAILED\") {\n let details = \"Download failed\";\n if (statusResponse?.statusMessage) {\n details += `: ${statusResponse.statusMessage}`;\n }\n throw new Error(details);\n }\n } catch (error: unknown) {\n consola.error(\"Error fetching status:\", error);\n // https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort\n const isAborted =\n isAbortError(error) ||\n (error instanceof FetchError && isAbortError(error.cause));\n\n if (!isAborted) {\n downloadItems.value[downloadId].status = \"FAILED\";\n downloadItems.value[downloadId].failureDetails =\n error instanceof Error ? error.message : (error as string);\n }\n return true;\n }\n return false;\n };\n\n const pollDownloadItem = async ({\n itemId,\n downloadId,\n version,\n name,\n }: {\n itemId: string;\n downloadId: string;\n version?: ItemVersion;\n name: string;\n }) => {\n const controller = new AbortController();\n abortControllers[downloadId] = controller;\n\n const signal = controller.signal;\n\n let itemName = `${name}`;\n if (version) {\n itemName += ` (${version})`;\n }\n\n downloadItems.value[downloadId] = {\n itemId,\n ...(version && { version }),\n downloadId,\n name: itemName,\n status: \"IN_PROGRESS\",\n };\n\n const abortListener = () => {\n controller.signal.removeEventListener(\"abort\", abortListener);\n if (!downloadItems.value[downloadId]) {\n return;\n }\n downloadItems.value[downloadId].status = \"CANCELLED\";\n downloadItems.value[downloadId].failureDetails =\n \"Download was cancelled manually\";\n };\n controller.signal.addEventListener(\"abort\", abortListener);\n\n let tries = 0;\n // eslint-disable-next-line no-unmodified-loop-condition\n while (maxRetries === null || tries < maxRetries) {\n tries++;\n await sleep(pollingInterval);\n\n const isTerminalState = await handlePollingResult({ downloadId, signal });\n\n if (isTerminalState) {\n break;\n }\n }\n\n delete abortControllers[downloadId];\n\n if (maxRetries !== null && tries >= maxRetries) {\n downloadItems.value[downloadId].status = \"FAILED\";\n downloadItems.value[downloadId].failureDetails = \"Download timed out\";\n }\n };\n\n const start = async ({\n itemId,\n version,\n name,\n }: {\n itemId: string;\n name: string;\n version?: ItemVersion;\n }) => {\n try {\n const response = await $ofetch<RequestDownloadResponse>(\n `/repository/${itemId}/artifact`,\n {\n method: \"GET\",\n query: { version },\n },\n );\n\n // if download is ready, open url immediately\n if (hasDownloadUrl(response)) {\n openDownload(response.downloadUrl);\n return;\n }\n\n // otherwise start polling download status\n await pollDownloadItem({\n itemId,\n version,\n downloadId: response.downloadId,\n name,\n });\n } catch (error: unknown) {\n // here only errors thrown by the initial requests are caught;\n // errors occurring while polling will be handled in pollDownloadItem\n throw rfcErrors.tryParse(error) ?? error;\n }\n };\n\n const totalItemsBeingZipped = computed(\n () =>\n Object.values(downloadItems.value).filter(\n ({ status }) => status === \"IN_PROGRESS\",\n ).length,\n );\n\n const resetState = () => {\n for (const [downloadId, controller] of Object.entries(abortControllers)) {\n controller?.abort();\n delete abortControllers[downloadId];\n }\n downloadItems.value = {};\n };\n\n const downloadItemsArray = computed(() => Object.values(downloadItems.value));\n\n return {\n /**\n * Initiates a download of the given itemId and version.\n */\n start,\n\n /**\n * Cancels the ongoing download for a given itemId (if any).\n * Sets the status in `downloadItems` to `CANCELLED`.\n */\n cancel,\n\n /**\n * Removes item from `downloadItems`.\n */\n removeItem,\n\n /**\n * A computed array of all current items that are being zipped and prepared for download.\n */\n downloadItems: downloadItemsArray,\n\n /**\n * The total number of zipping items in progress.\n */\n totalItemsBeingZipped,\n\n /**\n * Resets the state of the composable, clearing all downloads and controllers.\n */\n resetState,\n\n /**\n * Opens a download from the given url\n */\n openDownload,\n };\n};\n"],"names":["_useModel","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createTextVNode","_toDisplayString","_hoisted_2","_createVNode","_unref","_createBlock","_Transition","_renderSlot","_openBlock","_withDirectives","_Fragment","_renderList","UploadProgressPanelItem","actions","DownloadProgressPanelItem","DEFAULT_RETRY_DELAY_MS","promiseUtils","items","promise","options"],"mappings":"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","x_google_ignoreList":[8,9,10]}
|