@posthog/nextjs-config 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # PostHog Next.js Config
2
+
3
+ This package handles sourcemap configuration and upload for the PostHog Error Tracking product.
4
+
5
+ Please see the main [PostHog Error Tracking docs](https://posthog.com/docs/error-tracking).
6
+
7
+ ## Usage
8
+
9
+ ```typescript
10
+ // next.config.ts
11
+ import { withPostHogConfig } from "@posthog/nextjs-config";
12
+
13
+ const nextConfig = {
14
+ // Your Next.js configuration here
15
+ };
16
+
17
+ export default withPostHogConfig(nextConfig, {
18
+ personalApiKey: process.env.POSTHOG_PERSONAL_API_KEY!, // Personal API key used for sourcemap uploads, see https://app.posthog.com/settings/user-api-keys
19
+ envId: process.env.POSTHOG_ENV_ID!, // Environment ID, see https://app.posthog.com/settings/environment#variables
20
+ host: process.env.NEXT_PUBLIC_POSTHOG_HOST!, // (optional) Host URL, defaults to https://us.posthog.com
21
+ sourcemaps: { // (optional)
22
+ enabled: true, // (optional) Enable sourcemaps generation and upload, default to true on production builds
23
+ project: "my-application", // (optional) Project name, defaults to repository name
24
+ version: "1.0.0", // (optional) Release version, defaults to current git commit
25
+ deleteAfterUpload: true, // (optional) Delete sourcemaps after upload, defaults to true
26
+ },
27
+ });
28
+ ```
29
+
30
+ ## Questions?
31
+
32
+ ### [Check out our community page.](https://posthog.com/posts)
package/lib/index.cjs ADDED
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var child_process = require('child_process');
6
+ var path = require('path');
7
+
8
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
+
10
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
11
+
12
+ class SourcemapWebpackPlugin {
13
+ constructor(posthogOptions, isServer, nextRuntime) {
14
+ this.posthogOptions = posthogOptions;
15
+ this.isServer = isServer;
16
+ this.nextRuntime = nextRuntime;
17
+ this.directory = this.isServer ? `./.next/server` : `./.next/static/chunks`;
18
+ }
19
+ apply(compiler) {
20
+ if (this.nextRuntime === 'edge') {
21
+ // TODO: edge and nodejs runtime output files in the same location
22
+ // to support edge runtime we need a way to pass a list of files to the cli
23
+ return;
24
+ }
25
+ const onDone = async (_, callback) => {
26
+ callback = callback || (() => {});
27
+ try {
28
+ await this.runInject();
29
+ await this.runUpload();
30
+ } catch (error) {
31
+ const errorMessage = error instanceof Error ? error.message : error;
32
+ return console.error('Error running PostHog sourcemap plugin:', errorMessage);
33
+ }
34
+ return callback();
35
+ };
36
+ if (compiler.hooks) {
37
+ compiler.hooks.done.tapAsync('SourcemapWebpackPlugin', onDone);
38
+ } else {
39
+ compiler.plugin('done', onDone);
40
+ }
41
+ }
42
+ async runInject() {
43
+ const cliOptions = [];
44
+ cliOptions.push('sourcemap', 'inject', '--directory', this.directory);
45
+ await callPosthogCli(cliOptions, process.env, this.posthogOptions.verbose);
46
+ }
47
+ async runUpload() {
48
+ const cliOptions = [];
49
+ if (this.posthogOptions.host) {
50
+ cliOptions.push('--host', this.posthogOptions.host);
51
+ }
52
+ cliOptions.push('sourcemap', 'upload');
53
+ cliOptions.push('--directory', this.directory);
54
+ if (this.posthogOptions.sourcemaps.project) {
55
+ cliOptions.push('--project', this.posthogOptions.sourcemaps.project);
56
+ }
57
+ if (this.posthogOptions.sourcemaps.version) {
58
+ cliOptions.push('--version', this.posthogOptions.sourcemaps.version);
59
+ }
60
+ if (this.posthogOptions.sourcemaps.deleteAfterUpload && !this.isServer) {
61
+ cliOptions.push('--delete-after');
62
+ }
63
+ // Add env variables
64
+ const envVars = {
65
+ ...process.env,
66
+ POSTHOG_CLI_TOKEN: this.posthogOptions.personalApiKey,
67
+ POSTHOG_CLI_ENV_ID: this.posthogOptions.envId
68
+ };
69
+ await callPosthogCli(cliOptions, envVars, this.posthogOptions.verbose);
70
+ }
71
+ }
72
+ async function callPosthogCli(args, env, verbose) {
73
+ const cwd = path__default["default"].resolve('.');
74
+ const child = child_process.spawn('posthog-cli', [...args], {
75
+ stdio: verbose ? 'inherit' : 'ignore',
76
+ env: addLocalPath(env ?? process.env, cwd)
77
+ });
78
+ await new Promise((resolve, reject) => {
79
+ child.on('close', code => {
80
+ if (code === 0) {
81
+ resolve();
82
+ } else {
83
+ reject(new Error(`Command failed with code ${code}`));
84
+ }
85
+ });
86
+ child.on('error', error => {
87
+ reject(error);
88
+ });
89
+ });
90
+ }
91
+ const addLocalPath = ({
92
+ Path = '',
93
+ PATH = Path,
94
+ ...env
95
+ }, cwd) => {
96
+ const pathParts = PATH.split(path__default["default"].delimiter);
97
+ const localPaths = getLocalPaths([], path__default["default"].resolve(cwd)).map(localPath => path__default["default"].join(localPath, 'node_modules/.bin')).filter(localPath => !pathParts.includes(localPath));
98
+ return {
99
+ ...env,
100
+ PATH: [...localPaths, PATH].filter(Boolean).join(path__default["default"].delimiter)
101
+ };
102
+ };
103
+ const getLocalPaths = (localPaths, localPath) => localPaths.at(-1) === localPath ? localPaths : getLocalPaths([...localPaths, localPath], path__default["default"].resolve(localPath, '..'));
104
+
105
+ function withPostHogConfig(userNextConfig, posthogConfig) {
106
+ const posthogNextConfigComplete = resolvePostHogConfig(posthogConfig);
107
+ return async (phase, {
108
+ defaultConfig
109
+ }) => {
110
+ const {
111
+ webpack: userWebPackConfig,
112
+ ...userConfig
113
+ } = await resolveUserConfig(userNextConfig, phase, defaultConfig);
114
+ const defaultWebpackConfig = userWebPackConfig || (config => config);
115
+ const sourceMapEnabled = posthogNextConfigComplete.sourcemaps.enabled;
116
+ return {
117
+ ...userConfig,
118
+ productionBrowserSourceMaps: sourceMapEnabled,
119
+ webpack: (config, options) => {
120
+ const webpackConfig = defaultWebpackConfig(config, options);
121
+ if (webpackConfig && options.isServer && sourceMapEnabled) {
122
+ webpackConfig.devtool = 'source-map';
123
+ }
124
+ if (sourceMapEnabled) {
125
+ webpackConfig.plugins = webpackConfig.plugins || [];
126
+ webpackConfig.plugins.push(new SourcemapWebpackPlugin(posthogNextConfigComplete, options.isServer, options.nextRuntime));
127
+ }
128
+ return webpackConfig;
129
+ }
130
+ };
131
+ };
132
+ }
133
+ function resolveUserConfig(userNextConfig, phase, defaultConfig) {
134
+ if (typeof userNextConfig === 'function') {
135
+ const maybePromise = userNextConfig(phase, {
136
+ defaultConfig
137
+ });
138
+ if (maybePromise instanceof Promise) {
139
+ return maybePromise;
140
+ } else {
141
+ return Promise.resolve(maybePromise);
142
+ }
143
+ } else if (typeof userNextConfig === 'object') {
144
+ return Promise.resolve(userNextConfig);
145
+ } else {
146
+ throw new Error('Invalid user config');
147
+ }
148
+ }
149
+ function resolvePostHogConfig(posthogProvidedConfig) {
150
+ const {
151
+ personalApiKey,
152
+ envId,
153
+ host,
154
+ verbose,
155
+ sourcemaps = {}
156
+ } = posthogProvidedConfig;
157
+ return {
158
+ personalApiKey,
159
+ envId,
160
+ host: host ?? 'https://us.posthog.com',
161
+ verbose: verbose ?? true,
162
+ sourcemaps: {
163
+ enabled: sourcemaps.enabled ?? process.env.NODE_ENV == 'production',
164
+ project: sourcemaps.project,
165
+ version: sourcemaps.version,
166
+ deleteAfterUpload: sourcemaps.deleteAfterUpload ?? true
167
+ }
168
+ };
169
+ }
170
+
171
+ exports.withPostHogConfig = withPostHogConfig;
172
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/webpack-plugin.ts","../src/config.ts"],"sourcesContent":["import { PostHogNextConfigComplete } from './config'\nimport { spawn } from 'child_process'\nimport path from 'path'\n\ntype NextRuntime = 'edge' | 'nodejs' | undefined\n\nexport class SourcemapWebpackPlugin {\n directory: string\n\n constructor(\n private posthogOptions: PostHogNextConfigComplete,\n private isServer: boolean,\n private nextRuntime: NextRuntime\n ) {\n this.directory = this.isServer ? `./.next/server` : `./.next/static/chunks`\n }\n\n apply(compiler: any): void {\n if (this.nextRuntime === 'edge') {\n // TODO: edge and nodejs runtime output files in the same location\n // to support edge runtime we need a way to pass a list of files to the cli\n return\n }\n\n const onDone = async (_: any, callback: any): Promise<void> => {\n callback = callback || (() => {})\n try {\n await this.runInject()\n await this.runUpload()\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : error\n return console.error('Error running PostHog sourcemap plugin:', errorMessage)\n }\n return callback()\n }\n\n if (compiler.hooks) {\n compiler.hooks.done.tapAsync('SourcemapWebpackPlugin', onDone)\n } else {\n compiler.plugin('done', onDone)\n }\n }\n\n async runInject(): Promise<void> {\n const cliOptions = []\n cliOptions.push('sourcemap', 'inject', '--directory', this.directory)\n await callPosthogCli(cliOptions, process.env, this.posthogOptions.verbose)\n }\n\n async runUpload(): Promise<void> {\n const cliOptions = []\n if (this.posthogOptions.host) {\n cliOptions.push('--host', this.posthogOptions.host)\n }\n cliOptions.push('sourcemap', 'upload')\n cliOptions.push('--directory', this.directory)\n if (this.posthogOptions.sourcemaps.project) {\n cliOptions.push('--project', this.posthogOptions.sourcemaps.project)\n }\n if (this.posthogOptions.sourcemaps.version) {\n cliOptions.push('--version', this.posthogOptions.sourcemaps.version)\n }\n if (this.posthogOptions.sourcemaps.deleteAfterUpload && !this.isServer) {\n cliOptions.push('--delete-after')\n }\n // Add env variables\n const envVars = {\n ...process.env,\n POSTHOG_CLI_TOKEN: this.posthogOptions.personalApiKey,\n POSTHOG_CLI_ENV_ID: this.posthogOptions.envId,\n }\n await callPosthogCli(cliOptions, envVars, this.posthogOptions.verbose)\n }\n}\n\nasync function callPosthogCli(args: string[], env: NodeJS.ProcessEnv, verbose: boolean): Promise<void> {\n const cwd = path.resolve('.')\n const child = spawn('posthog-cli', [...args], {\n stdio: verbose ? 'inherit' : 'ignore',\n env: addLocalPath(env ?? process.env, cwd),\n })\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`Command failed with code ${code}`))\n }\n })\n\n child.on('error', (error) => {\n reject(error)\n })\n })\n}\n\nconst addLocalPath = ({ Path = '', PATH = Path, ...env }: NodeJS.ProcessEnv, cwd: string): NodeJS.ProcessEnv => {\n const pathParts = PATH.split(path.delimiter)\n const localPaths = getLocalPaths([], path.resolve(cwd))\n .map((localPath: string) => path.join(localPath, 'node_modules/.bin'))\n .filter((localPath: string) => !pathParts.includes(localPath))\n return { ...env, PATH: [...localPaths, PATH].filter(Boolean).join(path.delimiter) }\n}\n\nconst getLocalPaths = (localPaths: string[], localPath: string): string[] =>\n localPaths.at(-1) === localPath\n ? localPaths\n : getLocalPaths([...localPaths, localPath], path.resolve(localPath, '..'))\n","import type { NextConfig } from 'next'\nimport { SourcemapWebpackPlugin } from './webpack-plugin'\n\ntype NextFuncConfig = (phase: string, { defaultConfig }: { defaultConfig: NextConfig }) => NextConfig\ntype NextAsyncConfig = (phase: string, { defaultConfig }: { defaultConfig: NextConfig }) => Promise<NextConfig>\ntype UserProvidedConfig = NextConfig | NextFuncConfig | NextAsyncConfig\n\nexport type PostHogNextConfig = {\n personalApiKey: string\n envId: string\n host?: string\n verbose?: boolean\n sourcemaps?: {\n enabled?: boolean\n project?: string\n version?: string\n deleteAfterUpload?: boolean\n }\n}\n\nexport type PostHogNextConfigComplete = {\n personalApiKey: string\n envId: string\n host: string\n verbose: boolean\n sourcemaps: {\n enabled: boolean\n project?: string\n version?: string\n deleteAfterUpload: boolean\n }\n}\n\nexport function withPostHogConfig(userNextConfig: UserProvidedConfig, posthogConfig: PostHogNextConfig): NextConfig {\n const posthogNextConfigComplete = resolvePostHogConfig(posthogConfig)\n return async (phase: string, { defaultConfig }: { defaultConfig: NextConfig }) => {\n const { webpack: userWebPackConfig, ...userConfig } = await resolveUserConfig(userNextConfig, phase, defaultConfig)\n const defaultWebpackConfig = userWebPackConfig || ((config: any) => config)\n const sourceMapEnabled = posthogNextConfigComplete.sourcemaps.enabled\n return {\n ...userConfig,\n productionBrowserSourceMaps: sourceMapEnabled,\n webpack: (config: any, options: any) => {\n const webpackConfig = defaultWebpackConfig(config, options)\n if (webpackConfig && options.isServer && sourceMapEnabled) {\n webpackConfig.devtool = 'source-map'\n }\n if (sourceMapEnabled) {\n webpackConfig.plugins = webpackConfig.plugins || []\n webpackConfig.plugins.push(\n new SourcemapWebpackPlugin(posthogNextConfigComplete, options.isServer, options.nextRuntime)\n )\n }\n return webpackConfig\n },\n }\n }\n}\n\nfunction resolveUserConfig(\n userNextConfig: UserProvidedConfig,\n phase: string,\n defaultConfig: NextConfig\n): Promise<NextConfig> {\n if (typeof userNextConfig === 'function') {\n const maybePromise = userNextConfig(phase, { defaultConfig })\n if (maybePromise instanceof Promise) {\n return maybePromise\n } else {\n return Promise.resolve(maybePromise)\n }\n } else if (typeof userNextConfig === 'object') {\n return Promise.resolve(userNextConfig)\n } else {\n throw new Error('Invalid user config')\n }\n}\n\nfunction resolvePostHogConfig(posthogProvidedConfig: PostHogNextConfig): PostHogNextConfigComplete {\n const { personalApiKey, envId, host, verbose, sourcemaps = {} } = posthogProvidedConfig\n return {\n personalApiKey,\n envId,\n host: host ?? 'https://us.posthog.com',\n verbose: verbose ?? true,\n sourcemaps: {\n enabled: sourcemaps.enabled ?? process.env.NODE_ENV == 'production',\n project: sourcemaps.project,\n version: sourcemaps.version,\n deleteAfterUpload: sourcemaps.deleteAfterUpload ?? true,\n },\n }\n}\n"],"names":["SourcemapWebpackPlugin","constructor","posthogOptions","isServer","nextRuntime","directory","apply","compiler","onDone","_","callback","runInject","runUpload","error","errorMessage","Error","message","console","hooks","done","tapAsync","plugin","cliOptions","push","callPosthogCli","process","env","verbose","host","sourcemaps","project","version","deleteAfterUpload","envVars","POSTHOG_CLI_TOKEN","personalApiKey","POSTHOG_CLI_ENV_ID","envId","args","cwd","path","resolve","child","spawn","stdio","addLocalPath","Promise","reject","on","code","Path","PATH","pathParts","split","delimiter","localPaths","getLocalPaths","map","localPath","join","filter","includes","Boolean","at","withPostHogConfig","userNextConfig","posthogConfig","posthogNextConfigComplete","resolvePostHogConfig","phase","defaultConfig","webpack","userWebPackConfig","userConfig","resolveUserConfig","defaultWebpackConfig","config","sourceMapEnabled","enabled","productionBrowserSourceMaps","options","webpackConfig","devtool","plugins","maybePromise","posthogProvidedConfig","NODE_ENV"],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { NextConfig } from 'next';
2
+
3
+ type NextFuncConfig = (phase: string, { defaultConfig }: {
4
+ defaultConfig: NextConfig;
5
+ }) => NextConfig;
6
+ type NextAsyncConfig = (phase: string, { defaultConfig }: {
7
+ defaultConfig: NextConfig;
8
+ }) => Promise<NextConfig>;
9
+ type UserProvidedConfig = NextConfig | NextFuncConfig | NextAsyncConfig;
10
+ type PostHogNextConfig = {
11
+ personalApiKey: string;
12
+ envId: string;
13
+ host?: string;
14
+ verbose?: boolean;
15
+ sourcemaps?: {
16
+ enabled?: boolean;
17
+ project?: string;
18
+ version?: string;
19
+ deleteAfterUpload?: boolean;
20
+ };
21
+ };
22
+ type PostHogNextConfigComplete = {
23
+ personalApiKey: string;
24
+ envId: string;
25
+ host: string;
26
+ verbose: boolean;
27
+ sourcemaps: {
28
+ enabled: boolean;
29
+ project?: string;
30
+ version?: string;
31
+ deleteAfterUpload: boolean;
32
+ };
33
+ };
34
+ declare function withPostHogConfig(userNextConfig: UserProvidedConfig, posthogConfig: PostHogNextConfig): NextConfig;
35
+
36
+ export { PostHogNextConfig, PostHogNextConfigComplete, withPostHogConfig };
package/lib/index.mjs ADDED
@@ -0,0 +1,164 @@
1
+ import { spawn } from 'child_process';
2
+ import path from 'path';
3
+
4
+ class SourcemapWebpackPlugin {
5
+ constructor(posthogOptions, isServer, nextRuntime) {
6
+ this.posthogOptions = posthogOptions;
7
+ this.isServer = isServer;
8
+ this.nextRuntime = nextRuntime;
9
+ this.directory = this.isServer ? `./.next/server` : `./.next/static/chunks`;
10
+ }
11
+ apply(compiler) {
12
+ if (this.nextRuntime === 'edge') {
13
+ // TODO: edge and nodejs runtime output files in the same location
14
+ // to support edge runtime we need a way to pass a list of files to the cli
15
+ return;
16
+ }
17
+ const onDone = async (_, callback) => {
18
+ callback = callback || (() => {});
19
+ try {
20
+ await this.runInject();
21
+ await this.runUpload();
22
+ } catch (error) {
23
+ const errorMessage = error instanceof Error ? error.message : error;
24
+ return console.error('Error running PostHog sourcemap plugin:', errorMessage);
25
+ }
26
+ return callback();
27
+ };
28
+ if (compiler.hooks) {
29
+ compiler.hooks.done.tapAsync('SourcemapWebpackPlugin', onDone);
30
+ } else {
31
+ compiler.plugin('done', onDone);
32
+ }
33
+ }
34
+ async runInject() {
35
+ const cliOptions = [];
36
+ cliOptions.push('sourcemap', 'inject', '--directory', this.directory);
37
+ await callPosthogCli(cliOptions, process.env, this.posthogOptions.verbose);
38
+ }
39
+ async runUpload() {
40
+ const cliOptions = [];
41
+ if (this.posthogOptions.host) {
42
+ cliOptions.push('--host', this.posthogOptions.host);
43
+ }
44
+ cliOptions.push('sourcemap', 'upload');
45
+ cliOptions.push('--directory', this.directory);
46
+ if (this.posthogOptions.sourcemaps.project) {
47
+ cliOptions.push('--project', this.posthogOptions.sourcemaps.project);
48
+ }
49
+ if (this.posthogOptions.sourcemaps.version) {
50
+ cliOptions.push('--version', this.posthogOptions.sourcemaps.version);
51
+ }
52
+ if (this.posthogOptions.sourcemaps.deleteAfterUpload && !this.isServer) {
53
+ cliOptions.push('--delete-after');
54
+ }
55
+ // Add env variables
56
+ const envVars = {
57
+ ...process.env,
58
+ POSTHOG_CLI_TOKEN: this.posthogOptions.personalApiKey,
59
+ POSTHOG_CLI_ENV_ID: this.posthogOptions.envId
60
+ };
61
+ await callPosthogCli(cliOptions, envVars, this.posthogOptions.verbose);
62
+ }
63
+ }
64
+ async function callPosthogCli(args, env, verbose) {
65
+ const cwd = path.resolve('.');
66
+ const child = spawn('posthog-cli', [...args], {
67
+ stdio: verbose ? 'inherit' : 'ignore',
68
+ env: addLocalPath(env ?? process.env, cwd)
69
+ });
70
+ await new Promise((resolve, reject) => {
71
+ child.on('close', code => {
72
+ if (code === 0) {
73
+ resolve();
74
+ } else {
75
+ reject(new Error(`Command failed with code ${code}`));
76
+ }
77
+ });
78
+ child.on('error', error => {
79
+ reject(error);
80
+ });
81
+ });
82
+ }
83
+ const addLocalPath = ({
84
+ Path = '',
85
+ PATH = Path,
86
+ ...env
87
+ }, cwd) => {
88
+ const pathParts = PATH.split(path.delimiter);
89
+ const localPaths = getLocalPaths([], path.resolve(cwd)).map(localPath => path.join(localPath, 'node_modules/.bin')).filter(localPath => !pathParts.includes(localPath));
90
+ return {
91
+ ...env,
92
+ PATH: [...localPaths, PATH].filter(Boolean).join(path.delimiter)
93
+ };
94
+ };
95
+ const getLocalPaths = (localPaths, localPath) => localPaths.at(-1) === localPath ? localPaths : getLocalPaths([...localPaths, localPath], path.resolve(localPath, '..'));
96
+
97
+ function withPostHogConfig(userNextConfig, posthogConfig) {
98
+ const posthogNextConfigComplete = resolvePostHogConfig(posthogConfig);
99
+ return async (phase, {
100
+ defaultConfig
101
+ }) => {
102
+ const {
103
+ webpack: userWebPackConfig,
104
+ ...userConfig
105
+ } = await resolveUserConfig(userNextConfig, phase, defaultConfig);
106
+ const defaultWebpackConfig = userWebPackConfig || (config => config);
107
+ const sourceMapEnabled = posthogNextConfigComplete.sourcemaps.enabled;
108
+ return {
109
+ ...userConfig,
110
+ productionBrowserSourceMaps: sourceMapEnabled,
111
+ webpack: (config, options) => {
112
+ const webpackConfig = defaultWebpackConfig(config, options);
113
+ if (webpackConfig && options.isServer && sourceMapEnabled) {
114
+ webpackConfig.devtool = 'source-map';
115
+ }
116
+ if (sourceMapEnabled) {
117
+ webpackConfig.plugins = webpackConfig.plugins || [];
118
+ webpackConfig.plugins.push(new SourcemapWebpackPlugin(posthogNextConfigComplete, options.isServer, options.nextRuntime));
119
+ }
120
+ return webpackConfig;
121
+ }
122
+ };
123
+ };
124
+ }
125
+ function resolveUserConfig(userNextConfig, phase, defaultConfig) {
126
+ if (typeof userNextConfig === 'function') {
127
+ const maybePromise = userNextConfig(phase, {
128
+ defaultConfig
129
+ });
130
+ if (maybePromise instanceof Promise) {
131
+ return maybePromise;
132
+ } else {
133
+ return Promise.resolve(maybePromise);
134
+ }
135
+ } else if (typeof userNextConfig === 'object') {
136
+ return Promise.resolve(userNextConfig);
137
+ } else {
138
+ throw new Error('Invalid user config');
139
+ }
140
+ }
141
+ function resolvePostHogConfig(posthogProvidedConfig) {
142
+ const {
143
+ personalApiKey,
144
+ envId,
145
+ host,
146
+ verbose,
147
+ sourcemaps = {}
148
+ } = posthogProvidedConfig;
149
+ return {
150
+ personalApiKey,
151
+ envId,
152
+ host: host ?? 'https://us.posthog.com',
153
+ verbose: verbose ?? true,
154
+ sourcemaps: {
155
+ enabled: sourcemaps.enabled ?? process.env.NODE_ENV == 'production',
156
+ project: sourcemaps.project,
157
+ version: sourcemaps.version,
158
+ deleteAfterUpload: sourcemaps.deleteAfterUpload ?? true
159
+ }
160
+ };
161
+ }
162
+
163
+ export { withPostHogConfig };
164
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/webpack-plugin.ts","../src/config.ts"],"sourcesContent":["import { PostHogNextConfigComplete } from './config'\nimport { spawn } from 'child_process'\nimport path from 'path'\n\ntype NextRuntime = 'edge' | 'nodejs' | undefined\n\nexport class SourcemapWebpackPlugin {\n directory: string\n\n constructor(\n private posthogOptions: PostHogNextConfigComplete,\n private isServer: boolean,\n private nextRuntime: NextRuntime\n ) {\n this.directory = this.isServer ? `./.next/server` : `./.next/static/chunks`\n }\n\n apply(compiler: any): void {\n if (this.nextRuntime === 'edge') {\n // TODO: edge and nodejs runtime output files in the same location\n // to support edge runtime we need a way to pass a list of files to the cli\n return\n }\n\n const onDone = async (_: any, callback: any): Promise<void> => {\n callback = callback || (() => {})\n try {\n await this.runInject()\n await this.runUpload()\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : error\n return console.error('Error running PostHog sourcemap plugin:', errorMessage)\n }\n return callback()\n }\n\n if (compiler.hooks) {\n compiler.hooks.done.tapAsync('SourcemapWebpackPlugin', onDone)\n } else {\n compiler.plugin('done', onDone)\n }\n }\n\n async runInject(): Promise<void> {\n const cliOptions = []\n cliOptions.push('sourcemap', 'inject', '--directory', this.directory)\n await callPosthogCli(cliOptions, process.env, this.posthogOptions.verbose)\n }\n\n async runUpload(): Promise<void> {\n const cliOptions = []\n if (this.posthogOptions.host) {\n cliOptions.push('--host', this.posthogOptions.host)\n }\n cliOptions.push('sourcemap', 'upload')\n cliOptions.push('--directory', this.directory)\n if (this.posthogOptions.sourcemaps.project) {\n cliOptions.push('--project', this.posthogOptions.sourcemaps.project)\n }\n if (this.posthogOptions.sourcemaps.version) {\n cliOptions.push('--version', this.posthogOptions.sourcemaps.version)\n }\n if (this.posthogOptions.sourcemaps.deleteAfterUpload && !this.isServer) {\n cliOptions.push('--delete-after')\n }\n // Add env variables\n const envVars = {\n ...process.env,\n POSTHOG_CLI_TOKEN: this.posthogOptions.personalApiKey,\n POSTHOG_CLI_ENV_ID: this.posthogOptions.envId,\n }\n await callPosthogCli(cliOptions, envVars, this.posthogOptions.verbose)\n }\n}\n\nasync function callPosthogCli(args: string[], env: NodeJS.ProcessEnv, verbose: boolean): Promise<void> {\n const cwd = path.resolve('.')\n const child = spawn('posthog-cli', [...args], {\n stdio: verbose ? 'inherit' : 'ignore',\n env: addLocalPath(env ?? process.env, cwd),\n })\n\n await new Promise<void>((resolve, reject) => {\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`Command failed with code ${code}`))\n }\n })\n\n child.on('error', (error) => {\n reject(error)\n })\n })\n}\n\nconst addLocalPath = ({ Path = '', PATH = Path, ...env }: NodeJS.ProcessEnv, cwd: string): NodeJS.ProcessEnv => {\n const pathParts = PATH.split(path.delimiter)\n const localPaths = getLocalPaths([], path.resolve(cwd))\n .map((localPath: string) => path.join(localPath, 'node_modules/.bin'))\n .filter((localPath: string) => !pathParts.includes(localPath))\n return { ...env, PATH: [...localPaths, PATH].filter(Boolean).join(path.delimiter) }\n}\n\nconst getLocalPaths = (localPaths: string[], localPath: string): string[] =>\n localPaths.at(-1) === localPath\n ? localPaths\n : getLocalPaths([...localPaths, localPath], path.resolve(localPath, '..'))\n","import type { NextConfig } from 'next'\nimport { SourcemapWebpackPlugin } from './webpack-plugin'\n\ntype NextFuncConfig = (phase: string, { defaultConfig }: { defaultConfig: NextConfig }) => NextConfig\ntype NextAsyncConfig = (phase: string, { defaultConfig }: { defaultConfig: NextConfig }) => Promise<NextConfig>\ntype UserProvidedConfig = NextConfig | NextFuncConfig | NextAsyncConfig\n\nexport type PostHogNextConfig = {\n personalApiKey: string\n envId: string\n host?: string\n verbose?: boolean\n sourcemaps?: {\n enabled?: boolean\n project?: string\n version?: string\n deleteAfterUpload?: boolean\n }\n}\n\nexport type PostHogNextConfigComplete = {\n personalApiKey: string\n envId: string\n host: string\n verbose: boolean\n sourcemaps: {\n enabled: boolean\n project?: string\n version?: string\n deleteAfterUpload: boolean\n }\n}\n\nexport function withPostHogConfig(userNextConfig: UserProvidedConfig, posthogConfig: PostHogNextConfig): NextConfig {\n const posthogNextConfigComplete = resolvePostHogConfig(posthogConfig)\n return async (phase: string, { defaultConfig }: { defaultConfig: NextConfig }) => {\n const { webpack: userWebPackConfig, ...userConfig } = await resolveUserConfig(userNextConfig, phase, defaultConfig)\n const defaultWebpackConfig = userWebPackConfig || ((config: any) => config)\n const sourceMapEnabled = posthogNextConfigComplete.sourcemaps.enabled\n return {\n ...userConfig,\n productionBrowserSourceMaps: sourceMapEnabled,\n webpack: (config: any, options: any) => {\n const webpackConfig = defaultWebpackConfig(config, options)\n if (webpackConfig && options.isServer && sourceMapEnabled) {\n webpackConfig.devtool = 'source-map'\n }\n if (sourceMapEnabled) {\n webpackConfig.plugins = webpackConfig.plugins || []\n webpackConfig.plugins.push(\n new SourcemapWebpackPlugin(posthogNextConfigComplete, options.isServer, options.nextRuntime)\n )\n }\n return webpackConfig\n },\n }\n }\n}\n\nfunction resolveUserConfig(\n userNextConfig: UserProvidedConfig,\n phase: string,\n defaultConfig: NextConfig\n): Promise<NextConfig> {\n if (typeof userNextConfig === 'function') {\n const maybePromise = userNextConfig(phase, { defaultConfig })\n if (maybePromise instanceof Promise) {\n return maybePromise\n } else {\n return Promise.resolve(maybePromise)\n }\n } else if (typeof userNextConfig === 'object') {\n return Promise.resolve(userNextConfig)\n } else {\n throw new Error('Invalid user config')\n }\n}\n\nfunction resolvePostHogConfig(posthogProvidedConfig: PostHogNextConfig): PostHogNextConfigComplete {\n const { personalApiKey, envId, host, verbose, sourcemaps = {} } = posthogProvidedConfig\n return {\n personalApiKey,\n envId,\n host: host ?? 'https://us.posthog.com',\n verbose: verbose ?? true,\n sourcemaps: {\n enabled: sourcemaps.enabled ?? process.env.NODE_ENV == 'production',\n project: sourcemaps.project,\n version: sourcemaps.version,\n deleteAfterUpload: sourcemaps.deleteAfterUpload ?? true,\n },\n }\n}\n"],"names":["SourcemapWebpackPlugin","constructor","posthogOptions","isServer","nextRuntime","directory","apply","compiler","onDone","_","callback","runInject","runUpload","error","errorMessage","Error","message","console","hooks","done","tapAsync","plugin","cliOptions","push","callPosthogCli","process","env","verbose","host","sourcemaps","project","version","deleteAfterUpload","envVars","POSTHOG_CLI_TOKEN","personalApiKey","POSTHOG_CLI_ENV_ID","envId","args","cwd","path","resolve","child","spawn","stdio","addLocalPath","Promise","reject","on","code","Path","PATH","pathParts","split","delimiter","localPaths","getLocalPaths","map","localPath","join","filter","includes","Boolean","at","withPostHogConfig","userNextConfig","posthogConfig","posthogNextConfigComplete","resolvePostHogConfig","phase","defaultConfig","webpack","userWebPackConfig","userConfig","resolveUserConfig","defaultWebpackConfig","config","sourceMapEnabled","enabled","productionBrowserSourceMaps","options","webpackConfig","devtool","plugins","maybePromise","posthogProvidedConfig","NODE_ENV"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@posthog/nextjs-config",
3
+ "version": "1.0.0",
4
+ "description": "NextJS configuration helper for Posthog 🦔",
5
+ "main": "./lib/index.cjs",
6
+ "module": "./lib/index.mjs",
7
+ "types": "./lib/index.d.ts",
8
+ "scripts": {
9
+ "prepublishOnly": "cd .. && yarn build"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/PostHog/posthog-js-lite.git",
14
+ "directory": "posthog-nextjs-config"
15
+ },
16
+ "author": {
17
+ "name": "PostHog",
18
+ "email": "hey@posthog.com",
19
+ "url": "https://posthog.com"
20
+ },
21
+ "engines": {
22
+ "node": ">=18.0.0"
23
+ },
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@posthog/cli": "^0.3.1"
27
+ },
28
+ "keywords": [
29
+ "posthog",
30
+ "nextjs"
31
+ ],
32
+ "devDependencies": {
33
+ "@types/node": "^22.15.23",
34
+ "next": "^12.1.0"
35
+ },
36
+ "peerDependencies": {
37
+ "next": ">12.1.0"
38
+ },
39
+ "files": [
40
+ "lib/"
41
+ ]
42
+ }