@n8n/stores 2.32.2 → 2.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/cloudPlan.store.cjs +7 -0
  2. package/dist/cloudPlan.store.d.cts +534 -0
  3. package/dist/cloudPlan.store.d.mts +534 -0
  4. package/dist/cloudPlan.store.mjs +7 -0
  5. package/dist/cloudPlan2.store.cjs +247 -0
  6. package/dist/cloudPlan2.store.cjs.map +1 -0
  7. package/dist/cloudPlan2.store.mjs +242 -0
  8. package/dist/cloudPlan2.store.mjs.map +1 -0
  9. package/dist/composables/useBasePageRedirectionHelper.cjs +87 -0
  10. package/dist/composables/useBasePageRedirectionHelper.cjs.map +1 -0
  11. package/dist/composables/useBasePageRedirectionHelper.d.cts +16 -0
  12. package/dist/composables/useBasePageRedirectionHelper.d.mts +16 -0
  13. package/dist/composables/useBasePageRedirectionHelper.mjs +87 -0
  14. package/dist/composables/useBasePageRedirectionHelper.mjs.map +1 -0
  15. package/dist/constants2.cjs +2 -0
  16. package/dist/constants2.cjs.map +1 -1
  17. package/dist/constants2.d.cts +2 -0
  18. package/dist/constants2.d.mts +2 -0
  19. package/dist/constants2.mjs +2 -0
  20. package/dist/constants2.mjs.map +1 -1
  21. package/dist/invitation.api.cjs +4 -0
  22. package/dist/invitation.api.d.cts +2 -0
  23. package/dist/invitation.api.d.mts +2 -0
  24. package/dist/invitation.api.mjs +3 -0
  25. package/dist/invitation2.api.cjs +26 -0
  26. package/dist/invitation2.api.cjs.map +1 -0
  27. package/dist/invitation2.api.d.cts +30 -0
  28. package/dist/invitation2.api.d.mts +30 -0
  29. package/dist/invitation2.api.mjs +14 -0
  30. package/dist/invitation2.api.mjs.map +1 -0
  31. package/dist/modalOpeners.cjs +0 -0
  32. package/dist/modalOpeners.d.cts +2 -0
  33. package/dist/modalOpeners.d.mts +2 -0
  34. package/dist/modalOpeners.mjs +1 -0
  35. package/dist/modalOpeners2.d.cts +11 -0
  36. package/dist/modalOpeners2.d.mts +11 -0
  37. package/dist/notifications.store.cjs +27 -0
  38. package/dist/notifications.store.cjs.map +1 -0
  39. package/dist/notifications.store.d.cts +15 -0
  40. package/dist/notifications.store.d.mts +15 -0
  41. package/dist/notifications.store.mjs +26 -0
  42. package/dist/notifications.store.mjs.map +1 -0
  43. package/dist/onboarding.api.cjs +3 -0
  44. package/dist/onboarding.api.d.cts +7 -0
  45. package/dist/onboarding.api.d.mts +7 -0
  46. package/dist/onboarding.api.mjs +3 -0
  47. package/dist/onboarding2.api.cjs +24 -0
  48. package/dist/onboarding2.api.cjs.map +1 -0
  49. package/dist/onboarding2.api.mjs +18 -0
  50. package/dist/onboarding2.api.mjs.map +1 -0
  51. package/dist/pageRedirection.d.cts +6 -0
  52. package/dist/pageRedirection.d.mts +6 -0
  53. package/dist/rbac.store.cjs +2 -1
  54. package/dist/rbac.store.cjs.map +1 -1
  55. package/dist/rbac.store.d.cts +123 -123
  56. package/dist/rbac.store.d.mts +124 -124
  57. package/dist/rbac.store.mjs +1 -1
  58. package/dist/roles.store.cjs +88 -0
  59. package/dist/roles.store.cjs.map +1 -0
  60. package/dist/roles.store.d.cts +637 -0
  61. package/dist/roles.store.d.mts +637 -0
  62. package/dist/roles.store.mjs +87 -0
  63. package/dist/roles.store.mjs.map +1 -0
  64. package/dist/settings.store.cjs +6 -0
  65. package/dist/settings.store.d.cts +3801 -0
  66. package/dist/settings.store.d.mts +3801 -0
  67. package/dist/settings.store.mjs +6 -0
  68. package/dist/settings2.store.cjs +387 -0
  69. package/dist/settings2.store.cjs.map +1 -0
  70. package/dist/settings2.store.mjs +348 -0
  71. package/dist/settings2.store.mjs.map +1 -0
  72. package/dist/types/pageRedirection.cjs +0 -0
  73. package/dist/types/pageRedirection.d.cts +2 -0
  74. package/dist/types/pageRedirection.d.mts +2 -0
  75. package/dist/types/pageRedirection.mjs +1 -0
  76. package/dist/useAgentRequestStore.cjs +1 -0
  77. package/dist/useAgentRequestStore.cjs.map +1 -1
  78. package/dist/useAgentRequestStore.d.cts +1 -1
  79. package/dist/useAgentRequestStore.d.mts +6 -6
  80. package/dist/useRootStore.cjs +4 -182
  81. package/dist/useRootStore.d.cts +73 -73
  82. package/dist/useRootStore.d.mts +73 -73
  83. package/dist/useRootStore.mjs +4 -182
  84. package/dist/useRootStore2.cjs +189 -0
  85. package/dist/useRootStore2.cjs.map +1 -0
  86. package/dist/useRootStore2.mjs +183 -0
  87. package/dist/useRootStore2.mjs.map +1 -0
  88. package/dist/users.store.cjs +9 -0
  89. package/dist/users.store.d.cts +552 -0
  90. package/dist/users.store.d.mts +552 -0
  91. package/dist/users.store.mjs +9 -0
  92. package/dist/users2.store.cjs +362 -0
  93. package/dist/users2.store.cjs.map +1 -0
  94. package/dist/users2.store.mjs +353 -0
  95. package/dist/users2.store.mjs.map +1 -0
  96. package/dist/versions.store.cjs +11 -0
  97. package/dist/versions.store.d.cts +384 -0
  98. package/dist/versions.store.d.mts +384 -0
  99. package/dist/versions.store.mjs +10 -0
  100. package/dist/versions2.store.cjs +230 -0
  101. package/dist/versions2.store.cjs.map +1 -0
  102. package/dist/versions2.store.mjs +218 -0
  103. package/dist/versions2.store.mjs.map +1 -0
  104. package/package.json +13 -6
  105. package/dist/useRootStore.cjs.map +0 -1
  106. package/dist/useRootStore.mjs.map +0 -1
@@ -0,0 +1,218 @@
1
+ import { t as STORES } from "./constants2.mjs";
2
+ import { t as useRootStore } from "./useRootStore2.mjs";
3
+ import { t as useSettingsStore } from "./settings2.store.mjs";
4
+ import { t as useUsersStore } from "./users2.store.mjs";
5
+ import { defineStore } from "pinia";
6
+ import { computed, ref } from "vue";
7
+ import { jsonParse } from "n8n-workflow";
8
+ import { useStorage } from "@n8n/composables/useStorage";
9
+ import { useTelemetry } from "@n8n/composables/useTelemetry";
10
+ import { useToast } from "@n8n/composables/useToast";
11
+ import { LOCAL_STORAGE_DISMISSED_WHATS_NEW_CALLOUT, LOCAL_STORAGE_READ_WHATS_NEW_ARTICLES, VERSIONS_MODAL_KEY, WHATS_NEW_MODAL_KEY } from "@n8n/frontend-constants/versions";
12
+ import * as versionsApi from "@n8n/rest-api-client/api/versions";
13
+
14
+ //#region src/versions.store.ts
15
+ /**
16
+ * Semantic versioning 2.0.0, Regex from https://semver.org/
17
+ * Capture groups: major, minor, patch, prerelease, buildmetadata
18
+ */
19
+ const SEMVER_REGEX = /^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
20
+ const useVersionsStore = defineStore(STORES.VERSIONS, () => {
21
+ const versionNotificationSettings = ref({
22
+ enabled: false,
23
+ whatsNewEnabled: false,
24
+ endpoint: "",
25
+ whatsNewEndpoint: "",
26
+ infoUrl: ""
27
+ });
28
+ const nextVersions = ref([]);
29
+ const currentVersion = ref();
30
+ const whatsNew = ref({
31
+ title: "",
32
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
33
+ updatedAt: null,
34
+ calloutText: "",
35
+ footer: "",
36
+ items: []
37
+ });
38
+ const whatsNewCallout = ref();
39
+ const telemetry = useTelemetry();
40
+ const { showToast, showMessage } = useToast();
41
+ const settingsStore = useSettingsStore();
42
+ const usersStore = useUsersStore();
43
+ const warnModalOpenerMissing = (action) => {
44
+ if (import.meta.env.DEV) console.warn(`[versions.store] ${action} called before modal openers were registered; ignoring. Call registerModalOpeners() at app bootstrap.`);
45
+ };
46
+ const modalOpeners = ref({
47
+ openModal: (name) => warnModalOpenerMissing(`openModal(${String(name)})`),
48
+ openModalWithData: (payload) => warnModalOpenerMissing(`openModalWithData(${String(payload.name)})`)
49
+ });
50
+ const registerModalOpeners = (openers) => {
51
+ modalOpeners.value = openers;
52
+ };
53
+ const readWhatsNewArticlesStorage = useStorage(LOCAL_STORAGE_READ_WHATS_NEW_ARTICLES);
54
+ const lastDismissedWhatsNewCalloutStorage = useStorage(LOCAL_STORAGE_DISMISSED_WHATS_NEW_CALLOUT);
55
+ const hasVersionUpdates = computed(() => {
56
+ return settingsStore.settings.releaseChannel === "stable" && nextVersions.value.length > 0;
57
+ });
58
+ const hasSignificantUpdates = computed(() => {
59
+ if (!hasVersionUpdates.value || !currentVersion.value || !latestVersion.value) return false;
60
+ if (currentVersion.value.hasSecurityIssue) return true;
61
+ const current = currentVersion.value.name.match(SEMVER_REGEX);
62
+ const latest = latestVersion.value.name.match(SEMVER_REGEX);
63
+ if (!current?.groups || !latest?.groups) return false;
64
+ if (Number(current.groups.major) !== Number(latest.groups.major)) return true;
65
+ const currentMinor = Number(current.groups.minor);
66
+ return Number(latest.groups.minor) - currentMinor >= 2;
67
+ });
68
+ const latestVersion = computed(() => {
69
+ return nextVersions.value[0] ?? currentVersion.value;
70
+ });
71
+ const areNotificationsEnabled = computed(() => {
72
+ return versionNotificationSettings.value.enabled;
73
+ });
74
+ const infoUrl = computed(() => {
75
+ return versionNotificationSettings.value.infoUrl;
76
+ });
77
+ const readWhatsNewArticles = computed(() => {
78
+ return readWhatsNewArticlesStorage.value ? jsonParse(readWhatsNewArticlesStorage.value, { fallbackValue: [] }) : [];
79
+ });
80
+ const lastDismissedWhatsNewCallout = computed(() => {
81
+ return lastDismissedWhatsNewCalloutStorage.value ? jsonParse(lastDismissedWhatsNewCalloutStorage.value, { fallbackValue: [] }) : [];
82
+ });
83
+ const whatsNewArticles = computed(() => {
84
+ return whatsNew.value.items;
85
+ });
86
+ const fetchVersions = async () => {
87
+ try {
88
+ const { enabled, endpoint } = versionNotificationSettings.value;
89
+ if (enabled && endpoint) {
90
+ const rootStore = useRootStore();
91
+ const current = rootStore.versionCli;
92
+ const instanceId = rootStore.instanceId;
93
+ setVersions({
94
+ versions: await versionsApi.getNextVersions(endpoint, current, instanceId),
95
+ currentVersion: current
96
+ });
97
+ }
98
+ } catch (e) {
99
+ console.error("Failed to fetch versions:", e);
100
+ }
101
+ };
102
+ const setVersions = (params) => {
103
+ nextVersions.value = params.versions.filter((v) => v.name !== params.currentVersion);
104
+ currentVersion.value = params.versions.find((v) => v.name === params.currentVersion);
105
+ };
106
+ const setWhatsNew = (section) => {
107
+ whatsNew.value = section;
108
+ };
109
+ const setWhatsNewArticleRead = (articleId) => {
110
+ if (!readWhatsNewArticles.value.includes(articleId)) readWhatsNewArticlesStorage.value = JSON.stringify([...readWhatsNewArticles.value, articleId]);
111
+ };
112
+ const isWhatsNewArticleRead = (articleId) => {
113
+ return readWhatsNewArticles.value.includes(articleId);
114
+ };
115
+ const closeWhatsNewCallout = () => {
116
+ whatsNewCallout.value?.close();
117
+ whatsNewCallout.value = void 0;
118
+ };
119
+ const dismissWhatsNewCallout = () => {
120
+ lastDismissedWhatsNewCalloutStorage.value = JSON.stringify(whatsNewArticles.value.map((item) => item.id));
121
+ };
122
+ const shouldShowWhatsNewCallout = () => {
123
+ const createdAt = usersStore.currentUser?.createdAt;
124
+ let hasNewArticle = false;
125
+ if (createdAt) {
126
+ const userCreatedAt = new Date(createdAt).getTime();
127
+ hasNewArticle = whatsNewArticles.value.some((item) => {
128
+ return (item.updatedAt ? new Date(item.updatedAt).getTime() : 0) > userCreatedAt;
129
+ });
130
+ } else hasNewArticle = true;
131
+ const allArticlesDismissed = whatsNewArticles.value.every((item) => lastDismissedWhatsNewCallout.value.includes(item.id));
132
+ return hasNewArticle && !allArticlesDismissed;
133
+ };
134
+ const fetchWhatsNew = async () => {
135
+ try {
136
+ const { enabled, whatsNewEnabled, whatsNewEndpoint } = versionNotificationSettings.value;
137
+ if (enabled && whatsNewEnabled && whatsNewEndpoint) {
138
+ const rootStore = useRootStore();
139
+ const current = rootStore.versionCli;
140
+ const instanceId = rootStore.instanceId;
141
+ const section = await versionsApi.getWhatsNewSection(whatsNewEndpoint, current, instanceId);
142
+ if (section.items?.length > 0) {
143
+ setWhatsNew(section);
144
+ if (shouldShowWhatsNewCallout()) {
145
+ whatsNewCallout.value = showMessage({
146
+ title: whatsNew.value.title,
147
+ message: whatsNew.value.calloutText,
148
+ duration: 0,
149
+ position: "bottom-left",
150
+ customClass: "clickable whats-new-notification",
151
+ onClick: () => {
152
+ const articleId = whatsNew.value.items[0]?.id ?? 0;
153
+ telemetry.track("User clicked on what's new notification", { article_id: articleId });
154
+ modalOpeners.value.openModalWithData({
155
+ name: WHATS_NEW_MODAL_KEY,
156
+ data: { articleId }
157
+ });
158
+ }
159
+ });
160
+ dismissWhatsNewCallout();
161
+ }
162
+ }
163
+ }
164
+ } catch (e) {
165
+ console.error("Failed to fetch Whats New section:", e);
166
+ }
167
+ };
168
+ const initialize = (settings) => {
169
+ versionNotificationSettings.value = settings;
170
+ };
171
+ const checkForNewVersions = async () => {
172
+ if (!areNotificationsEnabled.value) return;
173
+ await Promise.all([fetchVersions(), fetchWhatsNew()]);
174
+ if (currentVersion.value && currentVersion.value.hasSecurityIssue && nextVersions.value.length) {
175
+ const fixVersion = currentVersion.value.securityIssueFixVersion;
176
+ let message = "Please update to latest version.";
177
+ if (fixVersion) message = `Please update to version ${fixVersion} or higher.`;
178
+ message = `${message} <a class="primary-color">More info</a>`;
179
+ showToast({
180
+ title: "Critical update available",
181
+ message,
182
+ onClick: () => {
183
+ modalOpeners.value.openModal(VERSIONS_MODAL_KEY);
184
+ },
185
+ closeOnClick: true,
186
+ customClass: "clickable",
187
+ type: "warning",
188
+ duration: 0
189
+ });
190
+ }
191
+ };
192
+ return {
193
+ currentVersion,
194
+ latestVersion,
195
+ nextVersions,
196
+ hasVersionUpdates,
197
+ hasSignificantUpdates,
198
+ areNotificationsEnabled,
199
+ infoUrl,
200
+ fetchVersions,
201
+ setVersions,
202
+ initialize,
203
+ registerModalOpeners,
204
+ checkForNewVersions,
205
+ fetchWhatsNew,
206
+ whatsNew,
207
+ whatsNewArticles,
208
+ isWhatsNewArticleRead,
209
+ setWhatsNewArticleRead,
210
+ closeWhatsNewCallout,
211
+ shouldShowWhatsNewCallout,
212
+ dismissWhatsNewCallout
213
+ };
214
+ });
215
+
216
+ //#endregion
217
+ export { useVersionsStore as n, SEMVER_REGEX as t };
218
+ //# sourceMappingURL=versions2.store.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions2.store.mjs","names":[],"sources":["../src/versions.store.ts"],"sourcesContent":["import type { IVersionNotificationSettings } from '@n8n/api-types';\nimport { useStorage } from '@n8n/composables/useStorage';\nimport { useTelemetry } from '@n8n/composables/useTelemetry';\nimport { useToast, type NotificationHandle } from '@n8n/composables/useToast';\nimport {\n\tLOCAL_STORAGE_DISMISSED_WHATS_NEW_CALLOUT,\n\tLOCAL_STORAGE_READ_WHATS_NEW_ARTICLES,\n\tVERSIONS_MODAL_KEY,\n\tWHATS_NEW_MODAL_KEY,\n} from '@n8n/frontend-constants/versions';\nimport * as versionsApi from '@n8n/rest-api-client/api/versions';\nimport type { Version, WhatsNewSection } from '@n8n/rest-api-client/api/versions';\nimport { jsonParse } from 'n8n-workflow';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\nimport { STORES } from './constants';\nimport type { ModalOpeners } from './modalOpeners';\nimport { useSettingsStore } from './settings.store';\nimport { useRootStore } from './useRootStore';\nimport { useUsersStore } from './users.store';\n\ntype SetVersionParams = { versions: Version[]; currentVersion: string };\n\n/**\n * Semantic versioning 2.0.0, Regex from https://semver.org/\n * Capture groups: major, minor, patch, prerelease, buildmetadata\n */\nexport const SEMVER_REGEX =\n\t/^(?<major>0|[1-9]\\d*)\\.(?<minor>0|[1-9]\\d*)\\.(?<patch>0|[1-9]\\d*)(?:-(?<prerelease>(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nexport const useVersionsStore = defineStore(STORES.VERSIONS, () => {\n\tconst versionNotificationSettings = ref<IVersionNotificationSettings>({\n\t\tenabled: false,\n\t\twhatsNewEnabled: false,\n\t\tendpoint: '',\n\t\twhatsNewEndpoint: '',\n\t\tinfoUrl: '',\n\t});\n\tconst nextVersions = ref<Version[]>([]);\n\tconst currentVersion = ref<Version | undefined>();\n\tconst whatsNew = ref<WhatsNewSection>({\n\t\ttitle: '',\n\t\tcreatedAt: new Date().toISOString(),\n\t\tupdatedAt: null,\n\t\tcalloutText: '',\n\t\tfooter: '',\n\t\titems: [],\n\t});\n\tconst whatsNewCallout = ref<NotificationHandle | undefined>();\n\n\tconst telemetry = useTelemetry();\n\tconst { showToast, showMessage } = useToast();\n\tconst settingsStore = useSettingsStore();\n\tconst usersStore = useUsersStore();\n\n\t// Modal-open actions, registered at app bootstrap (see app/init.ts). Until then\n\t// they no-op — warning in dev — so the store never reaches into `ui.store`.\n\tconst warnModalOpenerMissing = (action: string) => {\n\t\tif (import.meta.env.DEV) {\n\t\t\tconsole.warn(\n\t\t\t\t`[versions.store] ${action} called before modal openers were registered; ignoring. Call registerModalOpeners() at app bootstrap.`,\n\t\t\t);\n\t\t}\n\t};\n\tconst modalOpeners = ref<ModalOpeners>({\n\t\topenModal: (name) => warnModalOpenerMissing(`openModal(${String(name)})`),\n\t\topenModalWithData: (payload) =>\n\t\t\twarnModalOpenerMissing(`openModalWithData(${String(payload.name)})`),\n\t});\n\tconst registerModalOpeners = (openers: ModalOpeners) => {\n\t\tmodalOpeners.value = openers;\n\t};\n\tconst readWhatsNewArticlesStorage = useStorage(LOCAL_STORAGE_READ_WHATS_NEW_ARTICLES);\n\tconst lastDismissedWhatsNewCalloutStorage = useStorage(LOCAL_STORAGE_DISMISSED_WHATS_NEW_CALLOUT);\n\n\t// ---------------------------------------------------------------------------\n\t// #region Computed\n\t// ---------------------------------------------------------------------------\n\n\tconst hasVersionUpdates = computed(() => {\n\t\treturn settingsStore.settings.releaseChannel === 'stable' && nextVersions.value.length > 0;\n\t});\n\n\tconst hasSignificantUpdates = computed(() => {\n\t\tif (!hasVersionUpdates.value || !currentVersion.value || !latestVersion.value) return false;\n\n\t\t// Always consider security issues as significant updates\n\t\tif (currentVersion.value.hasSecurityIssue) return true;\n\n\t\tconst current = currentVersion.value.name.match(SEMVER_REGEX);\n\t\tconst latest = latestVersion.value.name.match(SEMVER_REGEX);\n\n\t\tif (!current?.groups || !latest?.groups) return false;\n\n\t\t// Major change is always significant\n\t\tif (Number(current.groups.major) !== Number(latest.groups.major)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst currentMinor = Number(current.groups.minor);\n\t\tconst latestMinor = Number(latest.groups.minor);\n\n\t\t// Otherwise two minor versions is enough to be considered significant\n\t\treturn latestMinor - currentMinor >= 2;\n\t});\n\n\tconst latestVersion = computed(() => {\n\t\treturn nextVersions.value[0] ?? currentVersion.value;\n\t});\n\n\tconst areNotificationsEnabled = computed(() => {\n\t\treturn versionNotificationSettings.value.enabled;\n\t});\n\n\tconst infoUrl = computed(() => {\n\t\treturn versionNotificationSettings.value.infoUrl;\n\t});\n\n\tconst readWhatsNewArticles = computed((): number[] => {\n\t\treturn readWhatsNewArticlesStorage.value\n\t\t\t? jsonParse(readWhatsNewArticlesStorage.value, { fallbackValue: [] })\n\t\t\t: [];\n\t});\n\n\tconst lastDismissedWhatsNewCallout = computed((): number[] => {\n\t\treturn lastDismissedWhatsNewCalloutStorage.value\n\t\t\t? jsonParse(lastDismissedWhatsNewCalloutStorage.value, { fallbackValue: [] })\n\t\t\t: [];\n\t});\n\n\tconst whatsNewArticles = computed(() => {\n\t\treturn whatsNew.value.items;\n\t});\n\n\t// #endregion\n\n\t// ---------------------------------------------------------------------------\n\t// #region Methods\n\t// ---------------------------------------------------------------------------\n\n\tconst fetchVersions = async () => {\n\t\ttry {\n\t\t\tconst { enabled, endpoint } = versionNotificationSettings.value;\n\t\t\tif (enabled && endpoint) {\n\t\t\t\tconst rootStore = useRootStore();\n\t\t\t\tconst current = rootStore.versionCli;\n\t\t\t\tconst instanceId = rootStore.instanceId;\n\t\t\t\tconst versions = await versionsApi.getNextVersions(endpoint, current, instanceId);\n\t\t\t\tsetVersions({ versions, currentVersion: current });\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('Failed to fetch versions:', e);\n\t\t}\n\t};\n\n\tconst setVersions = (params: SetVersionParams) => {\n\t\tnextVersions.value = params.versions.filter((v) => v.name !== params.currentVersion);\n\t\tcurrentVersion.value = params.versions.find((v) => v.name === params.currentVersion);\n\t};\n\n\tconst setWhatsNew = (section: WhatsNewSection) => {\n\t\twhatsNew.value = section;\n\t};\n\n\tconst setWhatsNewArticleRead = (articleId: number) => {\n\t\tif (!readWhatsNewArticles.value.includes(articleId)) {\n\t\t\treadWhatsNewArticlesStorage.value = JSON.stringify([\n\t\t\t\t...readWhatsNewArticles.value,\n\t\t\t\tarticleId,\n\t\t\t]);\n\t\t}\n\t};\n\n\tconst isWhatsNewArticleRead = (articleId: number): boolean => {\n\t\treturn readWhatsNewArticles.value.includes(articleId);\n\t};\n\n\tconst closeWhatsNewCallout = () => {\n\t\twhatsNewCallout.value?.close();\n\t\twhatsNewCallout.value = undefined;\n\t};\n\n\tconst dismissWhatsNewCallout = () => {\n\t\tlastDismissedWhatsNewCalloutStorage.value = JSON.stringify(\n\t\t\twhatsNewArticles.value.map((item) => item.id),\n\t\t);\n\t};\n\n\tconst shouldShowWhatsNewCallout = (): boolean => {\n\t\tconst createdAt = usersStore.currentUser?.createdAt;\n\t\tlet hasNewArticle = false;\n\t\tif (createdAt) {\n\t\t\tconst userCreatedAt = new Date(createdAt).getTime();\n\t\t\thasNewArticle = whatsNewArticles.value.some((item) => {\n\t\t\t\tconst updatedAt = item.updatedAt ? new Date(item.updatedAt).getTime() : 0;\n\t\t\t\treturn updatedAt > userCreatedAt;\n\t\t\t});\n\t\t} else {\n\t\t\thasNewArticle = true;\n\t\t}\n\t\tconst allArticlesDismissed = whatsNewArticles.value.every((item) =>\n\t\t\tlastDismissedWhatsNewCallout.value.includes(item.id),\n\t\t);\n\n\t\treturn hasNewArticle && !allArticlesDismissed;\n\t};\n\n\tconst fetchWhatsNew = async () => {\n\t\ttry {\n\t\t\tconst { enabled, whatsNewEnabled, whatsNewEndpoint } = versionNotificationSettings.value;\n\t\t\tif (enabled && whatsNewEnabled && whatsNewEndpoint) {\n\t\t\t\tconst rootStore = useRootStore();\n\t\t\t\tconst current = rootStore.versionCli;\n\t\t\t\tconst instanceId = rootStore.instanceId;\n\t\t\t\tconst section = await versionsApi.getWhatsNewSection(whatsNewEndpoint, current, instanceId);\n\n\t\t\t\tif (section.items?.length > 0) {\n\t\t\t\t\tsetWhatsNew(section);\n\n\t\t\t\t\tif (shouldShowWhatsNewCallout()) {\n\t\t\t\t\t\twhatsNewCallout.value = showMessage({\n\t\t\t\t\t\t\ttitle: whatsNew.value.title,\n\t\t\t\t\t\t\tmessage: whatsNew.value.calloutText,\n\t\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\t\tposition: 'bottom-left',\n\t\t\t\t\t\t\tcustomClass: 'clickable whats-new-notification',\n\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\tconst articleId = whatsNew.value.items[0]?.id ?? 0;\n\t\t\t\t\t\t\t\ttelemetry.track(\"User clicked on what's new notification\", {\n\t\t\t\t\t\t\t\t\tarticle_id: articleId,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tmodalOpeners.value.openModalWithData({\n\t\t\t\t\t\t\t\t\tname: WHATS_NEW_MODAL_KEY,\n\t\t\t\t\t\t\t\t\tdata: { articleId },\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Mark the callout as dismissed as soon as it is shown, so it does not\n\t\t\t\t\t\t// keep reappearing on subsequent loads for users who simply ignore it.\n\t\t\t\t\t\tdismissWhatsNewCallout();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('Failed to fetch Whats New section:', e);\n\t\t}\n\t};\n\n\tconst initialize = (settings: IVersionNotificationSettings) => {\n\t\tversionNotificationSettings.value = settings;\n\t};\n\n\tconst checkForNewVersions = async () => {\n\t\tconst enabled = areNotificationsEnabled.value;\n\t\tif (!enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait Promise.all([fetchVersions(), fetchWhatsNew()]);\n\n\t\tif (\n\t\t\tcurrentVersion.value &&\n\t\t\tcurrentVersion.value.hasSecurityIssue &&\n\t\t\tnextVersions.value.length\n\t\t) {\n\t\t\tconst fixVersion = currentVersion.value.securityIssueFixVersion;\n\t\t\tlet message = 'Please update to latest version.';\n\t\t\tif (fixVersion) {\n\t\t\t\tmessage = `Please update to version ${fixVersion} or higher.`;\n\t\t\t}\n\n\t\t\tmessage = `${message} <a class=\"primary-color\">More info</a>`;\n\t\t\tshowToast({\n\t\t\t\ttitle: 'Critical update available',\n\t\t\t\tmessage,\n\t\t\t\tonClick: () => {\n\t\t\t\t\tmodalOpeners.value.openModal(VERSIONS_MODAL_KEY);\n\t\t\t\t},\n\t\t\t\tcloseOnClick: true,\n\t\t\t\tcustomClass: 'clickable',\n\t\t\t\ttype: 'warning',\n\t\t\t\tduration: 0,\n\t\t\t});\n\t\t}\n\t};\n\n\t// #endregion\n\n\treturn {\n\t\tcurrentVersion,\n\t\tlatestVersion,\n\t\tnextVersions,\n\t\thasVersionUpdates,\n\t\thasSignificantUpdates,\n\t\tareNotificationsEnabled,\n\t\tinfoUrl,\n\t\tfetchVersions,\n\t\tsetVersions,\n\t\tinitialize,\n\t\tregisterModalOpeners,\n\t\tcheckForNewVersions,\n\t\tfetchWhatsNew,\n\t\twhatsNew,\n\t\twhatsNewArticles,\n\t\tisWhatsNewArticleRead,\n\t\tsetWhatsNewArticleRead,\n\t\tcloseWhatsNewCallout,\n\t\tshouldShowWhatsNewCallout,\n\t\tdismissWhatsNewCallout,\n\t};\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@n8n/stores",
3
3
  "type": "module",
4
- "version": "2.32.2",
4
+ "version": "2.34.0",
5
5
  "files": [
6
6
  "dist",
7
7
  "LICENSE.md",
@@ -24,11 +24,17 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@vueuse/core": "^14.3.0",
27
+ "bowser": "2.11.0",
27
28
  "pinia": "^2.2.4",
28
29
  "vue": "^3.5.13",
29
- "@n8n/api-types": "1.32.2",
30
- "@n8n/permissions": "0.69.0",
31
- "n8n-workflow": "2.32.1"
30
+ "@n8n/api-types": "1.34.0",
31
+ "@n8n/composables": "1.24.0",
32
+ "@n8n/constants": "0.33.0",
33
+ "@n8n/frontend-constants": "0.3.0",
34
+ "@n8n/i18n": "2.34.0",
35
+ "@n8n/permissions": "0.71.0",
36
+ "@n8n/rest-api-client": "2.34.0",
37
+ "n8n-workflow": "2.34.0"
32
38
  },
33
39
  "devDependencies": {
34
40
  "@testing-library/jest-dom": "^6.6.3",
@@ -41,11 +47,12 @@
41
47
  "typescript": "6.0.2",
42
48
  "vite": "^8.0.2",
43
49
  "vitest": "^4.1.9",
50
+ "vitest-mock-extended": "^3.1.0",
44
51
  "vue-tsc": "^2.2.8",
52
+ "@n8n/playwright-janitor": "0.1.0",
45
53
  "@n8n/eslint-config": "0.0.1",
46
54
  "@n8n/vitest-config": "1.19.0",
47
- "@n8n/typescript-config": "1.9.0",
48
- "@n8n/playwright-janitor": "0.1.0"
55
+ "@n8n/typescript-config": "1.9.0"
49
56
  },
50
57
  "license": "SEE LICENSE IN LICENSE.md",
51
58
  "homepage": "https://n8n.io",
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRootStore.cjs","names":["STORES","getConfigFromMetaTag"],"sources":["../src/useRootStore.ts"],"sourcesContent":["import { randomString, setGlobalState } from 'n8n-workflow';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\nimport { STORES } from './constants';\nimport { getConfigFromMetaTag } from './metaTagConfig';\n\nconst { VUE_APP_URL_BASE_API } = import.meta.env;\n\nexport type RootStoreState = {\n\tbaseUrl: string;\n\trestEndpoint: string;\n\tdefaultLocale: string;\n\tendpointForm: string;\n\tendpointFormTest: string;\n\tendpointFormWaiting: string;\n\tendpointMcp: string;\n\tendpointMcpTest: string;\n\tendpointWebhook: string;\n\tendpointWebhookTest: string;\n\tendpointWebhookWaiting: string;\n\ttimezone: string;\n\texecutionTimeout: number;\n\tmaxExecutionTimeout: number;\n\tversionCli: string;\n\toauthCallbackUrls: object;\n\tjwksUri: string;\n\tn8nMetadata: {\n\t\t[key: string]: string | number | undefined;\n\t};\n\tpushRef: string;\n\turlBaseWebhook: string;\n\turlBaseEditor: string;\n\turlBaseWebhookTest: string;\n\tinstanceId: string;\n\tbinaryDataMode: 'default' | 'filesystem' | 's3' | 'azure' | 'database';\n};\n\nexport const useRootStore = defineStore(STORES.ROOT, () => {\n\tconst state = ref<RootStoreState>({\n\t\tbaseUrl: VUE_APP_URL_BASE_API ?? window.BASE_PATH,\n\t\trestEndpoint: getConfigFromMetaTag('rest-endpoint') ?? 'rest',\n\t\tdefaultLocale: 'en',\n\t\tendpointForm: 'form',\n\t\tendpointFormTest: 'form-test',\n\t\tendpointFormWaiting: 'form-waiting',\n\t\tendpointMcp: 'mcp',\n\t\tendpointMcpTest: 'mcp-test',\n\t\tendpointWebhook: 'webhook',\n\t\tendpointWebhookTest: 'webhook-test',\n\t\tendpointWebhookWaiting: 'webhook-waiting',\n\t\ttimezone: 'America/New_York',\n\t\texecutionTimeout: -1,\n\t\tmaxExecutionTimeout: Number.MAX_SAFE_INTEGER,\n\t\tversionCli: '0.0.0',\n\t\toauthCallbackUrls: {},\n\t\tjwksUri: '',\n\t\tn8nMetadata: {},\n\t\tpushRef: randomString(10).toLowerCase(),\n\t\turlBaseWebhook: 'http://localhost:5678/',\n\t\turlBaseEditor: 'http://localhost:5678',\n\t\turlBaseWebhookTest: 'http://localhost:5678/',\n\t\tinstanceId: '',\n\t\tbinaryDataMode: 'default',\n\t});\n\n\t// ---------------------------------------------------------------------------\n\t// #region Computed\n\t// ---------------------------------------------------------------------------\n\n\tconst baseUrl = computed(() => state.value.baseUrl);\n\n\tconst formUrl = computed(() => `${state.value.urlBaseWebhook}${state.value.endpointForm}`);\n\n\tconst formTestUrl = computed(\n\t\t() => `${state.value.urlBaseWebhookTest}${state.value.endpointFormTest}`,\n\t);\n\n\tconst formWaitingUrl = computed(\n\t\t() => `${state.value.urlBaseEditor}${state.value.endpointFormWaiting}`,\n\t);\n\n\tconst webhookUrl = computed(() => `${state.value.urlBaseWebhook}${state.value.endpointWebhook}`);\n\n\tconst webhookTestUrl = computed(\n\t\t() => `${state.value.urlBaseWebhookTest}${state.value.endpointWebhookTest}`,\n\t);\n\n\tconst webhookWaitingUrl = computed(\n\t\t() => `${state.value.urlBaseEditor}${state.value.endpointWebhookWaiting}`,\n\t);\n\n\tconst mcpUrl = computed(() => `${state.value.urlBaseWebhook}${state.value.endpointMcp}`);\n\n\tconst mcpTestUrl = computed(\n\t\t() => `${state.value.urlBaseWebhookTest}${state.value.endpointMcpTest}`,\n\t);\n\n\tconst pushRef = computed(() => state.value.pushRef);\n\n\tconst binaryDataMode = computed(() => state.value.binaryDataMode);\n\n\tconst defaultLocale = computed(() => state.value.defaultLocale);\n\n\tconst urlBaseEditor = computed(() => state.value.urlBaseEditor);\n\n\tconst urlBaseWebhook = computed(() => state.value.urlBaseWebhook);\n\n\tconst instanceId = computed(() => state.value.instanceId);\n\n\tconst versionCli = computed(() => state.value.versionCli);\n\n\tconst OAuthCallbackUrls = computed(() => state.value.oauthCallbackUrls);\n\n\tconst jwksUri = computed(() => state.value.jwksUri);\n\n\tconst restUrl = computed(() => `${state.value.baseUrl}${state.value.restEndpoint}`);\n\n\tconst executionTimeout = computed(() => state.value.executionTimeout);\n\n\tconst maxExecutionTimeout = computed(() => state.value.maxExecutionTimeout);\n\n\tconst timezone = computed(() => state.value.timezone);\n\n\tconst restApiContext = computed(() => ({\n\t\tbaseUrl: restUrl.value,\n\t\tpushRef: state.value.pushRef,\n\t}));\n\n\t// #endregion\n\n\t// ---------------------------------------------------------------------------\n\t// #region Methods\n\t// ---------------------------------------------------------------------------\n\n\tconst setUrlBaseWebhook = (value: string) => {\n\t\tconst url = value.endsWith('/') ? value : `${value}/`;\n\t\tstate.value.urlBaseWebhook = url;\n\t};\n\n\tconst setUrlBaseEditor = (value: string) => {\n\t\tconst url = value.endsWith('/') ? value : `${value}/`;\n\t\tstate.value.urlBaseEditor = url;\n\t};\n\n\tconst setUrlBaseWebhookTest = (value: string) => {\n\t\tconst url = value.endsWith('/') ? value : `${value}/`;\n\t\tstate.value.urlBaseWebhookTest = url;\n\t};\n\n\tconst setEndpointForm = (value: string) => {\n\t\tstate.value.endpointForm = value;\n\t};\n\n\tconst setEndpointFormTest = (value: string) => {\n\t\tstate.value.endpointFormTest = value;\n\t};\n\n\tconst setEndpointFormWaiting = (value: string) => {\n\t\tstate.value.endpointFormWaiting = value;\n\t};\n\n\tconst setEndpointWebhook = (value: string) => {\n\t\tstate.value.endpointWebhook = value;\n\t};\n\n\tconst setEndpointWebhookTest = (value: string) => {\n\t\tstate.value.endpointWebhookTest = value;\n\t};\n\n\tconst setEndpointWebhookWaiting = (value: string) => {\n\t\tstate.value.endpointWebhookWaiting = value;\n\t};\n\n\tconst setEndpointMcp = (value: string) => {\n\t\tstate.value.endpointMcp = value;\n\t};\n\n\tconst setEndpointMcpTest = (value: string) => {\n\t\tstate.value.endpointMcpTest = value;\n\t};\n\n\tconst setTimezone = (value: string) => {\n\t\tstate.value.timezone = value;\n\t\tsetGlobalState({ defaultTimezone: value });\n\t};\n\n\tconst setExecutionTimeout = (value: number) => {\n\t\tstate.value.executionTimeout = value;\n\t};\n\n\tconst setMaxExecutionTimeout = (value: number) => {\n\t\tstate.value.maxExecutionTimeout = value;\n\t};\n\n\tconst setVersionCli = (value: string) => {\n\t\tstate.value.versionCli = value;\n\t};\n\n\tconst setInstanceId = (value: string) => {\n\t\tstate.value.instanceId = value;\n\t};\n\n\tconst setOauthCallbackUrls = (value: RootStoreState['oauthCallbackUrls']) => {\n\t\tstate.value.oauthCallbackUrls = value;\n\t};\n\n\tconst setJwksUri = (value: string) => {\n\t\tstate.value.jwksUri = value;\n\t};\n\n\tconst setN8nMetadata = (value: RootStoreState['n8nMetadata']) => {\n\t\tstate.value.n8nMetadata = value;\n\t};\n\n\tconst setDefaultLocale = (value: string) => {\n\t\tstate.value.defaultLocale = value;\n\t};\n\n\tconst setBinaryDataMode = (value: RootStoreState['binaryDataMode']) => {\n\t\tstate.value.binaryDataMode = value;\n\t};\n\n\tconst setPushRef = (value: string) => {\n\t\tstate.value.pushRef = value;\n\t};\n\n\t// #endregion\n\n\treturn {\n\t\tbaseUrl,\n\t\tformUrl,\n\t\tformTestUrl,\n\t\tformWaitingUrl,\n\t\tmcpUrl,\n\t\tmcpTestUrl,\n\t\twebhookUrl,\n\t\twebhookTestUrl,\n\t\twebhookWaitingUrl,\n\t\trestUrl,\n\t\trestApiContext,\n\t\turlBaseEditor,\n\t\turlBaseWebhook,\n\t\tversionCli,\n\t\tinstanceId,\n\t\tpushRef,\n\t\tdefaultLocale,\n\t\tbinaryDataMode,\n\t\tOAuthCallbackUrls,\n\t\tjwksUri,\n\t\texecutionTimeout,\n\t\tmaxExecutionTimeout,\n\t\ttimezone,\n\t\tsetUrlBaseWebhook,\n\t\tsetUrlBaseEditor,\n\t\tsetUrlBaseWebhookTest,\n\t\tsetEndpointForm,\n\t\tsetEndpointFormTest,\n\t\tsetEndpointFormWaiting,\n\t\tsetEndpointWebhook,\n\t\tsetEndpointWebhookTest,\n\t\tsetEndpointWebhookWaiting,\n\t\tsetEndpointMcp,\n\t\tsetEndpointMcpTest,\n\t\tsetTimezone,\n\t\tsetExecutionTimeout,\n\t\tsetMaxExecutionTimeout,\n\t\tsetVersionCli,\n\t\tsetInstanceId,\n\t\tsetOauthCallbackUrls,\n\t\tsetJwksUri,\n\t\tsetN8nMetadata,\n\t\tsetDefaultLocale,\n\t\tsetBinaryDataMode,\n\t\tsetPushRef,\n\t};\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRootStore.mjs","names":[],"sources":["../src/useRootStore.ts"],"sourcesContent":["import { randomString, setGlobalState } from 'n8n-workflow';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from 'vue';\n\nimport { STORES } from './constants';\nimport { getConfigFromMetaTag } from './metaTagConfig';\n\nconst { VUE_APP_URL_BASE_API } = import.meta.env;\n\nexport type RootStoreState = {\n\tbaseUrl: string;\n\trestEndpoint: string;\n\tdefaultLocale: string;\n\tendpointForm: string;\n\tendpointFormTest: string;\n\tendpointFormWaiting: string;\n\tendpointMcp: string;\n\tendpointMcpTest: string;\n\tendpointWebhook: string;\n\tendpointWebhookTest: string;\n\tendpointWebhookWaiting: string;\n\ttimezone: string;\n\texecutionTimeout: number;\n\tmaxExecutionTimeout: number;\n\tversionCli: string;\n\toauthCallbackUrls: object;\n\tjwksUri: string;\n\tn8nMetadata: {\n\t\t[key: string]: string | number | undefined;\n\t};\n\tpushRef: string;\n\turlBaseWebhook: string;\n\turlBaseEditor: string;\n\turlBaseWebhookTest: string;\n\tinstanceId: string;\n\tbinaryDataMode: 'default' | 'filesystem' | 's3' | 'azure' | 'database';\n};\n\nexport const useRootStore = defineStore(STORES.ROOT, () => {\n\tconst state = ref<RootStoreState>({\n\t\tbaseUrl: VUE_APP_URL_BASE_API ?? window.BASE_PATH,\n\t\trestEndpoint: getConfigFromMetaTag('rest-endpoint') ?? 'rest',\n\t\tdefaultLocale: 'en',\n\t\tendpointForm: 'form',\n\t\tendpointFormTest: 'form-test',\n\t\tendpointFormWaiting: 'form-waiting',\n\t\tendpointMcp: 'mcp',\n\t\tendpointMcpTest: 'mcp-test',\n\t\tendpointWebhook: 'webhook',\n\t\tendpointWebhookTest: 'webhook-test',\n\t\tendpointWebhookWaiting: 'webhook-waiting',\n\t\ttimezone: 'America/New_York',\n\t\texecutionTimeout: -1,\n\t\tmaxExecutionTimeout: Number.MAX_SAFE_INTEGER,\n\t\tversionCli: '0.0.0',\n\t\toauthCallbackUrls: {},\n\t\tjwksUri: '',\n\t\tn8nMetadata: {},\n\t\tpushRef: randomString(10).toLowerCase(),\n\t\turlBaseWebhook: 'http://localhost:5678/',\n\t\turlBaseEditor: 'http://localhost:5678',\n\t\turlBaseWebhookTest: 'http://localhost:5678/',\n\t\tinstanceId: '',\n\t\tbinaryDataMode: 'default',\n\t});\n\n\t// ---------------------------------------------------------------------------\n\t// #region Computed\n\t// ---------------------------------------------------------------------------\n\n\tconst baseUrl = computed(() => state.value.baseUrl);\n\n\tconst formUrl = computed(() => `${state.value.urlBaseWebhook}${state.value.endpointForm}`);\n\n\tconst formTestUrl = computed(\n\t\t() => `${state.value.urlBaseWebhookTest}${state.value.endpointFormTest}`,\n\t);\n\n\tconst formWaitingUrl = computed(\n\t\t() => `${state.value.urlBaseEditor}${state.value.endpointFormWaiting}`,\n\t);\n\n\tconst webhookUrl = computed(() => `${state.value.urlBaseWebhook}${state.value.endpointWebhook}`);\n\n\tconst webhookTestUrl = computed(\n\t\t() => `${state.value.urlBaseWebhookTest}${state.value.endpointWebhookTest}`,\n\t);\n\n\tconst webhookWaitingUrl = computed(\n\t\t() => `${state.value.urlBaseEditor}${state.value.endpointWebhookWaiting}`,\n\t);\n\n\tconst mcpUrl = computed(() => `${state.value.urlBaseWebhook}${state.value.endpointMcp}`);\n\n\tconst mcpTestUrl = computed(\n\t\t() => `${state.value.urlBaseWebhookTest}${state.value.endpointMcpTest}`,\n\t);\n\n\tconst pushRef = computed(() => state.value.pushRef);\n\n\tconst binaryDataMode = computed(() => state.value.binaryDataMode);\n\n\tconst defaultLocale = computed(() => state.value.defaultLocale);\n\n\tconst urlBaseEditor = computed(() => state.value.urlBaseEditor);\n\n\tconst urlBaseWebhook = computed(() => state.value.urlBaseWebhook);\n\n\tconst instanceId = computed(() => state.value.instanceId);\n\n\tconst versionCli = computed(() => state.value.versionCli);\n\n\tconst OAuthCallbackUrls = computed(() => state.value.oauthCallbackUrls);\n\n\tconst jwksUri = computed(() => state.value.jwksUri);\n\n\tconst restUrl = computed(() => `${state.value.baseUrl}${state.value.restEndpoint}`);\n\n\tconst executionTimeout = computed(() => state.value.executionTimeout);\n\n\tconst maxExecutionTimeout = computed(() => state.value.maxExecutionTimeout);\n\n\tconst timezone = computed(() => state.value.timezone);\n\n\tconst restApiContext = computed(() => ({\n\t\tbaseUrl: restUrl.value,\n\t\tpushRef: state.value.pushRef,\n\t}));\n\n\t// #endregion\n\n\t// ---------------------------------------------------------------------------\n\t// #region Methods\n\t// ---------------------------------------------------------------------------\n\n\tconst setUrlBaseWebhook = (value: string) => {\n\t\tconst url = value.endsWith('/') ? value : `${value}/`;\n\t\tstate.value.urlBaseWebhook = url;\n\t};\n\n\tconst setUrlBaseEditor = (value: string) => {\n\t\tconst url = value.endsWith('/') ? value : `${value}/`;\n\t\tstate.value.urlBaseEditor = url;\n\t};\n\n\tconst setUrlBaseWebhookTest = (value: string) => {\n\t\tconst url = value.endsWith('/') ? value : `${value}/`;\n\t\tstate.value.urlBaseWebhookTest = url;\n\t};\n\n\tconst setEndpointForm = (value: string) => {\n\t\tstate.value.endpointForm = value;\n\t};\n\n\tconst setEndpointFormTest = (value: string) => {\n\t\tstate.value.endpointFormTest = value;\n\t};\n\n\tconst setEndpointFormWaiting = (value: string) => {\n\t\tstate.value.endpointFormWaiting = value;\n\t};\n\n\tconst setEndpointWebhook = (value: string) => {\n\t\tstate.value.endpointWebhook = value;\n\t};\n\n\tconst setEndpointWebhookTest = (value: string) => {\n\t\tstate.value.endpointWebhookTest = value;\n\t};\n\n\tconst setEndpointWebhookWaiting = (value: string) => {\n\t\tstate.value.endpointWebhookWaiting = value;\n\t};\n\n\tconst setEndpointMcp = (value: string) => {\n\t\tstate.value.endpointMcp = value;\n\t};\n\n\tconst setEndpointMcpTest = (value: string) => {\n\t\tstate.value.endpointMcpTest = value;\n\t};\n\n\tconst setTimezone = (value: string) => {\n\t\tstate.value.timezone = value;\n\t\tsetGlobalState({ defaultTimezone: value });\n\t};\n\n\tconst setExecutionTimeout = (value: number) => {\n\t\tstate.value.executionTimeout = value;\n\t};\n\n\tconst setMaxExecutionTimeout = (value: number) => {\n\t\tstate.value.maxExecutionTimeout = value;\n\t};\n\n\tconst setVersionCli = (value: string) => {\n\t\tstate.value.versionCli = value;\n\t};\n\n\tconst setInstanceId = (value: string) => {\n\t\tstate.value.instanceId = value;\n\t};\n\n\tconst setOauthCallbackUrls = (value: RootStoreState['oauthCallbackUrls']) => {\n\t\tstate.value.oauthCallbackUrls = value;\n\t};\n\n\tconst setJwksUri = (value: string) => {\n\t\tstate.value.jwksUri = value;\n\t};\n\n\tconst setN8nMetadata = (value: RootStoreState['n8nMetadata']) => {\n\t\tstate.value.n8nMetadata = value;\n\t};\n\n\tconst setDefaultLocale = (value: string) => {\n\t\tstate.value.defaultLocale = value;\n\t};\n\n\tconst setBinaryDataMode = (value: RootStoreState['binaryDataMode']) => {\n\t\tstate.value.binaryDataMode = value;\n\t};\n\n\tconst setPushRef = (value: string) => {\n\t\tstate.value.pushRef = value;\n\t};\n\n\t// #endregion\n\n\treturn {\n\t\tbaseUrl,\n\t\tformUrl,\n\t\tformTestUrl,\n\t\tformWaitingUrl,\n\t\tmcpUrl,\n\t\tmcpTestUrl,\n\t\twebhookUrl,\n\t\twebhookTestUrl,\n\t\twebhookWaitingUrl,\n\t\trestUrl,\n\t\trestApiContext,\n\t\turlBaseEditor,\n\t\turlBaseWebhook,\n\t\tversionCli,\n\t\tinstanceId,\n\t\tpushRef,\n\t\tdefaultLocale,\n\t\tbinaryDataMode,\n\t\tOAuthCallbackUrls,\n\t\tjwksUri,\n\t\texecutionTimeout,\n\t\tmaxExecutionTimeout,\n\t\ttimezone,\n\t\tsetUrlBaseWebhook,\n\t\tsetUrlBaseEditor,\n\t\tsetUrlBaseWebhookTest,\n\t\tsetEndpointForm,\n\t\tsetEndpointFormTest,\n\t\tsetEndpointFormWaiting,\n\t\tsetEndpointWebhook,\n\t\tsetEndpointWebhookTest,\n\t\tsetEndpointWebhookWaiting,\n\t\tsetEndpointMcp,\n\t\tsetEndpointMcpTest,\n\t\tsetTimezone,\n\t\tsetExecutionTimeout,\n\t\tsetMaxExecutionTimeout,\n\t\tsetVersionCli,\n\t\tsetInstanceId,\n\t\tsetOauthCallbackUrls,\n\t\tsetJwksUri,\n\t\tsetN8nMetadata,\n\t\tsetDefaultLocale,\n\t\tsetBinaryDataMode,\n\t\tsetPushRef,\n\t};\n});\n"],"mappings":"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"}