Skip to content

Commit 46f4da5

Browse files
committed
wip
1 parent b7b857c commit 46f4da5

File tree

6 files changed

+220
-36
lines changed

6 files changed

+220
-36
lines changed

packages/signals/signals-integration-tests/src/tests/signals-vanilla/runtime-constants.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ test.beforeEach(async ({ page }) => {
2828

2929
test('constants should be accessible in the runtime', async () => {
3030
/**
31-
* Make a button click, see if it:
31+
* Make a button click, see ifdom.window.NavigationAction.URLChange it:
3232
* - creates an interaction signal that sends to the signals endpoint
3333
* - creates an analytics event that sends to the tracking endpoint
3434
*/

packages/signals/signals-runtime/build-signals-runtime-global.js

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,59 @@
11
const esbuild = require('esbuild')
2-
2+
const path = require('path')
3+
const fs = require('fs')
4+
const fsPromises = fs.promises
35
const pkgJSON = require('./package.json')
6+
47
const getBanner = (entryPoint) => {
58
const content = [
69
`// Generated in: ${pkgJSON.name}@${pkgJSON.version}`,
710
`// Entry point: ${entryPoint}`,
811
].join('\n')
912
return content
1013
}
14+
1115
const entryPoints = {
1216
mobile: './src/mobile/index.signals-runtime.ts',
1317
web: './src/web/index.signals-runtime.ts',
1418
}
1519

20+
async function prependContent(filePath, content) {
21+
try {
22+
const fileContent = await fs.promises.readFile(filePath, 'utf8')
23+
await fsPromises.writeFile(filePath, content + '\n' + fileContent)
24+
} catch (error) {
25+
console.error(`Error prepending generated content: ${error}`)
26+
}
27+
}
28+
const buildRuntimeAsString = async (type) => {
29+
const banner = getBanner(entryPoints[type])
30+
const outHelperFileUnminified = `./dist/global/index.${type}.js`
31+
32+
const runtimeContent = fs
33+
.readFileSync(outHelperFileUnminified, 'utf-8')
34+
.replace(banner, '') // remove banner from code section
35+
const generatedDir = path.resolve(__dirname, `src/${type}`)
36+
if (!fs.existsSync(generatedDir)) {
37+
fs.mkdirSync(generatedDir, { recursive: true })
38+
}
39+
40+
// Create the TypeScript file with the inlined string
41+
const generatedTsFile = `./src/${type}/get-runtime-string.ts`
42+
const tsFileContent = `export const RuntimeString = \`${runtimeContent}\``
43+
44+
fs.writeFileSync(generatedTsFile, tsFileContent)
45+
// add banner back to top
46+
await prependContent(
47+
generatedTsFile,
48+
['/* eslint-disable */', banner].join('\n')
49+
)
50+
console.log(`wrote: ${generatedTsFile}`)
51+
}
52+
1653
const buildAll = async () => {
1754
for (const [type, entryPoint] of Object.entries(entryPoints)) {
1855
const outfileMinified = `./dist/global/index.${type}.min.js`
1956
const outfileUnminified = `./dist/global/index.${type}.js`
20-
const outHelperFileUnminified = `./dist/global/get-runtime-string.${type}.js`
2157
try {
2258
// Build minified version
2359
await esbuild.build({
@@ -39,18 +75,7 @@ const buildAll = async () => {
3975
})
4076
console.log(`wrote: ${outfileUnminified}`)
4177

42-
// Build runtime as string (gets injected into globalThis)
43-
await esbuild.build({
44-
entryPoints: [`src/${type}/get-runtime-string.ts`],
45-
bundle: true,
46-
outfile: outHelperFileUnminified,
47-
platform: 'browser',
48-
target: ['esnext'],
49-
loader: {
50-
'.js': 'text',
51-
},
52-
format: 'esm',
53-
})
78+
await buildRuntimeAsString(type)
5479
} catch (err) {
5580
console.error(err)
5681
process.exit(1)

packages/signals/signals-runtime/src/index.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,5 @@ export * as WebRuntimeConstants from './web/web-constants'
99
// mobile
1010
export * as Mobile from './mobile/mobile-signals-types'
1111
export * as MobileRuntimeConstants from './mobile/mobile-constants'
12-
13-
// Signals runtime as strings for the sandbox -- these files are built outside of tsc, using the esbuild script.
14-
// @ts-ignore
15-
import { getWebRuntimeString as getWebStr } from '../../dist/global/get-runtime-string.web'
16-
export const getWebRuntimeString: () => string = getWebStr
17-
18-
// @ts-ignore
19-
import { getMobileRuntimeString as getMobStr } from '../../dist/global/get-runtime-string.mobile'
20-
export const getMobileRuntimeString: () => string = getMobStr
12+
export { RuntimeString as WebRuntimeString } from './web/get-runtime-string'
13+
export { RuntimeString as MobileRuntimeString } from './mobile/get-runtime-string'
Lines changed: 109 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,110 @@
1-
// @ts-ignore
2-
import runtime from '../../dist/global/index.mobile.js'
1+
/* eslint-disable */
2+
// Generated in: @segment/[email protected]
3+
// Entry point: ./src/mobile/index.signals-runtime.ts
4+
export const RuntimeString = `
5+
"use strict";
6+
(() => {
7+
var __defProp = Object.defineProperty;
8+
var __export = (target, all) => {
9+
for (var name in all)
10+
__defProp(target, name, { get: all[name], enumerable: true });
11+
};
312
4-
export function getMobileRuntimeString(): string {
5-
return runtime
6-
}
13+
// src/mobile/mobile-constants.ts
14+
var mobile_constants_exports = {};
15+
__export(mobile_constants_exports, {
16+
EventType: () => EventType,
17+
LocalDataAction: () => LocalDataAction,
18+
NavigationAction: () => NavigationAction,
19+
NetworkAction: () => NetworkAction,
20+
SignalType: () => SignalType
21+
});
22+
var SignalType = Object.freeze({
23+
Interaction: "interaction",
24+
Navigation: "navigation",
25+
Network: "network",
26+
LocalData: "localData",
27+
Instrumentation: "instrumentation",
28+
UserDefined: "userDefined"
29+
});
30+
var EventType = Object.freeze({
31+
Track: "track",
32+
Page: "page",
33+
Screen: "screen",
34+
Identify: "identify",
35+
Group: "group",
36+
Alias: "alias"
37+
});
38+
var NavigationAction = Object.freeze({
39+
Forward: "forward",
40+
Backward: "backward",
41+
Modal: "modal",
42+
Entering: "entering",
43+
Leaving: "leaving",
44+
Page: "page",
45+
Popup: "popup"
46+
});
47+
var NetworkAction = Object.freeze({
48+
Request: "request",
49+
Response: "response"
50+
});
51+
var LocalDataAction = Object.freeze({
52+
Loaded: "loaded",
53+
Updated: "updated",
54+
Saved: "saved",
55+
Deleted: "deleted",
56+
Undefined: "undefined"
57+
});
58+
59+
// src/shared/signals-runtime.ts
60+
var SignalsRuntime = class {
61+
constructor(signals = []) {
62+
this.find = (fromSignal, signalType, predicate) => {
63+
return this.filter(fromSignal, signalType, predicate)[0];
64+
};
65+
this.filter = (fromSignal, signalType, predicate) => {
66+
const _isSignalOfType = (signal) => signal.type === signalType;
67+
return this.signalBuffer.slice(this.signalBuffer.indexOf(fromSignal) + 1).filter(_isSignalOfType).filter((signal) => predicate ? predicate(signal) : () => true);
68+
};
69+
this.signalBuffer = signals;
70+
}
71+
};
72+
73+
// src/mobile/mobile-signals-runtime.ts
74+
var Signals = class extends SignalsRuntime {
75+
constructor(signals = []) {
76+
super(signals);
77+
// mobile only
78+
this.add = (signal) => {
79+
if (this.signalCounter < 0) {
80+
this.signalCounter = 0;
81+
}
82+
if ("index" in signal && signal.index == -1) {
83+
signal.index = this.getNextIndex();
84+
}
85+
this.signalBuffer.unshift(signal);
86+
if (this.signalBuffer.length > this.maxBufferSize) {
87+
this.signalBuffer.pop();
88+
}
89+
};
90+
// mobile only
91+
this.getNextIndex = () => {
92+
const index = this.signalCounter;
93+
this.signalCounter += 1;
94+
return index;
95+
};
96+
this.signalCounter = 0;
97+
this.maxBufferSize = 1e3;
98+
}
99+
};
100+
101+
// src/mobile/index.signals-runtime.ts
102+
Object.assign(
103+
globalThis,
104+
{
105+
Signals
106+
},
107+
mobile_constants_exports
108+
);
109+
})();
110+
`
Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,68 @@
1-
// @ts-ignore
2-
import webRuntime from '../../dist/global/index.web'
1+
/* eslint-disable */
2+
// Generated in: @segment/[email protected]
3+
// Entry point: ./src/web/index.signals-runtime.ts
4+
export const RuntimeString = `
5+
"use strict";
6+
(() => {
7+
var __defProp = Object.defineProperty;
8+
var __export = (target, all) => {
9+
for (var name in all)
10+
__defProp(target, name, { get: all[name], enumerable: true });
11+
};
312
4-
export function getWebRuntimeString(): string {
5-
return webRuntime
6-
}
13+
// src/shared/signals-runtime.ts
14+
var SignalsRuntime = class {
15+
constructor(signals = []) {
16+
this.find = (fromSignal, signalType, predicate) => {
17+
return this.filter(fromSignal, signalType, predicate)[0];
18+
};
19+
this.filter = (fromSignal, signalType, predicate) => {
20+
const _isSignalOfType = (signal) => signal.type === signalType;
21+
return this.signalBuffer.slice(this.signalBuffer.indexOf(fromSignal) + 1).filter(_isSignalOfType).filter((signal) => predicate ? predicate(signal) : () => true);
22+
};
23+
this.signalBuffer = signals;
24+
}
25+
};
26+
27+
// src/web/web-signals-runtime.ts
28+
var Signals = class extends SignalsRuntime {
29+
};
30+
31+
// src/web/web-constants.ts
32+
var web_constants_exports = {};
33+
__export(web_constants_exports, {
34+
EventType: () => EventType,
35+
NavigationAction: () => NavigationAction,
36+
SignalType: () => SignalType
37+
});
38+
var EventType = Object.freeze({
39+
Track: "track",
40+
Page: "page",
41+
Screen: "screen",
42+
Identify: "identify",
43+
Group: "group",
44+
Alias: "alias"
45+
});
46+
var NavigationAction = Object.freeze({
47+
URLChange: "urlChange",
48+
PageLoad: "pageLoad"
49+
});
50+
var SignalType = Object.freeze({
51+
Interaction: "interaction",
52+
Navigation: "navigation",
53+
Network: "network",
54+
LocalData: "localData",
55+
Instrumentation: "instrumentation",
56+
UserDefined: "userDefined"
57+
});
58+
59+
// src/web/index.signals-runtime.ts
60+
Object.assign(
61+
globalThis,
62+
{
63+
Signals
64+
},
65+
web_constants_exports
66+
);
67+
})();
68+
`

packages/signals/signals/src/core/processor/sandbox.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { resolvers } from './arg-resolvers'
44
import { AnalyticsRuntimePublicApi } from '../../types'
55
import { replaceBaseUrl } from '../../lib/replace-base-url'
66
import { Signal } from '@segment/analytics-signals-runtime'
7-
import { getWebRuntimeString } from '@segment/analytics-signals-runtime'
7+
import { WebRuntimeString } from '@segment/analytics-signals-runtime'
88
import { polyfills } from './polyfills'
99

1010
export type MethodName =
@@ -214,7 +214,7 @@ export class Sandbox {
214214
const code = [
215215
polyfills,
216216
await this.settings.processSignal,
217-
getWebRuntimeString(),
217+
WebRuntimeString,
218218
`var signals = new Signals(${JSON.stringify(signals)})`,
219219
'try { processSignal(' +
220220
JSON.stringify(signal) +

0 commit comments

Comments
 (0)