@plumix/core 0.2.0 → 0.4.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 (167) hide show
  1. package/dist/auth/bootstrap.d.ts.map +1 -1
  2. package/dist/auth/bootstrap.js +39 -22
  3. package/dist/auth/bootstrap.js.map +1 -1
  4. package/dist/cache/tags.d.ts.map +1 -1
  5. package/dist/cache/tags.js +9 -0
  6. package/dist/cache/tags.js.map +1 -1
  7. package/dist/db/errors.d.ts +8 -0
  8. package/dist/db/errors.d.ts.map +1 -1
  9. package/dist/db/errors.js +22 -0
  10. package/dist/db/errors.js.map +1 -1
  11. package/dist/db/index.d.ts +1 -1
  12. package/dist/db/index.d.ts.map +1 -1
  13. package/dist/db/index.js +1 -1
  14. package/dist/db/index.js.map +1 -1
  15. package/dist/db/schema/users.d.ts +57 -0
  16. package/dist/db/schema/users.d.ts.map +1 -1
  17. package/dist/db/schema/users.js +10 -2
  18. package/dist/db/schema/users.js.map +1 -1
  19. package/dist/debug-bar/panels/template.d.ts +5 -8
  20. package/dist/debug-bar/panels/template.d.ts.map +1 -1
  21. package/dist/debug-bar/panels/template.js +22 -8
  22. package/dist/debug-bar/panels/template.js.map +1 -1
  23. package/dist/debug-bar/primitives.d.ts +1 -1
  24. package/dist/debug-bar/primitives.d.ts.map +1 -1
  25. package/dist/debug-bar/primitives.js +1 -1
  26. package/dist/debug-bar/primitives.js.map +1 -1
  27. package/dist/debug-bar/styles.d.ts.map +1 -1
  28. package/dist/debug-bar/styles.js +9 -14
  29. package/dist/debug-bar/styles.js.map +1 -1
  30. package/dist/debug-bar/template-node-label.d.ts.map +1 -1
  31. package/dist/debug-bar/template-node-label.js +8 -2
  32. package/dist/debug-bar/template-node-label.js.map +1 -1
  33. package/dist/index.d.ts +7 -6
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/plugin/manifest.d.ts +34 -0
  38. package/dist/plugin/manifest.d.ts.map +1 -1
  39. package/dist/plugin/manifest.js +1 -0
  40. package/dist/plugin/manifest.js.map +1 -1
  41. package/dist/plugin/setup-context.d.ts +10 -1
  42. package/dist/plugin/setup-context.d.ts.map +1 -1
  43. package/dist/plugin/setup-context.js +12 -0
  44. package/dist/plugin/setup-context.js.map +1 -1
  45. package/dist/route/compile.d.ts +21 -0
  46. package/dist/route/compile.d.ts.map +1 -1
  47. package/dist/route/compile.js +63 -1
  48. package/dist/route/compile.js.map +1 -1
  49. package/dist/route/current.d.ts +5 -3
  50. package/dist/route/current.d.ts.map +1 -1
  51. package/dist/route/date-range.d.ts +12 -0
  52. package/dist/route/date-range.d.ts.map +1 -0
  53. package/dist/route/date-range.js +39 -0
  54. package/dist/route/date-range.js.map +1 -0
  55. package/dist/route/intent.d.ts +7 -3
  56. package/dist/route/intent.d.ts.map +1 -1
  57. package/dist/route/match.d.ts +1 -0
  58. package/dist/route/match.d.ts.map +1 -1
  59. package/dist/route/match.js +1 -1
  60. package/dist/route/match.js.map +1 -1
  61. package/dist/route/render/build-resolved-entries.d.ts.map +1 -1
  62. package/dist/route/render/build-resolved-entries.js +6 -1
  63. package/dist/route/render/build-resolved-entries.js.map +1 -1
  64. package/dist/route/render/render-template.d.ts +6 -4
  65. package/dist/route/render/render-template.d.ts.map +1 -1
  66. package/dist/route/render/render-template.js +36 -48
  67. package/dist/route/render/render-template.js.map +1 -1
  68. package/dist/route/render/resolved-entry.d.ts +46 -5
  69. package/dist/route/render/resolved-entry.d.ts.map +1 -1
  70. package/dist/route/render/template-builders.d.ts +124 -0
  71. package/dist/route/render/template-builders.d.ts.map +1 -0
  72. package/dist/route/render/template-builders.js +172 -0
  73. package/dist/route/render/template-builders.js.map +1 -0
  74. package/dist/route/render/template-hierarchy.d.ts +69 -38
  75. package/dist/route/render/template-hierarchy.d.ts.map +1 -1
  76. package/dist/route/render/template-hierarchy.js +150 -74
  77. package/dist/route/render/template-hierarchy.js.map +1 -1
  78. package/dist/route/resolve.d.ts +5 -3
  79. package/dist/route/resolve.d.ts.map +1 -1
  80. package/dist/route/resolve.js +177 -35
  81. package/dist/route/resolve.js.map +1 -1
  82. package/dist/rpc/procedures/entry/create.d.ts +2 -2
  83. package/dist/rpc/procedures/entry/delete-permanent.d.ts +2 -2
  84. package/dist/rpc/procedures/entry/duplicate.d.ts +2 -2
  85. package/dist/rpc/procedures/entry/get.d.ts +2 -2
  86. package/dist/rpc/procedures/entry/index.d.ts +22 -22
  87. package/dist/rpc/procedures/entry/list.d.ts +2 -2
  88. package/dist/rpc/procedures/entry/publish.d.ts +2 -2
  89. package/dist/rpc/procedures/entry/restore.d.ts +2 -2
  90. package/dist/rpc/procedures/entry/revisions.d.ts +8 -8
  91. package/dist/rpc/procedures/entry/trash.d.ts +2 -2
  92. package/dist/rpc/procedures/entry/update.d.ts +2 -2
  93. package/dist/rpc/procedures/term/create.d.ts +2 -2
  94. package/dist/rpc/procedures/term/delete.d.ts +2 -2
  95. package/dist/rpc/procedures/term/get.d.ts +2 -2
  96. package/dist/rpc/procedures/term/index.d.ts +10 -10
  97. package/dist/rpc/procedures/term/list.d.ts +2 -2
  98. package/dist/rpc/procedures/term/update.d.ts +2 -2
  99. package/dist/rpc/procedures/user/delete.d.ts +2 -0
  100. package/dist/rpc/procedures/user/delete.d.ts.map +1 -1
  101. package/dist/rpc/procedures/user/disable.d.ts +2 -0
  102. package/dist/rpc/procedures/user/disable.d.ts.map +1 -1
  103. package/dist/rpc/procedures/user/enable.d.ts +2 -0
  104. package/dist/rpc/procedures/user/enable.d.ts.map +1 -1
  105. package/dist/rpc/procedures/user/get.d.ts +2 -0
  106. package/dist/rpc/procedures/user/get.d.ts.map +1 -1
  107. package/dist/rpc/procedures/user/index.d.ts +12 -0
  108. package/dist/rpc/procedures/user/index.d.ts.map +1 -1
  109. package/dist/rpc/procedures/user/invite.d.ts.map +1 -1
  110. package/dist/rpc/procedures/user/invite.js +28 -15
  111. package/dist/rpc/procedures/user/invite.js.map +1 -1
  112. package/dist/rpc/procedures/user/list.d.ts +2 -0
  113. package/dist/rpc/procedures/user/list.d.ts.map +1 -1
  114. package/dist/rpc/procedures/user/list.js +1 -0
  115. package/dist/rpc/procedures/user/list.js.map +1 -1
  116. package/dist/rpc/procedures/user/update.d.ts +2 -0
  117. package/dist/rpc/procedures/user/update.d.ts.map +1 -1
  118. package/dist/rpc/router.d.ts +44 -32
  119. package/dist/rpc/router.d.ts.map +1 -1
  120. package/dist/runtime/app.d.ts +0 -8
  121. package/dist/runtime/app.d.ts.map +1 -1
  122. package/dist/runtime/app.js +0 -38
  123. package/dist/runtime/app.js.map +1 -1
  124. package/dist/runtime/dispatcher.d.ts.map +1 -1
  125. package/dist/runtime/dispatcher.js +74 -13
  126. package/dist/runtime/dispatcher.js.map +1 -1
  127. package/dist/seo/feed.d.ts +19 -4
  128. package/dist/seo/feed.d.ts.map +1 -1
  129. package/dist/seo/feed.js +49 -12
  130. package/dist/seo/feed.js.map +1 -1
  131. package/dist/seo/head-defaults.d.ts.map +1 -1
  132. package/dist/seo/head-defaults.js +6 -3
  133. package/dist/seo/head-defaults.js.map +1 -1
  134. package/dist/template-deps.js +1 -1
  135. package/dist/template-registry.d.ts +87 -0
  136. package/dist/template-registry.d.ts.map +1 -0
  137. package/dist/template-registry.js +1 -0
  138. package/dist/template-registry.js.map +1 -0
  139. package/dist/template.d.ts +2 -2
  140. package/dist/test/default-theme.d.ts.map +1 -1
  141. package/dist/test/default-theme.js +10 -6
  142. package/dist/test/default-theme.js.map +1 -1
  143. package/dist/test/factories.d.ts +39 -21
  144. package/dist/test/factories.d.ts.map +1 -1
  145. package/dist/test/factories.js +1 -0
  146. package/dist/test/factories.js.map +1 -1
  147. package/dist/theme-errors.d.ts +0 -3
  148. package/dist/theme-errors.d.ts.map +1 -1
  149. package/dist/theme-errors.js +7 -18
  150. package/dist/theme-errors.js.map +1 -1
  151. package/dist/theme.d.ts +67 -23
  152. package/dist/theme.d.ts.map +1 -1
  153. package/dist/theme.js +30 -10
  154. package/dist/theme.js.map +1 -1
  155. package/dist/users/slug.d.ts +12 -0
  156. package/dist/users/slug.d.ts.map +1 -0
  157. package/dist/users/slug.js +32 -0
  158. package/dist/users/slug.js.map +1 -0
  159. package/dist/welcome-theme.d.ts +2 -2
  160. package/dist/welcome-theme.d.ts.map +1 -1
  161. package/dist/welcome-theme.js +7 -6
  162. package/dist/welcome-theme.js.map +1 -1
  163. package/package.json +7 -7
  164. package/dist/route/render/archive-props.d.ts +0 -39
  165. package/dist/route/render/archive-props.d.ts.map +0 -1
  166. package/dist/route/render/archive-props.js +0 -32
  167. package/dist/route/render/archive-props.js.map +0 -1
@@ -10,14 +10,9 @@ export class ThemeRegistrationError extends Error {
10
10
  static missingTheme() {
11
11
  return new ThemeRegistrationError("missing_theme", `Plumix config requires a \`theme\`. Every app renders public routes ` +
12
12
  `through a theme — there is no inline-HTML fallback. Define one with ` +
13
- `\`defineTheme({ templates: { index: …, … } })\` and pass it to ` +
13
+ `\`defineTheme({ templates: [fallback(...)] })\` and pass it to ` +
14
14
  `\`plumix({ … , theme })\`.`);
15
15
  }
16
- static missingIndexTemplate() {
17
- return new ThemeRegistrationError("missing_index_template", `Theme registration: \`templates.index\` is required. Every theme ` +
18
- `must declare an \`index\` template — it is the final fallback the ` +
19
- `template hierarchy walks to when no more-specific template matches.`);
20
- }
21
16
  static legacyTemplateDepsShape() {
22
17
  return new ThemeRegistrationError("legacy_template_deps_shape", `Theme registration: \`templateDeps: { ... }\` is no longer accepted. ` +
23
18
  `Lift dep kinds to the flat root of \`defineTheme\` instead — e.g. ` +
@@ -32,13 +27,10 @@ export class ThemeRegistrationError extends Error {
32
27
  `function form is for per-template extension (see #614).`);
33
28
  }
34
29
  static documentInvalidLink(ctx) {
35
- const source = ctx.slot
36
- ? `template \`${ctx.slot}\` document fragment`
37
- : "`theme:document` filter chain";
38
- return new ThemeRegistrationError("document_invalid_link", `${source} produced a \`link[${ctx.index}]\` entry without a \`rel\` ` +
39
- `attribute. Every \`<link>\` in the document manifest must declare ` +
40
- `a \`rel\` — browsers ignore unkeyed link tags and the renderer ` +
41
- `would emit invalid HTML.`);
30
+ return new ThemeRegistrationError("document_invalid_link", `The document manifest has a \`link[${ctx.index}]\` entry without a ` +
31
+ `\`rel\` attribute. Every \`<link>\` must declare a \`rel\` ` +
32
+ `browsers ignore unkeyed link tags and the renderer would emit ` +
33
+ `invalid HTML.`);
42
34
  }
43
35
  static invalidTemplate(ctx) {
44
36
  return new ThemeRegistrationError("invalid_template", `Theme registration: templates.${ctx.slot} must be either a plain ` +
@@ -48,11 +40,8 @@ export class ThemeRegistrationError extends Error {
48
40
  `document-fragment fields don't get silently ignored.`);
49
41
  }
50
42
  static documentInvalidScript(ctx) {
51
- const source = ctx.slot
52
- ? `template \`${ctx.slot}\` document fragment`
53
- : "`theme:document` filter chain";
54
- return new ThemeRegistrationError("document_invalid_script", `${source} produced a \`script[${ctx.index}]\` entry with neither ` +
55
- `\`src\` nor inline content (\`children\` / ` +
43
+ return new ThemeRegistrationError("document_invalid_script", `The document manifest has a \`script[${ctx.index}]\` entry with ` +
44
+ `neither \`src\` nor inline content (\`children\` / ` +
56
45
  `\`dangerouslySetInnerHTML\`). Scripts must reference a source URL ` +
57
46
  `or carry an inline body — an empty \`<script>\` tag is dead weight.`);
58
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"theme-errors.js","sourceRoot":"","sources":["../src/theme-errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme-errors.js","sourceRoot":"","sources":["../src/theme-errors.ts"],"names":[],"mappings":"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"}
package/dist/theme.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ComponentType, JSX } from "react";
2
2
  import type { ShortcodeSpec, ThemeBreakpoints, ThemeTokens } from "@plumix/blocks";
3
- import type { ArchiveData, ErrorData, FrontPageData, SearchData, SingleData, TaxonomyData } from "./route/render/resolved-entry.js";
3
+ import type { ArchiveData, AuthorArchiveData, CustomArchiveData, DateArchiveData, EntryData, ErrorData, FrontPageData, SearchData, TaxonomyData } from "./route/render/resolved-entry.js";
4
4
  import type { Template, TemplateDepDeclarations } from "./template.js";
5
5
  declare module "./hooks/types.js" {
6
6
  interface FilterRegistry {
@@ -9,15 +9,70 @@ declare module "./hooks/types.js" {
9
9
  }
10
10
  /**
11
11
  * Discriminated union of every data shape a template can receive. Per-kind
12
- * templates (`single`, `archive`, …) narrow via the registry; `index`
13
- * receives the union and discriminates at runtime (e.g. `"entry" in data`).
12
+ * templates (`single`, `archive`, …) narrow via the registry; a template that
13
+ * receives the whole union (like `index`) discriminates on the `kind` field
14
+ * a `switch (data.kind)` gets exhaustiveness, or use the `isEntry`/`isArchive`/…
15
+ * guards below for single-branch checks.
14
16
  */
15
- export type TemplateData = SingleData | ArchiveData | TaxonomyData | FrontPageData | SearchData | ErrorData;
17
+ export type TemplateData = EntryData | ArchiveData | TaxonomyData | AuthorArchiveData | DateArchiveData | CustomArchiveData | FrontPageData | SearchData | ErrorData;
18
+ export declare function isEntry(data: TemplateData): data is EntryData;
19
+ export declare function isArchive(data: TemplateData): data is ArchiveData;
20
+ export declare function isTaxonomy(data: TemplateData): data is TaxonomyData;
21
+ export declare function isAuthor(data: TemplateData): data is AuthorArchiveData;
22
+ export declare function isDate(data: TemplateData): data is DateArchiveData;
23
+ export declare function isCustom(data: TemplateData): data is CustomArchiveData;
24
+ export declare function isFrontPage(data: TemplateData): data is FrontPageData;
25
+ export declare function isSearch(data: TemplateData): data is SearchData;
26
+ export declare function isError(data: TemplateData): data is ErrorData;
16
27
  export type TemplateComponent<Data> = ComponentType<{
17
28
  readonly data: Data;
18
29
  }>;
19
30
  export type TemplateEntry<Data extends TemplateData> = TemplateComponent<Data> | Template<Data>;
20
- type DynamicTemplateEntry = TemplateEntry<SingleData> | TemplateEntry<ArchiveData> | TemplateEntry<TaxonomyData> | TemplateEntry<FrontPageData> | TemplateEntry<SearchData> | TemplateEntry<ErrorData> | TemplateEntry<TemplateData>;
31
+ /**
32
+ * The fixed set of generic tiers a theme's `templates` array can declare. Each
33
+ * matches one resolved-node kind (`entry`→content, `archive`→content-type
34
+ * archive, `taxonomy`→term, `frontPage`/`search`), plus `fallback`
35
+ * (the universal catch-all) and the `notFound`/`serverError` condition handlers.
36
+ * Type/term-specific matchers arrive in a later slice.
37
+ */
38
+ export type GenericTier = "fallback" | "entry" | "archive" | "taxonomy" | "author" | "date" | "frontPage" | "search" | "notFound" | "serverError";
39
+ /**
40
+ * How a targeted rule (from `forEntryType`/`forTermTaxonomy`/`forAuthor`/
41
+ * `forDate`) matches a resolved node: by node kind + type name, optionally
42
+ * narrowed. Author matchers use a fixed `type` of `"author"`; date matchers use
43
+ * `"date"` and narrow by `year`/`month`/`day` instead of `slug`/`id`.
44
+ */
45
+ export interface TargetMatcher {
46
+ readonly nodeKind: "content" | "content-type-archive" | "term" | "author" | "date" | "custom";
47
+ readonly type: string;
48
+ readonly slug?: string;
49
+ readonly id?: number;
50
+ /** Date-archive narrowing (`forDate`); each is exact when set. */
51
+ readonly year?: number;
52
+ readonly month?: number;
53
+ readonly day?: number;
54
+ /**
55
+ * A runtime predicate over the resolved data (`whereMeta`/`where`/`named`),
56
+ * evaluated after the identity match. Data-dependent, so the resolver must be
57
+ * given the resolved data to honour it.
58
+ */
59
+ readonly predicate?: (data: TemplateData) => boolean;
60
+ /** For an author-selectable (`named`) template: its id + editor label. */
61
+ readonly named?: {
62
+ readonly id: string;
63
+ readonly label: string;
64
+ };
65
+ }
66
+ /**
67
+ * One entry in a theme's `templates` array: a template bound to either a
68
+ * generic `tier` or a targeted `match`. Exactly one is set — the builders never
69
+ * produce both.
70
+ */
71
+ export interface TemplateRule {
72
+ readonly template: TemplateEntry<TemplateData>;
73
+ readonly tier?: GenericTier;
74
+ readonly match?: TargetMatcher;
75
+ }
21
76
  /**
22
77
  * Strip React-isms that don't belong in HTML attribute descriptors:
23
78
  * `key`/`ref` are React infrastructure; `on*` handlers don't apply
@@ -43,24 +98,13 @@ export interface DocumentManifest {
43
98
  readonly title?: string;
44
99
  readonly titleTemplate?: string | ((title: string | undefined) => string);
45
100
  }
46
- export interface TemplateRegistry {
47
- readonly index: TemplateEntry<TemplateData>;
48
- readonly single?: TemplateEntry<SingleData>;
49
- readonly singular?: TemplateEntry<SingleData>;
50
- readonly page?: TemplateEntry<SingleData>;
51
- readonly archive?: TemplateEntry<ArchiveData>;
52
- readonly taxonomy?: TemplateEntry<TaxonomyData>;
53
- readonly category?: TemplateEntry<TaxonomyData>;
54
- readonly tag?: TemplateEntry<TaxonomyData>;
55
- readonly "front-page"?: TemplateEntry<FrontPageData>;
56
- readonly home?: TemplateEntry<FrontPageData>;
57
- readonly search?: TemplateEntry<SearchData>;
58
- readonly "404"?: TemplateEntry<ErrorData>;
59
- readonly "500"?: TemplateEntry<ErrorData>;
60
- readonly [key: string]: DynamicTemplateEntry | undefined;
61
- }
62
101
  export interface ThemeDescriptor extends TemplateDepDeclarations {
63
- readonly templates: TemplateRegistry;
102
+ /**
103
+ * The theme's templates: an array of builder rules (`fallback(...)`,
104
+ * `forEntryType(...).template(...)`, …), or a bare component as fallback-only
105
+ * shorthand.
106
+ */
107
+ readonly templates: readonly TemplateRule[] | TemplateEntry<TemplateData>;
64
108
  readonly document?: DocumentManifest;
65
109
  readonly tokens?: ThemeTokens;
66
110
  /**
@@ -86,6 +130,6 @@ export interface ThemeDescriptor extends TemplateDepDeclarations {
86
130
  readonly css?: readonly string[];
87
131
  }
88
132
  export declare function defineTheme(descriptor: ThemeDescriptor): ThemeDescriptor;
89
- export declare function validateDocumentManifest(manifest: DocumentManifest, slot?: string): void;
133
+ export declare function validateDocumentManifest(manifest: DocumentManifest): void;
90
134
  export {};
91
135
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
package/dist/theme.js CHANGED
@@ -1,15 +1,35 @@
1
1
  import { RESERVED_DEP_KIND_NAMES } from "./template-deps.js";
2
2
  import { ThemeError, ThemeRegistrationError } from "./theme-errors.js";
3
+ export function isEntry(data) {
4
+ return data.kind === "entry";
5
+ }
6
+ export function isArchive(data) {
7
+ return data.kind === "archive";
8
+ }
9
+ export function isTaxonomy(data) {
10
+ return data.kind === "taxonomy";
11
+ }
12
+ export function isAuthor(data) {
13
+ return data.kind === "author";
14
+ }
15
+ export function isDate(data) {
16
+ return data.kind === "date";
17
+ }
18
+ export function isCustom(data) {
19
+ return data.kind === "custom";
20
+ }
21
+ export function isFrontPage(data) {
22
+ return data.kind === "frontPage";
23
+ }
24
+ export function isSearch(data) {
25
+ return data.kind === "search";
26
+ }
27
+ export function isError(data) {
28
+ return data.kind === "error";
29
+ }
3
30
  const TOKEN_SLUG_RE = /^[a-z][a-z0-9-]*$/;
4
31
  const TOKEN_VALUE_FORBIDDEN_CHARS = /[;{}\\\n\r]|\/\*|\*\//;
5
32
  export function defineTheme(descriptor) {
6
- // Defense-in-depth: the type system already requires `templates.index`,
7
- // but JS callers can drop it. The hierarchy walker terminates at
8
- // `index`, so an absent fallback would render blank pages.
9
- const templates = descriptor.templates;
10
- if (!templates.index) {
11
- throw ThemeRegistrationError.missingIndexTemplate();
12
- }
13
33
  if ("templateDeps" in descriptor) {
14
34
  throw ThemeRegistrationError.legacyTemplateDepsShape();
15
35
  }
@@ -33,10 +53,10 @@ export function defineTheme(descriptor) {
33
53
  // can't recover from gracefully — link entries without `rel` (browsers
34
54
  // ignore them, invalid HTML) and scripts with no src + no inline body
35
55
  // (dead weight, signals a plugin bug worth surfacing loud).
36
- export function validateDocumentManifest(manifest, slot) {
56
+ export function validateDocumentManifest(manifest) {
37
57
  manifest.link?.forEach((entry, index) => {
38
58
  if (typeof entry.rel !== "string" || entry.rel.length === 0) {
39
- throw ThemeRegistrationError.documentInvalidLink({ index, slot });
59
+ throw ThemeRegistrationError.documentInvalidLink({ index });
40
60
  }
41
61
  });
42
62
  manifest.script?.forEach((entry, index) => {
@@ -45,7 +65,7 @@ export function validateDocumentManifest(manifest, slot) {
45
65
  const hasInnerHtml = typeof entry.dangerouslySetInnerHTML?.__html === "string" &&
46
66
  entry.dangerouslySetInnerHTML.__html.length > 0;
47
67
  if (!hasSrc && !hasChildren && !hasInnerHtml) {
48
- throw ThemeRegistrationError.documentInvalidScript({ index, slot });
68
+ throw ThemeRegistrationError.documentInvalidScript({ index });
49
69
  }
50
70
  });
51
71
  }
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Db } from "../context/app.js";
2
+ export declare const MAX_SLUG_ATTEMPTS = 5;
3
+ /**
4
+ * Derive a unique, URL-safe author slug from a user's name. Slugifies the name
5
+ * (never the email — that would leak it into public `/authors/{slug}` URLs),
6
+ * falling back to `user` when the name transliterates to nothing. On collision
7
+ * the bare base is kept if free, otherwise the smallest free numeric suffix is
8
+ * appended (`john`, `john-1`, `john-2`), mirroring how a single term/entry keeps
9
+ * its bare slug. Called once at user creation; the result is stable thereafter.
10
+ */
11
+ export declare function deriveUserSlug(db: Db, name: string | null | undefined): Promise<string>;
12
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/users/slug.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAQ5C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,OAAO,CAAC,MAAM,CAAC,CAYjB"}
@@ -0,0 +1,32 @@
1
+ import { eq, like, or } from "drizzle-orm";
2
+ import { users } from "../db/schema/users.js";
3
+ import { slugify } from "../slugify.js";
4
+ // `deriveUserSlug` reads then the INSERT writes, so concurrent creates with the
5
+ // same derived base can both pick it and one loses the unique race. Callers
6
+ // re-derive and retry up to this many times; each retry sees the winner's row,
7
+ // so the loser advances to the next suffix.
8
+ export const MAX_SLUG_ATTEMPTS = 5;
9
+ /**
10
+ * Derive a unique, URL-safe author slug from a user's name. Slugifies the name
11
+ * (never the email — that would leak it into public `/authors/{slug}` URLs),
12
+ * falling back to `user` when the name transliterates to nothing. On collision
13
+ * the bare base is kept if free, otherwise the smallest free numeric suffix is
14
+ * appended (`john`, `john-1`, `john-2`), mirroring how a single term/entry keeps
15
+ * its bare slug. Called once at user creation; the result is stable thereafter.
16
+ */
17
+ export async function deriveUserSlug(db, name) {
18
+ const base = slugify(name ?? "") || "user";
19
+ const rows = await db
20
+ .select({ slug: users.slug })
21
+ .from(users)
22
+ .where(or(eq(users.slug, base), like(users.slug, `${base}-%`)));
23
+ const taken = new Set(rows.map((r) => r.slug));
24
+ if (!taken.has(base))
25
+ return base;
26
+ for (let n = 1;; n++) {
27
+ const candidate = `${base}-${n}`;
28
+ if (!taken.has(candidate))
29
+ return candidate;
30
+ }
31
+ }
32
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/users/slug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,gFAAgF;AAChF,4EAA4E;AAC5E,+EAA+E;AAC/E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAM,EACN,IAA+B;IAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -3,8 +3,8 @@
3
3
  * substitutes it at config resolution, so to all downstream code a
4
4
  * theme-less site is indistinguishable from one with a user theme.
5
5
  *
6
- * The `index` template uses `defineTemplate` (not a plain function) so its
7
- * render receives `ctx` — needed for the basePath-aware admin link.
6
+ * The sole `fallback` template uses `defineTemplate` (not a plain function) so
7
+ * its render receives `ctx` — needed for the basePath-aware admin link.
8
8
  */
9
9
  export declare const welcomeTheme: import("./theme.js").ThemeDescriptor;
10
10
  //# sourceMappingURL=welcome-theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"welcome-theme.d.ts","sourceRoot":"","sources":["../src/welcome-theme.tsx"],"names":[],"mappings":"AAoLA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,sCAgBvB,CAAC"}
1
+ {"version":3,"file":"welcome-theme.d.ts","sourceRoot":"","sources":["../src/welcome-theme.tsx"],"names":[],"mappings":"AAqLA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,sCAkBvB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { withBasePath } from "./base-path.js";
3
+ import { fallback } from "./route/render/template-builders.js";
3
4
  import { defineTemplate } from "./template.js";
4
5
  import { defineTheme } from "./theme.js";
5
6
  import { welcomeMessages } from "./welcome/i18n.js";
@@ -147,15 +148,15 @@ function WelcomeScreen({ basePath, strings, }) {
147
148
  * substitutes it at config resolution, so to all downstream code a
148
149
  * theme-less site is indistinguishable from one with a user theme.
149
150
  *
150
- * The `index` template uses `defineTemplate` (not a plain function) so its
151
- * render receives `ctx` — needed for the basePath-aware admin link.
151
+ * The sole `fallback` template uses `defineTemplate` (not a plain function) so
152
+ * its render receives `ctx` — needed for the basePath-aware admin link.
152
153
  */
153
154
  export const welcomeTheme = defineTheme({
154
- templates: {
155
- index: defineTemplate({
155
+ templates: [
156
+ fallback(defineTemplate({
156
157
  render: ({ ctx }) => (_jsx(WelcomeScreen, { basePath: ctx.basePath, strings: welcomeMessages(ctx.locale.code) })),
157
- }),
158
- },
158
+ })),
159
+ ],
159
160
  // Never index a placeholder — it's a misconfiguration if it reaches prod.
160
161
  document: {
161
162
  title: "plumix",
@@ -1 +1 @@
1
- {"version":3,"file":"welcome-theme.js","sourceRoot":"","sources":["../src/welcome-theme.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,qEAAqE;AACrE,0EAA0E;AAC1E,sBAAsB;AACtB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAuGC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BpB,CAAC;AAEF,SAAS,aAAa,CAAC,EACrB,QAAQ,EACR,OAAO,GAIR;IACC,OAAO,CACL,gBAAM,SAAS,EAAC,gBAAgB,iBAAa,gBAAgB,aAC3D,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,wBAAwB,aACrC,eAAM,SAAS,EAAC,qBAAqB,GAAG,EACvC,OAAO,CAAC,OAAO,IACZ,EACN,uBAAK,OAAO,CAAC,OAAO,GAAM,EAC1B,sBAAI,OAAO,CAAC,IAAI,GAAK,EACrB,eAAM,SAAS,EAAC,sBAAsB,YACnC,2BAA2B,GACvB,EACP,cAAK,SAAS,EAAC,oBAAoB,YAAE,OAAO,CAAC,EAAE,GAAO,EACtD,aACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,QAAQ,CAAC,aAE7C,OAAO,CAAC,SAAS,eAChB,IACA,EACN,eAAK,SAAS,EAAC,wBAAwB,aACrC,YAAG,IAAI,EAAC,yBAAyB,qBAAS,aAAG,GAAG,EAChD,YAAG,IAAI,EAAC,sCAAsC,uBAAW,IACrD,IACD,CACR,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;IACtC,SAAS,EAAE;QACT,KAAK,EAAE,cAAc,CAAC;YACpB,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CACnB,KAAC,aAAa,IACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GACzC,CACH;SACF,CAAC;KACH;IACD,0EAA0E;IAC1E,QAAQ,EAAE;QACR,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;KAC/C;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"welcome-theme.js","sourceRoot":"","sources":["../src/welcome-theme.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,qEAAqE;AACrE,0EAA0E;AAC1E,sBAAsB;AACtB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAuGC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BpB,CAAC;AAEF,SAAS,aAAa,CAAC,EACrB,QAAQ,EACR,OAAO,GAIR;IACC,OAAO,CACL,gBAAM,SAAS,EAAC,gBAAgB,iBAAa,gBAAgB,aAC3D,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,wBAAwB,aACrC,eAAM,SAAS,EAAC,qBAAqB,GAAG,EACvC,OAAO,CAAC,OAAO,IACZ,EACN,uBAAK,OAAO,CAAC,OAAO,GAAM,EAC1B,sBAAI,OAAO,CAAC,IAAI,GAAK,EACrB,eAAM,SAAS,EAAC,sBAAsB,YACnC,2BAA2B,GACvB,EACP,cAAK,SAAS,EAAC,oBAAoB,YAAE,OAAO,CAAC,EAAE,GAAO,EACtD,aACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,QAAQ,CAAC,aAE7C,OAAO,CAAC,SAAS,eAChB,IACA,EACN,eAAK,SAAS,EAAC,wBAAwB,aACrC,YAAG,IAAI,EAAC,yBAAyB,qBAAS,aAAG,GAAG,EAChD,YAAG,IAAI,EAAC,sCAAsC,uBAAW,IACrD,IACD,CACR,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;IACtC,SAAS,EAAE;QACT,QAAQ,CACN,cAAc,CAAC;YACb,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CACnB,KAAC,aAAa,IACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GACzC,CACH;SACF,CAAC,CACH;KACF;IACD,0EAA0E;IAC1E,QAAQ,EAAE;QACR,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;KAC/C;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumix/core",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Plumix core: runtime, auth, data model, and plugin system",
6
6
  "license": "MIT",
@@ -84,9 +84,9 @@
84
84
  "@libsql/client": "^0.17.4",
85
85
  "@lingui/core": "^6.4.0",
86
86
  "@modelcontextprotocol/sdk": "^1.29.0",
87
- "@orpc/openapi": "^1.14.7",
88
- "@orpc/server": "^1.14.7",
89
- "@orpc/valibot": "^1.14.7",
87
+ "@orpc/openapi": "^1.14.8",
88
+ "@orpc/server": "^1.14.8",
89
+ "@orpc/valibot": "^1.14.8",
90
90
  "@oslojs/crypto": "^1.0.1",
91
91
  "@oslojs/encoding": "^1.1.0",
92
92
  "@oslojs/webauthn": "^1.0.0",
@@ -97,7 +97,7 @@
97
97
  "drizzle-valibot": "^0.4.2",
98
98
  "fishery": "^2.4.0",
99
99
  "valibot": "^1.4.2",
100
- "@plumix/blocks": "0.2.0"
100
+ "@plumix/blocks": "0.4.0"
101
101
  },
102
102
  "peerDependencies": {
103
103
  "@playwright/test": "^1.61.1",
@@ -112,14 +112,14 @@
112
112
  }
113
113
  },
114
114
  "devDependencies": {
115
- "@arethetypeswrong/cli": "^0.18.4",
115
+ "@arethetypeswrong/cli": "^0.18.5",
116
116
  "@playwright/test": "^1.61.1",
117
117
  "@types/node": "^24.13.2",
118
118
  "@types/react": "^19.2.17",
119
119
  "@types/react-dom": "^19.2.3",
120
120
  "@vitest/coverage-v8": "^4.1.10",
121
121
  "esbuild": "^0.28.1",
122
- "eslint": "^10.6.0",
122
+ "eslint": "^10.7.0",
123
123
  "jsdom": "^29.1.1",
124
124
  "prettier": "^3.9.5",
125
125
  "publint": "^0.3.21",
@@ -1,39 +0,0 @@
1
- /**
2
- * `ArchiveProps` is the discriminated union the shared `archive` /
3
- * `index` fallback templates receive. Specific templates
4
- * (`taxonomy-category.tsx`, `single-post.tsx`, …) stay strictly typed
5
- * via `TemplateProps<K>` — themes that fall through to `archive` accept
6
- * the wider shape and narrow with `isTaxonomy` / `isEntryArchive`.
7
- *
8
- * Mirrors WordPress's `is_tax()` / `is_post_type_archive()` conditional
9
- * tags, but typed: each predicate also acts as a TypeScript type guard
10
- * so a single `if (isTaxonomy(props))` branch unlocks `props.term` and
11
- * `props.taxonomy` without casts.
12
- *
13
- * The shape is intentionally minimal at this slice — it carries the
14
- * fields a fallback template needs to discriminate and render. Slices
15
- * that add pagination, terms-as-children, and meta widen this without
16
- * breaking the discriminator.
17
- */
18
- export type ArchiveProps = EntryArchiveProps | TaxonomyArchiveProps;
19
- export interface EntryArchiveProps {
20
- readonly kind: "entry-archive";
21
- readonly entryType: string;
22
- readonly entries: readonly ArchiveEntry[];
23
- }
24
- export interface TaxonomyArchiveProps {
25
- readonly kind: "taxonomy";
26
- readonly taxonomy: string;
27
- readonly term: {
28
- readonly name: string;
29
- readonly slug: string;
30
- };
31
- readonly entries: readonly ArchiveEntry[];
32
- }
33
- export interface ArchiveEntry {
34
- readonly title: string;
35
- readonly slug: string;
36
- }
37
- export declare function isTaxonomy(props: ArchiveProps, taxonomy?: string): props is TaxonomyArchiveProps;
38
- export declare function isEntryArchive(props: ArchiveProps, entryType?: string): props is EntryArchiveProps;
39
- //# sourceMappingURL=archive-props.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive-props.d.ts","sourceRoot":"","sources":["../../../src/route/render/archive-props.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,KAAK,IAAI,oBAAoB,CAI/B;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,KAAK,IAAI,iBAAiB,CAI5B"}
@@ -1,32 +0,0 @@
1
- /**
2
- * `ArchiveProps` is the discriminated union the shared `archive` /
3
- * `index` fallback templates receive. Specific templates
4
- * (`taxonomy-category.tsx`, `single-post.tsx`, …) stay strictly typed
5
- * via `TemplateProps<K>` — themes that fall through to `archive` accept
6
- * the wider shape and narrow with `isTaxonomy` / `isEntryArchive`.
7
- *
8
- * Mirrors WordPress's `is_tax()` / `is_post_type_archive()` conditional
9
- * tags, but typed: each predicate also acts as a TypeScript type guard
10
- * so a single `if (isTaxonomy(props))` branch unlocks `props.term` and
11
- * `props.taxonomy` without casts.
12
- *
13
- * The shape is intentionally minimal at this slice — it carries the
14
- * fields a fallback template needs to discriminate and render. Slices
15
- * that add pagination, terms-as-children, and meta widen this without
16
- * breaking the discriminator.
17
- */
18
- export function isTaxonomy(props, taxonomy) {
19
- if (props.kind !== "taxonomy")
20
- return false;
21
- if (taxonomy === undefined)
22
- return true;
23
- return props.taxonomy === taxonomy;
24
- }
25
- export function isEntryArchive(props, entryType) {
26
- if (props.kind !== "entry-archive")
27
- return false;
28
- if (entryType === undefined)
29
- return true;
30
- return props.entryType === entryType;
31
- }
32
- //# sourceMappingURL=archive-props.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive-props.js","sourceRoot":"","sources":["../../../src/route/render/archive-props.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsBH,MAAM,UAAU,UAAU,CACxB,KAAmB,EACnB,QAAiB;IAEjB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAmB,EACnB,SAAkB;IAElB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;AACvC,CAAC"}