From 52bbba568efec072000c9e19297042c03458114e Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sat, 27 Jun 2026 19:32:16 +0200 Subject: [PATCH 01/12] style --- docs/extensions/extensions.data.ts | 16 ++ package.json | 5 +- packages/pglite-pgmq/.gitignore | 2 + packages/pglite-pgmq/README.md | 45 ++++++ packages/pglite-pgmq/eslint.config.js | 21 +++ packages/pglite-pgmq/package.json | 64 ++++++++ packages/pglite-pgmq/scripts/bundle-wasm.ts | 8 + packages/pglite-pgmq/src/index.ts | 17 +++ packages/pglite-pgmq/tests/pgtap.test.ts | 157 ++++++++++++++++++++ packages/pglite-pgmq/tsconfig.json | 7 + packages/pglite-pgmq/tsup.config.ts | 25 ++++ packages/pglite-pgmq/vitest.config.ts | 9 ++ postgres-pglite | 2 +- 13 files changed, 375 insertions(+), 3 deletions(-) create mode 100644 packages/pglite-pgmq/.gitignore create mode 100644 packages/pglite-pgmq/README.md create mode 100644 packages/pglite-pgmq/eslint.config.js create mode 100644 packages/pglite-pgmq/package.json create mode 100644 packages/pglite-pgmq/scripts/bundle-wasm.ts create mode 100644 packages/pglite-pgmq/src/index.ts create mode 100644 packages/pglite-pgmq/tests/pgtap.test.ts create mode 100644 packages/pglite-pgmq/tsconfig.json create mode 100644 packages/pglite-pgmq/tsup.config.ts create mode 100644 packages/pglite-pgmq/vitest.config.ts diff --git a/docs/extensions/extensions.data.ts b/docs/extensions/extensions.data.ts index 7bff4ff48..7d098743a 100644 --- a/docs/extensions/extensions.data.ts +++ b/docs/extensions/extensions.data.ts @@ -665,6 +665,22 @@ const baseExtensions: Extension[] = [ core: true, size: 11554, }, + { + name: 'pgmq', + description: ` + A lightweight message queue. Like AWS SQS and RSMQ but on Postgres. + + This is an **external** extension, distributed as a separate package at https://www.npmjs.com/package/@electric-sql/pglite-pgmq + `, + shortDescription: + 'A lightweight message queue. Like AWS SQS and RSMQ but on Postgres.', + docs: 'https://github.com/pgmq/pgmq', + tags: ['postgres extension', 'external'], + importPath: '@electric-sql/pglite-pgmq', + importName: 'pgmq', + size: 41908, + npmjsUrl: 'https://www.npmjs.com/package/@electric-sql/pglite-pgmq', + }, ] const tags = [ diff --git a/package.json b/package.json index 3daf70a5a..36c1eec4c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "ci:publish": "pnpm changeset publish", "ts:build": "pnpm -r --filter \"./packages/**\" build", "ts:build:debug": "DEBUG=true pnpm ts:build", - "wasm:copy-pgvector": "mkdir -p ./packages/pglite-pgvector/release && cp ./postgres-pglite/dist/extensions/other/vector.tar.gz ./packages/pglite-pgvector/release", + "wasm:copy-pgmq": "mkdir -p ./packages/pglite-pgmq/release && cp ./postgres-pglite/dist/extensions/other/pgmq-extension.tar.gz ./packages/pglite-pgmq/release/pgmq.tar.gz", + "wasm:copy-pgvector": "mkdir -p ./packages/pglite-pgvector/release && cp ./postgres-pglite/dist/extensions/other/vector.tar.gz ./packages/pglite-pgvector/release", "wasm:copy-pg_uuidv7": "mkdir -p ./packages/pglite-pg_uuidv7/release && cp ./postgres-pglite/dist/extensions/other/pg_uuidv7.tar.gz ./packages/pglite-pg_uuidv7/release", "wasm:copy-pgtap": "mkdir -p ./packages/pglite-pgtap/release && cp ./postgres-pglite/dist/extensions/other/pgtap.tar.gz ./packages/pglite-pgtap/release", "wasm:copy-pg_ivm": "mkdir -p ./packages/pglite-pg_ivm/release && cp ./postgres-pglite/dist/extensions/other/pg_ivm.tar.gz ./packages/pglite-pg_ivm/release", @@ -20,7 +21,7 @@ "wasm:copy-age": "mkdir -p ./packages/pglite-age/release && cp ./postgres-pglite/dist/extensions/other/age.tar.gz ./packages/pglite-age/release", "wasm:copy-pg_textsearch": "mkdir -p ./packages/pglite-pg_textsearch/release && cp ./postgres-pglite/dist/extensions/other/pg_textsearch.tar.gz ./packages/pglite-pg_textsearch/release", "wasm:copy-postgis": "mkdir -p ./packages/pglite-postgis/release && cp ./postgres-pglite/dist/extensions/other/postgis.tar.gz ./packages/pglite-postgis/release", - "wasm:copy-other_extensions": "pnpm wasm:copy-postgis; pnpm wasm:copy-pg_textsearch; pnpm wasm:copy-age; pnpm wasm:copy-pg_hashids; pnpm wasm:copy-pg_ivm; pnpm wasm:copy-pgtap; pnpm wasm:copy-pg_uuidv7; pnpm wasm:copy-pgvector", + "wasm:copy-other_extensions": "pnpm wasm:copy-postgis; pnpm wasm:copy-pg_textsearch; pnpm wasm:copy-age; pnpm wasm:copy-pg_hashids; pnpm wasm:copy-pg_ivm; pnpm wasm:copy-pgtap; pnpm wasm:copy-pg_uuidv7; pnpm wasm:copy-pgvector; pnpm wasm:copy-pgmq", "wasm:copy-initdb": "mkdir -p ./packages/pglite/release && cp ./postgres-pglite/dist/bin/initdb.* ./packages/pglite/release", "wasm:copy-pgdump": "mkdir -p ./packages/pglite-tools/release && cp ./postgres-pglite/dist/bin/pg_dump.* ./packages/pglite-tools/release", "wasm:copy-pglite": "mkdir -p ./packages/pglite/release/ && cp ./postgres-pglite/dist/bin/pglite.* ./packages/pglite/release/ && cp ./postgres-pglite/dist/extensions/*.tar.gz ./packages/pglite/release/", diff --git a/packages/pglite-pgmq/.gitignore b/packages/pglite-pgmq/.gitignore new file mode 100644 index 000000000..ef8abb0e7 --- /dev/null +++ b/packages/pglite-pgmq/.gitignore @@ -0,0 +1,2 @@ +release/* +dist \ No newline at end of file diff --git a/packages/pglite-pgmq/README.md b/packages/pglite-pgmq/README.md new file mode 100644 index 000000000..e95d4af14 --- /dev/null +++ b/packages/pglite-pgmq/README.md @@ -0,0 +1,45 @@ +# @electric-sql/pglite-pgmq + +[pgmq](https://github.com/pgmq/pgmq) extension for [PGlite](https://pglite.dev). + +## Installation + +```bash +npm install @electric-sql/pglite-pgmq +``` + +## Usage + +```typescript +import { PGlite } from '@electric-sql/pglite' +import { pgmq } from '@electric-sql/pglite-pgmq' + +const pg = new PGlite({ + extensions: { + pgmq, + }, +}) + +await pg.exec('CREATE EXTENSION IF NOT EXISTS pgmq;') + +// create a queue +await pg.exec(`SELECT pgmq.create('my_queue'`); + +// send a message as JSON +await pg.exec(`SELECT * from pgmq.send( + queue_name => 'my_queue', + msg => '{"foo": "bar1"}' +);`) + +// read a message +const msg = await pg.exec(`SELECT * FROM pgmq.read( + queue_name => 'my_queue', + vt => 30, + qty => 2 +);`) + +``` + +## License + +Apache-2.0 \ No newline at end of file diff --git a/packages/pglite-pgmq/eslint.config.js b/packages/pglite-pgmq/eslint.config.js new file mode 100644 index 000000000..e1dc3262d --- /dev/null +++ b/packages/pglite-pgmq/eslint.config.js @@ -0,0 +1,21 @@ +import globals from 'globals' +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + ignores: ['release/**/*', 'dist/**/*'], + }, + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + rules: { + ...rootConfig.rules, + '@typescript-eslint/no-explicit-any': 'off', + }, + }, +] \ No newline at end of file diff --git a/packages/pglite-pgmq/package.json b/packages/pglite-pgmq/package.json new file mode 100644 index 000000000..5bcb52a0f --- /dev/null +++ b/packages/pglite-pgmq/package.json @@ -0,0 +1,64 @@ +{ + "name": "@electric-sql/pglite-pgmq", + "version": "0.0.4", + "description": "pgmq extension for PGlite", + "author": "Electric DB Limited", + "homepage": "https://pglite.dev", + "license": "Apache-2.0", + "keywords": [ + "postgres", + "sql", + "database", + "wasm", + "pglite", + "pqmq" + ], + "private": false, + "publishConfig": { + "access": "public" + }, + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + } + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/electric-sql/pglite.git", + "directory": "packages/pglite-pgmq" + }, + "scripts": { + "build": "tsup && tsx scripts/bundle-wasm.ts", + "check:exports": "attw . --pack --profile node16", + "lint": "eslint ./src ./tests --report-unused-disable-directives --max-warnings 0", + "format": "prettier --write ./src ./tests", + "typecheck": "tsc", + "stylecheck": "pnpm lint && prettier --check ./src ./tests", + "test": "vitest", + "prepublishOnly": "pnpm check:exports" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.18.1", + "@electric-sql/pglite": "workspace:*", + "@electric-sql/pglite-utils": "workspace:*", + "@types/node": "^20.16.11", + "vitest": "^2.1.2" + }, + "peerDependencies": { + "@electric-sql/pglite": "workspace:*" + } +} diff --git a/packages/pglite-pgmq/scripts/bundle-wasm.ts b/packages/pglite-pgmq/scripts/bundle-wasm.ts new file mode 100644 index 000000000..0c17886e1 --- /dev/null +++ b/packages/pglite-pgmq/scripts/bundle-wasm.ts @@ -0,0 +1,8 @@ +import { copyFiles, findAndReplaceInDir } from '@electric-sql/pglite-utils/scripts/fileUtils' + +async function main() { + await copyFiles('./release', './dist') + await findAndReplaceInDir('./dist', /\.\.\/release\//g, './', ['.js', '.cjs']) +} + +await main() diff --git a/packages/pglite-pgmq/src/index.ts b/packages/pglite-pgmq/src/index.ts new file mode 100644 index 000000000..d8f29d89a --- /dev/null +++ b/packages/pglite-pgmq/src/index.ts @@ -0,0 +1,17 @@ +import type { + Extension, + ExtensionSetupResult, + PGliteInterface, +} from '@electric-sql/pglite' + +const setup = async (_pg: PGliteInterface, emscriptenOpts: any) => { + return { + emscriptenOpts, + bundlePath: new URL('../release/pgmq.tar.gz', import.meta.url), + } satisfies ExtensionSetupResult +} + +export const pgmq = { + name: 'pgmq', + setup, +} satisfies Extension diff --git a/packages/pglite-pgmq/tests/pgtap.test.ts b/packages/pglite-pgmq/tests/pgtap.test.ts new file mode 100644 index 000000000..11fce2192 --- /dev/null +++ b/packages/pglite-pgmq/tests/pgtap.test.ts @@ -0,0 +1,157 @@ +import { describe, it, expect, beforeEach, afterEach } from 'vitest' +import { PGlite } from '@electric-sql/pglite' +import { pgmq } from '../src/index.js' + +describe(`pgmq`, () => { + let pg: PGlite + let dataDirArchive: File | Blob + beforeEach(async () => { + if (!dataDirArchive) { + pg = await PGlite.create({ + extensions: { pgmq }, + }) + dataDirArchive = await pg.dumpDataDir('gzip') + } else { + pg = await PGlite.create({ + extensions: { pgmq }, + loadDataDir: dataDirArchive, + }) + } + await pg.exec('CREATE EXTENSION IF NOT EXISTS pgmq;') + }) + afterEach(async () => { + if (!pg.closed) { + await pg.close() + } + }) + + it('can load extension', async () => { + // Verify the extension is loaded + const res = await pg.query<{ extname: string }>(` + SELECT extname + FROM pg_extension + WHERE extname = 'pgmq' + `) + + expect(res.rows).toHaveLength(1) + expect(res.rows[0].extname).toBe('pgmq') + }) + + it('should send and receive a message', async () => { + const res = await pg.exec(` + SELECT pgmq.create('my_queue'); + `) + + expect(res).toEqual([ + { + rows: [ + { + create: '', + }, + ], + fields: [ + { + name: 'create', + dataTypeID: 2278, + }, + ], + affectedRows: 0, + }, + ]) + + const res1 = await pg.exec(` +SELECT * from pgmq.send( + queue_name => 'my_queue', + msg => '{"foo": "bar1"}' +);`) + + expect(res1).toEqual([ + { + rows: [ + { + send: 1, + }, + ], + fields: [ + { + name: 'send', + dataTypeID: 20, + }, + ], + affectedRows: 0, + }, + ]) + + const res2 = await pg.exec(` + SELECT * FROM pgmq.read( + queue_name => 'my_queue', + vt => 30, + qty => 2 +);`) + + expect(res2[0].rows[0].message.foo).toEqual('bar1') + }) + + // it('should check for correct amounts of tests', async () => { + // const res = await pg.exec(` + // BEGIN; + // SELECT plan(1); -- wrong amount of tests + // SELECT pass('This test passes'); + // SELECT pass('This test passes too'); + // SELECT * FROM finish(); + // ROLLBACK; + // `) + + // expect(res.length).toBe(6) + // expect(res[1].rows).toEqual([{ plan: '1..1' }]) + // expect(res[2].rows).toEqual([{ pass: 'ok 1 - This test passes' }]) + // expect(res[3].rows).toEqual([{ pass: 'ok 2 - This test passes too' }]) + // expect(res[4].rows).toEqual([ + // { + // finish: '# Looks like you planned 1 test but ran 2', + // }, + // ]) + // }) + + // it('should run multiple tests', async () => { + // const res = await pg.exec(` + // -- Start transaction and plan the tests. + // BEGIN; + // CREATE TABLE test_table ( + // id SERIAL NOT NULL PRIMARY KEY, + // name TEXT DEFAULT '' + // ); + // SELECT plan(4); -- set the wrong number of tests on purpose + + // -- Test that public schema exists + // SELECT has_schema('public', 'public schema should exist'); + + // SELECT has_table('public', 'test_table', 'test_table should exist in public'); + + // -- Cause an error + // SELECT has_table('table_that_does_not_exist', 'this table should exist'); + + // -- Finish the tests and clean up. + // SELECT * FROM finish(); + // ROLLBACK; + // `) + + // expect(res.length).toBe(8) + // expect(res[2].rows).toEqual([{ plan: '1..4' }]) + // expect(res[3].rows).toEqual([ + // { has_schema: 'ok 1 - public schema should exist' }, + // ]) + // expect(res[4].rows).toEqual([ + // { has_table: 'ok 2 - test_table should exist in public' }, + // ]) + // expect(res[5].rows).toEqual([ + // { + // has_table: + // 'not ok 3 - this table should exist\n# Failed test 3: "this table should exist"', + // }, + // ]) + // expect(res[6].rows).toEqual([ + // { finish: '# Looks like you planned 4 tests but ran 3' }, + // ]) + // }) +}) diff --git a/packages/pglite-pgmq/tsconfig.json b/packages/pglite-pgmq/tsconfig.json new file mode 100644 index 000000000..27611a8fd --- /dev/null +++ b/packages/pglite-pgmq/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["node"] + }, + "include": ["src", "tsup.config.ts", "vitest.config.ts"] +} \ No newline at end of file diff --git a/packages/pglite-pgmq/tsup.config.ts b/packages/pglite-pgmq/tsup.config.ts new file mode 100644 index 000000000..5e47990ab --- /dev/null +++ b/packages/pglite-pgmq/tsup.config.ts @@ -0,0 +1,25 @@ +import { cpSync } from 'fs' +import { resolve } from 'path' +import { defineConfig } from 'tsup' + +const entryPoints = ['src/index.ts'] + +const minify = process.env.DEBUG === 'true' ? false : true + +export default defineConfig([ + { + entry: entryPoints, + sourcemap: true, + dts: { + entry: entryPoints, + resolve: true, + }, + clean: true, + minify: minify, + shims: true, + format: ['esm', 'cjs'], + onSuccess: async () => { + cpSync(resolve('release/pgmq.tar.gz'), resolve('dist/pgmq.tar.gz')) + }, + }, +]) \ No newline at end of file diff --git a/packages/pglite-pgmq/vitest.config.ts b/packages/pglite-pgmq/vitest.config.ts new file mode 100644 index 000000000..378f02808 --- /dev/null +++ b/packages/pglite-pgmq/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + testTimeout: 30000, + }, +}) \ No newline at end of file diff --git a/postgres-pglite b/postgres-pglite index 90ad65c1f..1bb6889ae 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 90ad65c1fc8b2352cc5d8f073cd98e751805c926 +Subproject commit 1bb6889aea2cf87f3f9136b18aa2077a76649b59 From 4c0226d6f0d5c9bd00b9ca0fd3edbf5cdebbd708 Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sat, 27 Jun 2026 19:40:07 +0200 Subject: [PATCH 02/12] pnpm lock --- pnpm-lock.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7be1cbfe..ca2b48fb5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -346,6 +346,24 @@ importers: specifier: ^2.1.2 version: 2.1.2(@types/node@20.16.11)(jsdom@24.1.3)(terser@5.34.1) + packages/pglite-pgmq: + devDependencies: + '@arethetypeswrong/cli': + specifier: ^0.18.1 + version: 0.18.1 + '@electric-sql/pglite': + specifier: workspace:* + version: link:../pglite + '@electric-sql/pglite-utils': + specifier: workspace:* + version: link:../pglite-utils + '@types/node': + specifier: ^20.16.11 + version: 20.16.11 + vitest: + specifier: ^2.1.2 + version: 2.1.2(@types/node@20.16.11)(jsdom@24.1.3)(terser@5.34.1) + packages/pglite-pgtap: devDependencies: '@arethetypeswrong/cli': From 9bd953880b0fd6990eb2bb65d4e76ede5e763af1 Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sat, 27 Jun 2026 19:47:59 +0200 Subject: [PATCH 03/12] update submodule --- postgres-pglite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgres-pglite b/postgres-pglite index 1bb6889ae..2483317ea 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 1bb6889aea2cf87f3f9136b18aa2077a76649b59 +Subproject commit 2483317eab3d5d3aaf970aa5561af8965b586a9d From b1522e989c9f4dbc5f9aedbb83b1e5b1ecfe23ee Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sat, 27 Jun 2026 23:32:06 +0200 Subject: [PATCH 04/12] fix ci --- .github/workflows/build_and_test.yml | 34 ++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 27ea7c8bc..46fc76d42 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -77,6 +77,7 @@ jobs: packages/pglite-pg_uuidv7/release packages/pglite-postgis/release packages/pglite-pgvector/release + packages/pglite-pgmq/release key: wasm-build-${{ steps.postgres-pglite-commit-id.outputs.hash }}-pglite-${{ steps.pglite-version.outputs.version }} - name: Build all if necessary @@ -163,12 +164,12 @@ jobs: path: ./packages/pglite-pgvector/release/** retention-days: 60 - - name: Upload pglite-pgvector dist artifacts to Github artifacts - id: upload-pglite-pgvector-dist-files + - name: Upload pglite-pgmq dist artifacts to Github artifacts + id: upload-pglite-pgmq-dist-files uses: actions/upload-artifact@v7 with: - name: pglite-pgvector-dist-files-node-v20.x - path: ./packages/pglite-pgvector/dist/** + name: pglite-pgmq-dist-files-node-v20.x + path: ./packages/pglite-pgmq/dist/** retention-days: 60 - name: Upload pglite-age build artifacts to Github artifacts @@ -380,6 +381,12 @@ jobs: with: name: pglite-age-release-files-node-v20.x path: ./packages/pglite-age/release/ + + - name: Download pglite-pgmq build artifacts + uses: actions/download-artifact@v8 + with: + name: pglite-pgmq-release-files-node-v20.x + path: ./packages/pglite-pgmq/release/ - name: Install dependencies run: pnpm install --frozen-lockfile @@ -462,6 +469,13 @@ jobs: name: pglite-pgvector-dist-node-v${{ matrix.node }} path: ./packages/pglite-pgvector/dist/* + - name: Upload pglite-pgmq distribution artifact + id: upload-pglite-pgmq-dist + uses: actions/upload-artifact@v7 + with: + name: pglite-pgmq-dist-node-v${{ matrix.node }} + path: ./packages/pglite-pgmq/dist/* + publish-website-with-demos: name: Publish website with demos runs-on: blacksmith-4vcpu-ubuntu-2204 @@ -549,6 +563,12 @@ jobs: name: pglite-pgvector-dist-node-v20.x path: ./packages/pglite-pgvector/dist/ + - name: Download pglite-pgmq dist artifacts + uses: actions/download-artifact@v8 + with: + name: pglite-pgmq-dist-node-v20.x + path: ./packages/pglite-mq/dist/ + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -699,6 +719,12 @@ jobs: name: pglite-pgvector-release-files-node-v20.x path: ./packages/pglite-pgvector/release/ + - name: Download pglite-pgmq build artifacts + uses: actions/download-artifact@v8 + with: + name: pglite-pgmq-release-files-node-v20.x + path: ./packages/pglite-pgmq/release/ + - name: Download pglite-age build artifacts uses: actions/download-artifact@v8 with: From 334587f0d58b4dd4e58f60c65917884954eee02a Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sat, 27 Jun 2026 23:45:24 +0200 Subject: [PATCH 05/12] ci --- .github/workflows/build_and_test.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 46fc76d42..1dfbc1752 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -164,6 +164,13 @@ jobs: path: ./packages/pglite-pgvector/release/** retention-days: 60 + - name: Upload pglite-pgvector dist artifacts to Github artifacts + id: upload-pglite-pgvector-dist-files + uses: actions/upload-artifact@v7 + with: + name: pglite-pgvector-dist-files-node-v20.x + path: ./packages/pglite-pgvector/dist/** + - name: Upload pglite-pgmq dist artifacts to Github artifacts id: upload-pglite-pgmq-dist-files uses: actions/upload-artifact@v7 From 0c1020b5d46c931944640132bf8f86f6f53a1c36 Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 09:28:21 +0200 Subject: [PATCH 06/12] ci --- .github/workflows/build_and_test.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 1dfbc1752..523a760e3 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -171,14 +171,6 @@ jobs: name: pglite-pgvector-dist-files-node-v20.x path: ./packages/pglite-pgvector/dist/** - - name: Upload pglite-pgmq dist artifacts to Github artifacts - id: upload-pglite-pgmq-dist-files - uses: actions/upload-artifact@v7 - with: - name: pglite-pgmq-dist-files-node-v20.x - path: ./packages/pglite-pgmq/dist/** - retention-days: 60 - - name: Upload pglite-age build artifacts to Github artifacts id: upload-pglite-age-release-files uses: actions/upload-artifact@v7 @@ -187,6 +179,14 @@ jobs: path: ./packages/pglite-age/release/** retention-days: 60 + - name: Upload pglite-pgmq build artifacts to Github artifacts + id: upload-pglite-pgmq-release-files + uses: actions/upload-artifact@v7 + with: + name: pglite-pgmq-release-files-node-v20.x + path: ./packages/pglite-pgmq/release/** + retention-days: 60 + - name: Typecheck pglite working-directory: ${{ github.workspace }}/packages/pglite run: pnpm typecheck From 74351e9f56aa609039dde5d52ed7fecda4182d39 Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 09:43:21 +0200 Subject: [PATCH 07/12] fix pglite-pgmq version --- packages/pglite-pgmq/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pglite-pgmq/package.json b/packages/pglite-pgmq/package.json index 5bcb52a0f..dc8756ca7 100644 --- a/packages/pglite-pgmq/package.json +++ b/packages/pglite-pgmq/package.json @@ -1,6 +1,6 @@ { "name": "@electric-sql/pglite-pgmq", - "version": "0.0.4", + "version": "0.0.1", "description": "pgmq extension for PGlite", "author": "Electric DB Limited", "homepage": "https://pglite.dev", From 5548d7697116e4547f962f5ac6f148d1c11f43e6 Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 13:12:33 +0200 Subject: [PATCH 08/12] update extension development docs --- docs/extensions/development.md | 69 +++------------------------------- 1 file changed, 5 insertions(+), 64 deletions(-) diff --git a/docs/extensions/development.md b/docs/extensions/development.md index 92e8a65cb..d4ba541a0 100644 --- a/docs/extensions/development.md +++ b/docs/extensions/development.md @@ -108,75 +108,17 @@ These steps allow our build environment to pick up the extension's code, then bu #### Frontend -PGlite's frontend code is in the main [PGLite repo](https://github.com/electric-sql/pglite) +PGlite's frontend code is in the main [PGlite repo](https://github.com/electric-sql/pglite). -Create a new folder `packages/pglite/src/myawesomeextension` and a new file inside it `index.ts`. This is how PGlite will know how to load your new extension: +You will need to create a new package for your extension. The easiest way is to just copy the files from an existing extension package such as `packages/pglite-pgvector`. Obviously, you will need to adapt all the references to the previous extension. -``` -import type { - Extension, - ExtensionSetupResult, - PGliteInterface, -} from '../interface' - -const setup = async (_pg: PGliteInterface, emscriptenOpts: any) => { - return { - emscriptenOpts, - bundlePath: new URL('../../release/myawesomeextension.tar.gz', import.meta.url), - } satisfies ExtensionSetupResult -} - -export const myawesomeextension = { - name: 'myawesomeextension', - setup, -} satisfies Extension - -``` - -Now add the extension to `packages/pglite/package.json` exports: - -``` - "exports": { - ... - "./myawesomeextension": { - "import": { - "types": "./dist/myawesomeextension/index.d.ts", - "default": "./dist/myawesomeextension/index.js" - }, - "require": { - "types": "./dist/myawesomeextension/index.d.cts", - "default": "./dist/myawesomeextension/index.cjs" - } - }, -} -``` - -Open `packages/pglite/tsup.config.ts` and add your extension inside `entryPoints`: - -``` -const entryPoints = [ - ... - 'src/myawesomeextension/index.ts' -] -``` - -You also need to add the extension to `packages/pglite/scripts/bundle-wasm.ts`, inside `main()`: - -``` -async function main() { - ... - await findAndReplaceInDir('./dist/myawesomeextension', /\.\.\/release\//g, '', [ - '.js', - '.cjs', - ]) -} ``` To make it available in our online [REPL](https://pglite.dev/repl/), add the extension to `docs/repl/allExtensions.ts`: ``` -export { myawesomeextension } from '@electric-sql/pglite/myawesomeextension +export { myawesomeextension } from '@electric-sql/pglite-myawesomeextension ``` @@ -194,7 +136,7 @@ const baseExtensions: Extension[] = [ 'My awesome PostgreSQL extension', docs: 'https://github.com/myawesomeextension/extension', tags: ['postgres extension'], - importPath: '@electric-sql/pglite/myawesomeextension', + importPath: '@electric-sql/pglite-myawesomeextension', importName: 'my_awesome_extension', size: 123456, }, @@ -204,7 +146,6 @@ const baseExtensions: Extension[] = [ #### Tests To make sure that your extension works, you need to add some tests for it. We use [vitest](https://vitest.dev/). They will be run as part of our CI/CD pipeline. -Add a file `packages/pglite/tests/myawesomeextension.test.ts` and write there your tests. Have a look inside that folder `packages/pglite/tests` at other tests to get an idea how they work. #### Build and run tests @@ -217,7 +158,7 @@ $ pnpm build:all This will build **everything**, including your new extension. If there are no errors, you are ready to run the tests! ``` -$ cd packages/pglite +$ cd packages/pglite-myawesomextension $ pnpm test ``` From 8d4f981ab4939e2101e1738291ba3a5d70ae4ee9 Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 13:13:07 +0200 Subject: [PATCH 09/12] style --- docs/extensions/development.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/extensions/development.md b/docs/extensions/development.md index d4ba541a0..c89ae8a1f 100644 --- a/docs/extensions/development.md +++ b/docs/extensions/development.md @@ -112,12 +112,12 @@ PGlite's frontend code is in the main [PGlite repo](https://github.com/electric- You will need to create a new package for your extension. The easiest way is to just copy the files from an existing extension package such as `packages/pglite-pgvector`. Obviously, you will need to adapt all the references to the previous extension. - ``` To make it available in our online [REPL](https://pglite.dev/repl/), add the extension to `docs/repl/allExtensions.ts`: ``` + export { myawesomeextension } from '@electric-sql/pglite-myawesomeextension ``` @@ -125,22 +125,23 @@ export { myawesomeextension } from '@electric-sql/pglite-myawesomeextension Finally, add the extension description to `docs/extensions/extensions.data.ts`, inside `baseExtensions`: ``` + const baseExtensions: Extension[] = [ ... { - name: 'My awesome Postgres extension', - description: ` - My awesome Postgres extension is something that the world has never seen before. +name: 'My awesome Postgres extension', +description: ` My awesome Postgres extension is something that the world has never seen before. `, - shortDescription: - 'My awesome PostgreSQL extension', - docs: 'https://github.com/myawesomeextension/extension', - tags: ['postgres extension'], - importPath: '@electric-sql/pglite-myawesomeextension', - importName: 'my_awesome_extension', - size: 123456, +shortDescription: +'My awesome PostgreSQL extension', +docs: 'https://github.com/myawesomeextension/extension', +tags: ['postgres extension'], +importPath: '@electric-sql/pglite-myawesomeextension', +importName: 'my_awesome_extension', +size: 123456, }, ] + ``` #### Tests @@ -152,14 +153,18 @@ To make sure that your extension works, you need to add some tests for it. We us From PGlite's base folder: ``` + $ pnpm build:all + ``` This will build **everything**, including your new extension. If there are no errors, you are ready to run the tests! ``` + $ cd packages/pglite-myawesomextension $ pnpm test + ``` Fix any errors that occur, re-run the tests! Iterate until everything works as expected. @@ -181,3 +186,4 @@ As mentioned before, some extensions require more effort to integrate with PGlit Another source of pain for building an extension is the need to export symbols from the dependencies or from PGlite itself. Sometimes these are obvious only at runtime. We are still working on documentation and examples showing how to build more complex Postgres extensions for use with PGlite. Please check back soon, or reach out on [Discord](https://discord.com/channels/933657521581858818/1212676471588520006) if you would like to try building a particular extension for PGlite. +``` From 4bf24011bb728f0a98121a160ebbf155ae34af4a Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 16:57:29 +0200 Subject: [PATCH 10/12] upgrade nwtgck/actions-netlify to v4.0 --- .github/workflows/build_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 27ea7c8bc..89d0f663d 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -616,7 +616,7 @@ jobs: edit-mode: append - name: Deploy website to Netlify - uses: nwtgck/actions-netlify@v3.0 + uses: nwtgck/actions-netlify@v4.0 with: publish-dir: '/tmp/web' production-branch: master From dd2fd9b1547e9fd3a09b732cf8f0f3b4b4acb5ac Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 17:03:23 +0200 Subject: [PATCH 11/12] remove node 20 support (EOL). move to v22 as lowest --- .github/workflows/build_and_test.yml | 114 +++++++++++++-------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index b43fe4b41..41820e850 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -27,7 +27,7 @@ jobs: - uses: pnpm/action-setup@v5 - uses: actions/setup-node@v5 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile @@ -48,7 +48,7 @@ jobs: - uses: pnpm/action-setup@v5 - uses: actions/setup-node@v5 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install working-directory: ${{ github.workspace }} @@ -96,7 +96,7 @@ jobs: id: upload-pglite-interim-build-files uses: actions/upload-artifact@v7 with: - name: pglite-interim-build-files-node-v20.x + name: pglite-interim-build-files-node-v22.x path: ./packages/pglite/release/** retention-days: 60 @@ -104,7 +104,7 @@ jobs: id: upload-pglite-tools-release-files uses: actions/upload-artifact@v7 with: - name: pglite-tools-release-files-node-v20.x + name: pglite-tools-release-files-node-v22.x path: ./packages/pglite-tools/release/** retention-days: 60 @@ -112,7 +112,7 @@ jobs: id: upload-pglite-postgis-release-files uses: actions/upload-artifact@v7 with: - name: pglite-postgis-release-files-node-v20.x + name: pglite-postgis-release-files-node-v22.x path: ./packages/pglite-postgis/release/** retention-days: 60 @@ -120,7 +120,7 @@ jobs: id: upload-pglite-pg-hashids-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pg-hashids-release-files-node-v20.x + name: pglite-pg-hashids-release-files-node-v22.x path: ./packages/pglite-pg_hashids/release/** retention-days: 60 @@ -128,7 +128,7 @@ jobs: id: upload-pglite-pg-ivm-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pg-ivm-release-files-node-v20.x + name: pglite-pg-ivm-release-files-node-v22.x path: ./packages/pglite-pg_ivm/release/** retention-days: 60 @@ -136,7 +136,7 @@ jobs: id: upload-pglite-pgtap-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pgtap-release-files-node-v20.x + name: pglite-pgtap-release-files-node-v22.x path: ./packages/pglite-pgtap/release/** retention-days: 60 @@ -144,7 +144,7 @@ jobs: id: upload-pglite-pg-textsearch-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pg-textsearch-release-files-node-v20.x + name: pglite-pg-textsearch-release-files-node-v22.x path: ./packages/pglite-pg_textsearch/release/** retention-days: 60 @@ -152,7 +152,7 @@ jobs: id: upload-pglite-pg-uuidv7-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pg-uuidv7-release-files-node-v20.x + name: pglite-pg-uuidv7-release-files-node-v22.x path: ./packages/pglite-pg_uuidv7/release/** retention-days: 60 @@ -160,7 +160,7 @@ jobs: id: upload-pglite-pgvector-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pgvector-release-files-node-v20.x + name: pglite-pgvector-release-files-node-v22.x path: ./packages/pglite-pgvector/release/** retention-days: 60 @@ -168,14 +168,14 @@ jobs: id: upload-pglite-pgvector-dist-files uses: actions/upload-artifact@v7 with: - name: pglite-pgvector-dist-files-node-v20.x + name: pglite-pgvector-dist-files-node-v22.x path: ./packages/pglite-pgvector/dist/** - name: Upload pglite-age build artifacts to Github artifacts id: upload-pglite-age-release-files uses: actions/upload-artifact@v7 with: - name: pglite-age-release-files-node-v20.x + name: pglite-age-release-files-node-v22.x path: ./packages/pglite-age/release/** retention-days: 60 @@ -183,7 +183,7 @@ jobs: id: upload-pglite-pgmq-release-files uses: actions/upload-artifact@v7 with: - name: pglite-pgmq-release-files-node-v20.x + name: pglite-pgmq-release-files-node-v22.x path: ./packages/pglite-pgmq/release/** retention-days: 60 @@ -200,7 +200,7 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, 22.x, 23.x, 24.x] + node: [22.x, 23.x, 24.x, 25.x, 26.x] fail-fast: false # allow the build to continue even if some tests fail defaults: run: @@ -222,25 +222,25 @@ jobs: - name: Download PGlite WASM build artifacts uses: actions/download-artifact@v8 with: - name: pglite-interim-build-files-node-v20.x + name: pglite-interim-build-files-node-v22.x path: ./packages/pglite/release - name: Download pglite-tools WASM build artifacts uses: actions/download-artifact@v8 with: - name: pglite-tools-release-files-node-v20.x + name: pglite-tools-release-files-node-v22.x path: ./packages/pglite-tools/release - name: Download pglite-postgis build artifacts uses: actions/download-artifact@v8 with: - name: pglite-postgis-release-files-node-v20.x + name: pglite-postgis-release-files-node-v22.x path: ./packages/pglite-postgis/release - name: Download pglite-pgvector build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgvector-dist-files-node-v20.x + name: pglite-pgvector-dist-files-node-v22.x path: ./packages/pglite-pgvector/dist - name: Install dependencies @@ -318,7 +318,7 @@ jobs: runs-on: blacksmith-32vcpu-ubuntu-2204 strategy: matrix: - node: [20.x, 21.x, 22.x, 23.x, 24.x] + node: [22.x, 23.x, 24.x, 25.x, 26.x] fail-fast: false # allow the build to continue even if some tests fail needs: [build-and-test-pglite] steps: @@ -338,61 +338,61 @@ jobs: - name: Download pglite-tools WASM build artifacts uses: actions/download-artifact@v8 with: - name: pglite-tools-release-files-node-v20.x + name: pglite-tools-release-files-node-v22.x path: ./packages/pglite-tools/release/ - name: Download pglite-postgis build artifacts uses: actions/download-artifact@v8 with: - name: pglite-postgis-release-files-node-v20.x + name: pglite-postgis-release-files-node-v22.x path: ./packages/pglite-postgis/release/ - name: Download pglite-pg_hashids build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-hashids-release-files-node-v20.x + name: pglite-pg-hashids-release-files-node-v22.x path: ./packages/pglite-pg_hashids/release/ - name: Download pglite-pg_ivm build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-ivm-release-files-node-v20.x + name: pglite-pg-ivm-release-files-node-v22.x path: ./packages/pglite-pg_ivm/release/ - name: Download pglite-pgtap build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgtap-release-files-node-v20.x + name: pglite-pgtap-release-files-node-v22.x path: ./packages/pglite-pgtap/release/ - name: Download pglite-pg_textsearch build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-textsearch-release-files-node-v20.x + name: pglite-pg-textsearch-release-files-node-v22.x path: ./packages/pglite-pg_textsearch/release/ - name: Download pglite-pg_uuidv7 build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-uuidv7-release-files-node-v20.x + name: pglite-pg-uuidv7-release-files-node-v22.x path: ./packages/pglite-pg_uuidv7/release/ - name: Download pglite-pgvector build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgvector-release-files-node-v20.x + name: pglite-pgvector-release-files-node-v22.x path: ./packages/pglite-pgvector/release/ - name: Download pglite-age build artifacts uses: actions/download-artifact@v8 with: - name: pglite-age-release-files-node-v20.x + name: pglite-age-release-files-node-v22.x path: ./packages/pglite-age/release/ - name: Download pglite-pgmq build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgmq-release-files-node-v20.x + name: pglite-pgmq-release-files-node-v22.x path: ./packages/pglite-pgmq/release/ - name: Install dependencies @@ -495,85 +495,85 @@ jobs: - uses: pnpm/action-setup@v5 - uses: actions/setup-node@v5 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Download PGlite WASM build artifacts uses: actions/download-artifact@v8 with: - name: pglite-interim-build-files-node-v20.x + name: pglite-interim-build-files-node-v22.x path: ./packages/pglite/release - name: Download pglite-tools WASM build artifacts uses: actions/download-artifact@v8 with: - name: pglite-tools-release-files-node-v20.x + name: pglite-tools-release-files-node-v22.x path: ./packages/pglite-tools/release - name: Download pglite-postgis build artifacts uses: actions/download-artifact@v8 with: - name: pglite-postgis-release-files-node-v20.x + name: pglite-postgis-release-files-node-v22.x path: ./packages/pglite-postgis/release/ - name: Download PGlite build artifacts uses: actions/download-artifact@v8 with: - name: pglite-dist-node-v20.x + name: pglite-dist-node-v22.x path: ./packages/pglite/dist/ - name: Download pglite-postgis dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-postgis-dist-node-v20.x + name: pglite-postgis-dist-node-v22.x path: ./packages/pglite-postgis/dist/ - name: Download pglite-age dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-age-dist-node-v20.x + name: pglite-age-dist-node-v22.x path: ./packages/pglite-age/dist/ - name: Download pglite-pg_hashids dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-hashids-dist-node-v20.x + name: pglite-pg-hashids-dist-node-v22.x path: ./packages/pglite-pg_hashids/dist/ - name: Download pglite-pg_ivm dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-ivm-dist-node-v20.x + name: pglite-pg-ivm-dist-node-v22.x path: ./packages/pglite-pg_ivm/dist/ - name: Download pglite-pgtap dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgtap-dist-node-v20.x + name: pglite-pgtap-dist-node-v22.x path: ./packages/pglite-pgtap/dist/ - name: Download pglite-pg_textsearch dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-textsearch-dist-node-v20.x + name: pglite-pg-textsearch-dist-node-v22.x path: ./packages/pglite-pg_textsearch/dist/ - name: Download pglite-pg_uuidv7 dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-uuidv7-dist-node-v20.x + name: pglite-pg-uuidv7-dist-node-v22.x path: ./packages/pglite-pg_uuidv7/dist/ - name: Download pglite-pgvector dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgvector-dist-node-v20.x + name: pglite-pgvector-dist-node-v22.x path: ./packages/pglite-pgvector/dist/ - name: Download pglite-pgmq dist artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgmq-dist-node-v20.x + name: pglite-pgmq-dist-node-v22.x path: ./packages/pglite-mq/dist/ - name: Install dependencies @@ -585,13 +585,13 @@ jobs: - name: Download PGlite web build artifacts uses: actions/download-artifact@v8 with: - name: pglite-interim-build-files-node-v20.x + name: pglite-interim-build-files-node-v22.x path: /tmp/web - name: Download pglite-tools dist artifacts to tmp uses: actions/download-artifact@v8 with: - name: pglite-tools-dist-node-v20.x + name: pglite-tools-dist-node-v22.x path: /tmp/pglite-tools - name: Build demo site @@ -675,67 +675,67 @@ jobs: - name: Download PGlite WASM build artifacts uses: actions/download-artifact@v8 with: - name: pglite-interim-build-files-node-v20.x + name: pglite-interim-build-files-node-v22.x path: ./packages/pglite/release - name: Download pglite-tools build artifacts uses: actions/download-artifact@v8 with: - name: pglite-tools-release-files-node-v20.x + name: pglite-tools-release-files-node-v22.x path: ./packages/pglite-tools/release/ - name: Download pglite-postgis build artifacts uses: actions/download-artifact@v8 with: - name: pglite-postgis-release-files-node-v20.x + name: pglite-postgis-release-files-node-v22.x path: ./packages/pglite-postgis/release/ - name: Download pglite-pg_hashids build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-hashids-release-files-node-v20.x + name: pglite-pg-hashids-release-files-node-v22.x path: ./packages/pglite-pg_hashids/release/ - name: Download pglite-pg_ivm build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-ivm-release-files-node-v20.x + name: pglite-pg-ivm-release-files-node-v22.x path: ./packages/pglite-pg_ivm/release/ - name: Download pglite-pgtap build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgtap-release-files-node-v20.x + name: pglite-pgtap-release-files-node-v22.x path: ./packages/pglite-pgtap/release/ - name: Download pglite-pg_textsearch build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-textsearch-release-files-node-v20.x + name: pglite-pg-textsearch-release-files-node-v22.x path: ./packages/pglite-pg_textsearch/release/ - name: Download pglite-pg_uuidv7 build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pg-uuidv7-release-files-node-v20.x + name: pglite-pg-uuidv7-release-files-node-v22.x path: ./packages/pglite-pg_uuidv7/release/ - name: Download pglite-pgvector build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgvector-release-files-node-v20.x + name: pglite-pgvector-release-files-node-v22.x path: ./packages/pglite-pgvector/release/ - name: Download pglite-pgmq build artifacts uses: actions/download-artifact@v8 with: - name: pglite-pgmq-release-files-node-v20.x + name: pglite-pgmq-release-files-node-v22.x path: ./packages/pglite-pgmq/release/ - name: Download pglite-age build artifacts uses: actions/download-artifact@v8 with: - name: pglite-age-release-files-node-v20.x + name: pglite-age-release-files-node-v22.x path: ./packages/pglite-age/release/ - run: pnpm install --frozen-lockfile From 4847053aaa19e42b7b4e311557a2e2131f86fa6c Mon Sep 17 00:00:00 2001 From: Tudor Zaharia Date: Sun, 28 Jun 2026 17:25:40 +0200 Subject: [PATCH 12/12] upgrade better-sqlite3 --- packages/benchmark/package.json | 2 +- pnpm-lock.yaml | 82 ++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 39 deletions(-) diff --git a/packages/benchmark/package.json b/packages/benchmark/package.json index 09035d409..afa20db26 100644 --- a/packages/benchmark/package.json +++ b/packages/benchmark/package.json @@ -18,10 +18,10 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.11", "ascii-table3": "^0.9.0", - "better-sqlite3": "^11.1.2", "embedded-postgres": "15.5.1-beta.9" }, "dependencies": { + "better-sqlite3": "^12.11.1", "wa-sqlite": "https://github.com/rhashimoto/wa-sqlite.git#v0.9.14" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca2b48fb5..653b9b371 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,6 +158,9 @@ importers: '@electric-sql/pglite': specifier: workspace:* version: link:../pglite + better-sqlite3: + specifier: ^12.11.1 + version: 12.11.1 wa-sqlite: specifier: https://github.com/rhashimoto/wa-sqlite.git#v0.9.14 version: https://codeload.github.com/rhashimoto/wa-sqlite/tar.gz/6dbe4f044502a7a285e815896f56304a808fe25b @@ -168,9 +171,6 @@ importers: ascii-table3: specifier: ^0.9.0 version: 0.9.0 - better-sqlite3: - specifier: ^11.1.2 - version: 11.3.0 embedded-postgres: specifier: 15.5.1-beta.9 version: 15.5.1-beta.9 @@ -1979,6 +1979,7 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vitejs/plugin-react@4.3.2': resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} @@ -2308,8 +2309,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - better-sqlite3@11.3.0: - resolution: {integrity: sha512-iHt9j8NPYF3oKCNOO5ZI4JwThjt3Z6J6XrcwG85VNMVzv1ByqrHWv5VILEbCMFWDsoHhXvQ7oC8vgRXFAKgl9w==} + better-sqlite3@12.11.1: + resolution: {integrity: sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} @@ -2356,6 +2358,7 @@ packages: bun@1.1.30: resolution: {integrity: sha512-ysRL1pq10Xba0jqVLPrKU3YIv0ohfp3cTajCPtpjCyppbn3lfiAVNpGoHfyaxS17OlPmWmR67UZRPw/EueQuug==} + cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -2626,8 +2629,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} devlop@1.1.0: @@ -2671,8 +2674,8 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} @@ -3022,11 +3025,12 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -3589,14 +3593,14 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.68.0: - resolution: {integrity: sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==} + node-abi@3.92.0: + resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} engines: {node: '>=10'} node-emoji@2.2.0: @@ -3665,6 +3669,7 @@ packages: oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + deprecated: use oniguruma-to-es instead opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -3932,9 +3937,10 @@ packages: preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true prelude-ls@1.2.1: @@ -3977,8 +3983,8 @@ packages: psql-describe@0.1.5: resolution: {integrity: sha512-x6FvBd+/ro390hJh6kLOWtmH51+0zGjUawrLTnDvhupsc81cNTOUO3XJvG2zGq1KJeMT5uyHPscYb16ADMsZ2g==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -4337,8 +4343,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -6769,10 +6775,10 @@ snapshots: dependencies: is-windows: 1.0.2 - better-sqlite3@11.3.0: + better-sqlite3@12.11.1: dependencies: bindings: 1.5.0 - prebuild-install: 7.1.2 + prebuild-install: 7.1.3 binary-extensions@2.3.0: {} @@ -7113,7 +7119,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.3: {} + detect-libc@2.1.2: {} devlop@1.1.0: dependencies: @@ -7164,7 +7170,7 @@ snapshots: emojilib@2.4.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -8227,11 +8233,11 @@ snapshots: nanoid@3.3.7: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - node-abi@3.68.0: + node-abi@3.92.0: dependencies: semver: 7.6.3 @@ -8517,19 +8523,19 @@ snapshots: preact@10.24.2: {} - prebuild-install@7.1.2: + prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.3 + detect-libc: 2.1.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.68.0 - pump: 3.0.2 + napi-build-utils: 2.0.0 + node-abi: 3.92.0 + pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.5 tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} @@ -8562,9 +8568,9 @@ snapshots: psql-describe@0.1.5: {} - pump@3.0.2: + pump@3.0.4: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} @@ -8914,17 +8920,17 @@ snapshots: tabbable@6.2.0: {} - tar-fs@2.1.1: + tar-fs@2.1.5: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.2 + pump: 3.0.4 tar-stream: 2.2.0 tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 @@ -9054,7 +9060,7 @@ snapshots: tunnel-agent@0.6.0: dependencies: - safe-buffer: 5.2.1 + safe-buffer: 5.1.2 type-check@0.4.0: dependencies: