@vercel/speed-insights 1.3.1 → 2.0.0
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/astro/component.ts +1 -2
- package/dist/astro/index.astro +25 -10
- package/dist/index.d.mts +12 -10
- package/dist/index.d.ts +12 -10
- package/dist/index.js +58 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +58 -31
- package/dist/index.mjs.map +1 -1
- package/dist/next/index.d.mts +5 -5
- package/dist/next/index.d.ts +5 -5
- package/dist/next/index.js +84 -38
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +84 -38
- package/dist/next/index.mjs.map +1 -1
- package/dist/nuxt/index.d.mts +5 -2
- package/dist/nuxt/index.d.ts +5 -2
- package/dist/nuxt/index.js +30 -182
- package/dist/nuxt/index.js.map +1 -1
- package/dist/nuxt/index.mjs +26 -171
- package/dist/nuxt/index.mjs.map +1 -1
- package/dist/nuxt/runtime/index.d.mts +40 -0
- package/dist/nuxt/runtime/index.d.ts +40 -0
- package/dist/nuxt/runtime/index.js +278 -0
- package/dist/nuxt/runtime/index.js.map +1 -0
- package/dist/nuxt/runtime/index.mjs +250 -0
- package/dist/nuxt/runtime/index.mjs.map +1 -0
- package/dist/react/index.d.mts +6 -5
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +76 -37
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +76 -37
- package/dist/react/index.mjs.map +1 -1
- package/dist/remix/index.d.mts +5 -5
- package/dist/remix/index.d.ts +5 -5
- package/dist/remix/index.js +86 -41
- package/dist/remix/index.js.map +1 -1
- package/dist/remix/index.mjs +86 -41
- package/dist/remix/index.mjs.map +1 -1
- package/dist/sveltekit/index.d.mts +6 -6
- package/dist/sveltekit/index.d.ts +6 -6
- package/dist/sveltekit/index.js +77 -43
- package/dist/sveltekit/index.js.map +1 -1
- package/dist/sveltekit/index.mjs +77 -43
- package/dist/sveltekit/index.mjs.map +1 -1
- package/dist/vue/index.d.mts +36 -1
- package/dist/vue/index.d.ts +36 -1
- package/dist/vue/index.js +75 -36
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/index.mjs +75 -36
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +16 -6
- package/tsup.config.js +17 -2
- package/.eslintrc.cjs +0 -7
package/dist/react/index.d.ts
CHANGED
|
@@ -2,20 +2,20 @@ interface SpeedInsightsProps {
|
|
|
2
2
|
dsn?: string;
|
|
3
3
|
sampleRate?: number;
|
|
4
4
|
route?: string | null;
|
|
5
|
-
beforeSend?:
|
|
5
|
+
beforeSend?: BeforeSend;
|
|
6
6
|
debug?: boolean;
|
|
7
7
|
scriptSrc?: string;
|
|
8
8
|
endpoint?: string;
|
|
9
9
|
}
|
|
10
10
|
type EventTypes = 'vital';
|
|
11
|
-
interface
|
|
11
|
+
interface BeforeSendEvent {
|
|
12
12
|
type: EventTypes;
|
|
13
13
|
url: string;
|
|
14
14
|
route?: string;
|
|
15
15
|
}
|
|
16
|
-
type
|
|
16
|
+
type BeforeSend = (event: BeforeSendEvent) => BeforeSendEvent | null | undefined | false;
|
|
17
17
|
interface Functions {
|
|
18
|
-
beforeSend?:
|
|
18
|
+
beforeSend?: BeforeSend;
|
|
19
19
|
}
|
|
20
20
|
interface SpeedInsights$1<T extends keyof Functions = keyof Functions> {
|
|
21
21
|
queue: [T, Functions[T]][];
|
|
@@ -29,7 +29,7 @@ declare global {
|
|
|
29
29
|
siq?: SpeedInsights$1['queue'];
|
|
30
30
|
sil?: boolean;
|
|
31
31
|
/** used by Astro component only */
|
|
32
|
-
speedInsightsBeforeSend?:
|
|
32
|
+
speedInsightsBeforeSend?: BeforeSend;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -38,6 +38,7 @@ declare function computeRoute(pathname: string | null, pathParams: Record<string
|
|
|
38
38
|
declare function SpeedInsights(props: SpeedInsightsProps & {
|
|
39
39
|
framework?: string;
|
|
40
40
|
basePath?: string;
|
|
41
|
+
configString?: string;
|
|
41
42
|
}): JSX.Element | null;
|
|
42
43
|
|
|
43
44
|
export { SpeedInsights, computeRoute };
|
package/dist/react/index.js
CHANGED
|
@@ -27,18 +27,19 @@ __export(react_exports, {
|
|
|
27
27
|
module.exports = __toCommonJS(react_exports);
|
|
28
28
|
var import_react = require("react");
|
|
29
29
|
|
|
30
|
-
// package.json
|
|
31
|
-
var name = "@vercel/speed-insights";
|
|
32
|
-
var version = "1.3.1";
|
|
33
|
-
|
|
34
30
|
// src/queue.ts
|
|
35
31
|
var initQueue = () => {
|
|
36
32
|
if (window.si) return;
|
|
37
33
|
window.si = function a(...params) {
|
|
38
|
-
|
|
34
|
+
window.siq = window.siq || [];
|
|
35
|
+
window.siq.push(params);
|
|
39
36
|
};
|
|
40
37
|
};
|
|
41
38
|
|
|
39
|
+
// package.json
|
|
40
|
+
var name = "@vercel/speed-insights";
|
|
41
|
+
var version = "2.0.0";
|
|
42
|
+
|
|
42
43
|
// src/utils.ts
|
|
43
44
|
function isBrowser() {
|
|
44
45
|
return typeof window !== "undefined";
|
|
@@ -49,7 +50,7 @@ function detectEnvironment() {
|
|
|
49
50
|
if (env === "development" || env === "test") {
|
|
50
51
|
return "development";
|
|
51
52
|
}
|
|
52
|
-
} catch
|
|
53
|
+
} catch {
|
|
53
54
|
}
|
|
54
55
|
return "production";
|
|
55
56
|
}
|
|
@@ -80,7 +81,7 @@ function computeRoute(pathname, pathParams) {
|
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
return result;
|
|
83
|
-
} catch
|
|
84
|
+
} catch {
|
|
84
85
|
return pathname;
|
|
85
86
|
}
|
|
86
87
|
}
|
|
@@ -92,7 +93,7 @@ function escapeRegExp(string) {
|
|
|
92
93
|
}
|
|
93
94
|
function getScriptSrc(props) {
|
|
94
95
|
if (props.scriptSrc) {
|
|
95
|
-
return props.scriptSrc;
|
|
96
|
+
return makeAbsolute(props.scriptSrc);
|
|
96
97
|
}
|
|
97
98
|
if (isDevelopment()) {
|
|
98
99
|
return "https://va.vercel-scripts.com/v1/speed-insights/script.debug.js";
|
|
@@ -101,42 +102,68 @@ function getScriptSrc(props) {
|
|
|
101
102
|
return "https://va.vercel-scripts.com/v1/speed-insights/script.js";
|
|
102
103
|
}
|
|
103
104
|
if (props.basePath) {
|
|
104
|
-
return `${props.basePath}/speed-insights/script.js
|
|
105
|
+
return makeAbsolute(`${props.basePath}/speed-insights/script.js`);
|
|
105
106
|
}
|
|
106
107
|
return "/_vercel/speed-insights/script.js";
|
|
107
108
|
}
|
|
108
|
-
|
|
109
|
-
// src/generic.ts
|
|
110
|
-
function injectSpeedInsights(props = {}) {
|
|
109
|
+
function loadProps(explicitProps, confString) {
|
|
111
110
|
var _a;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
let props = explicitProps;
|
|
112
|
+
if (confString) {
|
|
113
|
+
try {
|
|
114
|
+
props = {
|
|
115
|
+
...(_a = JSON.parse(confString)) == null ? void 0 : _a.speedInsights,
|
|
116
|
+
...explicitProps
|
|
117
|
+
};
|
|
118
|
+
} catch {
|
|
119
|
+
}
|
|
118
120
|
}
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
script.dataset.sdkv = version;
|
|
121
|
+
const dataset = {
|
|
122
|
+
sdkn: name + (props.framework ? `/${props.framework}` : ""),
|
|
123
|
+
sdkv: version
|
|
124
|
+
};
|
|
124
125
|
if (props.sampleRate) {
|
|
125
|
-
|
|
126
|
+
dataset.sampleRate = props.sampleRate.toString();
|
|
126
127
|
}
|
|
127
128
|
if (props.route) {
|
|
128
|
-
|
|
129
|
+
dataset.route = props.route;
|
|
130
|
+
}
|
|
131
|
+
if (isDevelopment() && props.debug === false) {
|
|
132
|
+
dataset.debug = "false";
|
|
133
|
+
}
|
|
134
|
+
if (props.dsn) {
|
|
135
|
+
dataset.dsn = props.dsn;
|
|
129
136
|
}
|
|
130
137
|
if (props.endpoint) {
|
|
131
|
-
|
|
138
|
+
dataset.endpoint = makeAbsolute(props.endpoint);
|
|
132
139
|
} else if (props.basePath) {
|
|
133
|
-
|
|
140
|
+
dataset.endpoint = makeAbsolute(`${props.basePath}/speed-insights/vitals`);
|
|
134
141
|
}
|
|
135
|
-
|
|
136
|
-
|
|
142
|
+
return {
|
|
143
|
+
src: getScriptSrc(props),
|
|
144
|
+
beforeSend: props.beforeSend,
|
|
145
|
+
dataset
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function makeAbsolute(url) {
|
|
149
|
+
return url.startsWith("http://") || url.startsWith("https://") || url.startsWith("/") ? url : `/${url}`;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/generic.ts
|
|
153
|
+
function injectSpeedInsights(props = {}, confString) {
|
|
154
|
+
var _a;
|
|
155
|
+
if (!isBrowser() || props.route === null) return null;
|
|
156
|
+
initQueue();
|
|
157
|
+
const { beforeSend, src, dataset } = loadProps(props, confString);
|
|
158
|
+
if (document.head.querySelector(`script[src*="${src}"]`)) return null;
|
|
159
|
+
if (beforeSend) {
|
|
160
|
+
(_a = window.si) == null ? void 0 : _a.call(window, "beforeSend", beforeSend);
|
|
137
161
|
}
|
|
138
|
-
|
|
139
|
-
|
|
162
|
+
const script = document.createElement("script");
|
|
163
|
+
script.src = src;
|
|
164
|
+
script.defer = true;
|
|
165
|
+
for (const [key, value] of Object.entries(dataset)) {
|
|
166
|
+
script.dataset[key] = value;
|
|
140
167
|
}
|
|
141
168
|
script.onerror = () => {
|
|
142
169
|
console.log(
|
|
@@ -158,6 +185,12 @@ function getBasePath() {
|
|
|
158
185
|
}
|
|
159
186
|
return process.env.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH;
|
|
160
187
|
}
|
|
188
|
+
function getConfigString() {
|
|
189
|
+
if (typeof process === "undefined" || typeof process.env === "undefined") {
|
|
190
|
+
return void 0;
|
|
191
|
+
}
|
|
192
|
+
return process.env.REACT_APP_VERCEL_OBSERVABILITY_CLIENT_CONFIG;
|
|
193
|
+
}
|
|
161
194
|
|
|
162
195
|
// src/react/index.tsx
|
|
163
196
|
function SpeedInsights(props) {
|
|
@@ -170,15 +203,21 @@ function SpeedInsights(props) {
|
|
|
170
203
|
const setScriptRoute = (0, import_react.useRef)(null);
|
|
171
204
|
(0, import_react.useEffect)(() => {
|
|
172
205
|
if (!setScriptRoute.current) {
|
|
173
|
-
const script = injectSpeedInsights(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
206
|
+
const script = injectSpeedInsights(
|
|
207
|
+
{
|
|
208
|
+
framework: props.framework ?? "react",
|
|
209
|
+
basePath: props.basePath ?? getBasePath(),
|
|
210
|
+
...props
|
|
211
|
+
},
|
|
212
|
+
props.configString ?? getConfigString()
|
|
213
|
+
);
|
|
178
214
|
if (script) {
|
|
179
215
|
setScriptRoute.current = script.setRoute;
|
|
180
216
|
}
|
|
181
|
-
}
|
|
217
|
+
}
|
|
218
|
+
}, [props]);
|
|
219
|
+
(0, import_react.useEffect)(() => {
|
|
220
|
+
if (setScriptRoute.current && props.route) {
|
|
182
221
|
setScriptRoute.current(props.route);
|
|
183
222
|
}
|
|
184
223
|
}, [props.route]);
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.tsx","../../package.json","../../src/queue.ts","../../src/utils.ts","../../src/generic.ts","../../src/react/utils.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { SpeedInsightsProps } from '../types';\nimport { computeRoute, injectSpeedInsights } from '../generic';\nimport { getBasePath } from './utils';\n\nexport function SpeedInsights(\n props: SpeedInsightsProps & {\n framework?: string;\n basePath?: string;\n },\n): JSX.Element | null {\n useEffect(() => {\n if (props.beforeSend) {\n window.si?.('beforeSend', props.beforeSend);\n }\n }, [props.beforeSend]);\n\n const setScriptRoute = useRef<((path: string) => void) | null>(null);\n useEffect(() => {\n if (!setScriptRoute.current) {\n const script = injectSpeedInsights({\n framework: props.framework ?? 'react',\n basePath: props.basePath ?? getBasePath(),\n ...props,\n });\n if (script) {\n setScriptRoute.current = script.setRoute;\n }\n } else if (props.route) {\n setScriptRoute.current(props.route);\n }\n }, [props.route]);\n\n return null;\n}\n\nexport { computeRoute };\n","{\n \"name\": \"@vercel/speed-insights\",\n \"version\": \"1.3.1\",\n \"description\": \"Speed Insights is a tool for measuring web performance and providing suggestions for improvement.\",\n \"keywords\": [\n \"speed-insights\",\n \"vercel\"\n ],\n \"repository\": {\n \"url\": \"github:vercel/speed-insights\",\n \"directory\": \"packages/web\"\n },\n \"license\": \"Apache-2.0\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"browser\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./astro\": {\n \"import\": \"./dist/astro/component.ts\"\n },\n \"./next\": {\n \"browser\": \"./dist/next/index.mjs\",\n \"import\": \"./dist/next/index.mjs\",\n \"require\": \"./dist/next/index.js\"\n },\n \"./nuxt\": {\n \"browser\": \"./dist/nuxt/index.mjs\",\n \"import\": \"./dist/nuxt/index.mjs\",\n \"require\": \"./dist/nuxt/index.js\"\n },\n \"./react\": {\n \"browser\": \"./dist/react/index.mjs\",\n \"import\": \"./dist/react/index.mjs\",\n \"require\": \"./dist/react/index.js\"\n },\n \"./remix\": {\n \"browser\": \"./dist/remix/index.mjs\",\n \"import\": \"./dist/remix/index.mjs\",\n \"require\": \"./dist/remix/index.js\"\n },\n \"./sveltekit\": {\n \"types\": \"./dist/sveltekit/index.d.ts\",\n \"svelte\": \"./dist/sveltekit/index.mjs\"\n },\n \"./vue\": {\n \"browser\": \"./dist/vue/index.mjs\",\n \"import\": \"./dist/vue/index.mjs\",\n \"require\": \"./dist/vue/index.js\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"react\": [\n \"dist/react/index.d.ts\"\n ],\n \"next\": [\n \"dist/next/index.d.ts\"\n ],\n \"nuxt\": [\n \"dist/nuxt/index.d.ts\"\n ],\n \"remix\": [\n \"dist/remix/index.d.ts\"\n ],\n \"sveltekit\": [\n \"dist/sveltekit/index.d.ts\"\n ],\n \"vue\": [\n \"dist/vue/index.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm copy-astro\",\n \"copy-astro\": \"cp -R src/astro dist/\",\n \"dev\": \"pnpm copy-astro && tsup --watch\",\n \"lint\": \"eslint .\",\n \"lint-fix\": \"eslint . --fix\",\n \"test\": \"vitest\",\n \"type-check\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@remix-run/react\": \"^2.14.0\",\n \"@sveltejs/kit\": \"^2.8.1\",\n \"@swc/core\": \"^1.9.2\",\n \"@testing-library/jest-dom\": \"^6.6.3\",\n \"@testing-library/react\": \"^16.0.1\",\n \"@types/node\": \"^22.9.1\",\n \"@types/react\": \"^18.3.12\",\n \"copyfiles\": \"^2.4.1\",\n \"jsdom\": \"^25.0.1\",\n \"next\": \"^14.0.4\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"svelte\": \"^5.2.7\",\n \"tsup\": \"8.3.5\",\n \"vitest\": \"^2.1.5\",\n \"vue\": \"^3.5.13\",\n \"vue-router\": \"^4.4.5\"\n },\n \"peerDependencies\": {\n \"@sveltejs/kit\": \"^1 || ^2\",\n \"next\": \">= 13\",\n \"react\": \"^18 || ^19 || ^19.0.0-rc\",\n \"svelte\": \">= 4\",\n \"vue\": \"^3\",\n \"vue-router\": \"^4\"\n },\n \"peerDependenciesMeta\": {\n \"@sveltejs/kit\": {\n \"optional\": true\n },\n \"next\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n },\n \"svelte\": {\n \"optional\": true\n },\n \"vue\": {\n \"optional\": true\n },\n \"vue-router\": {\n \"optional\": true\n }\n }\n}\n","export const initQueue = (): void => {\n // initialize va until script is loaded\n if (window.si) return;\n\n window.si = function a(...params): void {\n (window.siq = window.siq || []).push(params);\n };\n};\n","import type { SpeedInsightsProps } from './types';\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction detectEnvironment(): 'development' | 'production' {\n try {\n const env = process.env.NODE_ENV;\n if (env === 'development' || env === 'test') {\n return 'development';\n }\n } catch (e) {\n // do nothing, this is okay\n }\n return 'production';\n}\n\nexport function isProduction(): boolean {\n return detectEnvironment() === 'production';\n}\n\nexport function isDevelopment(): boolean {\n return detectEnvironment() === 'development';\n}\n\nexport function computeRoute(\n pathname: string | null,\n pathParams: Record<string, string | string[]> | null,\n): string | null {\n if (!pathname || !pathParams) {\n return pathname;\n }\n\n let result = pathname;\n try {\n const entries = Object.entries(pathParams);\n // simple keys must be handled first\n for (const [key, value] of entries) {\n if (!Array.isArray(value)) {\n const matcher = turnValueToRegExp(value);\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[${key}]`);\n }\n }\n }\n // array values next\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n const matcher = turnValueToRegExp(value.join('/'));\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[...${key}]`);\n }\n }\n }\n return result;\n } catch (e) {\n return pathname;\n }\n}\n\nfunction turnValueToRegExp(value: string): RegExp {\n return new RegExp(`/${escapeRegExp(value)}(?=[/?#]|$)`);\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getScriptSrc(\n props: SpeedInsightsProps & { basePath?: string },\n): string {\n if (props.scriptSrc) {\n return props.scriptSrc;\n }\n if (isDevelopment()) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.debug.js';\n }\n if (props.dsn) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.js';\n }\n if (props.basePath) {\n return `${props.basePath}/speed-insights/script.js`;\n }\n return '/_vercel/speed-insights/script.js';\n}\n","import { name as packageName, version } from '../package.json';\nimport { initQueue } from './queue';\nimport type { SpeedInsightsProps, BeforeSendMiddleware } from './types';\nimport { computeRoute, getScriptSrc, isBrowser, isDevelopment } from './utils';\n\n/**\n * Injects the Vercel Speed Insights script into the page head and starts tracking page views. Read more in our [documentation](https://vercel.com/docs/speed-insights).\n * @param [props] - Speed Insights options.\n * @param [props.debug] - Whether to enable debug logging in development. Defaults to `true`.\n * @param [props.beforeSend] - A middleware function to modify events before they are sent. Should return the event object or `null` to cancel the event.\n * @param [props.sampleRate] - When setting to 0.5, 50% of the events will be sent to Vercel Speed Insights. Defaults to `1`.\n * @param [props.route] - The dynamic route of the page.\n * @param [props.dsn] - The DSN of the project to send events to. Only required when self-hosting.\n */\nfunction injectSpeedInsights(\n props: SpeedInsightsProps & {\n framework?: string;\n basePath?: string;\n } = {},\n): {\n setRoute: (route: string | null) => void;\n} | null {\n // When route is null, it means that pages router is not ready yet. Will resolve soon\n if (!isBrowser() || props.route === null) return null;\n\n initQueue();\n\n const src = getScriptSrc(props);\n\n if (document.head.querySelector(`script[src*=\"${src}\"]`)) return null;\n\n if (props.beforeSend) {\n window.si?.('beforeSend', props.beforeSend);\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n script.dataset.sdkn =\n packageName + (props.framework ? `/${props.framework}` : '');\n script.dataset.sdkv = version;\n\n if (props.sampleRate) {\n script.dataset.sampleRate = props.sampleRate.toString();\n }\n if (props.route) {\n script.dataset.route = props.route;\n }\n if (props.endpoint) {\n script.dataset.endpoint = props.endpoint;\n } else if (props.basePath) {\n script.dataset.endpoint = `${props.basePath}/speed-insights/vitals`;\n }\n if (props.dsn) {\n script.dataset.dsn = props.dsn;\n }\n if (isDevelopment() && props.debug === false) {\n script.dataset.debug = 'false';\n }\n\n script.onerror = (): void => {\n // eslint-disable-next-line no-console -- Logging is okay here\n console.log(\n `[Vercel Speed Insights] Failed to load script from ${src}. Please check if any content blockers are enabled and try again.`,\n );\n };\n\n document.head.appendChild(script);\n\n return {\n setRoute: (route: string | null): void => {\n script.dataset.route = route ?? undefined;\n },\n };\n}\n\nexport { injectSpeedInsights, computeRoute };\nexport type { SpeedInsightsProps, BeforeSendMiddleware };\n\n// eslint-disable-next-line import/no-default-export -- Allow default export\nexport default {\n injectSpeedInsights,\n computeRoute,\n};\n","export function getBasePath(): string | undefined {\n // !! important !!\n // do not access env variables using process.env[varname]\n // some bundles won't replace the value at build time.\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- we can't use optionnal here, it'll break if process does not exist.\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return undefined;\n }\n return process.env.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.tsx","../../src/queue.ts","../../package.json","../../src/utils.ts","../../src/generic.ts","../../src/react/utils.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { computeRoute, injectSpeedInsights } from '../generic';\nimport type { SpeedInsightsProps } from '../types';\nimport { getBasePath, getConfigString } from './utils';\n\nexport function SpeedInsights(\n props: SpeedInsightsProps & {\n framework?: string;\n basePath?: string;\n configString?: string; // Internal only, passed from framework wrappers\n },\n): JSX.Element | null {\n useEffect(() => {\n if (props.beforeSend) {\n window.si?.('beforeSend', props.beforeSend);\n }\n }, [props.beforeSend]);\n\n const setScriptRoute = useRef<((path: string) => void) | null>(null);\n useEffect(() => {\n if (!setScriptRoute.current) {\n const script = injectSpeedInsights(\n {\n framework: props.framework ?? 'react',\n basePath: props.basePath ?? getBasePath(),\n ...props,\n },\n props.configString ?? getConfigString(),\n );\n if (script) {\n setScriptRoute.current = script.setRoute;\n }\n }\n }, [props]);\n useEffect(() => {\n if (setScriptRoute.current && props.route) {\n setScriptRoute.current(props.route);\n }\n }, [props.route]);\n\n return null;\n}\n\nexport { computeRoute };\n","export const initQueue = (): void => {\n // initialize va until script is loaded\n if (window.si) return;\n\n window.si = function a(...params): void {\n window.siq = window.siq || [];\n window.siq.push(params);\n };\n};\n","{\n \"name\": \"@vercel/speed-insights\",\n \"version\": \"2.0.0\",\n \"description\": \"Speed Insights is a tool for measuring web performance and providing suggestions for improvement.\",\n \"keywords\": [\n \"speed-insights\",\n \"vercel\"\n ],\n \"repository\": {\n \"url\": \"github:vercel/speed-insights\",\n \"directory\": \"packages/web\"\n },\n \"license\": \"Apache-2.0\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"browser\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./astro\": {\n \"import\": \"./dist/astro/component.ts\"\n },\n \"./next\": {\n \"browser\": \"./dist/next/index.mjs\",\n \"import\": \"./dist/next/index.mjs\",\n \"require\": \"./dist/next/index.js\"\n },\n \"./nuxt\": {\n \"import\": \"./dist/nuxt/index.mjs\",\n \"require\": \"./dist/nuxt/index.js\"\n },\n \"./nuxt/runtime\": {\n \"browser\": \"./dist/nuxt/runtime/index.mjs\",\n \"import\": \"./dist/nuxt/runtime/index.mjs\",\n \"require\": \"./dist/nuxt/runtime/index.js\"\n },\n \"./react\": {\n \"browser\": \"./dist/react/index.mjs\",\n \"import\": \"./dist/react/index.mjs\",\n \"require\": \"./dist/react/index.js\"\n },\n \"./remix\": {\n \"browser\": \"./dist/remix/index.mjs\",\n \"import\": \"./dist/remix/index.mjs\",\n \"require\": \"./dist/remix/index.js\"\n },\n \"./sveltekit\": {\n \"types\": \"./dist/sveltekit/index.d.ts\",\n \"svelte\": \"./dist/sveltekit/index.mjs\"\n },\n \"./vue\": {\n \"browser\": \"./dist/vue/index.mjs\",\n \"import\": \"./dist/vue/index.mjs\",\n \"require\": \"./dist/vue/index.js\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"react\": [\n \"dist/react/index.d.ts\"\n ],\n \"next\": [\n \"dist/next/index.d.ts\"\n ],\n \"nuxt\": [\n \"dist/nuxt/index.d.ts\"\n ],\n \"nuxt/runtime\": [\n \"dist/nuxt/runtime/index.d.ts\"\n ],\n \"remix\": [\n \"dist/remix/index.d.ts\"\n ],\n \"sveltekit\": [\n \"dist/sveltekit/index.d.ts\"\n ],\n \"vue\": [\n \"dist/vue/index.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm copy-astro\",\n \"copy-astro\": \"cp -R src/astro dist/\",\n \"dev\": \"pnpm copy-astro && tsup --watch\",\n \"test\": \"vitest\"\n },\n \"devDependencies\": {\n \"@nuxt/kit\": \"^4.2.0\",\n \"@nuxt/schema\": \"^4.2.0\",\n \"@remix-run/react\": \"^2.14.0\",\n \"@sveltejs/kit\": \"^2.8.1\",\n \"@swc/core\": \"^1.9.2\",\n \"@testing-library/jest-dom\": \"^6.6.3\",\n \"@testing-library/react\": \"^16.0.1\",\n \"@types/node\": \"^22.9.1\",\n \"@types/react\": \"^18.3.12\",\n \"copyfiles\": \"^2.4.1\",\n \"jsdom\": \"^25.0.1\",\n \"next\": \"^14.0.4\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"svelte\": \"^5.2.7\",\n \"tsup\": \"8.3.5\",\n \"vitest\": \"^2.1.5\",\n \"vue\": \"^3.5.13\",\n \"vue-router\": \"^4.4.5\"\n },\n \"peerDependencies\": {\n \"@sveltejs/kit\": \"^1 || ^2\",\n \"next\": \">= 13\",\n \"nuxt\": \">= 3\",\n \"react\": \"^18 || ^19 || ^19.0.0-rc\",\n \"svelte\": \">= 4\",\n \"vue\": \"^3\",\n \"vue-router\": \"^4\"\n },\n \"peerDependenciesMeta\": {\n \"@sveltejs/kit\": {\n \"optional\": true\n },\n \"next\": {\n \"optional\": true\n },\n \"nuxt\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n },\n \"svelte\": {\n \"optional\": true\n },\n \"vue\": {\n \"optional\": true\n },\n \"vue-router\": {\n \"optional\": true\n }\n }\n}\n","import { name as packageName, version } from '../package.json';\nimport type {\n BeforeSend,\n InjectSpeedInsightsProps,\n SpeedInsightsProps,\n} from './types';\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction detectEnvironment(): 'development' | 'production' {\n try {\n const env = process.env.NODE_ENV;\n if (env === 'development' || env === 'test') {\n return 'development';\n }\n } catch {\n // do nothing, this is okay\n }\n return 'production';\n}\n\nexport function isProduction(): boolean {\n return detectEnvironment() === 'production';\n}\n\nexport function isDevelopment(): boolean {\n return detectEnvironment() === 'development';\n}\n\nexport function computeRoute(\n pathname: string | null,\n pathParams: Record<string, string | string[]> | null,\n): string | null {\n if (!pathname || !pathParams) {\n return pathname;\n }\n\n let result = pathname;\n try {\n const entries = Object.entries(pathParams);\n // simple keys must be handled first\n for (const [key, value] of entries) {\n if (!Array.isArray(value)) {\n const matcher = turnValueToRegExp(value);\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[${key}]`);\n }\n }\n }\n // array values next\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n const matcher = turnValueToRegExp(value.join('/'));\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[...${key}]`);\n }\n }\n }\n return result;\n } catch {\n return pathname;\n }\n}\n\nfunction turnValueToRegExp(value: string): RegExp {\n return new RegExp(`/${escapeRegExp(value)}(?=[/?#]|$)`);\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction getScriptSrc(\n props: SpeedInsightsProps & { basePath?: string },\n): string {\n if (props.scriptSrc) {\n return makeAbsolute(props.scriptSrc);\n }\n if (isDevelopment()) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.debug.js';\n }\n if (props.dsn) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.js';\n }\n if (props.basePath) {\n return makeAbsolute(`${props.basePath}/speed-insights/script.js`);\n }\n return '/_vercel/speed-insights/script.js';\n}\n\nexport function loadProps(\n explicitProps: InjectSpeedInsightsProps,\n confString?: string,\n): {\n src: string;\n beforeSend?: BeforeSend;\n dataset: Record<string, string>;\n} {\n let props = explicitProps;\n if (confString) {\n try {\n props = {\n ...(JSON.parse(confString)\n ?.speedInsights as Partial<SpeedInsightsProps>),\n ...explicitProps,\n };\n } catch {\n // Invalid JSON, use only explicit props\n }\n }\n\n const dataset: Record<string, string> = {\n sdkn: packageName + (props.framework ? `/${props.framework}` : ''),\n sdkv: version,\n };\n\n if (props.sampleRate) {\n dataset.sampleRate = props.sampleRate.toString();\n }\n if (props.route) {\n dataset.route = props.route;\n }\n if (isDevelopment() && props.debug === false) {\n dataset.debug = 'false';\n }\n if (props.dsn) {\n dataset.dsn = props.dsn;\n }\n\n if (props.endpoint) {\n dataset.endpoint = makeAbsolute(props.endpoint);\n } else if (props.basePath) {\n // backward compatibility\n dataset.endpoint = makeAbsolute(`${props.basePath}/speed-insights/vitals`);\n }\n\n return {\n src: getScriptSrc(props),\n beforeSend: props.beforeSend,\n dataset,\n };\n}\n\nfunction makeAbsolute(url: string): string {\n return url.startsWith('http://') ||\n url.startsWith('https://') ||\n url.startsWith('/')\n ? url\n : `/${url}`;\n}\n","import { initQueue } from './queue';\nimport type {\n BeforeSend,\n InjectSpeedInsightsProps,\n SpeedInsightsProps,\n} from './types';\nimport { computeRoute, isBrowser, loadProps } from './utils';\n\n/**\n * Injects the Vercel Speed Insights script into the page head and starts tracking page views. Read more in our [documentation](https://vercel.com/docs/speed-insights).\n * @param [props] - Speed Insights options.\n * @param [props.debug] - Whether to enable debug logging in development. Defaults to `true`.\n * @param [props.beforeSend] - A middleware function to modify events before they are sent. Should return the event object or `null` to cancel the event.\n * @param [props.sampleRate] - When setting to 0.5, 50% of the events will be sent to Vercel Speed Insights. Defaults to `1`.\n * @param [props.route] - The dynamic route of the page.\n * @param [props.dsn] - The DSN of the project to send events to. Only required when self-hosting.\n * @param [confString] - an optional JSON string (InjectSpeedInsightsProps) containing the default configuration. Explicit props will take over any provided default.\n */\nfunction injectSpeedInsights(\n props: InjectSpeedInsightsProps = {},\n confString?: string,\n): {\n setRoute: (route: string | null) => void;\n} | null {\n // When route is null, it means that pages router is not ready yet. Will resolve soon\n if (!isBrowser() || props.route === null) return null;\n\n initQueue();\n\n const { beforeSend, src, dataset } = loadProps(props, confString);\n\n if (document.head.querySelector(`script[src*=\"${src}\"]`)) return null;\n\n if (beforeSend) {\n window.si?.('beforeSend', beforeSend);\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n\n // Apply all dataset attributes from loadProps\n for (const [key, value] of Object.entries(dataset)) {\n script.dataset[key] = value;\n }\n\n script.onerror = (): void => {\n console.log(\n `[Vercel Speed Insights] Failed to load script from ${src}. Please check if any content blockers are enabled and try again.`,\n );\n };\n\n document.head.appendChild(script);\n\n return {\n setRoute: (route: string | null): void => {\n script.dataset.route = route ?? undefined;\n },\n };\n}\n\nexport { injectSpeedInsights, computeRoute };\nexport type { SpeedInsightsProps, BeforeSend as BeforeSendMiddleware };\n\nexport default {\n injectSpeedInsights,\n computeRoute,\n};\n","// !! important !!\n// do not access env variables using process.env[varname]\n// some bundlers won't replace the value at build time.\n\nexport function getBasePath(): string | undefined {\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return undefined;\n }\n return process.env.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH;\n}\n\nexport function getConfigString(): string | undefined {\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return undefined;\n }\n return process.env.REACT_APP_VERCEL_OBSERVABILITY_CLIENT_CONFIG;\n}\n"],"mappings":"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","names":[]}
|
package/dist/react/index.mjs
CHANGED
|
@@ -3,18 +3,19 @@
|
|
|
3
3
|
// src/react/index.tsx
|
|
4
4
|
import { useEffect, useRef } from "react";
|
|
5
5
|
|
|
6
|
-
// package.json
|
|
7
|
-
var name = "@vercel/speed-insights";
|
|
8
|
-
var version = "1.3.1";
|
|
9
|
-
|
|
10
6
|
// src/queue.ts
|
|
11
7
|
var initQueue = () => {
|
|
12
8
|
if (window.si) return;
|
|
13
9
|
window.si = function a(...params) {
|
|
14
|
-
|
|
10
|
+
window.siq = window.siq || [];
|
|
11
|
+
window.siq.push(params);
|
|
15
12
|
};
|
|
16
13
|
};
|
|
17
14
|
|
|
15
|
+
// package.json
|
|
16
|
+
var name = "@vercel/speed-insights";
|
|
17
|
+
var version = "2.0.0";
|
|
18
|
+
|
|
18
19
|
// src/utils.ts
|
|
19
20
|
function isBrowser() {
|
|
20
21
|
return typeof window !== "undefined";
|
|
@@ -25,7 +26,7 @@ function detectEnvironment() {
|
|
|
25
26
|
if (env === "development" || env === "test") {
|
|
26
27
|
return "development";
|
|
27
28
|
}
|
|
28
|
-
} catch
|
|
29
|
+
} catch {
|
|
29
30
|
}
|
|
30
31
|
return "production";
|
|
31
32
|
}
|
|
@@ -56,7 +57,7 @@ function computeRoute(pathname, pathParams) {
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
return result;
|
|
59
|
-
} catch
|
|
60
|
+
} catch {
|
|
60
61
|
return pathname;
|
|
61
62
|
}
|
|
62
63
|
}
|
|
@@ -68,7 +69,7 @@ function escapeRegExp(string) {
|
|
|
68
69
|
}
|
|
69
70
|
function getScriptSrc(props) {
|
|
70
71
|
if (props.scriptSrc) {
|
|
71
|
-
return props.scriptSrc;
|
|
72
|
+
return makeAbsolute(props.scriptSrc);
|
|
72
73
|
}
|
|
73
74
|
if (isDevelopment()) {
|
|
74
75
|
return "https://va.vercel-scripts.com/v1/speed-insights/script.debug.js";
|
|
@@ -77,42 +78,68 @@ function getScriptSrc(props) {
|
|
|
77
78
|
return "https://va.vercel-scripts.com/v1/speed-insights/script.js";
|
|
78
79
|
}
|
|
79
80
|
if (props.basePath) {
|
|
80
|
-
return `${props.basePath}/speed-insights/script.js
|
|
81
|
+
return makeAbsolute(`${props.basePath}/speed-insights/script.js`);
|
|
81
82
|
}
|
|
82
83
|
return "/_vercel/speed-insights/script.js";
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
-
// src/generic.ts
|
|
86
|
-
function injectSpeedInsights(props = {}) {
|
|
85
|
+
function loadProps(explicitProps, confString) {
|
|
87
86
|
var _a;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
87
|
+
let props = explicitProps;
|
|
88
|
+
if (confString) {
|
|
89
|
+
try {
|
|
90
|
+
props = {
|
|
91
|
+
...(_a = JSON.parse(confString)) == null ? void 0 : _a.speedInsights,
|
|
92
|
+
...explicitProps
|
|
93
|
+
};
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
94
96
|
}
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
script.dataset.sdkv = version;
|
|
97
|
+
const dataset = {
|
|
98
|
+
sdkn: name + (props.framework ? `/${props.framework}` : ""),
|
|
99
|
+
sdkv: version
|
|
100
|
+
};
|
|
100
101
|
if (props.sampleRate) {
|
|
101
|
-
|
|
102
|
+
dataset.sampleRate = props.sampleRate.toString();
|
|
102
103
|
}
|
|
103
104
|
if (props.route) {
|
|
104
|
-
|
|
105
|
+
dataset.route = props.route;
|
|
106
|
+
}
|
|
107
|
+
if (isDevelopment() && props.debug === false) {
|
|
108
|
+
dataset.debug = "false";
|
|
109
|
+
}
|
|
110
|
+
if (props.dsn) {
|
|
111
|
+
dataset.dsn = props.dsn;
|
|
105
112
|
}
|
|
106
113
|
if (props.endpoint) {
|
|
107
|
-
|
|
114
|
+
dataset.endpoint = makeAbsolute(props.endpoint);
|
|
108
115
|
} else if (props.basePath) {
|
|
109
|
-
|
|
116
|
+
dataset.endpoint = makeAbsolute(`${props.basePath}/speed-insights/vitals`);
|
|
110
117
|
}
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
return {
|
|
119
|
+
src: getScriptSrc(props),
|
|
120
|
+
beforeSend: props.beforeSend,
|
|
121
|
+
dataset
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function makeAbsolute(url) {
|
|
125
|
+
return url.startsWith("http://") || url.startsWith("https://") || url.startsWith("/") ? url : `/${url}`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/generic.ts
|
|
129
|
+
function injectSpeedInsights(props = {}, confString) {
|
|
130
|
+
var _a;
|
|
131
|
+
if (!isBrowser() || props.route === null) return null;
|
|
132
|
+
initQueue();
|
|
133
|
+
const { beforeSend, src, dataset } = loadProps(props, confString);
|
|
134
|
+
if (document.head.querySelector(`script[src*="${src}"]`)) return null;
|
|
135
|
+
if (beforeSend) {
|
|
136
|
+
(_a = window.si) == null ? void 0 : _a.call(window, "beforeSend", beforeSend);
|
|
113
137
|
}
|
|
114
|
-
|
|
115
|
-
|
|
138
|
+
const script = document.createElement("script");
|
|
139
|
+
script.src = src;
|
|
140
|
+
script.defer = true;
|
|
141
|
+
for (const [key, value] of Object.entries(dataset)) {
|
|
142
|
+
script.dataset[key] = value;
|
|
116
143
|
}
|
|
117
144
|
script.onerror = () => {
|
|
118
145
|
console.log(
|
|
@@ -134,6 +161,12 @@ function getBasePath() {
|
|
|
134
161
|
}
|
|
135
162
|
return process.env.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH;
|
|
136
163
|
}
|
|
164
|
+
function getConfigString() {
|
|
165
|
+
if (typeof process === "undefined" || typeof process.env === "undefined") {
|
|
166
|
+
return void 0;
|
|
167
|
+
}
|
|
168
|
+
return process.env.REACT_APP_VERCEL_OBSERVABILITY_CLIENT_CONFIG;
|
|
169
|
+
}
|
|
137
170
|
|
|
138
171
|
// src/react/index.tsx
|
|
139
172
|
function SpeedInsights(props) {
|
|
@@ -146,15 +179,21 @@ function SpeedInsights(props) {
|
|
|
146
179
|
const setScriptRoute = useRef(null);
|
|
147
180
|
useEffect(() => {
|
|
148
181
|
if (!setScriptRoute.current) {
|
|
149
|
-
const script = injectSpeedInsights(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
182
|
+
const script = injectSpeedInsights(
|
|
183
|
+
{
|
|
184
|
+
framework: props.framework ?? "react",
|
|
185
|
+
basePath: props.basePath ?? getBasePath(),
|
|
186
|
+
...props
|
|
187
|
+
},
|
|
188
|
+
props.configString ?? getConfigString()
|
|
189
|
+
);
|
|
154
190
|
if (script) {
|
|
155
191
|
setScriptRoute.current = script.setRoute;
|
|
156
192
|
}
|
|
157
|
-
}
|
|
193
|
+
}
|
|
194
|
+
}, [props]);
|
|
195
|
+
useEffect(() => {
|
|
196
|
+
if (setScriptRoute.current && props.route) {
|
|
158
197
|
setScriptRoute.current(props.route);
|
|
159
198
|
}
|
|
160
199
|
}, [props.route]);
|
package/dist/react/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.tsx","../../package.json","../../src/queue.ts","../../src/utils.ts","../../src/generic.ts","../../src/react/utils.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { SpeedInsightsProps } from '../types';\nimport { computeRoute, injectSpeedInsights } from '../generic';\nimport { getBasePath } from './utils';\n\nexport function SpeedInsights(\n props: SpeedInsightsProps & {\n framework?: string;\n basePath?: string;\n },\n): JSX.Element | null {\n useEffect(() => {\n if (props.beforeSend) {\n window.si?.('beforeSend', props.beforeSend);\n }\n }, [props.beforeSend]);\n\n const setScriptRoute = useRef<((path: string) => void) | null>(null);\n useEffect(() => {\n if (!setScriptRoute.current) {\n const script = injectSpeedInsights({\n framework: props.framework ?? 'react',\n basePath: props.basePath ?? getBasePath(),\n ...props,\n });\n if (script) {\n setScriptRoute.current = script.setRoute;\n }\n } else if (props.route) {\n setScriptRoute.current(props.route);\n }\n }, [props.route]);\n\n return null;\n}\n\nexport { computeRoute };\n","{\n \"name\": \"@vercel/speed-insights\",\n \"version\": \"1.3.1\",\n \"description\": \"Speed Insights is a tool for measuring web performance and providing suggestions for improvement.\",\n \"keywords\": [\n \"speed-insights\",\n \"vercel\"\n ],\n \"repository\": {\n \"url\": \"github:vercel/speed-insights\",\n \"directory\": \"packages/web\"\n },\n \"license\": \"Apache-2.0\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"browser\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./astro\": {\n \"import\": \"./dist/astro/component.ts\"\n },\n \"./next\": {\n \"browser\": \"./dist/next/index.mjs\",\n \"import\": \"./dist/next/index.mjs\",\n \"require\": \"./dist/next/index.js\"\n },\n \"./nuxt\": {\n \"browser\": \"./dist/nuxt/index.mjs\",\n \"import\": \"./dist/nuxt/index.mjs\",\n \"require\": \"./dist/nuxt/index.js\"\n },\n \"./react\": {\n \"browser\": \"./dist/react/index.mjs\",\n \"import\": \"./dist/react/index.mjs\",\n \"require\": \"./dist/react/index.js\"\n },\n \"./remix\": {\n \"browser\": \"./dist/remix/index.mjs\",\n \"import\": \"./dist/remix/index.mjs\",\n \"require\": \"./dist/remix/index.js\"\n },\n \"./sveltekit\": {\n \"types\": \"./dist/sveltekit/index.d.ts\",\n \"svelte\": \"./dist/sveltekit/index.mjs\"\n },\n \"./vue\": {\n \"browser\": \"./dist/vue/index.mjs\",\n \"import\": \"./dist/vue/index.mjs\",\n \"require\": \"./dist/vue/index.js\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"react\": [\n \"dist/react/index.d.ts\"\n ],\n \"next\": [\n \"dist/next/index.d.ts\"\n ],\n \"nuxt\": [\n \"dist/nuxt/index.d.ts\"\n ],\n \"remix\": [\n \"dist/remix/index.d.ts\"\n ],\n \"sveltekit\": [\n \"dist/sveltekit/index.d.ts\"\n ],\n \"vue\": [\n \"dist/vue/index.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm copy-astro\",\n \"copy-astro\": \"cp -R src/astro dist/\",\n \"dev\": \"pnpm copy-astro && tsup --watch\",\n \"lint\": \"eslint .\",\n \"lint-fix\": \"eslint . --fix\",\n \"test\": \"vitest\",\n \"type-check\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@remix-run/react\": \"^2.14.0\",\n \"@sveltejs/kit\": \"^2.8.1\",\n \"@swc/core\": \"^1.9.2\",\n \"@testing-library/jest-dom\": \"^6.6.3\",\n \"@testing-library/react\": \"^16.0.1\",\n \"@types/node\": \"^22.9.1\",\n \"@types/react\": \"^18.3.12\",\n \"copyfiles\": \"^2.4.1\",\n \"jsdom\": \"^25.0.1\",\n \"next\": \"^14.0.4\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"svelte\": \"^5.2.7\",\n \"tsup\": \"8.3.5\",\n \"vitest\": \"^2.1.5\",\n \"vue\": \"^3.5.13\",\n \"vue-router\": \"^4.4.5\"\n },\n \"peerDependencies\": {\n \"@sveltejs/kit\": \"^1 || ^2\",\n \"next\": \">= 13\",\n \"react\": \"^18 || ^19 || ^19.0.0-rc\",\n \"svelte\": \">= 4\",\n \"vue\": \"^3\",\n \"vue-router\": \"^4\"\n },\n \"peerDependenciesMeta\": {\n \"@sveltejs/kit\": {\n \"optional\": true\n },\n \"next\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n },\n \"svelte\": {\n \"optional\": true\n },\n \"vue\": {\n \"optional\": true\n },\n \"vue-router\": {\n \"optional\": true\n }\n }\n}\n","export const initQueue = (): void => {\n // initialize va until script is loaded\n if (window.si) return;\n\n window.si = function a(...params): void {\n (window.siq = window.siq || []).push(params);\n };\n};\n","import type { SpeedInsightsProps } from './types';\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction detectEnvironment(): 'development' | 'production' {\n try {\n const env = process.env.NODE_ENV;\n if (env === 'development' || env === 'test') {\n return 'development';\n }\n } catch (e) {\n // do nothing, this is okay\n }\n return 'production';\n}\n\nexport function isProduction(): boolean {\n return detectEnvironment() === 'production';\n}\n\nexport function isDevelopment(): boolean {\n return detectEnvironment() === 'development';\n}\n\nexport function computeRoute(\n pathname: string | null,\n pathParams: Record<string, string | string[]> | null,\n): string | null {\n if (!pathname || !pathParams) {\n return pathname;\n }\n\n let result = pathname;\n try {\n const entries = Object.entries(pathParams);\n // simple keys must be handled first\n for (const [key, value] of entries) {\n if (!Array.isArray(value)) {\n const matcher = turnValueToRegExp(value);\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[${key}]`);\n }\n }\n }\n // array values next\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n const matcher = turnValueToRegExp(value.join('/'));\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[...${key}]`);\n }\n }\n }\n return result;\n } catch (e) {\n return pathname;\n }\n}\n\nfunction turnValueToRegExp(value: string): RegExp {\n return new RegExp(`/${escapeRegExp(value)}(?=[/?#]|$)`);\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getScriptSrc(\n props: SpeedInsightsProps & { basePath?: string },\n): string {\n if (props.scriptSrc) {\n return props.scriptSrc;\n }\n if (isDevelopment()) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.debug.js';\n }\n if (props.dsn) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.js';\n }\n if (props.basePath) {\n return `${props.basePath}/speed-insights/script.js`;\n }\n return '/_vercel/speed-insights/script.js';\n}\n","import { name as packageName, version } from '../package.json';\nimport { initQueue } from './queue';\nimport type { SpeedInsightsProps, BeforeSendMiddleware } from './types';\nimport { computeRoute, getScriptSrc, isBrowser, isDevelopment } from './utils';\n\n/**\n * Injects the Vercel Speed Insights script into the page head and starts tracking page views. Read more in our [documentation](https://vercel.com/docs/speed-insights).\n * @param [props] - Speed Insights options.\n * @param [props.debug] - Whether to enable debug logging in development. Defaults to `true`.\n * @param [props.beforeSend] - A middleware function to modify events before they are sent. Should return the event object or `null` to cancel the event.\n * @param [props.sampleRate] - When setting to 0.5, 50% of the events will be sent to Vercel Speed Insights. Defaults to `1`.\n * @param [props.route] - The dynamic route of the page.\n * @param [props.dsn] - The DSN of the project to send events to. Only required when self-hosting.\n */\nfunction injectSpeedInsights(\n props: SpeedInsightsProps & {\n framework?: string;\n basePath?: string;\n } = {},\n): {\n setRoute: (route: string | null) => void;\n} | null {\n // When route is null, it means that pages router is not ready yet. Will resolve soon\n if (!isBrowser() || props.route === null) return null;\n\n initQueue();\n\n const src = getScriptSrc(props);\n\n if (document.head.querySelector(`script[src*=\"${src}\"]`)) return null;\n\n if (props.beforeSend) {\n window.si?.('beforeSend', props.beforeSend);\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n script.dataset.sdkn =\n packageName + (props.framework ? `/${props.framework}` : '');\n script.dataset.sdkv = version;\n\n if (props.sampleRate) {\n script.dataset.sampleRate = props.sampleRate.toString();\n }\n if (props.route) {\n script.dataset.route = props.route;\n }\n if (props.endpoint) {\n script.dataset.endpoint = props.endpoint;\n } else if (props.basePath) {\n script.dataset.endpoint = `${props.basePath}/speed-insights/vitals`;\n }\n if (props.dsn) {\n script.dataset.dsn = props.dsn;\n }\n if (isDevelopment() && props.debug === false) {\n script.dataset.debug = 'false';\n }\n\n script.onerror = (): void => {\n // eslint-disable-next-line no-console -- Logging is okay here\n console.log(\n `[Vercel Speed Insights] Failed to load script from ${src}. Please check if any content blockers are enabled and try again.`,\n );\n };\n\n document.head.appendChild(script);\n\n return {\n setRoute: (route: string | null): void => {\n script.dataset.route = route ?? undefined;\n },\n };\n}\n\nexport { injectSpeedInsights, computeRoute };\nexport type { SpeedInsightsProps, BeforeSendMiddleware };\n\n// eslint-disable-next-line import/no-default-export -- Allow default export\nexport default {\n injectSpeedInsights,\n computeRoute,\n};\n","export function getBasePath(): string | undefined {\n // !! important !!\n // do not access env variables using process.env[varname]\n // some bundles won't replace the value at build time.\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- we can't use optionnal here, it'll break if process does not exist.\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return undefined;\n }\n return process.env.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.tsx","../../src/queue.ts","../../package.json","../../src/utils.ts","../../src/generic.ts","../../src/react/utils.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { computeRoute, injectSpeedInsights } from '../generic';\nimport type { SpeedInsightsProps } from '../types';\nimport { getBasePath, getConfigString } from './utils';\n\nexport function SpeedInsights(\n props: SpeedInsightsProps & {\n framework?: string;\n basePath?: string;\n configString?: string; // Internal only, passed from framework wrappers\n },\n): JSX.Element | null {\n useEffect(() => {\n if (props.beforeSend) {\n window.si?.('beforeSend', props.beforeSend);\n }\n }, [props.beforeSend]);\n\n const setScriptRoute = useRef<((path: string) => void) | null>(null);\n useEffect(() => {\n if (!setScriptRoute.current) {\n const script = injectSpeedInsights(\n {\n framework: props.framework ?? 'react',\n basePath: props.basePath ?? getBasePath(),\n ...props,\n },\n props.configString ?? getConfigString(),\n );\n if (script) {\n setScriptRoute.current = script.setRoute;\n }\n }\n }, [props]);\n useEffect(() => {\n if (setScriptRoute.current && props.route) {\n setScriptRoute.current(props.route);\n }\n }, [props.route]);\n\n return null;\n}\n\nexport { computeRoute };\n","export const initQueue = (): void => {\n // initialize va until script is loaded\n if (window.si) return;\n\n window.si = function a(...params): void {\n window.siq = window.siq || [];\n window.siq.push(params);\n };\n};\n","{\n \"name\": \"@vercel/speed-insights\",\n \"version\": \"2.0.0\",\n \"description\": \"Speed Insights is a tool for measuring web performance and providing suggestions for improvement.\",\n \"keywords\": [\n \"speed-insights\",\n \"vercel\"\n ],\n \"repository\": {\n \"url\": \"github:vercel/speed-insights\",\n \"directory\": \"packages/web\"\n },\n \"license\": \"Apache-2.0\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"browser\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./astro\": {\n \"import\": \"./dist/astro/component.ts\"\n },\n \"./next\": {\n \"browser\": \"./dist/next/index.mjs\",\n \"import\": \"./dist/next/index.mjs\",\n \"require\": \"./dist/next/index.js\"\n },\n \"./nuxt\": {\n \"import\": \"./dist/nuxt/index.mjs\",\n \"require\": \"./dist/nuxt/index.js\"\n },\n \"./nuxt/runtime\": {\n \"browser\": \"./dist/nuxt/runtime/index.mjs\",\n \"import\": \"./dist/nuxt/runtime/index.mjs\",\n \"require\": \"./dist/nuxt/runtime/index.js\"\n },\n \"./react\": {\n \"browser\": \"./dist/react/index.mjs\",\n \"import\": \"./dist/react/index.mjs\",\n \"require\": \"./dist/react/index.js\"\n },\n \"./remix\": {\n \"browser\": \"./dist/remix/index.mjs\",\n \"import\": \"./dist/remix/index.mjs\",\n \"require\": \"./dist/remix/index.js\"\n },\n \"./sveltekit\": {\n \"types\": \"./dist/sveltekit/index.d.ts\",\n \"svelte\": \"./dist/sveltekit/index.mjs\"\n },\n \"./vue\": {\n \"browser\": \"./dist/vue/index.mjs\",\n \"import\": \"./dist/vue/index.mjs\",\n \"require\": \"./dist/vue/index.js\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"react\": [\n \"dist/react/index.d.ts\"\n ],\n \"next\": [\n \"dist/next/index.d.ts\"\n ],\n \"nuxt\": [\n \"dist/nuxt/index.d.ts\"\n ],\n \"nuxt/runtime\": [\n \"dist/nuxt/runtime/index.d.ts\"\n ],\n \"remix\": [\n \"dist/remix/index.d.ts\"\n ],\n \"sveltekit\": [\n \"dist/sveltekit/index.d.ts\"\n ],\n \"vue\": [\n \"dist/vue/index.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm copy-astro\",\n \"copy-astro\": \"cp -R src/astro dist/\",\n \"dev\": \"pnpm copy-astro && tsup --watch\",\n \"test\": \"vitest\"\n },\n \"devDependencies\": {\n \"@nuxt/kit\": \"^4.2.0\",\n \"@nuxt/schema\": \"^4.2.0\",\n \"@remix-run/react\": \"^2.14.0\",\n \"@sveltejs/kit\": \"^2.8.1\",\n \"@swc/core\": \"^1.9.2\",\n \"@testing-library/jest-dom\": \"^6.6.3\",\n \"@testing-library/react\": \"^16.0.1\",\n \"@types/node\": \"^22.9.1\",\n \"@types/react\": \"^18.3.12\",\n \"copyfiles\": \"^2.4.1\",\n \"jsdom\": \"^25.0.1\",\n \"next\": \"^14.0.4\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"svelte\": \"^5.2.7\",\n \"tsup\": \"8.3.5\",\n \"vitest\": \"^2.1.5\",\n \"vue\": \"^3.5.13\",\n \"vue-router\": \"^4.4.5\"\n },\n \"peerDependencies\": {\n \"@sveltejs/kit\": \"^1 || ^2\",\n \"next\": \">= 13\",\n \"nuxt\": \">= 3\",\n \"react\": \"^18 || ^19 || ^19.0.0-rc\",\n \"svelte\": \">= 4\",\n \"vue\": \"^3\",\n \"vue-router\": \"^4\"\n },\n \"peerDependenciesMeta\": {\n \"@sveltejs/kit\": {\n \"optional\": true\n },\n \"next\": {\n \"optional\": true\n },\n \"nuxt\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n },\n \"svelte\": {\n \"optional\": true\n },\n \"vue\": {\n \"optional\": true\n },\n \"vue-router\": {\n \"optional\": true\n }\n }\n}\n","import { name as packageName, version } from '../package.json';\nimport type {\n BeforeSend,\n InjectSpeedInsightsProps,\n SpeedInsightsProps,\n} from './types';\n\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction detectEnvironment(): 'development' | 'production' {\n try {\n const env = process.env.NODE_ENV;\n if (env === 'development' || env === 'test') {\n return 'development';\n }\n } catch {\n // do nothing, this is okay\n }\n return 'production';\n}\n\nexport function isProduction(): boolean {\n return detectEnvironment() === 'production';\n}\n\nexport function isDevelopment(): boolean {\n return detectEnvironment() === 'development';\n}\n\nexport function computeRoute(\n pathname: string | null,\n pathParams: Record<string, string | string[]> | null,\n): string | null {\n if (!pathname || !pathParams) {\n return pathname;\n }\n\n let result = pathname;\n try {\n const entries = Object.entries(pathParams);\n // simple keys must be handled first\n for (const [key, value] of entries) {\n if (!Array.isArray(value)) {\n const matcher = turnValueToRegExp(value);\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[${key}]`);\n }\n }\n }\n // array values next\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n const matcher = turnValueToRegExp(value.join('/'));\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[...${key}]`);\n }\n }\n }\n return result;\n } catch {\n return pathname;\n }\n}\n\nfunction turnValueToRegExp(value: string): RegExp {\n return new RegExp(`/${escapeRegExp(value)}(?=[/?#]|$)`);\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction getScriptSrc(\n props: SpeedInsightsProps & { basePath?: string },\n): string {\n if (props.scriptSrc) {\n return makeAbsolute(props.scriptSrc);\n }\n if (isDevelopment()) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.debug.js';\n }\n if (props.dsn) {\n return 'https://va.vercel-scripts.com/v1/speed-insights/script.js';\n }\n if (props.basePath) {\n return makeAbsolute(`${props.basePath}/speed-insights/script.js`);\n }\n return '/_vercel/speed-insights/script.js';\n}\n\nexport function loadProps(\n explicitProps: InjectSpeedInsightsProps,\n confString?: string,\n): {\n src: string;\n beforeSend?: BeforeSend;\n dataset: Record<string, string>;\n} {\n let props = explicitProps;\n if (confString) {\n try {\n props = {\n ...(JSON.parse(confString)\n ?.speedInsights as Partial<SpeedInsightsProps>),\n ...explicitProps,\n };\n } catch {\n // Invalid JSON, use only explicit props\n }\n }\n\n const dataset: Record<string, string> = {\n sdkn: packageName + (props.framework ? `/${props.framework}` : ''),\n sdkv: version,\n };\n\n if (props.sampleRate) {\n dataset.sampleRate = props.sampleRate.toString();\n }\n if (props.route) {\n dataset.route = props.route;\n }\n if (isDevelopment() && props.debug === false) {\n dataset.debug = 'false';\n }\n if (props.dsn) {\n dataset.dsn = props.dsn;\n }\n\n if (props.endpoint) {\n dataset.endpoint = makeAbsolute(props.endpoint);\n } else if (props.basePath) {\n // backward compatibility\n dataset.endpoint = makeAbsolute(`${props.basePath}/speed-insights/vitals`);\n }\n\n return {\n src: getScriptSrc(props),\n beforeSend: props.beforeSend,\n dataset,\n };\n}\n\nfunction makeAbsolute(url: string): string {\n return url.startsWith('http://') ||\n url.startsWith('https://') ||\n url.startsWith('/')\n ? url\n : `/${url}`;\n}\n","import { initQueue } from './queue';\nimport type {\n BeforeSend,\n InjectSpeedInsightsProps,\n SpeedInsightsProps,\n} from './types';\nimport { computeRoute, isBrowser, loadProps } from './utils';\n\n/**\n * Injects the Vercel Speed Insights script into the page head and starts tracking page views. Read more in our [documentation](https://vercel.com/docs/speed-insights).\n * @param [props] - Speed Insights options.\n * @param [props.debug] - Whether to enable debug logging in development. Defaults to `true`.\n * @param [props.beforeSend] - A middleware function to modify events before they are sent. Should return the event object or `null` to cancel the event.\n * @param [props.sampleRate] - When setting to 0.5, 50% of the events will be sent to Vercel Speed Insights. Defaults to `1`.\n * @param [props.route] - The dynamic route of the page.\n * @param [props.dsn] - The DSN of the project to send events to. Only required when self-hosting.\n * @param [confString] - an optional JSON string (InjectSpeedInsightsProps) containing the default configuration. Explicit props will take over any provided default.\n */\nfunction injectSpeedInsights(\n props: InjectSpeedInsightsProps = {},\n confString?: string,\n): {\n setRoute: (route: string | null) => void;\n} | null {\n // When route is null, it means that pages router is not ready yet. Will resolve soon\n if (!isBrowser() || props.route === null) return null;\n\n initQueue();\n\n const { beforeSend, src, dataset } = loadProps(props, confString);\n\n if (document.head.querySelector(`script[src*=\"${src}\"]`)) return null;\n\n if (beforeSend) {\n window.si?.('beforeSend', beforeSend);\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n\n // Apply all dataset attributes from loadProps\n for (const [key, value] of Object.entries(dataset)) {\n script.dataset[key] = value;\n }\n\n script.onerror = (): void => {\n console.log(\n `[Vercel Speed Insights] Failed to load script from ${src}. Please check if any content blockers are enabled and try again.`,\n );\n };\n\n document.head.appendChild(script);\n\n return {\n setRoute: (route: string | null): void => {\n script.dataset.route = route ?? undefined;\n },\n };\n}\n\nexport { injectSpeedInsights, computeRoute };\nexport type { SpeedInsightsProps, BeforeSend as BeforeSendMiddleware };\n\nexport default {\n injectSpeedInsights,\n computeRoute,\n};\n","// !! important !!\n// do not access env variables using process.env[varname]\n// some bundlers won't replace the value at build time.\n\nexport function getBasePath(): string | undefined {\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return undefined;\n }\n return process.env.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH;\n}\n\nexport function getConfigString(): string | undefined {\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return undefined;\n }\n return process.env.REACT_APP_VERCEL_OBSERVABILITY_CLIENT_CONFIG;\n}\n"],"mappings":"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","names":[]}
|
package/dist/remix/index.d.mts
CHANGED
|
@@ -2,20 +2,20 @@ interface SpeedInsightsProps {
|
|
|
2
2
|
dsn?: string;
|
|
3
3
|
sampleRate?: number;
|
|
4
4
|
route?: string | null;
|
|
5
|
-
beforeSend?:
|
|
5
|
+
beforeSend?: BeforeSend;
|
|
6
6
|
debug?: boolean;
|
|
7
7
|
scriptSrc?: string;
|
|
8
8
|
endpoint?: string;
|
|
9
9
|
}
|
|
10
10
|
type EventTypes = 'vital';
|
|
11
|
-
interface
|
|
11
|
+
interface BeforeSendEvent {
|
|
12
12
|
type: EventTypes;
|
|
13
13
|
url: string;
|
|
14
14
|
route?: string;
|
|
15
15
|
}
|
|
16
|
-
type
|
|
16
|
+
type BeforeSend = (event: BeforeSendEvent) => BeforeSendEvent | null | undefined | false;
|
|
17
17
|
interface Functions {
|
|
18
|
-
beforeSend?:
|
|
18
|
+
beforeSend?: BeforeSend;
|
|
19
19
|
}
|
|
20
20
|
interface SpeedInsights$1<T extends keyof Functions = keyof Functions> {
|
|
21
21
|
queue: [T, Functions[T]][];
|
|
@@ -29,7 +29,7 @@ declare global {
|
|
|
29
29
|
siq?: SpeedInsights$1['queue'];
|
|
30
30
|
sil?: boolean;
|
|
31
31
|
/** used by Astro component only */
|
|
32
|
-
speedInsightsBeforeSend?:
|
|
32
|
+
speedInsightsBeforeSend?: BeforeSend;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
package/dist/remix/index.d.ts
CHANGED
|
@@ -2,20 +2,20 @@ interface SpeedInsightsProps {
|
|
|
2
2
|
dsn?: string;
|
|
3
3
|
sampleRate?: number;
|
|
4
4
|
route?: string | null;
|
|
5
|
-
beforeSend?:
|
|
5
|
+
beforeSend?: BeforeSend;
|
|
6
6
|
debug?: boolean;
|
|
7
7
|
scriptSrc?: string;
|
|
8
8
|
endpoint?: string;
|
|
9
9
|
}
|
|
10
10
|
type EventTypes = 'vital';
|
|
11
|
-
interface
|
|
11
|
+
interface BeforeSendEvent {
|
|
12
12
|
type: EventTypes;
|
|
13
13
|
url: string;
|
|
14
14
|
route?: string;
|
|
15
15
|
}
|
|
16
|
-
type
|
|
16
|
+
type BeforeSend = (event: BeforeSendEvent) => BeforeSendEvent | null | undefined | false;
|
|
17
17
|
interface Functions {
|
|
18
|
-
beforeSend?:
|
|
18
|
+
beforeSend?: BeforeSend;
|
|
19
19
|
}
|
|
20
20
|
interface SpeedInsights$1<T extends keyof Functions = keyof Functions> {
|
|
21
21
|
queue: [T, Functions[T]][];
|
|
@@ -29,7 +29,7 @@ declare global {
|
|
|
29
29
|
siq?: SpeedInsights$1['queue'];
|
|
30
30
|
sil?: boolean;
|
|
31
31
|
/** used by Astro component only */
|
|
32
|
-
speedInsightsBeforeSend?:
|
|
32
|
+
speedInsightsBeforeSend?: BeforeSend;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|