pgserve 2.6.7 → 2.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -14,6 +14,84 @@ All notable changes to `pgserve` are documented here. The format follows
14
14
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres
15
15
  to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
16
16
 
17
+ ## [2.6.9] - 2026-05-12
18
+
19
+ **The actual final v2.x publish.** Bundles every fix needed to get
20
+ Build Tarballs → Sign + Attest → release-publish completing end-to-end
21
+ on the two platforms the v2.x signed-tarball pipeline supports.
22
+
23
+ ### Fixed
24
+
25
+ - `scripts/assemble-tarball.sh` — defensive `${tar_flags[@]+...}`
26
+ expansion. macOS BSD tar lacks `--sort`/`--mtime`/`--owner`, so the
27
+ array stays empty on darwin runners; under `set -u`, expanding an
28
+ empty array errored as `tar_flags[@]: unbound variable` and broke
29
+ every darwin-* build.
30
+
31
+ ### Changed (matrix scope)
32
+
33
+ Per Felipe directive 2026-05-12 ("just windows macos and linux, no
34
+ Intel Mac"), the signed-tarball pipeline matrix is reduced to the
35
+ platforms that actually have a working @embedded-postgres npm
36
+ package + a wired-in build path:
37
+
38
+ - ✅ `linux-x64-glibc` (linux)
39
+ - ✅ `darwin-arm64` (macos — Apple Silicon)
40
+ - ❌ `darwin-x64` — dropped (Intel Mac)
41
+ - ❌ `linux-arm64` — never working (no upstream pkg)
42
+ - ❌ `linux-x64-musl` — never working (no upstream pkg)
43
+ - 🔁 `windows-x64` — continues to ship via npm (version.yml inline
44
+ publish); not in the signed-tarball pipeline
45
+
46
+ ### Consumer impact
47
+
48
+ - `@withone/cli` and any other npm dependent: zero impact — npm package
49
+ installs the same way, optional native deps still cover windows-x64
50
+ + darwin-x64 + linux-x64 + darwin-arm64 via @embedded-postgres.
51
+ - Operators expecting GH Release signed tarballs: linux-x64 + darwin-
52
+ arm64 only. v2.x is end-of-line for Intel Mac signed tarballs.
53
+
54
+ ### Cohort wrap-up
55
+
56
+ This is **the** last `pgserve`-named npm publish. Subsequent
57
+ development moves to the `autopg` package starting at v3.0.0 from the
58
+ new `automagik-dev/autopg` repo (post org transfer).
59
+
60
+ ## [2.6.8] - 2026-05-12
61
+
62
+ **Final v2.x maintenance release with full signed-tarball GH Release.**
63
+ v2.6.7 closed the `autopg --version` smoke gate but Build Tarballs
64
+ still failed on the next smoke check — `postgres --version` couldn't
65
+ load `libicui18n.so.60`. Root cause: `fetch-postgres-bins.sh` was
66
+ copying `native/bin` + `native/share` from the npm
67
+ `@embedded-postgres` payload but skipping `native/lib`, AND was not
68
+ recreating the SONAME symlinks described in `pg-symlinks.json`
69
+ (`libicui18n.so.60 → libicui18n.so.60.2`).
70
+
71
+ ### Fixed
72
+
73
+ - `scripts/fetch-postgres-bins.sh:stage_from_pkg` now copies
74
+ `native/lib/` into the staging directory + replays
75
+ `native/pg-symlinks.json` to recreate the 14 SONAME aliases. The
76
+ postgres binary's RPATH is `../lib/` (origin-relative), so all
77
+ bundled deps (libxml2, libssl, libcrypto, libz, libicudata,
78
+ libicui18n, libicuuc, libecpg, libpgtypes, libpq, …) now resolve at
79
+ runtime regardless of what the host system has installed.
80
+
81
+ ### Validated
82
+
83
+ - Local reproduction: extracted tarball, ran
84
+ `./postgres/bin/postgres --version` →
85
+ `postgres (PostgreSQL) 18.3` ✅
86
+
87
+ ### Cohort wrap-up
88
+
89
+ This is the LAST `pgserve`-named npm publish. Subsequent development
90
+ moves to the `autopg` package starting at v3.0.0 from the new
91
+ `automagik-dev/autopg` repo (post org transfer). Consumers like
92
+ `@withone/cli` (`pgserve: ^2.x`) stay on npm latest indefinitely;
93
+ v2.6.8 is the cohort's final stable polish.
94
+
17
95
  ## [2.6.7] - 2026-05-12
18
96
 
19
97
  **Stability-focused follow-up to v2.6.6** — closes the missing
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pgserve",
3
- "version": "2.6.7",
3
+ "version": "2.6.9",
4
4
  "description": "Embedded PostgreSQL server with true concurrent connections - zero config, auto-provision databases",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -165,7 +165,12 @@ assemble_one() {
165
165
  tar_flags+=(--owner=0 --group=0 --numeric-owner)
166
166
  fi
167
167
 
168
- tar -C "$stage" -czf "$tarball" "${tar_flags[@]}" autopg/ || return 1
168
+ # macOS BSD tar lacks --sort/--mtime/--owner, so tar_flags can stay
169
+ # empty on darwin-* runners. Under `set -u` (script-wide), expanding
170
+ # "${tar_flags[@]}" on an empty array errors as `tar_flags[@]: unbound
171
+ # variable`. The `${arr[@]+"${arr[@]}"}` pattern expands the array
172
+ # only when it has elements, leaving the command intact otherwise.
173
+ tar -C "$stage" -czf "$tarball" ${tar_flags[@]+"${tar_flags[@]}"} autopg/ || return 1
169
174
  echo " ✓ tarball: $tarball ($(du -h "$tarball" | cut -f1))"
170
175
 
171
176
  # 4) outer SHA256 — Group 8 cosign-signs this; Group 9 publishes both.
@@ -142,6 +142,56 @@ EOF
142
142
 
143
143
  cp -R "${native}/bin" "${out_dir}/bin"
144
144
  cp -R "${native}/share" "${out_dir}/share" 2>/dev/null || mkdir -p "${out_dir}/share"
145
+
146
+ # The postgres binary's RPATH is `../lib/` (origin-relative), so it
147
+ # looks for libxml2 / libssl / libcrypto / libicu* in
148
+ # ${out_dir}/lib at runtime. The npm payload bundles all of these
149
+ # under native/lib (verified: libicui18n.so.60.2, libssl.so.1.1,
150
+ # etc. — 25 MB of bundled deps). Without copying lib/ the tarball
151
+ # extracts a postgres binary that fails with
152
+ # `error while loading shared libraries: libicui18n.so.60: cannot
153
+ # open shared object file: No such file or directory` on any
154
+ # platform that doesn't ship libicu60 system-wide (Ubuntu >= 20.04
155
+ # ships libicu70/74; only 18.04 ships libicu60).
156
+ #
157
+ # The package's normal postinstall creates SONAME symlinks
158
+ # (libicui18n.so.60 → libicui18n.so.60.2) from pg-symlinks.json, but
159
+ # we install with `--ignore-scripts` (security posture), so we must
160
+ # replay the symlink manifest manually. Without these symlinks the
161
+ # binary still can't find libicui18n.so.60 because npm packs only
162
+ # the real `.so.60.2` files, not the SONAME aliases.
163
+ if [[ -d "${native}/lib" ]]; then
164
+ cp -R "${native}/lib" "${out_dir}/lib"
165
+ fi
166
+
167
+ if [[ -f "${native}/pg-symlinks.json" ]]; then
168
+ # Strip the `native/` prefix from `source` + `target` and recreate
169
+ # symlinks under out_dir using relative names. Uses node so we get
170
+ # robust JSON parsing without yanking jq in as a dep.
171
+ OUT_DIR="$out_dir" MANIFEST="${native}/pg-symlinks.json" node -e '
172
+ const fs = require("fs");
173
+ const path = require("path");
174
+ const out = process.env.OUT_DIR;
175
+ const manifest = JSON.parse(fs.readFileSync(process.env.MANIFEST, "utf8"));
176
+ let made = 0;
177
+ for (const entry of manifest) {
178
+ // {"source":"native/lib/libicui18n.so.60.2","target":"native/lib/libicui18n.so.60"}
179
+ const src = entry.source.replace(/^native\//, "");
180
+ const tgt = entry.target.replace(/^native\//, "");
181
+ const tgtPath = path.join(out, tgt);
182
+ const srcRel = path.basename(src);
183
+ try { fs.unlinkSync(tgtPath); } catch {}
184
+ try {
185
+ fs.mkdirSync(path.dirname(tgtPath), { recursive: true });
186
+ fs.symlinkSync(srcRel, tgtPath);
187
+ made++;
188
+ } catch (err) {
189
+ console.error(" symlink failed: " + tgt + " -> " + srcRel + ": " + err.message);
190
+ }
191
+ }
192
+ console.error(" -> created " + made + " library SONAME symlinks");
193
+ ' || echo " -> warning: pg-symlinks.json processing failed (postgres may not load shared libs)"
194
+ fi
145
195
  popd >/dev/null
146
196
  }
147
197