diff --git a/cypress.config.js b/cypress.config.js
index 98bd8956a0..cdcae02e65 100644
--- a/cypress.config.js
+++ b/cypress.config.js
@@ -18,6 +18,5 @@ module.exports = defineConfig({
screenshotOnRunFailure: true,
experimentalInteractiveRunEvents: true,
experimentalSessionAndOrigin: true,
- blockHosts: ['telemetry.n8n.io'],
},
});
diff --git a/package.json b/package.json
index 4148f6d2a2..c82a095bc3 100644
--- a/package.json
+++ b/package.json
@@ -62,7 +62,6 @@
"turbo": "1.10.12",
"typescript": "*",
"vite": "^4.4.7",
- "vite-plugin-ejs": "^1.6.4",
"vitest": "^0.33.0",
"vue-tsc": "^1.8.8"
},
diff --git a/packages/editor-ui/index.html b/packages/editor-ui/index.html
index b237f77b5d..12dbfaeb9d 100644
--- a/packages/editor-ui/index.html
+++ b/packages/editor-ui/index.html
@@ -9,52 +9,7 @@
window.BASE_PATH = '/{{BASE_PATH}}/';
window.REST_ENDPOINT = '{{REST_ENDPOINT}}';
- <% if(!isDev){ %>
-
- <% } %>
-
+
n8n.io - Workflow Automation
diff --git a/packages/editor-ui/src/plugins/telemetry/index.ts b/packages/editor-ui/src/plugins/telemetry/index.ts
index 054a8a7f2b..c7ec049b23 100644
--- a/packages/editor-ui/src/plugins/telemetry/index.ts
+++ b/packages/editor-ui/src/plugins/telemetry/index.ts
@@ -1,9 +1,9 @@
import type { Plugin } from 'vue';
-import type { IDataObject, ITelemetrySettings, ITelemetryTrackProperties } from 'n8n-workflow';
+import type { ITelemetrySettings, ITelemetryTrackProperties, IDataObject } from 'n8n-workflow';
import type { RouteLocation } from 'vue-router';
import type { INodeCreateElement, IUpdateInformation } from '@/Interface';
-import type { IUserNodesPanelSession, RudderStack } from './telemetry.types';
+import type { IUserNodesPanelSession } from './telemetry.types';
import { useSettingsStore } from '@/stores/settings.store';
import { useRootStore } from '@/stores/n8nRoot.store';
import { useTelemetryStore } from '@/stores/telemetry.store';
@@ -11,19 +11,26 @@ import { SLACK_NODE_TYPE } from '@/constants';
import { usePostHog } from '@/stores/posthog.store';
export class Telemetry {
- constructor(
- private rudderStack: RudderStack,
- private userNodesPanelSession: IUserNodesPanelSession = {
- sessionId: '',
- data: {
- nodeFilter: '',
- resultsNodes: [],
- filterMode: 'Regular',
- },
+ private pageEventQueue: Array<{ route: RouteLocation }>;
+ private previousPath: string;
+
+ private get rudderStack() {
+ return window.rudderanalytics;
+ }
+
+ private userNodesPanelSession: IUserNodesPanelSession = {
+ sessionId: '',
+ data: {
+ nodeFilter: '',
+ resultsNodes: [],
+ filterMode: 'Regular',
},
- private pageEventQueue: Array<{ route: RouteLocation }> = [],
- private previousPath: string = '',
- ) {}
+ };
+
+ constructor() {
+ this.pageEventQueue = [];
+ this.previousPath = '';
+ }
init(
telemetrySettings: ITelemetrySettings,
@@ -37,7 +44,7 @@ export class Telemetry {
versionCli: string;
},
) {
- if (!telemetrySettings.enabled || !telemetrySettings.config) return;
+ if (!telemetrySettings.enabled || !telemetrySettings.config || this.rudderStack) return;
const {
config: { key, url },
@@ -102,12 +109,17 @@ export class Telemetry {
const pageName = route.name;
let properties: { [key: string]: string } = {};
- if (route.meta?.telemetry && typeof route.meta.telemetry.getProperties === 'function') {
+ if (
+ route.meta &&
+ route.meta.telemetry &&
+ typeof route.meta.telemetry.getProperties === 'function'
+ ) {
properties = route.meta.telemetry.getProperties(route);
}
- const category = route.meta?.telemetry?.pageCategory || 'Editor';
- this.rudderStack.page(category, pageName, properties);
+ const category =
+ (route.meta && route.meta.telemetry && route.meta.telemetry.pageCategory) || 'Editor';
+ this.rudderStack.page(category, pageName!, properties);
} else {
this.pageEventQueue.push({
route,
@@ -245,6 +257,8 @@ export class Telemetry {
}
private initRudderStack(key: string, url: string, options: IDataObject) {
+ window.rudderanalytics = window.rudderanalytics || [];
+
this.rudderStack.methods = [
'load',
'page',
@@ -271,20 +285,26 @@ export class Telemetry {
this.rudderStack[method] = this.rudderStack.factory(method);
}
+ this.rudderStack.loadJS = () => {
+ const script = document.createElement('script');
+
+ script.type = 'text/javascript';
+ script.async = !0;
+ script.src = 'https://cdn-rs.n8n.io/v1/ra.min.js';
+
+ const element: Element = document.getElementsByTagName('script')[0];
+
+ if (element && element.parentNode) {
+ element.parentNode.insertBefore(script, element);
+ }
+ };
+
+ this.rudderStack.loadJS();
this.rudderStack.load(key, url, options);
}
}
-export const telemetry = new Telemetry(
- window.rudderanalytics ?? {
- identify: () => {},
- reset: () => {},
- track: () => {},
- page: () => {},
- push: () => {},
- load: () => {},
- },
-);
+export const telemetry = new Telemetry();
export const TelemetryPlugin: Plugin<{}> = {
install(app) {
diff --git a/packages/editor-ui/src/plugins/telemetry/telemetry.types.ts b/packages/editor-ui/src/plugins/telemetry/telemetry.types.ts
index 700edeea28..b4d0078322 100644
--- a/packages/editor-ui/src/plugins/telemetry/telemetry.types.ts
+++ b/packages/editor-ui/src/plugins/telemetry/telemetry.types.ts
@@ -17,15 +17,17 @@ interface IUserNodesPanelSessionData {
/**
* Simplified version of:
- * https://github.com/rudderlabs/rudder-sdk-js/blob/production-staging/packages/npm/index.d.ts
+ * https://github.com/rudderlabs/rudder-sdk-js/blob/master/dist/rudder-sdk-js/index.d.ts
*/
-export interface RudderStack {
+interface RudderStack extends Array {
[key: string]: unknown;
methods: string[];
factory: (method: string) => (...args: unknown[]) => RudderStack;
+ loadJS(): void;
+
/**
* Native methods
*/
diff --git a/packages/editor-ui/vite.config.ts b/packages/editor-ui/vite.config.ts
index 3c89229005..aaf4cd92ff 100644
--- a/packages/editor-ui/vite.config.ts
+++ b/packages/editor-ui/vite.config.ts
@@ -3,7 +3,6 @@ import { resolve } from 'path';
import { defineConfig, mergeConfig } from 'vite';
import { defineConfig as defineVitestConfig } from 'vitest/config';
import { sentryVitePlugin } from '@sentry/vite-plugin';
-import { ViteEjsPlugin } from 'vite-plugin-ejs';
import packageJSON from './package.json';
@@ -63,7 +62,7 @@ const alias = [
},
];
-const plugins = [vue(), ViteEjsPlugin()];
+const plugins = [vue()];
const { SENTRY_AUTH_TOKEN: authToken, RELEASE: release } = process.env;
if (release && authToken) {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3211d6c7a0..69382e5d46 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -122,9 +122,6 @@ importers:
vite:
specifier: ^4.4.7
version: 4.4.7(less@4.1.3)(sass@1.64.1)
- vite-plugin-ejs:
- specifier: ^1.6.4
- version: 1.6.4
vitest:
specifier: ^0.33.0
version: 0.33.0
@@ -20710,12 +20707,6 @@ packages:
- terser
dev: true
- /vite-plugin-ejs@1.6.4:
- resolution: {integrity: sha512-23p1RS4PiA0veXY5/gHZ60pl3pPvd8NEqdBsDgxNK8nM1rjFFDcVb0paNmuipzCgNP/Y0f/Id22M7Il4kvZ2jA==}
- dependencies:
- ejs: 3.1.8
- dev: true
-
/vite@4.4.7(@types/node@18.16.16):
resolution: {integrity: sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==}
engines: {node: ^14.18.0 || >=16.0.0}