Skip to content

Commit 12b0ebf

Browse files
committed
fix(pg-cloudflare): use conditional export to support bundlers that don't know about cloudflare:sockets
1 parent 411869d commit 12b0ebf

14 files changed

+1061
-16
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import * as esbuild from 'esbuild'
2+
3+
await esbuild.build({
4+
entryPoints: ['./src/index.mjs'],
5+
bundle: true,
6+
outfile: './dist/esbuild-cloudflare.js',
7+
conditions: ['import', 'cloudflare'],
8+
})
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as esbuild from 'esbuild'
2+
3+
await esbuild.build({
4+
entryPoints: ['./src/index.mjs'],
5+
bundle: true,
6+
outfile: './dist/esbuild-empty.js',
7+
})

packages/pg-bundler-test/package.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "pg-bundler-test",
3+
"version": "0.0.0",
4+
"description": "Test bundlers with pg-cloudflare, https://github.com/brianc/node-postgres/issues/3452",
5+
"license": "MIT",
6+
"private": true,
7+
"type": "module",
8+
"devDependencies": {
9+
"pg-cloudflare": "^1.2.5",
10+
"webpack": "^5.99.9",
11+
"webpack-cli": "^6.0.1",
12+
"rollup": "^4.41.1",
13+
"@rollup/plugin-node-resolve": "^16.0.1",
14+
"@rollup/plugin-commonjs": "^28.0.3",
15+
"vite": "^6.3.5",
16+
"esbuild": "^0.25.5"
17+
},
18+
"scripts": {
19+
"test": "yarn webpack && yarn rollup && yarn vite && yarn esbuild",
20+
"webpack": "webpack --config webpack-empty.config.mjs && webpack --config webpack-cloudflare.config.mjs",
21+
"rollup": "rollup --config rollup-empty.config.mjs --failAfterWarnings && rollup --config rollup-cloudflare.config.mjs --failAfterWarnings",
22+
"vite": "[ $(node --version | sed 's/v//' | cut -d'.' -f1) -ge 18 ] && vite build --config vite-empty.config.mjs && vite build --config vite-cloudflare.config.mjs || echo 'Skip Vite test'",
23+
"esbuild": "node esbuild-empty.config.mjs && node esbuild-cloudflare.config.mjs"
24+
}
25+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { defineConfig } from 'rollup'
2+
import { nodeResolve } from '@rollup/plugin-node-resolve'
3+
import commonjs from '@rollup/plugin-commonjs'
4+
5+
export default defineConfig({
6+
input: './src/index.mjs',
7+
output: {
8+
file: 'dist/rollup-cloudflare.js',
9+
format: 'es',
10+
},
11+
plugins: [nodeResolve({ exportConditions: ['import', 'cloudflare'], preferBuiltins: true }), commonjs()],
12+
external: ['cloudflare:sockets'],
13+
})
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { defineConfig } from 'rollup'
2+
import { nodeResolve } from '@rollup/plugin-node-resolve'
3+
import commonjs from '@rollup/plugin-commonjs'
4+
5+
export default defineConfig({
6+
input: './src/index.mjs',
7+
output: {
8+
file: 'dist/rollup-empty.js',
9+
format: 'es',
10+
},
11+
plugins: [nodeResolve(), commonjs()],
12+
})
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import 'pg-cloudflare'
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { defineConfig } from 'vite'
2+
import commonjs from '@rollup/plugin-commonjs'
3+
4+
export default defineConfig({
5+
build: {
6+
emptyOutDir: false,
7+
lib: {
8+
entry: './src/index.mjs',
9+
fileName: 'vite-cloudflare',
10+
formats: ['es'],
11+
},
12+
rollupOptions: {
13+
external: ['cloudflare:sockets'],
14+
},
15+
},
16+
resolve: {
17+
conditions: ['import', 'cloudflare'],
18+
},
19+
plugins: [commonjs()],
20+
})
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { defineConfig } from 'vite'
2+
3+
export default defineConfig({
4+
build: {
5+
emptyOutDir: false,
6+
lib: {
7+
entry: './src/index.mjs',
8+
fileName: 'vite-empty',
9+
formats: ['es'],
10+
},
11+
},
12+
})
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import webpack from 'webpack'
2+
3+
export default {
4+
mode: 'production',
5+
entry: './src/index.mjs',
6+
output: {
7+
filename: 'webpack-cloudflare.js',
8+
},
9+
resolve: { conditionNames: ['import', 'cloudflare'] },
10+
plugins: [
11+
// ignore cloudflare:sockets imports
12+
new webpack.IgnorePlugin({
13+
resourceRegExp: /^cloudflare:sockets$/,
14+
}),
15+
],
16+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default {
2+
mode: 'production',
3+
entry: './src/index.mjs',
4+
output: {
5+
filename: 'webpack-empty.js',
6+
},
7+
}

packages/pg-cloudflare/README.md

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,59 @@
1010
npm i --save-dev pg-cloudflare
1111
```
1212

13+
The package uses conditional exports to support bundlers that don't know about
14+
`cloudflare:sockets`, so the consumer code by default imports an empty file. To
15+
enable the package, resolve to the `cloudflare` condition in your bundler's
16+
config. For example:
17+
18+
- `webpack.config.js`
19+
```js
20+
export default {
21+
...,
22+
resolve: { conditionNames: [..., "cloudflare"] },
23+
plugins: [
24+
// ignore cloudflare:sockets imports
25+
new webpack.IgnorePlugin({
26+
resourceRegExp: /^cloudflare:sockets$/,
27+
}),
28+
],
29+
}
30+
```
31+
- `vite.config.js`
32+
```js
33+
export default defineConfig({
34+
...,
35+
resolve: {
36+
conditions: [..., "cloudflare"],
37+
},
38+
build: {
39+
...,
40+
// don't try to bundle cloudflare:sockets
41+
rollupOptions: {
42+
external: [..., 'cloudflare:sockets'],
43+
},
44+
},
45+
})
46+
```
47+
- `rollup.config.js`
48+
```js
49+
export default defineConfig({
50+
...,
51+
plugins: [..., nodeResolve({ exportConditions: [..., 'cloudflare'] })],
52+
// don't try to bundle cloudflare:sockets
53+
external: [..., 'cloudflare:sockets'],
54+
})
55+
```
56+
- `esbuild.config.js`
57+
```js
58+
await esbuild.build({
59+
...,
60+
conditions: [..., 'cloudflare'],
61+
})
62+
```
63+
64+
The concrete examples can be found in `packages/pg-bundler-test`.
65+
1366
## How to use conditionally, in non-Node.js environments
1467

1568
As implemented in `pg` [here](https://github.com/brianc/node-postgres/commit/07553428e9c0eacf761a5d4541a3300ff7859578#diff-34588ad868ebcb232660aba7ee6a99d1e02f4bc93f73497d2688c3f074e60533R5-R13), a typical use case might look as follows, where in a Node.js environment the `net` module is used, while in a non-Node.js environment, where `net` is unavailable, `pg-cloudflare` is used instead, providing an equivalent interface:
@@ -21,15 +74,14 @@ module.exports.getStream = function getStream(ssl = false) {
2174
return net.Socket()
2275
}
2376
const { CloudflareSocket } = require('pg-cloudflare')
24-
return new CloudflareSocket(ssl);
77+
return new CloudflareSocket(ssl)
2578
}
2679
```
2780

2881
## Node.js implementation of the Socket API proposal
2982

3083
If you're looking for a way to rely on `connect()` as the interface you use to interact with raw sockets, but need this interface to be available in a Node.js environment, [`@arrowood.dev/socket`](https://github.com/Ethan-Arrowood/socket) provides a Node.js implementation of the Socket API.
3184

32-
3385
### license
3486

3587
The MIT License (MIT)

packages/pg-cloudflare/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
},
1212
"exports": {
1313
".": {
14-
"import": "./esm/index.mjs",
15-
"require": "./dist/index.js",
16-
"default": "./dist/index.js"
14+
"cloudflare": {
15+
"import": "./esm/index.mjs",
16+
"require": "./dist/index.js"
17+
},
18+
"default": "./dist/empty.js"
1719
}
1820
},
1921
"scripts": {

packages/pg-esm-test/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "index.js",
66
"type": "module",
77
"scripts": {
8-
"test": "node --test"
8+
"test": "node --test --conditions=cloudflare"
99
},
1010
"keywords": [
1111
"postgres",

0 commit comments

Comments
 (0)