@hazeljs/prompts 0.2.4 → 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.
@@ -56,5 +56,184 @@ describe('PromptTemplate', () => {
56
56
  expect(tpl.render({ defined: 'hello' })).toBe('hello {optional}');
57
57
  });
58
58
  });
59
+ describe('strict mode', () => {
60
+ it('should throw error when variable is missing in strict mode', () => {
61
+ const tpl = new template_1.PromptTemplate('Hello {name}!', { name: 'Test' });
62
+ expect(() => {
63
+ tpl.render({}, { strict: true });
64
+ }).toThrow('Missing required template variable');
65
+ });
66
+ it('should not throw in non-strict mode', () => {
67
+ const tpl = new template_1.PromptTemplate('Hello {name}!', { name: 'Test' });
68
+ expect(tpl.render({}, { strict: false })).toBe('Hello {name}!');
69
+ });
70
+ it('should allow undefined in non-strict mode by default', () => {
71
+ const tpl = new template_1.PromptTemplate('Hello {name}!', { name: 'Test' });
72
+ expect(tpl.render({})).toBe('Hello {name}!');
73
+ });
74
+ });
75
+ describe('conditionals {#if}', () => {
76
+ it('should render content when condition is true', () => {
77
+ const tpl = new template_1.PromptTemplate('{#if show}Visible{/if}', {
78
+ name: 'Conditional',
79
+ });
80
+ expect(tpl.render({ show: true })).toBe('Visible');
81
+ });
82
+ it('should not render content when condition is false', () => {
83
+ const tpl = new template_1.PromptTemplate('{#if show}Hidden{/if}', {
84
+ name: 'Conditional',
85
+ });
86
+ expect(tpl.render({ show: false })).toBe('');
87
+ });
88
+ it('should handle nested variables in conditional blocks', () => {
89
+ const tpl = new template_1.PromptTemplate('{#if show}Hello {name}!{/if}', { name: 'Conditional' });
90
+ expect(tpl.render({ show: true, name: 'World' })).toBe('Hello World!');
91
+ });
92
+ it('should handle multiple conditionals', () => {
93
+ const tpl = new template_1.PromptTemplate('{#if a}A{/if}{#if b}B{/if}', {
94
+ name: 'Multi',
95
+ });
96
+ expect(tpl.render({ a: true, b: false })).toBe('A');
97
+ expect(tpl.render({ a: false, b: true })).toBe('B');
98
+ expect(tpl.render({ a: true, b: true })).toBe('AB');
99
+ });
100
+ });
101
+ describe('loops {#each}', () => {
102
+ it('should iterate over array', () => {
103
+ const tpl = new template_1.PromptTemplate('{#each items}{.}{/each}', {
104
+ name: 'Loop',
105
+ });
106
+ expect(tpl.render({ items: ['a', 'b', 'c'] })).toBe('abc');
107
+ });
108
+ it('should handle empty arrays', () => {
109
+ const tpl = new template_1.PromptTemplate('{#each items}{.}{/each}', {
110
+ name: 'Loop',
111
+ });
112
+ expect(tpl.render({ items: [] })).toBe('');
113
+ });
114
+ it('should provide index in loops', () => {
115
+ const tpl = new template_1.PromptTemplate('{#each items}{@index}:{.} {/each}', {
116
+ name: 'Loop',
117
+ });
118
+ expect(tpl.render({ items: ['a', 'b'] })).toBe('0:a 1:b ');
119
+ });
120
+ it('should handle arrays with numbers', () => {
121
+ const tpl = new template_1.PromptTemplate('{#each nums}{.},{/each}', {
122
+ name: 'Loop',
123
+ });
124
+ expect(tpl.render({ nums: [1, 2, 3] })).toBe('1,2,3,');
125
+ });
126
+ });
127
+ describe('partials {@include}', () => {
128
+ it('should include partial templates', () => {
129
+ const partial = new template_1.PromptTemplate('Hello {name}!', { name: 'Greeting' });
130
+ const main = new template_1.PromptTemplate('Start {@include greeting} End', {
131
+ name: 'Main',
132
+ });
133
+ const includeResolver = (key) => {
134
+ if (key === 'greeting')
135
+ return partial.render({ name: 'World' });
136
+ return undefined;
137
+ };
138
+ const result = main.render({ name: 'World' }, { includeResolver });
139
+ expect(result).toBe('Start Hello World! End');
140
+ });
141
+ it('should handle missing partials gracefully', () => {
142
+ const tpl = new template_1.PromptTemplate('{@include missing}', {
143
+ name: 'Main',
144
+ });
145
+ expect(tpl.render({})).toBe('{@include missing}');
146
+ });
147
+ it('should pass variables to partials', () => {
148
+ const partial = new template_1.PromptTemplate('Value: {value}', { name: 'Partial' });
149
+ const main = new template_1.PromptTemplate('{@include part}', { name: 'Main' });
150
+ const includeResolver = (key) => {
151
+ if (key === 'part')
152
+ return partial.render({ value: 42 });
153
+ return undefined;
154
+ };
155
+ const result = main.render({ value: 42 }, { includeResolver });
156
+ expect(result).toBe('Value: 42');
157
+ });
158
+ });
159
+ describe('preview()', () => {
160
+ it('should generate preview with sample data and token estimate', () => {
161
+ const tpl = new template_1.PromptTemplate('Name: {name}, Age: {age}', {
162
+ name: 'Profile',
163
+ });
164
+ const preview = tpl.preview({ name: 'Alice', age: 30 });
165
+ expect(preview).toContain('Name: Alice, Age: 30');
166
+ expect(preview).toContain('Preview:');
167
+ expect(preview).toContain('tokens');
168
+ });
169
+ it('should work with conditionals in preview', () => {
170
+ const tpl = new template_1.PromptTemplate('{#if show}{msg}{/if}', {
171
+ name: 'Test',
172
+ });
173
+ const preview = tpl.preview({ show: true, msg: 'Hello' });
174
+ expect(preview).toContain('Hello');
175
+ expect(preview).toContain('Preview:');
176
+ });
177
+ it('should work with loops in preview', () => {
178
+ const tpl = new template_1.PromptTemplate('{#each items}{.} {/each}', {
179
+ name: 'Test',
180
+ });
181
+ const preview = tpl.preview({ items: [1, 2, 3] });
182
+ expect(preview).toContain('1 2 3');
183
+ expect(preview).toContain('Preview:');
184
+ });
185
+ });
186
+ describe('variables()', () => {
187
+ it('should extract simple variables', () => {
188
+ const tpl = new template_1.PromptTemplate('Hello {name}, you are {age} years old', { name: 'Test' });
189
+ const vars = tpl.variables();
190
+ expect(vars).toContain('name');
191
+ expect(vars).toContain('age');
192
+ expect(vars.length).toBe(2);
193
+ });
194
+ it('should extract variables from conditionals', () => {
195
+ const tpl = new template_1.PromptTemplate('{#if show}{msg}{/if}', {
196
+ name: 'Test',
197
+ });
198
+ const vars = tpl.variables();
199
+ expect(vars).toContain('show');
200
+ expect(vars).toContain('msg');
201
+ });
202
+ it('should extract variables from loops', () => {
203
+ const tpl = new template_1.PromptTemplate('{#each items}{item}{/each}', {
204
+ name: 'Test',
205
+ });
206
+ const vars = tpl.variables();
207
+ expect(vars).toContain('items');
208
+ });
209
+ it('should deduplicate variables', () => {
210
+ const tpl = new template_1.PromptTemplate('{name} and {name} again', { name: 'Test' });
211
+ const vars = tpl.variables();
212
+ expect(vars).toEqual(['name']);
213
+ });
214
+ it('should handle templates with no variables', () => {
215
+ const tpl = new template_1.PromptTemplate('Static text only', { name: 'Test' });
216
+ const vars = tpl.variables();
217
+ expect(vars).toEqual([]);
218
+ });
219
+ });
220
+ describe('complex scenarios', () => {
221
+ it('should handle nested conditionals and loops', () => {
222
+ const tpl = new template_1.PromptTemplate('{#if show}{#each items}- {.}\n{/each}{/if}', { name: 'Complex' });
223
+ expect(tpl.render({ show: true, items: ['a', 'b'] })).toBe('- a\n- b\n');
224
+ expect(tpl.render({ show: false, items: ['a', 'b'] })).toBe('');
225
+ });
226
+ it('should combine all features', () => {
227
+ const partial = new template_1.PromptTemplate('[{value}]', { name: 'Bracket' });
228
+ const tpl = new template_1.PromptTemplate('{#if show}{#each items}{@include bracket} {/each}{/if}', { name: 'All' });
229
+ const includeResolver = (key) => {
230
+ if (key === 'bracket')
231
+ return partial.render({ value: 'x' });
232
+ return undefined;
233
+ };
234
+ const result = tpl.render({ show: true, items: ['a', 'b'] }, { includeResolver });
235
+ expect(result).toContain('[');
236
+ });
237
+ });
59
238
  });
60
239
  //# sourceMappingURL=template.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.test.js","sourceRoot":"","sources":["../../src/__tests__/template.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template.test.js","sourceRoot":"","sources":["../../src/__tests__/template.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export type { PromptMetadata } from './types';
2
2
  export { PromptTemplate } from './template';
3
+ export type { RenderOptions } from './template';
3
4
  export { PromptRegistry } from './registry';
4
5
  export type { PromptEntry, PromptStore } from './stores/store.interface';
5
6
  export { MemoryStore } from './stores/memory.store';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AACvB,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AAIvB,sDAAoD;AAA3C,2GAAA,WAAW,OAAA;AACpB,kDAAgD;AAAvC,uGAAA,SAAS,OAAA;AAElB,oDAAkD;AAAzC,yGAAA,UAAU,OAAA;AAEnB,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AAEtB,oDAAkD;AAAzC,yGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AAEvB,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AAIvB,sDAAoD;AAA3C,2GAAA,WAAW,OAAA;AACpB,kDAAgD;AAAvC,uGAAA,SAAS,OAAA;AAElB,oDAAkD;AAAzC,yGAAA,UAAU,OAAA;AAEnB,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AAEtB,oDAAkD;AAAzC,yGAAA,UAAU,OAAA"}
@@ -4,6 +4,12 @@
4
4
  * A typed, reusable prompt template that interpolates named `{variable}`
5
5
  * placeholders with caller-supplied values.
6
6
  *
7
+ * Supports:
8
+ * - `{variable}` — simple substitution
9
+ * - `{#if variable}...{/if}` — conditional blocks
10
+ * - `{#each items}...{.}...{/each}` — iteration over arrays
11
+ * - `{@include key}` — include another prompt from the registry
12
+ *
7
13
  * Usage:
8
14
  * ```typescript
9
15
  * const tpl = new PromptTemplate<{ query: string; context: string }>(
@@ -13,8 +19,28 @@
13
19
  *
14
20
  * const rendered = tpl.render({ query: 'What is TypeScript?', context: '...' });
15
21
  * ```
22
+ *
23
+ * Strict mode:
24
+ * ```typescript
25
+ * tpl.render({ query: 'test' }, { strict: true });
26
+ * // throws: Missing required template variable: "context"
27
+ * ```
16
28
  */
17
29
  import type { PromptMetadata } from './types';
30
+ export interface RenderOptions {
31
+ /**
32
+ * When `true`, throws if any `{variable}` placeholder has no matching key
33
+ * in the supplied variables object.
34
+ * @default false
35
+ */
36
+ strict?: boolean;
37
+ /**
38
+ * Optional resolver for `{@include key}` directives.
39
+ * When not provided, `{@include ...}` blocks are left as-is.
40
+ * The PromptRegistry sets this automatically when calling `render()` through it.
41
+ */
42
+ includeResolver?: (key: string) => string | undefined;
43
+ }
18
44
  export declare class PromptTemplate<TVariables extends object = Record<string, unknown>> {
19
45
  /** The raw template string containing `{variableName}` placeholders. */
20
46
  readonly template: string;
@@ -31,8 +57,18 @@ export declare class PromptTemplate<TVariables extends object = Record<string, u
31
57
  *
32
58
  * - If a placeholder key is present in `variables` its value is `String()`-cast.
33
59
  * - If a placeholder key is NOT present it is left as-is (e.g. `{missing}`),
34
- * making missing variables easy to spot.
60
+ * making missing variables easy to spot — or throws in `strict` mode.
61
+ */
62
+ render(variables: TVariables, options?: RenderOptions): string;
63
+ /**
64
+ * Preview the rendered template — alias for `render()` with an estimated
65
+ * token count appended for debugging.
66
+ */
67
+ preview(variables: TVariables, options?: RenderOptions): string;
68
+ /**
69
+ * Extract all placeholder variable names from the template.
70
+ * Useful for introspection and validation.
35
71
  */
36
- render(variables: TVariables): string;
72
+ variables(): string[];
37
73
  }
38
74
  //# sourceMappingURL=template.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,qBAAa,cAAc,CAAC,UAAU,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3E,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,cAAc;;IAHjC,wEAAwE;IAC/D,QAAQ,EAAE,MAAM;IACzB,kEAAkE;IACzD,QAAQ,EAAE,cAAc;IAGnC;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;CAOtC"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACvD;AAED,qBAAa,cAAc,CAAC,UAAU,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3E,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,cAAc;;IAHjC,wEAAwE;IAC/D,QAAQ,EAAE,MAAM;IACzB,kEAAkE;IACzD,QAAQ,EAAE,cAAc;IAGnC;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM;IAyElE;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM;IAOnE;;;OAGG;IACH,SAAS,IAAI,MAAM,EAAE;CAgBtB"}
package/dist/template.js CHANGED
@@ -5,6 +5,12 @@
5
5
  * A typed, reusable prompt template that interpolates named `{variable}`
6
6
  * placeholders with caller-supplied values.
7
7
  *
8
+ * Supports:
9
+ * - `{variable}` — simple substitution
10
+ * - `{#if variable}...{/if}` — conditional blocks
11
+ * - `{#each items}...{.}...{/each}` — iteration over arrays
12
+ * - `{@include key}` — include another prompt from the registry
13
+ *
8
14
  * Usage:
9
15
  * ```typescript
10
16
  * const tpl = new PromptTemplate<{ query: string; context: string }>(
@@ -14,6 +20,12 @@
14
20
  *
15
21
  * const rendered = tpl.render({ query: 'What is TypeScript?', context: '...' });
16
22
  * ```
23
+ *
24
+ * Strict mode:
25
+ * ```typescript
26
+ * tpl.render({ query: 'test' }, { strict: true });
27
+ * // throws: Missing required template variable: "context"
28
+ * ```
17
29
  */
18
30
  Object.defineProperty(exports, "__esModule", { value: true });
19
31
  exports.PromptTemplate = void 0;
@@ -32,14 +44,96 @@ class PromptTemplate {
32
44
  *
33
45
  * - If a placeholder key is present in `variables` its value is `String()`-cast.
34
46
  * - If a placeholder key is NOT present it is left as-is (e.g. `{missing}`),
35
- * making missing variables easy to spot.
47
+ * making missing variables easy to spot — or throws in `strict` mode.
36
48
  */
37
- render(variables) {
49
+ render(variables, options = {}) {
38
50
  const vars = variables;
39
- return this.template.replace(/\{(\w+)\}/g, (match, key) => {
51
+ let result = this.template;
52
+ // Step 1: Resolve {@include key} directives
53
+ if (options.includeResolver) {
54
+ const resolver = options.includeResolver;
55
+ result = result.replace(/\{@include\s+([\w:.-]+)\}/g, (_match, key) => {
56
+ const included = resolver(key);
57
+ return included !== undefined ? included : _match;
58
+ });
59
+ }
60
+ // Step 2: Process {#if variable}...{/if} blocks
61
+ result = result.replace(/\{#if\s+(\w+)\}([\s\S]*?)\{\/if\}/g, (_match, key, body) => {
62
+ const value = vars[key];
63
+ // Truthy check: non-empty string, non-empty array, truthy value
64
+ const isTruthy = Array.isArray(value)
65
+ ? value.length > 0
66
+ : value !== undefined && value !== null && value !== '' && value !== false;
67
+ return isTruthy ? body : '';
68
+ });
69
+ // Step 3: Process {#each items}...{.}...{/each} blocks
70
+ result = result.replace(/\{#each\s+(\w+)\}([\s\S]*?)\{\/each\}/g, (_match, key, body) => {
71
+ const value = vars[key];
72
+ if (!Array.isArray(value))
73
+ return '';
74
+ return value
75
+ .map((item, index) => {
76
+ let rendered = body.replace(/\{\.\}/g, String(item));
77
+ rendered = rendered.replace(/\{@index\}/g, String(index));
78
+ return rendered;
79
+ })
80
+ .join('');
81
+ });
82
+ // Step 4: Strict mode — collect all remaining placeholders and check
83
+ if (options.strict) {
84
+ const placeholders = result.match(/\{(\w+)\}/g);
85
+ if (placeholders) {
86
+ const missing = [];
87
+ for (const placeholder of placeholders) {
88
+ const key = placeholder.slice(1, -1);
89
+ if (vars[key] === undefined) {
90
+ missing.push(key);
91
+ }
92
+ }
93
+ if (missing.length > 0) {
94
+ const unique = [...new Set(missing)];
95
+ throw new Error(`[PromptTemplate] Missing required template variable${unique.length > 1 ? 's' : ''}: ` +
96
+ `${unique.map((k) => `"${k}"`).join(', ')}. ` +
97
+ `Template: "${this.metadata.name}" (v${this.metadata.version ?? 'latest'})`);
98
+ }
99
+ }
100
+ }
101
+ // Step 5: Variable substitution
102
+ result = result.replace(/\{(\w+)\}/g, (match, key) => {
40
103
  const value = vars[key];
41
104
  return value !== undefined ? String(value) : match;
42
105
  });
106
+ return result;
107
+ }
108
+ /**
109
+ * Preview the rendered template — alias for `render()` with an estimated
110
+ * token count appended for debugging.
111
+ */
112
+ preview(variables, options = {}) {
113
+ const rendered = this.render(variables, options);
114
+ // Rough GPT tokenizer estimate: ~4 chars per token
115
+ const estimatedTokens = Math.ceil(rendered.length / 4);
116
+ return `${rendered}\n\n--- Preview: ~${estimatedTokens} tokens, ${rendered.length} chars ---`;
117
+ }
118
+ /**
119
+ * Extract all placeholder variable names from the template.
120
+ * Useful for introspection and validation.
121
+ */
122
+ variables() {
123
+ const found = new Set();
124
+ // Simple placeholders
125
+ for (const match of this.template.matchAll(/\{(\w+)\}/g)) {
126
+ found.add(match[1]);
127
+ }
128
+ // Conditional keys
129
+ for (const match of this.template.matchAll(/\{#if\s+(\w+)\}/g)) {
130
+ found.add(match[1]);
131
+ }
132
+ // Each keys
133
+ for (const match of this.template.matchAll(/\{#each\s+(\w+)\}/g)) {
134
+ found.add(match[1]);
135
+ }
136
+ return [...found];
43
137
  }
44
138
  }
45
139
  exports.PromptTemplate = PromptTemplate;
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAIH,MAAa,cAAc;IACzB;IACE,wEAAwE;IAC/D,QAAgB;IACzB,kEAAkE;IACzD,QAAwB;QAFxB,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,aAAQ,GAAR,QAAQ,CAAgB;IAChC,CAAC;IAEJ;;;;;;;OAOG;IACH,MAAM,CAAC,SAAqB;QAC1B,MAAM,IAAI,GAAG,SAAoC,CAAC;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAvBD,wCAuBC"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAoBH,MAAa,cAAc;IACzB;IACE,wEAAwE;IAC/D,QAAgB;IACzB,kEAAkE;IACzD,QAAwB;QAFxB,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,aAAQ,GAAR,QAAQ,CAAgB;IAChC,CAAC;IAEJ;;;;;;;OAOG;IACH,MAAM,CAAC,SAAqB,EAAE,UAAyB,EAAE;QACvD,MAAM,IAAI,GAAG,SAAoC,CAAC;QAClD,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE3B,4CAA4C;QAC5C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;YACzC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE;gBAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC/B,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,oCAAoC,EACpC,CAAC,MAAM,EAAE,GAAW,EAAE,IAAY,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,gEAAgE;YAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACnC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAClB,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,KAAK,CAAC;YAC7E,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC,CACF,CAAC;QAEF,uDAAuD;QACvD,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,wCAAwC,EACxC,CAAC,MAAM,EAAE,GAAW,EAAE,IAAY,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACrC,OAAO,KAAK;iBACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACnB,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1D,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CACF,CAAC;QAEF,qEAAqE;QACrE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAChD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrC,MAAM,IAAI,KAAK,CACb,sDAAsD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI;wBACpF,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;wBAC7C,cAAc,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,GAAG,CAC9E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,SAAqB,EAAE,UAAyB,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,mDAAmD;QACnD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,QAAQ,qBAAqB,eAAe,YAAY,QAAQ,CAAC,MAAM,YAAY,CAAC;IAChG,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,sBAAsB;QACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,mBAAmB;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC/D,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,YAAY;QACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACjE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,CAAC;CACF;AAxHD,wCAwHC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hazeljs/prompts",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "Typed, overridable prompt templates for HazelJS AI, RAG, and Agent packages",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -70,5 +70,5 @@
70
70
  }
71
71
  }
72
72
  },
73
- "gitHead": "e0c2d21ace726f2a0bf20c5baefad02e1e681ba9"
73
+ "gitHead": "14c91213d93aa7eb907cb71b1d7104ddc4556327"
74
74
  }