@nifrajs/web-solid 5.1.0 → 5.3.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 +1284 -0
- package/dist/i18n.d.ts +12 -3
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +33 -7
- package/dist/i18n.js.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +2 -2
- package/dist/plugin.js.map +1 -1
- package/package.json +7 -6
- package/src/i18n.ts +37 -6
- package/src/index.ts +3 -3
- package/src/plugin.ts +7 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,1284 @@
|
|
|
1
|
+
# @nifrajs/web-solid
|
|
2
|
+
|
|
3
|
+
## 5.3.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 90433ee: Solid server renders no longer read `process.env.NODE_ENV` on every render. The check that keeps a caught server error's text out of the hydration script now runs only when an error is serialized, with the same outcome: outside development and test, including an unset `NODE_ENV`, the browser receives "Internal Server Error". On Node, where each `process.env` read is a native call, the SSR benchmark's catalog page renders about 1.5% faster.
|
|
8
|
+
- Updated dependencies [7ab9692]
|
|
9
|
+
- Updated dependencies [7ab9692]
|
|
10
|
+
- Updated dependencies [0e1d03f]
|
|
11
|
+
- Updated dependencies [808bac8]
|
|
12
|
+
- Updated dependencies [605c246]
|
|
13
|
+
- Updated dependencies [271917a]
|
|
14
|
+
- Updated dependencies [d4bae56]
|
|
15
|
+
- Updated dependencies [007060d]
|
|
16
|
+
- Updated dependencies [69dfb60]
|
|
17
|
+
- Updated dependencies [190ab39]
|
|
18
|
+
- Updated dependencies [605c246]
|
|
19
|
+
- Updated dependencies [13224fe]
|
|
20
|
+
- Updated dependencies [00c266e]
|
|
21
|
+
- Updated dependencies [7cf8df3]
|
|
22
|
+
- @nifrajs/core@5.3.0
|
|
23
|
+
- @nifrajs/i18n@5.3.0
|
|
24
|
+
- @nifrajs/image@5.3.0
|
|
25
|
+
- @nifrajs/web@5.3.0
|
|
26
|
+
|
|
27
|
+
## 5.2.1
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- @nifrajs/core@5.2.1
|
|
32
|
+
- @nifrajs/i18n@5.2.1
|
|
33
|
+
- @nifrajs/image@5.2.1
|
|
34
|
+
- @nifrajs/web@5.2.1
|
|
35
|
+
|
|
36
|
+
## 5.2.0
|
|
37
|
+
|
|
38
|
+
### Minor Changes
|
|
39
|
+
|
|
40
|
+
- 1d20d1f: An app registers its locale routing once: `export const i18n = urls` (the router `defineI18nRouting()` returns) from `backend/framework.ts`, which `nifra dev`, `nifra build` and the generated server entry pass to `createWebApp({ i18n })`. Every document then takes `<html lang dir>` from the registry's `documentMeta(localeOf(path))` unless the route's meta sets `lang`, on a hard load and after each client navigation, and carries `Content-Language`. Each adapter's new `useLocale()` returns the page's locale key, and `<I18nProvider>` formats in the page's locale when no `locale` is passed, with no loader handing either over. A route under a `[lang]` or `[[lang]]` directory runs `matchSegment()` before any middleware: an unserved locale, or a page missing from it, is a 404 through the app's `_404`, and a non-canonical prefix such as `/en/x` with an unprefixed default is a 308 to `/x`.
|
|
41
|
+
|
|
42
|
+
### Patch Changes
|
|
43
|
+
|
|
44
|
+
- 9498cf8: The package ships its `CHANGELOG.md`, so the installed package has the notes for every version, as the GitHub release does. Before, the tarball held only the code, `README.md`, `LICENSE` and `package.json`.
|
|
45
|
+
- 281a48e: A production client build (Bun or Vite) moves copy tables (`@nifrajs/i18n/copy`) into one chunk per locale, so a page's JavaScript carries the copy of the locale it renders in and none of the others; the server bundle keeps every table whole. The client manifest lists the chunks as `copyChunks`, the generated server entry passes them to the new `createWebApp({ copyChunks })` option (a hand-written entry passes the manifest's), and each page hands the map to the browser and preloads the chunks it reads: its URL's locale and the one its `<html lang>` names. A client navigation loads the next URL's chunk with the route's code; the router passes the target path to `loadModule` for that. The build reads tables with the app's TypeScript (5.9 or 6) and warns and leaves them whole without one; `buildClient({ copySplit: false })` turns it off. `readSource()` and `addSourceTransform()` in `@nifrajs/web/plugins/kit` let a plugin that claims a file still compile the rewritten source; the Solid and StyleX plugins read through it.
|
|
46
|
+
- Updated dependencies [9498cf8]
|
|
47
|
+
- Updated dependencies [1f3ff32]
|
|
48
|
+
- Updated dependencies [4bb8e52]
|
|
49
|
+
- Updated dependencies [cdff19d]
|
|
50
|
+
- Updated dependencies [5edd0ba]
|
|
51
|
+
- Updated dependencies [000b4cb]
|
|
52
|
+
- Updated dependencies [c5455fb]
|
|
53
|
+
- Updated dependencies [6082ba5]
|
|
54
|
+
- Updated dependencies [fd58beb]
|
|
55
|
+
- Updated dependencies [ea25a61]
|
|
56
|
+
- Updated dependencies [ed13e36]
|
|
57
|
+
- Updated dependencies [281a48e]
|
|
58
|
+
- Updated dependencies [281a48e]
|
|
59
|
+
- Updated dependencies [1d20d1f]
|
|
60
|
+
- Updated dependencies [1d20d1f]
|
|
61
|
+
- Updated dependencies [746ada9]
|
|
62
|
+
- Updated dependencies [1d20d1f]
|
|
63
|
+
- Updated dependencies [b9e7c6b]
|
|
64
|
+
- @nifrajs/core@5.2.0
|
|
65
|
+
- @nifrajs/i18n@5.2.0
|
|
66
|
+
- @nifrajs/image@5.2.0
|
|
67
|
+
- @nifrajs/web@5.2.0
|
|
68
|
+
|
|
69
|
+
## 5.1.0
|
|
70
|
+
|
|
71
|
+
### Patch Changes
|
|
72
|
+
|
|
73
|
+
- df50368: When a Solid `<ErrorBoundary>` catches during server rendering, or a resource fails, the page no longer ships the error's message and stack in its inline hydration script. On Bun, that also included the server file path. The browser now receives `Error("Internal Server Error")`. In development and test the error keeps its text. That inline script now also carries the document's CSP nonce on pages rendered in one pass: `RenderAdapter.renderToString` receives `{ nonce }` as `renderToStream` already did. Before, a strict CSP blocked the script and hydration did not match the server's markup.
|
|
74
|
+
- Updated dependencies [78b2a04]
|
|
75
|
+
- Updated dependencies [638efe5]
|
|
76
|
+
- Updated dependencies [2a0a5d3]
|
|
77
|
+
- Updated dependencies [5372e3a]
|
|
78
|
+
- Updated dependencies [b276c67]
|
|
79
|
+
- Updated dependencies [29d6649]
|
|
80
|
+
- Updated dependencies [2a0a5d3]
|
|
81
|
+
- Updated dependencies [72e1b4b]
|
|
82
|
+
- Updated dependencies [7bb8a67]
|
|
83
|
+
- Updated dependencies [513ec28]
|
|
84
|
+
- @nifrajs/web@5.1.0
|
|
85
|
+
- @nifrajs/core@5.1.0
|
|
86
|
+
- @nifrajs/i18n@5.1.0
|
|
87
|
+
- @nifrajs/image@5.1.0
|
|
88
|
+
|
|
89
|
+
## 5.0.0
|
|
90
|
+
|
|
91
|
+
### Minor Changes
|
|
92
|
+
|
|
93
|
+
- fc0284a: Add opt-in server components across React, Vue, Svelte, Solid and Preact. Closed schemas project public props, owner GET admission and read capabilities govern every refresh, and private responses bypass shared caches. React uses native Flight; Vue, Svelte, Solid and Preact preserve native island state and owned ranges.
|
|
94
|
+
|
|
95
|
+
Add coordinated Vite builds and development generations, guarded component references, generated Bun/Node/Deno/Workers/Pages/Vercel outputs, typed outlets, router and server-function refresh integration, and release certification for browsers, packaged consumers, resource limits and performance. Existing applications retain their default rendering pipeline.
|
|
96
|
+
|
|
97
|
+
Reuse registered Web middleware continuations across requests while retaining request-local state.
|
|
98
|
+
|
|
99
|
+
### Patch Changes
|
|
100
|
+
|
|
101
|
+
- Updated dependencies [7169820]
|
|
102
|
+
- Updated dependencies [22e3df7]
|
|
103
|
+
- Updated dependencies [a0a02f4]
|
|
104
|
+
- Updated dependencies [0aed425]
|
|
105
|
+
- Updated dependencies [eaf030b]
|
|
106
|
+
- Updated dependencies [7de0397]
|
|
107
|
+
- Updated dependencies [674c658]
|
|
108
|
+
- Updated dependencies [de27557]
|
|
109
|
+
- Updated dependencies [2173644]
|
|
110
|
+
- Updated dependencies [4d894b0]
|
|
111
|
+
- Updated dependencies [61901cd]
|
|
112
|
+
- Updated dependencies [5e366e2]
|
|
113
|
+
- Updated dependencies [2938a0d]
|
|
114
|
+
- Updated dependencies [dc8439c]
|
|
115
|
+
- Updated dependencies [b19cb37]
|
|
116
|
+
- Updated dependencies [4330e40]
|
|
117
|
+
- Updated dependencies [4199ff3]
|
|
118
|
+
- Updated dependencies [90d9ee6]
|
|
119
|
+
- Updated dependencies [364a234]
|
|
120
|
+
- Updated dependencies [c06cba5]
|
|
121
|
+
- Updated dependencies [f4d3852]
|
|
122
|
+
- Updated dependencies [4a82ae0]
|
|
123
|
+
- Updated dependencies [0ff867a]
|
|
124
|
+
- Updated dependencies [e7391bf]
|
|
125
|
+
- Updated dependencies [0b80a59]
|
|
126
|
+
- Updated dependencies [c64db12]
|
|
127
|
+
- Updated dependencies [3753104]
|
|
128
|
+
- Updated dependencies [4b3b1fa]
|
|
129
|
+
- Updated dependencies [3562557]
|
|
130
|
+
- Updated dependencies [53087f3]
|
|
131
|
+
- Updated dependencies [2def6c7]
|
|
132
|
+
- Updated dependencies [b5b5bc3]
|
|
133
|
+
- Updated dependencies [22e1777]
|
|
134
|
+
- Updated dependencies [3a483cd]
|
|
135
|
+
- Updated dependencies [35f52c7]
|
|
136
|
+
- Updated dependencies [343cb81]
|
|
137
|
+
- Updated dependencies [412a9ee]
|
|
138
|
+
- Updated dependencies [65883e5]
|
|
139
|
+
- Updated dependencies [0e20529]
|
|
140
|
+
- Updated dependencies [d91fd44]
|
|
141
|
+
- Updated dependencies [f7e36ec]
|
|
142
|
+
- Updated dependencies [262e46d]
|
|
143
|
+
- Updated dependencies [b13e071]
|
|
144
|
+
- Updated dependencies [944623d]
|
|
145
|
+
- Updated dependencies [6d9869d]
|
|
146
|
+
- Updated dependencies [077657f]
|
|
147
|
+
- Updated dependencies [b9cc68c]
|
|
148
|
+
- Updated dependencies [de2cc1d]
|
|
149
|
+
- Updated dependencies [a5963cb]
|
|
150
|
+
- Updated dependencies [05aac0e]
|
|
151
|
+
- Updated dependencies [1a6616f]
|
|
152
|
+
- Updated dependencies [ecd738e]
|
|
153
|
+
- Updated dependencies [7775c2b]
|
|
154
|
+
- Updated dependencies [05587e0]
|
|
155
|
+
- Updated dependencies [c75818d]
|
|
156
|
+
- Updated dependencies [3db36b3]
|
|
157
|
+
- Updated dependencies [7775c2b]
|
|
158
|
+
- Updated dependencies [09c47c5]
|
|
159
|
+
- Updated dependencies [326caee]
|
|
160
|
+
- Updated dependencies [f8e0ed5]
|
|
161
|
+
- Updated dependencies [a588c18]
|
|
162
|
+
- Updated dependencies [1cdcfe5]
|
|
163
|
+
- Updated dependencies [e195fe8]
|
|
164
|
+
- Updated dependencies [846e2f6]
|
|
165
|
+
- Updated dependencies [55f4fdb]
|
|
166
|
+
- Updated dependencies [7775c2b]
|
|
167
|
+
- Updated dependencies [d3e79c4]
|
|
168
|
+
- Updated dependencies [d922f65]
|
|
169
|
+
- Updated dependencies [aadd9fc]
|
|
170
|
+
- Updated dependencies [ea16748]
|
|
171
|
+
- Updated dependencies [a1eda0a]
|
|
172
|
+
- Updated dependencies [fc0284a]
|
|
173
|
+
- Updated dependencies [5b22f4d]
|
|
174
|
+
- Updated dependencies [1b94593]
|
|
175
|
+
- Updated dependencies [9f58295]
|
|
176
|
+
- Updated dependencies [2f7299a]
|
|
177
|
+
- Updated dependencies [29e62a0]
|
|
178
|
+
- Updated dependencies [c613e7d]
|
|
179
|
+
- Updated dependencies [5975163]
|
|
180
|
+
- Updated dependencies [b9608ac]
|
|
181
|
+
- Updated dependencies [7a165de]
|
|
182
|
+
- Updated dependencies [4064f36]
|
|
183
|
+
- Updated dependencies [d8f11a5]
|
|
184
|
+
- Updated dependencies [e9e02cf]
|
|
185
|
+
- Updated dependencies [b70b18a]
|
|
186
|
+
- Updated dependencies [6f42b38]
|
|
187
|
+
- Updated dependencies [870227d]
|
|
188
|
+
- Updated dependencies [48aad8c]
|
|
189
|
+
- Updated dependencies [2fbb4f0]
|
|
190
|
+
- Updated dependencies [1d66252]
|
|
191
|
+
- Updated dependencies [a6a6834]
|
|
192
|
+
- Updated dependencies [166a6ff]
|
|
193
|
+
- Updated dependencies [79be5af]
|
|
194
|
+
- Updated dependencies [41050ed]
|
|
195
|
+
- Updated dependencies [fc837cb]
|
|
196
|
+
- Updated dependencies [bf6eeb0]
|
|
197
|
+
- Updated dependencies [5a3c27a]
|
|
198
|
+
- Updated dependencies [15a3a66]
|
|
199
|
+
- Updated dependencies [b80ce77]
|
|
200
|
+
- Updated dependencies [9b971fc]
|
|
201
|
+
- Updated dependencies [2577fc7]
|
|
202
|
+
- Updated dependencies [9b1acc9]
|
|
203
|
+
- Updated dependencies [391ab3c]
|
|
204
|
+
- Updated dependencies [3bf7d6b]
|
|
205
|
+
- Updated dependencies [7775c2b]
|
|
206
|
+
- Updated dependencies [ab1935b]
|
|
207
|
+
- Updated dependencies [740109f]
|
|
208
|
+
- Updated dependencies [e0a25fe]
|
|
209
|
+
- Updated dependencies [3630b6e]
|
|
210
|
+
- Updated dependencies [1290c6d]
|
|
211
|
+
- Updated dependencies [d0a7d58]
|
|
212
|
+
- @nifrajs/web@5.0.0
|
|
213
|
+
- @nifrajs/core@5.0.0
|
|
214
|
+
- @nifrajs/i18n@5.0.0
|
|
215
|
+
- @nifrajs/image@5.0.0
|
|
216
|
+
|
|
217
|
+
## 4.0.2
|
|
218
|
+
|
|
219
|
+
### Patch Changes
|
|
220
|
+
|
|
221
|
+
- Updated dependencies [fcd6a5b]
|
|
222
|
+
- @nifrajs/web@4.0.2
|
|
223
|
+
- @nifrajs/core@4.0.2
|
|
224
|
+
- @nifrajs/i18n@4.0.2
|
|
225
|
+
- @nifrajs/image@4.0.2
|
|
226
|
+
|
|
227
|
+
## 4.0.1
|
|
228
|
+
|
|
229
|
+
### Patch Changes
|
|
230
|
+
|
|
231
|
+
- Updated dependencies [bbb2b27]
|
|
232
|
+
- Updated dependencies [2957acd]
|
|
233
|
+
- Updated dependencies [4bd292a]
|
|
234
|
+
- Updated dependencies [55e813b]
|
|
235
|
+
- @nifrajs/web@4.0.1
|
|
236
|
+
- @nifrajs/core@4.0.1
|
|
237
|
+
- @nifrajs/i18n@4.0.1
|
|
238
|
+
- @nifrajs/image@4.0.1
|
|
239
|
+
|
|
240
|
+
## 4.0.0
|
|
241
|
+
|
|
242
|
+
### Major Changes
|
|
243
|
+
|
|
244
|
+
- a8b33bc: The Solid and Svelte compiler plugins live on their `/plugin` subpaths, and each adapter root exports only the render adapter.
|
|
245
|
+
|
|
246
|
+
- `solidBunPlugin` is imported from `@nifrajs/web-solid/plugin`, matching `@nifrajs/web-svelte/plugin` and `@nifrajs/web-vue/plugin`.
|
|
247
|
+
- `@nifrajs/web-solid` and `@nifrajs/web-svelte` link no build-time or `node:` module, so a server or edge bundle that imports the adapter builds under edge resolve conditions (Cloudflare Workers, Vercel Edge, Deno).
|
|
248
|
+
- Solid site scaffolds import the plugin from the subpath.
|
|
249
|
+
|
|
250
|
+
Breaking: `solidBunPlugin` is no longer exported from `@nifrajs/web-solid`, nor `svelteBunPlugin` from `@nifrajs/web-svelte`. `nifra fix --code NF-C005` rewrites those imports.
|
|
251
|
+
|
|
252
|
+
### Minor Changes
|
|
253
|
+
|
|
254
|
+
- f70f99b: feat(i18n): selectordinal, fallback catalogs, typed nested catalogs and the locale cookie
|
|
255
|
+
|
|
256
|
+
The formatter supports `selectordinal` (`{n, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}`).
|
|
257
|
+
Inside a `plural` or `selectordinal` case, `#` is now the number in the locale's own format
|
|
258
|
+
(`1,000 items`, `1.000 Artikel`) instead of its plain digits - the output changes for counts of 1,000
|
|
259
|
+
and more and for fractions.
|
|
260
|
+
|
|
261
|
+
`createFormatter(locale, messages, options)` takes `fallback` catalogs, tried in order for a key the
|
|
262
|
+
catalog lacks (`locales.chain()` gives the order); `onMissing(key, locale)`, called once per key when
|
|
263
|
+
no catalog has it; and `timeZone` and `numberingSystem` defaults for `d()`, `n()` and `#`. An invalid
|
|
264
|
+
locale, time zone or numbering system throws at creation. Formatters are cached per catalog and
|
|
265
|
+
options, with bounded caches, so per-request values cannot grow memory.
|
|
266
|
+
|
|
267
|
+
Catalogs may nest: values are messages, lists or blocks, read with dotted keys (`t("home.title")`); a
|
|
268
|
+
flat key that contains a dot is found first, so flat catalogs work unchanged. `get(key)` returns a list
|
|
269
|
+
or block whole. Lookups read own properties only, and an argument named like an `Object.prototype`
|
|
270
|
+
member renders empty unless passed. Declaring `interface Register { messages: typeof en }` on
|
|
271
|
+
`@nifrajs/i18n` types every `t()` and `get()` key, and other locales' catalogs (`Translation`,
|
|
272
|
+
`PartialMessages`) against that shape.
|
|
273
|
+
|
|
274
|
+
`localeCookie(name, locale, { maxAge })` returns the `document.cookie` string for a language switcher,
|
|
275
|
+
byte-identical to the `Set-Cookie` `localeDetector({ persist: true })` writes.
|
|
276
|
+
|
|
277
|
+
Every adapter's `<I18nProvider>` takes `fallback`, `onMissing`, `timeZone` and `numberingSystem`, and
|
|
278
|
+
its `messages` prop is checked against the registered catalog type.
|
|
279
|
+
|
|
280
|
+
- 49f106f: feat(i18n): rich text from catalog messages without HTML
|
|
281
|
+
|
|
282
|
+
`rich(formatter, key, tags, vars)` from the new `@nifrajs/i18n/rich` entry formats a message like
|
|
283
|
+
`t()` and turns its `<name>…</name>` and `<name/>` tags into calls to `tags[name]`, returning the
|
|
284
|
+
message as text and whatever the handlers returned. Tags are bare names (no attributes); a tag
|
|
285
|
+
without an own handler keeps its content as text, an unclosed or stray marker stays literal, and
|
|
286
|
+
interpolated values and `#` are never read for tags. `renderRich(renderer, ...)` is the same for a
|
|
287
|
+
UI framework.
|
|
288
|
+
|
|
289
|
+
React, Preact, Solid and Vue export `rich(t, key, tags, vars)` from `/i18n`, returning one node
|
|
290
|
+
(each handler receives its tag's content as one node, and `<br/>` renders a `<br>` unless `br` is
|
|
291
|
+
given). Svelte exports `<Rich key tags vars>`, which takes one snippet per tag, and `rich()` for the
|
|
292
|
+
parts array. `t()` is unchanged.
|
|
293
|
+
|
|
294
|
+
- 0f6babe: feat(web): a route can export a `handle`, and `useMatches()` reports the rendered chain on every adapter.
|
|
295
|
+
|
|
296
|
+
```tsx
|
|
297
|
+
// routes/orgs/[org]/_layout.tsx
|
|
298
|
+
import { useMatches } from "@nifrajs/web-react/router";
|
|
299
|
+
|
|
300
|
+
export const handle = { crumb: "Organization" };
|
|
301
|
+
|
|
302
|
+
export default function OrgLayout({
|
|
303
|
+
children,
|
|
304
|
+
}: {
|
|
305
|
+
children: React.ReactNode;
|
|
306
|
+
}) {
|
|
307
|
+
const crumbs = useMatches().flatMap(
|
|
308
|
+
(m) => (m.handle as { crumb?: string } | undefined)?.crumb ?? []
|
|
309
|
+
);
|
|
310
|
+
// ...
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
`useMatches()` lists the layouts being rendered, outermost first, then the page, each as
|
|
315
|
+
`{ id, pathname, params, data, handle }`: the route file without its extension, the part of the URL
|
|
316
|
+
it covers (never the query), the params it declares, its loader data (`null` without a loader), and
|
|
317
|
+
its `handle` export. The server render and the browser report the same list, so a breadcrumb trail
|
|
318
|
+
hydrates with no mismatch. `handle` is read from the module on each side and never serialized.
|
|
319
|
+
|
|
320
|
+
While a `_loading` page is up it takes the page's place; a nested `_404` reports the layouts it
|
|
321
|
+
renders inside; an `_error` page the server renders reports an empty list. The hook ships from each
|
|
322
|
+
adapter's `/router` entry: an array on React and Preact, a `Ref` on Vue, an accessor on Solid and
|
|
323
|
+
Svelte. An app that never calls it does not bundle it.
|
|
324
|
+
|
|
325
|
+
The Preact, Solid, Vue and Svelte client mounts now pass `params` and `path` to the rendered chain,
|
|
326
|
+
as the server render already did. `UIMatch` and `MatchChain` are exported from `@nifrajs/web`.
|
|
327
|
+
|
|
328
|
+
### Patch Changes
|
|
329
|
+
|
|
330
|
+
- ee19d29: fix(web-react, web-preact, web-vue, web-solid, web-svelte): a layout keeps its loader data in the
|
|
331
|
+
browser. The mounted router rendered every layout with `data: null` - on the first paint, where the
|
|
332
|
+
server had rendered the layout with its data and the client render no longer matched it, and after
|
|
333
|
+
each client navigation. It now hands each layout the data the router holds for it. On Solid a layout
|
|
334
|
+
also follows a same-route update, so new layout data after a revalidation or a param change arrives
|
|
335
|
+
without the layout remounting.
|
|
336
|
+
- 6393b1e: feat(web): `_loading.tsx` is what the page slot shows while a client navigation loads. A navigation
|
|
337
|
+
still waiting on its data after about 120 ms swaps the page for the target route's nearest
|
|
338
|
+
`_loading` - the innermost one above it whose layouts are already on screen, which are the layouts
|
|
339
|
+
the two pages share; they stay mounted with their data. A `_loading` never renders outside a layout
|
|
340
|
+
above it. A navigation that settles sooner goes straight to the new page, as does one with no
|
|
341
|
+
eligible `_loading`; a change of search on the same path and a form submit keep the page. A newer
|
|
342
|
+
navigation, a form submit, or a refresh of the page on screen takes over from a pending loading
|
|
343
|
+
page, and a superseded navigation that fails later changes nothing. The
|
|
344
|
+
component receives `pending` and no `data`. It is browser-only: the server never renders one, and an
|
|
345
|
+
app without a `_loading` file ships no code for it. Where the browser runs view transitions, a
|
|
346
|
+
navigation's transition ends on the loading page instead of holding the old page until the data
|
|
347
|
+
arrives. `Manifest.loadings` lists the pages (`LoadingEntry`, each with the layouts it sits under)
|
|
348
|
+
and `RouteEntry.loadingIds` the ones above each route. In a `buildClient` build every page links the
|
|
349
|
+
loading pages' stylesheets.
|
|
350
|
+
|
|
351
|
+
A file named `_loading` was an ignored underscore file before; one kept in a routes directory for
|
|
352
|
+
another purpose is now a loading page.
|
|
353
|
+
|
|
354
|
+
fix(web-solid): the mounted router renders the chain the router names while a navigation is pending,
|
|
355
|
+
which is how a `_loading` page reaches the screen. A pending navigation on the same chain is still
|
|
356
|
+
skipped until it settles.
|
|
357
|
+
|
|
358
|
+
- 1ae5543: The MDX runtime's intrinsic components always render their own tag: a `component` prop on a Markdown element no longer replaces the element, and the element's props stay reactive. `useMDXComponents()` now types each component's result as `JSX.Element` instead of `unknown`.
|
|
359
|
+
- 64e7a42: fix(web): pages that `defer()` keep working under a nonce Content-Security-Policy.
|
|
360
|
+
React, Solid and Preact stream inline scripts to reveal a Suspense boundary that resolves after the
|
|
361
|
+
shell, and none of them carried the document's nonce, so a nonce CSP blocked them and the boundary
|
|
362
|
+
stayed on its fallback. `RenderAdapter.renderToStream` now receives `{ nonce }` as an optional third
|
|
363
|
+
argument (`RenderStreamOptions`), and every adapter that streams scripts applies it: React and Solid
|
|
364
|
+
through their own `nonce` option, Preact on the one island-runtime script it streams. A script the
|
|
365
|
+
app renders itself never inherits the nonce. Vue, Svelte and the vanilla adapter stream no scripts.
|
|
366
|
+
- Updated dependencies [dde125b]
|
|
367
|
+
- Updated dependencies [22e2af8]
|
|
368
|
+
- Updated dependencies [72b62fa]
|
|
369
|
+
- Updated dependencies [aa44e93]
|
|
370
|
+
- Updated dependencies [4a3ee60]
|
|
371
|
+
- Updated dependencies [963694f]
|
|
372
|
+
- Updated dependencies [aad6297]
|
|
373
|
+
- Updated dependencies [dad0d41]
|
|
374
|
+
- Updated dependencies [538adc2]
|
|
375
|
+
- Updated dependencies [f47edd1]
|
|
376
|
+
- Updated dependencies [df9530a]
|
|
377
|
+
- Updated dependencies [3e6973f]
|
|
378
|
+
- Updated dependencies [25e8edf]
|
|
379
|
+
- Updated dependencies [2b5e5fc]
|
|
380
|
+
- Updated dependencies [3b090de]
|
|
381
|
+
- Updated dependencies [da7d792]
|
|
382
|
+
- Updated dependencies [612a296]
|
|
383
|
+
- Updated dependencies [fb14dfa]
|
|
384
|
+
- Updated dependencies [8ae97f6]
|
|
385
|
+
- Updated dependencies [4af6f39]
|
|
386
|
+
- Updated dependencies [ca8b50d]
|
|
387
|
+
- Updated dependencies [b00a889]
|
|
388
|
+
- Updated dependencies [b53d64f]
|
|
389
|
+
- Updated dependencies [66fd712]
|
|
390
|
+
- Updated dependencies [9c3d524]
|
|
391
|
+
- Updated dependencies [738e7a1]
|
|
392
|
+
- Updated dependencies [4801cac]
|
|
393
|
+
- Updated dependencies [1b2d53a]
|
|
394
|
+
- Updated dependencies [25fe13d]
|
|
395
|
+
- Updated dependencies [0852290]
|
|
396
|
+
- Updated dependencies [0589dbe]
|
|
397
|
+
- Updated dependencies [2e2d8c0]
|
|
398
|
+
- Updated dependencies [856f5ce]
|
|
399
|
+
- Updated dependencies [18aa5aa]
|
|
400
|
+
- Updated dependencies [cfd86b3]
|
|
401
|
+
- Updated dependencies [8ff96c9]
|
|
402
|
+
- Updated dependencies [4c46199]
|
|
403
|
+
- Updated dependencies [eef4932]
|
|
404
|
+
- Updated dependencies [6de8686]
|
|
405
|
+
- Updated dependencies [86e2d0f]
|
|
406
|
+
- Updated dependencies [a0cfffa]
|
|
407
|
+
- Updated dependencies [d7892ea]
|
|
408
|
+
- Updated dependencies [93e5e7f]
|
|
409
|
+
- Updated dependencies [214d674]
|
|
410
|
+
- Updated dependencies [4936309]
|
|
411
|
+
- Updated dependencies [ff5a779]
|
|
412
|
+
- Updated dependencies [772249a]
|
|
413
|
+
- Updated dependencies [f70f99b]
|
|
414
|
+
- Updated dependencies [49f106f]
|
|
415
|
+
- Updated dependencies [4936309]
|
|
416
|
+
- Updated dependencies [def0172]
|
|
417
|
+
- Updated dependencies [fc2f019]
|
|
418
|
+
- Updated dependencies [a734fba]
|
|
419
|
+
- Updated dependencies [0e9b167]
|
|
420
|
+
- Updated dependencies [bbdc5a1]
|
|
421
|
+
- Updated dependencies [10bc446]
|
|
422
|
+
- Updated dependencies [e8270d9]
|
|
423
|
+
- Updated dependencies [d942c33]
|
|
424
|
+
- Updated dependencies [ef28ef9]
|
|
425
|
+
- Updated dependencies [ff4a062]
|
|
426
|
+
- Updated dependencies [43ba944]
|
|
427
|
+
- Updated dependencies [46c741a]
|
|
428
|
+
- Updated dependencies [7bfa25e]
|
|
429
|
+
- Updated dependencies [216fe27]
|
|
430
|
+
- Updated dependencies [4936309]
|
|
431
|
+
- Updated dependencies [6e257a6]
|
|
432
|
+
- Updated dependencies [4a03d30]
|
|
433
|
+
- Updated dependencies [8e30090]
|
|
434
|
+
- Updated dependencies [28f3aaf]
|
|
435
|
+
- Updated dependencies [6d20355]
|
|
436
|
+
- Updated dependencies [08250bf]
|
|
437
|
+
- Updated dependencies [6907cbe]
|
|
438
|
+
- Updated dependencies [4b8d8de]
|
|
439
|
+
- Updated dependencies [ba5dd1c]
|
|
440
|
+
- Updated dependencies [d50f73e]
|
|
441
|
+
- Updated dependencies [031c33d]
|
|
442
|
+
- Updated dependencies [8fa902c]
|
|
443
|
+
- Updated dependencies [085e852]
|
|
444
|
+
- Updated dependencies [0dac7ec]
|
|
445
|
+
- Updated dependencies [b64c3ee]
|
|
446
|
+
- Updated dependencies [dc2d4d3]
|
|
447
|
+
- Updated dependencies [bda9637]
|
|
448
|
+
- Updated dependencies [81c720e]
|
|
449
|
+
- Updated dependencies [ed60b23]
|
|
450
|
+
- Updated dependencies [0150ed4]
|
|
451
|
+
- Updated dependencies [ae815ab]
|
|
452
|
+
- Updated dependencies [ea2ee87]
|
|
453
|
+
- Updated dependencies [3442e1c]
|
|
454
|
+
- Updated dependencies [85d636b]
|
|
455
|
+
- Updated dependencies [6c978a1]
|
|
456
|
+
- Updated dependencies [bfe29b6]
|
|
457
|
+
- Updated dependencies [8b99424]
|
|
458
|
+
- Updated dependencies [87783f0]
|
|
459
|
+
- Updated dependencies [135aba4]
|
|
460
|
+
- Updated dependencies [47b0d65]
|
|
461
|
+
- Updated dependencies [e32268d]
|
|
462
|
+
- Updated dependencies [432fec3]
|
|
463
|
+
- Updated dependencies [0e14068]
|
|
464
|
+
- Updated dependencies [8f1b780]
|
|
465
|
+
- Updated dependencies [dcc9ff6]
|
|
466
|
+
- Updated dependencies [5a63dd4]
|
|
467
|
+
- Updated dependencies [c49882f]
|
|
468
|
+
- Updated dependencies [dfd19d8]
|
|
469
|
+
- Updated dependencies [28e091f]
|
|
470
|
+
- Updated dependencies [046e79d]
|
|
471
|
+
- Updated dependencies [6393b1e]
|
|
472
|
+
- Updated dependencies [a158b74]
|
|
473
|
+
- Updated dependencies [ee19d29]
|
|
474
|
+
- Updated dependencies [293d3c8]
|
|
475
|
+
- Updated dependencies [7e1e1c3]
|
|
476
|
+
- Updated dependencies [0cd5f6e]
|
|
477
|
+
- Updated dependencies [2245bee]
|
|
478
|
+
- Updated dependencies [feeec4a]
|
|
479
|
+
- Updated dependencies [3eb6339]
|
|
480
|
+
- Updated dependencies [f784c32]
|
|
481
|
+
- Updated dependencies [e3b2b97]
|
|
482
|
+
- Updated dependencies [5934b5d]
|
|
483
|
+
- Updated dependencies [03a3729]
|
|
484
|
+
- Updated dependencies [bd11269]
|
|
485
|
+
- Updated dependencies [579d9a9]
|
|
486
|
+
- Updated dependencies [3554ad8]
|
|
487
|
+
- Updated dependencies [64e7a42]
|
|
488
|
+
- Updated dependencies [ee19d29]
|
|
489
|
+
- Updated dependencies [d6f806f]
|
|
490
|
+
- Updated dependencies [38cf032]
|
|
491
|
+
- Updated dependencies [b94e5cb]
|
|
492
|
+
- Updated dependencies [0f6babe]
|
|
493
|
+
- Updated dependencies [00f18bf]
|
|
494
|
+
- Updated dependencies [a84f546]
|
|
495
|
+
- Updated dependencies [669b6a2]
|
|
496
|
+
- Updated dependencies [ff25d68]
|
|
497
|
+
- @nifrajs/core@4.0.0
|
|
498
|
+
- @nifrajs/web@4.0.0
|
|
499
|
+
- @nifrajs/i18n@4.0.0
|
|
500
|
+
- @nifrajs/image@4.0.0
|
|
501
|
+
|
|
502
|
+
## 3.5.0
|
|
503
|
+
|
|
504
|
+
### Patch Changes
|
|
505
|
+
|
|
506
|
+
- Updated dependencies [6046984]
|
|
507
|
+
- Updated dependencies [ac27343]
|
|
508
|
+
- Updated dependencies [d5b7c22]
|
|
509
|
+
- @nifrajs/core@3.5.0
|
|
510
|
+
- @nifrajs/web@3.5.0
|
|
511
|
+
- @nifrajs/image@3.5.0
|
|
512
|
+
- @nifrajs/i18n@3.5.0
|
|
513
|
+
|
|
514
|
+
## 3.4.0
|
|
515
|
+
|
|
516
|
+
### Patch Changes
|
|
517
|
+
|
|
518
|
+
- 8d23613: Add the opt-in `@nifrajs/webmcp` package: typed WebMCP registration, core-backed receipts, deterministic predictive-UI reconciliation, and host-independent conformance checks. Also tighten agent execution cancellation cleanup so aborted local work cannot leak into later turns.
|
|
519
|
+
- Updated dependencies [8d23613]
|
|
520
|
+
- Updated dependencies [8d23613]
|
|
521
|
+
- Updated dependencies
|
|
522
|
+
- Updated dependencies [719d82e]
|
|
523
|
+
- @nifrajs/web@3.4.0
|
|
524
|
+
- @nifrajs/core@3.4.0
|
|
525
|
+
- @nifrajs/i18n@3.4.0
|
|
526
|
+
- @nifrajs/image@3.4.0
|
|
527
|
+
|
|
528
|
+
## 3.3.0
|
|
529
|
+
|
|
530
|
+
### Patch Changes
|
|
531
|
+
|
|
532
|
+
- @nifrajs/core@3.3.0
|
|
533
|
+
- @nifrajs/i18n@3.3.0
|
|
534
|
+
- @nifrajs/image@3.3.0
|
|
535
|
+
- @nifrajs/web@3.3.0
|
|
536
|
+
|
|
537
|
+
## 3.2.0
|
|
538
|
+
|
|
539
|
+
### Patch Changes
|
|
540
|
+
|
|
541
|
+
- c39712e: Move route policy compilation and deploy-target planning behind shared internal seams, pin the Solid adapter's Babel type identity, and add a cleanup-safe cross-runtime contract-lab runner.
|
|
542
|
+
- Updated dependencies [652201a]
|
|
543
|
+
- Updated dependencies [3aefb12]
|
|
544
|
+
- Updated dependencies [8b58d1f]
|
|
545
|
+
- Updated dependencies [c4ed8f7]
|
|
546
|
+
- Updated dependencies [25305bb]
|
|
547
|
+
- Updated dependencies [095c320]
|
|
548
|
+
- Updated dependencies [7504864]
|
|
549
|
+
- Updated dependencies [e88c23a]
|
|
550
|
+
- Updated dependencies [c39712e]
|
|
551
|
+
- Updated dependencies [9010fd3]
|
|
552
|
+
- Updated dependencies [7551709]
|
|
553
|
+
- Updated dependencies [ea2356e]
|
|
554
|
+
- Updated dependencies [a816b87]
|
|
555
|
+
- @nifrajs/web@3.2.0
|
|
556
|
+
- @nifrajs/core@3.2.0
|
|
557
|
+
- @nifrajs/image@3.2.0
|
|
558
|
+
- @nifrajs/i18n@3.2.0
|
|
559
|
+
|
|
560
|
+
## 3.1.0
|
|
561
|
+
|
|
562
|
+
### Patch Changes
|
|
563
|
+
|
|
564
|
+
- 8b136ee: Framework bindings now share consistent query and fetcher idle behavior while keeping mounted-router state isolated per adapter.
|
|
565
|
+
- Updated dependencies [5b78473]
|
|
566
|
+
- Updated dependencies [1400f6c]
|
|
567
|
+
- Updated dependencies [8b136ee]
|
|
568
|
+
- Updated dependencies [a7db515]
|
|
569
|
+
- @nifrajs/core@3.1.0
|
|
570
|
+
- @nifrajs/i18n@3.1.0
|
|
571
|
+
- @nifrajs/web@3.1.0
|
|
572
|
+
- @nifrajs/image@3.1.0
|
|
573
|
+
|
|
574
|
+
## 3.0.0
|
|
575
|
+
|
|
576
|
+
### Patch Changes
|
|
577
|
+
|
|
578
|
+
- 86a555b: The roadmap contract surfaces are now shipped across the public packages: shared island triggers,
|
|
579
|
+
typed content indexes and joins, client loader/action hooks, and unified static, dynamic, and
|
|
580
|
+
intercepting boundary modes. WebSocket routes also support opt-in synchronous outbound validation
|
|
581
|
+
through `sendSchema` + `validateSend`; invalid or asynchronous outbound frames fail closed while the
|
|
582
|
+
default remains type-level only.
|
|
583
|
+
- Updated dependencies [f3d2a35]
|
|
584
|
+
- Updated dependencies [6e43c15]
|
|
585
|
+
- Updated dependencies [293a7fe]
|
|
586
|
+
- Updated dependencies [485ae60]
|
|
587
|
+
- Updated dependencies [627b0ba]
|
|
588
|
+
- Updated dependencies [f0fd370]
|
|
589
|
+
- Updated dependencies [004deee]
|
|
590
|
+
- Updated dependencies [86a555b]
|
|
591
|
+
- Updated dependencies [8c5f4cf]
|
|
592
|
+
- Updated dependencies [f0fd370]
|
|
593
|
+
- Updated dependencies [381bbf3]
|
|
594
|
+
- Updated dependencies [36801ae]
|
|
595
|
+
- Updated dependencies [9acadba]
|
|
596
|
+
- Updated dependencies [99fc683]
|
|
597
|
+
- Updated dependencies [73d894d]
|
|
598
|
+
- @nifrajs/core@3.0.0
|
|
599
|
+
- @nifrajs/web@3.0.0
|
|
600
|
+
- @nifrajs/i18n@3.0.0
|
|
601
|
+
- @nifrajs/image@3.0.0
|
|
602
|
+
|
|
603
|
+
## 2.14.1
|
|
604
|
+
|
|
605
|
+
### Patch Changes
|
|
606
|
+
|
|
607
|
+
- Updated dependencies [bf93902]
|
|
608
|
+
- @nifrajs/core@2.14.1
|
|
609
|
+
- @nifrajs/i18n@2.14.1
|
|
610
|
+
- @nifrajs/web@2.14.1
|
|
611
|
+
- @nifrajs/image@2.14.1
|
|
612
|
+
|
|
613
|
+
## 2.14.0
|
|
614
|
+
|
|
615
|
+
### Patch Changes
|
|
616
|
+
|
|
617
|
+
- Updated dependencies [489c6b6]
|
|
618
|
+
- Updated dependencies [701961a]
|
|
619
|
+
- Updated dependencies [62e22e2]
|
|
620
|
+
- Updated dependencies [62e22e2]
|
|
621
|
+
- Updated dependencies [62133bf]
|
|
622
|
+
- Updated dependencies [8dffdf4]
|
|
623
|
+
- Updated dependencies [489c6b6]
|
|
624
|
+
- @nifrajs/web@2.14.0
|
|
625
|
+
- @nifrajs/core@2.14.0
|
|
626
|
+
- @nifrajs/i18n@2.14.0
|
|
627
|
+
- @nifrajs/image@2.14.0
|
|
628
|
+
|
|
629
|
+
## 2.13.0
|
|
630
|
+
|
|
631
|
+
### Patch Changes
|
|
632
|
+
|
|
633
|
+
- Updated dependencies [e0b2dd6]
|
|
634
|
+
- Updated dependencies [7535ce1]
|
|
635
|
+
- Updated dependencies [1704308]
|
|
636
|
+
- Updated dependencies [6510fdc]
|
|
637
|
+
- @nifrajs/core@2.13.0
|
|
638
|
+
- @nifrajs/web@2.13.0
|
|
639
|
+
- @nifrajs/i18n@2.13.0
|
|
640
|
+
- @nifrajs/image@2.13.0
|
|
641
|
+
|
|
642
|
+
## 2.12.1
|
|
643
|
+
|
|
644
|
+
### Patch Changes
|
|
645
|
+
|
|
646
|
+
- Updated dependencies [fba30c7]
|
|
647
|
+
- @nifrajs/core@2.12.1
|
|
648
|
+
- @nifrajs/i18n@2.12.1
|
|
649
|
+
- @nifrajs/web@2.12.1
|
|
650
|
+
- @nifrajs/image@2.12.1
|
|
651
|
+
|
|
652
|
+
## 2.12.0
|
|
653
|
+
|
|
654
|
+
### Patch Changes
|
|
655
|
+
|
|
656
|
+
- Updated dependencies [df100d3]
|
|
657
|
+
- Updated dependencies [0efacea]
|
|
658
|
+
- Updated dependencies [cd1732c]
|
|
659
|
+
- Updated dependencies [df100d3]
|
|
660
|
+
- Updated dependencies [9a9346e]
|
|
661
|
+
- Updated dependencies [b5f47c0]
|
|
662
|
+
- Updated dependencies [fc33c0f]
|
|
663
|
+
- Updated dependencies [fa51aba]
|
|
664
|
+
- Updated dependencies [c4e8bb0]
|
|
665
|
+
- Updated dependencies [11d1658]
|
|
666
|
+
- Updated dependencies [33ee9ff]
|
|
667
|
+
- Updated dependencies [ceda72d]
|
|
668
|
+
- Updated dependencies [2c004ca]
|
|
669
|
+
- Updated dependencies [5f71c23]
|
|
670
|
+
- Updated dependencies [3788b36]
|
|
671
|
+
- Updated dependencies [0863ef0]
|
|
672
|
+
- Updated dependencies [ae5338f]
|
|
673
|
+
- Updated dependencies [8847825]
|
|
674
|
+
- Updated dependencies [9a9346e]
|
|
675
|
+
- Updated dependencies [4c2123d]
|
|
676
|
+
- Updated dependencies [5e4e31a]
|
|
677
|
+
- Updated dependencies [24f1787]
|
|
678
|
+
- Updated dependencies [9a9346e]
|
|
679
|
+
- Updated dependencies [b045f9e]
|
|
680
|
+
- Updated dependencies [df07059]
|
|
681
|
+
- Updated dependencies [9a9346e]
|
|
682
|
+
- Updated dependencies [9a9346e]
|
|
683
|
+
- Updated dependencies [dbc0b79]
|
|
684
|
+
- Updated dependencies [bd5c624]
|
|
685
|
+
- Updated dependencies [a5d3f5b]
|
|
686
|
+
- Updated dependencies [00819c5]
|
|
687
|
+
- Updated dependencies [e2bdd4a]
|
|
688
|
+
- Updated dependencies [e2d1939]
|
|
689
|
+
- Updated dependencies [e83e6eb]
|
|
690
|
+
- Updated dependencies [64d25db]
|
|
691
|
+
- Updated dependencies [c55f7a3]
|
|
692
|
+
- Updated dependencies [f8b0097]
|
|
693
|
+
- @nifrajs/core@2.12.0
|
|
694
|
+
- @nifrajs/i18n@2.12.0
|
|
695
|
+
- @nifrajs/web@2.12.0
|
|
696
|
+
- @nifrajs/image@2.12.0
|
|
697
|
+
|
|
698
|
+
## 2.11.0
|
|
699
|
+
|
|
700
|
+
### Minor Changes
|
|
701
|
+
|
|
702
|
+
- ed5e91c: Vue, Solid and Svelte hot-patch a component edit in place on the Bun dev pipeline: the page keeps its scroll position, its open dialogs and the rest of its client state, and only the edited component re-renders. Route modules still full-reload on save, since a route carries the loader and meta the server ran. The wiring is emitted for a dev server's client compile only, so nothing reaches a production bundle.
|
|
703
|
+
|
|
704
|
+
`@nifrajs/web-svelte/plugin` adds `svelteHmrBoundary`, the same boundary for the Vite pipeline - pass it to `@sveltejs/vite-plugin-svelte` as `dynamicCompileOptions`. Svelte's hot-patch wrapper resolves a component through a signal, which reconciles against server markup only where the component is a plain child in a template; a layout or a page is neither, and wrapping one desyncs hydration on first load. The boundary keeps the wrapper on the app's own views. (Svelte recreates the patched component, so its own `$state` restarts - Vue and Solid preserve theirs.)
|
|
705
|
+
|
|
706
|
+
`Router.svelte` now takes `searchOfChain` from `@nifrajs/web/client` rather than the package root, so a client bundle no longer reaches server-only modules through it.
|
|
707
|
+
|
|
708
|
+
### Patch Changes
|
|
709
|
+
|
|
710
|
+
- 30f5ea3: SSR renders the code that is on disk on the Bun dev pipeline, not just for route files. An edit to anything a route imports - a component, a helper, a `*.server` module, at any depth - now reaches the server-rendered HTML on the next request, so a saved change no longer shows up on the client while the SSR pass still renders the version the server started with. All four frameworks, and both `import "./Counter"` and `import "./Counter.tsx"`.
|
|
711
|
+
|
|
712
|
+
A module nobody edited keeps its identity, so a database client or any other module-scope singleton shared between the backend and a route is still a single instance; editing that module deliberately gives the routes the new code. The Vite pipeline is unchanged - it already owned an SSR module graph.
|
|
713
|
+
|
|
714
|
+
`@nifrajs/web/plugins/kit` adds `rewriteSsrImports`, which a plugin that compiles its own file type passes its `generate: "ssr"` output through - the compiling plugin is the only code that sees that file's imports, so it is the only place they can be re-keyed.
|
|
715
|
+
|
|
716
|
+
- Updated dependencies [ed5e91c]
|
|
717
|
+
- Updated dependencies [30f5ea3]
|
|
718
|
+
- Updated dependencies [c29e0d0]
|
|
719
|
+
- @nifrajs/web@2.11.0
|
|
720
|
+
- @nifrajs/core@2.11.0
|
|
721
|
+
- @nifrajs/i18n@2.11.0
|
|
722
|
+
- @nifrajs/image@2.11.0
|
|
723
|
+
|
|
724
|
+
## 2.10.0
|
|
725
|
+
|
|
726
|
+
### Patch Changes
|
|
727
|
+
|
|
728
|
+
- Updated dependencies [5263c4e]
|
|
729
|
+
- Updated dependencies [15bffdd]
|
|
730
|
+
- Updated dependencies [15bffdd]
|
|
731
|
+
- Updated dependencies [15bffdd]
|
|
732
|
+
- @nifrajs/web@2.10.0
|
|
733
|
+
- @nifrajs/core@2.10.0
|
|
734
|
+
- @nifrajs/image@2.10.0
|
|
735
|
+
- @nifrajs/i18n@2.10.0
|
|
736
|
+
|
|
737
|
+
## 2.9.1
|
|
738
|
+
|
|
739
|
+
### Patch Changes
|
|
740
|
+
|
|
741
|
+
- Updated dependencies [01e36fb]
|
|
742
|
+
- @nifrajs/core@2.9.1
|
|
743
|
+
- @nifrajs/web@2.9.1
|
|
744
|
+
- @nifrajs/i18n@2.9.1
|
|
745
|
+
- @nifrajs/image@2.9.1
|
|
746
|
+
|
|
747
|
+
## 2.9.0
|
|
748
|
+
|
|
749
|
+
### Patch Changes
|
|
750
|
+
|
|
751
|
+
- Updated dependencies [e05e56d]
|
|
752
|
+
- @nifrajs/core@2.9.0
|
|
753
|
+
- @nifrajs/web@2.9.0
|
|
754
|
+
- @nifrajs/i18n@2.9.0
|
|
755
|
+
- @nifrajs/image@2.9.0
|
|
756
|
+
|
|
757
|
+
## 2.8.2
|
|
758
|
+
|
|
759
|
+
### Patch Changes
|
|
760
|
+
|
|
761
|
+
- Updated dependencies [f7d68e8]
|
|
762
|
+
- @nifrajs/core@2.8.2
|
|
763
|
+
- @nifrajs/image@2.8.2
|
|
764
|
+
- @nifrajs/web@2.8.2
|
|
765
|
+
- @nifrajs/i18n@2.8.2
|
|
766
|
+
|
|
767
|
+
## 2.8.1
|
|
768
|
+
|
|
769
|
+
### Patch Changes
|
|
770
|
+
|
|
771
|
+
- Updated dependencies [78d66a4]
|
|
772
|
+
- Updated dependencies [93fdc89]
|
|
773
|
+
- @nifrajs/core@2.8.1
|
|
774
|
+
- @nifrajs/web@2.8.1
|
|
775
|
+
- @nifrajs/i18n@2.8.1
|
|
776
|
+
- @nifrajs/image@2.8.1
|
|
777
|
+
|
|
778
|
+
## 2.8.0
|
|
779
|
+
|
|
780
|
+
### Patch Changes
|
|
781
|
+
|
|
782
|
+
- Updated dependencies [118e4a5]
|
|
783
|
+
- @nifrajs/web@2.8.0
|
|
784
|
+
- @nifrajs/core@2.8.0
|
|
785
|
+
- @nifrajs/i18n@2.8.0
|
|
786
|
+
- @nifrajs/image@2.8.0
|
|
787
|
+
|
|
788
|
+
## 2.7.1
|
|
789
|
+
|
|
790
|
+
### Patch Changes
|
|
791
|
+
|
|
792
|
+
- Updated dependencies [52c89e0]
|
|
793
|
+
- @nifrajs/core@2.7.1
|
|
794
|
+
- @nifrajs/web@2.7.1
|
|
795
|
+
- @nifrajs/i18n@2.7.1
|
|
796
|
+
- @nifrajs/image@2.7.1
|
|
797
|
+
|
|
798
|
+
## 2.7.0
|
|
799
|
+
|
|
800
|
+
### Patch Changes
|
|
801
|
+
|
|
802
|
+
- @nifrajs/core@2.7.0
|
|
803
|
+
- @nifrajs/i18n@2.7.0
|
|
804
|
+
- @nifrajs/image@2.7.0
|
|
805
|
+
- @nifrajs/web@2.7.0
|
|
806
|
+
|
|
807
|
+
## 2.6.1
|
|
808
|
+
|
|
809
|
+
### Patch Changes
|
|
810
|
+
|
|
811
|
+
- Updated dependencies [5840c98]
|
|
812
|
+
- Updated dependencies [80419f5]
|
|
813
|
+
- @nifrajs/core@2.6.1
|
|
814
|
+
- @nifrajs/web@2.6.1
|
|
815
|
+
- @nifrajs/i18n@2.6.1
|
|
816
|
+
- @nifrajs/image@2.6.1
|
|
817
|
+
|
|
818
|
+
## 2.6.0
|
|
819
|
+
|
|
820
|
+
### Patch Changes
|
|
821
|
+
|
|
822
|
+
- Updated dependencies [e6349e5]
|
|
823
|
+
- Updated dependencies [08fe221]
|
|
824
|
+
- Updated dependencies [8383063]
|
|
825
|
+
- @nifrajs/web@2.6.0
|
|
826
|
+
- @nifrajs/core@2.6.0
|
|
827
|
+
- @nifrajs/i18n@2.6.0
|
|
828
|
+
- @nifrajs/image@2.6.0
|
|
829
|
+
|
|
830
|
+
## 2.5.0
|
|
831
|
+
|
|
832
|
+
### Patch Changes
|
|
833
|
+
|
|
834
|
+
- 02d9aa8: Routing hooks now SSR-render correctly on the dev server. In dev, the adapter is imported by Bun while route modules load through Vite's SSR runner, so the router module could be evaluated twice in one process - two context objects, and `useSearch`/`useParams`/`useLocation` read a context the render never provided. The result was hooks SSR-rendering their empty defaults (`useSearch()` gave `{}`) while the same request's loader saw the validated values; hydration then papered over it on the client, so it surfaced as "the search schema doesn't work in dev". The router context in every adapter is now a `globalThis` singleton (keyed by `Symbol.for`), so both evaluations share the one context React/Vue/Solid/Preact matches providers to readers by. The Vite dev server also mirrors its client `resolve.conditions` into `ssr.resolve.{conditions,externalConditions}`, so dev SSR resolves the same `bun`-conditioned source files Bun does instead of a package's `dist` artifact - which nothing in the dev loop rebuilds, and whose staleness previously 500'd inside framework code.
|
|
835
|
+
- Updated dependencies [02d9aa8]
|
|
836
|
+
- @nifrajs/web@2.5.0
|
|
837
|
+
- @nifrajs/core@2.5.0
|
|
838
|
+
- @nifrajs/i18n@2.5.0
|
|
839
|
+
- @nifrajs/image@2.5.0
|
|
840
|
+
|
|
841
|
+
## 2.4.0
|
|
842
|
+
|
|
843
|
+
### Patch Changes
|
|
844
|
+
|
|
845
|
+
- Updated dependencies [1c2bf5a]
|
|
846
|
+
- Updated dependencies [138bfba]
|
|
847
|
+
- Updated dependencies [23e6eb1]
|
|
848
|
+
- @nifrajs/web@2.4.0
|
|
849
|
+
- @nifrajs/core@2.4.0
|
|
850
|
+
- @nifrajs/i18n@2.4.0
|
|
851
|
+
- @nifrajs/image@2.4.0
|
|
852
|
+
|
|
853
|
+
## 2.3.0
|
|
854
|
+
|
|
855
|
+
### Minor Changes
|
|
856
|
+
|
|
857
|
+
- 2d9beaa: Preact, Vue, Solid and Svelte gain `useNavigate` and `useBlocker`, from `@nifrajs/web-<framework>/router`.
|
|
858
|
+
|
|
859
|
+
`useNavigate` returns a programmatic navigate (a path pushes or replaces; a number is a history delta),
|
|
860
|
+
matching the React adapter. `useBlocker` is the unsaved-changes guard - pass a boolean or a
|
|
861
|
+
`({ currentLocation, nextLocation }) => boolean` predicate and get back a `{ state, proceed, reset }`
|
|
862
|
+
value in each framework's own reactive shape (a Vue ref, a Solid accessor, a Svelte store, a plain value
|
|
863
|
+
in Preact). When a navigation is intercepted, `state` becomes `"blocked"`; show your own confirmation and
|
|
864
|
+
call `proceed()` or `reset()`. It also arms the native "Leave site?" prompt on tab close and reload.
|
|
865
|
+
|
|
866
|
+
```svelte
|
|
867
|
+
<script>
|
|
868
|
+
import { useBlocker } from "@nifrajs/web-svelte/router"
|
|
869
|
+
let dirty = false
|
|
870
|
+
const blocker = useBlocker(() => dirty)
|
|
871
|
+
</script>
|
|
872
|
+
|
|
873
|
+
{#if $blocker.state === "blocked"}
|
|
874
|
+
<dialog open>
|
|
875
|
+
<button on:click={$blocker.reset}>Keep editing</button>
|
|
876
|
+
<button on:click={$blocker.proceed}>Discard</button>
|
|
877
|
+
</dialog>
|
|
878
|
+
{/if}
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
In Vue, Solid and Svelte the hook is created once, so pass a function to track a changing flag
|
|
882
|
+
(`useBlocker(() => dirty)`); a bare boolean is captured as-is. The guarding itself already ran on every
|
|
883
|
+
adapter at the browser layer - this exposes it as a reactive hook.
|
|
884
|
+
|
|
885
|
+
- c823915: Typed, validated search params: a route declares a `searchSchema` and both its loader and its component read the parsed, validated query.
|
|
886
|
+
|
|
887
|
+
Export a Standard Schema as `searchSchema` from a route. The loader's `ctx.search` becomes the parsed URL query validated against it (typed via `LoaderArgs<typeof app, Env, typeof searchSchema>`), and the component reads the same value with `useSearch<typeof searchSchema>()`. Invalid or hostile input fails closed to the schema's defaults (never a 500); without a `searchSchema`, both are the raw parsed query. Validation runs at match time and the value is derived identically on the server and on client navigation, so a component never parses `window.location.search` by hand and the query it renders hydrates with no mismatch.
|
|
888
|
+
|
|
889
|
+
```tsx
|
|
890
|
+
export const searchSchema = v.object({
|
|
891
|
+
page: v.optional(v.fallback(v.number(), 1), 1),
|
|
892
|
+
});
|
|
893
|
+
|
|
894
|
+
export async function loader({
|
|
895
|
+
search,
|
|
896
|
+
api,
|
|
897
|
+
}: LoaderArgs<typeof backend, unknown, typeof searchSchema>) {
|
|
898
|
+
return { rows: await api.reports.list(search).get() }; // search.page is a number
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
export default function Reports({ data }) {
|
|
902
|
+
const { page } = useSearch<typeof searchSchema>(); // page: number, SSR-correct
|
|
903
|
+
return <Pager page={page} />;
|
|
904
|
+
}
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
A `_layout` can declare its own `searchSchema` for keys shared across a section (`?org`, `?theme`); the route's effective search merges the layout chain's schemas with the page's, page-wins on a conflict, so both the layout and the page read their validated slice from one object.
|
|
908
|
+
|
|
909
|
+
A route can also list `searchClientKeys` - search keys that are purely client-side UI (`?tab`, a client-side `?sort`, `?modal`). When a client navigation changes only those keys, the URL updates (so `useSearch` re-renders) without re-running the loader; any other key change revalidates as before, so data is never stale.
|
|
910
|
+
|
|
911
|
+
`useSearch` ships on every adapter - React (a value), Preact (a value), Vue (a `Ref`), Solid (an `Accessor`), and Svelte (an accessor), each in that framework's own shape.
|
|
912
|
+
|
|
913
|
+
`navigate` gains an object form on every adapter: `navigate({ to, search, replace })` serializes `search` onto `to` (no hand-built query strings). Run `nifra sync-routes` to generate `nifra-routes.d.ts` (each static route mapped to its schema output) and include it in your tsconfig, and `search` is typed against the target route's `searchSchema` - a wrong shape for a known route is a compile error, while an unmapped path takes a loose `search`. Regenerated from the route files, so a stale shape becomes a `tsc` error. The string-path and history-delta forms are unchanged.
|
|
914
|
+
|
|
915
|
+
```ts
|
|
916
|
+
navigate({ to: "/reports", search: { page: 2 } }); // search typed against /reports's schema
|
|
917
|
+
```
|
|
918
|
+
|
|
919
|
+
- 62a8d03: Add `useServerFn` - a server function's pending, data and error state - to all five adapters.
|
|
920
|
+
|
|
921
|
+
```tsx
|
|
922
|
+
const addTodo = useServerFn(fns.addTodo)
|
|
923
|
+
<button disabled={addTodo.pending} onClick={() => addTodo.call({ text }).catch(() => {})}>add</button>
|
|
924
|
+
```
|
|
925
|
+
|
|
926
|
+
Calling a server function never needed a binding: the client stub is `(input) => Promise<Output>`.
|
|
927
|
+
This adds only the state a component wants around it.
|
|
928
|
+
|
|
929
|
+
The state machine is `@nifrajs/web`'s `createServerFnStore`, shared by every adapter, so "is it
|
|
930
|
+
pending" has one answer rather than five that drift. Each binding contributes just its subscription
|
|
931
|
+
primitive: `useSyncExternalStore` (React, Preact), a signal (Solid), a `shallowRef` (Vue), a `readable`
|
|
932
|
+
(Svelte).
|
|
933
|
+
|
|
934
|
+
Two behaviours worth knowing:
|
|
935
|
+
|
|
936
|
+
- **The last call wins.** A response that is no longer the newest is discarded rather than written, so
|
|
937
|
+
a slow first call landing after a fast second cannot overwrite fresh data with stale.
|
|
938
|
+
- **`call` still rejects.** The error is recorded for rendering AND the promise rejects, so `await`
|
|
939
|
+
behaves normally. A caller that only renders from state should attach `.catch(() => {})`, as with
|
|
940
|
+
`useFetcher`'s `submit`.
|
|
941
|
+
|
|
942
|
+
`data` is kept while the next call is in flight, so a rendered list does not blank on every refetch.
|
|
943
|
+
|
|
944
|
+
### Patch Changes
|
|
945
|
+
|
|
946
|
+
- fd04bb5: Solid's and Vue's `useServerFn` seed their reactive state from the store rather than from the idle
|
|
947
|
+
constant.
|
|
948
|
+
|
|
949
|
+
Both values are identical today - the store is created one line above and cannot have moved - so this
|
|
950
|
+
changes no behaviour. It removes the dependence on that staying true. Svelte's binding had the same
|
|
951
|
+
line reading the constant, and because its subscription is lazy the first render showed idle for a
|
|
952
|
+
call that had already finished. Reading the snapshot makes correctness independent of when the
|
|
953
|
+
subscription attaches.
|
|
954
|
+
|
|
955
|
+
- ea0a27f: A server function has one type per half, so both the server call and the hook argument are honest.
|
|
956
|
+
|
|
957
|
+
```ts
|
|
958
|
+
export type ClientServerFn<Input, Output> = (
|
|
959
|
+
input: Input
|
|
960
|
+
) => MaybePromise<Output>;
|
|
961
|
+
export type ServerFnReference<Input, Output> =
|
|
962
|
+
| ServerFn<Input, Output>
|
|
963
|
+
| ClientServerFn<Input, Output>;
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
One type could not describe both halves. `ServerFn` is the SERVER declaration and takes `(input,
|
|
967
|
+
context)`; the client imports a generated stub that takes one argument. Widening the single type so a
|
|
968
|
+
one-argument call compiled made a direct server call type-check while handing the declaration
|
|
969
|
+
`undefined` for a context its implementation requires - a runtime failure the compiler had just been
|
|
970
|
+
told to allow.
|
|
971
|
+
|
|
972
|
+
Now the two are separate and `useServerFn` accepts either through `ServerFnReference`, which is the
|
|
973
|
+
one place the two halves legitimately meet. Calling a declaration from your own server code needs the
|
|
974
|
+
context, and omitting it is a compile error again.
|
|
975
|
+
|
|
976
|
+
- Updated dependencies [6f5b3ad]
|
|
977
|
+
- Updated dependencies [85b354d]
|
|
978
|
+
- Updated dependencies [7293a1c]
|
|
979
|
+
- Updated dependencies [8514caa]
|
|
980
|
+
- Updated dependencies [ea0a27f]
|
|
981
|
+
- Updated dependencies [ea0a27f]
|
|
982
|
+
- Updated dependencies [45b0733]
|
|
983
|
+
- Updated dependencies [c42d777]
|
|
984
|
+
- Updated dependencies [ea0a27f]
|
|
985
|
+
- Updated dependencies [b271164]
|
|
986
|
+
- Updated dependencies [8c77d47]
|
|
987
|
+
- Updated dependencies [ea0a27f]
|
|
988
|
+
- Updated dependencies [ea0a27f]
|
|
989
|
+
- Updated dependencies [d190b1c]
|
|
990
|
+
- Updated dependencies [a4ecca9]
|
|
991
|
+
- Updated dependencies [de8d992]
|
|
992
|
+
- Updated dependencies [a92104e]
|
|
993
|
+
- Updated dependencies [5fe332a]
|
|
994
|
+
- Updated dependencies [c823915]
|
|
995
|
+
- Updated dependencies [d2840ac]
|
|
996
|
+
- Updated dependencies [62a8d03]
|
|
997
|
+
- Updated dependencies [dcacfe7]
|
|
998
|
+
- Updated dependencies [28704d7]
|
|
999
|
+
- Updated dependencies [ea0a27f]
|
|
1000
|
+
- Updated dependencies [0c2de22]
|
|
1001
|
+
- @nifrajs/core@2.3.0
|
|
1002
|
+
- @nifrajs/web@2.3.0
|
|
1003
|
+
- @nifrajs/i18n@2.3.0
|
|
1004
|
+
- @nifrajs/image@2.3.0
|
|
1005
|
+
|
|
1006
|
+
## 2.2.0
|
|
1007
|
+
|
|
1008
|
+
### Minor Changes
|
|
1009
|
+
|
|
1010
|
+
- 1394641: Layout loaders: request data in the component that wraps every page.
|
|
1011
|
+
|
|
1012
|
+
`routes/_layout.tsx` rendered, but a `loader` it exported never ran, so nothing request-derived could
|
|
1013
|
+
reach a layout - host, session, locale, feature flags, tenant. An app hit this and moved its host guard
|
|
1014
|
+
out of the component tree into the server entry, where it could not be typechecked with the rest of the
|
|
1015
|
+
app. That is the real cost: the gap pushed security-relevant code to the one place nifra's typed-boundary
|
|
1016
|
+
promise does not reach. Remix, React Router and SvelteKit all support this; nifra was alone in not.
|
|
1017
|
+
|
|
1018
|
+
```tsx
|
|
1019
|
+
// routes/orgs/[org]/_layout.tsx
|
|
1020
|
+
export const gate = true // optional; see below
|
|
1021
|
+
export async function loader({ params, req }) {
|
|
1022
|
+
return { org: await findOrg(params.org) } // params is { org } - nothing deeper
|
|
1023
|
+
}
|
|
1024
|
+
export default function Layout({ data, children }) { … }
|
|
1025
|
+
```
|
|
1026
|
+
|
|
1027
|
+
**Scoped, not global.** A layout owns the URL prefix it wraps, so it receives only the params inside
|
|
1028
|
+
that prefix and its loader is skipped on a navigation that did not change them. Navigating
|
|
1029
|
+
`/orgs/acme/a` → `/orgs/acme/b` does not re-run the org layout's loader. Scope is derived at build time
|
|
1030
|
+
per `(route, layout)` pair, because one layout can own different params on different expanded patterns:
|
|
1031
|
+
`[[lang]]/docs/_layout` owns nothing on `/docs/:slug` and `{lang}` on `/:lang/docs/:slug`. Layouts are
|
|
1032
|
+
not router nodes and did not become any - the router is untouched.
|
|
1033
|
+
|
|
1034
|
+
**Execution order is declared, and this matters for security.** By default a layout loader runs in
|
|
1035
|
+
parallel with the page's, which is right for data and wrong for a guard: a page loader running
|
|
1036
|
+
concurrently with a guard has already queried by the time the guard says no. `export const gate = true`
|
|
1037
|
+
makes a layout blocking - nothing beneath it runs until it resolves, and nothing beneath a rejected gate
|
|
1038
|
+
runs at all. **A layout loader without `gate: true` is not an authorization boundary.** Gates also run on
|
|
1039
|
+
the data-only request, so a client navigation cannot bypass one by sending the data header, and a gate is
|
|
1040
|
+
never skipped by the retention hint.
|
|
1041
|
+
|
|
1042
|
+
A layout may throw `notFound()` / `gone()` / `redirect()`. Its errors resolve to the `_error` boundary at
|
|
1043
|
+
or above its OWN segment, never one below it - rendering there would wrap the boundary in the very layout
|
|
1044
|
+
whose loader just failed.
|
|
1045
|
+
|
|
1046
|
+
Every adapter passes each layout its own data. A layout with no loader receives `null`, and an app where
|
|
1047
|
+
no layout has a loader emits byte-identical HTML and unchanged props.
|
|
1048
|
+
|
|
1049
|
+
The data-mode response becomes a versioned envelope when a chain carries layout data. It is recognised
|
|
1050
|
+
by structure, and the bare pre-envelope shape is still accepted - a prerendered `_data.json` is a static
|
|
1051
|
+
file that outlives the deploy that wrote it.
|
|
1052
|
+
|
|
1053
|
+
### Patch Changes
|
|
1054
|
+
|
|
1055
|
+
- Updated dependencies [39b1670]
|
|
1056
|
+
- Updated dependencies [d428f52]
|
|
1057
|
+
- Updated dependencies [135d0c6]
|
|
1058
|
+
- Updated dependencies [1394641]
|
|
1059
|
+
- Updated dependencies [e713cab]
|
|
1060
|
+
- Updated dependencies [a4645e2]
|
|
1061
|
+
- Updated dependencies [a7d740a]
|
|
1062
|
+
- Updated dependencies [6e996a1]
|
|
1063
|
+
- Updated dependencies [15ad6ca]
|
|
1064
|
+
- Updated dependencies [6aa0aac]
|
|
1065
|
+
- Updated dependencies [1857d39]
|
|
1066
|
+
- Updated dependencies [6ba3173]
|
|
1067
|
+
- Updated dependencies [ca71a2e]
|
|
1068
|
+
- Updated dependencies [0fc215b]
|
|
1069
|
+
- Updated dependencies [2ff661f]
|
|
1070
|
+
- Updated dependencies [a1327a4]
|
|
1071
|
+
- Updated dependencies [2500705]
|
|
1072
|
+
- @nifrajs/web@2.2.0
|
|
1073
|
+
- @nifrajs/i18n@2.2.0
|
|
1074
|
+
- @nifrajs/image@2.2.0
|
|
1075
|
+
|
|
1076
|
+
## 2.1.0
|
|
1077
|
+
|
|
1078
|
+
### Patch Changes
|
|
1079
|
+
|
|
1080
|
+
- Updated dependencies [bd294bb]
|
|
1081
|
+
- @nifrajs/web@2.1.0
|
|
1082
|
+
- @nifrajs/i18n@2.1.0
|
|
1083
|
+
- @nifrajs/image@2.1.0
|
|
1084
|
+
|
|
1085
|
+
## 2.0.0
|
|
1086
|
+
|
|
1087
|
+
### Minor Changes
|
|
1088
|
+
|
|
1089
|
+
- 3620546: Extend `import Icon from "./icon.svg?component"` to the Solid, Svelte, and Vue adapters (`@nifrajs/web-solid/svg`, `@nifrajs/web-svelte/svg`, `@nifrajs/web-vue/svg`), joining the React/Preact plugin.
|
|
1090
|
+
|
|
1091
|
+
Each is a Bun build plugin that turns a `?component` SVG import into a framework component with the caller's props/attrs spread onto the root `<svg>`, using that framework's own compiler: Solid emits `class`-form JSX through `babel-preset-solid`; Svelte wraps the raw SVG in a Svelte 5 component (compiled by `svelte/compiler`); Vue wraps it in a single-root template so Vue's attribute inheritance forwards props to the `<svg>` (compiled by `@vue/compiler-sfc`). A plain `import "./icon.svg"` asset URL is untouched - only `?component` is intercepted. The shared `svgToJsx` transform gained a `classProp` option.
|
|
1092
|
+
|
|
1093
|
+
### Patch Changes
|
|
1094
|
+
|
|
1095
|
+
- Updated dependencies [ade0c7a]
|
|
1096
|
+
- Updated dependencies [d91a45b]
|
|
1097
|
+
- Updated dependencies [d91a45b]
|
|
1098
|
+
- Updated dependencies [e97a92f]
|
|
1099
|
+
- Updated dependencies [e8e49d1]
|
|
1100
|
+
- Updated dependencies [a7d34e5]
|
|
1101
|
+
- @nifrajs/web@2.0.0
|
|
1102
|
+
- @nifrajs/i18n@2.0.0
|
|
1103
|
+
- @nifrajs/image@2.0.0
|
|
1104
|
+
|
|
1105
|
+
## 1.13.0
|
|
1106
|
+
|
|
1107
|
+
### Patch Changes
|
|
1108
|
+
|
|
1109
|
+
- Updated dependencies [5b6127a]
|
|
1110
|
+
- @nifrajs/web@1.13.0
|
|
1111
|
+
- @nifrajs/i18n@1.13.0
|
|
1112
|
+
- @nifrajs/image@1.13.0
|
|
1113
|
+
|
|
1114
|
+
## 1.12.0
|
|
1115
|
+
|
|
1116
|
+
### Patch Changes
|
|
1117
|
+
|
|
1118
|
+
- @nifrajs/web@1.12.0
|
|
1119
|
+
- @nifrajs/i18n@1.12.0
|
|
1120
|
+
- @nifrajs/image@1.12.0
|
|
1121
|
+
|
|
1122
|
+
## 1.11.0
|
|
1123
|
+
|
|
1124
|
+
### Patch Changes
|
|
1125
|
+
|
|
1126
|
+
- Updated dependencies [5638ada]
|
|
1127
|
+
- @nifrajs/web@1.11.0
|
|
1128
|
+
- @nifrajs/i18n@1.11.0
|
|
1129
|
+
- @nifrajs/image@1.11.0
|
|
1130
|
+
|
|
1131
|
+
## 1.10.0
|
|
1132
|
+
|
|
1133
|
+
### Patch Changes
|
|
1134
|
+
|
|
1135
|
+
- @nifrajs/web@1.10.0
|
|
1136
|
+
- @nifrajs/i18n@1.10.0
|
|
1137
|
+
- @nifrajs/image@1.10.0
|
|
1138
|
+
|
|
1139
|
+
## 1.9.1
|
|
1140
|
+
|
|
1141
|
+
### Patch Changes
|
|
1142
|
+
|
|
1143
|
+
- Updated dependencies [3eb27ae]
|
|
1144
|
+
- @nifrajs/web@1.9.1
|
|
1145
|
+
- @nifrajs/i18n@1.9.1
|
|
1146
|
+
- @nifrajs/image@1.9.1
|
|
1147
|
+
|
|
1148
|
+
## 1.9.0
|
|
1149
|
+
|
|
1150
|
+
### Patch Changes
|
|
1151
|
+
|
|
1152
|
+
- Updated dependencies [0e1b4cc]
|
|
1153
|
+
- Updated dependencies [6b67833]
|
|
1154
|
+
- @nifrajs/web@1.9.0
|
|
1155
|
+
- @nifrajs/i18n@1.9.0
|
|
1156
|
+
- @nifrajs/image@1.9.0
|
|
1157
|
+
|
|
1158
|
+
## 1.8.0
|
|
1159
|
+
|
|
1160
|
+
### Patch Changes
|
|
1161
|
+
|
|
1162
|
+
- Updated dependencies [1ffd48b]
|
|
1163
|
+
- @nifrajs/web@1.8.0
|
|
1164
|
+
- @nifrajs/i18n@1.8.0
|
|
1165
|
+
- @nifrajs/image@1.8.0
|
|
1166
|
+
|
|
1167
|
+
## 1.7.0
|
|
1168
|
+
|
|
1169
|
+
### Patch Changes
|
|
1170
|
+
|
|
1171
|
+
- Updated dependencies [9f23e90]
|
|
1172
|
+
- @nifrajs/web@1.7.0
|
|
1173
|
+
- @nifrajs/i18n@1.7.0
|
|
1174
|
+
- @nifrajs/image@1.7.0
|
|
1175
|
+
|
|
1176
|
+
## 1.6.0
|
|
1177
|
+
|
|
1178
|
+
### Patch Changes
|
|
1179
|
+
|
|
1180
|
+
- @nifrajs/i18n@1.6.0
|
|
1181
|
+
- @nifrajs/image@1.6.0
|
|
1182
|
+
- @nifrajs/web@1.6.0
|
|
1183
|
+
|
|
1184
|
+
## 1.5.0
|
|
1185
|
+
|
|
1186
|
+
### Patch Changes
|
|
1187
|
+
|
|
1188
|
+
- @nifrajs/web@1.5.0
|
|
1189
|
+
- @nifrajs/i18n@1.5.0
|
|
1190
|
+
- @nifrajs/image@1.5.0
|
|
1191
|
+
|
|
1192
|
+
## 1.4.0
|
|
1193
|
+
|
|
1194
|
+
### Patch Changes
|
|
1195
|
+
|
|
1196
|
+
- Updated dependencies [4d25970]
|
|
1197
|
+
- @nifrajs/web@1.4.0
|
|
1198
|
+
- @nifrajs/i18n@1.4.0
|
|
1199
|
+
- @nifrajs/image@1.4.0
|
|
1200
|
+
|
|
1201
|
+
## 1.3.1
|
|
1202
|
+
|
|
1203
|
+
### Patch Changes
|
|
1204
|
+
|
|
1205
|
+
- @nifrajs/i18n@1.3.1
|
|
1206
|
+
- @nifrajs/image@1.3.1
|
|
1207
|
+
- @nifrajs/web@1.3.1
|
|
1208
|
+
|
|
1209
|
+
## 1.3.0
|
|
1210
|
+
|
|
1211
|
+
### Patch Changes
|
|
1212
|
+
|
|
1213
|
+
- Updated dependencies [4a4b1c4]
|
|
1214
|
+
- @nifrajs/web@1.3.0
|
|
1215
|
+
- @nifrajs/i18n@1.3.0
|
|
1216
|
+
- @nifrajs/image@1.3.0
|
|
1217
|
+
|
|
1218
|
+
## 1.2.2
|
|
1219
|
+
|
|
1220
|
+
### Patch Changes
|
|
1221
|
+
|
|
1222
|
+
- @nifrajs/i18n@1.2.2
|
|
1223
|
+
- @nifrajs/image@1.2.2
|
|
1224
|
+
- @nifrajs/web@1.2.2
|
|
1225
|
+
|
|
1226
|
+
## 1.2.1
|
|
1227
|
+
|
|
1228
|
+
### Patch Changes
|
|
1229
|
+
|
|
1230
|
+
- Updated dependencies [c3ebd73]
|
|
1231
|
+
- @nifrajs/web@1.2.1
|
|
1232
|
+
- @nifrajs/i18n@1.2.1
|
|
1233
|
+
- @nifrajs/image@1.2.1
|
|
1234
|
+
|
|
1235
|
+
## 1.2.0
|
|
1236
|
+
|
|
1237
|
+
### Patch Changes
|
|
1238
|
+
|
|
1239
|
+
- @nifrajs/web@1.2.0
|
|
1240
|
+
- @nifrajs/i18n@1.2.0
|
|
1241
|
+
- @nifrajs/image@1.2.0
|
|
1242
|
+
|
|
1243
|
+
## 1.1.0
|
|
1244
|
+
|
|
1245
|
+
### Patch Changes
|
|
1246
|
+
|
|
1247
|
+
- Updated dependencies [37d2383]
|
|
1248
|
+
- @nifrajs/web@1.1.0
|
|
1249
|
+
- @nifrajs/i18n@1.1.0
|
|
1250
|
+
- @nifrajs/image@1.1.0
|
|
1251
|
+
|
|
1252
|
+
## 1.0.0
|
|
1253
|
+
|
|
1254
|
+
### Patch Changes
|
|
1255
|
+
|
|
1256
|
+
- Updated dependencies [f1f0e18]
|
|
1257
|
+
- @nifrajs/web@1.0.0
|
|
1258
|
+
- @nifrajs/i18n@1.0.0
|
|
1259
|
+
- @nifrajs/image@1.0.0
|
|
1260
|
+
|
|
1261
|
+
## 1.0.0-beta.4
|
|
1262
|
+
|
|
1263
|
+
### Patch Changes
|
|
1264
|
+
|
|
1265
|
+
- @nifrajs/i18n@1.0.0-beta.4
|
|
1266
|
+
- @nifrajs/image@1.0.0-beta.4
|
|
1267
|
+
- @nifrajs/web@1.0.0-beta.4
|
|
1268
|
+
|
|
1269
|
+
## 1.0.0-beta.3
|
|
1270
|
+
|
|
1271
|
+
### Patch Changes
|
|
1272
|
+
|
|
1273
|
+
- @nifrajs/i18n@1.0.0-beta.3
|
|
1274
|
+
- @nifrajs/image@1.0.0-beta.3
|
|
1275
|
+
- @nifrajs/web@1.0.0-beta.3
|
|
1276
|
+
|
|
1277
|
+
## 0.1.0-beta.2
|
|
1278
|
+
|
|
1279
|
+
### Patch Changes
|
|
1280
|
+
|
|
1281
|
+
- Updated dependencies [5018546]
|
|
1282
|
+
- @nifrajs/web@0.1.0-beta.2
|
|
1283
|
+
- @nifrajs/i18n@0.1.0-beta.2
|
|
1284
|
+
- @nifrajs/image@0.1.0-beta.2
|