Skip to content

Commit 125b4a3

Browse files
authored
[DEST-1426] Add module to support contractor client-side testing. (#280)
* Adds A.js builder/tester module to the `./compile` directory to facilitate contractor testing.
1 parent 96e877a commit 125b4a3

File tree

14 files changed

+782
-0
lines changed

14 files changed

+782
-0
lines changed

compiler/.gitignore

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
8+
# Runtime data
9+
pids
10+
*.pid
11+
*.seed
12+
*.pid.lock
13+
14+
# Directory for instrumented libs generated by jscoverage/JSCover
15+
lib-cov
16+
17+
# Coverage directory used by tools like istanbul
18+
coverage
19+
20+
# nyc test coverage
21+
.nyc_output
22+
23+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24+
.grunt
25+
26+
# Bower dependency directory (https://bower.io/)
27+
bower_components
28+
29+
# node-waf configuration
30+
.lock-wscript
31+
32+
# Compiled binary addons (http://nodejs.org/api/addons.html)
33+
build/Release
34+
35+
# Dependency directories
36+
node_modules/
37+
jspm_packages/
38+
39+
# Typescript v1 declaration files
40+
typings/
41+
42+
# Optional npm cache directory
43+
.npm
44+
45+
# Optional eslint cache
46+
.eslintcache
47+
48+
# Optional REPL history
49+
.node_repl_history
50+
51+
# Output of 'npm pack'
52+
*.tgz
53+
54+
# Yarn Integrity file
55+
.yarn-integrity
56+
57+
# dotenv environment variables file
58+
.env

compiler/README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Analaytics.js-Integrations Tester
2+
3+
This is a simple command line tool that supports building and testing Analytics.js locally.
4+
5+
Note: The path to all directories referenced in this document are relative to the Compiler tool root folder (where this README is located).
6+
7+
# Install
8+
9+
There is NO NEED to `yarn` or `yarn install` before using this command line tool. Simply run `./compile --writeKey=<YOUR WRITE KEY>` to get started.
10+
11+
# Usage
12+
13+
```bash
14+
./compile -h
15+
16+
Usage: ./compile [options]
17+
18+
Options:
19+
20+
-w, --write-key <writeKey> Writekey of target Segment source [Required]
21+
-p, --port [port] Set a port to serve the local ajs file from (default: 3000)
22+
-h, --help Output usage information
23+
```
24+
25+
# Build Process
26+
27+
- This tool builds all A.js integration packages from the `../integrations` directory into a local version of A.js.
28+
- The tool retrieves integration settings from `http://cdn.segment.com/v1/projects/${writeKey}/settings`. Because we pull settings from the
29+
Segment account associated with the `--writeKey` option, you must enable and set up each integration you'd like to test in your Segment dashboard
30+
before building a version of A.js locally using this tool.
31+
- Once A.js is built, this tool saves a copy of your A.js build in the `./builds` folder. Build names follow the pattern `analytics-${date}.js`, where
32+
`date` is the unix timestamp in seconds at which the file was generated.
33+
- Next, the tool launches your default browser, serving a sample `index` file from `./src/index.html`. This file includes the Segment snippet and
34+
initializes the your just-generated A.js build so you can begin testing right away.
35+
36+
# Adding New Destinations
37+
38+
Adding new destinations is easy - just add the package name and file path to the `./package.json` file in this directory. For example, to
39+
add a new integration with slug `google-v2`, just add the following line to the `dependencies` section of `./package.json`:
40+
41+
```
42+
"@segment/analytics.js-integrations-google-v2": "file:../integrations/google-v2"
43+
```
44+
45+
Note the `google-v2` destination directory must exist in `../integrations`, and the package name in that directory must match the package name
46+
specified in the `package.json` file in this directory.
47+
48+
# FAQ
49+
50+
**Are A.js video plugins and client-side tracking plans supported?**
51+
No, currently the A.js Tester doesn't support video plugins or tracking plans; however, we will add these in the future if needed for testing.

compiler/compile

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env node
2+
3+
const fs = require('fs')
4+
const process = require('process')
5+
const program = require('commander')
6+
const build = require('./scripts/build')
7+
const buildIntegrations = require('./scripts/buildIntegrations')
8+
const addSettings = require('./scripts/settings')
9+
const path = require('path')
10+
const server = require('./server')
11+
const { spawnSync } = require('child_process')
12+
const generateFile = require('./scripts/generateFile')
13+
const open = require('open')
14+
const filePath = path.join(__dirname + '/src/index.html')
15+
const buildName = `${Math.floor(new Date() / 1000)}`;
16+
const fileName = path.join(__dirname, 'builds', `analytics-${buildName}.js`)
17+
18+
program
19+
.option('-w, --writeKey <writeKey>', 'Segment writeKey to for viewing events in the debugger')
20+
.option('-p, --port [port]', 'Set a port to serve the local ajs file from', 3000)
21+
.parse(process.argv)
22+
23+
if (!program.writeKey) {
24+
console.error('Error: --writeKey required')
25+
process.exit(1)
26+
}
27+
28+
// run `yarn install --no-lockfile` before each build to pull in any updates made in the /integrations directory
29+
spawnSync('yarn install --no-lockfile', {
30+
shell: true,
31+
cwd: __dirname,
32+
stdio: 'inherit'
33+
})
34+
35+
const writeKey = program.writeKey
36+
const port = program.port || 3000
37+
38+
buildIntegrations()
39+
build(async (ajs, integrationVersions, coreVersion) => {
40+
const compiled = await addSettings({
41+
ajs,
42+
integrationVersions,
43+
coreVersion,
44+
writeKey
45+
})
46+
47+
fs.writeFileSync(fileName, compiled)
48+
49+
generateFile(program.writeKey, port)
50+
server(compiled, filePath, port)
51+
open(`http://localhost:${port}`)
52+
})

compiler/lib/analytics.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Module dependencies.
3+
*/
4+
5+
var analytics = require('@segment/analytics.js-core');
6+
7+
/*
8+
* Exports.
9+
*/
10+
11+
module.exports = function(Integrations) {
12+
for (let integration in Integrations) {
13+
analytics.use(Integrations[integration]);
14+
}
15+
16+
return analytics;
17+
};

compiler/lib/index.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Module dependencies.
3+
*/
4+
5+
var Integrations = require('./integrations');
6+
var analytics = require('./analytics')(Integrations);
7+
8+
// Get a handle on the global analytics queue, as initialized by the
9+
// analytics.js snippet. The snippet stubs out the analytics.js API and queues
10+
// up calls for execution when the full analytics.js library (this file) loads.
11+
var analyticsq = global.analytics || [];
12+
13+
// Parse the version from the analytics.js snippet.
14+
var snippetVersion = analyticsq && analyticsq.SNIPPET_VERSION ? parseFloat(analyticsq.SNIPPET_VERSION, 10) : 0;
15+
16+
// Include as much version information as possible so we know exactly what we're running.
17+
// Looks like: {
18+
// "core": "3.0.0",
19+
// "cdn": "1.15.3",
20+
// "integrations": {
21+
// "Segment.io": "3.1.1",
22+
// ...
23+
// }
24+
// }
25+
analytics._VERSIONS = '<%- versions %>';
26+
27+
// Initialize analytics.js. CDN will render configuration objects into
28+
// `'<%- integrations %>'` and `'<%- plan %>'` using project settings.
29+
analytics.initialize('<%- integrations %>', {
30+
initialPageview: snippetVersion === 0,
31+
plan: '<%- plan %>'
32+
});
33+
34+
// Make any queued calls up before the full analytics.js library
35+
// loaded
36+
while (analyticsq && analyticsq.length > 0) {
37+
var args = analyticsq.shift();
38+
var method = args.shift();
39+
40+
if (typeof analytics[method] === 'function') {
41+
analytics[method].apply(analytics, args);
42+
}
43+
}
44+
45+
// Free the reference to analyticsq
46+
analyticsq = null;
47+
48+
/*
49+
* Exports.
50+
*/
51+
52+
// Set `global.analytics` explicitly rather than using Browserify's
53+
// `--standalone` flag in order to avoid hooking into an already-declared
54+
// `global.require`
55+
global.analytics = analytics;

compiler/lib/integrations.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
module.exports = {
2+
'adlearn-open-platform': require('@segment/analytics.js-integration-adlearn-open-platform'),
3+
'adobe-analytics': require('@segment/analytics.js-integration-adobe-analytics'),
4+
'adobe-target': require('@segment/analytics.js-integration-adobe-target'),
5+
'adometry': require('@segment/analytics.js-integration-adometry'),
6+
'amplitude': require('@segment/analytics.js-integration-amplitude'),
7+
'appboy': require('@segment/analytics.js-integration-appboy'),
8+
'appnexus': require('@segment/analytics.js-integration-appnexus'),
9+
'clevertap': require('@segment/analytics.js-integration-clevertap'),
10+
'convertro': require('@segment/analytics.js-integration-convertro'),
11+
'criteo': require('@segment/analytics.js-integration-criteo'),
12+
'cxense': require('@segment/analytics.js-integration-cxense'),
13+
'doubleclick-floodlight': require('@segment/analytics.js-integration-doubleclick-floodlight'),
14+
'eloqua': require('@segment/analytics.js-integration-eloqua'),
15+
'email-aptitude': require('@segment/analytics.js-integration-email-aptitude'),
16+
'facebook-pixel': require('@segment/analytics.js-integration-facebook-pixel'),
17+
'friendbuy': require('@segment/analytics.js-integration-friendbuy'),
18+
'fullstory': require('@segment/analytics.js-integration-fullstory'),
19+
'google-analytics': require('@segment/analytics.js-integration-google-analytics'),
20+
'heap': require('@segment/analytics.js-integration-heap'),
21+
'hindsight': require('@segment/analytics.js-integration-hindsight'),
22+
'hotjar': require('@segment/analytics.js-integration-hotjar'),
23+
'hubspot': require('@segment/analytics.js-integration-hubspot'),
24+
'kenshoo-infinity': require('@segment/analytics.js-integration-kenshoo-infinity'),
25+
'linkedin-insight-tag': require('@segment/analytics.js-integration-linkedin-insight-tag'),
26+
'livechat': require('@segment/analytics.js-integration-livechat'),
27+
'localytics': require('@segment/analytics.js-integration-localytics'),
28+
'marketo': require('@segment/analytics.js-integration-marketo'),
29+
'marketo-v2': require('@segment/analytics.js-integration-marketo-v2'),
30+
'mediamath': require('@segment/analytics.js-integration-mediamath'),
31+
'mixpanel': require('@segment/analytics.js-integration-mixpanel'),
32+
'moengage': require('@segment/analytics.js-integration-moengage'),
33+
'monetate': require('@segment/analytics.js-integration-monetate'),
34+
'nielsen-dcr': require('@segment/analytics.js-integration-nielsen-dcr'),
35+
'nielsen-dtvr': require('@segment/analytics.js-integration-nielsen-dtvr'),
36+
'omniture': require('@segment/analytics.js-integration-omniture'),
37+
'onespot': require('@segment/analytics.js-integration-onespot'),
38+
'optimizely': require('@segment/analytics.js-integration-optimizely'),
39+
'pardot': require('@segment/analytics.js-integration-pardot'),
40+
'pinterest-tag': require('@segment/analytics.js-integration-pinterest-tag'),
41+
'qualaroo': require('@segment/analytics.js-integration-qualaroo'),
42+
'quora-conversion-pixel': require('@segment/analytics.js-integration-quora-conversion-pixel'),
43+
'rockerbox': require('@segment/analytics.js-integration-rockerbox'),
44+
'rocket-fuel': require('@segment/analytics.js-integration-rocket-fuel'),
45+
'salesforce-dmp': require('@segment/analytics.js-integration-salesforce-dmp'),
46+
'salesforce-live-agent': require('@segment/analytics.js-integration-salesforce-live-agent'),
47+
'segmentio': require('@segment/analytics.js-integration-segmentio'),
48+
'sentry': require('@segment/analytics.js-integration-sentry'),
49+
'shareasale': require('@segment/analytics.js-integration-shareasale'),
50+
'simplifi': require('@segment/analytics.js-integration-simplifi'),
51+
'steelhouse': require('@segment/analytics.js-integration-steelhouse'),
52+
'stripe-radar': require('@segment/analytics.js-integration-stripe-radar'),
53+
'tag-injector': require('@segment/analytics.js-integration-tag-injector'),
54+
'totango': require('@segment/analytics.js-integration-totango'),
55+
'trackjs': require('@segment/analytics.js-integration-trackjs'),
56+
'tvsquared': require('@segment/analytics.js-integration-tvsquared'),
57+
'visual-website-optimizer': require('@segment/analytics.js-integration-visual-website-optimizer'),
58+
'woopra': require('@segment/analytics.js-integration-woopra'),
59+
'wootric': require('@segment/analytics.js-integration-wootric'),
60+
'zopim': require('@segment/analytics.js-integration-zopim')
61+
};

compiler/package.json

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
{
2+
"name": "@segment/ajs-tester",
3+
"version": "0.0.1",
4+
"main": "index.js",
5+
"scripts": {
6+
"test": "echo \"Error: no test specified\" && exit 1",
7+
"start": "node server.js"
8+
},
9+
"bin": {
10+
"compile": "./compile"
11+
},
12+
"keywords": [],
13+
"author": "",
14+
"license": "ISC",
15+
"dependencies": {
16+
"@segment/analytics.js-core": "^3.9.0",
17+
"@segment/analytics.js-integration": "^2.1.1",
18+
"@segment/analytics.js-integration-adlearn-open-platform": "file:../integrations/adlearn-open-platform",
19+
"@segment/analytics.js-integration-adobe-analytics": "file:../integrations/adobe-analytics",
20+
"@segment/analytics.js-integration-adobe-target": "file:../integrations/adobe-target",
21+
"@segment/analytics.js-integration-adometry": "file:../integrations/adometry",
22+
"@segment/analytics.js-integration-amplitude": "file:../integrations/amplitude",
23+
"@segment/analytics.js-integration-appboy": "file:../integrations/appboy",
24+
"@segment/analytics.js-integration-appnexus": "file:../integrations/appnexus",
25+
"@segment/analytics.js-integration-clevertap": "file:../integrations/clevertap",
26+
"@segment/analytics.js-integration-convertro": "file:../integrations/convertro",
27+
"@segment/analytics.js-integration-criteo": "file:../integrations/criteo",
28+
"@segment/analytics.js-integration-cxense": "file:../integrations/cxense",
29+
"@segment/analytics.js-integration-doubleclick-floodlight": "file:../integrations/doubleclick-floodlight",
30+
"@segment/analytics.js-integration-eloqua": "file:../integrations/eloqua",
31+
"@segment/analytics.js-integration-email-aptitude": "file:../integrations/email-aptitude",
32+
"@segment/analytics.js-integration-facebook-pixel": "file:../integrations/facebook-pixel",
33+
"@segment/analytics.js-integration-friendbuy": "file:../integrations/friendbuy",
34+
"@segment/analytics.js-integration-fullstory": "file:../integrations/fullstory",
35+
"@segment/analytics.js-integration-google-analytics": "file:../integrations/google-analytics",
36+
"@segment/analytics.js-integration-heap": "file:../integrations/heap",
37+
"@segment/analytics.js-integration-hindsight": "file:../integrations/hindsight",
38+
"@segment/analytics.js-integration-hotjar": "file:../integrations/hotjar",
39+
"@segment/analytics.js-integration-hubspot": "file:../integrations/hubspot",
40+
"@segment/analytics.js-integration-kenshoo-infinity": "file:../integrations/kenshoo-infinity",
41+
"@segment/analytics.js-integration-linkedin-insight-tag": "file:../integrations/linkedin-insight-tag",
42+
"@segment/analytics.js-integration-livechat": "file:../integrations/livechat",
43+
"@segment/analytics.js-integration-localytics": "file:../integrations/localytics",
44+
"@segment/analytics.js-integration-marketo": "file:../integrations/marketo",
45+
"@segment/analytics.js-integration-marketo-v2": "file:../integrations/marketo-v2",
46+
"@segment/analytics.js-integration-mediamath": "file:../integrations/mediamath",
47+
"@segment/analytics.js-integration-mixpanel": "file:../integrations/mixpanel",
48+
"@segment/analytics.js-integration-moengage": "file:../integrations/moengage",
49+
"@segment/analytics.js-integration-monetate": "file:../integrations/monetate",
50+
"@segment/analytics.js-integration-nielsen-dcr": "file:../integrations/nielsen-dcr",
51+
"@segment/analytics.js-integration-nielsen-dtvr": "file:../integrations/nielsen-dtvr",
52+
"@segment/analytics.js-integration-omniture": "file:../integrations/omniture",
53+
"@segment/analytics.js-integration-onespot": "file:../integrations/onespot",
54+
"@segment/analytics.js-integration-optimizely": "file:../integrations/optimizely",
55+
"@segment/analytics.js-integration-pardot": "file:../integrations/pardot",
56+
"@segment/analytics.js-integration-pinterest-tag": "file:../integrations/pinterest-tag",
57+
"@segment/analytics.js-integration-qualaroo": "file:../integrations/qualaroo",
58+
"@segment/analytics.js-integration-quora-conversion-pixel": "file:../integrations/quora-conversion-pixel",
59+
"@segment/analytics.js-integration-rockerbox": "file:../integrations/rockerbox",
60+
"@segment/analytics.js-integration-rocket-fuel": "file:../integrations/rocket-fuel",
61+
"@segment/analytics.js-integration-salesforce-dmp": "file:../integrations/salesforce-dmp",
62+
"@segment/analytics.js-integration-salesforce-live-agent": "file:../integrations/salesforce-live-agent",
63+
"@segment/analytics.js-integration-segmentio": "file:../integrations/segmentio",
64+
"@segment/analytics.js-integration-sentry": "file:../integrations/sentry",
65+
"@segment/analytics.js-integration-shareasale": "file:../integrations/shareasale",
66+
"@segment/analytics.js-integration-simplifi": "file:../integrations/simplifi",
67+
"@segment/analytics.js-integration-steelhouse": "file:../integrations/steelhouse",
68+
"@segment/analytics.js-integration-stripe-radar": "file:../integrations/stripe-radar",
69+
"@segment/analytics.js-integration-tag-injector": "file:../integrations/tag-injector",
70+
"@segment/analytics.js-integration-totango": "file:../integrations/totango",
71+
"@segment/analytics.js-integration-trackjs": "file:../integrations/trackjs",
72+
"@segment/analytics.js-integration-tvsquared": "file:../integrations/tvsquared",
73+
"@segment/analytics.js-integration-visual-website-optimizer": "file:../integrations/visual-website-optimizer",
74+
"@segment/analytics.js-integration-woopra": "file:../integrations/woopra",
75+
"@segment/analytics.js-integration-wootric": "file:../integrations/wootric",
76+
"@segment/analytics.js-integration-zopim": "file:../integrations/zopim",
77+
"browserify": "^16.5.0",
78+
"ejs": "^2.7.1",
79+
"express": "^4.17.1",
80+
"open": "^7.0.0",
81+
"pug": "^2.0.4",
82+
"request": "^2.88.0",
83+
"through2": "^3.0.1"
84+
},
85+
"directories": {
86+
"lib": "lib"
87+
},
88+
"description": "A simple command line tool for building and testing A.js locally."
89+
}

0 commit comments

Comments
 (0)