Files
ocas/packages/core/src/output-templates.ts
T
xiaoju e53f473fc2 refactor(core): update all functions to accept OcasStore (single param)
- bootstrap(store) — uses store.cas + store.var
- gc(store) — uses store.cas + store.var
- render/renderAsync/renderDirect — uses store.cas + store.var for templates
- refs/walk/validate/getSchema/putSchema — uses store.cas
- wrapEnvelope — uses store.cas + store.var
- registerOutputTemplates — uses store.cas + store.var
- Remove VariableStore SQLite class from @ocas/core
- Zero bun:sqlite imports in core
- Update @ocas/fs and @ocas/cli to new signatures
- 560 tests pass

Fixes #41
2026-06-02 08:15:07 +00:00

90 lines
3.0 KiB
TypeScript

import { bootstrap } from "./bootstrap.js";
import type { Hash, OcasStore } from "./types.js";
const DEFAULT_TEMPLATES: ReadonlyArray<
readonly [alias: string, template: string]
> = [
["@ocas/output/put", "{{ payload }}"],
[
"@ocas/output/get",
"type: {{ payload.type }}\ntimestamp: {{ payload.timestamp }}",
],
["@ocas/output/has", "{{ payload }}"],
["@ocas/output/hash", "{{ payload }}"],
["@ocas/output/verify", "{{ payload }}"],
["@ocas/output/refs", "{% for ref in payload %}{{ ref }}\n{% endfor %}"],
["@ocas/output/walk", "{% for item in payload %}{{ item }}\n{% endfor %}"],
["@ocas/output/list", "{% for item in payload %}{{ item }}\n{% endfor %}"],
[
"@ocas/output/var-set",
"name: {{ payload.name }}\nschema: {{ payload.schema }}\nvalue: {{ payload.value }}",
],
[
"@ocas/output/var-get",
"name: {{ payload.name }}\nschema: {{ payload.schema }}\nvalue: {{ payload.value }}",
],
[
"@ocas/output/var-delete",
"name: {{ payload.name }}\nschema: {{ payload.schema }}\nvalue: {{ payload.value }}",
],
[
"@ocas/output/var-tag",
"name: {{ payload.name }}\nschema: {{ payload.schema }}\nvalue: {{ payload.value }}",
],
[
"@ocas/output/var-list",
"{% for v in payload %}name: {{ v.name }}\nschema: {{ v.schema }}\nvalue: {{ v.value }}\n{% endfor %}",
],
[
"@ocas/output/var-history",
"name: {{ payload.name }}\nschema: {{ payload.schema }}\n{% for v in payload.values %}{{ forloop.index0 }}: {{ v }}\n{% endfor %}",
],
[
"@ocas/output/template-set",
"schemaHash: {{ payload.schemaHash }}\ncontentHash: {{ payload.contentHash }}",
],
["@ocas/output/template-get", "{{ payload }}"],
[
"@ocas/output/template-list",
"{% for t in payload %}schemaHash: {{ t.schemaHash }}\ncontentHash: {{ t.contentHash }}\n{% endfor %}",
],
["@ocas/output/template-delete", "deleted: {{ payload.deleted }}"],
[
"@ocas/output/gc",
"total: {{ payload.total }}\nreachable: {{ payload.reachable }}\ncollected: {{ payload.collected }}\nscanned: {{ payload.scanned }}",
],
];
/**
* Register default LiquidJS templates for all @ocas/output/* schemas.
* Each template is stored as a @ocas/string CAS node and bound to
* the variable `@ocas/template/text/<schema-hash>`.
*
* Idempotent: safe to call multiple times.
*/
export async function registerOutputTemplates(
store: OcasStore,
): Promise<Record<string, Hash>> {
const aliases = await bootstrap(store);
const stringHash = aliases["@ocas/string"];
if (stringHash === undefined) {
throw new Error("@ocas/string schema not found in bootstrap result");
}
const registered: Record<string, Hash> = {};
for (const [alias, template] of DEFAULT_TEMPLATES) {
const schemaHash = aliases[alias];
if (schemaHash === undefined) {
throw new Error(`Schema alias not found: ${alias}`);
}
const contentHash = store.cas.put(stringHash, template);
const varName = `@ocas/template/text/${schemaHash}`;
store.var.set(varName, contentHash);
registered[alias] = contentHash;
}
return registered;
}