@base44-preview/vite-plugin 0.2.16-pr.24.de4b42b → 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/html-injections-plugin.d.ts +1 -2
- package/dist/html-injections-plugin.d.ts.map +1 -1
- package/dist/html-injections-plugin.js +1 -13
- package/dist/html-injections-plugin.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
- package/src/analytics-tracker-plugin.ts +85 -0
- package/src/html-injections-plugin.ts +0 -14
- package/src/index.ts +6 -3
- package/dist/injections/analytics-tracker.d.ts +0 -2
- package/dist/injections/analytics-tracker.d.ts.map +0 -1
- package/dist/injections/analytics-tracker.js +0 -47
- package/dist/injections/analytics-tracker.js.map +0 -1
- package/src/injections/analytics-tracker.ts +0 -57
|
@@ -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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
|
-
export declare function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier,
|
|
2
|
+
export declare function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, }: {
|
|
3
3
|
hmrNotifier: boolean;
|
|
4
4
|
navigationNotifier: boolean;
|
|
5
|
-
analyticsTracker: boolean;
|
|
6
5
|
visualEditAgent: boolean;
|
|
7
6
|
}): Plugin;
|
|
8
7
|
//# sourceMappingURL=html-injections-plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,GAChB,EAAE;IACD,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;CAC1B,GA4DM,MAAM,CACZ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier,
|
|
1
|
+
export function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, }) {
|
|
2
2
|
return {
|
|
3
3
|
name: "html-injections",
|
|
4
4
|
apply: (config) => config.mode !== "production",
|
|
@@ -44,18 +44,6 @@ export function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, analytic
|
|
|
44
44
|
},
|
|
45
45
|
]
|
|
46
46
|
: []),
|
|
47
|
-
...(analyticsTracker
|
|
48
|
-
? [
|
|
49
|
-
{
|
|
50
|
-
tag: "script",
|
|
51
|
-
attrs: {
|
|
52
|
-
src: "/node_modules/@base44/vite-plugin/dist/injections/analytics-tracker.js",
|
|
53
|
-
type: "module",
|
|
54
|
-
},
|
|
55
|
-
injectTo: "head",
|
|
56
|
-
},
|
|
57
|
-
]
|
|
58
|
-
: []),
|
|
59
47
|
...(visualEditAgent
|
|
60
48
|
? [
|
|
61
49
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,GAKhB;IACC,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;QAC/C,kBAAkB;YAChB,OAAO;gBACL;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE;wBACL,GAAG,EAAE,gFAAgF;wBACrF,IAAI,EAAE,QAAQ;qBACf;oBACD,QAAQ,EAAE,MAAM;iBACjB;gBACD;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE;wBACL,GAAG,EAAE,6EAA6E;wBAClF,IAAI,EAAE,QAAQ;qBACf;oBACD,QAAQ,EAAE,MAAM;iBACjB;gBACD,GAAG,CAAC,WAAW;oBACb,CAAC,CAAC;wBACE;4BACE,GAAG,EAAE,QAAQ;4BACb,KAAK,EAAE;gCACL,GAAG,EAAE,2EAA2E;gCAChF,IAAI,EAAE,QAAQ;6BACf;4BACD,QAAQ,EAAE,MAAM;yBACjB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,kBAAkB;oBACpB,CAAC,CAAC;wBACE;4BACE,GAAG,EAAE,QAAQ;4BACb,KAAK,EAAE;gCACL,GAAG,EAAE,0EAA0E;gCAC/E,IAAI,EAAE,QAAQ;6BACf;4BACD,QAAQ,EAAE,MAAM;yBACjB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,eAAe;oBACjB,CAAC,CAAC;wBACE;4BACE,GAAG,EAAE,QAAQ;4BACb,KAAK,EAAE;gCACL,GAAG,EAAE,wEAAwE;gCAC7E,IAAI,EAAE,QAAQ;6BACf;4BACD,QAAQ,EAAE,MAAM;yBACjB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;KACQ,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export default function vitePlugin(opts?: {
|
|
|
3
3
|
legacySDKImports?: boolean;
|
|
4
4
|
hmrNotifier?: boolean;
|
|
5
5
|
navigationNotifier?: boolean;
|
|
6
|
-
analyticsTracker?: boolean;
|
|
7
6
|
visualEditAgent?: boolean;
|
|
7
|
+
analyticsTracker?: boolean;
|
|
8
8
|
}): Plugin<any>[];
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
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,
|
|
9
|
+
const { legacySDKImports = false, hmrNotifier = false, navigationNotifier = false, visualEditAgent = false, analyticsTracker = false, } = opts;
|
|
9
10
|
return [
|
|
10
11
|
{
|
|
11
12
|
name: "base44",
|
|
@@ -149,9 +150,11 @@ export default function vitePlugin(opts = {}) {
|
|
|
149
150
|
},
|
|
150
151
|
errorOverlayPlugin(),
|
|
151
152
|
visualEditPlugin(),
|
|
152
|
-
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier,
|
|
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
|
+
}
|
|
@@ -3,12 +3,10 @@ import type { Plugin } from "vite";
|
|
|
3
3
|
export function htmlInjectionsPlugin({
|
|
4
4
|
hmrNotifier,
|
|
5
5
|
navigationNotifier,
|
|
6
|
-
analyticsTracker,
|
|
7
6
|
visualEditAgent,
|
|
8
7
|
}: {
|
|
9
8
|
hmrNotifier: boolean;
|
|
10
9
|
navigationNotifier: boolean;
|
|
11
|
-
analyticsTracker: boolean;
|
|
12
10
|
visualEditAgent: boolean;
|
|
13
11
|
}) {
|
|
14
12
|
return {
|
|
@@ -56,18 +54,6 @@ export function htmlInjectionsPlugin({
|
|
|
56
54
|
},
|
|
57
55
|
]
|
|
58
56
|
: []),
|
|
59
|
-
...(analyticsTracker
|
|
60
|
-
? [
|
|
61
|
-
{
|
|
62
|
-
tag: "script",
|
|
63
|
-
attrs: {
|
|
64
|
-
src: "/node_modules/@base44/vite-plugin/dist/injections/analytics-tracker.js",
|
|
65
|
-
type: "module",
|
|
66
|
-
},
|
|
67
|
-
injectTo: "head",
|
|
68
|
-
},
|
|
69
|
-
]
|
|
70
|
-
: []),
|
|
71
57
|
...(visualEditAgent
|
|
72
58
|
? [
|
|
73
59
|
{
|
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
|
|
|
@@ -12,16 +13,16 @@ export default function vitePlugin(
|
|
|
12
13
|
legacySDKImports?: boolean;
|
|
13
14
|
hmrNotifier?: boolean;
|
|
14
15
|
navigationNotifier?: boolean;
|
|
15
|
-
analyticsTracker?: boolean;
|
|
16
16
|
visualEditAgent?: boolean;
|
|
17
|
+
analyticsTracker?: boolean;
|
|
17
18
|
} = {}
|
|
18
19
|
) {
|
|
19
20
|
const {
|
|
20
21
|
legacySDKImports = false,
|
|
21
22
|
hmrNotifier = false,
|
|
22
23
|
navigationNotifier = false,
|
|
23
|
-
analyticsTracker = false,
|
|
24
24
|
visualEditAgent = false,
|
|
25
|
+
analyticsTracker = false,
|
|
25
26
|
} = opts;
|
|
26
27
|
|
|
27
28
|
return [
|
|
@@ -217,8 +218,10 @@ export default function vitePlugin(
|
|
|
217
218
|
} as Plugin,
|
|
218
219
|
errorOverlayPlugin(),
|
|
219
220
|
visualEditPlugin(),
|
|
220
|
-
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier,
|
|
221
|
+
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent }),
|
|
221
222
|
]
|
|
222
223
|
: []),
|
|
224
|
+
// Analytics tracker runs in production (not in sandbox)
|
|
225
|
+
...(!isRunningInSandbox && analyticsTracker ? [analyticsTrackerPlugin()] : []),
|
|
223
226
|
];
|
|
224
227
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analytics-tracker.d.ts","sourceRoot":"","sources":["../../src/injections/analytics-tracker.ts"],"names":[],"mappings":""}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
if (window.self !== window.top) {
|
|
2
|
-
let lastPath = window.location.pathname;
|
|
3
|
-
function getPageNameFromPath(pathname) {
|
|
4
|
-
if (pathname === "/" || pathname === "") {
|
|
5
|
-
return null; // Let parent handle default page
|
|
6
|
-
}
|
|
7
|
-
// Extract first segment of path as page name
|
|
8
|
-
const pathSegment = pathname.replace(/^\//, "").split("/")[0];
|
|
9
|
-
return pathSegment || null;
|
|
10
|
-
}
|
|
11
|
-
function notifyPageView() {
|
|
12
|
-
const currentPath = window.location.pathname;
|
|
13
|
-
if (currentPath !== lastPath) {
|
|
14
|
-
lastPath = currentPath;
|
|
15
|
-
const pageName = getPageNameFromPath(currentPath);
|
|
16
|
-
window.parent?.postMessage({
|
|
17
|
-
type: "app_page_view",
|
|
18
|
-
path: currentPath,
|
|
19
|
-
pageName,
|
|
20
|
-
}, "*");
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
// Intercept history.pushState
|
|
24
|
-
const originalPushState = history.pushState.bind(history);
|
|
25
|
-
history.pushState = function (...args) {
|
|
26
|
-
originalPushState(...args);
|
|
27
|
-
notifyPageView();
|
|
28
|
-
};
|
|
29
|
-
// Intercept history.replaceState
|
|
30
|
-
const originalReplaceState = history.replaceState.bind(history);
|
|
31
|
-
history.replaceState = function (...args) {
|
|
32
|
-
originalReplaceState(...args);
|
|
33
|
-
notifyPageView();
|
|
34
|
-
};
|
|
35
|
-
// Handle browser back/forward navigation
|
|
36
|
-
window.addEventListener("popstate", notifyPageView);
|
|
37
|
-
// Notify initial page view on load
|
|
38
|
-
const initialPath = window.location.pathname;
|
|
39
|
-
const initialPageName = getPageNameFromPath(initialPath);
|
|
40
|
-
window.parent?.postMessage({
|
|
41
|
-
type: "app_page_view",
|
|
42
|
-
path: initialPath,
|
|
43
|
-
pageName: initialPageName,
|
|
44
|
-
}, "*");
|
|
45
|
-
}
|
|
46
|
-
export {};
|
|
47
|
-
//# sourceMappingURL=analytics-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analytics-tracker.js","sourceRoot":"","sources":["../../src/injections/analytics-tracker.ts"],"names":[],"mappings":"AAAA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAExC,SAAS,mBAAmB,CAAC,QAAgB;QAC3C,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,CAAC,iCAAiC;QAChD,CAAC;QACD,6CAA6C;QAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,WAAW,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,SAAS,cAAc;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7C,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,QAAQ,GAAG,WAAW,CAAC;YACvB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,EAAE,WAAW,CACxB;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,WAAW;gBACjB,QAAQ;aACT,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI;QACnC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,iCAAiC;IACjC,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAI;QACtC,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9B,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,yCAAyC;IACzC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAEpD,mCAAmC;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC7C,MAAM,eAAe,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,CAAC,MAAM,EAAE,WAAW,CACxB;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,eAAe;KAC1B,EACD,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
if (window.self !== window.top) {
|
|
2
|
-
let lastPath = window.location.pathname;
|
|
3
|
-
|
|
4
|
-
function getPageNameFromPath(pathname: string): string | null {
|
|
5
|
-
if (pathname === "/" || pathname === "") {
|
|
6
|
-
return null; // Let parent handle default page
|
|
7
|
-
}
|
|
8
|
-
// Extract first segment of path as page name
|
|
9
|
-
const pathSegment = pathname.replace(/^\//, "").split("/")[0];
|
|
10
|
-
return pathSegment || null;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function notifyPageView() {
|
|
14
|
-
const currentPath = window.location.pathname;
|
|
15
|
-
if (currentPath !== lastPath) {
|
|
16
|
-
lastPath = currentPath;
|
|
17
|
-
const pageName = getPageNameFromPath(currentPath);
|
|
18
|
-
window.parent?.postMessage(
|
|
19
|
-
{
|
|
20
|
-
type: "app_page_view",
|
|
21
|
-
path: currentPath,
|
|
22
|
-
pageName,
|
|
23
|
-
},
|
|
24
|
-
"*"
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Intercept history.pushState
|
|
30
|
-
const originalPushState = history.pushState.bind(history);
|
|
31
|
-
history.pushState = function (...args) {
|
|
32
|
-
originalPushState(...args);
|
|
33
|
-
notifyPageView();
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// Intercept history.replaceState
|
|
37
|
-
const originalReplaceState = history.replaceState.bind(history);
|
|
38
|
-
history.replaceState = function (...args) {
|
|
39
|
-
originalReplaceState(...args);
|
|
40
|
-
notifyPageView();
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// Handle browser back/forward navigation
|
|
44
|
-
window.addEventListener("popstate", notifyPageView);
|
|
45
|
-
|
|
46
|
-
// Notify initial page view on load
|
|
47
|
-
const initialPath = window.location.pathname;
|
|
48
|
-
const initialPageName = getPageNameFromPath(initialPath);
|
|
49
|
-
window.parent?.postMessage(
|
|
50
|
-
{
|
|
51
|
-
type: "app_page_view",
|
|
52
|
-
path: initialPath,
|
|
53
|
-
pageName: initialPageName,
|
|
54
|
-
},
|
|
55
|
-
"*"
|
|
56
|
-
);
|
|
57
|
-
}
|