@cogenta/cli 0.4.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.
Files changed (171) hide show
  1. package/CHANGELOG.md +3856 -0
  2. package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
  3. package/dist/admin-assets/assets/index-fYXyHpn8.js +1090 -0
  4. package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
  5. package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
  6. package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
  7. package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
  8. package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
  9. package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
  10. package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
  11. package/dist/admin-assets/branding/logo-cogenta.png +0 -0
  12. package/dist/admin-assets/favicon.png +0 -0
  13. package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
  14. package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
  15. package/dist/admin-assets/index.html +3 -2
  16. package/dist/bin.js +6 -0
  17. package/dist/bin.js.map +1 -1
  18. package/dist/commands/admin-assets.d.ts +1 -0
  19. package/dist/commands/admin-assets.d.ts.map +1 -1
  20. package/dist/commands/admin-assets.js +19 -1
  21. package/dist/commands/admin-assets.js.map +1 -1
  22. package/dist/commands/agent-runtime.d.ts +151 -0
  23. package/dist/commands/agent-runtime.d.ts.map +1 -0
  24. package/dist/commands/agent-runtime.js +519 -0
  25. package/dist/commands/agent-runtime.js.map +1 -0
  26. package/dist/commands/assistant.d.ts +89 -3
  27. package/dist/commands/assistant.d.ts.map +1 -1
  28. package/dist/commands/assistant.js +206 -39
  29. package/dist/commands/assistant.js.map +1 -1
  30. package/dist/commands/audit-integrity-alert.d.ts +23 -0
  31. package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
  32. package/dist/commands/audit-integrity-alert.js +33 -0
  33. package/dist/commands/audit-integrity-alert.js.map +1 -0
  34. package/dist/commands/backup.d.ts +78 -0
  35. package/dist/commands/backup.d.ts.map +1 -0
  36. package/dist/commands/backup.js +238 -0
  37. package/dist/commands/backup.js.map +1 -0
  38. package/dist/commands/channels.d.ts +47 -0
  39. package/dist/commands/channels.d.ts.map +1 -0
  40. package/dist/commands/channels.js +277 -0
  41. package/dist/commands/channels.js.map +1 -0
  42. package/dist/commands/default-logo.d.ts +27 -0
  43. package/dist/commands/default-logo.d.ts.map +1 -0
  44. package/dist/commands/default-logo.js +30 -0
  45. package/dist/commands/default-logo.js.map +1 -0
  46. package/dist/commands/doctor.d.ts +5 -1
  47. package/dist/commands/doctor.d.ts.map +1 -1
  48. package/dist/commands/doctor.js +74 -2
  49. package/dist/commands/doctor.js.map +1 -1
  50. package/dist/commands/export.d.ts +22 -0
  51. package/dist/commands/export.d.ts.map +1 -0
  52. package/dist/commands/export.js +182 -0
  53. package/dist/commands/export.js.map +1 -0
  54. package/dist/commands/forms-page.d.ts +75 -0
  55. package/dist/commands/forms-page.d.ts.map +1 -0
  56. package/dist/commands/forms-page.js +191 -0
  57. package/dist/commands/forms-page.js.map +1 -0
  58. package/dist/commands/import.d.ts.map +1 -1
  59. package/dist/commands/import.js +13 -1
  60. package/dist/commands/import.js.map +1 -1
  61. package/dist/commands/mcp.d.ts +35 -0
  62. package/dist/commands/mcp.d.ts.map +1 -0
  63. package/dist/commands/mcp.js +277 -0
  64. package/dist/commands/mcp.js.map +1 -0
  65. package/dist/commands/roles.d.ts +22 -0
  66. package/dist/commands/roles.d.ts.map +1 -0
  67. package/dist/commands/roles.js +79 -0
  68. package/dist/commands/roles.js.map +1 -0
  69. package/dist/commands/search-page.d.ts +15 -0
  70. package/dist/commands/search-page.d.ts.map +1 -1
  71. package/dist/commands/search-page.js +22 -16
  72. package/dist/commands/search-page.js.map +1 -1
  73. package/dist/commands/seo.d.ts +92 -4
  74. package/dist/commands/seo.d.ts.map +1 -1
  75. package/dist/commands/seo.js +168 -4
  76. package/dist/commands/seo.js.map +1 -1
  77. package/dist/commands/serve.d.ts +439 -7
  78. package/dist/commands/serve.d.ts.map +1 -1
  79. package/dist/commands/serve.js +3498 -181
  80. package/dist/commands/serve.js.map +1 -1
  81. package/dist/commands/site-plan.d.ts +27 -1
  82. package/dist/commands/site-plan.d.ts.map +1 -1
  83. package/dist/commands/site-plan.js +71 -4
  84. package/dist/commands/site-plan.js.map +1 -1
  85. package/dist/commands/term-archive-page.d.ts +94 -0
  86. package/dist/commands/term-archive-page.d.ts.map +1 -0
  87. package/dist/commands/term-archive-page.js +195 -0
  88. package/dist/commands/term-archive-page.js.map +1 -0
  89. package/dist/commands/theme-css.d.ts +22 -7
  90. package/dist/commands/theme-css.d.ts.map +1 -1
  91. package/dist/commands/theme-css.js +33 -8
  92. package/dist/commands/theme-css.js.map +1 -1
  93. package/dist/commands/theme-registry.d.ts +94 -0
  94. package/dist/commands/theme-registry.d.ts.map +1 -0
  95. package/dist/commands/theme-registry.js +130 -0
  96. package/dist/commands/theme-registry.js.map +1 -0
  97. package/dist/commands/theme-render.d.ts +330 -9
  98. package/dist/commands/theme-render.d.ts.map +1 -1
  99. package/dist/commands/theme-render.js +932 -66
  100. package/dist/commands/theme-render.js.map +1 -1
  101. package/dist/commands/theme-wiring.d.ts +107 -0
  102. package/dist/commands/theme-wiring.d.ts.map +1 -0
  103. package/dist/commands/theme-wiring.js +295 -0
  104. package/dist/commands/theme-wiring.js.map +1 -0
  105. package/dist/commands/tools.d.ts +71 -0
  106. package/dist/commands/tools.d.ts.map +1 -0
  107. package/dist/commands/tools.js +330 -0
  108. package/dist/commands/tools.js.map +1 -0
  109. package/dist/commands/update.d.ts +25 -0
  110. package/dist/commands/update.d.ts.map +1 -0
  111. package/dist/commands/update.js +193 -0
  112. package/dist/commands/update.js.map +1 -0
  113. package/dist/index.d.ts +15 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +146 -4
  116. package/dist/index.js.map +1 -1
  117. package/dist/invite-mail.d.ts +39 -0
  118. package/dist/invite-mail.d.ts.map +1 -0
  119. package/dist/invite-mail.js +39 -0
  120. package/dist/invite-mail.js.map +1 -0
  121. package/dist/update/apply.d.ts +54 -0
  122. package/dist/update/apply.d.ts.map +1 -0
  123. package/dist/update/apply.js +77 -0
  124. package/dist/update/apply.js.map +1 -0
  125. package/dist/update/changelog-risk.d.ts +20 -0
  126. package/dist/update/changelog-risk.d.ts.map +1 -0
  127. package/dist/update/changelog-risk.js +55 -0
  128. package/dist/update/changelog-risk.js.map +1 -0
  129. package/dist/update/check.d.ts +60 -0
  130. package/dist/update/check.d.ts.map +1 -0
  131. package/dist/update/check.js +56 -0
  132. package/dist/update/check.js.map +1 -0
  133. package/dist/update/contract-risk.d.ts +55 -0
  134. package/dist/update/contract-risk.d.ts.map +1 -0
  135. package/dist/update/contract-risk.js +75 -0
  136. package/dist/update/contract-risk.js.map +1 -0
  137. package/dist/update/history.d.ts +30 -0
  138. package/dist/update/history.d.ts.map +1 -0
  139. package/dist/update/history.js +38 -0
  140. package/dist/update/history.js.map +1 -0
  141. package/dist/update/index.d.ts +28 -0
  142. package/dist/update/index.d.ts.map +1 -0
  143. package/dist/update/index.js +11 -0
  144. package/dist/update/index.js.map +1 -0
  145. package/dist/update/list-restore-points.d.ts +20 -0
  146. package/dist/update/list-restore-points.d.ts.map +1 -0
  147. package/dist/update/list-restore-points.js +35 -0
  148. package/dist/update/list-restore-points.js.map +1 -0
  149. package/dist/update/npm-registry.d.ts +11 -0
  150. package/dist/update/npm-registry.d.ts.map +1 -0
  151. package/dist/update/npm-registry.js +74 -0
  152. package/dist/update/npm-registry.js.map +1 -0
  153. package/dist/update/restore-point.d.ts +26 -0
  154. package/dist/update/restore-point.d.ts.map +1 -0
  155. package/dist/update/restore-point.js +23 -0
  156. package/dist/update/restore-point.js.map +1 -0
  157. package/dist/update/tar.d.ts +27 -0
  158. package/dist/update/tar.d.ts.map +1 -0
  159. package/dist/update/tar.js +56 -0
  160. package/dist/update/tar.js.map +1 -0
  161. package/dist/update/version-compare.d.ts +17 -0
  162. package/dist/update/version-compare.d.ts.map +1 -0
  163. package/dist/update/version-compare.js +42 -0
  164. package/dist/update/version-compare.js.map +1 -0
  165. package/dist/version.d.ts +13 -0
  166. package/dist/version.d.ts.map +1 -0
  167. package/dist/version.js +18 -0
  168. package/dist/version.js.map +1 -0
  169. package/package.json +33 -16
  170. package/dist/admin-assets/assets/index-C9a7O_Xs.css +0 -1
  171. package/dist/admin-assets/assets/index-DXvMgWvn.js +0 -74
@@ -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
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
@@ -72,28 +75,308 @@ export interface ThemeRenderOptions {
72
75
  readonly referrer?: string | undefined;
73
76
  };
74
77
  /**
75
- * Wires `GET /api/menus/by-name/{name}` into the render pipeline (audit
76
- * follow-up to L13's menu system: the backend, API and admin were complete
77
- * and tested, but no menu ever reached the public theme). Called
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
78
81
  * in-process, through the very same `MenuRouter` `/api/menus/*` is mounted
79
82
  * with — never a second lookup path.
80
83
  *
81
- * Convention (undeclared by contract A or D, since navigation is not
82
- * content): a menu named `main` renders in the header, one named `footer`
83
- * renders in the footer. A site with neither keeps today's empty slots;
84
- * one with only `main` gets no footer navigation, and so on.
85
- *
86
84
  * Absent means no menu lookup at all — the same empty slots as before this
87
85
  * was wired.
88
86
  */
89
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>;
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;
90
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";
91
296
  /**
92
297
  * Where the served stylesheet lives. Under `/_cogenta/` for the same reason
93
298
  * `Base.astro` puts the skin there: it is a namespace no collection route can
94
299
  * ever claim, since every route pattern starts from a collection's own path.
95
300
  */
96
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>;
97
380
  /**
98
381
  * Resolves `pathname` against the site's real routes and renders the real
99
382
  * page, or returns `null` — never for "matched but nothing found", only for
@@ -150,4 +433,42 @@ export declare function loadSkinCss(readFile: (path: string) => Promise<string>,
150
433
  * unstyled rather than refused.
151
434
  */
152
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;
153
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,EAGnB,KAAK,UAAU,EAEhB,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAiB,KAAK,UAAU,IAAI,gBAAgB,EAAc,MAAM,iBAAiB,CAAA;AAChG,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,oBAAoB,EAG1B,MAAM,iBAAiB,CAAA;AAqExB;;;;;;;;;;;GAWG;AAEH,gGAAgG;AAChG,eAAO,MAAM,sBAAsB,YAAY,CAAA;AAE/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAA;IACrD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;QACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAC/B,CAAA;IACD;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAC/F,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;IACrE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,yBAAyB,CAAA;AA2LrD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACpD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BxB;AAqQD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC3C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAMzF"}
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,EAGnB,KAAK,UAAU,EAEhB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,iBAAiB,CAAA;AAEvF,OAAO,EAAiB,KAAK,UAAU,IAAI,gBAAgB,EAAc,MAAM,iBAAiB,CAAA;AAChG,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAGL,KAAK,UAAU,EAef,KAAK,aAAa,EAQnB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAuDjD;;;;;;;;;;;GAWG;AAEH,gGAAgG;AAChG,eAAO,MAAM,sBAAsB,YAAY,CAAA;AAE/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAA;IACrD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;QACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAC/B,CAAA;IACD;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAC/F,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;IACrE;;;;;;;;;OASG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,iHAAiH;IACjH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAA;IAC/B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAChD;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC/C;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,qEAAqE;QACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,0GAA0G;QAC1G,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;QAC/B,QAAQ,CAAC,QAAQ,EAAE,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,KAClB,OAAO,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;SAAE,CAAC,CAAA;KACnF,CAAA;IACD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACnD;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACnD;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACpD;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IACjE;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IAClF;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;CAC/E;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1C;AAED,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAE,iBAKjC,CAAA;AAkJD,kGAAkG;AAClG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,gEAAgE;IAChE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAiBD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAYD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,kBAAkB,CAAA;AA0F1D,mGAAmG;AACnG,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,mGAAmG;AACnG,eAAO,MAAM,4BAA4B,WAAW,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,eAAe,yBAAyB,CAAA;AAsGrD,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAMtD;AA6HD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,yGAAyG;IACzG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,8KAA8K;IAC9K,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,0GAA0G;IAC1G,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,2HAA2H;IAC3H,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACnD,4GAA4G;IAC5G,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC/C,+IAA+I;IAC/I,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACpD,0IAA0I;IAC1I,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAC/F,sIAAsI;IACtI,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;CAClE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CAwEjB;AA6ED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC;IAAE,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAAC,CAiC7F;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACpD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BxB;AAkfD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC3C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAMzF;AAkJD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;QACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAC/B,CAAA;IACD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CA6EjB;AAUD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAiBtF"}