@base44-preview/vite-plugin 0.2.14-pr.23.8a41255 → 0.2.17-pr.25.fb197cb

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.
@@ -0,0 +1,10 @@
1
+ import type { Plugin } from "vite";
2
+ /**
3
+ * Plugin that injects analytics tracking code for production builds.
4
+ * This plugin only runs when NOT in sandbox mode (MODAL_SANDBOX_ID not set).
5
+ * It uses the @base44/sdk to track page views via appLogs.logUserInApp().
6
+ *
7
+ * Requires @base44/sdk to be installed in the consuming app.
8
+ */
9
+ export declare function analyticsTrackerPlugin(): Plugin;
10
+ //# sourceMappingURL=analytics-tracker-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-tracker-plugin.d.ts","sourceRoot":"","sources":["../src/analytics-tracker-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAGnD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA0E/C"}
@@ -0,0 +1,80 @@
1
+ import { loadEnv } from "vite";
2
+ /**
3
+ * Plugin that injects analytics tracking code for production builds.
4
+ * This plugin only runs when NOT in sandbox mode (MODAL_SANDBOX_ID not set).
5
+ * It uses the @base44/sdk to track page views via appLogs.logUserInApp().
6
+ *
7
+ * Requires @base44/sdk to be installed in the consuming app.
8
+ */
9
+ export function analyticsTrackerPlugin() {
10
+ let appId = "";
11
+ let serverUrl = "";
12
+ return {
13
+ name: "analytics-tracker",
14
+ // Only apply in production builds
15
+ apply: "build",
16
+ configResolved(config) {
17
+ const env = loadEnv(config.mode, config.root, "");
18
+ appId = env.VITE_BASE44_APP_ID || "";
19
+ serverUrl = env.VITE_BASE44_BACKEND_URL || "";
20
+ },
21
+ transformIndexHtml(html) {
22
+ if (!appId) {
23
+ console.warn("[analytics-tracker] VITE_BASE44_APP_ID not set, skipping analytics injection");
24
+ return html;
25
+ }
26
+ // Use JSON.stringify to prevent XSS injection via env vars
27
+ const safeAppId = JSON.stringify(appId);
28
+ const safeServerUrl = JSON.stringify(serverUrl);
29
+ // Inline script that imports SDK and tracks page views
30
+ const analyticsScript = `
31
+ <script type="module">
32
+ import { createClient } from "@base44/sdk";
33
+
34
+ const client = createClient({
35
+ appId: ${safeAppId},
36
+ serverUrl: ${safeServerUrl},
37
+ });
38
+
39
+ let lastPath = "";
40
+
41
+ function getPageNameFromPath(path) {
42
+ const segments = path.split("/").filter(Boolean);
43
+ return segments[0] || null;
44
+ }
45
+
46
+ function trackPageView() {
47
+ const path = window.location.pathname;
48
+ if (path === lastPath) return;
49
+ lastPath = path;
50
+
51
+ const pageName = getPageNameFromPath(path) || "home";
52
+ client.appLogs.logUserInApp(pageName).catch(() => {});
53
+ }
54
+
55
+ // Intercept history.pushState
56
+ const originalPushState = history.pushState.bind(history);
57
+ history.pushState = function (...args) {
58
+ originalPushState(...args);
59
+ trackPageView();
60
+ };
61
+
62
+ // Intercept history.replaceState
63
+ const originalReplaceState = history.replaceState.bind(history);
64
+ history.replaceState = function (...args) {
65
+ originalReplaceState(...args);
66
+ trackPageView();
67
+ };
68
+
69
+ // Handle browser back/forward navigation
70
+ window.addEventListener("popstate", trackPageView);
71
+
72
+ // Track initial page view
73
+ trackPageView();
74
+ </script>`;
75
+ // Inject before closing </head> tag
76
+ return html.replace("</head>", `${analyticsScript}\n</head>`);
77
+ },
78
+ };
79
+ }
80
+ //# sourceMappingURL=analytics-tracker-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-tracker-plugin.js","sourceRoot":"","sources":["../src/analytics-tracker-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB;IACpC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,kCAAkC;QAClC,KAAK,EAAE,OAAO;QACd,cAAc,CAAC,MAAsB;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK,GAAG,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;YACrC,SAAS,GAAG,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;QAChD,CAAC;QACD,kBAAkB,CAAC,IAAI;YACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;gBAC7F,OAAO,IAAI,CAAC;YACd,CAAC;YAED,2DAA2D;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAEhD,uDAAuD;YACvD,MAAM,eAAe,GAAG;;;;;WAKnB,SAAS;eACL,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAsClB,CAAC;YAEL,oCAAoC;YACpC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,eAAe,WAAW,CAAC,CAAC;QAChE,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,5 +4,6 @@ export default function vitePlugin(opts?: {
4
4
  hmrNotifier?: boolean;
5
5
  navigationNotifier?: boolean;
6
6
  visualEditAgent?: boolean;
7
+ analyticsTracker?: boolean;
7
8
  }): Plugin<any>[];
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAS/C,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,IAAI,GAAE;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,iBA8MP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAU/C,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,IAAI,GAAE;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,iBAiNP"}
package/dist/index.js CHANGED
@@ -3,9 +3,10 @@ import { errorOverlayPlugin } from "./error-overlay-plugin.js";
3
3
  import { visualEditPlugin } from "./visual-edit-plugin.js";
4
4
  import { filterPackagesInProject } from "./utils.js";
5
5
  import { htmlInjectionsPlugin } from "./html-injections-plugin.js";
6
+ import { analyticsTrackerPlugin } from "./analytics-tracker-plugin.js";
6
7
  const isRunningInSandbox = !!process.env.MODAL_SANDBOX_ID;
7
8
  export default function vitePlugin(opts = {}) {
8
- const { legacySDKImports = false, hmrNotifier = false, navigationNotifier = false, visualEditAgent = false, } = opts;
9
+ const { legacySDKImports = false, hmrNotifier = false, navigationNotifier = false, visualEditAgent = false, analyticsTracker = false, } = opts;
9
10
  return [
10
11
  {
11
12
  name: "base44",
@@ -152,6 +153,8 @@ export default function vitePlugin(opts = {}) {
152
153
  htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent }),
153
154
  ]
154
155
  : []),
156
+ // Analytics tracker runs in production (not in sandbox)
157
+ ...(!isRunningInSandbox && analyticsTracker ? [analyticsTrackerPlugin()] : []),
155
158
  ];
156
159
  }
157
160
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/vite-plugin",
3
- "version": "0.2.14-pr.23.8a41255",
3
+ "version": "0.2.17-pr.25.fb197cb",
4
4
  "description": "The Vite plugin for base44 based applications",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -29,5 +29,13 @@
29
29
  "@babel/parser": "^7.28.5",
30
30
  "@babel/traverse": "^7.28.5",
31
31
  "@babel/types": "^7.28.5"
32
+ },
33
+ "peerDependencies": {
34
+ "@base44/sdk": ">=0.1.0"
35
+ },
36
+ "peerDependenciesMeta": {
37
+ "@base44/sdk": {
38
+ "optional": true
39
+ }
32
40
  }
33
41
  }
@@ -0,0 +1,85 @@
1
+ import type { Plugin, ResolvedConfig } from "vite";
2
+ import { loadEnv } from "vite";
3
+
4
+ /**
5
+ * Plugin that injects analytics tracking code for production builds.
6
+ * This plugin only runs when NOT in sandbox mode (MODAL_SANDBOX_ID not set).
7
+ * It uses the @base44/sdk to track page views via appLogs.logUserInApp().
8
+ *
9
+ * Requires @base44/sdk to be installed in the consuming app.
10
+ */
11
+ export function analyticsTrackerPlugin(): Plugin {
12
+ let appId = "";
13
+ let serverUrl = "";
14
+
15
+ return {
16
+ name: "analytics-tracker",
17
+ // Only apply in production builds
18
+ apply: "build",
19
+ configResolved(config: ResolvedConfig) {
20
+ const env = loadEnv(config.mode, config.root, "");
21
+ appId = env.VITE_BASE44_APP_ID || "";
22
+ serverUrl = env.VITE_BASE44_BACKEND_URL || "";
23
+ },
24
+ transformIndexHtml(html) {
25
+ if (!appId) {
26
+ console.warn("[analytics-tracker] VITE_BASE44_APP_ID not set, skipping analytics injection");
27
+ return html;
28
+ }
29
+
30
+ // Use JSON.stringify to prevent XSS injection via env vars
31
+ const safeAppId = JSON.stringify(appId);
32
+ const safeServerUrl = JSON.stringify(serverUrl);
33
+
34
+ // Inline script that imports SDK and tracks page views
35
+ const analyticsScript = `
36
+ <script type="module">
37
+ import { createClient } from "@base44/sdk";
38
+
39
+ const client = createClient({
40
+ appId: ${safeAppId},
41
+ serverUrl: ${safeServerUrl},
42
+ });
43
+
44
+ let lastPath = "";
45
+
46
+ function getPageNameFromPath(path) {
47
+ const segments = path.split("/").filter(Boolean);
48
+ return segments[0] || null;
49
+ }
50
+
51
+ function trackPageView() {
52
+ const path = window.location.pathname;
53
+ if (path === lastPath) return;
54
+ lastPath = path;
55
+
56
+ const pageName = getPageNameFromPath(path) || "home";
57
+ client.appLogs.logUserInApp(pageName).catch(() => {});
58
+ }
59
+
60
+ // Intercept history.pushState
61
+ const originalPushState = history.pushState.bind(history);
62
+ history.pushState = function (...args) {
63
+ originalPushState(...args);
64
+ trackPageView();
65
+ };
66
+
67
+ // Intercept history.replaceState
68
+ const originalReplaceState = history.replaceState.bind(history);
69
+ history.replaceState = function (...args) {
70
+ originalReplaceState(...args);
71
+ trackPageView();
72
+ };
73
+
74
+ // Handle browser back/forward navigation
75
+ window.addEventListener("popstate", trackPageView);
76
+
77
+ // Track initial page view
78
+ trackPageView();
79
+ </script>`;
80
+
81
+ // Inject before closing </head> tag
82
+ return html.replace("</head>", `${analyticsScript}\n</head>`);
83
+ },
84
+ };
85
+ }
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@ import { errorOverlayPlugin } from "./error-overlay-plugin.js";
4
4
  import { visualEditPlugin } from "./visual-edit-plugin.js";
5
5
  import { filterPackagesInProject } from "./utils.js";
6
6
  import { htmlInjectionsPlugin } from "./html-injections-plugin.js";
7
+ import { analyticsTrackerPlugin } from "./analytics-tracker-plugin.js";
7
8
 
8
9
  const isRunningInSandbox = !!process.env.MODAL_SANDBOX_ID;
9
10
 
@@ -13,6 +14,7 @@ export default function vitePlugin(
13
14
  hmrNotifier?: boolean;
14
15
  navigationNotifier?: boolean;
15
16
  visualEditAgent?: boolean;
17
+ analyticsTracker?: boolean;
16
18
  } = {}
17
19
  ) {
18
20
  const {
@@ -20,6 +22,7 @@ export default function vitePlugin(
20
22
  hmrNotifier = false,
21
23
  navigationNotifier = false,
22
24
  visualEditAgent = false,
25
+ analyticsTracker = false,
23
26
  } = opts;
24
27
 
25
28
  return [
@@ -218,5 +221,7 @@ export default function vitePlugin(
218
221
  htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent }),
219
222
  ]
220
223
  : []),
224
+ // Analytics tracker runs in production (not in sandbox)
225
+ ...(!isRunningInSandbox && analyticsTracker ? [analyticsTrackerPlugin()] : []),
221
226
  ];
222
227
  }