@base44-preview/vite-plugin 0.2.20-pr.27.20fa529 → 0.2.20-pr.27.8bf9822
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/html-injections-plugin.d.ts +2 -1
- package/dist/html-injections-plugin.d.ts.map +1 -1
- package/dist/html-injections-plugin.js +87 -33
- package/dist/html-injections-plugin.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/html-injections-plugin.ts +96 -33
- package/src/index.ts +4 -1
|
@@ -3,7 +3,8 @@ interface HtmlInjectionOptions {
|
|
|
3
3
|
hmrNotifier: boolean;
|
|
4
4
|
navigationNotifier: boolean;
|
|
5
5
|
visualEditAgent: boolean;
|
|
6
|
+
analyticsTracker: boolean;
|
|
6
7
|
}
|
|
7
|
-
export declare function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, }: HtmlInjectionOptions): Plugin;
|
|
8
|
+
export declare function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, analyticsTracker, }: HtmlInjectionOptions): Plugin;
|
|
8
9
|
export {};
|
|
9
10
|
//# 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,
|
|
1
|
+
{"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAmCtD,UAAU,oBAAoB;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,EAAE,oBAAoB,GAAG,MAAM,CAkE/B"}
|
|
@@ -1,38 +1,92 @@
|
|
|
1
|
-
|
|
1
|
+
import { loadEnv } from "vite";
|
|
2
|
+
const ANALYTICS_TRACKER_SCRIPT = `
|
|
3
|
+
let lastPath = "";
|
|
4
|
+
function getPageNameFromPath(path) {
|
|
5
|
+
const segments = path.split("/").filter(Boolean);
|
|
6
|
+
return segments[0] || null;
|
|
7
|
+
}
|
|
8
|
+
function trackPageView() {
|
|
9
|
+
const path = window.location.pathname;
|
|
10
|
+
if (path === lastPath) return;
|
|
11
|
+
lastPath = path;
|
|
12
|
+
const pageName = getPageNameFromPath(path) || "home";
|
|
13
|
+
const appId = import.meta.env.VITE_BASE44_APP_ID;
|
|
14
|
+
const serverUrl = import.meta.env.VITE_BASE44_BACKEND_URL || "";
|
|
15
|
+
if (!appId) return;
|
|
16
|
+
fetch(\`\${serverUrl}/app-logs/\${appId}/log-user-in-app/\${pageName}\`, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
}).catch(() => {});
|
|
19
|
+
}
|
|
20
|
+
const originalPushState = history.pushState.bind(history);
|
|
21
|
+
history.pushState = function (...args) {
|
|
22
|
+
originalPushState(...args);
|
|
23
|
+
trackPageView();
|
|
24
|
+
};
|
|
25
|
+
const originalReplaceState = history.replaceState.bind(history);
|
|
26
|
+
history.replaceState = function (...args) {
|
|
27
|
+
originalReplaceState(...args);
|
|
28
|
+
trackPageView();
|
|
29
|
+
};
|
|
30
|
+
window.addEventListener("popstate", trackPageView);
|
|
31
|
+
trackPageView();
|
|
32
|
+
`;
|
|
33
|
+
export function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, analyticsTracker, }) {
|
|
34
|
+
let resolvedEnv = {};
|
|
2
35
|
return {
|
|
3
36
|
name: "html-injections",
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
configResolved(config) {
|
|
38
|
+
// Capture env vars for use in transformIndexHtml
|
|
39
|
+
// loadEnv gets all env vars including VITE_ prefixed ones
|
|
40
|
+
resolvedEnv = loadEnv(config.mode, config.root, "");
|
|
41
|
+
},
|
|
42
|
+
transformIndexHtml: {
|
|
43
|
+
handler(_html, ctx) {
|
|
44
|
+
const tags = [];
|
|
45
|
+
const currentMode = ctx.server ? "dev" : "production";
|
|
46
|
+
if (currentMode === "dev") {
|
|
47
|
+
// Dev mode: use sandbox-bridge dynamic loader
|
|
48
|
+
const options = JSON.stringify({
|
|
49
|
+
hmrNotifier,
|
|
50
|
+
navigationNotifier,
|
|
51
|
+
visualEditAgent,
|
|
52
|
+
unhandledErrors: true,
|
|
53
|
+
mountObserver: true,
|
|
54
|
+
});
|
|
55
|
+
tags.push({
|
|
56
|
+
tag: "script",
|
|
57
|
+
attrs: { type: "module" },
|
|
58
|
+
children: [
|
|
59
|
+
`if (window.self !== window.top) {`,
|
|
60
|
+
` (async () => {`,
|
|
61
|
+
` try {`,
|
|
62
|
+
` const mode = new URLSearchParams(location.search).get("sandbox-bridge");`,
|
|
63
|
+
` const url = mode === "local"`,
|
|
64
|
+
` ? "https://localhost:3201/index.mjs"`,
|
|
65
|
+
` : "/node_modules/@base44/vite-plugin/dist/statics/index.mjs";`,
|
|
66
|
+
` const mod = await import(url);`,
|
|
67
|
+
` if (typeof mod.init === "function") mod.init(${options}, import.meta.hot);`,
|
|
68
|
+
` } catch (e) {`,
|
|
69
|
+
` console.error("[sandbox-bridge] Failed to load:", e);`,
|
|
70
|
+
` }`,
|
|
71
|
+
` })();`,
|
|
72
|
+
`}`,
|
|
73
|
+
].join("\n"),
|
|
74
|
+
injectTo: "head",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Production: inline analytics tracker with env var replacement
|
|
78
|
+
if (currentMode === "production" && analyticsTracker) {
|
|
79
|
+
let content = ANALYTICS_TRACKER_SCRIPT;
|
|
80
|
+
content = content.replace(/import\.meta\.env\.(\w+)/g, (_, envKey) => JSON.stringify(resolvedEnv[envKey] ?? ""));
|
|
81
|
+
tags.push({
|
|
82
|
+
tag: "script",
|
|
83
|
+
attrs: { type: "module" },
|
|
84
|
+
children: content,
|
|
85
|
+
injectTo: "head",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return tags;
|
|
89
|
+
},
|
|
36
90
|
},
|
|
37
91
|
};
|
|
38
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BhC,CAAC;AASF,MAAM,UAAU,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACK;IACrB,IAAI,WAAW,GAA2B,EAAE,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,cAAc,CAAC,MAAM;YACnB,iDAAiD;YACjD,0DAA0D;YAC1D,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,kBAAkB,EAAE;YAClB,OAAO,CAAC,KAAK,EAAE,GAAG;gBAChB,MAAM,IAAI,GAAwB,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;gBAEtD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;oBAC1B,8CAA8C;oBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;wBAC7B,WAAW;wBACX,kBAAkB;wBAClB,eAAe;wBACf,eAAe,EAAE,IAAI;wBACrB,aAAa,EAAE,IAAI;qBACpB,CAAC,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC;wBACR,GAAG,EAAE,QAAQ;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,QAAQ,EAAE;4BACR,mCAAmC;4BACnC,kBAAkB;4BAClB,WAAW;4BACX,gFAAgF;4BAChF,oCAAoC;4BACpC,8CAA8C;4BAC9C,uEAAuE;4BACvE,sCAAsC;4BACtC,sDAAsD,OAAO,qBAAqB;4BAClF,mBAAmB;4BACnB,6DAA6D;4BAC7D,OAAO;4BACP,SAAS;4BACT,GAAG;yBACJ,CAAC,IAAI,CAAC,IAAI,CAAC;wBACZ,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,gEAAgE;gBAChE,IAAI,WAAW,KAAK,YAAY,IAAI,gBAAgB,EAAE,CAAC;oBACrD,IAAI,OAAO,GAAG,wBAAwB,CAAC;oBACvC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,2BAA2B,EAC3B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CACzD,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC;wBACR,GAAG,EAAE,QAAQ;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,QAAQ,EAAE,OAAO;wBACjB,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC;SACF;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;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;
|
|
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;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,iBAgNP"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { filterPackagesInProject } from "./utils.js";
|
|
|
5
5
|
import { htmlInjectionsPlugin } from "./html-injections-plugin.js";
|
|
6
6
|
const isRunningInSandbox = !!process.env.MODAL_SANDBOX_ID;
|
|
7
7
|
export default function vitePlugin(opts = {}) {
|
|
8
|
-
const { legacySDKImports = false, hmrNotifier = false, navigationNotifier = false, visualEditAgent = false, } = opts;
|
|
8
|
+
const { legacySDKImports = false, hmrNotifier = false, navigationNotifier = false, visualEditAgent = false, analyticsTracker = false, } = opts;
|
|
9
9
|
return [
|
|
10
10
|
{
|
|
11
11
|
name: "base44",
|
|
@@ -149,9 +149,10 @@ export default function vitePlugin(opts = {}) {
|
|
|
149
149
|
},
|
|
150
150
|
errorOverlayPlugin(),
|
|
151
151
|
visualEditPlugin(),
|
|
152
|
-
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent }),
|
|
153
152
|
]
|
|
154
153
|
: []),
|
|
154
|
+
// HTML injections - handles both dev (sandbox) and production injections
|
|
155
|
+
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, analyticsTracker }),
|
|
155
156
|
];
|
|
156
157
|
}
|
|
157
158
|
//# 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;AAEnE,MAAM,kBAAkB,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAE1D,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,51 +1,114 @@
|
|
|
1
|
-
import type { Plugin } from "vite";
|
|
1
|
+
import type { Plugin, HtmlTagDescriptor } from "vite";
|
|
2
|
+
import { loadEnv } from "vite";
|
|
3
|
+
|
|
4
|
+
const ANALYTICS_TRACKER_SCRIPT = `
|
|
5
|
+
let lastPath = "";
|
|
6
|
+
function getPageNameFromPath(path) {
|
|
7
|
+
const segments = path.split("/").filter(Boolean);
|
|
8
|
+
return segments[0] || null;
|
|
9
|
+
}
|
|
10
|
+
function trackPageView() {
|
|
11
|
+
const path = window.location.pathname;
|
|
12
|
+
if (path === lastPath) return;
|
|
13
|
+
lastPath = path;
|
|
14
|
+
const pageName = getPageNameFromPath(path) || "home";
|
|
15
|
+
const appId = import.meta.env.VITE_BASE44_APP_ID;
|
|
16
|
+
const serverUrl = import.meta.env.VITE_BASE44_BACKEND_URL || "";
|
|
17
|
+
if (!appId) return;
|
|
18
|
+
fetch(\`\${serverUrl}/app-logs/\${appId}/log-user-in-app/\${pageName}\`, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
}).catch(() => {});
|
|
21
|
+
}
|
|
22
|
+
const originalPushState = history.pushState.bind(history);
|
|
23
|
+
history.pushState = function (...args) {
|
|
24
|
+
originalPushState(...args);
|
|
25
|
+
trackPageView();
|
|
26
|
+
};
|
|
27
|
+
const originalReplaceState = history.replaceState.bind(history);
|
|
28
|
+
history.replaceState = function (...args) {
|
|
29
|
+
originalReplaceState(...args);
|
|
30
|
+
trackPageView();
|
|
31
|
+
};
|
|
32
|
+
window.addEventListener("popstate", trackPageView);
|
|
33
|
+
trackPageView();
|
|
34
|
+
`;
|
|
2
35
|
|
|
3
36
|
interface HtmlInjectionOptions {
|
|
4
37
|
hmrNotifier: boolean;
|
|
5
38
|
navigationNotifier: boolean;
|
|
6
39
|
visualEditAgent: boolean;
|
|
40
|
+
analyticsTracker: boolean;
|
|
7
41
|
}
|
|
8
42
|
|
|
9
43
|
export function htmlInjectionsPlugin({
|
|
10
44
|
hmrNotifier,
|
|
11
45
|
navigationNotifier,
|
|
12
46
|
visualEditAgent,
|
|
47
|
+
analyticsTracker,
|
|
13
48
|
}: HtmlInjectionOptions): Plugin {
|
|
49
|
+
let resolvedEnv: Record<string, string> = {};
|
|
50
|
+
|
|
14
51
|
return {
|
|
15
52
|
name: "html-injections",
|
|
16
|
-
|
|
53
|
+
configResolved(config) {
|
|
54
|
+
// Capture env vars for use in transformIndexHtml
|
|
55
|
+
// loadEnv gets all env vars including VITE_ prefixed ones
|
|
56
|
+
resolvedEnv = loadEnv(config.mode, config.root, "");
|
|
57
|
+
},
|
|
58
|
+
transformIndexHtml: {
|
|
59
|
+
handler(_html, ctx) {
|
|
60
|
+
const tags: HtmlTagDescriptor[] = [];
|
|
61
|
+
const currentMode = ctx.server ? "dev" : "production";
|
|
62
|
+
|
|
63
|
+
if (currentMode === "dev") {
|
|
64
|
+
// Dev mode: use sandbox-bridge dynamic loader
|
|
65
|
+
const options = JSON.stringify({
|
|
66
|
+
hmrNotifier,
|
|
67
|
+
navigationNotifier,
|
|
68
|
+
visualEditAgent,
|
|
69
|
+
unhandledErrors: true,
|
|
70
|
+
mountObserver: true,
|
|
71
|
+
});
|
|
72
|
+
tags.push({
|
|
73
|
+
tag: "script",
|
|
74
|
+
attrs: { type: "module" },
|
|
75
|
+
children: [
|
|
76
|
+
`if (window.self !== window.top) {`,
|
|
77
|
+
` (async () => {`,
|
|
78
|
+
` try {`,
|
|
79
|
+
` const mode = new URLSearchParams(location.search).get("sandbox-bridge");`,
|
|
80
|
+
` const url = mode === "local"`,
|
|
81
|
+
` ? "https://localhost:3201/index.mjs"`,
|
|
82
|
+
` : "/node_modules/@base44/vite-plugin/dist/statics/index.mjs";`,
|
|
83
|
+
` const mod = await import(url);`,
|
|
84
|
+
` if (typeof mod.init === "function") mod.init(${options}, import.meta.hot);`,
|
|
85
|
+
` } catch (e) {`,
|
|
86
|
+
` console.error("[sandbox-bridge] Failed to load:", e);`,
|
|
87
|
+
` }`,
|
|
88
|
+
` })();`,
|
|
89
|
+
`}`,
|
|
90
|
+
].join("\n"),
|
|
91
|
+
injectTo: "head",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Production: inline analytics tracker with env var replacement
|
|
96
|
+
if (currentMode === "production" && analyticsTracker) {
|
|
97
|
+
let content = ANALYTICS_TRACKER_SCRIPT;
|
|
98
|
+
content = content.replace(
|
|
99
|
+
/import\.meta\.env\.(\w+)/g,
|
|
100
|
+
(_, envKey) => JSON.stringify(resolvedEnv[envKey] ?? "")
|
|
101
|
+
);
|
|
102
|
+
tags.push({
|
|
103
|
+
tag: "script",
|
|
104
|
+
attrs: { type: "module" },
|
|
105
|
+
children: content,
|
|
106
|
+
injectTo: "head",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
17
109
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
hmrNotifier,
|
|
21
|
-
navigationNotifier,
|
|
22
|
-
visualEditAgent,
|
|
23
|
-
unhandledErrors: true,
|
|
24
|
-
mountObserver: true,
|
|
25
|
-
});
|
|
26
|
-
return [
|
|
27
|
-
{
|
|
28
|
-
tag: "script",
|
|
29
|
-
attrs: { type: "module" },
|
|
30
|
-
children: [
|
|
31
|
-
`if (window.self !== window.top) {`,
|
|
32
|
-
` (async () => {`,
|
|
33
|
-
` try {`,
|
|
34
|
-
` const mode = new URLSearchParams(location.search).get("sandbox-bridge");`,
|
|
35
|
-
` const url = mode === "local"`,
|
|
36
|
-
` ? "https://localhost:3201/index.mjs"`,
|
|
37
|
-
` : "/node_modules/@base44/vite-plugin/dist/statics/index.mjs";`,
|
|
38
|
-
` const mod = await import(url);`,
|
|
39
|
-
` if (typeof mod.init === "function") mod.init(${options}, import.meta.hot);`,
|
|
40
|
-
` } catch (e) {`,
|
|
41
|
-
` console.error("[sandbox-bridge] Failed to load:", e);`,
|
|
42
|
-
` }`,
|
|
43
|
-
` })();`,
|
|
44
|
-
`}`,
|
|
45
|
-
].join("\n"),
|
|
46
|
-
injectTo: "head",
|
|
47
|
-
},
|
|
48
|
-
];
|
|
110
|
+
return tags;
|
|
111
|
+
},
|
|
49
112
|
},
|
|
50
113
|
};
|
|
51
114
|
}
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ export default function vitePlugin(
|
|
|
13
13
|
hmrNotifier?: boolean;
|
|
14
14
|
navigationNotifier?: boolean;
|
|
15
15
|
visualEditAgent?: boolean;
|
|
16
|
+
analyticsTracker?: boolean;
|
|
16
17
|
} = {}
|
|
17
18
|
) {
|
|
18
19
|
const {
|
|
@@ -20,6 +21,7 @@ export default function vitePlugin(
|
|
|
20
21
|
hmrNotifier = false,
|
|
21
22
|
navigationNotifier = false,
|
|
22
23
|
visualEditAgent = false,
|
|
24
|
+
analyticsTracker = false,
|
|
23
25
|
} = opts;
|
|
24
26
|
|
|
25
27
|
return [
|
|
@@ -215,8 +217,9 @@ export default function vitePlugin(
|
|
|
215
217
|
} as Plugin,
|
|
216
218
|
errorOverlayPlugin(),
|
|
217
219
|
visualEditPlugin(),
|
|
218
|
-
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent }),
|
|
219
220
|
]
|
|
220
221
|
: []),
|
|
222
|
+
// HTML injections - handles both dev (sandbox) and production injections
|
|
223
|
+
htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEditAgent, analyticsTracker }),
|
|
221
224
|
];
|
|
222
225
|
}
|