@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,384 @@
1
+ import { t as ModalOpeners } from "./modalOpeners2.mjs";
2
+ import * as pinia6 from "pinia";
3
+ import * as vue440 from "vue";
4
+ import { IVersionNotificationSettings } from "@n8n/api-types";
5
+ import * as n8n_workflow5 from "n8n-workflow";
6
+ import * as versionsApi from "@n8n/rest-api-client/api/versions";
7
+ import { Version } from "@n8n/rest-api-client/api/versions";
8
+
9
+ //#region src/versions.store.d.ts
10
+ type SetVersionParams = {
11
+ versions: Version[];
12
+ currentVersion: string;
13
+ };
14
+ declare const SEMVER_REGEX: RegExp;
15
+ declare const useVersionsStore: pinia6.StoreDefinition<"versions", Pick<{
16
+ currentVersion: vue440.Ref<versionsApi.Version | undefined, versionsApi.Version | undefined>;
17
+ latestVersion: vue440.ComputedRef<{
18
+ name: string;
19
+ nodes: {
20
+ name: string;
21
+ displayName: string;
22
+ icon: string;
23
+ iconUrl?: string | undefined;
24
+ defaults: n8n_workflow5.INodeParameters;
25
+ iconData: {
26
+ type: string;
27
+ icon?: string | undefined;
28
+ fileBuffer?: string | undefined;
29
+ };
30
+ typeVersion?: number | undefined;
31
+ }[];
32
+ createdAt: string;
33
+ description: string;
34
+ documentationUrl: string;
35
+ hasBreakingChange: boolean;
36
+ hasSecurityFix: boolean;
37
+ hasSecurityIssue: boolean;
38
+ securityIssueFixVersion: string;
39
+ }>;
40
+ nextVersions: vue440.Ref<{
41
+ name: string;
42
+ nodes: {
43
+ name: string;
44
+ displayName: string;
45
+ icon: string;
46
+ iconUrl?: string | undefined;
47
+ defaults: n8n_workflow5.INodeParameters;
48
+ iconData: {
49
+ type: string;
50
+ icon?: string | undefined;
51
+ fileBuffer?: string | undefined;
52
+ };
53
+ typeVersion?: number | undefined;
54
+ }[];
55
+ createdAt: string;
56
+ description: string;
57
+ documentationUrl: string;
58
+ hasBreakingChange: boolean;
59
+ hasSecurityFix: boolean;
60
+ hasSecurityIssue: boolean;
61
+ securityIssueFixVersion: string;
62
+ }[], versionsApi.Version[] | {
63
+ name: string;
64
+ nodes: {
65
+ name: string;
66
+ displayName: string;
67
+ icon: string;
68
+ iconUrl?: string | undefined;
69
+ defaults: n8n_workflow5.INodeParameters;
70
+ iconData: {
71
+ type: string;
72
+ icon?: string | undefined;
73
+ fileBuffer?: string | undefined;
74
+ };
75
+ typeVersion?: number | undefined;
76
+ }[];
77
+ createdAt: string;
78
+ description: string;
79
+ documentationUrl: string;
80
+ hasBreakingChange: boolean;
81
+ hasSecurityFix: boolean;
82
+ hasSecurityIssue: boolean;
83
+ securityIssueFixVersion: string;
84
+ }[]>;
85
+ hasVersionUpdates: vue440.ComputedRef<boolean>;
86
+ hasSignificantUpdates: vue440.ComputedRef<boolean>;
87
+ areNotificationsEnabled: vue440.ComputedRef<boolean>;
88
+ infoUrl: vue440.ComputedRef<string>;
89
+ fetchVersions: () => Promise<void>;
90
+ setVersions: (params: SetVersionParams) => void;
91
+ initialize: (settings: IVersionNotificationSettings) => void;
92
+ registerModalOpeners: (openers: ModalOpeners) => void;
93
+ checkForNewVersions: () => Promise<void>;
94
+ fetchWhatsNew: () => Promise<void>;
95
+ whatsNew: vue440.Ref<{
96
+ title: string;
97
+ calloutText: string;
98
+ footer: string;
99
+ items: {
100
+ id: number;
101
+ createdAt: string;
102
+ updatedAt: string | null;
103
+ publishedAt: string;
104
+ title: string;
105
+ content: string;
106
+ }[];
107
+ createdAt: string;
108
+ updatedAt: string | null;
109
+ }, versionsApi.WhatsNewSection | {
110
+ title: string;
111
+ calloutText: string;
112
+ footer: string;
113
+ items: {
114
+ id: number;
115
+ createdAt: string;
116
+ updatedAt: string | null;
117
+ publishedAt: string;
118
+ title: string;
119
+ content: string;
120
+ }[];
121
+ createdAt: string;
122
+ updatedAt: string | null;
123
+ }>;
124
+ whatsNewArticles: vue440.ComputedRef<{
125
+ id: number;
126
+ createdAt: string;
127
+ updatedAt: string | null;
128
+ publishedAt: string;
129
+ title: string;
130
+ content: string;
131
+ }[]>;
132
+ isWhatsNewArticleRead: (articleId: number) => boolean;
133
+ setWhatsNewArticleRead: (articleId: number) => void;
134
+ closeWhatsNewCallout: () => void;
135
+ shouldShowWhatsNewCallout: () => boolean;
136
+ dismissWhatsNewCallout: () => void;
137
+ }, "currentVersion" | "nextVersions" | "whatsNew">, Pick<{
138
+ currentVersion: vue440.Ref<versionsApi.Version | undefined, versionsApi.Version | undefined>;
139
+ latestVersion: vue440.ComputedRef<{
140
+ name: string;
141
+ nodes: {
142
+ name: string;
143
+ displayName: string;
144
+ icon: string;
145
+ iconUrl?: string | undefined;
146
+ defaults: n8n_workflow5.INodeParameters;
147
+ iconData: {
148
+ type: string;
149
+ icon?: string | undefined;
150
+ fileBuffer?: string | undefined;
151
+ };
152
+ typeVersion?: number | undefined;
153
+ }[];
154
+ createdAt: string;
155
+ description: string;
156
+ documentationUrl: string;
157
+ hasBreakingChange: boolean;
158
+ hasSecurityFix: boolean;
159
+ hasSecurityIssue: boolean;
160
+ securityIssueFixVersion: string;
161
+ }>;
162
+ nextVersions: vue440.Ref<{
163
+ name: string;
164
+ nodes: {
165
+ name: string;
166
+ displayName: string;
167
+ icon: string;
168
+ iconUrl?: string | undefined;
169
+ defaults: n8n_workflow5.INodeParameters;
170
+ iconData: {
171
+ type: string;
172
+ icon?: string | undefined;
173
+ fileBuffer?: string | undefined;
174
+ };
175
+ typeVersion?: number | undefined;
176
+ }[];
177
+ createdAt: string;
178
+ description: string;
179
+ documentationUrl: string;
180
+ hasBreakingChange: boolean;
181
+ hasSecurityFix: boolean;
182
+ hasSecurityIssue: boolean;
183
+ securityIssueFixVersion: string;
184
+ }[], versionsApi.Version[] | {
185
+ name: string;
186
+ nodes: {
187
+ name: string;
188
+ displayName: string;
189
+ icon: string;
190
+ iconUrl?: string | undefined;
191
+ defaults: n8n_workflow5.INodeParameters;
192
+ iconData: {
193
+ type: string;
194
+ icon?: string | undefined;
195
+ fileBuffer?: string | undefined;
196
+ };
197
+ typeVersion?: number | undefined;
198
+ }[];
199
+ createdAt: string;
200
+ description: string;
201
+ documentationUrl: string;
202
+ hasBreakingChange: boolean;
203
+ hasSecurityFix: boolean;
204
+ hasSecurityIssue: boolean;
205
+ securityIssueFixVersion: string;
206
+ }[]>;
207
+ hasVersionUpdates: vue440.ComputedRef<boolean>;
208
+ hasSignificantUpdates: vue440.ComputedRef<boolean>;
209
+ areNotificationsEnabled: vue440.ComputedRef<boolean>;
210
+ infoUrl: vue440.ComputedRef<string>;
211
+ fetchVersions: () => Promise<void>;
212
+ setVersions: (params: SetVersionParams) => void;
213
+ initialize: (settings: IVersionNotificationSettings) => void;
214
+ registerModalOpeners: (openers: ModalOpeners) => void;
215
+ checkForNewVersions: () => Promise<void>;
216
+ fetchWhatsNew: () => Promise<void>;
217
+ whatsNew: vue440.Ref<{
218
+ title: string;
219
+ calloutText: string;
220
+ footer: string;
221
+ items: {
222
+ id: number;
223
+ createdAt: string;
224
+ updatedAt: string | null;
225
+ publishedAt: string;
226
+ title: string;
227
+ content: string;
228
+ }[];
229
+ createdAt: string;
230
+ updatedAt: string | null;
231
+ }, versionsApi.WhatsNewSection | {
232
+ title: string;
233
+ calloutText: string;
234
+ footer: string;
235
+ items: {
236
+ id: number;
237
+ createdAt: string;
238
+ updatedAt: string | null;
239
+ publishedAt: string;
240
+ title: string;
241
+ content: string;
242
+ }[];
243
+ createdAt: string;
244
+ updatedAt: string | null;
245
+ }>;
246
+ whatsNewArticles: vue440.ComputedRef<{
247
+ id: number;
248
+ createdAt: string;
249
+ updatedAt: string | null;
250
+ publishedAt: string;
251
+ title: string;
252
+ content: string;
253
+ }[]>;
254
+ isWhatsNewArticleRead: (articleId: number) => boolean;
255
+ setWhatsNewArticleRead: (articleId: number) => void;
256
+ closeWhatsNewCallout: () => void;
257
+ shouldShowWhatsNewCallout: () => boolean;
258
+ dismissWhatsNewCallout: () => void;
259
+ }, "latestVersion" | "infoUrl" | "hasVersionUpdates" | "hasSignificantUpdates" | "areNotificationsEnabled" | "whatsNewArticles">, Pick<{
260
+ currentVersion: vue440.Ref<versionsApi.Version | undefined, versionsApi.Version | undefined>;
261
+ latestVersion: vue440.ComputedRef<{
262
+ name: string;
263
+ nodes: {
264
+ name: string;
265
+ displayName: string;
266
+ icon: string;
267
+ iconUrl?: string | undefined;
268
+ defaults: n8n_workflow5.INodeParameters;
269
+ iconData: {
270
+ type: string;
271
+ icon?: string | undefined;
272
+ fileBuffer?: string | undefined;
273
+ };
274
+ typeVersion?: number | undefined;
275
+ }[];
276
+ createdAt: string;
277
+ description: string;
278
+ documentationUrl: string;
279
+ hasBreakingChange: boolean;
280
+ hasSecurityFix: boolean;
281
+ hasSecurityIssue: boolean;
282
+ securityIssueFixVersion: string;
283
+ }>;
284
+ nextVersions: vue440.Ref<{
285
+ name: string;
286
+ nodes: {
287
+ name: string;
288
+ displayName: string;
289
+ icon: string;
290
+ iconUrl?: string | undefined;
291
+ defaults: n8n_workflow5.INodeParameters;
292
+ iconData: {
293
+ type: string;
294
+ icon?: string | undefined;
295
+ fileBuffer?: string | undefined;
296
+ };
297
+ typeVersion?: number | undefined;
298
+ }[];
299
+ createdAt: string;
300
+ description: string;
301
+ documentationUrl: string;
302
+ hasBreakingChange: boolean;
303
+ hasSecurityFix: boolean;
304
+ hasSecurityIssue: boolean;
305
+ securityIssueFixVersion: string;
306
+ }[], versionsApi.Version[] | {
307
+ name: string;
308
+ nodes: {
309
+ name: string;
310
+ displayName: string;
311
+ icon: string;
312
+ iconUrl?: string | undefined;
313
+ defaults: n8n_workflow5.INodeParameters;
314
+ iconData: {
315
+ type: string;
316
+ icon?: string | undefined;
317
+ fileBuffer?: string | undefined;
318
+ };
319
+ typeVersion?: number | undefined;
320
+ }[];
321
+ createdAt: string;
322
+ description: string;
323
+ documentationUrl: string;
324
+ hasBreakingChange: boolean;
325
+ hasSecurityFix: boolean;
326
+ hasSecurityIssue: boolean;
327
+ securityIssueFixVersion: string;
328
+ }[]>;
329
+ hasVersionUpdates: vue440.ComputedRef<boolean>;
330
+ hasSignificantUpdates: vue440.ComputedRef<boolean>;
331
+ areNotificationsEnabled: vue440.ComputedRef<boolean>;
332
+ infoUrl: vue440.ComputedRef<string>;
333
+ fetchVersions: () => Promise<void>;
334
+ setVersions: (params: SetVersionParams) => void;
335
+ initialize: (settings: IVersionNotificationSettings) => void;
336
+ registerModalOpeners: (openers: ModalOpeners) => void;
337
+ checkForNewVersions: () => Promise<void>;
338
+ fetchWhatsNew: () => Promise<void>;
339
+ whatsNew: vue440.Ref<{
340
+ title: string;
341
+ calloutText: string;
342
+ footer: string;
343
+ items: {
344
+ id: number;
345
+ createdAt: string;
346
+ updatedAt: string | null;
347
+ publishedAt: string;
348
+ title: string;
349
+ content: string;
350
+ }[];
351
+ createdAt: string;
352
+ updatedAt: string | null;
353
+ }, versionsApi.WhatsNewSection | {
354
+ title: string;
355
+ calloutText: string;
356
+ footer: string;
357
+ items: {
358
+ id: number;
359
+ createdAt: string;
360
+ updatedAt: string | null;
361
+ publishedAt: string;
362
+ title: string;
363
+ content: string;
364
+ }[];
365
+ createdAt: string;
366
+ updatedAt: string | null;
367
+ }>;
368
+ whatsNewArticles: vue440.ComputedRef<{
369
+ id: number;
370
+ createdAt: string;
371
+ updatedAt: string | null;
372
+ publishedAt: string;
373
+ title: string;
374
+ content: string;
375
+ }[]>;
376
+ isWhatsNewArticleRead: (articleId: number) => boolean;
377
+ setWhatsNewArticleRead: (articleId: number) => void;
378
+ closeWhatsNewCallout: () => void;
379
+ shouldShowWhatsNewCallout: () => boolean;
380
+ dismissWhatsNewCallout: () => void;
381
+ }, "initialize" | "registerModalOpeners" | "fetchVersions" | "setVersions" | "checkForNewVersions" | "fetchWhatsNew" | "isWhatsNewArticleRead" | "setWhatsNewArticleRead" | "closeWhatsNewCallout" | "shouldShowWhatsNewCallout" | "dismissWhatsNewCallout">>;
382
+ //#endregion
383
+ export { SEMVER_REGEX, useVersionsStore };
384
+ //# sourceMappingURL=versions.store.d.mts.map
@@ -0,0 +1,10 @@
1
+ import "./constants2.mjs";
2
+ import "./metaTagConfig2.mjs";
3
+ import "./useRootStore2.mjs";
4
+ import "./settings2.store.mjs";
5
+ import "./invitation2.api.mjs";
6
+ import "./onboarding2.api.mjs";
7
+ import "./users2.store.mjs";
8
+ import { n as useVersionsStore, t as SEMVER_REGEX } from "./versions2.store.mjs";
9
+
10
+ export { SEMVER_REGEX, useVersionsStore };
@@ -0,0 +1,230 @@
1
+ const require_settings_store = require('./settings2.store.cjs');
2
+ const require_constants = require('./constants2.cjs');
3
+ const require_useRootStore = require('./useRootStore2.cjs');
4
+ const require_users_store = require('./users2.store.cjs');
5
+ let pinia = require("pinia");
6
+ let vue = require("vue");
7
+ let n8n_workflow = require("n8n-workflow");
8
+ let __n8n_composables_useStorage = require("@n8n/composables/useStorage");
9
+ let __n8n_composables_useTelemetry = require("@n8n/composables/useTelemetry");
10
+ let __n8n_composables_useToast = require("@n8n/composables/useToast");
11
+ let __n8n_frontend_constants_versions = require("@n8n/frontend-constants/versions");
12
+ let __n8n_rest_api_client_api_versions = require("@n8n/rest-api-client/api/versions");
13
+ __n8n_rest_api_client_api_versions = require_settings_store.__toESM(__n8n_rest_api_client_api_versions);
14
+
15
+ //#region src/versions.store.ts
16
+ /**
17
+ * Semantic versioning 2.0.0, Regex from https://semver.org/
18
+ * Capture groups: major, minor, patch, prerelease, buildmetadata
19
+ */
20
+ 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-]+)*))?$/;
21
+ const useVersionsStore = (0, pinia.defineStore)(require_constants.STORES.VERSIONS, () => {
22
+ const versionNotificationSettings = (0, vue.ref)({
23
+ enabled: false,
24
+ whatsNewEnabled: false,
25
+ endpoint: "",
26
+ whatsNewEndpoint: "",
27
+ infoUrl: ""
28
+ });
29
+ const nextVersions = (0, vue.ref)([]);
30
+ const currentVersion = (0, vue.ref)();
31
+ const whatsNew = (0, vue.ref)({
32
+ title: "",
33
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
34
+ updatedAt: null,
35
+ calloutText: "",
36
+ footer: "",
37
+ items: []
38
+ });
39
+ const whatsNewCallout = (0, vue.ref)();
40
+ const telemetry = (0, __n8n_composables_useTelemetry.useTelemetry)();
41
+ const { showToast, showMessage } = (0, __n8n_composables_useToast.useToast)();
42
+ const settingsStore = require_settings_store.useSettingsStore();
43
+ const usersStore = require_users_store.useUsersStore();
44
+ const warnModalOpenerMissing = (action) => {
45
+ if ({}.env.DEV) console.warn(`[versions.store] ${action} called before modal openers were registered; ignoring. Call registerModalOpeners() at app bootstrap.`);
46
+ };
47
+ const modalOpeners = (0, vue.ref)({
48
+ openModal: (name) => warnModalOpenerMissing(`openModal(${String(name)})`),
49
+ openModalWithData: (payload) => warnModalOpenerMissing(`openModalWithData(${String(payload.name)})`)
50
+ });
51
+ const registerModalOpeners = (openers) => {
52
+ modalOpeners.value = openers;
53
+ };
54
+ const readWhatsNewArticlesStorage = (0, __n8n_composables_useStorage.useStorage)(__n8n_frontend_constants_versions.LOCAL_STORAGE_READ_WHATS_NEW_ARTICLES);
55
+ const lastDismissedWhatsNewCalloutStorage = (0, __n8n_composables_useStorage.useStorage)(__n8n_frontend_constants_versions.LOCAL_STORAGE_DISMISSED_WHATS_NEW_CALLOUT);
56
+ const hasVersionUpdates = (0, vue.computed)(() => {
57
+ return settingsStore.settings.releaseChannel === "stable" && nextVersions.value.length > 0;
58
+ });
59
+ const hasSignificantUpdates = (0, vue.computed)(() => {
60
+ if (!hasVersionUpdates.value || !currentVersion.value || !latestVersion.value) return false;
61
+ if (currentVersion.value.hasSecurityIssue) return true;
62
+ const current = currentVersion.value.name.match(SEMVER_REGEX);
63
+ const latest = latestVersion.value.name.match(SEMVER_REGEX);
64
+ if (!current?.groups || !latest?.groups) return false;
65
+ if (Number(current.groups.major) !== Number(latest.groups.major)) return true;
66
+ const currentMinor = Number(current.groups.minor);
67
+ return Number(latest.groups.minor) - currentMinor >= 2;
68
+ });
69
+ const latestVersion = (0, vue.computed)(() => {
70
+ return nextVersions.value[0] ?? currentVersion.value;
71
+ });
72
+ const areNotificationsEnabled = (0, vue.computed)(() => {
73
+ return versionNotificationSettings.value.enabled;
74
+ });
75
+ const infoUrl = (0, vue.computed)(() => {
76
+ return versionNotificationSettings.value.infoUrl;
77
+ });
78
+ const readWhatsNewArticles = (0, vue.computed)(() => {
79
+ return readWhatsNewArticlesStorage.value ? (0, n8n_workflow.jsonParse)(readWhatsNewArticlesStorage.value, { fallbackValue: [] }) : [];
80
+ });
81
+ const lastDismissedWhatsNewCallout = (0, vue.computed)(() => {
82
+ return lastDismissedWhatsNewCalloutStorage.value ? (0, n8n_workflow.jsonParse)(lastDismissedWhatsNewCalloutStorage.value, { fallbackValue: [] }) : [];
83
+ });
84
+ const whatsNewArticles = (0, vue.computed)(() => {
85
+ return whatsNew.value.items;
86
+ });
87
+ const fetchVersions = async () => {
88
+ try {
89
+ const { enabled, endpoint } = versionNotificationSettings.value;
90
+ if (enabled && endpoint) {
91
+ const rootStore = require_useRootStore.useRootStore();
92
+ const current = rootStore.versionCli;
93
+ const instanceId = rootStore.instanceId;
94
+ setVersions({
95
+ versions: await __n8n_rest_api_client_api_versions.getNextVersions(endpoint, current, instanceId),
96
+ currentVersion: current
97
+ });
98
+ }
99
+ } catch (e) {
100
+ console.error("Failed to fetch versions:", e);
101
+ }
102
+ };
103
+ const setVersions = (params) => {
104
+ nextVersions.value = params.versions.filter((v) => v.name !== params.currentVersion);
105
+ currentVersion.value = params.versions.find((v) => v.name === params.currentVersion);
106
+ };
107
+ const setWhatsNew = (section) => {
108
+ whatsNew.value = section;
109
+ };
110
+ const setWhatsNewArticleRead = (articleId) => {
111
+ if (!readWhatsNewArticles.value.includes(articleId)) readWhatsNewArticlesStorage.value = JSON.stringify([...readWhatsNewArticles.value, articleId]);
112
+ };
113
+ const isWhatsNewArticleRead = (articleId) => {
114
+ return readWhatsNewArticles.value.includes(articleId);
115
+ };
116
+ const closeWhatsNewCallout = () => {
117
+ whatsNewCallout.value?.close();
118
+ whatsNewCallout.value = void 0;
119
+ };
120
+ const dismissWhatsNewCallout = () => {
121
+ lastDismissedWhatsNewCalloutStorage.value = JSON.stringify(whatsNewArticles.value.map((item) => item.id));
122
+ };
123
+ const shouldShowWhatsNewCallout = () => {
124
+ const createdAt = usersStore.currentUser?.createdAt;
125
+ let hasNewArticle = false;
126
+ if (createdAt) {
127
+ const userCreatedAt = new Date(createdAt).getTime();
128
+ hasNewArticle = whatsNewArticles.value.some((item) => {
129
+ return (item.updatedAt ? new Date(item.updatedAt).getTime() : 0) > userCreatedAt;
130
+ });
131
+ } else hasNewArticle = true;
132
+ const allArticlesDismissed = whatsNewArticles.value.every((item) => lastDismissedWhatsNewCallout.value.includes(item.id));
133
+ return hasNewArticle && !allArticlesDismissed;
134
+ };
135
+ const fetchWhatsNew = async () => {
136
+ try {
137
+ const { enabled, whatsNewEnabled, whatsNewEndpoint } = versionNotificationSettings.value;
138
+ if (enabled && whatsNewEnabled && whatsNewEndpoint) {
139
+ const rootStore = require_useRootStore.useRootStore();
140
+ const current = rootStore.versionCli;
141
+ const instanceId = rootStore.instanceId;
142
+ const section = await __n8n_rest_api_client_api_versions.getWhatsNewSection(whatsNewEndpoint, current, instanceId);
143
+ if (section.items?.length > 0) {
144
+ setWhatsNew(section);
145
+ if (shouldShowWhatsNewCallout()) {
146
+ whatsNewCallout.value = showMessage({
147
+ title: whatsNew.value.title,
148
+ message: whatsNew.value.calloutText,
149
+ duration: 0,
150
+ position: "bottom-left",
151
+ customClass: "clickable whats-new-notification",
152
+ onClick: () => {
153
+ const articleId = whatsNew.value.items[0]?.id ?? 0;
154
+ telemetry.track("User clicked on what's new notification", { article_id: articleId });
155
+ modalOpeners.value.openModalWithData({
156
+ name: __n8n_frontend_constants_versions.WHATS_NEW_MODAL_KEY,
157
+ data: { articleId }
158
+ });
159
+ }
160
+ });
161
+ dismissWhatsNewCallout();
162
+ }
163
+ }
164
+ }
165
+ } catch (e) {
166
+ console.error("Failed to fetch Whats New section:", e);
167
+ }
168
+ };
169
+ const initialize = (settings) => {
170
+ versionNotificationSettings.value = settings;
171
+ };
172
+ const checkForNewVersions = async () => {
173
+ if (!areNotificationsEnabled.value) return;
174
+ await Promise.all([fetchVersions(), fetchWhatsNew()]);
175
+ if (currentVersion.value && currentVersion.value.hasSecurityIssue && nextVersions.value.length) {
176
+ const fixVersion = currentVersion.value.securityIssueFixVersion;
177
+ let message = "Please update to latest version.";
178
+ if (fixVersion) message = `Please update to version ${fixVersion} or higher.`;
179
+ message = `${message} <a class="primary-color">More info</a>`;
180
+ showToast({
181
+ title: "Critical update available",
182
+ message,
183
+ onClick: () => {
184
+ modalOpeners.value.openModal(__n8n_frontend_constants_versions.VERSIONS_MODAL_KEY);
185
+ },
186
+ closeOnClick: true,
187
+ customClass: "clickable",
188
+ type: "warning",
189
+ duration: 0
190
+ });
191
+ }
192
+ };
193
+ return {
194
+ currentVersion,
195
+ latestVersion,
196
+ nextVersions,
197
+ hasVersionUpdates,
198
+ hasSignificantUpdates,
199
+ areNotificationsEnabled,
200
+ infoUrl,
201
+ fetchVersions,
202
+ setVersions,
203
+ initialize,
204
+ registerModalOpeners,
205
+ checkForNewVersions,
206
+ fetchWhatsNew,
207
+ whatsNew,
208
+ whatsNewArticles,
209
+ isWhatsNewArticleRead,
210
+ setWhatsNewArticleRead,
211
+ closeWhatsNewCallout,
212
+ shouldShowWhatsNewCallout,
213
+ dismissWhatsNewCallout
214
+ };
215
+ });
216
+
217
+ //#endregion
218
+ Object.defineProperty(exports, 'SEMVER_REGEX', {
219
+ enumerable: true,
220
+ get: function () {
221
+ return SEMVER_REGEX;
222
+ }
223
+ });
224
+ Object.defineProperty(exports, 'useVersionsStore', {
225
+ enumerable: true,
226
+ get: function () {
227
+ return useVersionsStore;
228
+ }
229
+ });
230
+ //# sourceMappingURL=versions2.store.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions2.store.cjs","names":["STORES","useSettingsStore","useUsersStore","LOCAL_STORAGE_READ_WHATS_NEW_ARTICLES","LOCAL_STORAGE_DISMISSED_WHATS_NEW_CALLOUT","useRootStore","versionsApi","WHATS_NEW_MODAL_KEY","VERSIONS_MODAL_KEY"],"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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"}