chore(deps): Update production (non-major) #141
No reviewers
Labels
No labels
dependencies
major
security-pin
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
trails-cool/trails!141
Loading…
Reference in a new issue
No description provided.
Delete branch "renovate/production-(non-major)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
10.0.2→10.0.312.30.0→12.31.08.2.2→8.3.04.6.0→4.6.2Release Notes
nodemailer/nodemailer (nodemailer)
v10.0.3Compare Source
Bug Fixes
timgit/pg-boss (pg-boss)
v12.31.0Compare Source
What's Changed
Schema version: 41 (a migration runs on upgrade — see Upgrading).
Highlights
Schedules take RRULE expressions
schedule()now accepts a recurrence rule (RFC 5545) anywhere a cron expression goes, for the schedules cron cannot express — the last Friday of the month, every second Monday, a schedule that stops on a date or after a number of runs.The expression is either the rule on its own or the recurrence lines of a calendar entry —
DTSTART,RRULE, and optionalRDATEandEXDATE:An expression carrying
FREQ=, or a line opening with an iCalendar property, is a rule; everything else is cron, which cannot be mistaken for one since no cron field contains=,:or;.schedule()decides once and stores the answer in the schedule table's newkindcolumn, so an expression is never validated as one format and evaluated as the other.getSchedules()returns it.schedule()rejects the rules a parser would quietly read differently than they were meant, such as an unknown part or a value out of range, and the combinations RFC 5545 forbids outright. A finite rule with nothing left to send is also rejected rather than stored.Schedules can catch up after an outage
When the Timekeeper does a schedule check, the pass sends the occurrences of the preceding 60 seconds, which is compared against the history to see if a job was missed. The new
missedoption decides what a schedule does about that.missedskiponceWorth knowing before choosing
once: a caught-up job is indistinguishable from an on-time one, it names the most recent missed occurrence rather than each one, and it can arrive beside the occurrence due now — two jobs, filed under two minutes, unless queue policy or asingletonKeycollapses them. The option applies to both expression formats.New scheduling funcitons: getSchedule() and previewSchedule()
getSchedule(name, key)reads the one row a(name, key)pair can have, ornull, instead of filtering the arraygetSchedules()returns.keydefaults to the empty string, the keyschedule()uses when none is given.previewSchedule(cron, options)answers with the next occurrences as an array ofDate. It is pure computation — no query, no started instance — and it tells the two formats apart the wayschedule()does, so a stored schedule can be previewed straight from itscroncolumn.countdefaults to 5 and is capped at 1000;fromdefaults to database time and takes the last occurrence of one page to get the next; the expression and zone are validated exactly asschedule()validates them, so anything it previews can also be stored. The walk gives up after a second rather than hold the event loop, so a sparse expression asked for a large count answers with fewer.Every schedule names the job it last produced
The schedule row now carries
lastJobId, so a schedule can be joined to its most recent run without keeping a record of your own. It is nullable and unconstrained on purpose: the job it names is subject to retention and will eventually be deleted, so a foreign key would either block retention or take the schedule with it.pg-boss runs on Bun
Bun is now a supported runtime, exercised in CI on every commit: a conformance suite drives install, send, fetch, complete, workers, scheduling and maintenance through
bun testagainst a real PostgreSQL.Bun's own client is supported as a driver alongside
pg, so a Bun application can share one client and one pool with pg-boss:sql.listen()is used where the runtime has it (Bun 1.4.0 and later), so a Bun deployment gets the same LISTEN/NOTIFY delivery apgone does, and falls back to polling on an older runtime. The client stays yours — pg-boss never callsend()on it. You do not need the adapter to run on Bun: the bundledpgdriver works under the runtime, and a connection string is the simpler choice.Two fixes underneath it reach further than Bun:
::textfor drivers that infer parameter types from the statement and would otherwise reject a json argument (#880, #897).fromDrizzle()onbun-sql.The CLI knows which engine it is talking to
A connection string does not say which engine answers it, and the engines do not accept the same schema — so
pg-boss migrateagainst CockroachDB emitted table partitioning, advisory locks and covering indexes, and failed partway through. The CLI now takes the same backend profile the library constructor does:--backend,PGBOSS_BACKENDor"backend"in the config file, resolved through the library's own resolver, socreate,migrate,rollback,plans,doctorandreindexall emit what that backend accepts and the CLI cannot disagree with a running instance.reindexnow says so up front on an engine that has no REINDEX, instead of surfacing a raw catalog error.pgliteis in-process and rejected here.The exported plan functions take the same profile, for a caller that generates SQL from code rather than from the CLI:
getConstructionPlans(),getMigrationPlans()andgetRollbackPlans()each acceptbackendin their options, resolved by the same resolver the constructor and the CLI use, and default to stock PostgreSQL as before. The profile is read capability by capability rather than as one distributed switch, so a plan drops only what that engine actually refuses: CockroachDB loses table partitioning, advisory locks, covering indexes and deferrable constraints, while YugabyteDB loses the first two and keeps the rest. Migration and rollback plans are built from the same backend-filtered migration set a live migration runs, so a statement an engine cannot execute — the column written in the transaction that added it, whichnoAddColumnBackfilldrops — is left out of the exported SQL for the same reason and at the same place. A name that is not a profile throws where it is named, rather than reaching the script.getConstructionPlans()takes an options object at all for the first time, which also makescreateSchema: falsereachable from the export for a schema that already exists or is created by something else.getIndexBloatPlans()is unchanged: it reads catalog statistics rather than emitting DDL.Also in this release
noAddColumnBackfillcompatibility flag for engines that refuse to write a column in the transaction that added it. CockroachDB sets it, which is what lets it migrate at all — see Upgrading.previewScheduleMaxCountis exported, so a service puttingpreviewSchedule()behind an API can validatecountagainst the same ceiling rather than a literal of its own.Upgrading
Schema 41 adds
schedule.kind(defaulted andCHECK-constrained) andschedule.last_job_id uuid, backfillsschedule.timezoneand gives it a default — catalog-only changes, no table rewrite.Every cron schedule can send twice during a rolling upgrade. The internal key that collapses a schedule's occurrence to one job changes format, and the two formats do not collide with each other, so while instances straddle releases one occurrence can produce two jobs. Passes claim every
cronMonitorIntervalSeconds(30 by default) against a 60-second window, so at least two passes land inside every occurrence's window and a rollout only has to put one of them on each release. Handlers that are not idempotent are worth stopping the schedulers for across the switch. The change itself fixes a real loss: the old key concatenated the queue name and the schedule key with__, and_is legal in both, so('report_', 'daily')and('report', '_daily')produced the same key and one of the two schedules silently lost its job every minute the occurrences coincided.Schedules with no time zone become UTC. Rows written before zones were validated could hold
timezone IS NULL, which read as the local zone of whatever instance evaluated them. The migration backfills those to UTC and the column now defaults to it. A deployment relying on the old reading should set the zone it wants before upgrading.Rule schedules should wait for the deployment to finish. An instance still on an older release reads a rule as cron, cannot parse it, and reports an
invalid_schedulewarning until it is replaced, so add rule schedules once every instance is on 12.31.0.CockroachDB can migrate again. It refuses to write a column in the transaction that added it, which schema 40 does — so a CockroachDB deployment on schema 39 could not reach 40 in 12.30.0, and would not have reached 41 either. Both migrations now leave that statement out on a backend that declares
noAddColumnBackfill, and both give the runtime the same answer without it: the monitor claim falls back tomonitor_onwhen it is NULL, which is the value the skipped statement would have written, so the upgrade stampede that seed prevents is closed on every backend rather than only on the ones whose migration could write the column. Schema 41's label is left to the first cron pass instead, so a schedule holding a rule reads ascronfromgetSchedules()until a pass reaches it and corrects it — nothing is lost, and a deployment running passes closes that window in one interval.Scripted migrations against a non-PostgreSQL engine need
--backend. Apg-boss migratein a deploy script keeps assuming stock PostgreSQL unless the profile is named, so add--backend cockroachdb(orPGBOSS_BACKEND) wherever the CLI runs against one of the distributed engines.Rolling back to 40 drops both columns and leaves
timezone's default in place, which is harmless: a 12.30.0 instance names the column on every write.New Contributors
Full Changelog: https://github.com/timgit/pg-boss/compare/12.30.0...12.31.0
vitejs/vite (vite)
v8.3.0Compare Source
Features
server.watch(#23133) (1b5cfe3)tsconfigoption (#23310) (93164c3)applyToEnvironmenthook (#23191) (fdef04f)import.meta.ROLLDOWN_FILE_URL_*for assets in JS (#22888) (4366ac4)import.meta.ROLLDOWN_FILE_URL_*for other plugins (#22894) (e38f29e)Bug Fixes
node_modulespath segments as dependencies (fix #17467) (#23437) (ef0dc17)resolveFileUrlhook (#23422) (e8d6a4d)import.meta.hot.invalidatein virtual module (#23171) (6162968)Performance Improvements
Miscellaneous Chores
@e18e/eslint-plugin(#23357) (f794133)PluginContainerOptions(#23382) (ee64401)sortImports(#23319) (97ad042)Code Refactoring
esbuildPlugin(#23381) (f40efef)__VITE_ASSET__(#22886) (a6c08e1)urlIdofimport.meta.ROLLDOWN_FILE_URLin wasm plugin (#22962) (92bd2a7)Tests
renderBuiltUrlchange changes hash (#23118) (0291408)Beta Changelogs
8.3.0-beta.1 (2026-09-07)
See 8.3.0-beta.1 changelog
8.3.0-beta.0 (2026-09-02)
See 8.3.0-beta.0 changelog
colinhacks/zod (zod)
v4.6.2Compare Source
A patch on top of 4.6.1.
9446b5ccfix: preserve undefined prefault outputs and object keys (#6587) — closes #65850c483c58docs: the Zod 4.6 announcement post (#6546)a00c3f34docs: use Trigger.dev's brand-kit lockups for the platinum cardv4.6.1Compare Source
A patch on top of 4.6.0.
b12aa523fix: preserve unique tags with defaulted discriminators (#6582) — closes #6577dd9c36fafix(v4): defer recursive object index inference (#6580)3b154992feat(lang): add Tajik (tg) locale (#6581) by @ismoil772efa8b80ci: give the npm wait a real budget and drop the back-publish path (#6583)Configuration
📅 Schedule: (in timezone Europe/Copenhagen)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR has been generated by Mend Renovate.