@webtypen/webframez-react 0.0.24 → 0.0.27

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.
@@ -153,6 +153,62 @@ var import_node_fs = __toESM(require("node:fs"), 1);
153
153
  var import_node_module2 = __toESM(require("node:module"), 1);
154
154
  var import_node_path2 = __toESM(require("node:path"), 1);
155
155
 
156
+ // src/head.ts
157
+ var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
158
+ function normalizeAssetsBaseUrl(value) {
159
+ const trimmed = value?.trim();
160
+ if (!trimmed) {
161
+ return void 0;
162
+ }
163
+ if (trimmed === "/") {
164
+ return "/";
165
+ }
166
+ return trimmed.replace(/\/+$/, "");
167
+ }
168
+ function resolveHeadAssetUrl(assetUrl, assetsBaseUrl) {
169
+ const normalizedAssetUrl = assetUrl.trim();
170
+ const normalizedAssetsBaseUrl = normalizeAssetsBaseUrl(assetsBaseUrl);
171
+ if (!normalizedAssetUrl || !normalizedAssetsBaseUrl) {
172
+ return normalizedAssetUrl;
173
+ }
174
+ if (ABSOLUTE_ASSET_URL_PATTERN.test(normalizedAssetUrl)) {
175
+ return normalizedAssetUrl;
176
+ }
177
+ if (normalizedAssetsBaseUrl !== "/" && (normalizedAssetUrl === normalizedAssetsBaseUrl || normalizedAssetUrl.startsWith(`${normalizedAssetsBaseUrl}/`))) {
178
+ return normalizedAssetUrl;
179
+ }
180
+ if (normalizedAssetsBaseUrl === "/") {
181
+ return normalizedAssetUrl.startsWith("/") ? normalizedAssetUrl : `/${normalizedAssetUrl}`;
182
+ }
183
+ if (normalizedAssetUrl.startsWith("/")) {
184
+ return `${normalizedAssetsBaseUrl}${normalizedAssetUrl}`;
185
+ }
186
+ return `${normalizedAssetsBaseUrl}/${normalizedAssetUrl}`;
187
+ }
188
+ function normalizeHeadConfig(head, inheritedAssetsBaseUrl) {
189
+ if (!head) {
190
+ return void 0;
191
+ }
192
+ const effectiveAssetsBaseUrl = normalizeAssetsBaseUrl(head.assetsBaseUrl) ?? normalizeAssetsBaseUrl(inheritedAssetsBaseUrl);
193
+ const normalizedHead = {
194
+ ...head,
195
+ ...effectiveAssetsBaseUrl ? { assetsBaseUrl: effectiveAssetsBaseUrl } : {}
196
+ };
197
+ if (normalizedHead.favicon) {
198
+ normalizedHead.favicon = resolveHeadAssetUrl(
199
+ normalizedHead.favicon,
200
+ effectiveAssetsBaseUrl
201
+ );
202
+ }
203
+ if (normalizedHead.links) {
204
+ normalizedHead.links = normalizedHead.links.map((link) => ({
205
+ ...link,
206
+ href: resolveHeadAssetUrl(link.href, effectiveAssetsBaseUrl)
207
+ }));
208
+ }
209
+ return normalizedHead;
210
+ }
211
+
156
212
  // src/router-runtime.tsx
157
213
  var import_react = __toESM(require("react"), 1);
158
214
  var ROUTE_CHILDREN_TAG = "webframez-route-children";
@@ -368,7 +424,8 @@ function mergeHead(...configs) {
368
424
  meta: [],
369
425
  links: []
370
426
  };
371
- for (const config of configs) {
427
+ for (const candidate of configs) {
428
+ const config = normalizeHeadConfig(candidate, merged.assetsBaseUrl);
372
429
  if (!config) {
373
430
  continue;
374
431
  }
@@ -378,6 +435,9 @@ function mergeHead(...configs) {
378
435
  if (config.description) {
379
436
  merged.description = config.description;
380
437
  }
438
+ if (config.assetsBaseUrl) {
439
+ merged.assetsBaseUrl = config.assetsBaseUrl;
440
+ }
381
441
  if (config.favicon) {
382
442
  merged.favicon = config.favicon;
383
443
  }
@@ -391,22 +451,23 @@ function mergeHead(...configs) {
391
451
  return merged;
392
452
  }
393
453
  function renderHeadToString(head) {
454
+ const normalizedHead = normalizeHeadConfig(head) ?? head;
394
455
  const tags = [];
395
- if (head.description) {
456
+ if (normalizedHead.description) {
396
457
  tags.push(
397
- `<meta ${createManagedAttributes()} name="description" content="${escapeHtml(head.description)}" />`
458
+ `<meta ${createManagedAttributes()} name="description" content="${escapeHtml(normalizedHead.description)}" />`
398
459
  );
399
460
  }
400
- if (head.favicon) {
461
+ if (normalizedHead.favicon) {
401
462
  tags.push(
402
- `<link ${createManagedAttributes()} rel="icon" href="${escapeHtml(head.favicon)}" />`
463
+ `<link ${createManagedAttributes()} rel="icon" href="${escapeHtml(normalizedHead.favicon)}" />`
403
464
  );
404
465
  }
405
- for (const meta of head.meta ?? []) {
466
+ for (const meta of normalizedHead.meta ?? []) {
406
467
  const attrs = Object.entries(meta).filter(([, value]) => Boolean(value)).map(([key, value]) => `${key}="${escapeHtml(String(value))}"`).join(" ");
407
468
  tags.push(`<meta ${createManagedAttributes()} ${attrs} />`);
408
469
  }
409
- for (const link of head.links ?? []) {
470
+ for (const link of normalizedHead.links ?? []) {
410
471
  const attrs = Object.entries(link).filter(([, value]) => Boolean(value)).map(([key, value]) => `${key}="${escapeHtml(String(value))}"`).join(" ");
411
472
  tags.push(`<link ${createManagedAttributes()} ${attrs} />`);
412
473
  }
@@ -735,7 +796,21 @@ globalThis.__webpack_require__ = function __webframezNodeRequire(id) {
735
796
  }
736
797
 
737
798
  if (id.startsWith("./")) {
738
- return require(path.resolve(process.cwd(), id.slice(2)));
799
+ const relativeId = id.slice(2);
800
+ const candidates = [
801
+ path.resolve(process.cwd(), relativeId),
802
+ path.resolve(process.cwd(), "..", relativeId)
803
+ ];
804
+ for (const candidate of candidates) {
805
+ try {
806
+ return require(candidate);
807
+ } catch (error) {
808
+ const missingCandidate = error && error.code === "MODULE_NOT_FOUND" && typeof error.message === "string" && error.message.includes("'" + candidate + "'");
809
+ if (!missingCandidate) {
810
+ throw error;
811
+ }
812
+ }
813
+ }
739
814
  }
740
815
 
741
816
  return require(id);
@@ -1039,22 +1114,64 @@ function normalizeClientManifest(manifest, options) {
1039
1114
  }
1040
1115
  function createServerConsumerManifest(manifest) {
1041
1116
  const consumerManifest = {};
1117
+ const normalizeWorkerModuleId = (requestKey, rawModuleId) => {
1118
+ if (typeof rawModuleId === "string" && rawModuleId.trim() !== "") {
1119
+ return rawModuleId;
1120
+ }
1121
+ if (typeof rawModuleId !== "number" || !Number.isFinite(rawModuleId)) {
1122
+ return null;
1123
+ }
1124
+ if (!requestKey || requestKey.trim() === "") {
1125
+ return String(rawModuleId);
1126
+ }
1127
+ if (requestKey.startsWith("file://")) {
1128
+ try {
1129
+ return (0, import_node_url.fileURLToPath)(requestKey);
1130
+ } catch {
1131
+ return String(rawModuleId);
1132
+ }
1133
+ }
1134
+ if (requestKey.startsWith("/")) {
1135
+ return requestKey;
1136
+ }
1137
+ if (requestKey.startsWith("./")) {
1138
+ return requestKey;
1139
+ }
1140
+ if (requestKey.startsWith("node_modules/") || requestKey.startsWith("build/")) {
1141
+ return `./${requestKey}`;
1142
+ }
1143
+ return requestKey;
1144
+ };
1145
+ const addReference = (lookupKey, reference) => {
1146
+ if (!lookupKey || lookupKey.trim() === "") {
1147
+ return;
1148
+ }
1149
+ if (lookupKey in consumerManifest) {
1150
+ return;
1151
+ }
1152
+ consumerManifest[lookupKey] = {
1153
+ "*": reference
1154
+ };
1155
+ };
1042
1156
  for (const [key, value] of Object.entries(manifest)) {
1043
1157
  if (!value || typeof value !== "object") {
1044
1158
  continue;
1045
1159
  }
1046
1160
  const entry = value;
1047
- if (typeof entry.id !== "string" || entry.id.trim() === "") {
1161
+ const workerModuleId = normalizeWorkerModuleId(key, entry.id);
1162
+ if (!workerModuleId) {
1048
1163
  continue;
1049
1164
  }
1050
- consumerManifest[key] = {
1051
- "*": {
1052
- id: entry.id,
1053
- chunks: [],
1054
- name: entry.name ?? "*",
1055
- ...entry.async ? { async: entry.async } : {}
1056
- }
1165
+ const reference = {
1166
+ id: workerModuleId,
1167
+ chunks: Array.isArray(entry.chunks) ? entry.chunks : [],
1168
+ name: entry.name ?? "*",
1169
+ ...entry.async ? { async: entry.async } : {}
1057
1170
  };
1171
+ addReference(key, reference);
1172
+ if (typeof entry.id === "number" && Number.isFinite(entry.id)) {
1173
+ addReference(String(entry.id), reference);
1174
+ }
1058
1175
  }
1059
1176
  return consumerManifest;
1060
1177
  }
@@ -125,6 +125,62 @@ import fs from "node:fs";
125
125
  import Module from "node:module";
126
126
  import path2 from "node:path";
127
127
 
128
+ // src/head.ts
129
+ var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
130
+ function normalizeAssetsBaseUrl(value) {
131
+ const trimmed = value?.trim();
132
+ if (!trimmed) {
133
+ return void 0;
134
+ }
135
+ if (trimmed === "/") {
136
+ return "/";
137
+ }
138
+ return trimmed.replace(/\/+$/, "");
139
+ }
140
+ function resolveHeadAssetUrl(assetUrl, assetsBaseUrl) {
141
+ const normalizedAssetUrl = assetUrl.trim();
142
+ const normalizedAssetsBaseUrl = normalizeAssetsBaseUrl(assetsBaseUrl);
143
+ if (!normalizedAssetUrl || !normalizedAssetsBaseUrl) {
144
+ return normalizedAssetUrl;
145
+ }
146
+ if (ABSOLUTE_ASSET_URL_PATTERN.test(normalizedAssetUrl)) {
147
+ return normalizedAssetUrl;
148
+ }
149
+ if (normalizedAssetsBaseUrl !== "/" && (normalizedAssetUrl === normalizedAssetsBaseUrl || normalizedAssetUrl.startsWith(`${normalizedAssetsBaseUrl}/`))) {
150
+ return normalizedAssetUrl;
151
+ }
152
+ if (normalizedAssetsBaseUrl === "/") {
153
+ return normalizedAssetUrl.startsWith("/") ? normalizedAssetUrl : `/${normalizedAssetUrl}`;
154
+ }
155
+ if (normalizedAssetUrl.startsWith("/")) {
156
+ return `${normalizedAssetsBaseUrl}${normalizedAssetUrl}`;
157
+ }
158
+ return `${normalizedAssetsBaseUrl}/${normalizedAssetUrl}`;
159
+ }
160
+ function normalizeHeadConfig(head, inheritedAssetsBaseUrl) {
161
+ if (!head) {
162
+ return void 0;
163
+ }
164
+ const effectiveAssetsBaseUrl = normalizeAssetsBaseUrl(head.assetsBaseUrl) ?? normalizeAssetsBaseUrl(inheritedAssetsBaseUrl);
165
+ const normalizedHead = {
166
+ ...head,
167
+ ...effectiveAssetsBaseUrl ? { assetsBaseUrl: effectiveAssetsBaseUrl } : {}
168
+ };
169
+ if (normalizedHead.favicon) {
170
+ normalizedHead.favicon = resolveHeadAssetUrl(
171
+ normalizedHead.favicon,
172
+ effectiveAssetsBaseUrl
173
+ );
174
+ }
175
+ if (normalizedHead.links) {
176
+ normalizedHead.links = normalizedHead.links.map((link) => ({
177
+ ...link,
178
+ href: resolveHeadAssetUrl(link.href, effectiveAssetsBaseUrl)
179
+ }));
180
+ }
181
+ return normalizedHead;
182
+ }
183
+
128
184
  // src/router-runtime.tsx
129
185
  import React from "react";
130
186
  var ROUTE_CHILDREN_TAG = "webframez-route-children";
@@ -340,7 +396,8 @@ function mergeHead(...configs) {
340
396
  meta: [],
341
397
  links: []
342
398
  };
343
- for (const config of configs) {
399
+ for (const candidate of configs) {
400
+ const config = normalizeHeadConfig(candidate, merged.assetsBaseUrl);
344
401
  if (!config) {
345
402
  continue;
346
403
  }
@@ -350,6 +407,9 @@ function mergeHead(...configs) {
350
407
  if (config.description) {
351
408
  merged.description = config.description;
352
409
  }
410
+ if (config.assetsBaseUrl) {
411
+ merged.assetsBaseUrl = config.assetsBaseUrl;
412
+ }
353
413
  if (config.favicon) {
354
414
  merged.favicon = config.favicon;
355
415
  }
@@ -363,22 +423,23 @@ function mergeHead(...configs) {
363
423
  return merged;
364
424
  }
365
425
  function renderHeadToString(head) {
426
+ const normalizedHead = normalizeHeadConfig(head) ?? head;
366
427
  const tags = [];
367
- if (head.description) {
428
+ if (normalizedHead.description) {
368
429
  tags.push(
369
- `<meta ${createManagedAttributes()} name="description" content="${escapeHtml(head.description)}" />`
430
+ `<meta ${createManagedAttributes()} name="description" content="${escapeHtml(normalizedHead.description)}" />`
370
431
  );
371
432
  }
372
- if (head.favicon) {
433
+ if (normalizedHead.favicon) {
373
434
  tags.push(
374
- `<link ${createManagedAttributes()} rel="icon" href="${escapeHtml(head.favicon)}" />`
435
+ `<link ${createManagedAttributes()} rel="icon" href="${escapeHtml(normalizedHead.favicon)}" />`
375
436
  );
376
437
  }
377
- for (const meta of head.meta ?? []) {
438
+ for (const meta of normalizedHead.meta ?? []) {
378
439
  const attrs = Object.entries(meta).filter(([, value]) => Boolean(value)).map(([key, value]) => `${key}="${escapeHtml(String(value))}"`).join(" ");
379
440
  tags.push(`<meta ${createManagedAttributes()} ${attrs} />`);
380
441
  }
381
- for (const link of head.links ?? []) {
442
+ for (const link of normalizedHead.links ?? []) {
382
443
  const attrs = Object.entries(link).filter(([, value]) => Boolean(value)).map(([key, value]) => `${key}="${escapeHtml(String(value))}"`).join(" ");
383
444
  tags.push(`<link ${createManagedAttributes()} ${attrs} />`);
384
445
  }
@@ -707,7 +768,21 @@ globalThis.__webpack_require__ = function __webframezNodeRequire(id) {
707
768
  }
708
769
 
709
770
  if (id.startsWith("./")) {
710
- return require(path.resolve(process.cwd(), id.slice(2)));
771
+ const relativeId = id.slice(2);
772
+ const candidates = [
773
+ path.resolve(process.cwd(), relativeId),
774
+ path.resolve(process.cwd(), "..", relativeId)
775
+ ];
776
+ for (const candidate of candidates) {
777
+ try {
778
+ return require(candidate);
779
+ } catch (error) {
780
+ const missingCandidate = error && error.code === "MODULE_NOT_FOUND" && typeof error.message === "string" && error.message.includes("'" + candidate + "'");
781
+ if (!missingCandidate) {
782
+ throw error;
783
+ }
784
+ }
785
+ }
711
786
  }
712
787
 
713
788
  return require(id);
@@ -1011,22 +1086,64 @@ function normalizeClientManifest(manifest, options) {
1011
1086
  }
1012
1087
  function createServerConsumerManifest(manifest) {
1013
1088
  const consumerManifest = {};
1089
+ const normalizeWorkerModuleId = (requestKey, rawModuleId) => {
1090
+ if (typeof rawModuleId === "string" && rawModuleId.trim() !== "") {
1091
+ return rawModuleId;
1092
+ }
1093
+ if (typeof rawModuleId !== "number" || !Number.isFinite(rawModuleId)) {
1094
+ return null;
1095
+ }
1096
+ if (!requestKey || requestKey.trim() === "") {
1097
+ return String(rawModuleId);
1098
+ }
1099
+ if (requestKey.startsWith("file://")) {
1100
+ try {
1101
+ return fileURLToPath(requestKey);
1102
+ } catch {
1103
+ return String(rawModuleId);
1104
+ }
1105
+ }
1106
+ if (requestKey.startsWith("/")) {
1107
+ return requestKey;
1108
+ }
1109
+ if (requestKey.startsWith("./")) {
1110
+ return requestKey;
1111
+ }
1112
+ if (requestKey.startsWith("node_modules/") || requestKey.startsWith("build/")) {
1113
+ return `./${requestKey}`;
1114
+ }
1115
+ return requestKey;
1116
+ };
1117
+ const addReference = (lookupKey, reference) => {
1118
+ if (!lookupKey || lookupKey.trim() === "") {
1119
+ return;
1120
+ }
1121
+ if (lookupKey in consumerManifest) {
1122
+ return;
1123
+ }
1124
+ consumerManifest[lookupKey] = {
1125
+ "*": reference
1126
+ };
1127
+ };
1014
1128
  for (const [key, value] of Object.entries(manifest)) {
1015
1129
  if (!value || typeof value !== "object") {
1016
1130
  continue;
1017
1131
  }
1018
1132
  const entry = value;
1019
- if (typeof entry.id !== "string" || entry.id.trim() === "") {
1133
+ const workerModuleId = normalizeWorkerModuleId(key, entry.id);
1134
+ if (!workerModuleId) {
1020
1135
  continue;
1021
1136
  }
1022
- consumerManifest[key] = {
1023
- "*": {
1024
- id: entry.id,
1025
- chunks: [],
1026
- name: entry.name ?? "*",
1027
- ...entry.async ? { async: entry.async } : {}
1028
- }
1137
+ const reference = {
1138
+ id: workerModuleId,
1139
+ chunks: Array.isArray(entry.chunks) ? entry.chunks : [],
1140
+ name: entry.name ?? "*",
1141
+ ...entry.async ? { async: entry.async } : {}
1029
1142
  };
1143
+ addReference(key, reference);
1144
+ if (typeof entry.id === "number" && Number.isFinite(entry.id)) {
1145
+ addReference(String(entry.id), reference);
1146
+ }
1030
1147
  }
1031
1148
  return consumerManifest;
1032
1149
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webtypen/webframez-react",
3
- "version": "0.0.24",
3
+ "version": "0.0.27",
4
4
  "description": "TypeScript React RSC addition for @webtypen/webframez-core",
5
5
  "homepage": "https://webtypen.de/",
6
6
  "author": {
@@ -78,9 +78,9 @@
78
78
  },
79
79
  "peerDependencies": {
80
80
  "@webtypen/webframez-core": "^0.3.30",
81
- "react": "0.0.0-experimental-95ffd6cd-20260205",
82
- "react-dom": "0.0.0-experimental-95ffd6cd-20260205",
83
- "react-server-dom-webpack": "0.0.0-experimental-95ffd6cd-20260205"
81
+ "react": "^19.0.0",
82
+ "react-dom": "^19.0.0",
83
+ "react-server-dom-webpack": "^19.0.0"
84
84
  },
85
85
  "peerDependenciesMeta": {
86
86
  "@webtypen/webframez-core": {
@@ -89,8 +89,8 @@
89
89
  },
90
90
  "devDependencies": {
91
91
  "esbuild": "^0.20.2",
92
- "react": "0.0.0-experimental-95ffd6cd-20260205",
93
- "react-dom": "0.0.0-experimental-95ffd6cd-20260205",
94
- "react-server-dom-webpack": "0.0.0-experimental-95ffd6cd-20260205"
92
+ "react": "19.1.1",
93
+ "react-dom": "19.1.1",
94
+ "react-server-dom-webpack": "19.1.1"
95
95
  }
96
96
  }