Skip to content

Upgrading 0.14 to 0.17

0.15 and 0.16 add and fix things; neither breaks anything. Everything in this part landed in 0.17.0.

Under 0.x the minor is the breaking position — ^0.16.0 resolves >=0.16.0 <0.17.0 — so none of it reaches a project until you deliberately move to 0.17.

And @rebasepro/admin-types is @rebasepro/cms-types. “Admin” named two things at once: the whole panel, and the content-management half of it.

import { RebaseAdmin } from "@rebasepro/admin";
import { defineCollection } from "@rebasepro/admin-types";
import { RebaseCMS } from "@rebasepro/cms";
import { defineCollection } from "@rebasepro/cms-types";

Change the specifier and RebaseAdmin to RebaseCMS. There is no alias: a shim would keep both meanings of “admin” alive, which is the thing being fixed. The old packages stop at 0.16.0 on npm and receive nothing after it, so ^0.16.0 keeps resolving rather than breaking — it just stops moving.

Your collection files do not change. The admin: key is deliberately untouched, along with AdminCollection*, ADMIN_COLLECTION_KEYS, the admin auth role and /api/admin — those name something other than the CMS product.

The panel’s mode value moved with the package ("content""cms"). It is persisted per browser and migrates on read, so an existing browser keeps working.

15. Resources are declared, not configured

Section titled “15. Resources are declared, not configured”

dataSources and storageSources are gone from RebaseBackendConfig. Declare them in rebase.json and the config package instead.

A bundle built before this will not boot on a current runtime. Rebuild it:

rebase build

rebase eject infra is gone too, along with rebase.infra.json and the {"$env": "..."} indirection. Resources bind from the environment on the <BASE>__<KEY> convention, which is what every deployment already used.

16. admin.titleProperty is rejected at boot

Section titled “16. admin.titleProperty is rejected at boot”

Use admin.display.title — the same string works there.

admin: {
titleProperty: "name"
display: { title: "name" }
}

This can stop a project that starts today, which is the point: silence would mean the title quietly reverting to the derived one with nothing to explain why.

And userId is no longer accepted as an identity spelling anywhere — it is uid throughout.

export default defineCron({ schedule: "0 3 * * *", async handler({ client }) {
await client.dataAsAdmin.collection("orders").find();
export default defineCron({ schedule: "0 3 * * *", async handler({ rebase }) {
await rebase.dataAsAdmin.collection("orders").find();
} });

The --legacy flag on build and start is now --workspace. The mode is supported, not retired, and the old name said otherwise.

rebase build --legacy
rebase build --workspace

Worth grepping your scripts and CI for: arg runs permissively on these two commands, so the old spelling is ignored rather than rejected — the build succeeds and silently uses the other mode.

Breaking only for code that implements EmailService: a send returning Promise<void> no longer satisfies it. Callers are unaffected — they may ignore the result — and the auth.email.sendEmail hook stays permissive, so an existing async () => {} provider still works and simply reports nothing.