@replicated/portal-components 0.0.11 → 0.0.13
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/components/metadata/registry.json +2 -2
- package/components/metadata/registry.md +2 -2
- package/datadog/tracer.d.ts +3 -0
- package/datadog/tracer.js +82 -0
- package/datadog/tracer.ts +101 -0
- package/dist/actions/index.d.mts +26 -4
- package/dist/actions/index.d.ts +26 -4
- package/dist/actions/index.js +171 -124
- package/dist/actions/index.js.map +1 -1
- package/dist/airgap-instances.js.map +1 -1
- package/dist/esm/actions/index.js +170 -124
- package/dist/esm/actions/index.js.map +1 -1
- package/dist/esm/airgap-instances.js.map +1 -1
- package/dist/esm/helm-install-wizard.js +15 -9
- package/dist/esm/helm-install-wizard.js.map +1 -1
- package/dist/esm/index.js +204 -158
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install-actions.js +42 -47
- package/dist/esm/install-actions.js.map +1 -1
- package/dist/esm/install-card.js +8 -21
- package/dist/esm/install-card.js.map +1 -1
- package/dist/esm/instance-card.js.map +1 -1
- package/dist/esm/license-card.js +8 -12
- package/dist/esm/license-card.js.map +1 -1
- package/dist/esm/license-details.js +21 -11
- package/dist/esm/license-details.js.map +1 -1
- package/dist/esm/linux-install-wizard.js +26 -47
- package/dist/esm/linux-install-wizard.js.map +1 -1
- package/dist/esm/online-instance-list.js.map +1 -1
- package/dist/esm/support-card.js +22 -55
- package/dist/esm/support-card.js.map +1 -1
- package/dist/esm/team-settings-card.js +8 -13
- package/dist/esm/team-settings-card.js.map +1 -1
- package/dist/esm/top-nav.js +69 -47
- package/dist/esm/top-nav.js.map +1 -1
- package/dist/esm/update-layout.js +69 -47
- package/dist/esm/update-layout.js.map +1 -1
- package/dist/esm/updates-card.js +8 -14
- package/dist/esm/updates-card.js.map +1 -1
- package/dist/esm/utils/index.js +14 -10
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/observability/index.js +193 -0
- package/dist/esm/utils/observability/index.js.map +1 -0
- package/dist/helm-install-wizard.js +15 -9
- package/dist/helm-install-wizard.js.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +203 -156
- package/dist/index.js.map +1 -1
- package/dist/install-actions.js +43 -48
- package/dist/install-actions.js.map +1 -1
- package/dist/install-card.js +8 -21
- package/dist/install-card.js.map +1 -1
- package/dist/instance-card.js.map +1 -1
- package/dist/license-card.js +8 -12
- package/dist/license-card.js.map +1 -1
- package/dist/license-details.js +21 -11
- package/dist/license-details.js.map +1 -1
- package/dist/linux-install-wizard.js +26 -47
- package/dist/linux-install-wizard.js.map +1 -1
- package/dist/online-instance-list.js.map +1 -1
- package/dist/styles.css +2 -2
- package/dist/support-card.js +22 -55
- package/dist/support-card.js.map +1 -1
- package/dist/team-settings-card.js +8 -13
- package/dist/team-settings-card.js.map +1 -1
- package/dist/top-nav.js +69 -47
- package/dist/top-nav.js.map +1 -1
- package/dist/update-layout.js +69 -47
- package/dist/update-layout.js.map +1 -1
- package/dist/updates-card.js +8 -14
- package/dist/updates-card.js.map +1 -1
- package/dist/utils/index.js +14 -10
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/observability/index.d.mts +13 -0
- package/dist/utils/observability/index.d.ts +13 -0
- package/dist/utils/observability/index.js +198 -0
- package/dist/utils/observability/index.js.map +1 -0
- package/instrumentation.d.ts +8 -0
- package/instrumentation.js +22 -0
- package/package.json +16 -3
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Enterprise Portal Components
|
|
5
|
+
* This file is generated by tsup. Do not edit manually.
|
|
6
|
+
*/
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
12
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
13
|
+
}) : x)(function(x) {
|
|
14
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
15
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
16
|
+
});
|
|
17
|
+
var __esm = (fn, res) => function __init() {
|
|
18
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
19
|
+
};
|
|
20
|
+
var __export = (target, all) => {
|
|
21
|
+
for (var name in all)
|
|
22
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
23
|
+
};
|
|
24
|
+
var __copyProps = (to, from, except, desc) => {
|
|
25
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
26
|
+
for (let key of __getOwnPropNames(from))
|
|
27
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
28
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
29
|
+
}
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
33
|
+
|
|
34
|
+
// datadog/tracer.ts
|
|
35
|
+
var tracer_exports = {};
|
|
36
|
+
__export(tracer_exports, {
|
|
37
|
+
default: () => tracer_default
|
|
38
|
+
});
|
|
39
|
+
var rawFlag, isEnabled, tracer, getRoutePattern, tracer_default;
|
|
40
|
+
var init_tracer = __esm({
|
|
41
|
+
"datadog/tracer.ts"() {
|
|
42
|
+
rawFlag = String(process.env.USE_DATADOG_APM || "").toLowerCase();
|
|
43
|
+
isEnabled = rawFlag === "true";
|
|
44
|
+
process.env.DD_TRACE_ENABLED = isEnabled ? "1" : "0";
|
|
45
|
+
tracer = null;
|
|
46
|
+
if (isEnabled) {
|
|
47
|
+
const serviceName = process.env.DD_SERVICE || "enterprise-portal";
|
|
48
|
+
const environment = process.env.DD_ENV || process.env.NODE_ENV || "development";
|
|
49
|
+
const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || "0.0.0-dev";
|
|
50
|
+
const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || "127.0.0.1";
|
|
51
|
+
const agentPort = process.env.DD_TRACE_AGENT_PORT || "8126";
|
|
52
|
+
process.env.DD_SERVICE = serviceName;
|
|
53
|
+
process.env.DD_ENV = environment;
|
|
54
|
+
{
|
|
55
|
+
process.env.DD_VERSION = version;
|
|
56
|
+
}
|
|
57
|
+
process.env.DD_AGENT_HOST = agentHost;
|
|
58
|
+
process.env.DD_TRACE_AGENT_PORT = agentPort;
|
|
59
|
+
const dbmPropagationMode = process.env.DD_DBM_PROPAGATION_MODE || "full";
|
|
60
|
+
process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;
|
|
61
|
+
try {
|
|
62
|
+
const ddTrace = __require("dd-trace");
|
|
63
|
+
tracer = ddTrace.init({
|
|
64
|
+
service: serviceName,
|
|
65
|
+
env: environment,
|
|
66
|
+
version,
|
|
67
|
+
logInjection: true,
|
|
68
|
+
runtimeMetrics: true,
|
|
69
|
+
appsec: false,
|
|
70
|
+
profiling: false,
|
|
71
|
+
startupLogs: true
|
|
72
|
+
// Enable for debugging
|
|
73
|
+
});
|
|
74
|
+
console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);
|
|
75
|
+
tracer.use("dns", false);
|
|
76
|
+
tracer.use("net", false);
|
|
77
|
+
tracer.use("http", {
|
|
78
|
+
server: {
|
|
79
|
+
hooks: {
|
|
80
|
+
request: (span, req) => {
|
|
81
|
+
if (!span) return;
|
|
82
|
+
const url = req?.url || "";
|
|
83
|
+
const method = req?.method || "GET";
|
|
84
|
+
const path = url.split("?")[0];
|
|
85
|
+
if (path.startsWith("/_next/")) {
|
|
86
|
+
span.context()._trace.isRecording = false;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const routePattern = getRoutePattern(path);
|
|
90
|
+
span.setTag("resource.name", `${method} ${routePattern}`);
|
|
91
|
+
span.setTag("http.route", routePattern);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.error("[datadog] failed to initialize tracing", err);
|
|
98
|
+
tracer = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getRoutePattern = (path) => {
|
|
102
|
+
const routePatterns = [
|
|
103
|
+
// Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)
|
|
104
|
+
{ pattern: /^\/update\/instance\/[^/]+(.*)$/, replacement: "/update/instance/[instanceId]$1" }
|
|
105
|
+
];
|
|
106
|
+
for (const { pattern, replacement } of routePatterns) {
|
|
107
|
+
if (pattern.test(path)) {
|
|
108
|
+
return path.replace(pattern, replacement);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return path;
|
|
112
|
+
};
|
|
113
|
+
tracer_default = tracer;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// src/utils/observability/tracing.ts
|
|
118
|
+
var tracerCache = void 0;
|
|
119
|
+
function getTracer() {
|
|
120
|
+
if (tracerCache !== void 0) {
|
|
121
|
+
return tracerCache;
|
|
122
|
+
}
|
|
123
|
+
const rawFlag2 = String(process.env.USE_DATADOG_APM || "").toLowerCase();
|
|
124
|
+
const isEnabled2 = rawFlag2 === "true";
|
|
125
|
+
if (!isEnabled2) {
|
|
126
|
+
tracerCache = null;
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const tracerModule = (init_tracer(), __toCommonJS(tracer_exports));
|
|
131
|
+
const tracer2 = tracerModule.default || tracerModule;
|
|
132
|
+
if (tracer2 && typeof tracer2.trace === "function") {
|
|
133
|
+
tracerCache = tracer2;
|
|
134
|
+
return tracerCache;
|
|
135
|
+
}
|
|
136
|
+
} catch (err) {
|
|
137
|
+
console.warn("Failed to load tracer:", err);
|
|
138
|
+
}
|
|
139
|
+
tracerCache = null;
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
function getActiveSpan() {
|
|
143
|
+
const activeTracer = getTracer();
|
|
144
|
+
if (!activeTracer || !activeTracer.scope) {
|
|
145
|
+
return void 0;
|
|
146
|
+
}
|
|
147
|
+
const active = activeTracer.scope().active();
|
|
148
|
+
return active || void 0;
|
|
149
|
+
}
|
|
150
|
+
async function withTrace(name, fn) {
|
|
151
|
+
const activeTracer = getTracer();
|
|
152
|
+
if (!activeTracer) {
|
|
153
|
+
return fn(void 0);
|
|
154
|
+
}
|
|
155
|
+
return activeTracer.trace(name, async (span) => {
|
|
156
|
+
if (span) {
|
|
157
|
+
span.setTag("component", "application");
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const result = await fn(span);
|
|
161
|
+
return result;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
if (span) {
|
|
164
|
+
span.setTag("error", error);
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function traceServerAction(name, fn) {
|
|
171
|
+
const spanName = name.startsWith("server.action.") ? name : `server.action.${name}`;
|
|
172
|
+
const traced = async (...args) => {
|
|
173
|
+
return withTrace(spanName, async (span) => {
|
|
174
|
+
if (span) {
|
|
175
|
+
span.setTag("component", "server-action");
|
|
176
|
+
}
|
|
177
|
+
const result = await fn(...args);
|
|
178
|
+
return result;
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
return traced;
|
|
182
|
+
}
|
|
183
|
+
function traceFunction(name, fn) {
|
|
184
|
+
const traced = async (...args) => {
|
|
185
|
+
return withTrace(name, async () => {
|
|
186
|
+
const result = await fn(...args);
|
|
187
|
+
return result;
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
return traced;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
exports.getActiveSpan = getActiveSpan;
|
|
194
|
+
exports.traceFunction = traceFunction;
|
|
195
|
+
exports.traceServerAction = traceServerAction;
|
|
196
|
+
exports.withTrace = withTrace;
|
|
197
|
+
//# sourceMappingURL=index.js.map
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../datadog/tracer.ts","../../../src/utils/observability/tracing.ts"],"names":["rawFlag","isEnabled","tracer"],"mappings":"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","file":"index.js","sourcesContent":["import type { Tracer, Span, init as ddTraceInit } from 'dd-trace';\nimport type { IncomingMessage } from 'http';\n\nconst rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();\nconst isEnabled = rawFlag === 'true';\n\nprocess.env.DD_TRACE_ENABLED = isEnabled ? '1' : '0';\n\nlet tracer: Tracer | null = null;\n\nif (isEnabled) {\n const serviceName = process.env.DD_SERVICE || 'enterprise-portal';\n const environment = process.env.DD_ENV || process.env.NODE_ENV || 'development';\n const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || '0.0.0-dev';\n\n const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || '127.0.0.1';\n const agentPort = process.env.DD_TRACE_AGENT_PORT || '8126';\n\n process.env.DD_SERVICE = serviceName;\n process.env.DD_ENV = environment;\n if (version) {\n process.env.DD_VERSION = version;\n }\n process.env.DD_AGENT_HOST = agentHost;\n process.env.DD_TRACE_AGENT_PORT = agentPort;\n\n const dbmPropagationMode = (process.env.DD_DBM_PROPAGATION_MODE || 'full') as 'disabled' | 'service' | 'full';\n\n process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ddTrace = require('dd-trace');\n tracer = (ddTrace.init as typeof ddTraceInit)({\n service: serviceName,\n env: environment,\n version,\n logInjection: true,\n runtimeMetrics: true,\n appsec: false,\n profiling: false,\n startupLogs: true, // Enable for debugging\n }) as Tracer;\n \n console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);\n\n // Disable low-level network instrumentation for localhost connections\n tracer.use('dns', false);\n tracer.use('net', false);\n // Configure http plugin to normalize route patterns\n tracer.use('http', {\n server: {\n hooks: {\n request: (span?: Span, req?: IncomingMessage) => {\n if (!span) return;\n\n const url = req?.url || '';\n const method = req?.method || 'GET';\n const path = url.split('?')[0];\n\n // Drop Next.js internal requests\n if (path.startsWith('/_next/')) {\n // @ts-expect-error - using internal property to drop the trace\n span.context()._trace.isRecording = false;\n return;\n }\n\n const routePattern = getRoutePattern(path);\n\n span.setTag('resource.name', `${method} ${routePattern}`);\n span.setTag('http.route', routePattern);\n }\n }\n }\n });\n } catch (err) {\n // Do not crash the app if tracing fails to initialize\n console.error('[datadog] failed to initialize tracing', err);\n tracer = null;\n }\n}\n\n// Function to convert actual paths to route patterns\nconst getRoutePattern = (path: string): string => {\n // Define route patterns for dynamic routes in enterprise portal\n const routePatterns = [\n // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)\n { pattern: /^\\/update\\/instance\\/[^/]+(.*)$/, replacement: '/update/instance/[instanceId]$1' },\n ];\n\n for (const { pattern, replacement } of routePatterns) {\n if (pattern.test(path)) {\n return path.replace(pattern, replacement);\n }\n }\n\n // Return original path if no pattern matches\n return path;\n}\n\nexport default tracer;\n","import type { Span, Tracer } from 'dd-trace';\n\n// Type for a function that has been wrapped with tracing (always returns a Promise)\ntype TracedFunction<T extends (...args: any[]) => any> = (\n ...args: Parameters<T>\n) => Promise<Awaited<ReturnType<T>>>;\n\n// Lazy-load tracer only when tracing is enabled\n// Using undefined to distinguish between \"not loaded yet\" and \"loaded but null\"\nlet tracerCache: Tracer | null | undefined = undefined;\n\nfunction getTracer(): Tracer | null {\n // Return cached result if already loaded (prevents race conditions and multiple initializations)\n if (tracerCache !== undefined) {\n return tracerCache;\n }\n\n // Check if tracing is enabled at runtime (consistent with datadog/tracer.ts and instrumentation.ts)\n const rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();\n const isEnabled = rawFlag === 'true';\n\n if (!isEnabled) {\n tracerCache = null;\n return null;\n }\n\n // Lazy load the tracer module only when needed\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tracerModule = require('../../../datadog/tracer');\n const tracer = tracerModule.default || tracerModule;\n\n if (tracer && typeof (tracer as any).trace === 'function') {\n tracerCache = tracer as Tracer;\n return tracerCache;\n }\n } catch (err) {\n console.warn('Failed to load tracer:', err);\n }\n\n tracerCache = null;\n return null;\n}\n\n/**\n * Get the currently active span from the tracer's scope.\n * This can be used to pass span context to database calls.\n */\nexport function getActiveSpan(): Span | undefined {\n const activeTracer = getTracer();\n if (!activeTracer || !activeTracer.scope) {\n return undefined;\n }\n const active = activeTracer.scope().active();\n return active || undefined;\n}\n\nexport async function withTrace<T>(\n name: string,\n fn: (span?: Span) => Promise<T> | T,\n): Promise<T> {\n const activeTracer = getTracer();\n if (!activeTracer) {\n return fn(undefined);\n }\n\n return activeTracer.trace(name, async (span?: Span) => {\n if (span) {\n span.setTag('component', 'application');\n }\n try {\n const result = await fn(span);\n return result;\n } catch (error) {\n if (span) {\n span.setTag('error', error as any);\n }\n throw error;\n }\n });\n}\n\nexport function traceServerAction<T extends (...args: any[]) => any>(\n name: string,\n fn: T,\n): TracedFunction<T> {\n const spanName = name.startsWith('server.action.') ? name : `server.action.${name}`;\n\n const traced: TracedFunction<T> = async (...args: Parameters<T>) => {\n return withTrace(spanName, async (span) => {\n if (span) {\n span.setTag('component', 'server-action');\n }\n const result = await fn(...args);\n return result;\n });\n };\n\n return traced;\n}\n\nexport function traceFunction<T extends (...args: any[]) => any>(\n name: string,\n fn: T,\n): TracedFunction<T> {\n const traced: TracedFunction<T> = async (...args: Parameters<T>) => {\n return withTrace(name, async () => {\n const result = await fn(...args);\n return result;\n });\n };\n\n return traced;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js Instrumentation Hook
|
|
3
|
+
*
|
|
4
|
+
* This runs once when the Next.js server starts (before any requests are handled).
|
|
5
|
+
* Applications using @replicated/portal-components can import and use this directly,
|
|
6
|
+
* or create their own instrumentation.ts that calls this register function.
|
|
7
|
+
*/
|
|
8
|
+
export declare function register(): Promise<void>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js Instrumentation Hook
|
|
3
|
+
*
|
|
4
|
+
* This runs once when the Next.js server starts (before any requests are handled).
|
|
5
|
+
* Applications using @replicated/portal-components can import and use this directly,
|
|
6
|
+
* or create their own instrumentation.ts that calls this register function.
|
|
7
|
+
*/
|
|
8
|
+
export async function register() {
|
|
9
|
+
if (process.env.NEXT_RUNTIME === 'nodejs') {
|
|
10
|
+
const rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();
|
|
11
|
+
const isEnabled = rawFlag === 'true';
|
|
12
|
+
if (isEnabled) {
|
|
13
|
+
await import('./datadog/tracer');
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log(`[datadog] APM disabled (runtime: ${process.env.NEXT_RUNTIME}, USE_DATADOG_APM: ${process.env.USE_DATADOG_APM})`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log(`[datadog] APM not available in runtime: ${process.env.NEXT_RUNTIME}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@replicated/portal-components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"description": "Opinionated component library for Replicated enterprise portals",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -17,7 +17,10 @@
|
|
|
17
17
|
"style": "dist/styles.css",
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
-
"components/metadata"
|
|
20
|
+
"components/metadata",
|
|
21
|
+
"instrumentation.js",
|
|
22
|
+
"instrumentation.d.ts",
|
|
23
|
+
"datadog"
|
|
21
24
|
],
|
|
22
25
|
"sideEffects": [
|
|
23
26
|
"*.css",
|
|
@@ -199,19 +202,29 @@
|
|
|
199
202
|
"import": "./dist/esm/join-team.js",
|
|
200
203
|
"require": "./dist/join-team.js"
|
|
201
204
|
},
|
|
205
|
+
"./observability": {
|
|
206
|
+
"types": "./dist/utils/observability/index.d.ts",
|
|
207
|
+
"import": "./dist/esm/utils/observability/index.js",
|
|
208
|
+
"require": "./dist/utils/observability/index.js"
|
|
209
|
+
},
|
|
210
|
+
"./instrumentation": "./instrumentation.js",
|
|
202
211
|
"./styles.css": "./dist/styles.css",
|
|
203
212
|
"./metadata/registry.json": "./components/metadata/registry.json"
|
|
204
213
|
},
|
|
205
214
|
"scripts": {
|
|
206
215
|
"clean": "rimraf dist",
|
|
207
|
-
"build": "npm run clean && npm run registry:generate && npm run build:css && tsup",
|
|
216
|
+
"build": "npm run clean && npm run registry:generate && npm run build:css && npm run build:instrumentation && tsup",
|
|
208
217
|
"build:css": "tailwindcss -i ./src/styles.css -o ./dist/styles.css --config tailwind.config.ts",
|
|
218
|
+
"build:instrumentation": "tsc instrumentation.ts --outDir . --declaration --module esnext --target es2022 --moduleResolution bundler --skipLibCheck && tsc datadog/tracer.ts --outDir datadog --declaration --module esnext --target es2022 --moduleResolution bundler --skipLibCheck",
|
|
209
219
|
"dev": "tsup --watch",
|
|
210
220
|
"typecheck": "tsc --noEmit",
|
|
211
221
|
"registry:generate": "tsx scripts/generate-registry.ts",
|
|
212
222
|
"size": "size-limit",
|
|
213
223
|
"release": "changeset"
|
|
214
224
|
},
|
|
225
|
+
"dependencies": {
|
|
226
|
+
"dd-trace": "^5.70.0"
|
|
227
|
+
},
|
|
215
228
|
"peerDependencies": {
|
|
216
229
|
"react": "^19.0.0",
|
|
217
230
|
"react-dom": "^19.0.0"
|