@xeonr/telemetry-web 0.0.0-stage → 0.1.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.
Files changed (50) hide show
  1. package/README.md +168 -2
  2. package/dist/classify.d.ts +48 -0
  3. package/dist/classify.d.ts.map +1 -0
  4. package/dist/classify.js +117 -0
  5. package/dist/classify.js.map +1 -0
  6. package/dist/client.d.ts +135 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +511 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/connect.d.ts +11 -0
  11. package/dist/connect.d.ts.map +1 -0
  12. package/dist/connect.js +44 -0
  13. package/dist/connect.js.map +1 -0
  14. package/dist/env.d.ts +68 -0
  15. package/dist/env.d.ts.map +1 -0
  16. package/dist/env.js +97 -0
  17. package/dist/env.js.map +1 -0
  18. package/dist/index.d.ts +34 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +89 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/otlp.d.ts +124 -0
  23. package/dist/otlp.d.ts.map +1 -0
  24. package/dist/otlp.js +105 -0
  25. package/dist/otlp.js.map +1 -0
  26. package/dist/queue.d.ts +92 -0
  27. package/dist/queue.d.ts.map +1 -0
  28. package/dist/queue.js +355 -0
  29. package/dist/queue.js.map +1 -0
  30. package/dist/react.d.ts +34 -0
  31. package/dist/react.d.ts.map +1 -0
  32. package/dist/react.js +46 -0
  33. package/dist/react.js.map +1 -0
  34. package/dist/stack.d.ts +23 -0
  35. package/dist/stack.d.ts.map +1 -0
  36. package/dist/stack.js +52 -0
  37. package/dist/stack.js.map +1 -0
  38. package/dist/trace.d.ts +10 -0
  39. package/dist/trace.d.ts.map +1 -0
  40. package/dist/trace.js +46 -0
  41. package/dist/trace.js.map +1 -0
  42. package/dist/vitals.d.ts +20 -0
  43. package/dist/vitals.d.ts.map +1 -0
  44. package/dist/vitals.js +151 -0
  45. package/dist/vitals.js.map +1 -0
  46. package/dist/vite.d.ts +41 -0
  47. package/dist/vite.d.ts.map +1 -0
  48. package/dist/vite.js +171 -0
  49. package/dist/vite.js.map +1 -0
  50. package/package.json +59 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitals.d.ts","sourceRoot":"","sources":["../src/vitals.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAC/D,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM,CAAC;AAU3D,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAgBrF,oGAAoG;AACpG,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKzF;AAED,4GAA4G;AAC5G,wBAAgB,OAAO,CAAC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,MAAM,CAiBxG;AAED,MAAM,WAAW,MAAM;IACrB,kFAAkF;IAClF,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAyFrE"}
package/dist/vitals.js ADDED
@@ -0,0 +1,151 @@
1
+ // Core Web Vitals by hand, from PerformanceObserver — the `web-vitals`
2
+ // package is small, but this is smaller, and the five metrics are a page of
3
+ // arithmetic. The definitions follow web.dev's: LCP stops at the first input,
4
+ // CLS is the largest 1 s-gap / 5 s-cap session window of unexpected shifts,
5
+ // INP is the ~98th percentile interaction (one worst interaction per 50).
6
+ // LCP, CLS and INP are final only when the page is hidden, so they are
7
+ // reported from `finalize()`, which the client calls on the way out.
8
+ const THRESHOLDS = {
9
+ LCP: [2500, 4000],
10
+ INP: [200, 500],
11
+ CLS: [0.1, 0.25],
12
+ FCP: [1800, 3000],
13
+ TTFB: [800, 1800],
14
+ };
15
+ export function rate(name, value) {
16
+ const [good, poor] = THRESHOLDS[name];
17
+ return value <= good ? "good" : value <= poor ? "needs-improvement" : "poor";
18
+ }
19
+ /** INP's ordinal: the worst interaction, or for every 50 interactions one further down the list. */
20
+ export function inpFrom(durations, interactionCount) {
21
+ if (durations.length === 0)
22
+ return undefined;
23
+ const sorted = [...durations].sort((a, b) => b - a);
24
+ const idx = Math.min(sorted.length - 1, Math.floor(interactionCount / 50));
25
+ return sorted[idx];
26
+ }
27
+ /** CLS: the largest session window of shifts (gap < 1 s, span < 5 s), ignoring shifts right after input. */
28
+ export function clsFrom(entries) {
29
+ let max = 0;
30
+ let cur = 0;
31
+ let first = 0;
32
+ let last = 0;
33
+ for (const e of entries) {
34
+ if (e.hadRecentInput)
35
+ continue;
36
+ if (cur > 0 && e.startTime - last < 1000 && e.startTime - first < 5000) {
37
+ cur += e.value;
38
+ }
39
+ else {
40
+ cur = e.value;
41
+ first = e.startTime;
42
+ }
43
+ last = e.startTime;
44
+ if (cur > max)
45
+ max = cur;
46
+ }
47
+ return max;
48
+ }
49
+ export function observeVitals(env, report) {
50
+ const PO = env.PerformanceObserver;
51
+ const perf = env.performance;
52
+ const observers = [];
53
+ const reported = new Set();
54
+ const once = (name, value) => {
55
+ if (reported.has(name) || !Number.isFinite(value) || value < 0)
56
+ return;
57
+ reported.add(name);
58
+ report(name, value, rate(name, value));
59
+ };
60
+ let activationStart = 0;
61
+ try {
62
+ const nav = perf?.getEntriesByType?.("navigation")[0];
63
+ activationStart = nav?.activationStart ?? 0;
64
+ if (nav && nav.responseStart > 0)
65
+ once("TTFB", Math.max(0, nav.responseStart - activationStart));
66
+ }
67
+ catch {
68
+ /* no navigation timing */
69
+ }
70
+ const observe = (type, cb, extra = {}) => {
71
+ if (!PO)
72
+ return;
73
+ try {
74
+ if (PO.supportedEntryTypes && !PO.supportedEntryTypes.includes(type))
75
+ return;
76
+ const o = new PO((l) => {
77
+ try {
78
+ cb(l.getEntries());
79
+ }
80
+ catch {
81
+ /* never into the host */
82
+ }
83
+ });
84
+ o.observe({ type, buffered: true, ...extra });
85
+ observers.push(o);
86
+ }
87
+ catch {
88
+ /* unsupported */
89
+ }
90
+ };
91
+ observe("paint", (es) => {
92
+ for (const e of es)
93
+ if (e.name === "first-contentful-paint")
94
+ once("FCP", Math.max(0, e.startTime - activationStart));
95
+ });
96
+ let lcp;
97
+ let lcpStopped = false;
98
+ observe("largest-contentful-paint", (es) => {
99
+ if (lcpStopped)
100
+ return;
101
+ const e = es[es.length - 1];
102
+ if (e)
103
+ lcp = Math.max(0, (e.renderTime || e.loadTime || e.startTime) - activationStart);
104
+ });
105
+ // LCP stops at the first input: anything painted after it is a response to the person.
106
+ const stopLcp = () => {
107
+ lcpStopped = true;
108
+ };
109
+ for (const t of ["keydown", "pointerdown"])
110
+ env.window?.addEventListener(t, stopLcp, { once: true, capture: true });
111
+ const shifts = [];
112
+ observe("layout-shift", (es) => {
113
+ for (const e of es)
114
+ shifts.push({ startTime: e.startTime, value: e.value, hadRecentInput: e.hadRecentInput });
115
+ });
116
+ const worst = new Map();
117
+ const onEvents = (es) => {
118
+ for (const e of es) {
119
+ if (!e.interactionId)
120
+ continue;
121
+ const prev = worst.get(e.interactionId) ?? 0;
122
+ if (e.duration > prev)
123
+ worst.set(e.interactionId, e.duration);
124
+ }
125
+ };
126
+ observe("event", onEvents, { durationThreshold: 40 });
127
+ observe("first-input", onEvents);
128
+ return {
129
+ finalize() {
130
+ if (lcp !== undefined)
131
+ once("LCP", lcp);
132
+ if (shifts.length > 0 || PO?.supportedEntryTypes?.includes("layout-shift"))
133
+ once("CLS", clsFrom(shifts));
134
+ const count = perf?.interactionCount ?? worst.size;
135
+ const inp = inpFrom([...worst.values()], count);
136
+ if (inp !== undefined)
137
+ once("INP", inp);
138
+ },
139
+ stop() {
140
+ for (const o of observers) {
141
+ try {
142
+ o.disconnect();
143
+ }
144
+ catch {
145
+ /* ignore */
146
+ }
147
+ }
148
+ },
149
+ };
150
+ }
151
+ //# sourceMappingURL=vitals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitals.js","sourceRoot":"","sources":["../src/vitals.ts"],"names":[],"mappings":"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"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import type { Plugin } from "vite";
2
+ export declare const DEFAULT_INGEST = "https://telemetry.xeonr.io";
3
+ export interface LanternTelemetryOptions {
4
+ /** The client project's service name, `<product>-ui`. */
5
+ service: string;
6
+ /** The release. Default env VERSION, else VITE_APP_VERSION, else "dev". */
7
+ release?: string | undefined;
8
+ /** The ingest. Default env LANTERN_INGEST_URL, else https://telemetry.xeonr.io. */
9
+ endpoint?: string | undefined;
10
+ /** Upload maps when credentials are present. Default true. */
11
+ upload?: boolean | undefined;
12
+ /** Delete .map files from the output after uploading. Default true. */
13
+ deleteSourceMaps?: boolean | undefined;
14
+ /** Parallel uploads. Default 4. */
15
+ concurrency?: number | undefined;
16
+ /** For tests: the environment and fetch to use. */
17
+ env?: Record<string, string | undefined> | undefined;
18
+ fetch?: typeof fetch | undefined;
19
+ logger?: {
20
+ info(msg: string): void;
21
+ warn(msg: string): void;
22
+ } | undefined;
23
+ }
24
+ /** The release a build carries: VERSION, else VITE_APP_VERSION, else "dev". */
25
+ export declare function releaseFrom(env: Record<string, string | undefined>): string;
26
+ /** How CI authenticates to the ingest: a GitLab job token, else a RELEASE key. */
27
+ export declare function authHeaders(env: Record<string, string | undefined>): Record<string, string> | undefined;
28
+ /** Every *.map under dir, as paths relative to it with forward slashes, sorted. */
29
+ export declare function findSourceMaps(dir: string): Promise<string[]>;
30
+ /** The asset a map belongs to: `assets/index-3f9a.js.map` → `assets/index-3f9a.js`. */
31
+ export declare function assetPathOf(mapPath: string): string;
32
+ export interface UploadResult {
33
+ registered: boolean;
34
+ uploaded: number;
35
+ failed: string[];
36
+ deleted: number;
37
+ }
38
+ /** The closeBundle work, callable on its own (and from the tests). Never throws. */
39
+ export declare function uploadSourceMaps(outDir: string, o: LanternTelemetryOptions): Promise<UploadResult>;
40
+ export declare function lanternTelemetry(opts: LanternTelemetryOptions): Plugin;
41
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,eAAO,MAAM,cAAc,+BAA+B,CAAC;AAE3D,MAAM,WAAW,uBAAuB;IACtC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACrD,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3E;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAE3E;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAIvG;AAED,mFAAmF;AACnF,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnE;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oFAAoF;AACpF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkExG;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CA+BtE"}
package/dist/vite.js ADDED
@@ -0,0 +1,171 @@
1
+ // @xeonr/telemetry-web/vite — releases and source maps, at build time.
2
+ //
3
+ // import { lanternTelemetry } from "@xeonr/telemetry-web/vite";
4
+ // export default defineConfig({ plugins: [react(), lanternTelemetry({ service: "functions-ui" })] });
5
+ //
6
+ // 1. index.html gets <meta name="lantern-service"> and <meta name="lantern-release">,
7
+ // which the browser SDK reads, so the release on every record is the one
8
+ // that was built — VERSION (the k8s pipeline's build arg), else
9
+ // VITE_APP_VERSION, else "dev".
10
+ // 2. build.sourcemap is forced to "hidden": maps are written, but no bundle
11
+ // points at them.
12
+ // 3. After the bundle is written, with CI_JOB_TOKEN (or LANTERN_RELEASE_KEY)
13
+ // set, the release is registered and every dist/**/*.map uploaded to
14
+ // Lantern, keyed by the .js path it belongs to. A failed upload warns; it
15
+ // never fails the build.
16
+ // 4. The .map files are deleted from dist, so they are never served.
17
+ //
18
+ // Node only — this entry imports node:fs and must never reach a browser bundle.
19
+ import { promises as fs } from "node:fs";
20
+ import path from "node:path";
21
+ import { gzipSync } from "node:zlib";
22
+ export const DEFAULT_INGEST = "https://telemetry.xeonr.io";
23
+ /** The release a build carries: VERSION, else VITE_APP_VERSION, else "dev". */
24
+ export function releaseFrom(env) {
25
+ return env.VERSION || env.VITE_APP_VERSION || "dev";
26
+ }
27
+ /** How CI authenticates to the ingest: a GitLab job token, else a RELEASE key. */
28
+ export function authHeaders(env) {
29
+ if (env.CI_JOB_TOKEN)
30
+ return { "JOB-TOKEN": env.CI_JOB_TOKEN };
31
+ if (env.LANTERN_RELEASE_KEY)
32
+ return { authorization: `Bearer ${env.LANTERN_RELEASE_KEY}` };
33
+ return undefined;
34
+ }
35
+ /** Every *.map under dir, as paths relative to it with forward slashes, sorted. */
36
+ export async function findSourceMaps(dir) {
37
+ const out = [];
38
+ async function walk(rel) {
39
+ let entries;
40
+ try {
41
+ entries = await fs.readdir(path.join(dir, rel), { withFileTypes: true });
42
+ }
43
+ catch {
44
+ return;
45
+ }
46
+ for (const e of entries) {
47
+ const r = rel ? `${rel}/${e.name}` : e.name;
48
+ if (e.isDirectory())
49
+ await walk(r);
50
+ else if (e.isFile() && e.name.endsWith(".map"))
51
+ out.push(r);
52
+ }
53
+ }
54
+ await walk("");
55
+ return out.sort();
56
+ }
57
+ /** The asset a map belongs to: `assets/index-3f9a.js.map` → `assets/index-3f9a.js`. */
58
+ export function assetPathOf(mapPath) {
59
+ return mapPath.replace(/\.map$/, "");
60
+ }
61
+ /** The closeBundle work, callable on its own (and from the tests). Never throws. */
62
+ export async function uploadSourceMaps(outDir, o) {
63
+ const env = o.env ?? process.env;
64
+ const log = o.logger ?? { info: (m) => console.log(m), warn: (m) => console.warn(m) };
65
+ const doFetch = o.fetch ?? globalThis.fetch;
66
+ const endpoint = (o.endpoint ?? env.LANTERN_INGEST_URL ?? DEFAULT_INGEST).replace(/\/+$/, "");
67
+ const release = o.release ?? releaseFrom(env);
68
+ const result = { registered: false, uploaded: 0, failed: [], deleted: 0 };
69
+ const maps = await findSourceMaps(outDir).catch(() => []);
70
+ const auth = authHeaders(env);
71
+ const tag = `${o.service}@${release}`;
72
+ if (o.upload === false) {
73
+ // asked not to
74
+ }
75
+ else if (!auth) {
76
+ if (maps.length)
77
+ log.info(`[lantern] ${maps.length} source maps not uploaded for ${tag}: no CI_JOB_TOKEN or LANTERN_RELEASE_KEY`);
78
+ }
79
+ else if (release === "dev") {
80
+ log.warn(`[lantern] not uploading source maps: no VERSION or VITE_APP_VERSION, so the release is "dev"`);
81
+ }
82
+ else if (!doFetch) {
83
+ log.warn("[lantern] not uploading source maps: no fetch in this Node");
84
+ }
85
+ else {
86
+ try {
87
+ const res = await doFetch(`${endpoint}/v1/releases`, {
88
+ method: "POST",
89
+ headers: { "content-type": "application/json", ...auth },
90
+ body: JSON.stringify({ service: o.service, version: release, build: env.CI_COMMIT_SHORT_SHA ?? env.CI_COMMIT_SHA ?? "" }),
91
+ });
92
+ result.registered = res.ok;
93
+ if (!res.ok)
94
+ log.warn(`[lantern] registering release ${tag} failed: HTTP ${res.status}`);
95
+ }
96
+ catch (e) {
97
+ log.warn(`[lantern] registering release ${tag} failed: ${e.message}`);
98
+ }
99
+ const queue = maps.slice();
100
+ const worker = async () => {
101
+ for (let m = queue.shift(); m !== undefined; m = queue.shift()) {
102
+ const qs = new URLSearchParams({ service: o.service, release, path: assetPathOf(m) });
103
+ try {
104
+ const raw = await fs.readFile(path.join(outDir, m));
105
+ const res = await doFetch(`${endpoint}/v1/sourcemaps?${qs.toString()}`, {
106
+ method: "POST",
107
+ headers: { "content-type": "application/json", "content-encoding": "gzip", ...auth },
108
+ body: new Uint8Array(gzipSync(raw)),
109
+ });
110
+ if (res.ok)
111
+ result.uploaded++;
112
+ else
113
+ result.failed.push(`${m} (HTTP ${res.status})`);
114
+ }
115
+ catch (e) {
116
+ result.failed.push(`${m} (${e.message})`);
117
+ }
118
+ }
119
+ };
120
+ await Promise.all(Array.from({ length: Math.max(1, o.concurrency ?? 4) }, worker));
121
+ const failed = result.failed.length ? `, ${result.failed.length} failed: ${result.failed.slice(0, 3).join("; ")}${result.failed.length > 3 ? "; …" : ""}` : "";
122
+ (result.failed.length ? log.warn : log.info)(`[lantern] uploaded ${result.uploaded}/${maps.length} source maps for ${tag} to ${endpoint}${failed}`);
123
+ }
124
+ if (o.deleteSourceMaps !== false) {
125
+ for (const m of maps) {
126
+ try {
127
+ await fs.unlink(path.join(outDir, m));
128
+ result.deleted++;
129
+ }
130
+ catch {
131
+ /* already gone */
132
+ }
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+ export function lanternTelemetry(opts) {
138
+ const env = opts.env ?? process.env;
139
+ const release = opts.release ?? releaseFrom(env);
140
+ let outDir = "dist";
141
+ let isBuild = false;
142
+ return {
143
+ name: "xeonr:lantern-telemetry",
144
+ config(config) {
145
+ // Forced, not defaulted: a map a bundle links to is a map anyone can fetch.
146
+ config.build ??= {};
147
+ config.build.sourcemap = "hidden";
148
+ },
149
+ configResolved(config) {
150
+ outDir = path.resolve(config.root, config.build.outDir);
151
+ isBuild = config.command === "build";
152
+ },
153
+ transformIndexHtml() {
154
+ return [
155
+ { tag: "meta", attrs: { name: "lantern-service", content: opts.service }, injectTo: "head" },
156
+ { tag: "meta", attrs: { name: "lantern-release", content: release }, injectTo: "head" },
157
+ ];
158
+ },
159
+ async closeBundle() {
160
+ if (!isBuild)
161
+ return;
162
+ try {
163
+ await uploadSourceMaps(outDir, { ...opts, release, env });
164
+ }
165
+ catch (e) {
166
+ (opts.logger ?? console).warn(`[lantern] source-map step failed: ${e.message}`);
167
+ }
168
+ },
169
+ };
170
+ }
171
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,62 @@
1
1
  {
2
2
  "name": "@xeonr/telemetry-web",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Browser telemetry for Xeonr consoles: errors, reachability, web vitals and RPC spans as OTLP/HTTP JSON to Lantern's client ingest. Replaces Sentry.",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./connect": {
14
+ "types": "./dist/connect.d.ts",
15
+ "import": "./dist/connect.js"
16
+ },
17
+ "./react": {
18
+ "types": "./dist/react.d.ts",
19
+ "import": "./dist/react.js"
20
+ },
21
+ "./vite": {
22
+ "types": "./dist/vite.d.ts",
23
+ "import": "./dist/vite.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "peerDependencies": {
30
+ "@connectrpc/connect": "^2.0.0",
31
+ "react": "^18.0.0 || ^19.0.0",
32
+ "vite": ">=5.0.0"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "@connectrpc/connect": {
36
+ "optional": true
37
+ },
38
+ "react": {
39
+ "optional": true
40
+ },
41
+ "vite": {
42
+ "optional": true
43
+ }
44
+ },
45
+ "devDependencies": {
46
+ "@bufbuild/protobuf": "^2.10.2",
47
+ "@connectrpc/connect": "^2.1.1",
48
+ "@types/node": "^24.19.2",
49
+ "@types/react": "^19.1.0",
50
+ "esbuild": "^0.25.12",
51
+ "react": "^19.1.0",
52
+ "typescript": "^5.9.2",
53
+ "vite": "^6.0.3",
54
+ "@xeonr/platform-ui": "0.5.19"
55
+ },
56
+ "scripts": {
57
+ "build": "tsc -p tsconfig.build.json",
58
+ "lint": "tsc -p tsconfig.json --noEmit && xeonr-check-colour-literals",
59
+ "test": "node --test src/*.test.ts",
60
+ "size": "node scripts/size.mjs"
61
+ }
6
62
  }