@betterportal/docs-site 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.
Files changed (44) hide show
  1. package/README.md +11 -0
  2. package/bsb-plugin.json +22 -0
  3. package/bsb-tests.json +14 -0
  4. package/lib/index.d.ts +2 -0
  5. package/lib/index.d.ts.map +1 -0
  6. package/lib/index.js +2 -0
  7. package/lib/index.js.map +1 -0
  8. package/lib/plugins/service-betterportal-docs-site/.bp-generated/registry.d.ts +3 -0
  9. package/lib/plugins/service-betterportal-docs-site/.bp-generated/registry.d.ts.map +1 -0
  10. package/lib/plugins/service-betterportal-docs-site/.bp-generated/registry.js +54 -0
  11. package/lib/plugins/service-betterportal-docs-site/.bp-generated/registry.js.map +1 -0
  12. package/lib/plugins/service-betterportal-docs-site/assets/doc-wave.svg +25 -0
  13. package/lib/plugins/service-betterportal-docs-site/assets/portal-map.svg +53 -0
  14. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/_theme.bootstrap1/index.d.ts +5 -0
  15. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/_theme.bootstrap1/index.d.ts.map +1 -0
  16. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/_theme.bootstrap1/index.js +96 -0
  17. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/_theme.bootstrap1/index.js.map +1 -0
  18. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/index.d.ts +44 -0
  19. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/index.d.ts.map +1 -0
  20. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/index.js +73 -0
  21. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/[section]/[page]/index.js.map +1 -0
  22. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/_theme.bootstrap1/index.d.ts +5 -0
  23. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/_theme.bootstrap1/index.d.ts.map +1 -0
  24. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/_theme.bootstrap1/index.js +95 -0
  25. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/_theme.bootstrap1/index.js.map +1 -0
  26. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/content.d.ts +15 -0
  27. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/content.d.ts.map +1 -0
  28. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/content.js +94 -0
  29. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/content.js.map +1 -0
  30. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/index.d.ts +36 -0
  31. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/index.d.ts.map +1 -0
  32. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/index.js +44 -0
  33. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/index.js.map +1 -0
  34. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/rendering/markdown.d.ts +4 -0
  35. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/rendering/markdown.d.ts.map +1 -0
  36. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/rendering/markdown.js +124 -0
  37. package/lib/plugins/service-betterportal-docs-site/bp-routes/docs/rendering/markdown.js.map +1 -0
  38. package/lib/plugins/service-betterportal-docs-site/index.d.ts +59 -0
  39. package/lib/plugins/service-betterportal-docs-site/index.d.ts.map +1 -0
  40. package/lib/plugins/service-betterportal-docs-site/index.js +67 -0
  41. package/lib/plugins/service-betterportal-docs-site/index.js.map +1 -0
  42. package/lib/schemas/service-betterportal-docs-site.json +109 -0
  43. package/lib/schemas/service-betterportal-docs-site.plugin.json +121 -0
  44. package/package.json +65 -0
@@ -0,0 +1,94 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const ModuleDir = path.dirname(fileURLToPath(import.meta.url));
6
+ function docsRootCandidates() {
7
+ const candidates = [];
8
+ let current = ModuleDir;
9
+ while (true) {
10
+ candidates.push(path.join(current, "docs"));
11
+ const parent = path.dirname(current);
12
+ if (parent === current)
13
+ break;
14
+ current = parent;
15
+ }
16
+ return candidates;
17
+ }
18
+ function docsRoot() {
19
+ const DocsRootCandidates = docsRootCandidates();
20
+ const root = DocsRootCandidates.find((candidate) => existsSync(candidate));
21
+ return root ?? DocsRootCandidates[0];
22
+ }
23
+ function titleFromMarkdown(markdown, fallback) {
24
+ const heading = markdown.split(/\r?\n/).find((line) => line.startsWith("# "));
25
+ return heading ? heading.replace(/^#\s+/, "").trim() : fallback;
26
+ }
27
+ function excerptFromMarkdown(markdown) {
28
+ const paragraph = markdown
29
+ .split(/\r?\n\r?\n/)
30
+ .map((block) => block.trim())
31
+ .find((block) => block.length > 0 && !block.startsWith("#"));
32
+ return paragraph ? paragraph.replace(/\s+/g, " ").slice(0, 180) : "";
33
+ }
34
+ function labelFromSlug(slug) {
35
+ return slug
36
+ .replace(/^\d+-/, "")
37
+ .split(/[-_]/)
38
+ .filter(Boolean)
39
+ .map((part) => part[0]?.toUpperCase() + part.slice(1))
40
+ .join(" ");
41
+ }
42
+ export async function listDocs() {
43
+ const root = docsRoot();
44
+ if (!existsSync(root))
45
+ return [];
46
+ const sections = await readdir(root, { withFileTypes: true });
47
+ const docs = [];
48
+ for (const sectionEntry of sections) {
49
+ if (!sectionEntry.isDirectory())
50
+ continue;
51
+ const section = sectionEntry.name;
52
+ const sectionDir = path.join(root, section);
53
+ const files = await readdir(sectionDir, { withFileTypes: true });
54
+ for (const fileEntry of files) {
55
+ if (!fileEntry.isFile() || !fileEntry.name.endsWith(".md"))
56
+ continue;
57
+ const page = fileEntry.name.slice(0, -3);
58
+ const sourcePath = path.join(sectionDir, fileEntry.name);
59
+ const markdown = await readFile(sourcePath, "utf8");
60
+ const fallbackTitle = labelFromSlug(page);
61
+ docs.push({
62
+ id: `${section}/${page}`,
63
+ section,
64
+ page,
65
+ title: titleFromMarkdown(markdown, fallbackTitle),
66
+ href: `/docs/${section}/${page}`,
67
+ sourcePath: path.relative(root, sourcePath).replace(/\\/g, "/"),
68
+ excerpt: excerptFromMarkdown(markdown)
69
+ });
70
+ }
71
+ }
72
+ return docs.sort((a, b) => a.section.localeCompare(b.section) || a.title.localeCompare(b.title));
73
+ }
74
+ export async function getDoc(section, page) {
75
+ const root = docsRoot();
76
+ const safeSection = section.replace(/[^a-zA-Z0-9_-]/g, "");
77
+ const safePage = page.replace(/[^a-zA-Z0-9._-]/g, "");
78
+ const sourcePath = path.join(root, safeSection, `${safePage}.md`);
79
+ if (!existsSync(sourcePath))
80
+ return null;
81
+ const markdown = await readFile(sourcePath, "utf8");
82
+ const fallbackTitle = labelFromSlug(safePage);
83
+ return {
84
+ id: `${safeSection}/${safePage}`,
85
+ section: safeSection,
86
+ page: safePage,
87
+ title: titleFromMarkdown(markdown, fallbackTitle),
88
+ href: `/docs/${safeSection}/${safePage}`,
89
+ sourcePath: path.relative(root, sourcePath).replace(/\\/g, "/"),
90
+ excerpt: excerptFromMarkdown(markdown),
91
+ markdown
92
+ };
93
+ }
94
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-docs-site/bp-routes/docs/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ import { type CacheHints, type DemoScenario, type ApiAuthRequirement } from "@betterportal/framework";
4
+ export declare const ResponseSchema: av.ObjectSchema<{
5
+ title: av.StringSchema;
6
+ description: av.StringSchema;
7
+ docs: av.ArraySchema<av.ObjectSchema<{
8
+ id: av.StringSchema;
9
+ section: av.StringSchema;
10
+ page: av.StringSchema;
11
+ title: av.StringSchema;
12
+ href: av.StringSchema;
13
+ sourcePath: av.StringSchema;
14
+ excerpt: av.StringSchema;
15
+ }>>;
16
+ }>;
17
+ export type ResponseData = Infer<typeof ResponseSchema>;
18
+ export declare const title = "BetterPortal Docs";
19
+ export declare const description = "Documentation index for BetterPortal.";
20
+ export declare const auth: ApiAuthRequirement;
21
+ export declare const cacheHints: CacheHints;
22
+ export declare const demoScenarios: DemoScenario<ResponseData>[];
23
+ export declare const handleGet: import("@betterportal/framework").RouteHandler<Record<string, string>, Record<string, unknown>, Record<string, string>, Record<string, unknown>, {
24
+ title: string;
25
+ description: string;
26
+ docs: {
27
+ id: string;
28
+ section: string;
29
+ page: string;
30
+ title: string;
31
+ href: string;
32
+ sourcePath: string;
33
+ excerpt: string;
34
+ }[];
35
+ }, unknown, Record<string, unknown>>;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-docs-site/bp-routes/docs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAajC,eAAO,MAAM,cAAc;;;;;;;;;;;;EAIC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,sBAAsB,CAAC;AACzC,eAAO,MAAM,WAAW,0CAA0C,CAAC;AAEnE,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,YAAY,CAAC,EAUrD,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;oCAOrB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import * as av from "anyvali";
2
+ import { createHandler } from "@betterportal/framework";
3
+ import { listDocs } from "./content.js";
4
+ const DocSummarySchema = av.object({
5
+ id: av.string().minLength(1),
6
+ section: av.string().minLength(1),
7
+ page: av.string().minLength(1),
8
+ title: av.string().minLength(1),
9
+ href: av.string().minLength(1),
10
+ sourcePath: av.string().minLength(1),
11
+ excerpt: av.string()
12
+ }, { unknownKeys: "strip" });
13
+ export const ResponseSchema = av.object({
14
+ title: av.string().minLength(1),
15
+ description: av.string().minLength(1),
16
+ docs: av.array(DocSummarySchema)
17
+ }, { unknownKeys: "strip" });
18
+ export const title = "BetterPortal Docs";
19
+ export const description = "Documentation index for BetterPortal.";
20
+ export const auth = {
21
+ required: false,
22
+ permissions: []
23
+ };
24
+ export const cacheHints = {
25
+ ttlSeconds: 15,
26
+ varyBy: ["accept", "origin", "referer", ":origin", ":referer"]
27
+ };
28
+ export const demoScenarios = [
29
+ {
30
+ id: "default",
31
+ title: "Docs Index",
32
+ response: {
33
+ title: "BetterPortal",
34
+ description: "A service-composed portal platform for multi-tenant products.",
35
+ docs: []
36
+ }
37
+ }
38
+ ];
39
+ export const handleGet = createHandler({ response: ResponseSchema }, async () => ({
40
+ title: "BetterPortal",
41
+ description: "A service-composed portal platform for multi-tenant products.",
42
+ docs: await listDocs()
43
+ }));
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-docs-site/bp-routes/docs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EACL,aAAa,EAId,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9B,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9B,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;CACrB,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACjC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,KAAK,GAAG,mBAAmB,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,uCAAuC,CAAC;AAEnE,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;CAC/D,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE;YACR,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,+DAA+D;YAC5E,IAAI,EAAE,EAAE;SACT;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CACpC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAC5B,KAAK,IAAI,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,+DAA+D;IAC5E,IAAI,EAAE,MAAM,QAAQ,EAAE;CACvB,CAAC,CACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** @jsxImportSource jsx-htmx */
2
+ import type { HtmlRenderable } from "@betterportal/framework";
3
+ export declare function renderMarkdown(markdown: string): HtmlRenderable;
4
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-docs-site/bp-routes/docs/rendering/markdown.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoD9D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA4G/D"}
@@ -0,0 +1,124 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
+ function inlineText(text) {
3
+ const parts = text.split(/(`[^`]+`|\*\*[^*]+\*\*)/g).filter((part) => part.length > 0);
4
+ return (_jsx(_Fragment, { children: parts.map((part) => {
5
+ if (part.startsWith("`") && part.endsWith("`")) {
6
+ return _jsx("code", { children: part.slice(1, -1) });
7
+ }
8
+ if (part.startsWith("**") && part.endsWith("**")) {
9
+ return _jsx("strong", { children: part.slice(2, -2) });
10
+ }
11
+ return part;
12
+ }) }));
13
+ }
14
+ function tableBlock(lines) {
15
+ const rows = lines
16
+ .filter((line) => line.includes("|"))
17
+ .map((line) => line.split("|").map((cell) => cell.trim()).filter((cell) => cell.length > 0));
18
+ const header = rows[0] ?? [];
19
+ const body = rows.slice(2);
20
+ return (_jsx("div", { class: "table-responsive my-4 border rounded-2 overflow-hidden", children: _jsxs("table", { class: "table table-sm table-hover align-middle mb-0", children: [_jsx("thead", { children: _jsx("tr", { children: header.map((cell) => _jsx("th", { children: inlineText(cell) })) }) }), _jsx("tbody", { children: body.map((row) => (_jsx("tr", { children: row.map((cell) => _jsx("td", { children: inlineText(cell) })) }))) })] }) }));
21
+ }
22
+ function listBlock(lines) {
23
+ return (_jsx("ul", { class: "mb-4 ps-3", children: lines.map((line) => (_jsx("li", { children: inlineText(line.replace(/^-\s+/, "")) }))) }));
24
+ }
25
+ export function renderMarkdown(markdown) {
26
+ const lines = markdown.replace(/\r\n/g, "\n").split("\n");
27
+ const blocks = [];
28
+ let paragraph = [];
29
+ let list = [];
30
+ let table = [];
31
+ let code = [];
32
+ let inCode = false;
33
+ const flushParagraph = () => {
34
+ if (paragraph.length === 0)
35
+ return;
36
+ blocks.push(_jsx("p", { children: inlineText(paragraph.join(" ")) }));
37
+ paragraph = [];
38
+ };
39
+ const flushList = () => {
40
+ if (list.length === 0)
41
+ return;
42
+ blocks.push(listBlock(list));
43
+ list = [];
44
+ };
45
+ const flushTable = () => {
46
+ if (table.length === 0)
47
+ return;
48
+ blocks.push(tableBlock(table));
49
+ table = [];
50
+ };
51
+ const flushCode = () => {
52
+ if (code.length === 0)
53
+ return;
54
+ blocks.push(_jsx("pre", { class: "bg-dark text-light border rounded-2 p-3 overflow-auto shadow-sm", children: _jsx("code", { children: code.join("\n") }) }));
55
+ code = [];
56
+ };
57
+ for (const line of lines) {
58
+ if (line.startsWith("```")) {
59
+ if (inCode) {
60
+ inCode = false;
61
+ flushCode();
62
+ }
63
+ else {
64
+ flushParagraph();
65
+ flushList();
66
+ flushTable();
67
+ inCode = true;
68
+ }
69
+ continue;
70
+ }
71
+ if (inCode) {
72
+ code.push(line);
73
+ continue;
74
+ }
75
+ if (line.trim().length === 0) {
76
+ flushParagraph();
77
+ flushList();
78
+ flushTable();
79
+ continue;
80
+ }
81
+ if (line.startsWith("# ")) {
82
+ flushParagraph();
83
+ flushList();
84
+ flushTable();
85
+ blocks.push(_jsx("h1", { class: "h2 mb-3 pb-3 border-bottom", children: inlineText(line.replace(/^#\s+/, "")) }));
86
+ continue;
87
+ }
88
+ if (line.startsWith("## ")) {
89
+ flushParagraph();
90
+ flushList();
91
+ flushTable();
92
+ blocks.push(_jsx("h2", { class: "h4 mt-4 mb-3", children: inlineText(line.replace(/^##\s+/, "")) }));
93
+ continue;
94
+ }
95
+ if (line.startsWith("### ")) {
96
+ flushParagraph();
97
+ flushList();
98
+ flushTable();
99
+ blocks.push(_jsx("h3", { class: "h5 mt-4 mb-2", children: inlineText(line.replace(/^###\s+/, "")) }));
100
+ continue;
101
+ }
102
+ if (line.startsWith("- ")) {
103
+ flushParagraph();
104
+ flushTable();
105
+ list.push(line);
106
+ continue;
107
+ }
108
+ if (line.includes("|") && line.trim().startsWith("|")) {
109
+ flushParagraph();
110
+ flushList();
111
+ table.push(line);
112
+ continue;
113
+ }
114
+ flushList();
115
+ flushTable();
116
+ paragraph.push(line.trim());
117
+ }
118
+ flushParagraph();
119
+ flushList();
120
+ flushTable();
121
+ flushCode();
122
+ return _jsx(_Fragment, { children: blocks });
123
+ }
124
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-docs-site/bp-routes/docs/rendering/markdown.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { type BSBServiceConstructor, type Observable } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { BPService, type BPServiceDefinition } from "@betterportal/plugin-bsb";
4
+ import type { BetterPortalRegistry } from "@betterportal/framework";
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
+ protected onRegistered(_registry: BetterPortalRegistry, _obs: Observable): void;
57
+ }
58
+ export { Config, EventSchemas };
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-docs-site/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAInB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAA4B,SAAS,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAYpE,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;IAY3C,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;CAoBhF;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { createConfigSchema, createEventSchemas } from "@bsb/base";
2
+ import { readFile } from "node:fs/promises";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, resolve } from "node:path";
5
+ import * as av from "anyvali";
6
+ import { BetterPortalConfigSchema, BPService } from "@betterportal/plugin-bsb";
7
+ import { registry } from "./.bp-generated/registry.js";
8
+ const AssetRoot = resolve(dirname(fileURLToPath(import.meta.url)), "assets");
9
+ const AllowedAssets = new Set(["portal-map.svg", "doc-wave.svg"]);
10
+ const PluginConfigSchema = av.object({
11
+ host: av.string().minLength(1).default("0.0.0.0"),
12
+ port: av.int().min(1).default(3400),
13
+ betterportal: BetterPortalConfigSchema
14
+ }, { unknownKeys: "strip" });
15
+ const Config = createConfigSchema({
16
+ name: "service-betterportal-docs-site",
17
+ description: "Documentation site service for BetterPortal",
18
+ tags: ["betterportal", "service", "docs"],
19
+ documentation: ["./README.md"]
20
+ }, PluginConfigSchema);
21
+ const EventSchemas = createEventSchemas({
22
+ emitEvents: {},
23
+ onEvents: {},
24
+ emitReturnableEvents: {},
25
+ onReturnableEvents: {},
26
+ emitBroadcast: {},
27
+ onBroadcast: {}
28
+ });
29
+ export class Plugin extends BPService {
30
+ static Config = Config;
31
+ static EventSchemas = EventSchemas;
32
+ constructor(cfg) {
33
+ super({ ...cfg, eventSchemas: EventSchemas });
34
+ }
35
+ definition() {
36
+ return {
37
+ manifest: {
38
+ pluginId: "service.betterportal.docs-site",
39
+ title: "BetterPortal Docs",
40
+ description: "Dogfooded BetterPortal documentation site backed by repository Markdown files.",
41
+ configSchemas: []
42
+ },
43
+ registry
44
+ };
45
+ }
46
+ onRegistered(_registry, _obs) {
47
+ this.app.get("/docs-assets/**", async (event) => {
48
+ const assetName = event.url.pathname.replace(/^\/docs-assets\/+/, "");
49
+ if (!AllowedAssets.has(assetName)) {
50
+ return new Response(JSON.stringify({ error: "Asset not found" }), {
51
+ status: 404,
52
+ headers: { "content-type": "application/json; charset=utf-8" }
53
+ });
54
+ }
55
+ const body = await readFile(resolve(AssetRoot, assetName), "utf8");
56
+ return new Response(body, {
57
+ status: 200,
58
+ headers: {
59
+ "content-type": "image/svg+xml; charset=utf-8",
60
+ "cache-control": "public, max-age=3600"
61
+ }
62
+ });
63
+ });
64
+ }
65
+ }
66
+ export { Config, EventSchemas };
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-docs-site/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ {
2
+ "pluginName": "service-betterportal-docs-site",
3
+ "events": {},
4
+ "version": "0.0.1",
5
+ "configSchema": {
6
+ "anyvaliVersion": "1.0",
7
+ "schemaVersion": "1.1",
8
+ "root": {
9
+ "kind": "object",
10
+ "properties": {
11
+ "host": {
12
+ "kind": "string",
13
+ "minLength": 1,
14
+ "default": "0.0.0.0"
15
+ },
16
+ "port": {
17
+ "kind": "int",
18
+ "min": 1,
19
+ "default": 3400
20
+ },
21
+ "betterportal": {
22
+ "kind": "optional",
23
+ "inner": {
24
+ "kind": "object",
25
+ "properties": {
26
+ "bpConfigPath": {
27
+ "kind": "optional",
28
+ "inner": {
29
+ "kind": "string",
30
+ "minLength": 1
31
+ }
32
+ },
33
+ "configApiToken": {
34
+ "kind": "optional",
35
+ "inner": {
36
+ "kind": "string",
37
+ "minLength": 1
38
+ }
39
+ },
40
+ "configEncryptionKey": {
41
+ "kind": "optional",
42
+ "inner": {
43
+ "kind": "string",
44
+ "minLength": 16
45
+ }
46
+ },
47
+ "controlPlaneUrl": {
48
+ "kind": "optional",
49
+ "inner": {
50
+ "kind": "string",
51
+ "minLength": 1
52
+ }
53
+ },
54
+ "serviceApiKey": {
55
+ "kind": "optional",
56
+ "inner": {
57
+ "kind": "string",
58
+ "minLength": 1
59
+ }
60
+ },
61
+ "bootstrapStatePath": {
62
+ "kind": "string",
63
+ "minLength": 1,
64
+ "default": "./.bp-bootstrap/state.enc"
65
+ },
66
+ "scopedConfigCachePath": {
67
+ "kind": "string",
68
+ "minLength": 1,
69
+ "default": "./.bp-sync-cache/scoped.json"
70
+ },
71
+ "trustedProxyHeaders": {
72
+ "kind": "bool",
73
+ "default": false
74
+ },
75
+ "cfProxy": {
76
+ "kind": "bool",
77
+ "default": false
78
+ },
79
+ "trustedProxyIps": {
80
+ "kind": "array",
81
+ "items": {
82
+ "kind": "string",
83
+ "minLength": 1
84
+ },
85
+ "default": []
86
+ }
87
+ },
88
+ "required": [
89
+ "bootstrapStatePath",
90
+ "scopedConfigCachePath",
91
+ "trustedProxyHeaders",
92
+ "cfProxy",
93
+ "trustedProxyIps"
94
+ ],
95
+ "unknownKeys": "strip"
96
+ }
97
+ }
98
+ },
99
+ "required": [
100
+ "host",
101
+ "port"
102
+ ],
103
+ "unknownKeys": "strip"
104
+ },
105
+ "definitions": {},
106
+ "extensions": {}
107
+ },
108
+ "pluginType": "service"
109
+ }