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).
45 lines
1.2 KiB
TypeScript
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)
|
|
}
|
|
}
|