diff --git a/.changeset/loud-adults-compare.md b/.changeset/loud-adults-compare.md new file mode 100644 index 000000000..1520782ba --- /dev/null +++ b/.changeset/loud-adults-compare.md @@ -0,0 +1,5 @@ +--- +'@electric-sql/pglite-pgmq': patch +--- + +pglite-pgmq: initial deployment diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 27ea7c8bc..bdac57238 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 @@ -169,7 +170,6 @@ jobs: with: name: pglite-pgvector-dist-files-node-v20.x path: ./packages/pglite-pgvector/dist/** - retention-days: 60 - name: Upload pglite-age build artifacts to Github artifacts id: upload-pglite-age-release-files @@ -179,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 @@ -380,6 +388,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 +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 @@ -549,6 +570,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-pgmq/dist/ + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -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 @@ -699,6 +726,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: 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/docs/package.json b/docs/package.json index 7b05fab9d..34dd712f3 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,6 +28,7 @@ "@electric-sql/pglite-pg_textsearch": "workspace:*", "@electric-sql/pglite-pg_uuidv7": "workspace:*", "@electric-sql/pglite-pgtap": "workspace:*", + "@electric-sql/pglite-pgmq": "workspace:*", "@uiw/codemirror-theme-github": "^4.23.0", "dedent": "^1.5.3" } diff --git a/docs/repl/allExtensions.ts b/docs/repl/allExtensions.ts index 92b6659d9..cffd8b5f4 100644 --- a/docs/repl/allExtensions.ts +++ b/docs/repl/allExtensions.ts @@ -39,3 +39,4 @@ export { tsm_system_time } from '@electric-sql/pglite/contrib/tsm_system_time' export { unaccent } from '@electric-sql/pglite/contrib/unaccent' export { uuid_ossp } from '@electric-sql/pglite/contrib/uuid_ossp' export { vector } from '@electric-sql/pglite-pgvector' +export { pgmq } from '@electric-sql/pglite-pgmq' 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..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/pgmq.test.ts b/packages/pglite-pgmq/tests/pgmq.test.ts new file mode 100644 index 000000000..11fce2192 --- /dev/null +++ b/packages/pglite-pgmq/tests/pgmq.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..5873937f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,6 +62,9 @@ importers: '@electric-sql/pglite-pg_uuidv7': specifier: workspace:* version: link:../packages/pglite-pg_uuidv7 + '@electric-sql/pglite-pgmq': + specifier: workspace:* + version: link:../packages/pglite-pgmq '@electric-sql/pglite-pgtap': specifier: workspace:* version: link:../packages/pglite-pgtap @@ -346,6 +349,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': diff --git a/postgres-pglite b/postgres-pglite index 90ad65c1f..7b4ee5086 160000 --- a/postgres-pglite +++ b/postgres-pglite @@ -1 +1 @@ -Subproject commit 90ad65c1fc8b2352cc5d8f073cd98e751805c926 +Subproject commit 7b4ee5086055dc5e54ae1e13e487888249438e68