Skip to content

Commit 511ffad

Browse files
authored
Pj/tester (#688)
* adding the build command * adding the webpack config for the destinations * adding tester app * yarn.lock
1 parent 1f21d51 commit 511ffad

File tree

10 files changed

+4827
-1
lines changed

10 files changed

+4827
-1
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"test": "lerna run --concurrency 5 --since master test --stream -- --single-run --reporters summary --log-level error",
1616
"test:ci": "lerna run --concurrency 1 --stream --since master test:ci -- --log-level error",
1717
"compile": "webpack --config webpack.config.integrations.js && webpack --config webpack.config.middleware.js",
18-
"build": "rm -rf build && yarn compile"
18+
"build": "rm -rf build && yarn compile",
19+
"dev": "concurrently \"yarn --cwd tester serve\" \"webpack --config webpack.config.tester.js --watch\""
1920
},
2021
"devDependencies": {
2122
"@babel/core": "^7.12.10",

tester/package.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "legacy-ajs-tester",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"repository": "https://github.com/segmentio/analytics.js-integrations.git",
6+
"author": "Segment",
7+
"license": "See LICENSE",
8+
"private": true,
9+
"scripts": {
10+
"build": "webpack",
11+
"serve": "webpack serve --open"
12+
},
13+
"devDependencies": {
14+
"@babel/core": "^7.18.6",
15+
"@babel/preset-env": "^7.18.6",
16+
"@babel/preset-react": "7.18.6",
17+
"@segment/analytics-next": "^1.38.0",
18+
"babel-loader": "^8.2.5",
19+
"html-webpack-plugin": "^5.5.0",
20+
"webpack": "^5.73.0",
21+
"webpack-cli": "^4.10.0",
22+
"webpack-dev-server": "^4.9.2"
23+
}
24+
}

tester/src/App.js

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import { getSettings, loadAJS } from './utils';
2+
3+
const App = function(props) {
4+
const [loading, setLoading] = React.useState(false);
5+
const [wk, setWk] = React.useState('');
6+
const [ajsLoaded, setAjsLoaded] = React.useState(false);
7+
const [dirty, setDirty] = React.useState(false);
8+
const [editorVisible, setEditorVisible] = React.useState(false);
9+
const editor = React.useRef(null);
10+
11+
React.useEffect(() => {
12+
const wk = localStorage.getItem('segWk');
13+
const settings = localStorage.getItem('segSettings');
14+
15+
wk && setWk(wk);
16+
const settingsObject = JSON.parse(settings);
17+
18+
if (wk && Object.keys(settingsObject).length) {
19+
// load AJS
20+
loadAJS(wk, settingsObject);
21+
setAjsLoaded(true);
22+
setEditorVisible(true);
23+
}
24+
25+
const container = document.getElementById('jsoneditor');
26+
const options = {
27+
onChange: () => {
28+
setDirty(true);
29+
}
30+
};
31+
editor.current = new JSONEditor(container, options);
32+
editor.current.set(settingsObject);
33+
editor.current.expand({
34+
path: ['integrations'],
35+
isExpand: true,
36+
recursive: false
37+
});
38+
}, []);
39+
40+
const loadSettings = async () => {
41+
setLoading(true);
42+
const settingsJSON = await getSettings(wk);
43+
const settings = JSON.stringify(settingsJSON, null, 2);
44+
localStorage.setItem('segWk', wk);
45+
localStorage.setItem('segSettings', settings);
46+
editor.current.set(settingsJSON);
47+
setLoading(false);
48+
setEditorVisible(true);
49+
50+
if (ajsLoaded) {
51+
setDirty(true);
52+
} else {
53+
loadAJS(wk, settingsJSON);
54+
setAjsLoaded(true);
55+
}
56+
};
57+
58+
const handleReload = () => {
59+
const settingsObject = editor.current.get();
60+
const settings = JSON.stringify(settingsObject);
61+
62+
localStorage.setItem('segWk', wk);
63+
localStorage.setItem('segSettings', settings);
64+
location.reload();
65+
};
66+
67+
return (
68+
<div>
69+
<form>
70+
<fieldset>
71+
<label htmlFor="writeKey">Writekey: </label>
72+
<input
73+
type="text"
74+
placeholder="Segment writekey"
75+
id="writeKey"
76+
onChange={e => {
77+
setWk(e.target.value);
78+
}}
79+
value={wk}
80+
/>
81+
<input
82+
className="pure-button pure-button-primary"
83+
type="button"
84+
value="Fetch Writekey"
85+
onClick={loadSettings}
86+
/>
87+
<input
88+
className="pure-button pure-button-primary"
89+
type="button"
90+
value="Reload and init AJS"
91+
onClick={handleReload}
92+
disabled={!dirty}
93+
/>
94+
</fieldset>
95+
</form>
96+
<div
97+
id="jsoneditor"
98+
style={{ height: '90vh', display: editorVisible ? 'block' : 'none' }}
99+
></div>
100+
</div>
101+
);
102+
};
103+
104+
export default App;

tester/src/index.html

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<title>Document</title>
8+
<link
9+
rel="stylesheet"
10+
href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css"
11+
/>
12+
<link
13+
href="https://unpkg.com/jsoneditor@9.9.0/dist/jsoneditor.min.css"
14+
rel="stylesheet"
15+
type="text/css"
16+
/>
17+
<style>
18+
body {
19+
font-family: sans-serif;
20+
font-size: 14px;
21+
}
22+
fieldset {
23+
border: none;
24+
padding: 10px;
25+
}
26+
27+
input {
28+
padding: 10px;
29+
border: 1px solid #ccc;
30+
border-radius: 4px;
31+
box-sizing: border-box;
32+
margin-bottom: 10px;
33+
margin-left: 10px;
34+
cursor: pointer;
35+
}
36+
37+
input[type='text'] {
38+
width: 200px;
39+
}
40+
</style>
41+
</head>
42+
<body>
43+
<div id="app">
44+
Loading ...
45+
</div>
46+
47+
<script
48+
src="https://unpkg.com/react@16/umd/react.development.js"
49+
crossorigin
50+
></script>
51+
<script
52+
src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"
53+
crossorigin
54+
></script>
55+
<script
56+
src="https://unpkg.com/jsoneditor@9.9.0/dist/jsoneditor.min.js"
57+
crossorigin
58+
></script>
59+
</body>
60+
</html>

tester/src/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import App from './App';
2+
3+
4+
ReactDOM.render(<App />, document.getElementById('app'));

tester/src/utils.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { AnalyticsBrowser } from '@segment/analytics-next';
2+
3+
export async function getSettings(wk) {
4+
let data = await fetch(`https://cdn.segment.com/v1/projects/${wk}/settings`);
5+
data = await data.json();
6+
return cleanSettings(data);
7+
}
8+
9+
function cleanSettings(data) {
10+
Object.keys(data.integrations).forEach(i => {
11+
// setting the version of everything to latest
12+
data.integrations[i].versionSettings.version = 'latest';
13+
data.integrations[i].versionSettings.override = 'latest';
14+
});
15+
16+
return data;
17+
}
18+
19+
export async function loadAJS(writeKey, cdnSettings) {
20+
Object.keys(cdnSettings.integrations).forEach(i => {
21+
const name = i
22+
.toLowerCase()
23+
.replace('.', '')
24+
.replace(/\s+/g, '-');
25+
26+
// we are not using common chunks for tester, so we can ignore the dependency resolution magic
27+
window[`${name}Deps`] = [];
28+
window[`${name}Loader`] = () => undefined;
29+
});
30+
31+
const analytics = AnalyticsBrowser.load({
32+
writeKey,
33+
cdnURL: 'http://localhost:8080',
34+
cdnSettings: { ...cdnSettings }
35+
});
36+
37+
analytics.identify('hello world');
38+
window.analytics = analytics;
39+
}

tester/webpack.config.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const path = require('path');
2+
const HtmlWebpackPlugin = require('html-webpack-plugin');
3+
4+
module.exports = {
5+
mode: 'none',
6+
entry: './src/index.js',
7+
output: {
8+
path: __dirname + '/dist',
9+
filename: 'bundle.js'
10+
},
11+
module: {
12+
rules: [
13+
{
14+
test: /\.m?js$/,
15+
exclude: /(node_modules)/,
16+
use: {
17+
loader: 'babel-loader',
18+
options: {
19+
presets: [
20+
[
21+
'@babel/preset-env',
22+
{
23+
targets: {
24+
esmodules: true
25+
}
26+
}
27+
],
28+
'@babel/preset-react'
29+
]
30+
}
31+
}
32+
}
33+
]
34+
},
35+
resolve: {
36+
extensions: ['.ts', '.js']
37+
},
38+
plugins: [
39+
new HtmlWebpackPlugin({
40+
template: 'src/index.html'
41+
})
42+
],
43+
devServer: {
44+
static: path.resolve(__dirname, 'dist')
45+
}
46+
};

0 commit comments

Comments
 (0)