@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 +32 -0
- package/lib/index.cjs +172 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.ts +36 -0
- package/lib/index.mjs +164 -0
- package/lib/index.mjs.map +1 -0
- package/package.json +42 -0
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
|
+
}
|