@interfere/next 0.0.13 → 0.0.14
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/__tests__/build/with-interfere-coverage.test.js +41 -71
- package/dist/__tests__/build/with-interfere-coverage.test.js.map +1 -1
- package/dist/__tests__/build/with-interfere.test.js +95 -156
- package/dist/__tests__/build/with-interfere.test.js.map +1 -1
- package/dist/__tests__/integration/release-upload.test.js +13 -27
- package/dist/__tests__/integration/release-upload.test.js.map +1 -1
- package/dist/__tests__/provider.test.d.ts +2 -0
- package/dist/__tests__/provider.test.d.ts.map +1 -0
- package/dist/__tests__/provider.test.js +84 -0
- package/dist/__tests__/provider.test.js.map +1 -0
- package/dist/config.d.ts +11 -32
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +60 -35
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +21 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/index.jsx +39 -2
- package/dist/index.jsx.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
// Test that environment variables are properly set by withInterfere
|
|
3
|
+
describe("InterfereProvider configuration", () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
vi.clearAllMocks();
|
|
6
|
+
// Clear all environment variables to ensure test isolation
|
|
7
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_SURFACE_ID", undefined);
|
|
8
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_ENVIRONMENT", undefined);
|
|
9
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_DEBUG", undefined);
|
|
10
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_RELEASE_ID", undefined);
|
|
11
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_BUILD_ID", undefined);
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
vi.resetAllMocks();
|
|
15
|
+
vi.unstubAllEnvs();
|
|
16
|
+
});
|
|
17
|
+
it("should read surface ID from NEXT_PUBLIC_INTERFERE_SURFACE_ID", () => {
|
|
18
|
+
// This test verifies that the provider would read from env vars
|
|
19
|
+
// In a real app, these would be set by withInterfere at build time
|
|
20
|
+
const mockSurfaceId = "test-surface-123";
|
|
21
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_SURFACE_ID", mockSurfaceId);
|
|
22
|
+
// The provider would read this value
|
|
23
|
+
expect(process.env.NEXT_PUBLIC_INTERFERE_SURFACE_ID).toBe(mockSurfaceId);
|
|
24
|
+
});
|
|
25
|
+
it("should read all configuration from environment variables", () => {
|
|
26
|
+
// Set all env vars as withInterfere would
|
|
27
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_SURFACE_ID", "test-surface");
|
|
28
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_ENVIRONMENT", "staging");
|
|
29
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_DEBUG", "true");
|
|
30
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_RELEASE_ID", "release-123");
|
|
31
|
+
vi.stubEnv("NEXT_PUBLIC_INTERFERE_BUILD_ID", "build-456");
|
|
32
|
+
// Verify they're all accessible
|
|
33
|
+
expect(process.env.NEXT_PUBLIC_INTERFERE_SURFACE_ID).toBe("test-surface");
|
|
34
|
+
expect(process.env.NEXT_PUBLIC_INTERFERE_ENVIRONMENT).toBe("staging");
|
|
35
|
+
expect(process.env.NEXT_PUBLIC_INTERFERE_DEBUG).toBe("true");
|
|
36
|
+
expect(process.env.NEXT_PUBLIC_INTERFERE_RELEASE_ID).toBe("release-123");
|
|
37
|
+
expect(process.env.NEXT_PUBLIC_INTERFERE_BUILD_ID).toBe("build-456");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
const EXPECTED_PARTS_LENGTH = 4;
|
|
41
|
+
const EXPECTED_PREFIX = "int";
|
|
42
|
+
const EXPECTED_SUFFIX = "sk";
|
|
43
|
+
function parseSurfaceIdFromSecretKey(secretKey) {
|
|
44
|
+
const parts = secretKey.split("_");
|
|
45
|
+
return parts.length === EXPECTED_PARTS_LENGTH &&
|
|
46
|
+
parts[0] === EXPECTED_PREFIX &&
|
|
47
|
+
parts[1] === EXPECTED_SUFFIX &&
|
|
48
|
+
parts[2] && // Ensure surface ID is not empty
|
|
49
|
+
parts[3] // Ensure suffix is not empty
|
|
50
|
+
? parts[2]
|
|
51
|
+
: undefined;
|
|
52
|
+
}
|
|
53
|
+
describe("Configuration flow", () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
vi.clearAllMocks();
|
|
56
|
+
});
|
|
57
|
+
afterEach(() => {
|
|
58
|
+
vi.resetAllMocks();
|
|
59
|
+
vi.unstubAllEnvs();
|
|
60
|
+
});
|
|
61
|
+
it("withInterfere should set public env vars from secret key", () => {
|
|
62
|
+
// This demonstrates the expected flow:
|
|
63
|
+
// 1. User sets INTERFERE_SECRET_KEY=int_sk_mysurface_abc123
|
|
64
|
+
// 2. withInterfere parses it and sets NEXT_PUBLIC_INTERFERE_SURFACE_ID=mysurface
|
|
65
|
+
// 3. InterfereProvider reads NEXT_PUBLIC_INTERFERE_SURFACE_ID
|
|
66
|
+
const secretKey = "int_sk_mysurface_abc123";
|
|
67
|
+
const expectedSurfaceId = "mysurface";
|
|
68
|
+
const surfaceId = parseSurfaceIdFromSecretKey(secretKey);
|
|
69
|
+
expect(surfaceId).toBe(expectedSurfaceId);
|
|
70
|
+
});
|
|
71
|
+
it("should handle invalid secret key format", () => {
|
|
72
|
+
const invalidKeys = [
|
|
73
|
+
"invalid-format",
|
|
74
|
+
"int_sk_", // Missing parts
|
|
75
|
+
"int_sk_surface", // Missing suffix
|
|
76
|
+
"sk_surface_suffix", // Wrong prefix
|
|
77
|
+
];
|
|
78
|
+
for (const key of invalidKeys) {
|
|
79
|
+
const surfaceId = parseSurfaceIdFromSecretKey(key);
|
|
80
|
+
expect(surfaceId).toBeUndefined();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.test.js","sourceRoot":"","sources":["../../src/__tests__/provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,oEAAoE;AACpE,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,2DAA2D;QAC3D,EAAE,CAAC,OAAO,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;QAC1D,EAAE,CAAC,OAAO,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;QAC3D,EAAE,CAAC,OAAO,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;QACrD,EAAE,CAAC,OAAO,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;QAC1D,EAAE,CAAC,OAAO,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,gEAAgE;QAChE,mEAAmE;QAEnE,MAAM,aAAa,GAAG,kBAAkB,CAAC;QACzC,EAAE,CAAC,OAAO,CAAC,kCAAkC,EAAE,aAAa,CAAC,CAAC;QAE9D,qCAAqC;QACrC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,0CAA0C;QAC1C,EAAE,CAAC,OAAO,CAAC,kCAAkC,EAAE,cAAc,CAAC,CAAC;QAC/D,EAAE,CAAC,OAAO,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;QAC3D,EAAE,CAAC,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAClD,EAAE,CAAC,OAAO,CAAC,kCAAkC,EAAE,aAAa,CAAC,CAAC;QAC9D,EAAE,CAAC,OAAO,CAAC,gCAAgC,EAAE,WAAW,CAAC,CAAC;QAE1D,gCAAgC;QAChC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,SAAS,2BAA2B,CAAC,SAAiB;IACpD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,KAAK,qBAAqB;QAC3C,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe;QAC5B,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe;QAC5B,KAAK,CAAC,CAAC,CAAC,IAAK,iCAAiC;QAC9C,KAAK,CAAC,CAAC,CAAC,CAAK,6BAA6B;QAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,uCAAuC;QACvC,4DAA4D;QAC5D,iFAAiF;QACjF,8DAA8D;QAE9D,MAAM,SAAS,GAAG,yBAAyB,CAAC;QAC5C,MAAM,iBAAiB,GAAG,WAAW,CAAC;QAEtC,MAAM,SAAS,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,WAAW,GAAG;YAClB,gBAAgB;YAChB,SAAS,EAAE,gBAAgB;YAC3B,gBAAgB,EAAE,iBAAiB;YACnC,mBAAmB,EAAE,eAAe;SACrC,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;YAEnD,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,31 +1,6 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noConsole: Not an internal package */
|
|
2
2
|
import type { NextConfig } from "next";
|
|
3
3
|
export type InterfereOptions = {
|
|
4
|
-
/**
|
|
5
|
-
* Your Interfere surface ID (optional if using secret key)
|
|
6
|
-
* If not provided, will be extracted from the secret key
|
|
7
|
-
*/
|
|
8
|
-
surface?: string;
|
|
9
|
-
/**
|
|
10
|
-
* API endpoint for uploading source maps
|
|
11
|
-
* @default "https://api.interfere.com"
|
|
12
|
-
*/
|
|
13
|
-
apiUrl?: string;
|
|
14
|
-
/**
|
|
15
|
-
* Secret key for authentication (required)
|
|
16
|
-
* Format: int_sk_{surfaceId}_{random}
|
|
17
|
-
*
|
|
18
|
-
* SECURITY: Use INTERFERE_SECRET_KEY env var (without NEXT_PUBLIC_ prefix)
|
|
19
|
-
* This ensures the key stays server-side only and is never exposed to the client bundle.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* // ✅ CORRECT: Server-side only
|
|
23
|
-
* INTERFERE_SECRET_KEY=int_sk_abc123_xyz789
|
|
24
|
-
*
|
|
25
|
-
* // ❌ WRONG: Would leak to client
|
|
26
|
-
* NEXT_PUBLIC_INTERFERE_SECRET_KEY=int_sk_abc123_xyz789
|
|
27
|
-
*/
|
|
28
|
-
secretKey?: string;
|
|
29
4
|
/**
|
|
30
5
|
* Environment name
|
|
31
6
|
* @default "production"
|
|
@@ -36,26 +11,30 @@ export type InterfereOptions = {
|
|
|
36
11
|
* @default false
|
|
37
12
|
*/
|
|
38
13
|
debug?: boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Disable source map upload (useful for development)
|
|
41
|
-
* @default false
|
|
42
|
-
*/
|
|
43
|
-
disabled?: boolean;
|
|
44
14
|
};
|
|
45
15
|
/**
|
|
46
16
|
* Next.js configuration wrapper that automatically uploads source maps
|
|
47
17
|
*
|
|
18
|
+
* SECURITY: Secret key must be set via INTERFERE_SECRET_KEY env var (without NEXT_PUBLIC_ prefix)
|
|
19
|
+
* Format: int_sk_{surfaceId}_{random}
|
|
20
|
+
*
|
|
48
21
|
* @example
|
|
49
22
|
* ```js
|
|
50
23
|
* // next.config.js
|
|
51
24
|
* const { withInterfere } = require('@interfere/next/build');
|
|
52
25
|
*
|
|
26
|
+
* // Set in your .env file:
|
|
27
|
+
* // INTERFERE_SECRET_KEY=int_sk_abc123_xyz789
|
|
28
|
+
*
|
|
53
29
|
* module.exports = withInterfere({
|
|
54
|
-
*
|
|
30
|
+
* // Optional: Override environment name
|
|
31
|
+
* environment: 'staging',
|
|
32
|
+
* // Optional: Enable debug logging
|
|
33
|
+
* debug: true
|
|
55
34
|
* })({
|
|
56
35
|
* // Your Next.js config
|
|
57
36
|
* });
|
|
58
37
|
* ```
|
|
59
38
|
*/
|
|
60
|
-
export declare function withInterfere(options
|
|
39
|
+
export declare function withInterfere(options?: InterfereOptions): (nextConfig?: NextConfig) => NextConfig;
|
|
61
40
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAO1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AASvC,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAO1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AASvC,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAmUF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,gBAAqB,IAClD,aAAY,UAAe,KAAG,UAAU,CA6EjD"}
|
package/dist/config.js
CHANGED
|
@@ -75,10 +75,10 @@ const NEXT_REGEX = /^\.next\//;
|
|
|
75
75
|
/**
|
|
76
76
|
* Upload source maps in chunks
|
|
77
77
|
*/
|
|
78
|
-
async function uploadSourceMapsChunk(sourceMaps,
|
|
78
|
+
async function uploadSourceMapsChunk(sourceMaps, config, releaseInfo) {
|
|
79
79
|
const form = new FormData();
|
|
80
80
|
// Add release metadata
|
|
81
|
-
form.append("surfaceId",
|
|
81
|
+
form.append("surfaceId", config.surface);
|
|
82
82
|
form.append("buildId", releaseInfo.buildId);
|
|
83
83
|
form.append("releaseId", releaseInfo.releaseId);
|
|
84
84
|
form.append("environment", releaseInfo.environment);
|
|
@@ -100,11 +100,11 @@ async function uploadSourceMapsChunk(sourceMaps, options, releaseInfo) {
|
|
|
100
100
|
contentType: "application/json",
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
|
-
const response = await fetch(
|
|
103
|
+
const response = await fetch("https://api.interfere.com/internal/releases", {
|
|
104
104
|
method: "POST",
|
|
105
105
|
body: form,
|
|
106
106
|
headers: {
|
|
107
|
-
Authorization: `Bearer ${
|
|
107
|
+
Authorization: `Bearer ${config.secretKey}`,
|
|
108
108
|
},
|
|
109
109
|
signal: AbortSignal.timeout(API_TIMEOUT_MS),
|
|
110
110
|
});
|
|
@@ -116,7 +116,7 @@ async function uploadSourceMapsChunk(sourceMaps, options, releaseInfo) {
|
|
|
116
116
|
/**
|
|
117
117
|
* Upload all source maps for a release
|
|
118
118
|
*/
|
|
119
|
-
async function uploadSourceMaps(
|
|
119
|
+
async function uploadSourceMaps(config) {
|
|
120
120
|
const buildId = getGitSha();
|
|
121
121
|
if (!buildId) {
|
|
122
122
|
console.warn("[Interfere] Could not determine Git SHA, skipping source map upload");
|
|
@@ -124,12 +124,12 @@ async function uploadSourceMaps(options) {
|
|
|
124
124
|
}
|
|
125
125
|
const releaseId = getVercelDeploymentId() || buildId;
|
|
126
126
|
const HINT_LENGTH = 4;
|
|
127
|
-
if (
|
|
127
|
+
if (config.debug) {
|
|
128
128
|
console.log("[Interfere] Starting source map upload");
|
|
129
129
|
console.log(` Build ID: ${buildId}`);
|
|
130
130
|
console.log(` Release ID: ${releaseId}`);
|
|
131
|
-
console.log(` Environment: ${
|
|
132
|
-
console.log(` Secret Key: ***${
|
|
131
|
+
console.log(` Environment: ${config.environment}`);
|
|
132
|
+
console.log(` Secret Key: ***${config.secretKey.slice(-HINT_LENGTH)}`);
|
|
133
133
|
}
|
|
134
134
|
// Find all source map files
|
|
135
135
|
const sourceMapFiles = await glob(SOURCE_MAP_GLOB, {
|
|
@@ -137,7 +137,7 @@ async function uploadSourceMaps(options) {
|
|
|
137
137
|
absolute: false,
|
|
138
138
|
});
|
|
139
139
|
if (sourceMapFiles.length === 0) {
|
|
140
|
-
if (
|
|
140
|
+
if (config.debug) {
|
|
141
141
|
console.log("[Interfere] No source maps found to upload");
|
|
142
142
|
}
|
|
143
143
|
return;
|
|
@@ -147,7 +147,7 @@ async function uploadSourceMaps(options) {
|
|
|
147
147
|
const releaseInfo = {
|
|
148
148
|
buildId,
|
|
149
149
|
releaseId,
|
|
150
|
-
environment:
|
|
150
|
+
environment: config.environment,
|
|
151
151
|
branch: getGitBranch(),
|
|
152
152
|
commitMessage: getCommitMessage(),
|
|
153
153
|
deployUrl: getDeployUrl(),
|
|
@@ -167,11 +167,11 @@ async function uploadSourceMaps(options) {
|
|
|
167
167
|
const chunk = sourceMaps.slice(i, i + CHUNK_SIZE);
|
|
168
168
|
const chunkNumber = Math.floor(i / CHUNK_SIZE) + 1;
|
|
169
169
|
const totalChunks = Math.ceil(sourceMaps.length / CHUNK_SIZE);
|
|
170
|
-
if (
|
|
170
|
+
if (config.debug) {
|
|
171
171
|
console.log(`[Interfere] Uploading chunk ${chunkNumber}/${totalChunks}`);
|
|
172
172
|
}
|
|
173
173
|
try {
|
|
174
|
-
await uploadSourceMapsChunk(chunk,
|
|
174
|
+
await uploadSourceMapsChunk(chunk, config, releaseInfo);
|
|
175
175
|
}
|
|
176
176
|
catch (error) {
|
|
177
177
|
console.error(`[Interfere] Failed to upload chunk ${chunkNumber}:`, error);
|
|
@@ -209,56 +209,73 @@ function preflightChecks(options) {
|
|
|
209
209
|
throw new Error("[Interfere] Security Error: withInterfere requires Node.js environment. " +
|
|
210
210
|
"It should only run during build time, not in the browser.");
|
|
211
211
|
}
|
|
212
|
-
// Get secret key from
|
|
213
|
-
const secretKey =
|
|
212
|
+
// Get secret key from environment (only source now)
|
|
213
|
+
const secretKey = process.env.INTERFERE_SECRET_KEY || "";
|
|
214
214
|
// Validate secret key format to catch common mistakes
|
|
215
215
|
if (secretKey?.startsWith("NEXT_PUBLIC_")) {
|
|
216
216
|
throw new Error("[Interfere] Security Error: Secret key should NOT use NEXT_PUBLIC_ prefix. " +
|
|
217
217
|
"Use INTERFERE_SECRET_KEY instead to keep it server-side only.");
|
|
218
218
|
}
|
|
219
|
-
//
|
|
220
|
-
let surfaceId
|
|
221
|
-
if (
|
|
219
|
+
// Parse surface ID from secret key
|
|
220
|
+
let surfaceId;
|
|
221
|
+
if (secretKey) {
|
|
222
222
|
surfaceId = parseSurfaceIdFromSecretKey(secretKey);
|
|
223
223
|
}
|
|
224
|
-
//
|
|
225
|
-
|
|
226
|
-
|
|
224
|
+
// Check if we have a valid setup
|
|
225
|
+
const hasValidSetup = secretKey && surfaceId;
|
|
226
|
+
// Log appropriate warning
|
|
227
|
+
if (!secretKey) {
|
|
228
|
+
console.warn("[Interfere] No secret key found. Set INTERFERE_SECRET_KEY environment variable to enable source map uploads.");
|
|
227
229
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
+
else if (!surfaceId) {
|
|
231
|
+
console.warn("[Interfere] Invalid secret key format. Expected format: int_sk_{surfaceId}_{random}");
|
|
232
|
+
}
|
|
233
|
+
// Return disabled state if setup is invalid
|
|
234
|
+
if (!hasValidSetup) {
|
|
235
|
+
return {
|
|
236
|
+
enabled: false,
|
|
237
|
+
surface: "",
|
|
238
|
+
secretKey: "",
|
|
239
|
+
environment: options.environment || process.env.NODE_ENV || "production",
|
|
240
|
+
debug: options.debug ?? false,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// At this point, both secretKey and surfaceId are guaranteed to be strings
|
|
244
|
+
return {
|
|
245
|
+
enabled: true,
|
|
230
246
|
surface: surfaceId,
|
|
231
|
-
apiUrl: options.apiUrl || "https://api.interfere.com",
|
|
232
247
|
secretKey,
|
|
233
248
|
environment: options.environment || process.env.NODE_ENV || "production",
|
|
234
249
|
debug: options.debug ?? false,
|
|
235
|
-
disabled: options.disabled ?? false,
|
|
236
250
|
};
|
|
237
|
-
// Check for secret key
|
|
238
|
-
if (!(fullOptions.secretKey || fullOptions.disabled)) {
|
|
239
|
-
console.warn("[Interfere] No secret key provided. Set INTERFERE_SECRET_KEY environment variable or pass secretKey option");
|
|
240
|
-
fullOptions.disabled = true;
|
|
241
|
-
}
|
|
242
|
-
return { fullOptions };
|
|
243
251
|
}
|
|
244
252
|
/**
|
|
245
253
|
* Next.js configuration wrapper that automatically uploads source maps
|
|
246
254
|
*
|
|
255
|
+
* SECURITY: Secret key must be set via INTERFERE_SECRET_KEY env var (without NEXT_PUBLIC_ prefix)
|
|
256
|
+
* Format: int_sk_{surfaceId}_{random}
|
|
257
|
+
*
|
|
247
258
|
* @example
|
|
248
259
|
* ```js
|
|
249
260
|
* // next.config.js
|
|
250
261
|
* const { withInterfere } = require('@interfere/next/build');
|
|
251
262
|
*
|
|
263
|
+
* // Set in your .env file:
|
|
264
|
+
* // INTERFERE_SECRET_KEY=int_sk_abc123_xyz789
|
|
265
|
+
*
|
|
252
266
|
* module.exports = withInterfere({
|
|
253
|
-
*
|
|
267
|
+
* // Optional: Override environment name
|
|
268
|
+
* environment: 'staging',
|
|
269
|
+
* // Optional: Enable debug logging
|
|
270
|
+
* debug: true
|
|
254
271
|
* })({
|
|
255
272
|
* // Your Next.js config
|
|
256
273
|
* });
|
|
257
274
|
* ```
|
|
258
275
|
*/
|
|
259
|
-
export function withInterfere(options) {
|
|
276
|
+
export function withInterfere(options = {}) {
|
|
260
277
|
return (nextConfig = {}) => {
|
|
261
|
-
const
|
|
278
|
+
const interfereConfig = preflightChecks(options);
|
|
262
279
|
return {
|
|
263
280
|
...nextConfig,
|
|
264
281
|
// Enable source maps in production
|
|
@@ -280,14 +297,19 @@ export function withInterfere(options) {
|
|
|
280
297
|
config.plugins = [];
|
|
281
298
|
}
|
|
282
299
|
// Add plugin to upload source maps after build
|
|
283
|
-
if (
|
|
300
|
+
if (interfereConfig.enabled) {
|
|
284
301
|
config.plugins.push({
|
|
285
302
|
apply: (compiler) => {
|
|
286
303
|
compiler.hooks.afterEmit.tapPromise("InterfereSourceMapUpload", async () => {
|
|
287
304
|
try {
|
|
288
305
|
// Set build ID in environment for upload
|
|
289
306
|
process.env.NEXT_BUILD_ID = buildId;
|
|
290
|
-
await uploadSourceMaps(
|
|
307
|
+
await uploadSourceMaps({
|
|
308
|
+
surface: interfereConfig.surface,
|
|
309
|
+
secretKey: interfereConfig.secretKey,
|
|
310
|
+
environment: interfereConfig.environment,
|
|
311
|
+
debug: interfereConfig.debug,
|
|
312
|
+
});
|
|
291
313
|
}
|
|
292
314
|
catch (error) {
|
|
293
315
|
console.error("[Interfere] Failed to upload source maps:", error);
|
|
@@ -305,8 +327,11 @@ export function withInterfere(options) {
|
|
|
305
327
|
// Only set public variables that are safe to expose
|
|
306
328
|
env: {
|
|
307
329
|
...nextConfig.env,
|
|
330
|
+
NEXT_PUBLIC_INTERFERE_SURFACE_ID: interfereConfig.surface || "",
|
|
308
331
|
NEXT_PUBLIC_INTERFERE_BUILD_ID: getGitSha() || "",
|
|
309
332
|
NEXT_PUBLIC_INTERFERE_RELEASE_ID: getVercelDeploymentId() || getGitSha() || "",
|
|
333
|
+
NEXT_PUBLIC_INTERFERE_ENVIRONMENT: interfereConfig.environment || "",
|
|
334
|
+
NEXT_PUBLIC_INTERFERE_DEBUG: interfereConfig.debug ? "true" : "false",
|
|
310
335
|
// DO NOT add INTERFERE_SECRET_KEY here - it would leak to client!
|
|
311
336
|
},
|
|
312
337
|
};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B,kCAAkC;AAClC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,aAAa;AAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,+BAA+B;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,29 @@
|
|
|
1
|
-
import type { Config } from "@interfere/schemas/config";
|
|
2
|
-
import type { SurfaceId } from "@interfere/schemas/surface";
|
|
3
1
|
import { type ReactNode } from "react";
|
|
4
2
|
import { capture, flush, getDebugInfo, getSessionId, getWindowId, resetSession } from "./client.js";
|
|
5
3
|
export * from "./lib/core/error-handlers.js";
|
|
6
4
|
type InterfereProviderProps = {
|
|
7
|
-
surface: SurfaceId;
|
|
8
|
-
options?: Partial<Config>;
|
|
9
5
|
children: ReactNode;
|
|
10
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* InterfereProvider automatically configures the SDK using environment variables
|
|
9
|
+
* set by withInterfere in your next.config.js
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // app/layout.tsx
|
|
14
|
+
* export default function RootLayout({ children }) {
|
|
15
|
+
* return (
|
|
16
|
+
* <html>
|
|
17
|
+
* <body>
|
|
18
|
+
* <InterfereProvider>
|
|
19
|
+
* {children}
|
|
20
|
+
* </InterfereProvider>
|
|
21
|
+
* </body>
|
|
22
|
+
* </html>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
11
27
|
export declare function InterfereProvider(props: InterfereProviderProps): import("react").JSX.Element;
|
|
12
28
|
export declare function useInterfere(): {
|
|
13
29
|
capture: typeof capture;
|
|
@@ -17,4 +33,5 @@ export declare function useInterfere(): {
|
|
|
17
33
|
getDebugInfo: typeof getDebugInfo;
|
|
18
34
|
resetSession: typeof resetSession;
|
|
19
35
|
};
|
|
36
|
+
export type { EventType } from "@interfere/schemas/envelope";
|
|
20
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,SAAS,EAAyB,MAAM,OAAO,CAAC;AAC7E,OAAO,EACL,OAAO,EACP,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EAEX,YAAY,EACb,MAAM,aAAa,CAAC;AASrB,cAAc,8BAA8B,CAAC;AAW7C,KAAK,sBAAsB,GAAG;IAC5B,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,+BAwD9D;AAED,wBAAgB,YAAY;aA1FjB,OAAO,OAAO;WAChB,OAAO,KAAK;kBACL,OAAO,YAAY;iBACpB,OAAO,WAAW;kBACjB,OAAO,YAAY;kBACnB,OAAO,YAAY;EA2FlC;AAGD,YAAY,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useEffect } from "react";
|
|
4
|
+
import { capture, flush, getDebugInfo, getSessionId, getWindowId, init, resetSession, } from "./client.js";
|
|
5
|
+
import { setupRageClick } from "./lib/session/rage-click.js";
|
|
6
|
+
import { setupReplay, stopReplay } from "./lib/session/replay.js";
|
|
7
|
+
import { setupSessionSummary, stopSessionSummary, } from "./lib/session/session-summary.js";
|
|
8
|
+
// biome-ignore lint/performance/noBarrelFile: There is a better way to do this
|
|
9
|
+
export * from "./lib/core/error-handlers.js";
|
|
10
|
+
const InterfereContext = createContext(null);
|
|
11
|
+
export function InterfereProvider(props) {
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
init(props);
|
|
14
|
+
setupSessionSummary();
|
|
15
|
+
setupReplay();
|
|
16
|
+
setupRageClick();
|
|
17
|
+
return () => {
|
|
18
|
+
try {
|
|
19
|
+
stopSessionSummary();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
/* no-op */
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
stopReplay();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* no-op */
|
|
29
|
+
}
|
|
30
|
+
flush();
|
|
31
|
+
};
|
|
32
|
+
}, [props]);
|
|
33
|
+
return (_jsx(InterfereContext.Provider, { value: {
|
|
34
|
+
capture,
|
|
35
|
+
flush,
|
|
36
|
+
getSessionId,
|
|
37
|
+
getWindowId,
|
|
38
|
+
getDebugInfo,
|
|
39
|
+
resetSession,
|
|
40
|
+
}, children: props.children }));
|
|
41
|
+
}
|
|
42
|
+
export function useInterfere() {
|
|
43
|
+
const context = useContext(InterfereContext);
|
|
44
|
+
if (!context) {
|
|
45
|
+
throw new Error("useInterfere() must be used within InterfereProvider");
|
|
46
|
+
}
|
|
47
|
+
return context;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAKb,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EACL,OAAO,EACP,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAE1C,+EAA+E;AAC/E,cAAc,8BAA8B,CAAC;AAE7C,MAAM,gBAAgB,GAAG,aAAa,CAO5B,IAAI,CAAC,CAAC;AAQhB,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,CAAC;QACZ,mBAAmB,EAAE,CAAC;QACtB,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,CAAC;QAEjB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC;gBACH,kBAAkB,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;YACD,IAAI,CAAC;gBACH,UAAU,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;YACD,KAAK,EAAE,CAAC;QACV,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IACxB,KAAK,EAAE;YACL,OAAO;YACP,KAAK;YACL,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,YAAY;SACb,YAEA,KAAK,CAAC,QAAQ,GACW,CAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/index.jsx
CHANGED
|
@@ -7,9 +7,46 @@ import { setupSessionSummary, stopSessionSummary, } from "./lib/session/session-
|
|
|
7
7
|
// biome-ignore lint/performance/noBarrelFile: There is a better way to do this
|
|
8
8
|
export * from "./lib/core/error-handlers.js";
|
|
9
9
|
const InterfereContext = createContext(null);
|
|
10
|
+
/**
|
|
11
|
+
* InterfereProvider automatically configures the SDK using environment variables
|
|
12
|
+
* set by withInterfere in your next.config.js
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* // app/layout.tsx
|
|
17
|
+
* export default function RootLayout({ children }) {
|
|
18
|
+
* return (
|
|
19
|
+
* <html>
|
|
20
|
+
* <body>
|
|
21
|
+
* <InterfereProvider>
|
|
22
|
+
* {children}
|
|
23
|
+
* </InterfereProvider>
|
|
24
|
+
* </body>
|
|
25
|
+
* </html>
|
|
26
|
+
* );
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
10
30
|
export function InterfereProvider(props) {
|
|
11
31
|
useEffect(() => {
|
|
12
|
-
|
|
32
|
+
// Read configuration from environment variables set by withInterfere
|
|
33
|
+
const surface = process.env.NEXT_PUBLIC_INTERFERE_SURFACE_ID;
|
|
34
|
+
if (!surface) {
|
|
35
|
+
// Silently skip initialization if no surface ID is configured
|
|
36
|
+
// This happens when withInterfere is not set up in next.config.js
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const config = {
|
|
40
|
+
surface,
|
|
41
|
+
options: {
|
|
42
|
+
env: (process.env.NEXT_PUBLIC_INTERFERE_ENVIRONMENT ||
|
|
43
|
+
"production"),
|
|
44
|
+
debug: process.env.NEXT_PUBLIC_INTERFERE_DEBUG === "true",
|
|
45
|
+
releaseId: process.env.NEXT_PUBLIC_INTERFERE_RELEASE_ID || undefined,
|
|
46
|
+
buildId: process.env.NEXT_PUBLIC_INTERFERE_BUILD_ID || undefined,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
init(config);
|
|
13
50
|
setupSessionSummary();
|
|
14
51
|
setupReplay();
|
|
15
52
|
setupRageClick();
|
|
@@ -28,7 +65,7 @@ export function InterfereProvider(props) {
|
|
|
28
65
|
}
|
|
29
66
|
flush();
|
|
30
67
|
};
|
|
31
|
-
}, [
|
|
68
|
+
}, []);
|
|
32
69
|
return (<InterfereContext.Provider value={{
|
|
33
70
|
capture,
|
|
34
71
|
flush,
|
package/dist/index.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EACL,OAAO,EACP,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAE1C,+EAA+E;AAC/E,cAAc,8BAA8B,CAAC;AAE7C,MAAM,gBAAgB,GAAG,aAAa,CAO5B,IAAI,CAAC,CAAC;AAMhB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,SAAS,CAAC,GAAG,EAAE;QACb,qEAAqE;QACrE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;QAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,8DAA8D;YAC9D,kEAAkE;YAClE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG;YACb,OAAO;YACP,OAAO,EAAE;gBACP,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC;oBACjD,YAAY,CAAQ;gBACtB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,MAAM;gBACzD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,SAAS;gBACpE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,SAAS;aACjE;SACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,CAAC;QACb,mBAAmB,EAAE,CAAC;QACtB,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,CAAC;QAEjB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC;gBACH,kBAAkB,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;YACD,IAAI,CAAC;gBACH,UAAU,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;YACD,KAAK,EAAE,CAAC;QACV,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,CAAC,gBAAgB,CAAC,QAAQ,CACxB,KAAK,CAAC,CAAC;YACL,OAAO;YACP,KAAK;YACL,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,YAAY;SACb,CAAC,CAEF;MAAA,CAAC,KAAK,CAAC,QAAQ,CACjB;IAAA,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|