@betterportal/theme-embedded 0.0.1

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/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # BetterPortal Embedded Theme for Node.js
2
+
3
+ Minimal BetterPortal v10 embed theme.
4
+
5
+ This package renders a thin wrapper for embedded use cases while still using HTMX as the required UI composition layer.
@@ -0,0 +1,23 @@
1
+ {
2
+ "nodejs": [
3
+ {
4
+ "id": "service-betterportal-theme-embedded",
5
+ "name": "service-betterportal-theme-embedded",
6
+ "basePath": "./",
7
+ "description": "Embedded BetterPortal theme",
8
+ "tags": [
9
+ "betterportal",
10
+ "theme",
11
+ "embedded",
12
+ "htmx"
13
+ ],
14
+ "documentation": [
15
+ "./README.md"
16
+ ],
17
+ "pluginPath": "src/plugins/service-betterportal-theme-embedded/",
18
+ "links": {
19
+ "github": "git+https://github.com/BetterCorp/BetterPortal.git"
20
+ }
21
+ }
22
+ ]
23
+ }
package/bsb-tests.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "nodejs": [
3
+ {
4
+ "id": "service-betterportal-theme-embedded",
5
+ "skip": true,
6
+ "default": {
7
+ "config": {},
8
+ "setup": null,
9
+ "dispose": null
10
+ },
11
+ "tests": []
12
+ }
13
+ ]
14
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./plugins/service-betterportal-theme-embedded/theme/index.js";
2
+ export * from "./plugins/service-betterportal-theme-embedded/index.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8DAA8D,CAAC;AAC7E,cAAc,wDAAwD,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./plugins/service-betterportal-theme-embedded/theme/index.js";
2
+ export * from "./plugins/service-betterportal-theme-embedded/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8DAA8D,CAAC;AAC7E,cAAc,wDAAwD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ThemeAssetResponse {
2
+ body: string;
3
+ contentType: string;
4
+ }
5
+ export declare function loadEmbeddedAsset(assetPath: string): Promise<ThemeAssetResponse | null>;
6
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-embedded/assets.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAuYD,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiB7F"}
@@ -0,0 +1,430 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import { js } from "jsx-htmx";
4
+ const require = createRequire(import.meta.url);
5
+ const HtmxPath = require.resolve("htmx.org/dist/htmx.min.js");
6
+ const AssetCache = new Map();
7
+ function readTextAsset(filePath, contentType) {
8
+ return readFile(filePath, "utf8").then((body) => ({ body, contentType }));
9
+ }
10
+ function embeddedRuntimeSource() {
11
+ return String(js(() => {
12
+ (() => {
13
+ const htmx = window.htmx;
14
+ if (!htmx)
15
+ return;
16
+ const HX_METHODS = ["hx-get", "hx-post", "hx-put", "hx-delete", "hx-patch"];
17
+ const DOWNLOAD_ATTR = "hx-download";
18
+ const closestEmbed = (element) => element?.closest?.("[data-bp-embedded-root]") ?? null;
19
+ const parseServices = (root) => {
20
+ if (!root)
21
+ return {};
22
+ try {
23
+ return JSON.parse(root.getAttribute("data-bp-services") || "{}");
24
+ }
25
+ catch {
26
+ return {};
27
+ }
28
+ };
29
+ const parseBackgroundServices = (root) => {
30
+ if (!root)
31
+ return [];
32
+ try {
33
+ const entries = JSON.parse(root.getAttribute("data-bp-background-services") || "[]");
34
+ return Array.isArray(entries) ? entries.filter((entry) => entry?.serviceId && entry?.origin) : [];
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ };
40
+ const serviceContextFor = (element) => {
41
+ const owner = element?.closest?.("[data-bp-service]") ?? element;
42
+ const root = closestEmbed(owner);
43
+ const serviceId = owner?.getAttribute?.("data-bp-service")
44
+ || root?.getAttribute("data-bp-initial-service")
45
+ || "";
46
+ const origin = serviceId ? parseServices(root)[serviceId] || "" : "";
47
+ return { serviceId, origin };
48
+ };
49
+ const isRelativeServicePath = (value) => !!value && value.startsWith("/") && !value.startsWith("//");
50
+ const resolveRelativeUrls = (root) => {
51
+ const targets = [root, ...Array.from(root.querySelectorAll("a[href],form[action],[src],[href],sse-connect,hx-sse\\:connect,[hx-download],[hx-get],[hx-post],[hx-put],[hx-delete],[hx-patch]"))];
52
+ for (const target of targets) {
53
+ if (!(target instanceof Element))
54
+ continue;
55
+ const { origin } = serviceContextFor(target);
56
+ if (target.hasAttribute(DOWNLOAD_ATTR)) {
57
+ const rawDownload = (target.getAttribute(DOWNLOAD_ATTR) || "").trim();
58
+ const rawHref = target.tagName === "A" ? (target.getAttribute("href") || "") : "";
59
+ const raw = rawDownload || rawHref;
60
+ if (isRelativeServicePath(raw))
61
+ target.setAttribute(DOWNLOAD_ATTR, origin + raw);
62
+ bindDownload(target);
63
+ continue;
64
+ }
65
+ if (!origin)
66
+ continue;
67
+ if (target.tagName === "A") {
68
+ const href = target.getAttribute("href");
69
+ if (isRelativeServicePath(href)) {
70
+ target.setAttribute("hx-get", origin + href);
71
+ target.setAttribute("hx-target", "closest [data-bp-main-outlet]");
72
+ target.setAttribute("hx-swap", "innerHTML");
73
+ target.setAttribute("hx-push-url", "false");
74
+ }
75
+ }
76
+ for (const attr of HX_METHODS) {
77
+ const value = target.getAttribute(attr);
78
+ if (isRelativeServicePath(value))
79
+ target.setAttribute(attr, origin + value);
80
+ }
81
+ const action = target.getAttribute("action");
82
+ if (target.tagName === "FORM" && isRelativeServicePath(action)) {
83
+ target.setAttribute("hx-post", origin + action);
84
+ target.setAttribute("hx-target", "closest [data-bp-main-outlet]");
85
+ target.setAttribute("hx-swap", "innerHTML");
86
+ }
87
+ for (const attr of ["src", "href", "sse-connect", "hx-sse:connect"]) {
88
+ const value = target.getAttribute(attr);
89
+ if (isRelativeServicePath(value))
90
+ target.setAttribute(attr, origin + value);
91
+ }
92
+ }
93
+ };
94
+ const loadBackgroundFragments = async (root) => {
95
+ const outlet = root.querySelector("[data-bp-background-fragments]");
96
+ if (!(outlet instanceof HTMLElement) || outlet.dataset.bpLoaded === "1")
97
+ return;
98
+ outlet.dataset.bpLoaded = "1";
99
+ const escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
100
+ const nodes = [];
101
+ await Promise.all(parseBackgroundServices(root).map(async (service) => {
102
+ try {
103
+ const base = service.origin.replace(/\/+$/, "");
104
+ const response = await fetch(base + "/.well-known/bp/schema.json", { headers: { Accept: "application/json" }, cache: "default", mode: "cors" });
105
+ if (!response.ok)
106
+ return;
107
+ const schema = await response.json();
108
+ for (const route of schema.routes || []) {
109
+ for (const fragment of route.fragments || []) {
110
+ if (fragment.fragmentLocation !== "background" || !fragment.fragmentId)
111
+ continue;
112
+ const key = "background." + fragment.fragmentId;
113
+ const url = base + route.path + (route.path.includes("?") ? "&" : "?") + "_f=" + encodeURIComponent(key);
114
+ nodes.push('<div data-bp-fragment="' + escapeAttr(fragment.fragmentId) + '" data-bp-fragment-location="background" data-bp-service="' + escapeAttr(service.serviceId) + '" hx-get="' + escapeAttr(url) + '" hx-trigger="load" hx-target="this" hx-swap="innerHTML"></div>');
115
+ }
116
+ }
117
+ }
118
+ catch { /* service unavailable; skip background fragments */ }
119
+ }));
120
+ outlet.innerHTML = nodes.join("");
121
+ htmx.process(outlet);
122
+ };
123
+ const readBpHeaders = () => {
124
+ try {
125
+ return JSON.parse(window.localStorage.getItem("bp.headers") || "{}");
126
+ }
127
+ catch {
128
+ return {};
129
+ }
130
+ };
131
+ const writeBpHeaders = (headers) => {
132
+ window.localStorage.setItem("bp.headers", JSON.stringify(headers));
133
+ };
134
+ const serviceIdForUrl = (url) => {
135
+ try {
136
+ const actionOrigin = new URL(url, window.location.origin).origin;
137
+ for (const root of Array.from(document.querySelectorAll("[data-bp-embedded-root]"))) {
138
+ for (const [serviceId, origin] of Object.entries(parseServices(root))) {
139
+ if (new URL(String(origin)).origin === actionOrigin)
140
+ return serviceId;
141
+ }
142
+ }
143
+ }
144
+ catch { /* fall back to legacy auth header */ }
145
+ return "";
146
+ };
147
+ const attachBpHeaders = (headers, action) => {
148
+ try {
149
+ const actionOrigin = new URL(action, window.location.origin).origin;
150
+ const targetServiceId = serviceIdForUrl(action);
151
+ const now = Math.floor(Date.now() / 1000);
152
+ for (const [name, entry] of Object.entries(readBpHeaders())) {
153
+ if (!entry || typeof entry.value !== "string")
154
+ continue;
155
+ if (typeof entry.expires === "number" && entry.expires <= now)
156
+ continue;
157
+ if (typeof entry.scope === "string" && entry.scope && entry.scope !== targetServiceId)
158
+ continue;
159
+ if (headers[name] === undefined)
160
+ headers[name] = entry.value;
161
+ }
162
+ const auth = window.localStorage.getItem("bp:Authorization");
163
+ if (auth && actionOrigin !== window.location.origin)
164
+ headers.Authorization = auth;
165
+ }
166
+ catch {
167
+ return;
168
+ }
169
+ };
170
+ const applyBpHeaderDirectives = (response, requestUrl) => {
171
+ if (!response)
172
+ return;
173
+ const setRaw = response.headers.get("BP-SetHeader");
174
+ const removeRaw = response.headers.get("BP-RemoveHeader");
175
+ if (!setRaw && !removeRaw)
176
+ return;
177
+ const responderOrigin = (() => {
178
+ try {
179
+ return new URL(requestUrl, window.location.origin).origin;
180
+ }
181
+ catch {
182
+ return "";
183
+ }
184
+ })();
185
+ const responderId = serviceIdForUrl(requestUrl);
186
+ const responder = responderId || responderOrigin;
187
+ const ownerMatches = (owner) => typeof owner === "string" && ((!!responderId && owner === responderId) || (!!responderOrigin && owner === responderOrigin));
188
+ const stored = readBpHeaders();
189
+ let changed = false;
190
+ if (setRaw) {
191
+ for (const directive of setRaw.split(/,(?=\s*[^;,=]+=)/)) {
192
+ const [pair, ...attrParts] = directive.split(";");
193
+ const eq = (pair || "").indexOf("=");
194
+ if (eq <= 0)
195
+ continue;
196
+ const name = pair.slice(0, eq).trim();
197
+ const value = pair.slice(eq + 1).trim();
198
+ if (!name)
199
+ continue;
200
+ const existing = stored[name];
201
+ if (existing && existing.locked === true && !ownerMatches(existing.owner))
202
+ continue;
203
+ const attrs = {};
204
+ for (const part of attrParts) {
205
+ const aEq = part.indexOf("=");
206
+ if (aEq <= 0)
207
+ continue;
208
+ attrs[part.slice(0, aEq).trim().toLowerCase()] = part.slice(aEq + 1).trim();
209
+ }
210
+ const rawScope = (attrs["scope"] || "").toLowerCase();
211
+ const scope = rawScope === "true" ? responder
212
+ : rawScope === "false" ? null
213
+ : attrs["scope"] || null;
214
+ stored[name] = {
215
+ value,
216
+ owner: responder,
217
+ locked: attrs["locked"] === "true",
218
+ expires: attrs["expires"] ? Number(attrs["expires"]) || null : null,
219
+ scope,
220
+ refresh: attrs["refresh"] || null,
221
+ refreshBefore: attrs["refreshbefore"] ? Number(attrs["refreshbefore"]) || null : null
222
+ };
223
+ changed = true;
224
+ }
225
+ }
226
+ if (removeRaw) {
227
+ for (const rawName of removeRaw.split(",")) {
228
+ const name = rawName.trim();
229
+ const existing = stored[name];
230
+ if (!existing)
231
+ continue;
232
+ if (existing.locked === true && !ownerMatches(existing.owner))
233
+ continue;
234
+ delete stored[name];
235
+ changed = true;
236
+ }
237
+ }
238
+ if (changed)
239
+ writeBpHeaders(stored);
240
+ };
241
+ const contentDispositionFilename = (value) => {
242
+ if (!value)
243
+ return "";
244
+ const utf8 = /filename\*=UTF-8''([^;]+)/i.exec(value);
245
+ if (utf8?.[1]) {
246
+ try {
247
+ return decodeURIComponent(utf8[1].trim().replace(/^"|"$/g, ""));
248
+ }
249
+ catch {
250
+ return utf8[1].trim();
251
+ }
252
+ }
253
+ const simple = /filename=([^;]+)/i.exec(value);
254
+ return simple?.[1]?.trim().replace(/^"|"$/g, "") || "";
255
+ };
256
+ const fallbackDownloadName = (url) => {
257
+ try {
258
+ const name = new URL(url, window.location.origin).pathname.split("/").filter(Boolean).pop();
259
+ return name || "download";
260
+ }
261
+ catch {
262
+ return "download";
263
+ }
264
+ };
265
+ const resolveDownloadUrl = (el) => {
266
+ const { origin } = serviceContextFor(el);
267
+ const rawAttr = el.getAttribute(DOWNLOAD_ATTR);
268
+ const rawHref = el.tagName === "A" ? (el.getAttribute("href") || "") : "";
269
+ const raw = ((rawAttr ?? "").trim() || rawHref).trim();
270
+ if (!raw)
271
+ return "";
272
+ if (isRelativeServicePath(raw))
273
+ return origin ? origin + raw : raw;
274
+ try {
275
+ return new URL(raw, window.location.origin).href;
276
+ }
277
+ catch {
278
+ return "";
279
+ }
280
+ };
281
+ const showDownloadError = (el, message) => {
282
+ const outlet = el.closest("[data-bp-main-outlet]");
283
+ if (outlet instanceof HTMLElement)
284
+ outlet.innerHTML = `<div class="bp-embedded__error">${message}</div>`;
285
+ };
286
+ const downloadBlob = async (el) => {
287
+ if (el.getAttribute("data-bp-download-loading") === "true")
288
+ return;
289
+ const url = resolveDownloadUrl(el);
290
+ if (!url)
291
+ return;
292
+ el.setAttribute("data-bp-download-loading", "true");
293
+ const headers = {
294
+ Accept: el.getAttribute("hx-accept") || "application/octet-stream"
295
+ };
296
+ attachBpHeaders(headers, url);
297
+ try {
298
+ const response = await fetch(url, { method: "GET", mode: "cors", cache: "no-store", headers });
299
+ applyBpHeaderDirectives(response, url);
300
+ if (!response.ok) {
301
+ showDownloadError(el, `Download failed (${response.status}).`);
302
+ return;
303
+ }
304
+ const blob = await response.blob();
305
+ const objectUrl = URL.createObjectURL(blob);
306
+ const anchor = document.createElement("a");
307
+ anchor.href = objectUrl;
308
+ anchor.download =
309
+ contentDispositionFilename(response.headers.get("content-disposition"))
310
+ || el.getAttribute("download")
311
+ || fallbackDownloadName(url);
312
+ document.body.appendChild(anchor);
313
+ anchor.click();
314
+ anchor.remove();
315
+ window.setTimeout(() => URL.revokeObjectURL(objectUrl), 1000);
316
+ }
317
+ catch {
318
+ showDownloadError(el, "Unable to download file.");
319
+ }
320
+ finally {
321
+ el.removeAttribute("data-bp-download-loading");
322
+ }
323
+ };
324
+ const bindDownload = (el) => {
325
+ if (!el.hasAttribute(DOWNLOAD_ATTR) || el.getAttribute("data-bp-download-bound") === "true")
326
+ return;
327
+ el.setAttribute("data-bp-download-bound", "true");
328
+ el.addEventListener("click", (event) => {
329
+ event.preventDefault();
330
+ event.stopPropagation();
331
+ void downloadBlob(el);
332
+ });
333
+ const trigger = (el.getAttribute("hx-trigger") || "").toLowerCase();
334
+ if (trigger.split(/[,\s]+/).includes("load"))
335
+ window.setTimeout(() => void downloadBlob(el), 0);
336
+ };
337
+ document.addEventListener("DOMContentLoaded", () => {
338
+ document.querySelectorAll("[data-bp-embedded-root]").forEach((root) => {
339
+ if (root instanceof Element) {
340
+ resolveRelativeUrls(root);
341
+ void loadBackgroundFragments(root);
342
+ }
343
+ });
344
+ });
345
+ htmx.registerExtension("bp-embedded", {
346
+ htmx_before_init(elt) {
347
+ if (elt instanceof Element)
348
+ resolveRelativeUrls(elt);
349
+ },
350
+ htmx_after_process(elt) {
351
+ if (elt instanceof Element)
352
+ resolveRelativeUrls(elt);
353
+ },
354
+ htmx_config_request(elt, detail) {
355
+ const ctx = detail.ctx;
356
+ if (!ctx?.request)
357
+ return;
358
+ const source = ctx.sourceElement instanceof Element
359
+ ? ctx.sourceElement
360
+ : elt instanceof Element
361
+ ? elt
362
+ : null;
363
+ const target = ctx.target;
364
+ const mode = target instanceof Element && target.hasAttribute("data-bp-main-outlet") ? "page" : "fragment";
365
+ const hasAcceptHeader = Object.keys(ctx.request.headers).some((key) => key.toLowerCase() === "accept");
366
+ if (!hasAcceptHeader) {
367
+ ctx.request.headers.Accept = "text/html; theme=embedded; mode=" + mode;
368
+ }
369
+ try {
370
+ const action = ctx.request.action || "";
371
+ const url = new URL(action, window.location.origin);
372
+ if (url.origin === window.location.origin) {
373
+ const { origin } = serviceContextFor(source);
374
+ if (origin)
375
+ ctx.request.action = origin + url.pathname + url.search;
376
+ }
377
+ attachBpHeaders(ctx.request.headers, ctx.request.action || action);
378
+ }
379
+ catch {
380
+ return;
381
+ }
382
+ },
383
+ htmx_before_request(_elt, detail) {
384
+ const target = detail.ctx?.target;
385
+ if (target instanceof Element)
386
+ target.classList.add("bp-embedded__loading");
387
+ },
388
+ htmx_before_swap(_elt, detail) {
389
+ const status = detail.ctx?.response?.status;
390
+ const target = detail.ctx?.target;
391
+ if (status && status >= 400 && target instanceof Element) {
392
+ target.innerHTML = `<div class="bp-embedded__error">Request failed (${status}).</div>`;
393
+ return false;
394
+ }
395
+ },
396
+ htmx_after_request(_elt, detail) {
397
+ applyBpHeaderDirectives(detail.ctx?.response, detail.ctx?.request?.action || "");
398
+ },
399
+ htmx_after_swap(_elt, detail) {
400
+ const target = detail.ctx?.target;
401
+ if (target instanceof Element) {
402
+ target.classList.remove("bp-embedded__loading");
403
+ resolveRelativeUrls(target);
404
+ }
405
+ },
406
+ htmx_error(_elt, detail) {
407
+ const target = detail.ctx?.target;
408
+ if (target instanceof Element) {
409
+ target.classList.remove("bp-embedded__loading");
410
+ target.innerHTML = `<div class="bp-embedded__error">Unable to load embedded content.</div>`;
411
+ }
412
+ }
413
+ });
414
+ })();
415
+ }));
416
+ }
417
+ export async function loadEmbeddedAsset(assetPath) {
418
+ const normalized = assetPath.replace(/^\/+/, "");
419
+ if (normalized === "embedded-core.js") {
420
+ if (!AssetCache.has(normalized)) {
421
+ AssetCache.set(normalized, readTextAsset(HtmxPath, "application/javascript; charset=utf-8").then((asset) => ({
422
+ body: `${asset.body}\n;\n${embeddedRuntimeSource()}`,
423
+ contentType: "application/javascript; charset=utf-8"
424
+ })));
425
+ }
426
+ return AssetCache.get(normalized) ?? null;
427
+ }
428
+ return null;
429
+ }
430
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-embedded/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { type BSBServiceConstructor, type Observable } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { type BetterPortalRegistry } from "@betterportal/framework";
4
+ import { BPService, type BPServiceDefinition } from "@betterportal/plugin-bsb";
5
+ declare const Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
6
+ host: av.StringSchema;
7
+ port: av.IntSchema;
8
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
9
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
10
+ configApiToken: av.OptionalSchema<av.StringSchema>;
11
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
12
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
13
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
14
+ bootstrapStatePath: av.StringSchema;
15
+ scopedConfigCachePath: av.StringSchema;
16
+ trustedProxyHeaders: av.BoolSchema;
17
+ cfProxy: av.BoolSchema;
18
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
19
+ }>>;
20
+ }>>;
21
+ declare const EventSchemas: {
22
+ readonly emitEvents: {};
23
+ readonly onEvents: {};
24
+ readonly emitReturnableEvents: {};
25
+ readonly onReturnableEvents: {};
26
+ readonly emitBroadcast: {};
27
+ readonly onBroadcast: {};
28
+ };
29
+ export declare class Plugin extends BPService<InstanceType<typeof Config>, typeof EventSchemas> {
30
+ static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
31
+ host: av.StringSchema;
32
+ port: av.IntSchema;
33
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
34
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
35
+ configApiToken: av.OptionalSchema<av.StringSchema>;
36
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
37
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
38
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
39
+ bootstrapStatePath: av.StringSchema;
40
+ scopedConfigCachePath: av.StringSchema;
41
+ trustedProxyHeaders: av.BoolSchema;
42
+ cfProxy: av.BoolSchema;
43
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
44
+ }>>;
45
+ }>>;
46
+ static EventSchemas: {
47
+ readonly emitEvents: {};
48
+ readonly onEvents: {};
49
+ readonly emitReturnableEvents: {};
50
+ readonly onReturnableEvents: {};
51
+ readonly emitBroadcast: {};
52
+ readonly onBroadcast: {};
53
+ };
54
+ constructor(cfg: BSBServiceConstructor<InstanceType<typeof Config>, typeof EventSchemas>);
55
+ protected definition(): BPServiceDefinition;
56
+ private get betterportal();
57
+ protected headerTrustOptions(): {
58
+ trustedProxyHeaders?: boolean;
59
+ cfProxy?: boolean;
60
+ };
61
+ protected onRegistered(_registry: BetterPortalRegistry, obs: Observable): Promise<void>;
62
+ private requirePortalConfig;
63
+ private registerRoutes;
64
+ private appPublicUrl;
65
+ private resolveManagementApp;
66
+ private resolveConfigManagerUrl;
67
+ private discoveryUrls;
68
+ private resolveThemeAiContext;
69
+ private aiManifest;
70
+ private handleAiManifest;
71
+ private handleLlmsTxt;
72
+ private handlePublicDiscovery;
73
+ private handleAsset;
74
+ private logThemeContextResolutionFailure;
75
+ private tagRequestContext;
76
+ private handleIndex;
77
+ private handleManifest;
78
+ private handleHealth;
79
+ run(obs: Observable): Promise<void>;
80
+ dispose(): Promise<void>;
81
+ }
82
+ export { Config, EventSchemas };
83
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-embedded/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAeL,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,SAAS,EAET,KAAK,mBAAmB,EAEzB,MAAM,0BAA0B,CAAC;AAgGlC,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;GAQX,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;CAOhB,CAAC;AAEH,qBAAa,MAAO,SAAQ,SAAS,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IACrF,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;QAAU;IACvB,MAAM,CAAC,YAAY;;;;;;;MAAgB;gBAEvB,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAIxF,SAAS,CAAC,UAAU,IAAI,mBAAmB;IAa3C,OAAO,KAAK,YAAY,GAEvB;IAED,SAAS,CAAC,kBAAkB,IAAI;QAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;cAOpE,YAAY,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7F,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,UAAU;YAuBJ,gBAAgB;YAQhB,aAAa;YAgCb,qBAAqB;YAkBrB,WAAW;IAgBzB,OAAO,CAAC,gCAAgC;IAgBxC,OAAO,CAAC,iBAAiB;YAKX,WAAW;YA8HX,cAAc;YASd,YAAY;IAUpB,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC"}