@cocreate/server-side-render 1.12.3 → 1.12.4

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 CHANGED
@@ -1,3 +1,12 @@
1
+ ## [1.12.4](https://github.com/CoCreate-app/CoCreate-server-side-render/compare/v1.12.3...v1.12.4) (2025-09-01)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * optimize language link tag insertion in HTML rendering ([ac0580c](https://github.com/CoCreate-app/CoCreate-server-side-render/commit/ac0580cd90da8a555fb1fb47412c1484ccc20a93))
7
+ * refactor HTML method to accept file object and enhance language link generation ([b0d7a97](https://github.com/CoCreate-app/CoCreate-server-side-render/commit/b0d7a97de5f3e3c46dc3bd42c62e79e3843ebb22))
8
+ * streamline render attribute checks in CoCreateServerSideRender ([4407afb](https://github.com/CoCreate-app/CoCreate-server-side-render/commit/4407afbcc218e7fa9af488e5a2bc5b2abf74d7bc))
9
+
1
10
  ## [1.12.3](https://github.com/CoCreate-app/CoCreate-server-side-render/compare/v1.12.2...v1.12.3) (2025-05-01)
2
11
 
3
12
 
package/package.json CHANGED
@@ -1,18 +1,10 @@
1
1
  {
2
2
  "name": "@cocreate/server-side-render",
3
- "version": "1.12.3",
3
+ "version": "1.12.4",
4
4
  "description": "A simple server-side-render component in vanilla javascript. Easily configured using HTML5 data-attributes and/or JavaScript API.",
5
5
  "keywords": [
6
6
  "server-side-render",
7
- "cocreate",
8
- "low-code-framework",
9
- "no-code-framework",
10
- "cocreatejs",
11
- "cocreatejs-component",
12
- "cocreate-framework",
13
- "no-code",
14
7
  "low-code",
15
- "collaborative-framework",
16
8
  "realtime",
17
9
  "realtime-framework",
18
10
  "collaboration",
package/src/index.js CHANGED
@@ -6,7 +6,7 @@ class CoCreateServerSideRender {
6
6
  this.crud = crud;
7
7
  }
8
8
 
9
- async HTML(html, organization_id, url) {
9
+ async HTML(file) {
10
10
  const self = this;
11
11
  let ignoreElement = {
12
12
  INPUT: true,
@@ -20,9 +20,7 @@ class CoCreateServerSideRender {
20
20
  let dep = [];
21
21
  let dbCache = new Map();
22
22
 
23
- async function render(html, lastKey) {
24
- const dom = parse(html);
25
-
23
+ async function render(dom, lastKey) {
26
24
  // Handle elements with [array][key][object]
27
25
  for (let el of dom.querySelectorAll("[array][key][object]")) {
28
26
  let meta = el.attributes;
@@ -32,14 +30,7 @@ class CoCreateServerSideRender {
32
30
  if (el.closest(".template, [template], template, [render]"))
33
31
  continue;
34
32
 
35
- if (
36
- el.hasAttribute("render-selector") ||
37
- el.hasAttribute("render-closest") ||
38
- el.hasAttribute("render-parent") ||
39
- el.hasAttribute("render-next") ||
40
- el.hasAttribute("render-previous")
41
- )
42
- continue;
33
+ if (el.hasAttribute("render-query")) continue;
43
34
 
44
35
  if (el.hasAttribute("component") || el.hasAttribute("plugin"))
45
36
  continue;
@@ -149,10 +140,91 @@ class CoCreateServerSideRender {
149
140
  return dom;
150
141
  }
151
142
 
152
- let result = await render(html, "root");
143
+ let dom = parse(file.src);
144
+ dom = await render(dom, "root");
145
+ if (file.langRegion || file.lang) {
146
+ dom = translate(dom, file);
147
+ let langLinkTags = createLanguageLinkTags(file);
148
+ const head = dom.querySelector("head");
149
+ if (head && langLinkTags) {
150
+ const linksFragment = parse(
151
+ `<fragment>${langLinkTags}</fragment>`
152
+ );
153
+ for (const link of linksFragment.childNodes) {
154
+ head.appendChild(link);
155
+ }
156
+ }
157
+ }
153
158
  dep = [];
154
159
  dbCache.clear();
155
- return result.toString();
160
+ return dom.toString();
161
+ }
162
+
163
+ createLanguageLinkTags(file) {
164
+ let xDefault = file.path;
165
+
166
+ if (file.name !== "index.html") {
167
+ if (xDefault.endsWith("/")) {
168
+ xDefault += file.name;
169
+ } else {
170
+ xDefault += "/" + file.name;
171
+ }
172
+ }
173
+ let generatedLinksString = `<link rel="alternate" hreflang="x-default" href="${xDefault}">\n`;
174
+
175
+ // Step 1: Create a lookup object that maps base language to its path.
176
+ // This is done once for efficiency.
177
+ const paths = {};
178
+ for (const p of file.pathname) {
179
+ const secondSlashIndex = p.indexOf("/", 1);
180
+ const langKey = p.substring(1, secondSlashIndex); // e.g., 'en', 'es', 'pt'
181
+ const restOfPath = p.substring(secondSlashIndex);
182
+ paths[langKey] = restOfPath;
183
+ }
184
+
185
+ // Step 2: Iterate through all supported languages and build the HTML string.
186
+ for (const language of file.languages) {
187
+ // Use the base language to find the correct path in our map
188
+ const path = paths[language] || paths[language.split("-")[0]];
189
+
190
+ // If a valid path exists, construct the full link
191
+ if (path) {
192
+ // Construct the full href URL using the full language code from the array
193
+ const hrefUrl = `https://${file.urlObject.hostname}/${language}${path}`;
194
+
195
+ // Append the HTML string. The hreflang and the URL path are now in sync.
196
+ generatedLinksString += `<link rel="alternate" hreflang="${language}" href="${hrefUrl}">\n`;
197
+ }
198
+ }
199
+ return generatedLinksString;
200
+ }
201
+
202
+ async translate(dom, file) {
203
+ let langRegion = file.langRegion;
204
+ let lang = file.lang;
205
+ if (file.translations & (langRegion || lang)) {
206
+ for (let translation of file.translations) {
207
+ let el = dom.querySelectorAll(translation.selector);
208
+ if (translation.innerHTML) {
209
+ let content =
210
+ translation.innerHTML[langRegion] ||
211
+ translation.innerHTML[lang];
212
+ if (content) {
213
+ el.innerHTML = content;
214
+ }
215
+ }
216
+ if (translation.attributes) {
217
+ for (let [key, language] of Object.entries(
218
+ translation.attributes
219
+ )) {
220
+ let value = language[langRegion] || language[lang];
221
+ if (value) {
222
+ el.setAttribute(key, value);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
156
228
  }
157
229
  }
158
230