Skip to content

Commit

Permalink
Add Mixpanel integration
Browse files Browse the repository at this point in the history
  • Loading branch information
vibhanshub committed Feb 29, 2024
1 parent b324f03 commit 6623cef
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 0 deletions.
3 changes: 3 additions & 0 deletions integrations/mixpanel/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": ["@gitbook/eslint-config/integration"]
}
Binary file added integrations/mixpanel/assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions integrations/mixpanel/gitbook-manifest.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: mixpanel
title: Mixpanel
icon: ./assets/icon.png
#previewImages:
# - ./assets/hotjar-preview.png
description: Plug your GitBook site to your Mixpanel account.
visibility: public
script: ./src/index.ts
# The following scope(s) are available only to GitBook Staff
# See https://developer.gitbook.com/integrations/configurations#scopes
scopes:
- space:script:inject
organization: w45sBUBc1JWE1ktYkQfI #d8f63b60-89ae-11e7-8574-5927d48c4877
contentSecurityPolicy:
script-src: cdn.mxpnl.com;
summary: |
# Overview
This integration allows to add the Mixpanel tracker on your published GitBook site.
# How it works
The integration injects the Mixpanel script on your page, using the configured project token,
so that you can get analytics information from your GitBook site directly inside of Mixpanel.
# Configure
Install the integration on the GitBook space of your choice.
Locate the Mixpanel Project Token you want to use, which is available in Mixpanel's Project Settings section
categories:
- analytics
configurations:
space:
properties:
project_token:
type: string
title: Project Token
description: Available in Mixpanel's Project Settings section
required:
- project_token
18 changes: 18 additions & 0 deletions integrations/mixpanel/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "@gitbook/integration-mixpanel",
"version": "0.0.1",
"private": true,
"dependencies": {
"@gitbook/api": "*",
"@gitbook/runtime": "*"
},
"devDependencies": {
"@gitbook/cli": "*"
},
"scripts": {
"lint": "eslint ./src/**/*.ts",
"typecheck": "tsc --noEmit",
"publish-integrations-staging": "gitbook publish .",
"publish-integrations": "gitbook publish ."
}
}
40 changes: 40 additions & 0 deletions integrations/mixpanel/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import {
createIntegration,
FetchPublishScriptEventCallback,
RuntimeContext,
RuntimeEnvironment,
} from '@gitbook/runtime';

import script from './script.raw.js';

type MixpanelRuntimeContext = RuntimeContext<
RuntimeEnvironment<
{},
{
project_token?: string;
}
>
>;

export const handleFetchEvent: FetchPublishScriptEventCallback = async (
event,
{ environment }: MixpanelRuntimeContext
) => {
const projectToken = environment.spaceInstallation.configuration.project_token;
if (!projectToken) {
throw new Error(
`The Mixpanel Project Token is missing from the configuration (ID: ${event.spaceId}).`
);
}

return new Response(script.replace('<TO_REPLACE>', projectToken), {
headers: {
'Content-Type': 'application/javascript',
'Cache-Control': 'max-age=604800',
},
});
};

export default createIntegration<MixpanelRuntimeContext>({
fetch_published_script: handleFetchEvent,
});
72 changes: 72 additions & 0 deletions integrations/mixpanel/src/script.raw.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
(function (f, b) {
if (!b.__SV) {
var e, g, i, h;
window.mixpanel = b;
b._i = [];
b.init = function (e, f, c) {
function g(a, d) {
var b = d.split('.');
2 == b.length && ((a = a[b[0]]), (d = b[1]));
a[d] = function () {
a.push([d].concat(Array.prototype.slice.call(arguments, 0)));
};
}
var a = b;
'undefined' !== typeof c ? (a = b[c] = []) : (c = 'mixpanel');
a.people = a.people || [];
a.toString = function (a) {
var d = 'mixpanel';
'mixpanel' !== c && (d += '.' + c);
a || (d += ' (stub)');
return d;
};
a.people.toString = function () {
return a.toString(1) + '.people (stub)';
};
i =
'disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove'.split(
' '
);
for (h = 0; h < i.length; h++) g(a, i[h]);
var j = 'set set_once union unset remove delete'.split(' ');
a.get_group = function () {
function b(c) {
d[c] = function () {
call2_args = arguments;
call2 = [c].concat(Array.prototype.slice.call(call2_args, 0));
a.push([e, call2]);
};
}
for (
var d = {},
e = ['get_group'].concat(Array.prototype.slice.call(arguments, 0)),
c = 0;
c < j.length;
c++
)
b(j[c]);
return d;
};
b._i.push([e, f, c]);
};
b.__SV = 1.2;
e = f.createElement('script');
e.type = 'text/javascript';
e.async = !0;
e.src =
'undefined' !== typeof MIXPANEL_CUSTOM_LIB_URL
? MIXPANEL_CUSTOM_LIB_URL
: 'file:' === f.location.protocol &&
'//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'.match(/^\/\//)
? 'https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'
: '//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js';
g = f.getElementsByTagName('script')[0];
g.parentNode.insertBefore(e, g);
}
})(document, window.mixpanel || []);

window.mixpanel.init('<TO_REPLACE>', {
debug: true,
track_pageview: true,
persistence: 'localStorage',
});
3 changes: 3 additions & 0 deletions integrations/mixpanel/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "@gitbook/tsconfig/integration.json"
}

0 comments on commit 6623cef

Please sign in to comment.