create-objectstack 17.0.0-rc.6 → 17.0.0
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 +190 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,195 @@
|
|
|
1
1
|
# create-objectstack
|
|
2
2
|
|
|
3
|
+
## 17.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- e47b342: feat!: require Node.js 22 — promise the runtime we actually test (#3825)
|
|
8
|
+
|
|
9
|
+
Every published package declared `engines.node: ">=18.0.0"`. **Node 18 reached
|
|
10
|
+
end-of-life on 2025-04-30 and Node 20 on 2026-04-30**, so the compatibility
|
|
11
|
+
promise covered two runtimes nobody patches — and, after #3830 moved CI to Node
|
|
12
|
+
22, two runtimes nothing in this repo verifies.
|
|
13
|
+
|
|
14
|
+
That left the promise and the evidence with **no overlap at all**:
|
|
15
|
+
|
|
16
|
+
| | Node version |
|
|
17
|
+
| ----------------------------------------------------------------------------------------------- | ------------ |
|
|
18
|
+
| What CI validates every PR on | **22** |
|
|
19
|
+
| What `release.yml` publishes from | **22** |
|
|
20
|
+
| What every shipped Docker image runs (`docker/Dockerfile`, `blank` template, self-hosting docs) | **22** |
|
|
21
|
+
| What `engines.node` promised users | **>=18** |
|
|
22
|
+
|
|
23
|
+
`engines.node` is now `>=22.0.0` across all 50 manifests. This is the honest
|
|
24
|
+
floor: it is the only runtime the packages are built, tested and shipped on.
|
|
25
|
+
|
|
26
|
+
## Migration
|
|
27
|
+
|
|
28
|
+
**If you are on Node 22 or newer, nothing changes.** Node 24 (Active LTS since
|
|
29
|
+
2025-10-28) and Node 26 both satisfy the new range.
|
|
30
|
+
|
|
31
|
+
If you are on Node 18 or 20, upgrade to Node 22+. Both are past end-of-life and
|
|
32
|
+
receive no security patches:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
nvm install 22 && nvm use 22
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
npm and pnpm surface an unsatisfied `engines` as an **`EBADENGINE` warning**, not
|
|
39
|
+
a hard failure, so an existing install will not break the moment you upgrade —
|
|
40
|
+
but the package is no longer tested on that runtime, and the failures are the
|
|
41
|
+
kind that do not announce themselves. #3812 is the worked example: a native
|
|
42
|
+
dependency whose `engines` required a newer Node loaded anyway on the older one
|
|
43
|
+
and then killed the test worker at the process level, with no JS error and a
|
|
44
|
+
summary that still said "passed".
|
|
45
|
+
|
|
46
|
+
If your CI pins Node, pin it to 22 as well — running your gates on a runtime
|
|
47
|
+
your dependencies no longer support is exactly the split this change closes.
|
|
48
|
+
|
|
49
|
+
## Also updated
|
|
50
|
+
|
|
51
|
+
The "Node 18+" prerequisite was restated in ten user-facing places
|
|
52
|
+
(`README.md`, `CONTRIBUTING.md`, the getting-started and deployment docs, the
|
|
53
|
+
todo example, and the `objectstack-platform` skill's `compatibility` field).
|
|
54
|
+
All now say 22. Changelogs and ADRs are historical records and were left alone.
|
|
55
|
+
|
|
56
|
+
### Patch Changes
|
|
57
|
+
|
|
58
|
+
- 9f060e5: chore(deps)!: better-auth 1.7.0-rc.2 (account identity restructuring) + the
|
|
59
|
+
production-dependency batch from #3517
|
|
60
|
+
|
|
61
|
+
**better-auth 1.7.0-rc.1 → 1.7.0-rc.2** across the family (`better-auth`,
|
|
62
|
+
`@better-auth/core`, `@better-auth/oauth-provider`, `@better-auth/sso`, and the
|
|
63
|
+
adapter/telemetry overrides). `@better-auth/scim` deliberately stays on
|
|
64
|
+
1.7.0-rc.1 — rc.2 replaces its whole model (code-defined connections; the
|
|
65
|
+
`scimProvider` model and the generate-token endpoint are gone), which is a
|
|
66
|
+
feature migration, not a version bump. Its peer range accepts rc.2 core, and the
|
|
67
|
+
advisory that forced the original pin (GHSA-j8v8-g9cx-5qf4) is still fixed.
|
|
68
|
+
|
|
69
|
+
**BREAKING — account identity.** better-auth renamed `account.accountId` to
|
|
70
|
+
`account.providerAccountId` and added a REQUIRED `account.issuer`; sign-in now
|
|
71
|
+
resolves accounts by `(issuer, providerAccountId)`.
|
|
72
|
+
|
|
73
|
+
- FROM `fields: { accountId: 'account_id' }` → TO
|
|
74
|
+
`fields: { issuer: 'issuer', providerAccountId: 'account_id' }`. The provider
|
|
75
|
+
account id keeps its `account_id` column — only the better-auth-side name
|
|
76
|
+
moved — and `sys_account` gains an `issuer` column.
|
|
77
|
+
- FROM `internalAdapter.createAccount({ providerId, accountId, … })` → TO
|
|
78
|
+
`createAccount({ providerId, issuer, providerAccountId, … })`. A local
|
|
79
|
+
password account carries the issuer better-auth mints for itself,
|
|
80
|
+
`local:credential`.
|
|
81
|
+
- FROM `client.auth.accounts.unlink({ providerId, accountId })` → TO
|
|
82
|
+
`unlink({ accountId })`, where `accountId` is now the account ROW id (the `id`
|
|
83
|
+
from `accounts.list()`), matching better-auth's narrowed body.
|
|
84
|
+
`accounts.list()` returns `issuer` + `providerAccountId` in place of
|
|
85
|
+
`accountId`.
|
|
86
|
+
|
|
87
|
+
**Existing deployments:** rows written before 1.7 have no issuer and are
|
|
88
|
+
invisible to sign-in until stamped. The auth plugin now runs an idempotent
|
|
89
|
+
boot-time backfill that stamps what it can derive — `local:credential` for
|
|
90
|
+
password accounts, `local:oauth:<providerId>` for configured social providers,
|
|
91
|
+
and the registered IdP's real `iss` from `sys_sso_provider` for federated ones.
|
|
92
|
+
Accounts from a federated IdP that is no longer registered cannot be derived;
|
|
93
|
+
they are logged with their provider id and row count rather than guessed, and
|
|
94
|
+
those users cannot sign in through that provider until the row is stamped with
|
|
95
|
+
the IdP's issuer or removed so a fresh login re-links it.
|
|
96
|
+
|
|
97
|
+
**Also required by 1.7:** `SecondaryStorage` gained two mandatory methods, both
|
|
98
|
+
now implemented over the kernel cache service — `getAndDelete` (single-use
|
|
99
|
+
verification values) and `increment` (fixed-window rate-limit counter;
|
|
100
|
+
`rateLimit.storage: 'secondary-storage'` throws at boot without it).
|
|
101
|
+
|
|
102
|
+
The rest of #3517's production-dependency batch rides along: `@oclif/core`
|
|
103
|
+
4.13.0, `@hono/node-server` 2.0.12, `hono` 4.12.32, `tar` 7.5.22, `jose` 6.2.4,
|
|
104
|
+
`pinyin-pro` 3.28.2, plus the private docs app's fumadocs/next/react bumps.
|
|
105
|
+
|
|
106
|
+
- 2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
|
|
107
|
+
|
|
108
|
+
The AGENTS.md post-task checklist requires breaking changesets to carry their
|
|
109
|
+
FROM → TO migration because "this text ships to consumers as `CHANGELOG.md`
|
|
110
|
+
inside the npm package and is what an upgrading agent greps after the tombstone
|
|
111
|
+
error." That delivery path was severed for 68 of the 69 publishable packages:
|
|
112
|
+
npm packs `package.json` / `README*` / `LICENSE*` unconditionally but — unlike
|
|
113
|
+
older npm versions — not `CHANGELOG.md`, and the canonical
|
|
114
|
+
`"files": ["dist", "README.md"]` whitelist never named it. Measured on npm
|
|
115
|
+
10.9.7: `npm pack --dry-run` on `@objectstack/types` shipped 3 files while its
|
|
116
|
+
70KB `CHANGELOG.md` stayed behind. Only `@objectstack/spec` listed it
|
|
117
|
+
explicitly.
|
|
118
|
+
|
|
119
|
+
The tombstone-error scenario is precisely the one where the repo is out of
|
|
120
|
+
reach — the upgrading agent has `node_modules` and nothing else — so the
|
|
121
|
+
migration text has to ride in the tarball. Every publishable package now
|
|
122
|
+
declares `CHANGELOG.md` in `files`, and the canonical whitelist is
|
|
123
|
+
`["dist", "README.md", "CHANGELOG.md"]`.
|
|
124
|
+
|
|
125
|
+
The other half is the gate: `check:published-files` gains a fifth invariant,
|
|
126
|
+
COMPLETE — a whitelist that fails to cover `CHANGELOG.md` fails the
|
|
127
|
+
always-required lint job, so the next package cannot silently sever the path
|
|
128
|
+
again. `@objectstack/spec`'s per-package EXTRA_ENTRIES exemption dissolves
|
|
129
|
+
into the canonical set.
|
|
130
|
+
|
|
131
|
+
Consumer-visible change: one more file per install (the package's changelog,
|
|
132
|
+
e.g. 70.8KB for `@objectstack/types`), and `grep -r "removed key"
|
|
133
|
+
node_modules/@objectstack/*/CHANGELOG.md` now finds the migration it was
|
|
134
|
+
promised.
|
|
135
|
+
|
|
136
|
+
- 4e9e184: chore(deps): OSV security batch — bump tar to ^7.5.21 (GHSA-r292-9mhp-454m) and
|
|
137
|
+
js-yaml to ^5.2.2 (GHSA-pm4m-ph32-ghv5)
|
|
138
|
+
|
|
139
|
+
Both are declared-range bumps to the patched releases, so downstream installs
|
|
140
|
+
resolve the fixed versions from the published manifests, not just this
|
|
141
|
+
workspace's lockfile. The same batch clears the remaining transitive advisories
|
|
142
|
+
(next 16.2.11 in apps/docs; workspace overrides for brace-expansion, sharp,
|
|
143
|
+
react-router, @sveltejs/kit, @hono/node-server) — those live in pnpm-workspace.yaml
|
|
144
|
+
and the private docs app, which do not ship.
|
|
145
|
+
|
|
146
|
+
- 8d41998: fix(create-objectstack): scaffolding a remote template no longer produces a project that cannot build (#4926)
|
|
147
|
+
|
|
148
|
+
`npx create-objectstack@latest my-app -t todo` (and `compliance`, `content`,
|
|
149
|
+
`contracts`, `procurement`) generated a project that failed `objectstack build`
|
|
150
|
+
immediately — 5 of the 6 offered templates. Only the bundled `blank` worked.
|
|
151
|
+
|
|
152
|
+
The scaffolder read the template's original namespace from
|
|
153
|
+
`objectstack.manifest.json`, and that filename names two different documents.
|
|
154
|
+
The bundled template's is app-shaped and carries `namespace`; a remote
|
|
155
|
+
template's is the template-registry document
|
|
156
|
+
(`$schema: …/template-manifest.json`) and carries none — its namespace lives
|
|
157
|
+
only in `objectstack.config.ts`. So the value came back `undefined` for every
|
|
158
|
+
remote template and the object-name rewrite was skipped, while the config's
|
|
159
|
+
`namespace:` was rewritten anyway. The result was `namespace: 'my_app'` sitting
|
|
160
|
+
next to `name: 'todo_task'`, which the `${namespace}_${shortName}` rule rejects.
|
|
161
|
+
Across the five templates, 74 object names were left unrewritten.
|
|
162
|
+
|
|
163
|
+
`objectstack.config.ts` is now the authority for the template namespace (it
|
|
164
|
+
holds the very literal the scaffolder overwrites, so the two cannot disagree),
|
|
165
|
+
with the manifest as fallback. The rewrite also verifies itself: any surviving
|
|
166
|
+
stale prefix throws at the scaffold, naming the files and lines, instead of
|
|
167
|
+
surfacing as a build failure on the user's first command.
|
|
168
|
+
|
|
169
|
+
- 7309c81: chore(cli,create-objectstack): scaffolds no longer name a driver (#4065)
|
|
170
|
+
|
|
171
|
+
`os init` and the `create-objectstack` blank template both listed
|
|
172
|
+
`@objectstack/driver-memory` in the generated `dependencies`. It was the only
|
|
173
|
+
driver named, which read as an endorsement — "this is the driver your app runs
|
|
174
|
+
on" — when it is in fact the **last-resort rung** of the dev step-down (native
|
|
175
|
+
`better-sqlite3` → WASM SQLite → mingo). A new project's first impression of the
|
|
176
|
+
data layer should not be the engine that enforces no primary keys, no
|
|
177
|
+
uniqueness, no `NOT NULL` and no column types.
|
|
178
|
+
|
|
179
|
+
It was also redundant: `@objectstack/runtime` already depends on `driver-sql`,
|
|
180
|
+
`driver-sqlite-wasm` and `driver-memory`, and every script in both scaffolds runs
|
|
181
|
+
through the CLI, which carries all four. Removing the line changes nothing a
|
|
182
|
+
generated project can do — `objectstack dev` still resolves SQLite by default,
|
|
183
|
+
and `OS_DATABASE_URL` still selects Postgres / MySQL / MongoDB.
|
|
184
|
+
|
|
185
|
+
Docs updated to match: the "packages you depend on" table in _Your first project_
|
|
186
|
+
no longer lists a driver row (it now says where drivers come from), and the
|
|
187
|
+
Memory Driver section of _Database Drivers_ documents the opt-in persistence
|
|
188
|
+
default, carries a migration callout for the old `'auto'` behaviour, and points
|
|
189
|
+
test authors at in-memory SQLite. That section also claimed "Data is lost when
|
|
190
|
+
the process exits", which was simply false while `'auto'` was the default — it
|
|
191
|
+
wrote a file into the working directory.
|
|
192
|
+
|
|
3
193
|
## 17.0.0-rc.6
|
|
4
194
|
|
|
5
195
|
## 17.0.0-rc.5
|