@plumix/core 0.3.0 → 0.5.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/dist/auth/authenticator.d.ts +8 -1
- package/dist/auth/authenticator.d.ts.map +1 -1
- package/dist/auth/authenticator.js +15 -0
- package/dist/auth/authenticator.js.map +1 -1
- package/dist/auth/bearer.js +2 -2
- package/dist/auth/bearer.js.map +1 -1
- package/dist/auth/bootstrap.d.ts.map +1 -1
- package/dist/auth/bootstrap.js +39 -22
- package/dist/auth/bootstrap.js.map +1 -1
- package/dist/cache/decision.d.ts +7 -3
- package/dist/cache/decision.d.ts.map +1 -1
- package/dist/cache/decision.js +8 -6
- package/dist/cache/decision.js.map +1 -1
- package/dist/cache/read-through.d.ts +3 -0
- package/dist/cache/read-through.d.ts.map +1 -1
- package/dist/cache/read-through.js +14 -7
- package/dist/cache/read-through.js.map +1 -1
- package/dist/cache/tags.d.ts.map +1 -1
- package/dist/cache/tags.js +9 -0
- package/dist/cache/tags.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/context/app.d.ts +38 -6
- package/dist/context/app.d.ts.map +1 -1
- package/dist/context/app.js +41 -8
- package/dist/context/app.js.map +1 -1
- package/dist/context/collector.d.ts +9 -0
- package/dist/context/collector.d.ts.map +1 -0
- package/dist/context/collector.js +130 -0
- package/dist/context/collector.js.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -0
- package/dist/context/index.js.map +1 -1
- package/dist/context/stores.d.ts +2 -9
- package/dist/context/stores.d.ts.map +1 -1
- package/dist/context/stores.js.map +1 -1
- package/dist/context/telemetry.d.ts +148 -0
- package/dist/context/telemetry.d.ts.map +1 -0
- package/dist/context/telemetry.js +20 -0
- package/dist/context/telemetry.js.map +1 -0
- package/dist/context/traced-fetch.d.ts +14 -0
- package/dist/context/traced-fetch.d.ts.map +1 -0
- package/dist/context/traced-fetch.js +33 -0
- package/dist/context/traced-fetch.js.map +1 -0
- package/dist/db/errors.d.ts +8 -0
- package/dist/db/errors.d.ts.map +1 -1
- package/dist/db/errors.js +22 -0
- package/dist/db/errors.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/libsql.d.ts.map +1 -1
- package/dist/db/libsql.js +6 -12
- package/dist/db/libsql.js.map +1 -1
- package/dist/db/query-kind.d.ts +8 -0
- package/dist/db/query-kind.d.ts.map +1 -0
- package/dist/db/query-kind.js +11 -0
- package/dist/db/query-kind.js.map +1 -0
- package/dist/db/schema/users.d.ts +57 -0
- package/dist/db/schema/users.d.ts.map +1 -1
- package/dist/db/schema/users.js +10 -2
- package/dist/db/schema/users.js.map +1 -1
- package/dist/db/trace-libsql.d.ts +15 -0
- package/dist/db/trace-libsql.d.ts.map +1 -0
- package/dist/db/trace-libsql.js +37 -0
- package/dist/db/trace-libsql.js.map +1 -0
- package/dist/db/trace.d.ts +21 -0
- package/dist/db/trace.d.ts.map +1 -0
- package/dist/db/trace.js +64 -0
- package/dist/db/trace.js.map +1 -0
- package/dist/debug-bar/consumer.d.ts +12 -0
- package/dist/debug-bar/consumer.d.ts.map +1 -0
- package/dist/debug-bar/consumer.js +13 -0
- package/dist/debug-bar/consumer.js.map +1 -0
- package/dist/debug-bar/format-param.d.ts +6 -4
- package/dist/debug-bar/format-param.d.ts.map +1 -1
- package/dist/debug-bar/format-param.js +6 -9
- package/dist/debug-bar/format-param.js.map +1 -1
- package/dist/debug-bar/highlight-sql.d.ts +0 -3
- package/dist/debug-bar/highlight-sql.d.ts.map +1 -1
- package/dist/debug-bar/highlight-sql.js +0 -6
- package/dist/debug-bar/highlight-sql.js.map +1 -1
- package/dist/debug-bar/panels/database.d.ts +6 -4
- package/dist/debug-bar/panels/database.d.ts.map +1 -1
- package/dist/debug-bar/panels/database.js +44 -8
- package/dist/debug-bar/panels/database.js.map +1 -1
- package/dist/debug-bar/panels/template.d.ts +1 -1
- package/dist/debug-bar/panels/template.d.ts.map +1 -1
- package/dist/debug-bar/panels/template.js +16 -2
- package/dist/debug-bar/panels/template.js.map +1 -1
- package/dist/debug-bar/panels/timeline.js +1 -1
- package/dist/debug-bar/panels/timeline.js.map +1 -1
- package/dist/debug-bar/styles.d.ts.map +1 -1
- package/dist/debug-bar/styles.js +5 -0
- package/dist/debug-bar/styles.js.map +1 -1
- package/dist/debug-bar/template-node-label.d.ts.map +1 -1
- package/dist/debug-bar/template-node-label.js +8 -0
- package/dist/debug-bar/template-node-label.js.map +1 -1
- package/dist/debug-bar/timeline-model.d.ts +3 -3
- package/dist/debug-bar/timeline-model.d.ts.map +1 -1
- package/dist/debug-bar/timeline-model.js +1 -1
- package/dist/debug-bar/timeline-model.js.map +1 -1
- package/dist/debug-bar/types.d.ts +1 -1
- package/dist/hooks/registry.d.ts.map +1 -1
- package/dist/hooks/registry.js +21 -3
- package/dist/hooks/registry.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +9 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/plugin/manifest.d.ts +51 -0
- package/dist/plugin/manifest.d.ts.map +1 -1
- package/dist/plugin/manifest.js +8 -2
- package/dist/plugin/manifest.js.map +1 -1
- package/dist/plugin/provides-context.d.ts.map +1 -1
- package/dist/plugin/provides-context.js +5 -0
- package/dist/plugin/provides-context.js.map +1 -1
- package/dist/plugin/setup-context.d.ts +10 -1
- package/dist/plugin/setup-context.d.ts.map +1 -1
- package/dist/plugin/setup-context.js +12 -0
- package/dist/plugin/setup-context.js.map +1 -1
- package/dist/rest/build-handler.d.ts.map +1 -1
- package/dist/rest/build-handler.js +14 -1
- package/dist/rest/build-handler.js.map +1 -1
- package/dist/revisions/snapshot-envelope.d.ts +4 -2
- package/dist/revisions/snapshot-envelope.d.ts.map +1 -1
- package/dist/revisions/snapshot-envelope.js +6 -3
- package/dist/revisions/snapshot-envelope.js.map +1 -1
- package/dist/route/compile.d.ts +21 -0
- package/dist/route/compile.d.ts.map +1 -1
- package/dist/route/compile.js +63 -1
- package/dist/route/compile.js.map +1 -1
- package/dist/route/current.d.ts +5 -3
- package/dist/route/current.d.ts.map +1 -1
- package/dist/route/date-range.d.ts +12 -0
- package/dist/route/date-range.d.ts.map +1 -0
- package/dist/route/date-range.js +39 -0
- package/dist/route/date-range.js.map +1 -0
- package/dist/route/intent.d.ts +7 -3
- package/dist/route/intent.d.ts.map +1 -1
- package/dist/route/match.d.ts +1 -0
- package/dist/route/match.d.ts.map +1 -1
- package/dist/route/match.js +1 -1
- package/dist/route/match.js.map +1 -1
- package/dist/route/render/build-resolved-entries.d.ts.map +1 -1
- package/dist/route/render/build-resolved-entries.js +6 -1
- package/dist/route/render/build-resolved-entries.js.map +1 -1
- package/dist/route/render/render-template.d.ts.map +1 -1
- package/dist/route/render/render-template.js +23 -14
- package/dist/route/render/render-template.js.map +1 -1
- package/dist/route/render/resolved-entry.d.ts +36 -0
- package/dist/route/render/resolved-entry.d.ts.map +1 -1
- package/dist/route/render/template-builders.d.ts +66 -2
- package/dist/route/render/template-builders.d.ts.map +1 -1
- package/dist/route/render/template-builders.js +83 -4
- package/dist/route/render/template-builders.js.map +1 -1
- package/dist/route/render/template-hierarchy.d.ts +17 -1
- package/dist/route/render/template-hierarchy.d.ts.map +1 -1
- package/dist/route/render/template-hierarchy.js +23 -0
- package/dist/route/render/template-hierarchy.js.map +1 -1
- package/dist/route/resolve.d.ts +3 -1
- package/dist/route/resolve.d.ts.map +1 -1
- package/dist/route/resolve.js +152 -5
- package/dist/route/resolve.js.map +1 -1
- package/dist/rpc/authenticated.d.ts.map +1 -1
- package/dist/rpc/authenticated.js +2 -1
- package/dist/rpc/authenticated.js.map +1 -1
- package/dist/rpc/build-handler.d.ts.map +1 -1
- package/dist/rpc/build-handler.js +12 -0
- package/dist/rpc/build-handler.js.map +1 -1
- package/dist/rpc/procedures/auth/session.d.ts.map +1 -1
- package/dist/rpc/procedures/auth/session.js +2 -1
- package/dist/rpc/procedures/auth/session.js.map +1 -1
- package/dist/rpc/procedures/entry/create.d.ts +2 -2
- package/dist/rpc/procedures/entry/delete-permanent.d.ts +2 -2
- package/dist/rpc/procedures/entry/duplicate.d.ts +2 -2
- package/dist/rpc/procedures/entry/get.d.ts +2 -2
- package/dist/rpc/procedures/entry/helpers.d.ts +21 -0
- package/dist/rpc/procedures/entry/helpers.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/helpers.js +44 -0
- package/dist/rpc/procedures/entry/helpers.js.map +1 -1
- package/dist/rpc/procedures/entry/index.d.ts +23 -22
- package/dist/rpc/procedures/entry/index.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/list.d.ts +2 -2
- package/dist/rpc/procedures/entry/publish.d.ts +2 -2
- package/dist/rpc/procedures/entry/restore.d.ts +2 -2
- package/dist/rpc/procedures/entry/revisions.d.ts +8 -8
- package/dist/rpc/procedures/entry/schemas.d.ts +2 -0
- package/dist/rpc/procedures/entry/schemas.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/schemas.js +7 -0
- package/dist/rpc/procedures/entry/schemas.js.map +1 -1
- package/dist/rpc/procedures/entry/trash.d.ts +2 -2
- package/dist/rpc/procedures/entry/update.d.ts +3 -2
- package/dist/rpc/procedures/entry/update.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/update.js +10 -5
- package/dist/rpc/procedures/entry/update.js.map +1 -1
- package/dist/rpc/procedures/term/create.d.ts +2 -2
- package/dist/rpc/procedures/term/delete.d.ts +2 -2
- package/dist/rpc/procedures/term/get.d.ts +2 -2
- package/dist/rpc/procedures/term/index.d.ts +10 -10
- package/dist/rpc/procedures/term/list.d.ts +2 -2
- package/dist/rpc/procedures/term/update.d.ts +2 -2
- package/dist/rpc/procedures/user/delete.d.ts +2 -0
- package/dist/rpc/procedures/user/delete.d.ts.map +1 -1
- package/dist/rpc/procedures/user/disable.d.ts +2 -0
- package/dist/rpc/procedures/user/disable.d.ts.map +1 -1
- package/dist/rpc/procedures/user/enable.d.ts +2 -0
- package/dist/rpc/procedures/user/enable.d.ts.map +1 -1
- package/dist/rpc/procedures/user/get.d.ts +2 -0
- package/dist/rpc/procedures/user/get.d.ts.map +1 -1
- package/dist/rpc/procedures/user/index.d.ts +13 -0
- package/dist/rpc/procedures/user/index.d.ts.map +1 -1
- package/dist/rpc/procedures/user/invite.d.ts.map +1 -1
- package/dist/rpc/procedures/user/invite.js +28 -15
- package/dist/rpc/procedures/user/invite.js.map +1 -1
- package/dist/rpc/procedures/user/list.d.ts +2 -0
- package/dist/rpc/procedures/user/list.d.ts.map +1 -1
- package/dist/rpc/procedures/user/list.js +1 -0
- package/dist/rpc/procedures/user/list.js.map +1 -1
- package/dist/rpc/procedures/user/schemas.d.ts +1 -0
- package/dist/rpc/procedures/user/schemas.d.ts.map +1 -1
- package/dist/rpc/procedures/user/schemas.js +5 -0
- package/dist/rpc/procedures/user/schemas.js.map +1 -1
- package/dist/rpc/procedures/user/update.d.ts +3 -0
- package/dist/rpc/procedures/user/update.d.ts.map +1 -1
- package/dist/rpc/procedures/user/update.js +10 -1
- package/dist/rpc/procedures/user/update.js.map +1 -1
- package/dist/rpc/router.d.ts +46 -32
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/schemas.js +6 -6
- package/dist/rpc/schemas.js.map +1 -1
- package/dist/rpc/validation.d.ts +10 -0
- package/dist/rpc/validation.d.ts.map +1 -1
- package/dist/rpc/validation.js +10 -0
- package/dist/rpc/validation.js.map +1 -1
- package/dist/runtime/dispatcher.d.ts.map +1 -1
- package/dist/runtime/dispatcher.js +105 -14
- package/dist/runtime/dispatcher.js.map +1 -1
- package/dist/runtime/load-user-for-public-request.d.ts.map +1 -1
- package/dist/runtime/load-user-for-public-request.js +2 -2
- package/dist/runtime/load-user-for-public-request.js.map +1 -1
- package/dist/runtime/scheduled.d.ts +3 -1
- package/dist/runtime/scheduled.d.ts.map +1 -1
- package/dist/runtime/scheduled.js +16 -2
- package/dist/runtime/scheduled.js.map +1 -1
- package/dist/runtime/telemetry-delivery.d.ts +14 -0
- package/dist/runtime/telemetry-delivery.d.ts.map +1 -0
- package/dist/runtime/telemetry-delivery.js +39 -0
- package/dist/runtime/telemetry-delivery.js.map +1 -0
- package/dist/seo/feed.d.ts +19 -4
- package/dist/seo/feed.d.ts.map +1 -1
- package/dist/seo/feed.js +49 -12
- package/dist/seo/feed.js.map +1 -1
- package/dist/seo/head-defaults.d.ts.map +1 -1
- package/dist/seo/head-defaults.js +6 -3
- package/dist/seo/head-defaults.js.map +1 -1
- package/dist/template-registry.d.ts +31 -1
- package/dist/template-registry.d.ts.map +1 -1
- package/dist/test/default-theme.d.ts.map +1 -1
- package/dist/test/default-theme.js +3 -0
- package/dist/test/default-theme.js.map +1 -1
- package/dist/test/dispatcher.d.ts +13 -0
- package/dist/test/dispatcher.d.ts.map +1 -1
- package/dist/test/dispatcher.js +9 -3
- package/dist/test/dispatcher.js.map +1 -1
- package/dist/test/factories.d.ts +39 -21
- package/dist/test/factories.d.ts.map +1 -1
- package/dist/test/factories.js +1 -0
- package/dist/test/factories.js.map +1 -1
- package/dist/test/harness.d.ts.map +1 -1
- package/dist/test/harness.js +4 -12
- package/dist/test/harness.js.map +1 -1
- package/dist/theme.d.ts +15 -7
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +9 -0
- package/dist/theme.js.map +1 -1
- package/dist/users/slug.d.ts +12 -0
- package/dist/users/slug.d.ts.map +1 -0
- package/dist/users/slug.js +32 -0
- package/dist/users/slug.js.map +1 -0
- package/package.json +2 -2
- package/dist/context/debug.d.ts +0 -25
- package/dist/context/debug.d.ts.map +0 -1
- package/dist/context/debug.js +0 -13
- package/dist/context/debug.js.map +0 -1
- package/dist/debug-bar/collector.d.ts +0 -9
- package/dist/debug-bar/collector.d.ts.map +0 -1
- package/dist/debug-bar/collector.js +0 -80
- package/dist/debug-bar/collector.js.map +0 -1
- package/dist/debug-bar/db-query.d.ts +0 -21
- package/dist/debug-bar/db-query.d.ts.map +0 -1
- package/dist/debug-bar/db-query.js +0 -23
- package/dist/debug-bar/db-query.js.map +0 -1
- package/dist/debug-bar/trace-libsql.d.ts +0 -18
- package/dist/debug-bar/trace-libsql.d.ts.map +0 -1
- package/dist/debug-bar/trace-libsql.js +0 -42
- package/dist/debug-bar/trace-libsql.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EntryProjection, EntryTypeName, MetaOf, TermProjection, TermTaxonomyName } from "../../template-registry.js";
|
|
1
|
+
import type { ArchiveDataOf, ArchiveTypeName, EntryProjection, EntryTypeName, MetaOf, TermMetaOf, TermProjection, TermTaxonomyName } from "../../template-registry.js";
|
|
2
2
|
import type { TemplateData, TemplateEntry, TemplateRule, ThemeDescriptor } from "../../theme.js";
|
|
3
|
-
import type { ArchiveData, EntryData, ErrorData, FrontPageData, SearchData, TaxonomyData } from "./resolved-entry.js";
|
|
3
|
+
import type { ArchiveData, AuthorArchiveData, DateArchiveData, EntryData, ErrorData, FrontPageData, SearchData, TaxonomyData } from "./resolved-entry.js";
|
|
4
4
|
/** Universal catch-all — matches any resolved node. */
|
|
5
5
|
export declare function fallback(template: TemplateEntry<TemplateData>): TemplateRule;
|
|
6
6
|
/** A single entry (any type). */
|
|
@@ -9,6 +9,10 @@ export declare function entry(template: TemplateEntry<EntryData>): TemplateRule;
|
|
|
9
9
|
export declare function archive(template: TemplateEntry<ArchiveData>): TemplateRule;
|
|
10
10
|
/** A term archive (any taxonomy). */
|
|
11
11
|
export declare function taxonomy(template: TemplateEntry<TaxonomyData>): TemplateRule;
|
|
12
|
+
/** An author archive (any author). */
|
|
13
|
+
export declare function author(template: TemplateEntry<AuthorArchiveData>): TemplateRule;
|
|
14
|
+
/** A date archive (any year/month/day). */
|
|
15
|
+
export declare function date(template: TemplateEntry<DateArchiveData>): TemplateRule;
|
|
12
16
|
/** The static front page. */
|
|
13
17
|
export declare function frontPage(template: TemplateEntry<FrontPageData>): TemplateRule;
|
|
14
18
|
/** Search results. */
|
|
@@ -27,6 +31,18 @@ export declare function templateRules(templates: ThemeDescriptor["templates"]):
|
|
|
27
31
|
* editor writes it, the resolver reads it. Part of the `__plumix_*` namespace.
|
|
28
32
|
*/
|
|
29
33
|
export declare const NAMED_TEMPLATE_META_KEY = "__plumix_template";
|
|
34
|
+
/** An author-selectable `named` template, surfaced to the editor picker. */
|
|
35
|
+
export interface NamedTemplateChoice {
|
|
36
|
+
readonly id: string;
|
|
37
|
+
readonly label: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Extract the theme's `named` entry templates grouped by entry-type name, for
|
|
41
|
+
* the editor's template picker. Only content (entry) rules are collected —
|
|
42
|
+
* term/author/archive named templates aren't author-selectable per entry.
|
|
43
|
+
* Duplicate ids within a type keep the first declaration (resolution order).
|
|
44
|
+
*/
|
|
45
|
+
export declare function collectNamedTemplates(templates: ThemeDescriptor["templates"]): Record<string, readonly NamedTemplateChoice[]>;
|
|
30
46
|
interface EntrySelector<K extends EntryTypeName> {
|
|
31
47
|
/** Bind the template for the selected entry. */
|
|
32
48
|
template(t: TemplateEntry<EntryData<EntryProjection<K>>>): TemplateRule;
|
|
@@ -62,11 +78,59 @@ interface TermTaxonomyBuilder<K extends TermTaxonomyName> extends TaxonomySelect
|
|
|
62
78
|
slug(slug: string): TaxonomySelector<K>;
|
|
63
79
|
/** Narrow to one term by numeric id. */
|
|
64
80
|
id(id: number): TaxonomySelector<K>;
|
|
81
|
+
/** Narrow by a term-meta value, typed against the taxonomy's meta projection. */
|
|
82
|
+
whereMeta<M extends keyof TermMetaOf<K>>(key: M, value: TermMetaOf<K>[M]): TaxonomySelector<K>;
|
|
83
|
+
/** Narrow by an arbitrary predicate over the resolved taxonomy data. */
|
|
84
|
+
where(predicate: (data: TaxonomyData<TermProjection<K>>) => boolean): TaxonomySelector<K>;
|
|
85
|
+
/** Register an author-selectable template, matched from stored term meta. */
|
|
86
|
+
named(id: string, label: string): TaxonomySelector<K>;
|
|
65
87
|
}
|
|
66
88
|
/**
|
|
67
89
|
* Target a registered taxonomy. `name` autocompletes and rejects typos; the
|
|
68
90
|
* template's `data.term` is typed from the taxonomy's term projection.
|
|
69
91
|
*/
|
|
70
92
|
export declare function forTermTaxonomy<K extends TermTaxonomyName>(name: K): TermTaxonomyBuilder<K>;
|
|
93
|
+
interface AuthorSelector {
|
|
94
|
+
/** Bind the template for the selected author. */
|
|
95
|
+
template(t: TemplateEntry<AuthorArchiveData>): TemplateRule;
|
|
96
|
+
}
|
|
97
|
+
interface AuthorBuilder extends AuthorSelector {
|
|
98
|
+
/** Narrow to one author by slug. */
|
|
99
|
+
slug(slug: string): AuthorSelector;
|
|
100
|
+
/** Narrow to one author by numeric id. */
|
|
101
|
+
id(id: number): AuthorSelector;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Target author archives. There is a single author "kind" (no registry to
|
|
105
|
+
* autocomplete), so `forAuthor()` takes no name — chain `.slug(...)` / `.id(...)`
|
|
106
|
+
* to narrow to one author, mirroring `forEntryType` / `forTermTaxonomy`. The
|
|
107
|
+
* bare `.template()` matches every author archive (like the `author()` tier).
|
|
108
|
+
*/
|
|
109
|
+
export declare function forAuthor(): AuthorBuilder;
|
|
110
|
+
interface DateSelector {
|
|
111
|
+
/** Bind the template for the selected period. */
|
|
112
|
+
template(t: TemplateEntry<DateArchiveData>): TemplateRule;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Target one date archive. Date components are hierarchical (a month has no
|
|
116
|
+
* meaning without a year), so `forDate` takes them positionally and matches the
|
|
117
|
+
* archive of that exact granularity: `forDate(2026)` → the year archive,
|
|
118
|
+
* `forDate(2026, 7)` → that month, `forDate(2026, 7, 21)` → that day. The
|
|
119
|
+
* generic `date()` tier styles every date archive.
|
|
120
|
+
*/
|
|
121
|
+
export declare function forDate(year: number): DateSelector;
|
|
122
|
+
export declare function forDate(year: number, month: number): DateSelector;
|
|
123
|
+
export declare function forDate(year: number, month: number, day: number): DateSelector;
|
|
124
|
+
interface ArchiveTypeSelector<K extends ArchiveTypeName> {
|
|
125
|
+
/** Bind the template for the selected archive type. */
|
|
126
|
+
template(t: TemplateEntry<ArchiveDataOf<K>>): TemplateRule;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Target a plugin-registered archive type (`registerArchiveType`). `name`
|
|
130
|
+
* autocompletes against `ArchiveTypeRegistry` and types the template's `data`
|
|
131
|
+
* from the registered projection — the same shape as `forEntryType` /
|
|
132
|
+
* `forTermTaxonomy`, for archives that live in a plugin rather than core.
|
|
133
|
+
*/
|
|
134
|
+
export declare function forArchiveType<K extends ArchiveTypeName>(name: K): ArchiveTypeSelector<K>;
|
|
71
135
|
export {};
|
|
72
136
|
//# sourceMappingURL=template-builders.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-builders.d.ts","sourceRoot":"","sources":["../../../src/route/render/template-builders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,MAAM,EACN,cAAc,EACd,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAGV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,aAAa,EACb,UAAU,EACV,YAAY,EACb,MAAM,qBAAqB,CAAC;AAc7B,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAE5E;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAEtE;AAED,sCAAsC;AACtC,wBAAgB,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,YAAY,CAE1E;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAE5E;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,CACvB,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,GACrC,YAAY,CAEd;AAED,sBAAsB;AACtB,wBAAgB,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,YAAY,CAExE;AAED,uBAAuB;AACvB,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAEzE;AAED,uBAAuB;AACvB,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAE5E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,GACtC,SAAS,YAAY,EAAE,CAMzB;AAiBD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"template-builders.d.ts","sourceRoot":"","sources":["../../../src/route/render/template-builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,14 @@ export function archive(template) {
|
|
|
22
22
|
export function taxonomy(template) {
|
|
23
23
|
return rule("taxonomy", template);
|
|
24
24
|
}
|
|
25
|
+
/** An author archive (any author). */
|
|
26
|
+
export function author(template) {
|
|
27
|
+
return rule("author", template);
|
|
28
|
+
}
|
|
29
|
+
/** A date archive (any year/month/day). */
|
|
30
|
+
export function date(template) {
|
|
31
|
+
return rule("date", template);
|
|
32
|
+
}
|
|
25
33
|
/** The static front page. */
|
|
26
34
|
export function frontPage(template) {
|
|
27
35
|
return rule("frontPage", template);
|
|
@@ -64,10 +72,34 @@ function matchRule(match, template) {
|
|
|
64
72
|
* editor writes it, the resolver reads it. Part of the `__plumix_*` namespace.
|
|
65
73
|
*/
|
|
66
74
|
export const NAMED_TEMPLATE_META_KEY = "__plumix_template";
|
|
75
|
+
/**
|
|
76
|
+
* Extract the theme's `named` entry templates grouped by entry-type name, for
|
|
77
|
+
* the editor's template picker. Only content (entry) rules are collected —
|
|
78
|
+
* term/author/archive named templates aren't author-selectable per entry.
|
|
79
|
+
* Duplicate ids within a type keep the first declaration (resolution order).
|
|
80
|
+
*/
|
|
81
|
+
export function collectNamedTemplates(templates) {
|
|
82
|
+
const out = {};
|
|
83
|
+
for (const rule of templateRules(templates)) {
|
|
84
|
+
const match = rule.match;
|
|
85
|
+
if (!match?.named || match.nodeKind !== "content" || !match.type)
|
|
86
|
+
continue;
|
|
87
|
+
const named = match.named;
|
|
88
|
+
const list = (out[match.type] ??= []);
|
|
89
|
+
if (list.some((c) => c.id === named.id))
|
|
90
|
+
continue;
|
|
91
|
+
list.push({ id: named.id, label: named.label });
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
67
95
|
/** A predicate matching when a content entry's meta value equals `value`. */
|
|
68
96
|
function metaEquals(key, value) {
|
|
69
97
|
return (data) => "entry" in data && data.entry.meta[key] === value;
|
|
70
98
|
}
|
|
99
|
+
/** A predicate matching when a resolved term's meta value equals `value`. */
|
|
100
|
+
function termMetaEquals(key, value) {
|
|
101
|
+
return (data) => "term" in data && data.term.meta[key] === value;
|
|
102
|
+
}
|
|
71
103
|
/**
|
|
72
104
|
* Target a registered entry type. `name` autocompletes and rejects typos
|
|
73
105
|
* (`keyof EntryTypeRegistry`); the template's `data.entry` is typed from the
|
|
@@ -100,14 +132,61 @@ export function forEntryType(name) {
|
|
|
100
132
|
* template's `data.term` is typed from the taxonomy's term projection.
|
|
101
133
|
*/
|
|
102
134
|
export function forTermTaxonomy(name) {
|
|
135
|
+
// Each selector adds its narrowing to the shared term-node prefix.
|
|
136
|
+
const term = (extra) => ({
|
|
137
|
+
template: (t) => matchRule({ nodeKind: "term", type: name, ...extra }, t),
|
|
138
|
+
});
|
|
103
139
|
return {
|
|
104
140
|
template: (t) => matchRule({ nodeKind: "term", type: name }, t),
|
|
105
|
-
slug: (slug) => ({
|
|
106
|
-
|
|
141
|
+
slug: (slug) => term({ slug }),
|
|
142
|
+
id: (id) => term({ id }),
|
|
143
|
+
whereMeta: (key, value) => term({ predicate: termMetaEquals(String(key), value) }),
|
|
144
|
+
where: (predicate) => term({
|
|
145
|
+
predicate: predicate,
|
|
107
146
|
}),
|
|
108
|
-
|
|
109
|
-
|
|
147
|
+
named: (id, label) => term({
|
|
148
|
+
named: { id, label },
|
|
149
|
+
predicate: termMetaEquals(NAMED_TEMPLATE_META_KEY, id),
|
|
110
150
|
}),
|
|
111
151
|
};
|
|
112
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Target author archives. There is a single author "kind" (no registry to
|
|
155
|
+
* autocomplete), so `forAuthor()` takes no name — chain `.slug(...)` / `.id(...)`
|
|
156
|
+
* to narrow to one author, mirroring `forEntryType` / `forTermTaxonomy`. The
|
|
157
|
+
* bare `.template()` matches every author archive (like the `author()` tier).
|
|
158
|
+
*/
|
|
159
|
+
export function forAuthor() {
|
|
160
|
+
// Each selector adds its narrowing to the shared author-node prefix.
|
|
161
|
+
const authorNode = (extra) => ({
|
|
162
|
+
template: (t) => matchRule({ nodeKind: "author", type: "author", ...extra }, t),
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
template: (t) => matchRule({ nodeKind: "author", type: "author" }, t),
|
|
166
|
+
slug: (slug) => authorNode({ slug }),
|
|
167
|
+
id: (id) => authorNode({ id }),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function forDate(year, month, day) {
|
|
171
|
+
return {
|
|
172
|
+
template: (t) => matchRule({
|
|
173
|
+
nodeKind: "date",
|
|
174
|
+
type: "date",
|
|
175
|
+
year,
|
|
176
|
+
...(month !== undefined ? { month } : {}),
|
|
177
|
+
...(day !== undefined ? { day } : {}),
|
|
178
|
+
}, t),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Target a plugin-registered archive type (`registerArchiveType`). `name`
|
|
183
|
+
* autocompletes against `ArchiveTypeRegistry` and types the template's `data`
|
|
184
|
+
* from the registered projection — the same shape as `forEntryType` /
|
|
185
|
+
* `forTermTaxonomy`, for archives that live in a plugin rather than core.
|
|
186
|
+
*/
|
|
187
|
+
export function forArchiveType(name) {
|
|
188
|
+
return {
|
|
189
|
+
template: (t) => matchRule({ nodeKind: "custom", type: name }, t),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
113
192
|
//# sourceMappingURL=template-builders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-builders.js","sourceRoot":"","sources":["../../../src/route/render/template-builders.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template-builders.js","sourceRoot":"","sources":["../../../src/route/render/template-builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,29 @@
|
|
|
8
8
|
* type + slug/id).
|
|
9
9
|
*/
|
|
10
10
|
import type { TemplateData, TemplateRule } from "../../theme.js";
|
|
11
|
-
export type ResolvedNode = ResolvedTermNode | ResolvedContentNode | ResolvedContentTypeArchive | ResolvedFrontPage | ResolvedSearch;
|
|
11
|
+
export type ResolvedNode = ResolvedTermNode | ResolvedContentNode | ResolvedContentTypeArchive | ResolvedAuthorNode | ResolvedDateNode | ResolvedCustomNode | ResolvedFrontPage | ResolvedSearch;
|
|
12
12
|
interface ResolvedTermNode {
|
|
13
13
|
readonly kind: "term";
|
|
14
14
|
readonly taxonomy: string;
|
|
15
15
|
readonly slug: string;
|
|
16
16
|
readonly databaseId: number;
|
|
17
17
|
}
|
|
18
|
+
interface ResolvedAuthorNode {
|
|
19
|
+
readonly kind: "author";
|
|
20
|
+
readonly slug: string;
|
|
21
|
+
readonly databaseId: number;
|
|
22
|
+
}
|
|
23
|
+
interface ResolvedDateNode {
|
|
24
|
+
readonly kind: "date";
|
|
25
|
+
readonly year: number;
|
|
26
|
+
readonly month: number | null;
|
|
27
|
+
readonly day: number | null;
|
|
28
|
+
}
|
|
29
|
+
interface ResolvedCustomNode {
|
|
30
|
+
readonly kind: "custom";
|
|
31
|
+
/** The registered archive-type name (`registerArchiveType`). */
|
|
32
|
+
readonly name: string;
|
|
33
|
+
}
|
|
18
34
|
interface ResolvedContentNode {
|
|
19
35
|
readonly kind: "content";
|
|
20
36
|
readonly entryType: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-hierarchy.d.ts","sourceRoot":"","sources":["../../../src/route/render/template-hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAGV,YAAY,EACZ,YAAY,EACb,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,mBAAmB,GACnB,0BAA0B,GAC1B,iBAAiB,GACjB,cAAc,CAAC;AAEnB,UAAU,gBAAgB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,0BAA0B;IAClC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"template-hierarchy.d.ts","sourceRoot":"","sources":["../../../src/route/render/template-hierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,11 @@ const GENERIC_TIER_FOR_NODE = {
|
|
|
14
14
|
content: "entry",
|
|
15
15
|
"content-type-archive": "archive",
|
|
16
16
|
term: "taxonomy",
|
|
17
|
+
author: "author",
|
|
18
|
+
date: "date",
|
|
19
|
+
// Plugin archives have no dedicated generic tier — they template via a
|
|
20
|
+
// `forArchiveType(name)` targeted rule, else the universal `fallback`.
|
|
21
|
+
custom: "fallback",
|
|
17
22
|
"front-page": "frontPage",
|
|
18
23
|
search: "search",
|
|
19
24
|
};
|
|
@@ -35,6 +40,24 @@ function matchesIdentity(match, node) {
|
|
|
35
40
|
return (match.type === node.taxonomy &&
|
|
36
41
|
(match.slug === undefined || match.slug === node.slug) &&
|
|
37
42
|
(match.id === undefined || match.id === node.databaseId));
|
|
43
|
+
case "author":
|
|
44
|
+
// Author matchers carry a fixed `type` of "author"; identity narrows by
|
|
45
|
+
// slug/id like a term.
|
|
46
|
+
return (match.type === "author" &&
|
|
47
|
+
(match.slug === undefined || match.slug === node.slug) &&
|
|
48
|
+
(match.id === undefined || match.id === node.databaseId));
|
|
49
|
+
case "date":
|
|
50
|
+
// Date matchers carry a fixed `type` of "date" and match one exact
|
|
51
|
+
// granularity: an unset component (`forDate(2026)` has no month/day)
|
|
52
|
+
// requires the node's component to be null, so a year matcher matches the
|
|
53
|
+
// year archive only, not that year's month/day archives.
|
|
54
|
+
return (match.type === "date" &&
|
|
55
|
+
match.year === node.year &&
|
|
56
|
+
(match.month ?? null) === node.month &&
|
|
57
|
+
(match.day ?? null) === node.day);
|
|
58
|
+
case "custom":
|
|
59
|
+
// A `forArchiveType(name)` matcher carries the archive-type name as `type`.
|
|
60
|
+
return match.type === node.name;
|
|
38
61
|
default:
|
|
39
62
|
return false;
|
|
40
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-hierarchy.js","sourceRoot":"","sources":["../../../src/route/render/template-hierarchy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"template-hierarchy.js","sourceRoot":"","sources":["../../../src/route/render/template-hierarchy.ts"],"names":[],"mappings":"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"}
|
package/dist/route/resolve.d.ts
CHANGED
|
@@ -3,12 +3,14 @@ import type { RegisteredTemplateDep } from "../template-deps.js";
|
|
|
3
3
|
import type { DocumentManifest, ThemeDescriptor } from "../theme.js";
|
|
4
4
|
import type { RouteMatch } from "./match.js";
|
|
5
5
|
import type { AssetManifest } from "./render/asset-manifest.js";
|
|
6
|
-
import type { ArchiveData, EntryData, FrontPageData, SearchData, TaxonomyData } from "./render/resolved-entry.js";
|
|
6
|
+
import type { ArchiveData, AuthorArchiveData, DateArchiveData, EntryData, FrontPageData, SearchData, TaxonomyData } from "./render/resolved-entry.js";
|
|
7
7
|
declare module "../hooks/types.js" {
|
|
8
8
|
interface FilterRegistry {
|
|
9
9
|
"resolve:single:data": (data: EntryData) => EntryData | Promise<EntryData>;
|
|
10
10
|
"resolve:archive:data": (data: ArchiveData) => ArchiveData | Promise<ArchiveData>;
|
|
11
11
|
"resolve:term:data": (data: TaxonomyData) => TaxonomyData | Promise<TaxonomyData>;
|
|
12
|
+
"resolve:author:data": (data: AuthorArchiveData) => AuthorArchiveData | Promise<AuthorArchiveData>;
|
|
13
|
+
"resolve:date:data": (data: DateArchiveData) => DateArchiveData | Promise<DateArchiveData>;
|
|
12
14
|
"resolve:front-page:data": (data: FrontPageData) => FrontPageData | Promise<FrontPageData>;
|
|
13
15
|
"resolve:search:data": (data: SearchData) => SearchData | Promise<SearchData>;
|
|
14
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/route/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACV,YAAY,EACb,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/route/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,aAAa,EACb,UAAU,EACV,YAAY,EACb,MAAM,4BAA4B,CAAC;AAgCpC,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,cAAc;QACtB,qBAAqB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3E,sBAAsB,EAAE,CACtB,IAAI,EAAE,WAAW,KACd,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACxC,mBAAmB,EAAE,CACnB,IAAI,EAAE,YAAY,KACf,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAC1C,qBAAqB,EAAE,CACrB,IAAI,EAAE,iBAAiB,KACpB,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpD,mBAAmB,EAAE,CACnB,IAAI,EAAE,eAAe,KAClB,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,yBAAyB,EAAE,CACzB,IAAI,EAAE,aAAa,KAChB,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAC5C,qBAAqB,EAAE,CACrB,IAAI,EAAE,UAAU,KACb,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;KACvC;CACF;AAyBD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACxD,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,QAAQ,CAAC,CA+EnB"}
|
package/dist/route/resolve.js
CHANGED
|
@@ -2,15 +2,17 @@ import { count } from "drizzle-orm";
|
|
|
2
2
|
import { expandShortcodes } from "@plumix/blocks";
|
|
3
3
|
import { verifyPreviewGrant } from "../auth/preview-token.js";
|
|
4
4
|
import { withBasePath } from "../base-path.js";
|
|
5
|
-
import { and, desc, eq, inArray, isNotNull, sql } from "../db/index.js";
|
|
5
|
+
import { and, desc, eq, gte, inArray, isNotNull, lt, sql, } from "../db/index.js";
|
|
6
6
|
import { entries } from "../db/schema/entries.js";
|
|
7
7
|
import { entryTerm } from "../db/schema/entry_term.js";
|
|
8
8
|
import { terms } from "../db/schema/terms.js";
|
|
9
|
+
import { users } from "../db/schema/users.js";
|
|
9
10
|
import { labelSourceText } from "../i18n/label.js";
|
|
10
11
|
import { getAutosave } from "../revisions/repository.js";
|
|
11
12
|
import { stripReservedMeta } from "../revisions/snapshot-envelope.js";
|
|
12
13
|
import { entryCapability } from "../rpc/procedures/entry/lifecycle.js";
|
|
13
14
|
import { notFound, permanentRedirect } from "../runtime/http.js";
|
|
15
|
+
import { dateRange } from "./date-range.js";
|
|
14
16
|
import { resolveEditMode } from "./edit-mode.js";
|
|
15
17
|
import { paginate } from "./paginate.js";
|
|
16
18
|
import { findEntryByPath, findTermByPath } from "./path-chain.js";
|
|
@@ -18,7 +20,17 @@ import { buildTermArchiveUrl } from "./permalink.js";
|
|
|
18
20
|
import { previewTokenGrantsEntry, readPreviewToken } from "./preview.js";
|
|
19
21
|
import { buildResolvedEntries } from "./render/build-resolved-entries.js";
|
|
20
22
|
import { renderThroughTheme } from "./render/render-template.js";
|
|
23
|
+
import { NAMED_TEMPLATE_META_KEY } from "./render/template-builders.js";
|
|
21
24
|
const DEFAULT_ARCHIVE_PER_PAGE = 20;
|
|
25
|
+
/**
|
|
26
|
+
* The public, non-hierarchical entry types — a site's posts, not its standalone
|
|
27
|
+
* pages. The front page, author archives, and date archives all list this set.
|
|
28
|
+
*/
|
|
29
|
+
function publicListingTypes(ctx) {
|
|
30
|
+
return Array.from(ctx.plugins.entryTypes.entries())
|
|
31
|
+
.filter(([, spec]) => spec.isPublic !== false && spec.isHierarchical !== true)
|
|
32
|
+
.map(([key]) => key);
|
|
33
|
+
}
|
|
22
34
|
// `renderThroughTheme` returns `null` when the theme has no rule for the node
|
|
23
35
|
// and no `fallback` — a 404, per the router-style resolution model.
|
|
24
36
|
function htmlResponseOrNotFound(html, reason) {
|
|
@@ -38,6 +50,12 @@ export async function resolvePublicRoute(ctx, match, theme, document, templateDe
|
|
|
38
50
|
return resolveTaxonomy(ctx, match.intent, match.params, theme, document, templateDeps, assetManifest);
|
|
39
51
|
case "front-page":
|
|
40
52
|
return resolveFrontPage(ctx, match.params, theme, document, templateDeps, assetManifest);
|
|
53
|
+
case "author":
|
|
54
|
+
return resolveAuthor(ctx, match.params, theme, document, templateDeps, assetManifest);
|
|
55
|
+
case "date":
|
|
56
|
+
return resolveDate(ctx, match.params, theme, document, templateDeps, assetManifest);
|
|
57
|
+
case "custom":
|
|
58
|
+
return resolveCustom(ctx, match.intent, match.params, theme, document, templateDeps, assetManifest);
|
|
41
59
|
case "search":
|
|
42
60
|
return resolveSearch(ctx, match.params, theme, document, templateDeps, assetManifest);
|
|
43
61
|
}
|
|
@@ -47,9 +65,7 @@ async function resolveFrontPage(ctx, params, theme, document, templateDeps, asse
|
|
|
47
65
|
// The latest-posts front feed excludes hierarchical types (pages) — they
|
|
48
66
|
// are standalone content, not blog entries. (A configurable front-page /
|
|
49
67
|
// posts-page model is the larger follow-up.)
|
|
50
|
-
const publicTypes =
|
|
51
|
-
.filter(([, spec]) => spec.isPublic !== false && spec.isHierarchical !== true)
|
|
52
|
-
.map(([key]) => key);
|
|
68
|
+
const publicTypes = publicListingTypes(ctx);
|
|
53
69
|
const where = publicTypes.length === 0
|
|
54
70
|
? null
|
|
55
71
|
: and(eq(entries.status, "published"), isNotNull(entries.publishedAt), inArray(entries.type, publicTypes));
|
|
@@ -194,6 +210,135 @@ async function resolveTaxonomy(ctx, intent, params, theme, document, templateDep
|
|
|
194
210
|
});
|
|
195
211
|
return htmlResponseOrNotFound(html, "public-taxonomy-no-template");
|
|
196
212
|
}
|
|
213
|
+
async function resolveAuthor(ctx, params, theme, document, templateDeps, assetManifest) {
|
|
214
|
+
const slug = params.slug;
|
|
215
|
+
if (typeof slug !== "string" || slug === "") {
|
|
216
|
+
return notFound("public-author-not-found");
|
|
217
|
+
}
|
|
218
|
+
const author = await ctx.db.query.users.findFirst({
|
|
219
|
+
where: eq(users.slug, slug),
|
|
220
|
+
});
|
|
221
|
+
if (!author)
|
|
222
|
+
return notFound("public-author-not-found");
|
|
223
|
+
ctx.resolvedEntity = { kind: "author", id: author.id };
|
|
224
|
+
const page = parsePageParam(params.page);
|
|
225
|
+
// Author archives list the same public, non-hierarchical type set as the
|
|
226
|
+
// front page — a person's posts, not their standalone pages.
|
|
227
|
+
const publicTypes = publicListingTypes(ctx);
|
|
228
|
+
const where = publicTypes.length === 0
|
|
229
|
+
? null
|
|
230
|
+
: and(eq(entries.authorId, author.id), eq(entries.status, "published"), isNotNull(entries.publishedAt), inArray(entries.type, publicTypes));
|
|
231
|
+
const result = await paginatedEntries(ctx, where, page, DEFAULT_ARCHIVE_PER_PAGE);
|
|
232
|
+
if (result.outOfRange)
|
|
233
|
+
return notFound("public-author-page-out-of-range");
|
|
234
|
+
const initial = {
|
|
235
|
+
kind: "author",
|
|
236
|
+
// Explicit projection — never spread the full user row (it carries email
|
|
237
|
+
// and auth columns) into the public template payload.
|
|
238
|
+
author: {
|
|
239
|
+
id: author.id,
|
|
240
|
+
slug: author.slug,
|
|
241
|
+
name: author.name,
|
|
242
|
+
avatarUrl: author.avatarUrl,
|
|
243
|
+
},
|
|
244
|
+
entries: await buildResolvedEntries(ctx, result.rows),
|
|
245
|
+
pagination: {
|
|
246
|
+
page,
|
|
247
|
+
perPage: DEFAULT_ARCHIVE_PER_PAGE,
|
|
248
|
+
total: result.total,
|
|
249
|
+
pageCount: result.pageCount,
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
const data = await ctx.hooks.applyFilter("resolve:author:data", initial);
|
|
253
|
+
const html = await renderThroughTheme({
|
|
254
|
+
ctx,
|
|
255
|
+
theme,
|
|
256
|
+
document,
|
|
257
|
+
templateDeps,
|
|
258
|
+
assetManifest,
|
|
259
|
+
node: { kind: "author", slug: author.slug, databaseId: author.id },
|
|
260
|
+
data,
|
|
261
|
+
title: data.author.name ?? data.author.slug,
|
|
262
|
+
});
|
|
263
|
+
return htmlResponseOrNotFound(html, "public-author-no-template");
|
|
264
|
+
}
|
|
265
|
+
function pad2(value) {
|
|
266
|
+
return String(value).padStart(2, "0");
|
|
267
|
+
}
|
|
268
|
+
function dateTitle(year, month, day) {
|
|
269
|
+
if (month === null)
|
|
270
|
+
return String(year);
|
|
271
|
+
if (day === null)
|
|
272
|
+
return `${String(year)}-${pad2(month)}`;
|
|
273
|
+
return `${String(year)}-${pad2(month)}-${pad2(day)}`;
|
|
274
|
+
}
|
|
275
|
+
async function resolveDate(ctx, params, theme, document, templateDeps, assetManifest) {
|
|
276
|
+
const year = Number(params.year);
|
|
277
|
+
const month = params.month === undefined ? null : Number(params.month);
|
|
278
|
+
const day = params.day === undefined ? null : Number(params.day);
|
|
279
|
+
const range = dateRange(year, month, day);
|
|
280
|
+
if (range === null)
|
|
281
|
+
return notFound("public-date-invalid");
|
|
282
|
+
const page = parsePageParam(params.page);
|
|
283
|
+
// Date archives list the same public, non-hierarchical type set as the front
|
|
284
|
+
// page, filtered to a published-at window.
|
|
285
|
+
const publicTypes = publicListingTypes(ctx);
|
|
286
|
+
const where = publicTypes.length === 0
|
|
287
|
+
? null
|
|
288
|
+
: and(eq(entries.status, "published"), isNotNull(entries.publishedAt), gte(entries.publishedAt, range.start), lt(entries.publishedAt, range.end), inArray(entries.type, publicTypes));
|
|
289
|
+
const result = await paginatedEntries(ctx, where, page, DEFAULT_ARCHIVE_PER_PAGE);
|
|
290
|
+
if (result.outOfRange)
|
|
291
|
+
return notFound("public-date-page-out-of-range");
|
|
292
|
+
const initial = {
|
|
293
|
+
kind: "date",
|
|
294
|
+
year,
|
|
295
|
+
month,
|
|
296
|
+
day,
|
|
297
|
+
entries: await buildResolvedEntries(ctx, result.rows),
|
|
298
|
+
pagination: {
|
|
299
|
+
page,
|
|
300
|
+
perPage: DEFAULT_ARCHIVE_PER_PAGE,
|
|
301
|
+
total: result.total,
|
|
302
|
+
pageCount: result.pageCount,
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
const data = await ctx.hooks.applyFilter("resolve:date:data", initial);
|
|
306
|
+
const html = await renderThroughTheme({
|
|
307
|
+
ctx,
|
|
308
|
+
theme,
|
|
309
|
+
document,
|
|
310
|
+
templateDeps,
|
|
311
|
+
assetManifest,
|
|
312
|
+
node: { kind: "date", year, month, day },
|
|
313
|
+
data,
|
|
314
|
+
title: dateTitle(year, month, day),
|
|
315
|
+
});
|
|
316
|
+
return htmlResponseOrNotFound(html, "public-date-no-template");
|
|
317
|
+
}
|
|
318
|
+
// The open seam: a plugin-registered archive type (`registerArchiveType`). The
|
|
319
|
+
// resolver comes from the registry, produces the `{ data, title }` payload (or
|
|
320
|
+
// `null` → 404), and templates via a `forArchiveType(name)` rule or `fallback`.
|
|
321
|
+
async function resolveCustom(ctx, intent, params, theme, document, templateDeps, assetManifest) {
|
|
322
|
+
const archive = ctx.plugins.archiveTypes.get(intent.name);
|
|
323
|
+
// A compiled route always names a registered archive; the guard is a
|
|
324
|
+
// defensive 404 rather than a throw if the two ever drift.
|
|
325
|
+
if (!archive)
|
|
326
|
+
return notFound("public-custom-archive-not-registered");
|
|
327
|
+
const result = await archive.resolve(ctx, params);
|
|
328
|
+
if (result === null)
|
|
329
|
+
return notFound("public-custom-archive-not-found");
|
|
330
|
+
const html = await renderThroughTheme({
|
|
331
|
+
ctx,
|
|
332
|
+
theme,
|
|
333
|
+
document,
|
|
334
|
+
templateDeps,
|
|
335
|
+
assetManifest,
|
|
336
|
+
node: { kind: "custom", name: intent.name },
|
|
337
|
+
data: result.data,
|
|
338
|
+
title: result.title,
|
|
339
|
+
});
|
|
340
|
+
return htmlResponseOrNotFound(html, "public-custom-archive-no-template");
|
|
341
|
+
}
|
|
197
342
|
async function resolveSingle(ctx, intent, params, theme, document, templateDeps, assetManifest) {
|
|
198
343
|
const baseRow = await findEntryForSingle(ctx, intent.entryType, params);
|
|
199
344
|
if (!baseRow)
|
|
@@ -324,7 +469,9 @@ async function overlayPreviewAutosave(ctx, entry) {
|
|
|
324
469
|
title: autosave.title,
|
|
325
470
|
content: autosave.content,
|
|
326
471
|
excerpt: autosave.excerpt,
|
|
327
|
-
|
|
472
|
+
// Keep the reserved template key so an unsaved `named`-template pick still
|
|
473
|
+
// drives resolution — otherwise preview would fall back to the default.
|
|
474
|
+
meta: stripReservedMeta(autosave.meta, [NAMED_TEMPLATE_META_KEY]),
|
|
328
475
|
};
|
|
329
476
|
}
|
|
330
477
|
async function findEntryForSingle(ctx, entryType, params) {
|