n8n-editor-ui
Version:
Workflow Editor UI for n8n
28,360 lines • 1.09 MB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FixedCollectionParameter-CpMHT5tV.js","assets/_plugin-vue_export-helper-BwBpWJRZ.js","assets/src-DgvumQTi.js","assets/preload-helper-CR0ecmWK.js","assets/truncate-B1HVeveJ.js","assets/_MapCache-ficiegRb.js","assets/vue.runtime.esm-bundler-tP5dCd7J.js","assets/chunk-6z4oVpB-.js","assets/CalendarDate-zWqgZMlk.js","assets/sanitize-html-Cc45ZKm8.js","assets/empty-BuGRxzl4.js","assets/path-browserify-BtCDmZ3_.js","assets/en-CF30SCh2.js","assets/src-CMoPZtHv.css","assets/nodeCreator.store-FJrC_Pu6.js","assets/constants-BbpucWL4.js","assets/merge-k8vSyyXH.js","assets/builder.store-sBTWwxRU.js","assets/_baseOrderBy-B_6CV8x6.js","assets/dateformat-CM9k0--B.js","assets/useDebounce-Bnb8W2LR.js","assets/nodeIcon-DI2Acud1.js","assets/RunData-B4jIonVZ.js","assets/useRunWorkflow-BQJbxiOd.js","assets/useCanvasOperations-CAHezq7d.js","assets/usePinnedData-CL2qWhwp.js","assets/folders.store-BjAwtSH4.js","assets/executions.store-CXjGPxs0.js","assets/retry-dP46utx2.js","assets/uniqBy-BwIeMDu6.js","assets/NDVEmptyState-CpUQ-969.js","assets/NDVEmptyState-Bho0_Ev8.css","assets/vue-json-pretty-DGKuDe33.js","assets/assistant.store-bS9AHOoo.js","assets/useClipboard-CyG-SBdG.js","assets/schemaPreview.store-BFprwUEe.js","assets/chatPanel.store-4qGv1TCZ.js","assets/useExecutionHelpers-BhJEW8lu.js","assets/dateFormatter-DDfPHI9I.js","assets/externalSecrets.ee.store-D27nc9Y2.js","assets/RunDataHtml-CkjC7YuF.js","assets/RunDataHtml-Bu3RZcuV.css","assets/RunData-CGWkR8tE.css","assets/ParameterInputList-B4xJHjua.js","assets/exports-hpMZaOPT.js","assets/vue-Dg_43WEg.js","assets/date-picker-B6nJ4qMb.js","assets/dialog-D5O6wJX0.js","assets/VirtualSchema-D2LnRq9K.js","assets/Draggable-04Tfmp_H.js","assets/Draggable-DfBtatxg.css","assets/NodeIcon-BVhrZNYI.js","assets/NodeIcon-BDxr0f30.css","assets/useTelemetryContext-5Wb7vBCv.js","assets/useTelemetryContext-BpnKRIT7.css","assets/nodeTransforms-Lk_uXh7p.js","assets/TextWithHighlights-DjzuDrgO.js","assets/TextWithHighlights-BgbTzzK2.css","assets/VirtualSchema-CwutU4vj.css","assets/VueMarkdown-D9lDzMKr.js","assets/ParameterInputList-C1BdtAjc.css","assets/FixedCollectionParameter-DT3ELzS9.css","assets/useImportCurlCommand-C_c-9DcI.js"])))=>i.map(i=>d[i]);
import { o as __toESM, t as __commonJSMin } from "./chunk-6z4oVpB-.js";
import { $ as onUpdated, Bt as toRaw, C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, G as nextTick, Gt as unref, I as guardReactiveProps, It as ref, J as onBeforeUnmount, L as h, M as createVNode, N as defineAsyncComponent, P as defineComponent, Pt as reactive, Q as onUnmounted, T as createBlock, U as mergeModels, Ut as toValue, W as mergeProps, Z as onMounted, _ as Fragment, _t as watch, at as renderSlot, b as Teleport, bn as normalizeStyle, bt as withCtx, c as useCssModule, ct as resolveDynamicComponent, et as openBlock, ft as useModel, h as withModifiers, i as createApp, it as renderList, j as createTextVNode, jt as isRef, k as createSlots, l as useCssVars, m as withKeys, mt as useTemplateRef, n as Transition, ot as resolveComponent, p as vShow, q as onBeforeMount, r as TransitionGroup, st as resolveDirective, v as KeepAlive, vn as normalizeClass, vt as watchEffect, w as createBaseVNode, xt as withDirectives, yn as normalizeProps, zt as shallowRef } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
import { C as useCssVar, D as useElementSize, H as createEventHook, U as createInjectionState, Z as refDebounced, _t as useI18n, dt as addCredentialTranslation, gt as setLanguage, ht as i18nInstance, m as require_isArray, mt as i18n$1, vt as I18nT, x as useAsyncState, z as useStorage } from "./_MapCache-ficiegRb.js";
import { $ as N8nInputLabel_default, At as ElSelect, B as InlineAskAssistantButton_default, C as N8nResizeWrapper_default, Cn as N8nSpinner_default, Ct as N8nActionBox_default, D as N8nPopover_default, En as use, F as N8nMarkdown_default, H as N8nFormInputs_default, It as ElTag, J as N8nSelect_default, Lt as ElCheckbox, Mt as ElDropdownItem, N as N8nMenuItem_default, Nt as ElDropdownMenu, Ot as ElOption, Q as N8nCheckbox_default, R as N8nInfoTip_default, Sn as N8nButton_default, St as AskAssistantButton_default, T as N8nRadioButtons_default, Tt as ElSwitch, W as N8nFormInput_default, Y as N8nOption_default, a as N8nCommandBar_default, bn as N8nCallout_default, bt as createFormEventBus, c as N8nInlineTextEdit_default, ct as useDeviceSupport, dt as AskAssistantAvatar_default, et as N8nCard_default, ft as AskAssistantIcon_default, ht as N8nTooltip_default, i as N8nPlugin, jt as ElDropdown, k as N8nNotice_default, kt as ElOptionGroup, lt as N8nBadge_default, mt as N8nLink_default, p as N8nUsersList_default, pt as AskAssistantChat_default$1, u as N8nDataTableServer_default, ut as AskAssistantText_default, wn as N8nIcon_default, x as N8nTag_default, xn as N8nText_default, xt as N8nIconButton_default, y as N8nTabs_default, yn as N8nHeading_default, yt as N8nInput_default } from "./src-DgvumQTi.js";
import "./en-CF30SCh2.js";
import { t as __vitePreload } from "./preload-helper-CR0ecmWK.js";
import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
import { C as isWorkflowUpdatedMessage, I as ElIcon, J as useLocale, L as _export_sfc, O as ElFocusTrap, Ot as close_default, T as createEventBus, Wt as addUnit, Y as useDeprecated, _t as buildProps, b as isTaskAbortedMessage, c as require__arrayMap, ct as withInstall, q as useNamespace, r as require_get, t as truncate, v as useRoute, y as useRouter } from "./truncate-B1HVeveJ.js";
import "./_initCloneObject-Al9ZJ6PX.js";
import { n as ElTableColumn, t as ElTable } from "./table-DzZuElSR.js";
import { t as ElDatePicker } from "./date-picker-B6nJ4qMb.js";
import { $a as EDUCATION_TYPE, $i as nodeViewEventBus, $o as CREDENTIAL_EDIT_MODAL_KEY, $r as BulkCommand, A as telemetry, Aa as AUTOMATION_BENEFICIARY_SELF, Ac as ElLoading, Ao as REPORTED_SOURCE_KEY, Ar as isCredentialModalState, Ba as DELETE_USER_MODAL_KEY, Bn as useAnnotationTagsStore, Bo as ROLE_DATA_SCIENCE, Ci as getNodeCredentialForSelectedAuthType, Co as PERSONALIZATION_MODAL_KEY, Da as AUTOMATION_BENEFICIARY_KEY, Do as REPORTED_SOURCE_EVENT, Dr as useUsersStore, Ds as getThirdPartyLicenses, Ea as MOVE_FOLDER_MODAL_KEY, Eo as REAL_ESTATE_OR_CONSTRUCTION, Fa as COMPANY_SIZE_20_OR_LESS, Fo as REPORTED_SOURCE_PODCAST, Ga as DEVOPS_AUTOMATION_GOAL_OTHER_KEY, Gn as useNodeHelpers, Go as ROLE_OTHER, Ha as DEVOPS_AUTOMATION_CLOUD_INFRASTRUCTURE_ORCHESTRATION_GOAL, Ho as ROLE_ENGINEERING, Hr as isValidCredentialResponse, Ia as COMPANY_SIZE_500_999, Io as REPORTED_SOURCE_TWITTER, Ja as DEVOPS_MONITORING_AND_ALERTING_GOAL, Jn as workflowStateEventBus, Jo as ROLE_SECURITY, Ka as DEVOPS_AUTOMATION_OTHER, Kn as injectWorkflowState, Ko as ROLE_OTHER_KEY, La as COMPANY_SIZE_KEY, Lo as REPORTED_SOURCE_YOUTUBE, M as useNDVStore, Ma as COMPANY_SIZE_1000_OR_MORE, Mi as isValueExpression, Mo as REPORTED_SOURCE_LLM, N as useWorkflowsStore, Na as COMPANY_SIZE_100_499, No as REPORTED_SOURCE_OTHER, Nt as useNodeTypesStore, O as useTelemetry, Oa as AUTOMATION_BENEFICIARY_MY_TEAM, Oc as BUILDER_ENABLED_VIEWS, Oi as isAuthRelatedParameter, Oo as REPORTED_SOURCE_FRIEND, Pa as COMPANY_SIZE_20_99, Pi as updateNodeAuthType, Po as REPORTED_SOURCE_OTHER_KEY, Qa as ECOMMERCE_COMPANY_TYPE, Qn as ProjectTypes, Qo as TELECOMS_INDUSTRY, Ra as COMPANY_SIZE_PERSONAL_USE, Rn as useWorkflowHelpers, Ro as ROLE_BUSINESS_OWNER, S as getBannerRowHeight, Si as getNodeAuthOptions, So as OTHER_MARKETING_AUTOMATION_GOAL_KEY, Ti as getTriggerNodeServiceName, To as PHYSICAL_RETAIL_OR_SERVICES, Tr as useRBACStore, Ua as DEVOPS_AUTOMATION_DATA_SYNCING_GOAL, Uo as ROLE_IT, Va as DEVOPS_AUTOMATION_CI_CD_GOAL, Vn as useTagsStore, Vo as ROLE_DEVOPS, Wa as DEVOPS_AUTOMATION_GOAL_KEY, Wn as useEnvironmentsStore, Wo as ROLE_KEY, Xa as DEVOPS_TICKETING_SYSTEMS_INTEGRATIONS_GOAL, Xn as useProjectsStore, Xo as SECURITY_INDUSTRY, Xr as useHistoryStore, Y as getNodeViewTab, Ya as DEVOPS_REPORTING_GOAL, Yn as useDocumentTitle, Yo as SAAS_COMPANY_TYPE, Za as DIGITAL_AGENCY_COMPANY_TYPE, Zn as useSourceControlStore, Zo as SYSTEMS_INTEGRATOR_COMPANY_TYPE, _a as PROJECT_MOVE_RESOURCE_MODAL, _i as getAppNameFromCredType, _o as MSP_INDUSTRY, _r as useLoadingService, ao as LEGAL_INDUSTRY, as as ANNOTATION_TAGS_MANAGER_MODAL_KEY, b as useExternalHooks, ba as DELETE_FOLDER_MODAL_KEY, bo as OTHER_COMPANY_TYPE, c as useTemplatesStore, cc as createCredentialResolver, ci as MAX_NAME_LENGTH, co as MARKETING_AUTOMATION_AD_CAMPAIGN, da as COMMUNITY_NODES_INSTALLATION_DOCS_URL, di as splitName, do as MARKETING_AUTOMATION_GOAL_KEY, ei as Command, eo as FINANCE_INSURANCE_INDUSTRY, es as CREDENTIAL_SELECT_MODAL_KEY, f as useTemplatesDataQualityStore, fa as COMMUNITY_NODES_RISKS_DOCS_URL, fo as MARKETING_AUTOMATION_LEAD_GENERATION_GOAL, g as useWorkflowHistoryStore, ga as NPM_KEYWORD_SEARCH_URL, gn as useCredentialsStore, go as MEDIA_INDUSTRY, gs as useSettingsStore, gt as useVueFlow, h as useNpsSurveyStore, ha as COMMUNITY_PACKAGE_MANAGE_ACTIONS, hi as getActivatableTriggerNodes, ho as MARKETING_INDUSTRY, hs as useStorage$1, io as IT_INDUSTRY, is as DEBUG_PAYWALL_MODAL_KEY, j as usePostHog, ja as COMPANY_INDUSTRY_EXTENDED_KEY, jc as ElOverlay, jn as isTestableExpression, jo as REPORTED_SOURCE_LINKEDIN, k as TelemetryPlugin, ka as AUTOMATION_BENEFICIARY_OTHER_TEAMS, kc as ElMessageBox, ko as REPORTED_SOURCE_GOOGLE, la as subscribe, li as ResourceType, lo as MARKETING_AUTOMATION_CUSTOMER_COMMUNICATION, m as useMessage, ma as COMMUNITY_PACKAGE_INSTALL_MODAL_KEY, mo as MARKETING_AUTOMATION_REPORTING, n as useWorkflowSaving, no as HEALTHCARE_INDUSTRY, ns as COMMUNITY_PLUS_DOCS_URL, oa as useUIStore, oo as MANUFACTURING_INDUSTRY, os as MAX_TAG_NAME_LENGTH, ot as _sfc_main$d, p as useCloudPlanStore, pa as COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, pc as updateCredentialResolver, po as MARKETING_AUTOMATION_OTHER, ps as validate_default, qa as DEVOPS_INCIDENT_RESPONSE_GOAL, qo as ROLE_SALES_AND_MARKETING, ro as INVITE_USER_MODAL_KEY, rs as COMMUNITY_PLUS_ENROLLMENT_MODAL, sa as getAll, so as MARKETING_AUTOMATION_ACTIONS, ss as TAGS_MANAGER_MODAL_KEY, t as useBuilderStore, to as GOVERNMENT_INDUSTRY, ts as VARIABLE_MODAL_KEY, ua as API_KEY_CREATE_OR_EDIT_MODAL_KEY, uc as getCredentialResolver, ui as getTruncatedProjectName, un as capitalCase, uo as MARKETING_AUTOMATION_DATA_SYNCHING, v as useToast, va as SOURCE_CONTROL_PULL_MODAL_KEY, vo as OTHER_AUTOMATION_GOAL, vr as hasPermission, wo as PERSONAL_COMPANY_TYPE, xi as getNodeAuthFields, xo as OTHER_INDUSTRY_OPTION, xt as isChatNode, y as useStyles, ya as SOURCE_CONTROL_PUSH_MODAL_KEY, yc as sendUserEvent, yi as getAuthTypeForNodeCredential, yo as OTHER_COMPANY_INDUSTRY_EXTENDED_KEY, za as COMPANY_TYPE_KEY, zn as useWorkflowsEEStore, zo as ROLE_CUSTOMER_SUPPORT } from "./builder.store-sBTWwxRU.js";
import { A as HtmlEditor_default, S as require_set, a as ParameterOptions_default, b as setParameterValue, i as ParameterInputFull_default, k as JsEditor_default, o as ParameterInputWrapper_default, t as ParameterInputList_default, x as require_unset } from "./ParameterInputList-B4xJHjua.js";
import "./empty-BuGRxzl4.js";
import { t as ElRadio } from "./radio-BeejvdFG.js";
import { n as ElRow, t as ElCol } from "./col-Cd5kWzv_.js";
import { i as dialogProps, n as useDialog, r as dialogEmits } from "./dialog-D5O6wJX0.js";
import "./sanitize-html-Cc45ZKm8.js";
import "./CalendarDate-zWqgZMlk.js";
import "./path-browserify-BtCDmZ3_.js";
import { $i as getNodeParameters, $o as LOG_STREAM_MODAL_KEY, A as VALID_EMAIL_REGEX, Bo as CHANGE_PASSWORD_MODAL_KEY, C as TEMPLATES_URLS, Co as WORKFLOW_VERSION_NAME_MAX_LENGTH, Cs as WORKFLOW_SHARE_MODAL_KEY, D as CODEMIRROR_TOOLTIP_CONTAINER_ELEMENT_ID, Do as isSourceControlledFileStatus, E as APP_MODALS_ELEMENT_ID, Eo as SOURCE_CONTROL_FILE_TYPE, Fi as defaultMessageEventBusDestinationOptions, Go as DUPLICATE_MODAL_KEY, Ha as DateTime, Ho as CONFIRM_PASSWORD_MODAL_KEY, Ii as defaultMessageEventBusDestinationSentryOptions, Jo as EXPERIMENT_TEMPLATE_RECO_V3_KEY, Ko as EXPERIMENT_TEMPLATES_DATA_QUALITY_KEY, Kr as ROLE, Li as defaultMessageEventBusDestinationSyslogOptions, Lo as MAIN_HEADER_TABS, Mc as MFA_AUTHENTICATION_CODE_INPUT_MAX_LENGTH, Mi as isExpression, Nc as MFA_AUTHENTICATION_CODE_WINDOW_EXPIRED, Oo as getResourcePermissions, Pi as MessageEventBusDestinationTypeNames, Pt as AI_MCP_TOOL_NODE_TYPE, Qo as IMPORT_WORKFLOW_URL_MODAL_KEY, Ri as defaultMessageEventBusDestinationWebhookOptions, Ro as VIEWS, Si as traverseNodeParameters, So as WORKFLOW_VERSION_DESCRIPTION_MAX_LENGTH, Ss as WORKFLOW_SETTINGS_MODAL_KEY, St as NODE_CREATOR_OPEN_SOURCES, Ta as isCommunityPackageName, To as SOURCE_CONTROL_FILE_STATUS, Ua as NodeConnectionTypes, Uo as CONTACT_PROMPT_MODAL_KEY, V as HIRING_BANNER, Vo as CHAT_EMBED_MODAL_KEY, Wo as CREDENTIAL_RESOLVER_EDIT_MODAL_KEY, Xo as FROM_AI_PARAMETERS_MODAL_KEY, Yo as EXTERNAL_SECRETS_PROVIDER_MODAL_KEY, Za as CHAT_TRIGGER_NODE_TYPE, Zo as IMPORT_CURL_MODAL_KEY, _i as require__baseIteratee, _o as require_keys, _s as WORKFLOW_EXTRACTION_NAME_MODAL_KEY, a as IS_DRAFT_PUBLISH_ENABLED, bc as EnterpriseEditionFeature, bs as WORKFLOW_HISTORY_VERSION_UNPUBLISH, c as BUILTIN_CREDENTIALS_DOCS_URL, co as OPEN_AI_API_CREDENTIAL_TYPE, cs as PROMPT_MFA_CODE_MODAL_KEY, ds as VERSIONS_MODAL_KEY, es as MFA_SETUP_MODAL_KEY, fr as TIME_SAVED_NODE_TYPE, fs as WHATS_NEW_MODAL_KEY, gs as WORKFLOW_DIFF_MODAL_KEY, ha as isINodePropertyCollection, hr as WEBHOOK_NODE_TYPE$1, hs as WORKFLOW_DESCRIPTION_MODAL_KEY, ii as compareWorkflowsNodes, is as NEW_ASSISTANT_SESSION_MODAL, j as VALID_WORKFLOW_IMPORT_URL_REGEX, ls as SETUP_CREDENTIALS_MODAL_KEY, m as DOCS_DOMAIN, mo as WEBHOOK_NODE_TYPE, ms as WORKFLOW_ACTIVE_MODAL_KEY, no as FORM_TRIGGER_NODE_TYPE, o as MAX_WORKFLOW_NAME_LENGTH, os as NPS_SURVEY_MODAL_KEY, pa as mergeNodeProperties, ps as WORKFLOW_ACTIVATION_CONFLICTING_WEBHOOK_MODAL_KEY, qo as EXPERIMENT_TEMPLATE_RECO_V2_KEY, ri as NodeDiffStatus, rs as MODAL_CONFIRM, sr as STICKY_NODE_TYPE, ss as PRE_BUILT_AGENTS_MODAL_KEY, us as STOP_MANY_EXECUTIONS_MODAL_KEY, vs as WORKFLOW_HISTORY_PUBLISH_MODAL_KEY, wa as deepCopy, wo as SOURCE_CONTROL_FILE_LOCATION, ws as LOCAL_STORAGE_ACTIVATION_FLAG, x as RELEASE_NOTES_URL, xs as WORKFLOW_PUBLISH_MODAL_KEY, ys as WORKFLOW_HISTORY_VERSION_RESTORE, zi as messageEventBusDestinationTypeNames, zo as ABOUT_MODAL_KEY, zt as CHAT_TRIGGER_NODE_TYPE$1 } from "./constants-BbpucWL4.js";
import { p as require__copyArray, v as require__baseAssignValue } from "./merge-k8vSyyXH.js";
import { A as storeToRefs, D as PiniaVuePlugin, O as createPinia, _ as LOGSTREAMING_CB_DEFAULT_FAILURE_WINDOW_MS, b as LOGSTREAMING_DEFAULT_MAX_SOCKETS, g as assert, h as axios_default, i as getAndParseConfigFromMetaTag, m as AxiosError, n as require__baseEach, r as useRootStore, s as ResponseError, v as LOGSTREAMING_CB_DEFAULT_MAX_FAILURES, y as LOGSTREAMING_DEFAULT_MAX_FREE_SOCKETS } from "./_baseOrderBy-B_6CV8x6.js";
import { t as require_dateformat } from "./dateformat-CM9k0--B.js";
import { t as useDebounce } from "./useDebounce-Bnb8W2LR.js";
import { t as useAssistantStore } from "./assistant.store-bS9AHOoo.js";
import { t as useChatPanelStore } from "./chatPanel.store-4qGv1TCZ.js";
import { i as SlideTransition_default, t as ItemsRenderer_default } from "./ItemsRenderer-DHxSclsD.js";
import "./retry-dP46utx2.js";
import { t as useExecutionsStore } from "./executions.store-CXjGPxs0.js";
import { n as useAgentRequestStore, t as useRunWorkflow } from "./useRunWorkflow-BQJbxiOd.js";
import "./usePinnedData-CL2qWhwp.js";
import { _ as useCalloutHelpers, t as useNodeCreatorStore, u as shouldIgnoreCanvasShortcut } from "./nodeCreator.store-FJrC_Pu6.js";
import "./nodeIcon-DI2Acud1.js";
import { a as useLogsStore } from "./useCanvasOperations-CAHezq7d.js";
import { t as useFoldersStore } from "./folders.store-BjAwtSH4.js";
import { t as NodeIcon_default } from "./NodeIcon-BVhrZNYI.js";
import "./KeyboardShortcutTooltip-B4E72qs1.js";
import { a as CanvasNode_default, d as CanvasRunWorkflowButton_default, i as CanvasBackground_default, l as useGlobalLinkActions, n as Canvas_default, r as CanvasEdge_default, t as useCanvasMapping, u as useWorkflowExtraction } from "./useCanvasMapping-xYnYeFUG.js";
import { t as useVersionsStore } from "./versions.store-BwdT833-.js";
import { t as usePageRedirectionHelper } from "./usePageRedirectionHelper-fGNB6ZKK.js";
import { n as BaseBanner_default, t as useBannersStore } from "./banners.store-C9sgKjcT.js";
import { t as useDataTableStore } from "./dataTable.store-B4A4ieSD.js";
import { t as Modal_default } from "./Modal-CaRDt4OG.js";
import { t as useClipboard } from "./useClipboard-CyG-SBdG.js";
import { a as useDebugInfo, t as useCommandBar } from "./useCommandBar-DX5Sf1tf.js";
import { t as CopyInput_default } from "./CopyInput-DKOPkUXT.js";
import { t as useApiKeysStore } from "./apiKeys.store-DnaeefCk.js";
import { n as mfaEventBus, r as promptMfaCodeBus, t as confirmPasswordEventBus } from "./auth.eventBus-B77G38R7.js";
import "./RunData-B4jIonVZ.js";
import "./NDVEmptyState-CpUQ-969.js";
import { $ as generateTraceId, A as spanTimeInputToSeconds, At as isThenable, B as SEMANTIC_ATTRIBUTE_SENTRY_OP, Bt as getGlobalSingleton, C as convertSpanLinksForEnvelope, Ct as isEvent, D as getStatusMessage, Dt as isPrimitive, E as getSpanDescendants, Et as isPlainObject, F as SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, Ft as stackParserFromStackParserOptions, G as getCurrentScope, Gt as DEBUG_BUILD$3, H as SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, Ht as getSentryCarrier, I as SEMANTIC_ATTRIBUTE_PROFILE_ID, It as CONSOLE_LEVELS, J as withScope, K as getIsolationScope, L as SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME, Lt as consoleSandbox, M as spanToTransactionTraceContext, Mt as createStackParser, N as getCapturedScopesOnSpan, Nt as getFramesFromEvent, O as showSpanDropWarning, Ot as isRequest, P as setCapturedScopesOnSpan, Pt as getFunctionName, Q as generateSpanId, R as SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT, Rt as debug, S as addChildSpanToSpan, St as isErrorEvent, T as getRootSpan, Tt as isParameterizedString, U as SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, Ut as SDK_VERSION, V as SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, Vt as getMainCarrier, W as getClient, Wt as GLOBAL_OBJ, X as _getSpanForScope, Y as getAsyncContextStrategy, Z as _setSpanForScope, _ as makeDsn, _t as getLocationHref, a as setTag, at as addExceptionTypeValue, b as TRACE_FLAG_NONE, bt as isDOMException, c as SyncPromise, ct as uuid4, d as normalize, dt as fill, et as merge, f as normalizeToSize, ft as getOriginalFunction, g as dsnToString, gt as getComponentName, h as getDynamicSamplingContextFromSpan, ht as stringMatchesSomePattern, i as captureSession, it as addExceptionMechanism, j as spanToJSON, jt as UNKNOWN_FUNCTION, k as spanIsSampled, kt as isString, l as rejectedSyncPromise, lt as addNonEnumerableProperty, m as getDynamicSamplingContextFromScope, mt as safeJoin, n as captureException, nt as dateTimestampInSeconds, o as startSession, ot as checkOrSetAlreadyCaught, p as freezeDscOnSpan, pt as markFunctionWrapped, q as getTraceContextFromScope, r as captureMessage, rt as timestampInSeconds, s as prepareEvent, st as getEventDescription, t as captureEvent, tt as updateSession, u as resolvedSyncPromise, ut as extractExceptionKeysForMessage, v as DEFAULT_ENVIRONMENT, vt as htmlTreeAsString, w as getActiveSpan, wt as isInstanceOf, x as TRACE_FLAG_SAMPLED, xt as isError, y as hasSpansEnabled, yt as isDOMError, z as SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE, zt as originalConsoleMethods } from "./exports-hpMZaOPT.js";
import { t as useExternalSecretsStore } from "./externalSecrets.ee.store-D27nc9Y2.js";
import "./uniqBy-BwIeMDu6.js";
import { n as useCommunityNodesStore, t as require_semver } from "./semver-CVsBQkSJ.js";
import { a as useInstallNode } from "./CommunityNodeUpdateInfo-Cd_-b5Xu.js";
import "./ProjectIcon-A2WPT9dM.js";
import { t as ProjectCardBadge_default } from "./ProjectCardBadge-Dxz7K_4f.js";
import { t as useUsageStore } from "./usage.store-CzHvJOo_.js";
import { t as CredentialIcon_default } from "./CredentialIcon-FEnE25SA.js";
import "./RunDataHtml-CkjC7YuF.js";
import "./VueMarkdown-D9lDzMKr.js";
import "./Draggable-04Tfmp_H.js";
import { c as script$1, s as script } from "./VirtualSchema-D2LnRq9K.js";
import "./TextWithHighlights-DjzuDrgO.js";
import { t as useTelemetryContext } from "./useTelemetryContext-5Wb7vBCv.js";
import "./schemaPreview.store-BFprwUEe.js";
import "./nodeTransforms-Lk_uXh7p.js";
import "./vue-json-pretty-DGKuDe33.js";
import "./dateFormatter-DDfPHI9I.js";
import "./useExecutionHelpers-BhJEW8lu.js";
import { t as EnterpriseEdition_ee_default } from "./EnterpriseEdition.ee-UkQT-fFo.js";
import { r as FreeAiCreditsCallout_default } from "./NodeSettings-iHP6f-9G.js";
import { t as TimeAgo_default } from "./TimeAgo-CWvYoS88.js";
import { t as require_orderBy } from "./orderBy-EuatZUAl.js";
import { t as ProjectSharing_default } from "./ProjectSharing-IDL3ExN3.js";
import { t as useRolesStore } from "./roles.store-DcLW4g80.js";
import { t as SaveButton_default } from "./SaveButton-DJxU0D7G.js";
import { n as registerModuleRoutes, r as useEnvFeatureFlag, t as router_default } from "./router-BuH0cEsQ.js";
import { t as sortByProperty } from "./sortByProperty-CV1aCzkS.js";
import "./TagsDropdown-LwHy1RX4.js";
import { t as WorkflowTagsDropdown_default } from "./WorkflowTagsDropdown-DEysJMrX.js";
import { n as ExternalSecretsProviderImage_ee_default, r as useExternalSecretsProvider, t as ExternalSecretsProviderConnectionSwitch_ee_default } from "./ExternalSecretsProviderConnectionSwitch.ee-DJrPUTjV.js";
import "./sso.store-Ba2eVE3K.js";
import "./insights.store-BBo4cRMD.js";
import "./insights.constants-C8GITe6H.js";
import "./insights.utils-B7OXsqrQ.js";
import "./mcp.constants-DQPD3Ntp.js";
import "./constants-DLTaaipl.js";
import "./useRecentResources-BAGmp8Wq.js";
import "./useActions-O8-gYbRP.js";
import { t as useLogStreamingStore } from "./logStreaming.store-Bz455qU8.js";
import "./vue-Dg_43WEg.js";
import "./templateTransforms-CdDWSirY.js";
import { n as AppsRequiringCredsNotice_default, r as useCredentialSetupState, t as SetupTemplateFormStep_default } from "./SetupTemplateFormStep-BnqPLZOK.js";
import "./CredentialPicker-C5gvgCLr.js";
import { t as sourceControlEventBus } from "./sourceControl.eventBus-Bry8gLG7.js";
import { t as useMcp } from "./useMcp-DzTrtFvb.js";
import { t as useCredentialResolvers } from "./useCredentialResolvers-hAbB1CCv.js";
import "./useKeybindings-CKeFso4-.js";
import { n as usePersonalizedTemplatesV2Store, t as usePersonalizedTemplatesV3Store } from "./personalizedTemplatesV3.store-DKnHj23X.js";
import { t as TemplateCard_default } from "./TemplateCard-DcldzIe3.js";
import { t as useWorkflowActivate } from "./useWorkflowActivate-BhSS_xpK.js";
import { t as WorkflowActivationErrorMessage_default } from "./WorkflowActivationErrorMessage-v37Lr_Ej.js";
import { r as generateVersionName } from "./utils-C2GPI2gK.js";
import "./chat.store-BGFxJU_3.js";
import "./fileUtils-D_SiS8no.js";
import { a as LineController, c as PointElement, d as plugin_title, f as plugin_tooltip, i as Chart, n as BarElement, o as LineElement, r as CategoryScale, s as LinearScale, u as plugin_legend } from "./chart-CE3HWIkr.js";
(function polyfill() {
const relList = document.createElement("link").relList;
if (relList && relList.supports && relList.supports("modulepreload")) return;
for (const link$2 of document.querySelectorAll("link[rel=\"modulepreload\"]")) processPreload(link$2);
new MutationObserver((mutations) => {
for (const mutation of mutations) {
if (mutation.type !== "childList") continue;
for (const node of mutation.addedNodes) if (node.tagName === "LINK" && node.rel === "modulepreload") processPreload(node);
}
}).observe(document, {
childList: true,
subtree: true
});
function getFetchOpts(link$2) {
const fetchOpts = {};
if (link$2.integrity) fetchOpts.integrity = link$2.integrity;
if (link$2.referrerPolicy) fetchOpts.referrerPolicy = link$2.referrerPolicy;
if (link$2.crossOrigin === "use-credentials") fetchOpts.credentials = "include";
else if (link$2.crossOrigin === "anonymous") fetchOpts.credentials = "omit";
else fetchOpts.credentials = "same-origin";
return fetchOpts;
}
function processPreload(link$2) {
if (link$2.ep) return;
link$2.ep = true;
const fetchOpts = getFetchOpts(link$2);
fetch(link$2.href, fetchOpts);
}
})();
var drawerProps = buildProps({
...dialogProps,
direction: {
type: String,
default: "rtl",
values: [
"ltr",
"rtl",
"ttb",
"btt"
]
},
size: {
type: [String, Number],
default: "30%"
},
withHeader: {
type: Boolean,
default: true
},
modalFade: {
type: Boolean,
default: true
},
headerAriaLevel: {
type: String,
default: "2"
}
});
var _sfc_main$1 = defineComponent({
name: "ElDrawer",
components: {
ElOverlay,
ElFocusTrap,
ElIcon,
Close: close_default
},
inheritAttrs: false,
props: drawerProps,
emits: dialogEmits,
setup(props, { slots }) {
useDeprecated({
scope: "el-drawer",
from: "the title slot",
replacement: "the header slot",
version: "3.0.0",
ref: "https://element-plus.org/en-US/component/drawer.html#slots"
}, computed(() => !!slots.title));
useDeprecated({
scope: "el-drawer",
from: "custom-class",
replacement: "class",
version: "2.3.0",
ref: "https://element-plus.org/en-US/component/drawer.html#attributes",
type: "Attribute"
}, computed(() => !!props.customClass));
const drawerRef = ref();
const focusStartRef = ref();
const ns = useNamespace("drawer");
const { t } = useLocale();
const isHorizontal = computed(() => props.direction === "rtl" || props.direction === "ltr");
const drawerSize = computed(() => addUnit(props.size));
return {
...useDialog(props, drawerRef),
drawerRef,
focusStartRef,
isHorizontal,
drawerSize,
ns,
t
};
}
});
var _hoisted_1$40 = [
"aria-label",
"aria-labelledby",
"aria-describedby"
];
var _hoisted_2$15 = ["id", "aria-level"];
var _hoisted_3$8 = ["aria-label"];
var _hoisted_4$6 = ["id"];
function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
const _component_close = resolveComponent("close");
const _component_el_icon = resolveComponent("el-icon");
const _component_el_focus_trap = resolveComponent("el-focus-trap");
const _component_el_overlay = resolveComponent("el-overlay");
return openBlock(), createBlock(Teleport, {
to: "body",
disabled: !_ctx.appendToBody
}, [createVNode(Transition, {
name: _ctx.ns.b("fade"),
onAfterEnter: _ctx.afterEnter,
onAfterLeave: _ctx.afterLeave,
onBeforeLeave: _ctx.beforeLeave,
persisted: ""
}, {
default: withCtx(() => [withDirectives(createVNode(_component_el_overlay, {
mask: _ctx.modal,
"overlay-class": _ctx.modalClass,
"z-index": _ctx.zIndex,
onClick: _ctx.onModalClick
}, {
default: withCtx(() => [createVNode(_component_el_focus_trap, {
loop: "",
trapped: _ctx.visible,
"focus-trap-el": _ctx.drawerRef,
"focus-start-el": _ctx.focusStartRef,
onReleaseRequested: _ctx.onCloseRequested
}, {
default: withCtx(() => [createBaseVNode("div", mergeProps({
ref: "drawerRef",
"aria-modal": "true",
"aria-label": _ctx.title || void 0,
"aria-labelledby": !_ctx.title ? _ctx.titleId : void 0,
"aria-describedby": _ctx.bodyId
}, _ctx.$attrs, {
class: [
_ctx.ns.b(),
_ctx.direction,
_ctx.visible && "open",
_ctx.customClass
],
style: _ctx.isHorizontal ? "width: " + _ctx.drawerSize : "height: " + _ctx.drawerSize,
role: "dialog",
onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
}), [
createBaseVNode("span", {
ref: "focusStartRef",
class: normalizeClass(_ctx.ns.e("sr-focus")),
tabindex: "-1"
}, null, 2),
_ctx.withHeader ? (openBlock(), createElementBlock("header", {
key: 0,
class: normalizeClass(_ctx.ns.e("header"))
}, [!_ctx.$slots.title ? renderSlot(_ctx.$slots, "header", {
key: 0,
close: _ctx.handleClose,
titleId: _ctx.titleId,
titleClass: _ctx.ns.e("title")
}, () => [!_ctx.$slots.title ? (openBlock(), createElementBlock("span", {
key: 0,
id: _ctx.titleId,
role: "heading",
"aria-level": _ctx.headerAriaLevel,
class: normalizeClass(_ctx.ns.e("title"))
}, toDisplayString(_ctx.title), 11, _hoisted_2$15)) : createCommentVNode("v-if", true)]) : renderSlot(_ctx.$slots, "title", { key: 1 }, () => [createCommentVNode(" DEPRECATED SLOT ")]), _ctx.showClose ? (openBlock(), createElementBlock("button", {
key: 2,
"aria-label": _ctx.t("el.drawer.close"),
class: normalizeClass(_ctx.ns.e("close-btn")),
type: "button",
onClick: _cache[0] || (_cache[0] = (...args) => _ctx.handleClose && _ctx.handleClose(...args))
}, [createVNode(_component_el_icon, { class: normalizeClass(_ctx.ns.e("close")) }, {
default: withCtx(() => [createVNode(_component_close)]),
_: 1
}, 8, ["class"])], 10, _hoisted_3$8)) : createCommentVNode("v-if", true)], 2)) : createCommentVNode("v-if", true),
_ctx.rendered ? (openBlock(), createElementBlock("div", {
key: 1,
id: _ctx.bodyId,
class: normalizeClass(_ctx.ns.e("body"))
}, [renderSlot(_ctx.$slots, "default")], 10, _hoisted_4$6)) : createCommentVNode("v-if", true),
_ctx.$slots.footer ? (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(_ctx.ns.e("footer"))
}, [renderSlot(_ctx.$slots, "footer")], 2)) : createCommentVNode("v-if", true)
], 16, _hoisted_1$40)]),
_: 3
}, 8, [
"trapped",
"focus-trap-el",
"focus-start-el",
"onReleaseRequested"
])]),
_: 3
}, 8, [
"mask",
"overlay-class",
"z-index",
"onClick"
]), [[vShow, _ctx.visible]])]),
_: 3
}, 8, [
"name",
"onAfterEnter",
"onAfterLeave",
"onBeforeLeave"
])], 8, ["disabled"]);
}
var ElDrawer = withInstall(/* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "/home/runner/work/element-plus/element-plus/packages/components/drawer/src/drawer.vue"]]));
var _hoisted_1$39 = ["aria-label"];
var _hoisted_2$14 = ["aria-label"];
var NodeIssueItem_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "NodeIssueItem",
props: {
issue: {},
getNodeType: { type: Function },
formatIssueMessage: { type: Function }
},
emits: ["click"],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const ndvStore = useNDVStore();
function handleEditClick() {
ndvStore.setActiveNodeName(props.issue.node, "other");
emit("click");
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock("li", {
class: normalizeClass(_ctx.$style.nodeIssue),
role: "listitem",
"aria-label": `Edit ${_ctx.issue.node} node`,
onClick: handleEditClick
}, [
createVNode(NodeIcon_default, {
"node-type": _ctx.getNodeType(_ctx.issue.node),
size: 14,
shrink: false,
"show-tooltip": true,
"tooltip-position": "left",
class: normalizeClass(_ctx.$style.nodeIcon),
"aria-label": `${_ctx.issue.node} node`
}, null, 8, [
"node-type",
"class",
"aria-label"
]),
createBaseVNode("div", {
class: normalizeClass(_ctx.$style.issueMessage),
"aria-label": `Issue: ${_ctx.formatIssueMessage(_ctx.issue.value)}`
}, [createBaseVNode("span", { class: normalizeClass(_ctx.$style.nodeName) }, toDisplayString(_ctx.issue.node) + ":", 3), createTextVNode(" " + toDisplayString(_ctx.formatIssueMessage(_ctx.issue.value)), 1)], 10, _hoisted_2$14),
createVNode(unref(N8nIcon_default), {
class: normalizeClass(_ctx.$style.chevron),
icon: "chevron-right"
}, null, 8, ["class"])
], 10, _hoisted_1$39);
};
}
});
var NodeIssueItem_vue_vue_type_style_index_0_lang_module_default = {
nodeIssue: "_nodeIssue_hm6x7_123",
nodeIcon: "_nodeIcon_hm6x7_134",
nodeName: "_nodeName_hm6x7_139",
issueMessage: "_issueMessage_hm6x7_144",
chevron: "_chevron_hm6x7_150"
};
var NodeIssueItem_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeIssueItem_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NodeIssueItem_vue_vue_type_style_index_0_lang_module_default }]]);
var ExecuteMessage_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ExecuteMessage",
emits: ["workflowExecuted"],
setup(__props, { emit: __emit }) {
const emit = __emit;
const router = useRouter();
const workflowsStore = useWorkflowsStore();
const nodeTypesStore = useNodeTypesStore();
const i18n$2 = useI18n();
const logsStore = useLogsStore();
const toast = useToast();
const builderStore = useBuilderStore();
const { runWorkflow } = useRunWorkflow({ router });
let executionWatcherStop;
const containerRef = ref();
const stopExecutionWatcher = () => {
if (executionWatcherStop) {
executionWatcherStop();
executionWatcherStop = void 0;
}
};
const ensureExecutionWatcher = () => {
if (executionWatcherStop) return;
const RUNNING_STATES = ["running", "waiting"];
executionWatcherStop = watch(() => workflowsStore.workflowExecutionData?.status, async (status) => {
await nextTick();
if (!status || RUNNING_STATES.includes(status)) return;
stopExecutionWatcher();
if (status !== "canceled") emit("workflowExecuted");
});
};
const hasValidationIssues = computed(() => builderStore.workflowTodos.length > 0);
const triggerNodes = computed(() => workflowsStore.workflow.nodes.filter((node) => nodeTypesStore.isTriggerNode(node.type)));
function localePatternToRegex(localeKey) {
const withPlaceholder = i18n$2.baseText(localeKey, { interpolate: { type: ".+" } }).replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace("\\.\\+", ".+");
return new RegExp(withPlaceholder, "i");
}
const credentialsNotSetPattern = localePatternToRegex("nodeIssues.credentials.notSet");
const parameterRequiredPattern = /Parameter\s+".+"\s+is\s+required/i;
function formatIssueMessage(issue) {
const baseMessage = workflowsStore.formatIssueMessage(issue);
if (parameterRequiredPattern.test(baseMessage)) {
if (baseMessage.match(/Parameter\s+"(.+)"\s+is\s+required/i)?.[1]?.toLowerCase() === "model") return i18n$2.baseText("aiAssistant.builder.executeMessage.chooseModel");
}
if (credentialsNotSetPattern.test(baseMessage)) return i18n$2.baseText("aiAssistant.builder.executeMessage.chooseCredentials");
return baseMessage;
}
function getNodeTypeByName(nodeName$2) {
const node = workflowsStore.workflow.nodes.find((n) => n.name === nodeName$2);
if (!node) return null;
return nodeTypesStore.getNodeType(node.type);
}
const isWorkflowRunning = computed(() => workflowsStore.isWorkflowRunning);
const isExecutionWaitingForWebhook = computed(() => workflowsStore.executionWaitingForWebhook);
const availableTriggerNodes = computed(() => hasValidationIssues.value ? [] : triggerNodes.value);
const executeButtonTooltip = computed(() => hasValidationIssues.value ? i18n$2.baseText("aiAssistant.builder.executeMessage.validationTooltip") : "");
async function onExecute() {
if (hasValidationIssues.value) return;
ensureExecutionWatcher();
const selectedTriggerNode = workflowsStore.selectedTriggerNodeName ?? availableTriggerNodes.value[0]?.name;
const selectedTriggerNodeType = selectedTriggerNode ? workflowsStore.getNodeByName(selectedTriggerNode) : null;
if (selectedTriggerNodeType && isChatNode(selectedTriggerNodeType)) {
toast.showMessage({
title: i18n$2.baseText("aiAssistant.builder.toast.title"),
message: i18n$2.baseText("aiAssistant.builder.toast.description"),
type: "info"
});
logsStore.toggleOpen(true);
return;
}
const runOptions = {};
if (selectedTriggerNode) runOptions.triggerNode = selectedTriggerNode;
await runWorkflow(runOptions);
}
function scrollIntoView() {
containerRef.value?.scrollIntoView({
behavior: "smooth",
block: "nearest",
inline: "nearest"
});
}
function trackBuilderPlaceholders(issue) {
builderStore.trackWorkflowBuilderJourney("user_clicked_todo", {
node_type: workflowsStore.getNodeByName(issue.node)?.type,
type: issue.type
});
}
onMounted(scrollIntoView);
watch(hasValidationIssues, (hasIssues, hadIssues) => {
if (hadIssues && !hasIssues) builderStore.trackWorkflowBuilderJourney("no_placeholder_values_left");
});
onBeforeUnmount(() => {
stopExecutionWatcher();
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
ref_key: "containerRef",
ref: containerRef,
class: normalizeClass(_ctx.$style.container),
role: "region",
"aria-label": "Workflow execution panel"
}, [hasValidationIssues.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createBaseVNode("p", { class: normalizeClass(_ctx.$style.description) }, toDisplayString(unref(i18n$2).baseText("aiAssistant.builder.executeMessage.description")), 3), createBaseVNode("div", { class: normalizeClass(_ctx.$style.issuesBox) }, [createVNode(TransitionGroup, {
name: "fade",
tag: "ul",
class: normalizeClass(_ctx.$style.issuesList),
role: "list",
"aria-label": "Workflow validation issues"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(builderStore).workflowTodos, (issue) => {
return openBlock(), createBlock(NodeIssueItem_default, {
key: `${formatIssueMessage(issue.value)}_${issue.node}`,
issue,
"get-node-type": getNodeTypeByName,
"format-issue-message": formatIssueMessage,
onClick: () => trackBuilderPlaceholders(issue)
}, null, 8, ["issue", "onClick"]);
}), 128))]),
_: 1
}, 8, ["class"])], 2)], 64)) : triggerNodes.value.length > 0 ? (openBlock(), createElementBlock("p", {
key: 1,
class: normalizeClass(_ctx.$style.noIssuesMessage)
}, toDisplayString(unref(i18n$2).baseText("aiAssistant.builder.executeMessage.noIssues")), 3)) : createCommentVNode("", true), triggerNodes.value.length > 0 ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 2,
disabled: !hasValidationIssues.value,
content: executeButtonTooltip.value,
placement: "left"
}, {
default: withCtx(() => [createVNode(CanvasRunWorkflowButton_default, {
class: normalizeClass(_ctx.$style.runButton),
disabled: hasValidationIssues.value || unref(builderStore).hasNoCreditsRemaining,
"waiting-for-webhook": isExecutionWaitingForWebhook.value,
"hide-tooltip": true,
label: unref(i18n$2).baseText("aiAssistant.builder.executeMessage.execute"),
executing: isWorkflowRunning.value,
"include-chat-trigger": true,
size: "medium",
"trigger-nodes": availableTriggerNodes.value,
"get-node-type": unref(nodeTypesStore).getNodeType,
"selected-trigger-node-name": unref(workflowsStore).selectedTriggerNodeName,
onExecute,
onSelectTriggerNode: unref(workflowsStore).setSelectedTriggerNodeName
}, null, 8, [
"class",
"disabled",
"waiting-for-webhook",
"label",
"executing",
"trigger-nodes",
"get-node-type",
"selected-trigger-node-name",
"onSelectTriggerNode"
])]),
_: 1
}, 8, ["disabled", "content"])) : createCommentVNode("", true)], 2);
};
}
});
var ExecuteMessage_vue_vue_type_style_index_1_lang_module_default = {
container: "_container_kks7w_123",
description: "_description_kks7w_132",
noIssuesMessage: "_noIssuesMessage_kks7w_138",
issuesBox: "_issuesBox_kks7w_143",
issuesList: "_issuesList_kks7w_150",
runButton: "_runButton_kks7w_159"
};
var ExecuteMessage_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ExecuteMessage_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ExecuteMessage_vue_vue_type_style_index_1_lang_module_default }], ["__scopeId", "data-v-9512586c"]]);
const WORKFLOW_SUGGESTIONS = [
{
id: "multi-agent-research",
summary: "Multi-agent research workflow",
prompt: "Create a multi-agent AI workflow using `gpt-4.1-mini` where several agents work together to research a topic, fact-check the findings, and write a report that's sent as an HTML email. One agent should gather recent, credible information about the topic. Another agent should verify the facts and only mark something as \"verified\" if it appears in at least two independent sources. A third agent should combine the verified information into a clear, well-written report under 1,000 words. A final agent should edit and format the report to make it look clean and professional in the body of the email. Use Gmail to send the report."
},
{
id: "email-summary",
summary: "Summarize emails with AI",
prompt: "Create an automation that runs on Monday mornings. It reads my Gmail inbox from the weekend, analyzes them with `gpt-4.1-mini` to find action items and priorities, and emails me a structured email using Gmail."
},
{
id: "ai-news-digest",
summary: "Daily AI news digest",
prompt: "Build an automation that runs every night 8pm. Use the NewsAPI \"/everything\" endpoint to search for AI-related news from the day. Pick the top 5 articles and use OpenAI `gpt-4.1-mini` to summarize each in two sentences. Generate an image using OpenAI based on the top article's summary. Send a structured Telegram message."
},
{
id: "daily-weather-report",
summary: "Daily weather report",
prompt: "Create an automation that checks the weather for my location every morning at 5 a.m using OpenWeather. Send me a short weather report by email using Gmail. Use OpenAI `gpt-4.1-mini` to write a short, fun formatted email body by adding personality when describing the weather and how the day might feel. Include all details relevant to decide on my plans and clothes for the day."
},
{
id: "invoice-pipeline",
summary: "Invoice processing pipeline",
prompt: "Create an invoice processing workflow using an n8n Form. When a user submits an invoice file (PDF or image) with their email address, use OpenAI `gpt-4.1-mini` to extract invoice data. Then, validate the date format is correct, the currency is valid, and the total amount is greater than zero. If validation fails, email the user a clear error message that explains which check failed from my Gmail. If the data passes validation, store the structured result in a datatable plus email the user. Every Monday morning, generate a weekly spending report using `gpt-4.1-mini` based on stored invoices and send a clean email using Gmail."
},
{
id: "rag-assistant",
summary: "RAG knowledge assistant",
prompt: "Build an automation that creates a document-to-chat RAG pipeline. The workflow starts with an n8n Form where a user uploads one or more files (PDF, CSV, or JSON). Each upload should trigger a process that reads the file, splits it into chunks, and generates embeddings using OpenAI `gpt-4.1-mini` model, saved in one Pinecone table. Add a second part of the workflow for querying: use a Chat Message Trigger to act as a chatbot interface. When a user sends a question, retrieve the top 5 most relevant chunks from Pinecone, pass them into `gpt-4.1-mini` as context, and have it answer naturally using only the retrieved information. If a question can't be answered confidently, the bot should respond with: \"I couldn't find that in the uploaded documents.\" Log each chat interaction in a Data Table with the user query, matched file(s), and timestamp. Send a daily summary email through Gmail showing total questions asked, top files referenced, and any failed lookups."
},
{
id: "lead-qualification",
summary: "Lead qualification and call scheduling",
prompt: "Create an n8n form with a lead generation form I can embed on my website homepage. Build an automation that processes form submissions, uses AI to qualify the lead, sends data to an n8n data table. For high-score leads, it should also email them to offer to schedule a 15-min call in a free slot in my calendar."
},
{
id: "youtube-auto-chapters",
summary: "YouTube video chapters",
prompt: "Build an n8n workflow that automatically generates YouTube chapter timestamps from video captions. Use the n8n chat trigger for me to enter the URL of the YouTube video. Use the YouTube Get a video node to get the video title, description, and existing metadata. Use the YouTube Captions API to download the transcript for the given video ID. Send the transcript to AI agent using Anthropic's Claude model. Prompt the model to identify topic shifts and return structured output in timestamp - chapter format. Append the generated chapter list to the existing video description. Use the YouTube Update a video node to update the video description. Respond back with the updates using the respond to chat node."
}
];
var require__baseRandom = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var nativeFloor = Math.floor, nativeRandom = Math.random;
function baseRandom$1(lower, upper) {
return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
}
module.exports = baseRandom$1;
}));
var require__shuffleSelf = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var baseRandom = require__baseRandom();
function shuffleSelf$2(array, size) {
var index = -1, length = array.length, lastIndex = length - 1;
size = size === void 0 ? length : size;
while (++index < size) {
var rand = baseRandom(index, lastIndex), value = array[rand];
array[rand] = array[index];
array[index] = value;
}
array.length = size;
return array;
}
module.exports = shuffleSelf$2;
}));
var require__arrayShuffle = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var copyArray = require__copyArray(), shuffleSelf$1 = require__shuffleSelf();
function arrayShuffle$1(array) {
return shuffleSelf$1(copyArray(array));
}
module.exports = arrayShuffle$1;
}));
var require__baseValues = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var arrayMap = require__arrayMap();
function baseValues$1(object, props) {
return arrayMap(props, function(key) {
return object[key];
});
}
module.exports = baseValues$1;
}));
var require_values = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var baseValues = require__baseValues(), keys = require_keys();
function values$1(object) {
return object == null ? [] : baseValues(object, keys(object));
}
module.exports = values$1;
}));
var require__baseShuffle = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var shuffleSelf = require__shuffleSelf(), values = require_values();
function baseShuffle$1(collection) {
return shuffleSelf(values(collection));
}
module.exports = baseShuffle$1;
}));
var import_shuffle = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
var arrayShuffle = require__arrayShuffle(), baseShuffle = require__baseShuffle(), isArray$1 = require_isArray();
function shuffle$1(collection) {
return (isArray$1(collection) ? arrayShuffle : baseShuffle)(collection);
}
module.exports = shuffle$1;
})))());
var AskAssistantBuild_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "AskAssistantBuild",
emits: ["close"],
setup(__props, { expose: __expose, emit: __emit }) {
const emit = __emit;
const builderStore = useBuilderStore();
const usersStore = useUsersStore();
const workflowHistoryStore = useWorkflowHistoryStore();
const telemetry$1 = useTelemetry();
const workflowsStore = useWorkflowsStore();
const router = useRouter();
const i18n$2 = useI18n();
const route = useRoute();
const workflowSaver = useWorkflowSaving({ router });
const { goToUpgrade } = usePageRedirectionHelper();
const toast = useToast();
const processedWorkflowUpdates = ref(/* @__PURE__ */ new Set());
const shouldTidyUp = ref(false);
const n8nChatRef = ref();
const user$1 = computed(() => ({
firstName: usersStore.currentUser?.firstName ?? "",
lastName: usersStore.currentUser?.lastName ?? ""
}));
const loadingMessage = computed(() => {
if (builderStore.getRunningTools(builderStore.chatMessages).length > 0) return;
return builderStore.builderThinkingMessage;
});
const currentRoute = computed(() => route.name);
const showExecuteMessage = computed(() => {
const builderUpdatedWorkflowMessageIndex = builderStore.chatMessages.findLastIndex((msg) => msg.type === "workflow-updated" || msg.type === "tool" && msg.toolName === "update_node_parameters");
const messagesAfterUpdate = builderStore.chatMessages.slice(builderUpdatedWorkflowMessageIndex + 1);
const hasErrorAfterUpdate = messagesAfterUpdate.some((msg) => msg.type === "error");
const hasTaskAbortedAfterUpdate = messagesAfterUpdate.some((msg) => isTaskAbortedMessage(msg));
return !builderStore.streaming && workflowsStore.workflow.nodes.length > 0 && builderUpdatedWorkflowMessageIndex > -1 && !hasErrorAfterUpdate && !hasTaskAbortedAfterUpdate;
});
const creditsQuota = computed(() => builderStore.creditsQuota);
const creditsRemaining = computed(() => builderStore.creditsRemaining);
const showAskOwnerTooltip = computed(() => !usersStore.isInstanceOwner);
const workflowSuggestions = computed(() => {
return builderStore.hasMessages ? void 0 : (0, import_shuffle.default)(WORKFLOW_SUGGESTIONS);
});
async function onUserMessage(content$12) {
shouldTidyUp.value = false;
const isInitialGeneration = workflowsStore.workflow.nodes.length === 0;
await builderStore.sendChatMessage({
text: content$12,
initialGeneration: isInitialGeneration
});
}
function onNewWorkflow() {
builderStore.resetBuilderChat();
processedWorkflowUpdates.value.clear();
shouldTidyUp.value = false;
}
function onFeedback(feedback$1) {
if (feedback$1.rating) telemetry$1.track("User rated workflow generation", {
helpful: feedback$1.rating === "up",
workflow_id: workflowsStore.workflowId,
session_id: builderStore.trackingSessionId
});
if (feedback$1.feedback) telemetry$1.track("User submitted workflow generation feedback", {
feedback: feedback$1.feedback,
workflow_id: workflowsStore.workflowId,
session_id: builderStore.trackingSessionId
});
}
async function onWorkflowExecuted() {
const executionData = workflowsStore.workflowExecutionData;
const executionStatus = executionData?.status ?? "unknown";
const errorNodeName = executionData?.data?.resultData.lastNodeExecuted;
const errorNodeType = errorNodeName ? workflowsStore.workflow.nodes.find((node) => node.name === errorNodeName)?.type : void 0;
if (!executionData) {
await builderStore.sendChatMessage({
text: i18n$2.baseText("aiAssistant.builder.executeMessage.noExecutionData"),
type: "execution",
executionStatus: "error",
errorMessage: "Workflow execution data missing after run attempt."
});
return;
}
if (executionStatus === "success") {
await builderStore.sendChatMessage({
text: i18n$2.baseText("aiAssistant.builder.executeMessage.executionSuccess"),
type: "execution",
executionStatus
});
return;
}
const executionError = executionData.data?.resultData.error?.message ?? "Unknown error";
const scopedErrorMessage = errorNodeName ? i18n$2.baseText("aiAssistant.builder.executeMessage.executionFailedOnNode", { interpolate: {
nodeName: errorNodeName,
errorMessage: executionError
} }) : i18n$2.baseText("aiAssistant.builder.executeMessage.executionFailed", { interpolate: { errorMessage: executionError } });
const failureStatus = executionStatus === "unknown" ? "error" : executionStatus;
await builderStore.sendChatMessage({
text: scopedErrorMessage,
type: "execution",
errorMessage: executionError,
errorNodeType,
executionStatus: failureStatus
});
}
watch(() => builderStore.workflowMessages, (messages) => {
messages.filter((msg) => {
return msg.id && !processedWorkflowUpdates.value.has(msg.id);
}).forEach((msg) => {
if (msg.id && isWorkflowUpdatedMessage(msg)) {
processedWorkflowUpdates.value.add(msg.id);
const result = builderStore.applyWorkflowUpdate(msg.codeSnippet);
if (result.success) {
const hasNewNodes = Boolean(result.newNodeIds && result.newNodeIds.length > 0);
shouldTidyUp.value = shouldTidyUp.value || hasNewNodes;
nodeViewEventBus.emit("importWorkflowData", {
data: result.workflowData,
tidyUp: shouldTidyUp.value,
nodesIdsToTidyUp: result.newNodeIds,
regenerateIds: false,
trackEvents: false
});
}
}
});
}, { deep: true });
watch(() => builderStore.streaming, async (isStreaming, wasStreaming) => {
if (!wasStreaming || isStreaming) return;
const lastMessage = builderStore.chatMessages[builderStore.chatMessages.length - 1];
const successful = lastMessage && lastMessage.type !== "error" && !isTaskAbortedMessage(lastMessage);
if (builderStore.initialGeneration && workflowsStore.workflow.nodes.length > 0) {
builderStore.initialGeneration = false;
if (successful) await workflowSaver.saveCurrentWorkflow();
}
});
async function onRestoreConfirm(versionId, messageId) {
try {
const updatedWorkflow = await builderStore.restoreToVersion(versionId, messageId);
if (!updatedWorkflow) return;
builderStore.clearExistingWorkflow();
nodeViewEventBus.emit("importWorkflowData", {
data: updatedWorkflow,
tidyUp: false,
regenerateIds: false,
trackEvents: false,
setStateDirty: false
});
} catch (e) {
toast.showMessage({
type: "error",
title: i18n$2.baseText("aiAssistant.builder.restoreError.title"),
message: e instanceof Error ? e.message : "Unknown error"
});
}
}
function onShowVersion(versionId) {
const route$1 = router.resolve({
name: VIEWS.WORKFLOW_HISTORY,
params: {
workflowId: workflowsStore.workflowId,
versionId
}
});
window.open(route$1.href, "_blank");
}
watch(currentRoute, () => {
if (!builderStore.streaming) onNewWorkflow();
});
__expose({ focusInput: () => {
n8nChatRef.value?.focusInput();
} });
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
"data-test-id": "ask-assistant-chat",
tabindex: "0",
class: normalizeClass(_ctx.$style.container),
onKeydown: _cache[2] || (_cache[2] = withModifiers(() => {}, ["stop"]))
}, [createVNode(unref(AskAssistantChat_default$1), {
ref_key: "n8nChatRef",
ref: n8nChatRef,
user: user$1.value,
messages: unref(builderStore).chatMessages,
streaming: unref(builderStore).streaming,
"loading-message": loadingMessage.value,
mode: unref(i18n$2).baseText("aiAssistant.builder.mode"),
"show-stop": true,
"scroll-on-new-message": true,
"credits-quota": creditsQuota.value,
"credits-remaining": creditsRemaining.value,
"show-ask-owner-tooltip": showAskOwnerTooltip.value,
suggestions: workflowSuggestions.value,
"input-placeholder": unref(i18n$2).baseText("aiAssistant.builder.assistantPlaceholder"),
"workflow-id": unref(workflowsStore).workflowId,
"prune-time-hours": unref(workflowHistoryStore).evaluatedPruneTime,
onClose: _cache[0] || (_cache[0] = ($event) => emit("close")),
onMessage: onUserMessage,
onUpgradeClick: _cache[1] || (_cache[1] = () => unref(goToUpgrade)("ai-builder-sidebar", "upgrade-builder")),
onFeedback,
onStop: unref(builderStore).abortStreaming,
onRestoreConfirm,
onShowVersion
}, {
header: withCtx(() => [renderSlot(_ctx.$slots, "header")]),
messagesFooter: withCtx(() => [showExecuteMessage.value ? (openBlock(), createBlock(ExecuteMessage_default, {
key: 0,
onWorkflowExecuted
})) : createCommentVNode("", true)]),
placeholder: withCtx(() => [createVNode(unref(N8nText_default), { class: normalizeClass(_ctx.$style.topText) }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("aiAssistant.builder.assistantPlaceholder")), 1)]),
_: 1
}, 8, ["class"])]),
_: 3
}, 8, [
"user",
"messages",
"streaming",
"loading-message",
"mode",
"credits-quota",
"credits-remaining",
"show-ask-owner-tooltip",
"suggestions",
"input-placeholder",
"workflow-id",
"prune-time-hours",
"onStop"
])], 34);
};
}
});
var AskAssistantBuild_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_e79xa_123",
topText: "_topText_e79xa_128",
newWorkflowButtonWrapper: "_newWorkflowButtonWrapper_e79xa_132",
newWorkflowText: "_newWorkflowText_e79xa_142"
};
var AskAssistantBuild_default = /* @__PURE__ */ __plugin_vue_export_helper_default(AskAssistantBuild_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": AskAssistantBuild_vue_vue_type_style_index_0_lang_module_default }]]);
var AskAssistantChat_default = /* @__PURE__ */ __plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
__name: "AskAssistantChat",
emits: ["close"],
setup(__props, { expose: __expose, emit: __emit }) {
const emit = __emit;
const assistantStore = useAssistantStore();
const workflowState = injectWorkflowState();
const usersStore = useUsersStore();
const telemetry$1 = useTelemetry();
const n8nChatRef = ref();
const user$1 = computed(() => ({
firstName: usersStore.currentUser?.firstName ?? "",
lastName: usersStore.currentUser?.lastName ?? ""
}));
const loadingMessage = computed(() => assistantStore.assistantThinkingMessage);
async function onUserMessage(content$12, quickReplyType, isFeedback = false) {
if (!assistantStore.currentSessionId) await assistantStore.initSupportChat(content$12);
else await assistantStore.sendMessage({
text: content$12,
quickReplyType
});
const task = assistantStore.chatSessionTask;
const solutionCount = assistantStore.chatMessages.filter((msg) => msg.role === "assistant" && !["text", "event"].includes(msg.type)).length;
if (isFeedback) telemetry$1.track("User gave feedback", {
task,
chat_session_id: assistantStore.currentSessionId,
is_quick_reply: !!quickReplyType,
is_positive: quickReplyType === "all-good",
solution_count: solutionCount,
response: content$12
});
}
async function onCodeReplace(index) {
await assistantStore.applyCodeDiff(workflowState, index);
telemetry$1.track("User clicked solution card action", { action: "replace_code" });
}
async function undoCodeDiff(index) {
await assistantStore.undoCodeDiff(workflowState, index);
telemetry$1.track("User clicked solution card action", { action: "undo_code_replace" });
}
__expose({ focusInput: () => {
n8nChatRef.value?.focusInput();
} });
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
"data-test-id": "ask-assistant-chat",
tabindex: "0",
class: "wrapper",
onKeydown: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
}, [createVNode(unref(AskAssistantChat_default$1), {
ref_key: "n8nChatRef",
ref: n8nChatRef,
user: user$1.value,
messages: unref(assistantStore).chatMessages,
streaming: unref(assistantStore).streaming,
"loading-message": loadingMessage.value,
"session-id": unref(assistantStore).currentSessionId,
onClose: _cache[0] || (_cache[0] = ($event) => emit("close")),
onMessage: onUserMessage,
onCodeReplace,
onCodeUndo: undoCodeDiff
}, {
header: withCtx(() => [renderSlot(_ctx.$slots, "header", {}, void 0, true)]),
_: 3
}, 8, [
"user",
"messages",
"streaming",
"loading-message",
"session-id"
])], 32);
};
}
}), [["__scopeId", "data-v-ace8d134"]]);
var HubSwitcher_default = /* @__PURE__ */ defineComponent({
__name: "HubSwitcher",
props: { isBuildMode: { type: Boolean } },
emits: ["toggle"],
setup(__props, { emit: __emit }) {
const emit = __emit;
const i18n$2 = useI18n();
const options = computed(() => [{
label: i18n$2.baseText("aiAssistant.tabs.ask"),
value: false
}, {
label: i18n$2.baseText("aiAssistant.tabs.build"),
value: true
}]);
function toggle(value) {
emit("toggle", value);
}
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(N8nRadioButtons_default), {
size: "small",
"model-value": _ctx.isBuildMode,
options: options.value,
"onUpdate:modelValue": toggle
}, null, 8, ["model-value", "options"]);
};
}
});
var AssistantsHub_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "AssistantsHub",
setup(__props) {
const builderStore = useBuilderStore();
const assistantStore = useAssistantStore();
const chatPanelStore = useChatPanelStore();
const settingsStore = useSettingsStore();
const route = useRoute();
const askAssistantBuildRef = ref();
const askAssistantChatRef = ref();
const isBuildMode = computed(() => chatPanelStore.isBuilderModeActive);
const chatWidth = computed(() => chatPanelStore.width);
const canToggleModes = computed(() => {
const currentRoute = route?.name;
return settingsStore.isAiAssistantEnabled && builderStore.isAIBuilderEnabled && currentRoute && BUILDER_ENABLED_VIEWS.includes(currentRoute);
});
function onResize(data) {
chatPanelStore.updateWidth(data.width);
}
function onResizeDebounced(data) {
useDebounce().callDebounced(onResize, {
debounceTime: 10,
trailing: true
}, data);
}
async function toggleAssistantMode() {
const wasOpen = chatPanelStore.isOpen;
const switchingToBuild = !isBuildMode.value;
const newMode = switchingToBuild ? "builder" : "assistant";
if (wasOpen) {
if (switchingToBuild) {
if (builderStore.chatMessages.length === 0) {
await builderStore.fetchBuilderCredits();
await builderStore.loadSessions();
}
}
chatPanelStore.switchMode(newMode);
} else if (switchingToBuild) await chatPanelStore.open({ mode: "builder" });
else await chatPanelStore.open({ mode: "assistant" });
}
function onClose() {
chatPanelStore.close();
}
function onSlideEnterComplete() {
if (isBuildMode.value) askAssistantBuildRef.value?.focusInput();
else askAssistantChatRef.value?.focusInput();
}
const unsubscribeAssistantStore = assistantStore.$onAction(({ name: name$2 }) => {
if (["initErrorHelper", "initCredHelp"].includes(name$2)) chatPanelStore.switchMode("assistant");
});
const unsubscribeBuilderStore = builderStore.$onAction(({ name: name$2 }) => {
if (["sendChatMessage"].includes(name$2)) chatPanelStore.switchMode("builder");
});
onMounted(() => {
if (!canToggleModes.value) {
if (builderStore.isAIBuilderEnabled) chatPanelStore.switchMode("builder");
else if (settingsStore.isAiAssistantEnabled) chatPanelStore.switchMode("assistant");
}
});
onBeforeUnmount(() => {
unsubscribeAssistantStore();
unsubscribeBuilderStore();
});
return (_ctx, _cache) => {
return openBlock(), createBlock(SlideTransition_default, { onAfterEnter: onSlideEnterComplete }, {
default: withCtx(() => [withDirectives(createVNode(unref(N8nResizeWrapper_default), {
"supported-directions": ["left"],
width: chatWidth.value,
"min-width": unref(chatPanelStore).MIN_CHAT_WIDTH,
"max-width": unref(chatPanelStore).MAX_CHAT_WIDTH,
class: normalizeClass(_ctx.$style.resizeWrapper),
"data-test-id": "ask-assistant-sidebar",
onResize: onResizeDebounced
}, {
default: withCtx(() => [createBaseVNode("div", {
style: normalizeStyle({ width: `${chatWidth.value}px` }),
class: normalizeClass(_ctx.$style.wrapper)
}, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.assistantContent) }, [isBuildMode.value ? (openBlock(), createBlock(AskAssistantBuild_default, {
key: 0,
ref_key: "askAssistantBuildRef",
ref: askAssistantBuildRef,
onClose
}, createSlots({ _: 2 }, [canToggleModes.value ? {
name: "header",
fn: withCtx(() => [createVNode(HubSwitcher_default, {
"is-build-mode": isBuildMode.value,
onToggle: toggleAssistantMode
}, null, 8, ["is-build-mode"])]),
key: "0"
} : void 0]), 1536)) : (openBlock(), createBlock(AskAssistantChat_default, {
key: 1,
ref_key: "askAssistantChatRef",
ref: askAssistantChatRef,
onClose
}, createSlots({ _: 2 }, [canToggleModes.value ? {
name: "header",
fn: withCtx(() => [createVNode(HubSwitcher_default, {
"is-build-mode": isBuildMode.value,
onToggle: toggleAssistantMode
}, null, 8, ["is-build-mode"])]),
key: "0"
} : void 0]), 1536))], 2)], 6)]),
_: 1
}, 8, [
"width",
"min-width",
"max-width",
"class"
]), [[vShow, unref(chatPanelStore).isOpen]])]),
_: 1
});
};
}
});
var AssistantsHub_vue_vue_type_style_index_0_lang_module_default = {
resizeWrapper: "_resizeWrapper_1ffdf_123",
wrapper: "_wrapper_1ffdf_127",
assistantContent: "_assistantContent_1ffdf_133"
};
var AssistantsHub_default = /* @__PURE__ */ __plugin_vue_export_helper_default(AssistantsHub_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": AssistantsHub_vue_vue_type_style_index_0_lang_module_default }]]);
var AskAssistantFloatingButton_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "AskAssistantFloatingButton",
setup(__props) {
const assistantStore = useAssistantStore();
const builderStore = useBuilderStore();
const chatPanelStore = useChatPanelStore();
const i18n$2 = useI18n();
const { APP_Z_INDEXES } = useStyles();
const lastUnread = computed(() => {
const msg = assistantStore.lastUnread;
if (msg?.type === "block") return msg.title;
if (msg?.type === "text") return msg.content;
if (msg?.type === "code-diff") return msg.description;
return "";
});
const onClick = async () => {
if (builderStore.isAIBuilderEnabled) if (chatPanelStore.isOpen && chatPanelStore.isBuilderModeActive) chatPanelStore.close();
else await chatPanelStore.open({ mode: "builder" });
else await chatPanelStore.toggle({ mode: "assistant" });
if (chatPanelStore.isOpen) assistantStore.trackUserOpenedAssistant({
source: "canvas",
task: "placeholder",
has_existing_session: !assistantStore.isSessionEnded
});
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.container),
"data-test-id": "ask-assistant-floating-button"
}, [createVNode(unref(N8nTooltip_default), {
"z-index": unref(APP_Z_INDEXES).ASK_ASSISTANT_FLOATING_BUTTON_TOOLTIP,
placement: "top",
visible: !!lastUnread.value,
"popper-class": _ctx.$style.tooltip
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.text) }, toDisplayString(lastUnread.value), 3), createBaseVNode("div", { class: normalizeClass(_ctx.$style.assistant) }, [createVNode(unref(AskAssistantAvatar_default), { size: "mini" }), createBaseVNode("span", null, toDisplayString(unref(i18n$2).baseText("aiAssistant.name")), 1)], 2)]),
default: withCtx(() => [createVNode(unref(AskAssistantButton_default), {
"unread-count": unref(assistantStore).unreadCount,
onClick
}, null, 8, ["unread-count"])]),
_: 1
}, 8, [
"z-index",
"visible",
"popper-class"
])], 2);
};
}
});
var AskAssistantFloatingButton_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_1tr4s_123",
tooltip: "_tooltip_1tr4s_130",
assistant: "_assistant_1tr4s_136",
text: "_text_1tr4s_146"
};
var AskAssistantFloatingButton_default = /* @__PURE__ */ __plugin_vue_export_helper_default(AskAssistantFloatingButton_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": AskAssistantFloatingButton_vue_vue_type_style_index_0_lang_module_default }]]);
var NonProductionLicenseBanner_default = /* @__PURE__ */ defineComponent({
__name: "NonProductionLicenseBanner",
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createBlock(BaseBanner_default, {
name: "NON_PRODUCTION_LICENSE",
dismissible: false
}, {
mainContent: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n$1).baseText("banners.nonProductionLicense.message")), 1)]),
_: 1
});
};
}
});
var TrialOverBanner_default = /* @__PURE__ */ defineComponent({
__name: "TrialOverBanner",
setup(__props) {
const pageRedirectionHelper = usePageRedirectionHelper();
function onUpgradePlanClick() {
pageRedirectionHelper.goToUpgrade("canvas-nav", "upgrade-canvas-nav", "redirect");
}
return (_ctx, _cache) => {
return openBlock(), createBlock(BaseBanner_default, {
"custom-icon": "info",
theme: "warning",
name: "TRIAL_OVER"
}, {
mainContent: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n$1).baseText("banners.trialOver.message")), 1)]),
trailingContent: withCtx(() => [createVNode(unref(N8nButton_default), {
type: "success",
icon: "zap",
size: "small",
onClick: onUpgradePlanClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$1).baseText("generic.upgradeNow")), 1)]),
_: 1
})]),
_: 1
});
};
}
});
var _hoisted_1$38 = ["value", "max"];
var PROGRESS_BAR_MINIMUM_THRESHOLD = 8;
var TrialBanner_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "TrialBanner",
setup(__props) {
const cloudPlanStore = useCloudPlanStore();
const pageRedirectionHelper = usePageRedirectionHelper();
const shouldShowTrialBanner = computed(() => cloudPlanStore.shouldShowDynamicTrialBanner);
const trialBannerText = computed(() => cloudPlanStore.dynamicTrialBannerText);
const trialDaysLeft = computed(() => -1 * cloudPlanStore.trialDaysLeft);
const messageText = computed(() => {
return i18n$1.baseText("banners.trial.message", {
adjustToNumber: trialDaysLeft.value,
interpolate: { count: String(trialDaysLeft.value) }
});
});
const cloudPlanData = computed(() => {
const planData = cloudPlanStore.currentPlanData;
const usage = cloudPlanStore.currentUsageData;
if (!planData || !usage) return null;
return {
...planData,
usage
};
});
const trialHasExecutionsLeft = computed(() => {
if (!cloudPlanData.value?.usage) return 0;
return cloudPlanData.value.usage.executions < cloudPlanData.value.monthlyExecutionsLimit;
});
const currentExecutionsWithThreshold = computed(() => {
if (!cloudPlanData.value?.usage) return 0;
const usedExecutions = cloudPlanData.value.usage.executions;
const threshold = PROGRESS_BAR_MINIMUM_THRESHOLD * cloudPlanData.value.monthlyExecutionsLimit / 100;
return usedExecutions < threshold ? threshold : usedExecutions;
});
const maxExecutions = computed(() => {
if (!cloudPlanData.value?.monthlyExecutionsLimit) return 0;
return cloudPlanData.value.monthlyExecutionsLimit;
});
const currentExecutions = computed(() => {
if (!cloudPlanData.value?.usage) return 0;
const usedExecutions = cloudPlanData.value.usage.executions;
const executionsQuota = cloudPlanData.value.monthlyExecutionsLimit;
return usedExecutions > executionsQuota ? executionsQuota : usedExecutions;
});
function onUpdatePlanClick() {
if (shouldShowTrialBanner.value) cloudPlanStore.dismissDynamicTrialBanner();
pageRedirectionHelper.goToUpgrade("canvas-nav", "upgrade-canvas-nav", "redirect");
}
return (_ctx, _cache) => {
return openBlock(), createBlock(BaseBanner_default, {
name: "TRIAL",
theme: "custom"
}, {
mainContent: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [
createBaseVNode("span", null, toDisplayString(messageText.value), 1),
createBaseVNode("span", { class: normalizeClass(_ctx.$style.pipe) }, " | ", 2),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.usageCounter) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.progressBarDiv) }, [createBaseVNode("progress", {
class: normalizeClass([trialHasExecutionsLeft.value ? _ctx.$style.progressBarSuccess : _ctx.$style.progressBarDanger, _ctx.$style.progressBar]),
value: currentExecutionsWithThreshold.value,
max: maxExecutions.value
}, null, 10, _hoisted_1$38)], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.executionsCountSection) }, [
createVNode(unref(N8nText_default), {
size: "xsmall",
color: trialHasExecutionsLeft.value ? "text-dark" : "danger"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(currentExecutions.value) + "/" + toDisplayString(maxExecutions.value), 1)]),
_: 1
}, 8, ["color"]),
_cache[0] || (_cache[0] = createTextVNode("\xA0")),
createVNode(unref(N8nText_default), {
size: "xsmall",
color: trialHasExecutionsLeft.value ? "text-dark" : "danger"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$1).baseText("executionUsage.label.executions")), 1)]),
_: 1
}, 8, ["color"])
], 2)], 2)
], 2)]),
trailingContent: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.trailingContentWrapper) }, [shouldShowTrialBanner.value ? (openBlock(), createBlock(unref(N8nBadge_default), {
key: 0,
class: normalizeClass(_ctx.$style.dynamicBanner),
size: "small",
"show-border": false,
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(trialBannerText.value), 1)]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true), createVNode(unref(N8nButton_default), {
type: "success",
icon: "zap",
size: "small",
onClick: onUpdatePlanClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$1).baseText("generic.upgradeNow")), 1)]),
_: 1
})], 2)]),
_: 1
});
};
}
});
var TrialBanner_vue_vue_type_style_index_0_lang_module_default = {
content: "_content_14odr_123",
pipe: "_pipe_14odr_129",
progressBarDiv: "_progressBarDiv_14odr_135",
progressBar: "_progressBar_14odr_135",
progressBarSuccess: "_progressBarSuccess_14odr_164",
progressBarDanger: "_progressBarDanger_14odr_174",
usageText: "_usageText_14odr_183",
usageCounter: "_usageCounter_14odr_190",
danger: "_danger_14odr_198",
executionsCountSection: "_executionsCountSection_14odr_202",
trailingContentWrapper: "_trailingContentWrapper_14odr_206",
dynamicBanner: "_dynamicBanner_14odr_212"
};
var TrialBanner_default = /* @__PURE__ */ __plugin_vue_export_helper_default(TrialBanner_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": TrialBanner_vue_vue_type_style_index_0_lang_module_default }]]);
var V1Banner_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "V1Banner",
setup(__props) {
const bannersStore = useBannersStore();
async function dismissPermanently() {
await bannersStore.dismissBanner("V1", "permanent");
}
const hasOwnerPermission = computed(() => hasPermission(["instanceOwner"]));
return (_ctx, _cache) => {
const _directive_n8n_html = resolveDirective("n8n-html");
return openBlock(), createBlock(BaseBanner_default, {
"custom-icon": "info",
theme: "warning",
name: "V1",
class: normalizeClass(_ctx.$style.v1container)
}, {
mainContent: withCtx(() => [withDirectives(createBaseVNode("span", null, null, 512), [[_directive_n8n_html, unref(i18n$1).baseText("banners.v1.message")]]), hasOwnerPermission.value ? (openBlock(), createElementBlock("a", {
key: 0,
class: normalizeClass(_ctx.$style.link),
"data-test-id": "banner-confirm-v1",
onClick: dismissPermanently
}, [withDirectives(createBaseVNode("span", null, null, 512), [[_directive_n8n_html, unref(i18n$1).baseText("generic.dontShowAgain")]])], 2)) : createCommentVNode("", true)]),
_: 1
}, 8, ["class"]);
};
}
});
var V1Banner_vue_vue_type_style_index_0_lang_module_default = {
v1container: "_v1container_7dvqv_123",
link: "_link_7dvqv_124"
};
var V1Banner_default = /* @__PURE__ */ __plugin_vue_export_helper_default(V1Banner_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": V1Banner_vue_vue_type_style_index_0_lang_module_default }]]);
var EmailConfirmationBanner_default = /* @__PURE__ */ defineComponent({
__name: "EmailConfirmationBanner",
setup(__props) {
const toast = useToast();
const cloudPlanStore = useCloudPlanStore();
const userEmail = computed(() => {
return cloudPlanStore.currentUserCloudInfo?.email ?? "";
});
async function onConfirmEmailClick() {
try {
await useUsersStore().sendConfirmationEmail();
toast.showMessage({
type: "success",
title: i18n$1.baseText("banners.confirmEmail.toast.success.heading"),
message: i18n$1.baseText("banners.confirmEmail.toast.success.message")
});
} catch (error$2) {
toast.showMessage({
type: "error",
title: i18n$1.baseText("banners.confirmEmail.toast.error.heading"),
message: error$2.message
});
}
}
return (_ctx, _cache) => {
const _component_RouterLink = resolveComponent("RouterLink");
return openBlock(), createBlock(BaseBanner_default, {
name: "EMAIL_CONFIRMATION",
theme: "warning"
}, {
mainContent: withCtx(() => [createBaseVNode("span", null, [
createTextVNode(toDisplayString(unref(i18n$1).baseText("banners.confirmEmail.message.1")) + " ", 1),
createVNode(_component_RouterLink, { to: "/settings/personal" }, {
default: withCtx(() => [createTextVNode(toDisplayString(userEmail.value), 1)]),
_: 1
}),
createTextVNode(" " + toDisplayString(unref(i18n$1).baseText("banners.confirmEmail.message.2")), 1)
])]),
trailingContent: withCtx(() => [createVNode(unref(N8nButton_default), {
type: "success",
icon: "mail",
size: "small",
"data-test-id": "confirm-email-button",
onClick: onConfirmEmailClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$1).baseText("banners.confirmEmail.button")), 1)]),
_: 1
})]),
_: 1
});
};
}
});
var DataTableStorageLimitWarningBanner_default = /* @__PURE__ */ defineComponent({
__name: "DataTableStorageLimitWarningBanner",
setup(__props) {
const dataTableStore = useDataTableStore();
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createBlock(BaseBanner_default, {
name: "DATA_TABLE_STORAGE_LIMIT_WARNING",
dismissible: true,
theme: "warning"
}, {
mainContent: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n$2).baseText("dataTable.banner.storageLimitWarning.message", { interpolate: { usage: `${unref(dataTableStore).dataTableSize} / ${unref(dataTableStore).maxSizeMB}MB` } })), 1)]),
_: 1
});
};
}
});
var DataTableStorageLimitErrorBanner_default = /* @__PURE__ */ defineComponent({
__name: "DataTableStorageLimitErrorBanner",
setup(__props) {
const dataTableStore = useDataTableStore();
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createBlock(BaseBanner_default, {
name: "DATA_TABLE_STORAGE_LIMIT_ERROR",
dismissible: true,
theme: "danger"
}, {
mainContent: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n$2).baseText("dataTable.banner.storageLimitError.message", { interpolate: { usage: `${unref(dataTableStore).dataTableSize} / ${unref(dataTableStore).maxSizeMB}MB` } })), 1)]),
_: 1
});
};
}
});
var WorkflowAutoDeactivatedBanner_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowAutoDeactivatedBanner",
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createBlock(BaseBanner_default, {
name: "WORKFLOW_AUTO_DEACTIVATED",
theme: "warning",
"custom-icon": "info"
}, {
mainContent: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n$1).baseText("banners.workflowAutoDeactivated.message")), 1)]),
_: 1
});
};
}
});
var _hoisted_1$37 = { "data-test-id": "banner-stack" };
const N8N_BANNERS = {
V1: {
priority: 350,
component: V1Banner_default
},
WORKFLOW_AUTO_DEACTIVATED: {
priority: 340,
component: WorkflowAutoDeactivatedBanner_default
},
TRIAL_OVER: {
priority: 260,
component: TrialOverBanner_default
},
EMAIL_CONFIRMATION: {
priority: 250,
component: EmailConfirmationBanner_default
},
TRIAL: {
priority: 150,
component: TrialBanner_default
},
NON_PRODUCTION_LICENSE: {
priority: 140,
component: NonProductionLicenseBanner_default
},
DATA_TABLE_STORAGE_LIMIT_WARNING: {
priority: 300,
component: DataTableStorageLimitWarningBanner_default
},
DATA_TABLE_STORAGE_LIMIT_ERROR: {
priority: 400,
component: DataTableStorageLimitErrorBanner_default
}
};
var BannerStack_default = /* @__PURE__ */ defineComponent({
__name: "BannerStack",
setup(__props) {
const bannersStore = useBannersStore();
async function updateCurrentBannerHeight() {
const bannerHeight = await getBannerRowHeight();
bannersStore.updateBannersHeight(bannerHeight);
}
const getBannerForName = (bannerName) => {
return N8N_BANNERS[bannerName] || bannersStore.dynamicBannersMap[bannerName];
};
const removeUndefinedValues = (obj) => {
return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== void 0));
};
const currentlyShownBanner = computed(() => {
updateCurrentBannerHeight();
if (bannersStore.bannerStack.length === 0) return null;
let currentBanner = getBannerForName(bannersStore.bannerStack[0]);
let currentBannerName = bannersStore.bannerStack[0];
bannersStore.bannerStack.forEach((bannerName, index) => {
if (index === 0) return;
const bannerToCompare = getBannerForName(bannerName);
if (bannerToCompare.priority > currentBanner.priority) {
currentBanner = bannerToCompare;
currentBannerName = bannerName;
}
});
return {
component: currentBanner.component,
props: removeUndefinedValues({
name: currentBannerName,
content: currentBanner.content,
theme: currentBanner.theme,
isDismissible: currentBanner.isDismissible,
dismissPermanently: currentBanner.dismissPermanently
})
};
});
onMounted(async () => {
await updateCurrentBannerHeight();
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", _hoisted_1$37, [currentlyShownBanner.value ? (openBlock(), createBlock(resolveDynamicComponent(currentlyShownBanner.value.component), normalizeProps(mergeProps({ key: 0 }, currentlyShownBanner.value.props)), null, 16)) : createCommentVNode("", true)]);
};
}
});
var _hoisted_1$36 = { class: "action-buttons" };
var AboutModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "AboutModal",
setup(__props) {
const modalBus = createEventBus();
const toast = useToast();
const i18n$2 = useI18n();
const debugInfo = useDebugInfo();
const clipboard = useClipboard();
const rootStore = useRootStore();
const closeDialog = () => {
modalBus.emit("close");
};
const downloadThirdPartyLicenses = async () => {
try {
const thirdPartyLicenses = await getThirdPartyLicenses(rootStore.restApiContext);
const blob = new File([thirdPartyLicenses], "THIRD_PARTY_LICENSES.md", { type: "text/markdown" });
window.open(URL.createObjectURL(blob));
} catch (error$2) {
toast.showToast({
title: i18n$2.baseText("about.thirdPartyLicenses.downloadError"),
message: error$2.message,
type: "error"
});
}
};
const copyDebugInfoToClipboard = async () => {
toast.showToast({
title: i18n$2.baseText("about.debug.toast.title"),
message: i18n$2.baseText("about.debug.toast.message"),
type: "info",
duration: 5e3
});
await clipboard.copy(debugInfo.generateDebugInfo());
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "540px",
title: unref(i18n$2).baseText("about.aboutN8n"),
"event-bus": unref(modalBus),
name: unref(ABOUT_MODAL_KEY),
center: true
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: "info-name"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.n8nVersion")), 1)]),
_: 1
})]),
_: 1
}), createVNode(unref(ElCol), { span: 16 }, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(rootStore).versionCli), 1)]),
_: 1
})]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: "info-name"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.sourceCode")), 1)]),
_: 1
})]),
_: 1
}), createVNode(unref(ElCol), { span: 16 }, {
default: withCtx(() => [createVNode(unref(N8nLink_default), { to: "https://github.com/n8n-io/n8n" }, {
default: withCtx(() => _cache[0] || (_cache[0] = [createTextVNode("https://github.com/n8n-io/n8n")])),
_: 1
})]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: "info-name"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.license")), 1)]),
_: 1
})]),
_: 1
}), createVNode(unref(ElCol), { span: 16 }, {
default: withCtx(() => [createVNode(unref(N8nLink_default), { to: "https://github.com/n8n-io/n8n/blob/master/LICENSE.md" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.n8nLicense")), 1)]),
_: 1
})]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: "info-name"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.thirdPartyLicenses")), 1)]),
_: 1
})]),
_: 1
}), createVNode(unref(ElCol), { span: 16 }, {
default: withCtx(() => [createVNode(unref(N8nLink_default), { onClick: downloadThirdPartyLicenses }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.thirdPartyLicensesLink")), 1)]),
_: 1
})]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: "info-name"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.instanceID")), 1)]),
_: 1
})]),
_: 1
}), createVNode(unref(ElCol), { span: 16 }, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(rootStore).instanceId), 1)]),
_: 1
})]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: "info-name"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.debug.title")), 1)]),
_: 1
})]),
_: 1
}), createVNode(unref(ElCol), { span: 16 }, {
default: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.debugInfo),
onClick: copyDebugInfoToClipboard
}, [createVNode(unref(N8nLink_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("about.debug.message")), 1)]),
_: 1
})], 2)]),
_: 1
})]),
_: 1
})
], 2)]),
footer: withCtx(() => [createBaseVNode("div", _hoisted_1$36, [createVNode(unref(N8nButton_default), {
float: "right",
label: unref(i18n$2).baseText("about.close"),
"data-test-id": "close-about-modal-button",
onClick: closeDialog
}, null, 8, ["label"])])]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var AboutModal_vue_vue_type_style_index_0_lang_module_default = { container: "_container_13dwb_123" };
var AboutModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(AboutModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": AboutModal_vue_vue_type_style_index_0_lang_module_default }]]);
var ActivationModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ActivationModal",
setup(__props) {
const checked = ref(false);
const executionsStore = useExecutionsStore();
const workflowsStore = useWorkflowsStore();
const nodeTypesStore = useNodeTypesStore();
const uiStore = useUIStore();
const router = useRouter();
const i18n$2 = useI18n();
const modalTitle = computed(() => {
return i18n$2.baseText("activationModal.workflowPublished");
});
const triggerContent = computed(() => {
const foundTriggers = getActivatableTriggerNodes(workflowsStore.workflowTriggerNodes);
if (!foundTriggers.length) return "";
if (foundTriggers.length > 1) return i18n$2.baseText("activationModal.yourTriggersWillNowFire");
const trigger = foundTriggers[0];
const triggerNodeType = nodeTypesStore.getNodeType(trigger.type, trigger.typeVersion);
if (triggerNodeType) {
if (triggerNodeType.activationMessage) return triggerNodeType.activationMessage;
const serviceName = getTriggerNodeServiceName(triggerNodeType);
if (trigger.webhookId) return i18n$2.baseText("activationModal.yourWorkflowWillNowListenForEvents", { interpolate: { serviceName } });
else if (triggerNodeType.polling) return i18n$2.baseText("activationModal.yourWorkflowWillNowRegularlyCheck", { interpolate: { serviceName } });
}
return i18n$2.baseText("activationModal.yourTriggerWillNowFire");
});
const showExecutionsList = async () => {
const activeExecution = executionsStore.activeExecution;
const currentWorkflow = workflowsStore.workflowId;
if (activeExecution) router.push({
name: VIEWS.EXECUTION_PREVIEW,
params: {
name: currentWorkflow,
executionId: activeExecution.id
}
}).catch(() => {});
else router.push({
name: VIEWS.EXECUTION_HOME,
params: { name: currentWorkflow }
}).catch(() => {});
uiStore.closeModal(WORKFLOW_ACTIVE_MODAL_KEY);
};
const showSettings = async () => {
uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);
};
const handleCheckboxChange = (checkboxValue) => {
const boolValue = typeof checkboxValue === "boolean" ? checkboxValue : Boolean(checkboxValue);
checked.value = boolValue;
useStorage$1(LOCAL_STORAGE_ACTIVATION_FLAG).value = boolValue.toString();
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(WORKFLOW_ACTIVE_MODAL_KEY),
title: modalTitle.value,
width: "460px"
}, {
content: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(triggerContent.value), 1)]),
_: 1
})]), createBaseVNode("div", { class: normalizeClass(_ctx.$style.spaced) }, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [
createVNode(unref(N8nText_default), { bold: true }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("activationModal.theseExecutionsWillNotShowUp")), 1)]),
_: 1
}),
createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("activationModal.butYouCanSeeThem")) + " ", 1),
createBaseVNode("a", { onClick: showExecutionsList }, toDisplayString(unref(i18n$2).baseText("activationModal.executionList")), 1),
createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("activationModal.ifYouChooseTo")) + " ", 1),
createBaseVNode("a", { onClick: showSettings }, toDisplayString(unref(i18n$2).baseText("activationModal.saveExecutions")), 1)
]),
_: 1
})], 2)]),
footer: withCtx(({ close }) => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(ElCheckbox), {
"model-value": checked.value,
"onUpdate:modelValue": handleCheckboxChange
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.dontShowAgain")), 1)]),
_: 1
}, 8, ["model-value"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("activationModal.gotIt"),
onClick: close
}, null, 8, ["label", "onClick"])], 2)]),
_: 1
}, 8, ["name", "title"]);
};
}
});
var ActivationModal_vue_vue_type_style_index_0_lang_module_default = {
spaced: "_spaced_46tx0_123",
footer: "_footer_46tx0_127"
};
var ActivationModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ActivationModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ActivationModal_vue_vue_type_style_index_0_lang_module_default }]]);
var ApiKeyScopes_vue_vue_type_style_index_0_lang_module_default = {
"api-key-scopes": "_api-key-scopes_1fuku_2",
"scopes-dropdown-container": "_scopes-dropdown-container_1fuku_16",
"scopes-checkbox": "_scopes-checkbox_1fuku_50"
};
var ApiKeyScopes_default = /* @__PURE__ */ __plugin_vue_export_helper_default({
__name: "ApiKeyScopes",
props: {
modelValue: {
type: Array,
default: () => []
},
availableScopes: {
type: Array,
default: () => []
},
enabled: {
type: Boolean,
default: false
}
},
emits: ["update:modelValue"],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const selectedScopes = ref(props.modelValue);
const i18n$2 = useI18n();
const { goToUpgrade } = usePageRedirectionHelper();
const checkAll = ref(false);
const indeterminate = ref(false);
const popperContainer = ref(null);
const groupedScopes = computed(() => {
const groups = {};
props.availableScopes.forEach((scope) => {
const [resource, action] = scope.split(":");
if (!groups[resource]) groups[resource] = [];
if (action) groups[resource].push(action);
});
return groups;
});
watch(selectedScopes, (newValue) => {
if (newValue.length === props.availableScopes.length) {
indeterminate.value = false;
checkAll.value = true;
} else if (newValue.length > 0) indeterminate.value = true;
else if (newValue.length === 0) {
indeterminate.value = false;
checkAll.value = false;
}
emit("update:modelValue", newValue);
});
watch(checkAll, (newValue) => {
if (newValue) selectedScopes.value = props.availableScopes;
else selectedScopes.value = [];
});
function goToUpgradeApiKeyScopes() {
goToUpgrade("api-key-scopes", "upgrade-api-key-scopes");
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style["api-key-scopes"]) }, [
createBaseVNode("div", {
ref_key: "popperContainer",
ref: popperContainer
}, null, 512),
createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("settings.api.scopes.label"),
color: "text-dark"
}, {
default: withCtx(() => [createVNode(unref(ElSelect), {
modelValue: selectedScopes.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => selectedScopes.value = $event),
"data-test-id": "scopes-select",
"popper-class": _ctx.$style["scopes-dropdown-container"],
teleported: true,
multiple: "",
"collapse-tags": "",
"max-collapse-tags": 10,
placement: "top",
"reserve-keyword": false,
placeholder: unref(i18n$2).baseText("settings.api.scopes.placeholder"),
"append-to": popperContainer.value
}, {
header: withCtx(() => [createVNode(unref(ElCheckbox), {
modelValue: checkAll.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => checkAll.value = $event),
disabled: !__props.enabled,
class: normalizeClass(_ctx.$style["scopes-checkbox"]),
indeterminate: indeterminate.value
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.api.scopes.selectAll")), 1)]),
_: 1
}, 8, [
"modelValue",
"disabled",
"class",
"indeterminate"
])]),
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(groupedScopes.value, (actions$3, resource) => {
return openBlock(), createBlock(unref(ElOptionGroup), {
key: resource,
disabled: !__props.enabled,
label: unref(capitalCase)(resource).toUpperCase()
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(actions$3, (action) => {
return openBlock(), createBlock(unref(ElOption), {
key: `${resource}:${action}`,
label: `${resource}:${action}`,
value: `${resource}:${action}`
}, null, 8, ["label", "value"]);
}), 128))]),
_: 2
}, 1032, ["disabled", "label"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"popper-class",
"placeholder",
"append-to"
])]),
_: 1
}, 8, ["label"]),
!__props.enabled ? (openBlock(), createBlock(unref(N8nNotice_default), { key: 0 }, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "settings.api.scopes.upgrade",
scope: "global"
}, {
link: withCtx(() => [createVNode(unref(N8nLink_default), {
size: "small",
onClick: goToUpgradeApiKeyScopes
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.upgrade")), 1)]),
_: 1
})]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true)
], 2);
};
}
}, [["__cssModules", { "$style": ApiKeyScopes_vue_vue_type_style_index_0_lang_module_default }]]);
var ApiKeyCreateOrEditModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ApiKeyCreateOrEditModal",
props: {
mode: { default: "new" },
activeId: { default: "" }
},
setup(__props) {
const EXPIRATION_OPTIONS = {
"7_DAYS": 7,
"30_DAYS": 30,
"60_DAYS": 60,
"90_DAYS": 90,
CUSTOM: 1,
NO_EXPIRATION: 0
};
const i18n$2 = useI18n();
const { showError, showMessage } = useToast();
const uiStore = useUIStore();
const rootStore = useRootStore();
const { createApiKey, updateApiKey, apiKeysById, availableScopes } = useApiKeysStore();
const documentTitle = useDocumentTitle();
const label$2 = ref("");
const expirationDaysFromNow = ref(EXPIRATION_OPTIONS["30_DAYS"]);
const modalBus = createEventBus();
const newApiKey = ref(null);
const loading$3 = ref(false);
const rawApiKey = ref("");
const customExpirationDate = ref("");
const showExpirationDateSelector = ref(false);
const apiKeyCreationDate = ref("");
const selectedScopes = ref([]);
const settingsStore = useSettingsStore();
const apiKeyStore = useApiKeysStore();
const apiKeyScopesEnabled = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.ApiKeyScopes]);
const calculateExpirationDate = (daysFromNow) => {
return DateTime.now().setZone(rootStore.timezone).startOf("day").plus({ days: daysFromNow });
};
const getExpirationOptionLabel = (value) => {
if (EXPIRATION_OPTIONS.CUSTOM === value) return i18n$2.baseText("settings.api.view.modal.form.expiration.custom");
if (EXPIRATION_OPTIONS.NO_EXPIRATION === value) return i18n$2.baseText("settings.api.view.modal.form.expiration.none");
return i18n$2.baseText("settings.api.view.modal.form.expiration.days", { interpolate: { numberOfDays: value } });
};
const expirationDate = ref(calculateExpirationDate(expirationDaysFromNow.value).toFormat("ccc, MMM d yyyy"));
const inputRef = ref(null);
const props = __props;
const allFormFieldsAreSet = computed(() => {
const isExpirationDateSet = expirationDaysFromNow.value === EXPIRATION_OPTIONS.NO_EXPIRATION || expirationDaysFromNow.value === EXPIRATION_OPTIONS.CUSTOM && customExpirationDate.value || expirationDate.value;
return label$2.value && (!apiKeyScopesEnabled.value ? true : selectedScopes.value.length) && (props.mode === "edit" ? true : isExpirationDateSet);
});
const isCustomDateInThePast = (date) => Date.now() > date.getTime();
onMounted(() => {
documentTitle.set(i18n$2.baseText("settings.api"));
setTimeout(() => {
inputRef.value?.focus();
});
if (props.mode === "edit") {
const apiKey = apiKeysById[props.activeId];
label$2.value = apiKey.label ?? "";
apiKeyCreationDate.value = getApiKeyCreationTime(apiKey);
selectedScopes.value = !apiKeyScopesEnabled.value ? apiKeyStore.availableScopes : apiKey.scopes.filter((scope) => apiKeyStore.availableScopes.includes(scope));
}
if (props.mode === "new" && !apiKeyScopesEnabled.value) selectedScopes.value = availableScopes;
});
function onInput(value) {
label$2.value = value;
}
function onScopeSelectionChanged(scopes) {
selectedScopes.value = scopes;
}
const getApiKeyCreationTime = (apiKey) => {
const time = DateTime.fromMillis(Date.parse(apiKey.createdAt)).toFormat("ccc, MMM d yyyy");
return i18n$2.baseText("settings.api.creationTime", { interpolate: { time } });
};
async function onEdit() {
try {
loading$3.value = true;
await updateApiKey(props.activeId, {
label: label$2.value,
scopes: selectedScopes.value
});
showMessage({
type: "success",
title: i18n$2.baseText("settings.api.update.toast")
});
closeModal();
} catch (error$2) {
showError(error$2, i18n$2.baseText("settings.api.edit.error"));
} finally {
loading$3.value = false;
}
}
function closeModal() {
uiStore.closeModal(API_KEY_CREATE_OR_EDIT_MODAL_KEY);
}
const onSave = async () => {
if (!label$2.value) return;
let expirationUnixTimestamp = null;
if (expirationDaysFromNow.value === EXPIRATION_OPTIONS.CUSTOM) expirationUnixTimestamp = parseInt(customExpirationDate.value, 10);
else if (expirationDaysFromNow.value !== EXPIRATION_OPTIONS.NO_EXPIRATION) expirationUnixTimestamp = calculateExpirationDate(expirationDaysFromNow.value).toUnixInteger();
const payload = {
label: label$2.value,
expiresAt: expirationUnixTimestamp,
scopes: selectedScopes.value
};
try {
loading$3.value = true;
newApiKey.value = await createApiKey(payload);
rawApiKey.value = newApiKey.value.rawApiKey;
showMessage({
type: "success",
title: i18n$2.baseText("settings.api.create.toast")
});
} catch (error$2) {
showError(error$2, i18n$2.baseText("settings.api.create.error"));
} finally {
loading$3.value = false;
}
};
const modalTitle = computed(() => {
let path = "edit";
if (props.mode === "new") if (newApiKey.value) path = "created";
else path = "create";
return i18n$2.baseText(`settings.api.view.modal.title.${path}`);
});
const onSelect = (value) => {
if (value === EXPIRATION_OPTIONS.CUSTOM) {
showExpirationDateSelector.value = true;
expirationDate.value = "";
return;
}
if (value !== EXPIRATION_OPTIONS.NO_EXPIRATION) {
expirationDate.value = calculateExpirationDate(value).toFormat("ccc, MMM d yyyy");
showExpirationDateSelector.value = false;
return;
}
expirationDate.value = "";
showExpirationDateSelector.value = false;
};
async function handleEnterKey(event) {
if (event.key === "Enter") if (props.mode === "new") await onSave();
else await onEdit();
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
title: modalTitle.value,
"event-bus": unref(modalBus),
name: unref(API_KEY_CREATE_OR_EDIT_MODAL_KEY),
width: "600px",
"lock-scroll": false,
"close-on-esc": true,
"close-on-click-modal": false,
"show-close": true
}, {
content: withCtx(() => [createBaseVNode("div", { onKeyup: withKeys(handleEnterKey, ["enter"]) }, [newApiKey.value ? (openBlock(), createBlock(unref(N8nCard_default), {
key: 0,
class: "mb-4xs"
}, {
default: withCtx(() => [createVNode(CopyInput_default, {
label: newApiKey.value.label,
value: newApiKey.value.rawApiKey,
"redact-value": true,
"copy-button-text": unref(i18n$2).baseText("generic.clickToCopy"),
"toast-title": unref(i18n$2).baseText("settings.api.view.copy.toast"),
hint: unref(i18n$2).baseText("settings.api.view.copy")
}, null, 8, [
"label",
"value",
"copy-button-text",
"toast-title",
"hint"
])]),
_: 1
})) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.form)
}, [
createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("settings.api.view.modal.form.label"),
color: "text-dark"
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
ref_key: "inputRef",
ref: inputRef,
required: "",
"model-value": label$2.value,
size: "large",
type: "text",
placeholder: unref(i18n$2).baseText("settings.api.view.modal.form.label.placeholder"),
maxlength: 50,
"data-test-id": "api-key-label",
"onUpdate:modelValue": onInput
}, null, 8, ["model-value", "placeholder"])]),
_: 1
}, 8, ["label"]),
_ctx.mode === "new" ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.expirationSection)
}, [
createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("settings.api.view.modal.form.expiration"),
color: "text-dark"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: expirationDaysFromNow.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => expirationDaysFromNow.value = $event), onSelect],
size: "large",
filterable: "",
readonly: "",
"data-test-id": "expiration-select"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(Object.keys(EXPIRATION_OPTIONS), (key) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key,
value: EXPIRATION_OPTIONS[key],
label: getExpirationOptionLabel(EXPIRATION_OPTIONS[key])
}, null, 8, ["value", "label"]);
}), 128))]),
_: 1
}, 8, ["modelValue"])]),
_: 1
}, 8, ["label"]),
expirationDate.value ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
class: "mb-xs"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.api.view.modal.form.expirationText", { interpolate: { expirationDate: expirationDate.value } })), 1)]),
_: 1
})) : createCommentVNode("", true),
showExpirationDateSelector.value ? (openBlock(), createBlock(unref(ElDatePicker), {
key: 1,
modelValue: customExpirationDate.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => customExpirationDate.value = $event),
type: "date",
teleported: false,
placeholder: "yyyy-mm-dd",
"value-format": "X",
"disabled-date": isCustomDateInThePast
}, null, 8, ["modelValue"])) : createCommentVNode("", true)
], 2)) : createCommentVNode("", true),
createVNode(ApiKeyScopes_default, {
modelValue: selectedScopes.value,
"onUpdate:modelValue": [_cache[2] || (_cache[2] = ($event) => selectedScopes.value = $event), onScopeSelectionChanged],
"available-scopes": unref(availableScopes),
enabled: apiKeyScopesEnabled.value
}, null, 8, [
"modelValue",
"available-scopes",
"enabled"
])
], 2))], 32)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [
_ctx.mode === "new" && !newApiKey.value ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 0,
loading: loading$3.value,
disabled: !allFormFieldsAreSet.value,
label: unref(i18n$2).baseText("settings.api.view.modal.save.button"),
onClick: onSave
}, null, 8, [
"loading",
"disabled",
"label"
])) : _ctx.mode === "new" ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 1,
label: unref(i18n$2).baseText("settings.api.view.modal.done.button"),
onClick: closeModal
}, null, 8, ["label"])) : createCommentVNode("", true),
_ctx.mode === "edit" ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 2,
disabled: !allFormFieldsAreSet.value,
label: unref(i18n$2).baseText("settings.api.view.modal.save.button"),
onClick: onEdit
}, null, 8, ["disabled", "label"])) : createCommentVNode("", true),
_ctx.mode === "edit" ? (openBlock(), createBlock(unref(N8nText_default), {
key: 3,
size: "small",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(apiKeyCreationDate.value), 1)]),
_: 1
})) : createCommentVNode("", true)
], 2)]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var ApiKeyCreateOrEditModal_vue_vue_type_style_index_0_lang_module_default = {
notice: "_notice_7hlw9_123",
form: "_form_7hlw9_127",
expirationSection: "_expirationSection_7hlw9_133",
footer: "_footer_7hlw9_140"
};
var ApiKeyCreateOrEditModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ApiKeyCreateOrEditModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ApiKeyCreateOrEditModal_vue_vue_type_style_index_0_lang_module_default }]]);
var NewAssistantSessionModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "NewAssistantSessionModal",
props: {
name: {},
data: {}
},
setup(__props) {
const i18n$2 = useI18n();
const uiStore = useUIStore();
const assistantStore = useAssistantStore();
const chatPanelStore = useChatPanelStore();
const props = __props;
const close = () => {
uiStore.closeModal(NEW_ASSISTANT_SESSION_MODAL);
};
const startNewSession = async () => {
if ("errorHelp" in props.data.context) {
await chatPanelStore.openWithErrorHelper(props.data.context.errorHelp);
assistantStore.trackUserOpenedAssistant({
source: "error",
task: "error",
has_existing_session: true
});
} else if ("credHelp" in props.data.context) await chatPanelStore.openWithCredHelp(props.data.context.credHelp.credType);
close();
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "460px",
height: "250px",
"data-test-id": "new-assistant-session-modal",
name: unref(NEW_ASSISTANT_SESSION_MODAL),
center: true,
"append-to-body": true
}, {
header: withCtx(() => [
createTextVNode(toDisplayString(unref(i18n$2).baseText("aiAssistant.newSessionModal.title.part1")) + " ", 1),
createBaseVNode("span", { class: normalizeClass(_ctx.$style.assistantIcon) }, [createVNode(unref(AskAssistantIcon_default), { size: "medium" })], 2),
createVNode(unref(AskAssistantText_default), {
size: "xlarge",
text: unref(i18n$2).baseText("aiAssistant.assistant")
}, null, 8, ["text"]),
createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("aiAssistant.newSessionModal.title.part2")), 1)
]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [createBaseVNode("p", null, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("aiAssistant.newSessionModal.message")), 1)]),
_: 1
})]), createBaseVNode("p", null, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("aiAssistant.newSessionModal.question")), 1)]),
_: 1
})])], 2)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("generic.cancel"),
type: "secondary",
onClick: close
}, null, 8, ["label"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("aiAssistant.newSessionModal.confirm"),
onClick: startNewSession
}, null, 8, ["label"])], 2)]),
_: 1
}, 8, ["name"]);
};
}
});
var NewAssistantSessionModal_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_jo5dn_123",
assistantIcon: "_assistantIcon_jo5dn_130",
footer: "_footer_jo5dn_134"
};
var NewAssistantSessionModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NewAssistantSessionModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NewAssistantSessionModal_vue_vue_type_style_index_0_lang_module_default }]]);
var ChangePasswordModal_default = /* @__PURE__ */ defineComponent({
__name: "ChangePasswordModal",
setup(__props) {
const config$1 = ref(null);
const formBus = createFormEventBus();
const modalBus = createEventBus();
const password = ref("");
const loading$3 = ref(false);
const i18n$2 = useI18n();
const { showMessage, showError } = useToast();
const usersStore = useUsersStore();
const passwordsMatch = (value) => {
if (typeof value !== "string") return false;
if (value !== password.value) return { messageKey: "auth.changePassword.passwordsMustMatchError" };
return false;
};
const onInput = (e) => {
if (e.name === "password" && typeof e.value === "string") password.value = e.value;
};
const onSubmit = async (data) => {
const values$2 = data;
try {
loading$3.value = true;
await usersStore.updateCurrentUserPassword({
currentPassword: values$2.currentPassword,
newPassword: values$2.password,
mfaCode: values$2.mfaCode
});
showMessage({
type: "success",
title: i18n$2.baseText("auth.changePassword.passwordUpdated"),
message: i18n$2.baseText("auth.changePassword.passwordUpdatedMessage")
});
modalBus.emit("close");
} catch (error$2) {
showError(error$2, i18n$2.baseText("auth.changePassword.error"));
} finally {
loading$3.value = false;
}
};
const onSubmitClick = () => {
formBus.emit("submit");
};
onMounted(() => {
const inputs = {
currentPassword: {
name: "currentPassword",
properties: {
label: i18n$2.baseText("auth.changePassword.currentPassword"),
type: "password",
required: true,
autocomplete: "current-password",
capitalize: true,
focusInitially: true
}
},
mfaCode: {
name: "mfaCode",
properties: {
label: i18n$2.baseText("auth.changePassword.mfaCode"),
type: "text",
required: true,
capitalize: true
}
},
newPassword: {
name: "password",
properties: {
label: i18n$2.baseText("auth.newPassword"),
type: "password",
required: true,
validationRules: [{ name: "DEFAULT_PASSWORD_RULES" }],
infoText: i18n$2.baseText("auth.defaultPasswordRequirements"),
autocomplete: "new-password",
capitalize: true
}
},
newPasswordAgain: {
name: "password2",
properties: {
label: i18n$2.baseText("auth.changePassword.reenterNewPassword"),
type: "password",
required: true,
validators: { TWO_PASSWORDS_MATCH: { validate: passwordsMatch } },
validationRules: [{ name: "TWO_PASSWORDS_MATCH" }],
autocomplete: "new-password",
capitalize: true
}
}
};
const { currentUser } = usersStore;
config$1.value = currentUser?.mfaEnabled ? [
inputs.currentPassword,
inputs.mfaCode,
inputs.newPassword,
inputs.newPasswordAgain
] : [
inputs.currentPassword,
inputs.newPassword,
inputs.newPasswordAgain
];
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(CHANGE_PASSWORD_MODAL_KEY),
title: unref(i18n$2).baseText("auth.changePassword"),
center: true,
width: "460px",
"event-bus": unref(modalBus),
onEnter: onSubmitClick
}, {
content: withCtx(() => [config$1.value ? (openBlock(), createBlock(unref(N8nFormInputs_default), {
key: 0,
inputs: config$1.value,
"event-bus": unref(formBus),
"column-view": true,
onUpdate: onInput,
onSubmit
}, null, 8, ["inputs", "event-bus"])) : createCommentVNode("", true)]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
loading: loading$3.value,
label: unref(i18n$2).baseText("auth.changePassword"),
float: "right",
"data-test-id": "change-password-button",
onClick: onSubmitClick
}, null, 8, ["loading", "label"])]),
_: 1
}, 8, [
"name",
"title",
"event-bus"
]);
};
}
});
var ConfirmPasswordModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ConfirmPasswordModal",
setup(__props) {
const config$1 = ref(null);
const formBus = createFormEventBus();
const loading$3 = ref(false);
const i18n$2 = useI18n();
const onSubmit = (data) => {
const currentPassword = data.currentPassword;
if (!currentPassword) return;
loading$3.value = true;
confirmPasswordEventBus.emit("close", { currentPassword });
};
const onSubmitClick = () => {
formBus.emit("submit");
};
onMounted(() => {
config$1.value = [{ currentPassword: {
name: "currentPassword",
properties: {
label: i18n$2.baseText("auth.confirmPassword.currentPassword"),
type: "password",
required: true,
autocomplete: "current-password",
capitalize: true,
focusInitially: true
}
} }.currentPassword];
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(CONFIRM_PASSWORD_MODAL_KEY),
title: unref(i18n$2).baseText("auth.confirmPassword"),
center: true,
width: "460px",
"event-bus": unref(confirmPasswordEventBus),
onEnter: onSubmitClick
}, {
content: withCtx(() => [createVNode(unref(N8nText_default), {
class: normalizeClass(_ctx.$style.description),
tag: "p"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("auth.confirmPassword.confirmPasswordToChangeEmail")), 1)]),
_: 1
}, 8, ["class"]), config$1.value ? (openBlock(), createBlock(unref(N8nFormInputs_default), {
key: 0,
inputs: config$1.value,
"event-bus": unref(formBus),
"column-view": true,
onSubmit
}, null, 8, ["inputs", "event-bus"])) : createCommentVNode("", true)]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
loading: loading$3.value,
label: unref(i18n$2).baseText("generic.confirm"),
float: "right",
"data-test-id": "confirm-password-button",
onClick: onSubmitClick
}, null, 8, ["loading", "label"])]),
_: 1
}, 8, [
"name",
"title",
"event-bus"
]);
};
}
});
var ConfirmPasswordModal_vue_vue_type_style_index_0_lang_module_default = { description: "_description_mdph2_123" };
var ConfirmPasswordModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ConfirmPasswordModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ConfirmPasswordModal_vue_vue_type_style_index_0_lang_module_default }]]);
var handlers = {};
var instrumented = {};
function addHandler(type, handler) {
handlers[type] = handlers[type] || [];
handlers[type].push(handler);
}
function maybeInstrument(type, instrumentFn) {
if (!instrumented[type]) {
instrumented[type] = true;
try {
instrumentFn();
} catch (e) {
DEBUG_BUILD$3 && debug.error(`Error while instrumenting ${type}`, e);
}
}
}
function triggerHandlers(type, data) {
const typeHandlers = type && handlers[type];
if (!typeHandlers) return;
for (const handler of typeHandlers) try {
handler(data);
} catch (e) {
DEBUG_BUILD$3 && debug.error(`Error while triggering instrumentation handler.\nType: ${type}\nName: ${getFunctionName(handler)}\nError:`, e);
}
}
var _oldOnErrorHandler = null;
function addGlobalErrorInstrumentationHandler(handler) {
const type = "error";
addHandler(type, handler);
maybeInstrument(type, instrumentError);
}
function instrumentError() {
_oldOnErrorHandler = GLOBAL_OBJ.onerror;
GLOBAL_OBJ.onerror = function(msg, url, line, column$1, error$2) {
triggerHandlers("error", {
column: column$1,
error: error$2,
line,
msg,
url
});
if (_oldOnErrorHandler) return _oldOnErrorHandler.apply(this, arguments);
return false;
};
GLOBAL_OBJ.onerror.__SENTRY_INSTRUMENTED__ = true;
}
var _oldOnUnhandledRejectionHandler = null;
function addGlobalUnhandledRejectionInstrumentationHandler(handler) {
const type = "unhandledrejection";
addHandler(type, handler);
maybeInstrument(type, instrumentUnhandledRejection);
}
function instrumentUnhandledRejection() {
_oldOnUnhandledRejectionHandler = GLOBAL_OBJ.onunhandledrejection;
GLOBAL_OBJ.onunhandledrejection = function(e) {
triggerHandlers("unhandledrejection", e);
if (_oldOnUnhandledRejectionHandler) return _oldOnUnhandledRejectionHandler.apply(this, arguments);
return true;
};
GLOBAL_OBJ.onunhandledrejection.__SENTRY_INSTRUMENTED__ = true;
}
function parseSampleRate(sampleRate) {
if (typeof sampleRate === "boolean") return Number(sampleRate);
const rate = typeof sampleRate === "string" ? parseFloat(sampleRate) : sampleRate;
if (typeof rate !== "number" || isNaN(rate) || rate < 0 || rate > 1) return;
return rate;
}
var SentryNonRecordingSpan = class {
constructor(spanContext = {}) {
this._traceId = spanContext.traceId || generateTraceId();
this._spanId = spanContext.spanId || generateSpanId();
}
spanContext() {
return {
spanId: this._spanId,
traceId: this._traceId,
traceFlags: 0
};
}
end(_timestamp) {}
setAttribute(_key, _value) {
return this;
}
setAttributes(_values) {
return this;
}
setStatus(_status) {
return this;
}
updateName(_name) {
return this;
}
isRecording() {
return false;
}
addEvent(_name, _attributesOrStartTime, _startTime) {
return this;
}
addLink(_link) {
return this;
}
addLinks(_links) {
return this;
}
recordException(_exception, _time) {}
};
function createEnvelope(headers, items = []) {
return [headers, items];
}
function addItemToEnvelope(envelope, newItem) {
const [headers, items] = envelope;
return [headers, [...items, newItem]];
}
function forEachEnvelopeItem(envelope, callback) {
const envelopeItems = envelope[1];
for (const envelopeItem of envelopeItems) {
const envelopeItemType = envelopeItem[0].type;
if (callback(envelopeItem, envelopeItemType)) return true;
}
return false;
}
function encodeUTF8(input$1) {
const carrier = getSentryCarrier(GLOBAL_OBJ);
return carrier.encodePolyfill ? carrier.encodePolyfill(input$1) : new TextEncoder().encode(input$1);
}
function serializeEnvelope(envelope) {
const [envHeaders, items] = envelope;
let parts = JSON.stringify(envHeaders);
function append(next) {
if (typeof parts === "string") parts = typeof next === "string" ? parts + next : [encodeUTF8(parts), next];
else parts.push(typeof next === "string" ? encodeUTF8(next) : next);
}
for (const item$2 of items) {
const [itemHeaders, payload] = item$2;
append(`\n${JSON.stringify(itemHeaders)}\n`);
if (typeof payload === "string" || payload instanceof Uint8Array) append(payload);
else {
let stringifiedPayload;
try {
stringifiedPayload = JSON.stringify(payload);
} catch {
stringifiedPayload = JSON.stringify(normalize(payload));
}
append(stringifiedPayload);
}
}
return typeof parts === "string" ? parts : concatBuffers(parts);
}
function concatBuffers(buffers) {
const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);
const merged = new Uint8Array(totalLength);
let offset = 0;
for (const buffer of buffers) {
merged.set(buffer, offset);
offset += buffer.length;
}
return merged;
}
function createSpanEnvelopeItem(spanJson) {
return [{ type: "span" }, spanJson];
}
function createAttachmentEnvelopeItem(attachment) {
const buffer = typeof attachment.data === "string" ? encodeUTF8(attachment.data) : attachment.data;
return [{
type: "attachment",
length: buffer.length,
filename: attachment.filename,
content_type: attachment.contentType,
attachment_type: attachment.attachmentType
}, buffer];
}
var ITEM_TYPE_TO_DATA_CATEGORY_MAP = {
session: "session",
sessions: "session",
attachment: "attachment",
transaction: "transaction",
event: "error",
client_report: "internal",
user_report: "default",
profile: "profile",
profile_chunk: "profile",
replay_event: "replay",
replay_recording: "replay",
check_in: "monitor",
feedback: "feedback",
span: "span",
raw_security: "security",
log: "log_item"
};
function envelopeItemTypeToDataCategory(type) {
return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];
}
function getSdkMetadataForEnvelopeHeader(metadataOrEvent) {
if (!metadataOrEvent?.sdk) return;
const { name: name$2, version } = metadataOrEvent.sdk;
return {
name: name$2,
version
};
}
function createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn) {
const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;
return {
event_id: event.event_id,
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
...sdkInfo && { sdk: sdkInfo },
...!!tunnel && dsn && { dsn: dsnToString(dsn) },
...dynamicSamplingContext && { trace: dynamicSamplingContext }
};
}
function enhanceEventWithSdkInfo(event, sdkInfo) {
if (!sdkInfo) return event;
event.sdk = event.sdk || {};
event.sdk.name = event.sdk.name || sdkInfo.name;
event.sdk.version = event.sdk.version || sdkInfo.version;
event.sdk.integrations = [...event.sdk.integrations || [], ...sdkInfo.integrations || []];
event.sdk.packages = [...event.sdk.packages || [], ...sdkInfo.packages || []];
return event;
}
function createSessionEnvelope(session, dsn, metadata, tunnel) {
const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);
return createEnvelope({
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
...sdkInfo && { sdk: sdkInfo },
...!!tunnel && dsn && { dsn: dsnToString(dsn) }
}, ["aggregates" in session ? [{ type: "sessions" }, session] : [{ type: "session" }, session.toJSON()]]);
}
function createEventEnvelope(event, dsn, metadata, tunnel) {
const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);
const eventType = event.type && event.type !== "replay_event" ? event.type : "event";
enhanceEventWithSdkInfo(event, metadata?.sdk);
const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);
delete event.sdkProcessingMetadata;
return createEnvelope(envelopeHeaders, [[{ type: eventType }, event]]);
}
function createSpanEnvelope(spans, client) {
function dscHasRequiredProps(dsc$1) {
return !!dsc$1.trace_id && !!dsc$1.public_key;
}
const dsc = getDynamicSamplingContextFromSpan(spans[0]);
const dsn = client?.getDsn();
const tunnel = client?.getOptions().tunnel;
const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
...dscHasRequiredProps(dsc) && { trace: dsc },
...!!tunnel && dsn && { dsn: dsnToString(dsn) }
};
const beforeSendSpan = client?.getOptions().beforeSendSpan;
const convertToSpanJSON = beforeSendSpan ? (span) => {
const spanJson = spanToJSON(span);
const processedSpan = beforeSendSpan(spanJson);
if (!processedSpan) {
showSpanDropWarning();
return spanJson;
}
return processedSpan;
} : spanToJSON;
const items = [];
for (const span of spans) {
const spanJson = convertToSpanJSON(span);
if (spanJson) items.push(createSpanEnvelopeItem(spanJson));
}
return createEnvelope(headers, items);
}
function logSpanStart(span) {
if (!DEBUG_BUILD$3) return;
const { description: description$8 = "< unknown name >", op = "< unknown op >", parent_span_id: parentSpanId } = spanToJSON(span);
const { spanId } = span.spanContext();
const sampled = spanIsSampled(span);
const rootSpan = getRootSpan(span);
const isRootSpan = rootSpan === span;
const header$12 = `[Tracing] Starting ${sampled ? "sampled" : "unsampled"} ${isRootSpan ? "root " : ""}span`;
const infoParts = [
`op: ${op}`,
`name: ${description$8}`,
`ID: ${spanId}`
];
if (parentSpanId) infoParts.push(`parent ID: ${parentSpanId}`);
if (!isRootSpan) {
const { op: op$1, description: description$9 } = spanToJSON(rootSpan);
infoParts.push(`root ID: ${rootSpan.spanContext().spanId}`);
if (op$1) infoParts.push(`root op: ${op$1}`);
if (description$9) infoParts.push(`root description: ${description$9}`);
}
debug.log(`${header$12}
${infoParts.join("\n ")}`);
}
function logSpanEnd(span) {
if (!DEBUG_BUILD$3) return;
const { description: description$8 = "< unknown name >", op = "< unknown op >" } = spanToJSON(span);
const { spanId } = span.spanContext();
const msg = `[Tracing] Finishing "${op}" ${getRootSpan(span) === span ? "root " : ""}span "${description$8}" with ID ${spanId}`;
debug.log(msg);
}
function timedEventsToMeasurements(events) {
if (!events || events.length === 0) return;
const measurements = {};
events.forEach((event) => {
const attributes = event.attributes || {};
const unit = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT];
const value = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE];
if (typeof unit === "string" && typeof value === "number") measurements[event.name] = {
value,
unit
};
});
return measurements;
}
var MAX_SPAN_COUNT = 1e3;
var SentrySpan = class {
constructor(spanContext = {}) {
this._traceId = spanContext.traceId || generateTraceId();
this._spanId = spanContext.spanId || generateSpanId();
this._startTime = spanContext.startTimestamp || timestampInSeconds();
this._links = spanContext.links;
this._attributes = {};
this.setAttributes({
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "manual",
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,
...spanContext.attributes
});
this._name = spanContext.name;
if (spanContext.parentSpanId) this._parentSpanId = spanContext.parentSpanId;
if ("sampled" in spanContext) this._sampled = spanContext.sampled;
if (spanContext.endTimestamp) this._endTime = spanContext.endTimestamp;
this._events = [];
this._isStandaloneSpan = spanContext.isStandalone;
if (this._endTime) this._onSpanEnded();
}
addLink(link$2) {
if (this._links) this._links.push(link$2);
else this._links = [link$2];
return this;
}
addLinks(links) {
if (this._links) this._links.push(...links);
else this._links = links;
return this;
}
recordException(_exception, _time) {}
spanContext() {
const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;
return {
spanId,
traceId,
traceFlags: sampled ? 1 : 0
};
}
setAttribute(key, value) {
if (value === void 0) delete this._attributes[key];
else this._attributes[key] = value;
return this;
}
setAttributes(attributes) {
Object.keys(attributes).forEach((key) => this.setAttribute(key, attributes[key]));
return this;
}
updateStartTime(timeInput) {
this._startTime = spanTimeInputToSeconds(timeInput);
}
setStatus(value) {
this._status = value;
return this;
}
updateName(name$2) {
this._name = name$2;
this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "custom");
return this;
}
end(endTimestamp) {
if (this._endTime) return;
this._endTime = spanTimeInputToSeconds(endTimestamp);
logSpanEnd(this);
this._onSpanEnded();
}
getSpanJSON() {
return {
data: this._attributes,
description: this._name,
op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],
parent_span_id: this._parentSpanId,
span_id: this._spanId,
start_timestamp: this._startTime,
status: getStatusMessage(this._status),
timestamp: this._endTime,
trace_id: this._traceId,
origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN],
profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID],
exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME],
measurements: timedEventsToMeasurements(this._events),
is_segment: this._isStandaloneSpan && getRootSpan(this) === this || void 0,
segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : void 0,
links: convertSpanLinksForEnvelope(this._links)
};
}
isRecording() {
return !this._endTime && !!this._sampled;
}
addEvent(name$2, attributesOrStartTime, startTime) {
DEBUG_BUILD$3 && debug.log("[Tracing] Adding an event to span:", name$2);
const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();
const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};
const event = {
name: name$2,
time: spanTimeInputToSeconds(time),
attributes
};
this._events.push(event);
return this;
}
isStandaloneSpan() {
return !!this._isStandaloneSpan;
}
_onSpanEnded() {
const client = getClient();
if (client) client.emit("spanEnd", this);
if (!(this._isStandaloneSpan || this === getRootSpan(this))) return;
if (this._isStandaloneSpan) {
if (this._sampled) sendSpanEnvelope(createSpanEnvelope([this], client));
else {
DEBUG_BUILD$3 && debug.log("[Tracing] Discarding standalone span because its trace was not chosen to be sampled.");
if (client) client.recordDroppedEvent("sample_rate", "span");
}
return;
}
const transactionEvent = this._convertSpanToTransaction();
if (transactionEvent) (getCapturedScopesOnSpan(this).scope || getCurrentScope()).captureEvent(transactionEvent);
}
_convertSpanToTransaction() {
if (!isFullFinishedSpan(spanToJSON(this))) return;
if (!this._name) {
DEBUG_BUILD$3 && debug.warn("Transaction has no name, falling back to `<unlabeled transaction>`.");
this._name = "<unlabeled transaction>";
}
const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);
const normalizedRequest = capturedSpanScope?.getScopeData().sdkProcessingMetadata?.normalizedRequest;
if (this._sampled !== true) return;
const spans = getSpanDescendants(this).filter((span) => span !== this && !isStandaloneSpan(span)).map((span) => spanToJSON(span)).filter(isFullFinishedSpan);
const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];
delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];
spans.forEach((span) => {
delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];
});
const transaction = {
contexts: { trace: spanToTransactionTraceContext(this) },
spans: spans.length > MAX_SPAN_COUNT ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT) : spans,
start_timestamp: this._startTime,
timestamp: this._endTime,
transaction: this._name,
type: "transaction",
sdkProcessingMetadata: {
capturedSpanScope,
capturedSpanIsolationScope,
dynamicSamplingContext: getDynamicSamplingContextFromSpan(this)
},
request: normalizedRequest,
...source && { transaction_info: { source } }
};
const measurements = timedEventsToMeasurements(this._events);
if (measurements && Object.keys(measurements).length) {
DEBUG_BUILD$3 && debug.log("[Measurements] Adding measurements to transaction event", JSON.stringify(measurements, void 0, 2));
transaction.measurements = measurements;
}
return transaction;
}
};
function isSpanTimeInput(value) {
return value && typeof value === "number" || value instanceof Date || Array.isArray(value);
}
function isFullFinishedSpan(input$1) {
return !!input$1.start_timestamp && !!input$1.timestamp && !!input$1.span_id && !!input$1.trace_id;
}
function isStandaloneSpan(span) {
return span instanceof SentrySpan && span.isStandaloneSpan();
}
function sendSpanEnvelope(envelope) {
const client = getClient();
if (!client) return;
const spanItems = envelope[1];
if (!spanItems || spanItems.length === 0) {
client.recordDroppedEvent("before_send", "span");
return;
}
client.sendEnvelope(envelope);
}
function sampleSpan(options, samplingContext, sampleRand) {
if (!hasSpansEnabled(options)) return [false];
let localSampleRateWasApplied = void 0;
let sampleRate;
if (typeof options.tracesSampler === "function") {
sampleRate = options.tracesSampler({
...samplingContext,
inheritOrSampleWith: (fallbackSampleRate) => {
if (typeof samplingContext.parentSampleRate === "number") return samplingContext.parentSampleRate;
if (typeof samplingContext.parentSampled === "boolean") return Number(samplingContext.parentSampled);
return fallbackSampleRate;
}
});
localSampleRateWasApplied = true;
} else if (samplingContext.parentSampled !== void 0) sampleRate = samplingContext.parentSampled;
else if (typeof options.tracesSampleRate !== "undefined") {
sampleRate = options.tracesSampleRate;
localSampleRateWasApplied = true;
}
const parsedSampleRate = parseSampleRate(sampleRate);
if (parsedSampleRate === void 0) {
DEBUG_BUILD$3 && debug.warn(`[Tracing] Discarding root span because of invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(sampleRate)} of type ${JSON.stringify(typeof sampleRate)}.`);
return [false];
}
if (!parsedSampleRate) {
DEBUG_BUILD$3 && debug.log(`[Tracing] Discarding transaction because ${typeof options.tracesSampler === "function" ? "tracesSampler returned 0 or false" : "a negative sampling decision was inherited or tracesSampleRate is set to 0"}`);
return [
false,
parsedSampleRate,
localSampleRateWasApplied
];
}
const shouldSample = sampleRand < parsedSampleRate;
if (!shouldSample) DEBUG_BUILD$3 && debug.log(`[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ${Number(sampleRate)})`);
return [
shouldSample,
parsedSampleRate,
localSampleRateWasApplied
];
}
var SUPPRESS_TRACING_KEY = "__SENTRY_SUPPRESS_TRACING__";
function startInactiveSpan(options) {
const acs = getAcs();
if (acs.startInactiveSpan) return acs.startInactiveSpan(options);
const spanArguments = parseSentrySpanArguments(options);
const { forceTransaction, parentSpan: customParentSpan } = options;
return (options.scope ? (callback) => withScope(options.scope, callback) : customParentSpan !== void 0 ? (callback) => withActiveSpan(customParentSpan, callback) : (callback) => callback())(() => {
const scope = getCurrentScope();
const parentSpan = getParentSpan(scope, customParentSpan);
if (options.onlyIfParent && !parentSpan) return new SentryNonRecordingSpan();
return createChildOrRootSpan({
parentSpan,
spanArguments,
forceTransaction,
scope
});
});
}
function withActiveSpan(span, callback) {
const acs = getAcs();
if (acs.withActiveSpan) return acs.withActiveSpan(span, callback);
return withScope((scope) => {
_setSpanForScope(scope, span || void 0);
return callback(scope);
});
}
function createChildOrRootSpan({ parentSpan, spanArguments, forceTransaction, scope }) {
if (!hasSpansEnabled()) {
const span$1 = new SentryNonRecordingSpan();
if (forceTransaction || !parentSpan) freezeDscOnSpan(span$1, {
sampled: "false",
sample_rate: "0",
transaction: spanArguments.name,
...getDynamicSamplingContextFromSpan(span$1)
});
return span$1;
}
const isolationScope = getIsolationScope();
let span;
if (parentSpan && !forceTransaction) {
span = _startChildSpan(parentSpan, scope, spanArguments);
addChildSpanToSpan(parentSpan, span);
} else if (parentSpan) {
const dsc = getDynamicSamplingContextFromSpan(parentSpan);
const { traceId, spanId: parentSpanId } = parentSpan.spanContext();
const parentSampled = spanIsSampled(parentSpan);
span = _startRootSpan({
traceId,
parentSpanId,
...spanArguments
}, scope, parentSampled);
freezeDscOnSpan(span, dsc);
} else {
const { traceId, dsc, parentSpanId, sampled: parentSampled } = {
...isolationScope.getPropagationContext(),
...scope.getPropagationContext()
};
span = _startRootSpan({
traceId,
parentSpanId,
...spanArguments
}, scope, parentSampled);
if (dsc) freezeDscOnSpan(span, dsc);
}
logSpanStart(span);
setCapturedScopesOnSpan(span, scope, isolationScope);
return span;
}
function parseSentrySpanArguments(options) {
const initialCtx = {
isStandalone: (options.experimental || {}).standalone,
...options
};
if (options.startTime) {
const ctx = { ...initialCtx };
ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);
delete ctx.startTime;
return ctx;
}
return initialCtx;
}
function getAcs() {
return getAsyncContextStrategy(getMainCarrier());
}
function _startRootSpan(spanArguments, scope, parentSampled) {
const client = getClient();
const options = client?.getOptions() || {};
const { name: name$2 = "" } = spanArguments;
const mutableSpanSamplingData = {
spanAttributes: { ...spanArguments.attributes },
spanName: name$2,
parentSampled
};
client?.emit("beforeSampling", mutableSpanSamplingData, { decision: false });
const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;
const finalAttributes = mutableSpanSamplingData.spanAttributes;
const currentPropagationContext = scope.getPropagationContext();
const [sampled, sampleRate, localSampleRateWasApplied] = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? [false] : sampleSpan(options, {
name: name$2,
parentSampled: finalParentSampled,
attributes: finalAttributes,
parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate)
}, currentPropagationContext.sampleRand);
const rootSpan = new SentrySpan({
...spanArguments,
attributes: {
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "custom",
[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: sampleRate !== void 0 && localSampleRateWasApplied ? sampleRate : void 0,
...finalAttributes
},
sampled
});
if (!sampled && client) {
DEBUG_BUILD$3 && debug.log("[Tracing] Discarding root span because its trace was not chosen to be sampled.");
client.recordDroppedEvent("sample_rate", "transaction");
}
if (client) client.emit("spanStart", rootSpan);
return rootSpan;
}
function _startChildSpan(parentSpan, scope, spanArguments) {
const { spanId, traceId } = parentSpan.spanContext();
const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);
const childSpan = sampled ? new SentrySpan({
...spanArguments,
parentSpanId: spanId,
traceId,
sampled
}) : new SentryNonRecordingSpan({ traceId });
addChildSpanToSpan(parentSpan, childSpan);
const client = getClient();
if (client) {
client.emit("spanStart", childSpan);
if (spanArguments.endTimestamp) client.emit("spanEnd", childSpan);
}
return childSpan;
}
function getParentSpan(scope, customParentSpan) {
if (customParentSpan) return customParentSpan;
if (customParentSpan === null) return;
const span = _getSpanForScope(scope);
if (!span) return;
const client = getClient();
if ((client ? client.getOptions() : {}).parentSpanIsAlwaysRootSpan) return getRootSpan(span);
return span;
}
var SENTRY_API_VERSION = "7";
function getBaseApiEndpoint(dsn) {
const protocol = dsn.protocol ? `${dsn.protocol}:` : "";
const port = dsn.port ? `:${dsn.port}` : "";
return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ""}/api/`;
}
function _getIngestEndpoint(dsn) {
return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;
}
function _encodedAuth(dsn, sdkInfo) {
const params = { sentry_version: SENTRY_API_VERSION };
if (dsn.publicKey) params.sentry_key = dsn.publicKey;
if (sdkInfo) params.sentry_client = `${sdkInfo.name}/${sdkInfo.version}`;
return new URLSearchParams(params).toString();
}
function getEnvelopeEndpointWithUrlEncodedAuth(dsn, tunnel, sdkInfo) {
return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;
}
var installedIntegrations = [];
function filterDuplicates(integrations) {
const integrationsByName = {};
integrations.forEach((currentInstance) => {
const { name: name$2 } = currentInstance;
const existingInstance = integrationsByName[name$2];
if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) return;
integrationsByName[name$2] = currentInstance;
});
return Object.values(integrationsByName);
}
function getIntegrationsToSetup(options) {
const defaultIntegrations = options.defaultIntegrations || [];
const userIntegrations = options.integrations;
defaultIntegrations.forEach((integration) => {
integration.isDefaultInstance = true;
});
let integrations;
if (Array.isArray(userIntegrations)) integrations = [...defaultIntegrations, ...userIntegrations];
else if (typeof userIntegrations === "function") {
const resolvedUserIntegrations = userIntegrations(defaultIntegrations);
integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [resolvedUserIntegrations];
} else integrations = defaultIntegrations;
return filterDuplicates(integrations);
}
function setupIntegrations(client, integrations) {
const integrationIndex = {};
integrations.forEach((integration) => {
if (integration) setupIntegration(client, integration, integrationIndex);
});
return integrationIndex;
}
function afterSetupIntegrations(client, integrations) {
for (const integration of integrations) if (integration?.afterAllSetup) integration.afterAllSetup(client);
}
function setupIntegration(client, integration, integrationIndex) {
if (integrationIndex[integration.name]) {
DEBUG_BUILD$3 && debug.log(`Integration skipped because it was already installed: ${integration.name}`);
return;
}
integrationIndex[integration.name] = integration;
if (installedIntegrations.indexOf(integration.name) === -1 && typeof integration.setupOnce === "function") {
integration.setupOnce();
installedIntegrations.push(integration.name);
}
if (integration.setup && typeof integration.setup === "function") integration.setup(client);
if (typeof integration.preprocessEvent === "function") {
const callback = integration.preprocessEvent.bind(integration);
client.on("preprocessEvent", (event, hint$1) => callback(event, hint$1, client));
}
if (typeof integration.processEvent === "function") {
const callback = integration.processEvent.bind(integration);
const processor = Object.assign((event, hint$1) => callback(event, hint$1, client), { id: integration.name });
client.addEventProcessor(processor);
}
DEBUG_BUILD$3 && debug.log(`Integration installed: ${integration.name}`);
}
function defineIntegration(fn$1) {
return fn$1;
}
function createClientReportEnvelope(discarded_events, dsn, timestamp) {
const clientReportItem = [{ type: "client_report" }, {
timestamp: timestamp || dateTimestampInSeconds(),
discarded_events
}];
return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]);
}
function getPossibleEventMessages(event) {
const possibleMessages = [];
if (event.message) possibleMessages.push(event.message);
try {
const lastException = event.exception.values[event.exception.values.length - 1];
if (lastException?.value) {
possibleMessages.push(lastException.value);
if (lastException.type) possibleMessages.push(`${lastException.type}: ${lastException.value}`);
}
} catch {}
return possibleMessages;
}
function convertTransactionEventToSpanJson(event) {
const { trace_id, parent_span_id, span_id, status, origin, data, op } = event.contexts?.trace ?? {};
return {
data: data ?? {},
description: event.transaction,
op,
parent_span_id,
span_id: span_id ?? "",
start_timestamp: event.start_timestamp ?? 0,
status,
timestamp: event.timestamp,
trace_id: trace_id ?? "",
origin,
profile_id: data?.[SEMANTIC_ATTRIBUTE_PROFILE_ID],
exclusive_time: data?.[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME],
measurements: event.measurements,
is_segment: true
};
}
function convertSpanJsonToTransactionEvent(span) {
return {
type: "transaction",
timestamp: span.timestamp,
start_timestamp: span.start_timestamp,
transaction: span.description,
contexts: { trace: {
trace_id: span.trace_id,
span_id: span.span_id,
parent_span_id: span.parent_span_id,
op: span.op,
status: span.status,
origin: span.origin,
data: {
...span.data,
...span.profile_id && { ["sentry.profile_id"]: span.profile_id },
...span.exclusive_time && { ["sentry.exclusive_time"]: span.exclusive_time }
}
} },
measurements: span.measurements
};
}
var ALREADY_SEEN_ERROR = "Not capturing exception because it's already been captured.";
var MISSING_RELEASE_FOR_SESSION_ERROR = "Discarded session because of missing or non-string release";
var INTERNAL_ERROR_SYMBOL = Symbol.for("SentryInternalError");
var DO_NOT_SEND_EVENT_SYMBOL = Symbol.for("SentryDoNotSendEventError");
function _makeInternalError(message$1) {
return {
message: message$1,
[INTERNAL_ERROR_SYMBOL]: true
};
}
function _makeDoNotSendEventError(message$1) {
return {
message: message$1,
[DO_NOT_SEND_EVENT_SYMBOL]: true
};
}
function _isInternalError(error$2) {
return !!error$2 && typeof error$2 === "object" && INTERNAL_ERROR_SYMBOL in error$2;
}
function _isDoNotSendEventError(error$2) {
return !!error$2 && typeof error$2 === "object" && DO_NOT_SEND_EVENT_SYMBOL in error$2;
}
var Client = class {
constructor(options) {
this._options = options;
this._integrations = {};
this._numProcessing = 0;
this._outcomes = {};
this._hooks = {};
this._eventProcessors = [];
if (options.dsn) this._dsn = makeDsn(options.dsn);
else DEBUG_BUILD$3 && debug.warn("No DSN provided, client will not send events.");
if (this._dsn) {
const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, options.tunnel, options._metadata ? options._metadata.sdk : void 0);
this._transport = options.transport({
tunnel: this._options.tunnel,
recordDroppedEvent: this.recordDroppedEvent.bind(this),
...options.transportOptions,
url
});
}
}
captureException(exception, hint$1, scope) {
const eventId = uuid4();
if (checkOrSetAlreadyCaught(exception)) {
DEBUG_BUILD$3 && debug.log(ALREADY_SEEN_ERROR);
return eventId;
}
const hintWithEventId = {
event_id: eventId,
...hint$1
};
this._process(this.eventFromException(exception, hintWithEventId).then((event) => this._captureEvent(event, hintWithEventId, scope)));
return hintWithEventId.event_id;
}
captureMessage(message$1, level, hint$1, currentScope) {
const hintWithEventId = {
event_id: uuid4(),
...hint$1
};
const eventMessage = isParameterizedString(message$1) ? message$1 : String(message$1);
const promisedEvent = isPrimitive(message$1) ? this.eventFromMessage(eventMessage, level, hintWithEventId) : this.eventFromException(message$1, hintWithEventId);
this._process(promisedEvent.then((event) => this._captureEvent(event, hintWithEventId, currentScope)));
return hintWithEventId.event_id;
}
captureEvent(event, hint$1, currentScope) {
const eventId = uuid4();
if (hint$1?.originalException && checkOrSetAlreadyCaught(hint$1.originalException)) {
DEBUG_BUILD$3 && debug.log(ALREADY_SEEN_ERROR);
return eventId;
}
const hintWithEventId = {
event_id: eventId,
...hint$1
};
const sdkProcessingMetadata = event.sdkProcessingMetadata || {};
const capturedSpanScope = sdkProcessingMetadata.capturedSpanScope;
const capturedSpanIsolationScope = sdkProcessingMetadata.capturedSpanIsolationScope;
this._process(this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope, capturedSpanIsolationScope));
return hintWithEventId.event_id;
}
captureSession(session) {
this.sendSession(session);
updateSession(session, { init: false });
}
getDsn() {
return this._dsn;
}
getOptions() {
return this._options;
}
getSdkMetadata() {
return this._options._metadata;
}
getTransport() {
return this._transport;
}
flush(timeout) {
const transport = this._transport;
if (transport) {
this.emit("flush");
return this._isClientDoneProcessing(timeout).then((clientFinished) => {
return transport.flush(timeout).then((transportFlushed) => clientFinished && transportFlushed);
});
} else return resolvedSyncPromise(true);
}
close(timeout) {
return this.flush(timeout).then((result) => {
this.getOptions().enabled = false;
this.emit("close");
return result;
});
}
getEventProcessors() {
return this._eventProcessors;
}
addEventProcessor(eventProcessor) {
this._eventProcessors.push(eventProcessor);
}
init() {
if (this._isEnabled() || this._options.integrations.some(({ name: name$2 }) => name$2.startsWith("Spotlight"))) this._setupIntegrations();
}
getIntegrationByName(integrationName) {
return this._integrations[integrationName];
}
addIntegration(integration) {
const isAlreadyInstalled = this._integrations[integration.name];
setupIntegration(this, integration, this._integrations);
if (!isAlreadyInstalled) afterSetupIntegrations(this, [integration]);
}
sendEvent(event, hint$1 = {}) {
this.emit("beforeSendEvent", event, hint$1);
let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
for (const attachment of hint$1.attachments || []) env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));
const promise = this.sendEnvelope(env);
if (promise) promise.then((sendResponse) => this.emit("afterSendEvent", event, sendResponse), null);
}
sendSession(session) {
const { release: clientReleaseOption, environment: clientEnvironmentOption = DEFAULT_ENVIRONMENT } = this._options;
if ("aggregates" in session) {
const sessionAttrs = session.attrs || {};
if (!sessionAttrs.release && !clientReleaseOption) {
DEBUG_BUILD$3 && debug.warn(MISSING_RELEASE_FOR_SESSION_ERROR);
return;
}
sessionAttrs.release = sessionAttrs.release || clientReleaseOption;
sessionAttrs.environment = sessionAttrs.environment || clientEnvironmentOption;
session.attrs = sessionAttrs;
} else {
if (!session.release && !clientReleaseOption) {
DEBUG_BUILD$3 && debug.warn(MISSING_RELEASE_FOR_SESSION_ERROR);
return;
}
session.release = session.release || clientReleaseOption;
session.environment = session.environment || clientEnvironmentOption;
}
this.emit("beforeSendSession", session);
const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);
this.sendEnvelope(env);
}
recordDroppedEvent(reason, category, count = 1) {
if (this._options.sendClientReports) {
const key = `${reason}:${category}`;
DEBUG_BUILD$3 && debug.log(`Recording outcome: "${key}"${count > 1 ? ` (${count} times)` : ""}`);
this._outcomes[key] = (this._outcomes[key] || 0) + count;
}
}
on(hook, callback) {
const hooks = this._hooks[hook] = this._hooks[hook] || [];
hooks.push(callback);
return () => {
const cbIndex = hooks.indexOf(callback);
if (cbIndex > -1) hooks.splice(cbIndex, 1);
};
}
emit(hook, ...rest) {
const callbacks = this._hooks[hook];
if (callbacks) callbacks.forEach((callback) => callback(...rest));
}
sendEnvelope(envelope) {
this.emit("beforeEnvelope", envelope);
if (this._isEnabled() && this._transport) return this._transport.send(envelope).then(null, (reason) => {
DEBUG_BUILD$3 && debug.error("Error while sending envelope:", reason);
return reason;
});
DEBUG_BUILD$3 && debug.error("Transport disabled");
return resolvedSyncPromise({});
}
_setupIntegrations() {
const { integrations } = this._options;
this._integrations = setupIntegrations(this, integrations);
afterSetupIntegrations(this, integrations);
}
_updateSessionFromEvent(session, event) {
let crashed = event.level === "fatal";
let errored = false;
const exceptions = event.exception?.values;
if (exceptions) {
errored = true;
for (const ex of exceptions) if (ex.mechanism?.handled === false) {
crashed = true;
break;
}
}
const sessionNonTerminal = session.status === "ok";
if (sessionNonTerminal && session.errors === 0 || sessionNonTerminal && crashed) {
updateSession(session, {
...crashed && { status: "crashed" },
errors: session.errors || Number(errored || crashed)
});
this.captureSession(session);
}
}
_isClientDoneProcessing(timeout) {
return new SyncPromise((resolve$1) => {
let ticked = 0;
const tick = 1;
const interval = setInterval(() => {
if (this._numProcessing == 0) {
clearInterval(interval);
resolve$1(true);
} else {
ticked += tick;
if (timeout && ticked >= timeout) {
clearInterval(interval);
resolve$1(false);
}
}
}, tick);
});
}
_isEnabled() {
return this.getOptions().enabled !== false && this._transport !== void 0;
}
_prepareEvent(event, hint$1, currentScope, isolationScope) {
const options = this.getOptions();
const integrations = Object.keys(this._integrations);
if (!hint$1.integrations && integrations?.length) hint$1.integrations = integrations;
this.emit("preprocessEvent", event, hint$1);
if (!event.type) isolationScope.setLastEventId(event.event_id || hint$1.event_id);
return prepareEvent(options, event, hint$1, currentScope, this, isolationScope).then((evt) => {
if (evt === null) return evt;
this.emit("postprocessEvent", evt, hint$1);
evt.contexts = {
trace: getTraceContextFromScope(currentScope),
...evt.contexts
};
evt.sdkProcessingMetadata = {
dynamicSamplingContext: getDynamicSamplingContextFromScope(this, currentScope),
...evt.sdkProcessingMetadata
};
return evt;
});
}
_captureEvent(event, hint$1 = {}, currentScope = getCurrentScope(), isolationScope = getIsolationScope()) {
if (DEBUG_BUILD$3 && isErrorEvent$1(event)) debug.log(`Captured error event \`${getPossibleEventMessages(event)[0] || "<unknown>"}\``);
return this._processEvent(event, hint$1, currentScope, isolationScope).then((finalEvent) => {
return finalEvent.event_id;
}, (reason) => {
if (DEBUG_BUILD$3) if (_isDoNotSendEventError(reason)) debug.log(reason.message);
else if (_isInternalError(reason)) debug.warn(reason.message);
else debug.warn(reason);
});
}
_processEvent(event, hint$1, currentScope, isolationScope) {
const options = this.getOptions();
const { sampleRate } = options;
const isTransaction = isTransactionEvent(event);
const isError$1 = isErrorEvent$1(event);
const eventType = event.type || "error";
const beforeSendLabel = `before send for type \`${eventType}\``;
const parsedSampleRate = typeof sampleRate === "undefined" ? void 0 : parseSampleRate(sampleRate);
if (isError$1 && typeof parsedSampleRate === "number" && Math.random() > parsedSampleRate) {
this.recordDroppedEvent("sample_rate", "error");
return rejectedSyncPromise(_makeDoNotSendEventError(`Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`));
}
const dataCategory = eventType === "replay_event" ? "replay" : eventType;
return this._prepareEvent(event, hint$1, currentScope, isolationScope).then((prepared) => {
if (prepared === null) {
this.recordDroppedEvent("event_processor", dataCategory);
throw _makeDoNotSendEventError("An event processor returned `null`, will not send event.");
}
if (hint$1.data && hint$1.data.__sentry__ === true) return prepared;
return _validateBeforeSendResult(processBeforeSend(this, options, prepared, hint$1), beforeSendLabel);
}).then((processedEvent) => {
if (processedEvent === null) {
this.recordDroppedEvent("before_send", dataCategory);
if (isTransaction) {
const spanCount = 1 + (event.spans || []).length;
this.recordDroppedEvent("before_send", "span", spanCount);
}
throw _makeDoNotSendEventError(`${beforeSendLabel} returned \`null\`, will not send event.`);
}
const session = currentScope.getSession() || isolationScope.getSession();
if (isError$1 && session) this._updateSessionFromEvent(session, processedEvent);
if (isTransaction) {
const droppedSpanCount = (processedEvent.sdkProcessingMetadata?.spanCountBeforeProcessing || 0) - (processedEvent.spans ? processedEvent.spans.length : 0);
if (droppedSpanCount > 0) this.recordDroppedEvent("before_send", "span", droppedSpanCount);
}
const transactionInfo = processedEvent.transaction_info;
if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {
const source = "custom";
processedEvent.transaction_info = {
...transactionInfo,
source
};
}
this.sendEvent(processedEvent, hint$1);
return processedEvent;
}).then(null, (reason) => {
if (_isDoNotSendEventError(reason) || _isInternalError(reason)) throw reason;
this.captureException(reason, {
data: { __sentry__: true },
originalException: reason
});
throw _makeInternalError(`Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ${reason}`);
});
}
_process(promise) {
this._numProcessing++;
promise.then((value) => {
this._numProcessing--;
return value;
}, (reason) => {
this._numProcessing--;
return reason;
});
}
_clearOutcomes() {
const outcomes = this._outcomes;
this._outcomes = {};
return Object.entries(outcomes).map(([key, quantity]) => {
const [reason, category] = key.split(":");
return {
reason,
category,
quantity
};
});
}
_flushOutcomes() {
DEBUG_BUILD$3 && debug.log("Flushing outcomes...");
const outcomes = this._clearOutcomes();
if (outcomes.length === 0) {
DEBUG_BUILD$3 && debug.log("No outcomes to send");
return;
}
if (!this._dsn) {
DEBUG_BUILD$3 && debug.log("No dsn provided, will not send outcomes");
return;
}
DEBUG_BUILD$3 && debug.log("Sending outcomes:", outcomes);
const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));
this.sendEnvelope(envelope);
}
};
function _validateBeforeSendResult(beforeSendResult, beforeSendLabel) {
const invalidValueError = `${beforeSendLabel} must return \`null\` or a valid event.`;
if (isThenable(beforeSendResult)) return beforeSendResult.then((event) => {
if (!isPlainObject(event) && event !== null) throw _makeInternalError(invalidValueError);
return event;
}, (e) => {
throw _makeInternalError(`${beforeSendLabel} rejected with ${e}`);
});
else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) throw _makeInternalError(invalidValueError);
return beforeSendResult;
}
function processBeforeSend(client, options, event, hint$1) {
const { beforeSend: beforeSend$1, beforeSendTransaction, beforeSendSpan } = options;
let processedEvent = event;
if (isErrorEvent$1(processedEvent) && beforeSend$1) return beforeSend$1(processedEvent, hint$1);
if (isTransactionEvent(processedEvent)) {
if (beforeSendSpan) {
const processedRootSpanJson = beforeSendSpan(convertTransactionEventToSpanJson(processedEvent));
if (!processedRootSpanJson) showSpanDropWarning();
else processedEvent = merge(event, convertSpanJsonToTransactionEvent(processedRootSpanJson));
if (processedEvent.spans) {
const processedSpans = [];
for (const span of processedEvent.spans) {
const processedSpan = beforeSendSpan(span);
if (!processedSpan) {
showSpanDropWarning();
processedSpans.push(span);
} else processedSpans.push(processedSpan);
}
processedEvent.spans = processedSpans;
}
}
if (beforeSendTransaction) {
if (processedEvent.spans) {
const spanCountBefore = processedEvent.spans.length;
processedEvent.sdkProcessingMetadata = {
...event.sdkProcessingMetadata,
spanCountBeforeProcessing: spanCountBefore
};
}
return beforeSendTransaction(processedEvent, hint$1);
}
}
return processedEvent;
}
function isErrorEvent$1(event) {
return event.type === void 0;
}
function isTransactionEvent(event) {
return event.type === "transaction";
}
function createLogContainerEnvelopeItem(items) {
return [{
type: "log",
item_count: items.length,
content_type: "application/vnd.sentry.items.log+json"
}, { items }];
}
function createLogEnvelope(logs, metadata, tunnel, dsn) {
const headers = {};
if (metadata?.sdk) headers.sdk = {
name: metadata.sdk.name,
version: metadata.sdk.version
};
if (!!tunnel && !!dsn) headers.dsn = dsnToString(dsn);
return createEnvelope(headers, [createLogContainerEnvelopeItem(logs)]);
}
function _INTERNAL_flushLogsBuffer(client, maybeLogBuffer) {
const logBuffer = maybeLogBuffer ?? _INTERNAL_getLogBuffer(client) ?? [];
if (logBuffer.length === 0) return;
const clientOptions = client.getOptions();
const envelope = createLogEnvelope(logBuffer, clientOptions._metadata, clientOptions.tunnel, client.getDsn());
_getBufferMap().set(client, []);
client.emit("flushLogs");
client.sendEnvelope(envelope);
}
function _INTERNAL_getLogBuffer(client) {
return _getBufferMap().get(client);
}
function _getBufferMap() {
return getGlobalSingleton("clientToLogBufferMap", () => /* @__PURE__ */ new WeakMap());
}
function initAndBind(clientClass, options) {
if (options.debug === true) if (DEBUG_BUILD$3) debug.enable();
else consoleSandbox(() => {
console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.");
});
getCurrentScope().update(options.initialScope);
const client = new clientClass(options);
setCurrentClient(client);
client.init();
return client;
}
function setCurrentClient(client) {
getCurrentScope().setClient(client);
}
var SENTRY_BUFFER_FULL_ERROR = Symbol.for("SentryBufferFullError");
function makePromiseBuffer(limit) {
const buffer = [];
function isReady() {
return limit === void 0 || buffer.length < limit;
}
function remove(task) {
return buffer.splice(buffer.indexOf(task), 1)[0] || Promise.resolve(void 0);
}
function add(taskProducer) {
if (!isReady()) return rejectedSyncPromise(SENTRY_BUFFER_FULL_ERROR);
const task = taskProducer();
if (buffer.indexOf(task) === -1) buffer.push(task);
task.then(() => remove(task)).then(null, () => remove(task).then(null, () => {}));
return task;
}
function drain(timeout) {
return new SyncPromise((resolve$1, reject) => {
let counter = buffer.length;
if (!counter) return resolve$1(true);
const capturedSetTimeout = setTimeout(() => {
if (timeout && timeout > 0) resolve$1(false);
}, timeout);
buffer.forEach((item$2) => {
resolvedSyncPromise(item$2).then(() => {
if (!--counter) {
clearTimeout(capturedSetTimeout);
resolve$1(true);
}
}, reject);
});
});
}
return {
$: buffer,
add,
drain
};
}
var DEFAULT_RETRY_AFTER = 60 * 1e3;
function parseRetryAfterHeader(header$12, now = Date.now()) {
const headerDelay = parseInt(`${header$12}`, 10);
if (!isNaN(headerDelay)) return headerDelay * 1e3;
const headerDate = Date.parse(`${header$12}`);
if (!isNaN(headerDate)) return headerDate - now;
return DEFAULT_RETRY_AFTER;
}
function disabledUntil(limits, dataCategory) {
return limits[dataCategory] || limits.all || 0;
}
function isRateLimited(limits, dataCategory, now = Date.now()) {
return disabledUntil(limits, dataCategory) > now;
}
function updateRateLimits(limits, { statusCode, headers }, now = Date.now()) {
const updatedRateLimits = { ...limits };
const rateLimitHeader = headers?.["x-sentry-rate-limits"];
const retryAfterHeader = headers?.["retry-after"];
if (rateLimitHeader) for (const limit of rateLimitHeader.trim().split(",")) {
const [retryAfter, categories, , , namespaces] = limit.split(":", 5);
const headerDelay = parseInt(retryAfter, 10);
const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1e3;
if (!categories) updatedRateLimits.all = now + delay;
else for (const category of categories.split(";")) if (category === "metric_bucket") {
if (!namespaces || namespaces.split(";").includes("custom")) updatedRateLimits[category] = now + delay;
} else updatedRateLimits[category] = now + delay;
}
else if (retryAfterHeader) updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);
else if (statusCode === 429) updatedRateLimits.all = now + 60 * 1e3;
return updatedRateLimits;
}
function createTransport(options, makeRequest, buffer = makePromiseBuffer(options.bufferSize || 64)) {
let rateLimits = {};
const flush = (timeout) => buffer.drain(timeout);
function send(envelope) {
const filteredEnvelopeItems = [];
forEachEnvelopeItem(envelope, (item$2, type) => {
const dataCategory = envelopeItemTypeToDataCategory(type);
if (isRateLimited(rateLimits, dataCategory)) options.recordDroppedEvent("ratelimit_backoff", dataCategory);
else filteredEnvelopeItems.push(item$2);
});
if (filteredEnvelopeItems.length === 0) return resolvedSyncPromise({});
const filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems);
const recordEnvelopeLoss = (reason) => {
forEachEnvelopeItem(filteredEnvelope, (item$2, type) => {
options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type));
});
};
const requestTask = () => makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then((response) => {
if (response.statusCode !== void 0 && (response.statusCode < 200 || response.statusCode >= 300)) DEBUG_BUILD$3 && debug.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);
rateLimits = updateRateLimits(rateLimits, response);
return response;
}, (error$2) => {
recordEnvelopeLoss("network_error");
DEBUG_BUILD$3 && debug.error("Encountered error running transport request:", error$2);
throw error$2;
});
return buffer.add(requestTask).then((result) => result, (error$2) => {
if (error$2 === SENTRY_BUFFER_FULL_ERROR) {
DEBUG_BUILD$3 && debug.error("Skipped sending event because buffer is full.");
recordEnvelopeLoss("queue_overflow");
return resolvedSyncPromise({});
} else throw error$2;
});
}
return {
send,
flush
};
}
function addAutoIpAddressToUser(objWithMaybeUser) {
if (objWithMaybeUser.user?.ip_address === void 0) objWithMaybeUser.user = {
...objWithMaybeUser.user,
ip_address: "{{auto}}"
};
}
function addAutoIpAddressToSession(session) {
if ("aggregates" in session) {
if (session.attrs?.["ip_address"] === void 0) session.attrs = {
...session.attrs,
ip_address: "{{auto}}"
};
} else if (session.ipAddress === void 0) session.ipAddress = "{{auto}}";
}
function applySdkMetadata(options, name$2, names = [name$2], source = "npm") {
const metadata = options._metadata || {};
if (!metadata.sdk) metadata.sdk = {
name: `sentry.javascript.${name$2}`,
packages: names.map((name$3) => ({
name: `${source}:@sentry/${name$3}`,
version: SDK_VERSION
})),
version: SDK_VERSION
};
options._metadata = metadata;
}
var DEFAULT_BREADCRUMBS = 100;
function addBreadcrumb(breadcrumb, hint$1) {
const client = getClient();
const isolationScope = getIsolationScope();
if (!client) return;
const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = client.getOptions();
if (maxBreadcrumbs <= 0) return;
const mergedBreadcrumb = {
timestamp: dateTimestampInSeconds(),
...breadcrumb
};
const finalBreadcrumb = beforeBreadcrumb ? consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint$1)) : mergedBreadcrumb;
if (finalBreadcrumb === null) return;
if (client.emit) client.emit("beforeAddBreadcrumb", finalBreadcrumb, hint$1);
isolationScope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);
}
var originalFunctionToString;
var INTEGRATION_NAME$9 = "FunctionToString";
var SETUP_CLIENTS = /* @__PURE__ */ new WeakMap();
var _functionToStringIntegration = (() => {
return {
name: INTEGRATION_NAME$9,
setupOnce() {
originalFunctionToString = Function.prototype.toString;
try {
Function.prototype.toString = function(...args) {
const originalFunction = getOriginalFunction(this);
const context = SETUP_CLIENTS.has(getClient()) && originalFunction !== void 0 ? originalFunction : this;
return originalFunctionToString.apply(context, args);
};
} catch {}
},
setup(client) {
SETUP_CLIENTS.set(client, true);
}
};
});
var functionToStringIntegration = defineIntegration(_functionToStringIntegration);
var DEFAULT_IGNORE_ERRORS = [
/^Script error\.?$/,
/^Javascript error: Script error\.? on line 0$/,
/^ResizeObserver loop completed with undelivered notifications.$/,
/^Cannot redefine property: googletag$/,
/^Can't find variable: gmo$/,
/^undefined is not an object \(evaluating 'a\.[A-Z]'\)$/,
"can't redefine non-configurable property \"solana\"",
"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)",
"Can't find variable: _AutofillCallbackHandler",
/^Non-Error promise rejection captured with value: Object Not Found Matching Id:\d+, MethodName:simulateEvent, ParamCount:\d+$/,
/^Java exception was raised during method invocation$/
];
var INTEGRATION_NAME$8 = "EventFilters";
var eventFiltersIntegration = defineIntegration((options = {}) => {
let mergedOptions;
return {
name: INTEGRATION_NAME$8,
setup(client) {
mergedOptions = _mergeOptions(options, client.getOptions());
},
processEvent(event, _hint, client) {
if (!mergedOptions) mergedOptions = _mergeOptions(options, client.getOptions());
return _shouldDropEvent$1(event, mergedOptions) ? null : event;
}
};
});
var inboundFiltersIntegration = defineIntegration(((options = {}) => {
return {
...eventFiltersIntegration(options),
name: "InboundFilters"
};
}));
function _mergeOptions(internalOptions = {}, clientOptions = {}) {
return {
allowUrls: [...internalOptions.allowUrls || [], ...clientOptions.allowUrls || []],
denyUrls: [...internalOptions.denyUrls || [], ...clientOptions.denyUrls || []],
ignoreErrors: [
...internalOptions.ignoreErrors || [],
...clientOptions.ignoreErrors || [],
...internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS
],
ignoreTransactions: [...internalOptions.ignoreTransactions || [], ...clientOptions.ignoreTransactions || []]
};
}
function _shouldDropEvent$1(event, options) {
if (!event.type) {
if (_isIgnoredError(event, options.ignoreErrors)) {
DEBUG_BUILD$3 && debug.warn(`Event dropped due to being matched by \`ignoreErrors\` option.\nEvent: ${getEventDescription(event)}`);
return true;
}
if (_isUselessError(event)) {
DEBUG_BUILD$3 && debug.warn(`Event dropped due to not having an error message, error type or stacktrace.\nEvent: ${getEventDescription(event)}`);
return true;
}
if (_isDeniedUrl(event, options.denyUrls)) {
DEBUG_BUILD$3 && debug.warn(`Event dropped due to being matched by \`denyUrls\` option.\nEvent: ${getEventDescription(event)}.\nUrl: ${_getEventFilterUrl(event)}`);
return true;
}
if (!_isAllowedUrl(event, options.allowUrls)) {
DEBUG_BUILD$3 && debug.warn(`Event dropped due to not being matched by \`allowUrls\` option.\nEvent: ${getEventDescription(event)}.\nUrl: ${_getEventFilterUrl(event)}`);
return true;
}
} else if (event.type === "transaction") {
if (_isIgnoredTransaction(event, options.ignoreTransactions)) {
DEBUG_BUILD$3 && debug.warn(`Event dropped due to being matched by \`ignoreTransactions\` option.\nEvent: ${getEventDescription(event)}`);
return true;
}
}
return false;
}
function _isIgnoredError(event, ignoreErrors) {
if (!ignoreErrors?.length) return false;
return getPossibleEventMessages(event).some((message$1) => stringMatchesSomePattern(message$1, ignoreErrors));
}
function _isIgnoredTransaction(event, ignoreTransactions) {
if (!ignoreTransactions?.length) return false;
const name$2 = event.transaction;
return name$2 ? stringMatchesSomePattern(name$2, ignoreTransactions) : false;
}
function _isDeniedUrl(event, denyUrls) {
if (!denyUrls?.length) return false;
const url = _getEventFilterUrl(event);
return !url ? false : stringMatchesSomePattern(url, denyUrls);
}
function _isAllowedUrl(event, allowUrls) {
if (!allowUrls?.length) return true;
const url = _getEventFilterUrl(event);
return !url ? true : stringMatchesSomePattern(url, allowUrls);
}
function _getLastValidUrl(frames = []) {
for (let i$1 = frames.length - 1; i$1 >= 0; i$1--) {
const frame = frames[i$1];
if (frame && frame.filename !== "<anonymous>" && frame.filename !== "[native code]") return frame.filename || null;
}
return null;
}
function _getEventFilterUrl(event) {
try {
const frames = [...event.exception?.values ?? []].reverse().find((value) => value.mechanism?.parent_id === void 0 && value.stacktrace?.frames?.length)?.stacktrace?.frames;
return frames ? _getLastValidUrl(frames) : null;
} catch {
DEBUG_BUILD$3 && debug.error(`Cannot extract url for event ${getEventDescription(event)}`);
return null;
}
}
function _isUselessError(event) {
if (!event.exception?.values?.length) return false;
return !event.message && !event.exception.values.some((value) => value.stacktrace || value.type && value.type !== "Error" || value.value);
}
function applyAggregateErrorsToEvent(exceptionFromErrorImplementation, parser, key, limit, event, hint$1) {
if (!event.exception?.values || !hint$1 || !isInstanceOf(hint$1.originalException, Error)) return;
const originalException = event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : void 0;
if (originalException) event.exception.values = aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, hint$1.originalException, key, event.exception.values, originalException, 0);
}
function aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, error$2, key, prevExceptions, exception, exceptionId) {
if (prevExceptions.length >= limit + 1) return prevExceptions;
let newExceptions = [...prevExceptions];
if (isInstanceOf(error$2[key], Error)) {
applyExceptionGroupFieldsForParentException(exception, exceptionId);
const newException = exceptionFromErrorImplementation(parser, error$2[key]);
const newExceptionId = newExceptions.length;
applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId);
newExceptions = aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, error$2[key], key, [newException, ...newExceptions], newException, newExceptionId);
}
if (Array.isArray(error$2.errors)) error$2.errors.forEach((childError, i$1) => {
if (isInstanceOf(childError, Error)) {
applyExceptionGroupFieldsForParentException(exception, exceptionId);
const newException = exceptionFromErrorImplementation(parser, childError);
const newExceptionId = newExceptions.length;
applyExceptionGroupFieldsForChildException(newException, `errors[${i$1}]`, newExceptionId, exceptionId);
newExceptions = aggregateExceptionsFromError(exceptionFromErrorImplementation, parser, limit, childError, key, [newException, ...newExceptions], newException, newExceptionId);
}
});
return newExceptions;
}
function applyExceptionGroupFieldsForParentException(exception, exceptionId) {
exception.mechanism = exception.mechanism || {
type: "generic",
handled: true
};
exception.mechanism = {
...exception.mechanism,
...exception.type === "AggregateError" && { is_exception_group: true },
exception_id: exceptionId
};
}
function applyExceptionGroupFieldsForChildException(exception, source, exceptionId, parentId) {
exception.mechanism = exception.mechanism || {
type: "generic",
handled: true
};
exception.mechanism = {
...exception.mechanism,
type: "chained",
source,
exception_id: exceptionId,
parent_id: parentId
};
}
function addConsoleInstrumentationHandler(handler) {
const type = "console";
addHandler(type, handler);
maybeInstrument(type, instrumentConsole);
}
function instrumentConsole() {
if (!("console" in GLOBAL_OBJ)) return;
CONSOLE_LEVELS.forEach(function(level) {
if (!(level in GLOBAL_OBJ.console)) return;
fill(GLOBAL_OBJ.console, level, function(originalConsoleMethod) {
originalConsoleMethods[level] = originalConsoleMethod;
return function(...args) {
triggerHandlers("console", {
args,
level
});
originalConsoleMethods[level]?.apply(GLOBAL_OBJ.console, args);
};
});
});
}
function severityLevelFromString(level) {
return level === "warn" ? "warning" : [
"fatal",
"error",
"warning",
"log",
"info",
"debug"
].includes(level) ? level : "log";
}
var INTEGRATION_NAME$7 = "CaptureConsole";
var _captureConsoleIntegration = ((options = {}) => {
const levels = options.levels || CONSOLE_LEVELS;
const handled = options.handled ?? true;
return {
name: INTEGRATION_NAME$7,
setup(client) {
if (!("console" in GLOBAL_OBJ)) return;
addConsoleInstrumentationHandler(({ args, level }) => {
if (getClient() !== client || !levels.includes(level)) return;
consoleHandler(args, level, handled);
});
}
};
});
var captureConsoleIntegration = defineIntegration(_captureConsoleIntegration);
function consoleHandler(args, level, handled) {
const captureContext = {
level: severityLevelFromString(level),
extra: { arguments: args }
};
withScope((scope) => {
scope.addEventProcessor((event) => {
event.logger = "console";
addExceptionMechanism(event, {
handled,
type: "console"
});
return event;
});
if (level === "assert") {
if (!args[0]) {
const message$1 = `Assertion failed: ${safeJoin(args.slice(1), " ") || "console.assert"}`;
scope.setExtra("arguments", args.slice(1));
captureMessage(message$1, captureContext);
}
return;
}
const error$2 = args.find((arg) => arg instanceof Error);
if (error$2) {
captureException(error$2, captureContext);
return;
}
captureMessage(safeJoin(args, " "), captureContext);
});
}
var INTEGRATION_NAME$6 = "Dedupe";
var _dedupeIntegration = (() => {
let previousEvent;
return {
name: INTEGRATION_NAME$6,
processEvent(currentEvent) {
if (currentEvent.type) return currentEvent;
try {
if (_shouldDropEvent(currentEvent, previousEvent)) {
DEBUG_BUILD$3 && debug.warn("Event dropped due to being a duplicate of previously captured event.");
return null;
}
} catch {}
return previousEvent = currentEvent;
}
};
});
var dedupeIntegration = defineIntegration(_dedupeIntegration);
function _shouldDropEvent(currentEvent, previousEvent) {
if (!previousEvent) return false;
if (_isSameMessageEvent(currentEvent, previousEvent)) return true;
if (_isSameExceptionEvent(currentEvent, previousEvent)) return true;
return false;
}
function _isSameMessageEvent(currentEvent, previousEvent) {
const currentMessage = currentEvent.message;
const previousMessage = previousEvent.message;
if (!currentMessage && !previousMessage) return false;
if (currentMessage && !previousMessage || !currentMessage && previousMessage) return false;
if (currentMessage !== previousMessage) return false;
if (!_isSameFingerprint(currentEvent, previousEvent)) return false;
if (!_isSameStacktrace(currentEvent, previousEvent)) return false;
return true;
}
function _isSameExceptionEvent(currentEvent, previousEvent) {
const previousException = _getExceptionFromEvent(previousEvent);
const currentException = _getExceptionFromEvent(currentEvent);
if (!previousException || !currentException) return false;
if (previousException.type !== currentException.type || previousException.value !== currentException.value) return false;
if (!_isSameFingerprint(currentEvent, previousEvent)) return false;
if (!_isSameStacktrace(currentEvent, previousEvent)) return false;
return true;
}
function _isSameStacktrace(currentEvent, previousEvent) {
let currentFrames = getFramesFromEvent(currentEvent);
let previousFrames = getFramesFromEvent(previousEvent);
if (!currentFrames && !previousFrames) return true;
if (currentFrames && !previousFrames || !currentFrames && previousFrames) return false;
currentFrames = currentFrames;
previousFrames = previousFrames;
if (previousFrames.length !== currentFrames.length) return false;
for (let i$1 = 0; i$1 < previousFrames.length; i$1++) {
const frameA = previousFrames[i$1];
const frameB = currentFrames[i$1];
if (frameA.filename !== frameB.filename || frameA.lineno !== frameB.lineno || frameA.colno !== frameB.colno || frameA.function !== frameB.function) return false;
}
return true;
}
function _isSameFingerprint(currentEvent, previousEvent) {
let currentFingerprint = currentEvent.fingerprint;
let previousFingerprint = previousEvent.fingerprint;
if (!currentFingerprint && !previousFingerprint) return true;
if (currentFingerprint && !previousFingerprint || !currentFingerprint && previousFingerprint) return false;
currentFingerprint = currentFingerprint;
previousFingerprint = previousFingerprint;
try {
return !!(currentFingerprint.join("") === previousFingerprint.join(""));
} catch {
return false;
}
}
function _getExceptionFromEvent(event) {
return event.exception?.values?.[0];
}
function normalizeArray(parts, allowAboveRoot) {
let up = 0;
for (let i$1 = parts.length - 1; i$1 >= 0; i$1--) {
const last = parts[i$1];
if (last === ".") parts.splice(i$1, 1);
else if (last === "..") {
parts.splice(i$1, 1);
up++;
} else if (up) {
parts.splice(i$1, 1);
up--;
}
}
if (allowAboveRoot) for (; up--;) parts.unshift("..");
return parts;
}
var splitPathRe = /^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;
function splitPath(filename) {
const truncated = filename.length > 1024 ? `<truncated>${filename.slice(-1024)}` : filename;
const parts = splitPathRe.exec(truncated);
return parts ? parts.slice(1) : [];
}
function resolve(...args) {
let resolvedPath = "";
let resolvedAbsolute = false;
for (let i$1 = args.length - 1; i$1 >= -1 && !resolvedAbsolute; i$1--) {
const path = i$1 >= 0 ? args[i$1] : "/";
if (!path) continue;
resolvedPath = `${path}/${resolvedPath}`;
resolvedAbsolute = path.charAt(0) === "/";
}
resolvedPath = normalizeArray(resolvedPath.split("/").filter((p) => !!p), !resolvedAbsolute).join("/");
return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
}
function trim(arr) {
let start = 0;
for (; start < arr.length; start++) if (arr[start] !== "") break;
let end = arr.length - 1;
for (; end >= 0; end--) if (arr[end] !== "") break;
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
function relative(from, to) {
from = resolve(from).slice(1);
to = resolve(to).slice(1);
const fromParts = trim(from.split("/"));
const toParts = trim(to.split("/"));
const length = Math.min(fromParts.length, toParts.length);
let samePartsLength = length;
for (let i$1 = 0; i$1 < length; i$1++) if (fromParts[i$1] !== toParts[i$1]) {
samePartsLength = i$1;
break;
}
let outputParts = [];
for (let i$1 = samePartsLength; i$1 < fromParts.length; i$1++) outputParts.push("..");
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join("/");
}
function basename(path, ext) {
let f = splitPath(path)[2] || "";
if (ext && f.slice(ext.length * -1) === ext) f = f.slice(0, f.length - ext.length);
return f;
}
var INTEGRATION_NAME$5 = "RewriteFrames";
var rewriteFramesIntegration = defineIntegration((options = {}) => {
const root = options.root;
const prefix = options.prefix || "app:///";
const isBrowser = "window" in GLOBAL_OBJ && !!GLOBAL_OBJ.window;
const iteratee = options.iteratee || generateIteratee({
isBrowser,
root,
prefix
});
function _processExceptionsEvent(event) {
try {
return {
...event,
exception: {
...event.exception,
values: event.exception.values.map((value) => ({
...value,
...value.stacktrace && { stacktrace: _processStacktrace(value.stacktrace) }
}))
}
};
} catch {
return event;
}
}
function _processStacktrace(stacktrace) {
return {
...stacktrace,
frames: stacktrace?.frames?.map((f) => iteratee(f))
};
}
return {
name: INTEGRATION_NAME$5,
processEvent(originalEvent) {
let processedEvent = originalEvent;
if (originalEvent.exception && Array.isArray(originalEvent.exception.values)) processedEvent = _processExceptionsEvent(processedEvent);
return processedEvent;
}
};
});
function generateIteratee({ isBrowser, root, prefix }) {
return (frame) => {
if (!frame.filename) return frame;
const isWindowsFrame = /^[a-zA-Z]:\\/.test(frame.filename) || frame.filename.includes("\\") && !frame.filename.includes("/");
const startsWithSlash = /^\//.test(frame.filename);
if (isBrowser) {
if (root) {
const oldFilename = frame.filename;
if (oldFilename.indexOf(root) === 0) frame.filename = oldFilename.replace(root, prefix);
}
} else if (isWindowsFrame || startsWithSlash) {
const filename = isWindowsFrame ? frame.filename.replace(/^[a-zA-Z]:/, "").replace(/\\/g, "/") : frame.filename;
frame.filename = `${prefix}${root ? relative(root, filename) : basename(filename)}`;
}
return frame;
};
}
function parseUrl(url) {
if (!url) return {};
const match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
if (!match) return {};
const query = match[6] || "";
const fragment = match[8] || "";
return {
host: match[4],
path: match[5],
protocol: match[2],
search: query,
hash: fragment,
relative: match[5] + query + fragment
};
}
function getBreadcrumbLogLevelFromHttpStatusCode(statusCode) {
if (statusCode === void 0) return;
else if (statusCode >= 400 && statusCode < 500) return "warning";
else if (statusCode >= 500) return "error";
else return;
}
var WINDOW$2 = GLOBAL_OBJ;
function supportsHistory() {
return "history" in WINDOW$2 && !!WINDOW$2.history;
}
function _isFetchSupported() {
if (!("fetch" in WINDOW$2)) return false;
try {
new Headers();
new Request("http://www.example.com");
new Response();
return true;
} catch {
return false;
}
}
function isNativeFunction(func) {
return func && /^function\s+\w+\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString());
}
function supportsNativeFetch() {
if (typeof EdgeRuntime === "string") return true;
if (!_isFetchSupported()) return false;
if (isNativeFunction(WINDOW$2.fetch)) return true;
let result = false;
const doc = WINDOW$2.document;
if (doc && typeof doc.createElement === "function") try {
const sandbox = doc.createElement("iframe");
sandbox.hidden = true;
doc.head.appendChild(sandbox);
if (sandbox.contentWindow?.fetch) result = isNativeFunction(sandbox.contentWindow.fetch);
doc.head.removeChild(sandbox);
} catch (err) {
DEBUG_BUILD$3 && debug.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ", err);
}
return result;
}
function addFetchInstrumentationHandler(handler, skipNativeFetchCheck) {
const type = "fetch";
addHandler(type, handler);
maybeInstrument(type, () => instrumentFetch(void 0, skipNativeFetchCheck));
}
function instrumentFetch(onFetchResolved, skipNativeFetchCheck = false) {
if (skipNativeFetchCheck && !supportsNativeFetch()) return;
fill(GLOBAL_OBJ, "fetch", function(originalFetch) {
return function(...args) {
const virtualError = /* @__PURE__ */ new Error();
const { method, url } = parseFetchArgs(args);
const handlerData = {
args,
fetchData: {
method,
url
},
startTimestamp: timestampInSeconds() * 1e3,
virtualError,
headers: getHeadersFromFetchArgs(args)
};
if (!onFetchResolved) triggerHandlers("fetch", { ...handlerData });
return originalFetch.apply(GLOBAL_OBJ, args).then(async (response) => {
if (onFetchResolved) onFetchResolved(response);
else triggerHandlers("fetch", {
...handlerData,
endTimestamp: timestampInSeconds() * 1e3,
response
});
return response;
}, (error$2) => {
triggerHandlers("fetch", {
...handlerData,
endTimestamp: timestampInSeconds() * 1e3,
error: error$2
});
if (isError(error$2) && error$2.stack === void 0) {
error$2.stack = virtualError.stack;
addNonEnumerableProperty(error$2, "framesToPop", 1);
}
if (error$2 instanceof TypeError && (error$2.message === "Failed to fetch" || error$2.message === "Load failed" || error$2.message === "NetworkError when attempting to fetch resource.")) try {
const url$1 = new URL(handlerData.fetchData.url);
error$2.message = `${error$2.message} (${url$1.host})`;
} catch {}
throw error$2;
});
};
});
}
function hasProp(obj, prop) {
return !!obj && typeof obj === "object" && !!obj[prop];
}
function getUrlFromResource(resource) {
if (typeof resource === "string") return resource;
if (!resource) return "";
if (hasProp(resource, "url")) return resource.url;
if (resource.toString) return resource.toString();
return "";
}
function parseFetchArgs(fetchArgs) {
if (fetchArgs.length === 0) return {
method: "GET",
url: ""
};
if (fetchArgs.length === 2) {
const [url, options] = fetchArgs;
return {
url: getUrlFromResource(url),
method: hasProp(options, "method") ? String(options.method).toUpperCase() : "GET"
};
}
const arg = fetchArgs[0];
return {
url: getUrlFromResource(arg),
method: hasProp(arg, "method") ? String(arg.method).toUpperCase() : "GET"
};
}
function getHeadersFromFetchArgs(fetchArgs) {
const [requestArgument, optionsArgument] = fetchArgs;
try {
if (typeof optionsArgument === "object" && optionsArgument !== null && "headers" in optionsArgument && optionsArgument.headers) return new Headers(optionsArgument.headers);
if (isRequest(requestArgument)) return new Headers(requestArgument.headers);
} catch {}
}
function getSDKSource() {
return "npm";
}
var WINDOW = GLOBAL_OBJ;
var ignoreOnError = 0;
function shouldIgnoreOnError() {
return ignoreOnError > 0;
}
function ignoreNextOnError() {
ignoreOnError++;
setTimeout(() => {
ignoreOnError--;
});
}
function wrap(fn$1, options = {}) {
function isFunction(fn$2) {
return typeof fn$2 === "function";
}
if (!isFunction(fn$1)) return fn$1;
try {
const wrapper$3 = fn$1.__sentry_wrapped__;
if (wrapper$3) if (typeof wrapper$3 === "function") return wrapper$3;
else return fn$1;
if (getOriginalFunction(fn$1)) return fn$1;
} catch {
return fn$1;
}
const sentryWrapped = function(...args) {
try {
const wrappedArguments = args.map((arg) => wrap(arg, options));
return fn$1.apply(this, wrappedArguments);
} catch (ex) {
ignoreNextOnError();
withScope((scope) => {
scope.addEventProcessor((event) => {
if (options.mechanism) {
addExceptionTypeValue(event, void 0, void 0);
addExceptionMechanism(event, options.mechanism);
}
event.extra = {
...event.extra,
arguments: args
};
return event;
});
captureException(ex);
});
throw ex;
}
};
try {
for (const property in fn$1) if (Object.prototype.hasOwnProperty.call(fn$1, property)) sentryWrapped[property] = fn$1[property];
} catch {}
markFunctionWrapped(sentryWrapped, fn$1);
addNonEnumerableProperty(fn$1, "__sentry_wrapped__", sentryWrapped);
try {
if (Object.getOwnPropertyDescriptor(sentryWrapped, "name").configurable) Object.defineProperty(sentryWrapped, "name", { get() {
return fn$1.name;
} });
} catch {}
return sentryWrapped;
}
function getHttpRequestData() {
const url = getLocationHref();
const { referrer } = WINDOW.document || {};
const { userAgent } = WINDOW.navigator || {};
return {
url,
headers: {
...referrer && { Referer: referrer },
...userAgent && { "User-Agent": userAgent }
}
};
}
function exceptionFromError(stackParser, ex) {
const frames = parseStackFrames(stackParser, ex);
const exception = {
type: extractType(ex),
value: extractMessage(ex)
};
if (frames.length) exception.stacktrace = { frames };
if (exception.type === void 0 && exception.value === "") exception.value = "Unrecoverable error caught";
return exception;
}
function eventFromPlainObject(stackParser, exception, syntheticException, isUnhandledRejection) {
const normalizeDepth = getClient()?.getOptions().normalizeDepth;
const errorFromProp = getErrorPropertyFromObject(exception);
const extra = { __serialized__: normalizeToSize(exception, normalizeDepth) };
if (errorFromProp) return {
exception: { values: [exceptionFromError(stackParser, errorFromProp)] },
extra
};
const event = {
exception: { values: [{
type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? "UnhandledRejection" : "Error",
value: getNonErrorObjectExceptionValue(exception, { isUnhandledRejection })
}] },
extra
};
if (syntheticException) {
const frames = parseStackFrames(stackParser, syntheticException);
if (frames.length) event.exception.values[0].stacktrace = { frames };
}
return event;
}
function eventFromError(stackParser, ex) {
return { exception: { values: [exceptionFromError(stackParser, ex)] } };
}
function parseStackFrames(stackParser, ex) {
const stacktrace = ex.stacktrace || ex.stack || "";
const skipLines = getSkipFirstStackStringLines(ex);
const framesToPop = getPopFirstTopFrames(ex);
try {
return stackParser(stacktrace, skipLines, framesToPop);
} catch {}
return [];
}
var reactMinifiedRegexp = /Minified React error #\d+;/i;
function getSkipFirstStackStringLines(ex) {
if (ex && reactMinifiedRegexp.test(ex.message)) return 1;
return 0;
}
function getPopFirstTopFrames(ex) {
if (typeof ex.framesToPop === "number") return ex.framesToPop;
return 0;
}
function isWebAssemblyException(exception) {
if (typeof WebAssembly !== "undefined" && typeof WebAssembly.Exception !== "undefined") return exception instanceof WebAssembly.Exception;
else return false;
}
function extractType(ex) {
const name$2 = ex?.name;
if (!name$2 && isWebAssemblyException(ex)) return ex.message && Array.isArray(ex.message) && ex.message.length == 2 ? ex.message[0] : "WebAssembly.Exception";
return name$2;
}
function extractMessage(ex) {
const message$1 = ex?.message;
if (isWebAssemblyException(ex)) {
if (Array.isArray(ex.message) && ex.message.length == 2) return ex.message[1];
return "wasm exception";
}
if (!message$1) return "No error message";
if (message$1.error && typeof message$1.error.message === "string") return message$1.error.message;
return message$1;
}
function eventFromException(stackParser, exception, hint$1, attachStacktrace) {
const event = eventFromUnknownInput(stackParser, exception, hint$1?.syntheticException || void 0, attachStacktrace);
addExceptionMechanism(event);
event.level = "error";
if (hint$1?.event_id) event.event_id = hint$1.event_id;
return resolvedSyncPromise(event);
}
function eventFromMessage(stackParser, message$1, level = "info", hint$1, attachStacktrace) {
const event = eventFromString(stackParser, message$1, hint$1?.syntheticException || void 0, attachStacktrace);
event.level = level;
if (hint$1?.event_id) event.event_id = hint$1.event_id;
return resolvedSyncPromise(event);
}
function eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace, isUnhandledRejection) {
let event;
if (isErrorEvent(exception) && exception.error) return eventFromError(stackParser, exception.error);
if (isDOMError(exception) || isDOMException(exception)) {
const domException = exception;
if ("stack" in exception) event = eventFromError(stackParser, exception);
else {
const name$2 = domException.name || (isDOMError(domException) ? "DOMError" : "DOMException");
const message$1 = domException.message ? `${name$2}: ${domException.message}` : name$2;
event = eventFromString(stackParser, message$1, syntheticException, attachStacktrace);
addExceptionTypeValue(event, message$1);
}
if ("code" in domException) event.tags = {
...event.tags,
"DOMException.code": `${domException.code}`
};
return event;
}
if (isError(exception)) return eventFromError(stackParser, exception);
if (isPlainObject(exception) || isEvent(exception)) {
event = eventFromPlainObject(stackParser, exception, syntheticException, isUnhandledRejection);
addExceptionMechanism(event, { synthetic: true });
return event;
}
event = eventFromString(stackParser, exception, syntheticException, attachStacktrace);
addExceptionTypeValue(event, `${exception}`, void 0);
addExceptionMechanism(event, { synthetic: true });
return event;
}
function eventFromString(stackParser, message$1, syntheticException, attachStacktrace) {
const event = {};
if (attachStacktrace && syntheticException) {
const frames = parseStackFrames(stackParser, syntheticException);
if (frames.length) event.exception = { values: [{
value: message$1,
stacktrace: { frames }
}] };
addExceptionMechanism(event, { synthetic: true });
}
if (isParameterizedString(message$1)) {
const { __sentry_template_string__, __sentry_template_values__ } = message$1;
event.logentry = {
message: __sentry_template_string__,
params: __sentry_template_values__
};
return event;
}
event.message = message$1;
return event;
}
function getNonErrorObjectExceptionValue(exception, { isUnhandledRejection }) {
const keys$1 = extractExceptionKeysForMessage(exception);
const captureType = isUnhandledRejection ? "promise rejection" : "exception";
if (isErrorEvent(exception)) return `Event \`ErrorEvent\` captured as ${captureType} with message \`${exception.message}\``;
if (isEvent(exception)) return `Event \`${getObjectClassName(exception)}\` (type=${exception.type}) captured as ${captureType}`;
return `Object captured as ${captureType} with keys: ${keys$1}`;
}
function getObjectClassName(obj) {
try {
const prototype = Object.getPrototypeOf(obj);
return prototype ? prototype.constructor.name : void 0;
} catch {}
}
function getErrorPropertyFromObject(obj) {
for (const prop in obj) if (Object.prototype.hasOwnProperty.call(obj, prop)) {
const value = obj[prop];
if (value instanceof Error) return value;
}
}
var DEFAULT_FLUSH_INTERVAL = 5e3;
var BrowserClient = class extends Client {
constructor(options) {
const opts = applyDefaultOptions(options);
applySdkMetadata(opts, "browser", ["browser"], WINDOW.SENTRY_SDK_SOURCE || getSDKSource());
super(opts);
const { sendDefaultPii, sendClientReports, enableLogs, _experiments } = this._options;
const shouldEnableLogs = enableLogs ?? _experiments?.enableLogs;
if (WINDOW.document && (sendClientReports || shouldEnableLogs)) WINDOW.document.addEventListener("visibilitychange", () => {
if (WINDOW.document.visibilityState === "hidden") {
if (sendClientReports) this._flushOutcomes();
if (shouldEnableLogs) _INTERNAL_flushLogsBuffer(this);
}
});
if (shouldEnableLogs) {
this.on("flush", () => {
_INTERNAL_flushLogsBuffer(this);
});
this.on("afterCaptureLog", () => {
if (this._logFlushIdleTimeout) clearTimeout(this._logFlushIdleTimeout);
this._logFlushIdleTimeout = setTimeout(() => {
_INTERNAL_flushLogsBuffer(this);
}, DEFAULT_FLUSH_INTERVAL);
});
}
if (sendDefaultPii) {
this.on("postprocessEvent", addAutoIpAddressToUser);
this.on("beforeSendSession", addAutoIpAddressToSession);
}
}
eventFromException(exception, hint$1) {
return eventFromException(this._options.stackParser, exception, hint$1, this._options.attachStacktrace);
}
eventFromMessage(message$1, level = "info", hint$1) {
return eventFromMessage(this._options.stackParser, message$1, level, hint$1, this._options.attachStacktrace);
}
_prepareEvent(event, hint$1, currentScope, isolationScope) {
event.platform = event.platform || "javascript";
return super._prepareEvent(event, hint$1, currentScope, isolationScope);
}
};
function applyDefaultOptions(optionsArg) {
return {
release: typeof __SENTRY_RELEASE__ === "string" ? __SENTRY_RELEASE__ : WINDOW.SENTRY_RELEASE?.id,
sendClientReports: true,
parentSpanIsAlwaysRootSpan: true,
...optionsArg
};
}
var DEBUG_BUILD$2 = typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__;
var WINDOW$1 = GLOBAL_OBJ;
var DEBOUNCE_DURATION = 1e3;
var debounceTimerID;
var lastCapturedEventType;
var lastCapturedEventTargetId;
function addClickKeypressInstrumentationHandler(handler) {
const type = "dom";
addHandler(type, handler);
maybeInstrument(type, instrumentDOM);
}
function instrumentDOM() {
if (!WINDOW$1.document) return;
const triggerDOMHandler = triggerHandlers.bind(null, "dom");
const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);
WINDOW$1.document.addEventListener("click", globalDOMEventHandler, false);
WINDOW$1.document.addEventListener("keypress", globalDOMEventHandler, false);
["EventTarget", "Node"].forEach((target) => {
const proto$1 = WINDOW$1[target]?.prototype;
if (!proto$1?.hasOwnProperty?.("addEventListener")) return;
fill(proto$1, "addEventListener", function(originalAddEventListener) {
return function(type, listener, options) {
if (type === "click" || type == "keypress") try {
const handlers$1 = this.__sentry_instrumentation_handlers__ = this.__sentry_instrumentation_handlers__ || {};
const handlerForType = handlers$1[type] = handlers$1[type] || { refCount: 0 };
if (!handlerForType.handler) {
const handler = makeDOMEventHandler(triggerDOMHandler);
handlerForType.handler = handler;
originalAddEventListener.call(this, type, handler, options);
}
handlerForType.refCount++;
} catch {}
return originalAddEventListener.call(this, type, listener, options);
};
});
fill(proto$1, "removeEventListener", function(originalRemoveEventListener) {
return function(type, listener, options) {
if (type === "click" || type == "keypress") try {
const handlers$1 = this.__sentry_instrumentation_handlers__ || {};
const handlerForType = handlers$1[type];
if (handlerForType) {
handlerForType.refCount--;
if (handlerForType.refCount <= 0) {
originalRemoveEventListener.call(this, type, handlerForType.handler, options);
handlerForType.handler = void 0;
delete handlers$1[type];
}
if (Object.keys(handlers$1).length === 0) delete this.__sentry_instrumentation_handlers__;
}
} catch {}
return originalRemoveEventListener.call(this, type, listener, options);
};
});
});
}
function isSimilarToLastCapturedEvent(event) {
if (event.type !== lastCapturedEventType) return false;
try {
if (!event.target || event.target._sentryId !== lastCapturedEventTargetId) return false;
} catch {}
return true;
}
function shouldSkipDOMEvent(eventType, target) {
if (eventType !== "keypress") return false;
if (!target?.tagName) return true;
if (target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable) return false;
return true;
}
function makeDOMEventHandler(handler, globalListener = false) {
return (event) => {
if (!event || event["_sentryCaptured"]) return;
const target = getEventTarget(event);
if (shouldSkipDOMEvent(event.type, target)) return;
addNonEnumerableProperty(event, "_sentryCaptured", true);
if (target && !target._sentryId) addNonEnumerableProperty(target, "_sentryId", uuid4());
const name$2 = event.type === "keypress" ? "input" : event.type;
if (!isSimilarToLastCapturedEvent(event)) {
handler({
event,
name: name$2,
global: globalListener
});
lastCapturedEventType = event.type;
lastCapturedEventTargetId = target ? target._sentryId : void 0;
}
clearTimeout(debounceTimerID);
debounceTimerID = WINDOW$1.setTimeout(() => {
lastCapturedEventTargetId = void 0;
lastCapturedEventType = void 0;
}, DEBOUNCE_DURATION);
};
}
function getEventTarget(event) {
try {
return event.target;
} catch {
return null;
}
}
var lastHref;
function addHistoryInstrumentationHandler(handler) {
const type = "history";
addHandler(type, handler);
maybeInstrument(type, instrumentHistory);
}
function instrumentHistory() {
WINDOW$1.addEventListener("popstate", () => {
const to = WINDOW$1.location.href;
const from = lastHref;
lastHref = to;
if (from === to) return;
triggerHandlers("history", {
from,
to
});
});
if (!supportsHistory()) return;
function historyReplacementFunction(originalHistoryFunction) {
return function(...args) {
const url = args.length > 2 ? args[2] : void 0;
if (url) {
const from = lastHref;
const to = getAbsoluteUrl(String(url));
lastHref = to;
if (from === to) return originalHistoryFunction.apply(this, args);
triggerHandlers("history", {
from,
to
});
}
return originalHistoryFunction.apply(this, args);
};
}
fill(WINDOW$1.history, "pushState", historyReplacementFunction);
fill(WINDOW$1.history, "replaceState", historyReplacementFunction);
}
function getAbsoluteUrl(urlOrPath) {
try {
return new URL(urlOrPath, WINDOW$1.location.origin).toString();
} catch {
return urlOrPath;
}
}
var cachedImplementations = {};
function getNativeImplementation(name$2) {
const cached = cachedImplementations[name$2];
if (cached) return cached;
let impl = WINDOW$1[name$2];
if (isNativeFunction(impl)) return cachedImplementations[name$2] = impl.bind(WINDOW$1);
const document$1 = WINDOW$1.document;
if (document$1 && typeof document$1.createElement === "function") try {
const sandbox = document$1.createElement("iframe");
sandbox.hidden = true;
document$1.head.appendChild(sandbox);
const contentWindow = sandbox.contentWindow;
if (contentWindow?.[name$2]) impl = contentWindow[name$2];
document$1.head.removeChild(sandbox);
} catch (e) {
DEBUG_BUILD$2 && debug.warn(`Could not create sandbox iframe for ${name$2} check, bailing to window.${name$2}: `, e);
}
if (!impl) return impl;
return cachedImplementations[name$2] = impl.bind(WINDOW$1);
}
function clearCachedImplementation(name$2) {
cachedImplementations[name$2] = void 0;
}
var SENTRY_XHR_DATA_KEY = "__sentry_xhr_v3__";
function addXhrInstrumentationHandler(handler) {
const type = "xhr";
addHandler(type, handler);
maybeInstrument(type, instrumentXHR);
}
function instrumentXHR() {
if (!WINDOW$1.XMLHttpRequest) return;
const xhrproto = XMLHttpRequest.prototype;
xhrproto.open = new Proxy(xhrproto.open, { apply(originalOpen, xhrOpenThisArg, xhrOpenArgArray) {
const virtualError = /* @__PURE__ */ new Error();
const startTimestamp = timestampInSeconds() * 1e3;
const method = isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : void 0;
const url = parseXhrUrlArg(xhrOpenArgArray[1]);
if (!method || !url) return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);
xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {
method,
url,
request_headers: {}
};
if (method === "POST" && url.match(/sentry_key/)) xhrOpenThisArg.__sentry_own_request__ = true;
const onreadystatechangeHandler = () => {
const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];
if (!xhrInfo) return;
if (xhrOpenThisArg.readyState === 4) {
try {
xhrInfo.status_code = xhrOpenThisArg.status;
} catch {}
triggerHandlers("xhr", {
endTimestamp: timestampInSeconds() * 1e3,
startTimestamp,
xhr: xhrOpenThisArg,
virtualError
});
}
};
if ("onreadystatechange" in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === "function") xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, { apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray) {
onreadystatechangeHandler();
return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);
} });
else xhrOpenThisArg.addEventListener("readystatechange", onreadystatechangeHandler);
xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, { apply(originalSetRequestHeader, setRequestHeaderThisArg, setRequestHeaderArgArray) {
const [header$12, value] = setRequestHeaderArgArray;
const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];
if (xhrInfo && isString(header$12) && isString(value)) xhrInfo.request_headers[header$12.toLowerCase()] = value;
return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);
} });
return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);
} });
xhrproto.send = new Proxy(xhrproto.send, { apply(originalSend, sendThisArg, sendArgArray) {
const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];
if (!sentryXhrData) return originalSend.apply(sendThisArg, sendArgArray);
if (sendArgArray[0] !== void 0) sentryXhrData.body = sendArgArray[0];
triggerHandlers("xhr", {
startTimestamp: timestampInSeconds() * 1e3,
xhr: sendThisArg
});
return originalSend.apply(sendThisArg, sendArgArray);
} });
}
function parseXhrUrlArg(url) {
if (isString(url)) return url;
try {
return url.toString();
} catch {}
}
function makeFetchTransport(options, nativeFetch = getNativeImplementation("fetch")) {
let pendingBodySize = 0;
let pendingCount = 0;
function makeRequest(request) {
const requestSize = request.body.length;
pendingBodySize += requestSize;
pendingCount++;
const requestOptions = {
body: request.body,
method: "POST",
referrerPolicy: "strict-origin",
headers: options.headers,
keepalive: pendingBodySize <= 6e4 && pendingCount < 15,
...options.fetchOptions
};
if (!nativeFetch) {
clearCachedImplementation("fetch");
return rejectedSyncPromise("No fetch implementation available");
}
try {
return nativeFetch(options.url, requestOptions).then((response) => {
pendingBodySize -= requestSize;
pendingCount--;
return {
statusCode: response.status,
headers: {
"x-sentry-rate-limits": response.headers.get("X-Sentry-Rate-Limits"),
"retry-after": response.headers.get("Retry-After")
}
};
});
} catch (e) {
clearCachedImplementation("fetch");
pendingBodySize -= requestSize;
pendingCount--;
return rejectedSyncPromise(e);
}
}
return createTransport(options, makeRequest);
}
var CHROME_PRIORITY = 30;
var GECKO_PRIORITY = 50;
function createFrame(filename, func, lineno, colno) {
const frame = {
filename,
function: func === "<anonymous>" ? "?" : func,
in_app: true
};
if (lineno !== void 0) frame.lineno = lineno;
if (colno !== void 0) frame.colno = colno;
return frame;
}
var chromeRegexNoFnName = /^\s*at (\S+?)(?::(\d+))(?::(\d+))\s*$/i;
var chromeRegex = /^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
var chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
var chromeStackParserFn = (line) => {
const noFnParts = chromeRegexNoFnName.exec(line);
if (noFnParts) {
const [, filename, line$1, col] = noFnParts;
return createFrame(filename, "?", +line$1, +col);
}
const parts = chromeRegex.exec(line);
if (parts) {
if (parts[2] && parts[2].indexOf("eval") === 0) {
const subMatch = chromeEvalRegex.exec(parts[2]);
if (subMatch) {
parts[2] = subMatch[1];
parts[3] = subMatch[2];
parts[4] = subMatch[3];
}
}
const [func, filename] = extractSafariExtensionDetails(parts[1] || "?", parts[2]);
return createFrame(filename, func, parts[3] ? +parts[3] : void 0, parts[4] ? +parts[4] : void 0);
}
};
var chromeStackLineParser = [CHROME_PRIORITY, chromeStackParserFn];
var geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
var geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
var gecko = (line) => {
const parts = geckoREgex.exec(line);
if (parts) {
if (parts[3] && parts[3].indexOf(" > eval") > -1) {
const subMatch = geckoEvalRegex.exec(parts[3]);
if (subMatch) {
parts[1] = parts[1] || "eval";
parts[3] = subMatch[1];
parts[4] = subMatch[2];
parts[5] = "";
}
}
let filename = parts[3];
let func = parts[1] || "?";
[func, filename] = extractSafariExtensionDetails(func, filename);
return createFrame(filename, func, parts[4] ? +parts[4] : void 0, parts[5] ? +parts[5] : void 0);
}
};
var defaultStackParser = createStackParser(...[chromeStackLineParser, [GECKO_PRIORITY, gecko]]);
var extractSafariExtensionDetails = (func, filename) => {
const isSafariExtension = func.indexOf("safari-extension") !== -1;
const isSafariWebExtension = func.indexOf("safari-web-extension") !== -1;
return isSafariExtension || isSafariWebExtension ? [func.indexOf("@") !== -1 ? func.split("@")[0] : "?", isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`] : [func, filename];
};
var DEBUG_BUILD$1 = typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__;
var MAX_ALLOWED_STRING_LENGTH = 1024;
var INTEGRATION_NAME$4 = "Breadcrumbs";
var _breadcrumbsIntegration = ((options = {}) => {
const _options = {
console: true,
dom: true,
fetch: true,
history: true,
sentry: true,
xhr: true,
...options
};
return {
name: INTEGRATION_NAME$4,
setup(client) {
if (_options.console) addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));
if (_options.dom) addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));
if (_options.xhr) addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));
if (_options.fetch) addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));
if (_options.history) addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));
if (_options.sentry) client.on("beforeSendEvent", _getSentryBreadcrumbHandler(client));
}
};
});
var breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);
function _getSentryBreadcrumbHandler(client) {
return function addSentryBreadcrumb(event) {
if (getClient() !== client) return;
addBreadcrumb({
category: `sentry.${event.type === "transaction" ? "transaction" : "event"}`,
event_id: event.event_id,
level: event.level,
message: getEventDescription(event)
}, { event });
};
}
function _getDomBreadcrumbHandler(client, dom) {
return function _innerDomBreadcrumb(handlerData) {
if (getClient() !== client) return;
let target;
let componentName;
let keyAttrs = typeof dom === "object" ? dom.serializeAttribute : void 0;
let maxStringLength = typeof dom === "object" && typeof dom.maxStringLength === "number" ? dom.maxStringLength : void 0;
if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {
DEBUG_BUILD$1 && debug.warn(`\`dom.maxStringLength\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`);
maxStringLength = MAX_ALLOWED_STRING_LENGTH;
}
if (typeof keyAttrs === "string") keyAttrs = [keyAttrs];
try {
const event = handlerData.event;
const element = _isEvent(event) ? event.target : event;
target = htmlTreeAsString(element, {
keyAttrs,
maxStringLength
});
componentName = getComponentName(element);
} catch {
target = "<unknown>";
}
if (target.length === 0) return;
const breadcrumb = {
category: `ui.${handlerData.name}`,
message: target
};
if (componentName) breadcrumb.data = { "ui.component_name": componentName };
addBreadcrumb(breadcrumb, {
event: handlerData.event,
name: handlerData.name,
global: handlerData.global
});
};
}
function _getConsoleBreadcrumbHandler(client) {
return function _consoleBreadcrumb(handlerData) {
if (getClient() !== client) return;
const breadcrumb = {
category: "console",
data: {
arguments: handlerData.args,
logger: "console"
},
level: severityLevelFromString(handlerData.level),
message: safeJoin(handlerData.args, " ")
};
if (handlerData.level === "assert") if (handlerData.args[0] === false) {
breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), " ") || "console.assert"}`;
breadcrumb.data.arguments = handlerData.args.slice(1);
} else return;
addBreadcrumb(breadcrumb, {
input: handlerData.args,
level: handlerData.level
});
};
}
function _getXhrBreadcrumbHandler(client) {
return function _xhrBreadcrumb(handlerData) {
if (getClient() !== client) return;
const { startTimestamp, endTimestamp } = handlerData;
const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];
if (!startTimestamp || !endTimestamp || !sentryXhrData) return;
const { method, url, status_code, body } = sentryXhrData;
const data = {
method,
url,
status_code
};
const hint$1 = {
xhr: handlerData.xhr,
input: body,
startTimestamp,
endTimestamp
};
const breadcrumb = {
category: "xhr",
data,
type: "http",
level: getBreadcrumbLogLevelFromHttpStatusCode(status_code)
};
client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint$1);
addBreadcrumb(breadcrumb, hint$1);
};
}
function _getFetchBreadcrumbHandler(client) {
return function _fetchBreadcrumb(handlerData) {
if (getClient() !== client) return;
const { startTimestamp, endTimestamp } = handlerData;
if (!endTimestamp) return;
if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === "POST") return;
handlerData.fetchData.method, handlerData.fetchData.url;
if (handlerData.error) {
const data = handlerData.fetchData;
const hint$1 = {
data: handlerData.error,
input: handlerData.args,
startTimestamp,
endTimestamp
};
const breadcrumb = {
category: "fetch",
data,
level: "error",
type: "http"
};
client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint$1);
addBreadcrumb(breadcrumb, hint$1);
} else {
const response = handlerData.response;
const data = {
...handlerData.fetchData,
status_code: response?.status
};
handlerData.fetchData.request_body_size;
handlerData.fetchData.response_body_size;
response?.status;
const hint$1 = {
input: handlerData.args,
response,
startTimestamp,
endTimestamp
};
const breadcrumb = {
category: "fetch",
data,
type: "http",
level: getBreadcrumbLogLevelFromHttpStatusCode(data.status_code)
};
client.emit("beforeOutgoingRequestBreadcrumb", breadcrumb, hint$1);
addBreadcrumb(breadcrumb, hint$1);
}
};
}
function _getHistoryBreadcrumbHandler(client) {
return function _historyBreadcrumb(handlerData) {
if (getClient() !== client) return;
let from = handlerData.from;
let to = handlerData.to;
const parsedLoc = parseUrl(WINDOW.location.href);
let parsedFrom = from ? parseUrl(from) : void 0;
const parsedTo = parseUrl(to);
if (!parsedFrom?.path) parsedFrom = parsedLoc;
if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) to = parsedTo.relative;
if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) from = parsedFrom.relative;
addBreadcrumb({
category: "navigation",
data: {
from,
to
}
});
};
}
function _isEvent(event) {
return !!event && !!event.target;
}
var DEFAULT_EVENT_TARGET = [
"EventTarget",
"Window",
"Node",
"ApplicationCache",
"AudioTrackList",
"BroadcastChannel",
"ChannelMergerNode",
"CryptoOperation",
"EventSource",
"FileReader",
"HTMLUnknownElement",
"IDBDatabase",
"IDBRequest",
"IDBTransaction",
"KeyOperation",
"MediaController",
"MessagePort",
"ModalWindow",
"Notification",
"SVGElementInstance",
"Screen",
"SharedWorker",
"TextTrack",
"TextTrackCue",
"TextTrackList",
"WebSocket",
"WebSocketWorker",
"Worker",
"XMLHttpRequest",
"XMLHttpRequestEventTarget",
"XMLHttpRequestUpload"
];
var INTEGRATION_NAME$3 = "BrowserApiErrors";
var _browserApiErrorsIntegration = ((options = {}) => {
const _options = {
XMLHttpRequest: true,
eventTarget: true,
requestAnimationFrame: true,
setInterval: true,
setTimeout: true,
unregisterOriginalCallbacks: false,
...options
};
return {
name: INTEGRATION_NAME$3,
setupOnce() {
if (_options.setTimeout) fill(WINDOW, "setTimeout", _wrapTimeFunction);
if (_options.setInterval) fill(WINDOW, "setInterval", _wrapTimeFunction);
if (_options.requestAnimationFrame) fill(WINDOW, "requestAnimationFrame", _wrapRAF);
if (_options.XMLHttpRequest && "XMLHttpRequest" in WINDOW) fill(XMLHttpRequest.prototype, "send", _wrapXHR);
const eventTargetOption = _options.eventTarget;
if (eventTargetOption) (Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET).forEach((target) => _wrapEventTarget(target, _options));
}
};
});
var browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);
function _wrapTimeFunction(original) {
return function(...args) {
const originalCallback = args[0];
args[0] = wrap(originalCallback, { mechanism: {
data: { function: getFunctionName(original) },
handled: false,
type: "instrument"
} });
return original.apply(this, args);
};
}
function _wrapRAF(original) {
return function(callback) {
return original.apply(this, [wrap(callback, { mechanism: {
data: {
function: "requestAnimationFrame",
handler: getFunctionName(original)
},
handled: false,
type: "instrument"
} })]);
};
}
function _wrapXHR(originalSend) {
return function(...args) {
const xhr = this;
[
"onload",
"onerror",
"onprogress",
"onreadystatechange"
].forEach((prop) => {
if (prop in xhr && typeof xhr[prop] === "function") fill(xhr, prop, function(original) {
const wrapOptions = { mechanism: {
data: {
function: prop,
handler: getFunctionName(original)
},
handled: false,
type: "instrument"
} };
const originalFunction = getOriginalFunction(original);
if (originalFunction) wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);
return wrap(original, wrapOptions);
});
});
return originalSend.apply(this, args);
};
}
function _wrapEventTarget(target, integrationOptions) {
const proto$1 = WINDOW[target]?.prototype;
if (!proto$1?.hasOwnProperty?.("addEventListener")) return;
fill(proto$1, "addEventListener", function(original) {
return function(eventName, fn$1, options) {
try {
if (isEventListenerObject(fn$1)) fn$1.handleEvent = wrap(fn$1.handleEvent, { mechanism: {
data: {
function: "handleEvent",
handler: getFunctionName(fn$1),
target
},
handled: false,
type: "instrument"
} });
} catch {}
if (integrationOptions.unregisterOriginalCallbacks) unregisterOriginalCallback(this, eventName, fn$1);
return original.apply(this, [
eventName,
wrap(fn$1, { mechanism: {
data: {
function: "addEventListener",
handler: getFunctionName(fn$1),
target
},
handled: false,
type: "instrument"
} }),
options
]);
};
});
fill(proto$1, "removeEventListener", function(originalRemoveEventListener) {
return function(eventName, fn$1, options) {
try {
const originalEventHandler = fn$1.__sentry_wrapped__;
if (originalEventHandler) originalRemoveEventListener.call(this, eventName, originalEventHandler, options);
} catch {}
return originalRemoveEventListener.call(this, eventName, fn$1, options);
};
});
}
function isEventListenerObject(obj) {
return typeof obj.handleEvent === "function";
}
function unregisterOriginalCallback(target, eventName, fn$1) {
if (target && typeof target === "object" && "removeEventListener" in target && typeof target.removeEventListener === "function") target.removeEventListener(eventName, fn$1);
}
var browserSessionIntegration = defineIntegration(() => {
return {
name: "BrowserSession",
setupOnce() {
if (typeof WINDOW.document === "undefined") {
DEBUG_BUILD$1 && debug.warn("Using the `browserSessionIntegration` in non-browser environments is not supported.");
return;
}
startSession({ ignoreDuration: true });
captureSession();
addHistoryInstrumentationHandler(({ from, to }) => {
if (from !== void 0 && from !== to) {
startSession({ ignoreDuration: true });
captureSession();
}
});
}
};
});
var INTEGRATION_NAME$2 = "GlobalHandlers";
var _globalHandlersIntegration = ((options = {}) => {
const _options = {
onerror: true,
onunhandledrejection: true,
...options
};
return {
name: INTEGRATION_NAME$2,
setupOnce() {
Error.stackTraceLimit = 50;
},
setup(client) {
if (_options.onerror) {
_installGlobalOnErrorHandler(client);
globalHandlerLog("onerror");
}
if (_options.onunhandledrejection) {
_installGlobalOnUnhandledRejectionHandler(client);
globalHandlerLog("onunhandledrejection");
}
}
};
});
var globalHandlersIntegration = defineIntegration(_globalHandlersIntegration);
function _installGlobalOnErrorHandler(client) {
addGlobalErrorInstrumentationHandler((data) => {
const { stackParser, attachStacktrace } = getOptions();
if (getClient() !== client || shouldIgnoreOnError()) return;
const { msg, url, line, column: column$1, error: error$2 } = data;
const event = _enhanceEventWithInitialFrame(eventFromUnknownInput(stackParser, error$2 || msg, void 0, attachStacktrace, false), url, line, column$1);
event.level = "error";
captureEvent(event, {
originalException: error$2,
mechanism: {
handled: false,
type: "onerror"
}
});
});
}
function _installGlobalOnUnhandledRejectionHandler(client) {
addGlobalUnhandledRejectionInstrumentationHandler((e) => {
const { stackParser, attachStacktrace } = getOptions();
if (getClient() !== client || shouldIgnoreOnError()) return;
const error$2 = _getUnhandledRejectionError(e);
const event = isPrimitive(error$2) ? _eventFromRejectionWithPrimitive(error$2) : eventFromUnknownInput(stackParser, error$2, void 0, attachStacktrace, true);
event.level = "error";
captureEvent(event, {
originalException: error$2,
mechanism: {
handled: false,
type: "onunhandledrejection"
}
});
});
}
function _getUnhandledRejectionError(error$2) {
if (isPrimitive(error$2)) return error$2;
try {
if ("reason" in error$2) return error$2.reason;
if ("detail" in error$2 && "reason" in error$2.detail) return error$2.detail.reason;
} catch {}
return error$2;
}
function _eventFromRejectionWithPrimitive(reason) {
return { exception: { values: [{
type: "UnhandledRejection",
value: `Non-Error promise rejection captured with value: ${String(reason)}`
}] } };
}
function _enhanceEventWithInitialFrame(event, url, line, column$1) {
const e = event.exception = event.exception || {};
const ev = e.values = e.values || [];
const ev0 = ev[0] = ev[0] || {};
const ev0s = ev0.stacktrace = ev0.stacktrace || {};
const ev0sf = ev0s.frames = ev0s.frames || [];
const colno = column$1;
const lineno = line;
const filename = isString(url) && url.length > 0 ? url : getLocationHref();
if (ev0sf.length === 0) ev0sf.push({
colno,
filename,
function: "?",
in_app: true,
lineno
});
return event;
}
function globalHandlerLog(type) {
DEBUG_BUILD$1 && debug.log(`Global Handler attached: ${type}`);
}
function getOptions() {
return getClient()?.getOptions() || {
stackParser: () => [],
attachStacktrace: false
};
}
var httpContextIntegration = defineIntegration(() => {
return {
name: "HttpContext",
preprocessEvent(event) {
if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) return;
const reqData = getHttpRequestData();
const headers = {
...reqData.headers,
...event.request?.headers
};
event.request = {
...reqData,
...event.request,
headers
};
}
};
});
var DEFAULT_KEY = "cause";
var DEFAULT_LIMIT = 5;
var INTEGRATION_NAME$1 = "LinkedErrors";
var _linkedErrorsIntegration = ((options = {}) => {
const limit = options.limit || DEFAULT_LIMIT;
const key = options.key || DEFAULT_KEY;
return {
name: INTEGRATION_NAME$1,
preprocessEvent(event, hint$1, client) {
applyAggregateErrorsToEvent(exceptionFromError, client.getOptions().stackParser, key, limit, event, hint$1);
}
};
});
var linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration);
function checkAndWarnIfIsEmbeddedBrowserExtension() {
if (_isEmbeddedBrowserExtension()) {
if (DEBUG_BUILD$1) consoleSandbox(() => {
console.error("[Sentry] You cannot use Sentry.init() in a browser extension, see: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/");
});
return true;
}
return false;
}
function _isEmbeddedBrowserExtension() {
if (typeof WINDOW.window === "undefined") return false;
const _window = WINDOW;
if (_window.nw) return false;
if (!(_window["chrome"] || _window["browser"])?.runtime?.id) return false;
const href = getLocationHref();
return !(WINDOW === WINDOW.top && [
"chrome-extension",
"moz-extension",
"ms-browser-extension",
"safari-web-extension"
].some((protocol) => href.startsWith(`${protocol}://`)));
}
function getDefaultIntegrations(_options) {
return [
inboundFiltersIntegration(),
functionToStringIntegration(),
browserApiErrorsIntegration(),
breadcrumbsIntegration(),
globalHandlersIntegration(),
linkedErrorsIntegration(),
dedupeIntegration(),
httpContextIntegration(),
browserSessionIntegration()
];
}
function init(options = {}) {
const shouldDisableBecauseIsBrowserExtenstion = !options.skipBrowserExtensionCheck && checkAndWarnIfIsEmbeddedBrowserExtension();
return initAndBind(BrowserClient, {
...options,
enabled: shouldDisableBecauseIsBrowserExtenstion ? false : options.enabled,
stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),
integrations: getIntegrationsToSetup({
integrations: options.integrations,
defaultIntegrations: options.defaultIntegrations == null ? getDefaultIntegrations() : options.defaultIntegrations
}),
transport: options.transport || makeFetchTransport
});
}
var DEFAULT_HOOKS = ["activate", "mount"];
var DEBUG_BUILD = typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__;
var classifyRE = /(?:^|[-_])(\w)/g;
var classify = (str) => str.replace(classifyRE, (c$1) => c$1.toUpperCase()).replace(/[-_]/g, "");
var ROOT_COMPONENT_NAME = "<Root>";
var ANONYMOUS_COMPONENT_NAME = "<Anonymous>";
var repeat = (str, n) => {
return str.repeat(n);
};
var formatComponentName = (vm, includeFile) => {
if (!vm) return ANONYMOUS_COMPONENT_NAME;
if (vm.$root === vm) return ROOT_COMPONENT_NAME;
if (!vm.$options) return ANONYMOUS_COMPONENT_NAME;
const options = vm.$options;
let name$2 = options.name || options._componentTag || options.__name;
const file = options.__file;
if (!name$2 && file) {
const match = file.match(/([^/\\]+)\.vue$/);
if (match) name$2 = match[1];
}
return (name$2 ? `<${classify(name$2)}>` : ANONYMOUS_COMPONENT_NAME) + (file && includeFile !== false ? ` at ${file}` : "");
};
var generateComponentTrace = (vm) => {
if (vm && (vm._isVue || vm.__isVue) && vm.$parent) {
const tree = [];
let currentRecursiveSequence = 0;
while (vm) {
if (tree.length > 0) {
const last = tree[tree.length - 1];
if (last.constructor === vm.constructor) {
currentRecursiveSequence++;
vm = vm.$parent;
continue;
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence];
currentRecursiveSequence = 0;
}
}
tree.push(vm);
vm = vm.$parent;
}
return `\n\nfound in\n\n${tree.map((vm$1, i$1) => `${(i$1 === 0 ? "---> " : repeat(" ", 5 + i$1 * 2)) + (Array.isArray(vm$1) ? `${formatComponentName(vm$1[0])}... (${vm$1[1]} recursive calls)` : formatComponentName(vm$1))}`).join("\n")}`;
}
return `\n\n(found in ${formatComponentName(vm)})`;
};
var attachErrorHandler = (app$1, options) => {
const { errorHandler: originalErrorHandler } = app$1.config;
app$1.config.errorHandler = (error$2, vm, lifecycleHook) => {
const metadata = {
componentName: formatComponentName(vm, false),
lifecycleHook,
trace: vm ? generateComponentTrace(vm) : ""
};
if (options.attachProps && vm) {
if (vm.$options?.propsData) metadata.propsData = vm.$options.propsData;
else if (vm.$props) metadata.propsData = vm.$props;
}
setTimeout(() => {
captureException(error$2, {
captureContext: { contexts: { vue: metadata } },
mechanism: {
handled: !!originalErrorHandler,
type: "vue"
}
});
});
if (typeof originalErrorHandler === "function" && app$1.config.errorHandler) originalErrorHandler.call(app$1, error$2, vm, lifecycleHook);
else throw error$2;
};
};
var VUE_OP = "ui.vue";
var HOOKS = {
activate: ["activated", "deactivated"],
create: ["beforeCreate", "created"],
unmount: ["beforeUnmount", "unmounted"],
destroy: ["beforeDestroy", "destroyed"],
mount: ["beforeMount", "mounted"],
update: ["beforeUpdate", "updated"]
};
function maybeEndRootComponentSpan(vm, timestamp, timeout) {
if (vm.$_sentryRootComponentSpanTimer) clearTimeout(vm.$_sentryRootComponentSpanTimer);
vm.$_sentryRootComponentSpanTimer = setTimeout(() => {
if (vm.$root?.$_sentryRootComponentSpan) {
vm.$root.$_sentryRootComponentSpan.end(timestamp);
vm.$root.$_sentryRootComponentSpan = void 0;
}
}, timeout);
}
function findTrackComponent(trackComponents, formattedName) {
function extractComponentName(name$2) {
return name$2.replace(/^<([^\s]*)>(?: at [^\s]*)?$/, "$1");
}
return trackComponents.some((compo) => {
return extractComponentName(formattedName) === extractComponentName(compo);
});
}
var createTracingMixins = (options = {}) => {
const hooks = (options.hooks || []).concat(DEFAULT_HOOKS).filter((value, index, self) => self.indexOf(value) === index);
const mixins = {};
const rootComponentSpanFinalTimeout = options.timeout || 2e3;
for (const operation of hooks) {
const internalHooks = HOOKS[operation];
if (!internalHooks) {
DEBUG_BUILD && debug.warn(`Unknown hook: ${operation}`);
continue;
}
for (const internalHook of internalHooks) mixins[internalHook] = function() {
const isRootComponent = this.$root === this;
if (isRootComponent) {
this.$_sentryRootComponentSpan = this.$_sentryRootComponentSpan || startInactiveSpan({
name: "Application Render",
op: `${VUE_OP}.render`,
attributes: { ["sentry.origin"]: "auto.ui.vue" },
onlyIfParent: true
});
maybeEndRootComponentSpan(this, timestampInSeconds(), rootComponentSpanFinalTimeout);
}
const componentName = formatComponentName(this, false);
if (!(isRootComponent || (Array.isArray(options.trackComponents) ? findTrackComponent(options.trackComponents, componentName) : options.trackComponents))) {
maybeEndRootComponentSpan(this, timestampInSeconds(), rootComponentSpanFinalTimeout);
return;
}
this.$_sentryComponentSpans = this.$_sentryComponentSpans || {};
const isBeforeHook = internalHook === internalHooks[0];
const activeSpan = this.$root?.$_sentryRootComponentSpan || getActiveSpan();
if (isBeforeHook) {
if (activeSpan) {
const oldSpan = this.$_sentryComponentSpans[operation];
if (oldSpan) oldSpan.end();
this.$_sentryComponentSpans[operation] = startInactiveSpan({
name: `Vue ${componentName}`,
op: `${VUE_OP}.${operation}`,
attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.ui.vue" },
onlyIfParent: true
});
}
} else {
const span = this.$_sentryComponentSpans[operation];
if (!span) return;
span.end();
maybeEndRootComponentSpan(this, timestampInSeconds(), rootComponentSpanFinalTimeout);
}
};
}
return mixins;
};
var DEFAULT_CONFIG = {
Vue: GLOBAL_OBJ.Vue,
attachProps: true,
attachErrorHandler: true,
tracingOptions: {
hooks: DEFAULT_HOOKS,
timeout: 2e3,
trackComponents: false
}
};
var INTEGRATION_NAME = "Vue";
var vueIntegration = defineIntegration((integrationOptions = {}) => {
return {
name: INTEGRATION_NAME,
setup(client) {
const options = {
...DEFAULT_CONFIG,
...client.getOptions(),
...integrationOptions
};
if (!options.Vue && !options.app) {
consoleSandbox(() => {
console.warn("[@sentry/vue]: Misconfigured SDK. Vue specific errors will not be captured. Update your `Sentry.init` call with an appropriate config option: `app` (Application Instance - Vue 3) or `Vue` (Vue Constructor - Vue 2).");
});
return;
}
if (options.app) (Array.isArray(options.app) ? options.app : [options.app]).forEach((app$1) => vueInit(app$1, options));
else if (options.Vue) vueInit(options.Vue, options);
}
};
});
var vueInit = (app$1, options) => {
if (DEBUG_BUILD) {
if (app$1._instance?.isMounted === true) consoleSandbox(() => {
console.warn("[@sentry/vue]: Misconfigured SDK. Vue app is already mounted. Make sure to call `app.mount()` after `Sentry.init()`.");
});
}
if (options.attachErrorHandler) attachErrorHandler(app$1, options);
if (hasSpansEnabled(options)) app$1.mixin(createTracingMixins(options.tracingOptions));
};
function init$1(options = {}) {
const opts = {
defaultIntegrations: [...getDefaultIntegrations(options), vueIntegration()],
...options
};
applySdkMetadata(opts, "vue");
return init(opts);
}
var _hoisted_1$35 = { key: 0 };
var _hoisted_2$13 = { class: "mb-s" };
var _hoisted_3$7 = { class: "mb-s" };
var _hoisted_4$5 = { class: "action-buttons" };
var importCode = "import";
var ChatEmbedModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ChatEmbedModal",
props: { modalBus: { default: () => createEventBus() } },
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const rootStore = useRootStore();
const workflowsStore = useWorkflowsStore();
const tabs$3 = ref([
{
label: "CDN Embed",
value: "cdn"
},
{
label: "Vue Embed",
value: "vue"
},
{
label: "React Embed",
value: "react"
},
{
label: "Other",
value: "other"
}
]);
const currentTab = ref("cdn");
const webhookNode = computed(() => {
for (const type of [CHAT_TRIGGER_NODE_TYPE$1, WEBHOOK_NODE_TYPE$1]) {
const node = workflowsStore.workflow.nodes.find((node$1) => node$1.type === type);
if (node) {
if (type === "@n8n/n8n-nodes-langchain.chatTrigger" && !node.parameters.public) continue;
return {
type,
node
};
}
}
return null;
});
const webhookUrl = computed(() => {
const url = `${rootStore.webhookUrl}${webhookNode.value ? `/${webhookNode.value.node.webhookId}` : ""}`;
return webhookNode.value?.type === "@n8n/n8n-nodes-langchain.chatTrigger" ? `${url}/chat` : url;
});
function indentLines(code, indent = " ") {
return code.split("\n").map((line) => `${indent}${line}`).join("\n");
}
const commonCode = computed(() => ({
import: `${importCode} '@n8n/chat/style.css';
${importCode} { createChat } from '@n8n/chat';`,
createChat: `createChat({
webhookUrl: '${webhookUrl.value}'
});`,
install: "npm install @n8n/chat"
}));
const cdnCode = computed(() => `<link href="https://cdn.jsdelivr.net/npm/@n8n/chat/dist/style.css" rel="stylesheet" />
<script type="module">
${importCode} { createChat } from 'https://cdn.jsdelivr.net/npm/@n8n/chat/dist/chat.bundle.es.js';
${commonCode.value.createChat}
<\/script>`);
const vueCode = computed(() => `<script lang="ts" setup>
${importCode} { onMounted } from 'vue';
${commonCode.value.import}
onMounted(() => {
${indentLines(commonCode.value.createChat)}
});
<\/script>`);
const reactCode = computed(() => `${importCode} { useEffect } from 'react';
${commonCode.value.import}
export const App = () => {
useEffect(() => {
${indentLines(commonCode.value.createChat, " ")}
}, []);
return (<div></div>);
};
<\/script>`);
const otherCode = computed(() => `${commonCode.value.import}
${commonCode.value.createChat}`);
function closeDialog() {
props.modalBus.emit("close");
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "960px",
title: unref(i18n$2).baseText("chatEmbed.title"),
"event-bus": _ctx.modalBus,
name: unref(CHAT_EMBED_MODAL_KEY),
center: true
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [
createVNode(unref(N8nTabs_default), {
modelValue: currentTab.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => currentTab.value = $event),
options: tabs$3.value
}, null, 8, ["modelValue", "options"]),
currentTab.value !== "cdn" ? (openBlock(), createElementBlock("div", _hoisted_1$35, [createBaseVNode("div", _hoisted_2$13, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("chatEmbed.install")), 1)]),
_: 1
})]), createVNode(HtmlEditor_default, {
"model-value": commonCode.value.install,
"is-read-only": ""
}, null, 8, ["model-value"])])) : createCommentVNode("", true),
createBaseVNode("div", _hoisted_3$7, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: `chatEmbed.paste.${currentTab.value}`,
scope: "global"
}, {
code: withCtx(() => [createBaseVNode("code", null, toDisplayString(unref(i18n$2).baseText(`chatEmbed.paste.${currentTab.value}.file`)), 1)]),
_: 1
}, 8, ["keypath"])]),
_: 1
})]),
currentTab.value === "cdn" ? (openBlock(), createBlock(HtmlEditor_default, {
key: 1,
"model-value": cdnCode.value,
"is-read-only": ""
}, null, 8, ["model-value"])) : createCommentVNode("", true),
currentTab.value === "vue" ? (openBlock(), createBlock(HtmlEditor_default, {
key: 2,
"model-value": vueCode.value,
"is-read-only": ""
}, null, 8, ["model-value"])) : createCommentVNode("", true),
currentTab.value === "react" ? (openBlock(), createBlock(JsEditor_default, {
key: 3,
"model-value": reactCode.value,
"is-read-only": ""
}, null, 8, ["model-value"])) : createCommentVNode("", true),
currentTab.value === "other" ? (openBlock(), createBlock(JsEditor_default, {
key: 4,
"model-value": otherCode.value,
"is-read-only": ""
}, null, 8, ["model-value"])) : createCommentVNode("", true),
createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("chatEmbed.packageInfo.description")) + " ", 1), createVNode(unref(N8nLink_default), {
href: unref(i18n$2).baseText("chatEmbed.url"),
"new-window": "",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("chatEmbed.packageInfo.link")), 1)]),
_: 1
}, 8, ["href"])]),
_: 1
}),
createVNode(unref(N8nInfoTip_default), { class: "mt-s" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("chatEmbed.chatTriggerNode")), 1)]),
_: 1
})
], 2)]),
footer: withCtx(() => [createBaseVNode("div", _hoisted_4$5, [createVNode(unref(N8nButton_default), {
float: "right",
label: unref(i18n$2).baseText("chatEmbed.close"),
onClick: closeDialog
}, null, 8, ["label"])])]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var ChatEmbedModal_vue_vue_type_style_index_0_lang_module_default = { container: "_container_13dwb_123" };
var ChatEmbedModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ChatEmbedModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ChatEmbedModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$34 = ["textContent"];
var CommunityPackageInstallModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CommunityPackageInstallModal",
setup(__props) {
const telemetry$1 = useTelemetry();
const i18n$2 = useI18n();
const { installNode, loading: loading$3 } = useInstallNode();
const uiStore = useUIStore();
const modalBus = createEventBus();
const modalData = computed(() => uiStore.modalsById[COMMUNITY_PACKAGE_INSTALL_MODAL_KEY]?.data);
const packageName = ref(modalData.value?.packageName ?? "");
const userAgreed = ref(false);
const checkboxWarning = ref(false);
const infoTextErrorMessage = ref("");
const openNPMPage = () => {
telemetry$1.track("user clicked cnr browse button", { source: "cnr install modal" });
window.open(NPM_KEYWORD_SEARCH_URL, "_blank");
};
const onInstallClick = async () => {
if (!userAgreed.value) checkboxWarning.value = true;
else {
telemetry$1.track("user started cnr package install", {
input_string: packageName.value,
source: "cnr settings page"
});
infoTextErrorMessage.value = "";
const result = await installNode({
type: "unverified",
packageName: packageName.value,
nodeType: modalData.value?.nodeType
});
if (result.error && "httpStatusCode" in result.error && result.error.httpStatusCode === 400) infoTextErrorMessage.value = result.error.message;
if (result.success) modalBus.emit("close");
}
};
const onCheckboxChecked = () => {
checkboxWarning.value = false;
};
const onModalClose = () => {
return !loading$3.value;
};
const onInputBlur = () => {
packageName.value = packageName.value.replaceAll("npm i ", "").replaceAll("npm install ", "");
};
const onMoreInfoTopClick = () => {
telemetry$1.track("user clicked cnr docs link", { source: "install package modal top" });
};
const onLearnMoreLinkClick = () => {
telemetry$1.track("user clicked cnr docs link", { source: "install package modal bottom" });
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "540px",
name: unref(COMMUNITY_PACKAGE_INSTALL_MODAL_KEY),
title: unref(i18n$2).baseText("settings.communityNodes.installModal.title"),
"event-bus": unref(modalBus),
center: true,
"before-close": onModalClose,
"show-close": !unref(loading$3)
}, {
content: withCtx(() => [!modalData.value?.hideSuggestion ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass([_ctx.$style.descriptionContainer, "p-s"])
}, [createBaseVNode("div", null, [
createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.communityNodes.installModal.description")), 1)]),
_: 1
}),
_cache[2] || (_cache[2] = createTextVNode(" " + toDisplayString(" ") + " ")),
createVNode(unref(N8nLink_default), {
to: unref(COMMUNITY_NODES_INSTALLATION_DOCS_URL),
onClick: onMoreInfoTopClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.moreInfo")), 1)]),
_: 1
}, 8, ["to"])
]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("settings.communityNodes.browseButton.label"),
icon: "external-link",
class: normalizeClass(_ctx.$style.browseButton),
onClick: openNPMPage
}, null, 8, ["label", "class"])], 2)) : createCommentVNode("", true), createBaseVNode("div", { class: normalizeClass([_ctx.$style.formContainer, "mt-m"]) }, [
createVNode(unref(N8nInputLabel_default), {
class: normalizeClass(_ctx.$style.labelTooltip),
label: unref(i18n$2).baseText("settings.communityNodes.installModal.packageName.label"),
"tooltip-text": unref(i18n$2).baseText("settings.communityNodes.installModal.packageName.tooltip", { interpolate: { npmURL: unref(NPM_KEYWORD_SEARCH_URL) } })
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
modelValue: packageName.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => packageName.value = $event),
name: "packageNameInput",
type: "text",
"data-test-id": "package-name-input",
maxlength: 214,
placeholder: unref(i18n$2).baseText("settings.communityNodes.installModal.packageName.placeholder"),
required: true,
disabled: unref(loading$3) || modalData.value?.disableInput,
onBlur: onInputBlur
}, null, 8, [
"modelValue",
"placeholder",
"disabled"
])]),
_: 1
}, 8, [
"class",
"label",
"tooltip-text"
]),
createBaseVNode("div", { class: normalizeClass([_ctx.$style.infoText, "mt-4xs"]) }, [createBaseVNode("span", {
size: "small",
class: normalizeClass([_ctx.$style.infoText, infoTextErrorMessage.value ? _ctx.$style.error : ""]),
textContent: toDisplayString(infoTextErrorMessage.value)
}, null, 10, _hoisted_1$34)], 2),
createVNode(unref(ElCheckbox), {
modelValue: userAgreed.value,
"onUpdate:modelValue": [_cache[1] || (_cache[1] = ($event) => userAgreed.value = $event), onCheckboxChecked],
class: normalizeClass([
_ctx.$style.checkbox,
checkboxWarning.value ? _ctx.$style.error : "",
"mt-l"
]),
disabled: unref(loading$3),
"data-test-id": "user-agreement-checkbox"
}, {
default: withCtx(() => [
createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.communityNodes.installModal.checkbox.label")), 1)]),
_: 1
}),
_cache[3] || (_cache[3] = createBaseVNode("br", null, null, -1)),
createVNode(unref(N8nLink_default), {
to: unref(COMMUNITY_NODES_RISKS_DOCS_URL),
onClick: onLearnMoreLinkClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.moreInfo")), 1)]),
_: 1
}, 8, ["to"])
]),
_: 1
}, 8, [
"modelValue",
"class",
"disabled"
])
], 2)]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
loading: unref(loading$3),
disabled: !userAgreed.value || packageName.value === "" || unref(loading$3),
label: unref(loading$3) ? unref(i18n$2).baseText("settings.communityNodes.installModal.installButton.label.loading") : unref(i18n$2).baseText("settings.communityNodes.installModal.installButton.label"),
size: "large",
float: "right",
"data-test-id": "install-community-package-button",
onClick: onInstallClick
}, null, 8, [
"loading",
"disabled",
"label"
])]),
_: 1
}, 8, [
"name",
"title",
"event-bus",
"show-close"
]);
};
}
});
var CommunityPackageInstallModal_vue_vue_type_style_index_0_lang_module_default = {
descriptionContainer: "_descriptionContainer_1atq3_123",
formContainer: "_formContainer_1atq3_138",
checkbox: "_checkbox_1atq3_144",
error: "_error_1atq3_148"
};
var CommunityPackageInstallModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CommunityPackageInstallModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CommunityPackageInstallModal_vue_vue_type_style_index_0_lang_module_default }]]);
var import_semver = /* @__PURE__ */ __toESM(require_semver());
var _hoisted_1$33 = {
key: 0,
class: "status active"
};
var _hoisted_2$12 = {
key: 1,
class: "status inactive"
};
var NodesInWorkflowTable_default = /* @__PURE__ */ __plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
__name: "NodesInWorkflowTable",
props: /* @__PURE__ */ mergeModels({ data: {} }, {
"sortBy": {},
"sortByModifiers": {}
}),
emits: ["update:sortBy"],
setup(__props) {
const props = __props;
const sortBy = useModel(__props, "sortBy");
const i18n$2 = useI18n();
const projectsStore = useProjectsStore();
const headers = ref([
{
title: "Workflow",
key: "name",
width: 250
},
{
title: "Owner",
key: "homeProject.name",
width: 100
},
{
title: "Status",
key: "active",
width: 30
}
]);
const sortedItems = computed(() => {
if (!sortBy?.value?.length) return props.data;
const [{ id, desc }] = sortBy.value;
return [...props.data].sort((a, b) => {
if (!a[id] || !b[id]) return 0;
if (a[id] < b[id]) return desc ? 1 : -1;
if (a[id] > b[id]) return desc ? -1 : 1;
return 0;
});
});
const getWorkflowLink = (workflowId) => ({
name: VIEWS.WORKFLOW,
params: { name: workflowId }
});
return (_ctx, _cache) => {
const _component_RouterLink = resolveComponent("RouterLink");
return openBlock(), createElementBlock("div", null, [sortedItems.value?.length ? (openBlock(), createBlock(unref(N8nDataTableServer_default), {
key: 0,
"sort-by": sortBy.value,
"onUpdate:sortBy": _cache[0] || (_cache[0] = ($event) => sortBy.value = $event),
headers: headers.value,
items: sortedItems.value,
"items-length": sortedItems.value.length,
"page-sizes": [sortedItems.value.length + 1]
}, {
[`item.name`]: withCtx(({ item: item$2 }) => [createVNode(_component_RouterLink, {
to: getWorkflowLink(item$2.id),
target: "_blank"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
class: "ellipsis",
style: { "color": "var(--color--text)" }
}, {
default: withCtx(() => [createTextVNode(toDisplayString(item$2.name), 1)]),
_: 2
}, 1024)]),
_: 2
}, 1032, ["to"])]),
[`item.homeProject.name`]: withCtx(({ item: item$2 }) => [createBaseVNode("div", null, [createVNode(ProjectCardBadge_default, {
class: "cardBadge",
resource: item$2,
"resource-type": unref(ResourceType).Workflow,
"resource-type-label": unref(i18n$2).baseText("generic.workflow").toLowerCase(),
"personal-project": unref(projectsStore).personalProject,
"show-badge-border": false
}, null, 8, [
"resource",
"resource-type",
"resource-type-label",
"personal-project"
])])]),
[`item.active`]: withCtx(({ item: item$2 }) => [item$2.active ? (openBlock(), createElementBlock("span", _hoisted_1$33, "Active")) : (openBlock(), createElementBlock("span", _hoisted_2$12, "Inactive"))]),
_: 2
}, 1032, [
"sort-by",
"headers",
"items",
"items-length",
"page-sizes"
])) : createCommentVNode("", true)]);
};
}
}), [["__scopeId", "data-v-c38bafc6"]]);
var CommunityPackageManageConfirmModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CommunityPackageManageConfirmModal",
props: {
modalName: {},
activePackageName: {},
mode: {}
},
setup(__props) {
const props = __props;
const communityNodesStore = useCommunityNodesStore();
const nodeTypesStore = useNodeTypesStore();
const settingsStore = useSettingsStore();
const workflowsStore = useWorkflowsStore();
const modalBus = createEventBus();
const toast = useToast();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const loading$3 = ref(false);
const workflowsWithPackageNodes = ref([]);
const isUsingVerifiedAndUnverifiedPackages = settingsStore.isCommunityNodesFeatureEnabled && settingsStore.isUnverifiedPackagesEnabled;
const isUsingVerifiedPackagesOnly = settingsStore.isCommunityNodesFeatureEnabled && !settingsStore.isUnverifiedPackagesEnabled;
const communityStorePackage = computed(() => communityNodesStore.installedPackages[props.activePackageName]);
const updateVersion = computed(() => {
return settingsStore.isUnverifiedPackagesEnabled ? communityStorePackage.value.updateAvailable : nodeTypeStorePackage.value?.npmVersion;
});
const nodeTypeStorePackage = ref();
const isLatestPackageVerified = ref(true);
const packageVersion = ref(communityStorePackage.value.updateAvailable ?? "");
const includedNodes = computed(() => {
return communityStorePackage.value.installedNodes.map((node) => node.name).join(", ");
});
const getModalContent = computed(() => {
if (props.mode === COMMUNITY_PACKAGE_MANAGE_ACTIONS.UNINSTALL) return {
title: i18n$2.baseText("settings.communityNodes.confirmModal.uninstall.title"),
message: i18n$2.baseText("settings.communityNodes.confirmModal.includedNodes", { interpolate: { nodes: includedNodes.value } }),
description: workflowsWithPackageNodes.value.length ? i18n$2.baseText("settings.communityNodes.confirmModal.uninstall.description") : i18n$2.baseText("settings.communityNodes.confirmModal.noWorkflowsUsingNodes"),
buttonLabel: i18n$2.baseText("settings.communityNodes.confirmModal.uninstall.buttonLabel"),
buttonLoadingLabel: i18n$2.baseText("settings.communityNodes.confirmModal.uninstall.buttonLoadingLabel")
};
return {
title: i18n$2.baseText("settings.communityNodes.confirmModal.update.title"),
message: i18n$2.baseText("settings.communityNodes.confirmModal.includedNodes", { interpolate: { nodes: includedNodes.value } }),
description: workflowsWithPackageNodes.value.length ? i18n$2.baseText("settings.communityNodes.confirmModal.update.description") : i18n$2.baseText("settings.communityNodes.confirmModal.noWorkflowsUsingNodes"),
warning: i18n$2.baseText("settings.communityNodes.confirmModal.update.warning"),
buttonLabel: i18n$2.baseText("settings.communityNodes.confirmModal.update.buttonLabel"),
buttonLoadingLabel: i18n$2.baseText("settings.communityNodes.confirmModal.update.buttonLoadingLabel")
};
});
const onModalClose = () => {
return !loading$3.value;
};
const onConfirmButtonClick = async () => {
if (props.mode === COMMUNITY_PACKAGE_MANAGE_ACTIONS.UNINSTALL) await onUninstall();
else if (props.mode === COMMUNITY_PACKAGE_MANAGE_ACTIONS.UPDATE) await onUpdate();
};
const onUninstall = async () => {
try {
telemetry$1.track("user started cnr package deletion", {
package_name: communityStorePackage.value.packageName,
package_node_names: communityStorePackage.value.installedNodes.map((node) => node.name),
package_version: communityStorePackage.value.installedVersion,
package_author: communityStorePackage.value.authorName,
package_author_email: communityStorePackage.value.authorEmail
});
loading$3.value = true;
await communityNodesStore.uninstallPackage(props.activePackageName);
await useNodeTypesStore().getNodeTypes();
toast.showMessage({
title: i18n$2.baseText("settings.communityNodes.messages.uninstall.success.title"),
type: "success"
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("settings.communityNodes.messages.uninstall.error"));
} finally {
loading$3.value = false;
modalBus.emit("close");
}
};
const onUpdate = async () => {
try {
telemetry$1.track("user started cnr package update", {
package_name: communityStorePackage.value.packageName,
package_node_names: communityStorePackage.value.installedNodes.map((node) => node.name),
package_version_current: communityStorePackage.value.installedVersion,
package_version_new: communityStorePackage.value.updateAvailable,
package_author: communityStorePackage.value.authorName,
package_author_email: communityStorePackage.value.authorEmail
});
loading$3.value = true;
if (settingsStore.isUnverifiedPackagesEnabled) await communityNodesStore.updatePackage(props.activePackageName);
else if (settingsStore.isCommunityNodesFeatureEnabled) await communityNodesStore.updatePackage(props.activePackageName, updateVersion.value, nodeTypeStorePackage.value?.checksum);
else throw new Error("Community nodes feature is not correctly enabled.");
await useNodeTypesStore().getNodeTypes();
toast.showMessage({
title: i18n$2.baseText("settings.communityNodes.messages.update.success.title"),
message: i18n$2.baseText("settings.communityNodes.messages.update.success.message", { interpolate: {
packageName: props.activePackageName,
version: updateVersion.value ?? ""
} }),
type: "success"
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("settings.communityNodes.messages.update.error.title"));
} finally {
loading$3.value = false;
modalBus.emit("close");
}
};
async function fetchPackageInfo(packageName) {
await nodeTypesStore.loadNodeTypesIfNotLoaded();
const nodeType = nodeTypesStore.visibleNodeTypes.find((nodeType$1) => nodeType$1.name.includes(packageName));
if (nodeType) nodeTypeStorePackage.value = await nodeTypesStore.getCommunityNodeAttributes(nodeType?.name) ?? void 0;
}
function setIsVerifiedLatestPackage() {
if (isUsingVerifiedAndUnverifiedPackages && nodeTypeStorePackage.value?.npmVersion && communityStorePackage.value.updateAvailable) isLatestPackageVerified.value = import_semver.default.eq(nodeTypeStorePackage.value.npmVersion, communityStorePackage.value.updateAvailable);
}
function setPackageVersion() {
if (isUsingVerifiedPackagesOnly) packageVersion.value = nodeTypeStorePackage.value?.npmVersion ?? packageVersion.value;
}
const onClick = async () => {
useUIStore().closeModal(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY);
};
onMounted(async () => {
if (props.activePackageName) await fetchPackageInfo(props.activePackageName);
if (communityStorePackage.value?.installedNodes.length) {
const nodeTypes = communityStorePackage.value.installedNodes.map((node) => node.type);
workflowsWithPackageNodes.value = (await workflowsStore.fetchWorkflowsWithNodesIncluded(nodeTypes))?.data ?? [];
}
setIsVerifiedLatestPackage();
setPackageVersion();
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "640px",
name: unref(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY),
title: getModalContent.value.title,
"event-bus": unref(modalBus),
center: true,
"show-close": !loading$3.value,
"before-close": onModalClose
}, {
content: withCtx(() => [
createVNode(unref(N8nText_default), {
color: "text-dark",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(getModalContent.value.message), 1)]),
_: 1
}),
!isLatestPackageVerified.value ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
"data-test-id": "communityPackageManageConfirmModal-warning",
content: getModalContent.value.warning
}, null, 8, ["content"])) : createCommentVNode("", true),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.descriptionContainer) }, [createVNode(unref(N8nText_default), {
size: "medium",
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(getModalContent.value.description), 1)]),
_: 1
})], 2),
workflowsWithPackageNodes.value?.length ? (openBlock(), createBlock(NodesInWorkflowTable_default, {
key: 1,
data: workflowsWithPackageNodes.value
}, null, 8, ["data"])) : createCommentVNode("", true)
]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("settings.communityNodes.confirmModal.cancel"),
size: "large",
float: "left",
type: "secondary",
"data-test-id": "close-button",
onClick
}, null, 8, ["label"]), createVNode(unref(N8nButton_default), {
loading: loading$3.value,
disabled: loading$3.value,
label: loading$3.value ? getModalContent.value.buttonLoadingLabel : getModalContent.value.buttonLabel,
size: "large",
float: "right",
onClick: onConfirmButtonClick
}, null, 8, [
"loading",
"disabled",
"label"
])]),
_: 1
}, 8, [
"name",
"title",
"event-bus",
"show-close"
]);
};
}
});
var CommunityPackageManageConfirmModal_vue_vue_type_style_index_0_lang_module_default = {
descriptionContainer: "_descriptionContainer_1slvi_123",
descriptionIcon: "_descriptionIcon_1slvi_129",
descriptionText: "_descriptionText_1slvi_134"
};
var CommunityPackageManageConfirmModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CommunityPackageManageConfirmModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CommunityPackageManageConfirmModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$32 = ["href"];
var CommunityPlusEnrollmentModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CommunityPlusEnrollmentModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const toast = useToast();
const usageStore = useUsageStore();
const telemetry$1 = useTelemetry();
const usersStore = useUsersStore();
const isLoading = ref(false);
const valid = ref(false);
const email = ref(usersStore.currentUser?.email ?? "");
const validationRules = ref([{ name: "email" }]);
const validators = ref({ email: { validate: (value) => {
if (typeof value !== "string") return false;
if (!VALID_EMAIL_REGEX.test(value)) return {
message: "settings.users.invalidEmailError",
options: { interpolate: { email: value } }
};
return false;
} } });
const modalBus = createEventBus();
const closeModal = () => {
telemetry$1.track("User skipped community plus");
modalBus.emit("close");
props.data?.closeCallback?.();
};
const confirm = async () => {
if (!valid.value || isLoading.value) return;
isLoading.value = true;
try {
const { title: title$4, text: text$2 } = await usageStore.registerCommunityEdition(email.value);
closeModal();
toast.showMessage({
title: title$4 ?? i18n$2.baseText("communityPlusModal.success.title"),
message: text$2 ?? i18n$2.baseText("communityPlusModal.success.message", { interpolate: { email: email.value } }),
type: "success",
duration: 0
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("communityPlusModal.error.title"));
} finally {
isLoading.value = false;
}
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
name: props.modalName,
"event-bus": unref(modalBus),
"show-close": false,
"close-on-click-modal": false,
"close-on-press-escape": false
}, {
content: withCtx(() => [createBaseVNode("div", null, [
createVNode(unref(N8nText_default), {
tag: "h1",
align: "center",
size: "xlarge",
class: "mb-m"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.data?.customHeading ?? unref(i18n$2).baseText("communityPlusModal.title")), 1)]),
_: 1
}),
createVNode(unref(N8nText_default), { tag: "p" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("communityPlusModal.description")), 1)]),
_: 1
}),
createBaseVNode("ul", { class: normalizeClass(_ctx.$style.features) }, [
createBaseVNode("li", null, [_cache[2] || (_cache[2] = createBaseVNode("i", null, "🐞", -1)), createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("communityPlusModal.features.debugging.title")), 1), createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("communityPlusModal.features.debugging.description")), 1)]),
_: 1
})]),
createBaseVNode("li", null, [_cache[3] || (_cache[3] = createBaseVNode("i", null, "🔎", -1)), createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("communityPlusModal.features.execution.title")), 1), createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("communityPlusModal.features.execution.description")), 1)]),
_: 1
})]),
createBaseVNode("li", null, [_cache[4] || (_cache[4] = createBaseVNode("i", null, " 📁", -1)), createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("communityPlusModal.features.folders.title")), 1), createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("communityPlusModal.features.folders.description")), 1)]),
_: 1
})])
], 2),
createVNode(unref(N8nFormInput_default), {
id: "email",
modelValue: email.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => email.value = $event),
label: unref(i18n$2).baseText("communityPlusModal.input.email.label"),
type: "email",
name: "email",
"label-size": "small",
"tag-size": "small",
required: "",
"show-required-asterisk": true,
"validate-on-blur": false,
"validation-rules": validationRules.value,
validators: validators.value,
onValidate: _cache[1] || (_cache[1] = ($event) => valid.value = $event),
onKeyup: withKeys(confirm, ["enter"])
}, null, 8, [
"modelValue",
"label",
"validation-rules",
"validators"
])
])]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.notice) }, [createVNode(unref(N8nText_default), {
size: "xsmall",
tag: "span"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("communityPlusModal.notice")) + " ", 1), createBaseVNode("a", {
href: unref(COMMUNITY_PLUS_DOCS_URL),
target: "_blank"
}, toDisplayString(unref(i18n$2).baseText("generic.moreInfo")), 9, _hoisted_1$32)]),
_: 1
})], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.buttons) }, [createVNode(unref(N8nButton_default), {
class: normalizeClass(_ctx.$style.skip),
type: "secondary",
text: "",
disabled: isLoading.value,
onClick: closeModal
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("communityPlusModal.button.skip")), 1)]),
_: 1
}, 8, ["class", "disabled"]), createVNode(unref(N8nButton_default), {
disabled: !valid.value || isLoading.value,
type: "primary",
onClick: confirm
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("communityPlusModal.button.confirm")), 1)]),
_: 1
}, 8, ["disabled"])], 2)]),
_: 1
}, 8, ["name", "event-bus"]);
};
}
});
var CommunityPlusEnrollmentModal_vue_vue_type_style_index_0_lang_module_default = {
notice: "_notice_mrv81_123",
features: "_features_mrv81_127",
buttons: "_buttons_mrv81_146",
skip: "_skip_mrv81_152"
};
var CommunityPlusEnrollmentModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CommunityPlusEnrollmentModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CommunityPlusEnrollmentModal_vue_vue_type_style_index_0_lang_module_default }]]);
var ContactPromptModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ContactPromptModal",
props: { modalName: {} },
setup(__props) {
const email = ref("");
const modalBus = createEventBus();
const npsSurveyStore = useNpsSurveyStore();
const rootStore = useRootStore();
const usersStore = useUsersStore();
const toast = useToast();
const telemetry$1 = useTelemetry();
const title$4 = computed(() => {
if (npsSurveyStore.promptsData?.title) return npsSurveyStore.promptsData.title;
return "You’re a power user 💪";
});
const description$8 = computed(() => {
if (npsSurveyStore.promptsData?.message) return npsSurveyStore.promptsData.message;
return "Your experience with n8n can help us improve — for you and our entire community.";
});
const isEmailValid = computed(() => {
return VALID_EMAIL_REGEX.test(String(email.value).toLowerCase());
});
const closeDialog = () => {
if (!isEmailValid.value) telemetry$1.track("User closed email modal", {
instance_id: rootStore.instanceId,
email: null
});
};
const send = async () => {
if (isEmailValid.value) {
if ((await usersStore.submitContactInfo(email.value)).updated) {
telemetry$1.track("User closed email modal", {
instance_id: rootStore.instanceId,
email: email.value
});
toast.showMessage({
title: "Thanks!",
message: "It's people like you that help make n8n better",
type: "success"
});
}
modalBus.emit("close");
}
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: _ctx.modalName,
"event-bus": unref(modalBus),
center: true,
"close-on-press-escape": false,
"before-close": closeDialog,
"custom-class": "contact-prompt-modal",
width: "460px"
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), {
tag: "h2",
size: "xlarge",
color: "text-dark"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(title$4.value), 1)]),
_: 1
})]),
content: withCtx(() => [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.description) }, [createVNode(unref(N8nText_default), {
size: "medium",
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(description$8.value), 1)]),
_: 1
})], 2),
createBaseVNode("div", { onKeyup: withKeys(send, ["enter"]) }, [createVNode(unref(N8nInput_default), {
modelValue: email.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => email.value = $event),
placeholder: "Your email address"
}, null, 8, ["modelValue"])], 32),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.disclaimer) }, [createVNode(unref(N8nText_default), {
size: "small",
color: "text-base"
}, {
default: withCtx(() => _cache[1] || (_cache[1] = [createTextVNode("David from our product team will get in touch personally")])),
_: 1
})], 2)
]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
label: "Send",
float: "right",
disabled: !isEmailValid.value,
onClick: send
}, null, 8, ["disabled"])], 2)]),
_: 1
}, 8, ["name", "event-bus"]);
};
}
});
var ContactPromptModal_vue_vue_type_style_index_0_lang_module_default = {
description: "_description_axehw_123",
disclaimer: "_disclaimer_axehw_127"
};
var ContactPromptModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ContactPromptModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ContactPromptModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$31 = {
key: 0,
"data-test-id": "node-auth-type-selector"
};
var AuthTypeSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "AuthTypeSelector",
props: { credentialType: {} },
emits: ["authTypeChanged"],
setup(__props, { expose: __expose, emit: __emit }) {
const emit = __emit;
const nodeTypesStore = useNodeTypesStore();
const ndvStore = useNDVStore();
const i18n$2 = useI18n();
const props = __props;
const selected = ref("");
const authRelatedFieldsValues = ref({});
onMounted(() => {
if (activeNodeType.value?.credentials) {
const credentialsForType = activeNodeType.value.credentials.find((cred) => cred.name === props.credentialType.name) || null;
selected.value = getAuthTypeForNodeCredential(activeNodeType.value, credentialsForType)?.value || "";
}
authRelatedFields.value.forEach((field) => {
authRelatedFieldsValues.value = {
...authRelatedFieldsValues.value,
[field.name]: field.default
};
});
});
const activeNodeType = computed(() => {
const activeNode = ndvStore.activeNode;
if (activeNode) return nodeTypesStore.getNodeType(activeNode.type, activeNode.typeVersion);
return null;
});
const authOptions = computed(() => {
return getNodeAuthOptions(activeNodeType.value, ndvStore.activeNode?.typeVersion);
});
const filteredNodeAuthOptions = computed(() => {
return authOptions.value.filter((option) => shouldShowAuthOption(option));
});
const authRelatedFields = computed(() => {
const nodeAuthFields = getNodeAuthFields(activeNodeType.value);
return activeNodeType.value?.properties.filter((prop) => isAuthRelatedParameter(nodeAuthFields, prop)) || [];
});
function shouldShowAuthOption(option) {
if (authRelatedFields.value.length === 0) return true;
let shouldDisplay = false;
Object.keys(authRelatedFieldsValues.value).forEach((fieldName) => {
if (option.displayOptions?.show) {
if (option.displayOptions.show[fieldName]?.includes(authRelatedFieldsValues.value[fieldName])) {
shouldDisplay = true;
return;
}
}
});
return shouldDisplay;
}
function onAuthTypeChange(newType) {
emit("authTypeChanged", typeof newType === "string" ? newType : String(newType));
}
function valueChanged(data) {
authRelatedFieldsValues.value = {
...authRelatedFieldsValues.value,
[data.name]: data.value
};
}
__expose({ onAuthTypeChange });
return (_ctx, _cache) => {
return filteredNodeAuthOptions.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$31, [
(openBlock(true), createElementBlock(Fragment, null, renderList(authRelatedFields.value, (parameter) => {
return openBlock(), createElementBlock("div", {
key: parameter.name,
class: "mb-l"
}, [createVNode(ParameterInputFull_default, {
parameter,
value: authRelatedFieldsValues.value[parameter.name] || parameter.default,
path: parameter.name,
"display-options": false,
onUpdate: valueChanged
}, null, 8, [
"parameter",
"value",
"path"
])]);
}), 128)),
createBaseVNode("div", null, [createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("credentialEdit.credentialConfig.authTypeSelectorLabel"),
"tooltip-text": unref(i18n$2).baseText("credentialEdit.credentialConfig.authTypeSelectorTooltip"),
required: true
}, null, 8, ["label", "tooltip-text"])]),
(openBlock(true), createElementBlock(Fragment, null, renderList(filteredNodeAuthOptions.value, (prop) => {
return openBlock(), createBlock(unref(ElRadio), {
key: prop.value,
modelValue: selected.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => selected.value = $event), onAuthTypeChange],
label: prop.value,
class: normalizeClass(_ctx.$style.authRadioButton),
border: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(prop.name), 1)]),
_: 2
}, 1032, [
"modelValue",
"label",
"class"
]);
}), 128))
])) : createCommentVNode("", true);
};
}
});
var AuthTypeSelector_vue_vue_type_style_index_0_lang_module_default = { authRadioButton: "_authRadioButton_mzxud_123" };
var AuthTypeSelector_default = /* @__PURE__ */ __plugin_vue_export_helper_default(AuthTypeSelector_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": AuthTypeSelector_vue_vue_type_style_index_0_lang_module_default }]]);
var Banner_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "Banner",
props: {
theme: {},
message: {},
buttonLabel: { default: "" },
buttonLoadingLabel: { default: "" },
buttonTitle: { default: "" },
details: { default: "" },
buttonLoading: {
type: Boolean,
default: false
}
},
emits: ["click"],
setup(__props, { emit: __emit }) {
const emit = __emit;
const expanded = ref(false);
const expand = () => {
expanded.value = true;
};
const onClick = () => {
expanded.value = false;
emit("click");
};
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(ElTag), {
type: _ctx.theme,
"disable-transitions": true,
class: normalizeClass(_ctx.$style.container)
}, {
default: withCtx(() => [
createVNode(unref(N8nIcon_default), {
icon: _ctx.theme === "success" ? "circle-check" : "triangle-alert",
class: normalizeClass(_ctx.theme === "success" ? _ctx.$style.icon : _ctx.$style.dangerIcon)
}, null, 8, ["icon", "class"]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.banner) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [createBaseVNode("div", null, [createBaseVNode("span", { class: normalizeClass(_ctx.theme === "success" ? _ctx.$style.message : _ctx.$style.dangerMessage) }, toDisplayString(_ctx.message) + "\xA0 ", 3), _ctx.details && !expanded.value ? (openBlock(), createBlock(unref(N8nLink_default), {
key: 0,
bold: true,
size: "small",
onClick: expand
}, {
default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.moreDetails) }, "More details", 2)]),
_: 1
})) : createCommentVNode("", true)])], 2), _ctx.$slots.button ? renderSlot(_ctx.$slots, "button", { key: 0 }) : _ctx.buttonLabel ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 1,
label: _ctx.buttonLoading && _ctx.buttonLoadingLabel ? _ctx.buttonLoadingLabel : _ctx.buttonLabel,
title: _ctx.buttonTitle,
type: _ctx.theme,
loading: _ctx.buttonLoading,
size: "small",
outline: "",
onClick: withModifiers(onClick, ["stop"])
}, null, 8, [
"label",
"title",
"type",
"loading"
])) : createCommentVNode("", true)], 2),
expanded.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.details)
}, toDisplayString(_ctx.details), 3)) : createCommentVNode("", true)
]),
_: 3
}, 8, ["type", "class"]);
};
}
});
var Banner_vue_vue_type_style_index_0_lang_module_default = {
icon: "_icon_3x8pe_123",
dangerIcon: "_dangerIcon_3x8pe_131 _icon_3x8pe_123",
container: "_container_3x8pe_136",
message: "_message_3x8pe_143",
dangerMessage: "_dangerMessage_3x8pe_150 _message_3x8pe_143",
banner: "_banner_3x8pe_155",
content: "_content_3x8pe_160",
details: "_details_3x8pe_167 _message_3x8pe_143",
moreDetails: "_moreDetails_3x8pe_174"
};
var Banner_default = /* @__PURE__ */ __plugin_vue_export_helper_default(Banner_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": Banner_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$30 = {
key: 0,
class: "fixed-collection-wrapper",
"data-test-id": "fixed-collection-wrapper"
};
var ParameterInputExpanded_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ParameterInputExpanded",
props: {
parameter: {},
value: { type: [
String,
Number,
Boolean,
null,
Object,
Array
] },
nodeValues: { default: () => ({}) },
showValidationWarnings: { type: Boolean },
documentationUrl: { default: void 0 },
eventSource: { default: void 0 },
label: { default: () => ({ size: "small" }) }
},
emits: ["update"],
setup(__props, { emit: __emit }) {
const LazyFixedCollectionParameter = defineAsyncComponent(async () => await __vitePreload(() => import("./FixedCollectionParameter-CpMHT5tV.js"), __vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61])));
const props = __props;
const emit = __emit;
const focused = ref(false);
const blurredEver = ref(false);
const menuExpanded = ref(false);
const eventBus = ref(createEventBus());
const uiStore = useUIStore();
const workflowsStore = useWorkflowsStore();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const { activeCredentialType } = storeToRefs(uiStore);
const isFixedCollectionType = computed(() => {
return props.parameter.type === "fixedCollection";
});
const hiddenIssuesInputs = computed(() => {
if (!isFixedCollectionType.value) return [];
if (!props.parameter.options?.length) return [];
const names = [];
for (const option of props.parameter.options) if (isINodePropertyCollection(option)) names.push(...option.values.map((value) => value.name));
return names;
});
const fixedCollectionValues = computed(() => {
if (!isFixedCollectionType.value || !props.value) return {};
return props.value;
});
const showRequiredErrors = computed(() => {
if (!props.parameter.required) return false;
if (blurredEver.value || props.showValidationWarnings) {
if (props.parameter.type === "string") return !props.value;
if (props.parameter.type === "number") {
if (typeof props.value === "string" && props.value.startsWith("=")) return false;
return typeof props.value !== "number";
}
}
return false;
});
const hint$1 = computed(() => {
if (isValueExpression$1.value) return null;
return i18n$2.credText(activeCredentialType.value).hint(props.parameter);
});
const isValueExpression$1 = computed(() => {
return isValueExpression(props.parameter, props.value);
});
function onFocus() {
focused.value = true;
}
function onBlur() {
blurredEver.value = true;
focused.value = false;
}
function onMenuExpanded(expanded) {
menuExpanded.value = expanded;
}
function optionSelected(command) {
eventBus.value.emit("optionSelected", command);
}
function valueChanged(parameterData) {
let name$2 = parameterData.name;
if (!isFixedCollectionType.value) name$2 = name$2.split(".").pop() ?? name$2;
emit("update", {
name: name$2,
value: parameterData.value
});
}
function onDocumentationUrlClick() {
telemetry$1.track("User clicked credential modal docs link", {
docs_link: props.documentationUrl,
source: "field",
workflow_id: workflowsStore.workflowId
});
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", null, [createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).credText(unref(activeCredentialType)).inputLabelDisplayName(_ctx.parameter),
"tooltip-text": unref(i18n$2).credText(unref(activeCredentialType)).inputLabelDescription(_ctx.parameter),
required: _ctx.parameter.required,
"show-tooltip": focused.value,
"show-options": menuExpanded.value,
"data-test-id": _ctx.parameter.name,
size: _ctx.label.size
}, {
options: withCtx(() => [createVNode(ParameterOptions_default, {
parameter: _ctx.parameter,
value: _ctx.value,
"is-read-only": false,
"show-options": !isFixedCollectionType.value,
"show-expression-selector": !isFixedCollectionType.value,
"is-value-expression": isValueExpression$1.value,
"onUpdate:modelValue": optionSelected,
onMenuExpanded
}, null, 8, [
"parameter",
"value",
"show-options",
"show-expression-selector",
"is-value-expression"
])]),
default: withCtx(() => [!isFixedCollectionType.value ? (openBlock(), createBlock(ParameterInputWrapper_default, {
key: 0,
ref: "param",
"input-size": "large",
parameter: _ctx.parameter,
"model-value": _ctx.value,
path: _ctx.parameter.name,
"hide-issues": true,
"documentation-url": _ctx.documentationUrl,
"error-highlight": showRequiredErrors.value,
"is-for-credential": true,
"event-source": _ctx.eventSource,
hint: !showRequiredErrors.value && hint$1.value ? hint$1.value : "",
"event-bus": eventBus.value,
onFocus,
onBlur,
onTextInput: valueChanged,
onUpdate: valueChanged
}, null, 8, [
"parameter",
"model-value",
"path",
"documentation-url",
"error-highlight",
"event-source",
"hint",
"event-bus"
])) : createCommentVNode("", true), showRequiredErrors.value ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.errors)
}, [createVNode(unref(N8nText_default), {
color: "danger",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("parameterInputExpanded.thisFieldIsRequired")) + " ", 1), _ctx.documentationUrl ? (openBlock(), createBlock(unref(N8nLink_default), {
key: 0,
to: _ctx.documentationUrl,
size: "small",
underline: true,
onClick: onDocumentationUrlClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("parameterInputExpanded.openDocs")), 1)]),
_: 1
}, 8, ["to"])) : createCommentVNode("", true)]),
_: 1
})], 2)) : createCommentVNode("", true)]),
_: 1
}, 8, [
"label",
"tooltip-text",
"required",
"show-tooltip",
"show-options",
"data-test-id",
"size"
]), isFixedCollectionType.value ? (openBlock(), createElementBlock("div", _hoisted_1$30, [createVNode(unref(LazyFixedCollectionParameter), {
parameter: _ctx.parameter,
values: fixedCollectionValues.value,
"node-values": _ctx.nodeValues,
path: _ctx.parameter.name,
"hidden-issues-inputs": hiddenIssuesInputs.value,
onValueChanged: valueChanged
}, null, 8, [
"parameter",
"values",
"node-values",
"path",
"hidden-issues-inputs"
])])) : createCommentVNode("", true)]);
};
}
});
var ParameterInputExpanded_vue_vue_type_style_index_0_lang_module_default = {
errors: "_errors_w7lcy_123",
hint: "_hint_w7lcy_127"
};
var ParameterInputExpanded_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ParameterInputExpanded_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ParameterInputExpanded_vue_vue_type_style_index_0_lang_module_default }]]);
var CredentialInputs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialInputs",
props: {
credentialProperties: {},
credentialData: {},
documentationUrl: {},
showValidationWarnings: { type: Boolean }
},
emits: ["update"],
setup(__props, { emit: __emit }) {
const props = __props;
const credentialDataValues = computed(() => props.credentialData);
const emit = __emit;
function valueChanged(parameterData) {
emit("update", parameterData);
}
return (_ctx, _cache) => {
return _ctx.credentialProperties.length ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.container),
onKeydown: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.credentialProperties, (parameter) => {
return openBlock(), createElementBlock("form", {
key: parameter.name,
autocomplete: "off",
"data-test-id": "credential-connection-parameter",
onSubmit: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"]))
}, [parameter.type === "notice" ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
content: parameter.displayName
}, null, 8, ["content"])) : (openBlock(), createBlock(ParameterInputExpanded_default, {
key: 1,
parameter,
value: credentialDataValues.value[parameter.name],
"node-values": credentialDataValues.value,
"documentation-url": _ctx.documentationUrl,
"show-validation-warnings": _ctx.showValidationWarnings,
label: { size: "medium" },
"event-source": "credentials",
onUpdate: valueChanged
}, null, 8, [
"parameter",
"value",
"node-values",
"documentation-url",
"show-validation-warnings"
]))], 32);
}), 128))], 34)) : createCommentVNode("", true);
};
}
});
var CredentialInputs_vue_vue_type_style_index_0_lang_module_default = { container: "_container_he5xf_123" };
var CredentialInputs_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialInputs_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialInputs_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$29 = ["title"];
var GoogleAuthButton_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "GoogleAuthButton",
setup(__props) {
const { baseUrl } = useRootStore();
const type = useUIStore().appliedTheme === "dark" ? ".dark.png" : ".png";
const i18n$2 = useI18n();
const googleAuthButtons = {
"--google-auth-btn--color--background--normal": `url(${baseUrl}static/google-auth/normal${type}`,
"--google-auth-btn--color--background--focus": `url(${baseUrl}static/google-auth/focus${type}`,
"--google-auth-btn--color--background--pressed": `url(${baseUrl}static/google-auth/pressed${type}`,
"--google-auth-btn--color--background--disabled": `url(${baseUrl}static/google-auth/disabled${type}`
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("button", {
class: normalizeClass(_ctx.$style.googleAuthBtn),
title: unref(i18n$2).baseText("credentialEdit.oAuthButton.signInWithGoogle"),
style: googleAuthButtons
}, null, 10, _hoisted_1$29);
};
}
});
var GoogleAuthButton_vue_vue_type_style_index_0_lang_module_default = { googleAuthBtn: "_googleAuthBtn_1ja0c_123" };
var GoogleAuthButton_default = /* @__PURE__ */ __plugin_vue_export_helper_default(GoogleAuthButton_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": GoogleAuthButton_vue_vue_type_style_index_0_lang_module_default }]]);
var OauthButton_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "OauthButton",
props: { isGoogleOAuthType: { type: Boolean } },
setup(__props) {
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [_ctx.isGoogleOAuthType ? (openBlock(), createBlock(GoogleAuthButton_default, { key: 0 })) : (openBlock(), createBlock(unref(N8nButton_default), {
key: 1,
label: unref(i18n$2).baseText("credentialEdit.oAuthButton.connectMyAccount"),
size: "large"
}, null, 8, ["label"]))], 2);
};
}
});
var OauthButton_vue_vue_type_style_index_0_lang_module_default = { container: "_container_11rtd_123" };
var OauthButton_default = /* @__PURE__ */ __plugin_vue_export_helper_default(OauthButton_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": OauthButton_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$28 = { key: 1 };
var _hoisted_2$11 = ["textContent"];
var _hoisted_3$6 = { class: "ml-4xs" };
var CredentialConfig_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialConfig",
props: {
mode: {},
credentialType: {},
credentialProperties: {},
credentialData: {},
credentialId: { default: "" },
credentialPermissions: { default: () => ({}) },
parentTypes: { default: () => [] },
showValidationWarning: {
type: Boolean,
default: false
},
authError: { default: "" },
testedSuccessfully: { type: Boolean },
isOAuthType: { type: Boolean },
allOAuth2BasePropertiesOverridden: { type: Boolean },
isOAuthConnected: { type: Boolean },
isRetesting: { type: Boolean },
requiredPropertiesFilled: { type: Boolean },
showAuthTypeSelector: { type: Boolean },
isManaged: { type: Boolean }
},
emits: [
"update",
"authTypeChanged",
"scrollToTop",
"retest",
"oauth"
],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const credentialsStore = useCredentialsStore();
const ndvStore = useNDVStore();
const rootStore = useRootStore();
const uiStore = useUIStore();
const workflowsStore = useWorkflowsStore();
const assistantStore = useAssistantStore();
const chatPanelStore = useChatPanelStore();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
onBeforeMount(async () => {
uiStore.activeCredentialType = props.credentialType.name;
if (rootStore.defaultLocale === "en") return;
const key = `n8n-nodes-base.credentials.${props.credentialType.name}`;
if (i18n$2.exists(key)) return;
const credTranslation = await credentialsStore.getCredentialTranslation(props.credentialType.name);
if (!credTranslation) return;
addCredentialTranslation({ [props.credentialType.name]: credTranslation }, rootStore.defaultLocale);
});
const appName = computed(() => {
if (!props.credentialType) return "";
return getAppNameFromCredType(props.credentialType.displayName) || i18n$2.baseText("credentialEdit.credentialConfig.theServiceYouReConnectingTo");
});
const credentialTypeName = computed(() => props.credentialType?.name);
const credentialOwnerName = computed(() => credentialsStore.getCredentialOwnerNameById(`${props.credentialId}`));
const documentationUrl = computed(() => {
const type = props.credentialType;
const activeNode = ndvStore.activeNode;
const isCommunityNode = activeNode ? isCommunityPackageName(activeNode.type) : false;
const docUrl = type?.documentationUrl;
if (!docUrl) return "";
let url;
if (docUrl.startsWith("https://") || docUrl.startsWith("http://")) {
url = new URL(docUrl);
if (url.hostname !== "docs.n8n.io") return docUrl;
} else if (isCommunityNode) return "";
else url = new URL(`${BUILTIN_CREDENTIALS_DOCS_URL}${docUrl}/`);
if (url.hostname === "docs.n8n.io") {
url.searchParams.set("utm_source", "n8n_app");
url.searchParams.set("utm_medium", "credential_settings");
url.searchParams.set("utm_campaign", "create_new_credentials_modal");
}
return url.href;
});
const isGoogleOAuthType = computed(() => credentialTypeName.value === "googleOAuth2Api" || props.parentTypes.includes("googleOAuth2Api"));
const oAuthCallbackUrl = computed(() => {
const oauthType = credentialTypeName.value === "oAuth2Api" || props.parentTypes.includes("oAuth2Api") ? "oauth2" : "oauth1";
return rootStore.OAuthCallbackUrls[oauthType];
});
const showOAuthSuccessBanner = computed(() => {
return props.isOAuthType && props.requiredPropertiesFilled && props.isOAuthConnected && !props.authError;
});
const isMissingCredentials = computed(() => props.credentialType === null);
const isNewCredential = computed(() => props.mode === "new" && !props.credentialId);
const isAskAssistantAvailable = computed(() => documentationUrl.value && documentationUrl.value.includes("docs.n8n.io") && props.credentialProperties.length && props.credentialPermissions.update && !(props.isOAuthType && props.requiredPropertiesFilled) && assistantStore.isAssistantEnabled);
const assistantAlreadyAsked = computed(() => {
return assistantStore.isCredTypeActive(props.credentialType);
});
function onDataChange(event) {
emit("update", event);
}
function onDocumentationUrlClick() {
telemetry$1.track("User clicked credential modal docs link", {
docs_link: documentationUrl.value,
credential_type: credentialTypeName.value,
source: "modal",
workflow_id: workflowsStore.workflowId
});
}
function onAuthTypeChange(newType) {
emit("authTypeChanged", newType);
}
async function onAskAssistantClick() {
if (!assistantStore.isSessionEnded) {
uiStore.openModalWithData({
name: NEW_ASSISTANT_SESSION_MODAL,
data: { context: { credHelp: { credType: props.credentialType } } }
});
return;
}
await chatPanelStore.openWithCredHelp(props.credentialType);
}
watch(showOAuthSuccessBanner, (newValue, oldValue) => {
if (newValue && !oldValue) emit("scrollToTop");
});
return (_ctx, _cache) => {
return _ctx.isManaged ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "warning",
icon: "triangle-alert"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("freeAi.credits.credentials.edit")), 1)]),
_: 1
})) : (openBlock(), createElementBlock("div", _hoisted_1$28, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.config),
"data-test-id": "node-credentials-config-container"
}, [
createVNode(FreeAiCreditsCallout_default, { "credential-type-name": _ctx.credentialType?.name }, null, 8, ["credential-type-name"]),
withDirectives(createVNode(Banner_default, {
theme: "danger",
message: unref(i18n$2).baseText(`credentialEdit.credentialConfig.pleaseCheckTheErrorsBelow${_ctx.credentialPermissions.update ? "" : ".sharee"}`, { interpolate: { owner: credentialOwnerName.value } })
}, null, 8, ["message"]), [[vShow, _ctx.showValidationWarning]]),
_ctx.authError && !_ctx.showValidationWarning ? (openBlock(), createBlock(Banner_default, {
key: 0,
theme: "danger",
message: unref(i18n$2).baseText(`credentialEdit.credentialConfig.couldntConnectWithTheseSettings${_ctx.credentialPermissions.update ? "" : ".sharee"}`, { interpolate: { owner: credentialOwnerName.value } }),
details: _ctx.authError,
"button-label": unref(i18n$2).baseText("credentialEdit.credentialConfig.retry"),
"button-loading-label": "Retrying",
"button-title": unref(i18n$2).baseText("credentialEdit.credentialConfig.retryCredentialTest"),
"button-loading": _ctx.isRetesting,
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("retest"))
}, null, 8, [
"message",
"details",
"button-label",
"button-title",
"button-loading"
])) : createCommentVNode("", true),
withDirectives(createVNode(Banner_default, {
theme: "success",
message: unref(i18n$2).baseText("credentialEdit.credentialConfig.accountConnected"),
"button-label": unref(i18n$2).baseText("credentialEdit.credentialConfig.reconnect"),
"button-title": unref(i18n$2).baseText("credentialEdit.credentialConfig.reconnectOAuth2Credential"),
"data-test-id": "oauth-connect-success-banner",
onClick: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("oauth"))
}, createSlots({ _: 2 }, [isGoogleOAuthType.value ? {
name: "button",
fn: withCtx(() => [createBaseVNode("p", {
class: normalizeClass(_ctx.$style.googleReconnectLabel),
textContent: toDisplayString(`${unref(i18n$2).baseText("credentialEdit.credentialConfig.reconnect")}:`)
}, null, 10, _hoisted_2$11), createVNode(GoogleAuthButton_default, { onClick: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("oauth")) })]),
key: "0"
} : void 0]), 1032, [
"message",
"button-label",
"button-title"
]), [[vShow, showOAuthSuccessBanner.value && !_ctx.showValidationWarning]]),
withDirectives(createVNode(Banner_default, {
theme: "success",
message: unref(i18n$2).baseText("credentialEdit.credentialConfig.connectionTestedSuccessfully"),
"button-label": unref(i18n$2).baseText("credentialEdit.credentialConfig.retry"),
"button-loading-label": unref(i18n$2).baseText("credentialEdit.credentialConfig.retrying"),
"button-title": unref(i18n$2).baseText("credentialEdit.credentialConfig.retryCredentialTest"),
"button-loading": _ctx.isRetesting,
"data-test-id": "credentials-config-container-test-success",
onClick: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("retest"))
}, null, 8, [
"message",
"button-label",
"button-loading-label",
"button-title",
"button-loading"
]), [[vShow, _ctx.testedSuccessfully && !_ctx.showValidationWarning]]),
_ctx.credentialPermissions.create && isNewCredential.value || _ctx.credentialPermissions.update ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
documentationUrl.value && _ctx.credentialProperties.length ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
theme: "warning"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.needHelpFillingOutTheseFields")) + " ", 1), createBaseVNode("span", _hoisted_3$6, [createVNode(unref(N8nLink_default), {
to: documentationUrl.value,
size: "small",
bold: "",
onClick: onDocumentationUrlClick
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.openDocs")), 1)]),
_: 1
}, 8, ["to"])])]),
_: 1
})) : createCommentVNode("", true),
_ctx.showAuthTypeSelector && isNewCredential.value ? (openBlock(), createBlock(AuthTypeSelector_default, {
key: 1,
"credential-type": _ctx.credentialType,
onAuthTypeChanged: onAuthTypeChange
}, null, 8, ["credential-type"])) : createCommentVNode("", true),
isAskAssistantAvailable.value ? (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(_ctx.$style.askAssistantButton),
"data-test-id": "credential-edit-ask-assistant-button"
}, [createVNode(unref(InlineAskAssistantButton_default), {
asked: assistantAlreadyAsked.value,
onClick: onAskAssistantClick
}, null, 8, ["asked"]), _cache[5] || (_cache[5] = createBaseVNode("span", null, "for setup instructions", -1))], 2)) : createCommentVNode("", true),
_ctx.isOAuthType && !_ctx.allOAuth2BasePropertiesOverridden ? (openBlock(), createBlock(CopyInput_default, {
key: 3,
label: unref(i18n$2).baseText("credentialEdit.credentialConfig.oAuthRedirectUrl"),
value: oAuthCallbackUrl.value,
"copy-button-text": unref(i18n$2).baseText("credentialEdit.credentialConfig.clickToCopy"),
hint: unref(i18n$2).baseText("credentialEdit.credentialConfig.subtitle", { interpolate: { appName: appName.value } }),
"toast-title": unref(i18n$2).baseText("credentialEdit.credentialConfig.redirectUrlCopiedToClipboard"),
"redact-value": true
}, null, 8, [
"label",
"value",
"copy-button-text",
"hint",
"toast-title"
])) : createCommentVNode("", true)
], 64)) : (openBlock(), createBlock(EnterpriseEdition_ee_default, {
key: 2,
features: [unref(EnterpriseEditionFeature).Sharing]
}, {
default: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nInfoTip_default), { bold: false }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialEdit.info.sharee", { interpolate: { credentialOwnerName: credentialOwnerName.value } })), 1)]),
_: 1
})])]),
_: 1
}, 8, ["features"])),
_ctx.credentialType && (_ctx.credentialPermissions.create && isNewCredential.value || _ctx.credentialPermissions.update) ? (openBlock(), createBlock(CredentialInputs_default, {
key: 3,
"credential-data": _ctx.credentialData,
"credential-properties": _ctx.credentialProperties,
"documentation-url": documentationUrl.value,
"show-validation-warnings": _ctx.showValidationWarning,
onUpdate: onDataChange
}, null, 8, [
"credential-data",
"credential-properties",
"documentation-url",
"show-validation-warnings"
])) : createCommentVNode("", true),
_ctx.isOAuthType && _ctx.requiredPropertiesFilled && !_ctx.isOAuthConnected && (_ctx.credentialPermissions.create && isNewCredential.value || _ctx.credentialPermissions.update) ? (openBlock(), createBlock(OauthButton_default, {
key: 4,
"is-google-o-auth-type": isGoogleOAuthType.value,
"data-test-id": "oauth-connect-button",
onClick: _cache[4] || (_cache[4] = ($event) => _ctx.$emit("oauth"))
}, null, 8, ["is-google-o-auth-type"])) : createCommentVNode("", true),
isMissingCredentials.value ? (openBlock(), createBlock(unref(N8nText_default), {
key: 5,
color: "text-base",
size: "medium"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.missingCredentialType")), 1)]),
_: 1
})) : createCommentVNode("", true),
createVNode(EnterpriseEdition_ee_default, { features: [unref(EnterpriseEditionFeature).ExternalSecrets] }, {
fallback: withCtx(() => [createVNode(unref(N8nInfoTip_default), { class: "mt-s" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.externalSecrets")) + " ", 1), createVNode(unref(N8nLink_default), {
bold: "",
to: unref(i18n$2).baseText("settings.externalSecrets.docs"),
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.externalSecrets.moreInfo")), 1)]),
_: 1
}, 8, ["to"])]),
_: 1
})]),
_: 1
}, 8, ["features"])
], 2)]));
};
}
});
var CredentialConfig_vue_vue_type_style_index_0_lang_module_default = {
config: "_config_1ujso_123",
googleReconnectLabel: "_googleReconnectLabel_1ujso_131",
askAssistantButton: "_askAssistantButton_1ujso_135"
};
var CredentialConfig_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialConfig_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialConfig_vue_vue_type_style_index_0_lang_module_default }]]);
var CredentialInfo_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialInfo",
props: { currentCredential: {} },
setup(__props) {
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [
_ctx.currentCredential ? (openBlock(), createBlock(unref(ElRow), { key: 0 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: normalizeClass(_ctx.$style.label)
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
compact: true,
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialInfo.created")), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 16,
class: normalizeClass(_ctx.$style.valueLabel)
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), { compact: true }, {
default: withCtx(() => [createVNode(TimeAgo_default, {
date: _ctx.currentCredential.createdAt,
capitalize: true
}, null, 8, ["date"])]),
_: 1
})]),
_: 1
}, 8, ["class"])]),
_: 1
})) : createCommentVNode("", true),
_ctx.currentCredential ? (openBlock(), createBlock(unref(ElRow), { key: 1 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: normalizeClass(_ctx.$style.label)
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
compact: true,
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialInfo.lastModified")), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 16,
class: normalizeClass(_ctx.$style.valueLabel)
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), { compact: true }, {
default: withCtx(() => [createVNode(TimeAgo_default, {
date: _ctx.currentCredential.updatedAt,
capitalize: true
}, null, 8, ["date"])]),
_: 1
})]),
_: 1
}, 8, ["class"])]),
_: 1
})) : createCommentVNode("", true),
_ctx.currentCredential ? (openBlock(), createBlock(unref(ElRow), { key: 2 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 8,
class: normalizeClass(_ctx.$style.label)
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), {
compact: true,
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialInfo.id")), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 16,
class: normalizeClass(_ctx.$style.valueLabel)
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), { compact: true }, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.currentCredential.id), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"])]),
_: 1
})) : createCommentVNode("", true)
], 2);
};
}
});
var CredentialInfo_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_yxrkz_123",
label: "_label_yxrkz_127",
accessLabel: "_accessLabel_yxrkz_132 _label_yxrkz_127",
valueLabel: "_valueLabel_yxrkz_137"
};
var CredentialInfo_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialInfo_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialInfo_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$27 = { key: 0 };
var _hoisted_2$10 = { key: 1 };
var CredentialSharing_ee_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialSharing.ee",
props: {
credentialId: {},
credentialData: {},
credentialPermissions: {},
credential: { default: null },
modalBus: {},
isSharedGlobally: {
type: Boolean,
default: false
}
},
emits: ["update:modelValue", "update:shareWithAllUsers"],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const i18n$2 = useI18n();
const usersStore = useUsersStore();
const uiStore = useUIStore();
const settingsStore = useSettingsStore();
const projectsStore = useProjectsStore();
const rolesStore = useRolesStore();
const pageRedirectionHelper = usePageRedirectionHelper();
const sharedWithProjects = ref([...props.credential?.sharedWithProjects ?? []]);
const isSharingEnabled = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]);
const credentialOwnerName = computed(() => {
const { name: name$2, email } = splitName(props.credential?.homeProject?.name ?? "");
return name$2 ?? email ?? "";
});
const credentialDataHomeProject = computed(() => {
const credentialContainsProjectSharingData = (data) => {
return "homeProject" in data;
};
return props.credentialData && credentialContainsProjectSharingData(props.credentialData) ? props.credentialData.homeProject : void 0;
});
const projects = computed(() => {
return projectsStore.projects.filter((project) => project.id !== props.credential?.homeProject?.id && project.id !== credentialDataHomeProject.value?.id);
});
const homeProject = computed(() => props.credential?.homeProject ?? credentialDataHomeProject.value);
const isHomeTeamProject = computed(() => homeProject.value?.type === ProjectTypes.Team);
const credentialRoleTranslations = computed(() => {
return { "credential:user": i18n$2.baseText("credentialEdit.credentialSharing.role.user") };
});
const credentialRoles = computed(() => {
return rolesStore.processedCredentialRoles.map(({ slug, scopes, licensed, description: description$8, systemRole, roleType }) => ({
slug,
displayName: credentialRoleTranslations.value[slug],
scopes,
licensed,
description: description$8,
systemRole,
roleType
}));
});
const sharingSelectPlaceholder = computed(() => projectsStore.teamProjects.length ? i18n$2.baseText("projects.sharing.select.placeholder.project") : i18n$2.baseText("projects.sharing.select.placeholder.user"));
const canShareGlobally = computed(() => {
return getResourcePermissions(usersStore.currentUser?.globalScopes).credential?.shareGlobally ?? false;
});
watch(sharedWithProjects, (changedSharedWithProjects) => {
emit("update:modelValue", changedSharedWithProjects);
}, { deep: true });
onMounted(async () => {
await Promise.all([usersStore.fetchUsers(), projectsStore.getAllProjects()]);
});
function goToUpgrade() {
pageRedirectionHelper.goToUpgrade("credential_sharing", "upgrade-credentials-sharing");
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [!isSharingEnabled.value ? (openBlock(), createElementBlock("div", _hoisted_1$27, [createVNode(unref(N8nActionBox_default), {
heading: unref(i18n$2).baseText(unref(uiStore).contextBasedTranslationKeys.credentials.sharing.unavailable.title),
description: unref(i18n$2).baseText(unref(uiStore).contextBasedTranslationKeys.credentials.sharing.unavailable.description),
"button-text": unref(i18n$2).baseText(unref(uiStore).contextBasedTranslationKeys.credentials.sharing.unavailable.button),
"onClick:button": goToUpgrade
}, null, 8, [
"heading",
"description",
"button-text"
])])) : (openBlock(), createElementBlock("div", _hoisted_2$10, [_ctx.credentialPermissions.share ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 0,
bold: false,
class: "mb-s"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialSharing.info.owner")), 1)]),
_: 1
})) : isHomeTeamProject.value ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 1,
bold: false,
class: "mb-s"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialSharing.info.sharee.team")), 1)]),
_: 1
})) : (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 2,
bold: false,
class: "mb-s"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialSharing.info.sharee.personal", { interpolate: { credentialOwnerName: credentialOwnerName.value } })), 1)]),
_: 1
})), createVNode(ProjectSharing_default, {
modelValue: sharedWithProjects.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => sharedWithProjects.value = $event),
projects: projects.value,
roles: credentialRoles.value,
"home-project": homeProject.value,
readonly: !_ctx.credentialPermissions.share,
static: !_ctx.credentialPermissions.share,
placeholder: sharingSelectPlaceholder.value,
"can-share-globally": canShareGlobally.value,
"is-shared-globally": _ctx.isSharedGlobally,
"onUpdate:shareWithAllUsers": _cache[1] || (_cache[1] = ($event) => emit("update:shareWithAllUsers", $event))
}, null, 8, [
"modelValue",
"projects",
"roles",
"home-project",
"readonly",
"static",
"placeholder",
"can-share-globally",
"is-shared-globally"
])]))], 2);
};
}
});
var CredentialSharing_ee_vue_vue_type_style_index_0_lang_module_default = { container: "_container_p190q_123" };
var CredentialSharing_ee_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialSharing_ee_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialSharing_ee_vue_vue_type_style_index_0_lang_module_default }]]);
var import_get$1 = /* @__PURE__ */ __toESM(require_get());
var CredentialEdit_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialEdit",
props: {
modalName: {},
activeId: { default: void 0 },
mode: { default: "new" }
},
setup(__props) {
const props = __props;
const credentialsStore = useCredentialsStore();
const ndvStore = useNDVStore();
const settingsStore = useSettingsStore();
const uiStore = useUIStore();
const workflowsStore = useWorkflowsStore();
const workflowState = injectWorkflowState();
const nodeTypesStore = useNodeTypesStore();
const projectsStore = useProjectsStore();
const nodeHelpers = useNodeHelpers();
const externalHooks = useExternalHooks();
const toast = useToast();
const message$1 = useMessage();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const router = useRouter();
const rootStore = useRootStore();
const { check: checkEnvFeatureFlag } = useEnvFeatureFlag();
const activeTab = ref("connection");
const authError = ref("");
const credentialId = ref("");
const credentialName = ref("");
const selectedCredential = ref("");
const credentialData = ref({});
const currentCredential = ref(null);
const modalBus = ref(createEventBus());
const isDeleting = ref(false);
const isSaving = ref(false);
const isTesting = ref(false);
const hasUnsavedChanges = ref(false);
const isSaved = ref(false);
const loading$3 = ref(false);
const showValidationWarning = ref(false);
const testedSuccessfully = ref(false);
const isRetesting = ref(false);
const hasUserSpecifiedName = ref(false);
const isSharedWithChanged = ref(false);
const requiredCredentials = ref(false);
const contentRef = ref();
const isSharedGlobally = ref(false);
const isResolvable = ref(false);
const activeNodeType = computed(() => {
const activeNode = ndvStore.activeNode;
if (activeNode) return nodeTypesStore.getNodeType(activeNode.type, activeNode.typeVersion);
return null;
});
const selectedCredentialType = computed(() => {
if (props.mode !== "new") return null;
if (selectedCredential.value !== "") return credentialsStore.getCredentialTypeByName(selectedCredential.value) ?? null;
else if (requiredCredentials.value) {
const nodeAuthOptions = getNodeAuthOptions(activeNodeType.value);
if (nodeAuthOptions.length > 0 && activeNodeType.value?.credentials) return getNodeCredentialForSelectedAuthType(activeNodeType.value, nodeAuthOptions[0].value);
else return activeNodeType.value?.credentials ? activeNodeType.value.credentials[0] : null;
}
return null;
});
const credentialType = computed(() => {
if (!credentialTypeName.value) return null;
const type = credentialsStore.getCredentialTypeByName(credentialTypeName.value);
if (!type) return null;
return {
...type,
properties: getCredentialProperties(credentialTypeName.value)
};
});
const credentialTypeName = computed(() => {
if (props.mode === "edit") {
if (currentCredential.value) return currentCredential.value.type;
return null;
}
if (selectedCredentialType.value) return selectedCredentialType.value.name;
return `${props.activeId}`;
});
const isEditingManagedCredential = computed(() => {
if (!props.activeId) return false;
return credentialsStore.getCredentialById(props.activeId)?.isManaged ?? false;
});
const isCredentialTestable = computed(() => {
if (isOAuthType.value || !requiredPropertiesFilled.value) return false;
if (credentialProperties.value.some((prop) => {
const value = credentialData.value[prop.name];
return typeof value === "string" && isExpression(value) && !isTestableExpression(value);
})) return false;
return !!nodesWithAccess.value.filter((node) => {
if (node.credentials) return !!node.credentials.filter((credential) => {
return credential.name === credentialTypeName.value && credential.testedBy;
}).length;
return false;
}).length || !!credentialType.value && !!credentialType.value.test;
});
const nodesWithAccess = computed(() => {
if (credentialTypeName.value) return credentialsStore.getNodesWithAccess(credentialTypeName.value);
return [];
});
const parentTypes = computed(() => {
if (credentialTypeName.value) return getParentTypes(credentialTypeName.value);
return [];
});
const isOAuthType = computed(() => {
return !!credentialTypeName.value && ((credentialTypeName.value === "oAuth2Api" || parentTypes.value.includes("oAuth2Api")) && (credentialData.value.grantType === "authorizationCode" || credentialData.value.grantType === "pkce") || credentialTypeName.value === "oAuth1Api" || parentTypes.value.includes("oAuth1Api"));
});
const allOAuth2BasePropertiesOverridden = computed(() => {
if (credentialType.value?.__overwrittenProperties) return credentialType.value.__overwrittenProperties.includes("clientId") && credentialType.value.__overwrittenProperties.includes("clientSecret");
return false;
});
const isOAuthConnected = computed(() => isOAuthType.value && !!credentialData.value.oauthTokenData);
const credentialProperties = computed(() => {
const type = credentialType.value;
if (!type) return [];
const properties = type.properties.filter((propertyData) => {
if (!displayCredentialParameter(propertyData)) return false;
return !type.__overwrittenProperties?.includes(propertyData.name);
});
if (properties.every((p) => p.type === "notice")) return [];
return properties;
});
const requiredPropertiesFilled = computed(() => {
for (const property of credentialProperties.value) {
if (property.required !== true) continue;
const credentialProperty = credentialData.value[property.name];
if (property.type === "string" && !credentialProperty) return false;
if (property.type === "number") {
const containsExpression = typeof credentialProperty === "string" && credentialProperty.startsWith("=");
if (typeof credentialProperty !== "number" && !containsExpression) return false;
}
}
return true;
});
const credentialPermissions = computed(() => {
return getResourcePermissions(currentCredential.value?.scopes ?? homeProject.value?.scopes).credential;
});
const sidebarItems = computed(() => {
return [
{
id: "connection",
label: i18n$2.baseText("credentialEdit.credentialEdit.connection"),
position: "top"
},
{
id: "sharing",
label: i18n$2.baseText("credentialEdit.credentialEdit.sharing"),
position: "top"
},
{
id: "details",
label: i18n$2.baseText("credentialEdit.credentialEdit.details"),
position: "top"
}
];
});
const defaultCredentialTypeName = computed(() => {
let defaultName = credentialTypeName.value;
if (!defaultName || defaultName === "null") {
if (activeNodeType.value?.credentials && activeNodeType.value.credentials.length > 0) defaultName = activeNodeType.value.credentials[0].name;
}
return defaultName ?? "";
});
const showSaveButton = computed(() => {
return (props.mode === "new" || hasUnsavedChanges.value || isSaved.value) && (credentialPermissions.value.create ?? credentialPermissions.value.update);
});
const showSharingContent = computed(() => activeTab.value === "sharing" && !!credentialType.value);
const homeProject = computed(() => {
const { currentProject, personalProject } = projectsStore;
return currentProject ?? personalProject;
});
const isDynamicCredentialsEnabled = computed(() => {
return checkEnvFeatureFlag.value("DYNAMIC_CREDENTIALS");
});
const isNewCredential = computed(() => props.mode === "new" && !credentialId.value);
onMounted(async () => {
requiredCredentials.value = isCredentialModalState(uiStore.modalsById["editCredential"]) && uiStore.modalsById["editCredential"].showAuthSelector === true;
if (props.mode === "new" && credentialTypeName.value) {
credentialName.value = await credentialsStore.getNewCredentialName({ credentialTypeName: defaultCredentialTypeName.value });
credentialData.value = {
...credentialData.value,
...homeProject.value ? { homeProject: homeProject.value } : {}
};
} else await loadCurrentCredential();
if (credentialType.value) {
for (const property of credentialType.value.properties) if (!credentialData.value.hasOwnProperty(property.name) && !credentialType.value.__overwrittenProperties?.includes(property.name)) credentialData.value = {
...credentialData.value,
[property.name]: property.default
};
}
await externalHooks.run("credentialsEdit.credentialModalOpened", {
credentialType: credentialTypeName.value,
isEditingCredential: props.mode === "edit",
activeNode: ndvStore.activeNode
});
setTimeout(async () => {
if (credentialId.value) if (!requiredPropertiesFilled.value && credentialPermissions.value.update) showValidationWarning.value = true;
else await retestCredential();
}, 0);
loading$3.value = false;
});
async function beforeClose() {
let keepEditing = false;
if (hasUnsavedChanges.value) {
const displayName = credentialType.value ? credentialType.value.displayName : "";
keepEditing = await message$1.confirm(i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose1.message", { interpolate: { credentialDisplayName: displayName } }), i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose1.headline"), {
cancelButtonText: i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose1.cancelButtonText"),
confirmButtonText: i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose1.confirmButtonText")
}) === MODAL_CONFIRM;
} else if (credentialPermissions.value.update && isOAuthType.value && !isOAuthConnected.value) keepEditing = await message$1.confirm(i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose2.message"), i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose2.headline"), {
cancelButtonText: i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose2.cancelButtonText"),
confirmButtonText: i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.beforeClose2.confirmButtonText")
}) === MODAL_CONFIRM;
if (!keepEditing) {
uiStore.activeCredentialType = null;
return true;
} else if (!requiredPropertiesFilled.value) {
showValidationWarning.value = true;
scrollToTop();
} else if (isOAuthType.value) scrollToBottom();
return false;
}
function displayCredentialParameter(parameter) {
if (parameter.type === "hidden") return false;
if (parameter.displayOptions?.hideOnCloud && settingsStore.isCloudDeployment) return false;
if (parameter.displayOptions === void 0) return true;
return nodeHelpers.displayParameter(credentialData.value, parameter, "", null);
}
function getCredentialProperties(name$2) {
const credentialTypeData = credentialsStore.getCredentialTypeByName(name$2);
if (!credentialTypeData) return [];
if (credentialTypeData.extends === void 0) return credentialTypeData.properties;
const combineProperties = [];
for (const credentialsTypeName of credentialTypeData.extends) mergeNodeProperties(combineProperties, getCredentialProperties(credentialsTypeName));
mergeNodeProperties(combineProperties, credentialTypeData.properties);
return combineProperties;
}
function removePropertiesWithEmptyStrings(data) {
const copy = structuredClone(data);
Object.entries(copy).forEach(([key, value]) => {
if (value === "") delete copy[key];
});
return copy;
}
async function loadCurrentCredential() {
credentialId.value = props.activeId ?? "";
try {
const currentCredentials = await credentialsStore.getCredentialData({ id: credentialId.value });
if (!currentCredentials) throw new Error(i18n$2.baseText("credentialEdit.credentialEdit.couldNotFindCredentialWithId") + ":" + credentialId.value);
currentCredential.value = currentCredentials;
credentialData.value = removePropertiesWithEmptyStrings(currentCredentials.data || {});
if (currentCredentials.sharedWithProjects) credentialData.value = {
...credentialData.value,
sharedWithProjects: currentCredentials.sharedWithProjects
};
if (currentCredentials.homeProject) credentialData.value = {
...credentialData.value,
homeProject: currentCredentials.homeProject
};
credentialName.value = currentCredentials.name;
isSharedGlobally.value = "isGlobal" in currentCredentials && typeof currentCredentials.isGlobal === "boolean" ? currentCredentials.isGlobal : false;
isResolvable.value = "isResolvable" in currentCredentials && typeof currentCredentials.isResolvable === "boolean" ? currentCredentials.isResolvable : false;
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("credentialEdit.credentialEdit.showError.loadCredential.title"));
closeDialog();
return;
}
}
function onTabSelect(tab$3) {
activeTab.value = tab$3;
const credType = credentialType.value ? credentialType.value.name : "";
const activeNode = ndvStore.activeNode;
telemetry$1.track("User viewed credential tab", {
credential_type: credType,
node_type: activeNode ? activeNode.type : null,
tab: tab$3,
workflow_id: workflowsStore.workflowId,
credential_id: credentialId.value,
sharing_enabled: EnterpriseEditionFeature.Sharing
});
}
function onChangeSharedWith(sharedWithProjects) {
credentialData.value = {
...credentialData.value,
sharedWithProjects
};
isSharedWithChanged.value = true;
hasUnsavedChanges.value = true;
}
function onShareWithAllUsersUpdate(shareWithAllUsers) {
isSharedGlobally.value = shareWithAllUsers;
hasUnsavedChanges.value = true;
}
function onDataChange({ name: name$2, value }) {
if ((0, import_get$1.default)(credentialData.value, name$2) === value) return;
hasUnsavedChanges.value = true;
const { oauthTokenData,...credData } = credentialData.value;
credentialData.value = deepCopy(credData);
setParameterValue(credentialData.value, name$2, value);
}
function closeDialog() {
modalBus.value.emit("close");
}
function getParentTypes(name$2) {
const type = credentialsStore.getCredentialTypeByName(name$2);
if (type?.extends === void 0) return [];
const types = [];
for (const typeName of type.extends) {
types.push(typeName);
types.push.apply(types, getParentTypes(typeName));
}
return types;
}
function onNameEdit(text$2) {
hasUnsavedChanges.value = true;
hasUserSpecifiedName.value = true;
credentialName.value = text$2;
}
function scrollToTop() {
setTimeout(() => {
if (contentRef.value) contentRef.value.scrollTop = 0;
}, 0);
}
function scrollToBottom() {
setTimeout(() => {
if (contentRef.value) contentRef.value.scrollTop = contentRef.value.scrollHeight;
}, 0);
}
async function retestCredential() {
if (isEditingManagedCredential.value) return;
if (!isCredentialTestable.value || !credentialTypeName.value) {
authError.value = "";
testedSuccessfully.value = false;
return;
}
const { ownedBy, sharedWithProjects,...otherCredData } = credentialData.value;
const details$1 = {
id: credentialId.value,
name: credentialName.value,
type: credentialTypeName.value,
data: otherCredData
};
isRetesting.value = true;
await testCredential(details$1);
isRetesting.value = false;
}
async function testCredential(credentialDetails) {
const result = await credentialsStore.testCredential(credentialDetails);
if (result.status === "Error") {
authError.value = result.message;
testedSuccessfully.value = false;
} else {
authError.value = "";
testedSuccessfully.value = true;
}
scrollToTop();
}
function usesExternalSecrets(data) {
return Object.entries(data).some(([, value]) => typeof value !== "object" && /=.*\{\{[^}]*\$secrets\.[^}]+}}.*/.test(`${value}`));
}
async function saveCredential() {
if (!requiredPropertiesFilled.value) {
showValidationWarning.value = true;
scrollToTop();
return null;
} else showValidationWarning.value = false;
isSaving.value = true;
assert(credentialType.value);
const data = getNodeParameters(credentialType.value.properties, credentialData.value, false, false, null, null);
assert(credentialTypeName.value);
const credentialDetails = {
id: credentialId.value,
name: credentialName.value,
type: credentialTypeName.value,
data,
isGlobal: isSharedGlobally.value,
isResolvable: isResolvable.value
};
if (settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing] && credentialData.value.sharedWithProjects) credentialDetails.sharedWithProjects = credentialData.value.sharedWithProjects;
if (credentialData.value.homeProject) credentialDetails.homeProject = credentialData.value.homeProject;
let credential = null;
const isNewCredential$1 = props.mode === "new" && !credentialId.value;
if (isNewCredential$1) credential = await createCredential(credentialDetails, projectsStore.currentProject);
else {
if (settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]) credentialDetails.sharedWithProjects = credentialData.value.sharedWithProjects;
credential = await updateCredential(credentialDetails);
}
isSaving.value = false;
if (credential) {
credentialId.value = credential.id;
currentCredential.value = credential;
if (isCredentialTestable.value) {
isTesting.value = true;
credentialDetails.data = credentialData.value;
credentialDetails.id = credentialId.value;
await testCredential(credentialDetails);
isTesting.value = false;
} else {
authError.value = "";
testedSuccessfully.value = false;
}
const trackProperties = {
credential_type: credentialDetails.type,
workflow_id: workflowsStore.workflowId,
credential_id: credential.id,
is_complete: !!requiredPropertiesFilled.value,
is_new: isNewCredential$1,
uses_external_secrets: usesExternalSecrets(credentialDetails.data ?? {})
};
if (isOAuthType.value) trackProperties.is_valid = !!isOAuthConnected.value;
else if (isCredentialTestable.value) trackProperties.is_valid = !!testedSuccessfully.value;
if (ndvStore.activeNode) trackProperties.node_type = ndvStore.activeNode.type;
if (authError.value && authError.value !== "") trackProperties.authError = authError.value;
if (!isOAuthType.value) {
telemetry$1.track("User saved credentials", trackProperties);
handleDynamicNotification(!!trackProperties.is_valid);
}
await externalHooks.run("credentialEdit.saveCredential", trackProperties);
}
return credential;
}
async function handleDynamicNotification(isValid) {
if (!isValid || !settingsStore.isCloudDeployment) return;
try {
const response = await sendUserEvent(rootStore.restApiContext, {
eventType: "credential-saved",
metadata: { credential_type: credentialTypeName.value }
});
if (response.title && response.message) setTimeout(async () => {
try {
await message$1.confirm(response.message, response.title, {
confirmButtonText: i18n$2.baseText("generic.keepBuilding"),
cancelButtonText: "",
showCancelButton: false,
closeOnClickModal: true,
closeOnPressEscape: true
});
} catch (error$2) {}
}, 15e3);
} catch (error$2) {}
}
const createToastMessagingForNewCredentials = (project) => {
let toastTitle = i18n$2.baseText("credentials.create.personal.toast.title");
let toastText = "";
if (projectsStore.currentProject && projectsStore.currentProject.id !== projectsStore.personalProject?.id) {
toastTitle = i18n$2.baseText("credentials.create.project.toast.title", { interpolate: { projectName: project?.name ?? "" } });
toastText = i18n$2.baseText("credentials.create.project.toast.text", { interpolate: { projectName: project?.name ?? "" } });
}
return {
title: toastTitle,
message: toastText
};
};
async function createCredential(credentialDetails, project) {
let credential;
try {
credential = await credentialsStore.createNewCredential(credentialDetails, project?.id, router.currentRoute.value.query.uiContext?.toString());
const { uiContext,...rest } = router.currentRoute.value.query;
router.replace({ query: rest });
hasUnsavedChanges.value = false;
const { title: title$4, message: message$2 } = createToastMessagingForNewCredentials(project);
toast.showMessage({
title: title$4,
message: message$2,
type: "success"
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("credentialEdit.credentialEdit.showError.createCredential.title"));
return null;
}
await externalHooks.run("credential.saved", {
credential_type: credentialDetails.type,
credential_id: credential.id,
is_new: true
});
telemetry$1.track("User created credentials", {
credential_type: credentialDetails.type,
credential_id: credential.id,
workflow_id: workflowsStore.workflowId
});
return credential;
}
async function updateCredential(credentialDetails) {
let credential = null;
try {
if (credentialPermissions.value.update) credential = await credentialsStore.updateCredential({
id: credentialId.value,
data: credentialDetails
});
if (credentialPermissions.value.share && isSharedWithChanged.value && credentialDetails.sharedWithProjects) {
credential = await credentialsStore.setCredentialSharedWith({
credentialId: credentialDetails.id,
sharedWithProjects: credentialDetails.sharedWithProjects
});
isSharedWithChanged.value = false;
}
hasUnsavedChanges.value = false;
isSaved.value = true;
if (credential) await externalHooks.run("credential.saved", {
credential_type: credentialDetails.type,
credential_id: credential.id,
is_new: false
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("credentialEdit.credentialEdit.showError.updateCredential.title"));
return null;
}
nodeHelpers.updateNodesCredentialsIssues();
return credential;
}
async function deleteCredential() {
if (!currentCredential.value) return;
const savedCredentialName = currentCredential.value.name;
if (await message$1.confirm(i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.deleteCredential.message", { interpolate: { savedCredentialName } }), i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.deleteCredential.headline"), { confirmButtonText: i18n$2.baseText("credentialEdit.credentialEdit.confirmMessage.deleteCredential.confirmButtonText") }) !== "confirm") return;
try {
isDeleting.value = true;
await credentialsStore.deleteCredential({ id: credentialId.value });
hasUnsavedChanges.value = false;
isSaved.value = true;
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("credentialEdit.credentialEdit.showError.deleteCredential.title"));
isDeleting.value = false;
return;
}
isDeleting.value = false;
nodeHelpers.updateNodesCredentialsIssues();
credentialData.value = {};
toast.showMessage({
title: i18n$2.baseText("credentialEdit.credentialEdit.showMessage.title"),
type: "success"
});
closeDialog();
}
async function oAuthCredentialAuthorize() {
let url;
const credential = await saveCredential();
if (!credential) return;
const types = parentTypes.value;
try {
const { sharedWithProjects,...sanitizedCredData } = credentialData.value;
const credData = {
id: credential.id,
...sanitizedCredData
};
if (credentialTypeName.value === "oAuth2Api" || types.includes("oAuth2Api")) {
if (isValidCredentialResponse(credData)) url = await credentialsStore.oAuth2Authorize(credData);
} else if (credentialTypeName.value === "oAuth1Api" || types.includes("oAuth1Api")) {
if (isValidCredentialResponse(credData)) url = await credentialsStore.oAuth1Authorize(credData);
}
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("credentialEdit.credentialEdit.showError.generateAuthorizationUrl.title"), i18n$2.baseText("credentialEdit.credentialEdit.showError.generateAuthorizationUrl.message"));
return;
}
const oauthPopup = window.open(url, "OAuth Authorization", "scrollbars=no,resizable=yes,status=no,titlebar=noe,location=no,toolbar=no,menubar=no,width=500,height=700");
credentialData.value = {
...credentialData.value,
oauthTokenData: null
};
const oauthChannel = new BroadcastChannel("oauth-callback");
const receiveMessage = (event) => {
const successfullyConnected = event.data === "success";
const trackProperties = {
credential_type: credentialTypeName.value,
workflow_id: workflowsStore.workflowId || null,
credential_id: credentialId.value,
is_complete: !!requiredPropertiesFilled.value,
is_new: props.mode === "new" && !credentialId.value,
is_valid: successfullyConnected,
uses_external_secrets: usesExternalSecrets(credentialData.value)
};
if (ndvStore.activeNode) trackProperties.node_type = ndvStore.activeNode.type;
telemetry$1.track("User saved credentials", trackProperties);
handleDynamicNotification(successfullyConnected);
if (successfullyConnected) {
oauthChannel.removeEventListener("message", receiveMessage);
credentialData.value = {
...credentialData.value,
oauthTokenData: {}
};
if (oauthPopup) oauthPopup.close();
}
};
oauthChannel.addEventListener("message", receiveMessage);
}
async function onAuthTypeChanged(type) {
if (!activeNodeType.value?.credentials) return;
const credentialsForType = getNodeCredentialForSelectedAuthType(activeNodeType.value, type);
if (credentialsForType) {
selectedCredential.value = credentialsForType.name;
uiStore.activeCredentialType = credentialsForType.name;
resetCredentialData();
updateNodeAuthType(workflowState, ndvStore.activeNode, type);
if (hasUnsavedChanges.value && !hasUserSpecifiedName.value) credentialName.value = await credentialsStore.getNewCredentialName({ credentialTypeName: defaultCredentialTypeName.value });
}
}
function resetCredentialData() {
if (!credentialType.value) return;
for (const property of credentialType.value.properties) if (!credentialType.value.__overwrittenProperties?.includes(property.name)) credentialData.value = {
...credentialData.value,
[property.name]: property.default
};
const { currentProject, personalProject } = projectsStore;
const scopes = currentProject?.scopes ?? personalProject?.scopes ?? [];
const homeProject$1 = currentProject ?? personalProject ?? {};
credentialData.value = {
...credentialData.value,
scopes,
homeProject: homeProject$1
};
}
const credNameRef = useTemplateRef("credNameRef");
const { width } = useElementSize(credNameRef);
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: _ctx.modalName,
"custom-class": _ctx.$style.credentialModal,
"event-bus": modalBus.value,
loading: loading$3.value,
"before-close": beforeClose,
width: "70%",
height: "80%"
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.credInfo) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.credIcon) }, [createVNode(CredentialIcon_default, { "credential-type-name": defaultCredentialTypeName.value }, null, 8, ["credential-type-name"])], 2), createBaseVNode("div", {
ref_key: "credNameRef",
ref: credNameRef,
class: normalizeClass(_ctx.$style.credName)
}, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.credNameRow) }, [credentialName.value ? (openBlock(), createBlock(unref(N8nInlineTextEdit_default), {
key: 0,
"data-test-id": "credential-name",
"model-value": credentialName.value,
"max-width": unref(width) - 10,
readonly: !(credentialPermissions.value.create && props.mode === "new" || credentialPermissions.value.update) || !credentialType.value || isEditingManagedCredential.value,
"onUpdate:modelValue": onNameEdit
}, null, 8, [
"model-value",
"max-width",
"readonly"
])) : createCommentVNode("", true), isResolvable.value ? (openBlock(), createBlock(unref(N8nTag_default), {
key: 1,
text: unref(i18n$2).baseText("credentialEdit.credentialEdit.dynamic"),
clickable: false,
class: normalizeClass(_ctx.$style.dynamicTag),
"data-test-id": "credential-dynamic-tag"
}, {
tag: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.dynamicTagContent) }, [createVNode(unref(N8nIcon_default), {
icon: "key-round",
size: "xsmall"
}), createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialEdit.dynamic")), 1)], 2)]),
_: 1
}, 8, ["text", "class"])) : createCommentVNode("", true)], 2), credentialType.value ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
size: "small",
tag: "p",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(credentialType.value.displayName), 1)]),
_: 1
})) : createCommentVNode("", true)], 2)], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.credActions) }, [currentCredential.value && credentialPermissions.value.delete ? (openBlock(), createBlock(unref(N8nIconButton_default), {
key: 0,
title: unref(i18n$2).baseText("credentialEdit.credentialEdit.delete"),
icon: "trash-2",
type: "tertiary",
disabled: isSaving.value,
loading: isDeleting.value,
"data-test-id": "credential-delete-button",
onClick: deleteCredential
}, null, 8, [
"title",
"disabled",
"loading"
])) : createCommentVNode("", true), showSaveButton.value ? (openBlock(), createBlock(SaveButton_default, {
key: 1,
saved: !hasUnsavedChanges.value && !isTesting.value && !!credentialId.value,
"is-saving": isSaving.value || isTesting.value,
"saving-label": isTesting.value ? unref(i18n$2).baseText("credentialEdit.credentialEdit.testing") : unref(i18n$2).baseText("credentialEdit.credentialEdit.saving"),
"data-test-id": "credential-save-button",
onClick: saveCredential
}, null, 8, [
"saved",
"is-saving",
"saving-label"
])) : createCommentVNode("", true)], 2)], 2)]),
content: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.container),
"data-test-id": "credential-edit-dialog"
}, [!isEditingManagedCredential.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.sidebar)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(sidebarItems.value, (item$2) => {
return openBlock(), createBlock(unref(N8nMenuItem_default), {
key: item$2.id,
item: item$2,
active: activeTab.value === item$2.id,
onClick: () => onTabSelect(item$2.id)
}, null, 8, [
"item",
"active",
"onClick"
]);
}), 128))], 2)) : createCommentVNode("", true), activeTab.value === "connection" && credentialType.value ? (openBlock(), createElementBlock("div", {
key: 1,
ref_key: "contentRef",
ref: contentRef,
class: normalizeClass(_ctx.$style.mainContent)
}, [createVNode(CredentialConfig_default, {
"credential-type": credentialType.value,
"credential-properties": credentialProperties.value,
"credential-data": credentialData.value,
"credential-id": credentialId.value,
"is-managed": isEditingManagedCredential.value,
"show-validation-warning": showValidationWarning.value,
"auth-error": authError.value,
"tested-successfully": testedSuccessfully.value,
"is-o-auth-type": isOAuthType.value,
"is-o-auth-connected": isOAuthConnected.value,
"is-retesting": isRetesting.value,
"parent-types": parentTypes.value,
"required-properties-filled": requiredPropertiesFilled.value,
"credential-permissions": credentialPermissions.value,
"all-o-auth2-base-properties-overridden": allOAuth2BasePropertiesOverridden.value,
mode: _ctx.mode,
"selected-credential": selectedCredential.value,
"show-auth-type-selector": requiredCredentials.value,
onUpdate: onDataChange,
onOauth: oAuthCredentialAuthorize,
onRetest: retestCredential,
onScrollToTop: scrollToTop,
onAuthTypeChanged
}, null, 8, [
"credential-type",
"credential-properties",
"credential-data",
"credential-id",
"is-managed",
"show-validation-warning",
"auth-error",
"tested-successfully",
"is-o-auth-type",
"is-o-auth-connected",
"is-retesting",
"parent-types",
"required-properties-filled",
"credential-permissions",
"all-o-auth2-base-properties-overridden",
"mode",
"selected-credential",
"show-auth-type-selector"
]), isDynamicCredentialsEnabled.value && (credentialPermissions.value.create && isNewCredential.value || credentialPermissions.value.update) ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.dynamicCredentials),
"data-test-id": "dynamic-credentials-section"
}, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.dynamicCredentialsHeader) }, [createVNode(unref(N8nText_default), {
size: "medium",
weight: "bold"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.dynamicCredentials.title")), 1)]),
_: 1
}), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", null, toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.dynamicCredentials.infoTip")), 1)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), {
icon: "circle-help",
size: "small"
})]),
_: 1
})], 2),
createVNode(unref(ElSwitch), {
modelValue: isResolvable.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => isResolvable.value = $event), _cache[1] || (_cache[1] = () => hasUnsavedChanges.value = true)],
"data-test-id": "dynamic-credentials-toggle"
}, null, 8, ["modelValue"]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.dynamicCredentialsDescription) }, [createVNode(unref(N8nText_default), {
tag: "div",
size: "small",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.dynamicCredentials.description1")), 1)]),
_: 1
}), createVNode(unref(N8nText_default), {
size: "small",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.dynamicCredentials.description2")) + " ", 1), createVNode(unref(N8nLink_default), {
to: unref(i18n$2).baseText("credentialEdit.credentialConfig.dynamicCredentials.docsUrl"),
size: "small",
theme: "text",
underline: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialEdit.credentialConfig.dynamicCredentials.documentation")), 1)]),
_: 1
}, 8, ["to"])]),
_: 1
})], 2)
], 2)) : createCommentVNode("", true)], 2)) : showSharingContent.value ? (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(_ctx.$style.mainContent)
}, [createVNode(CredentialSharing_ee_default, {
credential: currentCredential.value,
"credential-data": credentialData.value,
"credential-id": credentialId.value,
"credential-permissions": credentialPermissions.value,
"is-shared-globally": isSharedGlobally.value,
"modal-bus": modalBus.value,
"onUpdate:modelValue": onChangeSharedWith,
"onUpdate:shareWithAllUsers": onShareWithAllUsersUpdate
}, null, 8, [
"credential",
"credential-data",
"credential-id",
"credential-permissions",
"is-shared-globally",
"modal-bus"
])], 2)) : activeTab.value === "details" && credentialType.value ? (openBlock(), createElementBlock("div", {
key: 3,
class: normalizeClass(_ctx.$style.mainContent)
}, [createVNode(CredentialInfo_default, { "current-credential": currentCredential.value }, null, 8, ["current-credential"])], 2)) : createCommentVNode("", true)], 2)]),
_: 1
}, 8, [
"name",
"custom-class",
"event-bus",
"loading"
]);
};
}
});
var CredentialEdit_vue_vue_type_style_index_0_lang_module_default = {
credentialModal: "_credentialModal_rvuec_123",
mainContent: "_mainContent_rvuec_137",
credName: "_credName_rvuec_143",
credNameRow: "_credNameRow_rvuec_150",
dynamicTagContent: "_dynamicTagContent_rvuec_157",
sidebar: "_sidebar_rvuec_163",
header: "_header_rvuec_173",
container: "_container_rvuec_177",
credInfo: "_credInfo_rvuec_182",
credActions: "_credActions_rvuec_190",
credIcon: "_credIcon_rvuec_201",
dynamicCredentials: "_dynamicCredentials_rvuec_207",
dynamicCredentialsHeader: "_dynamicCredentialsHeader_rvuec_215",
dynamicCredentialsDescription: "_dynamicCredentialsDescription_rvuec_221"
};
var CredentialEdit_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialEdit_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialEdit_vue_vue_type_style_index_0_lang_module_default }]]);
var CredentialsSelectModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialsSelectModal",
setup(__props) {
const externalHooks = useExternalHooks();
const telemetry$1 = useTelemetry();
const i18n$2 = useI18n();
const modalBus = ref(createEventBus());
const selected = ref("");
const loading$3 = ref(true);
const selectRef = ref();
const credentialsStore = useCredentialsStore();
const uiStore = useUIStore();
const workflowsStore = useWorkflowsStore();
onMounted(async () => {
try {
await credentialsStore.fetchCredentialTypes(false);
} catch (e) {}
loading$3.value = false;
setTimeout(() => {
if (selectRef.value) selectRef.value.focus();
}, 0);
});
function onSelect(type) {
selected.value = type;
}
function openCredentialType() {
modalBus.value.emit("close");
uiStore.openNewCredential(selected.value);
const telemetryPayload = {
credential_type: selected.value,
source: "primary_menu",
new_credential: true,
workflow_id: workflowsStore.workflowId
};
telemetry$1.track("User opened Credential modal", telemetryPayload);
externalHooks.run("credentialsSelectModal.openCredentialType", telemetryPayload);
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(CREDENTIAL_SELECT_MODAL_KEY),
"event-bus": modalBus.value,
width: "50%",
center: true,
loading: loading$3.value,
"max-width": "460px",
"min-height": "250px"
}, {
header: withCtx(() => [createBaseVNode("h2", { class: normalizeClass(_ctx.$style.title) }, toDisplayString(unref(i18n$2).baseText("credentialSelectModal.addNewCredential")), 3)]),
content: withCtx(() => [createBaseVNode("div", null, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.subtitle) }, toDisplayString(unref(i18n$2).baseText("credentialSelectModal.selectAnAppOrServiceToConnectTo")), 3), createVNode(unref(N8nSelect_default), {
ref_key: "selectRef",
ref: selectRef,
filterable: "",
"default-first-option": "",
placeholder: unref(i18n$2).baseText("credentialSelectModal.searchForApp"),
size: "xlarge",
"model-value": selected.value,
"data-test-id": "new-credential-type-select",
"onUpdate:modelValue": onSelect
}, {
prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(credentialsStore).allCredentialTypes, (credential) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: credential.name,
value: credential.name,
label: credential.displayName,
filterable: "",
"data-test-id": "new-credential-type-select-option"
}, null, 8, ["value", "label"]);
}), 128))]),
_: 1
}, 8, ["placeholder", "model-value"])])]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("credentialSelectModal.continue"),
float: "right",
size: "large",
disabled: !selected.value,
"data-test-id": "new-credential-type-button",
onClick: openCredentialType
}, null, 8, ["label", "disabled"])], 2)]),
_: 1
}, 8, [
"name",
"event-bus",
"loading"
]);
};
}
});
var CredentialsSelectModal_vue_vue_type_style_index_0_lang_module_default = {
title: "_title_k590m_123",
subtitle: "_subtitle_k590m_128"
};
var CredentialsSelectModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialsSelectModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialsSelectModal_vue_vue_type_style_index_0_lang_module_default }]]);
var DebugPaywallModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "DebugPaywallModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
title: props.data.title,
name: props.modalName
}, {
content: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [
createTextVNode(toDisplayString(unref(i18n$2).baseText("executionsList.debug.paywall.content")) + " ", 1),
_cache[0] || (_cache[0] = createBaseVNode("br", null, null, -1)),
_cache[1] || (_cache[1] = createBaseVNode("br", null, null, -1)),
createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("executionsList.debug.paywall.subContent")) + " ", 1),
createVNode(unref(N8nLink_default), {
to: unref(i18n$2).baseText("executionsList.debug.paywall.link.url"),
"new-window": ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("executionsList.debug.paywall.link.text")), 1)]),
_: 1
}, 8, ["to"])
]),
_: 1
})]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), { onClick: props.data.footerButtonAction }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.seePlans")), 1)]),
_: 1
}, 8, ["onClick"])], 2)]),
_: 1
}, 8, ["title", "name"]);
};
}
});
var DebugPaywallModal_vue_vue_type_style_index_0_lang_module_default = { footer: "_footer_15my4_123" };
var DebugPaywallModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(DebugPaywallModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": DebugPaywallModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$26 = ["title", "data-resourceid"];
var maxPathLength = 4;
var separator$2 = "/";
var MoveToFolderDropdown_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "MoveToFolderDropdown",
props: {
selectedLocation: { default: null },
selectedProjectId: {},
currentProjectId: { default: void 0 },
currentFolderId: { default: void 0 },
parentFolderId: { default: void 0 }
},
emits: ["location:selected"],
setup(__props, { expose: __expose, emit: __emit }) {
const props = __props;
const emit = __emit;
const i18n$2 = useI18n();
const foldersStore = useFoldersStore();
const availableLocations = ref([]);
const moveFolderDropdown = ref();
const selectedLocationId = computed({
get: () => props.selectedLocation?.id ?? null,
set: (id) => {
const location = availableLocations.value.find((f) => f.id === id);
if (!location) return;
emit("location:selected", location);
}
});
const loading$3 = ref(false);
const fetchAvailableLocations = async (query) => {
loading$3.value = true;
const folders = await foldersStore.fetchFoldersAvailableForMove(props.selectedProjectId, props.currentFolderId, { name: query ?? void 0 });
if (!props.parentFolderId) availableLocations.value = folders;
else availableLocations.value = folders.filter((folder) => folder.id !== props.parentFolderId);
const rootFolderName = i18n$2.baseText("folders.move.project.root.name");
const isQueryMatchesRoot = !query || rootFolderName.toLowerCase().includes(query?.toLowerCase());
const isTransfer = props.selectedProjectId !== props.currentProjectId;
if (isQueryMatchesRoot && (!!props.parentFolderId || isTransfer)) availableLocations.value.unshift({
id: props.selectedProjectId,
name: rootFolderName,
resource: "project",
createdAt: "",
updatedAt: "",
workflowCount: 0,
subFolderCount: 0,
path: []
});
loading$3.value = false;
};
watch(() => [
props.selectedProjectId,
props.currentFolderId,
props.parentFolderId
], () => {
availableLocations.value = [];
fetchAvailableLocations();
}, { immediate: true });
function focusOnInput() {
moveFolderDropdown.value?.focusOnInput();
}
__expose({ focusOnInput });
const isTopLevelFolder = (location, index) => {
return index === location.path.length - 1 || index >= 3;
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style["move-folder-dropdown"]),
"data-test-id": "move-to-folder-dropdown"
}, [createVNode(unref(N8nSelect_default), {
ref_key: "moveFolderDropdown",
ref: moveFolderDropdown,
modelValue: selectedLocationId.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedLocationId.value = $event),
filterable: true,
remote: true,
"remote-method": fetchAvailableLocations,
loading: loading$3.value,
placeholder: unref(i18n$2).baseText("folders.move.modal.folder.placeholder"),
"no-data-text": unref(i18n$2).baseText("folders.move.modal.folder.noData.label"),
"option-label": "name",
"option-value": "id"
}, {
prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(availableLocations.value, (location) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: location.id,
value: location.id,
label: location.name,
"data-test-id": "move-to-folder-option"
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["folder-select-item"]) }, [createBaseVNode("ul", { class: normalizeClass(_ctx.$style.list) }, [location.resource === "project" ? (openBlock(), createElementBlock("li", {
key: 0,
class: normalizeClass(_ctx.$style.current)
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(location.name), 1)]),
_: 2
}, 1024)], 2)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
location.path.length > maxPathLength ? (openBlock(), createElementBlock("li", {
key: 0,
class: normalizeClass(_ctx.$style.item)
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => _cache[1] || (_cache[1] = [createTextVNode("...")])),
_: 1
})], 2)) : createCommentVNode("", true),
location.path.length > 0 ? (openBlock(), createElementBlock("li", {
key: 1,
class: normalizeClass(_ctx.$style.separator)
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(separator$2))]),
_: 1
})], 2)) : createCommentVNode("", true),
(openBlock(true), createElementBlock(Fragment, null, renderList(location.path.slice(-maxPathLength), (fragment, index) => {
return openBlock(), createElementBlock(Fragment, { key: `${location.id}-${index}` }, [createBaseVNode("li", {
class: normalizeClass({
[_ctx.$style.item]: true,
[_ctx.$style.current]: isTopLevelFolder(location, index)
}),
title: fragment,
"data-resourceid": fragment,
"data-test-id": "breadcrumbs-item",
"data-target": "folder-breadcrumb-item"
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(fragment), 1)]),
_: 2
}, 1024)], 10, _hoisted_1$26), !isTopLevelFolder(location, index) ? (openBlock(), createElementBlock("li", {
key: 0,
class: normalizeClass(_ctx.$style.separator)
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(separator$2))]),
_: 1
})], 2)) : createCommentVNode("", true)], 64);
}), 128))
], 64))], 2)], 2)]),
_: 2
}, 1032, ["value", "label"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"loading",
"placeholder",
"no-data-text"
])], 2);
};
}
});
const list = "_list_8v5z3_140";
const item$1 = "_item_8v5z3_146";
const current = "_current_8v5z3_161";
const separator$1 = "_separator_8v5z3_165";
var MoveToFolderDropdown_vue_vue_type_style_index_0_lang_module_default = {
"move-folder-dropdown": "_move-folder-dropdown_8v5z3_123",
"folder-select-item": "_folder-select-item_8v5z3_128",
list,
item: item$1,
current,
separator: separator$1
};
var MoveToFolderDropdown_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MoveToFolderDropdown_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MoveToFolderDropdown_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$25 = { key: 0 };
var DeleteFolderModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "DeleteFolderModal",
props: {
modalName: {},
activeId: {},
data: {}
},
setup(__props) {
const props = __props;
const modalBus = createEventBus();
const { showMessage, showError } = useToast();
const i18n$2 = useI18n();
const route = useRoute();
const foldersStore = useFoldersStore();
const projectsStore = useProjectsStore();
const loading$3 = ref(false);
const operation = ref("");
const deleteConfirmText = ref("");
const selectedFolder = ref(null);
const folderToDelete = computed(() => {
if (!props.activeId) return null;
return foldersStore.breadcrumbsCache[props.activeId];
});
const isPending = computed(() => {
return selectedFolder.value ? !selectedFolder.value.name : false;
});
const title$4 = computed(() => {
const folderName = folderToDelete.value?.name ?? "";
return i18n$2.baseText("folders.delete.confirm.title", { interpolate: { folderName } });
});
const enabled = computed(() => {
if (isPending.value) return true;
if (operation.value === "delete" && deleteConfirmText.value === i18n$2.baseText("folders.delete.typeToConfirm", { interpolate: { folderName: folderToDelete.value?.name ?? "" } })) return true;
if (operation.value === "transfer" && selectedFolder.value) return true;
return false;
});
const currentProjectName = computed(() => {
const currentProject = projectsStore.currentProject;
if (currentProject?.type === ProjectTypes.Personal) return i18n$2.baseText("projects.menu.personal");
return currentProject?.name;
});
const folderContentWarningMessage = computed(() => {
const folderCount = props.data.content.subFolderCount ?? 0;
const workflowCount = props.data.content.workflowCount ?? 0;
let folderText = "";
let workflowText = "";
if (folderCount > 0) folderText = i18n$2.baseText("folder.count", { interpolate: { count: folderCount } });
if (workflowCount > 0) workflowText = i18n$2.baseText("workflow.count", { interpolate: { count: workflowCount } });
if (folderCount > 0 && workflowCount > 0) folderText += ` ${i18n$2.baseText("folder.and.workflow.separator")} `;
return i18n$2.baseText("folder.delete.modal.confirmation", { interpolate: {
folders: folderText,
workflows: workflowText
} });
});
async function onSubmit() {
if (!enabled.value) return;
try {
loading$3.value = true;
const newParentId = selectedFolder.value?.resource === "project" ? "0" : selectedFolder.value?.id ?? void 0;
await foldersStore.deleteFolder(route.params.projectId, props.activeId, newParentId);
let message$1 = "";
if (selectedFolder.value) message$1 = i18n$2.baseText("folders.transfer.confirm.message", { interpolate: { folderName: selectedFolder.value.name ?? "" } });
showMessage({
type: "success",
title: i18n$2.baseText("folders.delete.success.message"),
message: message$1
});
props.data.workflowListEventBus.emit("folder-deleted", {
folderId: props.activeId,
workflowCount: props.data.content.workflowCount,
folderCount: props.data.content.subFolderCount
});
modalBus.emit("close");
} catch (error$2) {
showError(error$2, i18n$2.baseText("folders.delete.error.message"));
} finally {
loading$3.value = false;
}
}
const onFolderSelected = (payload) => {
selectedFolder.value = payload;
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: _ctx.modalName,
title: title$4.value,
center: true,
width: "600",
"event-bus": unref(modalBus),
onEnter: onSubmit
}, {
content: withCtx(() => [createBaseVNode("div", null, [isPending.value ? (openBlock(), createElementBlock("div", _hoisted_1$25, [createVNode(unref(N8nText_default), { color: "text-base" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.delete.confirm.message")), 1)]),
_: 1
})])) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.content)
}, [
createBaseVNode("div", null, [createVNode(unref(N8nText_default), { color: "text-base" }, {
default: withCtx(() => [createTextVNode(toDisplayString(folderContentWarningMessage.value), 1)]),
_: 1
})]),
createVNode(unref(ElRadio), {
modelValue: operation.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => operation.value = $event), _cache[1] || (_cache[1] = ($event) => operation.value = "transfer")],
"data-test-id": "transfer-content-radio",
label: "transfer"
}, {
default: withCtx(() => [currentProjectName.value ? (openBlock(), createBlock(unref(N8nText_default), { key: 0 }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.transfer.action", { interpolate: { projectName: currentProjectName.value } })), 1)]),
_: 1
})) : (openBlock(), createBlock(unref(N8nText_default), {
key: 1,
color: "text-dark"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.transfer.action.noProject")), 1)]),
_: 1
}))]),
_: 1
}, 8, ["modelValue"]),
operation.value === "transfer" ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.optionInput)
}, [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.transfer.selectFolder")), 1)]),
_: 1
}), unref(projectsStore).currentProject ? (openBlock(), createBlock(MoveToFolderDropdown_default, {
key: 0,
"selected-location": selectedFolder.value,
"selected-project-id": unref(projectsStore).currentProject?.id,
"current-project-id": unref(projectsStore).currentProject?.id,
"current-folder-id": props.activeId,
"parent-folder-id": folderToDelete.value?.parentFolder,
"onLocation:selected": onFolderSelected
}, null, 8, [
"selected-location",
"selected-project-id",
"current-project-id",
"current-folder-id",
"parent-folder-id"
])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true),
createVNode(unref(ElRadio), {
modelValue: operation.value,
"onUpdate:modelValue": [_cache[2] || (_cache[2] = ($event) => operation.value = $event), _cache[3] || (_cache[3] = ($event) => operation.value = "delete")],
"data-test-id": "delete-content-radio",
label: "delete"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.delete.action")), 1)]),
_: 1
})]),
_: 1
}, 8, ["modelValue"]),
operation.value === "delete" ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.optionInput),
"data-test-id": "delete-data-input"
}, [createVNode(unref(N8nInputLabel_default), { label: unref(i18n$2).baseText("folders.delete.confirmation.message", { interpolate: { folderName: folderToDelete.value?.name ?? "" } }) }, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
modelValue: deleteConfirmText.value,
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => deleteConfirmText.value = $event),
"data-test-id": "delete-data-input",
placeholder: unref(i18n$2).baseText("folders.delete.typeToConfirm", { interpolate: { folderName: folderToDelete.value?.name ?? "" } })
}, null, 8, ["modelValue", "placeholder"])]),
_: 1
}, 8, ["label"])], 2)) : createCommentVNode("", true)
], 2))])]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
loading: loading$3.value,
disabled: !enabled.value,
label: unref(i18n$2).baseText("generic.delete"),
float: "right",
"data-test-id": "confirm-delete-folder-button",
onClick: onSubmit
}, null, 8, [
"loading",
"disabled",
"label"
])]),
_: 1
}, 8, [
"name",
"title",
"event-bus"
]);
};
}
});
var DeleteFolderModal_vue_vue_type_style_index_0_lang_module_default = {
content: "_content_15ziv_123",
innerContent: "_innerContent_15ziv_130",
optionInput: "_optionInput_15ziv_134",
"folder-select-item": "_folder-select-item_15ziv_138"
};
var DeleteFolderModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(DeleteFolderModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": DeleteFolderModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$24 = { key: 1 };
var ProjectMoveResourceModalCredentialsList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ProjectMoveResourceModalCredentialsList",
props: {
credentials: { default: () => [] },
currentProjectId: { default: "" }
},
setup(__props) {
const props = __props;
const isCredentialReadable = (credential) => "scopes" in credential ? getResourcePermissions(credential.scopes).credential.read : false;
const getCredentialRouterLocation = (credential) => {
const isSharedWithCurrentProject = credential.sharedWithProjects?.find((p) => p.id === props.currentProjectId);
const params = { credentialId: credential.id };
if (isSharedWithCurrentProject ?? credential.homeProject?.id) params.projectId = isSharedWithCurrentProject ? props.currentProjectId : credential.homeProject?.id;
return {
name: isSharedWithCurrentProject ? VIEWS.PROJECTS_CREDENTIALS : VIEWS.CREDENTIALS,
params
};
};
return (_ctx, _cache) => {
const _component_RouterLink = resolveComponent("RouterLink");
return openBlock(), createElementBlock("ul", { class: normalizeClass(_ctx.$style.credentialsList) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(props.credentials, (credential) => {
return openBlock(), createElementBlock("li", { key: credential.id }, [isCredentialReadable(credential) ? (openBlock(), createBlock(_component_RouterLink, {
key: 0,
target: "_blank",
to: getCredentialRouterLocation(credential)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(credential.name), 1)]),
_: 2
}, 1032, ["to"])) : (openBlock(), createElementBlock("span", _hoisted_1$24, toDisplayString(credential.name), 1))]);
}), 128))], 2);
};
}
});
var ProjectMoveResourceModalCredentialsList_vue_vue_type_style_index_0_lang_module_default = { credentialsList: "_credentialsList_1t3xb_123" };
var ProjectMoveResourceModalCredentialsList_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectMoveResourceModalCredentialsList_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectMoveResourceModalCredentialsList_vue_vue_type_style_index_0_lang_module_default }]]);
var MoveToFolderModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "MoveToFolderModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const modalBus = createEventBus();
const moveToFolderDropdown = ref();
const foldersStore = useFoldersStore();
const projectsStore = useProjectsStore();
const uiStore = useUIStore();
const credentialsStore = useCredentialsStore();
const workflowsStore = useWorkflowsStore();
const selectedFolder = ref(null);
const selectedProject = ref(projectsStore.currentProject);
const isPersonalProject = computed(() => {
return selectedProject.value?.type === ProjectTypes.Personal;
});
const isOwnPersonalProject = computed(() => {
return selectedProject.value?.type === ProjectTypes.Personal && selectedProject.value?.id === projectsStore.personalProject?.id;
});
const isTransferringOwnership = computed(() => {
return selectedProject.value && selectedProject.value?.id !== projectsStore.currentProject?.id;
});
const workflowCount = ref(0);
const subFolderCount = ref(0);
const shareUsedCredentials = ref(false);
const usedCredentials = ref([]);
const allCredentials = ref([]);
const shareableCredentials = computed(() => allCredentials.value.filter((credential) => isTransferringOwnership.value && getResourcePermissions(credential.scopes).credential.share && usedCredentials.value.find((uc) => uc.id === credential.id)));
const unShareableCredentials = computed(() => usedCredentials.value.reduce((acc, uc) => {
const credential = credentialsStore.getCredentialById(uc.id);
const credentialPermissions = getResourcePermissions(credential?.scopes).credential;
if (!credentialPermissions.share) if (credentialPermissions.read) acc.push(credential);
else acc.push(uc);
return acc;
}, []));
const availableProjects = computed(() => sortByProperty("name", projectsStore.availableProjects.filter((p) => !p.scopes || getResourcePermissions(p.scopes)[props.data.resourceType].create)));
const resourceTypeLabel = computed(() => {
return i18n$2.baseText(`generic.${props.data.resourceType}`).toLowerCase();
});
const title$4 = computed(() => {
return i18n$2.baseText("folders.move.modal.title", { interpolate: {
folderName: props.data.resource.name,
resourceTypeLabel: resourceTypeLabel.value
} });
});
const currentFolder = computed(() => {
if (props.data.resourceType === "workflow") return;
return {
id: props.data.resource.id,
name: props.data.resource.name
};
});
const fetchCurrentFolderContents = async () => {
if (!currentFolder.value || !projectsStore.currentProject) return;
const { totalWorkflows, totalSubFolders } = await foldersStore.fetchFolderContent(projectsStore.currentProject.id, currentFolder.value.id);
workflowCount.value = totalWorkflows;
subFolderCount.value = totalSubFolders;
};
watch(() => [selectedProject.value], () => {
selectedFolder.value = null;
});
watch(() => [currentFolder.value, selectedProject.value], () => {
fetchCurrentFolderContents();
}, { immediate: true });
const onFolderSelected = (payload) => {
selectedFolder.value = payload;
};
const targetProjectName = computed(() => {
return getTruncatedProjectName(selectedProject.value?.name);
});
const onSubmit = () => {
if (!selectedProject.value) return;
const newParent = selectedFolder.value ? {
id: selectedFolder.value.id,
name: selectedFolder.value.name,
type: selectedFolder.value.resource
} : {
id: selectedProject.value.id,
name: targetProjectName.value,
type: "project"
};
if (props.data.resourceType === "folder") if (selectedProject.value.id !== projectsStore.currentProject?.id) props.data.workflowListEventBus.emit("folder-transferred", {
source: {
projectId: projectsStore.currentProject?.id,
folder: {
id: props.data.resource.id,
name: props.data.resource.name
}
},
destination: {
projectId: selectedProject.value.id,
parentFolder: {
id: selectedFolder.value && selectedFolder.value.id !== selectedProject.value.id ? selectedFolder.value.id : void 0,
name: selectedFolder.value && selectedFolder.value.id !== selectedProject.value.id ? selectedFolder.value.name : targetProjectName.value
},
canAccess: isFolderSelectable.value
},
shareCredentials: shareUsedCredentials.value ? shareableCredentials.value.map((c$1) => c$1.id) : void 0
});
else props.data.workflowListEventBus.emit("folder-moved", {
newParent,
folder: {
id: props.data.resource.id,
name: props.data.resource.name
}
});
else if (isTransferringOwnership.value) props.data.workflowListEventBus.emit("workflow-transferred", {
source: {
projectId: projectsStore.currentProject?.id,
workflow: {
id: props.data.resource.id,
name: props.data.resource.name
}
},
destination: {
projectId: selectedProject.value.id,
parentFolder: {
id: selectedFolder.value && selectedFolder.value.id !== selectedProject.value.id ? selectedFolder.value.id : void 0,
name: selectedFolder.value && selectedFolder.value.id !== selectedProject.value.id ? selectedFolder.value.name : targetProjectName.value
},
canAccess: isFolderSelectable.value
},
shareCredentials: shareUsedCredentials.value ? shareableCredentials.value.map((c$1) => c$1.id) : void 0
});
else props.data.workflowListEventBus.emit("workflow-moved", {
newParent,
workflow: {
id: props.data.resource.id,
name: props.data.resource.name,
oldParentId: props.data.resource.parentFolderId
}
});
uiStore.closeModal(MOVE_FOLDER_MODAL_KEY);
};
modalBus.on("opened", () => {
moveToFolderDropdown.value?.focusOnInput();
});
const descriptionMessage = computed(() => {
let folderText = "";
let workflowText = "";
if (subFolderCount.value > 0) folderText = i18n$2.baseText("folders.move.modal.folder.count", { interpolate: { count: subFolderCount.value } });
if (workflowCount.value > 0) workflowText = i18n$2.baseText("folders.move.modal.workflow.count", { interpolate: { count: workflowCount.value } });
if (subFolderCount.value > 0 && workflowCount.value > 0) folderText += ` ${i18n$2.baseText("folder.and.workflow.separator")} `;
return i18n$2.baseText("folders.move.modal.description", { interpolate: {
folders: folderText ? ` ${folderText}` : "",
workflows: workflowText ? ` ${workflowText}` : ""
} });
});
const isResourceWorkflow = computed(() => props.data.resourceType === ResourceType.Workflow);
const isFolderSelectable = computed(() => {
return isOwnPersonalProject.value || !isPersonalProject.value;
});
const currentResourceProjectId = computed(() => {
return projectsStore.currentProject?.id ?? props.data.resource.homeProjectId;
});
onMounted(async () => {
if (!projectsStore.isTeamProjectFeatureEnabled) selectedProject.value = projectsStore.personalProject;
if (isResourceWorkflow.value) {
const [workflow, credentials] = await Promise.all([workflowsStore.fetchWorkflow(props.data.resource.id), credentialsStore.fetchAllCredentials()]);
usedCredentials.value = workflow?.usedCredentials ?? [];
allCredentials.value = credentials;
} else if (projectsStore.currentProject?.id && currentFolder.value?.id) {
const [used, credentials] = await Promise.all([await foldersStore.fetchFolderUsedCredentials(projectsStore.currentProject.id, currentFolder.value.id), credentialsStore.fetchAllCredentials()]);
usedCredentials.value = used;
allCredentials.value = credentials;
}
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: _ctx.modalName,
title: title$4.value,
width: "500",
class: normalizeClass(_ctx.$style.container),
"event-bus": unref(modalBus)
}, {
content: withCtx(() => [
props.data.resourceType === "folder" && (workflowCount.value > 0 || subFolderCount.value > 0) ? (openBlock(), createElementBlock("p", {
key: 0,
class: normalizeClass(_ctx.$style.description),
"data-test-id": "move-modal-description"
}, toDisplayString(descriptionMessage.value), 3)) : createCommentVNode("", true),
createVNode(EnterpriseEdition_ee_default, {
features: [unref(EnterpriseEditionFeature).Sharing],
class: normalizeClass(_ctx.$style.content)
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.block) }, [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.move.modal.project.label")), 1)]),
_: 1
}), createVNode(ProjectSharing_default, {
modelValue: selectedProject.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedProject.value = $event),
class: "pt-2xs",
projects: availableProjects.value,
placeholder: unref(i18n$2).baseText("folders.move.modal.project.placeholder")
}, null, 8, [
"modelValue",
"projects",
"placeholder"
])], 2), isTransferringOwnership.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.block)
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.sharingNote",
scope: "global"
}, {
note: withCtx(() => [createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.note")), 1)]),
resourceTypeLabel: withCtx(() => [createTextVNode(toDisplayString(resourceTypeLabel.value), 1)]),
_: 1
}), props.data.resource.sharedWithProjects?.length ?? false ? (openBlock(), createElementBlock("span", {
key: 0,
class: normalizeClass(_ctx.$style.textBlock)
}, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.sharingInfo", {
adjustToNumber: props.data.resource.sharedWithProjects?.length,
interpolate: { count: props.data.resource.sharedWithProjects?.length ?? 0 }
})), 3)) : createCommentVNode("", true)]),
_: 1
})], 2)) : createCommentVNode("", true)]),
_: 1
}, 8, ["features", "class"]),
selectedProject.value && isFolderSelectable.value ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.block)
}, [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.move.modal.folder.label")), 1)]),
_: 1
}), createVNode(MoveToFolderDropdown_default, {
ref_key: "moveToFolderDropdown",
ref: moveToFolderDropdown,
"selected-location": selectedFolder.value,
"selected-project-id": selectedProject.value.id,
"current-project-id": currentResourceProjectId.value,
"current-folder-id": currentFolder.value?.id,
"parent-folder-id": props.data.resource.parentFolderId,
"exclude-only-parent": props.data.resourceType === "workflow",
"onLocation:selected": onFolderSelected
}, null, 8, [
"selected-location",
"selected-project-id",
"current-project-id",
"current-folder-id",
"parent-folder-id",
"exclude-only-parent"
])], 2)) : createCommentVNode("", true),
shareableCredentials.value.length ? (openBlock(), createBlock(unref(N8nCheckbox_default), {
key: 2,
modelValue: shareUsedCredentials.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => shareUsedCredentials.value = $event),
class: normalizeClass(_ctx.$style.textBlock),
"data-test-id": "move-modal-share-credentials-checkbox"
}, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: _ctx.data.resourceType === "workflow" ? "folders.move.modal.message.usedCredentials.workflow" : "folders.move.modal.message.usedCredentials.folder",
scope: "global"
}, {
usedCredentials: withCtx(() => [createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createVNode(ProjectMoveResourceModalCredentialsList_default, {
"current-project-id": unref(projectsStore).currentProjectId,
credentials: shareableCredentials.value
}, null, 8, ["current-project-id", "credentials"])]),
default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.tooltipText) }, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.usedCredentials.number", {
adjustToNumber: shareableCredentials.value.length,
interpolate: { count: shareableCredentials.value.length }
})), 3)]),
_: 1
})]),
_: 1
}, 8, ["keypath"])]),
_: 1
}, 8, ["modelValue", "class"])) : createCommentVNode("", true),
shareableCredentials.value.length && !shareUsedCredentials.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 3,
class: normalizeClass(_ctx.$style.credentialsCallout),
theme: "warning",
"data-test-id": "move-modal-used-credentials-warning"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("folders.move.modal.message.usedCredentials.warning")), 1)]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true),
unShareableCredentials.value.length ? (openBlock(), createElementBlock("span", {
key: 4,
class: normalizeClass(_ctx.$style.textBlock)
}, [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.unAccessibleCredentials.note",
scope: "global"
}, {
credentials: withCtx(() => [createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createVNode(ProjectMoveResourceModalCredentialsList_default, {
"current-project-id": unref(projectsStore).currentProjectId,
credentials: unShareableCredentials.value
}, null, 8, ["current-project-id", "credentials"])]),
default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.tooltipText) }, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.unAccessibleCredentials")), 3)]),
_: 1
})]),
_: 1
})], 2)) : createCommentVNode("", true)
]),
footer: withCtx(({ close }) => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
type: "secondary",
label: unref(i18n$2).baseText("generic.cancel"),
float: "right",
"data-test-id": "cancel-move-folder-button",
onClick: close
}, null, 8, ["label", "onClick"]), createVNode(unref(N8nButton_default), {
disabled: !selectedFolder.value && isFolderSelectable.value,
label: unref(i18n$2).baseText("folders.move.modal.confirm", { interpolate: { resourceTypeLabel: resourceTypeLabel.value } }),
float: "right",
"data-test-id": "confirm-move-folder-button",
onClick: onSubmit
}, null, 8, ["disabled", "label"])], 2)]),
_: 1
}, 8, [
"name",
"title",
"class",
"event-bus"
]);
};
}
});
var MoveToFolderModal_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_m5i36_123",
description: "_description_m5i36_127",
block: "_block_m5i36_132",
footer: "_footer_m5i36_136",
tooltipText: "_tooltipText_m5i36_142",
credentialsCallout: "_credentialsCallout_m5i36_146"
};
var MoveToFolderModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MoveToFolderModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MoveToFolderModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$23 = { key: 0 };
var DeleteUserModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "DeleteUserModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const modalBus = createEventBus();
const loading$3 = ref(false);
const operation = ref("");
const deleteConfirmText = ref("");
const selectedProject = ref(null);
const i18n$2 = useI18n();
const usersStore = useUsersStore();
const projectsStore = useProjectsStore();
const userToDelete = computed(() => {
if (!props.data?.userId) return null;
return usersStore.usersList.state.items.find((user$1) => user$1.id === props.data.userId);
});
const isPending = computed(() => !userToDelete.value?.firstName);
const title$4 = computed(() => {
const user$1 = userToDelete.value?.firstName && userToDelete.value.lastName ? `${userToDelete.value.firstName} ${userToDelete.value.lastName}` : userToDelete.value?.email ?? "";
return i18n$2.baseText("settings.users.deleteUser", { interpolate: { user: user$1 } });
});
const enabled = computed(() => {
if (isPending.value) return true;
if (operation.value === "delete" && deleteConfirmText.value === i18n$2.baseText("settings.users.deleteConfirmationText")) return true;
return !!(operation.value === "transfer" && selectedProject.value);
});
const projects = computed(() => {
return projectsStore.projects.filter((project) => project.name !== `${userToDelete.value?.firstName} ${userToDelete.value?.lastName} <${userToDelete.value?.email}>`);
});
onBeforeMount(async () => {
await projectsStore.getAllProjects();
});
const { showMessage, showError } = useToast();
async function onSubmit() {
if (!enabled.value) return;
try {
loading$3.value = true;
const params = { id: props.data.userId };
if (operation.value === "transfer" && selectedProject.value) params.transferId = selectedProject.value.id;
await usersStore.deleteUser(params);
let message$1 = "";
if (params.transferId) {
const transferProject = projects.value.find((project) => project.id === params.transferId);
if (transferProject) message$1 = i18n$2.baseText("settings.users.transferredToUser", { interpolate: { projectName: transferProject.name ?? "" } });
}
showMessage({
type: "success",
title: i18n$2.baseText("settings.users.userDeleted"),
message: message$1
});
await props.data.afterDelete?.();
modalBus.emit("close");
} catch (error$2) {
showError(error$2, i18n$2.baseText("settings.users.userDeletedError"));
} finally {
loading$3.value = false;
}
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: _ctx.modalName,
title: title$4.value,
center: true,
width: "520",
"event-bus": unref(modalBus),
onEnter: onSubmit
}, {
content: withCtx(() => [createBaseVNode("div", null, [isPending.value ? (openBlock(), createElementBlock("div", _hoisted_1$23, [createVNode(unref(N8nText_default), { color: "text-base" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.users.confirmUserDeletion")), 1)]),
_: 1
})])) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.content)
}, [
createBaseVNode("div", null, [createVNode(unref(N8nText_default), { color: "text-base" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.users.confirmDataHandlingAfterDeletion")), 1)]),
_: 1
})]),
createVNode(unref(ElRadio), {
modelValue: operation.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => operation.value = $event), _cache[1] || (_cache[1] = ($event) => operation.value = "transfer")],
label: "transfer"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.users.transferWorkflowsAndCredentials")), 1)]),
_: 1
})]),
_: 1
}, 8, ["modelValue"]),
operation.value === "transfer" ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.optionInput)
}, [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.users.transferWorkflowsAndCredentials.user")), 1)]),
_: 1
}), createVNode(ProjectSharing_default, {
modelValue: selectedProject.value,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => selectedProject.value = $event),
class: "pt-2xs",
projects: projects.value,
placeholder: unref(i18n$2).baseText("settings.users.transferWorkflowsAndCredentials.placeholder")
}, null, 8, [
"modelValue",
"projects",
"placeholder"
])], 2)) : createCommentVNode("", true),
createVNode(unref(ElRadio), {
modelValue: operation.value,
"onUpdate:modelValue": [_cache[3] || (_cache[3] = ($event) => operation.value = $event), _cache[4] || (_cache[4] = ($event) => operation.value = "delete")],
label: "delete"
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-dark" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.users.deleteWorkflowsAndCredentials")), 1)]),
_: 1
})]),
_: 1
}, 8, ["modelValue"]),
operation.value === "delete" ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.optionInput),
"data-test-id": "delete-data-input"
}, [createVNode(unref(N8nInputLabel_default), { label: unref(i18n$2).baseText("settings.users.deleteConfirmationMessage") }, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
modelValue: deleteConfirmText.value,
"onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => deleteConfirmText.value = $event),
placeholder: unref(i18n$2).baseText("settings.users.deleteConfirmationText")
}, null, 8, ["modelValue", "placeholder"])]),
_: 1
}, 8, ["label"])], 2)) : createCommentVNode("", true)
], 2))])]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
loading: loading$3.value,
disabled: !enabled.value,
label: unref(i18n$2).baseText("settings.users.delete"),
float: "right",
"data-test-id": "confirm-delete-user-button",
onClick: onSubmit
}, null, 8, [
"loading",
"disabled",
"label"
])]),
_: 1
}, 8, [
"name",
"title",
"event-bus"
]);
};
}
});
var DeleteUserModal_vue_vue_type_style_index_0_lang_module_default = {
content: "_content_1ruqp_123",
innerContent: "_innerContent_1ruqp_130",
optionInput: "_optionInput_1ruqp_134"
};
var DeleteUserModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(DeleteUserModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": DeleteUserModal_vue_vue_type_style_index_0_lang_module_default }]]);
var DuplicateWorkflowDialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "DuplicateWorkflowDialog",
props: {
modalName: {},
isActive: { type: Boolean },
data: {}
},
setup(__props) {
const props = __props;
const workflowSaving = useWorkflowSaving({ router: useRouter() });
const workflowHelpers = useWorkflowHelpers();
const { showMessage, showError } = useToast();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const credentialsStore = useCredentialsStore();
const settingsStore = useSettingsStore();
const workflowsStore = useWorkflowsStore();
const name$2 = ref("");
const currentTagIds = ref(props.data.tags);
const isSaving = ref(false);
const prevTagIds = ref(currentTagIds.value);
const modalBus = createEventBus();
const dropdownBus = createEventBus();
const nameInputRef = ref();
const focusOnSelect = () => {
dropdownBus.emit("focus");
};
const focusOnNameInput = () => {
if (nameInputRef.value?.focus) nameInputRef.value.focus();
};
const onTagsBlur = () => {
prevTagIds.value = currentTagIds.value;
};
const onTagsEsc = () => {
currentTagIds.value = prevTagIds.value;
};
const closeDialog = () => {
modalBus.emit("close");
};
const save = async () => {
const workflowName = name$2.value.trim();
if (!workflowName) {
showMessage({
title: i18n$2.baseText("duplicateWorkflowDialog.errors.missingName.title"),
message: i18n$2.baseText("duplicateWorkflowDialog.errors.missingName.message"),
type: "error"
});
return;
}
const parentFolderId = props.data.parentFolderId;
const currentWorkflowId = props.data.id;
isSaving.value = true;
try {
let workflowToUpdate;
if (workflowsStore.isWorkflowSaved[props.data.id]) {
const { createdAt, updatedAt, usedCredentials, id, homeProject, sharedWithProjects, activeVersionId, activeVersion, active,...workflow } = await workflowsStore.fetchWorkflow(props.data.id);
workflowToUpdate = workflow;
workflowHelpers.removeForeignCredentialsFromWorkflow(workflowToUpdate, credentialsStore.allCredentials);
}
if (await workflowSaving.saveAsNewWorkflow({
name: workflowName,
data: workflowToUpdate,
tags: currentTagIds.value,
resetWebhookUrls: true,
openInNewWindow: true,
resetNodeIds: true,
requestNewId: true,
parentFolderId
})) {
closeDialog();
telemetry$1.track("User duplicated workflow", {
old_workflow_id: currentWorkflowId,
workflow_id: props.data.id,
sharing_role: workflowHelpers.getWorkflowProjectRole(props.data.id)
});
props.data.externalEventBus?.emit("workflow-duplicated", { id: props.data.id });
}
} catch (error$2) {
if (error$2.httpStatusCode === 403) {
error$2.message = i18n$2.baseText("duplicateWorkflowDialog.errors.forbidden.message");
showError(error$2, i18n$2.baseText("duplicateWorkflowDialog.errors.forbidden.title"));
} else showError(error$2, i18n$2.baseText("duplicateWorkflowDialog.errors.generic.title"));
} finally {
isSaving.value = false;
}
};
watch(() => props.isActive, (active) => {
if (active) focusOnSelect();
});
onMounted(async () => {
name$2.value = await workflowsStore.getDuplicateCurrentWorkflowName(props.data.name);
await nextTick();
focusOnNameInput();
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: _ctx.modalName,
"event-bus": unref(modalBus),
title: unref(i18n$2).baseText("duplicateWorkflowDialog.duplicateWorkflow"),
center: true,
width: "420px",
onEnter: save
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [createVNode(unref(N8nInput_default), {
ref_key: "nameInputRef",
ref: nameInputRef,
modelValue: name$2.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => name$2.value = $event),
placeholder: unref(i18n$2).baseText("duplicateWorkflowDialog.enterWorkflowName"),
maxlength: unref(128)
}, null, 8, [
"modelValue",
"placeholder",
"maxlength"
]), unref(settingsStore).areTagsEnabled ? (openBlock(), createBlock(WorkflowTagsDropdown_default, {
key: 0,
ref: "dropdown",
modelValue: currentTagIds.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => currentTagIds.value = $event),
"create-enabled": true,
"event-bus": unref(dropdownBus),
placeholder: unref(i18n$2).baseText("duplicateWorkflowDialog.chooseOrCreateATag"),
onBlur: onTagsBlur,
onEsc: onTagsEsc
}, null, 8, [
"modelValue",
"event-bus",
"placeholder"
])) : createCommentVNode("", true)], 2)]),
footer: withCtx(({ close }) => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
loading: isSaving.value,
label: unref(i18n$2).baseText("duplicateWorkflowDialog.save"),
float: "right",
onClick: save
}, null, 8, ["loading", "label"]), createVNode(unref(N8nButton_default), {
type: "secondary",
disabled: isSaving.value,
label: unref(i18n$2).baseText("duplicateWorkflowDialog.cancel"),
float: "right",
onClick: close
}, null, 8, [
"disabled",
"label",
"onClick"
])], 2)]),
_: 1
}, 8, [
"name",
"event-bus",
"title"
]);
};
}
});
var DuplicateWorkflowDialog_vue_vue_type_style_index_0_lang_module_default = {
content: "_content_nl7d5_123",
footer: "_footer_nl7d5_127"
};
var DuplicateWorkflowDialog_default = /* @__PURE__ */ __plugin_vue_export_helper_default(DuplicateWorkflowDialog_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": DuplicateWorkflowDialog_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$22 = {
key: 0,
class: "mb-l"
};
var _hoisted_2$9 = { key: 0 };
var ExternalSecretsProviderModal_ee_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ExternalSecretsProviderModal.ee",
props: { data: {} },
setup(__props) {
const props = __props;
const defaultProviderData = { infisical: { siteURL: "https://app.infisical.com" } };
const externalSecretsStore = useExternalSecretsStore();
const toast = useToast();
const i18n$2 = useI18n();
const { confirm } = useMessage();
const saving = ref(false);
const eventBus = createEventBus();
const labelSize = { size: "medium" };
const provider = computed(() => externalSecretsStore.providers.find((p) => p.name === props.data.name));
const providerData = ref({});
const { connectionState, initialConnectionState, normalizedProviderData, shouldDisplayProperty, setConnectionState, testConnection } = useExternalSecretsProvider(provider, providerData);
const providerDataUpdated = computed(() => {
return Object.keys(providerData.value).find((key) => {
return providerData.value[key] !== provider.value?.data?.[key];
});
});
const canSave = computed(() => provider.value?.properties?.filter((property) => property.required && shouldDisplayProperty(property)).every((property) => {
return !!providerData.value[property.name];
}) && providerDataUpdated.value);
onMounted(async () => {
try {
const fetchedProvider = await externalSecretsStore.getProvider(props.data.name);
providerData.value = {
...defaultProviderData[props.data.name] || {},
...fetchedProvider.data
};
setConnectionState(fetchedProvider.state);
if (fetchedProvider.connected) initialConnectionState.value = fetchedProvider.state;
else if (Object.keys(fetchedProvider.data ?? {}).length) await testConnection();
if (fetchedProvider.state === "connected") externalSecretsStore.reloadProvider(props.data.name);
} catch (error$2) {
toast.showError(error$2, "Error");
}
});
function onValueChange(updateInformation) {
providerData.value = {
...providerData.value,
[updateInformation.name]: updateInformation.value
};
}
async function save() {
if (!provider.value) return;
try {
saving.value = true;
await externalSecretsStore.updateProvider(provider.value.name, { data: normalizedProviderData.value });
setConnectionState(provider.value.state);
} catch (error$2) {
toast.showError(error$2, "Error");
}
await testConnection();
if (initialConnectionState.value === "initializing" && connectionState.value === "tested") setTimeout(() => {
eventBus.emit("connect", true);
}, 100);
saving.value = false;
}
async function onBeforeClose() {
if (providerDataUpdated.value) return await confirm(i18n$2.baseText("settings.externalSecrets.provider.closeWithoutSaving.description", { interpolate: { provider: provider.value?.displayName ?? "" } }), {
title: i18n$2.baseText("settings.externalSecrets.provider.closeWithoutSaving.title"),
confirmButtonText: i18n$2.baseText("settings.externalSecrets.provider.closeWithoutSaving.confirm"),
cancelButtonText: i18n$2.baseText("settings.externalSecrets.provider.closeWithoutSaving.cancel")
}) !== MODAL_CONFIRM;
return true;
}
async function onConnectionStateChange() {
await testConnection();
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
id: "external-secrets-provider-modal",
width: "812px",
title: provider.value?.displayName,
"event-bus": _ctx.data.eventBus,
name: unref(EXTERNAL_SECRETS_PROVIDER_MODAL_KEY),
"before-close": onBeforeClose
}, {
header: withCtx(() => [provider.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.header)
}, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.providerTitle) }, [createVNode(ExternalSecretsProviderImage_ee_default, {
provider: provider.value,
class: "mr-xs"
}, null, 8, ["provider"]), createBaseVNode("span", null, toDisplayString(provider.value.displayName), 1)], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.providerActions) }, [createVNode(ExternalSecretsProviderConnectionSwitch_ee_default, {
class: "mr-s",
disabled: (unref(connectionState) === "initializing" || unref(connectionState) === "error") && !provider.value.connected,
"event-bus": unref(eventBus),
provider: provider.value,
onChange: onConnectionStateChange
}, null, 8, [
"disabled",
"event-bus",
"provider"
]), createVNode(unref(N8nButton_default), {
type: "primary",
loading: saving.value,
disabled: !canSave.value && !saving.value,
onClick: save
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(`settings.externalSecrets.provider.buttons.${saving.value ? "saving" : "save"}`)), 1)]),
_: 1
}, 8, ["loading", "disabled"])], 2)], 2)) : createCommentVNode("", true)]),
content: withCtx(() => [provider.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.container)
}, [
_cache[2] || (_cache[2] = createBaseVNode("hr", { class: "mb-l" }, null, -1)),
unref(connectionState) !== "initializing" ? (openBlock(), createElementBlock("div", _hoisted_1$22, [unref(connectionState) === "connected" || unref(connectionState) === "tested" ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "success"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(`settings.externalSecrets.provider.testConnection.success${provider.value.connected ? ".connected" : ""}`, { interpolate: {
count: `${unref(externalSecretsStore).secrets[provider.value.name]?.length}`,
provider: provider.value.displayName
} })) + " ", 1), provider.value.connected ? (openBlock(), createElementBlock("span", _hoisted_2$9, [
_cache[1] || (_cache[1] = createBaseVNode("br", null, null, -1)),
createVNode(unref(I18nT), {
keypath: "settings.externalSecrets.provider.testConnection.success.connected.usage",
scope: "global"
}, {
code: withCtx(() => [createBaseVNode("code", null, toDisplayString(`\{\{ \$secrets\.${provider.value.name}\.secret_name \}\}`), 1)]),
_: 1
}),
createVNode(unref(N8nLink_default), {
href: unref(i18n$2).baseText("settings.externalSecrets.docs.use"),
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.externalSecrets.provider.testConnection.success.connected.docs")), 1)]),
_: 1
}, 8, ["href"])
])) : createCommentVNode("", true)]),
_: 1
})) : unref(connectionState) === "error" ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 1,
theme: "danger"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(`settings.externalSecrets.provider.testConnection.error${provider.value.connected ? ".connected" : ""}`, { interpolate: { provider: provider.value.displayName } })), 1)]),
_: 1
})) : createCommentVNode("", true)])) : createCommentVNode("", true),
(openBlock(true), createElementBlock(Fragment, null, renderList(provider.value.properties, (property) => {
return withDirectives((openBlock(), createElementBlock("form", {
key: property.name,
autocomplete: "off",
"data-test-id": "external-secrets-provider-properties-form",
onSubmit: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"]))
}, [property.type === "notice" ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
content: property.displayName
}, null, 8, ["content"])) : (openBlock(), createBlock(ParameterInputExpanded_default, {
key: 1,
class: "mb-l",
parameter: property,
value: providerData.value[property.name],
label: labelSize,
"event-source": "external-secrets-provider",
onUpdate: onValueChange
}, null, 8, ["parameter", "value"]))], 32)), [[vShow, unref(shouldDisplayProperty)(property)]]);
}), 128))
], 2)) : createCommentVNode("", true)]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var ExternalSecretsProviderModal_ee_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_1cc79_123",
header: "_header_1cc79_127",
providerTitle: "_providerTitle_1cc79_135",
providerActions: "_providerActions_1cc79_147",
footer: "_footer_1cc79_154"
};
var ExternalSecretsProviderModal_ee_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ExternalSecretsProviderModal_ee_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ExternalSecretsProviderModal_ee_vue_vue_type_style_index_0_lang_module_default }]]);
var FromAiParametersModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "FromAiParametersModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const inputs = ref();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const ndvStore = useNDVStore();
const modalBus = createEventBus();
const workflowsStore = useWorkflowsStore();
const nodeTypesStore = useNodeTypesStore();
const { runWorkflow } = useRunWorkflow({ router: useRouter() });
const agentRequestStore = useAgentRequestStore();
const projectsStore = useProjectsStore();
const node = computed(() => props.data.nodeName ? workflowsStore.getNodeByName(props.data.nodeName) : void 0);
const parentNode = computed(() => {
if (!node.value) return void 0;
const parentNodes = workflowsStore.workflowObject.getChildNodes(node.value.name, "ALL", 1);
if (parentNodes.length === 0) return void 0;
return workflowsStore.getNodeByName(parentNodes[0])?.name;
});
const parameters = ref([]);
const selectedTool = ref("");
const error$2 = ref(void 0);
const nodeRunData = computed(() => {
if (!node.value) return void 0;
const lastRunData = workflowsStore.getWorkflowExecution?.data?.resultData.runData[node.value?.name];
if (!lastRunData) return void 0;
return lastRunData[0];
});
const mapTypes = {
["string"]: {
inputType: "text",
defaultValue: ""
},
["boolean"]: {
inputType: "checkbox",
defaultValue: true
},
["number"]: {
inputType: "number",
defaultValue: 0
},
["json"]: {
inputType: "text",
defaultValue: ""
}
};
const getMCPTools = async (newNode, newSelectedTool) => {
const result = [];
const tools = await nodeTypesStore.getNodeParameterOptions({
nodeTypeAndVersion: {
name: newNode.type,
version: newNode.typeVersion
},
path: "parameters.includedTools",
methodName: "getTools",
currentNodeParameters: newNode.parameters,
credentials: newNode.credentials,
projectId: projectsStore.currentProjectId
});
const toolOptions = tools?.map((tool) => ({
label: tool.name,
value: String(tool.value),
disabled: false
}));
result.push({
name: "toolName",
initialValue: "",
properties: {
label: "Tool name",
type: "select",
options: toolOptions,
required: true
}
});
if (newSelectedTool) {
const schema = (tools?.find((tool) => String(tool.value) === newSelectedTool))?.inputSchema;
if (schema.properties) for (const [propertyName, value] of Object.entries(schema.properties)) {
const type = typeof value === "object" && "type" in value && typeof value.type === "string" ? value.type : "text";
result.push({
name: "query." + propertyName,
initialValue: "",
properties: {
label: propertyName,
type: mapTypes[type].inputType,
required: true
}
});
}
}
return result;
};
function checkImplicitInput(node$1) {
const aiSubcategories = nodeTypesStore.getNodeType(node$1.type, node$1.typeVersion)?.codex?.subcategories?.AI;
const isVectorStoreToolNode = aiSubcategories?.includes("Vector Stores") && aiSubcategories?.includes("Tools");
const mode$2 = node$1.parameters.mode;
return isVectorStoreToolNode && mode$2 === "retrieve-as-tool";
}
watch([node, selectedTool], async ([newNode, newSelectedTool]) => {
error$2.value = void 0;
if (!newNode) {
parameters.value = [];
return;
}
const result = [];
if (newNode.type === "@n8n/n8n-nodes-langchain.mcpClientTool") try {
parameters.value = await getMCPTools(newNode, newSelectedTool);
return;
} catch (e) {
error$2.value = e instanceof Error ? e : /* @__PURE__ */ new Error("Unknown error occurred");
}
const params = newNode.parameters;
const collectedArgs = [];
traverseNodeParameters(params, collectedArgs);
const inputOverrides = nodeRunData.value?.inputOverride?.[NodeConnectionTypes.AiTool]?.[0]?.[0].json;
collectedArgs.forEach((value) => {
const type = value.type ?? "string";
const inputQuery = inputOverrides?.query;
const initialValue = inputQuery?.[value.key] ? inputQuery[value.key] : agentRequestStore.getQueryValue(workflowsStore.workflowId, newNode.id, value.key) ?? mapTypes[type]?.defaultValue;
result.push({
name: "query." + value.key,
initialValue,
properties: {
label: value.key,
type: mapTypes[value.type ?? "string"].inputType,
required: true
}
});
});
const hasImplicitInput = checkImplicitInput(newNode);
if (result.length === 0 || hasImplicitInput) {
const key = hasImplicitInput ? "input" : "query";
const queryValue = inputOverrides?.[key] ?? agentRequestStore.getQueryValue(workflowsStore.workflowId, newNode.id, key) ?? "";
result.unshift({
name: hasImplicitInput ? "query.input" : "query",
initialValue: queryValue ?? "",
properties: {
label: "Query",
type: "text",
required: true
}
});
}
parameters.value = result;
}, { immediate: true });
const onClose = () => {
modalBus.emit("close");
};
const onExecute = async () => {
if (!node.value) return;
const inputValues = inputs.value?.getValues() ?? {};
agentRequestStore.clearAgentRequests(workflowsStore.workflowId, node.value.id);
const agentRequest = {
query: {},
toolName: inputValues.toolName
};
Object.entries(inputValues).forEach(([key, value]) => {
if (key === "query") agentRequest.query = value;
else if (key.startsWith("query.") && "string" !== typeof agentRequest.query) {
const queryKey = key.replace("query.", "");
agentRequest.query[queryKey] = value;
}
});
agentRequestStore.setAgentRequestForNode(workflowsStore.workflowId, node.value.id, agentRequest);
const telemetryPayload = {
node_type: node.value.type,
workflow_id: workflowsStore.workflowId,
source: "from-ai-parameters-modal",
push_ref: ndvStore.pushRef
};
telemetry$1.track("User clicked execute node button in modal", telemetryPayload);
await runWorkflow({ destinationNode: {
nodeName: node.value.name,
mode: "inclusive"
} });
onClose();
};
const onUpdate = (change) => {
if (change.name !== "toolName") return;
if (typeof change.value === "string") selectedTool.value = change.value;
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "540px",
title: unref(i18n$2).baseText("fromAiParametersModal.title", { interpolate: { nodeName: node.value?.name || "" } }),
"event-bus": unref(modalBus),
name: unref(FROM_AI_PARAMETERS_MODAL_KEY),
center: true,
"close-on-click-modal": false
}, createSlots({ _: 2 }, [error$2.value ? {
name: "content",
fn: withCtx(() => [error$2.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "danger"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(error$2.value.message), 1)]),
_: 1
})) : createCommentVNode("", true)]),
key: "0"
} : {
name: "content",
fn: withCtx(() => [createVNode(unref(ElCol), null, {
default: withCtx(() => [createVNode(unref(ElRow), { class: normalizeClass(_ctx.$style.row) }, {
default: withCtx(() => [createVNode(unref(N8nText_default), { "data-testid": "from-ai-parameters-modal-description" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("fromAiParametersModal.description", { interpolate: { parentNodeName: parentNode.value || "" } })), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"])]),
_: 1
}), createVNode(unref(ElCol), null, {
default: withCtx(() => [createVNode(unref(ElRow), { class: normalizeClass(_ctx.$style.row) }, {
default: withCtx(() => [createVNode(unref(N8nFormInputs_default), {
ref_key: "inputs",
ref: inputs,
inputs: parameters.value,
"column-view": true,
"data-test-id": "from-ai-parameters-modal-inputs",
onSubmit: onExecute,
onUpdate
}, null, 8, ["inputs"])]),
_: 1
}, 8, ["class"])]),
_: 1
})]),
key: "1"
}, !error$2.value ? {
name: "footer",
fn: withCtx(() => [createVNode(unref(N8nButton_default), {
"data-test-id": "execute-workflow-button",
icon: "flask-conical",
label: unref(i18n$2).baseText("fromAiParametersModal.execute"),
float: "right",
onClick: onExecute
}, null, 8, ["label"])]),
key: "2"
} : void 0]), 1032, [
"title",
"event-bus",
"name"
]);
};
}
});
var FromAiParametersModal_vue_vue_type_style_index_0_lang_module_default = { row: "_row_69zig_123" };
var FromAiParametersModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(FromAiParametersModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": FromAiParametersModal_vue_vue_type_style_index_0_lang_module_default }]]);
var ImportCurlModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ImportCurlModal",
setup(__props) {
const telemetry$1 = useTelemetry();
const i18n$2 = useI18n();
const uiStore = useUIStore();
const ndvStore = useNDVStore();
const curlCommand = ref("");
const modalBus = createEventBus();
const inputRef = ref(null);
onMounted(() => {
const curlCommands = uiStore.modalsById[IMPORT_CURL_MODAL_KEY].data?.curlCommands;
const nodeId = ndvStore.activeNode?.id ?? "";
curlCommand.value = curlCommands?.[nodeId] ?? "";
setTimeout(() => {
inputRef.value?.focus();
});
});
function onInput(value) {
curlCommand.value = value;
}
function closeDialog() {
modalBus.emit("close");
}
function onImportSuccess() {
sendTelemetry();
closeDialog();
}
function onImportFailure(data) {
sendTelemetry({
success: false,
...data
});
}
function onAfterImport() {
const nodeId = ndvStore.activeNode?.id;
const curlCommands = uiStore.modalsById["importCurl"].data?.curlCommands ?? {};
curlCommands[nodeId] = curlCommand.value;
uiStore.setModalData({
name: IMPORT_CURL_MODAL_KEY,
data: { curlCommands }
});
}
function sendTelemetry(data = {
success: true,
invalidProtocol: false,
protocol: ""
}) {
telemetry$1.track("User imported curl command", {
success: data.success,
invalidProtocol: data.invalidProtocol,
protocol: data.protocol
});
}
async function onImport() {
const { useImportCurlCommand } = await __vitePreload(async () => {
const { useImportCurlCommand: useImportCurlCommand$1 } = await import("./useImportCurlCommand-C_c-9DcI.js");
return { useImportCurlCommand: useImportCurlCommand$1 };
}, __vite__mapDeps([62,4,5,6,7,15,10,16,17,18,19,20,11]));
const { importCurlCommand } = useImportCurlCommand({
onImportSuccess,
onImportFailure,
onAfterImport
});
importCurlCommand(curlCommand);
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "700px",
title: unref(i18n$2).baseText("importCurlModal.title"),
"event-bus": unref(modalBus),
name: unref(IMPORT_CURL_MODAL_KEY),
center: true
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("importCurlModal.input.label"),
color: "text-dark"
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
ref_key: "inputRef",
ref: inputRef,
"model-value": curlCommand.value,
type: "textarea",
rows: 5,
"data-test-id": "import-curl-modal-input",
placeholder: unref(i18n$2).baseText("importCurlModal.input.placeholder"),
"onUpdate:modelValue": onInput,
onFocus: _cache[0] || (_cache[0] = ($event) => $event.target.select())
}, null, 8, ["model-value", "placeholder"])]),
_: 1
}, 8, ["label"])], 2)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.modalFooter) }, [createVNode(unref(N8nNotice_default), {
class: normalizeClass(_ctx.$style.notice),
content: unref(i18n$2).baseText("ImportCurlModal.notice.content")
}, null, 8, ["class", "content"]), createBaseVNode("div", null, [createVNode(unref(N8nButton_default), {
float: "right",
label: unref(i18n$2).baseText("importCurlModal.button.label"),
"data-test-id": "import-curl-modal-button",
onClick: onImport
}, null, 8, ["label"])])], 2)]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var ImportCurlModal_vue_vue_type_style_index_0_lang_module_default = {
modalFooter: "_modalFooter_1frjj_123",
notice: "_notice_1frjj_129",
container: "_container_1frjj_133"
};
var ImportCurlModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ImportCurlModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ImportCurlModal_vue_vue_type_style_index_0_lang_module_default }]]);
var ImportWorkflowUrlModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ImportWorkflowUrlModal",
setup(__props) {
const i18n$2 = useI18n();
const uiStore = useUIStore();
const url = ref("");
const inputRef = ref(null);
const isValid = computed(() => {
return url.value ? VALID_WORKFLOW_IMPORT_URL_REGEX.test(url.value) : true;
});
const closeModal = () => {
uiStore.closeModal(IMPORT_WORKFLOW_URL_MODAL_KEY);
};
const confirm = () => {
nodeViewEventBus.emit("importWorkflowUrl", { url: url.value });
closeModal();
};
const focusInput = async () => {
if (inputRef.value) inputRef.value.focus();
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(IMPORT_WORKFLOW_URL_MODAL_KEY),
title: unref(i18n$2).baseText("mainSidebar.prompt.importWorkflowFromUrl"),
"show-close": true,
center: true,
width: "420px",
onOpened: focusInput
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.noScrollbar) }, [createVNode(unref(N8nInput_default), {
ref_key: "inputRef",
ref: inputRef,
modelValue: url.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => url.value = $event),
placeholder: unref(i18n$2).baseText("mainSidebar.prompt.workflowUrl"),
state: isValid.value ? "default" : "error",
"data-test-id": "workflow-url-import-input",
onKeyup: withKeys(confirm, ["enter"])
}, null, 8, [
"modelValue",
"placeholder",
"state"
]), createBaseVNode("p", {
class: normalizeClass(_ctx.$style["error-text"]),
style: normalizeStyle({ visibility: isValid.value ? "hidden" : "visible" })
}, toDisplayString(unref(i18n$2).baseText("mainSidebar.prompt.invalidUrl")), 7)], 2)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
type: "primary",
float: "right",
disabled: !url.value || !isValid.value,
"data-test-id": "confirm-workflow-import-url-button",
onClick: confirm
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mainSidebar.prompt.import")), 1)]),
_: 1
}, 8, ["disabled"]), createVNode(unref(N8nButton_default), {
type: "secondary",
float: "right",
"data-test-id": "cancel-workflow-import-url-button",
onClick: closeModal
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mainSidebar.prompt.cancel")), 1)]),
_: 1
})], 2)]),
_: 1
}, 8, ["name", "title"]);
};
}
});
const footer$8 = "_footer_1vq00_131";
const noScrollbar = "_noScrollbar_1vq00_135";
var ImportWorkflowUrlModal_vue_vue_type_style_index_0_lang_module_default = {
"error-text": "_error-text_1vq00_123",
footer: footer$8,
noScrollbar
};
var ImportWorkflowUrlModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ImportWorkflowUrlModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ImportWorkflowUrlModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$21 = { key: 1 };
var InviteUsersModal_default = /* @__PURE__ */ defineComponent({
__name: "InviteUsersModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const NAME_EMAIL_FORMAT_REGEX = /^.* <(.*)>$/;
const usersStore = useUsersStore();
const settingsStore = useSettingsStore();
const clipboard = useClipboard();
const { showMessage, showError } = useToast();
const i18n$2 = useI18n();
const { goToUpgrade } = usePageRedirectionHelper();
const formBus = createFormEventBus();
const modalBus = createEventBus();
const config$1 = ref();
const emails = ref("");
const role = ref(ROLE.Member);
const showInviteUrls = ref(null);
const loading$3 = ref(false);
const emailsCount = computed(() => {
return emails.value.split(",").filter((email) => !!email.trim()).length;
});
const buttonLabel = computed(() => {
if (emailsCount.value > 1) return i18n$2.baseText(`settings.users.inviteXUser${settingsStore.isSmtpSetup ? "" : ".inviteUrl"}`, { interpolate: { count: emailsCount.value.toString() } });
return i18n$2.baseText(`settings.users.inviteUser${settingsStore.isSmtpSetup ? "" : ".inviteUrl"}`);
});
const enabledButton = computed(() => {
return emailsCount.value >= 1;
});
const invitedUsers = computed(() => {
return showInviteUrls.value ? usersStore.allUsers.filter((user$1) => showInviteUrls.value?.find((invite) => invite.user.id === user$1.id)) : [];
});
const isAdvancedPermissionsEnabled = computed(() => {
return settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.AdvancedPermissions];
});
const isChatHubEnabled = computed(() => {
return settingsStore.isChatFeatureEnabled;
});
const isChatUsersEnabled = computed(() => {
return isChatHubEnabled.value && settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.AdvancedPermissions];
});
const validateEmails = (value) => {
if (typeof value !== "string") return false;
const emails$1 = value.split(",");
for (let i$1 = 0; i$1 < emails$1.length; i$1++) {
const email = emails$1[i$1];
const parsed = getEmail(email);
if (!!parsed.trim() && !VALID_EMAIL_REGEX.test(String(parsed).trim().toLowerCase())) return {
messageKey: "settings.users.invalidEmailError",
options: { interpolate: { email: parsed } }
};
}
return false;
};
function isInvitableRoleName(val) {
return typeof val === "string" && [
ROLE.Member,
ROLE.Admin,
ROLE.ChatUser
].includes(val);
}
function onInput(e) {
if (e.name === "emails" && typeof e.value === "string") emails.value = e.value;
if (e.name === "role" && isInvitableRoleName(e.value)) role.value = e.value;
}
async function onSubmit() {
try {
loading$3.value = true;
const emailList = emails.value.split(",").map((email) => ({
email: getEmail(email),
role: role.value
})).filter((invite) => !!invite.email);
if (emailList.length === 0) throw new Error(i18n$2.baseText("settings.users.noUsersToInvite"));
const invited = await usersStore.inviteUsers(emailList);
const erroredInvites = invited.filter((invite) => invite.error);
const successfulEmailInvites = invited.filter((invite) => !invite.error && invite.user.emailSent);
const successfulUrlInvites = invited.filter((invite) => !invite.error && !invite.user.emailSent);
if (successfulEmailInvites.length) showMessage({
type: "success",
title: i18n$2.baseText(successfulEmailInvites.length > 1 ? "settings.users.usersInvited" : "settings.users.userInvited"),
message: i18n$2.baseText("settings.users.emailInvitesSent", { interpolate: { emails: successfulEmailInvites.map(({ user: user$1 }) => user$1.email).join(", ") } })
});
if (successfulUrlInvites.length) {
if (successfulUrlInvites.length === 1) clipboard.copy(successfulUrlInvites[0].user.inviteAcceptUrl);
showMessage({
type: "success",
title: i18n$2.baseText(successfulUrlInvites.length > 1 ? "settings.users.multipleInviteUrlsCreated" : "settings.users.inviteUrlCreated"),
message: i18n$2.baseText(successfulUrlInvites.length > 1 ? "settings.users.multipleInviteUrlsCreated.message" : "settings.users.inviteUrlCreated.message", { interpolate: { emails: successfulUrlInvites.map(({ user: user$1 }) => user$1.email).join(", ") } })
});
}
if (erroredInvites.length) setTimeout(() => {
showMessage({
type: "error",
title: i18n$2.baseText("settings.users.usersEmailedError"),
message: i18n$2.baseText("settings.users.emailInvitesSentError", { interpolate: { emails: erroredInvites.map(({ error: error$2 }) => error$2).join(", ") } })
});
}, 0);
if (successfulUrlInvites.length > 1) showInviteUrls.value = successfulUrlInvites;
else modalBus.emit("close");
await props.data.afterInvite?.();
} catch (error$2) {
showError(error$2, i18n$2.baseText("settings.users.usersInvitedError"));
}
loading$3.value = false;
}
function showCopyInviteLinkToast(successfulUrlInvites) {
showMessage({
type: "success",
title: i18n$2.baseText(successfulUrlInvites.length > 1 ? "settings.users.multipleInviteUrlsCreated" : "settings.users.inviteUrlCreated"),
message: i18n$2.baseText(successfulUrlInvites.length > 1 ? "settings.users.multipleInviteUrlsCreated.message" : "settings.users.inviteUrlCreated.message", { interpolate: { emails: successfulUrlInvites.map(({ user: user$1 }) => user$1.email).join(", ") } })
});
}
function onSubmitClick() {
formBus.emit("submit");
}
function onCopyInviteLink(user$1) {
if (user$1.inviteAcceptUrl && showInviteUrls.value) {
clipboard.copy(user$1.inviteAcceptUrl);
showCopyInviteLinkToast([]);
}
}
function goToUpgradeAdvancedPermissions() {
goToUpgrade("advanced-permissions", "upgrade-advanced-permissions");
}
function getEmail(email) {
let parsed = email.trim();
if (NAME_EMAIL_FORMAT_REGEX.test(parsed)) {
const matches = parsed.match(NAME_EMAIL_FORMAT_REGEX);
if (matches && matches.length === 2) parsed = matches[1];
}
return parsed;
}
onMounted(() => {
config$1.value = [{
name: "emails",
properties: {
label: i18n$2.baseText("settings.users.newEmailsToInvite"),
required: true,
validationRules: [{ name: "VALID_EMAILS" }],
validators: { VALID_EMAILS: { validate: validateEmails } },
placeholder: "name1@email.com, name2@email.com, ...",
capitalize: true,
focusInitially: true
}
}, {
name: "role",
initialValue: ROLE.Member,
properties: {
label: i18n$2.baseText("auth.role"),
required: true,
type: "select",
options: [
{
value: ROLE.Member,
label: i18n$2.baseText("auth.roles.member")
},
...isChatHubEnabled.value ? [{
value: ROLE.ChatUser,
label: i18n$2.baseText("auth.roles.chatUser"),
disabled: !isChatUsersEnabled.value
}] : [],
{
value: ROLE.Admin,
label: i18n$2.baseText("auth.roles.admin"),
disabled: !isAdvancedPermissionsEnabled.value
}
],
capitalize: true
}
}];
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(INVITE_USER_MODAL_KEY),
title: unref(i18n$2).baseText(showInviteUrls.value ? "settings.users.copyInviteUrls" : "settings.users.inviteNewUsers"),
center: true,
width: "460px",
"event-bus": unref(modalBus),
onEnter: onSubmit
}, createSlots({
content: withCtx(() => [!isAdvancedPermissionsEnabled.value ? (openBlock(), createBlock(unref(N8nNotice_default), { key: 0 }, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "settings.users.advancedPermissions.warning",
scope: "global"
}, {
link: withCtx(() => [createVNode(unref(N8nLink_default), {
size: "small",
onClick: goToUpgradeAdvancedPermissions
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.upgrade")), 1)]),
_: 1
})]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true), showInviteUrls.value ? (openBlock(), createElementBlock("div", _hoisted_1$21, [createVNode(unref(N8nUsersList_default), { users: invitedUsers.value }, {
actions: withCtx(({ user: user$1 }) => [createVNode(unref(N8nTooltip_default), null, {
content: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.users.inviteLink.copy")), 1)]),
default: withCtx(() => [createVNode(unref(N8nIconButton_default), {
icon: "link",
type: "tertiary",
"data-test-id": "copy-invite-link-button",
"data-invite-link": user$1.inviteAcceptUrl,
onClick: ($event) => onCopyInviteLink(user$1)
}, null, 8, ["data-invite-link", "onClick"])]),
_: 2
}, 1024)]),
_: 1
}, 8, ["users"])])) : config$1.value ? (openBlock(), createBlock(unref(N8nFormInputs_default), {
key: 2,
inputs: config$1.value,
"event-bus": unref(formBus),
"column-view": true,
onUpdate: onInput,
onSubmit
}, null, 8, ["inputs", "event-bus"])) : createCommentVNode("", true)]),
_: 2
}, [!showInviteUrls.value ? {
name: "footer",
fn: withCtx(() => [createVNode(unref(N8nButton_default), {
loading: loading$3.value,
disabled: !enabledButton.value,
label: buttonLabel.value,
float: "right",
onClick: onSubmitClick
}, null, 8, [
"loading",
"disabled",
"label"
])]),
key: "0"
} : void 0]), 1032, [
"name",
"title",
"event-bus"
]);
};
}
});
var __assign = function() {
__assign = Object.assign || function __assign$1(t) {
for (var s, i$1 = 1, n = arguments.length; i$1 < n; i$1++) {
s = arguments[i$1];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var mode$1 = {
MODE_NUMBER: 1,
MODE_ALPHA_NUM: 2,
MODE_8BIT_BYTE: 4,
MODE_KANJI: 8
};
var mode = mode$1;
function QR8bitByte(data) {
this.mode = mode.MODE_8BIT_BYTE;
this.data = data;
}
QR8bitByte.prototype = {
getLength: function(buffer) {
return this.data.length;
},
write: function(buffer) {
for (var i$1 = 0; i$1 < this.data.length; i$1++) buffer.put(this.data.charCodeAt(i$1), 8);
}
};
var _8BitByte = QR8bitByte;
var ErrorCorrectLevel = {
L: 1,
M: 0,
Q: 3,
H: 2
};
var ECL = ErrorCorrectLevel;
function QRRSBlock(totalCount, dataCount) {
this.totalCount = totalCount;
this.dataCount = dataCount;
}
QRRSBlock.RS_BLOCK_TABLE = [
[
1,
26,
19
],
[
1,
26,
16
],
[
1,
26,
13
],
[
1,
26,
9
],
[
1,
44,
34
],
[
1,
44,
28
],
[
1,
44,
22
],
[
1,
44,
16
],
[
1,
70,
55
],
[
1,
70,
44
],
[
2,
35,
17
],
[
2,
35,
13
],
[
1,
100,
80
],
[
2,
50,
32
],
[
2,
50,
24
],
[
4,
25,
9
],
[
1,
134,
108
],
[
2,
67,
43
],
[
2,
33,
15,
2,
34,
16
],
[
2,
33,
11,
2,
34,
12
],
[
2,
86,
68
],
[
4,
43,
27
],
[
4,
43,
19
],
[
4,
43,
15
],
[
2,
98,
78
],
[
4,
49,
31
],
[
2,
32,
14,
4,
33,
15
],
[
4,
39,
13,
1,
40,
14
],
[
2,
121,
97
],
[
2,
60,
38,
2,
61,
39
],
[
4,
40,
18,
2,
41,
19
],
[
4,
40,
14,
2,
41,
15
],
[
2,
146,
116
],
[
3,
58,
36,
2,
59,
37
],
[
4,
36,
16,
4,
37,
17
],
[
4,
36,
12,
4,
37,
13
],
[
2,
86,
68,
2,
87,
69
],
[
4,
69,
43,
1,
70,
44
],
[
6,
43,
19,
2,
44,
20
],
[
6,
43,
15,
2,
44,
16
],
[
4,
101,
81
],
[
1,
80,
50,
4,
81,
51
],
[
4,
50,
22,
4,
51,
23
],
[
3,
36,
12,
8,
37,
13
],
[
2,
116,
92,
2,
117,
93
],
[
6,
58,
36,
2,
59,
37
],
[
4,
46,
20,
6,
47,
21
],
[
7,
42,
14,
4,
43,
15
],
[
4,
133,
107
],
[
8,
59,
37,
1,
60,
38
],
[
8,
44,
20,
4,
45,
21
],
[
12,
33,
11,
4,
34,
12
],
[
3,
145,
115,
1,
146,
116
],
[
4,
64,
40,
5,
65,
41
],
[
11,
36,
16,
5,
37,
17
],
[
11,
36,
12,
5,
37,
13
],
[
5,
109,
87,
1,
110,
88
],
[
5,
65,
41,
5,
66,
42
],
[
5,
54,
24,
7,
55,
25
],
[
11,
36,
12
],
[
5,
122,
98,
1,
123,
99
],
[
7,
73,
45,
3,
74,
46
],
[
15,
43,
19,
2,
44,
20
],
[
3,
45,
15,
13,
46,
16
],
[
1,
135,
107,
5,
136,
108
],
[
10,
74,
46,
1,
75,
47
],
[
1,
50,
22,
15,
51,
23
],
[
2,
42,
14,
17,
43,
15
],
[
5,
150,
120,
1,
151,
121
],
[
9,
69,
43,
4,
70,
44
],
[
17,
50,
22,
1,
51,
23
],
[
2,
42,
14,
19,
43,
15
],
[
3,
141,
113,
4,
142,
114
],
[
3,
70,
44,
11,
71,
45
],
[
17,
47,
21,
4,
48,
22
],
[
9,
39,
13,
16,
40,
14
],
[
3,
135,
107,
5,
136,
108
],
[
3,
67,
41,
13,
68,
42
],
[
15,
54,
24,
5,
55,
25
],
[
15,
43,
15,
10,
44,
16
],
[
4,
144,
116,
4,
145,
117
],
[
17,
68,
42
],
[
17,
50,
22,
6,
51,
23
],
[
19,
46,
16,
6,
47,
17
],
[
2,
139,
111,
7,
140,
112
],
[
17,
74,
46
],
[
7,
54,
24,
16,
55,
25
],
[
34,
37,
13
],
[
4,
151,
121,
5,
152,
122
],
[
4,
75,
47,
14,
76,
48
],
[
11,
54,
24,
14,
55,
25
],
[
16,
45,
15,
14,
46,
16
],
[
6,
147,
117,
4,
148,
118
],
[
6,
73,
45,
14,
74,
46
],
[
11,
54,
24,
16,
55,
25
],
[
30,
46,
16,
2,
47,
17
],
[
8,
132,
106,
4,
133,
107
],
[
8,
75,
47,
13,
76,
48
],
[
7,
54,
24,
22,
55,
25
],
[
22,
45,
15,
13,
46,
16
],
[
10,
142,
114,
2,
143,
115
],
[
19,
74,
46,
4,
75,
47
],
[
28,
50,
22,
6,
51,
23
],
[
33,
46,
16,
4,
47,
17
],
[
8,
152,
122,
4,
153,
123
],
[
22,
73,
45,
3,
74,
46
],
[
8,
53,
23,
26,
54,
24
],
[
12,
45,
15,
28,
46,
16
],
[
3,
147,
117,
10,
148,
118
],
[
3,
73,
45,
23,
74,
46
],
[
4,
54,
24,
31,
55,
25
],
[
11,
45,
15,
31,
46,
16
],
[
7,
146,
116,
7,
147,
117
],
[
21,
73,
45,
7,
74,
46
],
[
1,
53,
23,
37,
54,
24
],
[
19,
45,
15,
26,
46,
16
],
[
5,
145,
115,
10,
146,
116
],
[
19,
75,
47,
10,
76,
48
],
[
15,
54,
24,
25,
55,
25
],
[
23,
45,
15,
25,
46,
16
],
[
13,
145,
115,
3,
146,
116
],
[
2,
74,
46,
29,
75,
47
],
[
42,
54,
24,
1,
55,
25
],
[
23,
45,
15,
28,
46,
16
],
[
17,
145,
115
],
[
10,
74,
46,
23,
75,
47
],
[
10,
54,
24,
35,
55,
25
],
[
19,
45,
15,
35,
46,
16
],
[
17,
145,
115,
1,
146,
116
],
[
14,
74,
46,
21,
75,
47
],
[
29,
54,
24,
19,
55,
25
],
[
11,
45,
15,
46,
46,
16
],
[
13,
145,
115,
6,
146,
116
],
[
14,
74,
46,
23,
75,
47
],
[
44,
54,
24,
7,
55,
25
],
[
59,
46,
16,
1,
47,
17
],
[
12,
151,
121,
7,
152,
122
],
[
12,
75,
47,
26,
76,
48
],
[
39,
54,
24,
14,
55,
25
],
[
22,
45,
15,
41,
46,
16
],
[
6,
151,
121,
14,
152,
122
],
[
6,
75,
47,
34,
76,
48
],
[
46,
54,
24,
10,
55,
25
],
[
2,
45,
15,
64,
46,
16
],
[
17,
152,
122,
4,
153,
123
],
[
29,
74,
46,
14,
75,
47
],
[
49,
54,
24,
10,
55,
25
],
[
24,
45,
15,
46,
46,
16
],
[
4,
152,
122,
18,
153,
123
],
[
13,
74,
46,
32,
75,
47
],
[
48,
54,
24,
14,
55,
25
],
[
42,
45,
15,
32,
46,
16
],
[
20,
147,
117,
4,
148,
118
],
[
40,
75,
47,
7,
76,
48
],
[
43,
54,
24,
22,
55,
25
],
[
10,
45,
15,
67,
46,
16
],
[
19,
148,
118,
6,
149,
119
],
[
18,
75,
47,
31,
76,
48
],
[
34,
54,
24,
34,
55,
25
],
[
20,
45,
15,
61,
46,
16
]
];
QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {
var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
if (rsBlock == void 0) throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
var length = rsBlock.length / 3;
var list$1 = new Array();
for (var i$1 = 0; i$1 < length; i$1++) {
var count = rsBlock[i$1 * 3 + 0];
var totalCount = rsBlock[i$1 * 3 + 1];
var dataCount = rsBlock[i$1 * 3 + 2];
for (var j$1 = 0; j$1 < count; j$1++) list$1.push(new QRRSBlock(totalCount, dataCount));
}
return list$1;
};
QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {
switch (errorCorrectLevel) {
case ECL.L: return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
case ECL.M: return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
case ECL.Q: return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
case ECL.H: return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
default: return;
}
};
var RSBlock$1 = QRRSBlock;
function QRBitBuffer() {
this.buffer = new Array();
this.length = 0;
}
QRBitBuffer.prototype = {
get: function(index) {
var bufIndex = Math.floor(index / 8);
return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) == 1;
},
put: function(num, length) {
for (var i$1 = 0; i$1 < length; i$1++) this.putBit((num >>> length - i$1 - 1 & 1) == 1);
},
getLengthInBits: function() {
return this.length;
},
putBit: function(bit) {
var bufIndex = Math.floor(this.length / 8);
if (this.buffer.length <= bufIndex) this.buffer.push(0);
if (bit) this.buffer[bufIndex] |= 128 >>> this.length % 8;
this.length++;
}
};
var BitBuffer$1 = QRBitBuffer;
var QRMath = {
glog: function(n) {
if (n < 1) throw new Error("glog(" + n + ")");
return QRMath.LOG_TABLE[n];
},
gexp: function(n) {
while (n < 0) n += 255;
while (n >= 256) n -= 255;
return QRMath.EXP_TABLE[n];
},
EXP_TABLE: new Array(256),
LOG_TABLE: new Array(256)
};
for (var i = 0; i < 8; i++) QRMath.EXP_TABLE[i] = 1 << i;
for (var i = 8; i < 256; i++) QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
for (var i = 0; i < 255; i++) QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
var math$2 = QRMath;
var math$1 = math$2;
function QRPolynomial(num, shift) {
if (num.length == void 0) throw new Error(num.length + "/" + shift);
var offset = 0;
while (offset < num.length && num[offset] == 0) offset++;
this.num = new Array(num.length - offset + shift);
for (var i$1 = 0; i$1 < num.length - offset; i$1++) this.num[i$1] = num[i$1 + offset];
}
QRPolynomial.prototype = {
get: function(index) {
return this.num[index];
},
getLength: function() {
return this.num.length;
},
multiply: function(e) {
var num = new Array(this.getLength() + e.getLength() - 1);
for (var i$1 = 0; i$1 < this.getLength(); i$1++) for (var j$1 = 0; j$1 < e.getLength(); j$1++) num[i$1 + j$1] ^= math$1.gexp(math$1.glog(this.get(i$1)) + math$1.glog(e.get(j$1)));
return new QRPolynomial(num, 0);
},
mod: function(e) {
if (this.getLength() - e.getLength() < 0) return this;
var ratio = math$1.glog(this.get(0)) - math$1.glog(e.get(0));
var num = new Array(this.getLength());
for (var i$1 = 0; i$1 < this.getLength(); i$1++) num[i$1] = this.get(i$1);
for (var i$1 = 0; i$1 < e.getLength(); i$1++) num[i$1] ^= math$1.gexp(math$1.glog(e.get(i$1)) + ratio);
return new QRPolynomial(num, 0).mod(e);
}
};
var Polynomial$2 = QRPolynomial;
var Mode = mode$1;
var Polynomial$1 = Polynomial$2;
var math = math$2;
var QRMaskPattern = {
PATTERN000: 0,
PATTERN001: 1,
PATTERN010: 2,
PATTERN011: 3,
PATTERN100: 4,
PATTERN101: 5,
PATTERN110: 6,
PATTERN111: 7
};
var QRUtil = {
PATTERN_POSITION_TABLE: [
[],
[6, 18],
[6, 22],
[6, 26],
[6, 30],
[6, 34],
[
6,
22,
38
],
[
6,
24,
42
],
[
6,
26,
46
],
[
6,
28,
50
],
[
6,
30,
54
],
[
6,
32,
58
],
[
6,
34,
62
],
[
6,
26,
46,
66
],
[
6,
26,
48,
70
],
[
6,
26,
50,
74
],
[
6,
30,
54,
78
],
[
6,
30,
56,
82
],
[
6,
30,
58,
86
],
[
6,
34,
62,
90
],
[
6,
28,
50,
72,
94
],
[
6,
26,
50,
74,
98
],
[
6,
30,
54,
78,
102
],
[
6,
28,
54,
80,
106
],
[
6,
32,
58,
84,
110
],
[
6,
30,
58,
86,
114
],
[
6,
34,
62,
90,
118
],
[
6,
26,
50,
74,
98,
122
],
[
6,
30,
54,
78,
102,
126
],
[
6,
26,
52,
78,
104,
130
],
[
6,
30,
56,
82,
108,
134
],
[
6,
34,
60,
86,
112,
138
],
[
6,
30,
58,
86,
114,
142
],
[
6,
34,
62,
90,
118,
146
],
[
6,
30,
54,
78,
102,
126,
150
],
[
6,
24,
50,
76,
102,
128,
154
],
[
6,
28,
54,
80,
106,
132,
158
],
[
6,
32,
58,
84,
110,
136,
162
],
[
6,
26,
54,
82,
110,
138,
166
],
[
6,
30,
58,
86,
114,
142,
170
]
],
G15: 1335,
G18: 7973,
G15_MASK: 21522,
getBCHTypeInfo: function(data) {
var d = data << 10;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15);
return (data << 10 | d) ^ QRUtil.G15_MASK;
},
getBCHTypeNumber: function(data) {
var d = data << 12;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18);
return data << 12 | d;
},
getBCHDigit: function(data) {
var digit = 0;
while (data != 0) {
digit++;
data >>>= 1;
}
return digit;
},
getPatternPosition: function(typeNumber) {
return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
},
getMask: function(maskPattern, i$1, j$1) {
switch (maskPattern) {
case QRMaskPattern.PATTERN000: return (i$1 + j$1) % 2 == 0;
case QRMaskPattern.PATTERN001: return i$1 % 2 == 0;
case QRMaskPattern.PATTERN010: return j$1 % 3 == 0;
case QRMaskPattern.PATTERN011: return (i$1 + j$1) % 3 == 0;
case QRMaskPattern.PATTERN100: return (Math.floor(i$1 / 2) + Math.floor(j$1 / 3)) % 2 == 0;
case QRMaskPattern.PATTERN101: return i$1 * j$1 % 2 + i$1 * j$1 % 3 == 0;
case QRMaskPattern.PATTERN110: return (i$1 * j$1 % 2 + i$1 * j$1 % 3) % 2 == 0;
case QRMaskPattern.PATTERN111: return (i$1 * j$1 % 3 + (i$1 + j$1) % 2) % 2 == 0;
default: throw new Error("bad maskPattern:" + maskPattern);
}
},
getErrorCorrectPolynomial: function(errorCorrectLength) {
var a = new Polynomial$1([1], 0);
for (var i$1 = 0; i$1 < errorCorrectLength; i$1++) a = a.multiply(new Polynomial$1([1, math.gexp(i$1)], 0));
return a;
},
getLengthInBits: function(mode$2, type) {
if (1 <= type && type < 10) switch (mode$2) {
case Mode.MODE_NUMBER: return 10;
case Mode.MODE_ALPHA_NUM: return 9;
case Mode.MODE_8BIT_BYTE: return 8;
case Mode.MODE_KANJI: return 8;
default: throw new Error("mode:" + mode$2);
}
else if (type < 27) switch (mode$2) {
case Mode.MODE_NUMBER: return 12;
case Mode.MODE_ALPHA_NUM: return 11;
case Mode.MODE_8BIT_BYTE: return 16;
case Mode.MODE_KANJI: return 10;
default: throw new Error("mode:" + mode$2);
}
else if (type < 41) switch (mode$2) {
case Mode.MODE_NUMBER: return 14;
case Mode.MODE_ALPHA_NUM: return 13;
case Mode.MODE_8BIT_BYTE: return 16;
case Mode.MODE_KANJI: return 12;
default: throw new Error("mode:" + mode$2);
}
else throw new Error("type:" + type);
},
getLostPoint: function(qrCode) {
var moduleCount = qrCode.getModuleCount();
var lostPoint = 0;
for (var row$3 = 0; row$3 < moduleCount; row$3++) for (var col = 0; col < moduleCount; col++) {
var sameCount = 0;
var dark = qrCode.isDark(row$3, col);
for (var r = -1; r <= 1; r++) {
if (row$3 + r < 0 || moduleCount <= row$3 + r) continue;
for (var c$1 = -1; c$1 <= 1; c$1++) {
if (col + c$1 < 0 || moduleCount <= col + c$1) continue;
if (r == 0 && c$1 == 0) continue;
if (dark == qrCode.isDark(row$3 + r, col + c$1)) sameCount++;
}
}
if (sameCount > 5) lostPoint += 3 + sameCount - 5;
}
for (var row$3 = 0; row$3 < moduleCount - 1; row$3++) for (var col = 0; col < moduleCount - 1; col++) {
var count = 0;
if (qrCode.isDark(row$3, col)) count++;
if (qrCode.isDark(row$3 + 1, col)) count++;
if (qrCode.isDark(row$3, col + 1)) count++;
if (qrCode.isDark(row$3 + 1, col + 1)) count++;
if (count == 0 || count == 4) lostPoint += 3;
}
for (var row$3 = 0; row$3 < moduleCount; row$3++) for (var col = 0; col < moduleCount - 6; col++) if (qrCode.isDark(row$3, col) && !qrCode.isDark(row$3, col + 1) && qrCode.isDark(row$3, col + 2) && qrCode.isDark(row$3, col + 3) && qrCode.isDark(row$3, col + 4) && !qrCode.isDark(row$3, col + 5) && qrCode.isDark(row$3, col + 6)) lostPoint += 40;
for (var col = 0; col < moduleCount; col++) for (var row$3 = 0; row$3 < moduleCount - 6; row$3++) if (qrCode.isDark(row$3, col) && !qrCode.isDark(row$3 + 1, col) && qrCode.isDark(row$3 + 2, col) && qrCode.isDark(row$3 + 3, col) && qrCode.isDark(row$3 + 4, col) && !qrCode.isDark(row$3 + 5, col) && qrCode.isDark(row$3 + 6, col)) lostPoint += 40;
var darkCount = 0;
for (var col = 0; col < moduleCount; col++) for (var row$3 = 0; row$3 < moduleCount; row$3++) if (qrCode.isDark(row$3, col)) darkCount++;
var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
lostPoint += ratio * 10;
return lostPoint;
}
};
var util$1 = QRUtil;
var BitByte = _8BitByte;
var RSBlock = RSBlock$1;
var BitBuffer = BitBuffer$1;
var util = util$1;
var Polynomial = Polynomial$2;
function QRCode$1(typeNumber, errorCorrectLevel) {
this.typeNumber = typeNumber;
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null;
this.moduleCount = 0;
this.dataCache = null;
this.dataList = [];
}
var proto = QRCode$1.prototype;
proto.addData = function(data) {
var newData = new BitByte(data);
this.dataList.push(newData);
this.dataCache = null;
};
proto.isDark = function(row$3, col) {
if (row$3 < 0 || this.moduleCount <= row$3 || col < 0 || this.moduleCount <= col) throw new Error(row$3 + "," + col);
return this.modules[row$3][col];
};
proto.getModuleCount = function() {
return this.moduleCount;
};
proto.make = function() {
if (this.typeNumber < 1) {
var typeNumber = 1;
for (typeNumber = 1; typeNumber < 40; typeNumber++) {
var rsBlocks = RSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);
var buffer = new BitBuffer();
var totalDataCount = 0;
for (var i$1 = 0; i$1 < rsBlocks.length; i$1++) totalDataCount += rsBlocks[i$1].dataCount;
for (var i$1 = 0; i$1 < this.dataList.length; i$1++) {
var data = this.dataList[i$1];
buffer.put(data.mode, 4);
buffer.put(data.getLength(), util.getLengthInBits(data.mode, typeNumber));
data.write(buffer);
}
if (buffer.getLengthInBits() <= totalDataCount * 8) break;
}
this.typeNumber = typeNumber;
}
this.makeImpl(false, this.getBestMaskPattern());
};
proto.makeImpl = function(test, maskPattern) {
this.moduleCount = this.typeNumber * 4 + 17;
this.modules = new Array(this.moduleCount);
for (var row$3 = 0; row$3 < this.moduleCount; row$3++) {
this.modules[row$3] = new Array(this.moduleCount);
for (var col = 0; col < this.moduleCount; col++) this.modules[row$3][col] = null;
}
this.setupPositionProbePattern(0, 0);
this.setupPositionProbePattern(this.moduleCount - 7, 0);
this.setupPositionProbePattern(0, this.moduleCount - 7);
this.setupPositionAdjustPattern();
this.setupTimingPattern();
this.setupTypeInfo(test, maskPattern);
if (this.typeNumber >= 7) this.setupTypeNumber(test);
if (this.dataCache == null) this.dataCache = QRCode$1.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
this.mapData(this.dataCache, maskPattern);
};
proto.setupPositionProbePattern = function(row$3, col) {
for (var r = -1; r <= 7; r++) {
if (row$3 + r <= -1 || this.moduleCount <= row$3 + r) continue;
for (var c$1 = -1; c$1 <= 7; c$1++) {
if (col + c$1 <= -1 || this.moduleCount <= col + c$1) continue;
if (0 <= r && r <= 6 && (c$1 == 0 || c$1 == 6) || 0 <= c$1 && c$1 <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c$1 && c$1 <= 4) this.modules[row$3 + r][col + c$1] = true;
else this.modules[row$3 + r][col + c$1] = false;
}
}
};
proto.getBestMaskPattern = function() {
var minLostPoint = 0;
var pattern = 0;
for (var i$1 = 0; i$1 < 8; i$1++) {
this.makeImpl(true, i$1);
var lostPoint = util.getLostPoint(this);
if (i$1 == 0 || minLostPoint > lostPoint) {
minLostPoint = lostPoint;
pattern = i$1;
}
}
return pattern;
};
proto.createMovieClip = function(target_mc, instance_name, depth) {
var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
var cs = 1;
this.make();
for (var row$3 = 0; row$3 < this.modules.length; row$3++) {
var y = row$3 * cs;
for (var col = 0; col < this.modules[row$3].length; col++) {
var x = col * cs;
if (this.modules[row$3][col]) {
qr_mc.beginFill(0, 100);
qr_mc.moveTo(x, y);
qr_mc.lineTo(x + cs, y);
qr_mc.lineTo(x + cs, y + cs);
qr_mc.lineTo(x, y + cs);
qr_mc.endFill();
}
}
}
return qr_mc;
};
proto.setupTimingPattern = function() {
for (var r = 8; r < this.moduleCount - 8; r++) {
if (this.modules[r][6] != null) continue;
this.modules[r][6] = r % 2 == 0;
}
for (var c$1 = 8; c$1 < this.moduleCount - 8; c$1++) {
if (this.modules[6][c$1] != null) continue;
this.modules[6][c$1] = c$1 % 2 == 0;
}
};
proto.setupPositionAdjustPattern = function() {
var pos = util.getPatternPosition(this.typeNumber);
for (var i$1 = 0; i$1 < pos.length; i$1++) for (var j$1 = 0; j$1 < pos.length; j$1++) {
var row$3 = pos[i$1];
var col = pos[j$1];
if (this.modules[row$3][col] != null) continue;
for (var r = -2; r <= 2; r++) for (var c$1 = -2; c$1 <= 2; c$1++) if (r == -2 || r == 2 || c$1 == -2 || c$1 == 2 || r == 0 && c$1 == 0) this.modules[row$3 + r][col + c$1] = true;
else this.modules[row$3 + r][col + c$1] = false;
}
};
proto.setupTypeNumber = function(test) {
var bits = util.getBCHTypeNumber(this.typeNumber);
for (var i$1 = 0; i$1 < 18; i$1++) {
var mod = !test && (bits >> i$1 & 1) == 1;
this.modules[Math.floor(i$1 / 3)][i$1 % 3 + this.moduleCount - 8 - 3] = mod;
}
for (var i$1 = 0; i$1 < 18; i$1++) {
var mod = !test && (bits >> i$1 & 1) == 1;
this.modules[i$1 % 3 + this.moduleCount - 8 - 3][Math.floor(i$1 / 3)] = mod;
}
};
proto.setupTypeInfo = function(test, maskPattern) {
var data = this.errorCorrectLevel << 3 | maskPattern;
var bits = util.getBCHTypeInfo(data);
for (var i$1 = 0; i$1 < 15; i$1++) {
var mod = !test && (bits >> i$1 & 1) == 1;
if (i$1 < 6) this.modules[i$1][8] = mod;
else if (i$1 < 8) this.modules[i$1 + 1][8] = mod;
else this.modules[this.moduleCount - 15 + i$1][8] = mod;
}
for (var i$1 = 0; i$1 < 15; i$1++) {
var mod = !test && (bits >> i$1 & 1) == 1;
if (i$1 < 8) this.modules[8][this.moduleCount - i$1 - 1] = mod;
else if (i$1 < 9) this.modules[8][15 - i$1 - 1 + 1] = mod;
else this.modules[8][15 - i$1 - 1] = mod;
}
this.modules[this.moduleCount - 8][8] = !test;
};
proto.mapData = function(data, maskPattern) {
var inc = -1;
var row$3 = this.moduleCount - 1;
var bitIndex = 7;
var byteIndex = 0;
for (var col = this.moduleCount - 1; col > 0; col -= 2) {
if (col == 6) col--;
while (true) {
for (var c$1 = 0; c$1 < 2; c$1++) if (this.modules[row$3][col - c$1] == null) {
var dark = false;
if (byteIndex < data.length) dark = (data[byteIndex] >>> bitIndex & 1) == 1;
if (util.getMask(maskPattern, row$3, col - c$1)) dark = !dark;
this.modules[row$3][col - c$1] = dark;
bitIndex--;
if (bitIndex == -1) {
byteIndex++;
bitIndex = 7;
}
}
row$3 += inc;
if (row$3 < 0 || this.moduleCount <= row$3) {
row$3 -= inc;
inc = -inc;
break;
}
}
}
};
QRCode$1.PAD0 = 236;
QRCode$1.PAD1 = 17;
QRCode$1.createData = function(typeNumber, errorCorrectLevel, dataList) {
var rsBlocks = RSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
var buffer = new BitBuffer();
for (var i$1 = 0; i$1 < dataList.length; i$1++) {
var data = dataList[i$1];
buffer.put(data.mode, 4);
buffer.put(data.getLength(), util.getLengthInBits(data.mode, typeNumber));
data.write(buffer);
}
var totalDataCount = 0;
for (var i$1 = 0; i$1 < rsBlocks.length; i$1++) totalDataCount += rsBlocks[i$1].dataCount;
if (buffer.getLengthInBits() > totalDataCount * 8) throw new Error("code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")");
if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) buffer.put(0, 4);
while (buffer.getLengthInBits() % 8 != 0) buffer.putBit(false);
while (true) {
if (buffer.getLengthInBits() >= totalDataCount * 8) break;
buffer.put(QRCode$1.PAD0, 8);
if (buffer.getLengthInBits() >= totalDataCount * 8) break;
buffer.put(QRCode$1.PAD1, 8);
}
return QRCode$1.createBytes(buffer, rsBlocks);
};
QRCode$1.createBytes = function(buffer, rsBlocks) {
var offset = 0;
var maxDcCount = 0;
var maxEcCount = 0;
var dcdata = new Array(rsBlocks.length);
var ecdata = new Array(rsBlocks.length);
for (var r = 0; r < rsBlocks.length; r++) {
var dcCount = rsBlocks[r].dataCount;
var ecCount = rsBlocks[r].totalCount - dcCount;
maxDcCount = Math.max(maxDcCount, dcCount);
maxEcCount = Math.max(maxEcCount, ecCount);
dcdata[r] = new Array(dcCount);
for (var i$1 = 0; i$1 < dcdata[r].length; i$1++) dcdata[r][i$1] = 255 & buffer.buffer[i$1 + offset];
offset += dcCount;
var rsPoly = util.getErrorCorrectPolynomial(ecCount);
var modPoly = new Polynomial(dcdata[r], rsPoly.getLength() - 1).mod(rsPoly);
ecdata[r] = new Array(rsPoly.getLength() - 1);
for (var i$1 = 0; i$1 < ecdata[r].length; i$1++) {
var modIndex = i$1 + modPoly.getLength() - ecdata[r].length;
ecdata[r][i$1] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
}
}
var totalCodeCount = 0;
for (var i$1 = 0; i$1 < rsBlocks.length; i$1++) totalCodeCount += rsBlocks[i$1].totalCount;
var data = new Array(totalCodeCount);
var index = 0;
for (var i$1 = 0; i$1 < maxDcCount; i$1++) for (var r = 0; r < rsBlocks.length; r++) if (i$1 < dcdata[r].length) data[index++] = dcdata[r][i$1];
for (var i$1 = 0; i$1 < maxEcCount; i$1++) for (var r = 0; r < rsBlocks.length; r++) if (i$1 < ecdata[r].length) data[index++] = ecdata[r][i$1];
return data;
};
var QRCode_1 = QRCode$1;
var defaultErrorCorrectLevel = "H";
var SUPPORTS_PATH2D = (function() {
try {
new Path2D().addPath(new Path2D());
} catch (e) {
return false;
}
return true;
})();
function QRCode(data, level) {
var errorCorrectLevel = ErrorCorrectLevel[level];
var qrcode = new QRCode_1(-1, errorCorrectLevel);
qrcode.addData(toUTF8String(data));
qrcode.make();
return qrcode;
}
function validErrorCorrectLevel(level) {
return level in ErrorCorrectLevel;
}
function toUTF8String(str) {
var utf8Str = "";
for (var i$1 = 0; i$1 < str.length; i$1++) {
var charCode = str.charCodeAt(i$1);
if (charCode < 128) utf8Str += String.fromCharCode(charCode);
else if (charCode < 2048) {
utf8Str += String.fromCharCode(192 | charCode >> 6);
utf8Str += String.fromCharCode(128 | charCode & 63);
} else if (charCode < 55296 || charCode >= 57344) {
utf8Str += String.fromCharCode(224 | charCode >> 12);
utf8Str += String.fromCharCode(128 | charCode >> 6 & 63);
utf8Str += String.fromCharCode(128 | charCode & 63);
} else {
i$1++;
charCode = 65536 + ((charCode & 1023) << 10 | str.charCodeAt(i$1) & 1023);
utf8Str += String.fromCharCode(240 | charCode >> 18);
utf8Str += String.fromCharCode(128 | charCode >> 12 & 63);
utf8Str += String.fromCharCode(128 | charCode >> 6 & 63);
utf8Str += String.fromCharCode(128 | charCode & 63);
}
}
return utf8Str;
}
function generatePath(modules, margin) {
if (margin === void 0) margin = 0;
var ops$1 = [];
modules.forEach(function(row$3, y) {
var start = null;
row$3.forEach(function(cell, x) {
if (!cell && start !== null) {
ops$1.push("M".concat(start + margin, " ").concat(y + margin, "h").concat(x - start, "v1H").concat(start + margin, "z"));
start = null;
return;
}
if (x === row$3.length - 1) {
if (!cell) return;
if (start === null) ops$1.push("M".concat(x + margin, ",").concat(y + margin, " h1v1H").concat(x + margin, "z"));
else ops$1.push("M".concat(start + margin, ",").concat(y + margin, " h").concat(x + 1 - start, "v1H").concat(start + margin, "z"));
return;
}
if (cell && start === null) start = x;
});
});
return ops$1.join("");
}
var QRCodeProps = {
value: {
type: String,
required: true,
"default": ""
},
size: {
type: Number,
"default": 100
},
level: {
type: String,
"default": defaultErrorCorrectLevel,
validator: function(l) {
return validErrorCorrectLevel(l);
}
},
background: {
type: String,
"default": "#fff"
},
foreground: {
type: String,
"default": "#000"
},
margin: {
type: Number,
required: false,
"default": 0
}
};
var QRCodeVueProps = __assign(__assign({}, QRCodeProps), { renderAs: {
type: String,
required: false,
"default": "canvas",
validator: function(as) {
return ["canvas", "svg"].indexOf(as) > -1;
}
} });
var QRCodeSvg = defineComponent({
name: "QRCodeSvg",
props: QRCodeProps,
setup: function(props) {
var numCells = ref(0);
var fgPath = ref("");
var generate = function() {
var value = props.value, level = props.level, margin = props.margin;
var cells = QRCode(value, level).modules;
numCells.value = cells.length + margin * 2;
fgPath.value = generatePath(cells, margin);
};
generate();
onUpdated(generate);
return function() {
return h("svg", {
width: props.size,
height: props.size,
"shape-rendering": "crispEdges",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 ".concat(numCells.value, " ").concat(numCells.value)
}, [h("path", {
fill: props.background,
d: "M0,0 h".concat(numCells.value, "v").concat(numCells.value, "H0z")
}), h("path", {
fill: props.foreground,
d: fgPath.value
})]);
};
}
});
var QRCodeCanvas = defineComponent({
name: "QRCodeCanvas",
props: QRCodeProps,
setup: function(props) {
var canvasEl = ref(null);
var generate = function() {
var value = props.value, level = props.level, size = props.size, margin = props.margin, background = props.background, foreground = props.foreground;
var cells = QRCode(value, level).modules;
var numCells = cells.length + margin * 2;
var canvas = canvasEl.value;
if (!canvas) return;
var ctx = canvas.getContext("2d");
if (!ctx) return;
var devicePixelRatio = window.devicePixelRatio || 1;
var scale = size / numCells * devicePixelRatio;
canvas.height = canvas.width = size * devicePixelRatio;
ctx.scale(scale, scale);
ctx.fillStyle = background;
ctx.fillRect(0, 0, numCells, numCells);
ctx.fillStyle = foreground;
if (SUPPORTS_PATH2D) ctx.fill(new Path2D(generatePath(cells, margin)));
else cells.forEach(function(row$3, rdx) {
row$3.forEach(function(cell, cdx) {
if (cell) ctx.fillRect(cdx + margin, rdx + margin, 1, 1);
});
});
};
onMounted(generate);
onUpdated(generate);
return function() {
return h("canvas", {
ref: canvasEl,
style: {
width: "".concat(props.size, "px"),
height: "".concat(props.size, "px")
}
});
};
}
});
var QrcodeVue = defineComponent({
name: "Qrcode",
render: function() {
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground;
var size = _size >>> 0;
var margin = _margin >>> 0;
var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel;
return h(renderAs === "svg" ? QRCodeSvg : QRCodeCanvas, {
value,
size,
margin,
level,
background,
foreground
});
},
props: QRCodeVueProps
});
var _hoisted_1$20 = ["textContent"];
var _hoisted_2$8 = { key: 0 };
var _hoisted_3$5 = { key: 1 };
var MfaSetupModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "MfaSetupModal",
setup(__props) {
const MFA_SETUP_MODAL_KEY_NAME = ref(MFA_SETUP_MODAL_KEY);
const modalBus = ref(mfaEventBus);
const secret$1 = ref("");
const qrCode = ref("");
const readyToSubmit = ref(false);
const formBus = ref(mfaEventBus);
const showRecoveryCodes = ref(false);
const recoveryCodes = ref([]);
const recoveryCodesDownloaded = ref(false);
const authenticatorCode = ref("");
const infoTextErrorMessage = ref("");
const loadingQrCode = ref(true);
const clipboard = useClipboard();
const userStore = useUsersStore();
const settingsStore = useSettingsStore();
const i18n$2 = useI18n();
const toast = useToast();
const closeDialog = () => {
modalBus.value.emit("close");
};
const onInput = (value) => {
if (value.length !== 6) {
infoTextErrorMessage.value = "";
return;
}
userStore.verifyMfaCode({ mfaCode: value }).then(() => {
showRecoveryCodes.value = true;
authenticatorCode.value = value;
}).catch(() => {
infoTextErrorMessage.value = i18n$2.baseText("mfa.setup.invalidCode");
});
};
const onCopySecretToClipboard = () => {
clipboard.copy(secret$1.value);
toast.showToast({
title: i18n$2.baseText("mfa.setup.step1.toast.copyToClipboard.title"),
message: i18n$2.baseText("mfa.setup.step1.toast.copyToClipboard.message"),
type: "success"
});
};
const onSaveClick = () => {
formBus.value.emit("submit");
};
const onDownloadClick = () => {
const filename = "n8n-recovery-codes.txt";
const temporalElement = document.createElement("a");
temporalElement.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(recoveryCodes.value.join("\n")));
temporalElement.setAttribute("download", filename);
temporalElement.style.display = "none";
document.body.appendChild(temporalElement);
temporalElement.click();
document.body.removeChild(temporalElement);
recoveryCodesDownloaded.value = true;
};
const onSetupClick = async () => {
try {
await userStore.enableMfa({ mfaCode: authenticatorCode.value });
closeDialog();
toast.showMessage({
type: "success",
title: i18n$2.baseText("mfa.setup.step2.toast.setupFinished.message")
});
if (settingsStore.isMFAEnforced) {
await userStore.logout();
await router_default.push({ name: VIEWS.SIGNIN });
}
} catch (e) {
if (e.errorCode === 997) {
toast.showMessage({
type: "error",
title: i18n$2.baseText("mfa.setup.step2.toast.tokenExpired.error.message")
});
return;
}
toast.showMessage({
type: "error",
title: i18n$2.baseText("mfa.setup.step2.toast.setupFinished.error.message")
});
}
};
const getMfaQR = async () => {
try {
const response = await userStore.fetchMfaQR();
qrCode.value = response.qrCode;
secret$1.value = response.secret;
recoveryCodes.value = response.recoveryCodes;
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("settings.api.view.error"));
} finally {
loadingQrCode.value = false;
}
};
onMounted(async () => {
await getMfaQR();
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "460px",
height: "80%",
"max-height": "640px",
title: !showRecoveryCodes.value ? unref(i18n$2).baseText("mfa.setup.step1.title") : unref(i18n$2).baseText("mfa.setup.step2.title"),
"event-bus": modalBus.value,
name: MFA_SETUP_MODAL_KEY_NAME.value,
center: true,
loading: loadingQrCode.value
}, {
content: withCtx(() => [!showRecoveryCodes.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass([_ctx.$style.container, _ctx.$style.modalContent])
}, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.textContainer) }, [createVNode(unref(N8nText_default), {
size: "large",
color: "text-dark",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mfa.setup.step1.instruction1.title")), 1)]),
_: 1
})], 2),
createBaseVNode("div", null, [createVNode(unref(N8nText_default), {
size: "medium",
bold: false
}, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "mfa.setup.step1.instruction1.subtitle",
tag: "span",
scope: "global"
}, {
part1: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mfa.setup.step1.instruction1.subtitle.part1")), 1)]),
part2: withCtx(() => [createBaseVNode("a", {
class: normalizeClass(_ctx.$style.secret),
"data-test-id": "mfa-secret-button",
onClick: onCopySecretToClipboard
}, toDisplayString(unref(i18n$2).baseText("mfa.setup.step1.instruction1.subtitle.part2")), 3)]),
_: 1
})]),
_: 1
})]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.qrContainer) }, [createVNode(QrcodeVue, {
value: qrCode.value,
size: 150,
level: "H"
}, null, 8, ["value"])], 2),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.textContainer) }, [createVNode(unref(N8nText_default), {
size: "large",
color: "text-dark",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mfa.setup.step1.instruction2.title")), 1)]),
_: 1
})], 2),
createBaseVNode("div", { class: normalizeClass([_ctx.$style.form, infoTextErrorMessage.value ? _ctx.$style.error : ""]) }, [createVNode(unref(N8nInputLabel_default), {
size: "medium",
bold: false,
class: normalizeClass(_ctx.$style.labelTooltip),
label: unref(i18n$2).baseText("mfa.setup.step1.input.label")
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
modelValue: authenticatorCode.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => authenticatorCode.value = $event),
type: "text",
maxlength: 6,
placeholder: unref(i18n$2).baseText("mfa.code.input.placeholder"),
required: true,
"data-test-id": "mfa-token-input",
onInput
}, null, 8, ["modelValue", "placeholder"])]),
_: 1
}, 8, ["class", "label"]), createBaseVNode("div", { class: normalizeClass([_ctx.$style.infoText, "mt-4xs"]) }, [createBaseVNode("span", {
size: "small",
textContent: toDisplayString(infoTextErrorMessage.value)
}, null, 8, _hoisted_1$20)], 2)], 2)
], 2)) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.container)
}, [
createBaseVNode("div", null, [createVNode(unref(N8nText_default), {
size: "medium",
bold: false
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mfa.setup.step2.description")), 1)]),
_: 1
})]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.recoveryCodesContainer) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(recoveryCodes.value, (recoveryCode) => {
return openBlock(), createElementBlock("div", { key: recoveryCode }, [createVNode(unref(N8nText_default), { size: "medium" }, {
default: withCtx(() => [createTextVNode(toDisplayString(recoveryCode), 1)]),
_: 2
}, 1024)]);
}), 128))], 2),
createVNode(unref(N8nInfoTip_default), {
bold: false,
class: normalizeClass(_ctx.$style["edit-mode-footer-infotip"])
}, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "mfa.setup.step2.infobox.description",
tag: "span",
scope: "global"
}, {
part1: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mfa.setup.step2.infobox.description.part1")), 1)]),
part2: withCtx(() => [createVNode(unref(N8nText_default), {
size: "small",
bold: true,
class: normalizeClass(_ctx.$style.loseAccessText)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("mfa.setup.step2.infobox.description.part2")), 1)]),
_: 1
}, 8, ["class"])]),
_: 1
})]),
_: 1
}, 8, ["class"]),
createBaseVNode("div", null, [createVNode(unref(N8nButton_default), {
type: "primary",
icon: "hard-drive-download",
float: "right",
label: unref(i18n$2).baseText("mfa.setup.step2.button.download"),
"data-test-id": "mfa-recovery-codes-button",
onClick: onDownloadClick
}, null, 8, ["label"])])
], 2))]),
footer: withCtx(() => [showRecoveryCodes.value ? (openBlock(), createElementBlock("div", _hoisted_2$8, [createBaseVNode("div", null, [createVNode(unref(N8nButton_default), {
float: "right",
disabled: !recoveryCodesDownloaded.value,
label: unref(i18n$2).baseText("mfa.setup.step2.button.save"),
size: "large",
"data-test-id": "mfa-save-button",
onClick: onSetupClick
}, null, 8, ["disabled", "label"])])])) : (openBlock(), createElementBlock("div", _hoisted_3$5, [createBaseVNode("div", null, [createVNode(unref(N8nButton_default), {
float: "right",
label: unref(i18n$2).baseText("mfa.setup.step1.button.continue"),
size: "large",
disabled: !readyToSubmit.value,
onClick: onSaveClick
}, null, 8, ["label", "disabled"])])]))]),
_: 1
}, 8, [
"title",
"event-bus",
"name",
"loading"
]);
};
}
});
var MfaSetupModal_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_2czb0_123",
textContainer: "_textContainer_2czb0_137",
formContainer: "_formContainer_2czb0_143",
qrContainer: "_qrContainer_2czb0_147",
headerContainer: "_headerContainer_2czb0_154",
recoveryCodesContainer: "_recoveryCodesContainer_2czb0_158",
form: "_form_2czb0_143",
secret: "_secret_2czb0_192",
loseAccessText: "_loseAccessText_2czb0_197",
error: "_error_2czb0_201",
modalFooter: "_modalFooter_2czb0_210",
notice: "_notice_2czb0_216"
};
var MfaSetupModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(MfaSetupModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": MfaSetupModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$19 = { key: 0 };
var ModalRoot_default = /* @__PURE__ */ defineComponent({
__name: "ModalRoot",
props: {
name: {},
keepAlive: { type: Boolean }
},
setup(__props) {
const uiStore = useUIStore();
return (_ctx, _cache) => {
return unref(uiStore).modalsById[_ctx.name].open || _ctx.keepAlive ? (openBlock(), createElementBlock("div", _hoisted_1$19, [renderSlot(_ctx.$slots, "default", {
modalName: _ctx.name,
active: unref(uiStore).isModalActiveById[_ctx.name],
open: unref(uiStore).modalsById[_ctx.name].open,
activeId: unref(uiStore).modalsById[_ctx.name].activeId,
mode: unref(uiStore).modalsById[_ctx.name].mode,
data: unref(uiStore).modalsById[_ctx.name].data
})])) : createCommentVNode("", true);
};
}
});
var ModalDrawer_default = /* @__PURE__ */ defineComponent({
__name: "ModalDrawer",
props: {
name: {},
beforeClose: {},
eventBus: {},
direction: {},
modal: {
type: Boolean,
default: true
},
width: {},
wrapperClosable: {
type: Boolean,
default: true
},
closeOnClickModal: {
type: Boolean,
default: false
},
showClose: {
type: Boolean,
default: true
},
zIndex: {}
},
emits: ["enter"],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const uiStore = useUIStore();
const handleEnter = () => {
if (uiStore.isModalActiveById[props.name]) emit("enter");
};
const onWindowKeydown = (event) => {
if (!uiStore.isModalActiveById[props.name]) return;
if (event && event.keyCode === 13) handleEnter();
};
const close = async () => {
if (props.beforeClose) {
if (await props.beforeClose() === false) return;
}
uiStore.closeModal(props.name);
};
onMounted(() => {
window.addEventListener("keydown", onWindowKeydown);
props.eventBus?.on("close", close);
const activeElement = document.activeElement;
if (activeElement) activeElement.blur();
});
onBeforeUnmount(() => {
props.eventBus?.off("close", close);
window.removeEventListener("keydown", onWindowKeydown);
});
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(ElDrawer), {
direction: _ctx.direction,
"model-value": unref(uiStore).modalsById[_ctx.name]?.open ?? false,
size: _ctx.width,
"before-close": close,
modal: _ctx.modal,
"wrapper-closable": _ctx.wrapperClosable,
"close-on-click-modal": _ctx.closeOnClickModal,
"z-index": _ctx.zIndex,
"show-close": _ctx.showClose
}, {
header: withCtx(() => [renderSlot(_ctx.$slots, "header")]),
default: withCtx(() => [createBaseVNode("span", { onKeydown: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"])) }, [renderSlot(_ctx.$slots, "content")], 32)]),
_: 3
}, 8, [
"direction",
"model-value",
"size",
"modal",
"wrapper-closable",
"close-on-click-modal",
"z-index",
"show-close"
]);
};
}
});
var NpsSurvey_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "NpsSurvey",
props: { isActive: { type: Boolean } },
setup(__props) {
const props = __props;
const rootStore = useRootStore();
const i18n$2 = useI18n();
const toast = useToast();
const telemetry$1 = useTelemetry();
const { APP_Z_INDEXES } = useStyles();
const DEFAULT_TITLE = i18n$2.baseText("prompts.npsSurvey.recommendationQuestion");
const GREAT_FEEDBACK_TITLE = i18n$2.baseText("prompts.npsSurvey.greatFeedbackTitle");
const DEFAULT_FEEDBACK_TITLE = i18n$2.baseText("prompts.npsSurvey.defaultFeedbackTitle");
const FEEDBACK_QUESTION_TITLE = i18n$2.baseText("prompts.npsSurvey.feedbackQuestionTitle");
const VERY_LIKELY_OPTION = i18n$2.baseText("prompts.npsSurvey.veryLikely");
const NOT_LIKELY_OPTION = i18n$2.baseText("prompts.npsSurvey.notLikely");
const SEND = i18n$2.baseText("prompts.npsSurvey.send");
const form$4 = ref({
value: "",
feedback: ""
});
const showButtons = ref(true);
const showFeedback = ref(false);
const modalBus = createEventBus();
const modalTitle = computed(() => {
if (showFeedback.value) return FEEDBACK_QUESTION_TITLE;
if (form$4?.value?.value !== "") if (Number(form$4.value.value) > 7) return GREAT_FEEDBACK_TITLE;
else return DEFAULT_FEEDBACK_TITLE;
return DEFAULT_TITLE;
});
async function closeDialog() {
if (form$4.value.value === "") {
telemetry$1.track("User responded value survey score", {
instance_id: rootStore.instanceId,
nps: ""
});
await useNpsSurveyStore().ignoreNpsSurvey();
}
if (form$4.value.value !== "" && form$4.value.feedback.trim() === "") telemetry$1.track("User responded value survey feedback", {
instance_id: rootStore.instanceId,
feedback: "",
nps: form$4.value.value
});
}
async function selectSurveyValue(value) {
form$4.value.value = value;
showButtons.value = false;
showFeedback.value = true;
telemetry$1.track("User responded value survey score", {
instance_id: rootStore.instanceId,
nps: form$4.value.value
});
await useNpsSurveyStore().respondNpsSurvey();
}
function onFeedbackInput(value) {
form$4.value.feedback = value;
}
async function send() {
if (form$4.value.feedback.trim() !== "") {
telemetry$1.track("User responded value survey feedback", {
instance_id: rootStore.instanceId,
nps: form$4.value.value,
feedback: form$4.value.feedback
});
toast.showMessage({
title: i18n$2.baseText("prompts.npsSurvey.thanks"),
message: Number(form$4.value.value) >= 8 ? i18n$2.baseText("prompts.npsSurvey.reviewUs") : "",
type: "success",
duration: 15e3
});
setTimeout(() => {
form$4.value.value = "";
form$4.value.feedback = "";
showButtons.value = true;
showFeedback.value = false;
}, 1e3);
modalBus.emit("close");
}
}
watch(() => props.isActive, (isActive) => {
if (isActive) telemetry$1.track("User shown value survey", { instance_id: rootStore.instanceId });
});
return (_ctx, _cache) => {
return openBlock(), createBlock(ModalDrawer_default, {
name: unref(NPS_SURVEY_MODAL_KEY),
"event-bus": unref(modalBus),
"before-close": closeDialog,
modal: true,
"wrapper-closable": false,
direction: "btt",
width: "auto",
class: normalizeClass(["nps-survey", _ctx.$style.npsSurvey]),
"close-on-click-modal": false,
"z-index": unref(APP_Z_INDEXES).NPS_SURVEY_MODAL,
"data-test-id": "nps-survey-modal"
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.title) }, [createVNode(unref(N8nHeading_default), {
tag: "h2",
size: "medium",
color: "text-xlight"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(modalTitle.value), 1)]),
_: 1
})], 2)]),
content: withCtx(() => [createBaseVNode("section", { class: normalizeClass(_ctx.$style.content) }, [showButtons.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.wrapper)
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.buttons),
"data-test-id": "nps-survey-ratings"
}, [(openBlock(), createElementBlock(Fragment, null, renderList(11, (value) => {
return createBaseVNode("div", {
key: value - 1,
class: normalizeClass(_ctx.$style.container)
}, [createVNode(unref(N8nButton_default), {
type: "tertiary",
label: (value - 1).toString(),
square: "",
onClick: ($event) => selectSurveyValue((value - 1).toString())
}, null, 8, ["label", "onClick"])], 2);
}), 64))], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.text) }, [createVNode(unref(N8nText_default), {
size: "small",
color: "text-xlight"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(NOT_LIKELY_OPTION)), 1)]),
_: 1
}), createVNode(unref(N8nText_default), {
size: "small",
color: "text-xlight"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(VERY_LIKELY_OPTION)), 1)]),
_: 1
})], 2)], 2)) : showFeedback.value ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.feedback)
}, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.input),
"data-test-id": "nps-survey-feedback"
}, [createVNode(unref(N8nInput_default), {
modelValue: form$4.value.feedback,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => form$4.value.feedback = $event), onFeedbackInput],
type: "textarea",
rows: 2,
class: normalizeClass(_ctx.$style.feedbackInput)
}, null, 8, ["modelValue", "class"])], 2), createBaseVNode("div", {
class: normalizeClass(_ctx.$style.button),
"data-test-id": "nps-survey-feedback-button"
}, [createVNode(unref(N8nButton_default), {
label: unref(SEND),
float: "right",
disabled: !form$4.value.feedback.trim(),
onClick: send
}, null, 8, ["label", "disabled"])], 2)], 2)) : createCommentVNode("", true)], 2)]),
_: 1
}, 8, [
"name",
"event-bus",
"class",
"z-index"
]);
};
}
});
var NpsSurvey_vue_vue_type_style_index_0_lang_module_default = {
title: "_title_1xm9f_123",
content: "_content_1xm9f_137",
wrapper: "_wrapper_1xm9f_148",
text: "_text_1xm9f_152",
buttons: "_buttons_1xm9f_156",
container: "_container_1xm9f_160",
input: "_input_1xm9f_181",
button: "_button_1xm9f_156",
feedback: "_feedback_1xm9f_190",
feedbackInput: "_feedbackInput_1xm9f_198",
npsSurvey: "_npsSurvey_1xm9f_209"
};
var NpsSurvey_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NpsSurvey_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NpsSurvey_vue_vue_type_style_index_0_lang_module_default }]]);
var SURVEY_VERSION = "v4";
var PersonalizationModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "PersonalizationModal",
setup(__props) {
const externalHooks = useExternalHooks();
const modalBus = createEventBus();
const formBus = createFormEventBus();
const { showError } = useToast();
const i18n$2 = useI18n();
const rootStore = useRootStore();
const usersStore = useUsersStore();
const posthogStore = usePostHog();
const route = useRoute();
const router = useRouter();
const uiStore = useUIStore();
const formValues = ref({});
const isSaving = ref(false);
const userPermissions = computed(() => getResourcePermissions(usersStore.currentUser?.globalScopes));
const survey = computed(() => [
{
name: COMPANY_TYPE_KEY,
properties: {
label: i18n$2.baseText("personalizationModal.whatBestDescribesYourCompany"),
type: "select",
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
label: i18n$2.baseText("personalizationModal.saas"),
value: SAAS_COMPANY_TYPE
},
{
label: i18n$2.baseText("personalizationModal.eCommerce"),
value: ECOMMERCE_COMPANY_TYPE
},
{
label: i18n$2.baseText("personalizationModal.digitalAgencyOrConsultant"),
value: DIGITAL_AGENCY_COMPANY_TYPE
},
{
label: i18n$2.baseText("personalizationModal.systemsIntegrator"),
value: SYSTEMS_INTEGRATOR_COMPANY_TYPE
},
{
value: EDUCATION_TYPE,
label: i18n$2.baseText("personalizationModal.education")
},
{
label: i18n$2.baseText("personalizationModal.other"),
value: OTHER_COMPANY_TYPE
},
{
label: i18n$2.baseText("personalizationModal.imNotUsingN8nForWork"),
value: PERSONAL_COMPANY_TYPE
}
]
}
},
{
name: COMPANY_INDUSTRY_EXTENDED_KEY,
properties: {
type: "multi-select",
label: i18n$2.baseText("personalizationModal.whichIndustriesIsYourCompanyIn"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
value: FINANCE_INSURANCE_INDUSTRY,
label: i18n$2.baseText("personalizationModal.financeOrInsurance")
},
{
value: GOVERNMENT_INDUSTRY,
label: i18n$2.baseText("personalizationModal.government")
},
{
value: HEALTHCARE_INDUSTRY,
label: i18n$2.baseText("personalizationModal.healthcare")
},
{
value: IT_INDUSTRY,
label: i18n$2.baseText("personalizationModal.it")
},
{
value: LEGAL_INDUSTRY,
label: i18n$2.baseText("personalizationModal.legal")
},
{
value: "msp",
label: i18n$2.baseText("personalizationModal.managedServiceProvider")
},
{
value: MARKETING_INDUSTRY,
label: i18n$2.baseText("personalizationModal.marketing")
},
{
value: MEDIA_INDUSTRY,
label: i18n$2.baseText("personalizationModal.media")
},
{
value: MANUFACTURING_INDUSTRY,
label: i18n$2.baseText("personalizationModal.manufacturing")
},
{
value: PHYSICAL_RETAIL_OR_SERVICES,
label: i18n$2.baseText("personalizationModal.physicalRetailOrServices")
},
{
value: REAL_ESTATE_OR_CONSTRUCTION,
label: i18n$2.baseText("personalizationModal.realEstateOrConstruction")
},
{
value: SECURITY_INDUSTRY,
label: i18n$2.baseText("personalizationModal.security")
},
{
value: TELECOMS_INDUSTRY,
label: i18n$2.baseText("personalizationModal.telecoms")
},
{
value: OTHER_INDUSTRY_OPTION,
label: i18n$2.baseText("personalizationModal.otherPleaseSpecify")
}
]
},
shouldDisplay(values$2) {
return values$2[COMPANY_TYPE_KEY] === OTHER_COMPANY_TYPE;
}
},
{
name: OTHER_COMPANY_INDUSTRY_EXTENDED_KEY,
properties: { placeholder: i18n$2.baseText("personalizationModal.specifyYourCompanysIndustry") },
shouldDisplay(values$2) {
const companyType = values$2[COMPANY_TYPE_KEY];
const companyIndustry = values$2[COMPANY_INDUSTRY_EXTENDED_KEY];
return companyType === "other" && !!companyIndustry && companyIndustry.includes("other");
}
},
{
name: ROLE_KEY,
properties: {
type: "select",
label: i18n$2.baseText("personalizationModal.whichRoleBestDescribesYou"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
value: ROLE_BUSINESS_OWNER,
label: i18n$2.baseText("personalizationModal.businessOwner")
},
{
value: ROLE_CUSTOMER_SUPPORT,
label: i18n$2.baseText("personalizationModal.customerSupport")
},
{
value: ROLE_DATA_SCIENCE,
label: i18n$2.baseText("personalizationModal.dataScience")
},
{
value: ROLE_DEVOPS,
label: i18n$2.baseText("personalizationModal.devops")
},
{
value: "it",
label: i18n$2.baseText("personalizationModal.it")
},
{
value: ROLE_ENGINEERING,
label: i18n$2.baseText("personalizationModal.engineering")
},
{
value: ROLE_SALES_AND_MARKETING,
label: i18n$2.baseText("personalizationModal.salesAndMarketing")
},
{
value: ROLE_SECURITY,
label: i18n$2.baseText("personalizationModal.security")
},
{
value: ROLE_OTHER,
label: i18n$2.baseText("personalizationModal.otherPleaseSpecify")
}
]
},
shouldDisplay(values$2) {
return values$2[COMPANY_TYPE_KEY] !== PERSONAL_COMPANY_TYPE;
}
},
{
name: ROLE_OTHER_KEY,
properties: { placeholder: i18n$2.baseText("personalizationModal.specifyYourRole") },
shouldDisplay(values$2) {
const companyType = values$2[COMPANY_TYPE_KEY];
const role = values$2[ROLE_KEY];
return companyType !== "personal" && role === "other";
}
},
{
name: DEVOPS_AUTOMATION_GOAL_KEY,
properties: {
type: "multi-select",
label: i18n$2.baseText("personalizationModal.whatAreYouLookingToAutomate"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
value: DEVOPS_AUTOMATION_CI_CD_GOAL,
label: i18n$2.baseText("personalizationModal.cicd")
},
{
value: DEVOPS_AUTOMATION_CLOUD_INFRASTRUCTURE_ORCHESTRATION_GOAL,
label: i18n$2.baseText("personalizationModal.cloudInfrastructureOrchestration")
},
{
value: DEVOPS_AUTOMATION_DATA_SYNCING_GOAL,
label: i18n$2.baseText("personalizationModal.dataSynching")
},
{
value: DEVOPS_INCIDENT_RESPONSE_GOAL,
label: i18n$2.baseText("personalizationModal.incidentResponse")
},
{
value: DEVOPS_MONITORING_AND_ALERTING_GOAL,
label: i18n$2.baseText("personalizationModal.monitoringAndAlerting")
},
{
value: DEVOPS_REPORTING_GOAL,
label: i18n$2.baseText("personalizationModal.reporting")
},
{
value: DEVOPS_TICKETING_SYSTEMS_INTEGRATIONS_GOAL,
label: i18n$2.baseText("personalizationModal.ticketingSystemsIntegrations")
},
{
value: OTHER_AUTOMATION_GOAL,
label: i18n$2.baseText("personalizationModal.other")
}
]
},
shouldDisplay(values$2) {
const companyType = values$2[COMPANY_TYPE_KEY];
const role = values$2[ROLE_KEY];
return companyType !== "personal" && [
"devops",
"engineering",
"it"
].includes(role);
}
},
{
name: DEVOPS_AUTOMATION_GOAL_OTHER_KEY,
properties: { placeholder: i18n$2.baseText("personalizationModal.specifyYourAutomationGoal") },
shouldDisplay(values$2) {
const companyType = values$2[COMPANY_TYPE_KEY];
const goals = values$2[DEVOPS_AUTOMATION_GOAL_KEY];
const role = values$2[ROLE_KEY];
return companyType !== "personal" && [
"devops",
"engineering",
"it"
].includes(role) && !!goals && goals.includes("other");
}
},
{
name: MARKETING_AUTOMATION_GOAL_KEY,
properties: {
type: "multi-select",
label: i18n$2.baseText("personalizationModal.specifySalesMarketingGoal"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
label: i18n$2.baseText("personalizationModal.leadGeneration"),
value: MARKETING_AUTOMATION_LEAD_GENERATION_GOAL
},
{
label: i18n$2.baseText("personalizationModal.customerCommunication"),
value: MARKETING_AUTOMATION_CUSTOMER_COMMUNICATION
},
{
label: i18n$2.baseText("personalizationModal.customerActions"),
value: MARKETING_AUTOMATION_ACTIONS
},
{
label: i18n$2.baseText("personalizationModal.adCampaign"),
value: MARKETING_AUTOMATION_AD_CAMPAIGN
},
{
label: i18n$2.baseText("personalizationModal.reporting"),
value: MARKETING_AUTOMATION_REPORTING
},
{
label: i18n$2.baseText("personalizationModal.dataSynching"),
value: MARKETING_AUTOMATION_DATA_SYNCHING
},
{
label: i18n$2.baseText("personalizationModal.other"),
value: MARKETING_AUTOMATION_OTHER
}
]
},
shouldDisplay(values$2) {
const companyType = values$2[COMPANY_TYPE_KEY];
const role = values$2[ROLE_KEY];
return companyType !== "personal" && role === "sales-and-marketing";
}
},
{
name: OTHER_MARKETING_AUTOMATION_GOAL_KEY,
properties: { placeholder: i18n$2.baseText("personalizationModal.specifyOtherSalesAndMarketingGoal") },
shouldDisplay(values$2) {
const companyType = values$2[COMPANY_TYPE_KEY];
const goals = values$2[MARKETING_AUTOMATION_GOAL_KEY];
const role = values$2[ROLE_KEY];
return companyType !== "personal" && role === "sales-and-marketing" && !!goals && goals.includes("other");
}
},
{
name: AUTOMATION_BENEFICIARY_KEY,
properties: {
type: "select",
label: i18n$2.baseText("personalizationModal.specifyAutomationBeneficiary"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
label: i18n$2.baseText("personalizationModal.myself"),
value: AUTOMATION_BENEFICIARY_SELF
},
{
label: i18n$2.baseText("personalizationModal.myTeam"),
value: AUTOMATION_BENEFICIARY_MY_TEAM
},
{
label: i18n$2.baseText("personalizationModal.otherTeams"),
value: AUTOMATION_BENEFICIARY_OTHER_TEAMS
}
]
},
shouldDisplay(values$2) {
return values$2[COMPANY_TYPE_KEY] !== PERSONAL_COMPANY_TYPE;
}
},
{
name: COMPANY_SIZE_KEY,
properties: {
type: "select",
label: i18n$2.baseText("personalizationModal.howBigIsYourCompany"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
label: i18n$2.baseText("personalizationModal.lessThan20People"),
value: "<20"
},
{
label: `20-99 ${i18n$2.baseText("personalizationModal.people")}`,
value: COMPANY_SIZE_20_99
},
{
label: `100-499 ${i18n$2.baseText("personalizationModal.people")}`,
value: COMPANY_SIZE_100_499
},
{
label: `500-999 ${i18n$2.baseText("personalizationModal.people")}`,
value: COMPANY_SIZE_500_999
},
{
label: `1000+ ${i18n$2.baseText("personalizationModal.people")}`,
value: COMPANY_SIZE_1000_OR_MORE
},
{
label: i18n$2.baseText("personalizationModal.imNotUsingN8nForWork"),
value: COMPANY_SIZE_PERSONAL_USE
}
]
},
shouldDisplay(values$2) {
return values$2[COMPANY_TYPE_KEY] !== PERSONAL_COMPANY_TYPE;
}
},
{
name: REPORTED_SOURCE_KEY,
properties: {
type: "select",
label: i18n$2.baseText("personalizationModal.howDidYouHearAboutN8n"),
placeholder: i18n$2.baseText("personalizationModal.select"),
options: [
{
label: "Google",
value: REPORTED_SOURCE_GOOGLE
},
{
label: "Twitter",
value: REPORTED_SOURCE_TWITTER
},
{
label: "LinkedIn",
value: REPORTED_SOURCE_LINKEDIN
},
{
label: "YouTube",
value: REPORTED_SOURCE_YOUTUBE
},
{
label: "ChatGPT / LLM",
value: "llm"
},
{
label: i18n$2.baseText("personalizationModal.friendWordOfMouth"),
value: REPORTED_SOURCE_FRIEND
},
{
label: i18n$2.baseText("personalizationModal.podcast"),
value: REPORTED_SOURCE_PODCAST
},
{
label: i18n$2.baseText("personalizationModal.event"),
value: REPORTED_SOURCE_EVENT
},
{
label: i18n$2.baseText("personalizationModal.otherPleaseSpecify"),
value: REPORTED_SOURCE_OTHER
}
]
}
},
{
name: REPORTED_SOURCE_OTHER_KEY,
properties: { placeholder: i18n$2.baseText("personalizationModal.specifyReportedSource") },
shouldDisplay(values$2) {
return values$2[REPORTED_SOURCE_KEY] === REPORTED_SOURCE_OTHER;
}
}
]);
const onSave = () => {
formBus.emit("submit");
};
const closeCallback = () => {
if (route.name !== VIEWS.HOMEPAGE) router.replace({ name: VIEWS.HOMEPAGE });
};
const closeDialog = () => {
modalBus.emit("close");
if (userPermissions.value.community.register) uiStore.openModalWithData({
name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
data: {
closeCallback,
customHeading: void 0
}
});
else closeCallback();
};
const onSubmit = async (values$2) => {
isSaving.value = true;
try {
const completedSurvey = {
...values$2,
version: SURVEY_VERSION,
personalization_survey_submitted_at: (/* @__PURE__ */ new Date()).toISOString(),
personalization_survey_n8n_version: rootStore.versionCli
};
await externalHooks.run("personalizationModal.onSubmit", completedSurvey);
await usersStore.submitPersonalizationSurvey(completedSurvey);
posthogStore.setMetadata(completedSurvey, "user");
} catch (e) {
showError(e, "Error while submitting results");
} finally {
isSaving.value = false;
closeDialog();
}
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(PERSONALIZATION_MODAL_KEY),
title: unref(i18n$2).baseText("personalizationModal.customizeN8n"),
subtitle: unref(i18n$2).baseText("personalizationModal.theseQuestionsHelpUs"),
"center-title": true,
"show-close": false,
"event-bus": unref(modalBus),
"close-on-click-modal": false,
"close-on-press-escape": false,
width: "460px",
"data-test-id": "personalization-form",
onEnter: onSave
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [createVNode(unref(N8nFormInputs_default), {
modelValue: formValues.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => formValues.value = $event),
inputs: survey.value,
"column-view": true,
"event-bus": unref(formBus),
teleported: true,
"tag-size": "small",
onSubmit
}, null, 8, [
"modelValue",
"inputs",
"event-bus"
])], 2)]),
footer: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nButton_default), {
loading: isSaving.value,
label: unref(i18n$2).baseText("personalizationModal.getStarted"),
float: "right",
onClick: onSave
}, null, 8, ["loading", "label"])])]),
_: 1
}, 8, [
"name",
"title",
"subtitle",
"event-bus"
]);
};
}
});
var PersonalizationModal_vue_vue_type_style_index_0_lang_module_default = { container: "_container_5dyyd_123" };
var PersonalizationModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(PersonalizationModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": PersonalizationModal_vue_vue_type_style_index_0_lang_module_default }]]);
var PreBuiltAgentsModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "PreBuiltAgentsModal",
setup(__props) {
const i18n$2 = useI18n();
const modalBus = createEventBus();
const calloutHelpers = useCalloutHelpers();
const preBuiltAgents = computed(() => calloutHelpers.getPreBuiltAgentNodeCreatorItems());
function onSelected(actionCreateElement) {
if (actionCreateElement.type === "openTemplate") calloutHelpers.openSampleWorkflowTemplate(actionCreateElement.properties.templateId, { telemetry: { source: "modal" } });
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "500px",
"max-height": "85vh",
"event-bus": unref(modalBus),
name: unref(PRE_BUILT_AGENTS_MODAL_KEY),
center: true,
"show-close": true,
class: normalizeClass(_ctx.$style.modal)
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createVNode(unref(N8nHeading_default), { size: "xlarge" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.empty.preBuiltAgents")), 1)]),
_: 1
})], 2)]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [createVNode(ItemsRenderer_default, {
elements: preBuiltAgents.value,
class: normalizeClass(_ctx.$style.items),
onSelected
}, null, 8, ["elements", "class"])], 2)]),
_: 1
}, 8, [
"event-bus",
"name",
"class"
]);
};
}
});
var PreBuiltAgentsModal_vue_vue_type_style_index_0_lang_module_default = {
modal: "_modal_16w5w_123",
header: "_header_16w5w_128",
container: "_container_16w5w_135",
item: "_item_16w5w_141"
};
var PreBuiltAgentsModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(PreBuiltAgentsModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": PreBuiltAgentsModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$18 = { key: 0 };
var _hoisted_2$7 = { key: 1 };
var _hoisted_3$4 = { key: 2 };
var _hoisted_4$4 = {
key: 1,
class: "pt-s"
};
var _hoisted_5$3 = { href: "#" };
var ProjectMoveSuccessToastMessage_default = /* @__PURE__ */ defineComponent({
__name: "ProjectMoveSuccessToastMessage",
props: {
routeName: {},
resourceType: {},
targetProject: {},
isShareCredentialsChecked: { type: Boolean },
areAllUsedCredentialsShareable: { type: Boolean }
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const isWorkflow = computed(() => props.resourceType === ResourceType.Workflow);
const isTargetProjectTeam = computed(() => props.targetProject.type === ProjectTypes.Team);
const targetProjectName = computed(() => {
return getTruncatedProjectName(props.targetProject?.name);
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", null, [isWorkflow.value ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
tag: "p",
class: "pt-xs"
}, {
default: withCtx(() => [props.isShareCredentialsChecked && props.areAllUsedCredentialsShareable ? (openBlock(), createElementBlock("span", _hoisted_1$18, toDisplayString(unref(i18n$2).baseText("projects.move.resource.success.message.workflow.withAllCredentials")), 1)) : props.isShareCredentialsChecked ? (openBlock(), createElementBlock("span", _hoisted_2$7, toDisplayString(unref(i18n$2).baseText("projects.move.resource.success.message.workflow.withSomeCredentials")), 1)) : (openBlock(), createElementBlock("span", _hoisted_3$4, toDisplayString(unref(i18n$2).baseText("projects.move.resource.success.message.workflow")), 1))]),
_: 1
})) : createCommentVNode("", true), isTargetProjectTeam.value ? (openBlock(), createElementBlock("p", _hoisted_4$4, [createBaseVNode("a", _hoisted_5$3, toDisplayString(unref(i18n$2).baseText("projects.move.resource.success.link", { interpolate: { targetProjectName: targetProjectName.value } })), 1)])) : createCommentVNode("", true)]);
};
}
});
var _hoisted_1$17 = { key: 0 };
var ProjectMoveResourceModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ProjectMoveResourceModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const uiStore = useUIStore();
const toast = useToast();
const router = useRouter();
const projectsStore = useProjectsStore();
const workflowsStore = useWorkflowsStore();
const credentialsStore = useCredentialsStore();
const telemetry$1 = useTelemetry();
const filter = ref("");
const projectId = ref(null);
const shareUsedCredentials = ref(false);
const usedCredentials = ref([]);
const allCredentials = ref([]);
const loading$3 = ref(false);
const shareableCredentials = computed(() => allCredentials.value.filter((credential) => getResourcePermissions(credential.scopes).credential.share && usedCredentials.value.find((uc) => uc.id === credential.id)));
const unShareableCredentials = computed(() => usedCredentials.value.reduce((acc, uc) => {
const credential = credentialsStore.getCredentialById(uc.id);
const credentialPermissions = getResourcePermissions(credential?.scopes).credential;
if (!credentialPermissions.share) if (credentialPermissions.read) acc.push(credential);
else acc.push(uc);
return acc;
}, []));
const homeProjectName = computed(() => processProjectName(props.data.resource.homeProject?.name ?? "") ?? "");
const availableProjects = computed(() => sortByProperty("name", projectsStore.availableProjects.filter((p) => p.id !== props.data.resource.homeProject?.id && (!p.scopes || getResourcePermissions(p.scopes)[props.data.resourceType].create))));
const filteredProjects = computed(() => availableProjects.value.filter((p) => p.name?.toLowerCase().includes(filter.value.toLowerCase())));
const selectedProject = computed(() => availableProjects.value.find((p) => p.id === projectId.value));
const isResourceInTeamProject = computed(() => isHomeProjectTeam(props.data.resource));
const isResourceWorkflow = computed(() => props.data.resourceType === ResourceType.Workflow);
const targetProjectName = computed(() => {
return getTruncatedProjectName(selectedProject.value?.name);
});
const resourceName = computed(() => truncate(props.data.resource.name, 25));
const isHomeProjectTeam = (resource) => resource.homeProject?.type === ProjectTypes.Team;
const processProjectName = (projectName) => {
const { name: name$2, email } = splitName(projectName);
return name$2 ?? email;
};
const updateProject = (value) => {
projectId.value = value;
};
const closeModal = () => {
uiStore.closeModal(props.modalName);
};
const setFilter = (query) => {
filter.value = query;
};
const moveResource = async () => {
if (!selectedProject.value || loading$3.value) return;
loading$3.value = true;
try {
await projectsStore.moveResourceToProject(props.data.resourceType, props.data.resource.id, selectedProject.value.id, void 0, shareUsedCredentials.value ? shareableCredentials.value.map((c$1) => c$1.id) : void 0);
closeModal();
telemetry$1.track(`User successfully moved ${props.data.resourceType}`, {
[`${props.data.resourceType}_id`]: props.data.resource.id,
project_from_type: projectsStore.currentProject?.type ?? projectsStore.personalProject?.type
});
toast.showToast({
title: i18n$2.baseText("projects.move.resource.success.title", { interpolate: {
resourceTypeLabel: props.data.resourceTypeLabel,
resourceName: resourceName.value,
targetProjectName: targetProjectName.value
} }),
message: h(ProjectMoveSuccessToastMessage_default, {
routeName: isResourceWorkflow.value ? VIEWS.PROJECTS_WORKFLOWS : VIEWS.PROJECTS_CREDENTIALS,
resourceType: props.data.resourceType,
targetProject: selectedProject.value,
isShareCredentialsChecked: shareUsedCredentials.value,
areAllUsedCredentialsShareable: shareableCredentials.value.length === usedCredentials.value.length
}),
onClick: (event) => {
if (event?.target instanceof HTMLAnchorElement && selectedProject.value) {
event.preventDefault();
router.push({
name: isResourceWorkflow.value ? VIEWS.PROJECTS_WORKFLOWS : VIEWS.PROJECTS_CREDENTIALS,
params: { projectId: selectedProject.value.id }
});
}
},
type: "success",
duration: 8e3
});
if (props.data.eventBus) props.data.eventBus.emit("resource-moved", {
resourceId: props.data.resource.id,
resourceType: props.data.resourceType,
targetProjectId: selectedProject.value.id
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("projects.move.resource.error.title", { interpolate: {
resourceTypeLabel: props.data.resourceTypeLabel,
resourceName: resourceName.value
} }));
} finally {
loading$3.value = false;
}
};
onMounted(async () => {
telemetry$1.track(`User clicked to move a ${props.data.resourceType}`, {
[`${props.data.resourceType}_id`]: props.data.resource.id,
project_from_type: projectsStore.currentProject?.type ?? projectsStore.personalProject?.type
});
await projectsStore.getAvailableProjects();
if (isResourceWorkflow.value) {
const [workflow, credentials] = await Promise.all([workflowsStore.fetchWorkflow(props.data.resource.id), credentialsStore.fetchAllCredentials()]);
usedCredentials.value = workflow?.usedCredentials ?? [];
allCredentials.value = credentials ?? [];
}
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
name: props.modalName,
"data-test-id": "project-move-resource-modal"
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), {
tag: "h2",
size: "xlarge",
class: "mb-m pr-s"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.title", { interpolate: { resourceTypeLabel: props.data.resourceTypeLabel } })), 1)]),
_: 1
}), createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message",
scope: "global"
}, createSlots({
resourceName: withCtx(() => [createBaseVNode("strong", null, toDisplayString(resourceName.value), 1)]),
_: 2
}, [isResourceInTeamProject.value ? {
name: "inTeamProject",
fn: withCtx(() => [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.team",
scope: "global"
}, {
resourceHomeProjectName: withCtx(() => [createBaseVNode("strong", null, toDisplayString(homeProjectName.value), 1)]),
_: 1
})]),
key: "0"
} : {
name: "inPersonalProject",
fn: withCtx(() => [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.personal",
scope: "global"
}, {
resourceHomeProjectName: withCtx(() => [createBaseVNode("strong", null, toDisplayString(homeProjectName.value), 1)]),
_: 1
})]),
key: "1"
}]), 1024)]),
_: 1
})]),
content: withCtx(() => [availableProjects.value.length ? (openBlock(), createElementBlock("div", _hoisted_1$17, [createVNode(unref(N8nSelect_default), {
class: "mr-2xs mb-xs",
"model-value": projectId.value,
filterable: true,
"filter-method": setFilter,
placeholder: unref(i18n$2).baseText("projects.move.resource.modal.selectPlaceholder"),
"data-test-id": "project-move-resource-modal-select",
"onUpdate:modelValue": updateProject
}, {
prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(filteredProjects.value, (p) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: p.id,
value: p.id,
label: p.name ?? ""
}, null, 8, ["value", "label"]);
}), 128))]),
_: 1
}, 8, ["model-value", "placeholder"]), createVNode(unref(N8nText_default), null, {
default: withCtx(() => [
createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.sharingNote",
scope: "global"
}, {
note: withCtx(() => [createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.note")), 1)]),
resourceTypeLabel: withCtx(() => [createTextVNode(toDisplayString(props.data.resourceTypeLabel), 1)]),
_: 1
}),
props.data.resource.sharedWithProjects?.length ?? false ? (openBlock(), createElementBlock("span", {
key: 0,
class: normalizeClass(_ctx.$style.textBlock)
}, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.sharingInfo", {
adjustToNumber: props.data.resource.sharedWithProjects?.length,
interpolate: { count: props.data.resource.sharedWithProjects?.length ?? 0 }
})), 3)) : createCommentVNode("", true),
shareableCredentials.value.length ? (openBlock(), createBlock(unref(N8nCheckbox_default), {
key: 1,
modelValue: shareUsedCredentials.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => shareUsedCredentials.value = $event),
class: normalizeClass(_ctx.$style.textBlock),
"data-test-id": "project-move-resource-modal-checkbox-all"
}, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.usedCredentials",
scope: "global"
}, {
usedCredentials: withCtx(() => [createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createVNode(ProjectMoveResourceModalCredentialsList_default, {
"current-project-id": unref(projectsStore).currentProjectId,
credentials: shareableCredentials.value
}, null, 8, ["current-project-id", "credentials"])]),
default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.tooltipText) }, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.usedCredentials.number", {
adjustToNumber: shareableCredentials.value.length,
interpolate: { count: shareableCredentials.value.length }
})), 3)]),
_: 1
})]),
_: 1
})]),
_: 1
}, 8, ["modelValue", "class"])) : createCommentVNode("", true),
unShareableCredentials.value.length ? (openBlock(), createElementBlock("span", {
key: 2,
class: normalizeClass(_ctx.$style.textBlock)
}, [createVNode(unref(I18nT), {
keypath: "projects.move.resource.modal.message.unAccessibleCredentials.note",
scope: "global"
}, {
credentials: withCtx(() => [createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createVNode(ProjectMoveResourceModalCredentialsList_default, {
"current-project-id": unref(projectsStore).currentProjectId,
credentials: unShareableCredentials.value
}, null, 8, ["current-project-id", "credentials"])]),
default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.tooltipText) }, toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.unAccessibleCredentials")), 3)]),
_: 1
})]),
_: 1
})], 2)) : createCommentVNode("", true)
]),
_: 1
})])) : (openBlock(), createBlock(unref(N8nText_default), { key: 1 }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.message.noProjects", { interpolate: { resourceTypeLabel: props.data.resourceTypeLabel } })), 1)]),
_: 1
}))]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.buttons) }, [createVNode(unref(N8nButton_default), {
type: "secondary",
text: "",
class: "mr-2xs",
disabled: loading$3.value,
onClick: closeModal
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.cancel")), 1)]),
_: 1
}, 8, ["disabled"]), createVNode(unref(N8nButton_default), {
loading: loading$3.value,
disabled: !projectId.value || loading$3.value,
type: "primary",
"data-test-id": "project-move-resource-modal-button",
onClick: moveResource
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("projects.move.resource.modal.button", { interpolate: { resourceTypeLabel: props.data.resourceTypeLabel } })), 1)]),
_: 1
}, 8, ["loading", "disabled"])], 2)]),
_: 1
}, 8, ["name"]);
};
}
});
var ProjectMoveResourceModal_vue_vue_type_style_index_0_lang_module_default = {
buttons: "_buttons_83yr9_123",
textBlock: "_textBlock_83yr9_128",
tooltipText: "_tooltipText_83yr9_133"
};
var ProjectMoveResourceModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectMoveResourceModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectMoveResourceModal_vue_vue_type_style_index_0_lang_module_default }]]);
var import_unset = /* @__PURE__ */ __toESM(require_unset());
var import_set = /* @__PURE__ */ __toESM(require_set());
function destinationToFakeINodeUi(destination, fakeType = "n8n-nodes-base.stickyNote") {
return {
id: destination.id,
name: destination.id,
typeVersion: 1,
type: fakeType,
position: [0, 0],
credentials: { ...destination.credentials },
parameters: { ...destination }
};
}
var EventSelection_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "EventSelection",
props: {
destinationId: { default: "defaultDestinationId" },
readonly: {
type: Boolean,
default: false
}
},
emits: ["input", "change"],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const i18n$2 = useI18n();
const logStreamingStore = useLogStreamingStore();
const anonymizeAuditMessages = computed(() => logStreamingStore.items[props.destinationId]?.destination.anonymizeAuditMessages);
function onInput() {
emit("input");
}
function onCheckboxChecked(eventName, checked) {
logStreamingStore.setSelectedInGroup(props.destinationId, eventName, Boolean(checked));
}
function anonymizeAuditMessagesChanged(value) {
logStreamingStore.items[props.destinationId].destination.anonymizeAuditMessages = Boolean(value);
emit("change", {
name: "anonymizeAuditMessages",
node: props.destinationId,
value
});
}
function groupLabelName(t) {
return i18n$2.baseText(`settings.log-streaming.eventGroup.${t}`) ?? t;
}
function groupLabelInfo(t) {
const labelInfo = `settings.log-streaming.eventGroup.${t}.info`;
const infoText = i18n$2.baseText(labelInfo);
if (infoText === labelInfo || infoText === "") return;
return infoText;
}
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(logStreamingStore).items[_ctx.destinationId]?.eventGroups, (group) => {
return openBlock(), createElementBlock("div", {
key: group.name,
shadow: "never"
}, [
createVNode(unref(ElCheckbox), {
"model-value": group.selected,
indeterminate: group.indeterminate,
disabled: _ctx.readonly,
"onUpdate:modelValue": onInput,
onChange: ($event) => onCheckboxChecked(group.name, $event)
}, {
default: withCtx(() => [createBaseVNode("strong", null, toDisplayString(groupLabelName(group.name)), 1), groupLabelInfo(group.name) !== void 0 ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 0,
placement: "top",
"popper-class": _ctx.$style.tooltipPopper,
class: "ml-xs"
}, {
content: withCtx(() => [createTextVNode(toDisplayString(groupLabelInfo(group.name)), 1)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), {
icon: "circle-help",
size: "small",
class: "ml-4xs"
})]),
_: 2
}, 1032, ["popper-class"])) : createCommentVNode("", true)]),
_: 2
}, 1032, [
"model-value",
"indeterminate",
"disabled",
"onChange"
]),
group.name === "n8n.audit" ? (openBlock(), createBlock(unref(ElCheckbox), {
key: 0,
"model-value": anonymizeAuditMessages.value,
disabled: _ctx.readonly,
"onUpdate:modelValue": onInput,
onChange: anonymizeAuditMessagesChanged
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.log-streaming.tab.events.anonymize")) + " ", 1), createVNode(unref(N8nTooltip_default), {
placement: "top",
"popper-class": _ctx.$style.tooltipPopper
}, {
content: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.log-streaming.tab.events.anonymize.info")), 1)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), {
icon: "circle-help",
size: "small",
class: "ml-4xs"
})]),
_: 1
}, 8, ["popper-class"])]),
_: 1
}, 8, ["model-value", "disabled"])) : createCommentVNode("", true),
createBaseVNode("ul", { class: normalizeClass(_ctx.$style.eventList) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(group.children, (event) => {
return openBlock(), createElementBlock("li", {
key: event.name,
class: normalizeClass(`${_ctx.$style.eventListItem}`)
}, [createVNode(unref(ElCheckbox), {
"model-value": event.selected || group.selected,
indeterminate: event.indeterminate,
disabled: _ctx.readonly,
"onUpdate:modelValue": onInput,
onChange: ($event) => onCheckboxChecked(event.name, $event)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(event.label) + " ", 1), createVNode(unref(N8nTooltip_default), {
placement: "top",
"popper-class": _ctx.$style.tooltipPopper
}, {
content: withCtx(() => [createTextVNode(toDisplayString(event.name), 1)]),
_: 2
}, 1032, ["popper-class"])]),
_: 2
}, 1032, [
"model-value",
"indeterminate",
"disabled",
"onChange"
])], 2);
}), 128))], 2)
]);
}), 128))]);
};
}
});
var EventSelection_vue_vue_type_style_index_0_lang_module_default = {
eventListCard: "_eventListCard_17kwo_123",
eventList: "_eventList_17kwo_123",
eventListItem: "_eventListItem_17kwo_135",
eventListItemDisabled: "_eventListItemDisabled_17kwo_143",
listItem: "_listItem_17kwo_150"
};
var EventSelection_default = /* @__PURE__ */ __plugin_vue_export_helper_default(EventSelection_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": EventSelection_vue_vue_type_style_index_0_lang_module_default }]]);
const circuitBreakerOptions = {
displayName: "Circuit Breaker Options",
name: "circuitBreaker",
type: "collection",
placeholder: "Add Circuit Breaker Option",
description: "A circuit breaker protects services from cascading failures by monitoring request failures and temporarily blocking requests when failure rates are high. This gives failing services time to recover without being overwhelmed by traffic.",
default: {},
options: [{
displayName: "Max Failures",
name: "maxFailures",
type: "number",
typeOptions: { minValue: 1 },
default: 5,
description: "After this many errors within the failure window n8n stops sending requests to prevent overloading the external service that’s not working properly."
}, {
displayName: "Failure Window",
name: "failureWindow",
type: "number",
typeOptions: { minValue: 100 },
default: LOGSTREAMING_CB_DEFAULT_FAILURE_WINDOW_MS,
description: "Time window in milliseconds for counting failures (sliding window). Only failures within this window are counted toward the threshold. Older failures expire naturally."
}]
};
const webhookModalDescription = [
{
displayName: "Method",
name: "method",
noDataExpression: true,
type: "options",
options: [
{
name: "GET",
value: "GET"
},
{
name: "POST",
value: "POST"
},
{
name: "PUT",
value: "PUT"
}
],
default: "POST",
description: "The request method to use"
},
{
displayName: "URL",
name: "url",
type: "string",
noDataExpression: true,
default: "",
placeholder: "http://example.com/index.html",
description: "The URL to make the request to"
},
{
displayName: "Generic Auth Type (OAuth not supported yet)",
name: "genericAuthType",
type: "credentialsSelect",
default: "",
credentialTypes: ["has:genericAuth"],
displayOptions: { show: { authentication: ["genericCredentialType"] } }
},
{
displayName: "Add Query Parameters",
name: "sendQuery",
type: "boolean",
default: false,
noDataExpression: true,
description: "Whether the request has query params or not"
},
{
displayName: "Specify Query Parameters",
name: "specifyQuery",
type: "options",
displayOptions: { show: { sendQuery: [true] } },
options: [{
name: "Using Fields Below",
value: "keypair"
}, {
name: "Using JSON",
value: "json"
}],
default: "keypair"
},
{
displayName: "Add Query Parameters",
name: "queryParameters",
type: "fixedCollection",
displayOptions: { show: {
sendQuery: [true],
specifyQuery: ["keypair"]
} },
typeOptions: { multipleValues: true },
placeholder: "Add Parameter",
default: { parameters: [{
name: "",
value: ""
}] },
options: [{
name: "parameters",
displayName: "Parameter",
values: [{
displayName: "Name",
name: "name",
type: "string",
default: ""
}, {
displayName: "Value",
name: "value",
type: "string",
default: ""
}]
}]
},
{
displayName: "JSON",
name: "jsonQuery",
type: "json",
displayOptions: { show: {
sendQuery: [true],
specifyQuery: ["json"]
} },
default: ""
},
{
displayName: "Add Headers",
name: "sendHeaders",
type: "boolean",
default: false,
noDataExpression: true,
description: "Whether the request has headers or not"
},
{
displayName: "Specify Headers",
name: "specifyHeaders",
type: "options",
displayOptions: { show: { sendHeaders: [true] } },
options: [{
name: "Using Fields Below",
value: "keypair"
}, {
name: "Using JSON",
value: "json"
}],
default: "keypair"
},
{
displayName: "Header Parameters",
name: "headerParameters",
type: "fixedCollection",
displayOptions: { show: {
sendHeaders: [true],
specifyHeaders: ["keypair"]
} },
typeOptions: { multipleValues: true },
placeholder: "Add Parameter",
default: { parameters: [{
name: "",
value: ""
}] },
options: [{
name: "parameters",
displayName: "Parameter",
values: [{
displayName: "Name",
name: "name",
type: "string",
default: ""
}, {
displayName: "Value",
name: "value",
type: "string",
default: ""
}]
}]
},
{
displayName: "JSON",
name: "jsonHeaders",
type: "json",
displayOptions: { show: {
sendHeaders: [true],
specifyHeaders: ["json"]
} },
default: ""
},
{
displayName: "Options",
name: "options",
type: "collection",
placeholder: "Add Option",
default: {},
options: [
{
displayName: "Ignore SSL Issues (Insecure)",
name: "allowUnauthorizedCerts",
type: "boolean",
noDataExpression: true,
default: false,
description: "Whether to ignore SSL certificate validation"
},
{
displayName: "Array Format in Query Parameters",
name: "queryParameterArrays",
type: "options",
displayOptions: { show: { "/sendQuery": [true] } },
options: [
{
name: "No Brackets",
value: "repeat",
description: "e.g. foo=bar&foo=qux"
},
{
name: "Brackets Only",
value: "brackets",
description: "e.g. foo[]=bar&foo[]=qux"
},
{
name: "Brackets with Indices",
value: "indices",
description: "e.g. foo[0]=bar&foo[1]=qux"
}
],
default: "brackets"
},
{
displayName: "Redirects",
name: "redirect",
placeholder: "Add Redirect",
type: "fixedCollection",
typeOptions: { multipleValues: false },
default: { redirect: {} },
options: [{
displayName: "Redirect",
name: "redirect",
values: [{
displayName: "Follow Redirects",
name: "followRedirects",
type: "boolean",
default: false,
noDataExpression: true,
description: "Whether to follow all redirects"
}, {
displayName: "Max Redirects",
name: "maxRedirects",
type: "number",
displayOptions: { show: { followRedirects: [true] } },
default: 21,
description: "Max number of redirects to follow"
}]
}]
},
{
displayName: "Proxy",
name: "proxy",
description: "Add Proxy",
type: "fixedCollection",
typeOptions: { multipleValues: false },
default: { proxy: {} },
options: [{
displayName: "Proxy",
name: "proxy",
values: [
{
displayName: "Protocol",
name: "protocol",
type: "options",
default: "https",
options: [{
name: "HTTPS",
value: "https"
}, {
name: "HTTP",
value: "http"
}]
},
{
displayName: "Host",
name: "host",
type: "string",
default: "127.0.0.1",
description: "Proxy Host (without protocol or port)"
},
{
displayName: "Port",
name: "port",
type: "number",
default: 9e3,
description: "Proxy Port"
}
]
}]
},
{
displayName: "Timeout",
name: "timeout",
type: "number",
typeOptions: { minValue: 1 },
default: 5e3,
description: "Time in ms to wait for the server to send response headers (and start the response body) before aborting the request"
},
{
displayName: "Socket",
name: "socket",
description: "Socket options",
type: "collection",
typeOptions: { multipleValues: false },
default: {
keepAlive: true,
maxSockets: 50,
maxFreeSockets: 5
},
options: [
{
displayName: "Keep Alive",
name: "keepAlive",
type: "boolean",
default: true,
noDataExpression: true,
description: "Whether to keep the sockets available."
},
{
displayName: "Max Sockets",
name: "maxSockets",
type: "number",
typeOptions: { minValue: 1 },
default: 50,
description: "Maximum number of sockets per host to keep open at any given time."
},
{
displayName: "Max Free Sockets",
name: "maxFreeSockets",
type: "number",
typeOptions: { minValue: 1 },
default: 5,
description: "Maximum number of sockets per host to leave open in a free state."
}
]
}
]
},
circuitBreakerOptions
];
const syslogModalDescription = [
{
displayName: "Host",
name: "host",
type: "string",
default: "127.0.0.1",
placeholder: "127.0.0.1",
description: "The IP or host name to make the request to",
noDataExpression: true
},
{
displayName: "Port",
name: "port",
type: "number",
default: "514",
placeholder: "514",
description: "The port number to make the request to",
noDataExpression: true
},
{
displayName: "Protocol",
name: "protocol",
type: "options",
options: [{
name: "TCP",
value: "tcp"
}, {
name: "UDP",
value: "udp"
}],
default: "udp",
description: "The protocol to use for the connection"
},
{
displayName: "Facility",
name: "facility",
type: "options",
options: [
{
name: "Kernel",
value: 0
},
{
name: "User",
value: 1
},
{
name: "System",
value: 3
},
{
name: "Audit",
value: 13
},
{
name: "Alert",
value: 14
},
{
name: "Local0",
value: 16
},
{
name: "Local1",
value: 17
},
{
name: "Local2",
value: 18
},
{
name: "Local3",
value: 19
},
{
name: "Local4",
value: 20
},
{
name: "Local5",
value: 21
},
{
name: "Local6",
value: 22
},
{
name: "Local7",
value: 23
}
],
default: "16",
description: "Syslog facility parameter"
},
{
displayName: "App Name",
name: "app_name",
type: "string",
default: "n8n",
placeholder: "n8n",
noDataExpression: true,
description: "Syslog app name parameter"
},
circuitBreakerOptions
];
const sentryModalDescription = [{
displayName: "DSN",
name: "dsn",
type: "string",
default: "https://",
noDataExpression: true,
description: "Your Sentry DSN Client Key"
}, circuitBreakerOptions];
var import_get = /* @__PURE__ */ __toESM(require_get());
var _hoisted_1$16 = { class: "mt-m text-right" };
var _hoisted_2$6 = { class: "" };
var EventDestinationSettingsModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
name: "EventDestinationSettingsModal",
__name: "EventDestinationSettingsModal",
props: {
modalName: {},
destination: { default: () => deepCopy(defaultMessageEventBusDestinationOptions) },
isNew: {
type: Boolean,
default: false
},
eventBus: {}
},
setup(__props) {
const { modalName, destination, isNew, eventBus } = __props;
const i18n$2 = useI18n();
const { confirm } = useMessage();
const telemetry$1 = useTelemetry();
const logStreamingStore = useLogStreamingStore();
const ndvStore = useNDVStore();
const workflowsStore = useWorkflowsStore();
const workflowState = injectWorkflowState();
const uiStore = useUIStore();
const unchanged = ref(!isNew);
const activeTab = ref("settings");
const hasOnceBeenSaved = ref(!isNew);
const isSaving = ref(false);
const isDeleting = ref(false);
const loading$3 = ref(false);
const typeSelectValue = ref("");
const typeSelectPlaceholder = ref("Destination Type");
const nodeParameters = ref(deepCopy(defaultMessageEventBusDestinationOptions));
const webhookDescription = ref(webhookModalDescription);
const sentryDescription = ref(sentryModalDescription);
const syslogDescription = ref(syslogModalDescription);
const modalBus = ref(createEventBus());
const headerLabel = ref(destination.label);
const testMessageSent = ref(false);
const testMessageResult = ref(false);
const typeSelectOptions = computed(() => {
const options = [];
for (const t of messageEventBusDestinationTypeNames) {
if (t === MessageEventBusDestinationTypeNames.abstract) continue;
options.push({
value: t,
label: `settings.log-streaming.${t}`
});
}
return options;
});
const isTypeAbstract = computed(() => nodeParameters.value.__type === MessageEventBusDestinationTypeNames.abstract);
const isTypeWebhook = computed(() => nodeParameters.value.__type === MessageEventBusDestinationTypeNames.webhook);
const isTypeSyslog = computed(() => nodeParameters.value.__type === MessageEventBusDestinationTypeNames.syslog);
const isTypeSentry = computed(() => nodeParameters.value.__type === MessageEventBusDestinationTypeNames.sentry);
const node = computed(() => destinationToFakeINodeUi(nodeParameters.value));
const typeLabelName = computed(() => `settings.log-streaming.${nodeParameters.value.__type}`);
const sidebarItems = computed(() => {
const items = [{
id: "settings",
label: i18n$2.baseText("settings.log-streaming.tab.settings"),
position: "top"
}];
if (!isTypeAbstract.value) items.push({
id: "events",
label: i18n$2.baseText("settings.log-streaming.tab.events"),
position: "top"
});
return items;
});
const canManageLogStreaming = computed(() => hasPermission(["rbac"], { rbac: { scope: "logStreaming:manage" } }));
function onUpdateNodeProperties(event) {
const updateInformation = event[1];
if (updateInformation.name === destination.id) {
if ("credentials" in updateInformation.properties) {
unchanged.value = false;
nodeParameters.value.credentials = updateInformation.properties.credentials;
}
}
}
onMounted(() => {
setupNode(Object.assign(deepCopy(defaultMessageEventBusDestinationOptions), destination));
workflowStateEventBus.on("updateNodeProperties", onUpdateNodeProperties);
});
onUnmounted(() => workflowStateEventBus.off("updateNodeProperties", onUpdateNodeProperties));
function onInput() {
unchanged.value = false;
testMessageSent.value = false;
}
function onTabSelect(tab$3) {
activeTab.value = tab$3;
}
function onLabelChange(value) {
onInput();
headerLabel.value = value;
nodeParameters.value.label = value;
}
function setupNode(options) {
workflowsStore.removeNode(node.value);
ndvStore.setActiveNodeName(options.id ?? "thisshouldnothappen", "other");
workflowsStore.addNode(destinationToFakeINodeUi(options));
nodeParameters.value = options;
logStreamingStore.items[destination.id].destination = options;
}
function onTypeSelectInput(destinationType) {
typeSelectValue.value = destinationType;
}
async function onContinueAddClicked() {
let newDestination;
switch (typeSelectValue.value) {
case MessageEventBusDestinationTypeNames.syslog:
newDestination = Object.assign(deepCopy(defaultMessageEventBusDestinationSyslogOptions), { id: destination.id });
break;
case MessageEventBusDestinationTypeNames.sentry:
newDestination = Object.assign(deepCopy(defaultMessageEventBusDestinationSentryOptions), { id: destination.id });
break;
case MessageEventBusDestinationTypeNames.webhook:
newDestination = Object.assign(deepCopy(defaultMessageEventBusDestinationWebhookOptions), { id: destination.id });
break;
}
if (newDestination) {
headerLabel.value = newDestination?.label ?? headerLabel.value;
setupNode(newDestination);
}
}
function valueChanged(parameterData) {
unchanged.value = false;
testMessageSent.value = false;
const newValue = parameterData.value;
const parameterPath = parameterData.name?.startsWith("parameters.") ? parameterData.name.split(".").slice(1).join(".") : parameterData.name || "";
const nodeParametersCopy = deepCopy(nodeParameters.value);
if (parameterData.value === void 0 && parameterPath.match(/(.*)\[(\d+)\]$/)) {
const path = parameterPath.match(/(.*)\[(\d+)\]$/)?.[1];
const index = parseInt(parameterPath.match(/(.*)\[(\d+)\]$/)?.[2] ?? "0", 10);
const data = (0, import_get.default)(nodeParametersCopy, path);
if (Array.isArray(data)) {
data.splice(index, 1);
nodeParametersCopy[path] = data;
}
} else if (newValue === void 0) (0, import_unset.default)(nodeParametersCopy, parameterPath);
else (0, import_set.default)(nodeParametersCopy, parameterPath, newValue);
nodeParameters.value = deepCopy(nodeParametersCopy);
workflowState.updateNodeProperties({
name: node.value.name,
properties: {
parameters: nodeParameters.value,
position: [0, 0]
}
});
if (hasOnceBeenSaved.value) logStreamingStore.updateDestination(nodeParameters.value);
}
async function sendTestEvent() {
testMessageResult.value = await logStreamingStore.sendTestMessage(nodeParameters.value);
testMessageSent.value = true;
}
async function removeThis() {
if (await confirm(i18n$2.baseText("settings.log-streaming.destinationDelete.message", { interpolate: { destinationName: destination.label } }), i18n$2.baseText("settings.log-streaming.destinationDelete.headline"), {
type: "warning",
confirmButtonText: i18n$2.baseText("settings.log-streaming.destinationDelete.confirmButtonText"),
cancelButtonText: i18n$2.baseText("settings.log-streaming.destinationDelete.cancelButtonText")
}) !== "confirm") return;
else {
callEventBus("remove", destination.id);
uiStore.closeModal(LOG_STREAM_MODAL_KEY);
uiStore.stateIsDirty = false;
}
}
function onModalClose() {
if (!hasOnceBeenSaved.value) {
workflowsStore.removeNode(node.value);
if (nodeParameters.value.id && typeof nodeParameters.value.id !== "object") logStreamingStore.removeDestination(nodeParameters.value.id.toString());
}
ndvStore.unsetActiveNodeName();
callEventBus("closing", destination.id);
uiStore.stateIsDirty = false;
}
async function saveDestination() {
if (unchanged.value || !destination.id) return;
if (await logStreamingStore.saveDestination(nodeParameters.value)) {
hasOnceBeenSaved.value = true;
testMessageSent.value = false;
unchanged.value = true;
callEventBus("destinationWasSaved", destination.id);
uiStore.stateIsDirty = false;
const destinationType = (nodeParameters.value.__type && typeof nodeParameters.value.__type !== "object" ? `${nodeParameters.value.__type}` : "unknown").replace("$MessageEventBusDestination", "").toLowerCase();
const isComplete = () => {
if (isTypeWebhook.value) return destination.url !== "";
else if (isTypeSentry.value) return destination.dsn !== "";
else if (isTypeSyslog.value) {
const syslogDestination = destination;
return syslogDestination.host !== "" && syslogDestination.port !== void 0 && syslogDestination.protocol !== "" && syslogDestination.facility !== void 0 && syslogDestination.app_name !== "";
}
return false;
};
telemetry$1.track("User updated log streaming destination", {
instance_id: useRootStore().instanceId,
destination_type: destinationType,
is_complete: isComplete(),
is_active: destination.enabled
});
}
}
function callEventBus(event, data) {
if (eventBus) eventBus.emit(event, data);
}
const defNameRef = useTemplateRef("defNameRef");
const { width } = useElementSize(defNameRef);
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(modalName),
"event-bus": modalBus.value,
"before-close": onModalClose,
scrollable: true,
center: true,
loading: loading$3.value,
"min-width": isTypeAbstract.value ? "460px" : "70%",
"max-width": isTypeAbstract.value ? "460px" : "70%",
"min-height": isTypeAbstract.value ? "160px" : "650px",
"max-height": isTypeAbstract.value ? "300px" : "650px",
"data-test-id": "destination-modal"
}, {
header: withCtx(() => [isTypeAbstract.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.headerCreate)
}, _cache[0] || (_cache[0] = [createBaseVNode("span", null, "Add new destination", -1)]), 2)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createBaseVNode("div", {
ref_key: "defNameRef",
ref: defNameRef,
class: normalizeClass(_ctx.$style.destinationInfo)
}, [createVNode(unref(N8nInlineTextEdit_default), {
"max-width": unref(width) - 10,
"data-test-id": "subtitle-showing-type",
"model-value": headerLabel.value,
readonly: isTypeAbstract.value,
"onUpdate:modelValue": onLabelChange
}, null, 8, [
"max-width",
"model-value",
"readonly"
]), createVNode(unref(N8nText_default), {
size: "small",
tag: "p",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(!isTypeAbstract.value ? unref(i18n$2).baseText(typeLabelName.value) : "Select type"), 1)]),
_: 1
})], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.destinationActions) }, [nodeParameters.value && hasOnceBeenSaved.value && unchanged.value ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 0,
icon: testMessageSent.value ? testMessageResult.value ? "check" : "triangle-alert" : void 0,
title: testMessageSent.value && testMessageResult.value ? "Event sent and returned OK" : "Event returned with error",
type: "tertiary",
label: "Send Test-Event",
disabled: !hasOnceBeenSaved.value || !unchanged.value,
"data-test-id": "destination-test-button",
onClick: sendTestEvent
}, null, 8, [
"icon",
"title",
"disabled"
])) : createCommentVNode("", true), canManageLogStreaming.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [nodeParameters.value && hasOnceBeenSaved.value ? (openBlock(), createBlock(unref(N8nIconButton_default), {
key: 0,
title: unref(i18n$2).baseText("settings.log-streaming.delete"),
icon: "trash-2",
type: "tertiary",
disabled: isSaving.value,
loading: isDeleting.value,
"data-test-id": "destination-delete-button",
onClick: removeThis
}, null, 8, [
"title",
"disabled",
"loading"
])) : createCommentVNode("", true), createVNode(SaveButton_default, {
saved: unchanged.value && hasOnceBeenSaved.value,
disabled: isTypeAbstract.value || unchanged.value,
"saving-label": unref(i18n$2).baseText("settings.log-streaming.saving"),
"data-test-id": "destination-save-button",
onClick: saveDestination
}, null, 8, [
"saved",
"disabled",
"saving-label"
])], 64)) : createCommentVNode("", true)], 2)], 2), _cache[1] || (_cache[1] = createBaseVNode("hr", null, null, -1))], 64))]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [isTypeAbstract.value ? (openBlock(), createBlock(unref(N8nInputLabel_default), {
key: 0,
class: normalizeClass(_ctx.$style.typeSelector),
label: unref(i18n$2).baseText("settings.log-streaming.selecttype"),
"tooltip-text": unref(i18n$2).baseText("settings.log-streaming.selecttypehint"),
bold: false,
size: "medium",
underline: false
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
ref: "typeSelectRef",
"model-value": typeSelectValue.value,
placeholder: typeSelectPlaceholder.value,
"data-test-id": "select-destination-type",
name: "name",
"onUpdate:modelValue": onTypeSelectInput
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(typeSelectOptions.value || [], (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.value,
value: option.value,
label: unref(i18n$2).baseText(option.label)
}, null, 8, ["value", "label"]);
}), 128))]),
_: 1
}, 8, ["model-value", "placeholder"]), createBaseVNode("div", _hoisted_1$16, [createVNode(unref(N8nButton_default), {
size: "large",
"data-test-id": "select-destination-button",
disabled: !typeSelectValue.value,
onClick: onContinueAddClicked
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(`settings.log-streaming.continue`)), 1)]),
_: 1
}, 8, ["disabled"])])]),
_: 1
}, 8, [
"class",
"label",
"tooltip-text"
])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.sidebar) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(sidebarItems.value, (item$2) => {
return openBlock(), createBlock(unref(N8nMenuItem_default), {
key: item$2.id,
item: item$2,
active: activeTab.value === item$2.id,
onClick: () => onTabSelect(item$2.id)
}, null, 8, [
"item",
"active",
"onClick"
]);
}), 128))], 2),
activeTab.value === "settings" ? (openBlock(), createElementBlock("div", {
key: 0,
ref: "content",
class: normalizeClass(_ctx.$style.mainContent)
}, [isTypeWebhook.value ? (openBlock(), createBlock(ParameterInputList_default, {
key: 0,
parameters: webhookDescription.value,
"hide-delete": true,
"node-values": nodeParameters.value,
"is-read-only": !canManageLogStreaming.value,
path: "",
onValueChanged: valueChanged
}, null, 8, [
"parameters",
"node-values",
"is-read-only"
])) : isTypeSyslog.value ? (openBlock(), createBlock(ParameterInputList_default, {
key: 1,
parameters: syslogDescription.value,
"hide-delete": true,
"node-values": nodeParameters.value,
"is-read-only": !canManageLogStreaming.value,
path: "",
onValueChanged: valueChanged
}, null, 8, [
"parameters",
"node-values",
"is-read-only"
])) : isTypeSentry.value ? (openBlock(), createBlock(ParameterInputList_default, {
key: 2,
parameters: sentryDescription.value,
"hide-delete": true,
"node-values": nodeParameters.value,
"is-read-only": !canManageLogStreaming.value,
path: "",
onValueChanged: valueChanged
}, null, 8, [
"parameters",
"node-values",
"is-read-only"
])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true),
activeTab.value === "events" ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.mainContent)
}, [createBaseVNode("div", _hoisted_2$6, [createVNode(unref(N8nInputLabel_default), {
class: "mb-m mt-m",
label: unref(i18n$2).baseText("settings.log-streaming.tab.events.title"),
bold: true,
size: "medium",
underline: false
}, null, 8, ["label"]), createVNode(EventSelection_default, {
"destination-id": unref(destination).id,
readonly: !canManageLogStreaming.value,
onInput,
onChange: valueChanged
}, null, 8, ["destination-id", "readonly"])])], 2)) : createCommentVNode("", true)
], 64))], 2)]),
_: 1
}, 8, [
"name",
"event-bus",
"loading",
"min-width",
"max-width",
"min-height",
"max-height"
]);
};
}
});
var EventDestinationSettingsModal_vue_vue_type_style_index_0_lang_module_default = {
labelMargins: "_labelMargins_1hly4_123",
typeSelector: "_typeSelector_1hly4_128",
sidebarSwitches: "_sidebarSwitches_1hly4_134",
tabbar: "_tabbar_1hly4_142",
mainContent: "_mainContent_1hly4_146",
sidebar: "_sidebar_1hly4_134",
cardTitle: "_cardTitle_1hly4_165",
header: "_header_1hly4_170",
headerCreate: "_headerCreate_1hly4_175",
container: "_container_1hly4_180",
destinationInfo: "_destinationInfo_1hly4_185",
destinationActions: "_destinationActions_1hly4_194"
};
var EventDestinationSettingsModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(EventDestinationSettingsModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": EventDestinationSettingsModal_vue_vue_type_style_index_0_lang_module_default }]]);
const useSetupWorkflowCredentialsModalState = () => {
const workflowsStore = useWorkflowsStore();
const workflowState = injectWorkflowState();
const credentialsStore = useCredentialsStore();
const nodeHelpers = useNodeHelpers();
const { appCredentials, credentialOverrides, credentialUsages, credentialsByKey, numFilledCredentials, selectedCredentialIdByKey, setSelectedCredentialId, unsetSelectedCredential } = useCredentialSetupState(computed(() => {
return workflowsStore.allNodes;
}));
const setInitialCredentialSelection = () => {
selectedCredentialIdByKey.value = {};
for (const credUsage of credentialUsages.value) {
const credential = credentialsStore.getCredentialsByType(credUsage.credentialType).find((cred) => cred.name === credUsage.credentialName);
if (!credential) continue;
selectedCredentialIdByKey.value[credUsage.key] = credential.id;
}
};
const setCredential = (credentialKey, credentialId) => {
setSelectedCredentialId(credentialKey, credentialId);
const usages = credentialsByKey.value.get(credentialKey);
if (!usages) return;
const credential = {
id: credentialId,
name: credentialsStore.getCredentialById(credentialId)?.name
};
usages.usedBy.forEach((node) => {
workflowState.updateNodeProperties({
name: node.name,
properties: { credentials: {
...node.credentials,
[usages.credentialType]: credential
} }
});
nodeHelpers.updateNodeCredentialIssuesByName(node.name);
});
setInitialCredentialSelection();
};
const unsetCredential = (credentialKey) => {
unsetSelectedCredential(credentialKey);
const usages = credentialsByKey.value.get(credentialKey);
if (!usages) return;
usages.usedBy.forEach((node) => {
const credentials = { ...node.credentials };
delete credentials[usages.credentialType];
workflowState.updateNodeProperties({
name: node.name,
properties: { credentials }
});
nodeHelpers.updateNodeCredentialIssuesByName(node.name);
});
setInitialCredentialSelection();
};
return {
appCredentials,
credentialOverrides,
credentialUsages,
credentialsByKey,
numFilledCredentials,
selectedCredentialIdByKey,
setInitialCredentialSelection,
setCredential,
unsetCredential
};
};
var SetupWorkflowCredentialsModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "SetupWorkflowCredentialsModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const workflowStore = useWorkflowsStore();
const uiStore = useUIStore();
const props = __props;
const { appCredentials, credentialUsages, numFilledCredentials, selectedCredentialIdByKey, setInitialCredentialSelection, setCredential, unsetCredential } = useSetupWorkflowCredentialsModalState();
onMounted(() => {
setInitialCredentialSelection();
telemetry$1.track("User opened cred setup", { source: "canvas" });
});
onUnmounted(() => {
telemetry$1.track("User closed cred setup", {
completed: numFilledCredentials.value === credentialUsages.value.length,
creds_filled: numFilledCredentials.value,
creds_needed: credentialUsages.value.length,
workflow_id: workflowStore.workflowId
});
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "700px",
"max-height": "90%",
name: props.modalName
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), {
tag: "h2",
size: "xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("setupCredentialsModal.title")), 1)]),
_: 1
})]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.grid) }, [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.notice),
"data-test-id": "info-callout"
}, [createVNode(AppsRequiringCredsNotice_default, { "app-credentials": unref(appCredentials) }, null, 8, ["app-credentials"])], 2), createBaseVNode("div", null, [createBaseVNode("ol", { class: normalizeClass(_ctx.$style.appCredentialsContainer) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(credentialUsages), (credentials, index) => {
return openBlock(), createBlock(SetupTemplateFormStep_default, {
key: credentials.key,
class: normalizeClass(_ctx.$style.appCredential),
order: index + 1,
credentials,
"selected-credential-id": unref(selectedCredentialIdByKey)[credentials.key],
onCredentialSelected: _cache[0] || (_cache[0] = ($event) => unref(setCredential)($event.credentialUsageKey, $event.credentialId)),
onCredentialDeselected: _cache[1] || (_cache[1] = ($event) => unref(unsetCredential)($event.credentialUsageKey))
}, null, 8, [
"class",
"order",
"credentials",
"selected-credential-id"
]);
}), 128))], 2)])], 2)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
size: "large",
label: unref(i18n$2).baseText("templateSetup.continue.button"),
disabled: unref(numFilledCredentials) === 0,
"data-test-id": "continue-button",
onClick: _cache[2] || (_cache[2] = ($event) => unref(uiStore).closeModal(props.modalName))
}, null, 8, ["label", "disabled"])], 2)]),
_: 1
}, 8, ["name"]);
};
}
});
var SetupWorkflowCredentialsModal_vue_vue_type_style_index_0_lang_module_default = {
grid: "_grid_19ac1_123",
notice: "_notice_19ac1_131",
appCredentialsContainer: "_appCredentialsContainer_19ac1_135",
appCredential: "_appCredential_19ac1_135",
footer: "_footer_19ac1_147"
};
var SetupWorkflowCredentialsModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SetupWorkflowCredentialsModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SetupWorkflowCredentialsModal_vue_vue_type_style_index_0_lang_module_default }]]);
var require__arrayAggregator = /* @__PURE__ */ __commonJSMin(((exports, module) => {
function arrayAggregator$1(array, setter, iteratee, accumulator) {
var index = -1, length = array == null ? 0 : array.length;
while (++index < length) {
var value = array[index];
setter(accumulator, value, iteratee(value), array);
}
return accumulator;
}
module.exports = arrayAggregator$1;
}));
var require__baseAggregator = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var baseEach = require__baseEach();
function baseAggregator$1(collection, setter, iteratee, accumulator) {
baseEach(collection, function(value, key, collection$1) {
setter(accumulator, value, iteratee(value), collection$1);
});
return accumulator;
}
module.exports = baseAggregator$1;
}));
var require__createAggregator = /* @__PURE__ */ __commonJSMin(((exports, module) => {
var arrayAggregator = require__arrayAggregator(), baseAggregator = require__baseAggregator(), baseIteratee = require__baseIteratee(), isArray = require_isArray();
function createAggregator$1(setter, initializer) {
return function(collection, iteratee) {
var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {};
return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
};
}
module.exports = createAggregator$1;
}));
var import_groupBy = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
var baseAssignValue = require__baseAssignValue(), createAggregator = require__createAggregator();
var hasOwnProperty = Object.prototype.hasOwnProperty;
module.exports = createAggregator(function(result, value, key) {
if (hasOwnProperty.call(result, key)) result[key].push(value);
else baseAssignValue(result, key, [value]);
});
})))());
var i18n = useI18n();
const getStatusText = (status) => i18n.baseText(`settings.sourceControl.status.${status}`);
const getStatusTheme = (status) => {
return {
[SOURCE_CONTROL_FILE_STATUS.created]: "success",
[SOURCE_CONTROL_FILE_STATUS.deleted]: "danger",
[SOURCE_CONTROL_FILE_STATUS.modified]: "warning"
}[status];
};
var pullStatusPriority = {
[SOURCE_CONTROL_FILE_STATUS.modified]: 2,
[SOURCE_CONTROL_FILE_STATUS.created]: 1,
[SOURCE_CONTROL_FILE_STATUS.deleted]: 3
};
const getPullPriorityByStatus = (status) => pullStatusPriority[status] ?? 0;
var pushStatusPriority = {
[SOURCE_CONTROL_FILE_STATUS.modified]: 1,
[SOURCE_CONTROL_FILE_STATUS.renamed]: 2,
[SOURCE_CONTROL_FILE_STATUS.created]: 3,
[SOURCE_CONTROL_FILE_STATUS.deleted]: 4
};
const getPushPriorityByStatus = (status) => pushStatusPriority[status] ?? 0;
var createVariablesToast = (router) => {
const route = {
name: VIEWS.HOME_VARIABLES,
query: { incomplete: "true" }
};
const { href } = router.resolve(route);
return {
title: i18n.baseText("settings.sourceControl.pull.upToDate.variables.title"),
message: h("a", {
href,
onClick: (e) => {
e.preventDefault();
telemetry.track("User clicked review variables");
router.push(route);
}
}, i18n.baseText("settings.sourceControl.pull.upToDate.variables.description")),
type: "info",
duration: 0
};
};
var createCredentialsToast = (router) => {
const route = {
name: VIEWS.CREDENTIALS,
query: { setupNeeded: "true" }
};
const { href } = router.resolve(route);
return {
title: i18n.baseText("settings.sourceControl.pull.upToDate.credentials.title"),
message: h("a", {
href,
onClick: (e) => {
e.preventDefault();
telemetry.track("User clicked review credentials");
router.push(route);
}
}, i18n.baseText("settings.sourceControl.pull.upToDate.credentials.description")),
type: "info",
duration: 0
};
};
var pullMessage = ({ credential, tags, variables, workflow, folders, project }) => {
const messages = [];
if (workflow?.length) messages.push(i18n.baseText("generic.workflow", {
adjustToNumber: workflow.length,
interpolate: { count: workflow.length }
}));
if (credential?.length) messages.push(i18n.baseText("generic.credential", {
adjustToNumber: credential.length,
interpolate: { count: credential.length }
}));
if (variables?.length) messages.push(i18n.baseText("generic.variable_plural"));
if (tags?.length) messages.push(i18n.baseText("generic.tag_plural"));
if (folders?.length) messages.push(i18n.baseText("generic.folders_plural"));
if (project?.length) messages.push(i18n.baseText("generic.projects"));
return [new Intl.ListFormat(i18n.locale, {
style: "long",
type: "conjunction"
}).format(messages), "were pulled"].join(" ");
};
const notifyUserAboutPullWorkFolderOutcome = async (files, toast, router) => {
if (!files?.length) {
toast.showMessage({
title: i18n.baseText("settings.sourceControl.pull.upToDate.title"),
message: i18n.baseText("settings.sourceControl.pull.upToDate.description"),
type: "success"
});
return;
}
const { credential, tags, variables, workflow, folders, project } = (0, import_groupBy.default)(files, "type");
const toastMessages = [
...variables?.length ? [createVariablesToast(router)] : [],
...credential?.length ? [createCredentialsToast(router)] : [],
{
title: i18n.baseText("settings.sourceControl.pull.success.title"),
message: pullMessage({
credential,
tags,
variables,
workflow,
folders,
project
}),
type: "success"
}
];
for (const message$1 of toastMessages) {
toast.showToast(message$1);
await nextTick();
}
};
var import_dateformat$2 = /* @__PURE__ */ __toESM(require_dateformat());
var import_orderBy$1 = /* @__PURE__ */ __toESM(require_orderBy());
var _hoisted_1$15 = { style: {
"display": "flex",
"height": "100%"
} };
var _hoisted_2$5 = ["data-test-id", "onClick"];
var _hoisted_3$3 = { style: { "flex": "1" } };
var _hoisted_4$3 = { style: {
"flex": "1",
"overflow": "hidden"
} };
var _hoisted_5$2 = { key: 2 };
var _hoisted_6$1 = {
key: 0,
class: "mb-xs"
};
var SourceControlPullModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "SourceControlPullModal",
props: { data: {} },
setup(__props) {
const props = __props;
const telemetry$1 = useTelemetry();
const loadingService = useLoadingService();
const toast = useToast();
const i18n$2 = useI18n();
const sourceControlStore = useSourceControlStore();
const projectsStore = useProjectsStore();
const route = useRoute();
const router = useRouter();
const settingsStore = useSettingsStore();
const isWorkflowDiffsEnabled = computed(() => settingsStore.settings.enterprise.workflowDiffs);
const status = ref(props.data.status || []);
const isLoading = ref(false);
const responseStatuses = { CONFLICT: 409 };
async function loadSourceControlStatus() {
if (isLoading.value) return;
isLoading.value = true;
loadingService.startLoading();
loadingService.setLoadingText(i18n$2.baseText("settings.sourceControl.loading.checkingForChanges"));
try {
await notifyUserAboutPullWorkFolderOutcome(await sourceControlStore.pullWorkfolder(false), toast, router);
sourceControlEventBus.emit("pull");
close();
} catch (error$2) {
const errorResponse = error$2.response;
if (errorResponse?.status === responseStatuses.CONFLICT) status.value = errorResponse.data.data || [];
else {
toast.showError(error$2, "Error");
close();
}
} finally {
isLoading.value = false;
loadingService.stopLoading();
loadingService.setLoadingText(i18n$2.baseText("genericHelpers.loading"));
}
}
onBeforeMount(() => {
projectsStore.getAvailableProjects();
});
const activeTab = ref(SOURCE_CONTROL_FILE_TYPE.workflow);
const groupedFilesByType = computed(() => {
const grouped = {};
status.value.forEach((file) => {
if (!grouped[file.type]) grouped[file.type] = [];
grouped[file.type].push(file);
});
return grouped;
});
const filteredWorkflows = computed(() => {
return groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.workflow] || [];
});
const sortedWorkflows = computed(() => (0, import_orderBy$1.default)(filteredWorkflows.value, [({ status: status$1 }) => getPullPriorityByStatus(status$1), "updatedAt"], ["asc", "desc"]));
const filteredCredentials = computed(() => {
return groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.credential] || [];
});
const sortedCredentials = computed(() => (0, import_orderBy$1.default)(filteredCredentials.value, [({ status: status$1 }) => getPullPriorityByStatus(status$1), "updatedAt"], ["asc", "desc"]));
const activeDataSourceFiltered = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return sortedWorkflows.value;
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.credential) return sortedCredentials.value;
return [];
});
const filtersNoResultText = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return i18n$2.baseText("workflows.noResults");
return i18n$2.baseText("credentials.noResults");
});
const tabs$3 = computed(() => {
return [{
label: "Workflows",
value: SOURCE_CONTROL_FILE_TYPE.workflow,
total: groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.workflow]?.length || 0
}, {
label: "Credentials",
value: SOURCE_CONTROL_FILE_TYPE.credential,
total: groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.credential]?.length || 0
}];
});
const otherFiles = computed(() => {
const others = [];
const variables = groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.variables];
if (variables) others.push.apply(others, variables);
const tags = groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.tags];
if (tags) others.push.apply(others, tags);
const folders = groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.folders];
if (folders) others.push.apply(others, folders);
const projects = groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.project];
if (projects) others.push.apply(others, projects);
return others;
});
function close() {
router.back();
}
async function pullWorkfolder() {
loadingService.startLoading(i18n$2.baseText("settings.sourceControl.loading.checkingForChanges"));
close();
try {
await notifyUserAboutPullWorkFolderOutcome(await sourceControlStore.pullWorkfolder(true), toast, router);
sourceControlEventBus.emit("pull");
} catch (error$2) {
toast.showError(error$2, "Error");
} finally {
loadingService.stopLoading();
}
}
function renderUpdatedAt(file) {
const currentYear = (/* @__PURE__ */ new Date()).getFullYear().toString();
return i18n$2.baseText("settings.sourceControl.lastUpdated", { interpolate: {
date: (0, import_dateformat$2.default)(file.updatedAt, `d mmm${file.updatedAt?.startsWith(currentYear) ? "" : ", yyyy"}`),
time: (0, import_dateformat$2.default)(file.updatedAt, "HH:MM")
} });
}
function openDiffModal(id) {
telemetry$1.track("User clicks compare workflows", {
workflow_id: id,
context: "source_control_pull"
});
router.push({ query: {
...route.query,
diff: id,
direction: "pull"
} });
}
const modalHeight = computed(() => groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.workflow]?.length || groupedFilesByType.value[SOURCE_CONTROL_FILE_TYPE.credential]?.length ? "min(80vh, 850px)" : "auto");
onMounted(() => {
if (!props.data.status || props.data.status.length === 0) loadSourceControlStatus();
});
return (_ctx, _cache) => {
const _component_RouterLink = resolveComponent("RouterLink");
return !isLoading.value ? (openBlock(), createBlock(Modal_default, {
key: 0,
width: "812px",
"event-bus": _ctx.data.eventBus,
name: unref(SOURCE_CONTROL_PULL_MODAL_KEY),
height: modalHeight.value,
"custom-class": _ctx.$style.sourceControlPull,
"before-close": close
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), {
tag: "h1",
size: "xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.pull.title")), 1)]),
_: 1
}), createBaseVNode("div", { class: normalizeClass([[_ctx.$style.filtersRow], "mt-l"]) }, [createVNode(unref(N8nText_default), {
tag: "div",
class: "mb-xs"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.pull.description")) + " ", 1), createVNode(unref(N8nLink_default), { to: unref(i18n$2).baseText("settings.sourceControl.docs.using.pushPull.url") }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.push.description.learnMore")), 1)]),
_: 1
}, 8, ["to"])]),
_: 1
})], 2)]),
content: withCtx(() => [createBaseVNode("div", _hoisted_1$15, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.tabs) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(tabs$3.value, (tab$3) => {
return openBlock(), createElementBlock("button", {
key: tab$3.value,
type: "button",
class: normalizeClass([_ctx.$style.tab, { [_ctx.$style.tabActive]: activeTab.value === tab$3.value }]),
"data-test-id": `source-control-pull-modal-tab-${tab$3.value}`,
onClick: ($event) => activeTab.value = tab$3.value
}, [createBaseVNode("div", null, toDisplayString(tab$3.label), 1), createVNode(unref(N8nText_default), {
tag: "div",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(tab$3.total) + " " + toDisplayString(tab$3.total === 1 ? "item" : "items"), 1)]),
_: 2
}, 1024)], 10, _hoisted_2$5);
}), 128))], 2), createBaseVNode("div", _hoisted_3$3, [createBaseVNode("div", { class: normalizeClass([_ctx.$style.table]) }, [createBaseVNode("div", { class: normalizeClass([_ctx.$style.tableHeader]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.headerTitle) }, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => _cache[0] || (_cache[0] = [createTextVNode("Title")])),
_: 1
})], 2)], 2), createBaseVNode("div", _hoisted_4$3, [!activeDataSourceFiltered.value.length ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 0,
class: "p-xs",
bold: false
}, {
default: withCtx(() => [createTextVNode(toDisplayString(filtersNoResultText.value), 1)]),
_: 1
})) : createCommentVNode("", true), activeDataSourceFiltered.value.length ? (openBlock(), createBlock(unref(script$1), {
key: 1,
class: normalizeClass([_ctx.$style.scroller]),
items: activeDataSourceFiltered.value,
"min-item-size": 57,
"item-class": "scrollerItem"
}, {
default: withCtx(({ item: file, active, index }) => [createVNode(unref(script), {
item: file,
active,
"size-dependencies": [file.name, file.id],
"data-index": index
}, {
default: withCtx(() => [createBaseVNode("div", {
class: normalizeClass([_ctx.$style.listItem]),
"data-test-id": "pull-modal-item"
}, [createBaseVNode("div", { class: normalizeClass([_ctx.$style.itemContent]) }, [createVNode(unref(N8nText_default), {
tag: "div",
bold: "",
color: "text-dark",
class: normalizeClass([_ctx.$style.listItemName])
}, {
default: withCtx(() => [file.type === unref(SOURCE_CONTROL_FILE_TYPE).credential ? (openBlock(), createBlock(_component_RouterLink, {
key: 0,
target: "_blank",
to: {
name: unref(VIEWS).CREDENTIALS,
params: { credentialId: file.id }
}
}, {
default: withCtx(() => [createTextVNode(toDisplayString(file.name), 1)]),
_: 2
}, 1032, ["to"])) : file.type === unref(SOURCE_CONTROL_FILE_TYPE).workflow ? (openBlock(), createBlock(_component_RouterLink, {
key: 1,
target: "_blank",
to: {
name: unref(VIEWS).WORKFLOW,
params: { name: file.id }
}
}, {
default: withCtx(() => [createTextVNode(toDisplayString(file.name), 1)]),
_: 2
}, 1032, ["to"])) : (openBlock(), createElementBlock("span", _hoisted_5$2, toDisplayString(file.name), 1))]),
_: 2
}, 1032, ["class"]), file.updatedAt ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
tag: "p",
class: "mt-0",
color: "text-light",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(renderUpdatedAt(file)), 1)]),
_: 2
}, 1024)) : createCommentVNode("", true)], 2), createBaseVNode("span", { class: normalizeClass([_ctx.$style.badges]) }, [createVNode(unref(N8nBadge_default), {
theme: unref(getStatusTheme)(file.status),
style: { "height": "25px" }
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(getStatusText)(file.status)), 1)]),
_: 2
}, 1032, ["theme"]), isWorkflowDiffsEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [file.type === unref(SOURCE_CONTROL_FILE_TYPE).workflow ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 0,
content: unref(i18n$2).baseText("workflowDiff.compare"),
placement: "top"
}, {
default: withCtx(() => [createVNode(unref(N8nIconButton_default), {
icon: "file-diff",
type: "secondary",
onClick: ($event) => openDiffModal(file.id)
}, null, 8, ["onClick"])]),
_: 2
}, 1032, ["content"])) : createCommentVNode("", true)], 64)) : createCommentVNode("", true)], 2)], 2)]),
_: 2
}, 1032, [
"item",
"active",
"size-dependencies",
"data-index"
])]),
_: 1
}, 8, ["class", "items"])) : createCommentVNode("", true)])], 2)])])]),
footer: withCtx(() => [otherFiles.value.length ? (openBlock(), createElementBlock("div", _hoisted_6$1, [createVNode(unref(N8nText_default), {
bold: "",
size: "medium"
}, {
default: withCtx(() => _cache[1] || (_cache[1] = [createTextVNode("Additional changes to be pulled:")])),
_: 1
}), createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [
groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).variables]?.length ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(" Variables (" + toDisplayString(groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).variables]?.length || 0) + "), ", 1)], 64)) : createCommentVNode("", true),
groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).tags]?.length ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(" Tags (" + toDisplayString(groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).tags]?.length || 0) + "), ", 1)], 64)) : createCommentVNode("", true),
groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).folders]?.length ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(" Folders (" + toDisplayString(groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).folders]?.length || 0) + "), ", 1)], 64)) : createCommentVNode("", true),
groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).project]?.length ? (openBlock(), createElementBlock(Fragment, { key: 3 }, [createTextVNode(" Projects (" + toDisplayString(groupedFilesByType.value[unref(SOURCE_CONTROL_FILE_TYPE).project]?.length || 0) + ") ", 1)], 64)) : createCommentVNode("", true)
]),
_: 1
})])) : createCommentVNode("", true), createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
type: "tertiary",
class: "mr-2xs",
onClick: close
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.pull.buttons.cancel")), 1)]),
_: 1
}), createVNode(unref(N8nButton_default), {
type: "primary",
"data-test-id": "force-pull",
onClick: pullWorkfolder
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.pull.buttons.save")), 1)]),
_: 1
})], 2)]),
_: 1
}, 8, [
"event-bus",
"name",
"height",
"custom-class"
])) : createCommentVNode("", true);
};
}
});
var SourceControlPullModal_vue_vue_type_style_index_0_lang_module_default = {
sourceControlPull: "_sourceControlPull_1056c_123",
filtersRow: "_filtersRow_1056c_130",
filters: "_filters_1056c_130",
headerTitle: "_headerTitle_1056c_143",
filtersApplied: "_filtersApplied_1056c_149",
scroller: "_scroller_1056c_153",
listItem: "_listItem_1056c_158",
itemContent: "_itemContent_1056c_172",
listItemName: "_listItemName_1056c_177",
badges: "_badges_1056c_194",
footer: "_footer_1056c_201",
table: "_table_1056c_208",
tableHeader: "_tableHeader_1056c_218",
tabs: "_tabs_1056c_224",
tab: "_tab_1056c_208",
tabActive: "_tabActive_1056c_252"
};
var SourceControlPullModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SourceControlPullModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SourceControlPullModal_vue_vue_type_style_index_0_lang_module_default }]]);
var import_dateformat$1 = /* @__PURE__ */ __toESM(require_dateformat());
var import_orderBy = /* @__PURE__ */ __toESM(require_orderBy());
var _hoisted_1$14 = {
key: 0,
class: "mt-s"
};
var _hoisted_2$4 = { style: {
"display": "flex",
"height": "100%"
} };
var _hoisted_3$2 = ["data-test-id", "onClick"];
var _hoisted_4$2 = { style: { "flex": "1" } };
var _hoisted_5$1 = { style: {
"flex": "1",
"overflow": "hidden"
} };
var SourceControlPushModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "SourceControlPushModal",
props: { data: {} },
setup(__props) {
const props = __props;
const loadingService = useLoadingService();
const toast = useToast();
const i18n$2 = useI18n();
const sourceControlStore = useSourceControlStore();
const projectsStore = useProjectsStore();
const route = useRoute();
const router = useRouter();
const telemetry$1 = useTelemetry();
const usersStore = useUsersStore();
const settingsStore = useSettingsStore();
const isWorkflowDiffsEnabled = computed(() => settingsStore.settings.enterprise.workflowDiffs);
const status = ref(props.data.status ?? []);
const isLoading = ref(false);
async function loadSourceControlStatus() {
if (isLoading.value) return;
isLoading.value = true;
loadingService.startLoading();
loadingService.setLoadingText(i18n$2.baseText("settings.sourceControl.loading.checkingForChanges"));
try {
const freshStatus = await sourceControlStore.getAggregatedStatus();
if (!freshStatus.length) {
toast.showMessage({
title: "No changes to commit",
message: "Everything is up to date",
type: "info"
});
close();
return;
}
status.value = freshStatus;
freshStatus.forEach((file) => {
if (file.type === "credential") selectedCredentials.add(file.id);
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("error"));
close();
} finally {
loadingService.stopLoading();
loadingService.setLoadingText(i18n$2.baseText("genericHelpers.loading"));
isLoading.value = false;
}
}
const projectAdminCalloutDismissed = useStorage("SOURCE_CONTROL_PROJECT_ADMIN_CALLOUT_DISMISSED", false, localStorage);
onBeforeMount(() => {
projectsStore.getAvailableProjects();
});
const projectsForFilters = computed(() => {
return projectsStore.availableProjects.filter((project) => !project.role || project.role === "project:admin");
});
const concatenateWithAnd = (messages) => new Intl.ListFormat(i18n$2.locale, {
style: "long",
type: "conjunction"
}).format(messages);
const classifyFilesByType = (files, currentWorkflowId) => files.reduce((acc, file) => {
const project = projectsStore.availableProjects.find(({ id }) => id === file.owner?.projectId);
if (file.location === SOURCE_CONTROL_FILE_LOCATION.remote && file.type === SOURCE_CONTROL_FILE_TYPE.workflow && file.status === SOURCE_CONTROL_FILE_STATUS.created) return acc;
if (file.type === SOURCE_CONTROL_FILE_TYPE.variables) {
acc.variables.push({
...file,
project
});
return acc;
}
if (file.type === SOURCE_CONTROL_FILE_TYPE.tags) {
acc.tags.push({
...file,
project
});
return acc;
}
if (file.type === SOURCE_CONTROL_FILE_TYPE.folders) {
acc.folders.push({
...file,
project
});
return acc;
}
if (file.type === SOURCE_CONTROL_FILE_TYPE.workflow && currentWorkflowId === file.id) acc.currentWorkflow = {
...file,
project
};
if (file.type === SOURCE_CONTROL_FILE_TYPE.workflow) {
acc.workflow.push({
...file,
project
});
return acc;
}
if (file.type === SOURCE_CONTROL_FILE_TYPE.credential) {
acc.credential.push({
...file,
project
});
return acc;
}
if (file.type === SOURCE_CONTROL_FILE_TYPE.project) {
acc.projects.push({
...file,
project
});
return acc;
}
return acc;
}, {
tags: [],
variables: [],
credential: [],
workflow: [],
folders: [],
projects: [],
currentWorkflow: void 0
});
const userNotices = computed(() => {
const messages = [];
if (changes$1.value.variables.length) messages.push({
title: "Variables",
content: "at least one new or modified"
});
if (changes$1.value.tags.length) messages.push({
title: "Tags",
content: "at least one new or modified"
});
if (changes$1.value.folders.length) messages.push({
title: "Folders",
content: "at least one new or modified"
});
if (changes$1.value.projects.length) messages.push({
title: "Projects",
content: "at least one new or modified"
});
return messages;
});
const workflowId = computed(() => [VIEWS.WORKFLOW].includes(route.name) && route.params.name?.toString() || void 0);
const changes$1 = computed(() => classifyFilesByType(status.value, workflowId.value));
const selectedWorkflows = reactive(/* @__PURE__ */ new Set());
const maybeSelectCurrentWorkflow = (workflow) => workflow && selectedWorkflows.add(workflow.id);
const filters$2 = ref({ project: computed(() => {
if (!route.params.projectId) return null;
const project = projectsStore.availableProjects.find((project$1) => project$1.id === route.params.projectId?.toString());
if (!project) return null;
if (!project.role || project.role === "project:admin") return project;
return null;
}).value });
const filtersApplied$2 = computed(() => Boolean(search.value) || Boolean(Object.values(filters$2.value).filter(Boolean).length));
const resetFilters = () => {
filters$2.value = { project: null };
search.value = "";
};
const statusFilterOptions = [
{
label: "New",
value: SOURCE_CONTROL_FILE_STATUS.created
},
{
label: "Modified",
value: SOURCE_CONTROL_FILE_STATUS.modified
},
{
label: "Deleted",
value: SOURCE_CONTROL_FILE_STATUS.deleted
}
];
const search = ref("");
const debouncedSearch = refDebounced(search, 250);
const filterCount = computed(() => Object.values(filters$2.value).reduce((acc, item$2) => item$2 ? acc + 1 : acc, 0));
const filteredWorkflows = computed(() => {
const searchQuery = debouncedSearch.value.toLocaleLowerCase();
return changes$1.value.workflow.filter((workflow) => {
if (!workflow.name.toLocaleLowerCase().includes(searchQuery)) return false;
if (filters$2.value.project) return workflow.project?.id === filters$2.value.project.id;
if (filters$2.value.status && filters$2.value.status !== workflow.status) return false;
return true;
});
});
const sortedWorkflows = computed(() => (0, import_orderBy.default)(filteredWorkflows.value, [
({ id }) => id === changes$1.value.currentWorkflow?.id,
({ status: status$1 }) => getPushPriorityByStatus(status$1),
"updatedAt"
], [
"desc",
"asc",
"desc"
]));
const selectedCredentials = reactive(/* @__PURE__ */ new Set());
const filteredCredentials = computed(() => {
const searchQuery = debouncedSearch.value.toLocaleLowerCase();
return changes$1.value.credential.filter((credential) => {
if (!credential.name.toLocaleLowerCase().includes(searchQuery)) return false;
if (filters$2.value.project) return credential.project?.id === filters$2.value.project.id;
if (filters$2.value.status && filters$2.value.status !== credential.status) return false;
return true;
});
});
const sortedCredentials = computed(() => (0, import_orderBy.default)(filteredCredentials.value, [({ status: status$1 }) => getPushPriorityByStatus(status$1), "updatedAt"], ["asc", "desc"]));
const commitMessage = ref("");
const isSubmitDisabled = computed(() => {
if (!commitMessage.value.trim()) return true;
return selectedCredentials.size + changes$1.value.tags.length + changes$1.value.variables.length + changes$1.value.folders.length + changes$1.value.projects.length + selectedWorkflows.size <= 0;
});
const selectAllIndeterminate = computed(() => {
if (!activeSelection.value.size) return false;
if (toRaw(activeSelection.value).intersection(new Set(activeDataSourceFiltered.value.map(({ id }) => id))).size === 0) return false;
return !allVisibleItemsSelected.value;
});
const selectedCount = computed(() => selectedWorkflows.size + selectedCredentials.size);
function onToggleSelectAll() {
if (allVisibleItemsSelected.value) {
const diff = toRaw(activeSelection.value).difference(new Set(activeDataSourceFiltered.value.map(({ id }) => id)));
activeSelection.value.clear();
diff.forEach((id) => activeSelection.value.add(id));
} else activeDataSourceFiltered.value.forEach((file) => activeSelection.value.add(file.id));
}
function close() {
router.back();
}
function renderUpdatedAt(file) {
const currentYear = (/* @__PURE__ */ new Date()).getFullYear().toString();
return i18n$2.baseText("settings.sourceControl.lastUpdated", { interpolate: {
date: (0, import_dateformat$1.default)(file.updatedAt, `d mmm${file.updatedAt?.startsWith(currentYear) ? "" : ", yyyy"}`),
time: (0, import_dateformat$1.default)(file.updatedAt, "HH:MM")
} });
}
async function onCommitKeyDownEnter() {
if (!isSubmitDisabled.value) await commitAndPush();
}
const successNotificationMessage = () => {
const messages = [];
if (selectedWorkflows.size) messages.push(i18n$2.baseText("generic.workflow", {
adjustToNumber: selectedWorkflows.size,
interpolate: { count: selectedWorkflows.size }
}));
if (selectedCredentials.size) messages.push(i18n$2.baseText("generic.credential", {
adjustToNumber: selectedCredentials.size,
interpolate: { count: selectedCredentials.size }
}));
if (changes$1.value.variables.length) messages.push(i18n$2.baseText("generic.variable_plural"));
if (changes$1.value.folders.length) messages.push(i18n$2.baseText("generic.folders_plural"));
if (changes$1.value.tags.length) messages.push(i18n$2.baseText("generic.tag_plural"));
if (changes$1.value.projects.length) messages.push(i18n$2.baseText("generic.projects"));
return [concatenateWithAnd(messages), i18n$2.baseText("settings.sourceControl.modals.push.success.description")].join(" ");
};
async function commitAndPush() {
const files = changes$1.value.tags.concat(changes$1.value.variables).concat(changes$1.value.credential.filter((file) => selectedCredentials.has(file.id))).concat(changes$1.value.folders).concat(changes$1.value.projects).concat(changes$1.value.workflow.filter((file) => selectedWorkflows.has(file.id)));
loadingService.startLoading(i18n$2.baseText("settings.sourceControl.loading.push"));
close();
try {
await sourceControlStore.pushWorkfolder({
force: true,
commitMessage: commitMessage.value,
fileNames: files
});
toast.showToast({
title: i18n$2.baseText("settings.sourceControl.modals.push.success.title"),
message: successNotificationMessage(),
type: "success"
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("error"));
} finally {
loadingService.stopLoading();
}
}
const modalHeight = computed(() => changes$1.value.workflow.length ? "min(80vh, 850px)" : "auto");
watch(() => filters$2.value.status, (status$1) => {
telemetry$1.track("User filtered by status in commit modal", { status: status$1 });
});
watch(refDebounced(search, 500), (term) => {
telemetry$1.track("User searched workflows in commit modal", { search: term });
});
const activeTab = ref(SOURCE_CONTROL_FILE_TYPE.workflow);
const allVisibleItemsSelected = computed(() => {
if (!activeSelection.value.size) return false;
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) {
const workflowsSet = new Set(sortedWorkflows.value.map(({ id }) => id));
if (!workflowsSet.size) return false;
return !workflowsSet.difference(toRaw(activeSelection.value)).size;
}
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.credential) {
const credentialsSet = new Set(sortedCredentials.value.map(({ id }) => id));
if (!credentialsSet.size) return false;
return !credentialsSet.difference(toRaw(activeSelection.value)).size;
}
return false;
});
function toggleSelected(id) {
if (activeSelection.value.has(id)) activeSelection.value.delete(id);
else activeSelection.value.add(id);
}
const activeDataSource = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return changes$1.value.workflow;
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.credential) return changes$1.value.credential;
return [];
});
const activeDataSourceFiltered = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return sortedWorkflows.value;
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.credential) return sortedCredentials.value;
return [];
});
const activeEntityLocale = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return "generic.workflows";
return "generic.credentials";
});
const activeSelection = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return selectedWorkflows;
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.credential) return selectedCredentials;
return /* @__PURE__ */ new Set();
});
const tabs$3 = computed(() => {
return [{
label: "Workflows",
value: SOURCE_CONTROL_FILE_TYPE.workflow,
selected: selectedWorkflows.size,
total: changes$1.value.workflow.length
}, {
label: "Credentials",
value: SOURCE_CONTROL_FILE_TYPE.credential,
selected: selectedCredentials.size,
total: changes$1.value.credential.length
}];
});
const filtersNoResultText = computed(() => {
if (activeTab.value === SOURCE_CONTROL_FILE_TYPE.workflow) return i18n$2.baseText("workflows.noResults");
return i18n$2.baseText("credentials.noResults");
});
function castType(type) {
if (type === SOURCE_CONTROL_FILE_TYPE.workflow) return ResourceType.Workflow;
return ResourceType.Credential;
}
function castProject(project) {
return {
homeProject: project,
id: "",
name: "",
active: false,
activeVersionId: null,
createdAt: "",
updatedAt: "",
isArchived: false,
readOnly: false,
resourceType: "workflow",
sharedWithProjects: []
};
}
function openDiffModal(id, workflowStatus) {
telemetry$1.track("User clicks compare workflows", {
workflow_id: id,
context: "source_control_push"
});
router.push({ query: {
...route.query,
diff: id,
workflowStatus,
direction: "push"
} });
}
watchEffect(() => {
if (changes$1.value.currentWorkflow && !selectedWorkflows.has(changes$1.value.currentWorkflow.id)) maybeSelectCurrentWorkflow(changes$1.value.currentWorkflow);
});
onMounted(async () => {
await loadSourceControlStatus();
});
return (_ctx, _cache) => {
return !isLoading.value ? (openBlock(), createBlock(Modal_default, {
key: 0,
width: "812px",
"event-bus": _ctx.data.eventBus,
name: unref(SOURCE_CONTROL_PUSH_MODAL_KEY),
height: modalHeight.value,
"custom-class": _ctx.$style.sourceControlPush,
"before-close": close
}, {
header: withCtx(() => [
createVNode(unref(N8nHeading_default), {
tag: "h1",
size: "xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.push.title")), 1)]),
_: 1
}),
changes$1.value.workflow.length || changes$1.value.credential.length ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass([[_ctx.$style.filtersRow], "mt-l"])
}, [createBaseVNode("div", { class: normalizeClass([_ctx.$style.filters]) }, [createVNode(unref(N8nInput_default), {
modelValue: search.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => search.value = $event),
"data-test-id": "source-control-push-search",
placeholder: "Filter by title",
clearable: "",
style: { "width": "234px" }
}, {
prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
_: 1
}, 8, ["modelValue"]), createVNode(unref(N8nPopover_default), {
width: "304px",
"content-class": _ctx.$style["popover-content"],
style: { "align-self": "normal" }
}, {
trigger: withCtx(() => [createVNode(unref(N8nButton_default), {
icon: "funnel",
type: "tertiary",
style: { "height": "100%" },
active: Boolean(filterCount.value),
"data-test-id": "source-control-filter-dropdown"
}, {
default: withCtx(() => [filterCount.value ? (openBlock(), createBlock(unref(N8nBadge_default), {
key: 0,
theme: "primary",
class: "mr-4xs"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(filterCount.value), 1)]),
_: 1
})) : createCommentVNode("", true)]),
_: 1
}, 8, ["active"])]),
content: withCtx(() => [
createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("workflows.filters.status"),
bold: false,
size: "small",
color: "text-base",
class: "mb-3xs"
}, null, 8, ["label"]),
createVNode(unref(N8nSelect_default), {
modelValue: filters$2.value.status,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => filters$2.value.status = $event),
"data-test-id": "source-control-status-filter",
clearable: ""
}, {
default: withCtx(() => [(openBlock(), createElementBlock(Fragment, null, renderList(statusFilterOptions, (option) => {
return createVNode(unref(N8nOption_default), mergeProps({
key: option.label,
"data-test-id": "source-control-status-filter-option",
ref_for: true
}, option), null, 16);
}), 64))]),
_: 1
}, 8, ["modelValue"]),
createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("forms.resourceFiltersDropdown.owner"),
bold: false,
size: "small",
color: "text-base",
class: "mb-3xs mt-3xs"
}, null, 8, ["label"]),
createVNode(ProjectSharing_default, {
modelValue: filters$2.value.project,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => filters$2.value.project = $event),
"data-test-id": "source-control-push-modal-project-search",
projects: projectsForFilters.value,
placeholder: unref(i18n$2).baseText("forms.resourceFiltersDropdown.owner.placeholder"),
"empty-options-text": unref(i18n$2).baseText("projects.sharing.noMatchingProjects")
}, null, 8, [
"modelValue",
"projects",
"placeholder",
"empty-options-text"
]),
filterCount.value ? (openBlock(), createElementBlock("div", _hoisted_1$14, [createVNode(unref(N8nLink_default), { onClick: resetFilters }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("forms.resourceFiltersDropdown.reset")), 1)]),
_: 1
})])) : createCommentVNode("", true)
]),
_: 1
}, 8, ["content-class"])], 2)], 2)) : createCommentVNode("", true),
unref(usersStore).currentUser && unref(usersStore).currentUser.role ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [unref(usersStore).currentUser.role !== unref(ROLE).Owner && unref(usersStore).currentUser.role !== unref(ROLE).Admin ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [!unref(projectAdminCalloutDismissed) ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "secondary",
class: "mt-s"
}, {
trailingContent: withCtx(() => [createVNode(unref(N8nIcon_default), {
icon: "x",
title: "Dismiss",
size: "medium",
type: "secondary",
onClick: _cache[3] || (_cache[3] = ($event) => projectAdminCalloutDismissed.value = true)
})]),
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.push.projectAdmin.callout")) + " ", 1)]),
_: 1
})) : createCommentVNode("", true)], 64)) : createCommentVNode("", true)], 64)) : createCommentVNode("", true)
]),
content: withCtx(() => [createBaseVNode("div", _hoisted_2$4, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.tabs) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(tabs$3.value, (tab$3) => {
return openBlock(), createElementBlock("button", {
key: tab$3.value,
type: "button",
class: normalizeClass([_ctx.$style.tab, { [_ctx.$style.tabActive]: activeTab.value === tab$3.value }]),
"data-test-id": `source-control-push-modal-tab-${tab$3.value}`,
onClick: ($event) => activeTab.value = tab$3.value
}, [createBaseVNode("div", null, toDisplayString(tab$3.label), 1), createVNode(unref(N8nText_default), {
tag: "div",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(tab$3.selected) + " / " + toDisplayString(tab$3.total) + " selected ", 1)]),
_: 2
}, 1024)], 10, _hoisted_3$2);
}), 128))], 2), createBaseVNode("div", _hoisted_4$2, [createBaseVNode("div", { class: normalizeClass([_ctx.$style.table]) }, [createBaseVNode("div", { class: normalizeClass([_ctx.$style.tableHeader]) }, [createVNode(unref(N8nCheckbox_default), {
class: normalizeClass(_ctx.$style.selectAll),
indeterminate: selectAllIndeterminate.value,
"model-value": allVisibleItemsSelected.value,
"data-test-id": "source-control-push-modal-toggle-all",
disabled: activeDataSourceFiltered.value.length === 0,
"onUpdate:modelValue": onToggleSelectAll
}, {
default: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => _cache[5] || (_cache[5] = [createTextVNode(" Title ")])),
_: 1
})]),
_: 1
}, 8, [
"class",
"indeterminate",
"model-value",
"disabled"
]), filtersApplied$2.value ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 0,
class: normalizeClass(["p-xs", _ctx.$style.filtersApplied]),
bold: false
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.push.filter", { interpolate: {
count: `${activeDataSourceFiltered.value.length} / ${activeDataSource.value.length}`,
entity: unref(i18n$2).baseText(activeEntityLocale.value).toLowerCase()
} })) + " ", 1), createVNode(unref(N8nLink_default), {
size: "small",
"data-test-id": "source-control-filters-reset",
onClick: resetFilters
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.filters.active.reset")), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true)], 2), createBaseVNode("div", _hoisted_5$1, [!activeDataSourceFiltered.value.length ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 0,
class: "p-xs",
bold: false
}, {
default: withCtx(() => [createTextVNode(toDisplayString(filtersNoResultText.value), 1)]),
_: 1
})) : createCommentVNode("", true), activeDataSourceFiltered.value.length ? (openBlock(), createBlock(unref(script$1), {
key: 1,
class: normalizeClass([_ctx.$style.scroller]),
items: activeDataSourceFiltered.value,
"min-item-size": 57,
"item-class": "scrollerItem"
}, {
default: withCtx(({ item: file, active, index }) => [createVNode(unref(script), {
item: file,
active,
"size-dependencies": [file.name, file.id],
"data-index": index,
"data-test-id": "push-modal-item"
}, {
default: withCtx(() => [createVNode(unref(N8nCheckbox_default), {
class: normalizeClass([_ctx.$style.listItem]),
"data-test-id": "source-control-push-modal-file-checkbox",
"model-value": activeSelection.value.has(file.id),
"onUpdate:modelValue": ($event) => toggleSelected(file.id)
}, {
default: withCtx(() => [createBaseVNode("span", null, [createVNode(unref(N8nText_default), {
tag: "div",
bold: "",
color: "text-dark",
class: normalizeClass([_ctx.$style.listItemName])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(file.name || file.id), 1)]),
_: 2
}, 1032, ["class"]), file.updatedAt ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
tag: "p",
class: "mt-0",
color: "text-light",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(renderUpdatedAt(file)), 1)]),
_: 2
}, 1024)) : createCommentVNode("", true)]), createBaseVNode("span", { class: normalizeClass([_ctx.$style.badges]) }, [
changes$1.value.currentWorkflow && file.id === changes$1.value.currentWorkflow.id ? (openBlock(), createBlock(unref(N8nBadge_default), {
key: 0,
class: "mr-2xs"
}, {
default: withCtx(() => _cache[6] || (_cache[6] = [createTextVNode(" Current workflow ")])),
_: 1
})) : createCommentVNode("", true),
file.type === unref(SOURCE_CONTROL_FILE_TYPE).workflow || file.type === unref(SOURCE_CONTROL_FILE_TYPE).credential ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [file.project ? (openBlock(), createBlock(ProjectCardBadge_default, {
key: 0,
"data-test-id": "source-control-push-modal-project-badge",
resource: castProject(file.project),
"resource-type": castType(file.type),
"resource-type-label": unref(i18n$2).baseText(`generic.${file.type}`).toLowerCase(),
"personal-project": unref(projectsStore).personalProject,
"show-badge-border": false
}, null, 8, [
"resource",
"resource-type",
"resource-type-label",
"personal-project"
])) : createCommentVNode("", true)], 64)) : createCommentVNode("", true),
createVNode(unref(N8nBadge_default), {
theme: unref(getStatusTheme)(file.status),
style: { "height": "25px" }
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(getStatusText)(file.status)), 1)]),
_: 2
}, 1032, ["theme"]),
isWorkflowDiffsEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [file.type === unref(SOURCE_CONTROL_FILE_TYPE).workflow ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 0,
content: unref(i18n$2).baseText("workflowDiff.compare"),
placement: "top"
}, {
default: withCtx(() => [createVNode(unref(N8nIconButton_default), {
"data-test-id": "source-control-workflow-diff-button",
icon: "file-diff",
type: "secondary",
onClick: ($event) => openDiffModal(file.id, file.status)
}, null, 8, ["onClick"])]),
_: 2
}, 1032, ["content"])) : createCommentVNode("", true)], 64)) : createCommentVNode("", true)
], 2)]),
_: 2
}, 1032, [
"class",
"model-value",
"onUpdate:modelValue"
])]),
_: 2
}, 1032, [
"item",
"active",
"size-dependencies",
"data-index"
])]),
_: 1
}, 8, ["class", "items"])) : createCommentVNode("", true)])], 2)])])]),
footer: withCtx(() => [
userNotices.value.length ? (openBlock(), createBlock(unref(N8nNotice_default), {
key: 0,
compact: false,
class: "mt-0",
id: "source-control-push-modal-notice"
}, {
default: withCtx(() => [
createVNode(unref(N8nText_default), {
bold: "",
size: "medium"
}, {
default: withCtx(() => _cache[7] || (_cache[7] = [createTextVNode("Changes to variables, tags, folders and projects ")])),
_: 1
}),
_cache[8] || (_cache[8] = createBaseVNode("br", null, null, -1)),
(openBlock(true), createElementBlock(Fragment, null, renderList(userNotices.value, ({ title: title$4, content: content$12 }) => {
return openBlock(), createElementBlock(Fragment, { key: title$4 }, [createVNode(unref(N8nText_default), {
bold: "",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(title$4), 1)]),
_: 2
}, 1024), createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [createTextVNode(" : " + toDisplayString(content$12) + ". ", 1)]),
_: 2
}, 1024)], 64);
}), 128))
]),
_: 1
})) : createCommentVNode("", true),
createVNode(unref(N8nText_default), {
bold: "",
tag: "p"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.push.commitMessage")), 1)]),
_: 1
}),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nInput_default), {
modelValue: commitMessage.value,
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => commitMessage.value = $event),
class: "mr-2xs",
"data-test-id": "source-control-push-modal-commit",
placeholder: unref(i18n$2).baseText("settings.sourceControl.modals.push.commitMessage.placeholder"),
onKeydown: withKeys(withModifiers(onCommitKeyDownEnter, ["stop"]), ["enter"])
}, null, 8, [
"modelValue",
"placeholder",
"onKeydown"
]), createVNode(unref(N8nButton_default), {
"data-test-id": "source-control-push-modal-submit",
type: "primary",
disabled: isSubmitDisabled.value,
size: "large",
onClick: commitAndPush
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("settings.sourceControl.modals.push.buttons.save")) + " " + toDisplayString(selectedCount.value ? `(${selectedCount.value})` : void 0), 1)]),
_: 1
}, 8, ["disabled"])], 2)
]),
_: 1
}, 8, [
"event-bus",
"name",
"height",
"custom-class"
])) : createCommentVNode("", true);
};
}
});
var SourceControlPushModal_vue_vue_type_style_index_0_lang_module_default = {
filtersRow: "_filtersRow_17gz5_123",
filters: "_filters_17gz5_123",
selectAll: "_selectAll_17gz5_136",
filtersApplied: "_filtersApplied_17gz5_142",
scroller: "_scroller_17gz5_146",
listItem: "_listItem_17gz5_151",
listItemName: "_listItemName_17gz5_161",
badges: "_badges_17gz5_181",
footer: "_footer_17gz5_187",
sourceControlPush: "_sourceControlPush_17gz5_194",
table: "_table_17gz5_201",
tableHeader: "_tableHeader_17gz5_211",
tabs: "_tabs_17gz5_217",
tab: "_tab_17gz5_201",
tabActive: "_tabActive_17gz5_245",
"popover-content": "_popover-content_17gz5_250"
};
var SourceControlPushModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SourceControlPushModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SourceControlPushModal_vue_vue_type_style_index_0_lang_module_default }]]);
var TagsTableHeader_default = /* @__PURE__ */ __plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
__name: "TagsTableHeader",
props: {
disabled: {
type: Boolean,
default: false
},
search: { default: "" }
},
emits: ["searchChange", "createEnable"],
setup(__props, { emit: __emit }) {
const i18n$2 = useI18n();
const emit = __emit;
const maxLength = ref(24);
const onAddNew = () => {
emit("createEnable");
};
const onSearchChange = (search) => {
emit("searchChange", search);
};
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(ElRow), { class: "tags-header" }, {
default: withCtx(() => [createVNode(unref(ElCol), { span: 10 }, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
placeholder: unref(i18n$2).baseText("tagsTableHeader.searchTags"),
"model-value": _ctx.search,
disabled: _ctx.disabled,
maxlength: maxLength.value,
clearable: "",
"onUpdate:modelValue": onSearchChange
}, {
prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
_: 1
}, 8, [
"placeholder",
"model-value",
"disabled",
"maxlength"
])]),
_: 1
}), createVNode(unref(ElCol), { span: 14 }, {
default: withCtx(() => [createVNode(unref(N8nButton_default), {
disabled: _ctx.disabled,
icon: "plus",
label: unref(i18n$2).baseText("tagsTableHeader.addNew"),
size: "large",
float: "right",
onClick: onAddNew
}, null, 8, ["disabled", "label"])]),
_: 1
})]),
_: 1
});
};
}
}), [["__scopeId", "data-v-02364ed2"]]);
var _hoisted_1$13 = { key: 1 };
var INPUT_TRANSITION_TIMEOUT = 350;
var DELETE_TRANSITION_TIMEOUT = 100;
var TagsTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "TagsTable",
props: {
rows: {},
isLoading: { type: Boolean },
newName: {},
isSaving: { type: Boolean },
usageColumnTitleLocaleKey: { default: "tagsTable.usage" }
},
emits: [
"updateEnable",
"newNameChange",
"deleteEnable",
"cancelOperation",
"applyOperation"
],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const i18n$2 = useI18n();
const table$2 = ref(null);
const nameInput = ref(null);
const maxLength = ref(24);
const getRowClasses = ({ row: row$3 }) => {
return row$3.disable ? "disabled" : "";
};
const getSpan = ({ row: row$3, columnIndex }) => {
if (columnIndex === 0 && row$3.tag && row$3.delete) return {
rowspan: 1,
colspan: 2
};
if (columnIndex === 1 && row$3.tag && row$3.delete) return {
rowspan: 0,
colspan: 0
};
return {
rowspan: 1,
colspan: 1
};
};
const enableUpdate = (row$3) => {
if (row$3.tag) {
emit("updateEnable", row$3.tag.id);
emit("newNameChange", row$3.tag.name);
focusOnInput();
}
};
const enableDelete = (row$3) => {
if (row$3.tag) {
emit("deleteEnable", row$3.tag.id);
focusOnDelete();
}
};
const cancel = () => {
emit("cancelOperation");
};
const apply = () => {
emit("applyOperation");
};
const onNewNameChange = (name$2) => {
emit("newNameChange", name$2);
};
const focusOnInput = () => {
setTimeout(() => {
if (nameInput.value?.focus) nameInput.value.focus();
}, INPUT_TRANSITION_TIMEOUT);
};
const focusOnDelete = () => {
setTimeout(() => {
const inputRef = nameInput.value;
if (inputRef?.focus) inputRef.focus();
}, DELETE_TRANSITION_TIMEOUT);
};
const focusOnCreate = () => {
const bodyWrapperRef = table$2.value?.$refs.bodyWrapper;
if (bodyWrapperRef) bodyWrapperRef.scrollTop = 0;
focusOnInput();
};
watch(() => props.rows, (newValue) => {
if (newValue?.[0]?.create) focusOnCreate();
});
onMounted(() => {
if (props.rows.length === 1 && props.rows[0].create) focusOnInput();
});
return (_ctx, _cache) => {
const _directive_loading = resolveDirective("loading");
return withDirectives((openBlock(), createBlock(unref(ElTable), {
ref_key: "table",
ref: table$2,
class: normalizeClass(_ctx.$style["tags-table"]),
stripe: "",
"max-height": "450",
"empty-text": unref(i18n$2).baseText("tagsTable.noMatchingTagsExist"),
data: _ctx.rows,
"span-method": getSpan,
"row-class-name": getRowClasses
}, {
default: withCtx(() => [
createVNode(unref(ElTableColumn), { label: unref(i18n$2).baseText("tagsTable.name") }, {
default: withCtx((scope) => [(openBlock(), createElementBlock("div", {
key: scope.row.id,
class: normalizeClass(_ctx.$style.name),
onKeydown: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
}, [createVNode(Transition, {
name: "fade",
mode: "out-in"
}, {
default: withCtx(() => [scope.row.create || scope.row.update ? (openBlock(), createBlock(unref(N8nInput_default), {
key: 0,
ref_key: "nameInput",
ref: nameInput,
"model-value": _ctx.newName,
maxlength: maxLength.value,
"onUpdate:modelValue": onNewNameChange
}, null, 8, ["model-value", "maxlength"])) : scope.row.delete ? (openBlock(), createElementBlock("span", _hoisted_1$13, [createBaseVNode("span", null, toDisplayString(unref(i18n$2).baseText("tagsTable.areYouSureYouWantToDeleteThisTag")), 1), createBaseVNode("input", {
ref: "deleteHiddenInput",
class: normalizeClass(_ctx.$style.hidden)
}, null, 2)])) : (openBlock(), createElementBlock("span", {
key: 2,
class: normalizeClass({ [_ctx.$style.disabled]: scope.row.disable })
}, toDisplayString(scope.row.tag.name), 3))]),
_: 2
}, 1024)], 34))]),
_: 1
}, 8, ["label"]),
createVNode(unref(ElTableColumn), {
label: unref(i18n$2).baseText(_ctx.usageColumnTitleLocaleKey),
width: "170"
}, {
default: withCtx((scope) => [createVNode(Transition, {
name: "fade",
mode: "out-in"
}, {
default: withCtx(() => [!scope.row.create && !scope.row.delete ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass({ [_ctx.$style.disabled]: scope.row.disable })
}, toDisplayString(scope.row.usage), 3)) : createCommentVNode("", true)]),
_: 2
}, 1024)]),
_: 1
}, 8, ["label"]),
createVNode(unref(ElTableColumn), null, {
default: withCtx((scope) => [createVNode(Transition, {
name: "fade",
mode: "out-in"
}, {
default: withCtx(() => [scope.row.create ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.ops)
}, [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsTable.cancel"),
type: "secondary",
disabled: _ctx.isSaving,
onClick: withModifiers(cancel, ["stop"])
}, null, 8, ["label", "disabled"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsTable.createTag"),
loading: _ctx.isSaving,
onClick: withModifiers(apply, ["stop"])
}, null, 8, ["label", "loading"])], 2)) : scope.row.update ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.ops)
}, [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsTable.cancel"),
type: "secondary",
disabled: _ctx.isSaving,
onClick: withModifiers(cancel, ["stop"])
}, null, 8, ["label", "disabled"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsTable.saveChanges"),
loading: _ctx.isSaving,
onClick: withModifiers(apply, ["stop"])
}, null, 8, ["label", "loading"])], 2)) : scope.row.delete ? (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(_ctx.$style.ops)
}, [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsTable.cancel"),
type: "secondary",
disabled: _ctx.isSaving,
onClick: withModifiers(cancel, ["stop"])
}, null, 8, ["label", "disabled"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsTable.deleteTag"),
loading: _ctx.isSaving,
onClick: withModifiers(apply, ["stop"])
}, null, 8, ["label", "loading"])], 2)) : !scope.row.disable ? (openBlock(), createElementBlock("div", {
key: 3,
class: normalizeClass([_ctx.$style.ops, _ctx.$style.main])
}, [createVNode(unref(N8nIconButton_default), {
title: unref(i18n$2).baseText("tagsTable.editTag"),
icon: "pen",
"data-test-id": "edit-tag-button",
onClick: withModifiers(($event) => enableUpdate(scope.row), ["stop"])
}, null, 8, ["title", "onClick"]), scope.row.canDelete ? (openBlock(), createBlock(unref(N8nIconButton_default), {
key: 0,
title: unref(i18n$2).baseText("tagsTable.deleteTag"),
icon: "trash-2",
"data-test-id": "delete-tag-button",
onClick: withModifiers(($event) => enableDelete(scope.row), ["stop"])
}, null, 8, ["title", "onClick"])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)]),
_: 2
}, 1024)]),
_: 1
})
]),
_: 1
}, 8, [
"class",
"empty-text",
"data"
])), [[_directive_loading, _ctx.isLoading]]);
};
}
});
const disabled = "_disabled_p819s_123";
const name$1 = "_name_p819s_127";
const ops = "_ops_p819s_133";
const main = "_main_p819s_144";
const hidden = "_hidden_p819s_153";
var TagsTable_vue_vue_type_style_index_0_lang_module_default = {
"tags-table": "_tags-table_p819s_123",
disabled,
name: name$1,
ops,
main,
hidden
};
var TagsTable_default = /* @__PURE__ */ __plugin_vue_export_helper_default(TagsTable_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": TagsTable_vue_vue_type_style_index_0_lang_module_default }], ["__scopeId", "data-v-17987132"]]);
var TagsView_default = /* @__PURE__ */ defineComponent({
name: "TagsView",
__name: "TagsView",
props: {
usageColumnTitleLocaleKey: { default: "tagsTable.usage" },
usageLocaleKey: { default: "tagsView.inUse" },
tags: {},
isLoading: { type: Boolean }
},
emits: [
"update",
"delete",
"create",
"disableCreate"
],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const matches = (name$2, filter) => name$2.toLowerCase().trim().includes(filter.toLowerCase().trim());
const i18n$2 = useI18n();
const rbacStore = useRBACStore();
const createEnabled = ref(false);
const deleteId = ref("");
const updateId = ref("");
const search = ref("");
const newName = ref("");
const stickyIds = ref(/* @__PURE__ */ new Set());
const isSaving = ref(false);
const isCreateEnabled = computed(() => props.tags.length === 0 || createEnabled.value);
const rows = computed(() => {
const getUsage = (count) => count && count > 0 ? i18n$2.baseText(props.usageLocaleKey, { adjustToNumber: count }) : i18n$2.baseText("tagsView.notBeingUsed");
const disabled$1 = isCreateEnabled.value || !!updateId.value || !!deleteId.value;
const tagRows = props.tags.filter((tag) => stickyIds.value.has(tag.id) || matches(tag.name, search.value)).map((tag) => ({
tag,
usage: getUsage(tag.usageCount),
disable: disabled$1 && tag.id !== deleteId.value && tag.id !== updateId.value,
update: disabled$1 && tag.id === updateId.value,
delete: disabled$1 && tag.id === deleteId.value,
canDelete: rbacStore.hasScope("tag:delete")
}));
return isCreateEnabled.value ? [{ create: true }, ...tagRows] : tagRows;
});
const onNewNameChange = (name$2) => {
newName.value = name$2;
};
const onSearchChange = (searchValue) => {
stickyIds.value.clear();
search.value = searchValue;
};
const isHeaderDisabled = () => {
return props.isLoading || !!(isCreateEnabled.value || updateId.value || deleteId.value);
};
const onUpdateEnable = (updateIdValue) => {
updateId.value = updateIdValue;
};
const disableUpdate = () => {
updateId.value = "";
newName.value = "";
};
const updateTag = () => {
isSaving.value = true;
const name$2 = newName.value.trim();
const onUpdate = (updated) => {
isSaving.value = false;
if (updated) {
stickyIds.value.add(updateId.value);
disableUpdate();
}
};
emit("update", updateId.value, name$2, onUpdate);
};
const onDeleteEnable = (deleteIdValue) => {
deleteId.value = deleteIdValue;
};
const disableDelete = () => {
deleteId.value = "";
};
const deleteTag = () => {
isSaving.value = true;
const onDelete = (deleted$1) => {
if (deleted$1) disableDelete();
isSaving.value = false;
};
emit("delete", deleteId.value, onDelete);
};
const onCreateEnable = () => {
createEnabled.value = true;
newName.value = "";
};
const disableCreate = () => {
createEnabled.value = false;
emit("disableCreate");
};
const createTag = () => {
isSaving.value = true;
const name$2 = newName.value.trim();
const onCreate = (created) => {
if (created) {
stickyIds.value.add(created.id);
disableCreate();
}
isSaving.value = false;
};
emit("create", name$2, onCreate);
};
const applyOperation = () => {
if (isSaving.value) return;
else if (isCreateEnabled.value) createTag();
else if (updateId.value) updateTag();
else if (deleteId.value) deleteTag();
};
const cancelOperation = () => {
if (isSaving.value) return;
else if (isCreateEnabled.value) disableCreate();
else if (updateId.value) disableUpdate();
else if (deleteId.value) disableDelete();
};
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { onKeyup: [withKeys(applyOperation, ["enter"]), withKeys(cancelOperation, ["esc"])] }, [createVNode(TagsTableHeader_default, {
search: search.value,
disabled: isHeaderDisabled(),
onSearchChange,
onCreateEnable
}, null, 8, ["search", "disabled"]), createVNode(TagsTable_default, {
ref: "tagsTable",
rows: rows.value,
"is-loading": _ctx.isLoading,
"is-saving": isSaving.value,
"new-name": newName.value,
"usage-column-title-locale-key": _ctx.usageColumnTitleLocaleKey,
"data-test-id": "tags-table",
onNewNameChange,
onUpdateEnable,
onDeleteEnable,
onCancelOperation: cancelOperation,
onApplyOperation: applyOperation
}, null, 8, [
"rows",
"is-loading",
"is-saving",
"new-name",
"usage-column-title-locale-key"
])], 32);
};
}
});
var _hoisted_1$12 = { class: "mb-s" };
var _hoisted_2$3 = { class: "description" };
var NoTagsView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "NoTagsView",
props: {
titleLocaleKey: { default: "noTagsView.readyToOrganizeYourWorkflows" },
descriptionLocaleKey: { default: "noTagsView.withWorkflowTagsYouReFree" }
},
setup(__props) {
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [createVNode(unref(ElCol), {
class: "notags",
span: 16
}, {
default: withCtx(() => [
_cache[1] || (_cache[1] = createBaseVNode("div", { class: "icon" }, "🗄️", -1)),
createBaseVNode("div", null, [createBaseVNode("div", _hoisted_1$12, [createVNode(unref(N8nHeading_default), { size: "large" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(_ctx.titleLocaleKey)), 1)]),
_: 1
})]), createBaseVNode("div", _hoisted_2$3, toDisplayString(unref(i18n$2).baseText(_ctx.descriptionLocaleKey)), 1)]),
createVNode(unref(N8nButton_default), {
label: "Create a tag",
size: "large",
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("enableCreate"))
})
]),
_: 1
})], 2);
};
}
});
var NoTagsView_vue_vue_type_style_index_0_lang_module_default = { container: "_container_1hbqb_123" };
var NoTagsView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NoTagsView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NoTagsView_vue_vue_type_style_index_0_lang_module_default }], ["__scopeId", "data-v-f3a701a0"]]);
var TagsManager_default = /* @__PURE__ */ defineComponent({
__name: "TagsManager",
props: {
modalKey: {},
usageLocaleKey: { default: "tagsView.inUse" },
usageColumnTitleLocaleKey: { default: "tagsTable.usage" },
titleLocaleKey: { default: "tagsManager.manageTags" },
noTagsTitleLocaleKey: { default: "noTagsView.readyToOrganizeYourWorkflows" },
noTagsDescriptionLocaleKey: { default: "noTagsView.withWorkflowTagsYouReFree" },
tags: {},
isLoading: { type: Boolean },
onFetchTags: {},
onCreateTag: {},
onUpdateTag: {},
onDeleteTag: {}
},
emits: ["update:tags"],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const tagIds = ref(props.tags.map((tag) => tag.id));
const isCreating = ref(false);
const modalBus = createEventBus();
const tags = computed(() => tagIds.value.map((tagId) => props.tags.find((tag) => tag.id === tagId)).filter((tag) => Boolean(tag)));
const hasTags = computed(() => tags.value.length > 0);
const i18n$2 = useI18n();
onMounted(() => {
props.onFetchTags();
});
function onEnableCreate() {
isCreating.value = true;
}
function onDisableCreate() {
isCreating.value = false;
}
async function onCreate(name$2, createCallback) {
try {
if (!name$2) throw new Error(i18n$2.baseText("tagsManager.tagNameCannotBeEmpty"));
const newTag = await props.onCreateTag(name$2);
tagIds.value = [newTag.id, ...tagIds.value];
emit("update:tags", [...props.tags, newTag]);
createCallback(newTag);
} catch (error$2) {
createCallback(null, error$2);
}
}
async function onUpdate(id, name$2, updateCallback) {
const tag = props.tags.find((t) => t.id === id);
if (!tag) {
updateCallback(false, /* @__PURE__ */ new Error("Tag not found"));
return;
}
const oldName = tag.name;
try {
if (!name$2) throw new Error(i18n$2.baseText("tagsManager.tagNameCannotBeEmpty"));
if (name$2 === oldName) {
updateCallback(true);
return;
}
const updatedTag = await props.onUpdateTag(id, name$2);
emit("update:tags", props.tags.map((t) => t.id === id ? updatedTag : t));
updateCallback(true);
} catch (error$2) {
updateCallback(false, error$2);
}
}
async function onDelete(id, deleteCallback) {
if (!props.tags.find((t) => t.id === id)) {
deleteCallback(false, /* @__PURE__ */ new Error("Tag not found"));
return;
}
try {
const deleted$1 = await props.onDeleteTag(id);
if (!deleted$1) throw new Error(i18n$2.baseText("tagsManager.couldNotDeleteTag"));
tagIds.value = tagIds.value.filter((tagId) => tagId !== id);
emit("update:tags", props.tags.filter((t) => t.id !== id));
deleteCallback(deleted$1);
} catch (error$2) {
deleteCallback(false, error$2);
}
}
function onEnter() {
if (props.isLoading) return;
else if (!hasTags.value) onEnableCreate();
else modalBus.emit("close");
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
title: unref(i18n$2).baseText(_ctx.titleLocaleKey),
name: _ctx.modalKey,
"event-bus": unref(modalBus),
"min-width": "620px",
"min-height": "420px",
onEnter
}, {
content: withCtx(() => [createVNode(unref(ElRow), null, {
default: withCtx(() => [hasTags.value || isCreating.value ? (openBlock(), createBlock(TagsView_default, {
key: 0,
"is-loading": _ctx.isLoading,
tags: tags.value,
"usage-locale-key": _ctx.usageLocaleKey,
"usage-column-title-locale-key": _ctx.usageColumnTitleLocaleKey,
onCreate,
onUpdate,
onDelete,
onDisableCreate
}, null, 8, [
"is-loading",
"tags",
"usage-locale-key",
"usage-column-title-locale-key"
])) : (openBlock(), createBlock(NoTagsView_default, {
key: 1,
"title-locale-key": _ctx.noTagsTitleLocaleKey,
"description-locale-key": _ctx.noTagsDescriptionLocaleKey,
onEnableCreate
}, null, 8, ["title-locale-key", "description-locale-key"]))]),
_: 1
})]),
footer: withCtx(({ close }) => [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("tagsManager.done"),
float: "right",
onClick: close
}, null, 8, ["label", "onClick"])]),
_: 1
}, 8, [
"title",
"name",
"event-bus"
]);
};
}
});
var AnnotationTagsManager_ee_default = /* @__PURE__ */ defineComponent({
__name: "AnnotationTagsManager.ee",
setup(__props) {
const i18n$2 = useI18n();
const { showError, showMessage } = useToast();
const tagsStore = useAnnotationTagsStore();
const tags = computed(() => tagsStore.allTags);
const isLoading = computed(() => tagsStore.isLoading);
async function fetchTags() {
try {
await tagsStore.fetchAll({
force: true,
withUsageCount: true
});
} catch (error$2) {
showError(error$2, i18n$2.baseText("tagsManager.showError.onFetch.title"), i18n$2.baseText("tagsManager.showError.onFetch.message"));
}
}
async function createTag(name$2) {
try {
return await tagsStore.create(name$2);
} catch (error$2) {
const escapedName = escape(name$2);
showError(error$2, i18n$2.baseText("tagsManager.showError.onCreate.title"), i18n$2.baseText("tagsManager.showError.onCreate.message", { interpolate: { escapedName } }) + ":");
throw error$2;
}
}
async function updateTag(id, name$2) {
try {
const updatedTag = await tagsStore.rename({
id,
name: name$2
});
showMessage({
title: i18n$2.baseText("tagsManager.showMessage.onUpdate.title"),
type: "success"
});
return updatedTag;
} catch (error$2) {
const escapedName = escape(name$2);
showError(error$2, i18n$2.baseText("tagsManager.showError.onUpdate.title"), i18n$2.baseText("tagsManager.showError.onUpdate.message", { interpolate: { escapedName } }) + ":");
throw error$2;
}
}
async function deleteTag(id) {
try {
const deleted$1 = await tagsStore.deleteTagById(id);
if (!deleted$1) throw new Error(i18n$2.baseText("tagsManager.couldNotDeleteTag"));
showMessage({
title: i18n$2.baseText("tagsManager.showMessage.onDelete.title"),
type: "success"
});
return deleted$1;
} catch (error$2) {
const tag = tagsStore.tagsById[id];
const escapedName = escape(tag?.name || "");
showError(error$2, i18n$2.baseText("tagsManager.showError.onDelete.title"), i18n$2.baseText("tagsManager.showError.onDelete.message", { interpolate: { escapedName } }) + ":");
throw error$2;
}
}
return (_ctx, _cache) => {
return openBlock(), createBlock(TagsManager_default, {
"title-locale-key": "annotationTagsManager.manageTags",
"usage-locale-key": "annotationTagsView.inUse",
"usage-column-title-locale-key": "annotationTagsView.usage",
"no-tags-title-locale-key": "noAnnotationTagsView.title",
"no-tags-description-locale-key": "noAnnotationTagsView.description",
"modal-key": unref(ANNOTATION_TAGS_MANAGER_MODAL_KEY),
tags: tags.value,
"is-loading": isLoading.value,
"on-fetch-tags": fetchTags,
"on-create-tag": createTag,
"on-update-tag": updateTag,
"on-delete-tag": deleteTag
}, null, 8, [
"modal-key",
"tags",
"is-loading"
]);
};
}
});
var WorkflowTagsManager_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowTagsManager",
setup(__props) {
const i18n$2 = useI18n();
const { showError, showMessage } = useToast();
const tagsStore = useTagsStore();
const tags = computed(() => tagsStore.allTags);
const isLoading = computed(() => tagsStore.isLoading);
async function fetchTags() {
try {
await tagsStore.fetchAll({
force: true,
withUsageCount: true
});
} catch (error$2) {
showError(error$2, i18n$2.baseText("tagsManager.showError.onFetch.title"), i18n$2.baseText("tagsManager.showError.onFetch.message"));
}
}
async function createTag(name$2) {
try {
return await tagsStore.create(name$2);
} catch (error$2) {
const escapedName = escape(name$2);
showError(error$2, i18n$2.baseText("tagsManager.showError.onCreate.title"), i18n$2.baseText("tagsManager.showError.onCreate.message", { interpolate: { escapedName } }) + ":");
throw error$2;
}
}
async function updateTag(id, name$2) {
try {
const updatedTag = await tagsStore.rename({
id,
name: name$2
});
showMessage({
title: i18n$2.baseText("tagsManager.showMessage.onUpdate.title"),
type: "success"
});
return updatedTag;
} catch (error$2) {
const escapedName = escape(name$2);
showError(error$2, i18n$2.baseText("tagsManager.showError.onUpdate.title"), i18n$2.baseText("tagsManager.showError.onUpdate.message", { interpolate: { escapedName } }) + ":");
throw error$2;
}
}
async function deleteTag(id) {
try {
const deleted$1 = await tagsStore.deleteTagById(id);
if (!deleted$1) throw new Error(i18n$2.baseText("tagsManager.couldNotDeleteTag"));
showMessage({
title: i18n$2.baseText("tagsManager.showMessage.onDelete.title"),
type: "success"
});
return deleted$1;
} catch (error$2) {
const tag = tagsStore.tagsById[id];
const escapedName = escape(tag?.name || "");
showError(error$2, i18n$2.baseText("tagsManager.showError.onDelete.title"), i18n$2.baseText("tagsManager.showError.onDelete.message", { interpolate: { escapedName } }) + ":");
throw error$2;
}
}
return (_ctx, _cache) => {
return openBlock(), createBlock(TagsManager_default, {
"modal-key": unref(TAGS_MANAGER_MODAL_KEY),
tags: tags.value,
"is-loading": isLoading.value,
"on-fetch-tags": fetchTags,
"on-create-tag": createTag,
"on-update-tag": updateTag,
"on-delete-tag": deleteTag
}, null, 8, [
"modal-key",
"tags",
"is-loading"
]);
};
}
});
var import_dateformat = /* @__PURE__ */ __toESM(require_dateformat());
var _hoisted_1$11 = ["data-test-id"];
var WhatsNewModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WhatsNewModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const articleRefs = ref({});
const pageRedirectionHelper = usePageRedirectionHelper();
const i18n$2 = useI18n();
const modalBus = createEventBus();
const versionsStore = useVersionsStore();
const uiStore = useUIStore();
const usersStore = useUsersStore();
const telemetry$1 = useTelemetry();
const nextVersions = computed(() => versionsStore.nextVersions);
const openUpdatesPanel = () => {
uiStore.openModal(VERSIONS_MODAL_KEY);
};
const onUpdateClick = async () => {
telemetry$1.track("User clicked on update button", { source: "whats-new-modal" });
await pageRedirectionHelper.goToVersions();
};
const scrollToItem = async (articleId) => {
await nextTick(() => {
const target = articleRefs.value[articleId];
if (!target) return;
target.scrollIntoView({
behavior: "smooth",
block: "start"
});
});
};
modalBus.on("opened", () => {
versionsStore.closeWhatsNewCallout();
for (const item$2 of versionsStore.whatsNewArticles) if (!versionsStore.isWhatsNewArticleRead(item$2.id)) versionsStore.setWhatsNewArticleRead(item$2.id);
scrollToItem(props.data.articleId);
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "860px",
"max-height": "85vh",
"event-bus": unref(modalBus),
name: unref(WHATS_NEW_MODAL_KEY),
center: true,
"show-close": false
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.row) }, [createVNode(unref(N8nIcon_default), {
icon: "bell",
color: "primary",
size: "large"
}), createBaseVNode("div", { class: normalizeClass(_ctx.$style.column) }, [createVNode(unref(N8nHeading_default), { size: "xlarge" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(versionsStore).whatsNew.title), 1)]),
_: 1
}), createBaseVNode("div", { class: normalizeClass(_ctx.$style.row) }, [createVNode(unref(N8nHeading_default), {
size: "medium",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(import_dateformat.default)(unref(versionsStore).latestVersion.createdAt, `d mmmm, yyyy`)), 1)]),
_: 1
}), unref(versionsStore).hasVersionUpdates ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createVNode(unref(N8nText_default), {
size: "medium",
class: normalizeClass(_ctx.$style.text),
color: "text-base"
}, {
default: withCtx(() => _cache[0] || (_cache[0] = [createTextVNode("•")])),
_: 1
}, 8, ["class"]), createVNode(unref(N8nLink_default), {
size: "medium",
theme: "primary",
"data-test-id": "whats-new-modal-next-versions-link",
onClick: openUpdatesPanel
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("whatsNew.versionsBehind", { interpolate: { count: nextVersions.value.length > 99 ? "99+" : nextVersions.value.length } })), 1)]),
_: 1
})], 64)) : createCommentVNode("", true)], 2)], 2)], 2), unref(versionsStore).hasVersionUpdates ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 0,
disabled: unref(usersStore).canUserUpdateVersion,
content: unref(i18n$2).baseText("whatsNew.updateNudgeTooltip"),
placement: "bottom"
}, {
default: withCtx(() => [createVNode(unref(N8nButton_default), {
size: "large",
label: unref(i18n$2).baseText("whatsNew.update"),
disabled: !unref(usersStore).canUserUpdateVersion,
"data-test-id": "whats-new-modal-update-button",
onClick: onUpdateClick
}, null, 8, ["label", "disabled"])]),
_: 1
}, 8, ["disabled", "content"])) : createCommentVNode("", true)], 2)]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [
unref(versionsStore).hasSignificantUpdates ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
class: normalizeClass(_ctx.$style.callout),
theme: "warning"
}, {
default: withCtx(() => [renderSlot(_ctx.$slots, "callout-message", {}, () => [createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("whatsNew.updateAvailable", { interpolate: {
currentVersion: unref(versionsStore).currentVersion?.name ?? "unknown",
latestVersion: unref(versionsStore).latestVersion?.name,
count: nextVersions.value.length
} })) + " ", 1), createVNode(unref(N8nLink_default), {
size: "small",
underline: true,
theme: "primary",
to: unref(RELEASE_NOTES_URL),
target: "_blank"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("whatsNew.updateAvailable.changelogLink")), 1)]),
_: 1
}, 8, ["to"])]),
_: 1
})])]),
_: 3
}, 8, ["class"])) : createCommentVNode("", true),
(openBlock(true), createElementBlock(Fragment, null, renderList(unref(versionsStore).whatsNewArticles, (item$2) => {
return openBlock(), createElementBlock("div", {
ref_for: true,
ref: (el) => {
if (el) articleRefs.value[item$2.id] = el;
},
key: item$2.id,
class: normalizeClass(_ctx.$style.article),
"data-test-id": `whats-new-item-${item$2.id}`
}, [createVNode(unref(N8nHeading_default), {
bold: "",
tag: "h2",
size: "xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(item$2.title), 1)]),
_: 2
}, 1024), createVNode(unref(N8nMarkdown_default), {
content: item$2.content,
class: normalizeClass(_ctx.$style.markdown),
options: {
markdown: {
html: true,
linkify: true,
typographer: true,
breaks: true
},
tasklists: { enabled: false },
linkAttributes: { attrs: {
target: "_blank",
rel: "noopener"
} },
youtube: {
width: "100%",
height: "315"
}
}
}, null, 8, ["content", "class"])], 10, _hoisted_1$11);
}), 128)),
createVNode(unref(N8nMarkdown_default), {
content: unref(versionsStore).whatsNew.footer,
class: normalizeClass(_ctx.$style.markdown),
options: {
markdown: {
html: true,
linkify: true,
typographer: true,
breaks: true
},
tasklists: { enabled: false },
linkAttributes: { attrs: {
target: "_blank",
rel: "noopener"
} },
youtube: {
width: "100%",
height: "315"
}
}
}, null, 8, ["content", "class"])
], 2)]),
_: 3
}, 8, ["event-bus", "name"]);
};
}
});
var WhatsNewModal_vue_vue_type_style_index_0_lang_module_default = {
header: "_header_mqctq_123",
column: "_column_mqctq_135",
row: "_row_mqctq_141",
container: "_container_mqctq_148",
article: "_article_mqctq_152",
markdown: "_markdown_mqctq_156"
};
var WhatsNewModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WhatsNewModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WhatsNewModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$10 = { "data-test-id": "conflicting-webhook-path" };
var WorkflowActivationConflictingWebhookModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowActivationConflictingWebhookModal",
props: { data: {} },
setup(__props) {
const modalBus = createEventBus();
const uiStore = useUIStore();
const rootStore = useRootStore();
const { data } = __props;
const webhookUrl = computed(() => {
return rootStore.webhookUrl;
});
const webhookTypeUi = computed(() => {
const suggestionBase = "and activate this one, or ";
if (data.triggerType === "n8n-nodes-base.formTrigger") return {
title: "Form",
callout: "form trigger",
suggestion: suggestionBase + "adjust the following URL path in either workflow:"
};
if (data.triggerType === "@n8n/n8n-nodes-langchain.chatTrigger") return {
title: "Chat",
callout: "chat trigger",
suggestion: suggestionBase + "insert a new Chat Trigger node in either workflow:"
};
if (data.triggerType === "n8n-nodes-base.webhook") return {
title: "Webhook",
callout: "webhook trigger",
suggestion: suggestionBase + "adjust the following URL path in either workflow:"
};
return {
title: "Trigger",
callout: "trigger",
suggestion: suggestionBase + "insert a new trigger node of the same type in either workflow:"
};
});
const workflowUrl = computed(() => {
return rootStore.urlBaseEditor + "workflow/" + data.workflowId;
});
const onClick = async () => {
uiStore.closeModal(WORKFLOW_ACTIVATION_CONFLICTING_WEBHOOK_MODAL_KEY);
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "540px",
name: unref(WORKFLOW_ACTIVATION_CONFLICTING_WEBHOOK_MODAL_KEY),
title: `Conflicting ${webhookTypeUi.value.title} Path`,
"event-bus": unref(modalBus),
center: true
}, {
content: withCtx(() => [
createVNode(unref(N8nCallout_default), {
theme: "danger",
"data-test-id": "conflicting-webhook-callout"
}, {
default: withCtx(() => [createTextVNode(" A " + toDisplayString(webhookTypeUi.value.callout) + " '" + toDisplayString(unref(data).node) + "' in the workflow '" + toDisplayString(unref(data).workflowName) + "' uses a conflicting URL path, so this workflow cannot be activated ", 1)]),
_: 1
}),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.container) }, [createBaseVNode("div", null, [
createVNode(unref(N8nText_default), { color: "text-base" }, {
default: withCtx(() => _cache[0] || (_cache[0] = [createTextVNode(" You can deactivate ")])),
_: 1
}),
createVNode(unref(N8nLink_default), {
to: workflowUrl.value,
underline: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(data).workflowName), 1)]),
_: 1
}, 8, ["to"]),
createVNode(unref(N8nText_default), {
color: "text-base",
"data-test-id": "conflicting-webhook-suggestion"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(webhookTypeUi.value.suggestion), 1)]),
_: 1
})
])], 2),
createBaseVNode("div", _hoisted_1$10, [createVNode(unref(N8nText_default), { color: "text-light" }, {
default: withCtx(() => [createTextVNode(toDisplayString(webhookUrl.value) + "/", 1)]),
_: 1
}), createVNode(unref(N8nText_default), {
color: "text-dark",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(data).webhookPath), 1)]),
_: 1
})])
]),
footer: withCtx(() => [createVNode(unref(N8nButton_default), {
label: "Done",
size: "medium",
float: "right",
"data-test-id": "close-button",
onClick
})]),
_: 1
}, 8, [
"name",
"title",
"event-bus"
]);
};
}
});
var WorkflowActivationConflictingWebhookModal_vue_vue_type_style_index_0_lang_module_default = { container: "_container_19d1u_123" };
var WorkflowActivationConflictingWebhookModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowActivationConflictingWebhookModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowActivationConflictingWebhookModal_vue_vue_type_style_index_0_lang_module_default }]]);
var DEFAULT_WORKFLOW_NAME = "My Sub-workflow";
var WorkflowExtractionNameModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowExtractionNameModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const toast = useToast();
const modalBus = createEventBus();
const workflowExtraction = useWorkflowExtraction();
const workflowName = ref(DEFAULT_WORKFLOW_NAME);
const initiatedExtraction = ref(false);
const workflowNameOrDefault = computed(() => {
if (workflowName.value) return workflowName.value;
return DEFAULT_WORKFLOW_NAME;
});
const onSubmit = async () => {
if (initiatedExtraction.value) return;
initiatedExtraction.value = true;
const { selection, subGraph } = props.data;
try {
await workflowExtraction.extractNodesIntoSubworkflow(selection, subGraph, workflowNameOrDefault.value);
} catch (e) {
toast.showError(e, i18n$2.baseText("workflowExtraction.error.failure"));
} finally {
modalBus.emit("close");
}
};
const inputRef = ref(null);
onMounted(() => {
setTimeout(() => {
inputRef.value?.inputRef?.select();
inputRef.value?.inputRef?.focus();
});
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "540px",
title: unref(i18n$2).baseText("workflowExtraction.modal.description", { adjustToNumber: props.data.subGraph.length }),
"event-bus": unref(modalBus),
name: unref(WORKFLOW_EXTRACTION_NAME_MODAL_KEY),
center: true,
"close-on-click-modal": false
}, {
content: withCtx(() => [createVNode(unref(N8nFormInput_default), {
ref_key: "inputRef",
ref: inputRef,
modelValue: workflowName.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => workflowName.value = $event),
name: "key",
label: "",
"max-length": "128",
"focus-initially": "",
onEnter: onSubmit
}, null, 8, ["modelValue"])]),
footer: withCtx(({ close }) => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
type: "secondary",
label: unref(i18n$2).baseText("generic.cancel"),
float: "right",
"data-test-id": "cancel-button",
onClick: close
}, null, 8, ["label", "onClick"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("generic.confirm"),
float: "right",
disabled: !workflowName.value,
"data-test-id": "submit-button",
onClick: onSubmit
}, null, 8, ["label", "disabled"])], 2)]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var WorkflowExtractionNameModal_vue_vue_type_style_index_0_lang_module_default = {
row: "_row_1lyi3_123",
container: "_container_1lyi3_127",
description: "_description_1lyi3_131",
footer: "_footer_1lyi3_136"
};
var WorkflowExtractionNameModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowExtractionNameModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowExtractionNameModal_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowHistoryVersionRestoreModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowHistoryVersionRestoreModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const uiStore = useUIStore();
const closeModal = () => {
uiStore.closeModal(props.modalName);
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
name: props.modalName,
"before-close": props.data.beforeClose
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), {
tag: "h2",
size: "xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowHistory.action.restore.modal.title")), 1)]),
_: 1
})]),
content: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [
createVNode(unref(I18nT), {
keypath: "workflowHistory.action.restore.modal.subtitle",
tag: "span",
scope: "global"
}, {
date: withCtx(() => [createBaseVNode("strong", null, toDisplayString(props.data.formattedCreatedAt), 1)]),
_: 1
}),
_cache[0] || (_cache[0] = createBaseVNode("br", null, null, -1)),
_cache[1] || (_cache[1] = createBaseVNode("br", null, null, -1)),
props.data.isWorkflowActivated ? (openBlock(), createBlock(unref(I18nT), {
key: 0,
keypath: "workflowHistory.action.restore.modal.publishedNote",
tag: "span",
scope: "global"
})) : createCommentVNode("", true)
]),
_: 1
})])]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(props.data.buttons, (button$1, index) => {
return openBlock(), createBlock(unref(N8nButton_default), {
key: index,
size: "medium",
type: button$1.type,
onClick: () => {
button$1.action();
closeModal();
}
}, {
default: withCtx(() => [createTextVNode(toDisplayString(button$1.text), 1)]),
_: 2
}, 1032, ["type", "onClick"]);
}), 128))], 2)]),
_: 1
}, 8, ["name", "before-close"]);
};
}
});
var WorkflowHistoryVersionRestoreModal_vue_vue_type_style_index_0_lang_module_default = { footer: "_footer_8dn0c_123" };
var WorkflowHistoryVersionRestoreModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowHistoryVersionRestoreModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowHistoryVersionRestoreModal_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowHistoryVersionUnpublishModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowHistoryVersionUnpublishModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const uiStore = useUIStore();
const unpublishing = ref(false);
const closeModal = () => {
uiStore.closeModal(props.modalName);
};
const onCancel = () => {
props.data.eventBus.emit("cancel");
closeModal();
};
const onUnpublish = () => {
unpublishing.value = true;
props.data.eventBus.emit("unpublish");
};
onBeforeUnmount(() => {
unpublishing.value = false;
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
name: props.modalName,
"before-close": onCancel
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), {
tag: "h2",
size: "xlarge"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowHistory.action.unpublish.modal.title", { interpolate: { versionName: props.data.versionName || "" } })), 1)]),
_: 1
})]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [createVNode(unref(N8nIcon_default), {
class: normalizeClass(_ctx.$style.icon),
icon: "triangle-alert",
color: "warning",
size: "xlarge"
}, null, 8, ["class"]), createVNode(unref(N8nText_default), { size: "medium" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowHistory.action.unpublish.modal.description", { interpolate: { versionName: props.data.versionName || "" } })), 1)]),
_: 1
})], 2)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
size: "medium",
type: "tertiary",
disabled: unpublishing.value,
onClick: onCancel
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.cancel")), 1)]),
_: 1
}, 8, ["disabled"]), createVNode(unref(N8nButton_default), {
size: "medium",
type: "primary",
loading: unpublishing.value,
onClick: onUnpublish
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowHistory.action.unpublish.modal.button.unpublish")), 1)]),
_: 1
}, 8, ["loading"])], 2)]),
_: 1
}, 8, ["name"]);
};
}
});
var WorkflowHistoryVersionUnpublishModal_vue_vue_type_style_index_0_lang_module_default = {
footer: "_footer_uspcc_123",
content: "_content_uspcc_132",
icon: "_icon_uspcc_139"
};
var WorkflowHistoryVersionUnpublishModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowHistoryVersionUnpublishModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowHistoryVersionUnpublishModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$9 = ["textContent"];
var _hoisted_2$2 = ["disabled"];
var _hoisted_3$1 = {
key: 1,
"data-test-id": "workflow-caller-policy"
};
var _hoisted_4$1 = ["textContent"];
var _hoisted_5 = ["textContent"];
var _hoisted_6 = ["textContent"];
var _hoisted_7 = ["textContent"];
var _hoisted_8 = ["textContent"];
var _hoisted_9 = ["textContent"];
var _hoisted_10 = ["textContent"];
var _hoisted_11 = ["textContent"];
var _hoisted_12 = {
key: 2,
"data-test-id": "workflow-settings-timeout-form"
};
var _hoisted_13 = ["textContent"];
var _hoisted_14 = { for: "availableInMCP" };
var _hoisted_15 = { for: "timeSavedPerExecution" };
var _hoisted_16 = { class: "ignore-key-press-canvas" };
var WorkflowSettings_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowSettings",
setup(__props) {
const route = useRoute();
const i18n$2 = useI18n();
const externalHooks = useExternalHooks();
const toast = useToast();
const modalBus = createEventBus();
const telemetry$1 = useTelemetry();
const { isEligibleForMcpAccess, trackMcpAccessEnabledForWorkflow, mcpTriggerMap } = useMcp();
const { registerCustomAction, unregisterCustomAction } = useGlobalLinkActions();
const { check: checkEnvFeatureFlag } = useEnvFeatureFlag();
const rootStore = useRootStore();
const settingsStore = useSettingsStore();
const sourceControlStore = useSourceControlStore();
const workflowsStore = useWorkflowsStore();
const workflowState = injectWorkflowState();
const workflowsEEStore = useWorkflowsEEStore();
const nodeCreatorStore = useNodeCreatorStore();
const isLoading = ref(true);
const workflowCallerPolicyOptions = ref([]);
const saveDataErrorExecutionOptions = ref([]);
const saveDataSuccessExecutionOptions = ref([]);
const saveExecutionProgressOptions = ref([]);
const saveManualOptions = ref([]);
const executionOrderOptions = ref([{
key: "v0",
value: "v0 (legacy)"
}, {
key: "v1",
value: "v1 (recommended)"
}]);
const timezones = ref([]);
const workflowSettings = ref({});
const workflows = ref([]);
const credentialResolverSelectRef = ref(null);
const { resolvers: credentialResolvers, fetchResolvers: loadCredentialResolvers, openCreateModal, openEditModal } = useCredentialResolvers();
const executionTimeout = ref(0);
const maxExecutionTimeout = ref(0);
const timeoutHMS = ref({
hours: 0,
minutes: 0,
seconds: 0
});
const helpTexts = computed(() => ({
errorWorkflow: i18n$2.baseText("workflowSettings.helpTexts.errorWorkflow"),
timezone: i18n$2.baseText("workflowSettings.helpTexts.timezone"),
credentialResolver: i18n$2.baseText("workflowSettings.helpTexts.credentialResolver"),
saveDataErrorExecution: i18n$2.baseText("workflowSettings.helpTexts.saveDataErrorExecution"),
saveDataSuccessExecution: i18n$2.baseText("workflowSettings.helpTexts.saveDataSuccessExecution"),
saveExecutionProgress: i18n$2.baseText("workflowSettings.helpTexts.saveExecutionProgress"),
saveManualExecutions: i18n$2.baseText("workflowSettings.helpTexts.saveManualExecutions"),
executionTimeoutToggle: i18n$2.baseText("workflowSettings.helpTexts.executionTimeoutToggle"),
executionTimeout: i18n$2.baseText("workflowSettings.helpTexts.executionTimeout"),
workflowCallerPolicy: i18n$2.baseText("workflowSettings.helpTexts.workflowCallerPolicy"),
workflowCallerIds: i18n$2.baseText("workflowSettings.helpTexts.workflowCallerIds")
}));
const defaultValues = ref({
timezone: "America/New_York",
saveDataErrorExecution: "all",
saveDataSuccessExecution: "all",
saveExecutionProgress: false,
saveManualExecutions: false,
workflowCallerPolicy: "workflowsFromSameOwner",
availableInMCP: false
});
const isMCPEnabled = computed(() => settingsStore.isModuleActive("mcp") && settingsStore.moduleSettings.mcp?.mcpAccessEnabled);
const isCredentialResolverEnabled = computed(() => checkEnvFeatureFlag.value("DYNAMIC_CREDENTIALS"));
const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
const workflowName = computed(() => workflowsStore.workflowName);
const workflowId = computed(() => workflowsStore.workflowId);
const workflow = computed(() => workflowsStore.getWorkflowById(workflowId.value));
const isSharingEnabled = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]);
const workflowOwnerName = computed(() => {
const fallback = i18n$2.baseText("workflowSettings.callerPolicy.options.workflowsFromSameProject");
return workflowsEEStore.getWorkflowOwnerName(`${workflowId.value}`, fallback);
});
const workflowPermissions = computed(() => getResourcePermissions(workflow.value?.scopes).workflow);
const mcpToggleDisabled = computed(() => {
return readOnlyEnv.value || !workflowPermissions.value.update || !isEligibleForMcp.value;
});
const mcpToggleTooltip = computed(() => {
if (!isEligibleForMcp.value) return i18n$2.baseText("mcp.workflowNotEligable.description", { interpolate: { triggers: Object.values(mcpTriggerMap).join(", ") } });
return i18n$2.baseText("workflowSettings.availableInMCP.tooltip");
});
const isEligibleForMcp = computed(() => {
if (!workflow?.value?.active) return false;
return isEligibleForMcpAccess(workflow.value);
});
const savedTimeNodes = computed(() => {
if (!workflow?.value?.nodes) return [];
return workflow.value.nodes.filter((node) => node.type === "n8n-nodes-base.timeSaved" && node.disabled !== true);
});
const hasSavedTimeNodes = computed(() => {
return savedTimeNodes.value.length > 0;
});
const timeSavedModeOptions = computed(() => [{
label: "Fixed",
value: "fixed"
}, {
label: "Dynamic (uses time saved nodes)",
value: "dynamic"
}]);
const onCallerIdsInput = (str) => {
workflowSettings.value.callerIds = /^[a-zA-Z0-9,\s]+$/.test(str) ? str : str.replace(/[^a-zA-Z0-9,\s]/g, "");
};
const closeDialog = () => {
modalBus.emit("close");
externalHooks.run("workflowSettings.dialogVisibleChanged", { dialogVisible: false });
};
const setTheTimeout = (key, value) => {
const time = value ? parseInt(value, 10) : 0;
timeoutHMS.value = {
...timeoutHMS.value,
[key]: time
};
};
const loadWorkflowCallerPolicyOptions = async () => {
workflowCallerPolicyOptions.value = [
{
key: "none",
value: i18n$2.baseText("workflowSettings.callerPolicy.options.none")
},
{
key: "workflowsFromSameOwner",
value: i18n$2.baseText(workflow.value.homeProject?.type === ProjectTypes.Personal ? "workflowSettings.callerPolicy.options.workflowsFromPersonalProject" : "workflowSettings.callerPolicy.options.workflowsFromTeamProject", { interpolate: { projectName: workflowOwnerName.value } })
},
{
key: "workflowsFromAList",
value: i18n$2.baseText("workflowSettings.callerPolicy.options.workflowsFromAList")
},
{
key: "any",
value: i18n$2.baseText("workflowSettings.callerPolicy.options.any")
}
];
};
const loadSaveDataErrorExecutionOptions = async () => {
saveDataErrorExecutionOptions.value = [
{
key: "DEFAULT",
value: i18n$2.baseText("workflowSettings.saveDataErrorExecutionOptions.defaultSave", { interpolate: { defaultValue: defaultValues.value.saveDataErrorExecution === "all" ? i18n$2.baseText("workflowSettings.saveDataErrorExecutionOptions.save") : i18n$2.baseText("workflowSettings.saveDataErrorExecutionOptions.doNotSave") } })
},
{
key: "all",
value: i18n$2.baseText("workflowSettings.saveDataErrorExecutionOptions.save")
},
{
key: "none",
value: i18n$2.baseText("workflowSettings.saveDataErrorExecutionOptions.doNotSave")
}
];
};
const loadSaveDataSuccessExecutionOptions = async () => {
saveDataSuccessExecutionOptions.value = [
{
key: "DEFAULT",
value: i18n$2.baseText("workflowSettings.saveDataSuccessExecutionOptions.defaultSave", { interpolate: { defaultValue: defaultValues.value.saveDataSuccessExecution === "all" ? i18n$2.baseText("workflowSettings.saveDataSuccessExecutionOptions.save") : i18n$2.baseText("workflowSettings.saveDataSuccessExecutionOptions.doNotSave") } })
},
{
key: "all",
value: i18n$2.baseText("workflowSettings.saveDataSuccessExecutionOptions.save")
},
{
key: "none",
value: i18n$2.baseText("workflowSettings.saveDataSuccessExecutionOptions.doNotSave")
}
];
};
const loadSaveExecutionProgressOptions = async () => {
saveExecutionProgressOptions.value = [
{
key: "DEFAULT",
value: i18n$2.baseText("workflowSettings.saveExecutionProgressOptions.defaultSave", { interpolate: { defaultValue: defaultValues.value.saveExecutionProgress ? i18n$2.baseText("workflowSettings.saveExecutionProgressOptions.save") : i18n$2.baseText("workflowSettings.saveExecutionProgressOptions.doNotSave") } })
},
{
key: true,
value: i18n$2.baseText("workflowSettings.saveExecutionProgressOptions.save")
},
{
key: false,
value: i18n$2.baseText("workflowSettings.saveExecutionProgressOptions.doNotSave")
}
];
};
const loadSaveManualOptions = async () => {
saveManualOptions.value = [
{
key: "DEFAULT",
value: i18n$2.baseText("workflowSettings.saveManualOptions.defaultSave", { interpolate: { defaultValue: defaultValues.value.saveManualExecutions ? i18n$2.baseText("workflowSettings.saveManualOptions.save") : i18n$2.baseText("workflowSettings.saveManualOptions.doNotSave") } })
},
{
key: true,
value: i18n$2.baseText("workflowSettings.saveManualOptions.save")
},
{
key: false,
value: i18n$2.baseText("workflowSettings.saveManualOptions.doNotSave")
}
];
};
const loadTimezones = async () => {
if (timezones.value.length !== 0) return;
const timezonesData = await settingsStore.getTimezones();
let defaultTimezoneValue = timezonesData[defaultValues.value.timezone];
if (defaultTimezoneValue === void 0) defaultTimezoneValue = i18n$2.baseText("workflowSettings.defaultTimezoneNotValid");
timezones.value.push({
key: "DEFAULT",
value: i18n$2.baseText("workflowSettings.defaultTimezone", { interpolate: { defaultTimezoneValue } })
});
for (const timezone of Object.keys(timezonesData)) timezones.value.push({
key: timezone,
value: timezonesData[timezone]
});
};
const loadWorkflows = async (searchTerm) => {
const workflowsData = await workflowsStore.searchWorkflows({
query: searchTerm,
isArchived: false,
triggerNodeTypes: ["n8n-nodes-base.errorTrigger"]
});
workflowsData.sort((a, b) => {
if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;
if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;
return 0;
});
workflowsData.unshift({
id: void 0,
name: i18n$2.baseText("workflowSettings.noWorkflow")
});
workflows.value = workflowsData;
};
const handleCreateNewResolver = async () => {
credentialResolverSelectRef.value?.blur();
await nextTick();
openCreateModal({ onSave: async (resolverId) => {
await loadCredentialResolvers();
workflowSettings.value.credentialResolverId = resolverId;
} });
};
const handleEditResolver = async () => {
if (!workflowSettings.value.credentialResolverId) return;
openEditModal(workflowSettings.value.credentialResolverId, {
onSave: loadCredentialResolvers,
onDelete: async (deletedResolverId) => {
await loadCredentialResolvers();
if (workflowSettings.value.credentialResolverId === deletedResolverId) workflowSettings.value.credentialResolverId = void 0;
}
});
};
const { debounce } = useDebounce();
const debouncedLoadWorkflows = debounce(loadWorkflows, {
debounceTime: 300,
trailing: true
});
const convertToHMS = (num) => {
if (num > 0) {
const hours = Math.floor(num / 3600);
const remainder = num % 3600;
return {
hours,
minutes: Math.floor(remainder / 60),
seconds: remainder % 60
};
}
return {
hours: 0,
minutes: 0,
seconds: 0
};
};
const saveSettings = async () => {
const data = { settings: workflowSettings.value };
const { hours, minutes, seconds } = timeoutHMS.value;
data.settings.executionTimeout = data.settings.executionTimeout !== -1 ? hours * 3600 + minutes * 60 + seconds : -1;
if (data.settings.executionTimeout === 0) {
toast.showError(new Error(i18n$2.baseText("workflowSettings.showError.saveSettings1.errorMessage")), i18n$2.baseText("workflowSettings.showError.saveSettings1.title"), i18n$2.baseText("workflowSettings.showError.saveSettings1.message") + ":");
return;
}
if (workflowSettings.value?.maxExecutionTimeout && data.settings.executionTimeout > workflowSettings.value?.maxExecutionTimeout) {
const convertedMaxExecutionTimeout = convertToHMS(workflowSettings.value.maxExecutionTimeout);
toast.showError(new Error(i18n$2.baseText("workflowSettings.showError.saveSettings2.errorMessage", { interpolate: {
hours: convertedMaxExecutionTimeout.hours.toString(),
minutes: convertedMaxExecutionTimeout.minutes.toString(),
seconds: convertedMaxExecutionTimeout.seconds.toString()
} })), i18n$2.baseText("workflowSettings.showError.saveSettings2.title"), i18n$2.baseText("workflowSettings.showError.saveSettings2.message") + ":");
return;
}
delete data.settings.maxExecutionTimeout;
isLoading.value = true;
data.versionId = workflowsStore.workflowVersionId;
data.expectedChecksum = workflowsStore.workflowChecksum;
try {
await workflowsStore.updateWorkflow(String(route.params.name), data);
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("workflowSettings.showError.saveSettings3.title"));
isLoading.value = false;
return;
}
const localWorkflowSettings = Object.fromEntries(Object.entries(workflowSettings.value).filter(([, value]) => value !== "DEFAULT"));
const oldSettings = deepCopy(workflowsStore.workflowSettings);
workflowState.setWorkflowSettings(localWorkflowSettings);
isLoading.value = false;
toast.showMessage({
title: i18n$2.baseText("workflowSettings.showMessage.saveSettings.title"),
type: "success"
});
closeDialog();
externalHooks.run("workflowSettings.saveSettings", { oldSettings });
telemetry$1.track("User updated workflow settings", {
workflow_id: workflowsStore.workflowId,
time_saved: workflowSettings.value.timeSavedPerExecution ?? "",
error_workflow: workflowSettings.value.errorWorkflow ?? ""
});
if (isMCPEnabled.value && workflowSettings.value.availableInMCP) trackMcpAccessEnabledForWorkflow(workflowId.value);
};
const toggleTimeout = () => {
workflowSettings.value.executionTimeout = workflowSettings.value.executionTimeout === -1 ? 0 : -1;
};
const toggleAvailableInMCP = () => {
workflowSettings.value.availableInMCP = !workflowSettings.value.availableInMCP;
};
const updateTimeSavedPerExecution = (value) => {
const numValue = parseInt(value, 10);
workflowSettings.value.timeSavedPerExecution = isNaN(numValue) ? void 0 : numValue < 0 ? 0 : numValue;
};
onMounted(async () => {
executionTimeout.value = rootStore.executionTimeout;
maxExecutionTimeout.value = rootStore.maxExecutionTimeout;
if (!workflowsStore.isWorkflowSaved[workflowsStore.workflowId]) {
toast.showMessage({
title: "No workflow active",
message: "No workflow active to display settings of.",
type: "error",
duration: 0
});
closeDialog();
return;
}
defaultValues.value.saveDataErrorExecution = settingsStore.saveDataErrorExecution;
defaultValues.value.saveDataSuccessExecution = settingsStore.saveDataSuccessExecution;
defaultValues.value.saveManualExecutions = settingsStore.saveManualExecutions;
defaultValues.value.saveExecutionProgress = settingsStore.saveDataProgressExecution;
defaultValues.value.timezone = rootStore.timezone;
defaultValues.value.workflowCallerPolicy = settingsStore.workflowCallerPolicyDefaultOption;
isLoading.value = true;
try {
const promises = [
workflowsStore.fetchWorkflow(workflowId.value),
loadWorkflows(),
loadSaveDataErrorExecutionOptions(),
loadSaveDataSuccessExecutionOptions(),
loadSaveExecutionProgressOptions(),
loadSaveManualOptions(),
loadTimezones(),
loadWorkflowCallerPolicyOptions()
];
if (isCredentialResolverEnabled.value) promises.push(loadCredentialResolvers());
await Promise.all(promises);
} catch (error$2) {
toast.showError(error$2, "Problem loading settings", "The following error occurred loading the data:");
}
const workflowSettingsData = deepCopy(workflowsStore.workflowSettings);
if (workflowSettingsData.timeSavedMode === void 0) workflowSettingsData.timeSavedMode = "fixed";
if (workflowSettingsData.timezone === void 0) workflowSettingsData.timezone = "DEFAULT";
if (workflowSettingsData.saveDataErrorExecution === void 0) workflowSettingsData.saveDataErrorExecution = "DEFAULT";
if (workflowSettingsData.saveDataSuccessExecution === void 0) workflowSettingsData.saveDataSuccessExecution = "DEFAULT";
if (workflowSettingsData.saveExecutionProgress === void 0) workflowSettingsData.saveExecutionProgress = "DEFAULT";
if (workflowSettingsData.saveManualExecutions === void 0) workflowSettingsData.saveManualExecutions = "DEFAULT";
if (workflowSettingsData.callerPolicy === void 0) workflowSettingsData.callerPolicy = defaultValues.value.workflowCallerPolicy;
if (workflowSettingsData.executionTimeout === void 0) workflowSettingsData.executionTimeout = rootStore.executionTimeout;
if (workflowSettingsData.maxExecutionTimeout === void 0) workflowSettingsData.maxExecutionTimeout = rootStore.maxExecutionTimeout;
if (workflowSettingsData.executionOrder === void 0) workflowSettingsData.executionOrder = "v0";
if (workflowSettingsData.availableInMCP === void 0) workflowSettingsData.availableInMCP = defaultValues.value.availableInMCP;
workflowSettings.value = workflowSettingsData;
timeoutHMS.value = convertToHMS(workflowSettingsData.executionTimeout);
isLoading.value = false;
externalHooks.run("workflowSettings.dialogVisibleChanged", { dialogVisible: true });
telemetry$1.track("User opened workflow settings", { workflow_id: workflowsStore.workflowId });
registerCustomAction({
key: "openSavedTimeNodeCreator",
action: () => {
closeDialog();
nodeCreatorStore.openNodeCreatorForRegularNodes(NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION);
}
});
});
onBeforeUnmount(() => {
debouncedLoadWorkflows.cancel?.();
unregisterCustomAction("openSavedTimeNodeCreator");
});
return (_ctx, _cache) => {
const _directive_n8n_html = resolveDirective("n8n-html");
const _directive_loading = resolveDirective("loading");
return openBlock(), createBlock(Modal_default, {
name: unref(WORKFLOW_SETTINGS_MODAL_KEY),
width: "65%",
"max-height": "80%",
title: unref(i18n$2).baseText("workflowSettings.settingsFor", { interpolate: {
workflowName: workflowName.value,
workflowId: workflowId.value
} }),
"event-bus": unref(modalBus),
scrollable: true
}, {
content: withCtx(() => [withDirectives((openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style["workflow-settings"]),
"data-test-id": "workflow-settings-dialog"
}, [
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.executionOrder")), 1)]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.executionOrder,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => workflowSettings.value.executionOrder = $event),
placeholder: "Select Execution Order",
size: "medium",
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-execution-order"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(executionOrderOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.key,
label: option.value,
value: option.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, ["modelValue", "disabled"])]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), { "data-test-id": "error-workflow" }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.errorWorkflow")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [withDirectives(createBaseVNode("div", null, null, 512), [[_directive_n8n_html, helpTexts.value.errorWorkflow]])]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.errorWorkflow,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => workflowSettings.value.errorWorkflow = $event),
placeholder: "Select Workflow",
filterable: "",
remote: "",
"remote-method": unref(debouncedLoadWorkflows),
"remote-show-suffix": "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-error-workflow"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(workflows.value, (item$2) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: item$2.id,
label: item$2.name,
value: item$2.id,
disabled: item$2.active === false
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.optionContent) }, [createBaseVNode("span", null, toDisplayString(item$2.name), 1), item$2.active === false ? (openBlock(), createBlock(unref(N8nTooltip_default), {
key: 0,
content: unref(i18n$2).baseText("resourceLocator.workflow.inactive.tooltip"),
placement: "top"
}, {
default: withCtx(() => [createVNode(unref(N8nIcon_default), {
icon: "triangle-alert",
size: "small",
class: normalizeClass(_ctx.$style.inactiveIcon)
}, null, 8, ["class"])]),
_: 1
}, 8, ["content"])) : createCommentVNode("", true)], 2)]),
_: 2
}, 1032, [
"label",
"value",
"disabled"
]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"remote-method",
"disabled"
])]),
_: 1
})]),
_: 1
}),
isCredentialResolverEnabled.value ? (openBlock(), createBlock(unref(ElRow), {
key: 0,
"data-test-id": "credential-resolver"
}, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.credentialResolver")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.credentialResolver) }, null, 8, _hoisted_1$9)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["credential-resolver-container"]) }, [createVNode(unref(N8nSelect_default), {
ref_key: "credentialResolverSelectRef",
ref: credentialResolverSelectRef,
modelValue: workflowSettings.value.credentialResolverId,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => workflowSettings.value.credentialResolverId = $event),
placeholder: unref(i18n$2).baseText("workflowSettings.credentialResolver.placeholder"),
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-credential-resolver"
}, {
footer: withCtx(() => [createBaseVNode("button", {
type: "button",
class: normalizeClass(_ctx.$style["create-new-button"]),
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"data-test-id": "workflow-settings-credential-resolver-create-new",
onClick: handleCreateNewResolver
}, [createVNode(unref(N8nIcon_default), {
size: "xsmall",
icon: "plus"
}), createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("workflowSettings.credentialResolver.createNew")), 1)], 10, _hoisted_2$2)]),
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(credentialResolvers), (resolver) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: resolver.id,
label: resolver.name,
value: resolver.id
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"placeholder",
"disabled"
]), workflowSettings.value.credentialResolverId ? (openBlock(), createBlock(unref(N8nIconButton_default), {
key: 0,
icon: "pen",
type: "tertiary",
text: true,
size: "small",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
title: unref(i18n$2).baseText("workflowSettings.credentialResolver.edit"),
"data-test-id": "workflow-settings-credential-resolver-edit",
onClick: handleEditResolver
}, null, 8, ["disabled", "title"])) : createCommentVNode("", true)], 2)]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true),
isSharingEnabled.value ? (openBlock(), createElementBlock("div", _hoisted_3$1, [createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.callerPolicy")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.workflowCallerPolicy) }, null, 8, _hoisted_4$1)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.callerPolicy,
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => workflowSettings.value.callerPolicy = $event),
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
placeholder: unref(i18n$2).baseText("workflowSettings.selectOption"),
filterable: "",
"limit-popper-width": true
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(workflowCallerPolicyOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.key,
label: option.value,
value: option.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"disabled",
"placeholder"
])]),
_: 1
})]),
_: 1
}), workflowSettings.value.callerPolicy === "workflowsFromAList" ? (openBlock(), createBlock(unref(ElRow), { key: 0 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.callerIds")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.workflowCallerIds) }, null, 8, _hoisted_5)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), { span: 14 }, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
modelValue: workflowSettings.value.callerIds,
"onUpdate:modelValue": [_cache[4] || (_cache[4] = ($event) => workflowSettings.value.callerIds = $event), onCallerIdsInput],
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
placeholder: unref(i18n$2).baseText("workflowSettings.callerIds.placeholder"),
type: "text",
"data-test-id": "workflow-caller-policy-workflow-ids"
}, null, 8, [
"modelValue",
"disabled",
"placeholder"
])]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true)])) : createCommentVNode("", true),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.timezone")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.timezone) }, null, 8, _hoisted_6)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.timezone,
"onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => workflowSettings.value.timezone = $event),
placeholder: "Select Timezone",
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-timezone"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(timezones.value, (timezone) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: timezone.key,
label: timezone.value,
value: timezone.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, ["modelValue", "disabled"])]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.saveDataErrorExecution")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.saveDataErrorExecution) }, null, 8, _hoisted_7)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.saveDataErrorExecution,
"onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => workflowSettings.value.saveDataErrorExecution = $event),
placeholder: unref(i18n$2).baseText("workflowSettings.selectOption"),
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-save-failed-executions"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(saveDataErrorExecutionOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.key,
label: option.value,
value: option.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"placeholder",
"disabled"
])]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.saveDataSuccessExecution")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.saveDataSuccessExecution) }, null, 8, _hoisted_8)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.saveDataSuccessExecution,
"onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => workflowSettings.value.saveDataSuccessExecution = $event),
placeholder: unref(i18n$2).baseText("workflowSettings.selectOption"),
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-save-success-executions"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(saveDataSuccessExecutionOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.key,
label: option.value,
value: option.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"placeholder",
"disabled"
])]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.saveManualExecutions")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.saveManualExecutions) }, null, 8, _hoisted_9)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.saveManualExecutions,
"onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => workflowSettings.value.saveManualExecutions = $event),
placeholder: unref(i18n$2).baseText("workflowSettings.selectOption"),
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-save-manual-executions"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(saveManualOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: `${option.key}`,
label: option.value,
value: option.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"placeholder",
"disabled"
])]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.saveExecutionProgress")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.saveExecutionProgress) }, null, 8, _hoisted_10)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), {
span: 14,
class: "ignore-key-press-canvas"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.saveExecutionProgress,
"onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => workflowSettings.value.saveExecutionProgress = $event),
placeholder: unref(i18n$2).baseText("workflowSettings.selectOption"),
filterable: "",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"limit-popper-width": true,
"data-test-id": "workflow-settings-save-execution-progress"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(saveExecutionProgressOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: `${option.key}`,
label: option.value,
value: option.key
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, [
"modelValue",
"placeholder",
"disabled"
])]),
_: 1
})]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.timeoutWorkflow")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.executionTimeoutToggle) }, null, 8, _hoisted_11)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), { span: 14 }, {
default: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(ElSwitch), {
ref: "inputField",
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"model-value": (workflowSettings.value.executionTimeout ?? -1) > -1,
"data-test-id": "workflow-settings-timeout-workflow",
"onUpdate:modelValue": toggleTimeout
}, null, 8, ["disabled", "model-value"])])]),
_: 1
})]),
_: 1
}),
(workflowSettings.value.executionTimeout ?? -1) > -1 ? (openBlock(), createElementBlock("div", _hoisted_12, [createVNode(unref(ElRow), null, {
default: withCtx(() => [
createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.timeoutAfter")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createBaseVNode("div", { textContent: toDisplayString(helpTexts.value.executionTimeout) }, null, 8, _hoisted_13)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})]),
_: 1
}, 8, ["class"]),
createVNode(unref(ElCol), { span: 4 }, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"model-value": timeoutHMS.value.hours,
min: 0,
"onUpdate:modelValue": _cache[10] || (_cache[10] = (value) => setTheTimeout("hours", value))
}, {
append: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.hours")), 1)]),
_: 1
}, 8, ["disabled", "model-value"])]),
_: 1
}),
createVNode(unref(ElCol), {
span: 4,
class: normalizeClass(_ctx.$style["timeout-input"])
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"model-value": timeoutHMS.value.minutes,
min: 0,
max: 60,
"onUpdate:modelValue": _cache[11] || (_cache[11] = (value) => setTheTimeout("minutes", value))
}, {
append: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.minutes")), 1)]),
_: 1
}, 8, ["disabled", "model-value"])]),
_: 1
}, 8, ["class"]),
createVNode(unref(ElCol), {
span: 4,
class: normalizeClass(_ctx.$style["timeout-input"])
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"model-value": timeoutHMS.value.seconds,
min: 0,
max: 60,
"onUpdate:modelValue": _cache[12] || (_cache[12] = (value) => setTheTimeout("seconds", value))
}, {
append: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.seconds")), 1)]),
_: 1
}, 8, ["disabled", "model-value"])]),
_: 1
}, 8, ["class"])
]),
_: 1
})])) : createCommentVNode("", true),
isMCPEnabled.value ? (openBlock(), createBlock(unref(ElRow), {
key: 3,
"data-test-id": "workflow-settings-available-in-mcp"
}, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createBaseVNode("label", _hoisted_14, [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.availableInMCP")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createTextVNode(toDisplayString(mcpToggleTooltip.value), 1)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})])]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), { span: 14 }, {
default: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nTooltip_default), {
placement: "top",
disabled: !mcpToggleDisabled.value
}, {
content: withCtx(() => [createTextVNode(toDisplayString(mcpToggleTooltip.value), 1)]),
default: withCtx(() => [createVNode(unref(ElSwitch), {
ref: "inputField",
disabled: mcpToggleDisabled.value,
"model-value": workflowSettings.value.availableInMCP ?? false,
"data-test-id": "workflow-settings-available-in-mcp",
"onUpdate:modelValue": toggleAvailableInMCP
}, null, 8, ["disabled", "model-value"])]),
_: 1
}, 8, ["disabled"])])]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 10,
class: normalizeClass(_ctx.$style["setting-name"])
}, {
default: withCtx(() => [createBaseVNode("label", _hoisted_15, [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution")) + " ", 1), createVNode(unref(N8nTooltip_default), { placement: "top" }, {
content: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.tooltip")), 1)]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "circle-help" })]),
_: 1
})])]),
_: 1
}, 8, ["class"]), createVNode(unref(ElCol), { span: 14 }, {
default: withCtx(() => [createBaseVNode("div", _hoisted_16, [createVNode(unref(N8nSelect_default), {
modelValue: workflowSettings.value.timeSavedMode,
"onUpdate:modelValue": _cache[13] || (_cache[13] = ($event) => workflowSettings.value.timeSavedMode = $event),
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"data-test-id": "workflow-settings-time-saved-mode",
size: "medium",
filterable: "",
"limit-popper-width": true
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(timeSavedModeOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.value,
label: option.label,
value: option.value
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, ["modelValue", "disabled"])])]),
_: 1
})]),
_: 1
}),
workflowSettings.value.timeSavedMode === "fixed" ? (openBlock(), createBlock(unref(ElRow), { key: 4 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 14,
offset: 10
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-input"]) }, [createVNode(unref(N8nInput_default), {
id: "timeSavedPerExecution",
modelValue: workflowSettings.value.timeSavedPerExecution,
"onUpdate:modelValue": [_cache[14] || (_cache[14] = ($event) => workflowSettings.value.timeSavedPerExecution = $event), updateTimeSavedPerExecution],
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
"data-test-id": "workflow-settings-time-saved-per-execution",
type: "number",
min: "0"
}, null, 8, ["modelValue", "disabled"]), createBaseVNode("span", null, toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.hint")), 1)], 2)]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true),
workflowSettings.value.timeSavedMode === "fixed" && hasSavedTimeNodes.value ? (openBlock(), createBlock(unref(ElRow), { key: 5 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 14,
offset: 10
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-content"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-warning"]) }, [withDirectives(createBaseVNode("span", null, null, 512), [[_directive_n8n_html, unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.fixedTabWarning", { interpolate: { link: `<a href='#' class='${_ctx.$style["time-saved-link"]}' data-action='openSavedTimeNodeCreator'>${unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.fixedTabWarning.link")}</a>` } })]])], 2)], 2)]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true),
workflowSettings.value.timeSavedMode === "dynamic" && hasSavedTimeNodes.value ? (openBlock(), createBlock(unref(ElRow), { key: 6 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 14,
offset: 10
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-content"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-nodes-active"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["nodes-active-wrapper"]) }, [createVNode(unref(N8nIcon_default), {
icon: "clock",
class: normalizeClass(_ctx.$style["nodes-active-icon"])
}, null, 8, ["class"]), createBaseVNode("div", { class: normalizeClass(_ctx.$style["nodes-active-content"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["nodes-active-title"]) }, toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.nodesDetected", { interpolate: { count: savedTimeNodes.value.length } })), 3), createBaseVNode("div", { class: normalizeClass(_ctx.$style["nodes-active-hint"]) }, toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.nodesDetected.hint")), 3)], 2)], 2), createBaseVNode("a", {
href: "#",
class: normalizeClass(_ctx.$style["add-more-link"]),
"data-action": "openSavedTimeNodeCreator"
}, toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.nodesDetected.addMore")), 3)], 2)], 2)]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true),
workflowSettings.value.timeSavedMode === "dynamic" && !hasSavedTimeNodes.value ? (openBlock(), createBlock(unref(ElRow), { key: 7 }, {
default: withCtx(() => [createVNode(unref(ElCol), {
span: 14,
offset: 10
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-content"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["time-saved-no-nodes"]) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style["no-nodes-title"]) }, toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.noNodesDetected")), 3), createBaseVNode("div", { class: normalizeClass(_ctx.$style["no-nodes-hint"]) }, toDisplayString(unref(i18n$2).baseText("workflowSettings.timeSavedPerExecution.noNodesDetected.hint")), 3)], 2)], 2)]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true)
], 2)), [[_directive_loading, isLoading.value]])]),
footer: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["action-buttons"]),
"data-test-id": "workflow-settings-save-button"
}, [createVNode(unref(N8nButton_default), {
disabled: readOnlyEnv.value || !workflowPermissions.value.update,
label: unref(i18n$2).baseText("workflowSettings.save"),
size: "large",
float: "right",
onClick: saveSettings
}, null, 8, ["disabled", "label"])], 2)]),
_: 1
}, 8, [
"name",
"title",
"event-bus"
]);
};
}
});
const optionContent$1 = "_optionContent_1ozl4_267";
const c = "_c_1ozl4_274";
var WorkflowSettings_vue_vue_type_style_index_0_lang_module_default = {
"workflow-settings": "_workflow-settings_1ozl4_123",
"setting-name": "_setting-name_1ozl4_137",
"timeout-input": "_timeout-input_1ozl4_151",
"time-saved": "_time-saved_1ozl4_155",
"time-saved-input": "_time-saved-input_1ozl4_166",
"time-saved-dropdown": "_time-saved-dropdown_1ozl4_177",
"time-saved-tabs": "_time-saved-tabs_1ozl4_181",
"time-saved-content": "_time-saved-content_1ozl4_187",
"time-saved-warning": "_time-saved-warning_1ozl4_194",
"time-saved-link": "_time-saved-link_1ozl4_199",
"time-saved-no-nodes": "_time-saved-no-nodes_1ozl4_207",
"no-nodes-title": "_no-nodes-title_1ozl4_213",
"no-nodes-hint": "_no-nodes-hint_1ozl4_218",
"time-saved-nodes-active": "_time-saved-nodes-active_1ozl4_224",
"nodes-active-wrapper": "_nodes-active-wrapper_1ozl4_230",
"nodes-active-icon": "_nodes-active-icon_1ozl4_236",
"nodes-active-content": "_nodes-active-content_1ozl4_241",
"nodes-active-title": "_nodes-active-title_1ozl4_248",
"nodes-active-hint": "_nodes-active-hint_1ozl4_253",
"add-more-link": "_add-more-link_1ozl4_258",
optionContent: optionContent$1,
c,
"credential-resolver-container": "_credential-resolver-container_1ozl4_283",
"create-new-button": "_create-new-button_1ozl4_288"
};
var WorkflowSettings_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowSettings_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowSettings_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowShareModal_ee_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowShareModal.ee",
props: { data: {} },
setup(__props) {
const { data } = __props;
const workflowsStore = useWorkflowsStore();
const settingsStore = useSettingsStore();
const uiStore = useUIStore();
const usersStore = useUsersStore();
const workflowsEEStore = useWorkflowsEEStore();
const projectsStore = useProjectsStore();
const rolesStore = useRolesStore();
const toast = useToast();
const message$1 = useMessage();
const pageRedirectionHelper = usePageRedirectionHelper();
const i18n$2 = useI18n();
const router = useRouter();
const route = useRoute();
const workflowSaving = useWorkflowSaving({ router });
const workflow = ref(data.id && workflowsStore.workflowsById[data.id] ? workflowsStore.workflowsById[data.id] : workflowsStore.workflow);
const loading$3 = ref(true);
const isDirty = ref(false);
const modalBus = createEventBus();
const sharedWithProjects = ref([...workflow.value.sharedWithProjects ?? []]);
const teamProject = ref(null);
const isSharingEnabled = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]);
const isHomeTeamProject = computed(() => workflow.value.homeProject?.type === ProjectTypes.Team);
const modalTitle = computed(() => {
if (isHomeTeamProject.value) return i18n$2.baseText("workflows.shareModal.title.static", { interpolate: { projectName: workflow.value.homeProject?.name ?? "" } });
return i18n$2.baseText(isSharingEnabled.value ? uiStore.contextBasedTranslationKeys.workflows.sharing.title : uiStore.contextBasedTranslationKeys.workflows.sharing.unavailable.title, { interpolate: { name: workflow.value.name } });
});
const workflowPermissions = computed(() => getResourcePermissions(workflow.value?.scopes).workflow);
const workflowOwnerName = computed(() => workflowsEEStore.getWorkflowOwnerName(`${workflow.value.id}`));
const projects = computed(() => projectsStore.personalProjects.filter((project) => project.id !== workflow.value.homeProject?.id));
const numberOfMembersInHomeTeamProject = computed(() => teamProject.value?.relations.length ?? 0);
const workflowRoleTranslations = computed(() => ({
"workflow:editor": i18n$2.baseText("workflows.shareModal.role.editor"),
"workflow:owner": ""
}));
const workflowRoles = computed(() => rolesStore.processedWorkflowRoles.map(({ slug, scopes, displayName, licensed, description: description$8, systemRole, roleType }) => ({
slug,
displayName: slug in workflowRoleTranslations.value ? workflowRoleTranslations.value[slug] : displayName,
scopes,
licensed,
description: description$8,
systemRole,
roleType
})));
const trackTelemetry = (eventName, data$1) => {
telemetry.track(eventName, {
workflow_id: workflow.value.id,
...data$1
});
};
const onProjectAdded = (project) => {
trackTelemetry("User selected sharee to add", {
project_id_sharer: workflow.value.homeProject?.id,
project_id_sharee: project.id
});
};
const onProjectRemoved = (project) => {
trackTelemetry("User selected sharee to remove", {
project_id_sharer: workflow.value.homeProject?.id,
project_id_sharee: project.id
});
};
const onSave = async () => {
if (loading$3.value) return;
loading$3.value = true;
const saveWorkflowPromise = async () => {
if (!workflowsStore.isWorkflowSaved[workflow.value.id]) {
const parentFolderId = route.query.folderId;
const workflowId = await workflowSaving.saveAsNewWorkflow({ parentFolderId });
if (!workflowId) throw new Error(i18n$2.baseText("workflows.shareModal.onSave.error.title"));
return workflowId;
} else return workflow.value.id;
};
try {
const workflowId = await saveWorkflowPromise();
await workflowsEEStore.saveWorkflowSharedWith({
workflowId,
sharedWithProjects: sharedWithProjects.value
});
toast.showMessage({ title: i18n$2.baseText("workflows.shareModal.onSave.success.title") });
isDirty.value = false;
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("workflows.shareModal.onSave.error.title"));
} finally {
modalBus.emit("close");
loading$3.value = false;
}
};
const onCloseModal = async () => {
if (isDirty.value) {
if (await message$1.confirm(i18n$2.baseText("workflows.shareModal.saveBeforeClose.message"), i18n$2.baseText("workflows.shareModal.saveBeforeClose.title"), {
type: "warning",
confirmButtonText: i18n$2.baseText("workflows.shareModal.saveBeforeClose.confirmButtonText"),
cancelButtonText: i18n$2.baseText("workflows.shareModal.saveBeforeClose.cancelButtonText")
}) === "confirm") return await onSave();
}
return true;
};
const goToUpgrade = () => {
pageRedirectionHelper.goToUpgrade("workflow_sharing", "upgrade-workflow-sharing");
};
const initialize = async () => {
if (isSharingEnabled.value) {
await Promise.all([usersStore.fetchUsers(), projectsStore.getAllProjects()]);
if (workflowsStore.isWorkflowSaved[workflow.value.id]) await workflowsStore.fetchWorkflow(workflow.value.id);
if (isHomeTeamProject.value && workflow.value.homeProject) teamProject.value = await projectsStore.fetchProject(workflow.value.homeProject.id);
}
loading$3.value = false;
};
onMounted(async () => {
await initialize();
});
watch(sharedWithProjects, () => {
isDirty.value = true;
}, { deep: true });
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "460px",
"max-height": "75%",
title: modalTitle.value,
"event-bus": unref(modalBus),
name: unref(WORKFLOW_SHARE_MODAL_KEY),
center: true,
"before-close": onCloseModal
}, {
content: withCtx(() => [!isSharingEnabled.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.container)
}, [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(unref(uiStore).contextBasedTranslationKeys.workflows.sharing.unavailable.description.modal)), 1)]),
_: 1
})], 2)) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.container)
}, [!workflowPermissions.value.share && !isHomeTeamProject.value ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 0,
bold: false,
class: "mb-s"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.shareModal.info.sharee", { interpolate: { workflowOwnerName: workflowOwnerName.value } })), 1)]),
_: 1
})) : createCommentVNode("", true), createVNode(EnterpriseEdition_ee_default, {
features: [unref(EnterpriseEditionFeature).Sharing],
class: normalizeClass(_ctx.$style.content)
}, {
fallback: withCtx(() => [createVNode(unref(N8nText_default), null, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: unref(uiStore).contextBasedTranslationKeys.workflows.sharing.unavailable.description.tooltip,
tag: "span",
scope: "global"
}, {
action: withCtx(() => _cache[2] || (_cache[2] = [])),
_: 1
}, 8, ["keypath"])]),
_: 1
})]),
default: withCtx(() => [createBaseVNode("div", null, [createVNode(ProjectSharing_default, {
modelValue: sharedWithProjects.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => sharedWithProjects.value = $event),
"home-project": workflow.value.homeProject,
projects: projects.value,
roles: workflowRoles.value,
readonly: !workflowPermissions.value.share,
static: isHomeTeamProject.value || !workflowPermissions.value.share,
placeholder: unref(i18n$2).baseText("workflows.shareModal.select.placeholder"),
"empty-options-text": unref(i18n$2).baseText("workflows.shareModel.select.notFound"),
onProjectAdded,
onProjectRemoved
}, null, 8, [
"modelValue",
"home-project",
"projects",
"roles",
"readonly",
"static",
"placeholder",
"empty-options-text"
]), isHomeTeamProject.value ? (openBlock(), createBlock(unref(N8nInfoTip_default), {
key: 0,
bold: false,
class: "mt-s"
}, {
default: withCtx(() => [createVNode(unref(I18nT), {
keypath: "workflows.shareModal.info.members",
tag: "span",
scope: "global"
}, {
projectName: withCtx(() => [createTextVNode(toDisplayString(workflow.value.homeProject?.name), 1)]),
members: withCtx(() => [createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("workflows.shareModal.info.members.number", {
interpolate: { number: String(numberOfMembersInHomeTeamProject.value) },
adjustToNumber: numberOfMembersInHomeTeamProject.value
})), 1)]),
_: 1
})]),
_: 1
})) : createCommentVNode("", true)])]),
_: 1
}, 8, ["features", "class"])], 2))]),
footer: withCtx(() => [!isSharingEnabled.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.actionButtons)
}, [createVNode(unref(N8nButton_default), { onClick: goToUpgrade }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(unref(uiStore).contextBasedTranslationKeys.workflows.sharing.unavailable.button)), 1)]),
_: 1
})], 2)) : (openBlock(), createBlock(EnterpriseEdition_ee_default, {
key: 1,
features: [unref(EnterpriseEditionFeature).Sharing],
class: normalizeClass(_ctx.$style.actionButtons)
}, {
default: withCtx(() => [withDirectives(createVNode(unref(N8nText_default), {
color: "text-light",
size: "small",
class: "mr-xs"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.shareModal.changesHint")), 1)]),
_: 1
}, 512), [[vShow, isDirty.value]]), isHomeTeamProject.value ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 0,
type: "secondary",
onClick: _cache[1] || (_cache[1] = ($event) => unref(modalBus).emit("close"))
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("generic.close")), 1)]),
_: 1
})) : withDirectives((openBlock(), createBlock(unref(N8nButton_default), {
key: 1,
loading: loading$3.value,
disabled: !isDirty.value,
"data-test-id": "workflow-sharing-modal-save-button",
onClick: onSave
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.shareModal.save")), 1)]),
_: 1
}, 8, ["loading", "disabled"])), [[vShow, workflowPermissions.value.share]])]),
_: 1
}, 8, ["features", "class"]))]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var WorkflowShareModal_ee_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_1fvpr_123",
content: "_content_1fvpr_133",
usersList: "_usersList_1fvpr_140",
actionButtons: "_actionButtons_1fvpr_145",
roleSelect: "_roleSelect_1fvpr_151",
roleSelectRemoveOption: "_roleSelectRemoveOption_1fvpr_155"
};
var WorkflowShareModal_ee_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowShareModal_ee_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowShareModal_ee_vue_vue_type_style_index_0_lang_module_default }]]);
var DiffBadge_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "DiffBadge",
props: { type: {} },
setup(__props) {
useCssVars((_ctx) => ({ "2f23a409": backgroundColor.value }));
const props = __props;
const label$2 = computed(() => {
switch (props.type) {
case NodeDiffStatus.Added: return "N";
case NodeDiffStatus.Deleted: return "D";
case NodeDiffStatus.Modified: return "M";
default: return "";
}
});
const backgroundColor = computed(() => {
switch (props.type) {
case NodeDiffStatus.Added: return "var(--node--icon--color--green)";
case NodeDiffStatus.Deleted: return "var(--node--icon--color--red)";
case NodeDiffStatus.Modified: return "var(--node--icon--color--orange)";
default: return "";
}
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.diffBadge) }, toDisplayString(label$2.value), 3);
};
}
});
var DiffBadge_vue_vue_type_style_index_0_lang_module_default = { diffBadge: "_diffBadge_osfae_2" };
var DiffBadge_default = /* @__PURE__ */ __plugin_vue_export_helper_default(DiffBadge_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": DiffBadge_vue_vue_type_style_index_0_lang_module_default }]]);
(function() {
try {
if (typeof document != "undefined") {
var o = document.createElement("style");
o.appendChild(document.createTextNode(".code-diff-view[theme=light]{color:var(--fgColor-default, var(--color-fg-default));background-color:var(--bgColor-default, var(--color-canvas-default));--color-canvas-default-transparent: rgba(255,255,255,0);--color-page-header-bg: #f6f8fa;--color-marketing-icon-primary: #218bff;--color-marketing-icon-secondary: #54aeff;--color-diff-blob-addition-num-text: #1F2328;--color-diff-blob-addition-fg: #1F2328;--color-diff-blob-addition-num-bg: #ccffd8;--color-diff-blob-addition-line-bg: #e6ffec;--color-diff-blob-addition-word-bg: #abf2bc;--color-diff-blob-deletion-num-text: #1F2328;--color-diff-blob-deletion-fg: #1F2328;--color-diff-blob-deletion-num-bg: #ffd7d5;--color-diff-blob-deletion-line-bg: #ffebe9;--color-diff-blob-deletion-word-bg: rgba(255,129,130,.4);--color-diff-blob-hunk-num-bg: rgba(84,174,255,.4);--color-diff-blob-expander-icon: #656d76;--color-diff-blob-selected-line-highlight-mix-blend-mode: multiply;--color-diffstat-deletion-border: rgba(31,35,40,.15);--color-diffstat-addition-border: rgba(31,35,40,.15);--color-diffstat-addition-bg: #1f883d;--color-search-keyword-hl: #fff8c5;--color-prettylights-syntax-comment: #6e7781;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-entity: #6639ba;--color-prettylights-syntax-storage-modifier-import: #24292f;--color-prettylights-syntax-entity-tag: #116329;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #24292f;--color-prettylights-syntax-markup-bold: #24292f;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #eaeef2;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-brackethighlighter-angle: #57606a;--color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-codemirror-text: #1F2328;--color-codemirror-bg: #ffffff;--color-codemirror-gutters-bg: #ffffff;--color-codemirror-guttermarker-text: #ffffff;--color-codemirror-guttermarker-subtle-text: #6e7781;--color-codemirror-linenumber-text: #656d76;--color-codemirror-cursor: #1F2328;--color-codemirror-selection-bg: rgba(84,174,255,.4);--color-codemirror-activeline-bg: rgba(234,238,242,.5);--color-codemirror-matchingbracket-text: #1F2328;--color-codemirror-lines-bg: #ffffff;--color-codemirror-syntax-comment: #24292f;--color-codemirror-syntax-constant: #0550ae;--color-codemirror-syntax-entity: #8250df;--color-codemirror-syntax-keyword: #cf222e;--color-codemirror-syntax-storage: #cf222e;--color-codemirror-syntax-string: #0a3069;--color-codemirror-syntax-support: #0550ae;--color-codemirror-syntax-variable: #953800;--color-checks-bg: #24292f;--color-checks-run-border-width: 0px;--color-checks-container-border-width: 0px;--color-checks-text-primary: #f6f8fa;--color-checks-text-secondary: #8c959f;--color-checks-text-link: #54aeff;--color-checks-btn-icon: #afb8c1;--color-checks-btn-hover-icon: #f6f8fa;--color-checks-btn-hover-bg: rgba(255,255,255,.125);--color-checks-input-text: #eaeef2;--color-checks-input-placeholder-text: #8c959f;--color-checks-input-focus-text: #8c959f;--color-checks-input-bg: #32383f;--color-checks-input-shadow: none;--color-checks-donut-error: #fa4549;--color-checks-donut-pending: #bf8700;--color-checks-donut-success: #1f883d;--color-checks-donut-neutral: #afb8c1;--color-checks-dropdown-text: #afb8c1;--color-checks-dropdown-bg: #32383f;--color-checks-dropdown-border: #424a53;--color-checks-dropdown-shadow: rgba(31,35,40,.3);--color-checks-dropdown-hover-text: #f6f8fa;--color-checks-dropdown-hover-bg: #424a53;--color-checks-dropdown-btn-hover-text: #f6f8fa;--color-checks-dropdown-btn-hover-bg: #32383f;--color-checks-scrollbar-thumb-bg: #57606a;--color-checks-header-label-text: #d0d7de;--color-checks-header-label-open-text: #f6f8fa;--color-checks-header-border: #32383f;--color-checks-header-icon: #8c959f;--color-checks-line-text: #d0d7de;--color-checks-line-num-text: rgba(140,149,159,.75);--color-checks-line-timestamp-text: #8c959f;--color-checks-line-hover-bg: #32383f;--color-checks-line-selected-bg: rgba(33,139,255,.15);--color-checks-line-selected-num-text: #54aeff;--color-checks-line-dt-fm-text: #24292f;--color-checks-line-dt-fm-bg: #9a6700;--color-checks-gate-bg: rgba(125,78,0,.15);--color-checks-gate-text: #d0d7de;--color-checks-gate-waiting-text: #d4a72c;--color-checks-step-header-open-bg: #32383f;--color-checks-step-error-text: #ff8182;--color-checks-step-warning-text: #d4a72c;--color-checks-logline-text: #8c959f;--color-checks-logline-num-text: rgba(140,149,159,.75);--color-checks-logline-debug-text: #c297ff;--color-checks-logline-error-text: #d0d7de;--color-checks-logline-error-num-text: #ff8182;--color-checks-logline-error-bg: rgba(164,14,38,.15);--color-checks-logline-warning-text: #d0d7de;--color-checks-logline-warning-num-text: #d4a72c;--color-checks-logline-warning-bg: rgba(125,78,0,.15);--color-checks-logline-command-text: #54aeff;--color-checks-logline-section-text: #4ac26b;--color-checks-ansi-black: #24292f;--color-checks-ansi-black-bright: #32383f;--color-checks-ansi-white: #d0d7de;--color-checks-ansi-white-bright: #d0d7de;--color-checks-ansi-gray: #8c959f;--color-checks-ansi-red: #ff8182;--color-checks-ansi-red-bright: #ffaba8;--color-checks-ansi-green: #4ac26b;--color-checks-ansi-green-bright: #6fdd8b;--color-checks-ansi-yellow: #d4a72c;--color-checks-ansi-yellow-bright: #eac54f;--color-checks-ansi-blue: #54aeff;--color-checks-ansi-blue-bright: #80ccff;--color-checks-ansi-magenta: #c297ff;--color-checks-ansi-magenta-bright: #d8b9ff;--color-checks-ansi-cyan: #76e3ea;--color-checks-ansi-cyan-bright: #b3f0ff;--color-project-header-bg: #24292f;--color-project-sidebar-bg: #ffffff;--color-project-gradient-in: #ffffff;--color-project-gradient-out: rgba(255,255,255,0);--color-mktg-btn-bg: #1b1f23;--color-mktg-btn-shadow-outline: rgb(0 0 0 / 15%) 0 0 0 1px inset;--color-mktg-btn-shadow-focus: rgb(0 0 0 / 15%) 0 0 0 4px;--color-mktg-btn-shadow-hover: 0 3px 2px rgba(0, 0, 0, .07), 0 7px 5px rgba(0, 0, 0, .04), 0 12px 10px rgba(0, 0, 0, .03), 0 22px 18px rgba(0, 0, 0, .03), 0 42px 33px rgba(0, 0, 0, .02), 0 100px 80px rgba(0, 0, 0, .02);--color-mktg-btn-shadow-hover-muted: rgb(0 0 0 / 70%) 0 0 0 2px inset;--color-control-border-color-emphasis: #858F99;--color-avatar-bg: #ffffff;--color-avatar-border: rgba(31,35,40,.15);--color-avatar-stack-fade: #afb8c1;--color-avatar-stack-fade-more: #d0d7de;--color-avatar-child-shadow: 0 0 0 2px rgba(255,255,255,.8);--color-topic-tag-border: rgba(0,0,0,0);--color-counter-border: rgba(0,0,0,0);--color-select-menu-backdrop-border: rgba(0,0,0,0);--color-select-menu-tap-highlight: rgba(175,184,193,.5);--color-select-menu-tap-focus-bg: #b6e3ff;--color-overlay-shadow: 0 1px 3px rgba(31,35,40,.12), 0 8px 24px rgba(66,74,83,.12);--color-overlay-backdrop: rgba(140,149,159,.2);--color-header-text: rgba(255,255,255,.7);--color-header-bg: #24292f;--color-header-divider: #57606a;--color-header-logo: #ffffff;--color-header-search-bg: #24292f;--color-header-search-border: #57606a;--color-sidenav-selected-bg: #ffffff;--color-menu-bg-active: rgba(0,0,0,0);--color-input-disabled-bg: rgba(175,184,193,.2);--color-timeline-badge-bg: #eaeef2;--color-ansi-black: #24292f;--color-ansi-black-bright: #57606a;--color-ansi-white: #6e7781;--color-ansi-white-bright: #8c959f;--color-ansi-gray: #6e7781;--color-ansi-red: #cf222e;--color-ansi-red-bright: #a40e26;--color-ansi-green: #116329;--color-ansi-green-bright: #1a7f37;--color-ansi-yellow: #4d2d00;--color-ansi-yellow-bright: #633c01;--color-ansi-blue: #0969da;--color-ansi-blue-bright: #218bff;--color-ansi-magenta: #8250df;--color-ansi-magenta-bright: #a475f9;--color-ansi-cyan: #1b7c83;--color-ansi-cyan-bright: #3192aa;--color-btn-text: #24292f;--color-btn-bg: #f6f8fa;--color-btn-border: rgba(31,35,40,.15);--color-btn-shadow: 0 1px 0 rgba(31,35,40,.04);--color-btn-inset-shadow: inset 0 1px 0 rgba(255,255,255,.25);--color-btn-hover-bg: #f3f4f6;--color-btn-hover-border: rgba(31,35,40,.15);--color-btn-active-bg: hsla(220,14%,93%,1);--color-btn-active-border: rgba(31,35,40,.15);--color-btn-selected-bg: hsla(220,14%,94%,1);--color-btn-counter-bg: rgba(31,35,40,.08);--color-btn-primary-text: #ffffff;--color-btn-primary-bg: #1f883d;--color-btn-primary-border: rgba(31,35,40,.15);--color-btn-primary-shadow: 0 1px 0 rgba(31,35,40,.1);--color-btn-primary-inset-shadow: inset 0 1px 0 rgba(255,255,255,.03);--color-btn-primary-hover-bg: #1a7f37;--color-btn-primary-hover-border: rgba(31,35,40,.15);--color-btn-primary-selected-bg: hsla(137,66%,28%,1);--color-btn-primary-selected-shadow: inset 0 1px 0 rgba(0,45,17,.2);--color-btn-primary-disabled-text: rgba(255,255,255,.8);--color-btn-primary-disabled-bg: #94d3a2;--color-btn-primary-disabled-border: rgba(31,35,40,.15);--color-btn-primary-icon: rgba(255,255,255,.8);--color-btn-primary-counter-bg: rgba(0,45,17,.2);--color-btn-outline-text: #0969da;--color-btn-outline-hover-text: #ffffff;--color-btn-outline-hover-bg: #0969da;--color-btn-outline-hover-border: rgba(31,35,40,.15);--color-btn-outline-hover-shadow: 0 1px 0 rgba(31,35,40,.1);--color-btn-outline-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,.03);--color-btn-outline-hover-counter-bg: rgba(255,255,255,.2);--color-btn-outline-selected-text: #ffffff;--color-btn-outline-selected-bg: hsla(212,92%,42%,1);--color-btn-outline-selected-border: rgba(31,35,40,.15);--color-btn-outline-selected-shadow: inset 0 1px 0 rgba(0,33,85,.2);--color-btn-outline-disabled-text: rgba(9,105,218,.5);--color-btn-outline-disabled-bg: #f6f8fa;--color-btn-outline-disabled-counter-bg: rgba(9,105,218,.05);--color-btn-outline-counter-bg: #0969da1a;--color-btn-outline-counter-fg: #0550ae;--color-btn-outline-hover-counter-fg: #ffffff;--color-btn-outline-disabled-counter-fg: rgba(9,105,218,.5);--color-btn-danger-text: #cf222e;--color-btn-danger-hover-text: #ffffff;--color-btn-danger-hover-bg: #a40e26;--color-btn-danger-hover-border: rgba(31,35,40,.15);--color-btn-danger-hover-shadow: 0 1px 0 rgba(31,35,40,.1);--color-btn-danger-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,.03);--color-btn-danger-hover-counter-bg: rgba(255,255,255,.2);--color-btn-danger-selected-text: #ffffff;--color-btn-danger-selected-bg: hsla(356,72%,44%,1);--color-btn-danger-selected-border: rgba(31,35,40,.15);--color-btn-danger-selected-shadow: inset 0 1px 0 rgba(76,0,20,.2);--color-btn-danger-disabled-text: rgba(207,34,46,.5);--color-btn-danger-disabled-bg: #f6f8fa;--color-btn-danger-disabled-counter-bg: rgba(207,34,46,.05);--color-btn-danger-counter-bg: rgba(207,34,46,.1);--color-btn-danger-icon: #cf222e;--color-btn-danger-hover-icon: #ffffff;--color-btn-danger-counter-fg: #a40e26;--color-btn-danger-hover-counter-fg: #ffffff;--color-btn-danger-disabled-counter-fg: rgba(207,34,46,.5);--color-underlinenav-icon: #6e7781;--color-underlinenav-border-hover: rgba(175,184,193,.2);--color-action-list-item-inline-divider: rgba(208,215,222,.48);--color-action-list-item-default-hover-bg: rgba(208,215,222,.32);--color-action-list-item-default-hover-border: rgba(0,0,0,0);--color-action-list-item-default-active-bg: rgba(208,215,222,.48);--color-action-list-item-default-active-border: rgba(0,0,0,0);--color-action-list-item-default-selected-bg: rgba(208,215,222,.24);--color-action-list-item-danger-hover-bg: rgba(255,235,233,.64);--color-action-list-item-danger-active-bg: #ffebe9;--color-action-list-item-danger-hover-text: #d1242f;--color-switch-track-bg: #eaeef2;--color-switch-track-hover-bg: hsla(210,24%,90%,1);--color-switch-track-active-bg: hsla(210,24%,88%,1);--color-switch-track-disabled-bg: #8c959f;--color-switch-track-fg: #656d76;--color-switch-track-disabled-fg: #ffffff;--color-switch-track-border: rgba(0,0,0,0);--color-switch-track-checked-bg: #0969da;--color-switch-track-checked-hover-bg: #0860CA;--color-switch-track-checked-active-bg: #0757BA;--color-switch-track-checked-fg: #ffffff;--color-switch-track-checked-disabled-fg: #ffffff;--color-switch-track-checked-border: rgba(0,0,0,0);--color-switch-knob-bg: #ffffff;--color-switch-knob-disabled-bg: #f6f8fa;--color-switch-knob-border: #858F99;--color-switch-knob-checked-bg: #ffffff;--color-switch-knob-checked-disabled-bg: #f6f8fa;--color-switch-knob-checked-border: #0969da;--color-segmented-control-bg: #eaeef2;--color-segmented-control-button-bg: #ffffff;--color-segmented-control-button-hover-bg: rgba(175,184,193,.2);--color-segmented-control-button-active-bg: rgba(175,184,193,.4);--color-segmented-control-button-selected-border: #8c959f;--color-tree-view-item-chevron-hover-bg: rgba(208,215,222,.32);--color-tree-view-item-directory-fill: #54aeff;--color-fg-default: #1F2328;--color-fg-muted: #656d76;--color-fg-subtle: #6e7781;--color-fg-on-emphasis: #ffffff;--color-canvas-default: #ffffff;--color-canvas-overlay: #ffffff;--color-canvas-inset: #f6f8fa;--color-canvas-subtle: #f6f8fa;--color-border-default: #d0d7de;--color-border-muted: hsla(210,18%,87%,1);--color-border-subtle: rgba(31,35,40,.15);--color-shadow-small: 0 1px 0 rgba(31,35,40,.04);--color-shadow-medium: 0 3px 6px rgba(140,149,159,.15);--color-shadow-large: 0 8px 24px rgba(140,149,159,.2);--color-shadow-extra-large: 0 12px 28px rgba(140,149,159,.3);--color-neutral-emphasis-plus: #24292f;--color-neutral-emphasis: #6e7781;--color-neutral-muted: rgba(175,184,193,.2);--color-neutral-subtle: rgba(234,238,242,.5);--color-accent-fg: #0969da;--color-accent-emphasis: #0969da;--color-accent-muted: rgba(84,174,255,.4);--color-accent-subtle: #ddf4ff;--color-success-fg: #1a7f37;--color-success-emphasis: #1f883d;--color-success-muted: rgba(74,194,107,.4);--color-success-subtle: #dafbe1;--color-attention-fg: #9a6700;--color-attention-emphasis: #9a6700;--color-attention-muted: rgba(212,167,44,.4);--color-attention-subtle: #fff8c5;--color-severe-fg: #bc4c00;--color-severe-emphasis: #bc4c00;--color-severe-muted: rgba(251,143,68,.4);--color-severe-subtle: #fff1e5;--color-danger-fg: #d1242f;--color-danger-emphasis: #cf222e;--color-danger-muted: rgba(255,129,130,.4);--color-danger-subtle: #ffebe9;--color-open-fg: #1a7f37;--color-open-emphasis: #1f883d;--color-open-muted: rgba(74,194,107,.4);--color-open-subtle: #dafbe1;--color-closed-fg: #d1242f;--color-closed-emphasis: #cf222e;--color-closed-muted: rgba(255,129,130,.4);--color-closed-subtle: #ffebe9;--color-done-fg: #8250df;--color-done-emphasis: #8250df;--color-done-muted: rgba(194,151,255,.4);--color-done-subtle: #fbefff;--color-sponsors-fg: #bf3989;--color-sponsors-emphasis: #bf3989;--color-sponsors-muted: rgba(255,128,200,.4);--color-sponsors-subtle: #ffeff7;--color-primer-fg-disabled: #8c959f;--color-primer-canvas-backdrop: rgba(31,35,40,.5);--color-primer-canvas-sticky: rgba(255,255,255,.95);--color-primer-border-active: #fd8c73;--color-primer-border-contrast: rgba(31,35,40,.1);--color-primer-shadow-highlight: inset 0 1px 0 rgba(255,255,255,.25);--color-primer-shadow-inset: inset 0 1px 0 rgba(208,215,222,.2);--color-scale-black: #1F2328;--color-scale-white: #ffffff;--color-scale-gray-0: #f6f8fa;--color-scale-gray-1: #eaeef2;--color-scale-gray-2: #d0d7de;--color-scale-gray-3: #afb8c1;--color-scale-gray-4: #8c959f;--color-scale-gray-5: #6e7781;--color-scale-gray-6: #57606a;--color-scale-gray-7: #424a53;--color-scale-gray-8: #32383f;--color-scale-gray-9: #24292f;--color-scale-blue-0: #ddf4ff;--color-scale-blue-1: #b6e3ff;--color-scale-blue-2: #80ccff;--color-scale-blue-3: #54aeff;--color-scale-blue-4: #218bff;--color-scale-blue-5: #0969da;--color-scale-blue-6: #0550ae;--color-scale-blue-7: #033d8b;--color-scale-blue-8: #0a3069;--color-scale-blue-9: #002155;--color-scale-green-0: #dafbe1;--color-scale-green-1: #aceebb;--color-scale-green-2: #6fdd8b;--color-scale-green-3: #4ac26b;--color-scale-green-4: #2da44e;--color-scale-green-5: #1a7f37;--color-scale-green-6: #116329;--color-scale-green-7: #044f1e;--color-scale-green-8: #003d16;--color-scale-green-9: #002d11;--color-scale-yellow-0: #fff8c5;--color-scale-yellow-1: #fae17d;--color-scale-yellow-2: #eac54f;--color-scale-yellow-3: #d4a72c;--color-scale-yellow-4: #bf8700;--color-scale-yellow-5: #9a6700;--color-scale-yellow-6: #7d4e00;--color-scale-yellow-7: #633c01;--color-scale-yellow-8: #4d2d00;--color-scale-yellow-9: #3b2300;--color-scale-orange-0: #fff1e5;--color-scale-orange-1: #ffd8b5;--color-scale-orange-2: #ffb77c;--color-scale-orange-3: #fb8f44;--color-scale-orange-4: #e16f24;--color-scale-orange-5: #bc4c00;--color-scale-orange-6: #953800;--color-scale-orange-7: #762c00;--color-scale-orange-8: #5c2200;--color-scale-orange-9: #471700;--color-scale-red-0: #ffebe9;--color-scale-red-1: #ffcecb;--color-scale-red-2: #ffaba8;--color-scale-red-3: #ff8182;--color-scale-red-4: #fa4549;--color-scale-red-5: #cf222e;--color-scale-red-6: #a40e26;--color-scale-red-7: #82071e;--color-scale-red-8: #660018;--color-scale-red-9: #4c0014;--color-scale-purple-0: #fbefff;--color-scale-purple-1: #ecd8ff;--color-scale-purple-2: #d8b9ff;--color-scale-purple-3: #c297ff;--color-scale-purple-4: #a475f9;--color-scale-purple-5: #8250df;--color-scale-purple-6: #6639ba;--color-scale-purple-7: #512a97;--color-scale-purple-8: #3e1f79;--color-scale-purple-9: #2e1461;--color-scale-pink-0: #ffeff7;--color-scale-pink-1: #ffd3eb;--color-scale-pink-2: #ffadda;--color-scale-pink-3: #ff80c8;--color-scale-pink-4: #e85aad;--color-scale-pink-5: #bf3989;--color-scale-pink-6: #99286e;--color-scale-pink-7: #772057;--color-scale-pink-8: #611347;--color-scale-pink-9: #4d0336;--color-scale-coral-0: #fff0eb;--color-scale-coral-1: #ffd6cc;--color-scale-coral-2: #ffb4a1;--color-scale-coral-3: #fd8c73;--color-scale-coral-4: #ec6547;--color-scale-coral-5: #c4432b;--color-scale-coral-6: #9e2f1c;--color-scale-coral-7: #801f0f;--color-scale-coral-8: #691105;--color-scale-coral-9: #510901}.code-diff-view[theme=light] pre code.hljs{display:block;overflow-x:auto;padding:1em}.code-diff-view[theme=light] code.hljs{padding:3px 5px}.code-diff-view[theme=light] .hljs{color:#24292e;background:#fff}.code-diff-view[theme=light] .hljs-doctag,.code-diff-view[theme=light] .hljs-keyword,.code-diff-view[theme=light] .hljs-meta .hljs-keyword,.code-diff-view[theme=light] .hljs-template-tag,.code-diff-view[theme=light] .hljs-template-variable,.code-diff-view[theme=light] .hljs-type,.code-diff-view[theme=light] .hljs-variable.language_{color:#d73a49}.code-diff-view[theme=light] .hljs-title,.code-diff-view[theme=light] .hljs-title.class_,.code-diff-view[theme=light] .hljs-title.class_.inherited__,.code-diff-view[theme=light] .hljs-title.function_{color:#6f42c1}.code-diff-view[theme=light] .hljs-attr,.code-diff-view[theme=light] .hljs-attribute,.code-diff-view[theme=light] .hljs-literal,.code-diff-view[theme=light] .hljs-meta,.code-diff-view[theme=light] .hljs-number,.code-diff-view[theme=light] .hljs-operator,.code-diff-view[theme=light] .hljs-variable,.code-diff-view[theme=light] .hljs-selector-attr,.code-diff-view[theme=light] .hljs-selector-class,.code-diff-view[theme=light] .hljs-selector-id{color:#005cc5}.code-diff-view[theme=light] .hljs-regexp,.code-diff-view[theme=light] .hljs-string,.code-diff-view[theme=light] .hljs-meta .hljs-string{color:#032f62}.code-diff-view[theme=light] .hljs-built_in,.code-diff-view[theme=light] .hljs-symbol{color:#e36209}.code-diff-view[theme=light] .hljs-comment,.code-diff-view[theme=light] .hljs-code,.code-diff-view[theme=light] .hljs-formula{color:#6a737d}.code-diff-view[theme=light] .hljs-name,.code-diff-view[theme=light] .hljs-quote,.code-diff-view[theme=light] .hljs-selector-tag,.code-diff-view[theme=light] .hljs-selector-pseudo{color:#22863a}.code-diff-view[theme=light] .hljs-subst{color:#24292e}.code-diff-view[theme=light] .hljs-section{color:#005cc5;font-weight:700}.code-diff-view[theme=light] .hljs-bullet{color:#735c0f}.code-diff-view[theme=light] .hljs-emphasis{color:#24292e;font-style:italic}.code-diff-view[theme=light] .hljs-strong{color:#24292e;font-weight:700}.code-diff-view[theme=light] .hljs-addition{color:#22863a;background-color:#f0fff4}.code-diff-view[theme=light] .hljs-deletion{color:#b31d28;background-color:#ffeef0}.code-diff-view[theme=dark]{color:var(--fgColor-default, var(--color-fg-default));background-color:var(--bgColor-default, var(--color-canvas-default));--color-canvas-default-transparent: rgba(13,17,23,0);--color-page-header-bg: #0d1117;--color-marketing-icon-primary: #79c0ff;--color-marketing-icon-secondary: #1f6feb;--color-diff-blob-addition-num-text: #e6edf3;--color-diff-blob-addition-fg: #e6edf3;--color-diff-blob-addition-num-bg: rgba(63,185,80,.3);--color-diff-blob-addition-line-bg: rgba(46,160,67,.15);--color-diff-blob-addition-word-bg: rgba(46,160,67,.4);--color-diff-blob-deletion-num-text: #e6edf3;--color-diff-blob-deletion-fg: #e6edf3;--color-diff-blob-deletion-num-bg: rgba(248,81,73,.3);--color-diff-blob-deletion-line-bg: rgba(248,81,73,.1);--color-diff-blob-deletion-word-bg: rgba(248,81,73,.4);--color-diff-blob-hunk-num-bg: rgba(56,139,253,.4);--color-diff-blob-expander-icon: #7d8590;--color-diff-blob-selected-line-highlight-mix-blend-mode: screen;--color-diffstat-deletion-border: rgba(240,246,252,.1);--color-diffstat-addition-border: rgba(240,246,252,.1);--color-diffstat-addition-bg: #3fb950;--color-search-keyword-hl: rgba(210,153,34,.4);--color-prettylights-syntax-comment: #8b949e;--color-prettylights-syntax-constant: #79c0ff;--color-prettylights-syntax-entity: #d2a8ff;--color-prettylights-syntax-storage-modifier-import: #c9d1d9;--color-prettylights-syntax-entity-tag: #7ee787;--color-prettylights-syntax-keyword: #ff7b72;--color-prettylights-syntax-string: #a5d6ff;--color-prettylights-syntax-variable: #ffa657;--color-prettylights-syntax-brackethighlighter-unmatched: #f85149;--color-prettylights-syntax-invalid-illegal-text: #f0f6fc;--color-prettylights-syntax-invalid-illegal-bg: #8e1519;--color-prettylights-syntax-carriage-return-text: #f0f6fc;--color-prettylights-syntax-carriage-return-bg: #b62324;--color-prettylights-syntax-string-regexp: #7ee787;--color-prettylights-syntax-markup-list: #f2cc60;--color-prettylights-syntax-markup-heading: #1f6feb;--color-prettylights-syntax-markup-italic: #c9d1d9;--color-prettylights-syntax-markup-bold: #c9d1d9;--color-prettylights-syntax-markup-deleted-text: #ffdcd7;--color-prettylights-syntax-markup-deleted-bg: #67060c;--color-prettylights-syntax-markup-inserted-text: #aff5b4;--color-prettylights-syntax-markup-inserted-bg: #033a16;--color-prettylights-syntax-markup-changed-text: #ffdfb6;--color-prettylights-syntax-markup-changed-bg: #5a1e02;--color-prettylights-syntax-markup-ignored-text: #c9d1d9;--color-prettylights-syntax-markup-ignored-bg: #1158c7;--color-prettylights-syntax-meta-diff-range: #d2a8ff;--color-prettylights-syntax-brackethighlighter-angle: #8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark: #484f58;--color-prettylights-syntax-constant-other-reference-link: #a5d6ff;--color-codemirror-text: #e6edf3;--color-codemirror-bg: #0d1117;--color-codemirror-gutters-bg: #0d1117;--color-codemirror-guttermarker-text: #0d1117;--color-codemirror-guttermarker-subtle-text: #6e7681;--color-codemirror-linenumber-text: #7d8590;--color-codemirror-cursor: #e6edf3;--color-codemirror-selection-bg: rgba(56,139,253,.4);--color-codemirror-activeline-bg: rgba(110,118,129,.1);--color-codemirror-matchingbracket-text: #e6edf3;--color-codemirror-lines-bg: #0d1117;--color-codemirror-syntax-comment: #8b949e;--color-codemirror-syntax-constant: #79c0ff;--color-codemirror-syntax-entity: #d2a8ff;--color-codemirror-syntax-keyword: #ff7b72;--color-codemirror-syntax-storage: #ff7b72;--color-codemirror-syntax-string: #a5d6ff;--color-codemirror-syntax-support: #79c0ff;--color-codemirror-syntax-variable: #ffa657;--color-checks-bg: #010409;--color-checks-run-border-width: 1px;--color-checks-container-border-width: 1px;--color-checks-text-primary: #e6edf3;--color-checks-text-secondary: #7d8590;--color-checks-text-link: #2f81f7;--color-checks-btn-icon: #7d8590;--color-checks-btn-hover-icon: #e6edf3;--color-checks-btn-hover-bg: rgba(110,118,129,.1);--color-checks-input-text: #7d8590;--color-checks-input-placeholder-text: #6e7681;--color-checks-input-focus-text: #e6edf3;--color-checks-input-bg: #161b22;--color-checks-donut-error: #f85149;--color-checks-donut-pending: #d29922;--color-checks-donut-success: #2ea043;--color-checks-donut-neutral: #8b949e;--color-checks-dropdown-text: #e6edf3;--color-checks-dropdown-bg: #161b22;--color-checks-dropdown-border: #30363d;--color-checks-dropdown-shadow: rgba(1,4,9,.3);--color-checks-dropdown-hover-text: #e6edf3;--color-checks-dropdown-hover-bg: rgba(110,118,129,.1);--color-checks-dropdown-btn-hover-text: #e6edf3;--color-checks-dropdown-btn-hover-bg: rgba(110,118,129,.1);--color-checks-scrollbar-thumb-bg: rgba(110,118,129,.4);--color-checks-header-label-text: #7d8590;--color-checks-header-label-open-text: #e6edf3;--color-checks-header-border: #21262d;--color-checks-header-icon: #7d8590;--color-checks-line-text: #7d8590;--color-checks-line-num-text: #6e7681;--color-checks-line-timestamp-text: #6e7681;--color-checks-line-hover-bg: rgba(110,118,129,.1);--color-checks-line-selected-bg: rgba(56,139,253,.1);--color-checks-line-selected-num-text: #2f81f7;--color-checks-line-dt-fm-text: #ffffff;--color-checks-line-dt-fm-bg: #9e6a03;--color-checks-gate-bg: rgba(187,128,9,.15);--color-checks-gate-text: #7d8590;--color-checks-gate-waiting-text: #d29922;--color-checks-step-header-open-bg: #161b22;--color-checks-step-error-text: #f85149;--color-checks-step-warning-text: #d29922;--color-checks-logline-text: #7d8590;--color-checks-logline-num-text: #6e7681;--color-checks-logline-debug-text: #a371f7;--color-checks-logline-error-text: #7d8590;--color-checks-logline-error-num-text: #6e7681;--color-checks-logline-error-bg: rgba(248,81,73,.1);--color-checks-logline-warning-text: #7d8590;--color-checks-logline-warning-num-text: #d29922;--color-checks-logline-warning-bg: rgba(187,128,9,.15);--color-checks-logline-command-text: #2f81f7;--color-checks-logline-section-text: #3fb950;--color-checks-ansi-black: #0d1117;--color-checks-ansi-black-bright: #161b22;--color-checks-ansi-white: #b1bac4;--color-checks-ansi-white-bright: #b1bac4;--color-checks-ansi-gray: #6e7681;--color-checks-ansi-red: #ff7b72;--color-checks-ansi-red-bright: #ffa198;--color-checks-ansi-green: #3fb950;--color-checks-ansi-green-bright: #56d364;--color-checks-ansi-yellow: #d29922;--color-checks-ansi-yellow-bright: #e3b341;--color-checks-ansi-blue: #58a6ff;--color-checks-ansi-blue-bright: #79c0ff;--color-checks-ansi-magenta: #bc8cff;--color-checks-ansi-magenta-bright: #d2a8ff;--color-checks-ansi-cyan: #76e3ea;--color-checks-ansi-cyan-bright: #b3f0ff;--color-project-header-bg: #0d1117;--color-project-sidebar-bg: #161b22;--color-project-gradient-in: #161b22;--color-project-gradient-out: rgba(22,27,34,0);--color-mktg-btn-bg: #f6f8fa;--color-mktg-btn-shadow-outline: rgb(255 255 255 / 25%) 0 0 0 1px inset;--color-mktg-btn-shadow-focus: rgb(255 255 255 / 25%) 0 0 0 4px;--color-mktg-btn-shadow-hover: 0 4px 7px rgba(0, 0, 0, .15), 0 100px 80px rgba(255, 255, 255, .02), 0 42px 33px rgba(255, 255, 255, .024), 0 22px 18px rgba(255, 255, 255, .028), 0 12px 10px rgba(255, 255, 255, .034), 0 7px 5px rgba(255, 255, 255, .04), 0 3px 2px rgba(255, 255, 255, .07);--color-mktg-btn-shadow-hover-muted: rgb(255 255 255) 0 0 0 2px inset;--color-control-border-color-emphasis: #606771;--color-avatar-bg: rgba(255,255,255,.1);--color-avatar-border: rgba(240,246,252,.1);--color-avatar-stack-fade: #30363d;--color-avatar-stack-fade-more: #21262d;--color-avatar-child-shadow: 0 0 0 2px #0d1117;--color-topic-tag-border: rgba(0,0,0,0);--color-counter-border: rgba(0,0,0,0);--color-select-menu-backdrop-border: #484f58;--color-select-menu-tap-highlight: rgba(48,54,61,.5);--color-select-menu-tap-focus-bg: #0c2d6b;--color-overlay-shadow: 0 0 0 1px #30363d, 0 16px 32px rgba(1,4,9,.85);--color-overlay-backdrop: rgba(22,27,34,.4);--color-header-text: rgba(255,255,255,.7);--color-header-bg: #161b22;--color-header-divider: #8b949e;--color-header-logo: #f0f6fc;--color-header-search-bg: #0d1117;--color-header-search-border: #30363d;--color-sidenav-selected-bg: #21262d;--color-menu-bg-active: #161b22;--color-input-disabled-bg: rgba(110,118,129,0);--color-timeline-badge-bg: #21262d;--color-ansi-black: #484f58;--color-ansi-black-bright: #6e7681;--color-ansi-white: #b1bac4;--color-ansi-white-bright: #ffffff;--color-ansi-gray: #6e7681;--color-ansi-red: #ff7b72;--color-ansi-red-bright: #ffa198;--color-ansi-green: #3fb950;--color-ansi-green-bright: #56d364;--color-ansi-yellow: #d29922;--color-ansi-yellow-bright: #e3b341;--color-ansi-blue: #58a6ff;--color-ansi-blue-bright: #79c0ff;--color-ansi-magenta: #bc8cff;--color-ansi-magenta-bright: #d2a8ff;--color-ansi-cyan: #39c5cf;--color-ansi-cyan-bright: #56d4dd;--color-btn-text: #c9d1d9;--color-btn-bg: #21262d;--color-btn-border: rgba(240,246,252,.1);--color-btn-shadow: 0 0 transparent;--color-btn-inset-shadow: 0 0 transparent;--color-btn-hover-bg: #30363d;--color-btn-hover-border: #8b949e;--color-btn-active-bg: hsla(212,12%,18%,1);--color-btn-active-border: #6e7681;--color-btn-selected-bg: #161b22;--color-btn-counter-bg: #30363d;--color-btn-primary-text: #ffffff;--color-btn-primary-bg: #238636;--color-btn-primary-border: rgba(240,246,252,.1);--color-btn-primary-shadow: 0 0 transparent;--color-btn-primary-inset-shadow: 0 0 transparent;--color-btn-primary-hover-bg: #2ea043;--color-btn-primary-hover-border: rgba(240,246,252,.1);--color-btn-primary-selected-bg: #238636;--color-btn-primary-selected-shadow: 0 0 transparent;--color-btn-primary-disabled-text: rgba(255,255,255,.5);--color-btn-primary-disabled-bg: rgba(35,134,54,.6);--color-btn-primary-disabled-border: rgba(240,246,252,.1);--color-btn-primary-icon: #ffffff;--color-btn-primary-counter-bg: rgba(4,38,15,.2);--color-btn-outline-text: #388bfd;--color-btn-outline-hover-text: #58a6ff;--color-btn-outline-hover-bg: #30363d;--color-btn-outline-hover-border: rgba(240,246,252,.1);--color-btn-outline-hover-shadow: 0 1px 0 rgba(1,4,9,.1);--color-btn-outline-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,.03);--color-btn-outline-hover-counter-bg: rgba(5,29,77,.2);--color-btn-outline-selected-text: #ffffff;--color-btn-outline-selected-bg: #0d419d;--color-btn-outline-selected-border: rgba(240,246,252,.1);--color-btn-outline-selected-shadow: 0 0 transparent;--color-btn-outline-disabled-text: rgba(88,166,255,.5);--color-btn-outline-disabled-bg: #0d1117;--color-btn-outline-disabled-counter-bg: rgba(31,111,235,.05);--color-btn-outline-counter-bg: rgba(5,29,77,.2);--color-btn-outline-hover-counter-fg: #58a6ff;--color-btn-outline-disabled-counter-fg: rgba(47,129,247,.5);--color-btn-outline-counter-fg: #388bfd;--color-btn-danger-text: #f85149;--color-btn-danger-hover-text: #ffffff;--color-btn-danger-hover-bg: #da3633;--color-btn-danger-hover-border: #f85149;--color-btn-danger-hover-shadow: 0 0 transparent;--color-btn-danger-hover-inset-shadow: 0 0 transparent;--color-btn-danger-hover-icon: #ffffff;--color-btn-danger-hover-counter-bg: rgba(255,255,255,.2);--color-btn-danger-selected-text: #ffffff;--color-btn-danger-selected-bg: #b62324;--color-btn-danger-selected-border: #ff7b72;--color-btn-danger-selected-shadow: 0 0 transparent;--color-btn-danger-disabled-text: rgba(248,81,73,.5);--color-btn-danger-disabled-bg: #0d1117;--color-btn-danger-disabled-counter-bg: rgba(218,54,51,.05);--color-btn-danger-counter-bg: rgba(73,2,2,.2);--color-btn-danger-icon: #f85149;--color-btn-danger-counter-fg: #f85149;--color-btn-danger-disabled-counter-fg: rgba(248,81,73,.5);--color-btn-danger-hover-counter-fg: #ffffff;--color-underlinenav-icon: #6e7681;--color-underlinenav-border-hover: rgba(110,118,129,.4);--color-action-list-item-inline-divider: rgba(48,54,61,.48);--color-action-list-item-default-hover-bg: rgba(177,186,196,.12);--color-action-list-item-default-hover-border: rgba(0,0,0,0);--color-action-list-item-default-active-bg: rgba(177,186,196,.2);--color-action-list-item-default-active-border: rgba(0,0,0,0);--color-action-list-item-default-selected-bg: rgba(177,186,196,.08);--color-action-list-item-danger-hover-bg: rgba(248,81,73,.16);--color-action-list-item-danger-active-bg: rgba(248,81,73,.24);--color-action-list-item-danger-hover-text: #ff7b72;--color-switch-track-bg: rgba(110,118,129,.1);--color-switch-track-hover-bg: hsla(215,8%,72%,.1);--color-switch-track-active-bg: rgba(110,118,129,.4);--color-switch-track-disabled-bg: #21262d;--color-switch-track-fg: #7d8590;--color-switch-track-disabled-fg: #010409;--color-switch-track-border: rgba(0,0,0,0);--color-switch-track-checked-bg: rgba(31,111,235,.35);--color-switch-track-checked-hover-bg: rgba(31,111,235,.5);--color-switch-track-checked-active-bg: rgba(31,111,235,.65);--color-switch-track-checked-fg: #ffffff;--color-switch-track-checked-disabled-fg: #010409;--color-switch-track-checked-border: rgba(0,0,0,0);--color-switch-knob-bg: #0d1117;--color-switch-knob-border: #606771;--color-switch-knob-disabled-bg: #161b22;--color-switch-knob-checked-bg: #0d1117;--color-switch-knob-checked-disabled-bg: #161b22;--color-switch-knob-checked-border: rgba(31,111,235,.35);--color-segmented-control-bg: rgba(110,118,129,.1);--color-segmented-control-button-bg: #0d1117;--color-segmented-control-button-hover-bg: #30363d;--color-segmented-control-button-active-bg: #21262d;--color-segmented-control-button-selected-border: #6e7681;--color-tree-view-item-chevron-hover-bg: rgba(177,186,196,.12);--color-tree-view-item-directory-fill: #7d8590;--color-fg-default: #e6edf3;--color-fg-muted: #7d8590;--color-fg-subtle: #6e7681;--color-fg-on-emphasis: #ffffff;--color-canvas-default: #0d1117;--color-canvas-overlay: #161b22;--color-canvas-inset: #010409;--color-canvas-subtle: #161b22;--color-border-default: #30363d;--color-border-muted: #21262d;--color-border-subtle: rgba(240,246,252,.1);--color-shadow-small: 0 0 transparent;--color-shadow-medium: 0 3px 6px #010409;--color-shadow-large: 0 8px 24px #010409;--color-shadow-extra-large: 0 12px 48px #010409;--color-neutral-emphasis-plus: #6e7681;--color-neutral-emphasis: #6e7681;--color-neutral-muted: rgba(110,118,129,.4);--color-neutral-subtle: rgba(110,118,129,.1);--color-accent-fg: #2f81f7;--color-accent-emphasis: #1f6feb;--color-accent-muted: rgba(56,139,253,.4);--color-accent-subtle: rgba(56,139,253,.1);--color-success-fg: #3fb950;--color-success-emphasis: #238636;--color-success-muted: rgba(46,160,67,.4);--color-success-subtle: rgba(46,160,67,.15);--color-attention-fg: #d29922;--color-attention-emphasis: #9e6a03;--color-attention-muted: rgba(187,128,9,.4);--color-attention-subtle: rgba(187,128,9,.15);--color-severe-fg: #db6d28;--color-severe-emphasis: #bd561d;--color-severe-muted: rgba(219,109,40,.4);--color-severe-subtle: rgba(219,109,40,.1);--color-danger-fg: #f85149;--color-danger-emphasis: #da3633;--color-danger-muted: rgba(248,81,73,.4);--color-danger-subtle: rgba(248,81,73,.1);--color-open-fg: #3fb950;--color-open-emphasis: #238636;--color-open-muted: rgba(46,160,67,.4);--color-open-subtle: rgba(46,160,67,.15);--color-closed-fg: #f85149;--color-closed-emphasis: #da3633;--color-closed-muted: rgba(248,81,73,.4);--color-closed-subtle: rgba(248,81,73,.15);--color-done-fg: #a371f7;--color-done-emphasis: #8957e5;--color-done-muted: rgba(163,113,247,.4);--color-done-subtle: rgba(163,113,247,.1);--color-sponsors-fg: #db61a2;--color-sponsors-emphasis: #bf4b8a;--color-sponsors-muted: rgba(219,97,162,.4);--color-sponsors-subtle: rgba(219,97,162,.1);--color-primer-fg-disabled: #484f58;--color-primer-canvas-backdrop: rgba(1,4,9,.8);--color-primer-canvas-sticky: rgba(13,17,23,.95);--color-primer-border-active: #f78166;--color-primer-border-contrast: rgba(255,255,255,.2);--color-primer-shadow-highlight: 0 0 transparent;--color-primer-shadow-inset: 0 0 transparent;--color-scale-black: #010409;--color-scale-white: #ffffff;--color-scale-gray-0: #f0f6fc;--color-scale-gray-1: #c9d1d9;--color-scale-gray-2: #b1bac4;--color-scale-gray-3: #8b949e;--color-scale-gray-4: #6e7681;--color-scale-gray-5: #484f58;--color-scale-gray-6: #30363d;--color-scale-gray-7: #21262d;--color-scale-gray-8: #161b22;--color-scale-gray-9: #0d1117;--color-scale-blue-0: #cae8ff;--color-scale-blue-1: #a5d6ff;--color-scale-blue-2: #79c0ff;--color-scale-blue-3: #58a6ff;--color-scale-blue-4: #388bfd;--color-scale-blue-5: #1f6feb;--color-scale-blue-6: #1158c7;--color-scale-blue-7: #0d419d;--color-scale-blue-8: #0c2d6b;--color-scale-blue-9: #051d4d;--color-scale-green-0: #aff5b4;--color-scale-green-1: #7ee787;--color-scale-green-2: #56d364;--color-scale-green-3: #3fb950;--color-scale-green-4: #2ea043;--color-scale-green-5: #238636;--color-scale-green-6: #196c2e;--color-scale-green-7: #0f5323;--color-scale-green-8: #033a16;--color-scale-green-9: #04260f;--color-scale-yellow-0: #f8e3a1;--color-scale-yellow-1: #f2cc60;--color-scale-yellow-2: #e3b341;--color-scale-yellow-3: #d29922;--color-scale-yellow-4: #bb8009;--color-scale-yellow-5: #9e6a03;--color-scale-yellow-6: #845306;--color-scale-yellow-7: #693e00;--color-scale-yellow-8: #4b2900;--color-scale-yellow-9: #341a00;--color-scale-orange-0: #ffdfb6;--color-scale-orange-1: #ffc680;--color-scale-orange-2: #ffa657;--color-scale-orange-3: #f0883e;--color-scale-orange-4: #db6d28;--color-scale-orange-5: #bd561d;--color-scale-orange-6: #9b4215;--color-scale-orange-7: #762d0a;--color-scale-orange-8: #5a1e02;--color-scale-orange-9: #3d1300;--color-scale-red-0: #ffdcd7;--color-scale-red-1: #ffc1ba;--color-scale-red-2: #ffa198;--color-scale-red-3: #ff7b72;--color-scale-red-4: #f85149;--color-scale-red-5: #da3633;--color-scale-red-6: #b62324;--color-scale-red-7: #8e1519;--color-scale-red-8: #67060c;--color-scale-red-9: #490202;--color-scale-purple-0: #eddeff;--color-scale-purple-1: #e2c5ff;--color-scale-purple-2: #d2a8ff;--color-scale-purple-3: #bc8cff;--color-scale-purple-4: #a371f7;--color-scale-purple-5: #8957e5;--color-scale-purple-6: #6e40c9;--color-scale-purple-7: #553098;--color-scale-purple-8: #3c1e70;--color-scale-purple-9: #271052;--color-scale-pink-0: #ffdaec;--color-scale-pink-1: #ffbedd;--color-scale-pink-2: #ff9bce;--color-scale-pink-3: #f778ba;--color-scale-pink-4: #db61a2;--color-scale-pink-5: #bf4b8a;--color-scale-pink-6: #9e3670;--color-scale-pink-7: #7d2457;--color-scale-pink-8: #5e103e;--color-scale-pink-9: #42062a;--color-scale-coral-0: #ffddd2;--color-scale-coral-1: #ffc2b2;--color-scale-coral-2: #ffa28b;--color-scale-coral-3: #f78166;--color-scale-coral-4: #ea6045;--color-scale-coral-5: #cf462d;--color-scale-coral-6: #ac3220;--color-scale-coral-7: #872012;--color-scale-coral-8: #640d04;--color-scale-coral-9: #460701}.code-diff-view[theme=dark] pre code.hljs{display:block;overflow-x:auto;padding:1em}.code-diff-view[theme=dark] code.hljs{padding:3px 5px}.code-diff-view[theme=dark] .hljs{color:#c9d1d9;background:#0d1117}.code-diff-view[theme=dark] .hljs-doctag,.code-diff-view[theme=dark] .hljs-keyword,.code-diff-view[theme=dark] .hljs-meta .hljs-keyword,.code-diff-view[theme=dark] .hljs-template-tag,.code-diff-view[theme=dark] .hljs-template-variable,.code-diff-view[theme=dark] .hljs-type,.code-diff-view[theme=dark] .hljs-variable.language_{color:#ff7b72}.code-diff-view[theme=dark] .hljs-title,.code-diff-view[theme=dark] .hljs-title.class_,.code-diff-view[theme=dark] .hljs-title.class_.inherited__,.code-diff-view[theme=dark] .hljs-title.function_{color:#d2a8ff}.code-diff-view[theme=dark] .hljs-attr,.code-diff-view[theme=dark] .hljs-attribute,.code-diff-view[theme=dark] .hljs-literal,.code-diff-view[theme=dark] .hljs-meta,.code-diff-view[theme=dark] .hljs-number,.code-diff-view[theme=dark] .hljs-operator,.code-diff-view[theme=dark] .hljs-variable,.code-diff-view[theme=dark] .hljs-selector-attr,.code-diff-view[theme=dark] .hljs-selector-class,.code-diff-view[theme=dark] .hljs-selector-id{color:#79c0ff}.code-diff-view[theme=dark] .hljs-regexp,.code-diff-view[theme=dark] .hljs-string,.code-diff-view[theme=dark] .hljs-meta .hljs-string{color:#a5d6ff}.code-diff-view[theme=dark] .hljs-built_in,.code-diff-view[theme=dark] .hljs-symbol{color:#ffa657}.code-diff-view[theme=dark] .hljs-comment,.code-diff-view[theme=dark] .hljs-code,.code-diff-view[theme=dark] .hljs-formula{color:#8b949e}.code-diff-view[theme=dark] .hljs-name,.code-diff-view[theme=dark] .hljs-quote,.code-diff-view[theme=dark] .hljs-selector-tag,.code-diff-view[theme=dark] .hljs-selector-pseudo{color:#7ee787}.code-diff-view[theme=dark] .hljs-subst{color:#c9d1d9}.code-diff-view[theme=dark] .hljs-section{color:#1f6feb;font-weight:700}.code-diff-view[theme=dark] .hljs-bullet{color:#f2cc60}.code-diff-view[theme=dark] .hljs-emphasis{color:#c9d1d9;font-style:italic}.code-diff-view[theme=dark] .hljs-strong{color:#c9d1d9;font-weight:700}.code-diff-view[theme=dark] .hljs-addition{color:#aff5b4;background-color:#033a16}.code-diff-view[theme=dark] .hljs-deletion{color:#ffdcd7;background-color:#67060c}.code-diff-view{position:relative;margin-top:16px;margin-bottom:16px;border:1px solid var(--color-border-default, #ddd);border-radius:6px;overflow-y:auto}.code-diff-view *{position:static;box-sizing:border-box}.code-diff-view .file-header{position:sticky;top:0;z-index:1;background-color:var(--color-canvas-subtle);border-bottom:1px solid var(--color-border-default);padding:8px 16px;font-size:12px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.code-diff-view .file-header .file-info{display:flex;justify-content:space-between;align-items:center;margin-left:8px;height:24px}.code-diff-view .file-header .file-info .info-left{color:var(--color-fg-default)}.code-diff-view .file-header .file-info .info-right{display:flex;justify-content:space-between;align-items:center;width:50%}.code-diff-view .file-header .file-info .diff-stat{display:inline-flex;align-items:center;gap:8px}.code-diff-view .file-header .file-info .diff-stat .diff-stat-added{color:var(--color-diffstat-addition-bg)}.code-diff-view .file-header .file-info .diff-stat .diff-stat-deleted{color:var(--color-danger-emphasis)}.code-diff-view .file-header .file-info .diff-stat .diff-stat-ignored{color:var(--color-fg-subtle)}.code-diff-view .file-header .file-info .diff-commandbar{margin-left:auto;margin-right:1rem}.code-diff-view .file-header .file-info .diff-commandbar .command-item-button{background-color:transparent;color:var(--color-fg-subtle);border:none}.code-diff-view .file-header .file-info .diff-commandbar .command-item-button svg{fill:var(--color-fg-subtle)}.code-diff-view .file-header .file-info .diff-commandbar .command-item-button:hover{background-color:var(--color-btn-outline-hover-border)}.code-diff-view table{border-spacing:0}.code-diff-view .diff-table{width:100%}.code-diff-view .diff-table .blob-num{position:relative;width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;line-height:20px;color:var(--color-fg-subtle);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.code-diff-view .diff-table .blob-num-deletion{color:var(--color-diff-blob-deletion-num-text);background-color:var(--color-diff-blob-deletion-num-bg);border-color:var(--color-danger-emphasis)}.code-diff-view .diff-table .blob-num-addition{color:var(--color-diff-blob-addition-num-text);background-color:var(--color-diff-blob-addition-num-bg);border-color:var(--color-success-emphasis)}.code-diff-view .diff-table .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}.code-diff-view .diff-table .blob-code .blob-code-inner{display:table-cell;overflow:visible;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;color:var(--color-fg-default);word-wrap:anywhere;white-space:pre-wrap}.code-diff-view .diff-table .blob-code-deletion{background-color:var(--color-diff-blob-deletion-line-bg);outline:1px dashed transparent}.code-diff-view .diff-table .blob-code-deletion .x{color:var(--color-diff-blob-deletion-fg);background-color:var(--color-diff-blob-deletion-word-bg)}.code-diff-view .diff-table .blob-code-addition{background-color:var(--color-diff-blob-addition-line-bg);outline:1px dotted transparent}.code-diff-view .diff-table .blob-code-addition .x{color:var(--color-diff-blob-addition-fg);background-color:var(--color-diff-blob-addition-word-bg)}.code-diff-view .diff-table .current-diff{border:1px solid var(--color-border-muted)}.code-diff-view .diff-table .blob-code-context,.code-diff-view .diff-table .blob-code-addition,.code-diff-view .diff-table .blob-code-deletion{padding-left:22px!important}.code-diff-view .diff-table .blob-code-marker:before{position:absolute;top:1px;left:8px;padding-right:8px;content:attr(data-code-marker)}.code-diff-view .diff-table .blob-num-hunk{background-color:var(--color-diff-blob-hunk-num-bg)}.code-diff-view .diff-table .blob-code-hunk{background-color:var(--color-accent-subtle)}.code-diff-view .file-diff-split{table-layout:fixed}.code-diff-view .file-diff-split .blob-code+.blob-num{border-left:1px solid var(--color-border-muted)}.code-diff-view .file-diff-split .no-select{user-select:none}.code-diff-view .empty-cell{cursor:default;background-color:var(--color-neutral-subtle);border-right-color:var(--color-border-muted)}.code-diff-view[data-v-0c5adc58] td:nth-child(1){display:none}")), document.head.appendChild(o);
}
} catch (e) {
console.error("vite-plugin-css-injected-by-js", e);
}
})();
function ae() {}
ae.prototype = {
diff: function(r, l) {
var f, h$1 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, n = h$1.callback;
typeof h$1 == "function" && (n = h$1, h$1 = {}), this.options = h$1;
var t = this;
function i$1(w) {
return n ? (setTimeout(function() {
n(void 0, w);
}, 0), !0) : w;
}
r = this.castInput(r), l = this.castInput(l), r = this.removeEmpty(this.tokenize(r)), l = this.removeEmpty(this.tokenize(l));
var s = l.length, o = r.length, a = 1, c$1 = s + o;
h$1.maxEditLength && (c$1 = Math.min(c$1, h$1.maxEditLength));
var u = (f = h$1.timeout) !== null && f !== void 0 ? f : Infinity, d = Date.now() + u, g = [{
oldPos: -1,
lastComponent: void 0
}], p = this.extractCommon(g[0], l, r, 0);
if (g[0].oldPos + 1 >= o && p + 1 >= s) return i$1([{
value: this.join(l),
count: l.length
}]);
var _ = -Infinity, m = Infinity;
function E() {
for (var w = Math.max(_, -a); w <= Math.min(m, a); w += 2) {
var D = void 0, T = g[w - 1], M = g[w + 1];
T && (g[w - 1] = void 0);
var R = !1;
if (M) {
var L = M.oldPos - w;
R = M && 0 <= L && L < s;
}
var O = T && T.oldPos + 1 < o;
if (!R && !O) {
g[w] = void 0;
continue;
}
if (!O || R && T.oldPos + 1 < M.oldPos ? D = t.addToPath(M, !0, void 0, 0) : D = t.addToPath(T, void 0, !0, 1), p = t.extractCommon(D, l, r, w), D.oldPos + 1 >= o && p + 1 >= s) return i$1(Yn(t, D.lastComponent, l, r, t.useLongestToken));
g[w] = D, D.oldPos + 1 >= o && (m = Math.min(m, w - 1)), p + 1 >= s && (_ = Math.max(_, w + 1));
}
a++;
}
if (n) (function w() {
setTimeout(function() {
if (a > c$1 || Date.now() > d) return n();
E() || w();
}, 0);
})();
else for (; a <= c$1 && Date.now() <= d;) {
var v = E();
if (v) return v;
}
},
addToPath: function(r, l, f, h$1) {
var n = r.lastComponent;
return n && n.added === l && n.removed === f ? {
oldPos: r.oldPos + h$1,
lastComponent: {
count: n.count + 1,
added: l,
removed: f,
previousComponent: n.previousComponent
}
} : {
oldPos: r.oldPos + h$1,
lastComponent: {
count: 1,
added: l,
removed: f,
previousComponent: n
}
};
},
extractCommon: function(r, l, f, h$1) {
for (var n = l.length, t = f.length, i$1 = r.oldPos, s = i$1 - h$1, o = 0; s + 1 < n && i$1 + 1 < t && this.equals(l[s + 1], f[i$1 + 1]);) s++, i$1++, o++;
return o && (r.lastComponent = {
count: o,
previousComponent: r.lastComponent
}), r.oldPos = i$1, s;
},
equals: function(r, l) {
return this.options.comparator ? this.options.comparator(r, l) : r === l || this.options.ignoreCase && r.toLowerCase() === l.toLowerCase();
},
removeEmpty: function(r) {
for (var l = [], f = 0; f < r.length; f++) r[f] && l.push(r[f]);
return l;
},
castInput: function(r) {
return r;
},
tokenize: function(r) {
return r.split("");
},
join: function(r) {
return r.join("");
}
};
function Yn(e, r, l, f, h$1) {
for (var n = [], t; r;) n.push(r), t = r.previousComponent, delete r.previousComponent, r = t;
n.reverse();
for (var i$1 = 0, s = n.length, o = 0, a = 0; i$1 < s; i$1++) {
var c$1 = n[i$1];
if (c$1.removed) {
if (c$1.value = e.join(f.slice(a, a + c$1.count)), a += c$1.count, i$1 && n[i$1 - 1].added) {
var d = n[i$1 - 1];
n[i$1 - 1] = n[i$1], n[i$1] = d;
}
} else {
if (!c$1.added && h$1) {
var u = l.slice(o, o + c$1.count);
u = u.map(function(p, _) {
var m = f[a + _];
return m.length > p.length ? m : p;
}), c$1.value = e.join(u);
} else c$1.value = e.join(l.slice(o, o + c$1.count));
o += c$1.count, c$1.added || (a += c$1.count);
}
}
var g = n[s - 1];
return s > 1 && typeof g.value == "string" && (g.added || g.removed) && e.equals("", g.value) && (n[s - 2].value += g.value, n.pop()), n;
}
var Xn = new ae();
function Vn(e, r, l) {
return Xn.diff(e, r, l);
}
function jn(e, r) {
if (typeof e == "function") r.callback = e;
else if (e) for (var l in e) e.hasOwnProperty(l) && (r[l] = e[l]);
return r;
}
var sn = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/, an = /\S/, We = new ae();
We.equals = function(e, r) {
return this.options.ignoreCase && (e = e.toLowerCase(), r = r.toLowerCase()), e === r || this.options.ignoreWhitespace && !an.test(e) && !an.test(r);
};
We.tokenize = function(e) {
for (var r = e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/), l = 0; l < r.length - 1; l++) !r[l + 1] && r[l + 2] && sn.test(r[l]) && sn.test(r[l + 2]) && (r[l] += r[l + 2], r.splice(l + 1, 2), l--);
return r;
};
function qn(e, r, l) {
return l = jn(l, { ignoreWhitespace: !0 }), We.diff(e, r, l);
}
var mn = new ae();
mn.tokenize = function(e) {
this.options.stripTrailingCr && (e = e.replace(/\r\n/g, `
`));
var r = [], l = e.split(/(\n|\r\n)/);
l[l.length - 1] || l.pop();
for (var f = 0; f < l.length; f++) {
var h$1 = l[f];
f % 2 && !this.options.newlineIsToken ? r[r.length - 1] += h$1 : (this.options.ignoreWhitespace && (h$1 = h$1.trim()), r.push(h$1));
}
return r;
};
var Jn = new ae();
Jn.tokenize = function(e) {
return e.split(/(\S.+?[.!?])(?=\s+|$)/);
};
var et = new ae();
et.tokenize = function(e) {
return e.split(/([{}:;,]|\s+)/);
};
function Ie(e) {
"@babel/helpers - typeof";
return typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? Ie = function(r) {
return typeof r;
} : Ie = function(r) {
return r && typeof Symbol == "function" && r.constructor === Symbol && r !== Symbol.prototype ? "symbol" : typeof r;
}, Ie(e);
}
var nt = Object.prototype.toString, Ne = new ae();
Ne.useLongestToken = !0;
Ne.tokenize = mn.tokenize;
Ne.castInput = function(e) {
var r = this.options, l = r.undefinedReplacement, f = r.stringifyReplacer, h$1 = f === void 0 ? function(n, t) {
return typeof t == "undefined" ? l : t;
} : f;
return typeof e == "string" ? e : JSON.stringify(ze(e, null, null, h$1), h$1, " ");
};
Ne.equals = function(e, r) {
return ae.prototype.equals.call(Ne, e.replace(/,([\r\n])/g, "$1"), r.replace(/,([\r\n])/g, "$1"));
};
function ze(e, r, l, f, h$1) {
r = r || [], l = l || [], f && (e = f(h$1, e));
var n;
for (n = 0; n < r.length; n += 1) if (r[n] === e) return l[n];
var t;
if (nt.call(e) === "[object Array]") {
for (r.push(e), t = new Array(e.length), l.push(t), n = 0; n < e.length; n += 1) t[n] = ze(e[n], r, l, f, h$1);
return r.pop(), l.pop(), t;
}
if (e && e.toJSON && (e = e.toJSON()), Ie(e) === "object" && e !== null) {
r.push(e), t = {}, l.push(t);
var i$1 = [], s;
for (s in e) e.hasOwnProperty(s) && i$1.push(s);
for (i$1.sort(), n = 0; n < i$1.length; n += 1) s = i$1[n], t[s] = ze(e[s], r, l, f, s);
r.pop(), l.pop();
} else t = e;
return t;
}
var Ge = new ae();
Ge.tokenize = function(e) {
return e.slice();
};
Ge.join = Ge.removeEmpty = function(e) {
return e;
};
function tt(e) {
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
}
var En = { exports: {} };
(function(e) {
var r = function() {
this.Diff_Timeout = 1, this.Diff_EditCost = 4, this.Match_Threshold = .5, this.Match_Distance = 1e3, this.Patch_DeleteThreshold = .5, this.Patch_Margin = 4, this.Match_MaxBits = 32;
}, l = -1, f = 1, h$1 = 0;
r.Diff = function(n, t) {
return [n, t];
}, r.prototype.diff_main = function(n, t, i$1, s) {
typeof s == "undefined" && (this.Diff_Timeout <= 0 ? s = Number.MAX_VALUE : s = (/* @__PURE__ */ new Date()).getTime() + this.Diff_Timeout * 1e3);
var o = s;
if (n == null || t == null) throw new Error("Null input. (diff_main)");
if (n == t) return n ? [new r.Diff(h$1, n)] : [];
typeof i$1 == "undefined" && (i$1 = !0);
var a = i$1, c$1 = this.diff_commonPrefix(n, t), u = n.substring(0, c$1);
n = n.substring(c$1), t = t.substring(c$1), c$1 = this.diff_commonSuffix(n, t);
var d = n.substring(n.length - c$1);
n = n.substring(0, n.length - c$1), t = t.substring(0, t.length - c$1);
var g = this.diff_compute_(n, t, a, o);
return u && g.unshift(new r.Diff(h$1, u)), d && g.push(new r.Diff(h$1, d)), this.diff_cleanupMerge(g), g;
}, r.prototype.diff_compute_ = function(n, t, i$1, s) {
var o;
if (!n) return [new r.Diff(f, t)];
if (!t) return [new r.Diff(l, n)];
var a = n.length > t.length ? n : t, c$1 = n.length > t.length ? t : n, u = a.indexOf(c$1);
if (u != -1) return o = [
new r.Diff(f, a.substring(0, u)),
new r.Diff(h$1, c$1),
new r.Diff(f, a.substring(u + c$1.length))
], n.length > t.length && (o[0][0] = o[2][0] = l), o;
if (c$1.length == 1) return [new r.Diff(l, n), new r.Diff(f, t)];
var d = this.diff_halfMatch_(n, t);
if (d) {
var g = d[0], p = d[1], _ = d[2], m = d[3], E = d[4], v = this.diff_main(g, _, i$1, s), w = this.diff_main(p, m, i$1, s);
return v.concat([new r.Diff(h$1, E)], w);
}
return i$1 && n.length > 100 && t.length > 100 ? this.diff_lineMode_(n, t, s) : this.diff_bisect_(n, t, s);
}, r.prototype.diff_lineMode_ = function(n, t, i$1) {
var s = this.diff_linesToChars_(n, t);
n = s.chars1, t = s.chars2;
var o = s.lineArray, a = this.diff_main(n, t, !1, i$1);
this.diff_charsToLines_(a, o), this.diff_cleanupSemantic(a), a.push(new r.Diff(h$1, ""));
for (var c$1 = 0, u = 0, d = 0, g = "", p = ""; c$1 < a.length;) {
switch (a[c$1][0]) {
case f:
d++, p += a[c$1][1];
break;
case l:
u++, g += a[c$1][1];
break;
case h$1:
if (u >= 1 && d >= 1) {
a.splice(c$1 - u - d, u + d), c$1 = c$1 - u - d;
for (var _ = this.diff_main(g, p, !1, i$1), m = _.length - 1; m >= 0; m--) a.splice(c$1, 0, _[m]);
c$1 = c$1 + _.length;
}
d = 0, u = 0, g = "", p = "";
break;
}
c$1++;
}
return a.pop(), a;
}, r.prototype.diff_bisect_ = function(n, t, i$1) {
for (var s = n.length, o = t.length, a = Math.ceil((s + o) / 2), c$1 = a, u = 2 * a, d = new Array(u), g = new Array(u), p = 0; p < u; p++) d[p] = -1, g[p] = -1;
d[c$1 + 1] = 0, g[c$1 + 1] = 0;
for (var _ = s - o, m = _ % 2 != 0, E = 0, v = 0, w = 0, D = 0, T = 0; T < a && !((/* @__PURE__ */ new Date()).getTime() > i$1); T++) {
for (var M = -T + E; M <= T - v; M += 2) {
var R = c$1 + M, L;
M == -T || M != T && d[R - 1] < d[R + 1] ? L = d[R + 1] : L = d[R - 1] + 1;
for (var O = L - M; L < s && O < o && n.charAt(L) == t.charAt(O);) L++, O++;
if (d[R] = L, L > s) v += 2;
else if (O > o) E += 2;
else if (m) {
var P = c$1 + _ - M;
if (P >= 0 && P < u && g[P] != -1) {
var $ = s - g[P];
if (L >= $) return this.diff_bisectSplit_(n, t, L, O, i$1);
}
}
}
for (var K = -T + w; K <= T - D; K += 2) {
var P = c$1 + K, $;
K == -T || K != T && g[P - 1] < g[P + 1] ? $ = g[P + 1] : $ = g[P - 1] + 1;
for (var Y = $ - K; $ < s && Y < o && n.charAt(s - $ - 1) == t.charAt(o - Y - 1);) $++, Y++;
if (g[P] = $, $ > s) D += 2;
else if (Y > o) w += 2;
else if (!m) {
var R = c$1 + _ - K;
if (R >= 0 && R < u && d[R] != -1) {
var L = d[R], O = c$1 + L - R;
if ($ = s - $, L >= $) return this.diff_bisectSplit_(n, t, L, O, i$1);
}
}
}
}
return [new r.Diff(l, n), new r.Diff(f, t)];
}, r.prototype.diff_bisectSplit_ = function(n, t, i$1, s, o) {
var a = n.substring(0, i$1), c$1 = t.substring(0, s), u = n.substring(i$1), d = t.substring(s), g = this.diff_main(a, c$1, !1, o), p = this.diff_main(u, d, !1, o);
return g.concat(p);
}, r.prototype.diff_linesToChars_ = function(n, t) {
var i$1 = [], s = {};
i$1[0] = "";
function o(d) {
for (var g = "", p = 0, _ = -1, m = i$1.length; _ < d.length - 1;) {
_ = d.indexOf(`
`, p), _ == -1 && (_ = d.length - 1);
var E = d.substring(p, _ + 1);
(s.hasOwnProperty ? s.hasOwnProperty(E) : s[E] !== void 0) ? g += String.fromCharCode(s[E]) : (m == a && (E = d.substring(p), _ = d.length), g += String.fromCharCode(m), s[E] = m, i$1[m++] = E), p = _ + 1;
}
return g;
}
var a = 4e4, c$1 = o(n);
a = 65535;
return {
chars1: c$1,
chars2: o(t),
lineArray: i$1
};
}, r.prototype.diff_charsToLines_ = function(n, t) {
for (var i$1 = 0; i$1 < n.length; i$1++) {
for (var s = n[i$1][1], o = [], a = 0; a < s.length; a++) o[a] = t[s.charCodeAt(a)];
n[i$1][1] = o.join("");
}
}, r.prototype.diff_commonPrefix = function(n, t) {
if (!n || !t || n.charAt(0) != t.charAt(0)) return 0;
for (var i$1 = 0, s = Math.min(n.length, t.length), o = s, a = 0; i$1 < o;) n.substring(a, o) == t.substring(a, o) ? (i$1 = o, a = i$1) : s = o, o = Math.floor((s - i$1) / 2 + i$1);
return o;
}, r.prototype.diff_commonSuffix = function(n, t) {
if (!n || !t || n.charAt(n.length - 1) != t.charAt(t.length - 1)) return 0;
for (var i$1 = 0, s = Math.min(n.length, t.length), o = s, a = 0; i$1 < o;) n.substring(n.length - o, n.length - a) == t.substring(t.length - o, t.length - a) ? (i$1 = o, a = i$1) : s = o, o = Math.floor((s - i$1) / 2 + i$1);
return o;
}, r.prototype.diff_commonOverlap_ = function(n, t) {
var i$1 = n.length, s = t.length;
if (i$1 == 0 || s == 0) return 0;
i$1 > s ? n = n.substring(i$1 - s) : i$1 < s && (t = t.substring(0, i$1));
var o = Math.min(i$1, s);
if (n == t) return o;
for (var a = 0, c$1 = 1;;) {
var u = n.substring(o - c$1), d = t.indexOf(u);
if (d == -1) return a;
c$1 += d, (d == 0 || n.substring(o - c$1) == t.substring(0, c$1)) && (a = c$1, c$1++);
}
}, r.prototype.diff_halfMatch_ = function(n, t) {
if (this.Diff_Timeout <= 0) return null;
var i$1 = n.length > t.length ? n : t, s = n.length > t.length ? t : n;
if (i$1.length < 4 || s.length * 2 < i$1.length) return null;
var o = this;
function a(v, w, D) {
for (var T = v.substring(D, D + Math.floor(v.length / 4)), M = -1, R = "", L, O, P, $; (M = w.indexOf(T, M + 1)) != -1;) {
var K = o.diff_commonPrefix(v.substring(D), w.substring(M)), Y = o.diff_commonSuffix(v.substring(0, D), w.substring(0, M));
R.length < Y + K && (R = w.substring(M - Y, M) + w.substring(M, M + K), L = v.substring(0, D - Y), O = v.substring(D + K), P = w.substring(0, M - Y), $ = w.substring(M + K));
}
return R.length * 2 >= v.length ? [
L,
O,
P,
$,
R
] : null;
}
var c$1 = a(i$1, s, Math.ceil(i$1.length / 4)), u = a(i$1, s, Math.ceil(i$1.length / 2)), d;
if (!c$1 && !u) return null;
u ? c$1 ? d = c$1[4].length > u[4].length ? c$1 : u : d = u : d = c$1;
var g, p, _, m;
n.length > t.length ? (g = d[0], p = d[1], _ = d[2], m = d[3]) : (_ = d[0], m = d[1], g = d[2], p = d[3]);
var E = d[4];
return [
g,
p,
_,
m,
E
];
}, r.prototype.diff_cleanupSemantic = function(n) {
for (var t = !1, i$1 = [], s = 0, o = null, a = 0, c$1 = 0, u = 0, d = 0, g = 0; a < n.length;) n[a][0] == h$1 ? (i$1[s++] = a, c$1 = d, u = g, d = 0, g = 0, o = n[a][1]) : (n[a][0] == f ? d += n[a][1].length : g += n[a][1].length, o && o.length <= Math.max(c$1, u) && o.length <= Math.max(d, g) && (n.splice(i$1[s - 1], 0, new r.Diff(l, o)), n[i$1[s - 1] + 1][0] = f, s--, s--, a = s > 0 ? i$1[s - 1] : -1, c$1 = 0, u = 0, d = 0, g = 0, o = null, t = !0)), a++;
for (t && this.diff_cleanupMerge(n), this.diff_cleanupSemanticLossless(n), a = 1; a < n.length;) {
if (n[a - 1][0] == l && n[a][0] == f) {
var p = n[a - 1][1], _ = n[a][1], m = this.diff_commonOverlap_(p, _), E = this.diff_commonOverlap_(_, p);
m >= E ? (m >= p.length / 2 || m >= _.length / 2) && (n.splice(a, 0, new r.Diff(h$1, _.substring(0, m))), n[a - 1][1] = p.substring(0, p.length - m), n[a + 1][1] = _.substring(m), a++) : (E >= p.length / 2 || E >= _.length / 2) && (n.splice(a, 0, new r.Diff(h$1, p.substring(0, E))), n[a - 1][0] = f, n[a - 1][1] = _.substring(0, _.length - E), n[a + 1][0] = l, n[a + 1][1] = p.substring(E), a++), a++;
}
a++;
}
}, r.prototype.diff_cleanupSemanticLossless = function(n) {
function t(E, v) {
if (!E || !v) return 6;
var w = E.charAt(E.length - 1), D = v.charAt(0), T = w.match(r.nonAlphaNumericRegex_), M = D.match(r.nonAlphaNumericRegex_), R = T && w.match(r.whitespaceRegex_), L = M && D.match(r.whitespaceRegex_), O = R && w.match(r.linebreakRegex_), P = L && D.match(r.linebreakRegex_), $ = O && E.match(r.blanklineEndRegex_), K = P && v.match(r.blanklineStartRegex_);
return $ || K ? 5 : O || P ? 4 : T && !R && L ? 3 : R || L ? 2 : T || M ? 1 : 0;
}
for (var i$1 = 1; i$1 < n.length - 1;) {
if (n[i$1 - 1][0] == h$1 && n[i$1 + 1][0] == h$1) {
var s = n[i$1 - 1][1], o = n[i$1][1], a = n[i$1 + 1][1], c$1 = this.diff_commonSuffix(s, o);
if (c$1) {
var u = o.substring(o.length - c$1);
s = s.substring(0, s.length - c$1), o = u + o.substring(0, o.length - c$1), a = u + a;
}
for (var d = s, g = o, p = a, _ = t(s, o) + t(o, a); o.charAt(0) === a.charAt(0);) {
s += o.charAt(0), o = o.substring(1) + a.charAt(0), a = a.substring(1);
var m = t(s, o) + t(o, a);
m >= _ && (_ = m, d = s, g = o, p = a);
}
n[i$1 - 1][1] != d && (d ? n[i$1 - 1][1] = d : (n.splice(i$1 - 1, 1), i$1--), n[i$1][1] = g, p ? n[i$1 + 1][1] = p : (n.splice(i$1 + 1, 1), i$1--));
}
i$1++;
}
}, r.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/, r.whitespaceRegex_ = /\s/, r.linebreakRegex_ = /[\r\n]/, r.blanklineEndRegex_ = /\n\r?\n$/, r.blanklineStartRegex_ = /^\r?\n\r?\n/, r.prototype.diff_cleanupEfficiency = function(n) {
for (var t = !1, i$1 = [], s = 0, o = null, a = 0, c$1 = !1, u = !1, d = !1, g = !1; a < n.length;) n[a][0] == h$1 ? (n[a][1].length < this.Diff_EditCost && (d || g) ? (i$1[s++] = a, c$1 = d, u = g, o = n[a][1]) : (s = 0, o = null), d = g = !1) : (n[a][0] == l ? g = !0 : d = !0, o && (c$1 && u && d && g || o.length < this.Diff_EditCost / 2 && c$1 + u + d + g == 3) && (n.splice(i$1[s - 1], 0, new r.Diff(l, o)), n[i$1[s - 1] + 1][0] = f, s--, o = null, c$1 && u ? (d = g = !0, s = 0) : (s--, a = s > 0 ? i$1[s - 1] : -1, d = g = !1), t = !0)), a++;
t && this.diff_cleanupMerge(n);
}, r.prototype.diff_cleanupMerge = function(n) {
n.push(new r.Diff(h$1, ""));
for (var t = 0, i$1 = 0, s = 0, o = "", a = "", c$1; t < n.length;) switch (n[t][0]) {
case f:
s++, a += n[t][1], t++;
break;
case l:
i$1++, o += n[t][1], t++;
break;
case h$1:
i$1 + s > 1 ? (i$1 !== 0 && s !== 0 && (c$1 = this.diff_commonPrefix(a, o), c$1 !== 0 && (t - i$1 - s > 0 && n[t - i$1 - s - 1][0] == h$1 ? n[t - i$1 - s - 1][1] += a.substring(0, c$1) : (n.splice(0, 0, new r.Diff(h$1, a.substring(0, c$1))), t++), a = a.substring(c$1), o = o.substring(c$1)), c$1 = this.diff_commonSuffix(a, o), c$1 !== 0 && (n[t][1] = a.substring(a.length - c$1) + n[t][1], a = a.substring(0, a.length - c$1), o = o.substring(0, o.length - c$1))), t -= i$1 + s, n.splice(t, i$1 + s), o.length && (n.splice(t, 0, new r.Diff(l, o)), t++), a.length && (n.splice(t, 0, new r.Diff(f, a)), t++), t++) : t !== 0 && n[t - 1][0] == h$1 ? (n[t - 1][1] += n[t][1], n.splice(t, 1)) : t++, s = 0, i$1 = 0, o = "", a = "";
break;
}
n[n.length - 1][1] === "" && n.pop();
var u = !1;
for (t = 1; t < n.length - 1;) n[t - 1][0] == h$1 && n[t + 1][0] == h$1 && (n[t][1].substring(n[t][1].length - n[t - 1][1].length) == n[t - 1][1] ? (n[t][1] = n[t - 1][1] + n[t][1].substring(0, n[t][1].length - n[t - 1][1].length), n[t + 1][1] = n[t - 1][1] + n[t + 1][1], n.splice(t - 1, 1), u = !0) : n[t][1].substring(0, n[t + 1][1].length) == n[t + 1][1] && (n[t - 1][1] += n[t + 1][1], n[t][1] = n[t][1].substring(n[t + 1][1].length) + n[t + 1][1], n.splice(t + 1, 1), u = !0)), t++;
u && this.diff_cleanupMerge(n);
}, r.prototype.diff_xIndex = function(n, t) {
var i$1 = 0, s = 0, o = 0, a = 0, c$1;
for (c$1 = 0; c$1 < n.length && (n[c$1][0] !== f && (i$1 += n[c$1][1].length), n[c$1][0] !== l && (s += n[c$1][1].length), !(i$1 > t)); c$1++) o = i$1, a = s;
return n.length != c$1 && n[c$1][0] === l ? a : a + (t - o);
}, r.prototype.diff_prettyHtml = function(n) {
for (var t = [], i$1 = /&/g, s = /</g, o = />/g, a = /\n/g, c$1 = 0; c$1 < n.length; c$1++) {
var u = n[c$1][0], g = n[c$1][1].replace(i$1, "&").replace(s, "<").replace(o, ">").replace(a, "¶<br>");
switch (u) {
case f:
t[c$1] = "<ins style=\"background:#e6ffe6;\">" + g + "</ins>";
break;
case l:
t[c$1] = "<del style=\"background:#ffe6e6;\">" + g + "</del>";
break;
case h$1:
t[c$1] = "<span>" + g + "</span>";
break;
}
}
return t.join("");
}, r.prototype.diff_text1 = function(n) {
for (var t = [], i$1 = 0; i$1 < n.length; i$1++) n[i$1][0] !== f && (t[i$1] = n[i$1][1]);
return t.join("");
}, r.prototype.diff_text2 = function(n) {
for (var t = [], i$1 = 0; i$1 < n.length; i$1++) n[i$1][0] !== l && (t[i$1] = n[i$1][1]);
return t.join("");
}, r.prototype.diff_levenshtein = function(n) {
for (var t = 0, i$1 = 0, s = 0, o = 0; o < n.length; o++) {
var a = n[o][0], c$1 = n[o][1];
switch (a) {
case f:
i$1 += c$1.length;
break;
case l:
s += c$1.length;
break;
case h$1:
t += Math.max(i$1, s), i$1 = 0, s = 0;
break;
}
}
return t += Math.max(i$1, s), t;
}, r.prototype.diff_toDelta = function(n) {
for (var t = [], i$1 = 0; i$1 < n.length; i$1++) switch (n[i$1][0]) {
case f:
t[i$1] = "+" + encodeURI(n[i$1][1]);
break;
case l:
t[i$1] = "-" + n[i$1][1].length;
break;
case h$1:
t[i$1] = "=" + n[i$1][1].length;
break;
}
return t.join(" ").replace(/%20/g, " ");
}, r.prototype.diff_fromDelta = function(n, t) {
for (var i$1 = [], s = 0, o = 0, a = t.split(/\t/g), c$1 = 0; c$1 < a.length; c$1++) {
var u = a[c$1].substring(1);
switch (a[c$1].charAt(0)) {
case "+":
try {
i$1[s++] = new r.Diff(f, decodeURI(u));
} catch (p) {
throw new Error("Illegal escape in diff_fromDelta: " + u);
}
break;
case "-":
case "=":
var d = parseInt(u, 10);
if (isNaN(d) || d < 0) throw new Error("Invalid number in diff_fromDelta: " + u);
var g = n.substring(o, o += d);
a[c$1].charAt(0) == "=" ? i$1[s++] = new r.Diff(h$1, g) : i$1[s++] = new r.Diff(l, g);
break;
default: if (a[c$1]) throw new Error("Invalid diff operation in diff_fromDelta: " + a[c$1]);
}
}
if (o != n.length) throw new Error("Delta length (" + o + ") does not equal source text length (" + n.length + ").");
return i$1;
}, r.prototype.match_main = function(n, t, i$1) {
if (n == null || t == null || i$1 == null) throw new Error("Null input. (match_main)");
return i$1 = Math.max(0, Math.min(i$1, n.length)), n == t ? 0 : n.length ? n.substring(i$1, i$1 + t.length) == t ? i$1 : this.match_bitap_(n, t, i$1) : -1;
}, r.prototype.match_bitap_ = function(n, t, i$1) {
if (t.length > this.Match_MaxBits) throw new Error("Pattern too long for this browser.");
var s = this.match_alphabet_(t), o = this;
function a(L, O) {
var P = L / t.length, $ = Math.abs(i$1 - O);
return o.Match_Distance ? P + $ / o.Match_Distance : $ ? 1 : P;
}
var c$1 = this.Match_Threshold, u = n.indexOf(t, i$1);
u != -1 && (c$1 = Math.min(a(0, u), c$1), u = n.lastIndexOf(t, i$1 + t.length), u != -1 && (c$1 = Math.min(a(0, u), c$1)));
var d = 1 << t.length - 1;
u = -1;
for (var g, p, _ = t.length + n.length, m, E = 0; E < t.length; E++) {
for (g = 0, p = _; g < p;) a(E, i$1 + p) <= c$1 ? g = p : _ = p, p = Math.floor((_ - g) / 2 + g);
_ = p;
var v = Math.max(1, i$1 - p + 1), w = Math.min(i$1 + p, n.length) + t.length, D = Array(w + 2);
D[w + 1] = (1 << E) - 1;
for (var T = w; T >= v; T--) {
var M = s[n.charAt(T - 1)];
if (E === 0 ? D[T] = (D[T + 1] << 1 | 1) & M : D[T] = (D[T + 1] << 1 | 1) & M | ((m[T + 1] | m[T]) << 1 | 1) | m[T + 1], D[T] & d) {
var R = a(E, T - 1);
if (R <= c$1) if (c$1 = R, u = T - 1, u > i$1) v = Math.max(1, 2 * i$1 - u);
else break;
}
}
if (a(E + 1, i$1) > c$1) break;
m = D;
}
return u;
}, r.prototype.match_alphabet_ = function(n) {
for (var t = {}, i$1 = 0; i$1 < n.length; i$1++) t[n.charAt(i$1)] = 0;
for (var i$1 = 0; i$1 < n.length; i$1++) t[n.charAt(i$1)] |= 1 << n.length - i$1 - 1;
return t;
}, r.prototype.patch_addContext_ = function(n, t) {
if (t.length != 0) {
if (n.start2 === null) throw Error("patch not initialized");
for (var i$1 = t.substring(n.start2, n.start2 + n.length1), s = 0; t.indexOf(i$1) != t.lastIndexOf(i$1) && i$1.length < this.Match_MaxBits - this.Patch_Margin - this.Patch_Margin;) s += this.Patch_Margin, i$1 = t.substring(n.start2 - s, n.start2 + n.length1 + s);
s += this.Patch_Margin;
var o = t.substring(n.start2 - s, n.start2);
o && n.diffs.unshift(new r.Diff(h$1, o));
var a = t.substring(n.start2 + n.length1, n.start2 + n.length1 + s);
a && n.diffs.push(new r.Diff(h$1, a)), n.start1 -= o.length, n.start2 -= o.length, n.length1 += o.length + a.length, n.length2 += o.length + a.length;
}
}, r.prototype.patch_make = function(n, t, i$1) {
var s, o;
if (typeof n == "string" && typeof t == "string" && typeof i$1 == "undefined") s = n, o = this.diff_main(s, t, !0), o.length > 2 && (this.diff_cleanupSemantic(o), this.diff_cleanupEfficiency(o));
else if (n && typeof n == "object" && typeof t == "undefined" && typeof i$1 == "undefined") o = n, s = this.diff_text1(o);
else if (typeof n == "string" && t && typeof t == "object" && typeof i$1 == "undefined") s = n, o = t;
else if (typeof n == "string" && typeof t == "string" && i$1 && typeof i$1 == "object") s = n, o = i$1;
else throw new Error("Unknown call format to patch_make.");
if (o.length === 0) return [];
for (var a = [], c$1 = new r.patch_obj(), u = 0, d = 0, g = 0, p = s, _ = s, m = 0; m < o.length; m++) {
var E = o[m][0], v = o[m][1];
switch (!u && E !== h$1 && (c$1.start1 = d, c$1.start2 = g), E) {
case f:
c$1.diffs[u++] = o[m], c$1.length2 += v.length, _ = _.substring(0, g) + v + _.substring(g);
break;
case l:
c$1.length1 += v.length, c$1.diffs[u++] = o[m], _ = _.substring(0, g) + _.substring(g + v.length);
break;
case h$1:
v.length <= 2 * this.Patch_Margin && u && o.length != m + 1 ? (c$1.diffs[u++] = o[m], c$1.length1 += v.length, c$1.length2 += v.length) : v.length >= 2 * this.Patch_Margin && u && (this.patch_addContext_(c$1, p), a.push(c$1), c$1 = new r.patch_obj(), u = 0, p = _, d = g);
break;
}
E !== f && (d += v.length), E !== l && (g += v.length);
}
return u && (this.patch_addContext_(c$1, p), a.push(c$1)), a;
}, r.prototype.patch_deepCopy = function(n) {
for (var t = [], i$1 = 0; i$1 < n.length; i$1++) {
var s = n[i$1], o = new r.patch_obj();
o.diffs = [];
for (var a = 0; a < s.diffs.length; a++) o.diffs[a] = new r.Diff(s.diffs[a][0], s.diffs[a][1]);
o.start1 = s.start1, o.start2 = s.start2, o.length1 = s.length1, o.length2 = s.length2, t[i$1] = o;
}
return t;
}, r.prototype.patch_apply = function(n, t) {
if (n.length == 0) return [t, []];
n = this.patch_deepCopy(n);
var i$1 = this.patch_addPadding(n);
t = i$1 + t + i$1, this.patch_splitMax(n);
for (var s = 0, o = [], a = 0; a < n.length; a++) {
var c$1 = n[a].start2 + s, u = this.diff_text1(n[a].diffs), d, g = -1;
if (u.length > this.Match_MaxBits ? (d = this.match_main(t, u.substring(0, this.Match_MaxBits), c$1), d != -1 && (g = this.match_main(t, u.substring(u.length - this.Match_MaxBits), c$1 + u.length - this.Match_MaxBits), (g == -1 || d >= g) && (d = -1))) : d = this.match_main(t, u, c$1), d == -1) o[a] = !1, s -= n[a].length2 - n[a].length1;
else {
o[a] = !0, s = d - c$1;
var p;
if (g == -1 ? p = t.substring(d, d + u.length) : p = t.substring(d, g + this.Match_MaxBits), u == p) t = t.substring(0, d) + this.diff_text2(n[a].diffs) + t.substring(d + u.length);
else {
var _ = this.diff_main(u, p, !1);
if (u.length > this.Match_MaxBits && this.diff_levenshtein(_) / u.length > this.Patch_DeleteThreshold) o[a] = !1;
else {
this.diff_cleanupSemanticLossless(_);
for (var m = 0, E, v = 0; v < n[a].diffs.length; v++) {
var w = n[a].diffs[v];
w[0] !== h$1 && (E = this.diff_xIndex(_, m)), w[0] === f ? t = t.substring(0, d + E) + w[1] + t.substring(d + E) : w[0] === l && (t = t.substring(0, d + E) + t.substring(d + this.diff_xIndex(_, m + w[1].length))), w[0] !== l && (m += w[1].length);
}
}
}
}
}
return t = t.substring(i$1.length, t.length - i$1.length), [t, o];
}, r.prototype.patch_addPadding = function(n) {
for (var t = this.Patch_Margin, i$1 = "", s = 1; s <= t; s++) i$1 += String.fromCharCode(s);
for (var s = 0; s < n.length; s++) n[s].start1 += t, n[s].start2 += t;
var o = n[0], a = o.diffs;
if (a.length == 0 || a[0][0] != h$1) a.unshift(new r.Diff(h$1, i$1)), o.start1 -= t, o.start2 -= t, o.length1 += t, o.length2 += t;
else if (t > a[0][1].length) {
var c$1 = t - a[0][1].length;
a[0][1] = i$1.substring(a[0][1].length) + a[0][1], o.start1 -= c$1, o.start2 -= c$1, o.length1 += c$1, o.length2 += c$1;
}
if (o = n[n.length - 1], a = o.diffs, a.length == 0 || a[a.length - 1][0] != h$1) a.push(new r.Diff(h$1, i$1)), o.length1 += t, o.length2 += t;
else if (t > a[a.length - 1][1].length) {
var c$1 = t - a[a.length - 1][1].length;
a[a.length - 1][1] += i$1.substring(0, c$1), o.length1 += c$1, o.length2 += c$1;
}
return i$1;
}, r.prototype.patch_splitMax = function(n) {
for (var t = this.Match_MaxBits, i$1 = 0; i$1 < n.length; i$1++) if (!(n[i$1].length1 <= t)) {
var s = n[i$1];
n.splice(i$1--, 1);
for (var o = s.start1, a = s.start2, c$1 = ""; s.diffs.length !== 0;) {
var u = new r.patch_obj(), d = !0;
for (u.start1 = o - c$1.length, u.start2 = a - c$1.length, c$1 !== "" && (u.length1 = u.length2 = c$1.length, u.diffs.push(new r.Diff(h$1, c$1))); s.diffs.length !== 0 && u.length1 < t - this.Patch_Margin;) {
var g = s.diffs[0][0], p = s.diffs[0][1];
g === f ? (u.length2 += p.length, a += p.length, u.diffs.push(s.diffs.shift()), d = !1) : g === l && u.diffs.length == 1 && u.diffs[0][0] == h$1 && p.length > 2 * t ? (u.length1 += p.length, o += p.length, d = !1, u.diffs.push(new r.Diff(g, p)), s.diffs.shift()) : (p = p.substring(0, t - u.length1 - this.Patch_Margin), u.length1 += p.length, o += p.length, g === h$1 ? (u.length2 += p.length, a += p.length) : d = !1, u.diffs.push(new r.Diff(g, p)), p == s.diffs[0][1] ? s.diffs.shift() : s.diffs[0][1] = s.diffs[0][1].substring(p.length));
}
c$1 = this.diff_text2(u.diffs), c$1 = c$1.substring(c$1.length - this.Patch_Margin);
var _ = this.diff_text1(s.diffs).substring(0, this.Patch_Margin);
_ !== "" && (u.length1 += _.length, u.length2 += _.length, u.diffs.length !== 0 && u.diffs[u.diffs.length - 1][0] === h$1 ? u.diffs[u.diffs.length - 1][1] += _ : u.diffs.push(new r.Diff(h$1, _))), d || n.splice(++i$1, 0, u);
}
}
}, r.prototype.patch_toText = function(n) {
for (var t = [], i$1 = 0; i$1 < n.length; i$1++) t[i$1] = n[i$1];
return t.join("");
}, r.prototype.patch_fromText = function(n) {
var t = [];
if (!n) return t;
for (var i$1 = n.split(`
`), s = 0, o = /^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/; s < i$1.length;) {
var a = i$1[s].match(o);
if (!a) throw new Error("Invalid patch string: " + i$1[s]);
var c$1 = new r.patch_obj();
for (t.push(c$1), c$1.start1 = parseInt(a[1], 10), a[2] === "" ? (c$1.start1--, c$1.length1 = 1) : a[2] == "0" ? c$1.length1 = 0 : (c$1.start1--, c$1.length1 = parseInt(a[2], 10)), c$1.start2 = parseInt(a[3], 10), a[4] === "" ? (c$1.start2--, c$1.length2 = 1) : a[4] == "0" ? c$1.length2 = 0 : (c$1.start2--, c$1.length2 = parseInt(a[4], 10)), s++; s < i$1.length;) {
var u = i$1[s].charAt(0);
try {
var d = decodeURI(i$1[s].substring(1));
} catch (g) {
throw new Error("Illegal escape in patch_fromText: " + d);
}
if (u == "-") c$1.diffs.push(new r.Diff(l, d));
else if (u == "+") c$1.diffs.push(new r.Diff(f, d));
else if (u == " ") c$1.diffs.push(new r.Diff(h$1, d));
else {
if (u == "@") break;
if (u !== "") throw new Error("Invalid patch mode \"" + u + "\" in: " + d);
}
s++;
}
}
return t;
}, r.patch_obj = function() {
this.diffs = [], this.start1 = null, this.start2 = null, this.length1 = 0, this.length2 = 0;
}, r.patch_obj.prototype.toString = function() {
var n, t;
this.length1 === 0 ? n = this.start1 + ",0" : this.length1 == 1 ? n = this.start1 + 1 : n = this.start1 + 1 + "," + this.length1, this.length2 === 0 ? t = this.start2 + ",0" : this.length2 == 1 ? t = this.start2 + 1 : t = this.start2 + 1 + "," + this.length2;
for (var i$1 = ["@@ -" + n + " +" + t + ` @@
`], s, o = 0; o < this.diffs.length; o++) {
switch (this.diffs[o][0]) {
case f:
s = "+";
break;
case l:
s = "-";
break;
case h$1:
s = " ";
break;
}
i$1[o + 1] = s + encodeURI(this.diffs[o][1]) + `
`;
}
return i$1.join("").replace(/%20/g, " ");
}, e.exports = r, e.exports.diff_match_patch = r, e.exports.DIFF_DELETE = l, e.exports.DIFF_INSERT = f, e.exports.DIFF_EQUAL = h$1;
})(En);
var xe = En.exports;
function vn(e) {
return e instanceof Map ? e.clear = e.delete = e.set = function() {
throw new Error("map is read-only");
} : e instanceof Set && (e.add = e.clear = e.delete = function() {
throw new Error("set is read-only");
}), Object.freeze(e), Object.getOwnPropertyNames(e).forEach((r) => {
const l = e[r], f = typeof l;
(f === "object" || f === "function") && !Object.isFrozen(l) && vn(l);
}), e;
}
var on = class {
constructor(r) {
r.data === void 0 && (r.data = {}), this.data = r.data, this.isMatchIgnored = !1;
}
ignoreMatch() {
this.isMatchIgnored = !0;
}
};
function wn(e) {
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function le(e, ...r) {
const l = /* @__PURE__ */ Object.create(null);
for (const f in e) l[f] = e[f];
return r.forEach(function(f) {
for (const h$1 in f) l[h$1] = f[h$1];
}), l;
}
var rt = "</span>", ln = (e) => !!e.scope, it = (e, { prefix: r }) => {
if (e.startsWith("language:")) return e.replace("language:", "language-");
if (e.includes(".")) {
const l = e.split(".");
return [`${r}${l.shift()}`, ...l.map((f, h$1) => `${f}${"_".repeat(h$1 + 1)}`)].join(" ");
}
return `${r}${e}`;
};
var st = class {
constructor(r, l) {
this.buffer = "", this.classPrefix = l.classPrefix, r.walk(this);
}
addText(r) {
this.buffer += wn(r);
}
openNode(r) {
if (!ln(r)) return;
const l = it(r.scope, { prefix: this.classPrefix });
this.span(l);
}
closeNode(r) {
ln(r) && (this.buffer += rt);
}
value() {
return this.buffer;
}
span(r) {
this.buffer += `<span class="${r}">`;
}
};
var cn = (e = {}) => {
const r = { children: [] };
return Object.assign(r, e), r;
};
var Qe = class Qe {
constructor() {
this.rootNode = cn(), this.stack = [this.rootNode];
}
get top() {
return this.stack[this.stack.length - 1];
}
get root() {
return this.rootNode;
}
add(r) {
this.top.children.push(r);
}
openNode(r) {
const l = cn({ scope: r });
this.add(l), this.stack.push(l);
}
closeNode() {
if (this.stack.length > 1) return this.stack.pop();
}
closeAllNodes() {
for (; this.closeNode(););
}
toJSON() {
return JSON.stringify(this.rootNode, null, 4);
}
walk(r) {
return this.constructor._walk(r, this.rootNode);
}
static _walk(r, l) {
return typeof l == "string" ? r.addText(l) : l.children && (r.openNode(l), l.children.forEach((f) => this._walk(r, f)), r.closeNode(l)), r;
}
static _collapse(r) {
typeof r != "string" && r.children && (r.children.every((l) => typeof l == "string") ? r.children = [r.children.join("")] : r.children.forEach((l) => {
Qe._collapse(l);
}));
}
};
var at = class extends Qe {
constructor(r) {
super(), this.options = r;
}
addText(r) {
r !== "" && this.add(r);
}
startScope(r) {
this.openNode(r);
}
endScope() {
this.closeNode();
}
__addSublanguage(r, l) {
const f = r.root;
l && (f.scope = `language:${l}`), this.add(f);
}
toHTML() {
return new st(this, this.options).value();
}
finalize() {
return this.closeAllNodes(), !0;
}
};
function Ae(e) {
return e ? typeof e == "string" ? e : e.source : null;
}
function yn(e) {
return fe("(?=", e, ")");
}
function ot(e) {
return fe("(?:", e, ")*");
}
function lt(e) {
return fe("(?:", e, ")?");
}
function fe(...e) {
return e.map((l) => Ae(l)).join("");
}
function ct(e) {
const r = e[e.length - 1];
return typeof r == "object" && r.constructor === Object ? (e.splice(e.length - 1, 1), r) : {};
}
function Ze(...e) {
return "(" + (ct(e).capture ? "" : "?:") + e.map((f) => Ae(f)).join("|") + ")";
}
function Nn(e) {
return (/* @__PURE__ */ new RegExp(e.toString() + "|")).exec("").length - 1;
}
function ut(e, r) {
const l = e && e.exec(r);
return l && l.index === 0;
}
var ft = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
function Ye(e, { joinWith: r }) {
let l = 0;
return e.map((f) => {
l += 1;
const h$1 = l;
let n = Ae(f), t = "";
for (; n.length > 0;) {
const i$1 = ft.exec(n);
if (!i$1) {
t += n;
break;
}
t += n.substring(0, i$1.index), n = n.substring(i$1.index + i$1[0].length), i$1[0][0] === "\\" && i$1[1] ? t += "\\" + String(Number(i$1[1]) + h$1) : (t += i$1[0], i$1[0] === "(" && l++);
}
return t;
}).map((f) => `(${f})`).join(r);
}
var gt = /\b\B/, An = "[a-zA-Z]\\w*", Xe = "[a-zA-Z_]\\w*", Mn = "\\b\\d+(\\.\\d+)?", Tn = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)", Dn = "\\b(0b[01]+)", ht = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", dt = (e = {}) => {
const r = /^#![ ]*\//;
return e.binary && (e.begin = fe(r, /.*\b/, e.binary, /\b.*/)), le({
scope: "meta",
begin: r,
end: /$/,
relevance: 0,
"on:begin": (l, f) => {
l.index !== 0 && f.ignoreMatch();
}
}, e);
}, Me = {
begin: "\\\\[\\s\\S]",
relevance: 0
}, pt = {
scope: "string",
begin: "'",
end: "'",
illegal: "\\n",
contains: [Me]
}, _t = {
scope: "string",
begin: "\"",
end: "\"",
illegal: "\\n",
contains: [Me]
}, bt = { begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ }, $e = function(e, r, l = {}) {
const f = le({
scope: "comment",
begin: e,
end: r,
contains: []
}, l);
f.contains.push({
scope: "doctag",
begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",
end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,
excludeBegin: !0,
relevance: 0
});
const h$1 = Ze("I", "a", "is", "so", "us", "to", "at", "if", "in", "it", "on", /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, /[A-Za-z]+[-][a-z]+/, /[A-Za-z][a-z]{2,}/);
return f.contains.push({ begin: fe(/[ ]+/, "(", h$1, /[.]?[:]?([.][ ]|[ ])/, "){3}") }), f;
}, mt = $e("//", "$"), Et = $e("/\\*", "\\*/"), vt = $e("#", "$"), wt = {
scope: "number",
begin: Mn,
relevance: 0
}, yt = {
scope: "number",
begin: Tn,
relevance: 0
}, Nt = {
scope: "number",
begin: Dn,
relevance: 0
}, At = {
scope: "regexp",
begin: /\/(?=[^/\n]*\/)/,
end: /\/[gimuy]*/,
contains: [Me, {
begin: /\[/,
end: /\]/,
relevance: 0,
contains: [Me]
}]
}, Mt = {
scope: "title",
begin: An,
relevance: 0
}, Tt = {
scope: "title",
begin: Xe,
relevance: 0
}, Dt = {
begin: "\\.\\s*" + Xe,
relevance: 0
}, St = function(e) {
return Object.assign(e, {
"on:begin": (r, l) => {
l.data._beginMatch = r[1];
},
"on:end": (r, l) => {
l.data._beginMatch !== r[1] && l.ignoreMatch();
}
});
};
var Re = /* @__PURE__ */ Object.freeze({
__proto__: null,
APOS_STRING_MODE: pt,
BACKSLASH_ESCAPE: Me,
BINARY_NUMBER_MODE: Nt,
BINARY_NUMBER_RE: Dn,
COMMENT: $e,
C_BLOCK_COMMENT_MODE: Et,
C_LINE_COMMENT_MODE: mt,
C_NUMBER_MODE: yt,
C_NUMBER_RE: Tn,
END_SAME_AS_BEGIN: St,
HASH_COMMENT_MODE: vt,
IDENT_RE: An,
MATCH_NOTHING_RE: gt,
METHOD_GUARD: Dt,
NUMBER_MODE: wt,
NUMBER_RE: Mn,
PHRASAL_WORDS_MODE: bt,
QUOTE_STRING_MODE: _t,
REGEXP_MODE: At,
RE_STARTERS_RE: ht,
SHEBANG: dt,
TITLE_MODE: Mt,
UNDERSCORE_IDENT_RE: Xe,
UNDERSCORE_TITLE_MODE: Tt
});
function Lt(e, r) {
e.input[e.index - 1] === "." && r.ignoreMatch();
}
function Rt(e, r) {
e.className !== void 0 && (e.scope = e.className, delete e.className);
}
function Ot(e, r) {
r && e.beginKeywords && (e.begin = "\\b(" + e.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)", e.__beforeBegin = Lt, e.keywords = e.keywords || e.beginKeywords, delete e.beginKeywords, e.relevance === void 0 && (e.relevance = 0));
}
function Ct(e, r) {
Array.isArray(e.illegal) && (e.illegal = Ze(...e.illegal));
}
function It(e, r) {
if (e.match) {
if (e.begin || e.end) throw new Error("begin & end are not supported with match");
e.begin = e.match, delete e.match;
}
}
function kt(e, r) {
e.relevance === void 0 && (e.relevance = 1);
}
var Bt = (e, r) => {
if (!e.beforeMatch) return;
if (e.starts) throw new Error("beforeMatch cannot be used with starts");
const l = Object.assign({}, e);
Object.keys(e).forEach((f) => {
delete e[f];
}), e.keywords = l.keywords, e.begin = fe(l.beforeMatch, yn(l.begin)), e.starts = {
relevance: 0,
contains: [Object.assign(l, { endsParent: !0 })]
}, e.relevance = 0, delete l.beforeMatch;
}, $t = [
"of",
"and",
"for",
"in",
"not",
"or",
"if",
"then",
"parent",
"list",
"value"
], Pt = "keyword";
function Sn(e, r, l = Pt) {
const f = /* @__PURE__ */ Object.create(null);
return typeof e == "string" ? h$1(l, e.split(" ")) : Array.isArray(e) ? h$1(l, e) : Object.keys(e).forEach(function(n) {
Object.assign(f, Sn(e[n], r, n));
}), f;
function h$1(n, t) {
r && (t = t.map((i$1) => i$1.toLowerCase())), t.forEach(function(i$1) {
const s = i$1.split("|");
f[s[0]] = [n, Ut(s[0], s[1])];
});
}
}
function Ut(e, r) {
return r ? Number(r) : Ht(e) ? 0 : 1;
}
function Ht(e) {
return $t.includes(e.toLowerCase());
}
var un = {}, ue = (e) => {
console.error(e);
}, fn = (e, ...r) => {
console.log(`WARN: ${e}`, ...r);
}, he = (e, r) => {
un[`${e}/${r}`] || (console.log(`Deprecated as of ${e}. ${r}`), un[`${e}/${r}`] = !0);
}, ke = /* @__PURE__ */ new Error();
function Ln(e, r, { key: l }) {
let f = 0;
const h$1 = e[l], n = {}, t = {};
for (let i$1 = 1; i$1 <= r.length; i$1++) t[i$1 + f] = h$1[i$1], n[i$1 + f] = !0, f += Nn(r[i$1 - 1]);
e[l] = t, e[l]._emit = n, e[l]._multi = !0;
}
function xt(e) {
if (Array.isArray(e.begin)) {
if (e.skip || e.excludeBegin || e.returnBegin) throw ue("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), ke;
if (typeof e.beginScope != "object" || e.beginScope === null) throw ue("beginScope must be object"), ke;
Ln(e, e.begin, { key: "beginScope" }), e.begin = Ye(e.begin, { joinWith: "" });
}
}
function Ft(e) {
if (Array.isArray(e.end)) {
if (e.skip || e.excludeEnd || e.returnEnd) throw ue("skip, excludeEnd, returnEnd not compatible with endScope: {}"), ke;
if (typeof e.endScope != "object" || e.endScope === null) throw ue("endScope must be object"), ke;
Ln(e, e.end, { key: "endScope" }), e.end = Ye(e.end, { joinWith: "" });
}
}
function zt(e) {
e.scope && typeof e.scope == "object" && e.scope !== null && (e.beginScope = e.scope, delete e.scope);
}
function Gt(e) {
zt(e), typeof e.beginScope == "string" && (e.beginScope = { _wrap: e.beginScope }), typeof e.endScope == "string" && (e.endScope = { _wrap: e.endScope }), xt(e), Ft(e);
}
function Kt(e) {
function r(t, i$1) {
return new RegExp(Ae(t), "m" + (e.case_insensitive ? "i" : "") + (e.unicodeRegex ? "u" : "") + (i$1 ? "g" : ""));
}
class l {
constructor() {
this.matchIndexes = {}, this.regexes = [], this.matchAt = 1, this.position = 0;
}
addRule(i$1, s) {
s.position = this.position++, this.matchIndexes[this.matchAt] = s, this.regexes.push([s, i$1]), this.matchAt += Nn(i$1) + 1;
}
compile() {
this.regexes.length === 0 && (this.exec = () => null);
this.matcherRe = r(Ye(this.regexes.map((s) => s[1]), { joinWith: "|" }), !0), this.lastIndex = 0;
}
exec(i$1) {
this.matcherRe.lastIndex = this.lastIndex;
const s = this.matcherRe.exec(i$1);
if (!s) return null;
const o = s.findIndex((c$1, u) => u > 0 && c$1 !== void 0), a = this.matchIndexes[o];
return s.splice(0, o), Object.assign(s, a);
}
}
class f {
constructor() {
this.rules = [], this.multiRegexes = [], this.count = 0, this.lastIndex = 0, this.regexIndex = 0;
}
getMatcher(i$1) {
if (this.multiRegexes[i$1]) return this.multiRegexes[i$1];
const s = new l();
return this.rules.slice(i$1).forEach(([o, a]) => s.addRule(o, a)), s.compile(), this.multiRegexes[i$1] = s, s;
}
resumingScanAtSamePosition() {
return this.regexIndex !== 0;
}
considerAll() {
this.regexIndex = 0;
}
addRule(i$1, s) {
this.rules.push([i$1, s]), s.type === "begin" && this.count++;
}
exec(i$1) {
const s = this.getMatcher(this.regexIndex);
s.lastIndex = this.lastIndex;
let o = s.exec(i$1);
if (this.resumingScanAtSamePosition() && !(o && o.index === this.lastIndex)) {
const a = this.getMatcher(0);
a.lastIndex = this.lastIndex + 1, o = a.exec(i$1);
}
return o && (this.regexIndex += o.position + 1, this.regexIndex === this.count && this.considerAll()), o;
}
}
function h$1(t) {
const i$1 = new f();
return t.contains.forEach((s) => i$1.addRule(s.begin, {
rule: s,
type: "begin"
})), t.terminatorEnd && i$1.addRule(t.terminatorEnd, { type: "end" }), t.illegal && i$1.addRule(t.illegal, { type: "illegal" }), i$1;
}
function n(t, i$1) {
const s = t;
if (t.isCompiled) return s;
[
Rt,
It,
Gt,
Bt
].forEach((a) => a(t, i$1)), e.compilerExtensions.forEach((a) => a(t, i$1)), t.__beforeBegin = null, [
Ot,
Ct,
kt
].forEach((a) => a(t, i$1)), t.isCompiled = !0;
let o = null;
return typeof t.keywords == "object" && t.keywords.$pattern && (t.keywords = Object.assign({}, t.keywords), o = t.keywords.$pattern, delete t.keywords.$pattern), o = o || /\w+/, t.keywords && (t.keywords = Sn(t.keywords, e.case_insensitive)), s.keywordPatternRe = r(o, !0), i$1 && (t.begin || (t.begin = /\B|\b/), s.beginRe = r(s.begin), !t.end && !t.endsWithParent && (t.end = /\B|\b/), t.end && (s.endRe = r(s.end)), s.terminatorEnd = Ae(s.end) || "", t.endsWithParent && i$1.terminatorEnd && (s.terminatorEnd += (t.end ? "|" : "") + i$1.terminatorEnd)), t.illegal && (s.illegalRe = r(t.illegal)), t.contains || (t.contains = []), t.contains = [].concat(...t.contains.map(function(a) {
return Wt(a === "self" ? t : a);
})), t.contains.forEach(function(a) {
n(a, s);
}), t.starts && n(t.starts, i$1), s.matcher = h$1(s), s;
}
if (e.compilerExtensions || (e.compilerExtensions = []), e.contains && e.contains.includes("self")) throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");
return e.classNameAliases = le(e.classNameAliases || {}), n(e);
}
function Rn(e) {
return e ? e.endsWithParent || Rn(e.starts) : !1;
}
function Wt(e) {
return e.variants && !e.cachedVariants && (e.cachedVariants = e.variants.map(function(r) {
return le(e, { variants: null }, r);
})), e.cachedVariants ? e.cachedVariants : Rn(e) ? le(e, { starts: e.starts ? le(e.starts) : null }) : Object.isFrozen(e) ? le(e) : e;
}
var Qt = "11.10.0";
var Zt = class extends Error {
constructor(r, l) {
super(r), this.name = "HTMLInjectionError", this.html = l;
}
};
var Fe = wn, gn = le, hn = Symbol("nomatch"), Yt = 7, On = function(e) {
const r = /* @__PURE__ */ Object.create(null), l = /* @__PURE__ */ Object.create(null), f = [];
let h$1 = !0;
const n = "Could not find the language '{}', did you forget to load/include a language module?", t = {
disableAutodetect: !0,
name: "Plain text",
contains: []
};
let i$1 = {
ignoreUnescapedHTML: !1,
throwUnescapedHTML: !1,
noHighlightRe: /^(no-?highlight)$/i,
languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i,
classPrefix: "hljs-",
cssSelector: "pre code",
languages: null,
__emitter: at
};
function s(b) {
return i$1.noHighlightRe.test(b);
}
function o(b) {
let N = b.className + " ";
N += b.parentNode ? b.parentNode.className : "";
const C = i$1.languageDetectRe.exec(N);
if (C) {
const U = L(C[1]);
return U || (fn(n.replace("{}", C[1])), fn("Falling back to no-highlight mode for this block.", b)), U ? C[1] : "no-highlight";
}
return N.split(/\s+/).find((U) => s(U) || L(U));
}
function a(b, N, C) {
let U = "", G = "";
typeof N == "object" ? (U = b, C = N.ignoreIllegals, G = N.language) : (he("10.7.0", "highlight(lang, code, ...args) has been deprecated."), he("10.7.0", `Please use highlight(code, options) instead.
https://github.com/highlightjs/highlight.js/issues/2277`), G = b, U = N), C === void 0 && (C = !0);
const X = {
code: U,
language: G
};
oe("before:highlight", X);
const J = X.result ? X.result : c$1(X.language, X.code, C);
return J.code = X.code, oe("after:highlight", J), J;
}
function c$1(b, N, C, U) {
const G = /* @__PURE__ */ Object.create(null);
function X(y, S) {
return y.keywords[S];
}
function J() {
if (!I.keywords) {
Q.addText(F);
return;
}
let y = 0;
I.keywordPatternRe.lastIndex = 0;
let S = I.keywordPatternRe.exec(F), k = "";
for (; S;) {
k += F.substring(y, S.index);
const H = te.case_insensitive ? S[0].toLowerCase() : S[0], Z = X(I, H);
if (Z) {
const [re, Kn] = Z;
if (Q.addText(k), k = "", G[H] = (G[H] || 0) + 1, G[H] <= Yt && (Se += Kn), re.startsWith("_")) k += S[0];
else {
const Wn = te.classNameAliases[re] || re;
ne(S[0], Wn);
}
} else k += S[0];
y = I.keywordPatternRe.lastIndex, S = I.keywordPatternRe.exec(F);
}
k += F.substring(y), Q.addText(k);
}
function Te() {
if (F === "") return;
let y = null;
if (typeof I.subLanguage == "string") {
if (!r[I.subLanguage]) {
Q.addText(F);
return;
}
y = c$1(I.subLanguage, F, !0, nn[I.subLanguage]), nn[I.subLanguage] = y._top;
} else y = d(F, I.subLanguage.length ? I.subLanguage : null);
I.relevance > 0 && (Se += y.relevance), Q.__addSublanguage(y._emitter, y.language);
}
function V() {
I.subLanguage != null ? Te() : J(), F = "";
}
function ne(y, S) {
y !== "" && (Q.startScope(S), Q.addText(y), Q.endScope());
}
function je(y, S) {
let k = 1;
const H = S.length - 1;
for (; k <= H;) {
if (!y._emit[k]) {
k++;
continue;
}
const Z = te.classNameAliases[y[k]] || y[k], re = S[k];
Z ? ne(re, Z) : (F = re, J(), F = ""), k++;
}
}
function qe(y, S) {
return y.scope && typeof y.scope == "string" && Q.openNode(te.classNameAliases[y.scope] || y.scope), y.beginScope && (y.beginScope._wrap ? (ne(F, te.classNameAliases[y.beginScope._wrap] || y.beginScope._wrap), F = "") : y.beginScope._multi && (je(y.beginScope, S), F = "")), I = Object.create(y, { parent: { value: I } }), I;
}
function Je(y, S, k) {
let H = ut(y.endRe, k);
if (H) {
if (y["on:end"]) {
const Z = new on(y);
y["on:end"](S, Z), Z.isMatchIgnored && (H = !1);
}
if (H) {
for (; y.endsParent && y.parent;) y = y.parent;
return y;
}
}
if (y.endsWithParent) return Je(y.parent, S, k);
}
function Hn(y) {
return I.matcher.regexIndex === 0 ? (F += y[0], 1) : (He = !0, 0);
}
function xn(y) {
const S = y[0], k = y.rule, H = new on(k), Z = [k.__beforeBegin, k["on:begin"]];
for (const re of Z) if (re && (re(y, H), H.isMatchIgnored)) return Hn(S);
return k.skip ? F += S : (k.excludeBegin && (F += S), V(), !k.returnBegin && !k.excludeBegin && (F = S)), qe(k, y), k.returnBegin ? 0 : S.length;
}
function Fn(y) {
const S = y[0], k = N.substring(y.index), H = Je(I, y, k);
if (!H) return hn;
const Z = I;
I.endScope && I.endScope._wrap ? (V(), ne(S, I.endScope._wrap)) : I.endScope && I.endScope._multi ? (V(), je(I.endScope, y)) : Z.skip ? F += S : (Z.returnEnd || Z.excludeEnd || (F += S), V(), Z.excludeEnd && (F = S));
do
I.scope && Q.closeNode(), !I.skip && !I.subLanguage && (Se += I.relevance), I = I.parent;
while (I !== H.parent);
return H.starts && qe(H.starts, y), Z.returnEnd ? 0 : S.length;
}
function zn() {
const y = [];
for (let S = I; S !== te; S = S.parent) S.scope && y.unshift(S.scope);
y.forEach((S) => Q.openNode(S));
}
let De = {};
function en(y, S) {
const k = S && S[0];
if (F += y, k == null) return V(), 0;
if (De.type === "begin" && S.type === "end" && De.index === S.index && k === "") {
if (F += N.slice(S.index, S.index + 1), !h$1) {
const H = /* @__PURE__ */ new Error(`0 width match regex (${b})`);
throw H.languageName = b, H.badRule = De.rule, H;
}
return 1;
}
if (De = S, S.type === "begin") return xn(S);
if (S.type === "illegal" && !C) {
const H = /* @__PURE__ */ new Error("Illegal lexeme \"" + k + "\" for mode \"" + (I.scope || "<unnamed>") + "\"");
throw H.mode = I, H;
} else if (S.type === "end") {
const H = Fn(S);
if (H !== hn) return H;
}
if (S.type === "illegal" && k === "") return 1;
if (Ue > 1e5 && Ue > S.index * 3) throw new Error("potential infinite loop, way more iterations than matches");
return F += k, k.length;
}
const te = L(b);
if (!te) throw ue(n.replace("{}", b)), /* @__PURE__ */ new Error("Unknown language: \"" + b + "\"");
const Gn = Kt(te);
let Pe = "", I = U || Gn;
const nn = {}, Q = new i$1.__emitter(i$1);
zn();
let F = "", Se = 0, ce = 0, Ue = 0, He = !1;
try {
if (te.__emitTokens) te.__emitTokens(N, Q);
else {
for (I.matcher.considerAll();;) {
Ue++, He ? He = !1 : I.matcher.considerAll(), I.matcher.lastIndex = ce;
const y = I.matcher.exec(N);
if (!y) break;
const k = en(N.substring(ce, y.index), y);
ce = y.index + k;
}
en(N.substring(ce));
}
return Q.finalize(), Pe = Q.toHTML(), {
language: b,
value: Pe,
relevance: Se,
illegal: !1,
_emitter: Q,
_top: I
};
} catch (y) {
if (y.message && y.message.includes("Illegal")) return {
language: b,
value: Fe(N),
illegal: !0,
relevance: 0,
_illegalBy: {
message: y.message,
index: ce,
context: N.slice(ce - 100, ce + 100),
mode: y.mode,
resultSoFar: Pe
},
_emitter: Q
};
if (h$1) return {
language: b,
value: Fe(N),
illegal: !1,
relevance: 0,
errorRaised: y,
_emitter: Q,
_top: I
};
throw y;
}
}
function u(b) {
const N = {
value: Fe(b),
illegal: !1,
relevance: 0,
_top: t,
_emitter: new i$1.__emitter(i$1)
};
return N._emitter.addText(b), N;
}
function d(b, N) {
N = N || i$1.languages || Object.keys(r);
const C = u(b), U = N.filter(L).filter(P).map((V) => c$1(V, b, !1));
U.unshift(C);
const [X, J] = U.sort((V, ne) => {
if (V.relevance !== ne.relevance) return ne.relevance - V.relevance;
if (V.language && ne.language) {
if (L(V.language).supersetOf === ne.language) return 1;
if (L(ne.language).supersetOf === V.language) return -1;
}
return 0;
}), Te = X;
return Te.secondBest = J, Te;
}
function g(b, N, C) {
const U = N && l[N] || C;
b.classList.add("hljs"), b.classList.add(`language-${U}`);
}
function p(b) {
let N = null;
const C = o(b);
if (s(C)) return;
if (oe("before:highlightElement", {
el: b,
language: C
}), b.dataset.highlighted) {
console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.", b);
return;
}
if (b.children.length > 0 && (i$1.ignoreUnescapedHTML || (console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), console.warn("The element with unescaped HTML:"), console.warn(b)), i$1.throwUnescapedHTML)) throw new Zt("One of your code blocks includes unescaped HTML.", b.innerHTML);
N = b;
const U = N.textContent, G = C ? a(U, {
language: C,
ignoreIllegals: !0
}) : d(U);
b.innerHTML = G.value, b.dataset.highlighted = "yes", g(b, C, G.language), b.result = {
language: G.language,
re: G.relevance,
relevance: G.relevance
}, G.secondBest && (b.secondBest = {
language: G.secondBest.language,
relevance: G.secondBest.relevance
}), oe("after:highlightElement", {
el: b,
result: G,
text: U
});
}
function _(b) {
i$1 = gn(i$1, b);
}
const m = () => {
w(), he("10.6.0", "initHighlighting() deprecated. Use highlightAll() now.");
};
function E() {
w(), he("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now.");
}
let v = !1;
function w() {
if (document.readyState === "loading") {
v = !0;
return;
}
document.querySelectorAll(i$1.cssSelector).forEach(p);
}
function D() {
v && w();
}
typeof window != "undefined" && window.addEventListener && window.addEventListener("DOMContentLoaded", D, !1);
function T(b, N) {
let C = null;
try {
C = N(e);
} catch (U) {
if (ue("Language definition for '{}' could not be registered.".replace("{}", b)), h$1) ue(U);
else throw U;
C = t;
}
C.name || (C.name = b), r[b] = C, C.rawDefinition = N.bind(null, e), C.aliases && O(C.aliases, { languageName: b });
}
function M(b) {
delete r[b];
for (const N of Object.keys(l)) l[N] === b && delete l[N];
}
function R() {
return Object.keys(r);
}
function L(b) {
return b = (b || "").toLowerCase(), r[b] || r[l[b]];
}
function O(b, { languageName: N }) {
typeof b == "string" && (b = [b]), b.forEach((C) => {
l[C.toLowerCase()] = N;
});
}
function P(b) {
const N = L(b);
return N && !N.disableAutodetect;
}
function $(b) {
b["before:highlightBlock"] && !b["before:highlightElement"] && (b["before:highlightElement"] = (N) => {
b["before:highlightBlock"](Object.assign({ block: N.el }, N));
}), b["after:highlightBlock"] && !b["after:highlightElement"] && (b["after:highlightElement"] = (N) => {
b["after:highlightBlock"](Object.assign({ block: N.el }, N));
});
}
function K(b) {
$(b), f.push(b);
}
function Y(b) {
const N = f.indexOf(b);
N !== -1 && f.splice(N, 1);
}
function oe(b, N) {
const C = b;
f.forEach(function(U) {
U[C] && U[C](N);
});
}
function ge(b) {
return he("10.7.0", "highlightBlock will be removed entirely in v12.0"), he("10.7.0", "Please use highlightElement now."), p(b);
}
Object.assign(e, {
highlight: a,
highlightAuto: d,
highlightAll: w,
highlightElement: p,
highlightBlock: ge,
configure: _,
initHighlighting: m,
initHighlightingOnLoad: E,
registerLanguage: T,
unregisterLanguage: M,
listLanguages: R,
getLanguage: L,
registerAliases: O,
autoDetection: P,
inherit: gn,
addPlugin: K,
removePlugin: Y
}), e.debugMode = function() {
h$1 = !1;
}, e.safeMode = function() {
h$1 = !0;
}, e.versionString = Qt, e.regex = {
concat: fe,
lookahead: yn,
either: Ze,
optional: lt,
anyNumberOfTimes: ot
};
for (const b in Re) typeof Re[b] == "object" && vn(Re[b]);
return Object.assign(e, Re), e;
}, _e = On({});
_e.newInstance = () => On({});
var Xt = _e;
_e.HighlightJS = _e;
_e.default = _e;
var q = /* @__PURE__ */ tt(Xt);
function Vt(e) {
const r = e.regex, l = r.concat(/[\p{L}_]/u, r.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u), f = /[\p{L}0-9._:-]+/u, h$1 = {
className: "symbol",
begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/
}, n = {
begin: /\s/,
contains: [{
className: "keyword",
begin: /#?[a-z_][a-z1-9_-]+/,
illegal: /\n/
}]
}, t = e.inherit(n, {
begin: /\(/,
end: /\)/
}), i$1 = e.inherit(e.APOS_STRING_MODE, { className: "string" }), s = e.inherit(e.QUOTE_STRING_MODE, { className: "string" }), o = {
endsWithParent: !0,
illegal: /</,
relevance: 0,
contains: [{
className: "attr",
begin: f,
relevance: 0
}, {
begin: /=\s*/,
relevance: 0,
contains: [{
className: "string",
endsParent: !0,
variants: [
{
begin: /"/,
end: /"/,
contains: [h$1]
},
{
begin: /'/,
end: /'/,
contains: [h$1]
},
{ begin: /[^\s"'=<>`]+/ }
]
}]
}]
};
return {
name: "HTML, XML",
aliases: [
"html",
"xhtml",
"rss",
"atom",
"xjb",
"xsd",
"xsl",
"plist",
"wsf",
"svg"
],
case_insensitive: !0,
unicodeRegex: !0,
contains: [
{
className: "meta",
begin: /<![a-z]/,
end: />/,
relevance: 10,
contains: [
n,
s,
i$1,
t,
{
begin: /\[/,
end: /\]/,
contains: [{
className: "meta",
begin: /<![a-z]/,
end: />/,
contains: [
n,
t,
s,
i$1
]
}]
}
]
},
e.COMMENT(/<!--/, /-->/, { relevance: 10 }),
{
begin: /<!\[CDATA\[/,
end: /\]\]>/,
relevance: 10
},
h$1,
{
className: "meta",
end: /\?>/,
variants: [{
begin: /<\?xml/,
relevance: 10,
contains: [s]
}, { begin: /<\?[a-z][a-z0-9]+/ }]
},
{
className: "tag",
begin: /<style(?=\s|>)/,
end: />/,
keywords: { name: "style" },
contains: [o],
starts: {
end: /<\/style>/,
returnEnd: !0,
subLanguage: ["css", "xml"]
}
},
{
className: "tag",
begin: /<script(?=\s|>)/,
end: />/,
keywords: { name: "script" },
contains: [o],
starts: {
end: /<\/script>/,
returnEnd: !0,
subLanguage: [
"javascript",
"handlebars",
"xml"
]
}
},
{
className: "tag",
begin: /<>|<\/>/
},
{
className: "tag",
begin: r.concat(/</, r.lookahead(r.concat(l, r.either(/\/>/, />/, /\s/)))),
end: /\/?>/,
contains: [{
className: "name",
begin: l,
relevance: 0,
starts: o
}]
},
{
className: "tag",
begin: r.concat(/<\//, r.lookahead(r.concat(l, />/))),
contains: [{
className: "name",
begin: l,
relevance: 0
}, {
begin: />/,
relevance: 0,
endsParent: !0
}]
}
]
};
}
var dn = "[A-Za-z$_][0-9A-Za-z$_]*", jt = [
"as",
"in",
"of",
"if",
"for",
"while",
"finally",
"var",
"new",
"function",
"do",
"return",
"void",
"else",
"break",
"catch",
"instanceof",
"with",
"throw",
"case",
"default",
"try",
"switch",
"continue",
"typeof",
"delete",
"let",
"yield",
"const",
"class",
"debugger",
"async",
"await",
"static",
"import",
"from",
"export",
"extends"
], qt = [
"true",
"false",
"null",
"undefined",
"NaN",
"Infinity"
], Cn = [
"Object",
"Function",
"Boolean",
"Symbol",
"Math",
"Date",
"Number",
"BigInt",
"String",
"RegExp",
"Array",
"Float32Array",
"Float64Array",
"Int8Array",
"Uint8Array",
"Uint8ClampedArray",
"Int16Array",
"Int32Array",
"Uint16Array",
"Uint32Array",
"BigInt64Array",
"BigUint64Array",
"Set",
"Map",
"WeakSet",
"WeakMap",
"ArrayBuffer",
"SharedArrayBuffer",
"Atomics",
"DataView",
"JSON",
"Promise",
"Generator",
"GeneratorFunction",
"AsyncFunction",
"Reflect",
"Proxy",
"Intl",
"WebAssembly"
], In = [
"Error",
"EvalError",
"InternalError",
"RangeError",
"ReferenceError",
"SyntaxError",
"TypeError",
"URIError"
], kn = [
"setInterval",
"setTimeout",
"clearInterval",
"clearTimeout",
"require",
"exports",
"eval",
"isFinite",
"isNaN",
"parseFloat",
"parseInt",
"decodeURI",
"decodeURIComponent",
"encodeURI",
"encodeURIComponent",
"escape",
"unescape"
], Jt = [
"arguments",
"this",
"super",
"console",
"window",
"document",
"localStorage",
"sessionStorage",
"module",
"global"
], er = [].concat(kn, Cn, In);
function nr(e) {
const r = e.regex, l = (N, { after: C }) => {
const U = "</" + N[0].slice(1);
return N.input.indexOf(U, C) !== -1;
}, f = dn, h$1 = {
begin: "<>",
end: "</>"
}, n = /<[A-Za-z0-9\\._:-]+\s*\/>/, t = {
begin: /<[A-Za-z0-9\\._:-]+/,
end: /\/[A-Za-z0-9\\._:-]+>|\/>/,
isTrulyOpeningTag: (N, C) => {
const U = N[0].length + N.index, G = N.input[U];
if (G === "<" || G === ",") {
C.ignoreMatch();
return;
}
G === ">" && (l(N, { after: U }) || C.ignoreMatch());
let X;
const J = N.input.substring(U);
if (X = J.match(/^\s*=/)) {
C.ignoreMatch();
return;
}
if ((X = J.match(/^\s+extends\s+/)) && X.index === 0) {
C.ignoreMatch();
return;
}
}
}, i$1 = {
$pattern: dn,
keyword: jt,
literal: qt,
built_in: er,
"variable.language": Jt
}, s = "[0-9](_?[0-9])*", o = `\\.(${s})`, a = "0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*", c$1 = {
className: "number",
variants: [
{ begin: `(\\b(${a})((${o})|\\.)?|(${o}))[eE][+-]?(${s})\\b` },
{ begin: `\\b(${a})\\b((${o})\\b|\\.)?|(${o})\\b` },
{ begin: "\\b(0|[1-9](_?[0-9])*)n\\b" },
{ begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" },
{ begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" },
{ begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" },
{ begin: "\\b0[0-7]+n?\\b" }
],
relevance: 0
}, u = {
className: "subst",
begin: "\\$\\{",
end: "\\}",
keywords: i$1,
contains: []
}, d = {
begin: ".?html`",
end: "",
starts: {
end: "`",
returnEnd: !1,
contains: [e.BACKSLASH_ESCAPE, u],
subLanguage: "xml"
}
}, g = {
begin: ".?css`",
end: "",
starts: {
end: "`",
returnEnd: !1,
contains: [e.BACKSLASH_ESCAPE, u],
subLanguage: "css"
}
}, p = {
begin: ".?gql`",
end: "",
starts: {
end: "`",
returnEnd: !1,
contains: [e.BACKSLASH_ESCAPE, u],
subLanguage: "graphql"
}
}, _ = {
className: "string",
begin: "`",
end: "`",
contains: [e.BACKSLASH_ESCAPE, u]
}, E = {
className: "comment",
variants: [
e.COMMENT(/\/\*\*(?!\/)/, "\\*/", {
relevance: 0,
contains: [{
begin: "(?=@[A-Za-z]+)",
relevance: 0,
contains: [
{
className: "doctag",
begin: "@[A-Za-z]+"
},
{
className: "type",
begin: "\\{",
end: "\\}",
excludeEnd: !0,
excludeBegin: !0,
relevance: 0
},
{
className: "variable",
begin: f + "(?=\\s*(-)|$)",
endsParent: !0,
relevance: 0
},
{
begin: /(?=[^\n])\s/,
relevance: 0
}
]
}]
}),
e.C_BLOCK_COMMENT_MODE,
e.C_LINE_COMMENT_MODE
]
}, v = [
e.APOS_STRING_MODE,
e.QUOTE_STRING_MODE,
d,
g,
p,
_,
{ match: /\$\d+/ },
c$1
];
u.contains = v.concat({
begin: /\{/,
end: /\}/,
keywords: i$1,
contains: ["self"].concat(v)
});
const w = [].concat(E, u.contains), D = w.concat([{
begin: /(\s*)\(/,
end: /\)/,
keywords: i$1,
contains: ["self"].concat(w)
}]), T = {
className: "params",
begin: /(\s*)\(/,
end: /\)/,
excludeBegin: !0,
excludeEnd: !0,
keywords: i$1,
contains: D
}, M = { variants: [{
match: [
/class/,
/\s+/,
f,
/\s+/,
/extends/,
/\s+/,
r.concat(f, "(", r.concat(/\./, f), ")*")
],
scope: {
1: "keyword",
3: "title.class",
5: "keyword",
7: "title.class.inherited"
}
}, {
match: [
/class/,
/\s+/,
f
],
scope: {
1: "keyword",
3: "title.class"
}
}] }, R = {
relevance: 0,
match: r.either(/\bJSON/, /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),
className: "title.class",
keywords: { _: [...Cn, ...In] }
}, L = {
label: "use_strict",
className: "meta",
relevance: 10,
begin: /^\s*['"]use (strict|asm)['"]/
}, O = {
variants: [{ match: [
/function/,
/\s+/,
f,
/(?=\s*\()/
] }, { match: [/function/, /\s*(?=\()/] }],
className: {
1: "keyword",
3: "title.function"
},
label: "func.def",
contains: [T],
illegal: /%/
}, P = {
relevance: 0,
match: /\b[A-Z][A-Z_0-9]+\b/,
className: "variable.constant"
};
function $(N) {
return r.concat("(?!", N.join("|"), ")");
}
const K = {
match: r.concat(/\b/, $([
...kn,
"super",
"import"
].map((N) => `${N}\\s*\\(`)), f, r.lookahead(/\s*\(/)),
className: "title.function",
relevance: 0
}, Y = {
begin: r.concat(/\./, r.lookahead(r.concat(f, /(?![0-9A-Za-z$_(])/))),
end: f,
excludeBegin: !0,
keywords: "prototype",
className: "property",
relevance: 0
}, oe = {
match: [
/get|set/,
/\s+/,
f,
/(?=\()/
],
className: {
1: "keyword",
3: "title.function"
},
contains: [{ begin: /\(\)/ }, T]
}, ge = "(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|" + e.UNDERSCORE_IDENT_RE + ")\\s*=>", b = {
match: [
/const|var|let/,
/\s+/,
f,
/\s*/,
/=\s*/,
/(async\s*)?/,
r.lookahead(ge)
],
keywords: "async",
className: {
1: "keyword",
3: "title.function"
},
contains: [T]
};
return {
name: "JavaScript",
aliases: [
"js",
"jsx",
"mjs",
"cjs"
],
keywords: i$1,
exports: {
PARAMS_CONTAINS: D,
CLASS_REFERENCE: R
},
illegal: /#(?![$_A-z])/,
contains: [
e.SHEBANG({
label: "shebang",
binary: "node",
relevance: 5
}),
L,
e.APOS_STRING_MODE,
e.QUOTE_STRING_MODE,
d,
g,
p,
_,
E,
{ match: /\$\d+/ },
c$1,
R,
{
className: "attr",
begin: f + r.lookahead(":"),
relevance: 0
},
b,
{
begin: "(" + e.RE_STARTERS_RE + "|\\b(case|return|throw)\\b)\\s*",
keywords: "return throw case",
relevance: 0,
contains: [
E,
e.REGEXP_MODE,
{
className: "function",
begin: ge,
returnBegin: !0,
end: "\\s*=>",
contains: [{
className: "params",
variants: [
{
begin: e.UNDERSCORE_IDENT_RE,
relevance: 0
},
{
className: null,
begin: /\(\s*\)/,
skip: !0
},
{
begin: /(\s*)\(/,
end: /\)/,
excludeBegin: !0,
excludeEnd: !0,
keywords: i$1,
contains: D
}
]
}]
},
{
begin: /,/,
relevance: 0
},
{
match: /\s+/,
relevance: 0
},
{
variants: [
{
begin: h$1.begin,
end: h$1.end
},
{ match: n },
{
begin: t.begin,
"on:begin": t.isTrulyOpeningTag,
end: t.end
}
],
subLanguage: "xml",
contains: [{
begin: t.begin,
end: t.end,
skip: !0,
contains: ["self"]
}]
}
]
},
O,
{ beginKeywords: "while if switch catch for" },
{
begin: "\\b(?!function)" + e.UNDERSCORE_IDENT_RE + "\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
returnBegin: !0,
label: "func.def",
contains: [T, e.inherit(e.TITLE_MODE, {
begin: f,
className: "title.function"
})]
},
{
match: /\.\.\./,
relevance: 0
},
Y,
{
match: "\\$" + f,
relevance: 0
},
{
match: [/\bconstructor(?=\s*\()/],
className: { 1: "title.function" },
contains: [T]
},
K,
P,
M,
oe,
{ match: /\$[(.]/ }
]
};
}
function tr(e) {
const r = {
className: "attr",
begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/,
relevance: 1.01
}, l = {
match: /[{}[\],:]/,
className: "punctuation",
relevance: 0
}, f = [
"true",
"false",
"null"
], h$1 = {
scope: "literal",
beginKeywords: f.join(" ")
};
return {
name: "JSON",
aliases: ["jsonc"],
keywords: { literal: f },
contains: [
r,
l,
e.QUOTE_STRING_MODE,
h$1,
e.C_NUMBER_MODE,
e.C_LINE_COMMENT_MODE,
e.C_BLOCK_COMMENT_MODE
],
illegal: "\\S"
};
}
function rr(e) {
const r = "true false yes no null", l = "[\\w#;/?:@&=+$,.~*'()[\\]]+", f = {
className: "attr",
variants: [
{ begin: /\w[\w :()\./-]*:(?=[ \t]|$)/ },
{ begin: /"\w[\w :()\./-]*":(?=[ \t]|$)/ },
{ begin: /'\w[\w :()\./-]*':(?=[ \t]|$)/ }
]
}, n = {
className: "string",
relevance: 0,
variants: [
{
begin: /'/,
end: /'/
},
{
begin: /"/,
end: /"/
},
{ begin: /\S+/ }
],
contains: [e.BACKSLASH_ESCAPE, {
className: "template-variable",
variants: [{
begin: /\{\{/,
end: /\}\}/
}, {
begin: /%\{/,
end: /\}/
}]
}]
}, t = e.inherit(n, { variants: [
{
begin: /'/,
end: /'/
},
{
begin: /"/,
end: /"/
},
{ begin: /[^\s,{}[\]]+/ }
] }), c$1 = {
className: "number",
begin: "\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"
}, u = {
end: ",",
endsWithParent: !0,
excludeEnd: !0,
keywords: r,
relevance: 0
}, d = {
begin: /\{/,
end: /\}/,
contains: [u],
illegal: "\\n",
relevance: 0
}, g = {
begin: "\\[",
end: "\\]",
contains: [u],
illegal: "\\n",
relevance: 0
}, p = [
f,
{
className: "meta",
begin: "^---\\s*$",
relevance: 10
},
{
className: "string",
begin: "[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"
},
{
begin: "<%[%=-]?",
end: "[%-]?%>",
subLanguage: "ruby",
excludeBegin: !0,
excludeEnd: !0,
relevance: 0
},
{
className: "type",
begin: "!\\w+!" + l
},
{
className: "type",
begin: "!<" + l + ">"
},
{
className: "type",
begin: "!" + l
},
{
className: "type",
begin: "!!" + l
},
{
className: "meta",
begin: "&" + e.UNDERSCORE_IDENT_RE + "$"
},
{
className: "meta",
begin: "\\*" + e.UNDERSCORE_IDENT_RE + "$"
},
{
className: "bullet",
begin: "-(?=[ ]|$)",
relevance: 0
},
e.HASH_COMMENT_MODE,
{
beginKeywords: r,
keywords: { literal: r }
},
c$1,
{
className: "number",
begin: e.C_NUMBER_RE + "\\b",
relevance: 0
},
d,
g,
n
], _ = [...p];
return _.pop(), _.push(t), u.contains = _, {
name: "YAML",
case_insensitive: !0,
aliases: ["yml"],
contains: p
};
}
function ir(e) {
return {
name: "Plain text",
aliases: ["text", "txt"],
disableAutodetect: !0
};
}
function sr(e) {
const r = e.regex, l = /[\p{XID_Start}_]\p{XID_Continue}*/u, f = [
"and",
"as",
"assert",
"async",
"await",
"break",
"case",
"class",
"continue",
"def",
"del",
"elif",
"else",
"except",
"finally",
"for",
"from",
"global",
"if",
"import",
"in",
"is",
"lambda",
"match",
"nonlocal|10",
"not",
"or",
"pass",
"raise",
"return",
"try",
"while",
"with",
"yield"
], i$1 = {
$pattern: /[A-Za-z]\w+|__\w+__/,
keyword: f,
built_in: [
"__import__",
"abs",
"all",
"any",
"ascii",
"bin",
"bool",
"breakpoint",
"bytearray",
"bytes",
"callable",
"chr",
"classmethod",
"compile",
"complex",
"delattr",
"dict",
"dir",
"divmod",
"enumerate",
"eval",
"exec",
"filter",
"float",
"format",
"frozenset",
"getattr",
"globals",
"hasattr",
"hash",
"help",
"hex",
"id",
"input",
"int",
"isinstance",
"issubclass",
"iter",
"len",
"list",
"locals",
"map",
"max",
"memoryview",
"min",
"next",
"object",
"oct",
"open",
"ord",
"pow",
"print",
"property",
"range",
"repr",
"reversed",
"round",
"set",
"setattr",
"slice",
"sorted",
"staticmethod",
"str",
"sum",
"super",
"tuple",
"type",
"vars",
"zip"
],
literal: [
"__debug__",
"Ellipsis",
"False",
"None",
"NotImplemented",
"True"
],
type: [
"Any",
"Callable",
"Coroutine",
"Dict",
"List",
"Literal",
"Generic",
"Optional",
"Sequence",
"Set",
"Tuple",
"Type",
"Union"
]
}, s = {
className: "meta",
begin: /^(>>>|\.\.\.) /
}, o = {
className: "subst",
begin: /\{/,
end: /\}/,
keywords: i$1,
illegal: /#/
}, a = {
begin: /\{\{/,
relevance: 0
}, c$1 = {
className: "string",
contains: [e.BACKSLASH_ESCAPE],
variants: [
{
begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,
end: /'''/,
contains: [e.BACKSLASH_ESCAPE, s],
relevance: 10
},
{
begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,
end: /"""/,
contains: [e.BACKSLASH_ESCAPE, s],
relevance: 10
},
{
begin: /([fF][rR]|[rR][fF]|[fF])'''/,
end: /'''/,
contains: [
e.BACKSLASH_ESCAPE,
s,
a,
o
]
},
{
begin: /([fF][rR]|[rR][fF]|[fF])"""/,
end: /"""/,
contains: [
e.BACKSLASH_ESCAPE,
s,
a,
o
]
},
{
begin: /([uU]|[rR])'/,
end: /'/,
relevance: 10
},
{
begin: /([uU]|[rR])"/,
end: /"/,
relevance: 10
},
{
begin: /([bB]|[bB][rR]|[rR][bB])'/,
end: /'/
},
{
begin: /([bB]|[bB][rR]|[rR][bB])"/,
end: /"/
},
{
begin: /([fF][rR]|[rR][fF]|[fF])'/,
end: /'/,
contains: [
e.BACKSLASH_ESCAPE,
a,
o
]
},
{
begin: /([fF][rR]|[rR][fF]|[fF])"/,
end: /"/,
contains: [
e.BACKSLASH_ESCAPE,
a,
o
]
},
e.APOS_STRING_MODE,
e.QUOTE_STRING_MODE
]
}, u = "[0-9](_?[0-9])*", d = `(\\b(${u}))?\\.(${u})|\\b(${u})\\.`, g = `\\b|${f.join("|")}`, p = {
className: "number",
relevance: 0,
variants: [
{ begin: `(\\b(${u})|(${d}))[eE][+-]?(${u})[jJ]?(?=${g})` },
{ begin: `(${d})[jJ]?` },
{ begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})` },
{ begin: `\\b0[bB](_?[01])+[lL]?(?=${g})` },
{ begin: `\\b0[oO](_?[0-7])+[lL]?(?=${g})` },
{ begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})` },
{ begin: `\\b(${u})[jJ](?=${g})` }
]
}, _ = {
className: "comment",
begin: r.lookahead(/# type:/),
end: /$/,
keywords: i$1,
contains: [{ begin: /# type:/ }, {
begin: /#/,
end: /\b\B/,
endsWithParent: !0
}]
}, m = {
className: "params",
variants: [{
className: "",
begin: /\(\s*\)/,
skip: !0
}, {
begin: /\(/,
end: /\)/,
excludeBegin: !0,
excludeEnd: !0,
keywords: i$1,
contains: [
"self",
s,
p,
c$1,
e.HASH_COMMENT_MODE
]
}]
};
return o.contains = [
c$1,
p,
s
], {
name: "Python",
aliases: [
"py",
"gyp",
"ipython"
],
unicodeRegex: !0,
keywords: i$1,
illegal: /(<\/|\?)|=>/,
contains: [
s,
p,
{
scope: "variable.language",
match: /\bself\b/
},
{
beginKeywords: "if",
relevance: 0
},
{
match: /\bor\b/,
scope: "keyword"
},
c$1,
_,
e.HASH_COMMENT_MODE,
{
match: [
/\bdef/,
/\s+/,
l
],
scope: {
1: "keyword",
3: "title.function"
},
contains: [m]
},
{
variants: [{ match: [
/\bclass/,
/\s+/,
l,
/\s*/,
/\(\s*/,
l,
/\s*\)/
] }, { match: [
/\bclass/,
/\s+/,
l
] }],
scope: {
1: "keyword",
3: "title.class",
6: "title.class.inherited"
}
},
{
className: "meta",
begin: /^[\t ]*@/,
end: /(?=#)|$/,
contains: [
p,
m,
c$1
]
}
]
};
}
var de = "[0-9](_*[0-9])*", Oe = `\\.(${de})`, Ce = "[0-9a-fA-F](_*[0-9a-fA-F])*", pn = {
className: "number",
variants: [
{ begin: `(\\b(${de})((${Oe})|\\.)?|(${Oe}))[eE][+-]?(${de})[fFdD]?\\b` },
{ begin: `\\b(${de})((${Oe})[fFdD]?\\b|\\.([fFdD]\\b)?)` },
{ begin: `(${Oe})[fFdD]?\\b` },
{ begin: `\\b(${de})[fFdD]\\b` },
{ begin: `\\b0[xX]((${Ce})\\.?|(${Ce})?\\.(${Ce}))[pP][+-]?(${de})[fFdD]?\\b` },
{ begin: "\\b(0|[1-9](_*[0-9])*)[lL]?\\b" },
{ begin: `\\b0[xX](${Ce})[lL]?\\b` },
{ begin: "\\b0(_*[0-7])*[lL]?\\b" },
{ begin: "\\b0[bB][01](_*[01])*[lL]?\\b" }
],
relevance: 0
};
function Bn(e, r, l) {
return l === -1 ? "" : e.replace(r, (f) => Bn(e, r, l - 1));
}
function ar(e) {
const r = e.regex, l = "[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*", f = l + Bn("(?:<" + l + "~~~(?:\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*~~~)*>)?", /~~~/g, 2), s = {
keyword: [
"synchronized",
"abstract",
"private",
"var",
"static",
"if",
"const ",
"for",
"while",
"strictfp",
"finally",
"protected",
"import",
"native",
"final",
"void",
"enum",
"else",
"break",
"transient",
"catch",
"instanceof",
"volatile",
"case",
"assert",
"package",
"default",
"public",
"try",
"switch",
"continue",
"throws",
"protected",
"public",
"private",
"module",
"requires",
"exports",
"do",
"sealed",
"yield",
"permits",
"goto"
],
literal: [
"false",
"true",
"null"
],
type: [
"char",
"boolean",
"long",
"float",
"int",
"byte",
"short",
"double"
],
built_in: ["super", "this"]
}, o = {
className: "meta",
begin: "@" + l,
contains: [{
begin: /\(/,
end: /\)/,
contains: ["self"]
}]
}, a = {
className: "params",
begin: /\(/,
end: /\)/,
keywords: s,
relevance: 0,
contains: [e.C_BLOCK_COMMENT_MODE],
endsParent: !0
};
return {
name: "Java",
aliases: ["jsp"],
keywords: s,
illegal: /<\/|#/,
contains: [
e.COMMENT("/\\*\\*", "\\*/", {
relevance: 0,
contains: [{
begin: /\w+@/,
relevance: 0
}, {
className: "doctag",
begin: "@[A-Za-z]+"
}]
}),
{
begin: /import java\.[a-z]+\./,
keywords: "import",
relevance: 2
},
e.C_LINE_COMMENT_MODE,
e.C_BLOCK_COMMENT_MODE,
{
begin: /"""/,
end: /"""/,
className: "string",
contains: [e.BACKSLASH_ESCAPE]
},
e.APOS_STRING_MODE,
e.QUOTE_STRING_MODE,
{
match: [
/\b(?:class|interface|enum|extends|implements|new)/,
/\s+/,
l
],
className: {
1: "keyword",
3: "title.class"
}
},
{
match: /non-sealed/,
scope: "keyword"
},
{
begin: [
r.concat(/(?!else)/, l),
/\s+/,
l,
/\s+/,
/=(?!=)/
],
className: {
1: "type",
3: "variable",
5: "operator"
}
},
{
begin: [
/record/,
/\s+/,
l
],
className: {
1: "keyword",
3: "title.class"
},
contains: [
a,
e.C_LINE_COMMENT_MODE,
e.C_BLOCK_COMMENT_MODE
]
},
{
beginKeywords: "new throw return else",
relevance: 0
},
{
begin: [
"(?:" + f + "\\s+)",
e.UNDERSCORE_IDENT_RE,
/\s*(?=\()/
],
className: { 2: "title.function" },
keywords: s,
contains: [
{
className: "params",
begin: /\(/,
end: /\)/,
keywords: s,
relevance: 0,
contains: [
o,
e.APOS_STRING_MODE,
e.QUOTE_STRING_MODE,
pn,
e.C_BLOCK_COMMENT_MODE
]
},
e.C_LINE_COMMENT_MODE,
e.C_BLOCK_COMMENT_MODE
]
},
pn,
o
]
};
}
function or(e) {
const r = e.regex, l = {}, f = {
begin: /\$\{/,
end: /\}/,
contains: ["self", {
begin: /:-/,
contains: [l]
}]
};
Object.assign(l, {
className: "variable",
variants: [{ begin: r.concat(/\$[\w\d#@][\w\d_]*/, "(?![\\w\\d])(?![$])") }, f]
});
const h$1 = {
className: "subst",
begin: /\$\(/,
end: /\)/,
contains: [e.BACKSLASH_ESCAPE]
}, n = e.inherit(e.COMMENT(), {
match: [/(^|\s)/, /#.*$/],
scope: { 2: "comment" }
}), t = {
begin: /<<-?\s*(?=\w+)/,
starts: { contains: [e.END_SAME_AS_BEGIN({
begin: /(\w+)/,
end: /(\w+)/,
className: "string"
})] }
}, i$1 = {
className: "string",
begin: /"/,
end: /"/,
contains: [
e.BACKSLASH_ESCAPE,
l,
h$1
]
};
h$1.contains.push(i$1);
const s = { match: /\\"/ }, o = {
className: "string",
begin: /'/,
end: /'/
}, a = { match: /\\'/ }, c$1 = {
begin: /\$?\(\(/,
end: /\)\)/,
contains: [
{
begin: /\d+#[0-9a-f]+/,
className: "number"
},
e.NUMBER_MODE,
l
]
}, d = e.SHEBANG({
binary: `(${[
"fish",
"bash",
"zsh",
"sh",
"csh",
"ksh",
"tcsh",
"dash",
"scsh"
].join("|")})`,
relevance: 10
}), g = {
className: "function",
begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
returnBegin: !0,
contains: [e.inherit(e.TITLE_MODE, { begin: /\w[\w\d_]*/ })],
relevance: 0
}, p = [
"if",
"then",
"else",
"elif",
"fi",
"for",
"while",
"until",
"in",
"do",
"done",
"case",
"esac",
"function",
"select"
], _ = ["true", "false"], m = { match: /(\/[a-z._-]+)+/ }, E = [
"break",
"cd",
"continue",
"eval",
"exec",
"exit",
"export",
"getopts",
"hash",
"pwd",
"readonly",
"return",
"shift",
"test",
"times",
"trap",
"umask",
"unset"
], v = [
"alias",
"bind",
"builtin",
"caller",
"command",
"declare",
"echo",
"enable",
"help",
"let",
"local",
"logout",
"mapfile",
"printf",
"read",
"readarray",
"source",
"sudo",
"type",
"typeset",
"ulimit",
"unalias"
], w = [
"autoload",
"bg",
"bindkey",
"bye",
"cap",
"chdir",
"clone",
"comparguments",
"compcall",
"compctl",
"compdescribe",
"compfiles",
"compgroups",
"compquote",
"comptags",
"comptry",
"compvalues",
"dirs",
"disable",
"disown",
"echotc",
"echoti",
"emulate",
"fc",
"fg",
"float",
"functions",
"getcap",
"getln",
"history",
"integer",
"jobs",
"kill",
"limit",
"log",
"noglob",
"popd",
"print",
"pushd",
"pushln",
"rehash",
"sched",
"setcap",
"setopt",
"stat",
"suspend",
"ttyctl",
"unfunction",
"unhash",
"unlimit",
"unsetopt",
"vared",
"wait",
"whence",
"where",
"which",
"zcompile",
"zformat",
"zftp",
"zle",
"zmodload",
"zparseopts",
"zprof",
"zpty",
"zregexparse",
"zsocket",
"zstyle",
"ztcp"
], D = [
"chcon",
"chgrp",
"chown",
"chmod",
"cp",
"dd",
"df",
"dir",
"dircolors",
"ln",
"ls",
"mkdir",
"mkfifo",
"mknod",
"mktemp",
"mv",
"realpath",
"rm",
"rmdir",
"shred",
"sync",
"touch",
"truncate",
"vdir",
"b2sum",
"base32",
"base64",
"cat",
"cksum",
"comm",
"csplit",
"cut",
"expand",
"fmt",
"fold",
"head",
"join",
"md5sum",
"nl",
"numfmt",
"od",
"paste",
"ptx",
"pr",
"sha1sum",
"sha224sum",
"sha256sum",
"sha384sum",
"sha512sum",
"shuf",
"sort",
"split",
"sum",
"tac",
"tail",
"tr",
"tsort",
"unexpand",
"uniq",
"wc",
"arch",
"basename",
"chroot",
"date",
"dirname",
"du",
"echo",
"env",
"expr",
"factor",
"groups",
"hostid",
"id",
"link",
"logname",
"nice",
"nohup",
"nproc",
"pathchk",
"pinky",
"printenv",
"printf",
"pwd",
"readlink",
"runcon",
"seq",
"sleep",
"stat",
"stdbuf",
"stty",
"tee",
"test",
"timeout",
"tty",
"uname",
"unlink",
"uptime",
"users",
"who",
"whoami",
"yes"
];
return {
name: "Bash",
aliases: ["sh", "zsh"],
keywords: {
$pattern: /\b[a-z][a-z0-9._-]+\b/,
keyword: p,
literal: _,
built_in: [
...E,
...v,
"set",
"shopt",
...w,
...D
]
},
contains: [
d,
e.SHEBANG(),
g,
c$1,
n,
t,
m,
i$1,
s,
o,
a,
l
]
};
}
function lr(e) {
const r = e.regex, l = e.COMMENT("--", "$"), f = {
className: "string",
variants: [{
begin: /'/,
end: /'/,
contains: [{ begin: /''/ }]
}]
}, h$1 = {
begin: /"/,
end: /"/,
contains: [{ begin: /""/ }]
}, n = [
"true",
"false",
"unknown"
], t = [
"double precision",
"large object",
"with timezone",
"without timezone"
], i$1 = [
"bigint",
"binary",
"blob",
"boolean",
"char",
"character",
"clob",
"date",
"dec",
"decfloat",
"decimal",
"float",
"int",
"integer",
"interval",
"nchar",
"nclob",
"national",
"numeric",
"real",
"row",
"smallint",
"time",
"timestamp",
"varchar",
"varying",
"varbinary"
], s = [
"add",
"asc",
"collation",
"desc",
"final",
"first",
"last",
"view"
], o = [
"abs",
"acos",
"all",
"allocate",
"alter",
"and",
"any",
"are",
"array",
"array_agg",
"array_max_cardinality",
"as",
"asensitive",
"asin",
"asymmetric",
"at",
"atan",
"atomic",
"authorization",
"avg",
"begin",
"begin_frame",
"begin_partition",
"between",
"bigint",
"binary",
"blob",
"boolean",
"both",
"by",
"call",
"called",
"cardinality",
"cascaded",
"case",
"cast",
"ceil",
"ceiling",
"char",
"char_length",
"character",
"character_length",
"check",
"classifier",
"clob",
"close",
"coalesce",
"collate",
"collect",
"column",
"commit",
"condition",
"connect",
"constraint",
"contains",
"convert",
"copy",
"corr",
"corresponding",
"cos",
"cosh",
"count",
"covar_pop",
"covar_samp",
"create",
"cross",
"cube",
"cume_dist",
"current",
"current_catalog",
"current_date",
"current_default_transform_group",
"current_path",
"current_role",
"current_row",
"current_schema",
"current_time",
"current_timestamp",
"current_path",
"current_role",
"current_transform_group_for_type",
"current_user",
"cursor",
"cycle",
"date",
"day",
"deallocate",
"dec",
"decimal",
"decfloat",
"declare",
"default",
"define",
"delete",
"dense_rank",
"deref",
"describe",
"deterministic",
"disconnect",
"distinct",
"double",
"drop",
"dynamic",
"each",
"element",
"else",
"empty",
"end",
"end_frame",
"end_partition",
"end-exec",
"equals",
"escape",
"every",
"except",
"exec",
"execute",
"exists",
"exp",
"external",
"extract",
"false",
"fetch",
"filter",
"first_value",
"float",
"floor",
"for",
"foreign",
"frame_row",
"free",
"from",
"full",
"function",
"fusion",
"get",
"global",
"grant",
"group",
"grouping",
"groups",
"having",
"hold",
"hour",
"identity",
"in",
"indicator",
"initial",
"inner",
"inout",
"insensitive",
"insert",
"int",
"integer",
"intersect",
"intersection",
"interval",
"into",
"is",
"join",
"json_array",
"json_arrayagg",
"json_exists",
"json_object",
"json_objectagg",
"json_query",
"json_table",
"json_table_primitive",
"json_value",
"lag",
"language",
"large",
"last_value",
"lateral",
"lead",
"leading",
"left",
"like",
"like_regex",
"listagg",
"ln",
"local",
"localtime",
"localtimestamp",
"log",
"log10",
"lower",
"match",
"match_number",
"match_recognize",
"matches",
"max",
"member",
"merge",
"method",
"min",
"minute",
"mod",
"modifies",
"module",
"month",
"multiset",
"national",
"natural",
"nchar",
"nclob",
"new",
"no",
"none",
"normalize",
"not",
"nth_value",
"ntile",
"null",
"nullif",
"numeric",
"octet_length",
"occurrences_regex",
"of",
"offset",
"old",
"omit",
"on",
"one",
"only",
"open",
"or",
"order",
"out",
"outer",
"over",
"overlaps",
"overlay",
"parameter",
"partition",
"pattern",
"per",
"percent",
"percent_rank",
"percentile_cont",
"percentile_disc",
"period",
"portion",
"position",
"position_regex",
"power",
"precedes",
"precision",
"prepare",
"primary",
"procedure",
"ptf",
"range",
"rank",
"reads",
"real",
"recursive",
"ref",
"references",
"referencing",
"regr_avgx",
"regr_avgy",
"regr_count",
"regr_intercept",
"regr_r2",
"regr_slope",
"regr_sxx",
"regr_sxy",
"regr_syy",
"release",
"result",
"return",
"returns",
"revoke",
"right",
"rollback",
"rollup",
"row",
"row_number",
"rows",
"running",
"savepoint",
"scope",
"scroll",
"search",
"second",
"seek",
"select",
"sensitive",
"session_user",
"set",
"show",
"similar",
"sin",
"sinh",
"skip",
"smallint",
"some",
"specific",
"specifictype",
"sql",
"sqlexception",
"sqlstate",
"sqlwarning",
"sqrt",
"start",
"static",
"stddev_pop",
"stddev_samp",
"submultiset",
"subset",
"substring",
"substring_regex",
"succeeds",
"sum",
"symmetric",
"system",
"system_time",
"system_user",
"table",
"tablesample",
"tan",
"tanh",
"then",
"time",
"timestamp",
"timezone_hour",
"timezone_minute",
"to",
"trailing",
"translate",
"translate_regex",
"translation",
"treat",
"trigger",
"trim",
"trim_array",
"true",
"truncate",
"uescape",
"union",
"unique",
"unknown",
"unnest",
"update",
"upper",
"user",
"using",
"value",
"values",
"value_of",
"var_pop",
"var_samp",
"varbinary",
"varchar",
"varying",
"versioning",
"when",
"whenever",
"where",
"width_bucket",
"window",
"with",
"within",
"without",
"year"
], a = [
"abs",
"acos",
"array_agg",
"asin",
"atan",
"avg",
"cast",
"ceil",
"ceiling",
"coalesce",
"corr",
"cos",
"cosh",
"count",
"covar_pop",
"covar_samp",
"cume_dist",
"dense_rank",
"deref",
"element",
"exp",
"extract",
"first_value",
"floor",
"json_array",
"json_arrayagg",
"json_exists",
"json_object",
"json_objectagg",
"json_query",
"json_table",
"json_table_primitive",
"json_value",
"lag",
"last_value",
"lead",
"listagg",
"ln",
"log",
"log10",
"lower",
"max",
"min",
"mod",
"nth_value",
"ntile",
"nullif",
"percent_rank",
"percentile_cont",
"percentile_disc",
"position",
"position_regex",
"power",
"rank",
"regr_avgx",
"regr_avgy",
"regr_count",
"regr_intercept",
"regr_r2",
"regr_slope",
"regr_sxx",
"regr_sxy",
"regr_syy",
"row_number",
"sin",
"sinh",
"sqrt",
"stddev_pop",
"stddev_samp",
"substring",
"substring_regex",
"sum",
"tan",
"tanh",
"translate",
"translate_regex",
"treat",
"trim",
"trim_array",
"unnest",
"upper",
"value_of",
"var_pop",
"var_samp",
"width_bucket"
], c$1 = [
"current_catalog",
"current_date",
"current_default_transform_group",
"current_path",
"current_role",
"current_schema",
"current_transform_group_for_type",
"current_user",
"session_user",
"system_time",
"system_user",
"current_time",
"localtime",
"current_timestamp",
"localtimestamp"
], u = [
"create table",
"insert into",
"primary key",
"foreign key",
"not null",
"alter table",
"add constraint",
"grouping sets",
"on overflow",
"character set",
"respect nulls",
"ignore nulls",
"nulls first",
"nulls last",
"depth first",
"breadth first"
], d = a, g = [...o, ...s].filter((v) => !a.includes(v)), p = {
className: "variable",
begin: /@[a-z0-9][a-z0-9_]*/
}, _ = {
className: "operator",
begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,
relevance: 0
}, m = {
begin: r.concat(/\b/, r.either(...d), /\s*\(/),
relevance: 0,
keywords: { built_in: d }
};
function E(v, { exceptions: w, when: D } = {}) {
const T = D;
return w = w || [], v.map((M) => M.match(/\|\d+$/) || w.includes(M) ? M : T(M) ? `${M}|0` : M);
}
return {
name: "SQL",
case_insensitive: !0,
illegal: /[{}]|<\//,
keywords: {
$pattern: /\b[\w\.]+/,
keyword: E(g, { when: (v) => v.length < 3 }),
literal: n,
type: i$1,
built_in: c$1
},
contains: [
{
begin: r.either(...u),
relevance: 0,
keywords: {
$pattern: /[\w\.]+/,
keyword: g.concat(u),
literal: n,
type: i$1
}
},
{
className: "type",
begin: r.either(...t)
},
m,
p,
f,
h$1,
e.C_NUMBER_MODE,
e.C_BLOCK_COMMENT_MODE,
l,
_
]
};
}
q.registerLanguage("xml", Vt);
q.registerLanguage("javascript", nr);
q.registerLanguage("json", tr);
q.registerLanguage("yaml", rr);
q.registerLanguage("plaintext", ir);
q.registerLanguage("python", sr);
q.registerLanguage("java", ar);
q.registerLanguage("bash", or);
q.registerLanguage("sql", lr);
var A = /* @__PURE__ */ ((e) => (e.EQUAL = "equal", e.DELETE = "removed", e.ADD = "added", e.EMPTY = "empty", e))(A || {});
var ie = "<code-diff-modified>", se = "</code-diff-modified>", cr = ie.replace("<", "<").replace(">", ">"), ur = se.replace("<", "<").replace(">", ">");
function be(e) {
return e === void 0 ? A.EQUAL : e.added ? A.ADD : e.removed ? A.DELETE : A.EQUAL;
}
function Be(e, r, l = "word") {
return typeof e == "undefined" ? r : typeof r == "undefined" ? e : (l === "char" ? Vn : qn)(e, r).filter((h$1) => be(h$1) !== A.DELETE).map((h$1) => be(h$1) === A.ADD ? `${ie}${h$1.value}${se}` : h$1.value).join("");
}
function $n(e, r) {
const l = new xe.diff_match_patch(), f = l.diff_linesToChars_(e, r), h$1 = f.chars1, n = f.chars2, t = f.lineArray, i$1 = l.diff_main(h$1, n, !1);
return l.diff_charsToLines_(i$1, t), i$1.map((s) => {
const [o, a] = s;
return {
count: a.replace(/\n$/, "").split(`
`).length,
value: a,
removed: o === xe.DIFF_DELETE,
added: o === xe.DIFF_INSERT
};
});
}
function j(e, r) {
if (!r.match(new RegExp(`(${ie}|${se})`, "g"))) return q.highlight(r, { language: e }).value;
let f = r;
const h$1 = r.replace(new RegExp(`(${ie}|${se})`, "g"), ""), n = document.createElement("div");
n.innerHTML = q.highlight(h$1, { language: e }).value;
let t = !1;
const i$1 = (s) => {
s.childNodes.forEach((o) => {
if (o.nodeType === Node.ELEMENT_NODE && i$1(o), o.nodeType === Node.TEXT_NODE) {
if (!o.textContent) return;
let a = o.textContent, c$1 = "";
for (t && (c$1 = c$1 + ie); a.length;) {
if (f.startsWith(ie)) {
f = f.slice(20), c$1 = c$1 + ie, t = !0;
continue;
}
if (f.startsWith(se)) {
f = f.slice(21), c$1 = c$1 + se, t = !1;
continue;
}
const u = f.match(/* @__PURE__ */ new RegExp(`(${ie}|${se})`)), d = u && u.index ? u.index : f.length, g = Math.min(d, a.length);
c$1 = c$1 + f.substring(0, g), f = f.slice(g), a = a.slice(g);
}
t && (c$1 = c$1 + se), o.textContent = c$1;
}
});
};
return i$1(n), n.innerHTML.replace(new RegExp(cr, "g"), "<span class=\"x\">").replace(new RegExp(ur, "g"), "</span>");
}
function Pn(e, r) {
const l = (s, o) => (s.match(new RegExp(o, "g")) || []).length, f = (s) => s.filter((o) => r == null ? void 0 : r.test(o)).length;
let h$1 = 0, n = 0, t = 0, i$1 = 0;
for (const s of e) {
if (s.added) {
const o = f(s.value.trim().split(`
`));
h$1 += l(s.value.trim(), `
`) + 1 - o, t += o;
continue;
}
if (s.removed) {
const o = f(s.value.trim().split(`
`));
n += l(s.value.trim(), `
`) + 1 - o, i$1 += o;
continue;
}
}
return {
additionsNum: h$1,
deletionsNum: n,
ignoreAdditionsNum: t,
ignoreDeletionsNum: i$1
};
}
function fr(e, r, l = "plaintext", f = "word", h$1 = !1, n = 10, t) {
const i$1 = () => ({ type: A.EMPTY }), s = (E, v, w) => ({
type: E,
num: v,
code: w
}), o = $n(e, r), a = t ? new RegExp(t) : void 0;
let c$1 = 0, u = 0, d = !1;
const g = [], p = {
changes: g,
collector: [],
stat: Pn(o, a)
};
for (let E = 0; E < o.length; E++) {
if (d) {
d = !1;
continue;
}
const [v, w] = [o[E], o[E + 1]], [D, T] = [be(v), be(w)], M = v.value.replace(/\n$/, "").split(`
`);
if (w === void 0) {
for (const L of M) {
let O = i$1(), P = i$1();
const $ = j(l, L);
D === A.EQUAL && (c$1++, u++, O = s(A.EQUAL, c$1, $), P = s(A.EQUAL, u, $)), D === A.DELETE && (c$1++, O = s(A.DELETE, c$1, $), P = i$1()), D === A.ADD && (u++, O = i$1(), P = s(A.ADD, u, $)), g.push({
left: O,
right: P
});
}
break;
}
if (D === A.EQUAL) for (const L of M) {
c$1++, u++;
const O = j(l, L);
g.push({
left: s(A.EQUAL, c$1, O),
right: s(A.EQUAL, u, O)
});
}
const R = w.value.replace(/\n$/, "").split(`
`);
if (D === A.DELETE) {
if (T === A.EQUAL) for (const L of M) c$1++, g.push({
left: s(A.DELETE, c$1, j(l, L)),
right: i$1()
});
if (T === A.ADD) {
d = !0;
const L = Math.max(v.count, w.count);
for (let O = 0; O < L; O++) {
O < v.count && c$1++, O < w.count && u++;
const [P, $] = [M[O], R[O]], K = h$1 || M.length === R.length, Y = K ? Be($, P, f) : P, oe = K ? Be(P, $, f) : $, ge = a != null && a.test(P) ? A.EQUAL : A.DELETE, b = a != null && a.test($) ? A.EQUAL : A.ADD, N = O < v.count ? s(ge, c$1, j(l, Y)) : i$1(), C = O < w.count ? s(b, u, j(l, oe)) : i$1();
g.push({
left: N,
right: C
});
}
}
}
if (D === A.ADD) for (const L of M) u++, g.push({
left: i$1(),
right: s(A.ADD, u, j(l, L))
});
}
if (e === r) {
for (let E = 0; E < g.length; E++) g[E].fold = !1;
return p;
}
for (let E = 0; E < g.length; E++) {
const v = g[E];
if (v.left.type === A.DELETE || v.right.type === A.ADD) {
const [w, D] = [Math.max(E - n, 0), Math.min(E + n + 1, g.length)];
for (let T = w; T < D; T++) g[T].fold = !1;
}
v.fold === void 0 && (v.fold = !0);
}
const _ = [];
let m = [];
for (let E = 0; E < g.length; E++) {
const v = g[E];
if (v.fold === !1) {
m.length && (m[0].hideIndex = p.collector.length, p.collector.push({
lines: m,
fold: !0
}), m = []), _.push(v);
continue;
}
v.hide = !0, m.push(v), _.push(v);
}
return m.length && (m[0].hideIndex = p.collector.length, p.collector.push({
lines: m,
fold: !0
}), m = []), p.changes = _, p;
}
function gr(e, r, l = "plaintext", f = "word", h$1 = !1, n = 10, t) {
const i$1 = $n(e, r), s = t ? new RegExp(t) : void 0;
let o = 0, a = 0, c$1 = !1;
const u = [], d = {
changes: u,
collector: [],
stat: Pn(i$1, s)
};
for (let _ = 0; _ < i$1.length; _++) {
if (c$1) {
c$1 = !1;
continue;
}
const [m, E] = [i$1[_], i$1[_ + 1]], [v, w] = [be(m), be(E)], D = m.value.replace(/\n$/, "").split(`
`);
if (E === void 0) {
for (const M of D) {
v === A.EQUAL && (o++, a++), v === A.DELETE && o++, v === A.ADD && a++;
const R = j(l, M);
u.push({
type: v,
code: R,
addNum: v === A.DELETE ? void 0 : a,
delNum: v === A.ADD ? void 0 : o
});
}
break;
}
if (v === A.EQUAL) for (const M of D) {
o++, a++;
const R = j(l, M);
u.push({
type: A.EQUAL,
code: R,
delNum: o,
addNum: a
});
}
const T = E.value.replace(/\n$/, "").split(`
`);
if (v === A.DELETE) if (w === A.ADD && (D.length === T.length || h$1)) {
for (let M = 0; M < D.length; M++) {
const R = D[M], L = T[M];
o++;
const O = j(l, Be(L, R, f));
u.push({
type: s != null && s.test(R) ? A.EQUAL : A.DELETE,
code: O,
delNum: o
});
}
for (let M = 0; M < T.length; M++) {
const R = D[M], L = T[M];
a++;
const O = j(l, Be(R, L, f));
u.push({
type: s != null && s.test(L) ? A.EQUAL : A.ADD,
code: O,
addNum: a
});
}
c$1 = !0;
} else for (const M of D) {
o++;
const R = j(l, M);
u.push({
type: A.DELETE,
code: R,
delNum: o
});
}
if (v === A.ADD) for (const M of D) {
a++;
const R = j(l, M);
u.push({
type: A.ADD,
code: R,
addNum: a
});
}
}
for (let _ = 0; _ < u.length; _++) {
const m = u[_];
if (m.type === A.DELETE || m.type === A.ADD) {
const [E, v] = [Math.max(_ - n, 0), Math.min(_ + n + 1, u.length)];
for (let w = E; w < v; w++) u[w].fold = !1;
}
m.fold === void 0 && (m.fold = !0);
}
if (e === r) {
for (let _ = 0; _ < u.length; _++) u[_].fold = !1;
return d;
}
const g = [];
let p = [];
for (let _ = 0; _ < u.length; _++) {
const m = u[_];
if (m.fold === !1) {
p.length && (p[0].hideIndex = d.collector.length, d.collector.push({
lines: p,
fold: !0
}), p = []), g.push(m);
continue;
}
m.type === "equal" && (m.hide = !0, p.push(m)), g.push(m);
}
return p.length && (p[0].hideIndex = d.collector.length, d.collector.push({
lines: p,
fold: !0
}), p = []), d.changes = g, d;
}
var hr = { key: 0 }, dr = /* @__PURE__ */ createBaseVNode("td", {
class: "blob-code blob-code-hunk",
align: "left"
}, " ⋯ ", -1), pr = { key: 1 }, _r = ["data-code-marker", "innerHTML"], br = /* @__PURE__ */ defineComponent({
__name: "UnifiedLine",
props: { line: {} },
emits: ["expand"],
setup(e, { emit: r }) {
const l = r;
function f(h$1) {
return h$1 === A.DELETE ? "-" : h$1 === A.ADD ? "+" : "";
}
return (h$1, n) => h$1.line.hideIndex !== void 0 && h$1.line.hide ? (openBlock(), createElementBlock("tr", hr, [createBaseVNode("td", {
class: "blob-num blob-num-hunk text-center",
colspan: "2",
onClick: n[0] || (n[0] = (t) => l("expand", h$1.line))
}, " > "), dr])) : h$1.line.hide ? createCommentVNode("", !0) : (openBlock(), createElementBlock("tr", pr, [
createBaseVNode("td", { class: normalizeClass(["blob-num", {
"blob-num-deletion": h$1.line.type === unref(A).DELETE,
"blob-num-addition": h$1.line.type === unref(A).ADD,
"blob-num-context": h$1.line.type === unref(A).EQUAL,
"blob-num-hunk": h$1.line.hide !== void 0
}]) }, toDisplayString(h$1.line.delNum), 3),
createBaseVNode("td", { class: normalizeClass(["blob-num", {
"blob-num-deletion": h$1.line.type === unref(A).DELETE,
"blob-num-addition": h$1.line.type === unref(A).ADD,
"blob-num-context": h$1.line.type === unref(A).EQUAL,
"blob-num-hunk": h$1.line.hide !== void 0
}]) }, toDisplayString(h$1.line.addNum), 3),
createBaseVNode("td", { class: normalizeClass(["blob-code", {
"blob-code-deletion": h$1.line.type === unref(A).DELETE,
"blob-code-addition": h$1.line.type === unref(A).ADD,
"blob-code-context": h$1.line.type === unref(A).EQUAL,
"blob-code-hunk": h$1.line.hide !== void 0
}]) }, [createBaseVNode("span", {
class: "blob-code-inner blob-code-marker",
"data-code-marker": f(h$1.line.type),
innerHTML: h$1.line.code
}, null, 8, _r)], 2)
]));
}
}), mr = { class: "diff-table" }, Er = /* @__PURE__ */ defineComponent({
__name: "UnifiedViewer",
props: { diffChange: {} },
setup(e) {
const r = e;
function l({ hideIndex: f }) {
f !== void 0 && r.diffChange.collector[f].lines.forEach((h$1) => {
h$1.hide = !1, h$1.fold = !1;
});
}
return (f, h$1) => {
var n;
return openBlock(), createElementBlock("table", mr, [createBaseVNode("tbody", null, [(openBlock(!0), createElementBlock(Fragment, null, renderList((n = f.diffChange) == null ? void 0 : n.changes, (t, i$1) => (openBlock(), createBlock(br, {
key: i$1,
line: t,
onExpand: l
}, null, 8, ["line"]))), 128))])]);
};
}
}), vr = { key: 0 }, wr = /* @__PURE__ */ createBaseVNode("td", {
class: "blob-code blob-code-inner blob-code-hunk",
colspan: "3",
align: "left"
}, " ⋯ ", -1), yr = { key: 1 }, Nr = /* @__PURE__ */ createBaseVNode("td", { class: "blob-num blob-num-empty empty-cell" }, null, -1), Ar = /* @__PURE__ */ createBaseVNode("td", { class: "blob-code blob-code-empty empty-cell" }, null, -1), Mr = ["onMousedown"], Tr = ["data-code-marker", "innerHTML"], Dr = /* @__PURE__ */ defineComponent({
__name: "SplitLine",
props: { splitLine: {} },
emits: ["expand"],
setup(e, { emit: r }) {
const l = r;
function f(n) {
return n === A.DELETE ? "-" : n === A.ADD ? "+" : "";
}
function h$1(n) {
const t = document.querySelectorAll(".file-diff-split .split-side-left"), i$1 = document.querySelectorAll(".file-diff-split .split-side-right");
for (const s of i$1) s.classList.toggle("no-select", n === "left");
for (const s of t) s.classList.toggle("no-select", n === "right");
}
return (n, t) => n.splitLine.hideIndex !== void 0 && n.splitLine.hide ? (openBlock(), createElementBlock("tr", vr, [createBaseVNode("td", {
class: "blob-num blob-num-hunk",
colspan: "1",
onClick: t[0] || (t[0] = (i$1) => l("expand", n.splitLine))
}, " > "), wr])) : n.splitLine.hide ? createCommentVNode("", !0) : (openBlock(), createElementBlock("tr", yr, [(openBlock(!0), createElementBlock(Fragment, null, renderList([n.splitLine.left, n.splitLine.right], (i$1, s) => (openBlock(), createElementBlock(Fragment, null, [i$1.type === unref(A).EMPTY ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [Nr, Ar], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createBaseVNode("td", { class: normalizeClass(["blob-num", {
"blob-num-deletion": i$1.type === unref(A).DELETE,
"blob-num-addition": i$1.type === unref(A).ADD,
"blob-num-context": i$1.type === unref(A).EQUAL,
"blob-num-hunk": n.splitLine.hide !== void 0
}]) }, toDisplayString(i$1.num), 3), createBaseVNode("td", {
class: normalizeClass(["blob-code", {
"blob-code-deletion": i$1.type === unref(A).DELETE,
"blob-code-addition": i$1.type === unref(A).ADD,
"blob-code-context": i$1.type === unref(A).EQUAL,
"blob-code-hunk": n.splitLine.hide !== void 0,
"split-side-left": s === 0,
"split-side-right": s === 1
}]),
onMousedown: (o) => h$1(s === 0 ? "left" : "right")
}, [createBaseVNode("span", {
class: "blob-code-inner blob-code-marker",
"data-code-marker": f(i$1.type),
innerHTML: i$1.code
}, null, 8, Tr)], 42, Mr)], 64))], 64))), 256))]));
}
}), Sr = { class: "file-diff-split diff-table" }, Lr = /* @__PURE__ */ createBaseVNode("colgroup", null, [
/* @__PURE__ */ createBaseVNode("col", { width: "44" }),
/* @__PURE__ */ createBaseVNode("col"),
/* @__PURE__ */ createBaseVNode("col", { width: "44" }),
/* @__PURE__ */ createBaseVNode("col")
], -1), Rr = /* @__PURE__ */ defineComponent({
__name: "SplitViewer",
props: { diffChange: {} },
setup(e) {
const r = e;
function l({ hideIndex: f }) {
f !== void 0 && r.diffChange.collector[f].lines.forEach((h$1) => {
h$1.hide = !1, h$1.fold = !1;
});
}
return (f, h$1) => {
var n;
return openBlock(), createElementBlock("table", Sr, [Lr, createBaseVNode("tbody", null, [(openBlock(!0), createElementBlock(Fragment, null, renderList((n = f.diffChange) == null ? void 0 : n.changes, (t, i$1) => (openBlock(), createBlock(Dr, {
key: i$1,
"split-line": t,
onExpand: l
}, null, 8, ["split-line"]))), 128))])]);
};
}
}), Ve = (e, r) => {
const l = e.__vccOpts || e;
for (const [f, h$1] of r) l[f] = h$1;
return l;
}, Or = { name: "DownArrowIcon" }, Cr = {
width: "1rem",
viewBox: "0 0 512 512",
xmlns: "http://www.w3.org/2000/svg"
}, kr = [/* @__PURE__ */ createBaseVNode("path", { d: "M383.6,322.7L278.6,423c-5.8,6-13.7,9-22.4,9c-8.7,0-16.5-3-22.4-9L128.4,322.7c-12.5-11.9-12.5-31.3,0-43.2 c12.5-11.9,32.7-11.9,45.2,0l50.4,48.2v-217c0-16.9,14.3-30.6,32-30.6c17.7,0,32,13.7,32,30.6v217l50.4-48.2 c12.5-11.9,32.7-11.9,45.2,0C396.1,291.4,396.1,310.7,383.6,322.7z" }, null, -1)];
function Br(e, r, l, f, h$1, n) {
return openBlock(), createElementBlock("svg", Cr, kr);
}
var _n = /* @__PURE__ */ Ve(Or, [["render", Br]]), $r = { name: "UpArrowIcon" }, Pr = {
width: "1rem",
viewBox: "0 0 512 512",
xmlns: "http://www.w3.org/2000/svg"
}, Hr = [/* @__PURE__ */ createBaseVNode("path", { d: "M128.4,189.3L233.4,89c5.8-6,13.7-9,22.4-9c8.7,0,16.5,3,22.4,9l105.4,100.3c12.5,11.9,12.5,31.3,0,43.2 c-12.5,11.9-32.7,11.9-45.2,0L288,184.4v217c0,16.9-14.3,30.6-32,30.6c-17.7,0-32-13.7-32-30.6v-217l-50.4,48.2 c-12.5,11.9-32.7,11.9-45.2,0C115.9,220.6,115.9,201.3,128.4,189.3z" }, null, -1)];
function xr(e, r, l, f, h$1, n) {
return openBlock(), createElementBlock("svg", Pr, Hr);
}
var bn = /* @__PURE__ */ Ve($r, [["render", xr]]), Fr = ["theme"], zr = {
key: 0,
class: "file-header"
}, Gr = {
key: 0,
class: "file-info"
}, Kr = { class: "info-left" }, Wr = { class: "info-left" }, Qr = { class: "diff-commandbar" }, Zr = {
key: 0,
class: "diff-stat"
}, Yr = { class: "diff-stat-added" }, Xr = { class: "diff-stat-deleted" }, Vr = {
key: 1,
class: "file-info"
}, jr = { class: "info-left" }, qr = { class: "info-right" }, Jr = { style: { "margin-left": "20px" } }, ei = { class: "diff-commandbar" }, ni = {
key: 0,
class: "diff-stat"
}, ti = { class: "diff-stat-added" }, ri = { class: "diff-stat-deleted" }, Un = /* @__PURE__ */ defineComponent({
__name: "CodeDiff",
props: {
newString: {},
oldString: {},
language: { default: "plaintext" },
context: { default: 10 },
diffStyle: { default: "word" },
forceInlineComparison: {
type: Boolean,
default: !1
},
outputFormat: { default: "line-by-line" },
trim: {
type: Boolean,
default: !1
},
noDiffLineFeed: {
type: Boolean,
default: !1
},
maxHeight: { default: void 0 },
filename: { default: void 0 },
newFilename: { default: void 0 },
hideHeader: {
type: Boolean,
default: !1
},
hideStat: {
type: Boolean,
default: !1
},
theme: { default: "light" },
ignoreMatchingLines: { default: void 0 }
},
emits: ["diff"],
setup(e, { emit: r }) {
const l = e, f = r, h$1 = computed(() => l.outputFormat === "line-by-line"), n = computed(() => {
let g = l.oldString || "";
return g = l.trim ? g.trim() : g, g = l.noDiffLineFeed ? g.replace(/(\r\n)/g, `
`) : g, g;
}), t = computed(() => {
let g = l.newString || "";
return g = l.trim ? g.trim() : g, g = l.noDiffLineFeed ? g.replace(/(\r\n)/g, `
`) : g, g;
}), i$1 = computed(() => h$1.value ? gr(n.value, t.value, l.language, l.diffStyle, l.forceInlineComparison, l.context, l.ignoreMatchingLines) : fr(n.value, t.value, l.language, l.diffStyle, l.forceInlineComparison, l.context, l.ignoreMatchingLines)), s = ref(i$1.value), o = computed(() => s.value.stat.additionsNum === 0 && s.value.stat.deletionsNum === 0), a = ref(-1);
function c$1() {
const g = document.querySelectorAll(".blob-code-addition");
a.value < g.length - 1 && (a.value++, d(g));
}
function u() {
const g = document.querySelectorAll(".blob-code-addition");
a.value > 0 && (a.value--, d(g));
}
function d(g) {
g.forEach((_) => _.classList.remove("current-diff"));
const p = g[a.value];
p && (p.classList.add("current-diff"), p.scrollIntoView({
behavior: "smooth",
block: "center"
}));
}
return watch(() => l, () => {
s.value = i$1.value, f("diff", { stat: {
isChanged: !o.value,
addNum: s.value.stat.additionsNum,
delNum: s.value.stat.deletionsNum
} });
}, {
deep: !0,
immediate: !0
}), (g, p) => (openBlock(), createElementBlock("div", {
class: "code-diff-view",
theme: g.theme,
style: normalizeStyle({ maxHeight: g.maxHeight })
}, [g.hideHeader ? createCommentVNode("", !0) : (openBlock(), createElementBlock("div", zr, [unref(h$1) ? (openBlock(), createElementBlock("div", Gr, [
createBaseVNode("span", null, [createBaseVNode("div", Kr, toDisplayString(g.filename), 1), createBaseVNode("div", Wr, toDisplayString(g.newFilename), 1)]),
createBaseVNode("span", Qr, [createBaseVNode("button", {
class: "command-item-button",
title: "Next Change",
onClick: c$1
}, [createVNode(_n)]), createBaseVNode("button", {
class: "command-item-button",
title: "Previous Change",
onClick: u
}, [createVNode(bn)])]),
g.hideStat ? createCommentVNode("", !0) : (openBlock(), createElementBlock("span", Zr, [renderSlot(g.$slots, "stat", { stat: unref(s).stat }, () => [createBaseVNode("span", Yr, "+" + toDisplayString(unref(s).stat.additionsNum) + " additions", 1), createBaseVNode("span", Xr, "-" + toDisplayString(unref(s).stat.deletionsNum) + " deletions", 1)])]))
])) : (openBlock(), createElementBlock("div", Vr, [createBaseVNode("span", jr, toDisplayString(g.filename), 1), createBaseVNode("span", qr, [
createBaseVNode("span", Jr, toDisplayString(g.newFilename), 1),
createBaseVNode("span", ei, [createBaseVNode("button", {
class: "command-item-button",
title: "Next Change",
onClick: c$1
}, [createVNode(_n)]), createBaseVNode("button", {
class: "command-item-button",
title: "Previous Change",
onClick: u
}, [createVNode(bn)])]),
g.hideStat ? createCommentVNode("", !0) : (openBlock(), createElementBlock("span", ni, [renderSlot(g.$slots, "stat", { stat: unref(s).stat }, () => [createBaseVNode("span", ti, "+" + toDisplayString(unref(s).stat.additionsNum) + " additions", 1), createBaseVNode("span", ri, "-" + toDisplayString(unref(s).stat.deletionsNum) + " deletions", 1)])]))
])]))])), unref(h$1) ? (openBlock(), createBlock(Er, {
key: 1,
"diff-change": unref(s)
}, null, 8, ["diff-change"])) : (openBlock(), createBlock(Rr, {
key: 2,
"diff-change": unref(s)
}, null, 8, ["diff-change"]))], 12, Fr));
}
});
var NodeDiff_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "NodeDiff",
props: {
oldString: {},
newString: {},
outputFormat: { default: "line-by-line" },
language: { default: "json" },
hideStat: { type: Boolean },
hideHeader: {
type: Boolean,
default: true
},
forceInlineComparison: { type: Boolean },
diffStyle: { default: "word" },
theme: { default: void 0 }
},
setup(__props) {
const uiStore = useUIStore();
const props = __props;
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(Un), mergeProps(props, {
class: _ctx.$style.codeDiff,
theme: props.theme || unref(uiStore).appliedTheme
}), null, 16, ["class", "theme"]);
};
}
});
var NodeDiff_vue_vue_type_style_index_0_lang_module_default = { codeDiff: "_codeDiff_itzsi_124" };
var NodeDiff_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeDiff_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NodeDiff_vue_vue_type_style_index_0_lang_module_default }]]);
var [useProvideViewportSync, useInject] = createInjectionState(() => {
const onViewportChange = createEventHook();
const onNodeClick = createEventHook();
const selectedDetailId = ref();
const syncIsEnabled = ref(true);
let scheduledFrameId = null;
let pendingUpdate = null;
function triggerViewportChange(update) {
if (!syncIsEnabled.value) return;
pendingUpdate = update;
scheduledFrameId ??= requestAnimationFrame(() => {
if (pendingUpdate) {
onViewportChange.trigger(pendingUpdate);
pendingUpdate = null;
}
scheduledFrameId = null;
});
}
return {
onViewportChange: onViewportChange.on,
triggerViewportChange,
onNodeClick: onNodeClick.on,
triggerNodeClick: onNodeClick.trigger,
selectedDetailId,
syncIsEnabled
};
});
function useInjectViewportSync() {
const state = useInject();
if (!state) throw new Error("Please call \"useProvideViewportSync\" on the appropriate parent component");
return state;
}
var _hoisted_1$8 = { style: {
"width": "100%",
"height": "100%",
"position": "relative"
} };
var SyncedWorkflowCanvas_default = /* @__PURE__ */ defineComponent({
__name: "SyncedWorkflowCanvas",
props: {
id: {},
nodes: {},
connections: {}
},
setup(__props) {
const props = __props;
const { setViewport, onViewportChange: onLocalViewportChange, onNodeClick, fitView, findNode, addSelectedNodes, onPaneClick } = useVueFlow({ id: props.id });
const { triggerViewportChange, onViewportChange, selectedDetailId, triggerNodeClick } = useInjectViewportSync();
let isApplyingRemoteUpdate = false;
onLocalViewportChange((vp) => {
if (isApplyingRemoteUpdate) return;
triggerViewportChange({
from: props.id,
viewport: vp
});
});
onViewportChange(({ from, viewport }) => {
if (from === props.id) return;
isApplyingRemoteUpdate = true;
setViewport(viewport);
requestAnimationFrame(() => isApplyingRemoteUpdate = false);
});
onNodeClick(({ node }) => triggerNodeClick(node.id));
onPaneClick(() => {
setTimeout(() => {
const node = findNode(selectedDetailId.value);
if (!node) {
addSelectedNodes([]);
return;
}
addSelectedNodes([node]);
}, 0);
});
watch(selectedDetailId, (id) => {
const node = findNode(id);
if (!node) {
addSelectedNodes([]);
return;
}
addSelectedNodes([node]);
const paddingRatio = node.dimensions.height * 5 / Math.max(node.dimensions.width, node.dimensions.height);
fitView({
nodes: [node.id],
padding: paddingRatio,
duration: 500
});
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", _hoisted_1$8, [createVNode(Canvas_default, {
id: _ctx.id,
nodes: _ctx.nodes,
connections: _ctx.connections,
"read-only": true,
style: {
"width": "100%",
"height": "100%"
}
}, {
node: withCtx(({ nodeProps }) => [renderSlot(_ctx.$slots, "node", normalizeProps(guardReactiveProps({ nodeProps })))]),
edge: withCtx(({ edgeProps, arrowHeadMarkerId }) => [renderSlot(_ctx.$slots, "edge", normalizeProps(guardReactiveProps({
edgeProps,
arrowHeadMarkerId
})))]),
"canvas-background": withCtx(({ viewport }) => [createVNode(CanvasBackground_default, {
striped: false,
viewport
}, null, 8, ["viewport"])]),
_: 3
}, 8, [
"id",
"nodes",
"connections"
])]);
};
}
});
function mapConnections(connections) {
return connections.reduce((acc, connection) => {
acc.set.add(connection.id);
acc.map.set(connection.id, connection);
return acc;
}, {
set: /* @__PURE__ */ new Set(),
map: /* @__PURE__ */ new Map()
});
}
function createWorkflowRefs(workflow, createWorkflowObject) {
const workflowRef = computed(() => toValue(workflow));
const workflowNodes = ref([]);
const workflowConnections = ref({});
const workflowObjectRef = shallowRef(createWorkflowObject([], {}));
watchEffect(() => {
const workflowValue = workflowRef.value;
if (workflowValue) {
workflowObjectRef.value = createWorkflowObject(workflowValue.nodes, workflowValue.connections);
workflowNodes.value = workflowValue.nodes;
workflowConnections.value = workflowValue.connections;
}
});
return {
workflowRef,
workflowNodes,
workflowConnections,
workflowObjectRef
};
}
function createWorkflowDiff(workflowRef, workflowNodes, workflowConnections, workflowObjectRef) {
return computed(() => {
if (!workflowRef.value) return {
workflow: void 0,
nodes: [],
connections: []
};
const { nodes: nodes$3, connections } = useCanvasMapping({
nodes: workflowNodes,
connections: workflowConnections,
workflowObject: workflowObjectRef
});
return {
workflow: workflowRef,
nodes: nodes$3.value.map((node) => {
node.draggable = false;
node.selectable = false;
node.focusable = false;
return node;
}),
connections: connections.value.map((connection) => {
connection.selectable = false;
connection.focusable = false;
connection.label = "";
return connection;
})
};
});
}
const useWorkflowDiff = (sourceWorkflow, targetWorkflow) => {
const workflowsStore = useWorkflowsStore();
const nodeTypesStore = useNodeTypesStore();
const sourceRefs = createWorkflowRefs(sourceWorkflow, workflowsStore.createWorkflowObject);
const targetRefs = createWorkflowRefs(targetWorkflow, workflowsStore.createWorkflowObject);
const source = createWorkflowDiff(sourceRefs.workflowRef, sourceRefs.workflowNodes, sourceRefs.workflowConnections, sourceRefs.workflowObjectRef);
const target = createWorkflowDiff(targetRefs.workflowRef, targetRefs.workflowNodes, targetRefs.workflowConnections, targetRefs.workflowObjectRef);
const nodesDiff = computed(() => {
const sourceNodes = source.value?.workflow?.value?.nodes ?? [];
const targetNodes = target.value?.workflow?.value?.nodes ?? [];
if (sourceNodes.length === 0 && targetNodes.length === 0) return /* @__PURE__ */ new Map();
return compareWorkflowsNodes(sourceNodes, targetNodes);
});
function formatConnectionDiff(id, status, collection, accumulator) {
const connection = collection.get(id);
if (!connection) return;
const sourceNode = nodesDiff.value.get(connection.source)?.node;
const targetNode = nodesDiff.value.get(connection.target)?.node;
accumulator.set(id, {
status,
connection: {
id,
source: sourceNode,
target: targetNode,
sourceType: sourceNode ? nodeTypesStore.getNodeType(sourceNode.type, sourceNode.typeVersion) : null,
targetType: targetNode ? nodeTypesStore.getNodeType(targetNode.type, targetNode.typeVersion) : null
}
});
}
return {
source,
target,
nodesDiff,
connectionsDiff: computed(() => {
const sourceConnections = mapConnections(source.value?.connections ?? []);
const targetConnections = mapConnections(target.value?.connections ?? []);
if (sourceConnections.set.size === 0 && targetConnections.set.size === 0) return /* @__PURE__ */ new Map();
const added$1 = targetConnections.set.difference(sourceConnections.set);
const removed = sourceConnections.set.difference(targetConnections.set);
const acc = /* @__PURE__ */ new Map();
for (const id of added$1.values()) formatConnectionDiff(id, NodeDiffStatus.Added, targetConnections.map, acc);
for (const id of removed.values()) formatConnectionDiff(id, NodeDiffStatus.Deleted, sourceConnections.map, acc);
return acc;
})
};
};
function removeWorkflowExecutionData(workflow) {
if (!workflow) return workflow;
const { pinData,...cleanWorkflow } = workflow;
return {
...cleanWorkflow,
nodes: workflow.nodes.map((node) => {
const { issues, pinData: pinData$1,...cleanNode } = node;
return cleanNode;
})
};
}
var HighlightedEdge_default = /* @__PURE__ */ defineComponent({
__name: "HighlightedEdge",
props: {
id: {},
sourceNode: {},
targetNode: {},
source: {},
target: {},
type: {},
label: {},
style: {},
selected: { type: Boolean },
sourcePosition: {},
targetPosition: {},
sourceHandleId: {},
targetHandleId: {},
animated: { type: Boolean },
updatable: { type: Boolean },
markerStart: {},
markerEnd: {},
curvature: {},
interactionWidth: {},
data: {},
events: {},
labelStyle: {},
labelShowBg: { type: Boolean },
labelBgStyle: {},
labelBgPadding: {},
labelBgBorderRadius: {},
sourceX: {},
sourceY: {},
targetX: {},
targetY: {},
readOnly: { type: Boolean },
hovered: { type: Boolean },
bringToFront: { type: Boolean }
},
setup(__props) {
const props = __props;
return (_ctx, _cache) => {
return openBlock(), createBlock(CanvasEdge_default, mergeProps(props, {
"read-only": "",
selected: false,
selectable: false
}), {
highlight: withCtx(({ segments }) => [(openBlock(true), createElementBlock(Fragment, null, renderList(segments, (segment) => {
return openBlock(), createBlock(unref(_sfc_main$d), {
key: segment[0],
style: {
strokeWidth: 15,
stroke: "var(--edge--color--highlight)"
},
path: segment[0],
"interaction-width": 0
}, null, 8, ["path"]);
}), 128))]),
_: 1
}, 16);
};
}
});
var _hoisted_1$7 = { style: {
"display": "flex",
"flex-direction": "row",
"align-items": "center",
"gap": "8px",
"padding": "12px 10px"
} };
var WorkflowDiffAside_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowDiffAside",
props: { node: {} },
emits: ["close"],
setup(__props, { emit: __emit }) {
useCssVars((_ctx) => ({ "3eb5ea38": panelWidth.value }));
const props = __props;
const nodeTypesStore = useNodeTypesStore();
const nodeType = computed(() => nodeTypesStore.getNodeType(props.node.type, props.node.typeVersion));
const panelWidth = ref(350);
function onResize({ width }) {
panelWidth.value = width;
}
const outputFormat = ref("line-by-line");
const emit = __emit;
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(N8nResizeWrapper_default), {
class: normalizeClass(_ctx.$style.workflowDiffAside),
width: panelWidth.value,
"min-width": 260,
"supported-directions": ["left"],
"grid-size": 8,
outset: "",
onResize
}, {
default: withCtx(() => [createBaseVNode("div", _hoisted_1$7, [
createVNode(NodeIcon_default, {
class: "ml-xs",
"node-type": nodeType.value,
size: 16
}, null, 8, ["node-type"]),
createVNode(unref(N8nHeading_default), {
size: "small",
color: "text-dark",
bold: "",
class: normalizeClass(_ctx.$style.nodeTitle)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.node.name), 1)]),
_: 1
}, 8, ["class"]),
createVNode(unref(N8nIconButton_default), {
icon: "x",
type: "secondary",
text: "",
class: "ml-auto",
onClick: _cache[0] || (_cache[0] = ($event) => emit("close"))
})
]), renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps({ outputFormat: outputFormat.value })))]),
_: 3
}, 8, ["class", "width"]);
};
}
});
var WorkflowDiffAside_vue_vue_type_style_index_0_lang_module_default = {
workflowDiffAside: "_workflowDiffAside_z1r3u_123",
nodeTitle: "_nodeTitle_z1r3u_132"
};
var WorkflowDiffAside_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowDiffAside_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowDiffAside_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$6 = {
key: 0,
class: "ml-4xs"
};
var _hoisted_2$1 = { key: 0 };
var _hoisted_3 = { style: { "flex": "1" } };
var _hoisted_4 = { key: 2 };
var WorkflowDiffModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowDiffModal",
props: { data: {} },
setup(__props) {
const props = __props;
const { selectedDetailId, onNodeClick, syncIsEnabled } = useProvideViewportSync();
const telemetry$1 = useTelemetry();
const toast = useToast();
const $style = useCssModule();
const nodeTypesStore = useNodeTypesStore();
const sourceControlStore = useSourceControlStore();
const i18n$2 = useI18n();
const router = useRouter();
const route = useRoute();
const workflowsStore = useWorkflowsStore();
const manualAsyncConfiguration = {
resetOnExecute: true,
shallow: false,
immediate: false
};
const isClosed = ref(false);
const remote = useAsyncState(async () => {
if (props.data.direction === "push" && props.data.workflowStatus === "created") return {
workflow: void 0,
remote: true
};
try {
const { workflowId } = props.data;
const { content: workflow } = await sourceControlStore.getRemoteWorkflow(workflowId);
return {
workflow,
remote: true
};
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("generic.error"));
handleBeforeClose();
return {
workflow: void 0,
remote: true
};
}
}, void 0, manualAsyncConfiguration);
const local = useAsyncState(async () => {
try {
const { workflowId } = props.data;
return {
workflow: await workflowsStore.fetchWorkflow(workflowId),
remote: false
};
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("generic.error"));
handleBeforeClose();
return {
workflow: void 0,
remote: false
};
}
}, void 0, manualAsyncConfiguration);
const sourceWorkFlow = computed(() => props.data.direction === "push" ? remote : local);
const targetWorkFlow = computed(() => props.data.direction === "push" ? local : remote);
const { source, target, nodesDiff, connectionsDiff } = useWorkflowDiff(computed(() => removeWorkflowExecutionData(sourceWorkFlow.value.state.value?.workflow)), computed(() => removeWorkflowExecutionData(targetWorkFlow.value.state.value?.workflow)));
const settingsDiff = computed(() => {
const sourceSettings = sourceWorkFlow.value.state.value?.workflow?.settings ?? {};
const targetSettings = targetWorkFlow.value.state.value?.workflow?.settings ?? {};
const allKeys = new Set([...Object.keys(sourceSettings), ...Object.keys(targetSettings)].filter((key) => key in sourceSettings || key in targetSettings));
const settings = Array.from(allKeys).reduce((acc, key) => {
const val1 = sourceSettings[key];
const val2 = targetSettings[key];
if (val1 !== val2) acc.push({
name: key,
before: String(val1),
after: String(val2)
});
return acc;
}, []);
const sourceName = sourceWorkFlow.value.state.value?.workflow?.name;
const targetName = targetWorkFlow.value.state.value?.workflow?.name;
if (sourceName && targetName && sourceName !== targetName) settings.unshift({
name: "name",
before: sourceName,
after: targetName
});
const sourceTags = (sourceWorkFlow.value.state.value?.workflow?.tags ?? []).map((tag) => typeof tag === "string" ? tag : tag.name);
const targetTags = (targetWorkFlow.value.state.value?.workflow?.tags ?? []).map((tag) => typeof tag === "string" ? tag : tag.name);
if (sourceTags.join("") !== targetTags.join("")) settings.push({
name: "tags",
before: JSON.stringify(sourceTags, null, 2),
after: JSON.stringify(targetTags, null, 2)
});
return settings;
});
function getNodeStatusClass(id) {
return $style[nodesDiff.value?.get(id)?.status ?? "equal"];
}
function getEdgeStatusClass(id) {
return $style[`edge-${connectionsDiff.value.get(id)?.status ?? NodeDiffStatus.Eq}`];
}
const nodeChanges = computed(() => {
if (!nodesDiff.value) return [];
return [...nodesDiff.value.values()].filter((change) => change.status !== NodeDiffStatus.Eq).map((change) => ({
...change,
type: nodeTypesStore.getNodeType(change.node.type, change.node.typeVersion)
}));
});
function nextNodeChange() {
telemetry$1.track("User iterated over changes", {
workflow_id: props.data.workflowId,
context: "next"
});
const nextIndex = (nodeChanges.value.findIndex((change) => change.node.id === selectedDetailId.value) + 1) % nodeChanges.value.length;
selectedDetailId.value = nodeChanges.value[nextIndex]?.node.id;
}
function previousNodeChange() {
telemetry$1.track("User iterated over changes", {
workflow_id: props.data.workflowId,
context: "previous"
});
const previousIndex = (nodeChanges.value.findIndex((change) => change.node.id === selectedDetailId.value) - 1 + nodeChanges.value.length) % nodeChanges.value.length;
selectedDetailId.value = nodeChanges.value[previousIndex]?.node.id;
}
const activeTab = ref();
const tabs$3 = computed(() => [
{
value: "nodes",
label: i18n$2.baseText("workflowDiff.nodes"),
disabled: false,
data: { count: nodeChanges.value.length }
},
{
value: "connectors",
label: i18n$2.baseText("workflowDiff.connectors"),
disabled: false,
data: { count: connectionsDiff.value.size }
},
{
value: "settings",
label: i18n$2.baseText("workflowDiff.settings"),
disabled: false,
data: { count: settingsDiff.value.length }
}
]);
function setActiveTab(active) {
if (!active) {
activeTab.value = void 0;
return;
}
telemetry$1.track("User clicked workflow diff changes button", { workflow_id: props.data.workflowId });
activeTab.value = "nodes";
}
function trackTabChange(value) {
telemetry$1.track("User clicked changes tabs", {
workflow_id: props.data.workflowId,
context: `${value}_tab`
});
}
const selectedNode = computed(() => {
if (!selectedDetailId.value) return void 0;
const node = nodesDiff.value.get(selectedDetailId.value)?.node;
if (!node) return void 0;
return node;
});
const nodeDiffs = computed(() => {
if (!selectedDetailId.value) return {
oldString: "",
newString: ""
};
const sourceNode = sourceWorkFlow.value?.state.value?.workflow?.nodes.find((node) => node.id === selectedDetailId.value);
const targetNode = targetWorkFlow.value?.state.value?.workflow?.nodes.find((node) => node.id === selectedDetailId.value);
function replacer(key, value, nodeType) {
if (key === "position") return;
if ((key === "jsCode" || key === "content" && nodeType === "n8n-nodes-base.stickyNote") && typeof value === "string") return value.split("\n");
return value;
}
const withNodeType = (type) => (key, value) => replacer(key, value, type);
return {
oldString: JSON.stringify(sourceNode, withNodeType(sourceNode?.type), 2) ?? "",
newString: JSON.stringify(targetNode, withNodeType(targetNode?.type), 2) ?? ""
};
});
function handleBeforeClose() {
if (isClosed.value) return;
isClosed.value = true;
selectedDetailId.value = void 0;
if (window.history.length > 1) router.back();
else {
const newQuery = { ...route.query };
delete newQuery.diff;
delete newQuery.direction;
router.replace({ query: newQuery });
}
}
function handleEscapeKey(event) {
if (event.key === "Escape") {
event.preventDefault();
event.stopPropagation();
handleBeforeClose();
}
}
onMounted(async () => {
document.addEventListener("keydown", handleEscapeKey, true);
await nodeTypesStore.loadNodeTypesIfNotLoaded();
remote.execute();
local.execute();
});
onUnmounted(() => {
document.removeEventListener("keydown", handleEscapeKey, true);
});
const changesCount = computed(() => nodeChanges.value.length + connectionsDiff.value.size + settingsDiff.value.length);
const isSourceWorkflowNew = computed(() => {
const sourceExists = !!sourceWorkFlow.value.state.value?.workflow;
const targetExists = !!targetWorkFlow.value.state.value?.workflow;
return !sourceExists && targetExists;
});
onNodeClick((nodeId) => {
const node = nodesDiff.value.get(nodeId);
if (!node) return;
telemetry$1.track("User clicked to view node changes", {
workflow_id: props.data.workflowId,
node_type: node.node.type,
context: "canvas"
});
if (node.status !== NodeDiffStatus.Eq) selectedDetailId.value = nodeId;
});
function setSelectedDetailId(nodeId, context) {
if (!nodeId) {
selectedDetailId.value = void 0;
return;
}
selectedDetailId.value = nodeId;
const node = nodesDiff.value.get(nodeId);
if (!node) return;
telemetry$1.track("User clicked to view node changes", {
workflow_id: props.data.workflowId,
node_type: node.node.type,
context: `${context}_list`
});
}
const modifiers = [{
name: "preventOverflow",
options: {
boundary: "viewport",
padding: 8
}
}, {
name: "offset",
options: { offset: [80, 8] }
}];
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"event-bus": _ctx.data.eventBus,
name: unref(WORKFLOW_DIFF_MODAL_KEY),
"custom-class": unref($style).workflowDiffModal,
height: "100%",
width: "100%",
"max-width": "100%",
"max-height": "100%",
"close-on-press-escape": false,
onBeforeClose: handleBeforeClose
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(unref($style).header) }, [createBaseVNode("div", { class: normalizeClass(unref($style).headerLeft) }, [createVNode(unref(N8nIconButton_default), {
icon: "arrow-left",
type: "secondary",
class: normalizeClass([unref($style).backButton, "mr-xs"]),
"icon-size": "large",
onClick: handleBeforeClose
}, null, 8, ["class"]), createVNode(unref(N8nHeading_default), {
tag: "h4",
size: "medium"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(sourceWorkFlow.value.state.value?.workflow?.name || targetWorkFlow.value.state.value?.workflow?.name), 1)]),
_: 1
})], 2), createBaseVNode("div", { class: normalizeClass(unref($style).headerRight) }, [
createVNode(unref(N8nCheckbox_default), {
modelValue: unref(syncIsEnabled),
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(syncIsEnabled) ? syncIsEnabled.value = $event : null),
"label-size": "small",
label: "Sync views",
class: "mb-0 mr-s"
}, null, 8, ["modelValue"]),
createVNode(unref(ElDropdown), {
trigger: "click",
"popper-options": {
placement: "bottom-end",
modifiers
},
"popper-class": unref($style).popper,
onVisibleChange: setActiveTab
}, {
dropdown: withCtx(() => [createVNode(unref(ElDropdownMenu), { "hide-on-click": false }, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(unref($style).dropdownContent) }, [createVNode(unref(N8nRadioButtons_default), {
modelValue: activeTab.value,
"onUpdate:modelValue": [_cache[1] || (_cache[1] = ($event) => activeTab.value = $event), trackTabChange],
options: tabs$3.value,
class: normalizeClass([unref($style).tabs, "mb-xs"])
}, {
option: withCtx(({ label: label$2, data: optionData }) => [createTextVNode(toDisplayString(label$2) + " ", 1), optionData?.count ? (openBlock(), createElementBlock("span", _hoisted_1$6, " (" + toDisplayString(optionData.count) + ") ", 1)) : createCommentVNode("", true)]),
_: 1
}, 8, [
"modelValue",
"options",
"class"
]), createBaseVNode("div", null, [
activeTab.value === "nodes" ? (openBlock(), createElementBlock("ul", _hoisted_2$1, [nodeChanges.value.length > 0 ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(nodeChanges.value, (change) => {
return openBlock(), createBlock(unref(ElDropdownItem), {
key: change.node.id,
class: normalizeClass({
[unref($style).clickableChange]: true,
[unref($style).clickableChangeActive]: unref(selectedDetailId) === change.node.id
}),
onClick: withModifiers(($event) => setSelectedDetailId(change.node.id, activeTab.value), ["prevent"])
}, {
default: withCtx(() => [
createVNode(DiffBadge_default, { type: change.status }, null, 8, ["type"]),
createVNode(NodeIcon_default, {
"node-type": change.type,
size: 16,
class: "ml-2xs mr-4xs"
}, null, 8, ["node-type"]),
createBaseVNode("span", { class: normalizeClass(unref($style).nodeName) }, toDisplayString(change.node.name), 3)
]),
_: 2
}, 1032, ["class", "onClick"]);
}), 128)) : (openBlock(), createElementBlock("li", {
key: 1,
class: normalizeClass(unref($style).emptyState)
}, [createVNode(unref(N8nText_default), {
color: "text-base",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowDiff.noChanges")), 1)]),
_: 1
})], 2))])) : createCommentVNode("", true),
activeTab.value === "connectors" ? (openBlock(), createElementBlock("ul", {
key: 1,
class: normalizeClass(unref($style).changes)
}, [unref(connectionsDiff).size > 0 ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(unref(connectionsDiff), (change) => {
return openBlock(), createElementBlock("li", { key: change[0] }, [createBaseVNode("div", null, [createVNode(DiffBadge_default, { type: change[1].status }, null, 8, ["type"])]), createBaseVNode("div", _hoisted_3, [createBaseVNode("ul", { class: normalizeClass(unref($style).changesNested) }, [
createVNode(unref(ElDropdownItem), {
class: normalizeClass({
[unref($style).clickableChange]: true,
[unref($style).clickableChangeActive]: unref(selectedDetailId) === change[1].connection.source?.id
}),
onClick: withModifiers(($event) => setSelectedDetailId(change[1].connection.source?.id, activeTab.value), ["prevent"])
}, {
default: withCtx(() => [createVNode(NodeIcon_default, {
"node-type": change[1].connection.sourceType,
size: 16,
class: "ml-2xs mr-4xs"
}, null, 8, ["node-type"]), createBaseVNode("span", { class: normalizeClass(unref($style).nodeName) }, toDisplayString(change[1].connection.source?.name), 3)]),
_: 2
}, 1032, ["class", "onClick"]),
createBaseVNode("div", { class: normalizeClass(unref($style).separator) }, null, 2),
createVNode(unref(ElDropdownItem), {
class: normalizeClass({
[unref($style).clickableChange]: true,
[unref($style).clickableChangeActive]: unref(selectedDetailId) === change[1].connection.target?.id
}),
onClick: withModifiers(($event) => setSelectedDetailId(change[1].connection.target?.id, activeTab.value), ["prevent"])
}, {
default: withCtx(() => [createVNode(NodeIcon_default, {
"node-type": change[1].connection.targetType,
size: 16,
class: "ml-2xs mr-4xs"
}, null, 8, ["node-type"]), createBaseVNode("span", { class: normalizeClass(unref($style).nodeName) }, toDisplayString(change[1].connection.target?.name), 3)]),
_: 2
}, 1032, ["class", "onClick"])
], 2)])]);
}), 128)) : (openBlock(), createElementBlock("li", {
key: 1,
class: normalizeClass(unref($style).emptyState)
}, [createVNode(unref(N8nText_default), {
color: "text-base",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowDiff.noChanges")), 1)]),
_: 1
})], 2))], 2)) : createCommentVNode("", true),
activeTab.value === "settings" ? (openBlock(), createElementBlock("ul", _hoisted_4, [settingsDiff.value.length > 0 ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(settingsDiff.value, (setting) => {
return openBlock(), createElementBlock("li", { key: setting.name }, [createVNode(unref(N8nText_default), {
color: "text-dark",
size: "medium",
tag: "div",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText(`workflowSettings.${setting.name}`)), 1)]),
_: 2
}, 1024), createVNode(NodeDiff_default, {
"old-string": setting.before,
"new-string": setting.after,
class: normalizeClass(unref($style).noNumberDiff)
}, null, 8, [
"old-string",
"new-string",
"class"
])]);
}), 128)) : (openBlock(), createElementBlock("li", {
key: 1,
class: normalizeClass(unref($style).emptyState)
}, [createVNode(unref(N8nText_default), {
color: "text-base",
size: "small"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowDiff.noChanges")), 1)]),
_: 1
})], 2))])) : createCommentVNode("", true)
])], 2)]),
_: 1
})]),
default: withCtx(() => [createVNode(unref(N8nButton_default), {
type: "secondary",
style: { "--button--radius": "4px 0 0 4px" }
}, {
default: withCtx(() => [changesCount.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(unref($style).circleBadge)
}, toDisplayString(changesCount.value), 3)) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("workflowDiff.changes")), 1)]),
_: 1
})]),
_: 1
}, 8, ["popper-options", "popper-class"]),
createVNode(unref(N8nIconButton_default), {
icon: "chevron-left",
type: "secondary",
class: normalizeClass(unref($style).navigationButton),
style: {
"--button--radius": "0",
"margin": "0 -1px"
},
onClick: previousNodeChange
}, null, 8, ["class"]),
createVNode(unref(N8nIconButton_default), {
icon: "chevron-right",
type: "secondary",
class: normalizeClass(unref($style).navigationButton),
style: { "--button--radius": "0 4px 4px 0" },
onClick: nextNodeChange
}, null, 8, ["class"])
], 2)], 2)]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(unref($style).workflowDiffContent) }, [createBaseVNode("div", { class: normalizeClass(unref($style).workflowDiff) }, [createBaseVNode("div", { class: normalizeClass(unref($style).workflowDiffPanel) }, [sourceWorkFlow.value.state.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createVNode(unref(N8nText_default), {
color: "text-dark",
size: "small",
class: normalizeClass(unref($style).sourceBadge)
}, {
default: withCtx(() => [sourceWorkFlow.value.state.value.remote ? (openBlock(), createBlock(unref(N8nIcon_default), {
key: 0,
icon: "git-branch"
})) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(sourceWorkFlow.value.state.value.remote ? unref(i18n$2).baseText("workflowDiff.remote", { interpolate: { branchName: unref(sourceControlStore).preferences.branchName } }) : unref(i18n$2).baseText("workflowDiff.local")), 1)]),
_: 1
}, 8, ["class"]), sourceWorkFlow.value.state.value.workflow ? (openBlock(), createBlock(SyncedWorkflowCanvas_default, {
key: 0,
id: "top",
nodes: unref(source).nodes,
connections: unref(source).connections
}, {
node: withCtx(({ nodeProps }) => [createVNode(CanvasNode_default, mergeProps(nodeProps, { class: { [getNodeStatusClass(nodeProps.id)]: true } }), {
toolbar: withCtx(() => _cache[3] || (_cache[3] = [])),
_: 2
}, 1040, ["class"])]),
edge: withCtx(({ edgeProps, arrowHeadMarkerId }) => [createVNode(HighlightedEdge_default, mergeProps(edgeProps, {
"marker-end": `url(#${arrowHeadMarkerId})`,
class: { [getEdgeStatusClass(edgeProps.id)]: true }
}), null, 16, ["marker-end", "class"])]),
_: 1
}, 8, ["nodes", "connections"])) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(unref($style).emptyWorkflow)
}, [createVNode(unref(N8nHeading_default), { size: "large" }, {
default: withCtx(() => [createTextVNode(toDisplayString(isSourceWorkflowNew.value ? unref(i18n$2).baseText("workflowDiff.newWorkflow") : unref(i18n$2).baseText("workflowDiff.deletedWorkflow")), 1)]),
_: 1
}), sourceWorkFlow.value.state.value?.remote ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(isSourceWorkflowNew.value ? unref(i18n$2).baseText("workflowDiff.newWorkflow.remote") : unref(i18n$2).baseText("workflowDiff.deletedWorkflow.remote")), 1)]),
_: 1
})) : (openBlock(), createBlock(unref(N8nText_default), {
key: 1,
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(isSourceWorkflowNew.value ? unref(i18n$2).baseText("workflowDiff.newWorkflow.database") : unref(i18n$2).baseText("workflowDiff.deletedWorkflow.database")), 1)]),
_: 1
}))], 2))], 64)) : createCommentVNode("", true)], 2), createBaseVNode("div", { class: normalizeClass(unref($style).workflowDiffPanel) }, [targetWorkFlow.value.state.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createVNode(unref(N8nText_default), {
color: "text-dark",
size: "small",
class: normalizeClass(unref($style).sourceBadge)
}, {
default: withCtx(() => [targetWorkFlow.value.state.value.remote ? (openBlock(), createBlock(unref(N8nIcon_default), {
key: 0,
icon: "git-branch"
})) : createCommentVNode("", true), createTextVNode(" " + toDisplayString(targetWorkFlow.value.state.value.remote ? unref(i18n$2).baseText("workflowDiff.remote", { interpolate: { branchName: unref(sourceControlStore).preferences.branchName } }) : unref(i18n$2).baseText("workflowDiff.local")), 1)]),
_: 1
}, 8, ["class"]), targetWorkFlow.value.state.value.workflow ? (openBlock(), createBlock(SyncedWorkflowCanvas_default, {
key: 0,
id: "bottom",
nodes: unref(target).nodes,
connections: unref(target).connections
}, {
node: withCtx(({ nodeProps }) => [createVNode(CanvasNode_default, mergeProps(nodeProps, { class: { [getNodeStatusClass(nodeProps.id)]: true } }), {
toolbar: withCtx(() => _cache[4] || (_cache[4] = [])),
_: 2
}, 1040, ["class"])]),
edge: withCtx(({ edgeProps, arrowHeadMarkerId }) => [createVNode(HighlightedEdge_default, mergeProps(edgeProps, {
"marker-end": `url(#${arrowHeadMarkerId})`,
class: { [getEdgeStatusClass(edgeProps.id)]: true }
}), null, 16, ["marker-end", "class"])]),
_: 1
}, 8, ["nodes", "connections"])) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(unref($style).emptyWorkflow)
}, [createVNode(unref(N8nHeading_default), { size: "large" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowDiff.deletedWorkflow")), 1)]),
_: 1
}), targetWorkFlow.value.state.value?.remote ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowDiff.deletedWorkflow.remote")), 1)]),
_: 1
})) : (openBlock(), createBlock(unref(N8nText_default), {
key: 1,
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowDiff.deletedWorkflow.database")), 1)]),
_: 1
}))], 2))], 64)) : createCommentVNode("", true)], 2)], 2), selectedNode.value ? (openBlock(), createBlock(WorkflowDiffAside_default, {
key: 0,
node: selectedNode.value,
onClose: _cache[2] || (_cache[2] = ($event) => selectedDetailId.value = void 0)
}, {
default: withCtx(({ outputFormat }) => [createVNode(NodeDiff_default, mergeProps(nodeDiffs.value, { "output-format": outputFormat }), null, 16, ["output-format"])]),
_: 1
}, 8, ["node"])) : createCommentVNode("", true)], 2)]),
_: 1
}, 8, [
"event-bus",
"name",
"custom-class"
]);
};
}
});
const workflowDiffModal = "_workflowDiffModal_1jgg9_124";
const sourceBadge = "_sourceBadge_1jgg9_138";
const tabs = "_tabs_1jgg9_154";
const popper = "_popper_1jgg9_165";
const changes = "_changes_1jgg9_172";
const clickableChange = "_clickableChange_1jgg9_181";
const changesNested = "_changesNested_1jgg9_185";
const clickableChangeActive = "_clickableChangeActive_1jgg9_206";
const nodeName = "_nodeName_1jgg9_210";
const separator = "_separator_1jgg9_218";
const deleted = "_deleted_1jgg9_227";
const added = "_added_1jgg9_228";
const modified = "_modified_1jgg9_229";
const equal = "_equal_1jgg9_299";
const circleBadge = "_circleBadge_1jgg9_351";
const dropdownContent = "_dropdownContent_1jgg9_365";
const noNumberDiff = "_noNumberDiff_1jgg9_377";
const workflowDiffContent = "_workflowDiffContent_1jgg9_386";
const workflowDiff = "_workflowDiff_1jgg9_124";
const workflowDiffPanel = "_workflowDiffPanel_1jgg9_398";
const emptyWorkflow = "_emptyWorkflow_1jgg9_405";
const header$6 = "_header_1jgg9_413";
const navigationButton = "_navigationButton_1jgg9_418";
const backButton = "_backButton_1jgg9_422";
const headerLeft = "_headerLeft_1jgg9_426";
const headerRight = "_headerRight_1jgg9_427";
const emptyState = "_emptyState_1jgg9_432";
var WorkflowDiffModal_vue_vue_type_style_index_0_lang_module_default = {
workflowDiffModal,
sourceBadge,
tabs,
popper,
changes,
clickableChange,
changesNested,
clickableChangeActive,
nodeName,
separator,
deleted,
added,
modified,
equal,
"edge-deleted": "_edge-deleted_1jgg9_337",
"edge-added": "_edge-added_1jgg9_342",
"edge-equal": "_edge-equal_1jgg9_347",
circleBadge,
dropdownContent,
noNumberDiff,
workflowDiffContent,
workflowDiff,
workflowDiffPanel,
emptyWorkflow,
header: header$6,
navigationButton,
backButton,
headerLeft,
headerRight,
emptyState
};
var WorkflowDiffModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowDiffModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowDiffModal_vue_vue_type_style_index_0_lang_module_default }]]);
var PromptMfaCodeModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "PromptMfaCodeModal",
setup(__props) {
const i18n$2 = useI18n();
const formBus = createFormEventBus();
const readyToSubmit = ref(false);
const formFields = [{
name: "mfaCodeOrMfaRecoveryCode",
initialValue: "",
properties: {
label: i18n$2.baseText("mfa.code.recovery.input.label"),
placeholder: i18n$2.baseText("mfa.code.recovery.input.placeholder"),
focusInitially: true,
capitalize: true,
required: true
}
}];
function onSubmit(values$2) {
if (!("mfaCodeOrMfaRecoveryCode" in values$2 && typeof values$2.mfaCodeOrMfaRecoveryCode === "string")) return;
if (validate_default(values$2.mfaCodeOrMfaRecoveryCode)) {
promptMfaCodeBus.emit("close", { mfaRecoveryCode: values$2.mfaCodeOrMfaRecoveryCode });
return;
}
promptMfaCodeBus.emit("close", { mfaCode: values$2.mfaCodeOrMfaRecoveryCode });
}
function onClickSave() {
formBus.emit("submit");
}
function onFormReady(isReady) {
readyToSubmit.value = isReady;
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
height: "300px",
"max-height": "640px",
title: unref(i18n$2).baseText("mfa.prompt.code.modal.title"),
"event-bus": unref(promptMfaCodeBus),
name: unref(PROMPT_MFA_CODE_MODAL_KEY),
center: true
}, {
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass([_ctx.$style.formContainer]) }, [createVNode(unref(N8nFormInputs_default), {
"data-test-id": "mfa-code-or-recovery-code-input",
inputs: formFields,
"event-bus": unref(formBus),
onSubmit,
onReady: onFormReady
}, null, 8, ["event-bus"])], 2)]),
footer: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nButton_default), {
float: "right",
disabled: !readyToSubmit.value,
label: unref(i18n$2).baseText("settings.personal.save"),
size: "large",
"data-test-id": "mfa-save-button",
onClick: onClickSave
}, null, 8, ["disabled", "label"])])]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var PromptMfaCodeModal_vue_vue_type_style_index_0_lang_module_default = { formContainer: "_formContainer_51pd6_123" };
var PromptMfaCodeModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(PromptMfaCodeModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": PromptMfaCodeModal_vue_vue_type_style_index_0_lang_module_default }]]);
var DynamicModalLoader_default = /* @__PURE__ */ defineComponent({
__name: "DynamicModalLoader",
setup(__props) {
const registeredModals = shallowRef([]);
const isAsyncComponentFactory = (component) => {
return typeof component === "function";
};
const updateModals = () => {
const modals$1 = [];
getAll().forEach((modalDef, key) => {
const component = isAsyncComponentFactory(modalDef.component) ? defineAsyncComponent(modalDef.component) : modalDef.component;
modals$1.push({
key,
component
});
});
registeredModals.value = modals$1;
};
let unsubscribe;
onMounted(() => {
updateModals();
unsubscribe = subscribe(() => {
updateModals();
});
});
onUnmounted(() => {
unsubscribe?.();
});
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(registeredModals.value, (modal$2) => {
return openBlock(), createBlock(ModalRoot_default, {
key: modal$2.key,
name: modal$2.key
}, {
default: withCtx(({ modalName, active, open, activeId, mode: mode$2, data }) => [(openBlock(), createBlock(resolveDynamicComponent(modal$2.component), {
"modal-name": modalName,
active,
open,
"active-id": activeId,
mode: mode$2,
data
}, null, 8, [
"modal-name",
"active",
"open",
"active-id",
"mode",
"data"
]))]),
_: 2
}, 1032, ["name"]);
}), 128))]);
};
}
});
var TemplateCard_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({
__name: "TemplateCard",
props: {
template: {},
currentNodeName: {}
},
setup(__props) {
const props = __props;
const nodeTypesStore = useNodeTypesStore();
const { getTemplateRoute, trackTemplateTileClick } = usePersonalizedTemplatesV2Store();
const router = useRouter();
const uiStore = useUIStore();
const locale = useI18n();
const templateNodes = computed(() => {
if (!props.template?.nodes) return [];
const uniqueNodeTypes = new Set(props.template.nodes.map((node) => node.name));
const nodeTypesArray = Array.from(uniqueNodeTypes);
if (props.currentNodeName && uniqueNodeTypes.has(props.currentNodeName)) {
const otherNodes = nodeTypesArray.filter((nodeType) => nodeType !== props.currentNodeName);
const nodesToShow = [props.currentNodeName];
if (otherNodes.length > 0) nodesToShow.push(otherNodes[0]);
return nodesToShow.map((nodeType) => nodeTypesStore.getNodeType(nodeType)).filter(Boolean);
}
return nodeTypesArray.slice(0, 2).map((nodeType) => nodeTypesStore.getNodeType(nodeType)).filter(Boolean);
});
const handleUseTemplate = async () => {
trackTemplateTileClick(props.template.id);
await router.push(getTemplateRoute(props.template.id));
uiStore.closeModal(EXPERIMENT_TEMPLATE_RECO_V2_KEY);
};
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(N8nCard_default), { class: normalizeClass(_ctx.$style.suggestion) }, {
default: withCtx(() => [createBaseVNode("div", null, [templateNodes.value.length > 0 ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass([_ctx.$style.nodes, "mb-s"])
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(templateNodes.value, (nodeType) => {
return openBlock(), createElementBlock("div", {
key: nodeType.name,
class: normalizeClass(_ctx.$style.nodeIcon)
}, [createVNode(NodeIcon_default, {
size: 18,
"stroke-width": 1.5,
"node-type": nodeType
}, null, 8, ["node-type"])], 2);
}), 128))], 2)) : createCommentVNode("", true), createVNode(unref(N8nText_default), {
size: "medium",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.template.name), 1)]),
_: 1
})]), createBaseVNode("div", { class: normalizeClass([_ctx.$style.actions, "mt-m"]) }, [createVNode(unref(N8nButton_default), {
label: unref(locale).baseText("workflows.templateRecoV2.useTemplate"),
type: "secondary",
size: "mini",
onClick: handleUseTemplate
}, null, 8, ["label"])], 2)]),
_: 1
}, 8, ["class"]);
};
}
});
var TemplateCard_vue_vue_type_style_index_0_lang_module_default$1 = {
nodes: "_nodes_176ta_123",
nodeIcon: "_nodeIcon_176ta_128",
suggestion: "_suggestion_176ta_139",
actions: "_actions_176ta_146",
user: "_user_176ta_152",
avatar: "_avatar_176ta_158"
};
var TemplateCard_default$2 = /* @__PURE__ */ __plugin_vue_export_helper_default(TemplateCard_vue_vue_type_script_setup_true_lang_default$1, [["__cssModules", { "$style": TemplateCard_vue_vue_type_style_index_0_lang_module_default$1 }]]);
var _hoisted_1$5 = ["src"];
var YoutubeCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "YoutubeCard",
props: {
videoId: {},
title: {},
description: {}
},
setup(__props) {
const props = __props;
const { trackVideoClick } = usePersonalizedTemplatesV2Store();
const openYouTubeVideo = () => {
trackVideoClick(props.title);
window.open(`https://www.youtube.com/watch?v=${props.videoId}`, "_blank");
};
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(N8nCard_default), {
hoverable: "",
onClick: openYouTubeVideo
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.tutorial) }, [createBaseVNode("img", {
src: `https://img.youtube.com/vi/${props.videoId}/hq720.jpg`,
width: "250px",
class: normalizeClass(_ctx.$style.video)
}, null, 10, _hoisted_1$5), createBaseVNode("div", null, [createVNode(unref(N8nText_default), {
tag: "h2",
size: "large",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(props.title), 1)]),
_: 1
}), createVNode(unref(N8nText_default), {
tag: "h3",
size: "small",
class: "mt-2xs"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(props.description), 1)]),
_: 1
})])], 2)]),
_: 1
});
};
}
});
var YoutubeCard_vue_vue_type_style_index_0_lang_module_default = {
tutorial: "_tutorial_10cyk_123",
video: "_video_10cyk_129"
};
var YoutubeCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(YoutubeCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": YoutubeCard_vue_vue_type_style_index_0_lang_module_default }]]);
var NodeRecommendationModal_vue_vue_type_script_setup_true_lang_default$2 = /* @__PURE__ */ defineComponent({
__name: "NodeRecommendationModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const uiStore = useUIStore();
const { nodes: userSelectedNodes, getNodeData, getTemplateData, trackModalTabView, trackSeeMoreClick } = usePersonalizedTemplatesV2Store();
const nodeTypesStore = useNodeTypesStore();
const locale = useI18n();
const closeModal = () => {
uiStore.closeModal(EXPERIMENT_TEMPLATE_RECO_V2_KEY);
};
const selectedNode = ref(props.data.nodeName ?? userSelectedNodes[0] ?? "");
const starterTemplates = ref([]);
const popularTemplates = ref([]);
const isLoadingTemplates = ref(false);
const nodes$3 = computed(() => userSelectedNodes.map((nodeName$2) => {
return {
value: nodeName$2,
label: nodeTypesStore.getNodeType(nodeName$2)?.displayName ?? ""
};
}));
const nodeTypes = computed(() => new Map(userSelectedNodes.map((nodeName$2) => [nodeName$2, nodeTypesStore.getNodeType(nodeName$2)])));
const currentNodeData = computed(() => {
return getNodeData(selectedNode.value);
});
const youtubeVideos = computed(() => {
return currentNodeData.value.youtube || [];
});
const starterLink = computed(() => {
const name$2 = nodeTypes.value.get(selectedNode.value)?.displayName ?? "";
const encodedName = encodeURIComponent(name$2);
return `${TEMPLATES_URLS.BASE_WEBSITE_URL}?integrations=${encodedName}&q=Simple`;
});
const popularLink = computed(() => {
const name$2 = nodeTypes.value.get(selectedNode.value)?.displayName ?? "";
const encodedName = encodeURIComponent(name$2);
return `${TEMPLATES_URLS.BASE_WEBSITE_URL}?integrations=${encodedName}`;
});
function onSelectedNodeChange(val) {
selectedNode.value = val;
}
watchEffect(async () => {
if (!selectedNode.value) return;
const nodeDisplayName = nodes$3.value.find((n) => n.value === selectedNode.value)?.label;
if (nodeDisplayName) trackModalTabView(nodeDisplayName);
isLoadingTemplates.value = true;
try {
const nodeData = getNodeData(selectedNode.value);
const starterPromises = nodeData.starter?.map(async (id) => await getTemplateData(id)) || [];
const popularPromises = nodeData.popular?.map(async (id) => await getTemplateData(id)) || [];
const [starterResults, popularResults] = await Promise.all([Promise.allSettled(starterPromises), Promise.allSettled(popularPromises)]);
starterTemplates.value = starterResults.filter((result) => result.status === "fulfilled" && result.value !== null).map((result) => result.value);
popularTemplates.value = popularResults.filter((result) => result.status === "fulfilled" && result.value !== null).map((result) => result.value);
} catch (error$2) {
console.error("Error loading templates:", error$2);
} finally {
isLoadingTemplates.value = false;
}
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(EXPERIMENT_TEMPLATE_RECO_V2_KEY),
"min-width": "min(800px, 90vw)",
"max-height": "90vh",
onClose: closeModal,
onCanceled: closeModal
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createVNode(unref(N8nRadioButtons_default), {
modelValue: selectedNode.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => selectedNode.value = $event), onSelectedNodeChange],
options: nodes$3.value,
size: "medium"
}, {
option: withCtx((option) => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.tab) }, [createVNode(NodeIcon_default, {
size: 18,
class: normalizeClass(_ctx.$style.nodeIcon),
"stroke-width": 1.5,
"node-type": nodeTypes.value.get(option.value)
}, null, 8, ["class", "node-type"])], 2)]),
_: 1
}, 8, ["modelValue", "options"])], 2)]),
content: withCtx(() => [
createBaseVNode("div", { class: normalizeClass([_ctx.$style.title, "mb-m"]) }, [createVNode(unref(N8nText_default), {
tag: "h2",
size: "large",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.starterTemplates")), 1)]),
_: 1
}), createVNode(unref(N8nLink_default), {
href: starterLink.value,
onClick: _cache[1] || (_cache[1] = ($event) => unref(trackSeeMoreClick)("starter"))
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.seeMoreStarterTemplates")), 1)]),
_: 1
}, 8, ["href"])], 2),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.suggestions) }, [isLoadingTemplates.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.loading)
}, [createVNode(unref(N8nSpinner_default), { size: "small" }), createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.loadingTemplates")), 1)]),
_: 1
})], 2)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(starterTemplates.value, (template) => {
return openBlock(), createBlock(TemplateCard_default$2, {
key: template.id,
template,
"current-node-name": selectedNode.value
}, null, 8, ["template", "current-node-name"]);
}), 128))], 2),
createBaseVNode("div", { class: normalizeClass([_ctx.$style.title, "mb-m mt-m"]) }, [createVNode(unref(N8nText_default), {
tag: "h2",
size: "large",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.popularTemplates")), 1)]),
_: 1
}), createVNode(unref(N8nLink_default), {
href: popularLink.value,
onClick: _cache[2] || (_cache[2] = ($event) => unref(trackSeeMoreClick)("popular"))
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.seeMorePopularTemplates")), 1)]),
_: 1
}, 8, ["href"])], 2),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.suggestions) }, [isLoadingTemplates.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.loading)
}, [createVNode(unref(N8nSpinner_default), { size: "small" }), createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.loadingTemplates")), 1)]),
_: 1
})], 2)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(popularTemplates.value, (template) => {
return openBlock(), createBlock(TemplateCard_default$2, {
key: template.id,
template,
"current-node-name": selectedNode.value
}, null, 8, ["template", "current-node-name"]);
}), 128))], 2),
createVNode(unref(N8nText_default), {
tag: "h2",
size: "large",
bold: true,
class: "mb-m mt-m"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templateRecoV2.tutorials")), 1)]),
_: 1
}),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.videos) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(youtubeVideos.value, (video$1) => {
return openBlock(), createBlock(YoutubeCard_default, {
key: video$1.id,
"video-id": video$1.id,
title: video$1.title,
description: video$1.description
}, null, 8, [
"video-id",
"title",
"description"
]);
}), 128))], 2)
]),
_: 1
}, 8, ["name"]);
};
}
});
var NodeRecommendationModal_vue_vue_type_style_index_0_lang_module_default$2 = {
header: "_header_1v7vh_123",
tab: "_tab_1v7vh_128",
suggestions: "_suggestions_1v7vh_132",
title: "_title_1v7vh_140",
videos: "_videos_1v7vh_147",
loading: "_loading_1v7vh_154"
};
var NodeRecommendationModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeRecommendationModal_vue_vue_type_script_setup_true_lang_default$2, [["__cssModules", { "$style": NodeRecommendationModal_vue_vue_type_style_index_0_lang_module_default$2 }]]);
var TemplateCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "TemplateCard",
props: { template: {} },
setup(__props) {
const props = __props;
const nodeTypesStore = useNodeTypesStore();
const { getTemplateRoute, trackTemplateClickFromModal } = usePersonalizedTemplatesV3Store();
const router = useRouter();
const uiStore = useUIStore();
const templateNodes = computed(() => {
if (!props.template?.nodes) return [];
const uniqueNodeTypes = new Set(props.template.nodes.map((node) => node.name));
const nodeTypesArray = Array.from(uniqueNodeTypes);
const nodesToShow = [];
const hubspotNode = nodeTypesStore.getNodeType("n8n-nodes-base.hubspot");
if (hubspotNode && uniqueNodeTypes.has("n8n-nodes-base.hubspot")) nodesToShow.push(hubspotNode);
const otherNodes = nodeTypesArray.filter((nodeType) => nodeType !== "n8n-nodes-base.hubspot");
if (otherNodes.length > 0) {
const otherNodeType = nodeTypesStore.getNodeType(otherNodes[0]);
if (otherNodeType) nodesToShow.push(otherNodeType);
}
return nodesToShow;
});
const cleanTitle = computed(() => {
if (!props.template?.name) return "";
return props.template.name.replace(/[\u{1F600}-\u{1F64F}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F1E0}-\u{1F1FF}]|[\u{1F900}-\u{1F9FF}]|[\u{1FA00}-\u{1FA6F}]|[\u{1FA70}-\u{1FAFF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]/gu, "").replace(/\s+/g, " ").trim();
});
const cleanDescription = computed(() => {
if (!props.template?.description) return "";
return props.template.description.replace(/\*\*(.*?)\*\*/g, "<script setup lang=\"ts\">").replace(/\*(.*?)\*/g, "<script setup lang=\"ts\">").replace(/`(.*?)`/g, "<script setup lang=\"ts\">").replace(/!\[(.*?)\]\(.*?\)/g, "").replace(/\[(.*?)\]\(.*?\)/g, "<script setup lang=\"ts\">").replace(/#{1,6}\s/g, "").replace(/^\s*[-*+]\s/gm, "").replace(/^\s*\d+\.\s/gm, "").replace(/[\u{1F600}-\u{1F64F}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F1E0}-\u{1F1FF}]|[\u{1F900}-\u{1F9FF}]|[\u{1FA00}-\u{1FA6F}]|[\u{1FA70}-\u{1FAFF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]/gu, "").replace(/[\r\n\t\f\v]/g, " ").replace(/[\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/g, " ").replace(/[\u200B-\u200D\uFEFF\uFE0F]/g, "").replace(/\s+/g, " ").trim();
});
const handleUseTemplate = async () => {
trackTemplateClickFromModal(props.template.id);
await router.push(getTemplateRoute(props.template.id));
uiStore.closeModal(EXPERIMENT_TEMPLATE_RECO_V3_KEY);
};
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(N8nCard_default), {
class: normalizeClass(_ctx.$style.suggestion),
onClick: handleUseTemplate
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [createVNode(unref(N8nText_default), {
size: "medium",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(cleanTitle.value), 1)]),
_: 1
}), cleanDescription.value ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
size: "small",
class: normalizeClass([_ctx.$style.description, "mt-2xs"])
}, {
default: withCtx(() => [createTextVNode(toDisplayString(cleanDescription.value), 1)]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true)], 2), templateNodes.value.length > 0 ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass([_ctx.$style.nodes, "mt-m"])
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(templateNodes.value, (nodeType) => {
return openBlock(), createElementBlock("div", {
key: nodeType.name,
class: normalizeClass(_ctx.$style.nodeIcon)
}, [createVNode(NodeIcon_default, {
size: 18,
"stroke-width": 1.5,
"node-type": nodeType
}, null, 8, ["node-type"])], 2);
}), 128))], 2)) : createCommentVNode("", true)]),
_: 1
}, 8, ["class"]);
};
}
});
var TemplateCard_vue_vue_type_style_index_0_lang_module_default = {
nodes: "_nodes_y9wwt_123",
nodeIcon: "_nodeIcon_y9wwt_128",
remainingNodes: "_remainingNodes_y9wwt_137",
description: "_description_y9wwt_142",
suggestion: "_suggestion_y9wwt_152",
content: "_content_y9wwt_167"
};
var TemplateCard_default$1 = /* @__PURE__ */ __plugin_vue_export_helper_default(TemplateCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": TemplateCard_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$4 = { key: 1 };
var NodeRecommendationModal_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({
__name: "NodeRecommendationModal",
setup(__props) {
const uiStore = useUIStore();
const templatesStore = useTemplatesStore();
const { getHubSpotData, getTemplateData, trackPersonalizationModalView, trackTemplatesRepoClickFromModal } = usePersonalizedTemplatesV3Store();
const locale = useI18n();
const closeModal = () => {
uiStore.closeModal(EXPERIMENT_TEMPLATE_RECO_V3_KEY);
};
const openTemplateRepository = () => {
trackTemplatesRepoClickFromModal();
window.open(templatesStore.websiteTemplateRepositoryURL, "_blank");
};
const templates$1 = ref([]);
const isLoadingTemplates = ref(false);
watchEffect(async () => {
trackPersonalizationModalView();
isLoadingTemplates.value = true;
try {
const templatePromises = getHubSpotData().templates?.map(async (id) => await getTemplateData(id)) || [];
templates$1.value = (await Promise.allSettled(templatePromises)).filter((result) => result.status === "fulfilled" && result.value !== null).map((result) => result.value);
} catch (error$2) {
console.error("Error loading templates:", error$2);
} finally {
isLoadingTemplates.value = false;
}
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(EXPERIMENT_TEMPLATE_RECO_V3_KEY),
"min-width": "min(800px, 90vw)",
"max-height": "90vh",
class: normalizeClass(_ctx.$style.modal),
onClose: closeModal,
onCanceled: closeModal
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createVNode(unref(N8nText_default), {
tag: "h1",
size: "large",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("experiments.personalizedTemplatesV3.recommendedForYou")), 1)]),
_: 1
})], 2)]),
content: withCtx(() => [isLoadingTemplates.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.loading)
}, [createVNode(unref(N8nSpinner_default), { size: "small" }), createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("experiments.personalizedTemplatesV3.loadingTemplates")), 1)]),
_: 1
})], 2)) : (openBlock(), createElementBlock("div", _hoisted_1$4, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.templates) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(templates$1.value, (template) => {
return openBlock(), createBlock(TemplateCard_default$1, {
key: template.id,
template
}, null, 8, ["template"]);
}), 128))], 2), createVNode(unref(N8nCard_default), {
class: normalizeClass([_ctx.$style.footerCard]),
onClick: openTemplateRepository
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footerContent) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footerText) }, [createVNode(unref(N8nText_default), {
size: "medium",
bold: true,
class: "mr-s",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("experiments.personalizedTemplatesV3.couldntFind")), 1)]),
_: 1
}), createVNode(unref(N8nText_default), {
size: "small",
class: normalizeClass("mt-2xs")
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("experiments.personalizedTemplatesV3.browseAllTemplates")), 1)]),
_: 1
})], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.footerIcon) }, [createVNode(unref(N8nIcon_default), {
icon: "external-link",
size: "medium"
})], 2)], 2)]),
_: 1
}, 8, ["class"])]))]),
_: 1
}, 8, ["name", "class"]);
};
}
});
var NodeRecommendationModal_vue_vue_type_style_index_0_lang_module_default$1 = {
modal: "_modal_2tsoq_123",
header: "_header_2tsoq_127",
templates: "_templates_2tsoq_132",
loading: "_loading_2tsoq_139",
footerCard: "_footerCard_2tsoq_148",
footerContent: "_footerContent_2tsoq_159",
footerText: "_footerText_2tsoq_165",
footerIcon: "_footerIcon_2tsoq_170"
};
var NodeRecommendationModal_default$1 = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeRecommendationModal_vue_vue_type_script_setup_true_lang_default$1, [["__cssModules", { "$style": NodeRecommendationModal_vue_vue_type_style_index_0_lang_module_default$1 }]]);
var NodeRecommendationModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "NodeRecommendationModal",
setup(__props) {
const uiStore = useUIStore();
const locale = useI18n();
const templatesStore = useTemplatesDataQualityStore();
const { websiteTemplateRepositoryURL } = storeToRefs(useTemplatesStore());
const closeModal = () => {
uiStore.closeModal(EXPERIMENT_TEMPLATES_DATA_QUALITY_KEY);
};
const templates$1 = ref([]);
const isLoadingTemplates = ref(false);
onMounted(async () => {
isLoadingTemplates.value = true;
try {
templates$1.value = await templatesStore.loadExperimentTemplates();
} finally {
isLoadingTemplates.value = false;
}
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(EXPERIMENT_TEMPLATES_DATA_QUALITY_KEY),
"min-width": "min(800px, 90vw)",
"max-height": "90vh",
onClose: closeModal,
onCanceled: closeModal
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createVNode(unref(N8nText_default), {
tag: "h2",
size: "large",
bold: true
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("experiments.templatesDataQuality.modalTitle")), 1)]),
_: 1
})], 2)]),
content: withCtx(() => [isLoadingTemplates.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.loading)
}, [createVNode(unref(N8nSpinner_default), { size: "small" }), createVNode(unref(N8nText_default), { size: "small" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templatesDataQuality.loadingTemplates")), 1)]),
_: 1
})], 2)) : (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.suggestions)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(templates$1.value, (template, index) => {
return openBlock(), createBlock(TemplateCard_default, {
key: template.id,
template,
"tile-number": index + 1
}, null, 8, ["template", "tile-number"]);
}), 128))], 2)), createBaseVNode("div", { class: normalizeClass(_ctx.$style.seeMore) }, [createVNode(unref(N8nLink_default), { href: unref(websiteTemplateRepositoryURL) }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("workflows.templatesDataQuality.seeMoreTemplates")), 1)]),
_: 1
}, 8, ["href"])], 2)]),
_: 1
}, 8, ["name"]);
};
}
});
var NodeRecommendationModal_vue_vue_type_style_index_0_lang_module_default = {
header: "_header_64lx3_123",
suggestions: "_suggestions_64lx3_128",
loading: "_loading_64lx3_135",
seeMore: "_seeMore_64lx3_144"
};
var NodeRecommendationModal_default$2 = /* @__PURE__ */ __plugin_vue_export_helper_default(NodeRecommendationModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": NodeRecommendationModal_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$3 = { key: 2 };
var VALUE_MAX_LENGTH = 1e3;
var VariableModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "VariableModal",
props: {
mode: { default: "new" },
variable: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const { showError } = useToast();
const uiStore = useUIStore();
const environmentsStore = useEnvironmentsStore();
const projectsStore = useProjectsStore();
const modalBus = createEventBus();
const loading$3 = ref(false);
const validateOnBlur = ref(false);
const keyInputRef = ref(null);
const keyValidationRules = [
{ name: "REQUIRED" },
{
name: "MAX_LENGTH",
config: { maximum: 50 }
},
{
name: "MATCH_REGEX",
config: {
regex: /^[A-Za-z0-9_]+$/,
message: i18n$2.baseText("variables.editing.key.error.regex")
}
}
];
const valueValidationRules = [{
name: "MAX_LENGTH",
config: { maximum: VALUE_MAX_LENGTH }
}];
const form$4 = reactive({
key: props.variable?.key || "",
value: props.variable?.value || "",
projectId: props.variable ? props.variable.project?.id : projectsStore.currentProjectId
});
const formValidation = reactive({
key: false,
value: false
});
const keyExistsInSameScope = computed(() => {
if (!form$4.key) return false;
return !!environmentsStore.variables.find((v) => {
if (props.mode === "edit" && v.id === props.variable?.id) return false;
if (v.key !== form$4.key) return false;
if (!v.project && !form$4.projectId) return true;
return v.project && v.project?.id === form$4.projectId;
});
});
const globalVariableExistsWarning = computed(() => {
if (!form$4.key || keyExistsInSameScope.value) return false;
if (!form$4.projectId) return false;
return !!environmentsStore.variables.find((v) => v.key === form$4.key && !v.project);
});
const isValid = computed(() => Object.values(formValidation).every((value) => value) && !keyExistsInSameScope.value);
const modalTitle = computed(() => props.mode === "new" ? i18n$2.baseText("variables.modal.title.create") : i18n$2.baseText("variables.modal.title.edit"));
const projectOptions = computed(() => {
const options = [{
value: "",
label: i18n$2.baseText("variables.modal.scope.global"),
icon: {
type: "icon",
value: "database"
}
}];
if (projectsStore.availableProjects) options.push(...projectsStore.availableProjects.filter((project) => project.type !== "personal").map((project) => {
const icon$3 = project.icon || {
type: "icon",
value: "layer-group"
};
return {
value: project.id,
label: project.name ?? project.id,
icon: icon$3
};
}));
return options;
});
const selectedProjectIcon = computed(() => {
return projectOptions.value.find((option) => option.value === form$4.projectId)?.icon ?? {
type: "icon",
value: "database"
};
});
const showScopeField = computed(() => {
return props.mode === "new" && !projectsStore.currentProjectId;
});
function closeModal() {
uiStore.closeModal(VARIABLE_MODAL_KEY);
}
async function handleSubmit() {
validateOnBlur.value = true;
if (!isValid.value) return;
try {
loading$3.value = true;
const variablePayload = {
key: form$4.key,
value: form$4.value
};
if (typeof form$4.projectId !== "undefined") variablePayload.projectId = form$4.projectId;
if (props.mode === "new") await environmentsStore.createVariable(variablePayload);
else if (props.variable) await environmentsStore.updateVariable({
id: props.variable.id,
...variablePayload
});
closeModal();
} catch (error$2) {
showError(error$2, i18n$2.baseText("variables.errors.save"));
} finally {
loading$3.value = false;
}
}
onMounted(async () => {
await nextTick();
const input$1 = keyInputRef.value?.inputRef;
if (input$1) requestAnimationFrame(() => {
input$1.focus();
});
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
title: modalTitle.value,
"event-bus": unref(modalBus),
name: unref(VARIABLE_MODAL_KEY),
width: "600px",
"lock-scroll": false,
"close-on-esc": true,
"close-on-click-modal": false,
"show-close": true
}, {
content: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.form),
onKeyup: withKeys(handleSubmit, ["enter"])
}, [
createVNode(unref(N8nFormInput_default), {
ref_key: "keyInputRef",
ref: keyInputRef,
modelValue: form$4.key,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => form$4.key = $event),
label: unref(i18n$2).baseText("variables.modal.key.label"),
name: "key",
"focus-initially": "",
"data-test-id": "variable-modal-key-input",
placeholder: unref(i18n$2).baseText("variables.editing.key.placeholder"),
required: "",
"validate-on-blur": validateOnBlur.value,
"validation-rules": keyValidationRules,
onValidate: _cache[1] || (_cache[1] = (value) => formValidation.key = value)
}, null, 8, [
"modelValue",
"label",
"placeholder",
"validate-on-blur"
]),
keyExistsInSameScope.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "danger",
"data-test-id": "variable-modal-key-exists-error"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("variables.modal.error.keyExistsInProject")), 1)]),
_: 1
})) : globalVariableExistsWarning.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 1,
theme: "warning",
"data-test-id": "variable-modal-global-exists-warning"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("variables.modal.warning.globalKeyExists")), 1)]),
_: 1
})) : createCommentVNode("", true),
createVNode(unref(N8nFormInput_default), {
modelValue: form$4.value,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => form$4.value = $event),
name: "value",
label: unref(i18n$2).baseText("variables.modal.value.label"),
"data-test-id": "variable-modal-value-input",
placeholder: unref(i18n$2).baseText("variables.editing.value.placeholder"),
type: "textarea",
autosize: {
minRows: 3,
maxRows: 6
},
maxlength: VALUE_MAX_LENGTH,
"validate-on-blur": validateOnBlur.value,
"validation-rules": valueValidationRules,
onValidate: _cache[3] || (_cache[3] = (value) => formValidation.value = value)
}, null, 8, [
"modelValue",
"label",
"placeholder",
"validate-on-blur"
]),
showScopeField.value ? (openBlock(), createElementBlock("div", _hoisted_1$3, [createVNode(unref(N8nInputLabel_default), {
label: unref(i18n$2).baseText("variables.modal.scope.label"),
color: "text-dark"
}, {
default: withCtx(() => [createVNode(unref(N8nSelect_default), {
modelValue: form$4.projectId,
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => form$4.projectId = $event),
size: "large",
filterable: "",
"data-test-id": "variable-modal-scope-select"
}, {
prefix: withCtx(() => [selectedProjectIcon.value?.type === "emoji" ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
class: normalizeClass(_ctx.$style.menuItemEmoji)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(selectedProjectIcon.value.value), 1)]),
_: 1
}, 8, ["class"])) : selectedProjectIcon.value?.value ? (openBlock(), createBlock(unref(N8nIcon_default), {
key: 1,
icon: selectedProjectIcon.value.value
}, null, 8, ["icon"])) : createCommentVNode("", true)]),
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(projectOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.value || "global",
value: option.value,
label: option.label,
class: normalizeClass({ [_ctx.$style.globalOption]: option.value === "" })
}, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.optionContent) }, [option.icon?.type === "emoji" ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
class: normalizeClass(_ctx.$style.menuItemEmoji)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(option.icon.value), 1)]),
_: 2
}, 1032, ["class"])) : option.icon?.value ? (openBlock(), createBlock(unref(N8nIcon_default), {
key: 1,
icon: option.icon.value
}, null, 8, ["icon"])) : createCommentVNode("", true), createBaseVNode("span", null, toDisplayString(option.label), 1)], 2)]),
_: 2
}, 1032, [
"value",
"label",
"class"
]);
}), 128))]),
_: 1
}, 8, ["modelValue"])]),
_: 1
}, 8, ["label"])])) : createCommentVNode("", true)
], 34)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
type: "tertiary",
label: unref(i18n$2).baseText("variables.modal.button.cancel"),
"data-test-id": "variable-modal-cancel-button",
onClick: closeModal
}, null, 8, ["label"]), createVNode(unref(N8nButton_default), {
loading: loading$3.value,
disabled: !isValid.value,
label: unref(i18n$2).baseText("variables.modal.button.save"),
"data-test-id": "variable-modal-save-button",
onClick: handleSubmit
}, null, 8, [
"loading",
"disabled",
"label"
])], 2)]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var VariableModal_vue_vue_type_style_index_0_lang_module_default = {
form: "_form_lr4rc_123",
footer: "_footer_lr4rc_129",
optionContent: "_optionContent_lr4rc_137",
iconEmoji: "_iconEmoji_lr4rc_143",
globalOption: "_globalOption_lr4rc_148"
};
var VariableModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(VariableModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": VariableModal_vue_vue_type_style_index_0_lang_module_default }]]);
var StopManyExecutionsModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "StopManyExecutionsModal",
props: { modalName: {} },
setup(__props) {
const props = __props;
const isLoading = ref(false);
const executionsStore = useExecutionsStore();
const i18n$2 = useI18n();
const telemetry$1 = useTelemetry();
const checkRunning = ref(true);
const checkQueued = ref(true);
const checkWaiting = ref(true);
const activeFilterHint = computed(() => {
const { startedBefore, startedAfter } = executionsStore.executionsFilters;
if (startedBefore && startedAfter) return i18n$2.baseText("executionStopManyModal.dateHint.startEnd", { interpolate: {
startedBefore,
startedAfter
} });
else if (startedAfter) return i18n$2.baseText("executionStopManyModal.dateHint.startOnly", { interpolate: { startedAfter } });
else if (startedBefore) return i18n$2.baseText("executionStopManyModal.dateHint.endOnly", { interpolate: { startedBefore } });
return "";
});
const allWorkflowsHint = computed(() => {
if (executionsStore.filters.workflowId === "all") return i18n$2.baseText("executionStopManyModal.allWorkflowsHint");
return "";
});
const toast = useToast();
const modalBus = createEventBus();
const onSubmit = async () => {
try {
const status = [
checkWaiting.value ? ["waiting"] : [],
checkRunning.value ? ["running"] : [],
checkQueued.value ? ["new"] : []
].flat();
telemetry$1.track("User confirmed stop many executions", {
waitingExecutions: checkWaiting.value,
runningExecutions: checkRunning.value,
queuedExecutions: checkQueued.value
});
const { startedBefore, startedAfter } = executionsStore.executionsFilters;
isLoading.value = true;
const { stopped: count } = await executionsStore.stopManyExecutions({
status,
startedBefore,
startedAfter
});
isLoading.value = false;
toast.showMessage({
title: i18n$2.baseText("executionStopManyModal.success", { interpolate: { count } }),
type: count > 0 ? "success" : "info"
});
} catch (e) {
toast.showError(e, i18n$2.baseText("executionStopManyModal.error.failure"));
} finally {
modalBus.emit("close");
}
};
function closeModal() {
modalBus.emit("close");
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "540px",
title: unref(i18n$2).baseText("executionStopManyModal.title"),
"event-bus": unref(modalBus),
name: props.modalName,
center: true
}, {
content: withCtx(() => [
activeFilterHint.value ? (openBlock(), createBlock(unref(ElRow), {
key: 0,
class: normalizeClass(_ctx.$style.vertPadding)
}, {
default: withCtx(() => [createVNode(unref(N8nCallout_default), { theme: "info" }, {
default: withCtx(() => [createTextVNode(toDisplayString(activeFilterHint.value), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true),
allWorkflowsHint.value ? (openBlock(), createBlock(unref(ElRow), {
key: 1,
class: normalizeClass(_ctx.$style.vertPadding)
}, {
default: withCtx(() => [createVNode(unref(N8nCallout_default), { theme: "warning" }, {
default: withCtx(() => [createTextVNode(toDisplayString(allWorkflowsHint.value), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true),
createVNode(unref(ElRow), { class: normalizeClass(_ctx.$style.vertPadding) }, {
default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-base" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("executionStopManyModal.description")), 1)]),
_: 1
})]),
_: 1
}, 8, ["class"]),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(N8nFormInput_default), {
modelValue: checkQueued.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => checkQueued.value = $event),
type: "checkbox",
label: unref(i18n$2).baseText("executionStopManyModal.queued"),
"data-test-id": "sme-check-queued"
}, null, 8, ["modelValue", "label"])]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(N8nFormInput_default), {
modelValue: checkRunning.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => checkRunning.value = $event),
type: "checkbox",
label: unref(i18n$2).baseText("executionStopManyModal.running"),
"data-test-id": "sme-check-running"
}, null, 8, ["modelValue", "label"])]),
_: 1
}),
createVNode(unref(ElRow), null, {
default: withCtx(() => [createVNode(unref(N8nFormInput_default), {
modelValue: checkWaiting.value,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => checkWaiting.value = $event),
type: "checkbox",
label: unref(i18n$2).baseText("executionStopManyModal.waiting"),
"data-test-id": "sme-check-waiting"
}, null, 8, ["modelValue", "label"])]),
_: 1
})
]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.footer) }, [createVNode(unref(N8nButton_default), {
type: "tertiary",
label: unref(i18n$2).baseText("executionStopManyModal.button.close"),
"data-test-id": "sme-close-button",
onClick: closeModal
}, null, 8, ["label"]), createVNode(unref(N8nButton_default), {
disabled: !checkWaiting.value && !checkRunning.value && !checkQueued.value,
label: unref(i18n$2).baseText("executionStopManyModal.button.submit"),
loading: isLoading.value,
"data-test-id": "sme-submit-button",
onClick: onSubmit
}, null, 8, [
"disabled",
"label",
"loading"
])], 2)]),
_: 1
}, 8, [
"title",
"event-bus",
"name"
]);
};
}
});
var StopManyExecutionsModal_vue_vue_type_style_index_0_lang_module_default = {
form: "_form_nbfzv_123",
footer: "_footer_nbfzv_129",
vertPadding: "_vertPadding_nbfzv_137"
};
var StopManyExecutionsModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(StopManyExecutionsModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": StopManyExecutionsModal_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowDescriptionModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowDescriptionModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const modalBus = createEventBus();
const i18n$2 = useI18n();
const toast = useToast();
const telemetry$1 = useTelemetry();
const settingsStore = useSettingsStore();
const workflowStore = useWorkflowsStore();
const descriptionValue = ref(props.data.workflowDescription ?? "");
const descriptionInput = useTemplateRef("descriptionInput");
const isSaving = ref(false);
const normalizedCurrentValue = computed(() => (descriptionValue.value ?? "").trim());
const normalizedLastSaved = computed(() => (props.data.workflowDescription ?? "").trim());
const canSave = computed(() => normalizedCurrentValue.value !== normalizedLastSaved.value);
const isMcpEnabled = computed(() => settingsStore.isModuleActive("mcp") && settingsStore.moduleSettings.mcp?.mcpAccessEnabled);
const textareaTip = computed(() => isMcpEnabled.value ? i18n$2.baseText("workflow.description.mcp") : i18n$2.baseText("workflow.description.nomcp"));
const saveDescription = async () => {
isSaving.value = true;
try {
await workflowStore.saveWorkflowDescription(props.data.workflowId, normalizedCurrentValue.value ?? null);
props.data.onSave?.(normalizedCurrentValue.value ?? null);
telemetry$1.track("User set workflow description", {
workflow_id: props.data.workflowId,
description: normalizedCurrentValue.value ?? null
});
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("workflow.description.error.title"));
} finally {
isSaving.value = false;
}
};
const cancel = () => {
modalBus.emit("close");
};
const save = async () => {
await saveDescription();
modalBus.emit("close");
};
const handleKeyDown = async (event) => {
if (event.key === "Escape") {
event.preventDefault();
event.stopPropagation();
cancel();
}
if (event.key === "Enter" && !event.shiftKey) {
if (!canSave.value) return;
event.preventDefault();
event.stopPropagation();
await save();
}
};
onMounted(() => {
setTimeout(() => {
descriptionInput.value?.focus();
}, 150);
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(WORKFLOW_DESCRIPTION_MODAL_KEY),
title: unref(i18n$2).baseText("generic.description"),
width: "500",
class: normalizeClass(_ctx.$style.container),
"event-bus": unref(modalBus),
"close-on-click-modal": false
}, {
content: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style["description-edit-content"]),
"data-test-id": "workflow-description-edit-content"
}, [createVNode(unref(N8nText_default), {
color: "text-base",
"data-test-id": "descriptionTooltip"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(textareaTip.value), 1)]),
_: 1
}), createVNode(unref(N8nInput_default), {
ref_key: "descriptionInput",
ref: descriptionInput,
modelValue: descriptionValue.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => descriptionValue.value = $event),
rows: 6,
"data-test-id": "workflow-description-input",
type: "textarea",
onKeydown: handleKeyDown
}, null, 8, ["modelValue"])], 2)]),
footer: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style["popover-footer"]) }, [createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("generic.cancel"),
size: "small",
disabled: isSaving.value,
type: "tertiary",
"data-test-id": "workflow-description-cancel-button",
onClick: cancel
}, null, 8, ["label", "disabled"]), createVNode(unref(N8nButton_default), {
label: unref(i18n$2).baseText("generic.unsavedWork.confirmMessage.confirmButtonText"),
loading: isSaving.value,
disabled: !canSave.value || isSaving.value,
type: "primary",
"data-test-id": "workflow-description-save-button",
onClick: save
}, null, 8, [
"label",
"loading",
"disabled"
])], 2)]),
_: 1
}, 8, [
"name",
"title",
"class",
"event-bus"
]);
};
}
});
var WorkflowDescriptionModal_vue_vue_type_style_index_0_lang_module_default = {
"description-edit-content": "_description-edit-content_1ufcb_123",
"popover-footer": "_popover-footer_1ufcb_130"
};
var WorkflowDescriptionModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowDescriptionModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowDescriptionModal_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowPublishForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowPublishForm",
props: /* @__PURE__ */ mergeModels({
disabled: { type: Boolean },
versionNameTestId: {},
descriptionTestId: {}
}, {
"versionName": { required: true },
"versionNameModifiers": {},
"description": { required: true },
"descriptionModifiers": {}
}),
emits: /* @__PURE__ */ mergeModels(["submit"], ["update:versionName", "update:description"]),
setup(__props, { expose: __expose, emit: __emit }) {
const versionName = useModel(__props, "versionName");
const description$8 = useModel(__props, "description");
const nameInputRef = useTemplateRef("nameInput");
const i18n$2 = useI18n();
const emit = __emit;
const focusInput = () => {
nameInputRef.value?.select();
};
const handleEnterKey = () => {
emit("submit");
};
__expose({ focusInput });
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.formContainer) }, [createVNode(unref(N8nInputLabel_default), {
"input-name": "workflow-version-name",
label: unref(i18n$2).baseText("workflows.publishModal.versionNameLabel"),
required: true,
class: normalizeClass(_ctx.$style.inputWrapper)
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
id: "workflow-version-name",
ref: "nameInput",
modelValue: versionName.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => versionName.value = $event),
disabled: _ctx.disabled,
size: "large",
maxlength: unref(128),
"data-test-id": _ctx.versionNameTestId,
onKeydown: withKeys(handleEnterKey, ["enter"])
}, null, 8, [
"modelValue",
"disabled",
"maxlength",
"data-test-id"
])]),
_: 1
}, 8, ["label", "class"]), createVNode(unref(N8nInputLabel_default), {
"input-name": "workflow-version-description",
label: unref(i18n$2).baseText("workflows.publishModal.descriptionPlaceholder")
}, {
default: withCtx(() => [createVNode(unref(N8nInput_default), {
id: "workflow-version-description",
modelValue: description$8.value,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => description$8.value = $event),
type: "textarea",
rows: 4,
disabled: _ctx.disabled,
size: "large",
maxlength: unref(WORKFLOW_VERSION_DESCRIPTION_MAX_LENGTH),
"data-test-id": _ctx.descriptionTestId
}, null, 8, [
"modelValue",
"disabled",
"maxlength",
"data-test-id"
])]),
_: 1
}, 8, ["label"])], 2);
};
}
});
var WorkflowPublishForm_vue_vue_type_style_index_0_lang_module_default = {
formContainer: "_formContainer_41pdi_123",
inputWrapper: "_inputWrapper_41pdi_129"
};
var WorkflowPublishForm_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowPublishForm_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowPublishForm_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowPublishModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowPublishModal",
setup(__props) {
const modalBus = createEventBus();
const i18n$2 = useI18n();
const workflowsStore = useWorkflowsStore();
const credentialsStore = useCredentialsStore();
const uiStore = useUIStore();
const { showMessage } = useToast();
const workflowActivate = useWorkflowActivate();
const workflowHelpers = useWorkflowHelpers();
const publishing = ref(false);
const publishForm = useTemplateRef("publishForm");
const description$8 = ref("");
const versionName = ref("");
const foundTriggers = computed(() => getActivatableTriggerNodes(workflowsStore.workflowTriggerNodes));
const containsTrigger = computed(() => {
return foundTriggers.value.length > 0;
});
const wfHasAnyChanges = computed(() => {
return workflowsStore.workflow.versionId !== workflowsStore.workflow.activeVersion?.versionId;
});
const hasNodeIssues = computed(() => workflowsStore.nodesIssuesExist);
const inputsDisabled = computed(() => {
return !wfHasAnyChanges.value || !containsTrigger.value || hasNodeIssues.value || publishing.value;
});
const isPublishDisabled = computed(() => {
return inputsDisabled.value || versionName.value.trim().length === 0;
});
const activeCalloutId = computed(() => {
if (!containsTrigger.value) return "noTrigger";
if (hasNodeIssues.value) return "nodeIssues";
if (!wfHasAnyChanges.value) return "noChanges";
return null;
});
function onModalOpened() {
publishForm.value?.focusInput();
}
onMounted(() => {
if (!versionName.value && !inputsDisabled.value) versionName.value = generateVersionName(workflowsStore.workflow.versionId);
modalBus.on("opened", onModalOpened);
});
onBeforeUnmount(() => {
modalBus.off("opened", onModalOpened);
});
function findManagedOpenAiCredentialId(usedCredentials) {
return Object.keys(usedCredentials).find((credentialId) => {
const credential = credentialsStore.state.credentials[credentialId];
return credential.isManaged && credential.type === "openAiApi";
});
}
function hasActiveNodeUsingCredential(nodes$3, credentialId) {
return nodes$3.some((node) => node?.credentials?.["openAiApi"]?.id === credentialId && !node.disabled);
}
const shouldShowFreeAiCreditsWarning = computed(() => {
const usedCredentials = workflowsStore?.usedCredentials;
if (!usedCredentials) return false;
const managedOpenAiCredentialId = findManagedOpenAiCredentialId(usedCredentials);
if (!managedOpenAiCredentialId) return false;
return hasActiveNodeUsingCredential(workflowsStore.allNodes, managedOpenAiCredentialId);
});
async function displayActivationError() {
let errorMessage;
try {
const errorData = await workflowsStore.getActivationError(workflowsStore.workflow.id);
if (errorData === void 0) errorMessage = i18n$2.baseText("workflowActivator.showMessage.displayActivationError.message.errorDataUndefined");
else errorMessage = h(WorkflowActivationErrorMessage_default, { message: errorData });
} catch {
errorMessage = i18n$2.baseText("workflowActivator.showMessage.displayActivationError.message.catchBlock");
}
showMessage({
title: i18n$2.baseText("workflowActivator.showMessage.displayActivationError.title"),
message: errorMessage,
type: "warning",
duration: 0
});
}
async function handlePublish() {
if (isPublishDisabled.value) return;
publishing.value = true;
const conflictData = await workflowHelpers.checkConflictingWebhooks(workflowsStore.workflow.id);
if (conflictData) {
const { trigger, conflict } = conflictData;
const conflictingWorkflow = await workflowsStore.fetchWorkflow(conflict.workflowId);
uiStore.openModalWithData({
name: WORKFLOW_ACTIVATION_CONFLICTING_WEBHOOK_MODAL_KEY,
data: {
triggerType: trigger.type,
workflowName: conflictingWorkflow.name,
...conflict
}
});
publishing.value = false;
return;
}
if (await workflowActivate.publishWorkflow(workflowsStore.workflow.id, workflowsStore.workflow.versionId, {
name: versionName.value,
description: description$8.value
})) {
if (shouldShowFreeAiCreditsWarning.value) showMessage({
title: i18n$2.baseText("freeAi.credits.showWarning.workflow.activation.title"),
message: i18n$2.baseText("freeAi.credits.showWarning.workflow.activation.description"),
type: "warning",
duration: 0
});
telemetry.track("User published version from canvas", { workflow_id: workflowsStore.workflow.id });
modalBus.emit("close");
} else await displayActivationError();
publishing.value = false;
}
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
"max-width": "500px",
"max-height": "85vh",
name: unref(WORKFLOW_PUBLISH_MODAL_KEY),
center: true,
"show-close": true,
"close-on-click-modal": false,
"event-bus": unref(modalBus)
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), { size: "xlarge" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.publishModal.title")), 1)]),
_: 1
})]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [
activeCalloutId.value === "noTrigger" ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "danger",
icon: "status-error"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.publishModal.noTriggerMessage")), 1)]),
_: 1
})) : activeCalloutId.value === "nodeIssues" ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 1,
theme: "danger",
icon: "status-error"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflowActivator.showMessage.activeChangedNodesIssuesExistTrue.title", {
interpolate: { count: unref(workflowsStore).nodesWithIssues.length },
adjustToNumber: unref(workflowsStore).nodesWithIssues.length
})) + " ", 1), createBaseVNode("ul", { class: normalizeClass(_ctx.$style.nodeLinks) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(workflowsStore).nodesWithIssues, (node) => {
return openBlock(), createElementBlock("li", { key: node.id }, [createVNode(unref(N8nLink_default), {
size: "small",
to: `/workflow/${unref(workflowsStore).workflow.id}/${node.id}`,
onClick: _cache[0] || (_cache[0] = ($event) => unref(modalBus).emit("close"))
}, {
default: withCtx(() => [createTextVNode(toDisplayString(node.name), 1)]),
_: 2
}, 1032, ["to"])]);
}), 128))], 2)]),
_: 1
})) : activeCalloutId.value === "noChanges" ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 2,
theme: "warning"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.publishModal.noChanges")), 1)]),
_: 1
})) : createCommentVNode("", true),
createVNode(WorkflowPublishForm_default, {
ref_key: "publishForm",
ref: publishForm,
"version-name": versionName.value,
"onUpdate:versionName": _cache[1] || (_cache[1] = ($event) => versionName.value = $event),
description: description$8.value,
"onUpdate:description": _cache[2] || (_cache[2] = ($event) => description$8.value = $event),
disabled: inputsDisabled.value,
"version-name-test-id": "workflow-publish-version-name-input",
"description-test-id": "workflow-publish-description-input",
onSubmit: handlePublish
}, null, 8, [
"version-name",
"description",
"disabled"
]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.actions) }, [createVNode(unref(N8nButton_default), {
disabled: publishing.value,
type: "secondary",
label: unref(i18n$2).baseText("generic.cancel"),
"data-test-id": "workflow-publish-cancel-button",
onClick: _cache[3] || (_cache[3] = ($event) => unref(modalBus).emit("close"))
}, null, 8, ["disabled", "label"]), createVNode(unref(N8nButton_default), {
disabled: isPublishDisabled.value,
loading: publishing.value,
label: unref(i18n$2).baseText("workflows.publish"),
"data-test-id": "workflow-publish-button",
onClick: handlePublish
}, null, 8, [
"disabled",
"loading",
"label"
])], 2)
], 2)]),
_: 1
}, 8, ["name", "event-bus"]);
};
}
});
var WorkflowPublishModal_vue_vue_type_style_index_0_lang_module_default = {
content: "_content_au1ba_123",
actions: "_actions_au1ba_129",
nodeLinks: "_nodeLinks_au1ba_135"
};
var WorkflowPublishModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowPublishModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowPublishModal_vue_vue_type_style_index_0_lang_module_default }]]);
var WorkflowHistoryPublishModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WorkflowHistoryPublishModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const i18n$2 = useI18n();
const modalEventBus = createEventBus();
const workflowActivate = useWorkflowActivate();
const uiStore = useUIStore();
const publishForm = useTemplateRef("publishForm");
const versionName = ref("");
const description$8 = ref("");
function onModalOpened() {
publishForm.value?.focusInput();
}
onMounted(() => {
if (props.data.versionName) versionName.value = props.data.versionName;
else if (props.data.versionId) versionName.value = generateVersionName(props.data.versionId);
if (props.data.description) description$8.value = props.data.description;
modalEventBus.on("opened", onModalOpened);
});
onBeforeUnmount(() => {
modalEventBus.off("opened", onModalOpened);
});
const closeModal = () => {
uiStore.closeModal(props.modalName);
};
const onCancel = () => {
props.data.eventBus.emit("cancel");
closeModal();
};
const publishing = ref(false);
const handlePublish = async () => {
if (versionName.value.trim().length === 0) return;
publishing.value = true;
const success = await workflowActivate.publishWorkflow(props.data.workflowId, props.data.versionId, {
name: versionName.value,
description: description$8.value
});
publishing.value = false;
if (success) {
props.data.eventBus.emit("publish", {
versionId: props.data.versionId,
name: versionName.value,
description: description$8.value
});
closeModal();
}
};
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
width: "500px",
"max-height": "85vh",
name: unref(WORKFLOW_HISTORY_PUBLISH_MODAL_KEY),
"event-bus": unref(modalEventBus),
center: true,
"before-close": onCancel
}, {
header: withCtx(() => [createVNode(unref(N8nHeading_default), { size: "xlarge" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("workflows.publishModal.title")), 1)]),
_: 1
})]),
content: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [createVNode(WorkflowPublishForm_default, {
ref_key: "publishForm",
ref: publishForm,
"version-name": versionName.value,
"onUpdate:versionName": _cache[0] || (_cache[0] = ($event) => versionName.value = $event),
description: description$8.value,
"onUpdate:description": _cache[1] || (_cache[1] = ($event) => description$8.value = $event),
"version-name-test-id": "workflow-history-publish-version-name-input",
"description-test-id": "workflow-history-publish-description-input"
}, null, 8, ["version-name", "description"]), createBaseVNode("div", { class: normalizeClass(_ctx.$style.actions) }, [createVNode(unref(N8nButton_default), {
disabled: publishing.value,
type: "secondary",
label: unref(i18n$2).baseText("generic.cancel"),
"data-test-id": "workflow-history-publish-cancel-button",
onClick: onCancel
}, null, 8, ["disabled", "label"]), createVNode(unref(N8nButton_default), {
loading: publishing.value,
disabled: versionName.value.trim().length === 0,
label: unref(i18n$2).baseText("workflows.publish"),
"data-test-id": "workflow-history-publish-button",
onClick: handlePublish
}, null, 8, [
"loading",
"disabled",
"label"
])], 2)], 2)]),
_: 1
}, 8, ["name", "event-bus"]);
};
}
});
var WorkflowHistoryPublishModal_vue_vue_type_style_index_0_lang_module_default = {
content: "_content_14xdy_123",
actions: "_actions_14xdy_129"
};
var WorkflowHistoryPublishModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WorkflowHistoryPublishModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WorkflowHistoryPublishModal_vue_vue_type_style_index_0_lang_module_default }]]);
var Badge_vue_vue_type_script_lang_default = {
components: { ElTag },
props: ["text", "type"]
};
var Badge_vue_vue_type_style_index_0_lang_module_default = {
badge: "_badge_1wbqq_123",
danger: "_danger_1wbqq_133 _badge_1wbqq_123",
warning: "_warning_1wbqq_140 _badge_1wbqq_123"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ElTag = resolveComponent("ElTag");
return $props.type === "danger" ? (openBlock(), createBlock(_component_ElTag, {
key: 0,
type: "danger",
size: "small",
class: normalizeClass(_ctx.$style["danger"]),
"disable-transitions": true
}, {
default: withCtx(() => [createTextVNode(toDisplayString($props.text), 1)]),
_: 1
}, 8, ["class"])) : $props.type === "warning" ? (openBlock(), createBlock(_component_ElTag, {
key: 1,
size: "small",
class: normalizeClass(_ctx.$style["warning"]),
"disable-transitions": true
}, {
default: withCtx(() => [createTextVNode(toDisplayString($props.text), 1)]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true);
}
var Badge_default = /* @__PURE__ */ __plugin_vue_export_helper_default(Badge_vue_vue_type_script_lang_default, [["render", _sfc_render], ["__cssModules", { "$style": Badge_vue_vue_type_style_index_0_lang_module_default }]]);
var WarningTooltip_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "WarningTooltip",
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createElementBlock("span", null, [createVNode(unref(N8nTooltip_default), {
content: " ",
placement: "top"
}, {
content: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
default: withCtx(() => [createVNode(unref(N8nIcon_default), {
class: normalizeClass(_ctx.$style["icon"]),
icon: "triangle-alert"
}, null, 8, ["class"])]),
_: 3
})]);
};
}
});
var WarningTooltip_vue_vue_type_style_index_0_lang_module_default = { icon: "_icon_1dcjq_123" };
var WarningTooltip_default = /* @__PURE__ */ __plugin_vue_export_helper_default(WarningTooltip_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": WarningTooltip_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$2 = ["href"];
var VersionCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "VersionCard",
props: { version: {} },
setup(__props) {
const i18n$2 = useI18n();
const nodeName$2 = (node) => {
return node !== null ? node.displayName : i18n$2.baseText("versionCard.unknown");
};
return (_ctx, _cache) => {
const _directive_n8n_html = resolveDirective("n8n-html");
return _ctx.version ? (openBlock(), createElementBlock("a", {
key: 0,
href: _ctx.version.documentationUrl,
target: "_blank",
class: normalizeClass(_ctx.$style.card),
"data-test-id": "version-card"
}, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createBaseVNode("div", null, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.name) }, toDisplayString(`${unref(i18n$2).baseText("versionCard.version")} ${_ctx.version.name}`), 3),
_ctx.version.hasSecurityIssue ? (openBlock(), createBlock(WarningTooltip_default, { key: 0 }, {
default: withCtx(() => [withDirectives(createBaseVNode("span", null, null, 512), [[_directive_n8n_html, unref(i18n$2).baseText("versionCard.thisVersionHasASecurityIssue")]])]),
_: 1
})) : createCommentVNode("", true),
_ctx.version.hasSecurityFix ? (openBlock(), createBlock(Badge_default, {
key: 1,
text: unref(i18n$2).baseText("versionCard.securityUpdate"),
type: "danger"
}, null, 8, ["text"])) : createCommentVNode("", true),
_ctx.version.hasBreakingChange ? (openBlock(), createBlock(Badge_default, {
key: 2,
text: unref(i18n$2).baseText("versionCard.breakingChanges"),
type: "warning"
}, null, 8, ["text"])) : createCommentVNode("", true)
]), createBaseVNode("div", { class: normalizeClass(_ctx.$style["release-date"]) }, [createTextVNode(toDisplayString(unref(i18n$2).baseText("versionCard.released")) + "\xA0", 1), createVNode(TimeAgo_default, { date: _ctx.version.createdAt }, null, 8, ["date"])], 2)], 2),
_ctx.version.description || _ctx.version.nodes && _ctx.version.nodes.length ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.divider)
}, null, 2)) : createCommentVNode("", true),
createBaseVNode("div", null, [_ctx.version.description ? withDirectives((openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.description)
}, null, 2)), [[_directive_n8n_html, _ctx.version.description]]) : createCommentVNode("", true), _ctx.version.nodes && _ctx.version.nodes.length > 0 ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.nodes)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.version.nodes, (node) => {
return openBlock(), createBlock(NodeIcon_default, {
key: node.name,
"node-type": node,
title: nodeName$2(node)
}, null, 8, ["node-type", "title"]);
}), 128))], 2)) : createCommentVNode("", true)])
], 10, _hoisted_1$2)) : createCommentVNode("", true);
};
}
});
const card = "_card_p0mal_123";
const header$2 = "_header_p0mal_135";
const name = "_name_p0mal_150";
const divider = "_divider_p0mal_157";
const description$1 = "_description_p0mal_163";
const nodes = "_nodes_p0mal_177";
var VersionCard_vue_vue_type_style_index_0_lang_module_default = {
card,
header: header$2,
name,
divider,
description: description$1,
"release-date": "_release-date_p0mal_170",
nodes
};
var VersionCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(VersionCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": VersionCard_vue_vue_type_style_index_0_lang_module_default }]]);
var _hoisted_1$1 = { key: 0 };
var UpdatesPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "UpdatesPanel",
setup(__props) {
const versionsStore = useVersionsStore();
const pageRedirectionHelper = usePageRedirectionHelper();
const i18n$2 = useI18n();
return (_ctx, _cache) => {
return openBlock(), createBlock(ModalDrawer_default, {
name: unref(VERSIONS_MODAL_KEY),
direction: "ltr",
width: "520px",
"data-test-id": "version-updates-panel"
}, {
header: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.title) }, toDisplayString(unref(i18n$2).baseText("updatesPanel.weVeBeenBusy")), 3)]),
content: withCtx(() => [createBaseVNode("section", { class: normalizeClass(_ctx.$style["description"]) }, [unref(versionsStore).currentVersion ? (openBlock(), createElementBlock("p", _hoisted_1$1, [
createTextVNode(toDisplayString(unref(i18n$2).baseText("updatesPanel.youReOnVersion", { interpolate: { currentVersionName: unref(versionsStore).currentVersion.name } })) + " ", 1),
createBaseVNode("strong", null, [createVNode(TimeAgo_default, { date: unref(versionsStore).currentVersion.createdAt }, null, 8, ["date"])]),
createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("updatesPanel.andIs")) + " ", 1),
createBaseVNode("strong", null, toDisplayString(unref(i18n$2).baseText("updatesPanel.version", { interpolate: {
numberOfVersions: unref(versionsStore).nextVersions.length,
howManySuffix: unref(versionsStore).nextVersions.length > 1 ? "s" : ""
} })), 1),
createTextVNode(" " + toDisplayString(unref(i18n$2).baseText("updatesPanel.behindTheLatest")), 1)
])) : createCommentVNode("", true), unref(versionsStore).infoUrl ? (openBlock(), createBlock(unref(N8nButton_default), {
key: 1,
text: true,
type: "primary",
size: "large",
class: normalizeClass(_ctx.$style["link"]),
bold: true,
onClick: _cache[0] || (_cache[0] = ($event) => unref(pageRedirectionHelper).goToVersions())
}, {
default: withCtx(() => [createVNode(unref(N8nIcon_default), {
icon: "info",
class: "mr-2xs"
}), createBaseVNode("span", null, toDisplayString(unref(i18n$2).baseText("updatesPanel.howToUpdateYourN8nVersion")), 1)]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true)], 2), createBaseVNode("section", { class: normalizeClass(_ctx.$style.versions) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(versionsStore).nextVersions, (version) => {
return openBlock(), createElementBlock("div", {
key: version.name,
class: normalizeClass(_ctx.$style["versions-card"])
}, [createVNode(VersionCard_default, { version }, null, 8, ["version"])], 2);
}), 128))], 2)]),
_: 1
}, 8, ["name"]);
};
}
});
var UpdatesPanel_vue_vue_type_style_index_0_lang_module_default = {
title: "_title_1wgn7_123",
description: "_description_1wgn7_131",
link: "_link_1wgn7_146",
versions: "_versions_1wgn7_155",
"versions-card": "_versions-card_1wgn7_164"
};
var UpdatesPanel_default = /* @__PURE__ */ __plugin_vue_export_helper_default(UpdatesPanel_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": UpdatesPanel_vue_vue_type_style_index_0_lang_module_default }]]);
var CredentialResolverEditModal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "CredentialResolverEditModal",
props: {
modalName: {},
data: {}
},
setup(__props) {
const props = __props;
const modalBus = createEventBus();
const i18n$2 = useI18n();
const toast = useToast();
const rootStore = useRootStore();
const activeTab = ref("configuration");
const isLoading = ref(false);
const isSaving = ref(false);
const resolverName$1 = ref("");
const resolverType = ref("");
const resolverConfig = ref({});
const hasUnsavedChanges = ref(false);
const errorMessage = ref("");
const mainContentRef = ref();
const { resolverTypes: availableTypes, fetchResolverTypes: loadResolverTypes, deleteResolver: deleteResolverFromComposable, isDeleting } = useCredentialResolvers();
const isEditMode = computed(() => !!props.data?.resolverId);
const isCredentialInformation = (value) => {
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return true;
if (Array.isArray(value)) return value.every((v) => typeof v === "string" || typeof v === "object" && v !== null && !Array.isArray(v));
if (typeof value === "object" && value !== null) return true;
return false;
};
const toCredentialData = (config$1) => {
const result = {};
for (const [key, value] of Object.entries(config$1)) if (isCredentialInformation(value)) result[key] = value;
else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") result[key] = String(value);
return result;
};
const selectedType = computed(() => {
return availableTypes.value.find((t) => t.name === resolverType.value);
});
const toNodeProperty = (option) => {
return {
...option,
name: typeof option.name === "string" ? option.name : "",
type: typeof option.type === "string" ? option.type : "string",
displayName: typeof option.displayName === "string" ? option.displayName : "",
default: option.default ?? "",
...typeof option.required === "boolean" && { required: option.required },
...typeof option.description === "string" && { description: option.description },
...typeof option.placeholder === "string" && { placeholder: option.placeholder }
};
};
const resolverProperties = computed(() => {
if (!selectedType.value?.options) return [];
return selectedType.value.options.map(toNodeProperty);
});
const resolverData = computed(() => {
return toCredentialData(resolverConfig.value);
});
const requiredPropertiesFilled = computed(() => {
for (const property of resolverProperties.value) {
if (property.required !== true) continue;
const resolverProperty = resolverData.value[property.name];
if (property.type === "string" && !resolverProperty) return false;
if (property.type === "number") {
const containsExpression = typeof resolverProperty === "string" && resolverProperty.startsWith("=");
if (typeof resolverProperty !== "number" && !containsExpression) return false;
}
}
return true;
});
const canSave = computed(() => {
return resolverName$1.value.trim() !== "" && resolverType.value !== "";
});
const sidebarItems = computed(() => [{
id: "configuration",
label: i18n$2.baseText("credentialResolverEdit.sidebar.configuration"),
position: "top"
}, {
id: "details",
label: i18n$2.baseText("credentialResolverEdit.sidebar.details"),
position: "top"
}]);
const loadResolver = async () => {
if (!props.data?.resolverId) return;
try {
const resolver = await getCredentialResolver(rootStore.restApiContext, props.data.resolverId);
resolverName$1.value = resolver.name;
resolverType.value = resolver.type;
resolverConfig.value = resolver.decryptedConfig || {};
} catch (error$2) {
toast.showError(error$2, i18n$2.baseText("credentialResolverEdit.error.save"));
}
};
const beforeClose = () => {
if (hasUnsavedChanges.value) {}
return true;
};
const save = async () => {
if (!canSave.value) return;
isSaving.value = true;
errorMessage.value = "";
if (!requiredPropertiesFilled.value) {
errorMessage.value = i18n$2.baseText("credentialResolverEdit.error.missingRequiredFields");
isSaving.value = false;
return;
}
try {
const payload = {
name: resolverName$1.value.trim(),
type: resolverType.value,
config: resolverConfig.value
};
let savedResolver;
if (isEditMode.value && props.data?.resolverId) savedResolver = await updateCredentialResolver(rootStore.restApiContext, props.data.resolverId, payload);
else savedResolver = await createCredentialResolver(rootStore.restApiContext, payload);
if (props.data?.onSave) props.data.onSave(savedResolver.id);
toast.showMessage({
title: i18n$2.baseText("credentialResolverEdit.saveSuccess.title"),
type: "success"
});
hasUnsavedChanges.value = false;
modalBus.emit("close");
} catch (error$2) {
errorMessage.value = error$2 instanceof Error ? error$2.message : i18n$2.baseText("credentialResolverEdit.error.save");
mainContentRef.value?.scrollTo({
top: 0,
behavior: "smooth"
});
} finally {
isSaving.value = false;
}
};
const onConfigUpdate = (updateData) => {
resolverConfig.value = {
...resolverConfig.value,
[updateData.name]: updateData.value
};
hasUnsavedChanges.value = true;
errorMessage.value = "";
};
const onNameEdit = (newName) => {
resolverName$1.value = newName;
hasUnsavedChanges.value = true;
};
const onTabSelect = (tabId) => {
activeTab.value = tabId;
};
const deleteResolver = async () => {
if (!props.data?.resolverId) return;
if (await deleteResolverFromComposable({
id: props.data.resolverId,
name: resolverName$1.value,
type: resolverType.value,
config: JSON.stringify(resolverConfig.value),
createdAt: /* @__PURE__ */ new Date(),
updatedAt: /* @__PURE__ */ new Date()
})) {
hasUnsavedChanges.value = false;
if (props.data?.onDelete) props.data.onDelete(props.data.resolverId);
modalBus.emit("close");
}
};
onMounted(async () => {
isLoading.value = true;
await loadResolverTypes();
if (isEditMode.value) await loadResolver();
else resolverName$1.value = i18n$2.baseText("credentialResolverEdit.defaultName");
isLoading.value = false;
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Modal_default, {
name: unref(CREDENTIAL_RESOLVER_EDIT_MODAL_KEY),
"custom-class": _ctx.$style.resolverModal,
"event-bus": unref(modalBus),
loading: isLoading.value,
"before-close": beforeClose,
width: "70%",
height: "80%"
}, {
header: withCtx(() => [createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.resolverInfo) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.resolverIcon) }, [createVNode(unref(N8nIconButton_default), {
icon: "database",
type: "tertiary",
size: "large",
disabled: true
})], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.resolverName) }, [resolverName$1.value ? (openBlock(), createBlock(unref(N8nInlineTextEdit_default), {
key: 0,
"data-test-id": "credential-resolver-name",
"model-value": resolverName$1.value,
"onUpdate:modelValue": onNameEdit
}, null, 8, ["model-value"])) : createCommentVNode("", true), selectedType.value ? (openBlock(), createBlock(unref(N8nText_default), {
key: 1,
size: "small",
tag: "p",
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(selectedType.value.displayName), 1)]),
_: 1
})) : createCommentVNode("", true)], 2)], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.resolverActions) }, [isEditMode.value ? (openBlock(), createBlock(unref(N8nIconButton_default), {
key: 0,
title: unref(i18n$2).baseText("credentialResolverEdit.delete"),
icon: "trash-2",
type: "tertiary",
disabled: isSaving.value,
loading: unref(isDeleting),
"data-test-id": "credential-resolver-delete-button",
onClick: deleteResolver
}, null, 8, [
"title",
"disabled",
"loading"
])) : createCommentVNode("", true), createVNode(SaveButton_default, {
saved: false,
"is-saving": isSaving.value,
disabled: !canSave.value,
"data-test-id": "credential-resolver-save-button",
onClick: save
}, null, 8, ["is-saving", "disabled"])], 2)], 2)]),
content: withCtx(() => [createBaseVNode("div", {
class: normalizeClass(_ctx.$style.container),
"data-test-id": "credential-resolver-edit-dialog"
}, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.sidebar) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(sidebarItems.value, (item$2) => {
return openBlock(), createBlock(unref(N8nMenuItem_default), {
key: item$2.id,
item: item$2,
active: activeTab.value === item$2.id,
onClick: () => onTabSelect(item$2.id)
}, null, 8, [
"item",
"active",
"onClick"
]);
}), 128))], 2),
activeTab.value === "configuration" ? (openBlock(), createElementBlock("div", {
key: 0,
ref_key: "mainContentRef",
ref: mainContentRef,
class: normalizeClass(_ctx.$style.mainContent)
}, [
errorMessage.value ? (openBlock(), createBlock(unref(N8nCallout_default), {
key: 0,
theme: "danger",
class: normalizeClass(_ctx.$style.errorAlert),
"data-test-id": "credential-resolver-error-alert"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(errorMessage.value), 1)]),
_: 1
}, 8, ["class"])) : createCommentVNode("", true),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.formGroup) }, [createBaseVNode("label", { class: normalizeClass(_ctx.$style.label) }, toDisplayString(unref(i18n$2).baseText("credentialResolverEdit.type.label")), 3), createVNode(unref(N8nSelect_default), {
modelValue: resolverType.value,
"onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => resolverType.value = $event), _cache[1] || (_cache[1] = () => {
hasUnsavedChanges.value = true;
errorMessage.value = "";
})],
placeholder: unref(i18n$2).baseText("credentialResolverEdit.type.placeholder"),
"data-test-id": "credential-resolver-type-select"
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(availableTypes), (type) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: type.name,
label: type.displayName,
value: type.name
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, ["modelValue", "placeholder"])], 2),
resolverProperties.value.length > 0 ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.configSection)
}, [createVNode(CredentialInputs_default, {
"credential-properties": resolverProperties.value,
"credential-data": resolverData.value,
"documentation-url": "",
"show-validation-warnings": !!errorMessage.value,
onUpdate: onConfigUpdate
}, null, 8, [
"credential-properties",
"credential-data",
"show-validation-warnings"
])], 2)) : createCommentVNode("", true)
], 2)) : createCommentVNode("", true),
activeTab.value === "details" ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(_ctx.$style.mainContent)
}, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.formGroup) }, [createBaseVNode("label", { class: normalizeClass(_ctx.$style.label) }, toDisplayString(unref(i18n$2).baseText("credentialResolverEdit.details.id")), 3), props.data?.resolverId ? (openBlock(), createBlock(unref(N8nText_default), {
key: 0,
color: "text-base"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(props.data.resolverId), 1)]),
_: 1
})) : (openBlock(), createBlock(unref(N8nText_default), {
key: 1,
color: "text-light"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n$2).baseText("credentialResolverEdit.details.notSaved")), 1)]),
_: 1
}))], 2)], 2)) : createCommentVNode("", true)
], 2)]),
_: 1
}, 8, [
"name",
"custom-class",
"event-bus",
"loading"
]);
};
}
});
var CredentialResolverEditModal_vue_vue_type_style_index_0_lang_module_default = {
resolverModal: "_resolverModal_z638v_123",
mainContent: "_mainContent_z638v_137",
resolverName: "_resolverName_z638v_143",
sidebar: "_sidebar_z638v_150",
header: "_header_z638v_160",
container: "_container_z638v_164",
resolverInfo: "_resolverInfo_z638v_169",
resolverActions: "_resolverActions_z638v_177",
resolverIcon: "_resolverIcon_z638v_188",
formGroup: "_formGroup_z638v_194",
label: "_label_z638v_201",
configSection: "_configSection_z638v_207",
errorAlert: "_errorAlert_z638v_211"
};
var CredentialResolverEditModal_default = /* @__PURE__ */ __plugin_vue_export_helper_default(CredentialResolverEditModal_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": CredentialResolverEditModal_vue_vue_type_style_index_0_lang_module_default }]]);
var Modals_default = /* @__PURE__ */ defineComponent({
__name: "Modals",
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", null, [
createVNode(ModalRoot_default, { name: unref(CONTACT_PROMPT_MODAL_KEY) }, {
default: withCtx(({ modalName }) => [createVNode(ContactPromptModal_default, { "modal-name": modalName }, null, 8, ["modal-name"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(CREDENTIAL_EDIT_MODAL_KEY) }, {
default: withCtx(({ modalName, activeId, mode: mode$2 }) => [createVNode(CredentialEdit_default, {
"modal-name": modalName,
mode: mode$2,
"active-id": activeId
}, null, 8, [
"modal-name",
"mode",
"active-id"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(API_KEY_CREATE_OR_EDIT_MODAL_KEY) }, {
default: withCtx(({ modalName, data: { mode: mode$2, activeId } }) => [createVNode(ApiKeyCreateOrEditModal_default, {
"modal-name": modalName,
mode: mode$2,
"active-id": activeId
}, null, 8, [
"modal-name",
"mode",
"active-id"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(ABOUT_MODAL_KEY) }, {
default: withCtx(() => [createVNode(AboutModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(CHAT_EMBED_MODAL_KEY) }, {
default: withCtx(() => [createVNode(ChatEmbedModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(CREDENTIAL_SELECT_MODAL_KEY) }, {
default: withCtx(() => [createVNode(CredentialsSelectModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(DUPLICATE_MODAL_KEY) }, {
default: withCtx(({ modalName, active, data }) => [createVNode(DuplicateWorkflowDialog_default, {
data,
"is-active": active,
"modal-name": modalName
}, null, 8, [
"data",
"is-active",
"modal-name"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(IMPORT_WORKFLOW_URL_MODAL_KEY) }, {
default: withCtx(() => [createVNode(ImportWorkflowUrlModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(PERSONALIZATION_MODAL_KEY) }, {
default: withCtx(() => [createVNode(PersonalizationModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(TAGS_MANAGER_MODAL_KEY) }, {
default: withCtx(() => [createVNode(WorkflowTagsManager_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(ANNOTATION_TAGS_MANAGER_MODAL_KEY) }, {
default: withCtx(() => [createVNode(AnnotationTagsManager_ee_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, {
name: unref(VERSIONS_MODAL_KEY),
"keep-alive": true
}, {
default: withCtx(() => [createVNode(UpdatesPanel_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, {
name: unref(NPS_SURVEY_MODAL_KEY),
"keep-alive": true
}, {
default: withCtx(({ active }) => [createVNode(NpsSurvey_default, { "is-active": active }, null, 8, ["is-active"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_SETTINGS_MODAL_KEY) }, {
default: withCtx(() => [createVNode(WorkflowSettings_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(CHANGE_PASSWORD_MODAL_KEY) }, {
default: withCtx(() => [createVNode(ChangePasswordModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(CONFIRM_PASSWORD_MODAL_KEY) }, {
default: withCtx(() => [createVNode(ConfirmPasswordModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(INVITE_USER_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(InviteUsersModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(DELETE_USER_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(DeleteUserModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_ACTIVE_MODAL_KEY) }, {
default: withCtx(() => [createVNode(ActivationModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(MFA_SETUP_MODAL_KEY) }, {
default: withCtx(() => [createVNode(MfaSetupModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(PROMPT_MFA_CODE_MODAL_KEY) }, {
default: withCtx(() => [createVNode(PromptMfaCodeModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_SHARE_MODAL_KEY) }, {
default: withCtx(({ modalName, active, data }) => [createVNode(WorkflowShareModal_ee_default, {
data,
"is-active": active,
"modal-name": modalName
}, null, 8, [
"data",
"is-active",
"modal-name"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(COMMUNITY_PACKAGE_INSTALL_MODAL_KEY) }, {
default: withCtx(() => [createVNode(CommunityPackageInstallModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(IMPORT_CURL_MODAL_KEY) }, {
default: withCtx(() => [createVNode(ImportCurlModal_default)]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY) }, {
default: withCtx(({ modalName, activeId, mode: mode$2 }) => [createVNode(CommunityPackageManageConfirmModal_default, {
"modal-name": modalName,
"active-package-name": activeId,
mode: mode$2
}, null, 8, [
"modal-name",
"active-package-name",
"mode"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(LOG_STREAM_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(EventDestinationSettingsModal_default, {
"modal-name": modalName,
destination: data.destination,
"is-new": data.isNew,
"event-bus": data.eventBus
}, null, 8, [
"modal-name",
"destination",
"is-new",
"event-bus"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(SOURCE_CONTROL_PUSH_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(SourceControlPushModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(SOURCE_CONTROL_PULL_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(SourceControlPullModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_DIFF_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowDiffModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(EXTERNAL_SECRETS_PROVIDER_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(ExternalSecretsProviderModal_ee_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(DEBUG_PAYWALL_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(DebugPaywallModal_default, {
"data-test-id": "debug-paywall-modal",
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_HISTORY_VERSION_RESTORE) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowHistoryVersionRestoreModal_default, {
"data-test-id": "workflow-history-version-restore-modal",
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_HISTORY_VERSION_UNPUBLISH) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowHistoryVersionUnpublishModal_default, {
"data-test-id": "workflow-history-version-unpublish-modal",
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(SETUP_CREDENTIALS_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(SetupWorkflowCredentialsModal_default, {
"data-test-id": "setup-workflow-credentials-modal",
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(PROJECT_MOVE_RESOURCE_MODAL) }, {
default: withCtx(({ modalName, data }) => [createVNode(ProjectMoveResourceModal_default, {
"data-test-id": "project-move-resource-modal",
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(NEW_ASSISTANT_SESSION_MODAL) }, {
default: withCtx(({ modalName, data }) => [createVNode(NewAssistantSessionModal_default, {
name: modalName,
data
}, null, 8, ["name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(COMMUNITY_PLUS_ENROLLMENT_MODAL) }, {
default: withCtx(({ modalName, data }) => [createVNode(CommunityPlusEnrollmentModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(DELETE_FOLDER_MODAL_KEY) }, {
default: withCtx(({ modalName, activeId, data }) => [createVNode(DeleteFolderModal_default, {
"modal-name": modalName,
"active-id": activeId,
data
}, null, 8, [
"modal-name",
"active-id",
"data"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(MOVE_FOLDER_MODAL_KEY) }, {
default: withCtx(({ modalName, activeId, data }) => [createVNode(MoveToFolderModal_default, {
"modal-name": modalName,
"active-id": activeId,
data
}, null, 8, [
"modal-name",
"active-id",
"data"
])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_ACTIVATION_CONFLICTING_WEBHOOK_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowActivationConflictingWebhookModal_default, {
data,
"modal-name": modalName
}, null, 8, ["data", "modal-name"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(FROM_AI_PARAMETERS_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(FromAiParametersModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(STOP_MANY_EXECUTIONS_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(StopManyExecutionsModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_EXTRACTION_NAME_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowExtractionNameModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WHATS_NEW_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WhatsNewModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(EXPERIMENT_TEMPLATE_RECO_V2_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(NodeRecommendationModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(EXPERIMENT_TEMPLATE_RECO_V3_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(NodeRecommendationModal_default$1, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(EXPERIMENT_TEMPLATES_DATA_QUALITY_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(NodeRecommendationModal_default$2, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(PRE_BUILT_AGENTS_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(PreBuiltAgentsModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(VARIABLE_MODAL_KEY) }, {
default: withCtx(({ data }) => [createVNode(VariableModal_default, {
mode: data?.mode ?? "new",
variable: data?.variable
}, null, 8, ["mode", "variable"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_DESCRIPTION_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowDescriptionModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_PUBLISH_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowPublishModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(WORKFLOW_HISTORY_PUBLISH_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(WorkflowHistoryPublishModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(ModalRoot_default, { name: unref(CREDENTIAL_RESOLVER_EDIT_MODAL_KEY) }, {
default: withCtx(({ modalName, data }) => [createVNode(CredentialResolverEditModal_default, {
"modal-name": modalName,
data
}, null, 8, ["modal-name", "data"])]),
_: 1
}, 8, ["name"]),
createVNode(DynamicModalLoader_default)
]);
};
}
});
var ELEMENT_UI_OVERLAY_SELECTOR = ".el-overlay";
function useHistoryHelper(activeRoute) {
const telemetry$1 = useTelemetry();
const ndvStore = useNDVStore();
const historyStore = useHistoryStore();
const uiStore = useUIStore();
const { isCtrlKeyPressed } = useDeviceSupport();
const undo = async () => {
const command = historyStore.popUndoableToUndo();
if (!command) return;
const timestamp = Date.now();
if (command instanceof BulkCommand) {
historyStore.bulkInProgress = true;
const commands = command.commands;
const reverseCommands = [];
for (let i$1 = commands.length - 1; i$1 >= 0; i$1--) {
await commands[i$1].revert();
reverseCommands.push(commands[i$1].getReverseCommand(timestamp));
}
historyStore.pushUndoableToRedo(new BulkCommand(reverseCommands));
await nextTick();
historyStore.bulkInProgress = false;
}
if (command instanceof Command) {
await command.revert();
historyStore.pushUndoableToRedo(command.getReverseCommand(timestamp));
uiStore.stateIsDirty = true;
}
trackCommand(command, "undo");
};
const redo = async () => {
const command = historyStore.popUndoableToRedo();
if (!command) return;
const timestamp = Date.now();
if (command instanceof BulkCommand) {
historyStore.bulkInProgress = true;
const commands = command.commands;
const reverseCommands = [];
for (let i$1 = commands.length - 1; i$1 >= 0; i$1--) {
await commands[i$1].revert();
reverseCommands.push(commands[i$1].getReverseCommand(timestamp));
}
historyStore.pushBulkCommandToUndo(new BulkCommand(reverseCommands), false);
await nextTick();
historyStore.bulkInProgress = false;
}
if (command instanceof Command) {
await command.revert();
historyStore.pushCommandToUndo(command.getReverseCommand(timestamp), false);
uiStore.stateIsDirty = true;
}
trackCommand(command, "redo");
};
function trackCommand(command, type) {
if (command instanceof Command) telemetry$1.track(`User hit ${type}`, {
commands_length: 1,
commands: [command.name]
});
else if (command instanceof BulkCommand) telemetry$1.track(`User hit ${type}`, {
commands_length: command.commands.length,
commands: command.commands.map((c$1) => c$1.name)
});
}
function trackUndoAttempt() {
const activeNode = ndvStore.activeNode;
if (activeNode) telemetry$1?.track("User hit undo in NDV", { node_type: activeNode.type });
}
function isMessageDialogOpen() {
return document.querySelector(`${ELEMENT_UI_OVERLAY_SELECTOR}:not([style*="display: none"])`) !== null;
}
function handleKeyDown(event) {
const currentNodeViewTab = getNodeViewTab(activeRoute);
const isNDVOpen = ndvStore.isNDVOpen;
const isAnyModalOpen = uiStore.isAnyModalOpen || isMessageDialogOpen();
const undoKeysPressed = isCtrlKeyPressed(event) && event.key.toLowerCase() === "z";
if (event.repeat || currentNodeViewTab !== MAIN_HEADER_TABS.WORKFLOW || event.target instanceof HTMLElement && shouldIgnoreCanvasShortcut(event.target)) return;
if (isNDVOpen || isAnyModalOpen) {
if (isNDVOpen && undoKeysPressed && !event.shiftKey) trackUndoAttempt();
return;
}
if (undoKeysPressed) {
event.preventDefault();
if (event.shiftKey) redo();
else undo();
}
}
onMounted(() => {
document.addEventListener("keydown", handleKeyDown);
});
onUnmounted(() => {
document.removeEventListener("keydown", handleKeyDown);
});
return {
undo,
redo
};
}
function useTelemetryInitializer() {
const isTelemetryInitialized = ref(false);
const rootStore = useRootStore();
const settingsStore = useSettingsStore();
const usersStore = useUsersStore();
const projectsStore = useProjectsStore();
const telemetryPlugin = useTelemetry();
const route = useRoute();
const currentUserId = computed(() => {
return usersStore.currentUserId ?? "";
});
const isTelemetryEnabledOnRoute = computed(() => {
const routeMeta = route.meta;
return routeMeta?.telemetry ? !routeMeta.telemetry.disabled : true;
});
const telemetry$1 = computed(() => {
return settingsStore.telemetry;
});
const isTelemetryEnabled = computed(() => {
return !!telemetry$1.value?.enabled;
});
function init$2() {
if (isTelemetryInitialized.value || !isTelemetryEnabledOnRoute.value || !isTelemetryEnabled.value) return;
telemetryPlugin.init(telemetry$1.value, {
instanceId: rootStore.instanceId,
userId: currentUserId.value,
projectId: projectsStore.personalProject?.id,
versionCli: rootStore.versionCli
});
isTelemetryInitialized.value = true;
}
watch(telemetry$1, () => {
init$2();
});
watch(isTelemetryEnabledOnRoute, (enabled) => {
if (enabled) init$2();
});
onMounted(() => {
init$2();
});
}
function useWorkflowDiffRouting() {
const route = useRoute();
const uiStore = useUIStore();
const workflowDiffEventBus = createEventBus();
const closeModal = (modalKey) => {
if (uiStore.modalsById[modalKey]?.open) uiStore.closeModal(modalKey);
};
const reopenSourceControlModal = (direction, preserveData = false) => {
const modalKey = direction === "push" ? SOURCE_CONTROL_PUSH_MODAL_KEY : SOURCE_CONTROL_PULL_MODAL_KEY;
const modalData = preserveData && uiStore.modalsById[modalKey]?.data?.eventBus ? uiStore.modalsById[modalKey].data : { eventBus: createEventBus() };
uiStore.openModalWithData({
name: modalKey,
data: modalData
});
};
const handleDiffModal = (diffWorkflowId, diffWorkflowStatus, direction) => {
const shouldOpen = diffWorkflowId && direction;
const isOpen = uiStore.modalsById[WORKFLOW_DIFF_MODAL_KEY]?.open;
if (shouldOpen && !isOpen) uiStore.openModalWithData({
name: WORKFLOW_DIFF_MODAL_KEY,
data: {
eventBus: workflowDiffEventBus,
workflowId: diffWorkflowId,
workflowStatus: diffWorkflowStatus,
direction
}
});
else if (!shouldOpen && isOpen) uiStore.closeModal(WORKFLOW_DIFF_MODAL_KEY);
};
const handleSourceControlModals = (sourceControl, diffWorkflowId, direction) => {
if (sourceControl && !diffWorkflowId) {
const modalKey = sourceControl === "push" ? SOURCE_CONTROL_PUSH_MODAL_KEY : SOURCE_CONTROL_PULL_MODAL_KEY;
if (!uiStore.modalsById[modalKey]?.open) reopenSourceControlModal(sourceControl);
return;
}
if (direction && !diffWorkflowId && !sourceControl) {
const modalKey = direction === "push" ? SOURCE_CONTROL_PUSH_MODAL_KEY : SOURCE_CONTROL_PULL_MODAL_KEY;
if (!uiStore.modalsById[modalKey]?.open) reopenSourceControlModal(direction, true);
return;
}
if (!sourceControl && !diffWorkflowId) {
closeModal(SOURCE_CONTROL_PUSH_MODAL_KEY);
closeModal(SOURCE_CONTROL_PULL_MODAL_KEY);
}
};
const handleRouteChange = () => {
const diffWorkflowId = typeof route.query.diff === "string" ? route.query.diff : void 0;
const diffWorkflowStatus = diffWorkflowId && isSourceControlledFileStatus(route.query.workflowStatus) ? route.query.workflowStatus : void 0;
const direction = typeof route.query.direction === "string" && (route.query.direction === "push" || route.query.direction === "pull") ? route.query.direction : void 0;
const sourceControl = typeof route.query.sourceControl === "string" && (route.query.sourceControl === "push" || route.query.sourceControl === "pull") ? route.query.sourceControl : void 0;
handleDiffModal(diffWorkflowId, diffWorkflowStatus, direction);
handleSourceControlModals(sourceControl, diffWorkflowId, direction);
};
watch(() => [
route.query.diff,
route.query.direction,
route.query.sourceControl
], handleRouteChange, { immediate: true });
handleRouteChange();
return { workflowDiffEventBus };
}
var LoadingView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "LoadingView",
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.$style.wrapper),
"data-test-id": "node-view-loader"
}, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.spinner) }, [createVNode(unref(N8nSpinner_default))], 2)], 2);
};
}
});
var LoadingView_vue_vue_type_style_index_0_lang_module_default = {
wrapper: "_wrapper_19ynj_123",
spinner: "_spinner_19ynj_130"
};
var LoadingView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(LoadingView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": LoadingView_vue_vue_type_style_index_0_lang_module_default }]]);
function useExposeCssVar(name$2, value) {
const originalValue = document.documentElement.style.getPropertyValue(name$2);
const variable = useCssVar(name$2);
watch(() => toValue(value), (latest) => {
variable.value = latest;
}, { immediate: true });
onBeforeUnmount(() => {
document.documentElement.style.setProperty(name$2, originalValue ?? null);
});
}
var ASSISTANT_FLOATING_BUTTON_SIZE = 42;
function useFloatingUiOffsets() {
const assistantStore = useAssistantStore();
const ndvStore = useNDVStore();
const logsStore = useLogsStore();
const isNDVV2 = computed(() => true);
const askAiOffset = computed(() => ndvStore.isNDVOpen && !isNDVV2.value ? 48 : 16);
return {
askAiFloatingButtonBottomOffset: computed(() => `${askAiOffset.value}px`),
toastBottomOffset: computed(() => {
return `${(ndvStore.isNDVOpen ? 0 : logsStore.height) + (assistantStore.isFloatingButtonShown ? ASSISTANT_FLOATING_BUTTON_SIZE + askAiOffset.value : 0)}px`;
})
};
}
var _hoisted_1 = ["id"];
var _hoisted_2 = ["id"];
var App_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "App",
setup(__props) {
const route = useRoute();
const rootStore = useRootStore();
const assistantStore = useAssistantStore();
const chatPanelStore = useChatPanelStore();
const uiStore = useUIStore();
const usersStore = useUsersStore();
const settingsStore = useSettingsStore();
const ndvStore = useNDVStore();
const { APP_Z_INDEXES } = useStyles();
const { initialize: initializeCommandBar, isEnabled: isCommandBarEnabled, items, placeholder, context, onCommandBarChange, onCommandBarNavigateTo, isLoading: isCommandBarLoading } = useCommandBar();
const { setAppZIndexes } = useStyles();
const { toastBottomOffset, askAiFloatingButtonBottomOffset } = useFloatingUiOffsets();
useHistoryHelper(route);
useWorkflowDiffRouting();
useTelemetryInitializer();
const loading$3 = ref(true);
const defaultLocale = computed(() => rootStore.defaultLocale);
const isDemoMode = computed(() => route.name === VIEWS.DEMO);
const hasContentFooter = ref(false);
const appGrid = ref(null);
const showCommandBar = computed(() => isCommandBarEnabled.value && hasPermission(["authenticated"]) && !isDemoMode.value);
const chatPanelWidth = computed(() => chatPanelStore.width);
useTelemetryContext({ ndv_source: computed(() => ndvStore.lastSetActiveNodeSource) });
onMounted(async () => {
setAppZIndexes();
logHiringBanner();
loading$3.value = false;
window.addEventListener("resize", updateGridWidth);
await updateGridWidth();
});
watch(showCommandBar, (newVal) => {
if (newVal) initializeCommandBar();
});
onBeforeUnmount(() => {
window.removeEventListener("resize", updateGridWidth);
});
const logHiringBanner = () => {
if (settingsStore.isHiringBannerEnabled && !isDemoMode.value) console.log(HIRING_BANNER);
};
const updateGridWidth = async () => {
await nextTick();
if (appGrid.value) {
const { width, height } = appGrid.value.getBoundingClientRect();
uiStore.appGridDimensions = {
width,
height
};
}
};
watch(chatPanelWidth, async () => {
await updateGridWidth();
});
watch(route, (r) => {
hasContentFooter.value = r.matched.some((matchedRoute) => matchedRoute.components?.footer !== void 0);
});
watch(defaultLocale, async (newLocale) => {
setLanguage(newLocale);
axios_default.defaults.headers.common["Accept-Language"] = newLocale;
use(newLocale);
}, { immediate: true });
useExposeCssVar("--toast--offset", toastBottomOffset);
useExposeCssVar("--ask-assistant--floating-button--margin-bottom", askAiFloatingButtonBottomOffset);
return (_ctx, _cache) => {
const _component_RouterView = resolveComponent("RouterView");
return loading$3.value ? (openBlock(), createBlock(LoadingView_default, { key: 0 })) : (openBlock(), createElementBlock("div", {
key: 1,
id: "n8n-app",
class: normalizeClass({
[_ctx.$style.container]: true,
[_ctx.$style.sidebarCollapsed]: unref(uiStore).sidebarMenuCollapsed
})
}, [
createBaseVNode("div", {
id: "app-grid",
ref_key: "appGrid",
ref: appGrid,
class: normalizeClass(_ctx.$style["app-grid"])
}, [
createBaseVNode("div", {
id: "banners",
class: normalizeClass(_ctx.$style.banners)
}, [!isDemoMode.value ? (openBlock(), createBlock(BannerStack_default, { key: 0 })) : createCommentVNode("", true)], 2),
createBaseVNode("div", {
id: "header",
class: normalizeClass(_ctx.$style.header)
}, [createVNode(_component_RouterView, { name: "header" })], 2),
unref(usersStore).currentUser ? (openBlock(), createElementBlock("div", {
key: 0,
id: "sidebar",
class: normalizeClass(_ctx.$style.sidebar)
}, [createVNode(_component_RouterView, { name: "sidebar" })], 2)) : createCommentVNode("", true),
createBaseVNode("div", {
id: "content",
class: normalizeClass(_ctx.$style.content)
}, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.contentWrapper) }, [createVNode(_component_RouterView, null, {
default: withCtx(({ Component }) => [_ctx.$route.meta.keepWorkflowAlive ? (openBlock(), createBlock(KeepAlive, {
key: 0,
include: "NodeView",
max: 1
}, [(openBlock(), createBlock(resolveDynamicComponent(Component)))], 1024)) : (openBlock(), createBlock(resolveDynamicComponent(Component), { key: 1 }))]),
_: 1
})], 2), hasContentFooter.value ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.contentFooter)
}, [createVNode(_component_RouterView, { name: "footer" })], 2)) : createCommentVNode("", true)], 2),
createBaseVNode("div", {
id: unref(APP_MODALS_ELEMENT_ID),
class: normalizeClass(_ctx.$style.modals)
}, [createVNode(Modals_default)], 10, _hoisted_1),
showCommandBar.value ? (openBlock(), createBlock(unref(N8nCommandBar_default), {
key: 1,
items: unref(items),
placeholder: unref(placeholder),
context: unref(context),
"is-loading": unref(isCommandBarLoading),
"z-index": unref(APP_Z_INDEXES).COMMAND_BAR,
onInputChange: unref(onCommandBarChange),
onNavigateTo: unref(onCommandBarNavigateTo)
}, null, 8, [
"items",
"placeholder",
"context",
"is-loading",
"z-index",
"onInputChange",
"onNavigateTo"
])) : createCommentVNode("", true),
unref(assistantStore).isFloatingButtonShown ? (openBlock(), createBlock(AskAssistantFloatingButton_default, { key: 2 })) : createCommentVNode("", true)
], 2),
createVNode(AssistantsHub_default),
createBaseVNode("div", { id: unref(CODEMIRROR_TOOLTIP_CONTAINER_ELEMENT_ID) }, null, 8, _hoisted_2)
], 2));
};
}
});
const container = "_container_jj6dn_123";
const banners = "_banners_jj6dn_139";
const content = "_content_jj6dn_144";
const contentFooter = "_contentFooter_jj6dn_152";
const contentWrapper = "_contentWrapper_jj6dn_162";
const header = "_header_jj6dn_176";
const sidebar = "_sidebar_jj6dn_183";
const modals = "_modals_jj6dn_188";
var App_vue_vue_type_style_index_0_lang_module_default = {
container,
"app-grid": "_app-grid_jj6dn_130",
banners,
content,
contentFooter,
contentWrapper,
header,
sidebar,
modals
};
var App_default = /* @__PURE__ */ __plugin_vue_export_helper_default(App_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": App_vue_vue_type_style_index_0_lang_module_default }]]);
(/* @__PURE__ */ __commonJSMin(((exports, module) => {
var runtime = function(exports) {
var Op = Object.prototype;
var hasOwn = Op.hasOwnProperty;
var defineProperty = Object.defineProperty || function(obj, key, desc) {
obj[key] = desc.value;
};
var undefined$1;
var $Symbol = typeof Symbol === "function" ? Symbol : {};
var iteratorSymbol = $Symbol.iterator || "@@iterator";
var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
function define(obj, key, value) {
Object.defineProperty(obj, key, {
value,
enumerable: true,
configurable: true,
writable: true
});
return obj[key];
}
try {
define({}, "");
} catch (err) {
define = function(obj, key, value) {
return obj[key] = value;
};
}
function wrap$1(innerFn, outerFn, self, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
var generator = Object.create(protoGenerator.prototype);
defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, new Context(tryLocsList || [])) });
return generator;
}
exports.wrap = wrap$1;
function tryCatch(fn$1, obj, arg) {
try {
return {
type: "normal",
arg: fn$1.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
var GenStateSuspendedStart = "suspendedStart";
var GenStateSuspendedYield = "suspendedYield";
var GenStateExecuting = "executing";
var GenStateCompleted = "completed";
var ContinueSentinel = {};
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
var IteratorPrototype = {};
define(IteratorPrototype, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf;
var NativeIteratorPrototype = getProto && getProto(getProto(values$2([])));
if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) IteratorPrototype = NativeIteratorPrototype;
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
GeneratorFunction.prototype = GeneratorFunctionPrototype;
defineProperty(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
});
defineProperty(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
});
GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction");
function defineIteratorMethods(prototype) {
[
"next",
"throw",
"return"
].forEach(function(method) {
define(prototype, method, function(arg) {
return this._invoke(method, arg);
});
});
}
exports.isGeneratorFunction = function(genFun) {
var ctor = typeof genFun === "function" && genFun.constructor;
return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
};
exports.mark = function(genFun) {
if (Object.setPrototypeOf) Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
else {
genFun.__proto__ = GeneratorFunctionPrototype;
define(genFun, toStringTagSymbol, "GeneratorFunction");
}
genFun.prototype = Object.create(Gp);
return genFun;
};
exports.awrap = function(arg) {
return { __await: arg };
};
function AsyncIterator(generator, PromiseImpl) {
function invoke(method, arg, resolve$1, reject) {
var record = tryCatch(generator[method], generator, arg);
if (record.type === "throw") reject(record.arg);
else {
var result = record.arg;
var value = result.value;
if (value && typeof value === "object" && hasOwn.call(value, "__await")) return PromiseImpl.resolve(value.__await).then(function(value$1) {
invoke("next", value$1, resolve$1, reject);
}, function(err) {
invoke("throw", err, resolve$1, reject);
});
return PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped;
resolve$1(result);
}, function(error$2) {
return invoke("throw", error$2, resolve$1, reject);
});
}
}
var previousPromise;
function enqueue(method, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve$1, reject) {
invoke(method, arg, resolve$1, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
defineProperty(this, "_invoke", { value: enqueue });
}
defineIteratorMethods(AsyncIterator.prototype);
define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
});
exports.AsyncIterator = AsyncIterator;
exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {
if (PromiseImpl === void 0) PromiseImpl = Promise;
var iter = new AsyncIterator(wrap$1(innerFn, outerFn, self, tryLocsList), PromiseImpl);
return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
};
function makeInvokeMethod(innerFn, self, context) {
var state = GenStateSuspendedStart;
return function invoke(method, arg) {
if (state === GenStateExecuting) throw new Error("Generator is already running");
if (state === GenStateCompleted) {
if (method === "throw") throw arg;
return doneResult();
}
context.method = method;
context.arg = arg;
while (true) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel) continue;
return delegateResult;
}
}
if (context.method === "next") context.sent = context._sent = context.arg;
else if (context.method === "throw") {
if (state === GenStateSuspendedStart) {
state = GenStateCompleted;
throw context.arg;
}
context.dispatchException(context.arg);
} else if (context.method === "return") context.abrupt("return", context.arg);
state = GenStateExecuting;
var record = tryCatch(innerFn, self, context);
if (record.type === "normal") {
state = context.done ? GenStateCompleted : GenStateSuspendedYield;
if (record.arg === ContinueSentinel) continue;
return {
value: record.arg,
done: context.done
};
} else if (record.type === "throw") {
state = GenStateCompleted;
context.method = "throw";
context.arg = record.arg;
}
}
};
}
function maybeInvokeDelegate(delegate, context) {
var methodName = context.method;
var method = delegate.iterator[methodName];
if (method === undefined$1) {
context.delegate = null;
if (methodName === "throw" && delegate.iterator["return"]) {
context.method = "return";
context.arg = undefined$1;
maybeInvokeDelegate(delegate, context);
if (context.method === "throw") return ContinueSentinel;
}
if (methodName !== "return") {
context.method = "throw";
context.arg = /* @__PURE__ */ new TypeError("The iterator does not provide a '" + methodName + "' method");
}
return ContinueSentinel;
}
var record = tryCatch(method, delegate.iterator, context.arg);
if (record.type === "throw") {
context.method = "throw";
context.arg = record.arg;
context.delegate = null;
return ContinueSentinel;
}
var info = record.arg;
if (!info) {
context.method = "throw";
context.arg = /* @__PURE__ */ new TypeError("iterator result is not an object");
context.delegate = null;
return ContinueSentinel;
}
if (info.done) {
context[delegate.resultName] = info.value;
context.next = delegate.nextLoc;
if (context.method !== "return") {
context.method = "next";
context.arg = undefined$1;
}
} else return info;
context.delegate = null;
return ContinueSentinel;
}
defineIteratorMethods(Gp);
define(Gp, toStringTagSymbol, "Generator");
define(Gp, iteratorSymbol, function() {
return this;
});
define(Gp, "toString", function() {
return "[object Generator]";
});
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
if (1 in locs) entry.catchLoc = locs[1];
if (2 in locs) {
entry.finallyLoc = locs[2];
entry.afterLoc = locs[3];
}
this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal";
delete record.arg;
entry.completion = record;
}
function Context(tryLocsList) {
this.tryEntries = [{ tryLoc: "root" }];
tryLocsList.forEach(pushTryEntry, this);
this.reset(true);
}
exports.keys = function(val) {
var object = Object(val);
var keys$1 = [];
for (var key in object) keys$1.push(key);
keys$1.reverse();
return function next() {
while (keys$1.length) {
var key$1 = keys$1.pop();
if (key$1 in object) {
next.value = key$1;
next.done = false;
return next;
}
}
next.done = true;
return next;
};
};
function values$2(iterable) {
if (iterable != null) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod) return iteratorMethod.call(iterable);
if (typeof iterable.next === "function") return iterable;
if (!isNaN(iterable.length)) {
var i$1 = -1, next = function next$1() {
while (++i$1 < iterable.length) if (hasOwn.call(iterable, i$1)) {
next$1.value = iterable[i$1];
next$1.done = false;
return next$1;
}
next$1.value = undefined$1;
next$1.done = true;
return next$1;
};
return next.next = next;
}
}
throw new TypeError(typeof iterable + " is not iterable");
}
exports.values = values$2;
function doneResult() {
return {
value: undefined$1,
done: true
};
}
Context.prototype = {
constructor: Context,
reset: function(skipTempReset) {
this.prev = 0;
this.next = 0;
this.sent = this._sent = undefined$1;
this.done = false;
this.delegate = null;
this.method = "next";
this.arg = undefined$1;
this.tryEntries.forEach(resetTryEntry);
if (!skipTempReset) {
for (var name$2 in this) if (name$2.charAt(0) === "t" && hasOwn.call(this, name$2) && !isNaN(+name$2.slice(1))) this[name$2] = undefined$1;
}
},
stop: function() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if (rootRecord.type === "throw") throw rootRecord.arg;
return this.rval;
},
dispatchException: function(exception) {
if (this.done) throw exception;
var context = this;
function handle(loc, caught) {
record.type = "throw";
record.arg = exception;
context.next = loc;
if (caught) {
context.method = "next";
context.arg = undefined$1;
}
return !!caught;
}
for (var i$1 = this.tryEntries.length - 1; i$1 >= 0; --i$1) {
var entry = this.tryEntries[i$1];
var record = entry.completion;
if (entry.tryLoc === "root") return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc");
var hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, true);
else if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, true);
} else if (hasFinally) {
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
} else throw new Error("try statement without catch or finally");
}
}
},
abrupt: function(type, arg) {
for (var i$1 = this.tryEntries.length - 1; i$1 >= 0; --i$1) {
var entry = this.tryEntries[i$1];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) finallyEntry = null;
var record = finallyEntry ? finallyEntry.completion : {};
record.type = type;
record.arg = arg;
if (finallyEntry) {
this.method = "next";
this.next = finallyEntry.finallyLoc;
return ContinueSentinel;
}
return this.complete(record);
},
complete: function(record, afterLoc) {
if (record.type === "throw") throw record.arg;
if (record.type === "break" || record.type === "continue") this.next = record.arg;
else if (record.type === "return") {
this.rval = this.arg = record.arg;
this.method = "return";
this.next = "end";
} else if (record.type === "normal" && afterLoc) this.next = afterLoc;
return ContinueSentinel;
},
finish: function(finallyLoc) {
for (var i$1 = this.tryEntries.length - 1; i$1 >= 0; --i$1) {
var entry = this.tryEntries[i$1];
if (entry.finallyLoc === finallyLoc) {
this.complete(entry.completion, entry.afterLoc);
resetTryEntry(entry);
return ContinueSentinel;
}
}
},
"catch": function(tryLoc) {
for (var i$1 = this.tryEntries.length - 1; i$1 >= 0; --i$1) {
var entry = this.tryEntries[i$1];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if (record.type === "throw") {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function(iterable, resultName, nextLoc) {
this.delegate = {
iterator: values$2(iterable),
resultName,
nextLoc
};
if (this.method === "next") this.arg = undefined$1;
return ContinueSentinel;
}
};
return exports;
}(typeof module === "object" ? module.exports : {});
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
if (typeof globalThis === "object") globalThis.regeneratorRuntime = runtime;
else Function("r", "regeneratorRuntime = r")(runtime);
}
})))();
const GlobalComponentsPlugin = { install(app$1) {
const messageService = useMessage();
app$1.use(N8nPlugin, {});
app$1.use(ElLoading);
app$1.config.globalProperties.$loading = ElLoading.service;
app$1.config.globalProperties.$msgbox = ElMessageBox;
app$1.config.globalProperties.$alert = messageService.alert;
app$1.config.globalProperties.$confirm = messageService.confirm;
app$1.config.globalProperties.$prompt = messageService.prompt;
app$1.config.globalProperties.$message = messageService.message;
} };
function touchX(event) {
if (event.type.indexOf("mouse") !== -1) return event.clientX;
return event.touches[0].clientX;
}
function touchY(event) {
if (event.type.indexOf("mouse") !== -1) return event.clientY;
return event.touches[0].clientY;
}
var isPassiveSupported = (function() {
var supportsPassive = false;
try {
var opts = Object.defineProperty({}, "passive", { get: function() {
supportsPassive = true;
} });
window.addEventListener("test", null, opts);
} catch (e) {}
return supportsPassive;
})();
var vue3_touch_events_default = { install: function(app$1, constructorOptions) {
var globalOptions = Object.assign({}, {
disableClick: false,
tapTolerance: 10,
swipeTolerance: 30,
touchHoldTolerance: 400,
longTapTimeInterval: 400,
touchClass: "",
dragFrequency: 100,
rollOverFrequency: 100
}, constructorOptions);
function touchStartEvent(event) {
var $this = this.$$touchObj, isTouchEvent = event.type.indexOf("touch") >= 0, isMouseEvent = event.type.indexOf("mouse") >= 0, $el = this;
if (isTouchEvent) $this.lastTouchStartTime = event.timeStamp;
if (isMouseEvent && $this.lastTouchStartTime && event.timeStamp - $this.lastTouchStartTime < 350) return;
if ($this.touchStarted) return;
addTouchClass(this);
$this.touchStarted = true;
$this.touchMoved = false;
$this.swipeOutBounded = false;
$this.startX = touchX(event);
$this.startY = touchY(event);
$this.currentX = 0;
$this.currentY = 0;
$this.touchStartTime = event.timeStamp;
$this.hasSwipe = hasEvent(this, "swipe") || hasEvent(this, "swipe.left") || hasEvent(this, "swipe.right") || hasEvent(this, "swipe.top") || hasEvent(this, "swipe.bottom");
if (hasEvent(this, "hold")) $this.touchHoldTimer = setTimeout(function() {
$this.touchHoldTimer = null;
triggerEvent(event, $el, "hold");
}, $this.options.touchHoldTolerance);
triggerEvent(event, this, "press");
}
function touchMoveEvent(event) {
var $this = this.$$touchObj;
var curX = touchX(event);
var curY = touchY(event);
var movedAgain = $this.currentX != curX || $this.currentY != curY;
$this.currentX = curX;
$this.currentY = curY;
if (!$this.touchMoved) {
var tapTolerance = $this.options.tapTolerance;
$this.touchMoved = Math.abs($this.startX - $this.currentX) > tapTolerance || Math.abs($this.startY - $this.currentY) > tapTolerance;
if ($this.touchMoved) {
cancelTouchHoldTimer($this);
triggerEvent(event, this, "drag.once");
}
} else if ($this.hasSwipe && !$this.swipeOutBounded) {
var swipeOutBounded = $this.options.swipeTolerance;
$this.swipeOutBounded = Math.abs($this.startX - $this.currentX) > swipeOutBounded && Math.abs($this.startY - $this.currentY) > swipeOutBounded;
}
if (hasEvent(this, "rollover") && movedAgain) {
var now = event.timeStamp;
var throttle = $this.options.rollOverFrequency;
if ($this.touchRollTime == null || now > $this.touchRollTime + throttle) {
$this.touchRollTime = now;
triggerEvent(event, this, "rollover");
}
}
if (hasEvent(this, "drag") && $this.touchStarted && $this.touchMoved && movedAgain) {
var now = event.timeStamp;
var throttle = $this.options.dragFrequency;
if ($this.touchDragTime == null || now > $this.touchDragTime + throttle) {
$this.touchDragTime = now;
triggerEvent(event, this, "drag");
}
}
}
function touchCancelEvent() {
var $this = this.$$touchObj;
cancelTouchHoldTimer($this);
removeTouchClass(this);
$this.touchStarted = $this.touchMoved = false;
$this.startX = $this.startY = 0;
}
function touchEndEvent(event) {
var $this = this.$$touchObj, isTouchEvent = event.type.indexOf("touch") >= 0, isMouseEvent = event.type.indexOf("mouse") >= 0;
if (isTouchEvent) $this.lastTouchEndTime = event.timeStamp;
var touchholdEnd = isTouchEvent && !$this.touchHoldTimer;
cancelTouchHoldTimer($this);
$this.touchStarted = false;
removeTouchClass(this);
if (isMouseEvent && $this.lastTouchEndTime && event.timeStamp - $this.lastTouchEndTime < 350) return;
triggerEvent(event, this, "release");
if (!$this.touchMoved) if (hasEvent(this, "longtap") && event.timeStamp - $this.touchStartTime > $this.options.longTapTimeInterval) {
if (event.cancelable) event.preventDefault();
triggerEvent(event, this, "longtap");
} else if (hasEvent(this, "hold") && touchholdEnd) {
if (event.cancelable) event.preventDefault();
return;
} else triggerEvent(event, this, "tap");
else if ($this.hasSwipe && !$this.swipeOutBounded) {
var swipeOutBounded = $this.options.swipeTolerance, direction, distanceY = Math.abs($this.startY - $this.currentY), distanceX = Math.abs($this.startX - $this.currentX);
if (distanceY > swipeOutBounded || distanceX > swipeOutBounded) {
if (distanceY > swipeOutBounded) direction = $this.startY > $this.currentY ? "top" : "bottom";
else direction = $this.startX > $this.currentX ? "left" : "right";
if (hasEvent(this, "swipe." + direction)) triggerEvent(event, this, "swipe." + direction, direction);
else triggerEvent(event, this, "swipe", direction);
}
}
}
function mouseEnterEvent() {
addTouchClass(this);
}
function mouseLeaveEvent() {
removeTouchClass(this);
}
function hasEvent($el, eventType) {
var callbacks = $el.$$touchObj.callbacks[eventType];
return callbacks != null && callbacks.length > 0;
}
function triggerEvent(e, $el, eventType, param) {
var callbacks = $el.$$touchObj.callbacks[eventType];
if (callbacks == null || callbacks.length === 0) return null;
for (var i$1 = 0; i$1 < callbacks.length; i$1++) {
var binding = callbacks[i$1];
if (binding.modifiers.stop) e.stopPropagation();
if (binding.modifiers.prevent) e.preventDefault();
if (binding.modifiers.self && e.target !== e.currentTarget) continue;
if (typeof binding.value === "function") if (param) binding.value(param, e);
else binding.value(e);
}
}
function addTouchClass($el) {
var className = $el.$$touchObj.options.touchClass;
className && $el.classList.add(className);
}
function removeTouchClass($el) {
var className = $el.$$touchObj.options.touchClass;
className && $el.classList.remove(className);
}
function cancelTouchHoldTimer($this) {
if ($this.touchHoldTimer) {
clearTimeout($this.touchHoldTimer);
$this.touchHoldTimer = null;
}
}
function buildTouchObj($el, extraOptions) {
var touchObj = $el.$$touchObj || {
callbacks: {},
hasBindTouchEvents: false,
options: globalOptions
};
if (extraOptions) touchObj.options = Object.assign({}, touchObj.options, extraOptions);
$el.$$touchObj = touchObj;
return $el.$$touchObj;
}
app$1.directive("touch", {
beforeMount: function($el, binding) {
var $this = buildTouchObj($el);
var passiveOpt = isPassiveSupported ? { passive: true } : false;
var eventType = binding.arg || "tap";
switch (eventType) {
case "swipe":
var _m = binding.modifiers;
if (_m.left || _m.right || _m.top || _m.bottom) {
for (var i$1 in binding.modifiers) if ([
"left",
"right",
"top",
"bottom"
].indexOf(i$1) >= 0) {
var _e$1 = "swipe." + i$1;
$this.callbacks[_e$1] = $this.callbacks[_e$1] || [];
$this.callbacks[_e$1].push(binding);
}
} else {
$this.callbacks.swipe = $this.callbacks.swipe || [];
$this.callbacks.swipe.push(binding);
}
break;
case "press":
case "drag": if (binding.modifiers.disablePassive) passiveOpt = false;
default:
$this.callbacks[eventType] = $this.callbacks[eventType] || [];
$this.callbacks[eventType].push(binding);
}
if ($this.hasBindTouchEvents) return;
$el.addEventListener("touchstart", touchStartEvent, passiveOpt);
$el.addEventListener("touchmove", touchMoveEvent, passiveOpt);
$el.addEventListener("touchcancel", touchCancelEvent);
$el.addEventListener("touchend", touchEndEvent);
if (!$this.options.disableClick) {
$el.addEventListener("mousedown", touchStartEvent);
$el.addEventListener("mousemove", touchMoveEvent);
$el.addEventListener("mouseup", touchEndEvent);
$el.addEventListener("mouseenter", mouseEnterEvent);
$el.addEventListener("mouseleave", mouseLeaveEvent);
}
$this.hasBindTouchEvents = true;
},
unmounted: function($el) {
$el.removeEventListener("touchstart", touchStartEvent);
$el.removeEventListener("touchmove", touchMoveEvent);
$el.removeEventListener("touchcancel", touchCancelEvent);
$el.removeEventListener("touchend", touchEndEvent);
if ($el.$$touchObj && !$el.$$touchObj.options.disableClick) {
$el.removeEventListener("mousedown", touchStartEvent);
$el.removeEventListener("mousemove", touchMoveEvent);
$el.removeEventListener("mouseup", touchEndEvent);
$el.removeEventListener("mouseenter", mouseEnterEvent);
$el.removeEventListener("mouseleave", mouseLeaveEvent);
}
delete $el.$$touchObj;
}
});
app$1.directive("touch-class", { beforeMount: function($el, binding) {
buildTouchObj($el, { touchClass: binding.value });
} });
app$1.directive("touch-options", { beforeMount: function($el, binding) {
buildTouchObj($el, binding.value);
} });
} };
const GlobalDirectivesPlugin = { install(app$1) {
app$1.use(vue3_touch_events_default);
} };
const ChartJSPlugin = { install: () => {
Chart.register(CategoryScale, LinearScale, BarElement, LineElement, PointElement, plugin_title, plugin_tooltip, plugin_legend, LineController);
} };
var ignoredErrors = [
{ instanceof: AxiosError },
{
instanceof: ResponseError,
message: /ECONNREFUSED/
},
{
instanceof: ResponseError,
message: "Can't connect to n8n."
},
{
instanceof: ResponseError,
message: "Unauthorized"
},
{
instanceof: RangeError,
message: /Position \d+ is out of range for changeset of length \d+/
},
{
instanceof: RangeError,
message: /Invalid change range \d+ to \d+/
},
{
instanceof: RangeError,
message: /Selection points outside of document$/
},
{
instanceof: Error,
message: /ResizeObserver/
}
];
function beforeSend(event, { originalException }) {
if (!originalException || ignoredErrors.some((entry) => {
if (!(originalException instanceof entry.instanceof)) return false;
if ("message" in entry) if (entry.message instanceof RegExp) return entry.message.test(originalException.message ?? "");
else return originalException.message === entry.message;
return true;
})) return null;
return event;
}
const SentryPlugin = { install: (app$1) => {
const sentryConfig = getAndParseConfigFromMetaTag("sentry");
if (!sentryConfig?.dsn) return;
const { dsn, release, environment, serverName } = sentryConfig;
init$1({
app: app$1,
dsn,
release,
environment,
integrations: [captureConsoleIntegration({ levels: ["error"] }), rewriteFramesIntegration({
prefix: "",
root: window.location.origin + "/"
})],
beforeSend
});
if (serverName) setTag("server_name", serverName);
} };
var pinia = createPinia();
var app = createApp(App_default);
app.use(SentryPlugin);
registerModuleRoutes(router_default);
app.use(TelemetryPlugin);
app.use(PiniaVuePlugin);
app.use(GlobalComponentsPlugin);
app.use(GlobalDirectivesPlugin);
app.use(pinia);
app.use(router_default);
app.use(i18nInstance);
app.use(ChartJSPlugin);
app.mount("#app");