docs(adr): ADR-0010: Server-Side Reference Implementation Scripts
@aRustyDev 已经在做这个了。
开始于 2026年1月5日。
评估
这个 Issue 还没有评估数据。
描述
ADR-0010: Server-Side Reference Implementation Scripts
Status
Accepted
Context
mdbook-htmx generates static files (HTML, JSON manifests, search indexes) but requires server-side logic to:
- Serve appropriate content based on
HX-Requestheader - Implement search endpoints
- Handle authentication/authorization
- Manage scope switching
Users need guidance on implementing these server-side behaviors. The question: should the backend generate reference implementation scripts?
Decision Drivers
- Developer Experience - Reduce time-to-working-deployment
- HTMX Philosophy - Server-side code is expected and encouraged
- Portability - Scripts should work across runtimes (Workers, Node, Deno)
- Maintainability - Reference code needs ongoing updates
- Flexibility - Users may have different server frameworks
Decision
Generate TypeScript reference implementation scripts in book/htmx/scripts/.
These scripts are:
- Reference implementations, not required
- TypeScript for type safety and self-documentation
- Runtime-agnostic (work with Workers, Node, Deno, Bun)
- Framework-agnostic (use Web APIs, adapt to Hono/Express/etc.)
HTMX Alignment
This decision is fully aligned with HTMX philosophy:
| Principle | How Scripts Align |
|---|---|
| Server returns HTML | Scripts render HTML responses |
| Minimal client-side JS | Zero client-side code in scripts |
| Server is source of truth | Scripts manage state, auth, scope |
| Progressive enhancement | Scripts serve full pages and fragments |
HTMX's "minimal JS" applies to the client. Server-side code in any language is expected.
Output Structure
book/htmx/scripts/
├── types.ts # Shared type definitions
├── manifest-loader.ts # Load and cache manifests
├── search.ts # Search endpoint handler
├── authn.ts # Authentication middleware
├── authz.ts # Authorization middleware
├── scope.ts # Scope switching logic
├── htmx-utils.ts # HX-Request detection, OOB helpers
├── meili-proxy.ts # Meilisearch proxy (if external search enabled)
└── README.md # Usage documentation
Deployment Patterns
These scripts support multiple deployment architectures:
In-Memory Search (Simple Sites)
Worker bundles search index directly:
import searchIndex from "./search-index.json";
// Use Fuse.js/MiniSearch with bundled index
External Search via Cloudflare Tunnel (Recommended for Production)
Worker acts as policy enforcement proxy to self-hosted Meilisearch:
Worker → Cloudflare Tunnel → Private Meilisearch
Key security properties:
- Meilisearch never internet-facing
- Worker validates auth before searching
- Query inputs sanitized (length limits, filter whitelists)
- API keys server-side only (never sent to browser)
- Results authorization-filtered at runtime
See examples/meilisearch-cf-tunnel.md for complete implementation.
Script Contents
types.ts
// Generated from manifest schema
export interface Page {
path: string;
title: string;
file: string;
fragment: string;
auth: {
access: 'public' | 'authenticated' | 'roles';
roles?: string[];
fallback?: string;
};
scopes: string[];
}
export interface Manifest {
version: string;
generated: string;
scopes: {
available: string[];
default: string;
};
pages: Page[];
navigation: NavigationItem[];
}
export interface User {
id: string;
roles: string[];
preferences?: {
scope?: string;
};
}
htmx-utils.ts
export function isHtmxRequest(request: Request): boolean {
return request.headers.get('HX-Request') === 'true';
}
export function oobSwap(id: string, content: string): string {
return `<div id="${id}" hx-swap-oob="true">${content}</div>`;
}
export function htmxRedirect(url: string): Response {
return new Response(null, {
status: 200,
headers: { 'HX-Redirect': url }
});
}
authz.ts
import type { Page, User } from './types';
export function isAuthorized(user: User | null, page: Page): boolean {
switch (page.auth.access) {
case 'public':
return true;
case 'authenticated':
return user !== null;
case 'roles':
return page.auth.roles?.some(role => user?.roles?.includes(role)) ?? false;
default:
return false;
}
}
Configuration
[output.htmx.scripts]
enabled = true # Generate reference scripts
language = "typescript" # typescript | javascript
runtime = "workers" # workers | node | deno | bun
framework = "hono" # hono | express | none
Consequences
Positive
- Faster time-to-deployment
- Types document the manifest schema
- Consistent patterns across deployments
- Testable reference implementations
Negative
- Maintenance burden (scripts need updates)
- May not fit all server architectures
- Users might copy without understanding
Mitigation
- Clear "reference implementation" labeling
- Extensive inline documentation
- Integration tests in mdbook-htmx repo
- Version scripts with manifest schema
Alternatives Considered
No Scripts (Documentation Only)
Provide patterns in docs, no generated code.
Rejected because:
- Higher barrier to entry
- Documentation drifts from actual implementation
- Users reinvent the wheel
Generate Full Server Application
Generate complete deployable server.
Rejected because:
- Too opinionated
- Hard to customize
- Framework lock-in
References
- 主要语言
- Rust
- 星标
- 0
- 派生
- 1
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
aRustyDev/mdbook-htmx 的其他 Issue
-
feat(ci): Implement cross-repo-validate compliance for docs sync可能重新可做 @aRustyDev 于 294 天前认领,目前没有进行中的 PR。 未关闭ci enhancement
aRustyDev/mdbook-htmx#58 · 1 条评论 · 已指派 1 人 ·
-
docs(htmx): Explain how HTMX works可能重新可做 @aRustyDev 于 296 天前认领,目前没有进行中的 PR。 未关闭
aRustyDev/mdbook-htmx#48 · 3 条评论 · 已指派 1 人 ·
-
docs(mdbook-htmx): Parent Issue for documentation可能重新可做 @aRustyDev 于 296 天前认领,目前没有进行中的 PR。 未关闭documentation
aRustyDev/mdbook-htmx#47 · 已指派 1 人 ·
-
docs(examples): Secure Self-Hosted Meilisearch via Cloudflare可能重新可做 @aRustyDev 于 296 天前认领,目前没有进行中的 PR。 未关闭documentation
aRustyDev/mdbook-htmx#46 · 已指派 1 人 ·
-
docs(examples): Kubernetes with Meilisearch可能重新可做 @aRustyDev 于 296 天前认领,目前没有进行中的 PR。 未关闭documentation
aRustyDev/mdbook-htmx#45 · 已指派 1 人 ·
查看 aRustyDev/mdbook-htmx 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 85/100
FalkorDB/FalkorDB#3597 · 1 条评论 ·
维护者通常 2 天内回复
-
难度 2/5 1-3 小时 新手友好度 76/100
维护者通常 1 天内回复
-
needs triage
难度 2/5 1-3 小时 新手友好度 65/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 65/100
-
难度 2/5 1-3 小时 新手友好度 72/100
mozilla-services/syncstorage-rs#2715 ·
维护者通常 1 天内回复