@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.
- 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/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 +439 -7
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +3498 -181
- 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 +330 -9
- package/dist/commands/theme-render.d.ts.map +1 -1
- package/dist/commands/theme-render.js +932 -66
- 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/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/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 -16
- package/dist/admin-assets/assets/index-C9a7O_Xs.css +0 -1
- package/dist/admin-assets/assets/index-DXvMgWvn.js +0 -74
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { writeFile } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { createAnthropicClient, createFileSitePlanStore, createGoogleClient, createOpenAiClient, extractDocumentText, proposeSitePlan, resolveApprovedPlan, summarisePlan, } from '@cogenta/agents';
|
|
3
|
+
import { createAnthropicClient, createFileSitePlanStore, createGoogleClient, createOpenAiClient, describeExistingSite, extractDocumentText, proposeSitePlan, resolveApprovedPlan, summarisePlan, } from '@cogenta/agents';
|
|
4
4
|
import { CogentaError } from '@cogenta/core';
|
|
5
|
-
import { createContentStore, createSchemaTables } from '@cogenta/schema';
|
|
5
|
+
import { createContentStore, createSchemaTables, createTaxonomyStore, createThemeStore, ensureThemeTable, } from '@cogenta/schema';
|
|
6
6
|
import { findSchemaFile } from './serve.js';
|
|
7
|
+
import { DEFAULT_THEME_NAME } from './theme-registry.js';
|
|
7
8
|
/**
|
|
8
9
|
* L19 task 7 — the same document-driven planning the installer offers, on a
|
|
9
10
|
* site that is already running.
|
|
@@ -38,18 +39,76 @@ function providerClient(llm, apiKey) {
|
|
|
38
39
|
return createGoogleClient(config);
|
|
39
40
|
return undefined;
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Fiche 60 task 2 — detected by config presence alone, never guessed: a
|
|
44
|
+
* section absent from `CogentaConfig` (R2's own vocabulary — "sans
|
|
45
|
+
* fournisseur configuré") is simply not listed here, rather than inferred
|
|
46
|
+
* from some other signal.
|
|
47
|
+
*/
|
|
48
|
+
export function detectActiveIntegrations(config) {
|
|
49
|
+
const active = [];
|
|
50
|
+
if (config.llm !== undefined)
|
|
51
|
+
active.push('llm');
|
|
52
|
+
if (config.imageGeneration !== undefined)
|
|
53
|
+
active.push('image generation');
|
|
54
|
+
if (config.billing !== undefined)
|
|
55
|
+
active.push('billing');
|
|
56
|
+
if (config.webhooks.endpoints.length > 0)
|
|
57
|
+
active.push('webhooks');
|
|
58
|
+
if (config.payment.stripeSecretKey !== undefined)
|
|
59
|
+
active.push('stripe payments');
|
|
60
|
+
return active;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Fiche 60 task 6 — read fresh on every call, never cached across the
|
|
64
|
+
* process's lifetime (same discipline `theme-wiring.ts`'s own
|
|
65
|
+
* `computeEffectiveStyles` documents for the theme overlay): a proposal made
|
|
66
|
+
* an hour into a running `cogenta serve` has to see the entries and terms
|
|
67
|
+
* written since boot, not the count at start-up.
|
|
68
|
+
*/
|
|
69
|
+
export async function buildExistingSiteSnapshot(context) {
|
|
70
|
+
const entryCounts = {};
|
|
71
|
+
for (const collection of context.collections) {
|
|
72
|
+
const store = createContentStore({
|
|
73
|
+
db: context.db,
|
|
74
|
+
collection,
|
|
75
|
+
defaultLocale: context.defaultLocale,
|
|
76
|
+
});
|
|
77
|
+
const counts = await store.count();
|
|
78
|
+
entryCounts[collection.name] = { total: counts.total, published: counts.published };
|
|
79
|
+
}
|
|
80
|
+
const termCounts = {};
|
|
81
|
+
for (const taxonomy of context.taxonomies) {
|
|
82
|
+
const store = createTaxonomyStore({ db: context.db, taxonomy });
|
|
83
|
+
termCounts[taxonomy.name] = (await store.list()).length;
|
|
84
|
+
}
|
|
85
|
+
// Idempotent (`create table if not exists`) — safe even when
|
|
86
|
+
// `createThemeWiring` already ran this earlier in the same boot.
|
|
87
|
+
await ensureThemeTable(context.db);
|
|
88
|
+
const theme = await createThemeStore({ db: context.db }).get();
|
|
89
|
+
return describeExistingSite({
|
|
90
|
+
collections: context.collections,
|
|
91
|
+
taxonomies: context.taxonomies,
|
|
92
|
+
entryCounts,
|
|
93
|
+
termCounts,
|
|
94
|
+
activeTheme: theme.activeTheme ?? DEFAULT_THEME_NAME,
|
|
95
|
+
integrations: detectActiveIntegrations(context.config),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function createPlanner(client, model, siteName, siteContext) {
|
|
42
99
|
return {
|
|
43
100
|
async propose(input) {
|
|
44
101
|
const documents = input.documents.map((document) => extractDocumentText({
|
|
45
102
|
filename: document.filename,
|
|
46
103
|
bytes: Buffer.from(document.contentBase64, 'base64'),
|
|
47
104
|
}));
|
|
105
|
+
const existingSite = await buildExistingSiteSnapshot(siteContext);
|
|
48
106
|
const result = await proposeSitePlan({
|
|
49
107
|
client,
|
|
50
108
|
model,
|
|
51
109
|
documents,
|
|
52
110
|
siteName: input.siteName ?? siteName,
|
|
111
|
+
existingSite,
|
|
53
112
|
});
|
|
54
113
|
return result.ok
|
|
55
114
|
? { ok: true, draft: result.draft }
|
|
@@ -215,7 +274,15 @@ export async function createSitePlanning(options) {
|
|
|
215
274
|
store,
|
|
216
275
|
...(client === undefined || llm === undefined
|
|
217
276
|
? {}
|
|
218
|
-
: {
|
|
277
|
+
: {
|
|
278
|
+
planner: createPlanner(client, llm.model, options.config.site.name, {
|
|
279
|
+
db: options.db,
|
|
280
|
+
collections: options.collections,
|
|
281
|
+
taxonomies: options.taxonomies ?? [],
|
|
282
|
+
defaultLocale: options.config.site.defaultLocale,
|
|
283
|
+
config: options.config,
|
|
284
|
+
}),
|
|
285
|
+
}),
|
|
219
286
|
...(schemaPath === undefined
|
|
220
287
|
? {}
|
|
221
288
|
: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-plan.js","sourceRoot":"","sources":["../../src/commands/site-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAEL,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EAEnB,eAAe,EACf,mBAAmB,EAEnB,aAAa,GACd,MAAM,iBAAiB,CAAA;AAOxB,OAAO,EAAsB,YAAY,EAAoC,MAAM,eAAe,CAAA;AAClG,OAAO,
|
|
1
|
+
{"version":3,"file":"site-plan.js","sourceRoot":"","sources":["../../src/commands/site-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { AccessContext, ContentGateway } from '@cogenta/api';
|
|
2
|
+
import type { MediaAsset } from '@cogenta/render';
|
|
3
|
+
import { type CollectionDefinition } from '@cogenta/schema';
|
|
4
|
+
import { type TermArchiveLabels } from '@cogenta/theme-kit';
|
|
5
|
+
import type { SeoRenderDefaults } from './seo.js';
|
|
6
|
+
import type { BrandingSettings } from './theme-render.js';
|
|
7
|
+
import { type PageChromeMenus, type SiteIdentityMedia } from './theme-render.js';
|
|
8
|
+
/**
|
|
9
|
+
* `GET /{taxonomy}/{term-slug}` — the public archive page of one taxonomy
|
|
10
|
+
* term (audit 2026-09-01, 04-taxonomies-menus.md T01).
|
|
11
|
+
*
|
|
12
|
+
* ADR-0022 shipped native taxonomies, the admin has let an editor point a
|
|
13
|
+
* menu item at a term ever since, and `resolveMenuTerm` answered `route:
|
|
14
|
+
* null` for every one of them — with a comment saying, honestly, that no
|
|
15
|
+
* site rendered such a page yet. Until this file, a term was a filing
|
|
16
|
+
* cabinet with no door.
|
|
17
|
+
*
|
|
18
|
+
* **The URL pattern is resolved here, in the host, and nowhere else.** A
|
|
19
|
+
* taxonomy has no `routing` in ADR-0022, and giving it one would be a
|
|
20
|
+
* contract A change for a feature that does not need it — exactly the same
|
|
21
|
+
* reasoning that keeps `/search` a route rather than a collection. So the
|
|
22
|
+
* pattern is fixed (`/{taxonomy name}/{term slug}`) and it is tried only
|
|
23
|
+
* *after* every real collection route has failed to match, which is what
|
|
24
|
+
* makes a collision with a `/blog/:slug` route impossible by construction
|
|
25
|
+
* rather than by a rule someone has to remember.
|
|
26
|
+
*/
|
|
27
|
+
/** One page of an archive. Small on purpose: an archive is a browsing surface, not a data dump. */
|
|
28
|
+
export declare const ARCHIVE_PAGE_SIZE = 12;
|
|
29
|
+
/** What the host resolved out of the taxonomy store before any rendering happened. */
|
|
30
|
+
export interface TermArchiveResolution {
|
|
31
|
+
readonly taxonomyName: string;
|
|
32
|
+
readonly term: {
|
|
33
|
+
readonly slug: string;
|
|
34
|
+
readonly label: string;
|
|
35
|
+
};
|
|
36
|
+
/** Root-most first, down to the direct parent. */
|
|
37
|
+
readonly ancestors: readonly {
|
|
38
|
+
readonly slug: string;
|
|
39
|
+
readonly label: string;
|
|
40
|
+
}[];
|
|
41
|
+
readonly children: readonly {
|
|
42
|
+
readonly slug: string;
|
|
43
|
+
readonly label: string;
|
|
44
|
+
}[];
|
|
45
|
+
/**
|
|
46
|
+
* Every published entry filed under this term, newest first, as
|
|
47
|
+
* `(collection, id)` pairs. Ids rather than entries: each one is still read
|
|
48
|
+
* back through the permission-checked gateway below, so an entry this
|
|
49
|
+
* visitor may not see never reaches the page even though the SQL that
|
|
50
|
+
* found it knows nothing about roles (R4 — the check is the runtime's, not
|
|
51
|
+
* the query's).
|
|
52
|
+
*/
|
|
53
|
+
readonly entries: readonly {
|
|
54
|
+
readonly collection: string;
|
|
55
|
+
readonly id: string;
|
|
56
|
+
}[];
|
|
57
|
+
}
|
|
58
|
+
export interface TermArchivePageOptions {
|
|
59
|
+
readonly collections: readonly CollectionDefinition[];
|
|
60
|
+
readonly gateway: ContentGateway;
|
|
61
|
+
readonly site: {
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly url: string;
|
|
64
|
+
readonly locales: readonly string[];
|
|
65
|
+
readonly defaultLocale: string;
|
|
66
|
+
};
|
|
67
|
+
readonly styles: string | null;
|
|
68
|
+
readonly menus?: PageChromeMenus;
|
|
69
|
+
readonly branding?: () => Promise<BrandingSettings>;
|
|
70
|
+
readonly activeTheme?: () => Promise<string | null>;
|
|
71
|
+
readonly seo?: () => Promise<SeoRenderDefaults>;
|
|
72
|
+
readonly identity?: () => Promise<SiteIdentityMedia>;
|
|
73
|
+
readonly loadMedia?: (ids: readonly string[]) => Promise<ReadonlyMap<string, MediaAsset>>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The archive's own chrome strings, in the page's language.
|
|
77
|
+
*
|
|
78
|
+
* Resolved here rather than in each theme for the same reason the admin
|
|
79
|
+
* bar's are (`theme-render.ts`): this is server-rendered HTML with no React
|
|
80
|
+
* runtime near it, and five theme packages each carrying their own
|
|
81
|
+
* English-only "Previous"/"Next" is precisely the drift `@cogenta/theme-kit`
|
|
82
|
+
* exists to prevent. `fr-CA` resolves like `fr`; an unknown language gets
|
|
83
|
+
* English rather than a key or a blank.
|
|
84
|
+
*/
|
|
85
|
+
export declare function archiveLabels(locale: string): TermArchiveLabels;
|
|
86
|
+
/**
|
|
87
|
+
* Renders the archive page, or `null` when the requested page number is past
|
|
88
|
+
* the end — which the caller turns into the same 404 any other unresolvable
|
|
89
|
+
* path gets. An *empty* term is not that: it answers 200 with an empty list,
|
|
90
|
+
* because "this category exists and nothing is filed under it" is a true
|
|
91
|
+
* answer, and 404 would be a lie.
|
|
92
|
+
*/
|
|
93
|
+
export declare function renderTermArchivePage(resolution: TermArchiveResolution, page: number, options: TermArchivePageOptions, context: AccessContext): Promise<string | null>;
|
|
94
|
+
//# sourceMappingURL=term-archive-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-archive-page.d.ts","sourceRoot":"","sources":["../../src/commands/term-archive-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { buildPath } from '@cogenta/schema';
|
|
2
|
+
import { escapeHtmlAttribute, escapeHtmlText } from '@cogenta/seo';
|
|
3
|
+
import { h, serialize, } from '@cogenta/theme-kit';
|
|
4
|
+
import { resolveTheme } from './theme-registry.js';
|
|
5
|
+
import { entryTitle, renderPageChrome, } from './theme-render.js';
|
|
6
|
+
/**
|
|
7
|
+
* `GET /{taxonomy}/{term-slug}` — the public archive page of one taxonomy
|
|
8
|
+
* term (audit 2026-09-01, 04-taxonomies-menus.md T01).
|
|
9
|
+
*
|
|
10
|
+
* ADR-0022 shipped native taxonomies, the admin has let an editor point a
|
|
11
|
+
* menu item at a term ever since, and `resolveMenuTerm` answered `route:
|
|
12
|
+
* null` for every one of them — with a comment saying, honestly, that no
|
|
13
|
+
* site rendered such a page yet. Until this file, a term was a filing
|
|
14
|
+
* cabinet with no door.
|
|
15
|
+
*
|
|
16
|
+
* **The URL pattern is resolved here, in the host, and nowhere else.** A
|
|
17
|
+
* taxonomy has no `routing` in ADR-0022, and giving it one would be a
|
|
18
|
+
* contract A change for a feature that does not need it — exactly the same
|
|
19
|
+
* reasoning that keeps `/search` a route rather than a collection. So the
|
|
20
|
+
* pattern is fixed (`/{taxonomy name}/{term slug}`) and it is tried only
|
|
21
|
+
* *after* every real collection route has failed to match, which is what
|
|
22
|
+
* makes a collision with a `/blog/:slug` route impossible by construction
|
|
23
|
+
* rather than by a rule someone has to remember.
|
|
24
|
+
*/
|
|
25
|
+
/** One page of an archive. Small on purpose: an archive is a browsing surface, not a data dump. */
|
|
26
|
+
export const ARCHIVE_PAGE_SIZE = 12;
|
|
27
|
+
const LABELS = {
|
|
28
|
+
en: {
|
|
29
|
+
empty: 'Nothing is filed here yet.',
|
|
30
|
+
previous: 'Previous',
|
|
31
|
+
next: 'Next',
|
|
32
|
+
breadcrumb: 'Breadcrumb',
|
|
33
|
+
pagination: 'Pagination',
|
|
34
|
+
subterms: 'Sub-categories',
|
|
35
|
+
},
|
|
36
|
+
fr: {
|
|
37
|
+
empty: 'Rien n’est encore classé ici.',
|
|
38
|
+
previous: 'Précédent',
|
|
39
|
+
next: 'Suivant',
|
|
40
|
+
breadcrumb: 'Fil d’Ariane',
|
|
41
|
+
pagination: 'Pagination',
|
|
42
|
+
subterms: 'Sous-catégories',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* The archive's own chrome strings, in the page's language.
|
|
47
|
+
*
|
|
48
|
+
* Resolved here rather than in each theme for the same reason the admin
|
|
49
|
+
* bar's are (`theme-render.ts`): this is server-rendered HTML with no React
|
|
50
|
+
* runtime near it, and five theme packages each carrying their own
|
|
51
|
+
* English-only "Previous"/"Next" is precisely the drift `@cogenta/theme-kit`
|
|
52
|
+
* exists to prevent. `fr-CA` resolves like `fr`; an unknown language gets
|
|
53
|
+
* English rather than a key or a blank.
|
|
54
|
+
*/
|
|
55
|
+
export function archiveLabels(locale) {
|
|
56
|
+
const base = locale.split('-')[0]?.toLowerCase() ?? 'en';
|
|
57
|
+
return LABELS[base] ?? LABELS.en;
|
|
58
|
+
}
|
|
59
|
+
/** The fields a summary may come from — the same list `@cogenta/seo`'s feed builder uses, so an archive and a feed describe an entry the same way. */
|
|
60
|
+
const SUMMARY_FIELDS = ['excerpt', 'description', 'summary', 'subtitle', 'teaser'];
|
|
61
|
+
function summaryOf(collection, entry) {
|
|
62
|
+
for (const candidate of SUMMARY_FIELDS) {
|
|
63
|
+
if (collection.fields[candidate] === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
const value = entry.values[candidate];
|
|
66
|
+
if (typeof value === 'string' && value.trim() !== '')
|
|
67
|
+
return value.trim();
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function hrefOf(collection, entry) {
|
|
72
|
+
if (collection.routing === undefined)
|
|
73
|
+
return null;
|
|
74
|
+
try {
|
|
75
|
+
return buildPath(collection, Object.fromEntries(Object.entries(entry.values).filter((pair) => typeof pair[1] === 'string')), entry.locale ?? undefined);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// A routed collection whose slug field is empty on this entry: listed
|
|
79
|
+
// without a link rather than with a URL that 404s. Same rule
|
|
80
|
+
// `search-page.ts` already applies.
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** `/{taxonomy}/{slug}`, and `?page=N` past the first. */
|
|
85
|
+
function archiveHref(taxonomy, slug, page) {
|
|
86
|
+
const path = `/${encodeURIComponent(taxonomy)}/${encodeURIComponent(slug)}`;
|
|
87
|
+
return page <= 1 ? path : `${path}?page=${page}`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The minimal archive the host renders for a theme that does not implement
|
|
91
|
+
* `renderTermArchive`.
|
|
92
|
+
*
|
|
93
|
+
* It uses the same `cg-main`/`cg-page__title` classes every built-in theme
|
|
94
|
+
* already styles, so it is not unstyled — but it is deliberately plain: a
|
|
95
|
+
* theme that wants an archive of its own has one extra export to write, and
|
|
96
|
+
* this exists so that not writing it never breaks a site.
|
|
97
|
+
*/
|
|
98
|
+
function fallbackArchive(input) {
|
|
99
|
+
return h('main', { class: 'cg-main cg-archive', id: 'cg-main' }, h('h1', { class: 'cg-page__title' }, input.term.label), input.entries.length === 0
|
|
100
|
+
? h('p', {}, input.labels.empty)
|
|
101
|
+
: h('ul', {}, ...input.entries.map((entry) => h('li', {}, entry.href === null ? entry.title : h('a', { href: entry.href }, entry.title)))));
|
|
102
|
+
}
|
|
103
|
+
function headFor(input, options, page) {
|
|
104
|
+
const title = `${input.term.label} — ${options.site.name}`;
|
|
105
|
+
const canonical = new URL(archiveHref(input.taxonomyName, input.term.slug, page), options.site.url).toString();
|
|
106
|
+
// Page 2 and beyond are `noindex, follow`: they are the same set of entries
|
|
107
|
+
// sliced differently, so indexing them competes with page 1 for the same
|
|
108
|
+
// query while adding nothing — and `follow` still lets a crawler reach
|
|
109
|
+
// every entry they link to, which is the whole reason they exist.
|
|
110
|
+
const robots = page > 1 ? 'noindex, follow' : 'index, follow';
|
|
111
|
+
return [
|
|
112
|
+
`<title>${escapeHtmlText(title)}</title>`,
|
|
113
|
+
`<meta name="robots" content="${robots}">`,
|
|
114
|
+
`<link rel="canonical" href="${escapeHtmlAttribute(canonical)}">`,
|
|
115
|
+
input.page.previousHref === null
|
|
116
|
+
? ''
|
|
117
|
+
: `<link rel="prev" href="${escapeHtmlAttribute(new URL(input.page.previousHref, options.site.url).toString())}">`,
|
|
118
|
+
input.page.nextHref === null
|
|
119
|
+
? ''
|
|
120
|
+
: `<link rel="next" href="${escapeHtmlAttribute(new URL(input.page.nextHref, options.site.url).toString())}">`,
|
|
121
|
+
]
|
|
122
|
+
.filter((part) => part !== '')
|
|
123
|
+
.join('\n');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Renders the archive page, or `null` when the requested page number is past
|
|
127
|
+
* the end — which the caller turns into the same 404 any other unresolvable
|
|
128
|
+
* path gets. An *empty* term is not that: it answers 200 with an empty list,
|
|
129
|
+
* because "this category exists and nothing is filed under it" is a true
|
|
130
|
+
* answer, and 404 would be a lie.
|
|
131
|
+
*/
|
|
132
|
+
export async function renderTermArchivePage(resolution, page, options, context) {
|
|
133
|
+
const totalPages = Math.max(1, Math.ceil(resolution.entries.length / ARCHIVE_PAGE_SIZE));
|
|
134
|
+
if (page < 1 || page > totalPages)
|
|
135
|
+
return null;
|
|
136
|
+
const byName = new Map(options.collections.map((collection) => [collection.name, collection]));
|
|
137
|
+
const slice = resolution.entries.slice((page - 1) * ARCHIVE_PAGE_SIZE, page * ARCHIVE_PAGE_SIZE);
|
|
138
|
+
const entries = [];
|
|
139
|
+
for (const reference of slice) {
|
|
140
|
+
const collection = byName.get(reference.collection);
|
|
141
|
+
if (collection === undefined)
|
|
142
|
+
continue;
|
|
143
|
+
// R4: the permission check is here, in the runtime, on every single
|
|
144
|
+
// entry — never a `WHERE role = …` bolted onto the query that found it.
|
|
145
|
+
const entry = await options.gateway.read(reference.collection, reference.id, context);
|
|
146
|
+
if (entry === null)
|
|
147
|
+
continue;
|
|
148
|
+
entries.push({
|
|
149
|
+
title: entryTitle(entry),
|
|
150
|
+
href: hrefOf(collection, entry),
|
|
151
|
+
summary: summaryOf(collection, entry),
|
|
152
|
+
collection: collection.name,
|
|
153
|
+
publishedAt: entry.publishedAt ?? null,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
const locale = options.site.defaultLocale;
|
|
157
|
+
const taxonomy = resolution.taxonomyName;
|
|
158
|
+
const input = {
|
|
159
|
+
taxonomyName: taxonomy,
|
|
160
|
+
term: resolution.term,
|
|
161
|
+
ancestors: resolution.ancestors.map((ancestor) => ({
|
|
162
|
+
label: ancestor.label,
|
|
163
|
+
href: archiveHref(taxonomy, ancestor.slug, 1),
|
|
164
|
+
})),
|
|
165
|
+
children: resolution.children.map((child) => ({
|
|
166
|
+
label: child.label,
|
|
167
|
+
href: archiveHref(taxonomy, child.slug, 1),
|
|
168
|
+
})),
|
|
169
|
+
entries,
|
|
170
|
+
page: {
|
|
171
|
+
current: page,
|
|
172
|
+
totalPages,
|
|
173
|
+
previousHref: page > 1 ? archiveHref(taxonomy, resolution.term.slug, page - 1) : null,
|
|
174
|
+
nextHref: page < totalPages ? archiveHref(taxonomy, resolution.term.slug, page + 1) : null,
|
|
175
|
+
},
|
|
176
|
+
locale,
|
|
177
|
+
labels: archiveLabels(locale),
|
|
178
|
+
};
|
|
179
|
+
const theme = await resolveTheme(options.activeTheme === undefined ? null : await options.activeTheme());
|
|
180
|
+
const body = serialize(theme.renderTermArchive === undefined ? fallbackArchive(input) : theme.renderTermArchive(input));
|
|
181
|
+
return renderPageChrome({
|
|
182
|
+
site: options.site,
|
|
183
|
+
locale,
|
|
184
|
+
styles: options.styles,
|
|
185
|
+
headHtml: headFor(input, options, page),
|
|
186
|
+
bodyHtml: body,
|
|
187
|
+
...(options.menus === undefined ? {} : { menus: options.menus }),
|
|
188
|
+
...(options.branding === undefined ? {} : { branding: options.branding }),
|
|
189
|
+
...(options.activeTheme === undefined ? {} : { activeTheme: options.activeTheme }),
|
|
190
|
+
...(options.seo === undefined ? {} : { seo: options.seo }),
|
|
191
|
+
...(options.identity === undefined ? {} : { identity: options.identity }),
|
|
192
|
+
...(options.loadMedia === undefined ? {} : { loadMedia: options.loadMedia }),
|
|
193
|
+
}, context);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=term-archive-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-archive-page.js","sourceRoot":"","sources":["../../src/commands/term-archive-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,17 +38,32 @@ export interface InlineImportsOptions {
|
|
|
38
38
|
* untouched for the browser to refuse or fetch as it sees fit.
|
|
39
39
|
*/
|
|
40
40
|
export declare function inlineImports(entry: URL, options: InlineImportsOptions): Promise<string>;
|
|
41
|
-
/**
|
|
42
|
-
* The whole theme stylesheet as one minified string, or `null` when the theme
|
|
43
|
-
* package cannot be resolved — a site then renders with the skin's custom
|
|
44
|
-
* properties alone rather than refusing to serve, the same degradation
|
|
45
|
-
* `loadSkinCss` already chose for a missing `theme.tokens.json`.
|
|
46
|
-
*/
|
|
47
41
|
/**
|
|
48
42
|
* FNV-1a, 32 bits. A cache key, never a security boundary — and deliberately
|
|
49
43
|
* not `node:crypto`, to match the hash `@cogenta/render` already uses for the
|
|
50
44
|
* skin sheet's ETag rather than introduce a second convention beside it.
|
|
51
45
|
*/
|
|
52
46
|
export declare function cssEtag(css: string): string;
|
|
53
|
-
|
|
47
|
+
/**
|
|
48
|
+
* The whole theme stylesheet as one minified string, or `null` when the named
|
|
49
|
+
* theme package cannot be resolved — a site then renders with the skin's
|
|
50
|
+
* custom properties alone rather than refusing to serve, the same degradation
|
|
51
|
+
* `loadSkinCss` already chose for a missing `theme.tokens.json`.
|
|
52
|
+
*
|
|
53
|
+
* Every theme package publishes its stylesheet at the same `./styles/theme.css`
|
|
54
|
+
* export subpath (contract D, mirrored by every theme package's `package.json`)
|
|
55
|
+
* so this stays a one-line lookup regardless of which theme is active — a
|
|
56
|
+
* per-theme convention, not a per-theme code branch.
|
|
57
|
+
*/
|
|
58
|
+
export declare function loadThemeCss(options: InlineImportsOptions, themeName: string): Promise<string | null>;
|
|
59
|
+
/**
|
|
60
|
+
* A theme's own stylesheet is code, not data — installing a second theme
|
|
61
|
+
* package is a redeploy, unlike the skin tokens `resolveStyles` re-reads on
|
|
62
|
+
* every request. So each theme's CSS is loaded and flattened once per name
|
|
63
|
+
* and kept for the life of the process, memoised by this factory rather than
|
|
64
|
+
* reloaded on a request that merely switched *which* already-installed theme
|
|
65
|
+
* is active — switching is still live (fiche L23): only the file I/O is not
|
|
66
|
+
* repeated for a theme this process has already read.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createThemeCssResolver(options: InlineImportsOptions): (themeName: string) => Promise<string | null>;
|
|
54
69
|
//# sourceMappingURL=theme-css.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-css.d.ts","sourceRoot":"","sources":["../../src/commands/theme-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiC7C;AAID,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB9F;AAED
|
|
1
|
+
{"version":3,"file":"theme-css.d.ts","sourceRoot":"","sources":["../../src/commands/theme-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiC7C;AAID,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB9F;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO3C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,oBAAoB,GAC5B,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/C"}
|
|
@@ -90,12 +90,6 @@ export async function inlineImports(entry, options) {
|
|
|
90
90
|
parts.push(css.slice(cursor));
|
|
91
91
|
return parts.join('\n');
|
|
92
92
|
}
|
|
93
|
-
/**
|
|
94
|
-
* The whole theme stylesheet as one minified string, or `null` when the theme
|
|
95
|
-
* package cannot be resolved — a site then renders with the skin's custom
|
|
96
|
-
* properties alone rather than refusing to serve, the same degradation
|
|
97
|
-
* `loadSkinCss` already chose for a missing `theme.tokens.json`.
|
|
98
|
-
*/
|
|
99
93
|
/**
|
|
100
94
|
* FNV-1a, 32 bits. A cache key, never a security boundary — and deliberately
|
|
101
95
|
* not `node:crypto`, to match the hash `@cogenta/render` already uses for the
|
|
@@ -109,13 +103,44 @@ export function cssEtag(css) {
|
|
|
109
103
|
}
|
|
110
104
|
return `"${value.toString(16).padStart(8, '0')}"`;
|
|
111
105
|
}
|
|
112
|
-
|
|
106
|
+
/**
|
|
107
|
+
* The whole theme stylesheet as one minified string, or `null` when the named
|
|
108
|
+
* theme package cannot be resolved — a site then renders with the skin's
|
|
109
|
+
* custom properties alone rather than refusing to serve, the same degradation
|
|
110
|
+
* `loadSkinCss` already chose for a missing `theme.tokens.json`.
|
|
111
|
+
*
|
|
112
|
+
* Every theme package publishes its stylesheet at the same `./styles/theme.css`
|
|
113
|
+
* export subpath (contract D, mirrored by every theme package's `package.json`)
|
|
114
|
+
* so this stays a one-line lookup regardless of which theme is active — a
|
|
115
|
+
* per-theme convention, not a per-theme code branch.
|
|
116
|
+
*/
|
|
117
|
+
export async function loadThemeCss(options, themeName) {
|
|
113
118
|
try {
|
|
114
|
-
const entry = new URL(import.meta.resolve(
|
|
119
|
+
const entry = new URL(import.meta.resolve(`${themeName}/styles/theme.css`));
|
|
115
120
|
return minifyCss(await inlineImports(entry, options));
|
|
116
121
|
}
|
|
117
122
|
catch {
|
|
118
123
|
return null;
|
|
119
124
|
}
|
|
120
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* A theme's own stylesheet is code, not data — installing a second theme
|
|
128
|
+
* package is a redeploy, unlike the skin tokens `resolveStyles` re-reads on
|
|
129
|
+
* every request. So each theme's CSS is loaded and flattened once per name
|
|
130
|
+
* and kept for the life of the process, memoised by this factory rather than
|
|
131
|
+
* reloaded on a request that merely switched *which* already-installed theme
|
|
132
|
+
* is active — switching is still live (fiche L23): only the file I/O is not
|
|
133
|
+
* repeated for a theme this process has already read.
|
|
134
|
+
*/
|
|
135
|
+
export function createThemeCssResolver(options) {
|
|
136
|
+
const cache = new Map();
|
|
137
|
+
return (themeName) => {
|
|
138
|
+
const cached = cache.get(themeName);
|
|
139
|
+
if (cached !== undefined)
|
|
140
|
+
return cached;
|
|
141
|
+
const promise = loadThemeCss(options, themeName);
|
|
142
|
+
cache.set(themeName, promise);
|
|
143
|
+
return promise;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
121
146
|
//# sourceMappingURL=theme-css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-css.js","sourceRoot":"","sources":["../../src/commands/theme-css.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"theme-css.js","sourceRoot":"","sources":["../../src/commands/theme-css.ts"],"names":[],"mappings":"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"}
|