@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.
- package/dist/analytics-tracker-plugin.d.ts +10 -0
- package/dist/analytics-tracker-plugin.d.ts.map +1 -0
- package/dist/analytics-tracker-plugin.js +80 -0
- package/dist/analytics-tracker-plugin.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
- package/src/analytics-tracker-plugin.ts +85 -0
- package/src/index.ts +5 -0
|
@@ -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
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;
|
|
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.
|
|
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
|
}
|