@pixerate/editor 0.1.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.
@@ -0,0 +1,401 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/grammar/index.ts
21
+ var grammar_exports = {};
22
+ __export(grammar_exports, {
23
+ INSTRUCTION_REGEX: () => INSTRUCTION_REGEX,
24
+ TEMPLATE_REGEX: () => TEMPLATE_REGEX,
25
+ VARIABLE_REGEX: () => VARIABLE_REGEX,
26
+ extractInstructionNames: () => extractInstructionNames,
27
+ extractTemplateNames: () => extractTemplateNames,
28
+ extractVariableNames: () => extractVariableNames,
29
+ getLatestVersion: () => getLatestVersion,
30
+ instructionRegex: () => instructionRegex,
31
+ mapRawOffsetToResolved: () => mapRawOffsetToResolved,
32
+ mapResolvedOffsetToRaw: () => mapResolvedOffsetToRaw,
33
+ resolveTemplates: () => resolveTemplates,
34
+ resolveTemplatesWithMapping: () => resolveTemplatesWithMapping,
35
+ resolveVariables: () => resolveVariables,
36
+ templateRegex: () => templateRegex,
37
+ tokenizePrompt: () => tokenizePrompt,
38
+ variableRegex: () => variableRegex
39
+ });
40
+ module.exports = __toCommonJS(grammar_exports);
41
+
42
+ // src/grammar/tokens.ts
43
+ var TEMPLATE_REGEX = /{{\s*([^}]+?)\s*}}/g;
44
+ var VARIABLE_REGEX = /(?<!\{)\{([^{}]+)\}(?!\})/g;
45
+ var INSTRUCTION_REGEX = /__(.+?)__/g;
46
+ var templateRegex = TEMPLATE_REGEX;
47
+ var variableRegex = VARIABLE_REGEX;
48
+ var instructionRegex = INSTRUCTION_REGEX;
49
+
50
+ // src/grammar/tokenizer.ts
51
+ function tokenizePrompt(text) {
52
+ if (!text) {
53
+ return [];
54
+ }
55
+ const rawMatches = [];
56
+ const tmplRegex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);
57
+ let match;
58
+ while ((match = tmplRegex.exec(text)) !== null) {
59
+ rawMatches.push({
60
+ type: "template",
61
+ raw: match[0],
62
+ value: match[1].trim(),
63
+ start: match.index,
64
+ end: match.index + match[0].length
65
+ });
66
+ }
67
+ const varRegex = new RegExp(VARIABLE_REGEX.source, VARIABLE_REGEX.flags);
68
+ while ((match = varRegex.exec(text)) !== null) {
69
+ const start = match.index;
70
+ const end = start + match[0].length;
71
+ const overlaps = rawMatches.some(
72
+ (m) => !(end <= m.start || start >= m.end)
73
+ );
74
+ if (!overlaps) {
75
+ rawMatches.push({
76
+ type: "variable",
77
+ raw: match[0],
78
+ value: match[1].trim(),
79
+ start,
80
+ end
81
+ });
82
+ }
83
+ }
84
+ const instRegex = new RegExp(
85
+ INSTRUCTION_REGEX.source,
86
+ INSTRUCTION_REGEX.flags
87
+ );
88
+ while ((match = instRegex.exec(text)) !== null) {
89
+ const start = match.index;
90
+ const end = start + match[0].length;
91
+ const overlaps = rawMatches.some(
92
+ (m) => !(end <= m.start || start >= m.end)
93
+ );
94
+ if (!overlaps) {
95
+ rawMatches.push({
96
+ type: "instruction",
97
+ raw: match[0],
98
+ value: match[1].trim(),
99
+ start,
100
+ end
101
+ });
102
+ }
103
+ }
104
+ rawMatches.sort((a, b) => a.start - b.start);
105
+ const tokens = [];
106
+ let currentIdx = 0;
107
+ for (const m of rawMatches) {
108
+ if (m.start > currentIdx) {
109
+ const textChunk = text.slice(currentIdx, m.start);
110
+ tokens.push({
111
+ type: "text",
112
+ raw: textChunk,
113
+ value: textChunk,
114
+ start: currentIdx,
115
+ end: m.start
116
+ });
117
+ }
118
+ tokens.push({
119
+ type: m.type,
120
+ raw: m.raw,
121
+ value: m.value,
122
+ start: m.start,
123
+ end: m.end
124
+ });
125
+ currentIdx = m.end;
126
+ }
127
+ if (currentIdx < text.length) {
128
+ const textChunk = text.slice(currentIdx);
129
+ tokens.push({
130
+ type: "text",
131
+ raw: textChunk,
132
+ value: textChunk,
133
+ start: currentIdx,
134
+ end: text.length
135
+ });
136
+ }
137
+ return tokens;
138
+ }
139
+
140
+ // src/grammar/resolver.ts
141
+ function getLatestVersion(template) {
142
+ if (!template.versions || template.versions.length === 0) {
143
+ if (template.body !== void 0) {
144
+ return {
145
+ id: template.id || "default",
146
+ version: "1.0",
147
+ body: template.body
148
+ };
149
+ }
150
+ return void 0;
151
+ }
152
+ if (template.latestVersion) {
153
+ const found = template.versions.find(
154
+ (v) => v.version === template.latestVersion
155
+ );
156
+ if (found) return found;
157
+ }
158
+ return template.versions[template.versions.length - 1];
159
+ }
160
+ function resolveTemplates(text, templates = [], options) {
161
+ const templateMap = /* @__PURE__ */ new Map();
162
+ for (const t of templates) {
163
+ templateMap.set(t.name, t);
164
+ }
165
+ const maxDepth = options?.maxDepth ?? 10;
166
+ function resolveRecursive(currentText, visited, depth) {
167
+ if (depth > maxDepth) {
168
+ return "[Template max depth exceeded]";
169
+ }
170
+ let result = currentText;
171
+ const regex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);
172
+ let match;
173
+ while ((match = regex.exec(result)) !== null) {
174
+ const [fullMatch, rawTemplateName] = match;
175
+ const templateName = rawTemplateName.trim();
176
+ if (visited.has(templateName)) {
177
+ return "[Template loop detected]";
178
+ }
179
+ const template = templateMap.get(templateName);
180
+ if (!template) {
181
+ continue;
182
+ }
183
+ let versionBody;
184
+ const boundVersionId = options?.bindings?.[templateName];
185
+ if (boundVersionId && template.versions) {
186
+ const boundVersion = template.versions.find(
187
+ (v) => v.id === boundVersionId || v.version === boundVersionId
188
+ );
189
+ versionBody = boundVersion?.body;
190
+ } else {
191
+ const latest = getLatestVersion(template);
192
+ versionBody = latest?.body ?? template.body;
193
+ }
194
+ if (versionBody === void 0) {
195
+ continue;
196
+ }
197
+ const nextVisited = new Set(visited);
198
+ nextVisited.add(templateName);
199
+ const resolvedBody = resolveRecursive(
200
+ versionBody,
201
+ nextVisited,
202
+ depth + 1
203
+ );
204
+ if (resolvedBody === "[Template loop detected]" || resolvedBody === "[Template max depth exceeded]") {
205
+ return resolvedBody;
206
+ }
207
+ result = result.replace(fullMatch, resolvedBody);
208
+ regex.lastIndex = 0;
209
+ }
210
+ return result;
211
+ }
212
+ return resolveRecursive(text, /* @__PURE__ */ new Set(), 0);
213
+ }
214
+ function resolveVariables(text, values) {
215
+ if (!text) return "";
216
+ return text.replace(
217
+ new RegExp(VARIABLE_REGEX.source, VARIABLE_REGEX.flags),
218
+ (fullMatch, varName) => {
219
+ const key = varName.trim();
220
+ if (Object.prototype.hasOwnProperty.call(values, key)) {
221
+ return String(values[key]);
222
+ }
223
+ return fullMatch;
224
+ }
225
+ );
226
+ }
227
+ function extractTemplateNames(text) {
228
+ if (!text) return [];
229
+ const set = /* @__PURE__ */ new Set();
230
+ const regex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);
231
+ let match;
232
+ while ((match = regex.exec(text)) !== null) {
233
+ set.add(match[1].trim());
234
+ }
235
+ return Array.from(set);
236
+ }
237
+ function extractVariableNames(text) {
238
+ if (!text) return [];
239
+ const set = /* @__PURE__ */ new Set();
240
+ const regex = new RegExp(VARIABLE_REGEX.source, VARIABLE_REGEX.flags);
241
+ let match;
242
+ while ((match = regex.exec(text)) !== null) {
243
+ set.add(match[1].trim());
244
+ }
245
+ return Array.from(set);
246
+ }
247
+ function extractInstructionNames(text) {
248
+ if (!text) return [];
249
+ const set = /* @__PURE__ */ new Set();
250
+ const regex = new RegExp(INSTRUCTION_REGEX.source, INSTRUCTION_REGEX.flags);
251
+ let match;
252
+ while ((match = regex.exec(text)) !== null) {
253
+ set.add(match[1].trim());
254
+ }
255
+ return Array.from(set);
256
+ }
257
+
258
+ // src/grammar/sourcemap.ts
259
+ function resolveTemplatesWithMapping(text, templates = [], templateBindings) {
260
+ if (!templates || templates.length === 0 || !text.includes("{{")) {
261
+ return {
262
+ text,
263
+ map: [
264
+ {
265
+ resolvedStart: 0,
266
+ resolvedEnd: text.length,
267
+ source: "raw",
268
+ rawStart: 0,
269
+ rawEnd: text.length
270
+ }
271
+ ]
272
+ };
273
+ }
274
+ const templateMap = new Map(templates.map((t) => [t.name, t]));
275
+ const regex = /{{\s*([^}]+?)\s*}}/g;
276
+ let match;
277
+ let lastIndex = 0;
278
+ let resolvedText = "";
279
+ const map = [];
280
+ while ((match = regex.exec(text)) !== null) {
281
+ const [fullMatch, rawTemplateName] = match;
282
+ const templateName = rawTemplateName.trim();
283
+ const matchIndex = match.index;
284
+ if (matchIndex > lastIndex) {
285
+ const rawSegment = text.substring(lastIndex, matchIndex);
286
+ map.push({
287
+ resolvedStart: resolvedText.length,
288
+ resolvedEnd: resolvedText.length + rawSegment.length,
289
+ source: "raw",
290
+ rawStart: lastIndex,
291
+ rawEnd: matchIndex
292
+ });
293
+ resolvedText += rawSegment;
294
+ }
295
+ let resolvedBody = fullMatch;
296
+ let isTemplate = false;
297
+ if (templateMap.has(templateName)) {
298
+ const template = templateMap.get(templateName);
299
+ let versionBody;
300
+ const boundVersionId = templateBindings?.[templateName];
301
+ if (boundVersionId && template.versions) {
302
+ const boundVersion = template.versions.find(
303
+ (v) => v.id === boundVersionId || v.version === boundVersionId
304
+ );
305
+ versionBody = boundVersion?.body;
306
+ } else {
307
+ const latestVersion = getLatestVersion(template);
308
+ versionBody = latestVersion?.body ?? template.body;
309
+ }
310
+ if (versionBody !== void 0) {
311
+ resolvedBody = resolveTemplates(versionBody, templates, {
312
+ bindings: templateBindings
313
+ });
314
+ isTemplate = true;
315
+ }
316
+ }
317
+ if (isTemplate) {
318
+ map.push({
319
+ resolvedStart: resolvedText.length,
320
+ resolvedEnd: resolvedText.length + resolvedBody.length,
321
+ source: "template",
322
+ rawStart: matchIndex,
323
+ rawEnd: matchIndex + fullMatch.length,
324
+ templateName
325
+ });
326
+ resolvedText += resolvedBody;
327
+ } else {
328
+ map.push({
329
+ resolvedStart: resolvedText.length,
330
+ resolvedEnd: resolvedText.length + fullMatch.length,
331
+ source: "raw",
332
+ rawStart: matchIndex,
333
+ rawEnd: matchIndex + fullMatch.length
334
+ });
335
+ resolvedText += fullMatch;
336
+ }
337
+ lastIndex = matchIndex + fullMatch.length;
338
+ }
339
+ if (lastIndex < text.length) {
340
+ const rawSegment = text.substring(lastIndex);
341
+ map.push({
342
+ resolvedStart: resolvedText.length,
343
+ resolvedEnd: resolvedText.length + rawSegment.length,
344
+ source: "raw",
345
+ rawStart: lastIndex,
346
+ rawEnd: text.length
347
+ });
348
+ resolvedText += rawSegment;
349
+ }
350
+ return { text: resolvedText, map };
351
+ }
352
+ function mapResolvedOffsetToRaw(resolvedOffset, map) {
353
+ for (let i = 0; i < map.length; i++) {
354
+ const seg = map[i];
355
+ const isLast = i === map.length - 1;
356
+ const inRange = isLast ? resolvedOffset >= seg.resolvedStart && resolvedOffset <= seg.resolvedEnd : resolvedOffset >= seg.resolvedStart && resolvedOffset < seg.resolvedEnd;
357
+ if (inRange) {
358
+ if (seg.source === "raw") {
359
+ return seg.rawStart + (resolvedOffset - seg.resolvedStart);
360
+ } else {
361
+ return seg.rawStart;
362
+ }
363
+ }
364
+ }
365
+ return resolvedOffset;
366
+ }
367
+ function mapRawOffsetToResolved(rawOffset, map) {
368
+ for (let i = 0; i < map.length; i++) {
369
+ const seg = map[i];
370
+ const isLast = i === map.length - 1;
371
+ const inRange = isLast ? rawOffset >= seg.rawStart && rawOffset <= seg.rawEnd : rawOffset >= seg.rawStart && rawOffset < seg.rawEnd;
372
+ if (inRange) {
373
+ if (seg.source === "raw") {
374
+ return seg.resolvedStart + (rawOffset - seg.rawStart);
375
+ } else {
376
+ return seg.resolvedStart;
377
+ }
378
+ }
379
+ }
380
+ return rawOffset;
381
+ }
382
+ // Annotate the CommonJS export names for ESM import in node:
383
+ 0 && (module.exports = {
384
+ INSTRUCTION_REGEX,
385
+ TEMPLATE_REGEX,
386
+ VARIABLE_REGEX,
387
+ extractInstructionNames,
388
+ extractTemplateNames,
389
+ extractVariableNames,
390
+ getLatestVersion,
391
+ instructionRegex,
392
+ mapRawOffsetToResolved,
393
+ mapResolvedOffsetToRaw,
394
+ resolveTemplates,
395
+ resolveTemplatesWithMapping,
396
+ resolveVariables,
397
+ templateRegex,
398
+ tokenizePrompt,
399
+ variableRegex
400
+ });
401
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/grammar/index.ts","../../src/grammar/tokens.ts","../../src/grammar/tokenizer.ts","../../src/grammar/resolver.ts","../../src/grammar/sourcemap.ts"],"sourcesContent":["export * from \"./tokens\";\nexport * from \"./tokenizer\";\nexport * from \"./resolver\";\nexport * from \"./sourcemap\";\n","/**\n * Canonical regex patterns for prompt editing tokens.\n */\nexport const TEMPLATE_REGEX = /{{\\s*([^}]+?)\\s*}}/g;\nexport const VARIABLE_REGEX = /(?<!\\{)\\{([^{}]+)\\}(?!\\})/g;\nexport const INSTRUCTION_REGEX = /__(.+?)__/g;\n\n// Backward-compatible camelCase aliases\nexport const templateRegex = TEMPLATE_REGEX;\nexport const variableRegex = VARIABLE_REGEX;\nexport const instructionRegex = INSTRUCTION_REGEX;\n\nexport type TokenType = \"template\" | \"variable\" | \"instruction\" | \"text\";\n\nexport interface Token {\n type: TokenType;\n raw: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface TemplateVersion {\n id: string;\n version: string;\n body: string;\n createdAt?: string;\n}\n\nexport interface Template {\n id?: string;\n name: string;\n body?: string;\n latestVersion?: string;\n versions?: TemplateVersion[];\n color?: string;\n}\n\nexport interface ColorGradient {\n from: string;\n to: string;\n}\n","import {\n TEMPLATE_REGEX,\n VARIABLE_REGEX,\n INSTRUCTION_REGEX,\n Token,\n} from \"./tokens\";\n\ninterface RawMatch {\n type: \"template\" | \"variable\" | \"instruction\";\n raw: string;\n value: string;\n start: number;\n end: number;\n}\n\n/**\n * Parses any prompt string into an array of typed tokens in linear order.\n * Plain text between tokens is preserved as `{ type: 'text' }`.\n */\nexport function tokenizePrompt(text: string): Token[] {\n if (!text) {\n return [];\n }\n\n const rawMatches: RawMatch[] = [];\n\n // Match {{template}}\n const tmplRegex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);\n let match: RegExpExecArray | null;\n while ((match = tmplRegex.exec(text)) !== null) {\n rawMatches.push({\n type: \"template\",\n raw: match[0],\n value: match[1].trim(),\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n\n // Match {variable}\n const varRegex = new RegExp(VARIABLE_REGEX.source, VARIABLE_REGEX.flags);\n while ((match = varRegex.exec(text)) !== null) {\n // Avoid double matching if overlapping with template\n const start = match.index;\n const end = start + match[0].length;\n const overlaps = rawMatches.some(\n (m) => !(end <= m.start || start >= m.end),\n );\n if (!overlaps) {\n rawMatches.push({\n type: \"variable\",\n raw: match[0],\n value: match[1].trim(),\n start,\n end,\n });\n }\n }\n\n // Match __instruction__\n const instRegex = new RegExp(\n INSTRUCTION_REGEX.source,\n INSTRUCTION_REGEX.flags,\n );\n while ((match = instRegex.exec(text)) !== null) {\n const start = match.index;\n const end = start + match[0].length;\n const overlaps = rawMatches.some(\n (m) => !(end <= m.start || start >= m.end),\n );\n if (!overlaps) {\n rawMatches.push({\n type: \"instruction\",\n raw: match[0],\n value: match[1].trim(),\n start,\n end,\n });\n }\n }\n\n // Sort matches by start index\n rawMatches.sort((a, b) => a.start - b.start);\n\n const tokens: Token[] = [];\n let currentIdx = 0;\n\n for (const m of rawMatches) {\n if (m.start > currentIdx) {\n const textChunk = text.slice(currentIdx, m.start);\n tokens.push({\n type: \"text\",\n raw: textChunk,\n value: textChunk,\n start: currentIdx,\n end: m.start,\n });\n }\n tokens.push({\n type: m.type,\n raw: m.raw,\n value: m.value,\n start: m.start,\n end: m.end,\n });\n currentIdx = m.end;\n }\n\n if (currentIdx < text.length) {\n const textChunk = text.slice(currentIdx);\n tokens.push({\n type: \"text\",\n raw: textChunk,\n value: textChunk,\n start: currentIdx,\n end: text.length,\n });\n }\n\n return tokens;\n}\n","import {\n TEMPLATE_REGEX,\n VARIABLE_REGEX,\n INSTRUCTION_REGEX,\n Template,\n TemplateVersion,\n} from \"./tokens\";\n\n/**\n * Finds the latest version of a template based on `latestVersion` or last version entry.\n */\nexport function getLatestVersion(\n template: Template,\n): TemplateVersion | undefined {\n if (!template.versions || template.versions.length === 0) {\n if (template.body !== undefined) {\n return {\n id: template.id || \"default\",\n version: \"1.0\",\n body: template.body,\n };\n }\n return undefined;\n }\n if (template.latestVersion) {\n const found = template.versions.find(\n (v) => v.version === template.latestVersion,\n );\n if (found) return found;\n }\n return template.versions[template.versions.length - 1];\n}\n\nexport interface ResolveTemplatesOptions {\n bindings?: Record<string, string>;\n maxDepth?: number;\n}\n\n/**\n * Recursively resolves template tags `{{template_name}}` in a given text.\n * Detects circular dependencies and returns \"[Template loop detected]\".\n */\nexport function resolveTemplates(\n text: string,\n templates: Template[] = [],\n options?: ResolveTemplatesOptions,\n): string {\n const templateMap = new Map<string, Template>();\n for (const t of templates) {\n templateMap.set(t.name, t);\n }\n\n const maxDepth = options?.maxDepth ?? 10;\n\n function resolveRecursive(\n currentText: string,\n visited: Set<string>,\n depth: number,\n ): string {\n if (depth > maxDepth) {\n return \"[Template max depth exceeded]\";\n }\n\n let result = currentText;\n const regex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(result)) !== null) {\n const [fullMatch, rawTemplateName] = match;\n const templateName = rawTemplateName.trim();\n\n if (visited.has(templateName)) {\n return \"[Template loop detected]\";\n }\n\n const template = templateMap.get(templateName);\n if (!template) {\n continue;\n }\n\n let versionBody: string | undefined;\n const boundVersionId = options?.bindings?.[templateName];\n\n if (boundVersionId && template.versions) {\n const boundVersion = template.versions.find(\n (v) => v.id === boundVersionId || v.version === boundVersionId,\n );\n versionBody = boundVersion?.body;\n } else {\n const latest = getLatestVersion(template);\n versionBody = latest?.body ?? template.body;\n }\n\n if (versionBody === undefined) {\n continue;\n }\n\n const nextVisited = new Set(visited);\n nextVisited.add(templateName);\n\n const resolvedBody = resolveRecursive(\n versionBody,\n nextVisited,\n depth + 1,\n );\n\n if (\n resolvedBody === \"[Template loop detected]\" ||\n resolvedBody === \"[Template max depth exceeded]\"\n ) {\n return resolvedBody;\n }\n\n result = result.replace(fullMatch, resolvedBody);\n regex.lastIndex = 0;\n }\n\n return result;\n }\n\n return resolveRecursive(text, new Set(), 0);\n}\n\n/**\n * Replaces `{variableName}` with values from a dictionary.\n */\nexport function resolveVariables(\n text: string,\n values: Record<string, string | number>,\n): string {\n if (!text) return \"\";\n return text.replace(\n new RegExp(VARIABLE_REGEX.source, VARIABLE_REGEX.flags),\n (fullMatch, varName) => {\n const key = varName.trim();\n if (Object.prototype.hasOwnProperty.call(values, key)) {\n return String(values[key]);\n }\n return fullMatch;\n },\n );\n}\n\n/**\n * Extracts unique template names referenced in text.\n */\nexport function extractTemplateNames(text: string): string[] {\n if (!text) return [];\n const set = new Set<string>();\n const regex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n set.add(match[1].trim());\n }\n return Array.from(set);\n}\n\n/**\n * Extracts unique variable names referenced in text.\n */\nexport function extractVariableNames(text: string): string[] {\n if (!text) return [];\n const set = new Set<string>();\n const regex = new RegExp(VARIABLE_REGEX.source, VARIABLE_REGEX.flags);\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n set.add(match[1].trim());\n }\n return Array.from(set);\n}\n\n/**\n * Extracts unique instruction names referenced in text.\n */\nexport function extractInstructionNames(text: string): string[] {\n if (!text) return [];\n const set = new Set<string>();\n const regex = new RegExp(INSTRUCTION_REGEX.source, INSTRUCTION_REGEX.flags);\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n set.add(match[1].trim());\n }\n return Array.from(set);\n}\n","import { Template } from \"./tokens\";\nimport { getLatestVersion, resolveTemplates } from \"./resolver\";\n\nexport interface SourceMapSegment {\n resolvedStart: number;\n resolvedEnd: number;\n source: \"raw\" | \"template\";\n rawStart: number;\n rawEnd: number;\n templateName?: string;\n}\n\n/**\n * Resolves templates in text while tracking character offset mapping\n * between the raw input and the fully resolved output.\n */\nexport function resolveTemplatesWithMapping(\n text: string,\n templates: Template[] = [],\n templateBindings?: Record<string, string>,\n): { text: string; map: SourceMapSegment[] } {\n if (!templates || templates.length === 0 || !text.includes(\"{{\")) {\n return {\n text,\n map: [\n {\n resolvedStart: 0,\n resolvedEnd: text.length,\n source: \"raw\",\n rawStart: 0,\n rawEnd: text.length,\n },\n ],\n };\n }\n\n const templateMap = new Map(templates.map((t) => [t.name, t]));\n const regex = /{{\\s*([^}]+?)\\s*}}/g;\n let match: RegExpExecArray | null;\n let lastIndex = 0;\n let resolvedText = \"\";\n const map: SourceMapSegment[] = [];\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, rawTemplateName] = match;\n const templateName = rawTemplateName.trim();\n const matchIndex = match.index;\n\n // Add raw text preceding this template match\n if (matchIndex > lastIndex) {\n const rawSegment = text.substring(lastIndex, matchIndex);\n map.push({\n resolvedStart: resolvedText.length,\n resolvedEnd: resolvedText.length + rawSegment.length,\n source: \"raw\",\n rawStart: lastIndex,\n rawEnd: matchIndex,\n });\n resolvedText += rawSegment;\n }\n\n let resolvedBody = fullMatch;\n let isTemplate = false;\n\n if (templateMap.has(templateName)) {\n const template = templateMap.get(templateName)!;\n let versionBody: string | undefined;\n const boundVersionId = templateBindings?.[templateName];\n\n if (boundVersionId && template.versions) {\n const boundVersion = template.versions.find(\n (v) => v.id === boundVersionId || v.version === boundVersionId,\n );\n versionBody = boundVersion?.body;\n } else {\n const latestVersion = getLatestVersion(template);\n versionBody = latestVersion?.body ?? template.body;\n }\n\n if (versionBody !== undefined) {\n resolvedBody = resolveTemplates(versionBody, templates, {\n bindings: templateBindings,\n });\n isTemplate = true;\n }\n }\n\n if (isTemplate) {\n map.push({\n resolvedStart: resolvedText.length,\n resolvedEnd: resolvedText.length + resolvedBody.length,\n source: \"template\",\n rawStart: matchIndex,\n rawEnd: matchIndex + fullMatch.length,\n templateName,\n });\n resolvedText += resolvedBody;\n } else {\n map.push({\n resolvedStart: resolvedText.length,\n resolvedEnd: resolvedText.length + fullMatch.length,\n source: \"raw\",\n rawStart: matchIndex,\n rawEnd: matchIndex + fullMatch.length,\n });\n resolvedText += fullMatch;\n }\n\n lastIndex = matchIndex + fullMatch.length;\n }\n\n // Add any remaining raw text after the final match\n if (lastIndex < text.length) {\n const rawSegment = text.substring(lastIndex);\n map.push({\n resolvedStart: resolvedText.length,\n resolvedEnd: resolvedText.length + rawSegment.length,\n source: \"raw\",\n rawStart: lastIndex,\n rawEnd: text.length,\n });\n resolvedText += rawSegment;\n }\n\n return { text: resolvedText, map };\n}\n\n/**\n * Maps an offset in resolved text back to the corresponding offset in raw text.\n */\nexport function mapResolvedOffsetToRaw(\n resolvedOffset: number,\n map: SourceMapSegment[],\n): number {\n for (let i = 0; i < map.length; i++) {\n const seg = map[i];\n const isLast = i === map.length - 1;\n const inRange = isLast\n ? resolvedOffset >= seg.resolvedStart && resolvedOffset <= seg.resolvedEnd\n : resolvedOffset >= seg.resolvedStart && resolvedOffset < seg.resolvedEnd;\n\n if (inRange) {\n if (seg.source === \"raw\") {\n return seg.rawStart + (resolvedOffset - seg.resolvedStart);\n } else {\n // Pointing into a resolved template - return start of template tag\n return seg.rawStart;\n }\n }\n }\n return resolvedOffset;\n}\n\n/**\n * Maps an offset in raw text to the corresponding offset in resolved text.\n */\nexport function mapRawOffsetToResolved(\n rawOffset: number,\n map: SourceMapSegment[],\n): number {\n for (let i = 0; i < map.length; i++) {\n const seg = map[i];\n const isLast = i === map.length - 1;\n const inRange = isLast\n ? rawOffset >= seg.rawStart && rawOffset <= seg.rawEnd\n : rawOffset >= seg.rawStart && rawOffset < seg.rawEnd;\n\n if (inRange) {\n if (seg.source === \"raw\") {\n return seg.resolvedStart + (rawOffset - seg.rawStart);\n } else {\n return seg.resolvedStart;\n }\n }\n }\n return rawOffset;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,65 @@
1
+ import { T as Token, b as Template, c as TemplateVersion } from '../tokens-CE6SS_hd.cjs';
2
+ export { C as ColorGradient, I as INSTRUCTION_REGEX, a as TEMPLATE_REGEX, d as TokenType, V as VARIABLE_REGEX, i as instructionRegex, t as templateRegex, v as variableRegex } from '../tokens-CE6SS_hd.cjs';
3
+
4
+ /**
5
+ * Parses any prompt string into an array of typed tokens in linear order.
6
+ * Plain text between tokens is preserved as `{ type: 'text' }`.
7
+ */
8
+ declare function tokenizePrompt(text: string): Token[];
9
+
10
+ /**
11
+ * Finds the latest version of a template based on `latestVersion` or last version entry.
12
+ */
13
+ declare function getLatestVersion(template: Template): TemplateVersion | undefined;
14
+ interface ResolveTemplatesOptions {
15
+ bindings?: Record<string, string>;
16
+ maxDepth?: number;
17
+ }
18
+ /**
19
+ * Recursively resolves template tags `{{template_name}}` in a given text.
20
+ * Detects circular dependencies and returns "[Template loop detected]".
21
+ */
22
+ declare function resolveTemplates(text: string, templates?: Template[], options?: ResolveTemplatesOptions): string;
23
+ /**
24
+ * Replaces `{variableName}` with values from a dictionary.
25
+ */
26
+ declare function resolveVariables(text: string, values: Record<string, string | number>): string;
27
+ /**
28
+ * Extracts unique template names referenced in text.
29
+ */
30
+ declare function extractTemplateNames(text: string): string[];
31
+ /**
32
+ * Extracts unique variable names referenced in text.
33
+ */
34
+ declare function extractVariableNames(text: string): string[];
35
+ /**
36
+ * Extracts unique instruction names referenced in text.
37
+ */
38
+ declare function extractInstructionNames(text: string): string[];
39
+
40
+ interface SourceMapSegment {
41
+ resolvedStart: number;
42
+ resolvedEnd: number;
43
+ source: "raw" | "template";
44
+ rawStart: number;
45
+ rawEnd: number;
46
+ templateName?: string;
47
+ }
48
+ /**
49
+ * Resolves templates in text while tracking character offset mapping
50
+ * between the raw input and the fully resolved output.
51
+ */
52
+ declare function resolveTemplatesWithMapping(text: string, templates?: Template[], templateBindings?: Record<string, string>): {
53
+ text: string;
54
+ map: SourceMapSegment[];
55
+ };
56
+ /**
57
+ * Maps an offset in resolved text back to the corresponding offset in raw text.
58
+ */
59
+ declare function mapResolvedOffsetToRaw(resolvedOffset: number, map: SourceMapSegment[]): number;
60
+ /**
61
+ * Maps an offset in raw text to the corresponding offset in resolved text.
62
+ */
63
+ declare function mapRawOffsetToResolved(rawOffset: number, map: SourceMapSegment[]): number;
64
+
65
+ export { type ResolveTemplatesOptions, type SourceMapSegment, Template, TemplateVersion, Token, extractInstructionNames, extractTemplateNames, extractVariableNames, getLatestVersion, mapRawOffsetToResolved, mapResolvedOffsetToRaw, resolveTemplates, resolveTemplatesWithMapping, resolveVariables, tokenizePrompt };
@@ -0,0 +1,65 @@
1
+ import { T as Token, b as Template, c as TemplateVersion } from '../tokens-CE6SS_hd.js';
2
+ export { C as ColorGradient, I as INSTRUCTION_REGEX, a as TEMPLATE_REGEX, d as TokenType, V as VARIABLE_REGEX, i as instructionRegex, t as templateRegex, v as variableRegex } from '../tokens-CE6SS_hd.js';
3
+
4
+ /**
5
+ * Parses any prompt string into an array of typed tokens in linear order.
6
+ * Plain text between tokens is preserved as `{ type: 'text' }`.
7
+ */
8
+ declare function tokenizePrompt(text: string): Token[];
9
+
10
+ /**
11
+ * Finds the latest version of a template based on `latestVersion` or last version entry.
12
+ */
13
+ declare function getLatestVersion(template: Template): TemplateVersion | undefined;
14
+ interface ResolveTemplatesOptions {
15
+ bindings?: Record<string, string>;
16
+ maxDepth?: number;
17
+ }
18
+ /**
19
+ * Recursively resolves template tags `{{template_name}}` in a given text.
20
+ * Detects circular dependencies and returns "[Template loop detected]".
21
+ */
22
+ declare function resolveTemplates(text: string, templates?: Template[], options?: ResolveTemplatesOptions): string;
23
+ /**
24
+ * Replaces `{variableName}` with values from a dictionary.
25
+ */
26
+ declare function resolveVariables(text: string, values: Record<string, string | number>): string;
27
+ /**
28
+ * Extracts unique template names referenced in text.
29
+ */
30
+ declare function extractTemplateNames(text: string): string[];
31
+ /**
32
+ * Extracts unique variable names referenced in text.
33
+ */
34
+ declare function extractVariableNames(text: string): string[];
35
+ /**
36
+ * Extracts unique instruction names referenced in text.
37
+ */
38
+ declare function extractInstructionNames(text: string): string[];
39
+
40
+ interface SourceMapSegment {
41
+ resolvedStart: number;
42
+ resolvedEnd: number;
43
+ source: "raw" | "template";
44
+ rawStart: number;
45
+ rawEnd: number;
46
+ templateName?: string;
47
+ }
48
+ /**
49
+ * Resolves templates in text while tracking character offset mapping
50
+ * between the raw input and the fully resolved output.
51
+ */
52
+ declare function resolveTemplatesWithMapping(text: string, templates?: Template[], templateBindings?: Record<string, string>): {
53
+ text: string;
54
+ map: SourceMapSegment[];
55
+ };
56
+ /**
57
+ * Maps an offset in resolved text back to the corresponding offset in raw text.
58
+ */
59
+ declare function mapResolvedOffsetToRaw(resolvedOffset: number, map: SourceMapSegment[]): number;
60
+ /**
61
+ * Maps an offset in raw text to the corresponding offset in resolved text.
62
+ */
63
+ declare function mapRawOffsetToResolved(rawOffset: number, map: SourceMapSegment[]): number;
64
+
65
+ export { type ResolveTemplatesOptions, type SourceMapSegment, Template, TemplateVersion, Token, extractInstructionNames, extractTemplateNames, extractVariableNames, getLatestVersion, mapRawOffsetToResolved, mapResolvedOffsetToRaw, resolveTemplates, resolveTemplatesWithMapping, resolveVariables, tokenizePrompt };