@uniweb/build 0.24.1 → 0.24.2

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/build",
3
- "version": "0.24.1",
3
+ "version": "0.24.2",
4
4
  "description": "Build tooling for the Uniweb Component Web Platform",
5
5
  "type": "module",
6
6
  "exports": {
@@ -59,15 +59,15 @@
59
59
  "js-yaml": "^4.1.0",
60
60
  "sharp": "^0.35.3",
61
61
  "yaml": "^2.5.0",
62
- "@uniweb/theming": "^0.1.15",
63
62
  "@uniweb/projections": "^0.3.3",
64
63
  "@uniweb/semantic-parser": "^1.2.3",
65
64
  "@uniweb/schemas": "^0.2.10",
65
+ "@uniweb/theming": "^0.1.15",
66
66
  "@uniweb/content-writer": "^0.3.3"
67
67
  },
68
68
  "optionalDependencies": {
69
69
  "@uniweb/content-reader": "^1.2.3",
70
- "@uniweb/runtime": "^0.12.1",
70
+ "@uniweb/runtime": "^0.12.2",
71
71
  "@uniweb/semantic-parser": "^1.2.3",
72
72
  "@uniweb/schemas": "^0.2.10"
73
73
  },
@@ -493,10 +493,16 @@ export async function buildCollectionEntities(siteRoot, opts = {}) {
493
493
  // soft skip — the collection is delivery-only, not a sync target. Only an
494
494
  // EXPLICIT schema/model the author asked for is a hard error.
495
495
  if (!decl.schemaExplicit) {
496
- warnings.push(
497
- `${name}: no data schema "${modelName}" (subfolder-name default)not synced`
498
- )
499
- schemaless.push({ name })
496
+ // ⛔ Deliberately NOT a `warnings` string. This is a product decision the
497
+ // author is making entities or static files and it needs to be
498
+ // reported at a prominence a prose warning cannot carry. Callers get the
499
+ // structured entry and say it themselves (`cli/src/commands/{publish,push}.js`).
500
+ //
501
+ // It used to push `"… — not synced"`, printed dim among everything else.
502
+ // That was misleading in the expensive direction: the data IS delivered,
503
+ // as static files. An author read "not synced" as "my data did not
504
+ // upload" — or skimmed it — and either way could not act on it.
505
+ schemaless.push({ name, model: modelName })
500
506
  continue
501
507
  }
502
508
  throw new Error(
@@ -121,9 +121,33 @@ function walkEntityAssets(node, visitor) {
121
121
  // - **the id is what survives.** A URL is a host's route layout frozen into
122
122
  // content that outlives it; an id is re-resolved on every render, so a host
123
123
  // that moves its assets costs a config edit rather than a migration.
124
- // - **the URL is what RENDERS today.** No deployment emits `config.assets.url`
125
- // yet, so a resolver handed an id alone would resolve nothing. With the URL
126
- // still there it falls through and renders exactly as before.
124
+ // - **the URL is what RENDERS today.** With the URL still there, a resolver
125
+ // that cannot resolve the id falls through and renders exactly as before.
126
+ //
127
+ // ⚠️ **This bullet used to justify itself with "no deployment emits
128
+ // `config.assets.url` yet". FALSIFIED 2026-08-18** by the backend lane:
129
+ // `serve` publishes the pattern **unconditionally**, falling back to the
130
+ // direct form, so a deployment with no asset storage emits the honest
131
+ // `/gateway/asset/dist/{id}/base.{ext}` rather than nothing (measured by
132
+ // them on a running daemon, not read off a type). ⛔ Scoped to deployments
133
+ // running code from 2026-08-17 or later; an older one emits nothing, and
134
+ // absent stays absent. A present-tense negative about someone else's
135
+ // deployments is the claim nothing in this repo can ever contradict — it
136
+ // was true when written, and nothing here changed when it stopped being.
137
+ //
138
+ // ⛔ **That does NOT license dropping the URL, and the reason is not
139
+ // coverage.** An earlier version of this note named coverage as the
140
+ // governor; it was only ever a gate. Dropping the `src` companion was
141
+ // **withdrawn as a goal** on 2026-08-17 on CONSUMER grounds: the editor
142
+ // canvas renders `attrs.url || attrs.src` and reads `assetId` nowhere, so
143
+ // an id-only node shows an `<img>` with no source *(measured by the
144
+ // frontend lane — their surface, their finding)*. Durability comes from
145
+ // every consumer PREFERRING the id, which each can do on its own schedule;
146
+ // dropping `src` only forces that at the cost of a migration window across
147
+ // two consumer chains where images blank.
148
+ //
149
+ // ⇒ **Keep writing both.** See `kb/framework/content/asset-url-resolution.md`
150
+ // item 13 — and re-read it there rather than re-deriving the answer here.
127
151
  //
128
152
  // ⇒ Writing both means content authored now stays correct whichever order the
129
153
  // halves arrive in — the same reason the app writes both. The URL is dropped
@@ -213,7 +237,7 @@ function rewriteEntityAssets(node, map, ids) {
213
237
  * siteContent: { buffer, entityCount, index, models }|null,
214
238
  * collections: { buffer, entityCount, index, models }|null,
215
239
  * hashes: Object<string,string>, warnings: string[], skipped: number,
216
- * schemaless: Array<{name: string}>, localAssets: string[] }>}
240
+ * schemaless: Array<{name: string, model: string}>, localAssets: string[] }>}
217
241
  * `schemaless` lists collections that resolved no data schema (soft-skipped from
218
242
  * the sync) — the composite deploy delivers these statically via the data ball.
219
243
  * `localAssets` lists the site-root local media refs (`/images/x.png`) the deploy