@bagelink/blox 1.15.553 → 1.15.554

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.
@@ -57,8 +57,17 @@ export interface BloxSSREntry {
57
57
  }
58
58
  interface PublishedPage {
59
59
  slug?: string;
60
+ data_bindings?: Record<string, {
61
+ adapter?: string;
62
+ collection?: string;
63
+ bind_by?: string;
64
+ }>;
60
65
  }
61
66
  export declare function matchPublishedPage(pages: PublishedPage[], slug: string, allowTemplates?: boolean): PublishedPage | null;
67
+ export declare function resolvePublishedPage(pages: PublishedPage[], slug: string, locale: string, resolver?: CreateBloxSSREntryOptions['collectionResolver']): Promise<{
68
+ page: PublishedPage;
69
+ contexts: Record<string, Record<string, unknown> | null>;
70
+ } | null>;
62
71
  /**
63
72
  * Factory that produces the `{ render }` export for `main.server.ts`.
64
73
  *
@@ -1 +1 @@
1
- {"version":3,"file":"createSSREntry.d.ts","sourceRoot":"","sources":["../../src/ssg/createSSREntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAO9D,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAInF,MAAM,WAAW,yBAAyB;IACzC,oCAAoC;IACpC,aAAa,EAAE,SAAS,CAAA;IACxB;;;;OAIG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9D;;;OAGG;IACH,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpD,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,oGAAoG;IACpG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,uBAAuB,CAAA;IACtC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,CACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,KACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5C,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAC5E;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C,kDAAkD;IAClD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAClE,0EAA0E;IAC1E,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACnD;AAED,UAAU,aAAa;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,aAAa,EAAE,EACtB,IAAI,EAAE,MAAM,EACZ,cAAc,UAAQ,GACpB,aAAa,GAAG,IAAI,CAUtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CA0NnF"}
1
+ {"version":3,"file":"createSSREntry.d.ts","sourceRoot":"","sources":["../../src/ssg/createSSREntry.ts"],"names":[],"mappings":"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"}
@@ -138,6 +138,38 @@ function matchPublishedPage(pages, slug, allowTemplates = false) {
138
138
  }
139
139
  return null;
140
140
  }
141
+ function templateParams(template, slug) {
142
+ const names = [];
143
+ const pattern = template.replace(/:([a-z_]+)/g, (_match, name) => {
144
+ names.push(name);
145
+ return "([^/]+)";
146
+ });
147
+ const match = slug.match(new RegExp(`^${pattern}$`));
148
+ if (!match) return null;
149
+ return Object.fromEntries(names.map((name, index) => [name, match[index + 1]]));
150
+ }
151
+ async function resolvePublishedPage(pages, slug, locale, resolver) {
152
+ var _a;
153
+ const page = matchPublishedPage(pages, slug, true);
154
+ if (!page) return null;
155
+ const params = ((_a = page.slug) == null ? void 0 : _a.includes(":")) ? templateParams(page.slug, slug) : {};
156
+ const contexts = {};
157
+ if (params && resolver) {
158
+ for (const [name, binding] of Object.entries(page.data_bindings ?? {})) {
159
+ if (binding.adapter !== "datastore" || !binding.collection || !binding.bind_by) continue;
160
+ const value = params[binding.bind_by];
161
+ if (!value) continue;
162
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
163
+ const items = await resolver(binding.collection, {
164
+ locale,
165
+ q: `${binding.bind_by} eq "${escaped}"`,
166
+ limit: 1
167
+ });
168
+ contexts[name] = items[0] ?? null;
169
+ }
170
+ }
171
+ return { page, contexts };
172
+ }
141
173
  function createBloxSSREntry(options) {
142
174
  var _a;
143
175
  const {
@@ -199,12 +231,13 @@ function createBloxSSREntry(options) {
199
231
  publishedBundleCache.set(cacheKey, pending);
200
232
  }
201
233
  const bundle = await pending;
202
- const page = matchPublishedPage(
234
+ const resolved = await resolvePublishedPage(
203
235
  bundle.pages,
204
236
  slug,
205
- options.resolvePublishedPaths
237
+ pageLocale,
238
+ options.resolvePublishedPaths ? options.collectionResolver : void 0
206
239
  );
207
- return page ? { page, contexts: {}, warnings: [] } : null;
240
+ return resolved ? { ...resolved, warnings: [] } : null;
208
241
  }
209
242
  const url = `${apiBase}/blox/websites/${websiteId}/resolve-path?path=${encodeURIComponent(slug)}&locale=${pageLocale}`;
210
243
  return llmArtifacts.bloxBuildJson(url, {}, options.buildRequest);
@@ -116,6 +116,38 @@ function matchPublishedPage(pages, slug, allowTemplates = false) {
116
116
  }
117
117
  return null;
118
118
  }
119
+ function templateParams(template, slug) {
120
+ const names = [];
121
+ const pattern = template.replace(/:([a-z_]+)/g, (_match, name) => {
122
+ names.push(name);
123
+ return "([^/]+)";
124
+ });
125
+ const match = slug.match(new RegExp(`^${pattern}$`));
126
+ if (!match) return null;
127
+ return Object.fromEntries(names.map((name, index) => [name, match[index + 1]]));
128
+ }
129
+ async function resolvePublishedPage(pages, slug, locale, resolver) {
130
+ var _a;
131
+ const page = matchPublishedPage(pages, slug, true);
132
+ if (!page) return null;
133
+ const params = ((_a = page.slug) == null ? void 0 : _a.includes(":")) ? templateParams(page.slug, slug) : {};
134
+ const contexts = {};
135
+ if (params && resolver) {
136
+ for (const [name, binding] of Object.entries(page.data_bindings ?? {})) {
137
+ if (binding.adapter !== "datastore" || !binding.collection || !binding.bind_by) continue;
138
+ const value = params[binding.bind_by];
139
+ if (!value) continue;
140
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
141
+ const items = await resolver(binding.collection, {
142
+ locale,
143
+ q: `${binding.bind_by} eq "${escaped}"`,
144
+ limit: 1
145
+ });
146
+ contexts[name] = items[0] ?? null;
147
+ }
148
+ }
149
+ return { page, contexts };
150
+ }
119
151
  function createBloxSSREntry(options) {
120
152
  var _a;
121
153
  const {
@@ -177,12 +209,13 @@ function createBloxSSREntry(options) {
177
209
  publishedBundleCache.set(cacheKey, pending);
178
210
  }
179
211
  const bundle = await pending;
180
- const page = matchPublishedPage(
212
+ const resolved = await resolvePublishedPage(
181
213
  bundle.pages,
182
214
  slug,
183
- options.resolvePublishedPaths
215
+ pageLocale,
216
+ options.resolvePublishedPaths ? options.collectionResolver : void 0
184
217
  );
185
- return page ? { page, contexts: {}, warnings: [] } : null;
218
+ return resolved ? { ...resolved, warnings: [] } : null;
186
219
  }
187
220
  const url = `${apiBase}/blox/websites/${websiteId}/resolve-path?path=${encodeURIComponent(slug)}&locale=${pageLocale}`;
188
221
  return bloxBuildJson(url, {}, options.buildRequest);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/blox",
3
3
  "type": "module",
4
- "version": "1.15.553",
4
+ "version": "1.15.554",
5
5
  "description": "Blox page builder library for drag-and-drop page building and static data management",
6
6
  "author": {
7
7
  "name": "Bagel Studio",