uniweb 0.48.4 → 0.48.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uniweb",
3
- "version": "0.48.4",
3
+ "version": "0.48.5",
4
4
  "description": "Create structured Vite + React sites with content/code separation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,15 +41,15 @@
41
41
  "js-yaml": "^4.1.0",
42
42
  "prompts": "^2.4.2",
43
43
  "tar": "^7.0.0",
44
- "@uniweb/core": "^0.24.3",
45
- "@uniweb/kit": "^0.18.1",
46
- "@uniweb/runtime": "^0.19.4",
44
+ "@uniweb/runtime": "^0.19.5",
45
+ "@uniweb/core": "^0.24.4",
46
+ "@uniweb/kit": "^0.18.2",
47
47
  "@uniweb/semantic-parser": "^1.4.0"
48
48
  },
49
49
  "peerDependencies": {
50
- "@uniweb/content-reader": "^1.2.4",
51
50
  "@uniweb/semantic-parser": "^1.4.0",
52
- "@uniweb/build": "^0.44.3"
51
+ "@uniweb/content-reader": "^1.2.4",
52
+ "@uniweb/build": "^0.44.4"
53
53
  },
54
54
  "peerDependenciesMeta": {
55
55
  "@uniweb/build": {
@@ -86,7 +86,7 @@ Documentation paths in this guide are given bare — `development/creating-compo
86
86
  | Theming and styling | `authoring/theming.md` |
87
87
  | Authoring collections | `authoring/collections.md` |
88
88
  | Where-object predicate format | `authoring/predicates.md` |
89
- | Connecting a backend / custom transports | `development/connecting-a-backend.md` |
89
+ | Data sources / custom transports | `development/data-sources.md` |
90
90
  | Building components | `development/creating-components.md` |
91
91
  | Schemas in practice | `development/schemas-in-practice.md` |
92
92
  | Workspace layouts and their wiring | `development/project-structures.md` |
@@ -1843,7 +1843,7 @@ fetcher:
1843
1843
 
1844
1844
  **Failures are visible, not empty:** a fetch that failed leaves its key ABSENT from `content.data` and names the message on `block.dataError[key]`; it is never delivered as `[]`, which means "no records". The page still renders — a section reads `dataError` to tell the two apart.
1845
1845
 
1846
- When a plain `url:` is enough and when a transport is the answer: `development/connecting-a-backend.md`.
1846
+ When a plain `url:` is enough and when a transport is the answer: `development/data-sources.md`.
1847
1847
 
1848
1848
  Full model: `reference/data-fetching.md`. Where-object format with examples: `authoring/predicates.md`.
1849
1849
 
@@ -1895,16 +1895,18 @@ section type, same arrangement as `fetcher:` and `search:`.
1895
1895
 
1896
1896
  A form gets its destination from the first of these that applies:
1897
1897
 
1898
- 1. **`submit:` in `site.yml`** an endpoint you name yourself.
1899
- 2. **One the host supplies** `services.submit` in the served payload. A site
1900
- published to Uniweb Cloud gets submission handling from the platform, so it
1901
- normally needs **no `submit:` at all**.
1898
+ 1. **One the host supplies** — `services.submit` in the served payload. Where the
1899
+ host handles submissions, that is the destination and nothing in `site.yml`
1900
+ overrides it so a site published to Uniweb Cloud normally needs **no
1901
+ `submit:` at all**.
1902
+ 2. **`submit:` in `site.yml`** — an endpoint you name yourself, for a host that
1903
+ does not handle submissions, or a static site.
1902
1904
  3. **Neither** — there is no destination, and the form says so instead of
1903
1905
  guessing at one.
1904
1906
 
1905
1907
  That is the general arrangement, not a forms-only one. A host declares
1906
1908
  everything it offers under `services`, keyed by name, and every service resolves
1907
- by the same rule — your declaration, then the host's, then neither.
1909
+ by the same rule — the host's offer, then your declaration, then neither.
1908
1910
 
1909
1911
  ⭐ **Before you render UI for a service, ask whether the site has it** — one predicate per service,
1910
1912
  no arguments: `isSearchEnabled()`, `isSubmitEnabled()`, `isApiEnabled()`, `isAssistantEnabled()`,
@@ -2097,7 +2099,7 @@ tracking:
2097
2099
  ```
2098
2100
 
2099
2101
  A host may also supply one under `services.tracking`, and the usual precedence
2100
- applies: yours wins, then the host's, then neither.
2102
+ applies: the host's, then yours, then neither.
2101
2103
 
2102
2104
  ⚠️ **The endpoint has to accept the framework's own format** — a batched
2103
2105
  `{ "events": [ … ] }` POST, documented in `reference/site-configuration.md`. It
@@ -2166,17 +2168,18 @@ tracking:
2166
2168
  ⭐ **`emit` needs no endpoint of its own.** Where a host provides one, the site
2167
2169
  declares only what it wants sent and the address comes from the host. The two
2168
2170
  are read key by key, so naming `emit` alone overrides nothing else the host
2169
- declared. And declaring your own `endpoint:` always wins, so a site pointing at
2170
- its own collector keeps working on any host, including none.
2171
+ declared. An `endpoint:` of your own is used wherever the host supplies no
2172
+ collector on a host without one, and on none — and where the host supplies
2173
+ one, the host's is used.
2171
2174
 
2172
- `minimal` is `page_view` alone. `standard` is the default when you supply your
2173
- own `endpoint:`. `all` is a standing yes, so an event added in a later framework
2175
+ `minimal` is `page_view` alone. `standard` is the default when the collector is
2176
+ your own. `all` is a standing yes, so an event added in a later framework
2174
2177
  release is included without you changing anything — which is exactly why
2175
2178
  `standard` exists as well: it is a curated set that a release cannot grow behind
2176
2179
  your back.
2177
2180
 
2178
2181
  ⭐ **Saying nothing means two different things, and which one depends on who
2179
- supplies the address.** A site with its own `endpoint:` gets `standard`. A site
2182
+ supplies the address.** A site sending to its own `endpoint:` gets `standard`. A site
2180
2183
  on a **host-supplied** collector gets **whatever that host declares it
2181
2184
  collects** — it has no address of its own, so the arrangement is that the host
2182
2185
  does analytics for it, and the set grows when the host starts collecting
@@ -2324,10 +2327,10 @@ For cases the factory doesn't cover, write handlers directly using `Loom`, `inst
2324
2327
  ## Part 4b — When the site is also an app
2325
2328
 
2326
2329
  Everything above is a site: content the author writes, built into pages. Some sites
2327
- also have **their own backend** — accounts, per-visitor data, records their members
2328
- create and edit. That is `@uniweb/api`.
2330
+ also have **an `api` service** — accounts, per-visitor data, records their members
2331
+ create and edit. `@uniweb/api` is its client.
2329
2332
 
2330
- ⛔ **Only reach for this when the site actually has one.** A site with no backend is
2333
+ ⛔ **Only reach for this when the site actually has one.** A site without one is
2331
2334
  the normal case, and a foundation that assumes one breaks on every other site it is
2332
2335
  used with.
2333
2336
 
@@ -2344,7 +2347,7 @@ import { useSession, SignedIn, SignedOut } from '@uniweb/api'
2344
2347
  if (!isApiEnabled()) return <StaticVersion /> // synchronous — nothing to await
2345
2348
  ```
2346
2349
 
2347
- ⛔ **When there is no backend, draw nothing** — not a disabled control, and not an
2350
+ ⛔ **When the site has no `api` service, draw nothing** — not a disabled control, and not an
2348
2351
  explanation. Same rule as `services` in Part 4: which capabilities a site's operator
2349
2352
  set up is none of a visitor's business, and "sign-in unavailable" reads as breakage
2350
2353
  when it is simply a feature this site does not have. Render the version of your
@@ -2357,8 +2360,8 @@ const { status, records } = useRecords({ schema: '@/session' })
2357
2360
  ```
2358
2361
 
2359
2362
  ⭐ **`absent` and an empty `ready` are different answers, and confusing them is the
2360
- mistake to avoid.** `absent` = there is no live source (no backend, or nobody signed
2361
- in) → render the site's authored content. `ready` with `records: []` = the backend
2363
+ mistake to avoid.** `absent` = there is no live source (no `api` service, or nobody signed
2364
+ in) → render the site's authored content. `ready` with `records: []` = the service
2362
2365
  answered and there is nothing there → render your empty state. Showing "nothing yet"
2363
2366
  for the first tells a visitor their content is gone when it was never requested.
2364
2367
 
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-09-10T14:59:00.380Z",
3
+ "generatedAt": "2026-09-10T16:24:13.926Z",
4
4
  "packages": {
5
5
  "@uniweb/api": {
6
- "version": "0.3.0",
6
+ "version": "0.3.1",
7
7
  "path": "framework/api",
8
8
  "deps": [
9
9
  "@uniweb/core"
10
10
  ]
11
11
  },
12
12
  "@uniweb/build": {
13
- "version": "0.44.3",
13
+ "version": "0.44.4",
14
14
  "path": "framework/build",
15
15
  "deps": [
16
16
  "@uniweb/content-reader",
@@ -34,7 +34,7 @@
34
34
  "deps": []
35
35
  },
36
36
  "@uniweb/core": {
37
- "version": "0.24.3",
37
+ "version": "0.24.4",
38
38
  "path": "framework/core",
39
39
  "deps": [
40
40
  "@uniweb/semantic-parser",
@@ -54,7 +54,7 @@
54
54
  ]
55
55
  },
56
56
  "@uniweb/kit": {
57
- "version": "0.18.1",
57
+ "version": "0.18.2",
58
58
  "path": "framework/kit",
59
59
  "deps": [
60
60
  "@uniweb/core",
@@ -82,7 +82,7 @@
82
82
  ]
83
83
  },
84
84
  "@uniweb/runtime": {
85
- "version": "0.19.4",
85
+ "version": "0.19.5",
86
86
  "path": "framework/runtime",
87
87
  "deps": [
88
88
  "@uniweb/core",
@@ -110,7 +110,7 @@
110
110
  "deps": []
111
111
  },
112
112
  "@uniweb/templates": {
113
- "version": "0.12.3",
113
+ "version": "0.12.4",
114
114
  "path": "framework/templates",
115
115
  "deps": []
116
116
  },