diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 27ea7c8bc..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 }} @@ -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 @@ -95,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 @@ -103,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 @@ -111,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 @@ -119,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 @@ -127,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 @@ -135,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 @@ -143,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 @@ -151,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 @@ -159,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 @@ -167,18 +168,25 @@ 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/** - retention-days: 60 - 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 + - 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-v22.x + path: ./packages/pglite-pgmq/release/** + retention-days: 60 + - name: Typecheck pglite working-directory: ${{ github.workspace }}/packages/pglite run: pnpm typecheck @@ -192,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: @@ -214,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 @@ -310,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: @@ -330,56 +338,62 @@ 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-v22.x + path: ./packages/pglite-pgmq/release/ - name: Install dependencies run: pnpm install --frozen-lockfile @@ -462,6 +476,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 @@ -474,81 +495,87 @@ 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-v22.x + path: ./packages/pglite-mq/dist/ + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -558,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 @@ -616,7 +643,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 @@ -648,61 +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-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 diff --git a/docs/extensions/development.md b/docs/extensions/development.md index 92e8a65cb..c89ae8a1f 100644 --- a/docs/extensions/development.md +++ b/docs/extensions/development.md @@ -108,117 +108,63 @@ 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: - -``` -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', - ]) -} +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 + +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 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 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 + +$ cd packages/pglite-myawesomextension $ pnpm test + ``` Fix any errors that occur, re-run the tests! Iterate until everything works as expected. @@ -240,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. +``` 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/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/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..dc8756ca7 --- /dev/null +++ b/packages/pglite-pgmq/package.json @@ -0,0 +1,64 @@ +{ + "name": "@electric-sql/pglite-pgmq", + "version": "0.0.1", + "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/pnpm-lock.yaml b/pnpm-lock.yaml index b7be1cbfe..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 @@ -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': @@ -1961,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==} @@ -2290,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==} @@ -2338,6 +2358,7 @@ packages: bun@1.1.30: resolution: {integrity: sha512-ysRL1pq10Xba0jqVLPrKU3YIv0ohfp3cTajCPtpjCyppbn3lfiAVNpGoHfyaxS17OlPmWmR67UZRPw/EueQuug==} + cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -2608,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: @@ -2653,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==} @@ -3004,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==} @@ -3571,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: @@ -3647,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==} @@ -3914,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: @@ -3959,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==} @@ -4319,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==} @@ -6751,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: {} @@ -7095,7 +7119,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.3: {} + detect-libc@2.1.2: {} devlop@1.1.0: dependencies: @@ -7146,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 @@ -8209,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 @@ -8499,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: {} @@ -8544,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: {} @@ -8896,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 @@ -9036,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: diff --git a/postgres-pglite b/postgres-pglite index 90ad65c1f..2483317ea 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 90ad65c1fc8b2352cc5d8f073cd98e751805c926 +Subproject commit 2483317eab3d5d3aaf970aa5561af8965b586a9d