n8n-editor-ui 1.112.1 → 1.113.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 (126) hide show
  1. package/.build/cache-marker +1 -0
  2. package/.build/node-popularity.json +3918 -0
  3. package/dist/assets/{AddDataStoreModal-C9lDhooH.js → AddDataStoreModal-BpBgou0E.js} +1 -1
  4. package/dist/assets/{AnimatedSpinner-DoiaSsyo.js → AnimatedSpinner-BVVzuhy8.js} +1 -1
  5. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-C68foyxp.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-D9y_kml7.js} +1 -1
  6. package/dist/assets/{AuthView-CLDlKRpw.js → AuthView-DLJKQ74o.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-iG7PgYdd.js → ChangePasswordView-BMWrkaiq.js} +3 -3
  8. package/dist/assets/CollectionParameter-Cb7K8toD.js +4 -0
  9. package/dist/assets/{ConsumedTokensDetails.vue_vue_type_script_setup_true_lang-DlF8qxM5.js → ConsumedTokensDetails.vue_vue_type_script_setup_true_lang-CgS2Cb5Q.js} +1 -1
  10. package/dist/assets/{CredentialsView-CYgIFP1z.js → CredentialsView-DHSg9xJ1.js} +10 -10
  11. package/dist/assets/{DataStoreActions.vue_vue_type_script_setup_true_lang-BC-HriQ3.js → DataStoreActions.vue_vue_type_script_setup_true_lang-C2Dn9B2o.js} +1 -1
  12. package/dist/assets/{DataStoreDetailsView-C8fMxukz.css → DataStoreDetailsView-Bc-J9ZrW.css} +224 -46
  13. package/dist/assets/{DataStoreDetailsView-CtMeAyyY.js → DataStoreDetailsView-yJ7Ifouw.js} +8117 -339
  14. package/dist/assets/{DataStoreView-D0R0E_jH.css → DataStoreView-BqQv7QeU.css} +10 -9
  15. package/dist/assets/{DataStoreView-B1Kxtjnl.js → DataStoreView-jb9J_g-Y.js} +35 -16
  16. package/dist/assets/{DemoFooter-BPQy7EdR.js → DemoFooter-BYvzzkpQ.js} +6 -6
  17. package/dist/assets/{EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-D9e3ObnE.js → EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-BfHfE-dU.js} +1 -1
  18. package/dist/assets/{EntityNotFound-DDHiVWRe.js → EntityNotFound-lPracI2m.js} +1 -1
  19. package/dist/assets/{EntityUnAuthorised-Clm3_4En.js → EntityUnAuthorised-zuygLqjz.js} +1 -1
  20. package/dist/assets/{ErrorView-CrYsrADA.js → ErrorView-C_k5_sJ0.js} +1 -1
  21. package/dist/assets/{EvaluationsRootView-C0OyvjOt.js → EvaluationsRootView-DP2_MhvN.js} +1 -1
  22. package/dist/assets/{EvaluationsView-BcMhW8o6.js → EvaluationsView-BHRPpTsS.js} +3 -3
  23. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-BmjUbn85.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-DTpILxvC.js} +2 -2
  24. package/dist/assets/{ExecutionsView-GKNLT5Ec.css → ExecutionsView-B5yiPX6U.css} +1 -1
  25. package/dist/assets/{ExecutionsView-CdMuQ6Ay.js → ExecutionsView-Bv3YVM-6.js} +26 -20
  26. package/dist/assets/{FixedCollectionParameter-DNRbGHuU.js → FixedCollectionParameter-CZc3TqBt.js} +1 -1
  27. package/dist/assets/{ForgotMyPasswordView-CVYkGoS6.js → ForgotMyPasswordView-CaiqDg42.js} +3 -3
  28. package/dist/assets/{InfoAccordion-DXq9DJ4j.js → InfoAccordion-TbgnFURd.js} +1 -1
  29. package/dist/assets/{InsightsChartAverageRuntime-CXByy6Zo.js → InsightsChartAverageRuntime-BqCmV_C3.js} +4 -4
  30. package/dist/assets/{InsightsChartFailed-9zaeZgek.js → InsightsChartFailed-nhNAvWJ-.js} +4 -4
  31. package/dist/assets/{InsightsChartFailureRate-DT96wC8C.js → InsightsChartFailureRate-Ca8Ar9nD.js} +4 -4
  32. package/dist/assets/{InsightsChartTimeSaved-C6pLWWxa.js → InsightsChartTimeSaved-CuO9b6Em.js} +4 -4
  33. package/dist/assets/{InsightsChartTotal-Cc0YLVD7.js → InsightsChartTotal-Dk2_nvoT.js} +4 -4
  34. package/dist/assets/{InsightsDashboard-C27Avzrv.css → InsightsDashboard-Bo0U18-6.css} +18 -12
  35. package/dist/assets/{InsightsDashboard-qL2EE60l.js → InsightsDashboard-zCjTFLpM.js} +68 -35
  36. package/dist/assets/{InsightsPaywall-C_2IPEhI.js → InsightsPaywall-CBtrv5fk.js} +1 -1
  37. package/dist/assets/{InsightsSummary-tylKFBgw.js → InsightsSummary-BWRporX0.js} +1 -1
  38. package/dist/assets/{InsightsTableWorkflows-BwRj0aXe.js → InsightsTableWorkflows-DlGA2gWN.js} +4 -4
  39. package/dist/assets/{Logo-DqC1X5we.js → Logo-ayCSvzHf.js} +1 -1
  40. package/dist/assets/{LogsPanel-DZguGtyt.js → LogsPanel-DwPSXTSp.js} +34 -26
  41. package/dist/assets/{MainHeader-IFzZPcNW.js → MainHeader-BGOzl1ir.js} +11 -11
  42. package/dist/assets/{MainSidebar-D-2Yb5yU.js → MainSidebar-CGhxTuih.js} +27 -10
  43. package/dist/assets/{NodeCreation-CrPTESjn.js → NodeCreation-C2TX7WTu.js} +3 -3
  44. package/dist/assets/{NodeCreator-Db1k7Npw.js → NodeCreator-tQVCw9Uh.js} +1 -1
  45. package/dist/assets/{NodeDetailsView-T6l22FLo.js → NodeDetailsView-C-BCfvgR.js} +13 -13
  46. package/dist/assets/{NodeDetailsViewV2-Caf-LQD7.js → NodeDetailsViewV2-CHkxHxvz.js} +13 -13
  47. package/dist/assets/{NodeView-B08ajmmZ.js → NodeView-B6Bv6TYS.js} +13 -12
  48. package/dist/assets/{PageViewLayout-B01Cj9Ag.js → PageViewLayout-_SQAsKsq.js} +1 -1
  49. package/dist/assets/{PrebuiltAgentTemplatesView-ZbB8Spq8.js → PrebuiltAgentTemplatesView-DOI6Oras.js} +2 -2
  50. package/dist/assets/{ProjectBreadcrumb-vTjbzQHC.js → ProjectBreadcrumb-DdovGxoT.js} +1 -1
  51. package/dist/assets/{ProjectHeader-CsH8YD16.js → ProjectHeader-CmNr3RiV.js} +3 -3
  52. package/dist/assets/{ProjectSettings-CCVXNK3G.css → ProjectSettings-B5z1mrGW.css} +155 -9
  53. package/dist/assets/{ProjectSettings-CYy5LBLu.js → ProjectSettings-BLw1-aa2.js} +490 -121
  54. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-DOMRXCVj.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-BvsEzRu6.js} +1 -1
  55. package/dist/assets/{ResourcesListLayout-CEq6DTya.js → ResourcesListLayout-CFoOOQpo.js} +4 -4
  56. package/dist/assets/{RunDataJson-CM54dhgQ.js → RunDataJson-KBqmqbfA.js} +3 -3
  57. package/dist/assets/{RunDataJsonActions-BGkwaXF1.js → RunDataJsonActions-CKFc7ymK.js} +1 -1
  58. package/dist/assets/{RunDataParsedAiContent-CCScHhrV.js → RunDataParsedAiContent-Ce_ctsro.js} +2 -2
  59. package/dist/assets/{RunDataSearch-D8tSIc5y.js → RunDataSearch-gM--YmOH.js} +1 -1
  60. package/dist/assets/{RunDataTable-y4SItH7m.js → RunDataTable-CV1IQEC1.js} +1 -1
  61. package/dist/assets/{SamlOnboarding-B-qxZA7T.js → SamlOnboarding-sD7YkjXE.js} +3 -3
  62. package/dist/assets/{SelectedItemsInfo-8rTveqLV.js → SelectedItemsInfo-CWRoXt5N.js} +1 -1
  63. package/dist/assets/{SettingsApiView-Crwc7f2q.js → SettingsApiView-CjxSweZ2.js} +1 -1
  64. package/dist/assets/{SettingsCommunityNodesView-D_CDclON.js → SettingsCommunityNodesView-BZS-1Pu8.js} +6 -6
  65. package/dist/assets/{SettingsExternalSecrets-D9EYRw94.js → SettingsExternalSecrets-CUP7WmUX.js} +1 -1
  66. package/dist/assets/{SettingsLdapView-IWmIFFmQ.js → SettingsLdapView-CAcFtpvb.js} +1 -1
  67. package/dist/assets/{SettingsLogStreamingView-T9ajKTLt.js → SettingsLogStreamingView-Db06ainF.js} +1 -1
  68. package/dist/assets/{SettingsPersonalView-ClpcCCUK.js → SettingsPersonalView-CFAcW525.js} +15 -2
  69. package/dist/assets/{SettingsSourceControl-D4MKPsIp.js → SettingsSourceControl-Cl0Z45op.js} +1 -1
  70. package/dist/assets/{SettingsSso-Dh0TCa3N.js → SettingsSso-hvpitcmh.js} +1 -1
  71. package/dist/assets/{SettingsUsageAndPlan-_VxSs28G.css → SettingsUsageAndPlan-CfFJy6fo.css} +3 -3
  72. package/dist/assets/{SettingsUsageAndPlan-DMz52D_8.js → SettingsUsageAndPlan-pIa02R8X.js} +3 -7
  73. package/dist/assets/{SettingsUsersView-CyOqQQ1T.js → SettingsUsersView-Bc_d_j_C.js} +10 -24
  74. package/dist/assets/{SettingsView-9XSvAxZn.js → SettingsView-k1Qk6b9u.js} +1 -1
  75. package/dist/assets/{SetupView-CaQUQHtZ.js → SetupView-CgueTipX.js} +3 -3
  76. package/dist/assets/{SetupWorkflowCredentialsButton-CLPdPWR-.js → SetupWorkflowCredentialsButton-9ZdgoxH6.js} +1 -1
  77. package/dist/assets/{SetupWorkflowFromTemplateView-Cwy86CRf.js → SetupWorkflowFromTemplateView-DImn3MLc.js} +3 -3
  78. package/dist/assets/{SigninView-B1CFcKZW.js → SigninView-Dy2njlT9.js} +3 -3
  79. package/dist/assets/{SignoutView-tXEnZbBW.js → SignoutView-BW4OLG4T.js} +1 -1
  80. package/dist/assets/{SignupView-tG0nF3IX.js → SignupView-DqiOjgU_.js} +3 -3
  81. package/dist/assets/{TableBase-Bk0Ksvri.js → TableBase-J7qyS7Oi.js} +1 -1
  82. package/dist/assets/{Tags-bLJnzJ9O.js → Tags-DHmekS5b.js} +1 -1
  83. package/dist/assets/{TemplateDetails-DwB2MNDs.js → TemplateDetails-lA7coCfr.js} +2 -2
  84. package/dist/assets/{TemplateList-xz6dq_b_.js → TemplateList-C_enJUC-.js} +1 -1
  85. package/dist/assets/{TemplatesCollectionView-CBHrX6qh.js → TemplatesCollectionView-Bvr4Jl4e.js} +6 -6
  86. package/dist/assets/{TemplatesSearchView-DlCohPQw.js → TemplatesSearchView-DNEWIXcA.js} +3 -3
  87. package/dist/assets/{TemplatesView-BWRC7u13.js → TemplatesView-D6kBDKHq.js} +1 -1
  88. package/dist/assets/{TemplatesWorkflowView-IFi-aXTJ.js → TemplatesWorkflowView-CxpvFC33.js} +6 -6
  89. package/dist/assets/{TriggerPanel-CGEgWBP1.js → TriggerPanel-aOMoGQPb.js} +5 -5
  90. package/dist/assets/{VariablesView-DCIpb3py.js → VariablesView-CF7zW6sO.js} +6 -6
  91. package/dist/assets/{WorkerView-BNJtp3_b.js → WorkerView-CPSFDQ3M.js} +8 -8
  92. package/dist/assets/{WorkflowActivator-GWpvfdPq.js → WorkflowActivator-2k4uBcXx.js} +3 -3
  93. package/dist/assets/{WorkflowExecutionsInfoAccordion-DyC6zINy.js → WorkflowExecutionsInfoAccordion-DLSyy7P3.js} +2 -2
  94. package/dist/assets/{WorkflowExecutionsLandingPage-CHU6rsbS.js → WorkflowExecutionsLandingPage-B0lwEkzs.js} +3 -3
  95. package/dist/assets/{WorkflowExecutionsPreview-BRZcVWz8.js → WorkflowExecutionsPreview-fdG8WvjQ.js} +4 -4
  96. package/dist/assets/{WorkflowExecutionsView-D2avX462.js → WorkflowExecutionsView-DoOsdRNS.js} +12 -14
  97. package/dist/assets/{WorkflowExecutionsView-C_xuUSa8.css → WorkflowExecutionsView-DqWqyiNg.css} +2 -2
  98. package/dist/assets/{WorkflowHistory-CezxUWJ3.js → WorkflowHistory-BmCEHmbX.js} +2 -2
  99. package/dist/assets/{WorkflowOnboardingView-CoLRNMn7.js → WorkflowOnboardingView-DoANwef9.js} +1 -1
  100. package/dist/assets/{WorkflowPreview-6_5498ls.js → WorkflowPreview-BcVSQJ1r.js} +1 -1
  101. package/dist/assets/{WorkflowsView-yo-aPIAy.js → WorkflowsView-DfkdEDYd.js} +14 -14
  102. package/dist/assets/{canvas-CNbb2A4n.js → canvas-DjkOwLgJ.js} +1 -1
  103. package/dist/assets/{chartjs.utils-BuEfxZRs.js → chartjs.utils-P0M5ijsc.js} +2 -2
  104. package/dist/assets/{core-BmUd0ZQy.js → core-WbBbE4BE.js} +1 -1
  105. package/dist/assets/{global-link-actions-DLwTpw-D.js → global-link-actions-Cq9wmyMP.js} +1 -1
  106. package/dist/assets/{index-B7wrqKiF.css → index-CpPc1kM8.css} +331 -206
  107. package/dist/assets/{index-BqqmY62y.js → index-DGLJxfnn.js} +8240 -4664
  108. package/dist/assets/{index-B4kldndn.js → index-vcIMPEwS.js} +1 -1
  109. package/dist/assets/{pickBy-D_Xqfu3B.js → pickBy-ClKklBll.js} +1 -1
  110. package/dist/assets/{readyToRunWorkflows.store-DV_gQvCM.js → readyToRunWorkflows.store-By37rv7G.js} +1 -1
  111. package/dist/assets/readyToRunWorkflowsV2.store-Dl9lSVnl.js +648 -0
  112. package/dist/assets/{templateActions-BswjlHEI.js → templateActions-DIHXnHcb.js} +1 -1
  113. package/dist/assets/{useBeforeUnload-BfDs84Xo.js → useBeforeUnload-DixKQhw1.js} +1 -1
  114. package/dist/assets/{useExecutionDebugging-ZrtkQtcL.js → useExecutionDebugging-CONIO3Vz.js} +1 -1
  115. package/dist/assets/{useImportCurlCommand-TipLhFW-.js → useImportCurlCommand-CcLwFKyp.js} +1 -1
  116. package/dist/assets/{useProjectPages-DGeR5Bq7.js → useProjectPages-eaNvpOz-.js} +1 -1
  117. package/dist/assets/{usePushConnection-BxoIfCAQ.js → usePushConnection-C9lQfiNc.js} +12 -7
  118. package/dist/assets/{useWorkflowActivate-Dk_tmPQm.js → useWorkflowActivate-ByzVgA6z.js} +1 -1
  119. package/dist/index.html +2 -2
  120. package/package.json +1 -1
  121. package/scripts/fetch-node-popularity.mjs +90 -0
  122. package/turbo.json +19 -0
  123. package/vite/vite-plugin-node-popularity.mts +32 -0
  124. package/vite.config.mts +2 -0
  125. package/dist/assets/CollectionParameter-CYXwrQBH.js +0 -4
  126. package/dist/assets/readyToRunWorkflowsV2.store-ZhxGm4dM.js +0 -137
@@ -1,4 +1,4 @@
1
- import { a3 as useRoute, x as computed, V as VIEWS, db as reactive } from "./index-BqqmY62y.js";
1
+ import { a3 as useRoute, x as computed, V as VIEWS, db as reactive } from "./index-DGLJxfnn.js";
2
2
  const useProjectPages = () => {
3
3
  const route = useRoute();
4
4
  const isProjectsSubPage = computed(() => route.params?.projectId !== void 0);
@@ -1,7 +1,7 @@
1
- import { fa as makeRestApiRequest, a2 as useWorkflowsStore, Q as useUIStore, fb as clearPopupWindowState, am as useTelemetry, fc as isPrebuiltAgentTemplateId, fd as isTutorialTemplateId, co as parse, v as useSettingsStore, az as useWorkflowSaving, aA as useWorkflowHelpers, al as WORKFLOW_SETTINGS_MODAL_KEY, a as useToast, fe as generateNodesGraph, c as useI18n, ff as getExecutionErrorToastConfiguration, ae as useNodeTypesStore, fg as getTriggerNodeServiceName, bM as useNodeHelpers, bq as useExternalHooks, fh as codeNodeEditorEventBus, fi as SampleTemplates, dr as EVALUATION_TRIGGER_NODE_TYPE, bN as useRunWorkflow, fj as getExecutionErrorMessage, de as useCredentialsStore, fk as useAssistantStore, fl as TRIMMED_TASK_DATA_CONNECTIONS_KEY, fm as useSchemaPreviewStore, fn as isCommunityPackageName, a0 as defineStore, au as useRootStore, a1 as usePushConnectionStore, r as ref } from "./index-BqqmY62y.js";
2
- import { g as globalLinkActionsEventBus } from "./global-link-actions-DLwTpw-D.js";
3
- import { u as useAITemplatesStarterCollectionStore, a as useReadyToRunWorkflowsStore } from "./readyToRunWorkflows.store-DV_gQvCM.js";
4
- import { u as useReadyToRunWorkflowsV2Store } from "./readyToRunWorkflowsV2.store-ZhxGm4dM.js";
1
+ import { fc as makeRestApiRequest, a2 as useWorkflowsStore, Q as useUIStore, fd as clearPopupWindowState, am as useTelemetry, fe as isPrebuiltAgentTemplateId, ff as isTutorialTemplateId, co as parse, v as useSettingsStore, az as useWorkflowSaving, aA as useWorkflowHelpers, al as WORKFLOW_SETTINGS_MODAL_KEY, a as useToast, fg as generateNodesGraph, c as useI18n, fh as getExecutionErrorToastConfiguration, ae as useNodeTypesStore, fi as getTriggerNodeServiceName, bM as useNodeHelpers, bq as useExternalHooks, fj as codeNodeEditorEventBus, fk as SampleTemplates, dr as EVALUATION_TRIGGER_NODE_TYPE, bN as useRunWorkflow, fl as getExecutionErrorMessage, de as useCredentialsStore, fm as useAssistantStore, dE as isValidNodeConnectionType, fn as TRIMMED_TASK_DATA_CONNECTIONS_KEY, fo as useSchemaPreviewStore, fp as isCommunityPackageName, a0 as defineStore, au as useRootStore, a1 as usePushConnectionStore, r as ref } from "./index-DGLJxfnn.js";
2
+ import { g as globalLinkActionsEventBus } from "./global-link-actions-Cq9wmyMP.js";
3
+ import { u as useAITemplatesStarterCollectionStore, a as useReadyToRunWorkflowsStore } from "./readyToRunWorkflows.store-By37rv7G.js";
4
+ import { u as useReadyToRunWorkflowsV2Store } from "./readyToRunWorkflowsV2.store-Dl9lSVnl.js";
5
5
  var GET_STATUS_ENDPOINT = "/orchestration/worker/status";
6
6
  var sendGetWorkerStatus = async (context) => {
7
7
  await makeRestApiRequest(context, "POST", GET_STATUS_ENDPOINT);
@@ -353,10 +353,15 @@ async function nodeExecuteAfter({ data: pushData }) {
353
353
  const placeholderOutputData = {
354
354
  main: []
355
355
  };
356
- if (typeof pushData.itemCount === "number") {
356
+ if (pushData.itemCountByConnectionType && typeof pushData.itemCountByConnectionType === "object") {
357
357
  const fillObject = { json: { [TRIMMED_TASK_DATA_CONNECTIONS_KEY]: true } };
358
- const fillArray = new Array(pushData.itemCount).fill(fillObject);
359
- placeholderOutputData.main = [fillArray];
358
+ for (const [connectionType, outputs] of Object.entries(pushData.itemCountByConnectionType)) {
359
+ if (isValidNodeConnectionType(connectionType)) {
360
+ placeholderOutputData[connectionType] = outputs.map(
361
+ (count) => Array.from({ length: count }, () => fillObject)
362
+ );
363
+ }
364
+ }
360
365
  }
361
366
  const pushDataWithPlaceholderOutputData = {
362
367
  ...pushData,
@@ -1,4 +1,4 @@
1
- import { r as ref, b as useRouter, aA as useWorkflowHelpers, az as useWorkflowSaving, a2 as useWorkflowsStore, Q as useUIStore, a as useToast, ax as useNpsSurveyStore, a4 as PLACEHOLDER_EMPTY_WORKFLOW_ID, am as useTelemetry, bq as useExternalHooks, c as useI18n, bd as useStorage, fz as LOCAL_STORAGE_ACTIVATION_FLAG, ah as WORKFLOW_ACTIVE_MODAL_KEY } from "./index-BqqmY62y.js";
1
+ import { r as ref, b as useRouter, aA as useWorkflowHelpers, az as useWorkflowSaving, a2 as useWorkflowsStore, Q as useUIStore, a as useToast, ax as useNpsSurveyStore, a4 as PLACEHOLDER_EMPTY_WORKFLOW_ID, am as useTelemetry, bq as useExternalHooks, c as useI18n, bd as useStorage, fz as LOCAL_STORAGE_ACTIVATION_FLAG, ah as WORKFLOW_ACTIVE_MODAL_KEY } from "./index-DGLJxfnn.js";
2
2
  function useWorkflowActivate() {
3
3
  const updatingWorkflowActivation = ref(false);
4
4
  const router = useRouter();
package/dist/index.html CHANGED
@@ -13,8 +13,8 @@
13
13
  <script src="/{{BASE_PATH}}/static/posthog.init.js" type="text/javascript"></script>
14
14
 
15
15
  <title>n8n.io - Workflow Automation</title>
16
- <script type="module" crossorigin src="/{{BASE_PATH}}/assets/index-BqqmY62y.js"></script>
17
- <link rel="stylesheet" crossorigin href="/{{BASE_PATH}}/assets/index-B7wrqKiF.css">
16
+ <script type="module" crossorigin src="/{{BASE_PATH}}/assets/index-DGLJxfnn.js"></script>
17
+ <link rel="stylesheet" crossorigin href="/{{BASE_PATH}}/assets/index-CpPc1kM8.css">
18
18
  </head>
19
19
  <body>
20
20
  <noscript>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-editor-ui",
3
- "version": "1.112.1",
3
+ "version": "1.113.0",
4
4
  "description": "Workflow Editor UI for n8n",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ const POPULARITY_ENDPOINT =
8
+ process.env.NODE_POPULARITY_ENDPOINT ||
9
+ 'https://internal.users.n8n.cloud/webhook/nodes-popularity-scores';
10
+ const BUILD_DIR = path.join(__dirname, '..', '.build');
11
+ const OUTPUT_FILE = path.join(BUILD_DIR, 'node-popularity.json');
12
+
13
+ async function ensureBuildDir() {
14
+ try {
15
+ await fs.mkdir(BUILD_DIR, { recursive: true });
16
+ } catch (error) {
17
+ // Directory might already exist, that's fine
18
+ }
19
+ }
20
+
21
+ async function fetchPopularityData() {
22
+ try {
23
+ console.log('Fetching node popularity data from:', POPULARITY_ENDPOINT);
24
+ const response = await fetch(POPULARITY_ENDPOINT, {
25
+ signal: AbortSignal.timeout(5000),
26
+ });
27
+
28
+ if (!response.ok) {
29
+ throw new Error(`HTTP error! status: ${response.status}`);
30
+ }
31
+
32
+ const data = await response.json();
33
+ console.log(`Successfully fetched popularity data for ${data.length} nodes`);
34
+ return data;
35
+ } catch (error) {
36
+ console.warn('Failed to fetch node popularity data:', error.message);
37
+ return null;
38
+ }
39
+ }
40
+
41
+ async function getExistingData() {
42
+ try {
43
+ const content = await fs.readFile(OUTPUT_FILE, 'utf-8');
44
+ return JSON.parse(content);
45
+ } catch (error) {
46
+ // File doesn't exist or is invalid
47
+ return null;
48
+ }
49
+ }
50
+
51
+ async function savePopularityData(data) {
52
+ await ensureBuildDir();
53
+ await fs.writeFile(OUTPUT_FILE, JSON.stringify(data, null, 2));
54
+ console.log(`Saved popularity data to ${OUTPUT_FILE} with ${data.length} nodes`);
55
+ }
56
+
57
+ async function fallbackToExistingData() {
58
+ const existingData = await getExistingData();
59
+
60
+ if (existingData) {
61
+ console.log('Using existing cached data - no changes made');
62
+ // Don't regenerate the file, keep the existing one
63
+ } else {
64
+ console.error('No data available - neither from API nor cache');
65
+ console.error('Creating empty placeholder file to avoid build failure');
66
+ await savePopularityData([]);
67
+ }
68
+ }
69
+
70
+ async function main() {
71
+ try {
72
+ // Try to fetch fresh data
73
+ const freshData = await fetchPopularityData();
74
+
75
+ if (freshData && Array.isArray(freshData) && freshData.length > 0) {
76
+ // Save the fresh data
77
+ await savePopularityData(freshData);
78
+ } else {
79
+ // Fetching failed, check if we have existing data
80
+ console.log('API unavailable, checking for existing cached data');
81
+ await fallbackToExistingData();
82
+ }
83
+ } catch (error) {
84
+ console.error('Error in fetch-node-popularity script:', error);
85
+
86
+ await fallbackToExistingData();
87
+ }
88
+ }
89
+
90
+ main();
package/turbo.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": ["//"],
3
+ "tasks": {
4
+ "popularity-cache-marker": {
5
+ "cache": false,
6
+ "outputs": [".build/cache-marker"]
7
+ },
8
+ "fetch-popularity": {
9
+ "dependsOn": ["popularity-cache-marker"],
10
+ "cache": true,
11
+ "outputs": [".build/node-popularity.json"],
12
+ "inputs": ["scripts/fetch-node-popularity.mjs", ".build/cache-marker"]
13
+ },
14
+ "build": {
15
+ "dependsOn": ["^build", "fetch-popularity"],
16
+ "outputs": ["dist/**"]
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,32 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import type { Plugin } from 'vite';
4
+
5
+ const VIRTUAL_MODULE_ID = 'virtual:node-popularity-data';
6
+ const RESOLVED_VIRTUAL_MODULE_ID = '\0' + VIRTUAL_MODULE_ID;
7
+
8
+ export function nodePopularityPlugin(): Plugin {
9
+ return {
10
+ name: 'node-popularity-plugin',
11
+ resolveId(id) {
12
+ if (id === VIRTUAL_MODULE_ID) {
13
+ return RESOLVED_VIRTUAL_MODULE_ID;
14
+ }
15
+ },
16
+ async load(id) {
17
+ if (id === RESOLVED_VIRTUAL_MODULE_ID) {
18
+ // Try to load the data from the build directory
19
+ const buildDataPath = path.join(process.cwd(), '.build', 'node-popularity.json');
20
+
21
+ try {
22
+ const data = await fs.readFile(buildDataPath, 'utf-8');
23
+ return `export default ${data}`;
24
+ } catch (error) {
25
+ // If file doesn't exist, return empty array
26
+ console.warn('Node popularity data not found at', buildDataPath, '- using empty array');
27
+ return 'export default []';
28
+ }
29
+ }
30
+ },
31
+ };
32
+ }
package/vite.config.mts CHANGED
@@ -13,6 +13,7 @@ import browserslistToEsbuild from 'browserslist-to-esbuild';
13
13
  import legacy from '@vitejs/plugin-legacy';
14
14
  import browserslist from 'browserslist';
15
15
  import { isLocaleFile, sendLocaleUpdate } from './vite/i18n-locales-hmr-helpers';
16
+ import { nodePopularityPlugin } from './vite/vite-plugin-node-popularity.mjs';
16
17
 
17
18
  const publicPath = process.env.VUE_APP_PUBLIC_PATH || '/';
18
19
 
@@ -75,6 +76,7 @@ const alias = [
75
76
  ];
76
77
 
77
78
  const plugins: UserConfig['plugins'] = [
79
+ nodePopularityPlugin(),
78
80
  icons({
79
81
  compiler: 'vue3',
80
82
  autoInstall: true,
@@ -1,4 +0,0 @@
1
- import { gI as _sfc_main } from "./index-BqqmY62y.js";
2
- export {
3
- _sfc_main as default
4
- };
@@ -1,137 +0,0 @@
1
- import { aw as useFoldersStore, a3 as useRoute, a0 as defineStore, a as useToast, b as useRouter, de as useCredentialsStore, u as useUsersStore, v as useSettingsStore, di as usePostHog, bc as useCloudPlanStore, x as computed, fu as READY_TO_RUN_V2_EXPERIMENT, a$ as useLocalStorage, r as ref, fq as OPEN_AI_API_CREDENTIAL_TYPE, am as useTelemetry, c as useI18n, fv as READY_TO_RUN_WORKFLOW_V2, fw as READY_TO_RUN_WORKFLOW_V1, V as VIEWS, a5 as STORES } from "./index-BqqmY62y.js";
2
- import { u as useProjectPages } from "./useProjectPages-DGeR5Bq7.js";
3
- function useEmptyStateDetection() {
4
- const foldersStore = useFoldersStore();
5
- const projectPages = useProjectPages();
6
- const route = useRoute();
7
- const isTrulyEmpty = (currentRoute = route) => {
8
- const hasNoWorkflows = foldersStore.totalWorkflowCount === 0;
9
- const isNotInSpecificFolder = !currentRoute.params?.folderId;
10
- const isMainWorkflowsPage = projectPages.isOverviewSubPage || !projectPages.isSharedSubPage;
11
- const hasSearchQuery = !!currentRoute.query?.search;
12
- const hasFilters = !!(currentRoute.query?.status || currentRoute.query?.tags || currentRoute.query?.showArchived || currentRoute.query?.homeProject);
13
- return hasNoWorkflows && isNotInSpecificFolder && isMainWorkflowsPage && !hasSearchQuery && !hasFilters;
14
- };
15
- const shouldShowSimplifiedLayout = (currentRoute, isFeatureEnabled, loading) => {
16
- if (loading || !isFeatureEnabled) {
17
- return false;
18
- }
19
- return isTrulyEmpty(currentRoute);
20
- };
21
- return {
22
- isTrulyEmpty,
23
- shouldShowSimplifiedLayout
24
- };
25
- }
26
- const LOCAL_STORAGE_CREDENTIAL_KEY = "N8N_READY_TO_RUN_V2_OPENAI_CREDENTIAL_ID";
27
- const useReadyToRunWorkflowsV2Store = defineStore(
28
- STORES.EXPERIMENT_READY_TO_RUN_WORKFLOWS_V2,
29
- () => {
30
- const telemetry = useTelemetry();
31
- const i18n = useI18n();
32
- const toast = useToast();
33
- const router = useRouter();
34
- const credentialsStore = useCredentialsStore();
35
- const usersStore = useUsersStore();
36
- const settingsStore = useSettingsStore();
37
- const posthogStore = usePostHog();
38
- const cloudPlanStore = useCloudPlanStore();
39
- const isFeatureEnabled = computed(() => {
40
- const variant = posthogStore.getVariant(READY_TO_RUN_V2_EXPERIMENT.name);
41
- return (variant === READY_TO_RUN_V2_EXPERIMENT.variant1 || variant === READY_TO_RUN_V2_EXPERIMENT.variant2) && cloudPlanStore.userIsTrialing;
42
- });
43
- const claimedCredentialIdRef = useLocalStorage(LOCAL_STORAGE_CREDENTIAL_KEY, "");
44
- const claimingCredits = ref(false);
45
- const userHasOpenAiCredentialAlready = computed(
46
- () => !!credentialsStore.allCredentials.filter(
47
- (credential) => credential.type === OPEN_AI_API_CREDENTIAL_TYPE
48
- ).length
49
- );
50
- const userHasClaimedAiCreditsAlready = computed(
51
- () => !!usersStore.currentUser?.settings?.userClaimedAiCredits
52
- );
53
- const userCanClaimOpenAiCredits = computed(() => {
54
- return settingsStore.isAiCreditsEnabled && !userHasOpenAiCredentialAlready.value && !userHasClaimedAiCreditsAlready.value;
55
- });
56
- const getCurrentVariant = () => {
57
- return posthogStore.getVariant(READY_TO_RUN_V2_EXPERIMENT.name);
58
- };
59
- const trackExecuteAiWorkflow = (status) => {
60
- const variant = getCurrentVariant();
61
- telemetry.track("User executed ready to run AI workflow", {
62
- status,
63
- variant
64
- });
65
- };
66
- const trackExecuteAiWorkflowSuccess = () => {
67
- const variant = getCurrentVariant();
68
- telemetry.track("User executed ready to run AI workflow successfully", {
69
- variant
70
- });
71
- };
72
- const claimFreeAiCredits = async (projectId) => {
73
- claimingCredits.value = true;
74
- try {
75
- const credential = await credentialsStore.claimFreeAiCredits(projectId);
76
- if (usersStore?.currentUser?.settings) {
77
- usersStore.currentUser.settings.userClaimedAiCredits = true;
78
- }
79
- claimedCredentialIdRef.value = credential.id;
80
- telemetry.track("User claimed OpenAI credits");
81
- return credential;
82
- } catch (e) {
83
- toast.showError(
84
- e,
85
- i18n.baseText("freeAi.credits.showError.claim.title"),
86
- i18n.baseText("freeAi.credits.showError.claim.message")
87
- );
88
- throw e;
89
- } finally {
90
- claimingCredits.value = false;
91
- }
92
- };
93
- const openAiWorkflow = async (source, parentFolderId) => {
94
- const variant = getCurrentVariant();
95
- telemetry.track("User opened ready to run AI workflow", {
96
- source,
97
- variant
98
- });
99
- const workflow = variant === READY_TO_RUN_V2_EXPERIMENT.variant2 ? READY_TO_RUN_WORKFLOW_V2 : READY_TO_RUN_WORKFLOW_V1;
100
- await router.push({
101
- name: VIEWS.TEMPLATE_IMPORT,
102
- params: { id: workflow.meta?.templateId },
103
- query: { fromJson: "true", parentFolderId }
104
- });
105
- };
106
- const claimCreditsAndOpenWorkflow = async (source, parentFolderId, projectId) => {
107
- await claimFreeAiCredits(projectId);
108
- await openAiWorkflow(source, parentFolderId);
109
- };
110
- const getCardVisibility = (canCreate, readOnlyEnv, loading) => {
111
- return !loading && isFeatureEnabled.value && userCanClaimOpenAiCredits.value && !readOnlyEnv && canCreate;
112
- };
113
- const getButtonVisibility = (hasWorkflows, canCreate, readOnlyEnv) => {
114
- return isFeatureEnabled.value && userCanClaimOpenAiCredits.value && !readOnlyEnv && canCreate && hasWorkflows;
115
- };
116
- const { shouldShowSimplifiedLayout } = useEmptyStateDetection();
117
- const getSimplifiedLayoutVisibility = (route, loading) => {
118
- return shouldShowSimplifiedLayout(route, isFeatureEnabled.value, loading);
119
- };
120
- return {
121
- isFeatureEnabled,
122
- claimingCredits,
123
- userCanClaimOpenAiCredits,
124
- claimFreeAiCredits,
125
- openAiWorkflow,
126
- claimCreditsAndOpenWorkflow,
127
- getCardVisibility,
128
- getButtonVisibility,
129
- getSimplifiedLayoutVisibility,
130
- trackExecuteAiWorkflow,
131
- trackExecuteAiWorkflowSuccess
132
- };
133
- }
134
- );
135
- export {
136
- useReadyToRunWorkflowsV2Store as u
137
- };