@plumix/core 0.2.0 → 0.3.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 (69) hide show
  1. package/dist/debug-bar/panels/template.d.ts +5 -8
  2. package/dist/debug-bar/panels/template.d.ts.map +1 -1
  3. package/dist/debug-bar/panels/template.js +22 -8
  4. package/dist/debug-bar/panels/template.js.map +1 -1
  5. package/dist/debug-bar/primitives.d.ts +1 -1
  6. package/dist/debug-bar/primitives.d.ts.map +1 -1
  7. package/dist/debug-bar/primitives.js +1 -1
  8. package/dist/debug-bar/primitives.js.map +1 -1
  9. package/dist/debug-bar/styles.d.ts.map +1 -1
  10. package/dist/debug-bar/styles.js +9 -14
  11. package/dist/debug-bar/styles.js.map +1 -1
  12. package/dist/debug-bar/template-node-label.d.ts.map +1 -1
  13. package/dist/debug-bar/template-node-label.js +0 -2
  14. package/dist/debug-bar/template-node-label.js.map +1 -1
  15. package/dist/index.d.ts +7 -6
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +4 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/route/render/render-template.d.ts +6 -4
  20. package/dist/route/render/render-template.d.ts.map +1 -1
  21. package/dist/route/render/render-template.js +36 -48
  22. package/dist/route/render/render-template.js.map +1 -1
  23. package/dist/route/render/resolved-entry.d.ts +10 -5
  24. package/dist/route/render/resolved-entry.d.ts.map +1 -1
  25. package/dist/route/render/template-builders.d.ts +72 -0
  26. package/dist/route/render/template-builders.d.ts.map +1 -0
  27. package/dist/route/render/template-builders.js +113 -0
  28. package/dist/route/render/template-builders.js.map +1 -0
  29. package/dist/route/render/template-hierarchy.d.ts +53 -38
  30. package/dist/route/render/template-hierarchy.d.ts.map +1 -1
  31. package/dist/route/render/template-hierarchy.js +127 -74
  32. package/dist/route/render/template-hierarchy.js.map +1 -1
  33. package/dist/route/resolve.d.ts +3 -3
  34. package/dist/route/resolve.d.ts.map +1 -1
  35. package/dist/route/resolve.js +30 -32
  36. package/dist/route/resolve.js.map +1 -1
  37. package/dist/runtime/app.d.ts +0 -8
  38. package/dist/runtime/app.d.ts.map +1 -1
  39. package/dist/runtime/app.js +0 -38
  40. package/dist/runtime/app.js.map +1 -1
  41. package/dist/runtime/dispatcher.d.ts.map +1 -1
  42. package/dist/runtime/dispatcher.js +4 -7
  43. package/dist/runtime/dispatcher.js.map +1 -1
  44. package/dist/template-deps.js +1 -1
  45. package/dist/template-registry.d.ts +57 -0
  46. package/dist/template-registry.d.ts.map +1 -0
  47. package/dist/template-registry.js +1 -0
  48. package/dist/template-registry.js.map +1 -0
  49. package/dist/template.d.ts +2 -2
  50. package/dist/test/default-theme.d.ts.map +1 -1
  51. package/dist/test/default-theme.js +7 -6
  52. package/dist/test/default-theme.js.map +1 -1
  53. package/dist/theme-errors.d.ts +0 -3
  54. package/dist/theme-errors.d.ts.map +1 -1
  55. package/dist/theme-errors.js +7 -18
  56. package/dist/theme-errors.js.map +1 -1
  57. package/dist/theme.d.ts +59 -23
  58. package/dist/theme.d.ts.map +1 -1
  59. package/dist/theme.js +21 -10
  60. package/dist/theme.js.map +1 -1
  61. package/dist/welcome-theme.d.ts +2 -2
  62. package/dist/welcome-theme.d.ts.map +1 -1
  63. package/dist/welcome-theme.js +7 -6
  64. package/dist/welcome-theme.js.map +1 -1
  65. package/package.json +7 -7
  66. package/dist/route/render/archive-props.d.ts +0 -39
  67. package/dist/route/render/archive-props.d.ts.map +0 -1
  68. package/dist/route/render/archive-props.js +0 -32
  69. package/dist/route/render/archive-props.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-registry.js","sourceRoot":"","sources":["../src/template-registry.ts"],"names":[],"mappings":""}
@@ -61,13 +61,13 @@ export interface Template<TData extends TemplateData = TemplateData> extends Tem
61
61
  * bulk imports must ensure unique ids or sibling loader data
62
62
  * silently collides in the per-id result map.
63
63
  */
64
- readonly prefetchListingLoaders?: boolean;
64
+ readonly prefetchArchiveLoaders?: boolean;
65
65
  readonly [PLUMIX_TEMPLATE_BRAND]: true;
66
66
  }
67
67
  interface DefineTemplateConfig<TData extends TemplateData> extends TemplateDepDeclarations {
68
68
  readonly render: TemplateRender<TData>;
69
69
  readonly document?: TemplateDocument<TData>;
70
- readonly prefetchListingLoaders?: boolean;
70
+ readonly prefetchArchiveLoaders?: boolean;
71
71
  }
72
72
  export declare function defineTemplate<TData extends TemplateData = TemplateData>(config: DefineTemplateConfig<TData>): Template<TData>;
73
73
  export declare function isTemplate(value: unknown): value is Template<TemplateData>;
@@ -1 +1 @@
1
- {"version":3,"file":"default-theme.d.ts","sourceRoot":"","sources":["../../src/test/default-theme.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,gBAAgB,uCA4B3B,CAAC"}
1
+ {"version":3,"file":"default-theme.d.ts","sourceRoot":"","sources":["../../src/test/default-theme.tsx"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,uCA4B3B,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { fallback } from "../route/render/template-builders.js";
2
3
  import { renderTiptapContent } from "../route/render/tiptap.js";
3
4
  import { defineTheme } from "../theme.js";
4
5
  // Test-only theme that mirrors the structure of the dropped inline-HTML
5
6
  // fallback so resolver tests keep their `body.toContain("<h1>{title}</h1>")`
6
- // assertions. Authored as a single `index` template that branches on the
7
- // data shape — real themes narrow via the per-key registry.
7
+ // assertions. Authored as a single `fallback` template that branches on the
8
+ // data shape — real themes narrow via targeted/tier rules.
8
9
  export const defaultTestTheme = defineTheme({
9
- templates: {
10
- index({ data }) {
10
+ templates: [
11
+ fallback(({ data }) => {
11
12
  if ("entry" in data) {
12
13
  return (_jsxs("article", { children: [_jsx("h1", { children: data.entry.title }), data.entry.content ? (_jsx("div", { dangerouslySetInnerHTML: {
13
14
  __html: renderTiptapContent(data.entry.content),
@@ -17,8 +18,8 @@ export const defaultTestTheme = defineTheme({
17
18
  return (_jsxs(_Fragment, { children: ["term" in data ? _jsx("h1", { children: data.term.name }) : null, _jsx(EntryList, { entries: data.entries })] }));
18
19
  }
19
20
  return null;
20
- },
21
- },
21
+ }),
22
+ ],
22
23
  });
23
24
  function EntryList({ entries }) {
24
25
  if (entries.length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"default-theme.js","sourceRoot":"","sources":["../../src/test/default-theme.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,wEAAwE;AACxE,6EAA6E;AAC7E,yEAAyE;AACzE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;IAC1C,SAAS,EAAE;QACT,KAAK,CAAC,EAAE,IAAI,EAAE;YACZ,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACpB,OAAO,CACL,8BACE,uBAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAM,EAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACpB,cACE,uBAAuB,EAAE;gCACvB,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;6BAChD,GACD,CACH,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,OAAO,CACL,8BACG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,uBAAK,IAAI,CAAC,IAAI,CAAC,IAAI,GAAM,CAAC,CAAC,CAAC,IAAI,EAClD,KAAC,SAAS,IAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAI,IACnC,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF;CACF,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,EAAE,OAAO,EAAyC;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,0CAAsB,CAAC;IACxD,OAAO,CACL,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,uBACE,YAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,YAAG,CAAC,CAAC,KAAK,GAAK,IADvC,CAAC,CAAC,EAAE,CAER,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"default-theme.js","sourceRoot":"","sources":["../../src/test/default-theme.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAC5E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;IAC1C,SAAS,EAAE;QACT,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YACpB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACpB,OAAO,CACL,8BACE,uBAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAM,EAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACpB,cACE,uBAAuB,EAAE;gCACvB,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;6BAChD,GACD,CACH,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,OAAO,CACL,8BACG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,uBAAK,IAAI,CAAC,IAAI,CAAC,IAAI,GAAM,CAAC,CAAC,CAAC,IAAI,EAClD,KAAC,SAAS,IAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAI,IACnC,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;KACH;CACF,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,EAAE,OAAO,EAAyC;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,0CAAsB,CAAC;IACxD,OAAO,CACL,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,uBACE,YAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,YAAG,CAAC,CAAC,KAAK,GAAK,IADvC,CAAC,CAAC,EAAE,CAER,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC"}
@@ -3,19 +3,16 @@ export declare class ThemeRegistrationError extends Error {
3
3
  readonly code: ThemeRegistrationCode;
4
4
  private constructor();
5
5
  static missingTheme(): ThemeRegistrationError;
6
- static missingIndexTemplate(): ThemeRegistrationError;
7
6
  static legacyTemplateDepsShape(): ThemeRegistrationError;
8
7
  static themeDepFunctionForm(kind: string): ThemeRegistrationError;
9
8
  static documentInvalidLink(ctx: {
10
9
  index: number;
11
- slot?: string;
12
10
  }): ThemeRegistrationError;
13
11
  static invalidTemplate(ctx: {
14
12
  slot: string;
15
13
  }): ThemeRegistrationError;
16
14
  static documentInvalidScript(ctx: {
17
15
  index: number;
18
- slot?: string;
19
16
  }): ThemeRegistrationError;
20
17
  }
21
18
  export declare class ThemeError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"theme-errors.d.ts","sourceRoot":"","sources":["../src/theme-errors.ts"],"names":[],"mappings":"AAAA,KAAK,qBAAqB,GACtB,eAAe,GACf,wBAAwB,GACxB,4BAA4B,GAC5B,yBAAyB,GACzB,uBAAuB,GACvB,yBAAyB,GACzB,kBAAkB,CAAC;AAEvB,qBAAa,sBAAuB,SAAQ,KAAK;IAK/C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IAErC,OAAO;IAKP,MAAM,CAAC,YAAY,IAAI,sBAAsB;IAU7C,MAAM,CAAC,oBAAoB,IAAI,sBAAsB;IASrD,MAAM,CAAC,uBAAuB,IAAI,sBAAsB;IAWxD,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB;IAUjE,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,sBAAsB;IAa1B,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,sBAAsB;IAWrE,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,sBAAsB;CAY3B;AAED,qBAAa,UAAW,SAAQ,KAAK;IAKnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO;IAYP,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;IAYzE,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,UAAU;CAYf"}
1
+ {"version":3,"file":"theme-errors.d.ts","sourceRoot":"","sources":["../src/theme-errors.ts"],"names":[],"mappings":"AAAA,KAAK,qBAAqB,GACtB,eAAe,GACf,wBAAwB,GACxB,4BAA4B,GAC5B,yBAAyB,GACzB,uBAAuB,GACvB,yBAAyB,GACzB,kBAAkB,CAAC;AAEvB,qBAAa,sBAAuB,SAAQ,KAAK;IAK/C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IAErC,OAAO;IAKP,MAAM,CAAC,YAAY,IAAI,sBAAsB;IAU7C,MAAM,CAAC,uBAAuB,IAAI,sBAAsB;IAWxD,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB;IAUjE,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,sBAAsB;IAU1E,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,sBAAsB;IAWrE,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,sBAAsB;CAS7E;AAED,qBAAa,UAAW,SAAQ,KAAK;IAKnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO;IAYP,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;IAYzE,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,UAAU;CAYf"}
@@ -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, 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,62 @@ 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 | 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 isFrontPage(data: TemplateData): data is FrontPageData;
22
+ export declare function isSearch(data: TemplateData): data is SearchData;
23
+ export declare function isError(data: TemplateData): data is ErrorData;
16
24
  export type TemplateComponent<Data> = ComponentType<{
17
25
  readonly data: Data;
18
26
  }>;
19
27
  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>;
28
+ /**
29
+ * The fixed set of generic tiers a theme's `templates` array can declare. Each
30
+ * matches one resolved-node kind (`entry`→content, `archive`→content-type
31
+ * archive, `taxonomy`→term, `frontPage`/`search`), plus `fallback`
32
+ * (the universal catch-all) and the `notFound`/`serverError` condition handlers.
33
+ * Type/term-specific matchers arrive in a later slice.
34
+ */
35
+ export type GenericTier = "fallback" | "entry" | "archive" | "taxonomy" | "frontPage" | "search" | "notFound" | "serverError";
36
+ /**
37
+ * How a targeted rule (from `forEntryType`/`forTermTaxonomy`) matches a resolved
38
+ * node: by node kind + type name, optionally narrowed to one entry/term by
39
+ * `slug` or `id`.
40
+ */
41
+ export interface TargetMatcher {
42
+ readonly nodeKind: "content" | "content-type-archive" | "term";
43
+ readonly type: string;
44
+ readonly slug?: string;
45
+ readonly id?: number;
46
+ /**
47
+ * A runtime predicate over the resolved data (`whereMeta`/`where`/`named`),
48
+ * evaluated after the identity match. Data-dependent, so the resolver must be
49
+ * given the resolved data to honour it.
50
+ */
51
+ readonly predicate?: (data: TemplateData) => boolean;
52
+ /** For an author-selectable (`named`) template: its id + editor label. */
53
+ readonly named?: {
54
+ readonly id: string;
55
+ readonly label: string;
56
+ };
57
+ }
58
+ /**
59
+ * One entry in a theme's `templates` array: a template bound to either a
60
+ * generic `tier` or a targeted `match`. Exactly one is set — the builders never
61
+ * produce both.
62
+ */
63
+ export interface TemplateRule {
64
+ readonly template: TemplateEntry<TemplateData>;
65
+ readonly tier?: GenericTier;
66
+ readonly match?: TargetMatcher;
67
+ }
21
68
  /**
22
69
  * Strip React-isms that don't belong in HTML attribute descriptors:
23
70
  * `key`/`ref` are React infrastructure; `on*` handlers don't apply
@@ -43,24 +90,13 @@ export interface DocumentManifest {
43
90
  readonly title?: string;
44
91
  readonly titleTemplate?: string | ((title: string | undefined) => string);
45
92
  }
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
93
  export interface ThemeDescriptor extends TemplateDepDeclarations {
63
- readonly templates: TemplateRegistry;
94
+ /**
95
+ * The theme's templates: an array of builder rules (`fallback(...)`,
96
+ * `forEntryType(...).template(...)`, …), or a bare component as fallback-only
97
+ * shorthand.
98
+ */
99
+ readonly templates: readonly TemplateRule[] | TemplateEntry<TemplateData>;
64
100
  readonly document?: DocumentManifest;
65
101
  readonly tokens?: ThemeTokens;
66
102
  /**
@@ -86,6 +122,6 @@ export interface ThemeDescriptor extends TemplateDepDeclarations {
86
122
  readonly css?: readonly string[];
87
123
  }
88
124
  export declare function defineTheme(descriptor: ThemeDescriptor): ThemeDescriptor;
89
- export declare function validateDocumentManifest(manifest: DocumentManifest, slot?: string): void;
125
+ export declare function validateDocumentManifest(manifest: DocumentManifest): void;
90
126
  export {};
91
127
  //# 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,26 @@
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 isFrontPage(data) {
13
+ return data.kind === "frontPage";
14
+ }
15
+ export function isSearch(data) {
16
+ return data.kind === "search";
17
+ }
18
+ export function isError(data) {
19
+ return data.kind === "error";
20
+ }
3
21
  const TOKEN_SLUG_RE = /^[a-z][a-z0-9-]*$/;
4
22
  const TOKEN_VALUE_FORBIDDEN_CHARS = /[;{}\\\n\r]|\/\*|\*\//;
5
23
  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
24
  if ("templateDeps" in descriptor) {
14
25
  throw ThemeRegistrationError.legacyTemplateDepsShape();
15
26
  }
@@ -33,10 +44,10 @@ export function defineTheme(descriptor) {
33
44
  // can't recover from gracefully — link entries without `rel` (browsers
34
45
  // ignore them, invalid HTML) and scripts with no src + no inline body
35
46
  // (dead weight, signals a plugin bug worth surfacing loud).
36
- export function validateDocumentManifest(manifest, slot) {
47
+ export function validateDocumentManifest(manifest) {
37
48
  manifest.link?.forEach((entry, index) => {
38
49
  if (typeof entry.rel !== "string" || entry.rel.length === 0) {
39
- throw ThemeRegistrationError.documentInvalidLink({ index, slot });
50
+ throw ThemeRegistrationError.documentInvalidLink({ index });
40
51
  }
41
52
  });
42
53
  manifest.script?.forEach((entry, index) => {
@@ -45,7 +56,7 @@ export function validateDocumentManifest(manifest, slot) {
45
56
  const hasInnerHtml = typeof entry.dangerouslySetInnerHTML?.__html === "string" &&
46
57
  entry.dangerouslySetInnerHTML.__html.length > 0;
47
58
  if (!hasSrc && !hasChildren && !hasInnerHtml) {
48
- throw ThemeRegistrationError.documentInvalidScript({ index, slot });
59
+ throw ThemeRegistrationError.documentInvalidScript({ index });
49
60
  }
50
61
  });
51
62
  }
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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"}
@@ -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.3.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.3.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"}