Files
deepseek-harness/packages/scaffold/helper/src/templates/text-template.ts
Tianyi Cui 3fc35c91ff refactor(packages): dissolve ui/ and rename sdk/ to scaffold/
git mv per the regrouping RFC: the five human-collaboration seams and
tui join packages/interaction/, app-boot becomes packages/boot/, and
jsonrpc joins the renamed scaffold/ (formerly sdk/) as its server half
beside client/protocol/create-sdk/helper/scripts/telemetry, whose
folders drop the legacy sdk- prefix. Three new group README triplets
replace the ui/ and sdk/ ones; tsconfig references/paths/globs,
knip keys, vitest globs, gate scripts, catalogs, docs, and the
lockfile follow. Adds the four settled FIXME rename markers
(dsh-sdk-server, dsh-sdk-telemetry, dsh-sdk-helper, dsh-sdk-scripts).

The scaffold folders diverge from their npm names until those renames
land, so tsconfig.base.json maps the three affected names explicitly
beside the group wildcard. Also repairs two pre-existing stale-path
classes the strengthened sweep surfaced: docs/web-styling.md's retired
web-ui host package and type-model spec fixture-literal joins.

app-boot's three Loader-composition specs time out at the default 5s
under full-suite parallel load on this filesystem (pre-existing;
pass isolated with --testTimeout=30000); interaction/scaffold/boot
suites otherwise green (687 passed).
2026-08-09 01:21:12 +08:00

45 lines
1.2 KiB
TypeScript

/**
* Strict typed rendering for package-owned text templates.
*
* @module @deepseek-ai/dsh-helper/templates/text-template
*/
import { readFileSync } from 'node:fs'
import Handlebars from 'handlebars'
/** Strict Handlebars template with no HTML escaping or custom extensions. */
export class TextTemplate<TModel extends object> {
private readonly renderer: Handlebars.TemplateDelegate<TModel>
/**
* Compile one template under the SDK's fixed rendering policy.
* @param source - complete template source.
*/
constructor(source: string) {
const handlebars = Handlebars.create()
this.renderer = handlebars.compile<TModel>(source, {
strict: true,
noEscape: true,
preventIndent: true,
})
}
/**
* Load a template asset owned by the calling package.
* @param url - source or bundled asset URL.
* @returns compiled template.
*/
static fromFile<T extends object>(url: URL): TextTemplate<T> {
return new TextTemplate<T>(readFileSync(url, 'utf8'))
}
/**
* Render text from one complete typed model.
* @param model - values referenced by the template.
* @returns rendered text.
*/
render(model: TModel): string {
return this.renderer(model)
}
}