@interfere/next 0.2.0-alpha.6 → 0.2.0-alpha.9

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 (117) hide show
  1. package/README.md +119 -0
  2. package/package.json +28 -28
  3. package/dist/_virtual/_rolldown/runtime.mjs +0 -13
  4. package/dist/config.d.mts +0 -11
  5. package/dist/config.d.mts.map +0 -1
  6. package/dist/config.mjs +0 -107
  7. package/dist/config.mjs.map +0 -1
  8. package/dist/instrument-client.d.mts +0 -2
  9. package/dist/instrument-client.mjs +0 -2
  10. package/dist/internal/build/configure-build.d.mts +0 -22
  11. package/dist/internal/build/configure-build.d.mts.map +0 -1
  12. package/dist/internal/build/configure-build.mjs +0 -87
  13. package/dist/internal/build/configure-build.mjs.map +0 -1
  14. package/dist/internal/build/injected.d.mts +0 -12
  15. package/dist/internal/build/injected.d.mts.map +0 -1
  16. package/dist/internal/build/injected.mjs +0 -9
  17. package/dist/internal/build/injected.mjs.map +0 -1
  18. package/dist/internal/build/release/destinations/vercel.d.mts +0 -6
  19. package/dist/internal/build/release/destinations/vercel.d.mts.map +0 -1
  20. package/dist/internal/build/release/destinations/vercel.mjs +0 -25
  21. package/dist/internal/build/release/destinations/vercel.mjs.map +0 -1
  22. package/dist/internal/build/release/git.d.mts +0 -4
  23. package/dist/internal/build/release/git.d.mts.map +0 -1
  24. package/dist/internal/build/release/git.mjs +0 -21
  25. package/dist/internal/build/release/git.mjs.map +0 -1
  26. package/dist/internal/build/release/index.d.mts +0 -7
  27. package/dist/internal/build/release/index.d.mts.map +0 -1
  28. package/dist/internal/build/release/index.mjs +0 -24
  29. package/dist/internal/build/release/index.mjs.map +0 -1
  30. package/dist/internal/build/release/sources/github.d.mts +0 -6
  31. package/dist/internal/build/release/sources/github.d.mts.map +0 -1
  32. package/dist/internal/build/release/sources/github.mjs +0 -15
  33. package/dist/internal/build/release/sources/github.mjs.map +0 -1
  34. package/dist/internal/build/release/types.d.mts +0 -11
  35. package/dist/internal/build/release/types.d.mts.map +0 -1
  36. package/dist/internal/build/release/types.mjs +0 -1
  37. package/dist/internal/build/source-maps/discover.d.mts +0 -14
  38. package/dist/internal/build/source-maps/discover.d.mts.map +0 -1
  39. package/dist/internal/build/source-maps/discover.mjs +0 -61
  40. package/dist/internal/build/source-maps/discover.mjs.map +0 -1
  41. package/dist/internal/build/source-maps/index.d.mts +0 -23
  42. package/dist/internal/build/source-maps/index.d.mts.map +0 -1
  43. package/dist/internal/build/source-maps/index.mjs +0 -33
  44. package/dist/internal/build/source-maps/index.mjs.map +0 -1
  45. package/dist/internal/build/value-injection-loader.d.mts +0 -10
  46. package/dist/internal/build/value-injection-loader.d.mts.map +0 -1
  47. package/dist/internal/build/value-injection-loader.mjs +0 -24
  48. package/dist/internal/build/value-injection-loader.mjs.map +0 -1
  49. package/dist/internal/env.d.mts +0 -16
  50. package/dist/internal/env.d.mts.map +0 -1
  51. package/dist/internal/env.mjs +0 -19
  52. package/dist/internal/env.mjs.map +0 -1
  53. package/dist/internal/logger.d.mts +0 -8
  54. package/dist/internal/logger.d.mts.map +0 -1
  55. package/dist/internal/logger.mjs +0 -44
  56. package/dist/internal/logger.mjs.map +0 -1
  57. package/dist/internal/route/cors.d.mts +0 -4
  58. package/dist/internal/route/cors.d.mts.map +0 -1
  59. package/dist/internal/route/cors.mjs +0 -15
  60. package/dist/internal/route/cors.mjs.map +0 -1
  61. package/dist/internal/route/handle-get.d.mts +0 -4
  62. package/dist/internal/route/handle-get.d.mts.map +0 -1
  63. package/dist/internal/route/handle-get.mjs +0 -15
  64. package/dist/internal/route/handle-get.mjs.map +0 -1
  65. package/dist/internal/route/handle-post.d.mts +0 -4
  66. package/dist/internal/route/handle-post.d.mts.map +0 -1
  67. package/dist/internal/route/handle-post.mjs +0 -105
  68. package/dist/internal/route/handle-post.mjs.map +0 -1
  69. package/dist/internal/route/sw-script.d.mts +0 -4
  70. package/dist/internal/route/sw-script.d.mts.map +0 -1
  71. package/dist/internal/route/sw-script.mjs +0 -32
  72. package/dist/internal/route/sw-script.mjs.map +0 -1
  73. package/dist/internal/server/capture.d.mts +0 -9
  74. package/dist/internal/server/capture.d.mts.map +0 -1
  75. package/dist/internal/server/capture.mjs +0 -46
  76. package/dist/internal/server/capture.mjs.map +0 -1
  77. package/dist/internal/server/dedupe.d.mts +0 -5
  78. package/dist/internal/server/dedupe.d.mts.map +0 -1
  79. package/dist/internal/server/dedupe.mjs +0 -11
  80. package/dist/internal/server/dedupe.mjs.map +0 -1
  81. package/dist/internal/server/envelope.d.mts +0 -14
  82. package/dist/internal/server/envelope.d.mts.map +0 -1
  83. package/dist/internal/server/envelope.mjs +0 -41
  84. package/dist/internal/server/envelope.mjs.map +0 -1
  85. package/dist/internal/server/mechanisms.d.mts +0 -7
  86. package/dist/internal/server/mechanisms.d.mts.map +0 -1
  87. package/dist/internal/server/mechanisms.mjs +0 -12
  88. package/dist/internal/server/mechanisms.mjs.map +0 -1
  89. package/dist/internal/server/normalize-request.d.mts +0 -7
  90. package/dist/internal/server/normalize-request.d.mts.map +0 -1
  91. package/dist/internal/server/normalize-request.mjs +0 -50
  92. package/dist/internal/server/normalize-request.mjs.map +0 -1
  93. package/dist/internal/server/runtime.d.mts +0 -14
  94. package/dist/internal/server/runtime.d.mts.map +0 -1
  95. package/dist/internal/server/runtime.mjs +0 -18
  96. package/dist/internal/server/runtime.mjs.map +0 -1
  97. package/dist/internal/server/session.d.mts +0 -11
  98. package/dist/internal/server/session.d.mts.map +0 -1
  99. package/dist/internal/server/session.mjs +0 -15
  100. package/dist/internal/server/session.mjs.map +0 -1
  101. package/dist/internal/server/transport.d.mts +0 -12
  102. package/dist/internal/server/transport.d.mts.map +0 -1
  103. package/dist/internal/server/transport.mjs +0 -17
  104. package/dist/internal/server/transport.mjs.map +0 -1
  105. package/dist/internal/server/types.d.mts +0 -17
  106. package/dist/internal/server/types.d.mts.map +0 -1
  107. package/dist/internal/server/types.mjs +0 -1
  108. package/dist/provider.d.mts +0 -2
  109. package/dist/provider.mjs +0 -3
  110. package/dist/route-handler.d.mts +0 -7
  111. package/dist/route-handler.d.mts.map +0 -1
  112. package/dist/route-handler.mjs +0 -18
  113. package/dist/route-handler.mjs.map +0 -1
  114. package/dist/server.d.mts +0 -8
  115. package/dist/server.d.mts.map +0 -1
  116. package/dist/server.mjs +0 -6
  117. package/dist/server.mjs.map +0 -1
package/README.md CHANGED
@@ -97,6 +97,125 @@ export default function RootLayout({
97
97
  | --- | --- | --- |
98
98
  | `INTERFERE_API_KEY` | Yes | Your project API key |
99
99
 
100
+ ## Identity Management
101
+
102
+ Link sessions to your authenticated users with `identity.set()`:
103
+
104
+ ```tsx
105
+ import { useInterfere } from "@interfere/next/provider";
106
+
107
+ function OnLogin({ user }: { user: { id: string; name: string; email: string } }) {
108
+ const { identity } = useInterfere();
109
+
110
+ useEffect(() => {
111
+ identity.set({
112
+ identifier: user.id,
113
+ name: user.name,
114
+ email: user.email,
115
+ });
116
+ }, [user.id]);
117
+ }
118
+ ```
119
+
120
+ ### Parameters
121
+
122
+ | Field | Required | Description |
123
+ | --- | --- | --- |
124
+ | `identifier` | Yes | Unique user ID (your internal ID, not email) |
125
+ | `name` | No | Display name |
126
+ | `email` | No | Email address |
127
+ | `avatar` | No | Avatar URL |
128
+ | `traits` | No | Arbitrary key-value metadata (`Record<string, unknown>`) |
129
+
130
+ ### API
131
+
132
+ | Method | Description |
133
+ | --- | --- |
134
+ | `identity.set(params)` | Link the current session to a user. Deduplicated per session — only the first call sends a request. |
135
+ | `identity.get()` | Returns the current `IdentifyParams`, or `null` if no identity has been set. |
136
+
137
+ Identity is automatically cleared when the SDK is closed or the session rotates.
138
+
139
+ ## Consent Management
140
+
141
+ By default, all SDK features are active. To gate features behind user consent, pass a `consent` prop to the provider:
142
+
143
+ ```tsx
144
+ // app/layout.tsx
145
+ import { InterfereProvider } from "@interfere/next/provider";
146
+
147
+ export default function RootLayout({
148
+ children,
149
+ }: {
150
+ children: React.ReactNode;
151
+ }) {
152
+ return (
153
+ <html lang="en">
154
+ <body>
155
+ <InterfereProvider consent={{ analytics: true, replay: false }}>
156
+ {children}
157
+ </InterfereProvider>
158
+ </body>
159
+ </html>
160
+ );
161
+ }
162
+ ```
163
+
164
+ ### Consent categories
165
+
166
+ | Category | Plugins | Gated? |
167
+ | --- | --- | --- |
168
+ | `necessary` | Error tracking | Always on |
169
+ | `analytics` | Page events, rage clicks, fingerprint | Yes |
170
+ | `replay` | Session replay | Yes |
171
+
172
+ Omitting the `consent` prop disables gating entirely (all features load). Passing it enables gating — only `necessary` plugins plus explicitly consented categories will activate.
173
+
174
+ ### Imperative API
175
+
176
+ Use `consent.set()` and `consent.get()` from the `useInterfere` hook:
177
+
178
+ ```tsx
179
+ const { consent } = useInterfere();
180
+
181
+ consent.set({ analytics: true, replay: true }); // selective
182
+ consent.set(); // grant all
183
+ consent.get(); // current state, or null if no gating
184
+ ```
185
+
186
+ ### Integration with consent libraries
187
+
188
+ Works with any consent management platform — c15t, CookieYes, OneTrust, etc.:
189
+
190
+ ```tsx
191
+ import { InterfereProvider } from "@interfere/next/provider";
192
+
193
+ function Layout({ children }: { children: React.ReactNode }) {
194
+ const { has } = useConsentManager(); // from your CMP
195
+
196
+ return (
197
+ <InterfereProvider
198
+ consent={{ analytics: has("measurement"), replay: has("experience") }}
199
+ >
200
+ {children}
201
+ </InterfereProvider>
202
+ );
203
+ }
204
+ ```
205
+
206
+ ### Initial consent via bootstrap
207
+
208
+ To set consent before React renders (avoiding any window where non-consented plugins might load), pass it to `init()`:
209
+
210
+ ```ts
211
+ // instrumentation-client.ts
212
+ import { init } from "@interfere/next/instrument-client";
213
+
214
+ init({ consent: { analytics: false, replay: false } });
215
+ ```
216
+
217
+ The provider's `consent` prop will then keep it in sync as the user updates their preferences.
218
+
100
219
  ## What's Included
101
220
 
102
221
  - **Error tracking** — automatic capture of server and client errors with rich stack traces
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@interfere/next",
3
- "version": "0.2.0-alpha.6",
3
+ "version": "0.2.0-alpha.9",
4
4
  "license": "MIT",
5
- "description": "Next.js SDK v2 for Interfere.",
5
+ "description": "Build software that never breaks.",
6
6
  "keywords": [
7
7
  "observability",
8
8
  "typescript",
@@ -64,13 +64,13 @@
64
64
  "test": "bun run test:unit && bun run test:browser"
65
65
  },
66
66
  "dependencies": {
67
- "@interfere/constants": "0.2.0-alpha.2",
68
- "@interfere/react": "0.2.0-alpha.2",
69
- "@interfere/sdk": "0.2.0-alpha.3",
70
- "@interfere/types": "0.2.0-alpha.2",
71
- "chalk": "^5.6.2",
72
- "glob": "^13.0.6",
73
- "uuid": "^13.0.0"
67
+ "@interfere/constants": "workspace:*",
68
+ "@interfere/react": "workspace:*",
69
+ "@interfere/sdk": "workspace:*",
70
+ "@interfere/types": "workspace:*",
71
+ "chalk": "catalog:",
72
+ "glob": "catalog:",
73
+ "uuid": "catalog:"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "@vercel/blob": "^2",
@@ -79,24 +79,24 @@
79
79
  "react-dom": ">=19"
80
80
  },
81
81
  "devDependencies": {
82
- "@interfere/typescript-config": "1.1.0-alpha.4",
83
- "@interfere/vitest-config": "1.1.0-alpha.4",
84
- "@testing-library/react": "^16.3.2",
85
- "@types/node": "^24.12.0",
86
- "@types/react": "19.2.14",
87
- "@types/react-dom": "19.2.3",
88
- "@vitejs/plugin-react": "^5.1.4",
89
- "@vitest/browser": "4.0.18",
90
- "@vitest/browser-playwright": "4.0.18",
91
- "@vitest/coverage-v8": "^4.0.18",
92
- "jsdom": "^28.0.0",
93
- "next": "^16.1.6",
94
- "playwright": "^1.56.1",
95
- "react": "^19.2.4",
96
- "react-dom": "^19.2.4",
97
- "tsdown": "0.21.2",
98
- "typescript": "5.9.3",
99
- "vitest": "^4.0.18",
100
- "webpack": "^5.105.1"
82
+ "@interfere/typescript-config": "workspace:*",
83
+ "@interfere/vitest-config": "workspace:*",
84
+ "@testing-library/react": "catalog:",
85
+ "@types/node": "catalog:",
86
+ "@types/react": "catalog:",
87
+ "@types/react-dom": "catalog:",
88
+ "@vitejs/plugin-react": "catalog:",
89
+ "@vitest/browser": "catalog:",
90
+ "@vitest/browser-playwright": "catalog:",
91
+ "@vitest/coverage-v8": "catalog:",
92
+ "jsdom": "catalog:",
93
+ "next": "catalog:",
94
+ "playwright": "catalog:",
95
+ "react": "catalog:",
96
+ "react-dom": "catalog:",
97
+ "tsdown": "catalog:",
98
+ "typescript": "catalog:",
99
+ "vitest": "catalog:",
100
+ "webpack": "catalog:"
101
101
  }
102
102
  }
@@ -1,13 +0,0 @@
1
- //#region \0rolldown/runtime.js
2
- var __defProp = Object.defineProperty;
3
- var __exportAll = (all, no_symbols) => {
4
- let target = {};
5
- for (var name in all) __defProp(target, name, {
6
- get: all[name],
7
- enumerable: true
8
- });
9
- if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
- return target;
11
- };
12
- //#endregion
13
- export { __exportAll };
package/dist/config.d.mts DELETED
@@ -1,11 +0,0 @@
1
- import { Envelope } from "@interfere/types/sdk/envelope";
2
- import { NextConfig } from "next";
3
-
4
- //#region src/config.d.ts
5
- interface InterfereConfig extends Partial<Pick<Envelope, "buildId" | "releaseId">> {}
6
- type NextConfigWithInterfere = NextConfig & {
7
- interfere?: InterfereConfig;
8
- };
9
- declare function withInterfere(nextConfig?: NextConfigWithInterfere): NextConfig;
10
- //#endregion
11
- export { InterfereConfig, NextConfigWithInterfere, withInterfere };
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;;UAeiB,eAAA,SACP,OAAA,CAAQ,IAAA,CAAK,QAAA;AAAA,KAEX,uBAAA,GAA0B,UAAA;EACpC,SAAA,GAAY,eAAA;AAAA;AAAA,iBAUE,aAAA,CACd,UAAA,GAAY,uBAAA,GACX,UAAA"}
package/dist/config.mjs DELETED
@@ -1,107 +0,0 @@
1
- import { configureBuild } from "./internal/build/configure-build.mjs";
2
- import { buildInjectedValues } from "./internal/build/injected.mjs";
3
- import { log } from "./internal/logger.mjs";
4
- import { runGitCommand } from "./internal/build/release/git.mjs";
5
- import { readInterfereEnv } from "./internal/env.mjs";
6
- import { releaseDestinationIdEnvKeys, releaseSourceIdEnvKeys } from "@interfere/types/integrations";
7
- import { parseEnvValue, readFirstEnvValue } from "@interfere/types/sdk/env";
8
- //#region src/config.ts
9
- function withInterfere(nextConfig = {}) {
10
- const { interfere, env: userEnv, webpack, turbopack, compiler, productionBrowserSourceMaps, ...rest } = nextConfig;
11
- const config = resolveBuildConfig(interfere);
12
- const build = configureBuild({
13
- existingWebpack: webpack,
14
- existingTurbopack: turbopack,
15
- projectDir: process.cwd(),
16
- values: buildInjectedValues(config)
17
- });
18
- if (config.apiKey !== null && !build.webpack && !build.turbopack) throw new Error("[Interfere] INTERFERE_API_KEY is set but no instrumentation-client file was found. Create an instrumentation-client.ts file in your project root or src/ directory. See: https://interfere.com/docs/nextjs/setup");
19
- const existingHook = compiler?.runAfterProductionCompile;
20
- return {
21
- ...rest,
22
- env: mergeEnvConfig(userEnv, config),
23
- compiler: {
24
- ...compiler ?? {},
25
- async runAfterProductionCompile(context) {
26
- if (existingHook) await existingHook(context);
27
- await runBuildReleasePipeline(context, config);
28
- }
29
- },
30
- webpack: build.webpack,
31
- turbopack: build.turbopack,
32
- productionBrowserSourceMaps: config.apiKey !== null ? true : productionBrowserSourceMaps
33
- };
34
- }
35
- function resolveBuildConfig(interfere) {
36
- const { apiKey, apiUrl } = readInterfereEnv();
37
- const buildId = parseEnvValue(interfere?.buildId) ?? readFirstEnvValue(process.env, releaseSourceIdEnvKeys) ?? runGitCommand("git rev-parse HEAD");
38
- return {
39
- apiKey,
40
- apiUrl,
41
- buildId,
42
- releaseId: parseEnvValue(interfere?.releaseId) ?? readFirstEnvValue(process.env, releaseDestinationIdEnvKeys) ?? buildId
43
- };
44
- }
45
- function mergeEnvConfig(userEnv, config) {
46
- const merged = {};
47
- if (config.buildId !== null) merged.NEXT_PUBLIC_INTERFERE_BUILD_ID = config.buildId;
48
- if (config.releaseId !== null) merged.NEXT_PUBLIC_INTERFERE_RELEASE_ID = config.releaseId;
49
- return {
50
- ...merged,
51
- ...userEnv
52
- };
53
- }
54
- async function runBuildReleasePipeline(context, config) {
55
- const { apiKey, apiUrl, buildId } = config;
56
- if (apiKey === null) throw new Error("[Interfere] INTERFERE_API_KEY is not set. withInterfere() requires an API key to upload source maps during production builds. Set the INTERFERE_API_KEY environment variable, or remove withInterfere() from your Next.js config. See: https://interfere.com/docs/nextjs/setup");
57
- if (buildId === null) {
58
- log.error("Build ID missing", [
59
- "Could not resolve a build ID from config, environment variables, or git.",
60
- "Source maps will not be uploaded and errors will have unresolved stack traces.",
61
- "Set INTERFERE_BUILD_ID, or ensure git is available in your build environment."
62
- ]);
63
- return;
64
- }
65
- const { createRelease } = await import("./internal/build/release/index.mjs");
66
- const { runSourceMapPipeline } = await import("./internal/build/source-maps/index.mjs");
67
- const client = {
68
- async createRelease() {
69
- const release = await createRelease(apiKey, apiUrl, buildId);
70
- return {
71
- slug: release.destination.slug,
72
- orgSlug: release.org.slug,
73
- buildId: release.build.hash ?? buildId
74
- };
75
- },
76
- async uploadSourceMaps(releaseSlug, body) {
77
- const url = `${apiUrl}/v1/releases/${releaseSlug}/source-maps`;
78
- const response = await fetch(url, {
79
- method: "POST",
80
- headers: { "x-api-key": apiKey },
81
- body
82
- });
83
- if (!response.ok) {
84
- const text = await response.text().catch(() => "");
85
- throw new Error(`Source map upload failed: ${response.status} ${response.statusText} ${text}`);
86
- }
87
- }
88
- };
89
- try {
90
- const result = await runSourceMapPipeline(context.projectDir, context.distDir, client);
91
- if (!result.ready) {
92
- log.warn("Skipping", ["No source maps found"]);
93
- return;
94
- }
95
- log.info("Completed", [
96
- `https://interfere.com/~/${result.orgSlug}`,
97
- `Release: ${result.releaseSlug}`,
98
- `Build: ${result.buildId}`,
99
- `Artifacts: ${result.fileCount} source maps`
100
- ]);
101
- } catch (error) {
102
- log.error("Error", [error instanceof Error ? error.message : String(error)]);
103
- throw error;
104
- }
105
- }
106
- //#endregion
107
- export { withInterfere };
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import {\n releaseDestinationIdEnvKeys,\n releaseSourceIdEnvKeys,\n} from \"@interfere/types/integrations\";\nimport { parseEnvValue, readFirstEnvValue } from \"@interfere/types/sdk/env\";\nimport type { Envelope } from \"@interfere/types/sdk/envelope\";\n\nimport type { NextConfig } from \"next\";\n\nimport { configureBuild } from \"./internal/build/configure-build.js\";\nimport { buildInjectedValues } from \"./internal/build/injected.js\";\nimport { runGitCommand } from \"./internal/build/release/git.js\";\nimport { readInterfereEnv } from \"./internal/env.js\";\nimport { log } from \"./internal/logger.js\";\n\nexport interface InterfereConfig\n extends Partial<Pick<Envelope, \"buildId\" | \"releaseId\">> {}\n\nexport type NextConfigWithInterfere = NextConfig & {\n interfere?: InterfereConfig;\n};\n\ninterface ResolvedBuildConfig {\n readonly apiKey: string | null;\n readonly apiUrl: string;\n readonly buildId: string | null;\n readonly releaseId: string | null;\n}\n\nexport function withInterfere(\n nextConfig: NextConfigWithInterfere = {}\n): NextConfig {\n const {\n interfere,\n env: userEnv,\n webpack,\n turbopack,\n compiler,\n productionBrowserSourceMaps,\n ...rest\n } = nextConfig;\n\n const config = resolveBuildConfig(interfere);\n const build = configureBuild({\n existingWebpack: webpack,\n existingTurbopack: turbopack,\n projectDir: process.cwd(),\n values: buildInjectedValues(config),\n });\n\n if (config.apiKey !== null && !build.webpack && !build.turbopack) {\n throw new Error(\n \"[Interfere] INTERFERE_API_KEY is set but no instrumentation-client file was found. \" +\n \"Create an instrumentation-client.ts file in your project root or src/ directory. \" +\n \"See: https://interfere.com/docs/nextjs/setup\"\n );\n }\n\n const existingHook = (compiler as NextCompilerWithProductionHook | undefined)\n ?.runAfterProductionCompile;\n\n return {\n ...rest,\n env: mergeEnvConfig(userEnv, config),\n compiler: {\n ...(compiler ?? {}),\n async runAfterProductionCompile(context: ProductionCompileContext) {\n if (existingHook) {\n await existingHook(context);\n }\n\n await runBuildReleasePipeline(context, config);\n },\n } as NextConfig[\"compiler\"],\n webpack: build.webpack,\n turbopack: build.turbopack,\n productionBrowserSourceMaps:\n config.apiKey !== null ? true : productionBrowserSourceMaps,\n };\n}\n\nfunction resolveBuildConfig(interfere?: InterfereConfig): ResolvedBuildConfig {\n const { apiKey, apiUrl } = readInterfereEnv();\n\n const buildId =\n parseEnvValue(interfere?.buildId) ??\n readFirstEnvValue(process.env, releaseSourceIdEnvKeys) ??\n runGitCommand(\"git rev-parse HEAD\");\n const releaseId =\n parseEnvValue(interfere?.releaseId) ??\n readFirstEnvValue(process.env, releaseDestinationIdEnvKeys) ??\n buildId;\n\n return { apiKey, apiUrl, buildId, releaseId };\n}\n\nfunction mergeEnvConfig(\n userEnv: NextConfig[\"env\"] | undefined,\n config: ResolvedBuildConfig\n): NextConfig[\"env\"] {\n const merged: Record<string, string> = {};\n\n if (config.buildId !== null) {\n merged.NEXT_PUBLIC_INTERFERE_BUILD_ID = config.buildId;\n }\n\n if (config.releaseId !== null) {\n merged.NEXT_PUBLIC_INTERFERE_RELEASE_ID = config.releaseId;\n }\n\n return { ...merged, ...userEnv };\n}\n\ninterface ProductionCompileContext {\n readonly distDir: string;\n readonly projectDir: string;\n}\n\ntype NextCompilerWithProductionHook = NonNullable<NextConfig[\"compiler\"]> & {\n runAfterProductionCompile?: (\n context: ProductionCompileContext\n ) => void | Promise<void>;\n};\n\nasync function runBuildReleasePipeline(\n context: ProductionCompileContext,\n config: ResolvedBuildConfig\n): Promise<void> {\n const { apiKey, apiUrl, buildId } = config;\n\n if (apiKey === null) {\n throw new Error(\n \"[Interfere] INTERFERE_API_KEY is not set. \" +\n \"withInterfere() requires an API key to upload source maps during production builds. \" +\n \"Set the INTERFERE_API_KEY environment variable, or remove withInterfere() from your Next.js config. \" +\n \"See: https://interfere.com/docs/nextjs/setup\"\n );\n }\n\n if (buildId === null) {\n log.error(\"Build ID missing\", [\n \"Could not resolve a build ID from config, environment variables, or git.\",\n \"Source maps will not be uploaded and errors will have unresolved stack traces.\",\n \"Set INTERFERE_BUILD_ID, or ensure git is available in your build environment.\",\n ]);\n return;\n }\n\n const { createRelease } = await import(\"./internal/build/release/index.js\");\n const { runSourceMapPipeline } = await import(\n \"./internal/build/source-maps/index.js\"\n );\n\n const client: import(\"./internal/build/source-maps/index.js\").BuildClient = {\n async createRelease() {\n const release = await createRelease(apiKey, apiUrl, buildId);\n return {\n slug: release.destination.slug,\n orgSlug: release.org.slug,\n buildId: release.build.hash ?? buildId,\n };\n },\n async uploadSourceMaps(releaseSlug, body) {\n const url = `${apiUrl}/v1/releases/${releaseSlug}/source-maps`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"x-api-key\": apiKey },\n body,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(\n `Source map upload failed: ${response.status} ${response.statusText} ${text}`\n );\n }\n },\n };\n\n try {\n const result = await runSourceMapPipeline(\n context.projectDir,\n context.distDir,\n client\n );\n\n if (!result.ready) {\n log.warn(\"Skipping\", [\"No source maps found\"]);\n return;\n }\n\n log.info(\"Completed\", [\n `https://interfere.com/~/${result.orgSlug}`,\n `Release: ${result.releaseSlug}`,\n `Build: ${result.buildId}`,\n `Artifacts: ${result.fileCount} source maps`,\n ]);\n } catch (error) {\n log.error(\"Error\", [\n error instanceof Error ? error.message : String(error),\n ]);\n throw error;\n }\n}\n"],"mappings":";;;;;;;;AA6BA,SAAgB,cACd,aAAsC,EAAE,EAC5B;CACZ,MAAM,EACJ,WACA,KAAK,SACL,SACA,WACA,UACA,6BACA,GAAG,SACD;CAEJ,MAAM,SAAS,mBAAmB,UAAU;CAC5C,MAAM,QAAQ,eAAe;EAC3B,iBAAiB;EACjB,mBAAmB;EACnB,YAAY,QAAQ,KAAK;EACzB,QAAQ,oBAAoB,OAAO;EACpC,CAAC;AAEF,KAAI,OAAO,WAAW,QAAQ,CAAC,MAAM,WAAW,CAAC,MAAM,UACrD,OAAM,IAAI,MACR,mNAGD;CAGH,MAAM,eAAgB,UAClB;AAEJ,QAAO;EACL,GAAG;EACH,KAAK,eAAe,SAAS,OAAO;EACpC,UAAU;GACR,GAAI,YAAY,EAAE;GAClB,MAAM,0BAA0B,SAAmC;AACjE,QAAI,aACF,OAAM,aAAa,QAAQ;AAG7B,UAAM,wBAAwB,SAAS,OAAO;;GAEjD;EACD,SAAS,MAAM;EACf,WAAW,MAAM;EACjB,6BACE,OAAO,WAAW,OAAO,OAAO;EACnC;;AAGH,SAAS,mBAAmB,WAAkD;CAC5E,MAAM,EAAE,QAAQ,WAAW,kBAAkB;CAE7C,MAAM,UACJ,cAAc,WAAW,QAAQ,IACjC,kBAAkB,QAAQ,KAAK,uBAAuB,IACtD,cAAc,qBAAqB;AAMrC,QAAO;EAAE;EAAQ;EAAQ;EAAS,WAJhC,cAAc,WAAW,UAAU,IACnC,kBAAkB,QAAQ,KAAK,4BAA4B,IAC3D;EAE2C;;AAG/C,SAAS,eACP,SACA,QACmB;CACnB,MAAM,SAAiC,EAAE;AAEzC,KAAI,OAAO,YAAY,KACrB,QAAO,iCAAiC,OAAO;AAGjD,KAAI,OAAO,cAAc,KACvB,QAAO,mCAAmC,OAAO;AAGnD,QAAO;EAAE,GAAG;EAAQ,GAAG;EAAS;;AAclC,eAAe,wBACb,SACA,QACe;CACf,MAAM,EAAE,QAAQ,QAAQ,YAAY;AAEpC,KAAI,WAAW,KACb,OAAM,IAAI,MACR,iRAID;AAGH,KAAI,YAAY,MAAM;AACpB,MAAI,MAAM,oBAAoB;GAC5B;GACA;GACA;GACD,CAAC;AACF;;CAGF,MAAM,EAAE,kBAAkB,MAAM,OAAO;CACvC,MAAM,EAAE,yBAAyB,MAAM,OACrC;CAGF,MAAM,SAAsE;EAC1E,MAAM,gBAAgB;GACpB,MAAM,UAAU,MAAM,cAAc,QAAQ,QAAQ,QAAQ;AAC5D,UAAO;IACL,MAAM,QAAQ,YAAY;IAC1B,SAAS,QAAQ,IAAI;IACrB,SAAS,QAAQ,MAAM,QAAQ;IAChC;;EAEH,MAAM,iBAAiB,aAAa,MAAM;GACxC,MAAM,MAAM,GAAG,OAAO,eAAe,YAAY;GACjD,MAAM,WAAW,MAAM,MAAM,KAAK;IAChC,QAAQ;IACR,SAAS,EAAE,aAAa,QAAQ;IAChC;IACD,CAAC;AAEF,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,GAAG;AAClD,UAAM,IAAI,MACR,6BAA6B,SAAS,OAAO,GAAG,SAAS,WAAW,GAAG,OACxE;;;EAGN;AAED,KAAI;EACF,MAAM,SAAS,MAAM,qBACnB,QAAQ,YACR,QAAQ,SACR,OACD;AAED,MAAI,CAAC,OAAO,OAAO;AACjB,OAAI,KAAK,YAAY,CAAC,uBAAuB,CAAC;AAC9C;;AAGF,MAAI,KAAK,aAAa;GACpB,2BAA2B,OAAO;GAClC,YAAY,OAAO;GACnB,UAAU,OAAO;GACjB,cAAc,OAAO,UAAU;GAChC,CAAC;UACK,OAAO;AACd,MAAI,MAAM,SAAS,CACjB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD,CAAC;AACF,QAAM"}
@@ -1,2 +0,0 @@
1
- import { init } from "@interfere/react/internal/client";
2
- export { init };
@@ -1,2 +0,0 @@
1
- import { init } from "@interfere/react/internal/client";
2
- export { init };
@@ -1,22 +0,0 @@
1
- import { InterfereInjectedValues } from "./injected.mjs";
2
- import { NextConfig } from "next";
3
-
4
- //#region src/internal/build/configure-build.d.ts
5
- interface ConfigureBuildInput {
6
- readonly existingWebpack: NextConfig["webpack"] | undefined;
7
- readonly existingTurbopack: NextConfig["turbopack"] | undefined;
8
- readonly projectDir: string;
9
- readonly values: InterfereInjectedValues;
10
- }
11
- interface ConfigureBuildOutput {
12
- readonly webpack: NextConfig["webpack"] | undefined;
13
- readonly turbopack: NextConfig["turbopack"] | undefined;
14
- }
15
- declare function configureBuild({
16
- existingWebpack,
17
- existingTurbopack,
18
- projectDir,
19
- values
20
- }: ConfigureBuildInput): ConfigureBuildOutput;
21
- //#endregion
22
- export { configureBuild };
@@ -1 +0,0 @@
1
- {"version":3,"file":"configure-build.d.mts","names":[],"sources":["../../../src/internal/build/configure-build.ts"],"mappings":";;;;UAyBU,mBAAA;EAAA,SACC,eAAA,EAAiB,UAAA;EAAA,SACjB,iBAAA,EAAmB,UAAA;EAAA,SACnB,UAAA;EAAA,SACA,MAAA,EAAQ,uBAAA;AAAA;AAAA,UAGT,oBAAA;EAAA,SACC,OAAA,EAAS,UAAA;EAAA,SACT,SAAA,EAAW,UAAA;AAAA;AAAA,iBAGN,cAAA,CAAA;EACd,eAAA;EACA,iBAAA;EACA,UAAA;EACA;AAAA,GACC,mBAAA,GAAsB,oBAAA"}
@@ -1,87 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { basename, dirname, join, normalize, resolve } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- //#region src/internal/build/configure-build.ts
5
- const INSTRUMENTATION_CLIENT_FILES = [
6
- "instrumentation-client.ts",
7
- "instrumentation-client.tsx",
8
- "instrumentation-client.js",
9
- "instrumentation-client.jsx",
10
- "src/instrumentation-client.ts",
11
- "src/instrumentation-client.tsx",
12
- "src/instrumentation-client.js",
13
- "src/instrumentation-client.jsx"
14
- ];
15
- const LOADER_FILE_CANDIDATES = [
16
- "value-injection-loader.ts",
17
- "value-injection-loader.js",
18
- "value-injection-loader.mjs",
19
- "value-injection-loader.cjs"
20
- ];
21
- function configureBuild({ existingWebpack, existingTurbopack, projectDir, values }) {
22
- const instrumentationClientPath = resolveInstrumentationClientPath(projectDir);
23
- return {
24
- webpack: buildWebpackHook(existingWebpack, instrumentationClientPath, values),
25
- turbopack: buildTurbopackConfig(existingTurbopack, instrumentationClientPath, values)
26
- };
27
- }
28
- function hasInjectedMetadata(metadata) {
29
- return metadata.__INTERFERE_BUILD_ID__ !== null || metadata.__INTERFERE_RELEASE_ID__ !== null;
30
- }
31
- function buildWebpackHook(existingWebpack, instrumentationClientPath, values) {
32
- if (!(instrumentationClientPath && hasInjectedMetadata(values))) return existingWebpack;
33
- const normalizedPath = normalize(instrumentationClientPath);
34
- const loaderPath = resolveLoaderPath();
35
- return (webpackConfig, options) => {
36
- const outputConfig = existingWebpack ? existingWebpack(webpackConfig, options) : webpackConfig;
37
- const mutableConfig = outputConfig;
38
- const injectionRule = {
39
- test: (resource) => Boolean(resource) && normalize(resource) === normalizedPath,
40
- use: [{
41
- loader: loaderPath,
42
- options: { values }
43
- }]
44
- };
45
- mutableConfig.module ??= {};
46
- mutableConfig.module.rules ??= [];
47
- mutableConfig.module.rules.push(injectionRule);
48
- return outputConfig;
49
- };
50
- }
51
- function buildTurbopackConfig(existingTurbopack, instrumentationClientPath, values) {
52
- if (!(instrumentationClientPath && hasInjectedMetadata(values))) return existingTurbopack;
53
- const baseConfig = existingTurbopack ?? {};
54
- const ruleKey = `**/${basename(instrumentationClientPath)}`;
55
- const existingRule = baseConfig.rules?.[ruleKey] ?? {};
56
- const existingLoaders = Array.isArray(existingRule.loaders) ? existingRule.loaders : [];
57
- return {
58
- ...baseConfig,
59
- rules: {
60
- ...baseConfig.rules,
61
- [ruleKey]: {
62
- ...existingRule,
63
- loaders: [...existingLoaders, {
64
- loader: resolveLoaderPath(),
65
- options: { serializedValues: JSON.stringify(values) }
66
- }]
67
- }
68
- }
69
- };
70
- }
71
- function resolveInstrumentationClientPath(projectDir) {
72
- for (const candidate of INSTRUMENTATION_CLIENT_FILES) {
73
- const filePath = resolve(projectDir, candidate);
74
- if (existsSync(filePath)) return filePath;
75
- }
76
- return null;
77
- }
78
- function resolveLoaderPath() {
79
- const directory = resolve(dirname(fileURLToPath(import.meta.url)));
80
- for (const candidate of LOADER_FILE_CANDIDATES) {
81
- const filePath = join(directory, candidate);
82
- if (existsSync(filePath)) return filePath;
83
- }
84
- return join(directory, "value-injection-loader.js");
85
- }
86
- //#endregion
87
- export { configureBuild };
@@ -1 +0,0 @@
1
- {"version":3,"file":"configure-build.mjs","names":[],"sources":["../../../src/internal/build/configure-build.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { basename, dirname, join, normalize, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { NextConfig } from \"next\";\n\nimport type { InterfereInjectedValues } from \"./injected.js\";\n\nconst INSTRUMENTATION_CLIENT_FILES = [\n \"instrumentation-client.ts\",\n \"instrumentation-client.tsx\",\n \"instrumentation-client.js\",\n \"instrumentation-client.jsx\",\n \"src/instrumentation-client.ts\",\n \"src/instrumentation-client.tsx\",\n \"src/instrumentation-client.js\",\n \"src/instrumentation-client.jsx\",\n] as const;\n\nconst LOADER_FILE_CANDIDATES = [\n \"value-injection-loader.ts\",\n \"value-injection-loader.js\",\n \"value-injection-loader.mjs\",\n \"value-injection-loader.cjs\",\n] as const;\n\ninterface ConfigureBuildInput {\n readonly existingWebpack: NextConfig[\"webpack\"] | undefined;\n readonly existingTurbopack: NextConfig[\"turbopack\"] | undefined;\n readonly projectDir: string;\n readonly values: InterfereInjectedValues;\n}\n\ninterface ConfigureBuildOutput {\n readonly webpack: NextConfig[\"webpack\"] | undefined;\n readonly turbopack: NextConfig[\"turbopack\"] | undefined;\n}\n\nexport function configureBuild({\n existingWebpack,\n existingTurbopack,\n projectDir,\n values,\n}: ConfigureBuildInput): ConfigureBuildOutput {\n const instrumentationClientPath = resolveInstrumentationClientPath(projectDir);\n\n return {\n webpack: buildWebpackHook(existingWebpack, instrumentationClientPath, values),\n turbopack: buildTurbopackConfig(\n existingTurbopack,\n instrumentationClientPath,\n values\n ),\n };\n}\n\nfunction hasInjectedMetadata(metadata: InterfereInjectedValues): boolean {\n return (\n metadata.__INTERFERE_BUILD_ID__ !== null ||\n metadata.__INTERFERE_RELEASE_ID__ !== null\n );\n}\n\nfunction buildWebpackHook(\n existingWebpack: NextConfig[\"webpack\"] | undefined,\n instrumentationClientPath: string | null,\n values: InterfereInjectedValues\n): NextConfig[\"webpack\"] | undefined {\n if (!(instrumentationClientPath && hasInjectedMetadata(values))) {\n return existingWebpack;\n }\n\n const normalizedPath = normalize(instrumentationClientPath);\n const loaderPath = resolveLoaderPath();\n\n return (webpackConfig, options) => {\n const outputConfig = existingWebpack\n ? existingWebpack(webpackConfig, options)\n : webpackConfig;\n const mutableConfig = outputConfig as {\n module?: { rules?: unknown[] };\n };\n\n const injectionRule = {\n test: (resource: string): boolean =>\n Boolean(resource) && normalize(resource) === normalizedPath,\n use: [\n {\n loader: loaderPath,\n options: { values },\n },\n ],\n };\n\n mutableConfig.module ??= {};\n mutableConfig.module.rules ??= [];\n mutableConfig.module.rules.push(injectionRule);\n\n return outputConfig;\n };\n}\n\nfunction buildTurbopackConfig(\n existingTurbopack: NextConfig[\"turbopack\"] | undefined,\n instrumentationClientPath: string | null,\n values: InterfereInjectedValues\n): NextConfig[\"turbopack\"] | undefined {\n if (!(instrumentationClientPath && hasInjectedMetadata(values))) {\n return existingTurbopack;\n }\n\n const baseConfig = (existingTurbopack ?? {}) as {\n rules?: Record<string, unknown>;\n };\n const ruleKey = `**/${basename(instrumentationClientPath)}`;\n const existingRule = (baseConfig.rules?.[ruleKey] ?? {}) as {\n loaders?: unknown[];\n };\n const existingLoaders = Array.isArray(existingRule.loaders)\n ? existingRule.loaders\n : [];\n\n return {\n ...baseConfig,\n rules: {\n ...baseConfig.rules,\n [ruleKey]: {\n ...existingRule,\n loaders: [\n ...existingLoaders,\n {\n loader: resolveLoaderPath(),\n options: {\n serializedValues: JSON.stringify(values),\n },\n },\n ],\n },\n },\n } as NextConfig[\"turbopack\"];\n}\n\nfunction resolveInstrumentationClientPath(projectDir: string): string | null {\n for (const candidate of INSTRUMENTATION_CLIENT_FILES) {\n const filePath = resolve(projectDir, candidate);\n if (existsSync(filePath)) {\n return filePath;\n }\n }\n\n return null;\n}\n\nfunction resolveLoaderPath(): string {\n const directory = resolve(dirname(fileURLToPath(import.meta.url)));\n\n for (const candidate of LOADER_FILE_CANDIDATES) {\n const filePath = join(directory, candidate);\n if (existsSync(filePath)) {\n return filePath;\n }\n }\n\n return join(directory, \"value-injection-loader.js\");\n}\n"],"mappings":";;;;AAOA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACD;AAcD,SAAgB,eAAe,EAC7B,iBACA,mBACA,YACA,UAC4C;CAC5C,MAAM,4BAA4B,iCAAiC,WAAW;AAE9E,QAAO;EACL,SAAS,iBAAiB,iBAAiB,2BAA2B,OAAO;EAC7E,WAAW,qBACT,mBACA,2BACA,OACD;EACF;;AAGH,SAAS,oBAAoB,UAA4C;AACvE,QACE,SAAS,2BAA2B,QACpC,SAAS,6BAA6B;;AAI1C,SAAS,iBACP,iBACA,2BACA,QACmC;AACnC,KAAI,EAAE,6BAA6B,oBAAoB,OAAO,EAC5D,QAAO;CAGT,MAAM,iBAAiB,UAAU,0BAA0B;CAC3D,MAAM,aAAa,mBAAmB;AAEtC,SAAQ,eAAe,YAAY;EACjC,MAAM,eAAe,kBACjB,gBAAgB,eAAe,QAAQ,GACvC;EACJ,MAAM,gBAAgB;EAItB,MAAM,gBAAgB;GACpB,OAAO,aACL,QAAQ,SAAS,IAAI,UAAU,SAAS,KAAK;GAC/C,KAAK,CACH;IACE,QAAQ;IACR,SAAS,EAAE,QAAQ;IACpB,CACF;GACF;AAED,gBAAc,WAAW,EAAE;AAC3B,gBAAc,OAAO,UAAU,EAAE;AACjC,gBAAc,OAAO,MAAM,KAAK,cAAc;AAE9C,SAAO;;;AAIX,SAAS,qBACP,mBACA,2BACA,QACqC;AACrC,KAAI,EAAE,6BAA6B,oBAAoB,OAAO,EAC5D,QAAO;CAGT,MAAM,aAAc,qBAAqB,EAAE;CAG3C,MAAM,UAAU,MAAM,SAAS,0BAA0B;CACzD,MAAM,eAAgB,WAAW,QAAQ,YAAY,EAAE;CAGvD,MAAM,kBAAkB,MAAM,QAAQ,aAAa,QAAQ,GACvD,aAAa,UACb,EAAE;AAEN,QAAO;EACL,GAAG;EACH,OAAO;GACL,GAAG,WAAW;IACb,UAAU;IACT,GAAG;IACH,SAAS,CACP,GAAG,iBACH;KACE,QAAQ,mBAAmB;KAC3B,SAAS,EACP,kBAAkB,KAAK,UAAU,OAAO,EACzC;KACF,CACF;IACF;GACF;EACF;;AAGH,SAAS,iCAAiC,YAAmC;AAC3E,MAAK,MAAM,aAAa,8BAA8B;EACpD,MAAM,WAAW,QAAQ,YAAY,UAAU;AAC/C,MAAI,WAAW,SAAS,CACtB,QAAO;;AAIX,QAAO;;AAGT,SAAS,oBAA4B;CACnC,MAAM,YAAY,QAAQ,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC,CAAC;AAElE,MAAK,MAAM,aAAa,wBAAwB;EAC9C,MAAM,WAAW,KAAK,WAAW,UAAU;AAC3C,MAAI,WAAW,SAAS,CACtB,QAAO;;AAIX,QAAO,KAAK,WAAW,4BAA4B"}
@@ -1,12 +0,0 @@
1
- //#region src/internal/build/injected.d.ts
2
- interface InterfereBuildMetadata {
3
- readonly buildId: string | null;
4
- readonly releaseId: string | null;
5
- }
6
- interface InterfereInjectedValues {
7
- readonly __INTERFERE_BUILD_ID__: string | null;
8
- readonly __INTERFERE_RELEASE_ID__: string | null;
9
- }
10
- declare function buildInjectedValues(metadata: InterfereBuildMetadata): InterfereInjectedValues;
11
- //#endregion
12
- export { InterfereBuildMetadata, InterfereInjectedValues, buildInjectedValues };
@@ -1 +0,0 @@
1
- {"version":3,"file":"injected.d.mts","names":[],"sources":["../../../src/internal/build/injected.ts"],"mappings":";UAAiB,sBAAA;EAAA,SACN,OAAA;EAAA,SACA,SAAA;AAAA;AAAA,UAGM,uBAAA;EAAA,SACN,sBAAA;EAAA,SACA,wBAAA;AAAA;AAAA,iBAGK,mBAAA,CACd,QAAA,EAAU,sBAAA,GACT,uBAAA"}
@@ -1,9 +0,0 @@
1
- //#region src/internal/build/injected.ts
2
- function buildInjectedValues(metadata) {
3
- return {
4
- __INTERFERE_BUILD_ID__: metadata.buildId,
5
- __INTERFERE_RELEASE_ID__: metadata.releaseId
6
- };
7
- }
8
- //#endregion
9
- export { buildInjectedValues };
@@ -1 +0,0 @@
1
- {"version":3,"file":"injected.mjs","names":[],"sources":["../../../src/internal/build/injected.ts"],"sourcesContent":["export interface InterfereBuildMetadata {\n readonly buildId: string | null;\n readonly releaseId: string | null;\n}\n\nexport interface InterfereInjectedValues {\n readonly __INTERFERE_BUILD_ID__: string | null;\n readonly __INTERFERE_RELEASE_ID__: string | null;\n}\n\nexport function buildInjectedValues(\n metadata: InterfereBuildMetadata\n): InterfereInjectedValues {\n return {\n __INTERFERE_BUILD_ID__: metadata.buildId,\n __INTERFERE_RELEASE_ID__: metadata.releaseId,\n };\n}\n"],"mappings":";AAUA,SAAgB,oBACd,UACyB;AACzB,QAAO;EACL,wBAAwB,SAAS;EACjC,0BAA0B,SAAS;EACpC"}
@@ -1,6 +0,0 @@
1
- import { ReleaseDestinationMetadata } from "@interfere/types/integrations";
2
-
3
- //#region src/internal/build/release/destinations/vercel.d.ts
4
- declare function resolve(): ReleaseDestinationMetadata | null;
5
- //#endregion
6
- export { resolve };
@@ -1 +0,0 @@
1
- {"version":3,"file":"vercel.d.mts","names":[],"sources":["../../../../../src/internal/build/release/destinations/vercel.ts"],"mappings":";;;iBAGgB,OAAA,CAAA,GAAW,0BAAA"}
@@ -1,25 +0,0 @@
1
- import { __exportAll } from "../../../../_virtual/_rolldown/runtime.mjs";
2
- import { parseEnvValue } from "@interfere/types/sdk/env";
3
- //#region src/internal/build/release/destinations/vercel.ts
4
- var vercel_exports = /* @__PURE__ */ __exportAll({ resolve: () => resolve });
5
- function resolve() {
6
- const deploymentId = parseEnvValue(process.env.VERCEL_DEPLOYMENT_ID);
7
- const environment = parseEnvValue(process.env.VERCEL_ENV ?? process.env.VERCEL_TARGET_ENV);
8
- if (!deploymentId && !environment) return null;
9
- return {
10
- provider: "vercel",
11
- environment,
12
- deploymentId,
13
- deploymentUrl: resolveDeploymentUrl(),
14
- environmentName: environment,
15
- environmentTarget: environment
16
- };
17
- }
18
- function resolveDeploymentUrl() {
19
- const deploymentUrl = parseEnvValue(process.env.VERCEL_URL);
20
- if (deploymentUrl === null) return null;
21
- if (deploymentUrl.startsWith("https://") || deploymentUrl.startsWith("http://")) return deploymentUrl;
22
- return `https://${deploymentUrl}`;
23
- }
24
- //#endregion
25
- export { resolve, vercel_exports };
@@ -1 +0,0 @@
1
- {"version":3,"file":"vercel.mjs","names":[],"sources":["../../../../../src/internal/build/release/destinations/vercel.ts"],"sourcesContent":["import type { ReleaseDestinationMetadata } from \"@interfere/types/integrations\";\nimport { parseEnvValue } from \"@interfere/types/sdk/env\";\n\nexport function resolve(): ReleaseDestinationMetadata | null {\n const deploymentId = parseEnvValue(process.env.VERCEL_DEPLOYMENT_ID);\n const environment = parseEnvValue(\n process.env.VERCEL_ENV ?? process.env.VERCEL_TARGET_ENV,\n );\n\n if (!deploymentId && !environment) {\n return null;\n }\n\n return {\n provider: \"vercel\",\n environment,\n deploymentId,\n deploymentUrl: resolveDeploymentUrl(),\n environmentName: environment,\n environmentTarget: environment,\n };\n}\n\nfunction resolveDeploymentUrl(): string | null {\n const deploymentUrl = parseEnvValue(process.env.VERCEL_URL);\n\n if (deploymentUrl === null) {\n return null;\n }\n\n if (\n deploymentUrl.startsWith(\"https://\") ||\n deploymentUrl.startsWith(\"http://\")\n ) {\n return deploymentUrl;\n }\n\n return `https://${deploymentUrl}`;\n}\n"],"mappings":";;;;AAGA,SAAgB,UAA6C;CAC3D,MAAM,eAAe,cAAc,QAAQ,IAAI,qBAAqB;CACpE,MAAM,cAAc,cAClB,QAAQ,IAAI,cAAc,QAAQ,IAAI,kBACvC;AAED,KAAI,CAAC,gBAAgB,CAAC,YACpB,QAAO;AAGT,QAAO;EACL,UAAU;EACV;EACA;EACA,eAAe,sBAAsB;EACrC,iBAAiB;EACjB,mBAAmB;EACpB;;AAGH,SAAS,uBAAsC;CAC7C,MAAM,gBAAgB,cAAc,QAAQ,IAAI,WAAW;AAE3D,KAAI,kBAAkB,KACpB,QAAO;AAGT,KACE,cAAc,WAAW,WAAW,IACpC,cAAc,WAAW,UAAU,CAEnC,QAAO;AAGT,QAAO,WAAW"}
@@ -1,4 +0,0 @@
1
- //#region src/internal/build/release/git.d.ts
2
- declare function runGitCommand(command: string): string | null;
3
- //#endregion
4
- export { runGitCommand };
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.d.mts","names":[],"sources":["../../../../src/internal/build/release/git.ts"],"mappings":";iBAIgB,aAAA,CAAc,OAAA"}
@@ -1,21 +0,0 @@
1
- import { log } from "../../logger.mjs";
2
- import { execSync } from "node:child_process";
3
- //#region src/internal/build/release/git.ts
4
- function runGitCommand(command) {
5
- try {
6
- const output = execSync(command, {
7
- encoding: "utf8",
8
- stdio: [
9
- "ignore",
10
- "pipe",
11
- "ignore"
12
- ]
13
- }).trim();
14
- return output.length > 0 ? output : null;
15
- } catch {
16
- log.warn("Git unavailable", [`Failed: ${command}`]);
17
- return null;
18
- }
19
- }
20
- //#endregion
21
- export { runGitCommand };
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.mjs","names":[],"sources":["../../../../src/internal/build/release/git.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\n\nimport { log } from \"../../logger.js\";\n\nexport function runGitCommand(command: string): string | null {\n try {\n const output = execSync(command, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n\n return output.length > 0 ? output : null;\n } catch {\n log.warn(\"Git unavailable\", [`Failed: ${command}`]);\n return null;\n }\n}\n"],"mappings":";;;AAIA,SAAgB,cAAc,SAAgC;AAC5D,KAAI;EACF,MAAM,SAAS,SAAS,SAAS;GAC/B,UAAU;GACV,OAAO;IAAC;IAAU;IAAQ;IAAS;GACpC,CAAC,CAAC,MAAM;AAET,SAAO,OAAO,SAAS,IAAI,SAAS;SAC9B;AACN,MAAI,KAAK,mBAAmB,CAAC,WAAW,UAAU,CAAC;AACnD,SAAO"}
@@ -1,7 +0,0 @@
1
- import { runGitCommand } from "./git.mjs";
2
- import { CreateReleaseResponse } from "@interfere/types/releases/definition";
3
-
4
- //#region src/internal/build/release/index.d.ts
5
- declare function createRelease(apiKey: string, apiUrl: string, buildId: string): Promise<CreateReleaseResponse>;
6
- //#endregion
7
- export { createRelease, runGitCommand };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/internal/build/release/index.ts"],"mappings":";;;;iBAuBsB,aAAA,CACpB,MAAA,UACA,MAAA,UACA,OAAA,WACC,OAAA,CAAQ,qBAAA"}