@cogenta/cli 0.3.0 → 0.6.0
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 +3856 -0
- package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
- package/dist/admin-assets/assets/index-fYXyHpn8.js +1090 -0
- package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
- package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
- package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta.png +0 -0
- package/dist/admin-assets/favicon.png +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-400.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-500.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-600.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-700.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-sans-var.woff2 +0 -0
- package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
- package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
- package/dist/admin-assets/index.html +3 -2
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/admin-assets.d.ts +1 -0
- package/dist/commands/admin-assets.d.ts.map +1 -1
- package/dist/commands/admin-assets.js +19 -1
- package/dist/commands/admin-assets.js.map +1 -1
- package/dist/commands/agent-runtime.d.ts +151 -0
- package/dist/commands/agent-runtime.d.ts.map +1 -0
- package/dist/commands/agent-runtime.js +519 -0
- package/dist/commands/agent-runtime.js.map +1 -0
- package/dist/commands/assistant.d.ts +89 -3
- package/dist/commands/assistant.d.ts.map +1 -1
- package/dist/commands/assistant.js +206 -39
- package/dist/commands/assistant.js.map +1 -1
- package/dist/commands/audit-integrity-alert.d.ts +23 -0
- package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
- package/dist/commands/audit-integrity-alert.js +33 -0
- package/dist/commands/audit-integrity-alert.js.map +1 -0
- package/dist/commands/backup.d.ts +78 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +238 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/channels.d.ts +47 -0
- package/dist/commands/channels.d.ts.map +1 -0
- package/dist/commands/channels.js +277 -0
- package/dist/commands/channels.js.map +1 -0
- package/dist/commands/default-logo.d.ts +27 -0
- package/dist/commands/default-logo.d.ts.map +1 -0
- package/dist/commands/default-logo.js +30 -0
- package/dist/commands/default-logo.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +74 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +22 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/forms-page.d.ts +75 -0
- package/dist/commands/forms-page.d.ts.map +1 -0
- package/dist/commands/forms-page.js +191 -0
- package/dist/commands/forms-page.js.map +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +13 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +277 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/roles.d.ts +22 -0
- package/dist/commands/roles.d.ts.map +1 -0
- package/dist/commands/roles.js +79 -0
- package/dist/commands/roles.js.map +1 -0
- package/dist/commands/search-page.d.ts +15 -0
- package/dist/commands/search-page.d.ts.map +1 -1
- package/dist/commands/search-page.js +22 -16
- package/dist/commands/search-page.js.map +1 -1
- package/dist/commands/seo.d.ts +92 -4
- package/dist/commands/seo.d.ts.map +1 -1
- package/dist/commands/seo.js +168 -4
- package/dist/commands/seo.js.map +1 -1
- package/dist/commands/serve.d.ts +489 -6
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +3883 -164
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/site-plan.d.ts +27 -1
- package/dist/commands/site-plan.d.ts.map +1 -1
- package/dist/commands/site-plan.js +71 -4
- package/dist/commands/site-plan.js.map +1 -1
- package/dist/commands/term-archive-page.d.ts +94 -0
- package/dist/commands/term-archive-page.d.ts.map +1 -0
- package/dist/commands/term-archive-page.js +195 -0
- package/dist/commands/term-archive-page.js.map +1 -0
- package/dist/commands/theme-css.d.ts +22 -7
- package/dist/commands/theme-css.d.ts.map +1 -1
- package/dist/commands/theme-css.js +33 -8
- package/dist/commands/theme-css.js.map +1 -1
- package/dist/commands/theme-registry.d.ts +94 -0
- package/dist/commands/theme-registry.d.ts.map +1 -0
- package/dist/commands/theme-registry.js +130 -0
- package/dist/commands/theme-registry.js.map +1 -0
- package/dist/commands/theme-render.d.ts +360 -2
- package/dist/commands/theme-render.d.ts.map +1 -1
- package/dist/commands/theme-render.js +984 -29
- package/dist/commands/theme-render.js.map +1 -1
- package/dist/commands/theme-wiring.d.ts +107 -0
- package/dist/commands/theme-wiring.d.ts.map +1 -0
- package/dist/commands/theme-wiring.js +295 -0
- package/dist/commands/theme-wiring.js.map +1 -0
- package/dist/commands/tools.d.ts +71 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +330 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/update.d.ts +25 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +193 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/users.d.ts.map +1 -1
- package/dist/commands/users.js +6 -36
- package/dist/commands/users.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -4
- package/dist/index.js.map +1 -1
- package/dist/invite-mail.d.ts +39 -0
- package/dist/invite-mail.d.ts.map +1 -0
- package/dist/invite-mail.js +39 -0
- package/dist/invite-mail.js.map +1 -0
- package/dist/reset-mail.d.ts +39 -0
- package/dist/reset-mail.d.ts.map +1 -0
- package/dist/reset-mail.js +45 -0
- package/dist/reset-mail.js.map +1 -0
- package/dist/update/apply.d.ts +54 -0
- package/dist/update/apply.d.ts.map +1 -0
- package/dist/update/apply.js +77 -0
- package/dist/update/apply.js.map +1 -0
- package/dist/update/changelog-risk.d.ts +20 -0
- package/dist/update/changelog-risk.d.ts.map +1 -0
- package/dist/update/changelog-risk.js +55 -0
- package/dist/update/changelog-risk.js.map +1 -0
- package/dist/update/check.d.ts +60 -0
- package/dist/update/check.d.ts.map +1 -0
- package/dist/update/check.js +56 -0
- package/dist/update/check.js.map +1 -0
- package/dist/update/contract-risk.d.ts +55 -0
- package/dist/update/contract-risk.d.ts.map +1 -0
- package/dist/update/contract-risk.js +75 -0
- package/dist/update/contract-risk.js.map +1 -0
- package/dist/update/history.d.ts +30 -0
- package/dist/update/history.d.ts.map +1 -0
- package/dist/update/history.js +38 -0
- package/dist/update/history.js.map +1 -0
- package/dist/update/index.d.ts +28 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +11 -0
- package/dist/update/index.js.map +1 -0
- package/dist/update/list-restore-points.d.ts +20 -0
- package/dist/update/list-restore-points.d.ts.map +1 -0
- package/dist/update/list-restore-points.js +35 -0
- package/dist/update/list-restore-points.js.map +1 -0
- package/dist/update/npm-registry.d.ts +11 -0
- package/dist/update/npm-registry.d.ts.map +1 -0
- package/dist/update/npm-registry.js +74 -0
- package/dist/update/npm-registry.js.map +1 -0
- package/dist/update/restore-point.d.ts +26 -0
- package/dist/update/restore-point.d.ts.map +1 -0
- package/dist/update/restore-point.js +23 -0
- package/dist/update/restore-point.js.map +1 -0
- package/dist/update/tar.d.ts +27 -0
- package/dist/update/tar.d.ts.map +1 -0
- package/dist/update/tar.js +56 -0
- package/dist/update/tar.js.map +1 -0
- package/dist/update/version-compare.d.ts +17 -0
- package/dist/update/version-compare.d.ts.map +1 -0
- package/dist/update/version-compare.js +42 -0
- package/dist/update/version-compare.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -13
- package/dist/admin-assets/assets/index-Buwdj1V2.js +0 -71
- package/dist/admin-assets/assets/index-Csef0SiA.css +0 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { BlockRegistry } from '@cogenta/blocks';
|
|
2
|
+
import type { ThemeManifest } from '@cogenta/render';
|
|
3
|
+
import type { ChromeInput, ChromeResult, FetchedEntries, HtmlElement, PageContent, RenderContext, TermArchiveInput } from '@cogenta/theme-kit';
|
|
4
|
+
/**
|
|
5
|
+
* The theme registry — what makes more than one theme package installable at
|
|
6
|
+
* all (fiche L23). Before this, `theme-render.ts` imported `renderPage` and
|
|
7
|
+
* the chrome markup directly from `@cogenta/theme-canonical`; every site ran
|
|
8
|
+
* that one theme because nothing else could be named.
|
|
9
|
+
*
|
|
10
|
+
* A theme package's two theme-specific exports — everything else a rendered
|
|
11
|
+
* page needs (`RenderContext`, escaping, rich text, comments, entry helpers)
|
|
12
|
+
* now lives in `@cogenta/theme-kit`, shared and identical across every theme,
|
|
13
|
+
* so `theme-render.ts` never has to ask the registry for it.
|
|
14
|
+
*/
|
|
15
|
+
export interface ThemeModule {
|
|
16
|
+
readonly renderPage: (page: PageContent, ctx: RenderContext, entries?: FetchedEntries,
|
|
17
|
+
/**
|
|
18
|
+
* The block registry a stored block's type is resolved against —
|
|
19
|
+
* `@cogenta/blocks`'s twelve-turned-seventeen by default. A site with
|
|
20
|
+
* blocks of its own (a theme, or a theme-shipping plugin) passes its own,
|
|
21
|
+
* wider registry, so an active theme that does not implement one of them
|
|
22
|
+
* still renders its declared `fallback` (fiche 43, sous-chantier C(ii))
|
|
23
|
+
* instead of a silently blank slot.
|
|
24
|
+
*/
|
|
25
|
+
registry?: BlockRegistry) => HtmlElement;
|
|
26
|
+
readonly renderChrome: (input: ChromeInput) => ChromeResult;
|
|
27
|
+
/**
|
|
28
|
+
* The public archive page of one taxonomy term (contract D `theme@1.3`).
|
|
29
|
+
*
|
|
30
|
+
* **Optional**, and that is the whole point of it being here rather than
|
|
31
|
+
* beside `renderPage`: a theme installed before this existed, or a theme
|
|
32
|
+
* that simply does not want to own this layout, keeps working — the host
|
|
33
|
+
* renders a plain list inside that theme's own chrome instead. Making it
|
|
34
|
+
* required would have turned a new capability into a breaking change for
|
|
35
|
+
* every theme package on the day it shipped.
|
|
36
|
+
*/
|
|
37
|
+
readonly renderTermArchive?: (input: TermArchiveInput) => HtmlElement;
|
|
38
|
+
}
|
|
39
|
+
export interface BuiltinTheme {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
/** The gallery's own display name — not part of the manifest (fiche 48: a theme package does not get to name the card it is shown on). */
|
|
42
|
+
readonly label: string;
|
|
43
|
+
readonly load: () => Promise<ThemeModule>;
|
|
44
|
+
/** Loads `<package>/theme.config` — the manifest, separate from `load()` so a card can show version/description/author without pulling in the whole render module. */
|
|
45
|
+
readonly loadManifest: () => Promise<{
|
|
46
|
+
readonly default: ThemeManifest;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The theme packages this build of `@cogenta/cli` ships with — a real npm
|
|
51
|
+
* dependency of this package, never a filesystem scan: `cogenta serve` runs
|
|
52
|
+
* from a project that installed `@cogenta/cli`, and every theme it can offer
|
|
53
|
+
* has to be something that installation actually has in `node_modules`.
|
|
54
|
+
*
|
|
55
|
+
* Adding a theme package is one entry here, matched by one line in this
|
|
56
|
+
* package's own `dependencies` — the same "declare it once, the registry
|
|
57
|
+
* generalises the rest" shape `SITE_SETTINGS_REGISTRY` already uses for site
|
|
58
|
+
* settings.
|
|
59
|
+
*/
|
|
60
|
+
export declare const BUILTIN_THEMES: readonly BuiltinTheme[];
|
|
61
|
+
export declare const DEFAULT_THEME_NAME = "@cogenta/theme-canonical";
|
|
62
|
+
/** One entry of the appearance screen's theme gallery (fiche 48) — everything a card shows about a theme. */
|
|
63
|
+
export interface AvailableThemeInfo {
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly label: string;
|
|
66
|
+
/**
|
|
67
|
+
* `manifest.description`, when the theme declares one — the manifest is
|
|
68
|
+
* the source of truth (fiche 48 task 3: editing `theme.config.ts` alone
|
|
69
|
+
* changes this, no change to this file needed). Falls back to `label`
|
|
70
|
+
* for a theme that predates `theme@1.2` or simply omits `description`.
|
|
71
|
+
*/
|
|
72
|
+
readonly description: string;
|
|
73
|
+
/** `manifest.version` — the theme contract's own version, not the npm package version (two different numbers; this is the one contract D already models). */
|
|
74
|
+
readonly version: string;
|
|
75
|
+
/** `manifest.author`, or `null` for a theme that does not declare one. */
|
|
76
|
+
readonly author: string | null;
|
|
77
|
+
}
|
|
78
|
+
/** Every theme this instance can offer — what the appearance screen's picker lists. */
|
|
79
|
+
export declare function availableThemes(): Promise<readonly AvailableThemeInfo[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Resolves the active theme by name, defaulting to
|
|
82
|
+
* `@cogenta/theme-canonical` for `null`/`undefined`/an unrecognised name — a
|
|
83
|
+
* site whose stored `activeTheme` names a theme this build no longer ships
|
|
84
|
+
* (an uninstalled package, a typo restored from a backup) still serves,
|
|
85
|
+
* rather than refusing every request, which is what R1/R2's "never let an
|
|
86
|
+
* optional feature take the whole site down" spirit asks for here.
|
|
87
|
+
*
|
|
88
|
+
* Each theme's module is imported once and cached for the life of the
|
|
89
|
+
* process (Node's own ESM cache would do this anyway; the `Map` here just
|
|
90
|
+
* keys it by name instead of by specifier, and is what lets a second call
|
|
91
|
+
* with a different name resolve without waiting on the first).
|
|
92
|
+
*/
|
|
93
|
+
export declare function resolveTheme(name: string | null | undefined): Promise<ThemeModule>;
|
|
94
|
+
//# sourceMappingURL=theme-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-registry.d.ts","sourceRoot":"","sources":["../../src/commands/theme-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,gBAAgB,EACjB,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,CACnB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,cAAc;IACxB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,aAAa,KACrB,WAAW,CAAA;IAChB,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,CAAA;IAC3D;;;;;;;;;OASG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,WAAW,CAAA;CACtE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0IAA0I;IAC1I,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAA;IACzC,sKAAsK;IACtK,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;CAC1E;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EA6DjD,CAAA;AAED,eAAO,MAAM,kBAAkB,6BAA6B,CAAA;AAI5D,6GAA6G;AAC7G,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,6JAA6J;IAC7J,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAYD,uFAAuF;AACvF,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAa9E;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAgBlF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { CogentaError } from '@cogenta/core';
|
|
2
|
+
/**
|
|
3
|
+
* The theme packages this build of `@cogenta/cli` ships with — a real npm
|
|
4
|
+
* dependency of this package, never a filesystem scan: `cogenta serve` runs
|
|
5
|
+
* from a project that installed `@cogenta/cli`, and every theme it can offer
|
|
6
|
+
* has to be something that installation actually has in `node_modules`.
|
|
7
|
+
*
|
|
8
|
+
* Adding a theme package is one entry here, matched by one line in this
|
|
9
|
+
* package's own `dependencies` — the same "declare it once, the registry
|
|
10
|
+
* generalises the rest" shape `SITE_SETTINGS_REGISTRY` already uses for site
|
|
11
|
+
* settings.
|
|
12
|
+
*/
|
|
13
|
+
export const BUILTIN_THEMES = [
|
|
14
|
+
{
|
|
15
|
+
name: '@cogenta/theme-canonical',
|
|
16
|
+
label: 'Canonical',
|
|
17
|
+
load: () => import('@cogenta/theme-canonical'),
|
|
18
|
+
loadManifest: () => import('@cogenta/theme-canonical/theme.config'),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: '@cogenta/theme-ecommerce',
|
|
22
|
+
label: 'Storefront',
|
|
23
|
+
load: () => import('@cogenta/theme-ecommerce'),
|
|
24
|
+
loadManifest: () => import('@cogenta/theme-ecommerce/theme.config'),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: '@cogenta/theme-portfolio',
|
|
28
|
+
label: 'Portfolio',
|
|
29
|
+
load: () => import('@cogenta/theme-portfolio'),
|
|
30
|
+
loadManifest: () => import('@cogenta/theme-portfolio/theme.config'),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: '@cogenta/theme-entreprise',
|
|
34
|
+
label: 'Entreprise',
|
|
35
|
+
load: () => import('@cogenta/theme-entreprise'),
|
|
36
|
+
loadManifest: () => import('@cogenta/theme-entreprise/theme.config'),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: '@cogenta/theme-magazine',
|
|
40
|
+
label: 'Magazine',
|
|
41
|
+
load: () => import('@cogenta/theme-magazine'),
|
|
42
|
+
loadManifest: () => import('@cogenta/theme-magazine/theme.config'),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: '@cogenta/theme-blog',
|
|
46
|
+
label: 'Blog',
|
|
47
|
+
load: () => import('@cogenta/theme-blog'),
|
|
48
|
+
loadManifest: () => import('@cogenta/theme-blog/theme.config'),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: '@cogenta/theme-saas',
|
|
52
|
+
label: 'SaaS',
|
|
53
|
+
load: () => import('@cogenta/theme-saas'),
|
|
54
|
+
loadManifest: () => import('@cogenta/theme-saas/theme.config'),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: '@cogenta/theme-docs',
|
|
58
|
+
label: 'Documentation',
|
|
59
|
+
load: () => import('@cogenta/theme-docs'),
|
|
60
|
+
loadManifest: () => import('@cogenta/theme-docs/theme.config'),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: '@cogenta/theme-restaurant',
|
|
64
|
+
label: 'Restaurant',
|
|
65
|
+
load: () => import('@cogenta/theme-restaurant'),
|
|
66
|
+
loadManifest: () => import('@cogenta/theme-restaurant/theme.config'),
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: '@cogenta/theme-association',
|
|
70
|
+
label: 'Association',
|
|
71
|
+
load: () => import('@cogenta/theme-association'),
|
|
72
|
+
loadManifest: () => import('@cogenta/theme-association/theme.config'),
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
export const DEFAULT_THEME_NAME = '@cogenta/theme-canonical';
|
|
76
|
+
const BY_NAME = new Map(BUILTIN_THEMES.map((theme) => [theme.name, theme]));
|
|
77
|
+
const manifestCache = new Map();
|
|
78
|
+
function loadManifestOf(theme) {
|
|
79
|
+
const cached = manifestCache.get(theme.name);
|
|
80
|
+
if (cached !== undefined)
|
|
81
|
+
return cached;
|
|
82
|
+
const promise = theme.loadManifest().then((mod) => mod.default);
|
|
83
|
+
manifestCache.set(theme.name, promise);
|
|
84
|
+
return promise;
|
|
85
|
+
}
|
|
86
|
+
/** Every theme this instance can offer — what the appearance screen's picker lists. */
|
|
87
|
+
export async function availableThemes() {
|
|
88
|
+
return Promise.all(BUILTIN_THEMES.map(async (theme) => {
|
|
89
|
+
const manifest = await loadManifestOf(theme);
|
|
90
|
+
return {
|
|
91
|
+
name: theme.name,
|
|
92
|
+
label: theme.label,
|
|
93
|
+
description: manifest.description ?? theme.label,
|
|
94
|
+
version: manifest.version,
|
|
95
|
+
author: manifest.author ?? null,
|
|
96
|
+
};
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
const loaded = new Map();
|
|
100
|
+
/**
|
|
101
|
+
* Resolves the active theme by name, defaulting to
|
|
102
|
+
* `@cogenta/theme-canonical` for `null`/`undefined`/an unrecognised name — a
|
|
103
|
+
* site whose stored `activeTheme` names a theme this build no longer ships
|
|
104
|
+
* (an uninstalled package, a typo restored from a backup) still serves,
|
|
105
|
+
* rather than refusing every request, which is what R1/R2's "never let an
|
|
106
|
+
* optional feature take the whole site down" spirit asks for here.
|
|
107
|
+
*
|
|
108
|
+
* Each theme's module is imported once and cached for the life of the
|
|
109
|
+
* process (Node's own ESM cache would do this anyway; the `Map` here just
|
|
110
|
+
* keys it by name instead of by specifier, and is what lets a second call
|
|
111
|
+
* with a different name resolve without waiting on the first).
|
|
112
|
+
*/
|
|
113
|
+
export function resolveTheme(name) {
|
|
114
|
+
const theme = (name !== null && name !== undefined ? BY_NAME.get(name) : undefined) ??
|
|
115
|
+
BY_NAME.get(DEFAULT_THEME_NAME);
|
|
116
|
+
if (theme === undefined) {
|
|
117
|
+
throw new CogentaError({
|
|
118
|
+
code: 'THEME_NOT_FOUND',
|
|
119
|
+
message: 'No theme is registered, not even the built-in default.',
|
|
120
|
+
hint: 'This is a packaging error in @cogenta/cli, not a site configuration problem.',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const cached = loaded.get(theme.name);
|
|
124
|
+
if (cached !== undefined)
|
|
125
|
+
return cached;
|
|
126
|
+
const promise = theme.load();
|
|
127
|
+
loaded.set(theme.name, promise);
|
|
128
|
+
return promise;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=theme-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-registry.js","sourceRoot":"","sources":["../../src/commands/theme-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { type AccessContext, type ContentGateway } from '@cogenta/api';
|
|
1
|
+
import { type AccessContext, type ContentGateway, type MenuRouter } from '@cogenta/api';
|
|
2
|
+
import type { BlockRegistry } from '@cogenta/blocks';
|
|
2
3
|
import { type MediaAsset as RenderMediaAsset } from '@cogenta/render';
|
|
3
|
-
import { type BlockZones, type CollectionDefinition } from '@cogenta/schema';
|
|
4
|
+
import { type BlockZones, type CollectionDefinition, type ContentEntry } from '@cogenta/schema';
|
|
5
|
+
import { type ChromeLink, type PublicComment } from '@cogenta/theme-kit';
|
|
6
|
+
import type { SeoRenderDefaults } from './seo.js';
|
|
4
7
|
/**
|
|
5
8
|
* Real HTML for a matched route — the piece the lot's own gap notes named
|
|
6
9
|
* honestly ("`cogenta build`/`theme` not built yet"): until a real Astro site
|
|
@@ -50,13 +53,330 @@ export interface ThemeRenderOptions {
|
|
|
50
53
|
readonly loadMedia?: (ids: readonly string[]) => Promise<ReadonlyMap<string, RenderMediaAsset>>;
|
|
51
54
|
/** Where image variants are served from. Defaults to `/_image`. */
|
|
52
55
|
readonly imageEndpoint?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Self-hosted, cookie-free page-view analytics (`@cogenta/analytics`, L10
|
|
58
|
+
* analytics gap). The `Referer` header of *this* request — the theme's own
|
|
59
|
+
* `<script>`-free policy (see `serve.test.ts`, "no executable client
|
|
60
|
+
* JavaScript anywhere on the page") rules out reading `document.referrer`
|
|
61
|
+
* from an inline script, so the referrer this page was reached from is
|
|
62
|
+
* read server-side, from the request that is rendering it, and baked
|
|
63
|
+
* straight into a collection `<img>` pixel — no client code needed to
|
|
64
|
+
* capture it (see `analyticsBeaconTag` below).
|
|
65
|
+
*
|
|
66
|
+
* Absent entirely means the beacon is left out of the page altogether.
|
|
67
|
+
* Callers pass `{}` (no `referrer`) rather than leaving this out when there
|
|
68
|
+
* is simply no `Referer` header to report — the page builder's draft
|
|
69
|
+
* preview does that, since its request is a `POST` with no navigation
|
|
70
|
+
* referrer of its own, and doing so keeps its `<body>` byte-identical to
|
|
71
|
+
* the published page's (`serve-builder.test.ts`'s fidelity test) rather
|
|
72
|
+
* than carving out an exception that would itself become a body difference.
|
|
73
|
+
*/
|
|
74
|
+
readonly analyticsBeacon?: {
|
|
75
|
+
readonly referrer?: string | undefined;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Wires `GET /api/menus/by-location/{location}` into the render pipeline
|
|
79
|
+
* (audit follow-up to L13's menu system: the backend, API and admin were
|
|
80
|
+
* complete and tested, but no menu ever reached the public theme). Called
|
|
81
|
+
* in-process, through the very same `MenuRouter` `/api/menus/*` is mounted
|
|
82
|
+
* with — never a second lookup path.
|
|
83
|
+
*
|
|
84
|
+
* Absent means no menu lookup at all — the same empty slots as before this
|
|
85
|
+
* was wired.
|
|
86
|
+
*/
|
|
87
|
+
readonly menuRouter?: MenuRouter;
|
|
88
|
+
/**
|
|
89
|
+
* The `location` (fiche 09, task 3) whose assigned menu renders in the
|
|
90
|
+
* page header. Defaults to `DEFAULT_HEADER_MENU_LOCATION`.
|
|
91
|
+
*
|
|
92
|
+
* This is the generic half of navigation resolution: a menu is looked up
|
|
93
|
+
* by *where it is slotted*, never by a theme's own name for that slot.
|
|
94
|
+
* `theme-render.ts` itself never hardcodes a vocabulary of locations — the
|
|
95
|
+
* default here is this one stand-in theme's choice, not a rule this file
|
|
96
|
+
* enforces, so a future second theme's own `assembleSite` wiring can pass
|
|
97
|
+
* a different string (`'header-nav'`, say) through this option without
|
|
98
|
+
* touching a line of render code or migrating any data.
|
|
99
|
+
*/
|
|
100
|
+
readonly headerMenuLocation?: string;
|
|
101
|
+
/** The `location` whose assigned menu renders in the page footer. Defaults to `DEFAULT_FOOTER_MENU_LOCATION`. */
|
|
102
|
+
readonly footerMenuLocation?: string;
|
|
103
|
+
/**
|
|
104
|
+
* The block registry a stored block's type is resolved against before
|
|
105
|
+
* `theme.renderPage` renders it — `@cogenta/blocks`'s shared vocabulary by
|
|
106
|
+
* default. A site with blocks of its own (fiche 43, sous-chantier C(ii))
|
|
107
|
+
* passes its own registry here, so that an active theme not implementing
|
|
108
|
+
* one of them still renders its declared `fallback` rather than a silently
|
|
109
|
+
* blank slot. No built-in theme declares one today; this is the wiring a
|
|
110
|
+
* theme package (or a theme-shipping plugin) that does can rely on.
|
|
111
|
+
*/
|
|
112
|
+
readonly blocks?: BlockRegistry;
|
|
113
|
+
/**
|
|
114
|
+
* The path served at `/` (fiche 23 task 4) — a real, honest replacement
|
|
115
|
+
* for the `/home` fallback this file used to hardcode.
|
|
116
|
+
*
|
|
117
|
+
* Read live, not cached at startup: the whole point of storing this in the
|
|
118
|
+
* site settings database rather than the config file is "choisir une
|
|
119
|
+
* autre page d'accueil depuis l'admin, sans redéployer" (fiche 23's own
|
|
120
|
+
* acceptance test), so every request that resolves `/` asks again.
|
|
121
|
+
*
|
|
122
|
+
* Absent, or resolving to `null`/`''` (unset), falls back to the exact
|
|
123
|
+
* pre-fiche-23 behaviour: retry `/` as `/home`, the slug every blueprint
|
|
124
|
+
* seeds its home page at.
|
|
125
|
+
*/
|
|
126
|
+
readonly homePath?: () => Promise<string | null>;
|
|
127
|
+
/**
|
|
128
|
+
* The admin-editable `seo.*` site settings (fiche 21 task 3) — title
|
|
129
|
+
* templates, the default social image, and per-collection sitemap hints.
|
|
130
|
+
* Read fresh on every request, like `homePath` above, for the same reason:
|
|
131
|
+
* a title template an admin just saved must show up on the very next page
|
|
132
|
+
* view. Absent means this fiche never ran — every page renders exactly as
|
|
133
|
+
* it did before it.
|
|
134
|
+
*/
|
|
135
|
+
readonly seo?: () => Promise<SeoRenderDefaults>;
|
|
136
|
+
/**
|
|
137
|
+
* Fiche 35 task 6: a thin bar rendered for an authenticated visitor of the
|
|
138
|
+
* *public* site, linking straight back into the admin. `false`/absent by
|
|
139
|
+
* default — set only by `cogenta serve`'s plain page-GET dispatch, never
|
|
140
|
+
* by the page builder's own preview render (`renderDraftPage`): the
|
|
141
|
+
* builder's own fidelity test (`serve-builder.test.ts`) asserts its
|
|
142
|
+
* `<body>` is byte-for-byte identical to the published page's, and an
|
|
143
|
+
* authenticated preview carrying a bar the anonymous published fetch
|
|
144
|
+
* never sees would be exactly the difference that test exists to catch.
|
|
145
|
+
*
|
|
146
|
+
* Still gated a second time, inside the renderer, on the actor actually
|
|
147
|
+
* being authenticated (`context.actor.id !== null`) — an anonymous
|
|
148
|
+
* visitor never sees it and the page never carries the extra markup for
|
|
149
|
+
* one, whatever this flag says.
|
|
150
|
+
*/
|
|
151
|
+
readonly adminBar?: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* The comment thread and its submission form (fiche 15 task 6, ADR-0025).
|
|
154
|
+
* Rendered by `renderEntryPage` itself, after the page's own `<main>` —
|
|
155
|
+
* both `renderRequestedPage` (published) and `renderDraftPage` (preview)
|
|
156
|
+
* funnel through it, so the thread appears identically on both without a
|
|
157
|
+
* special case: it reads the same live, already-approved comments either
|
|
158
|
+
* way, which is exactly what keeps the L16 fidelity test's "byte for byte"
|
|
159
|
+
* claim true rather than needing an exception for this feature too.
|
|
160
|
+
*
|
|
161
|
+
* Absent means no comments section is rendered at all — the pre-fiche-15
|
|
162
|
+
* page, unchanged.
|
|
163
|
+
*/
|
|
164
|
+
readonly comments?: {
|
|
165
|
+
/** `POST` target for the form — `/api/comments` on a real server. */
|
|
166
|
+
readonly action: string;
|
|
167
|
+
/** Must match `CommentsRouterOptions.honeypotField` on the server side. Defaults to `website` on both. */
|
|
168
|
+
readonly honeypotField?: string;
|
|
169
|
+
readonly forEntry: (collection: string, entryId: string, locale: string | null) => Promise<{
|
|
170
|
+
readonly open: boolean;
|
|
171
|
+
readonly items: readonly PublicComment[];
|
|
172
|
+
}>;
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Whether/how Cogenta's own credit shows in the public footer, and its
|
|
176
|
+
* white-label override (fiche L21 task 8, ADR-0025's editorial settings).
|
|
177
|
+
*
|
|
178
|
+
* Read live per request, not cached at startup — the same reasoning as
|
|
179
|
+
* `homePath` above: the whole point of storing this in the site settings
|
|
180
|
+
* database is turning it off from the admin without a redeploy, so every
|
|
181
|
+
* rendered page asks again.
|
|
182
|
+
*
|
|
183
|
+
* Absent means the pre-task-8 behaviour: full Cogenta credit, unconditionally.
|
|
184
|
+
*/
|
|
185
|
+
readonly branding?: () => Promise<BrandingSettings>;
|
|
186
|
+
/**
|
|
187
|
+
* The name of the theme *package* to render this page with (fiche L23) —
|
|
188
|
+
* `@cogenta/theme-portfolio`, say. Read live per request, the same reasoning
|
|
189
|
+
* `branding`/`homePath` give: switching a site's theme from the appearance
|
|
190
|
+
* screen must show up on the very next page view, with no restart.
|
|
191
|
+
*
|
|
192
|
+
* Absent, or resolving to `null`, renders with `theme-registry.ts`'s
|
|
193
|
+
* `DEFAULT_THEME_NAME` (`@cogenta/theme-canonical`) — the pre-fiche-L23
|
|
194
|
+
* behaviour, unchanged for a site that has never touched this setting.
|
|
195
|
+
*/
|
|
196
|
+
readonly activeTheme?: () => Promise<string | null>;
|
|
197
|
+
/**
|
|
198
|
+
* The site's own visual identity, as the appearance screen's "Identité"
|
|
199
|
+
* card already stores it: logo, dark-scheme logo, favicon, share image
|
|
200
|
+
* (`ThemeOverridesState`, `@cogenta/schema`).
|
|
201
|
+
*
|
|
202
|
+
* Every one of those four settings was writable, saved, and read back by
|
|
203
|
+
* the admin — and read by nothing else at all. This option is what finally
|
|
204
|
+
* makes them reach a rendered page (audit 2026-09-01, §7 T01).
|
|
205
|
+
*
|
|
206
|
+
* Read live per request, the same reasoning `branding`/`homePath` give:
|
|
207
|
+
* choosing a logo in the admin must show on the very next page view, with
|
|
208
|
+
* no restart. Absent, or resolving to all-`null`, renders exactly as
|
|
209
|
+
* before: the site name in text, and `DEFAULT_LOGO_PATH` as the favicon.
|
|
210
|
+
*/
|
|
211
|
+
readonly identity?: () => Promise<SiteIdentityMedia>;
|
|
212
|
+
/**
|
|
213
|
+
* `general.tagline`/`general.socialLinks`/`general.footerNote` (contract D
|
|
214
|
+
* `theme@1.4`, L25 D2), read live per request like `identity`/`seo` above.
|
|
215
|
+
* Absent renders exactly as a pre-1.4 site did: no tagline, no social
|
|
216
|
+
* links, no footer note, on every theme.
|
|
217
|
+
*/
|
|
218
|
+
readonly chromeExtras?: (locale: string) => Promise<ChromeExtras>;
|
|
219
|
+
/**
|
|
220
|
+
* The display name of an entry's author (`entry.createdBy`, contract A),
|
|
221
|
+
* for `PageContent.entry.author` (contract D `theme@1.4`). Absent means no
|
|
222
|
+
* author ever reaches a page — the pre-1.4 behaviour, and the honest
|
|
223
|
+
* answer for a caller with no user store wired at all (a bare test
|
|
224
|
+
* harness, `renderThemeGalleryPreview`'s synthetic page).
|
|
225
|
+
*/
|
|
226
|
+
readonly authorFor?: (userId: string) => Promise<{
|
|
227
|
+
readonly name: string;
|
|
228
|
+
} | null>;
|
|
229
|
+
/**
|
|
230
|
+
* One taxonomy term, resolved to a label and a route — the same shape
|
|
231
|
+
* `resolveMenuTerm` (`serve.ts`) already answers for a menu item pointing
|
|
232
|
+
* at a term, reused here for `PageContent.entry.terms` (contract D
|
|
233
|
+
* `theme@1.4`) rather than a second lookup. Absent means no entry ever
|
|
234
|
+
* carries `terms` — the pre-1.4 behaviour.
|
|
235
|
+
*/
|
|
236
|
+
readonly resolveTerm?: (taxonomyName: string, termId: string) => Promise<{
|
|
237
|
+
readonly label: string;
|
|
238
|
+
readonly route: string | null;
|
|
239
|
+
} | null>;
|
|
53
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* The four media ids the appearance screen's identity card stores. Ids, not
|
|
243
|
+
* URLs: resolving one to a URL means asking the media library whether it
|
|
244
|
+
* still exists and whether it is an image at all, which is a decision this
|
|
245
|
+
* renderer makes (through `loadMedia`), not one the settings row can carry.
|
|
246
|
+
*/
|
|
247
|
+
export interface SiteIdentityMedia {
|
|
248
|
+
readonly logoMediaId: string | null;
|
|
249
|
+
readonly logoDarkMediaId: string | null;
|
|
250
|
+
readonly faviconMediaId: string | null;
|
|
251
|
+
/**
|
|
252
|
+
* The default `og:image`. Deliberately *not* a second social-image
|
|
253
|
+
* mechanism beside `seo.defaultSocialImageUrl`: see `resolveIdentity` for
|
|
254
|
+
* which one wins and why.
|
|
255
|
+
*/
|
|
256
|
+
readonly shareImageMediaId: string | null;
|
|
257
|
+
}
|
|
258
|
+
/** "Nothing has ever been chosen" — the pre-T01 rendering, exactly. */
|
|
259
|
+
export declare const EMPTY_SITE_IDENTITY: SiteIdentityMedia;
|
|
260
|
+
/** `branding.showCogentaBranding` / `branding.customLogoMediaId`, resolved (fiche L21 task 8). */
|
|
261
|
+
export interface BrandingSettings {
|
|
262
|
+
readonly showCogentaBranding: boolean;
|
|
263
|
+
/** A media id, or `null` for "no white-label logo uploaded". */
|
|
264
|
+
readonly customLogoMediaId: string | null;
|
|
265
|
+
/**
|
|
266
|
+
* `@cogenta/core`'s own package version (fiche 22 tâche 8, part 4) — shown
|
|
267
|
+
* next to Cogenta's credit in the public footer, but only ever when
|
|
268
|
+
* `showCogentaBranding` is true: a white-labelled site has no reason to
|
|
269
|
+
* advertise which CMS or which version runs it. Optional so a caller that
|
|
270
|
+
* predates this field (or genuinely does not know the version) still gets
|
|
271
|
+
* the pre-task-8 footer rather than a crash.
|
|
272
|
+
*/
|
|
273
|
+
readonly cogentaVersion?: string;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* `general.tagline`/`general.socialLinks`/`general.footerNote` (contract D
|
|
277
|
+
* `theme@1.4`, L25 D2), already resolved for one locale — what
|
|
278
|
+
* `resolveChromeExtras` below folds into a `ChromeInput`.
|
|
279
|
+
*/
|
|
280
|
+
export interface ChromeExtras {
|
|
281
|
+
readonly tagline: string;
|
|
282
|
+
readonly social: readonly ChromeLink[];
|
|
283
|
+
readonly footerNote: string;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* The `location` a menu is assigned to for it to become `ChromeInput.headerAction`
|
|
287
|
+
* (contract D `theme@1.4`) — a site names its own menu at this location from
|
|
288
|
+
* the admin's menu screen, exactly the way `header-nav`/`footer-nav` already
|
|
289
|
+
* work for `headerNav`/`footerNav`.
|
|
290
|
+
*/
|
|
291
|
+
export declare const HEADER_ACTION_MENU_LOCATION = "header-action";
|
|
292
|
+
/** This stand-in theme's own default header slot — see `ThemeRenderOptions.headerMenuLocation`. */
|
|
293
|
+
export declare const DEFAULT_HEADER_MENU_LOCATION = "primary";
|
|
294
|
+
/** This stand-in theme's own default footer slot — see `ThemeRenderOptions.footerMenuLocation`. */
|
|
295
|
+
export declare const DEFAULT_FOOTER_MENU_LOCATION = "footer";
|
|
54
296
|
/**
|
|
55
297
|
* Where the served stylesheet lives. Under `/_cogenta/` for the same reason
|
|
56
298
|
* `Base.astro` puts the skin there: it is a namespace no collection route can
|
|
57
299
|
* ever claim, since every route pattern starts from a collection's own path.
|
|
58
300
|
*/
|
|
59
301
|
export declare const STYLESHEET_PATH = "/_cogenta/styles.css";
|
|
302
|
+
export declare function entryTitle(entry: ContentEntry): string;
|
|
303
|
+
/**
|
|
304
|
+
* The subset of `ThemeRenderOptions` the menu lookups actually read —
|
|
305
|
+
* narrowed so `renderPageChrome` (below) can be called from a page that has
|
|
306
|
+
* no `ThemeRenderOptions` of its own (`search-page.ts`, `forms-page.ts`)
|
|
307
|
+
* without either fabricating one or duplicating the lookup.
|
|
308
|
+
*/
|
|
309
|
+
export interface PageChromeMenus {
|
|
310
|
+
readonly menuRouter?: MenuRouter;
|
|
311
|
+
readonly headerMenuLocation?: string;
|
|
312
|
+
readonly footerMenuLocation?: string;
|
|
313
|
+
}
|
|
314
|
+
export interface PageChromeOptions {
|
|
315
|
+
readonly site: {
|
|
316
|
+
readonly name: string;
|
|
317
|
+
};
|
|
318
|
+
readonly locale: string;
|
|
319
|
+
/** The joined skin+theme stylesheet (`STYLESHEET_PATH`). `null` renders unstyled rather than refused. */
|
|
320
|
+
readonly styles: string | null;
|
|
321
|
+
/** Goes inside `<head>`, after the fixed `charset`/`viewport`/`color-scheme` meta tags — a `<title>`, `<meta name="robots">`, SEO tags, whatever the caller already built. */
|
|
322
|
+
readonly headHtml: string;
|
|
323
|
+
/** The page's own content — normally a `<main id="cg-main">…</main>`, matching the skip-link's target. */
|
|
324
|
+
readonly bodyHtml: string;
|
|
325
|
+
readonly menus?: PageChromeMenus;
|
|
326
|
+
/** Same live read `ThemeRenderOptions.branding` documents — absent means full Cogenta credit, the pre-task-8 behaviour. */
|
|
327
|
+
readonly branding?: () => Promise<BrandingSettings>;
|
|
328
|
+
/** Same live read `ThemeRenderOptions.activeTheme` documents — absent renders with `DEFAULT_THEME_NAME`. */
|
|
329
|
+
readonly activeTheme?: () => Promise<string | null>;
|
|
330
|
+
/**
|
|
331
|
+
* Same live read `ThemeRenderOptions.seo` documents (fiche 21 task 3) —
|
|
332
|
+
* only ever used here for `siteVerificationMetaTags` (fiche 50 task 2), so
|
|
333
|
+
* `/search` and `/forms/{name}` carry the same Search Console/Webmaster
|
|
334
|
+
* verification tags every entry page does. Absent renders neither tag,
|
|
335
|
+
* the pre-fiche-50 behaviour.
|
|
336
|
+
*/
|
|
337
|
+
readonly seo?: () => Promise<SeoRenderDefaults>;
|
|
338
|
+
/** Same live read `ThemeRenderOptions.identity` documents (audit T01) — absent renders the site name in text and Cogenta's default favicon. */
|
|
339
|
+
readonly identity?: () => Promise<SiteIdentityMedia>;
|
|
340
|
+
/** Same batch loader `ThemeRenderOptions.loadMedia` documents. Absent means no logo and no favicon can be resolved, so both fall back. */
|
|
341
|
+
readonly loadMedia?: (ids: readonly string[]) => Promise<ReadonlyMap<string, RenderMediaAsset>>;
|
|
342
|
+
/** Same live read `ThemeRenderOptions.chromeExtras` documents (contract D `theme@1.4`, L25 D2). Absent renders the pre-1.4 chrome. */
|
|
343
|
+
readonly chromeExtras?: (locale: string) => Promise<ChromeExtras>;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* The one page frame every public page shares: skip link, `color-scheme`
|
|
347
|
+
* meta, site header with the primary navigation, the page's own content, the
|
|
348
|
+
* footer with its own navigation.
|
|
349
|
+
*
|
|
350
|
+
* Extracted from `renderEntryPage` (below) so `/search` and `/forms/{name}`
|
|
351
|
+
* (L20 audit, points 8-9) stop hand-rolling a second, thinner `<html>` shell
|
|
352
|
+
* that carried the stylesheet link but none of the site's chrome — the two
|
|
353
|
+
* pages looked unstyled not because the stylesheet failed to load, but
|
|
354
|
+
* because the markup the stylesheet's selectors target (`.cg-site-header`,
|
|
355
|
+
* `.cg-site-footer`, the skip link) was never there. `renderEntryPage` itself
|
|
356
|
+
* is not routed through this helper: its admin bar, comments section and
|
|
357
|
+
* analytics beacon are specific to a real content entry, and duplicating
|
|
358
|
+
* `renderPageChrome`'s call there would only move the divergence risk rather
|
|
359
|
+
* than remove it.
|
|
360
|
+
*/
|
|
361
|
+
export declare function renderPageChrome(options: PageChromeOptions, context: AccessContext): Promise<string>;
|
|
362
|
+
/**
|
|
363
|
+
* Matches `pathname` against the site's real routes and fetches the one
|
|
364
|
+
* published entry there, or `null` for "no route" or "nothing published" —
|
|
365
|
+
* the two callers (`renderRequestedPage` and its own `content.byPath`) share
|
|
366
|
+
* this rather than each re-deriving the same filter from `match.params`.
|
|
367
|
+
*
|
|
368
|
+
* `/` itself matches no collection's route (every `page` pattern is
|
|
369
|
+
* `/:slug`, which needs a real segment), so `/` retries once as
|
|
370
|
+
* `homePathFor(options)` — the `reading.homePath` site setting when one is
|
|
371
|
+
* stored (fiche 23 task 4), `/home` otherwise, the slug every
|
|
372
|
+
* `create-cogenta` blueprint seeds its home page at. Not a magic redirect: a
|
|
373
|
+
* site with no page at that path still 404s honestly, exactly like every
|
|
374
|
+
* other unmatched path.
|
|
375
|
+
*/
|
|
376
|
+
export declare function resolveEntry(pathname: string, options: ThemeRenderOptions, context: AccessContext): Promise<{
|
|
377
|
+
readonly collection: CollectionDefinition;
|
|
378
|
+
readonly entry: ContentEntry;
|
|
379
|
+
} | null>;
|
|
60
380
|
/**
|
|
61
381
|
* Resolves `pathname` against the site's real routes and renders the real
|
|
62
382
|
* page, or returns `null` — never for "matched but nothing found", only for
|
|
@@ -113,4 +433,42 @@ export declare function loadSkinCss(readFile: (path: string) => Promise<string>,
|
|
|
113
433
|
* unstyled rather than refused.
|
|
114
434
|
*/
|
|
115
435
|
export declare function joinStyles(skinCss: string | null, themeCss: string | null): string | null;
|
|
436
|
+
export interface ThemeGalleryPreviewOptions {
|
|
437
|
+
readonly site: {
|
|
438
|
+
readonly name: string;
|
|
439
|
+
readonly url: string;
|
|
440
|
+
readonly locales: readonly string[];
|
|
441
|
+
readonly defaultLocale: string;
|
|
442
|
+
};
|
|
443
|
+
/**
|
|
444
|
+
* The combined skin + *this candidate theme's* stylesheet, already
|
|
445
|
+
* resolved by the caller (`serve.ts`'s `themeGalleryStyles`) — never the
|
|
446
|
+
* currently active theme's own CSS, which is what `styles`/`resolveStyles`
|
|
447
|
+
* elsewhere in this file give. Inlined into the response as a `<style>`
|
|
448
|
+
* tag rather than linked, the same reasoning `/api/theme/preview` already
|
|
449
|
+
* gives: this HTML is consumed as `srcDoc` by the admin's own iframe, not
|
|
450
|
+
* served at a real URL on the site's own origin, so a `<link
|
|
451
|
+
* rel="stylesheet">` would either resolve against the wrong origin or
|
|
452
|
+
* serve the *active* theme's sheet regardless of which candidate this is.
|
|
453
|
+
*/
|
|
454
|
+
readonly styles: string | null;
|
|
455
|
+
readonly branding?: () => Promise<BrandingSettings>;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Renders the fixed demo page above through `themeName`, resolved through
|
|
459
|
+
* the same `theme-registry.ts` every other theme lookup on this server uses.
|
|
460
|
+
* An unrecognised name is the caller's responsibility to refuse before
|
|
461
|
+
* calling this — `resolveTheme` itself falls back to the built-in default
|
|
462
|
+
* rather than throwing (see its own comment), which is the right behaviour
|
|
463
|
+
* for a live page render but not for a gallery card that claims to preview
|
|
464
|
+
* one specific theme.
|
|
465
|
+
*/
|
|
466
|
+
export declare function renderThemeGalleryPreview(themeName: string, options: ThemeGalleryPreviewOptions): Promise<string>;
|
|
467
|
+
/**
|
|
468
|
+
* The public wait page for maintenance mode (fiche 24 task 5) — deliberately
|
|
469
|
+
* theme-agnostic (no skin, no block, no `RenderContext`): a site down for
|
|
470
|
+
* maintenance may be down for exactly the reason its theme cannot render, so
|
|
471
|
+
* this page must stand on its own, unstyled beyond a few inline rules.
|
|
472
|
+
*/
|
|
473
|
+
export declare function renderMaintenancePage(siteName: string, message: string | null): string;
|
|
116
474
|
//# sourceMappingURL=theme-render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-render.d.ts","sourceRoot":"","sources":["../../src/commands/theme-render.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"theme-render.d.ts","sourceRoot":"","sources":["../../src/commands/theme-render.ts"],"names":[],"mappings":"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"}
|