embedoc 0.9.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +941 -0
  3. package/dist/cli.d.ts +6 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +337 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/dependency.d.ts +59 -0
  8. package/dist/core/dependency.d.ts.map +1 -0
  9. package/dist/core/dependency.js +209 -0
  10. package/dist/core/dependency.js.map +1 -0
  11. package/dist/core/generator.d.ts +23 -0
  12. package/dist/core/generator.d.ts.map +1 -0
  13. package/dist/core/generator.js +211 -0
  14. package/dist/core/generator.js.map +1 -0
  15. package/dist/core/inline-datasource.d.ts +117 -0
  16. package/dist/core/inline-datasource.d.ts.map +1 -0
  17. package/dist/core/inline-datasource.js +346 -0
  18. package/dist/core/inline-datasource.js.map +1 -0
  19. package/dist/core/parser.d.ts +41 -0
  20. package/dist/core/parser.d.ts.map +1 -0
  21. package/dist/core/parser.js +250 -0
  22. package/dist/core/parser.js.map +1 -0
  23. package/dist/core/processor.d.ts +18 -0
  24. package/dist/core/processor.d.ts.map +1 -0
  25. package/dist/core/processor.js +219 -0
  26. package/dist/core/processor.js.map +1 -0
  27. package/dist/datasources/csv.d.ts +17 -0
  28. package/dist/datasources/csv.d.ts.map +1 -0
  29. package/dist/datasources/csv.js +54 -0
  30. package/dist/datasources/csv.js.map +1 -0
  31. package/dist/datasources/glob.d.ts +17 -0
  32. package/dist/datasources/glob.d.ts.map +1 -0
  33. package/dist/datasources/glob.js +72 -0
  34. package/dist/datasources/glob.js.map +1 -0
  35. package/dist/datasources/index.d.ts +22 -0
  36. package/dist/datasources/index.d.ts.map +1 -0
  37. package/dist/datasources/index.js +53 -0
  38. package/dist/datasources/index.js.map +1 -0
  39. package/dist/datasources/json.d.ts +16 -0
  40. package/dist/datasources/json.d.ts.map +1 -0
  41. package/dist/datasources/json.js +59 -0
  42. package/dist/datasources/json.js.map +1 -0
  43. package/dist/datasources/sqlite.d.ts +15 -0
  44. package/dist/datasources/sqlite.d.ts.map +1 -0
  45. package/dist/datasources/sqlite.js +40 -0
  46. package/dist/datasources/sqlite.js.map +1 -0
  47. package/dist/datasources/yaml.d.ts +16 -0
  48. package/dist/datasources/yaml.d.ts.map +1 -0
  49. package/dist/datasources/yaml.js +60 -0
  50. package/dist/datasources/yaml.js.map +1 -0
  51. package/dist/helpers/markdown.d.ts +10 -0
  52. package/dist/helpers/markdown.d.ts.map +1 -0
  53. package/dist/helpers/markdown.js +93 -0
  54. package/dist/helpers/markdown.js.map +1 -0
  55. package/dist/index.d.ts +50 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +51 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/types/index.d.ts +254 -0
  60. package/dist/types/index.d.ts.map +1 -0
  61. package/dist/types/index.js +5 -0
  62. package/dist/types/index.js.map +1 -0
  63. package/package.json +88 -0
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Inline Datasource
3
+ * Document-local datasources defined with @embedoc-data markers
4
+ */
5
+ import yaml from 'js-yaml';
6
+ /**
7
+ * Default strip patterns for code fences
8
+ */
9
+ const DEFAULT_STRIP_PATTERNS = [
10
+ '^```\\w*\\s*\\n?', // Opening fence: ``` or ```language
11
+ '\\n?```\\s*$', // Closing fence: ```
12
+ ];
13
+ /**
14
+ * Default configuration
15
+ */
16
+ const DEFAULT_CONFIG = {
17
+ enabled: true,
18
+ maxBytes: 10240, // 10KB
19
+ allowedFormats: ['yaml', 'json', 'csv', 'table', 'text'],
20
+ conflictPolicy: 'warn',
21
+ allowAnonymous: false,
22
+ stripCodeFences: true,
23
+ stripPatterns: DEFAULT_STRIP_PATTERNS,
24
+ };
25
+ /**
26
+ * Parse dot-path into segments
27
+ * "author.repos[0].name" → ["author", "repos", 0, "name"]
28
+ */
29
+ export function parseDotPath(path) {
30
+ return path
31
+ .replace(/\[(\d+)\]/g, '.$1')
32
+ .split('.')
33
+ .filter((s) => s.length > 0)
34
+ .map((s) => (/^\d+$/.test(s) ? parseInt(s, 10) : s));
35
+ }
36
+ /**
37
+ * Resolve dot-path on an object
38
+ */
39
+ export function resolveDotPath(obj, path) {
40
+ const segments = parseDotPath(path);
41
+ let current = obj;
42
+ for (const segment of segments) {
43
+ if (current === null || current === undefined) {
44
+ return undefined;
45
+ }
46
+ if (typeof segment === 'number') {
47
+ current = current[segment];
48
+ }
49
+ else {
50
+ current = current[segment];
51
+ }
52
+ }
53
+ return current;
54
+ }
55
+ /**
56
+ * Set value at dot-path, creating intermediate objects as needed
57
+ */
58
+ export function setDotPath(obj, path, value) {
59
+ const segments = parseDotPath(path);
60
+ if (segments.length === 0)
61
+ return;
62
+ let current = obj;
63
+ for (let i = 0; i < segments.length - 1; i++) {
64
+ const segment = segments[i];
65
+ const nextSegment = segments[i + 1];
66
+ if (typeof segment === 'number') {
67
+ throw new Error(`Array index in middle of path not supported: ${path}`);
68
+ }
69
+ if (!(segment in current)) {
70
+ // Create intermediate object or array based on next segment
71
+ current[segment] = typeof nextSegment === 'number' ? [] : {};
72
+ }
73
+ current = current[segment];
74
+ }
75
+ const lastSegment = segments[segments.length - 1];
76
+ if (typeof lastSegment === 'number') {
77
+ current[lastSegment] = value;
78
+ }
79
+ else {
80
+ current[lastSegment] = value;
81
+ }
82
+ }
83
+ /**
84
+ * Get root name from dot-path
85
+ * "project.author.name" → "project"
86
+ */
87
+ export function getRootName(path) {
88
+ const firstDot = path.indexOf('.');
89
+ return firstDot === -1 ? path : path.slice(0, firstDot);
90
+ }
91
+ /**
92
+ * Strip patterns from content
93
+ * @param content - Content to process
94
+ * @param patterns - Array of regex pattern strings to strip
95
+ */
96
+ function stripPatterns(content, patterns) {
97
+ let result = content.trim();
98
+ for (const pattern of patterns) {
99
+ const regex = new RegExp(pattern);
100
+ result = result.replace(regex, '');
101
+ }
102
+ return result.trim();
103
+ }
104
+ /**
105
+ * Parse content based on format
106
+ * @param content - Raw content string
107
+ * @param format - Content format (yaml, json, csv, table, text)
108
+ * @param options - Processing options
109
+ */
110
+ export function parseInlineContent(content, format, options = {}) {
111
+ const { stripCodeFences = true, stripPatterns: customPatterns } = options;
112
+ let processed = content;
113
+ // Strip patterns if enabled
114
+ if (stripCodeFences) {
115
+ const patterns = customPatterns ?? DEFAULT_STRIP_PATTERNS;
116
+ processed = stripPatterns(processed, patterns);
117
+ }
118
+ const trimmed = processed.trim();
119
+ switch (format) {
120
+ case 'yaml':
121
+ // Use JSON_SCHEMA for safe loading (no custom tags)
122
+ return yaml.load(trimmed, { schema: yaml.JSON_SCHEMA }) ?? {};
123
+ case 'json':
124
+ return trimmed ? JSON.parse(trimmed) : {};
125
+ case 'csv':
126
+ return parseCSV(trimmed);
127
+ case 'table':
128
+ return parseMarkdownTable(trimmed);
129
+ case 'text':
130
+ default:
131
+ return trimmed;
132
+ }
133
+ }
134
+ /**
135
+ * Parse CSV content
136
+ */
137
+ function parseCSV(content) {
138
+ const lines = content.split('\n').filter((line) => line.trim().length > 0);
139
+ if (lines.length === 0)
140
+ return [];
141
+ const headerLine = lines[0];
142
+ if (!headerLine)
143
+ return [];
144
+ const headers = headerLine.split(',').map((h) => h.trim());
145
+ const rows = [];
146
+ for (let i = 1; i < lines.length; i++) {
147
+ const line = lines[i];
148
+ if (!line)
149
+ continue;
150
+ const values = line.split(',').map((v) => v.trim());
151
+ const row = {};
152
+ headers.forEach((header, idx) => {
153
+ row[header] = values[idx] ?? '';
154
+ });
155
+ rows.push(row);
156
+ }
157
+ return rows;
158
+ }
159
+ /**
160
+ * Parse Markdown table content
161
+ */
162
+ function parseMarkdownTable(content) {
163
+ const lines = content
164
+ .split('\n')
165
+ .map((line) => line.trim())
166
+ .filter((line) => line.length > 0 && !line.match(/^\|[-:| ]+\|$/));
167
+ if (lines.length === 0)
168
+ return [];
169
+ // Parse header
170
+ const headerLine = lines[0];
171
+ if (!headerLine)
172
+ return [];
173
+ const headers = headerLine
174
+ .split('|')
175
+ .map((h) => h.trim())
176
+ .filter((h) => h.length > 0);
177
+ // Parse rows
178
+ const rows = [];
179
+ for (let i = 1; i < lines.length; i++) {
180
+ const line = lines[i];
181
+ if (!line)
182
+ continue;
183
+ const allValues = line.split('|').map((v) => v.trim());
184
+ // Filter empty first/last from pipe-delimited
185
+ const cleanValues = line.startsWith('|')
186
+ ? allValues.slice(1, -1)
187
+ : allValues;
188
+ const row = {};
189
+ headers.forEach((header, idx) => {
190
+ row[header] = cleanValues[idx] ?? '';
191
+ });
192
+ rows.push(row);
193
+ }
194
+ return rows;
195
+ }
196
+ /**
197
+ * Inline Datasource class
198
+ */
199
+ export class InlineDatasource {
200
+ type = 'inline';
201
+ format;
202
+ documentPath;
203
+ startLine;
204
+ endLine;
205
+ byteSize;
206
+ /** Internal data - exposed for variable resolution */
207
+ data;
208
+ _isObject;
209
+ constructor(data, format, documentPath, startLine, endLine, byteSize) {
210
+ this.data = data;
211
+ this.format = format;
212
+ this.documentPath = documentPath;
213
+ this.startLine = startLine;
214
+ this.endLine = endLine;
215
+ this.byteSize = byteSize;
216
+ this._isObject = !Array.isArray(data) && typeof data === 'object' && data !== null;
217
+ }
218
+ /**
219
+ * Query is not fully supported for inline datasources
220
+ * Returns all data or filters by simple conditions
221
+ */
222
+ async query(_sql, _params) {
223
+ // For inline datasources, query just returns all data as array
224
+ if (Array.isArray(this.data)) {
225
+ return this.data;
226
+ }
227
+ // Wrap object in array for compatibility
228
+ return [this.data];
229
+ }
230
+ /**
231
+ * Get all data - returns array for Datasource interface compatibility
232
+ */
233
+ async getAll() {
234
+ if (Array.isArray(this.data)) {
235
+ return this.data;
236
+ }
237
+ // Wrap object in array for compatibility
238
+ return [this.data];
239
+ }
240
+ /**
241
+ * Get raw data (object or array)
242
+ */
243
+ getRawData() {
244
+ return this.data;
245
+ }
246
+ /**
247
+ * Get value at dot-path
248
+ */
249
+ async get(path) {
250
+ return resolveDotPath(this.data, path);
251
+ }
252
+ /**
253
+ * Check if datasource is object type (vs array)
254
+ */
255
+ isObjectType() {
256
+ return this._isObject;
257
+ }
258
+ /**
259
+ * Close (no-op for inline)
260
+ */
261
+ async close() {
262
+ // No-op
263
+ }
264
+ /**
265
+ * Merge another value into this datasource at a path
266
+ */
267
+ merge(path, value) {
268
+ if (!this._isObject) {
269
+ throw new Error('Cannot merge into array datasource');
270
+ }
271
+ setDotPath(this.data, path, value);
272
+ }
273
+ }
274
+ /**
275
+ * Build inline datasources from parsed markers
276
+ */
277
+ export function buildInlineDatasources(parsedData, documentPath, config = {}) {
278
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
279
+ const datasources = new Map();
280
+ // Content processing options
281
+ const contentOptions = {
282
+ stripCodeFences: mergedConfig.stripCodeFences,
283
+ stripPatterns: config.stripPatterns ?? DEFAULT_STRIP_PATTERNS,
284
+ };
285
+ // Group by root name
286
+ const byRoot = new Map();
287
+ for (const data of parsedData) {
288
+ // Validate size
289
+ if (data.byteSize > mergedConfig.maxBytes) {
290
+ throw new Error(`Inline datasource "${data.name}" exceeds max size (${data.byteSize} > ${mergedConfig.maxBytes} bytes)`);
291
+ }
292
+ // Validate format
293
+ if (!mergedConfig.allowedFormats.includes(data.format)) {
294
+ throw new Error(`Inline datasource "${data.name}" uses disallowed format "${data.format}"`);
295
+ }
296
+ const rootName = getRootName(data.name);
297
+ if (!byRoot.has(rootName)) {
298
+ byRoot.set(rootName, []);
299
+ }
300
+ byRoot.get(rootName).push(data);
301
+ }
302
+ // Process each root
303
+ for (const [rootName, items] of byRoot) {
304
+ // Check if there's a root-level definition (no dots)
305
+ const rootItem = items.find((item) => item.name === rootName);
306
+ let baseData;
307
+ let format = 'yaml';
308
+ let startLine = 0;
309
+ let endLine = 0;
310
+ let byteSize = 0;
311
+ if (rootItem) {
312
+ // Parse root-level data
313
+ baseData = parseInlineContent(rootItem.content, rootItem.format, contentOptions);
314
+ format = rootItem.format;
315
+ startLine = rootItem.startLine;
316
+ endLine = rootItem.endLine;
317
+ byteSize = rootItem.byteSize;
318
+ }
319
+ else {
320
+ // Create empty object for dot-path only definitions
321
+ baseData = {};
322
+ }
323
+ // Apply dot-path definitions
324
+ for (const item of items) {
325
+ if (item.name !== rootName && item.name.startsWith(rootName + '.')) {
326
+ const subPath = item.name.slice(rootName.length + 1);
327
+ const value = parseInlineContent(item.content, item.format, contentOptions);
328
+ if (typeof baseData !== 'object' || baseData === null) {
329
+ baseData = {};
330
+ }
331
+ setDotPath(baseData, subPath, value);
332
+ // Update metadata
333
+ if (startLine === 0 || item.startLine < startLine) {
334
+ startLine = item.startLine;
335
+ }
336
+ if (item.endLine > endLine) {
337
+ endLine = item.endLine;
338
+ }
339
+ byteSize += item.byteSize;
340
+ }
341
+ }
342
+ datasources.set(rootName, new InlineDatasource(baseData, format, documentPath, startLine, endLine, byteSize));
343
+ }
344
+ return datasources;
345
+ }
346
+ //# sourceMappingURL=inline-datasource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-datasource.js","sourceRoot":"","sources":["../../src/core/inline-datasource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAoC3B;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC7B,kBAAkB,EAAG,oCAAoC;IACzD,cAAc,EAAQ,qBAAqB;CAC5C,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAA0F;IAC5G,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,KAAK,EAAE,OAAO;IACxB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;IACxD,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,KAAK;IACrB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,sBAAsB;CACtC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI;SACR,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;SAC5B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY,EAAE,IAAY;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,GAAG,CAAC;IAElB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,GAAI,OAAqB,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,GAA4B,EAC5B,IAAY,EACZ,KAAc;IAEd,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,IAAI,OAAO,GAA4B,GAAG,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;YAC1B,4DAA4D;YAC5D,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,OAAO,CAA4B,CAAC;IACxD,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACnD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAgC,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAe,EAAE,QAAkB;IACxD,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,MAAc,EACd,UAAoC,EAAE;IAEtC,MAAM,EACJ,eAAe,GAAG,IAAI,EACtB,aAAa,EAAE,cAAc,EAC9B,GAAG,OAAO,CAAC;IAEZ,IAAI,SAAS,GAAG,OAAO,CAAC;IAExB,4BAA4B;IAC5B,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,cAAc,IAAI,sBAAsB,CAAC;QAC1D,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAEjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,oDAAoD;YACpD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhE,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5C,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE3B,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAErC,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAgB,EAAE,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,OAAO;SAClB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAErE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,eAAe;IACf,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAG,UAAU;SACvB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/B,aAAa;IACb,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAEvD,8CAA8C;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YACtC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,QAAQ,CAAC;IAChB,MAAM,CAAS;IACf,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,QAAQ,CAAS;IAE1B,sDAAsD;IAC7C,IAAI,CAAU;IACf,SAAS,CAAU;IAE3B,YACE,IAAa,EACb,MAAc,EACd,YAAoB,EACpB,SAAiB,EACjB,OAAe,EACf,QAAgB;QAEhB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC;IACrF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAAmB;QAC3C,+DAA+D;QAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,IAAmB,CAAC;QAClC,CAAC;QACD,yCAAyC;QACzC,OAAO,CAAC,IAAI,CAAC,IAA+B,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,IAAmB,CAAC;QAClC,CAAC;QACD,yCAAyC;QACzC,OAAO,CAAC,IAAI,CAAC,IAA+B,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,QAAQ;IACV,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAY,EAAE,KAAc;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAA+B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAA8B,EAC9B,YAAoB,EACpB,SAAiC,EAAE;IAEnC,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAExD,6BAA6B;IAC7B,MAAM,cAAc,GAA6B;QAC/C,eAAe,EAAE,YAAY,CAAC,eAAe;QAC7C,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,sBAAsB;KAC9D,CAAC;IAEF,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,gBAAgB;QAChB,IAAI,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,uBAAuB,IAAI,CAAC,QAAQ,MAAM,YAAY,CAAC,QAAQ,SAAS,CACxG,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,6BAA6B,IAAI,CAAC,MAAM,GAAG,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB;IACpB,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACvC,qDAAqD;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAE9D,IAAI,QAAiB,CAAC;QACtB,IAAI,MAAM,GAAG,MAAM,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,IAAI,QAAQ,EAAE,CAAC;YACb,wBAAwB;YACxB,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACjF,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACzB,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC/B,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC3B,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,6BAA6B;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;gBACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gBAE5E,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACtD,QAAQ,GAAG,EAAE,CAAC;gBAChB,CAAC;gBACD,UAAU,CAAC,QAAmC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;gBAEhE,kBAAkB;gBAClB,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;oBAClD,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC7B,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;oBAC3B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBACzB,CAAC;gBACD,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,WAAW,CAAC,GAAG,CACb,QAAQ,EACR,IAAI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Marker Parser
3
+ * Detects blocks enclosed by comment-style markers
4
+ */
5
+ import type { CommentStyle, ParsedMarker, ParsedFrontmatter } from '../types/index.js';
6
+ import type { ParsedInlineData } from './inline-datasource.js';
7
+ /**
8
+ * Default comment style definitions
9
+ */
10
+ export declare const DEFAULT_COMMENT_STYLES: Record<string, CommentStyle>;
11
+ /**
12
+ * Parse attribute string into object
13
+ * Example: 'id="users" schema="public"' -> { id: 'users', schema: 'public' }
14
+ */
15
+ export declare function parseAttributes(attrString: string): Record<string, string>;
16
+ /**
17
+ * Resolve variable references in attribute values
18
+ * Example: ${doc_id} -> frontmatter.doc_id value
19
+ */
20
+ export declare function resolveVariables(params: Record<string, string>, frontmatter: Record<string, unknown>): Record<string, string>;
21
+ /**
22
+ * Parse frontmatter from content
23
+ */
24
+ export declare function parseFrontmatter(content: string): ParsedFrontmatter;
25
+ /**
26
+ * Parse all markers in a file
27
+ */
28
+ export declare function parseMarkers(content: string, commentStyle: CommentStyle): ParsedMarker[];
29
+ /**
30
+ * Get CommentStyle object from style name
31
+ */
32
+ export declare function getCommentStyle(styleName: string, customStyles?: Record<string, CommentStyle>): CommentStyle;
33
+ /**
34
+ * Guess default comment style from file extension
35
+ */
36
+ export declare function guessCommentStyle(filePath: string): string;
37
+ /**
38
+ * Parse inline data markers (@embedoc-data)
39
+ */
40
+ export declare function parseInlineDataMarkers(content: string, commentStyle: CommentStyle): ParsedInlineData[];
41
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAM/D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAmBnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,GACzB,YAAY,EAAE,CAmEhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAC1C,YAAY,CASd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B1D;AASD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,GACzB,gBAAgB,EAAE,CAuEpB"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Marker Parser
3
+ * Detects blocks enclosed by comment-style markers
4
+ */
5
+ import matter from 'gray-matter';
6
+ /**
7
+ * Default comment style definitions
8
+ */
9
+ export const DEFAULT_COMMENT_STYLES = {
10
+ html: { start: '<!--', end: '-->' },
11
+ block: { start: '/*', end: '*/' },
12
+ line: { start: '//', end: '' },
13
+ hash: { start: '#', end: '' },
14
+ sql: { start: '--', end: '' },
15
+ };
16
+ /**
17
+ * Parse attribute string into object
18
+ * Example: 'id="users" schema="public"' -> { id: 'users', schema: 'public' }
19
+ */
20
+ export function parseAttributes(attrString) {
21
+ const result = {};
22
+ // Match key="value" or key='value' patterns
23
+ const attrRegex = /(\w+)=["']([^"']*)["']/g;
24
+ let match;
25
+ while ((match = attrRegex.exec(attrString)) !== null) {
26
+ const key = match[1];
27
+ const value = match[2];
28
+ if (key && value !== undefined) {
29
+ result[key] = value;
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ /**
35
+ * Resolve variable references in attribute values
36
+ * Example: ${doc_id} -> frontmatter.doc_id value
37
+ */
38
+ export function resolveVariables(params, frontmatter) {
39
+ const result = {};
40
+ for (const [key, value] of Object.entries(params)) {
41
+ result[key] = value.replace(/\$\{(\w+(?:\.\w+)*)\}/g, (_, path) => {
42
+ const parts = path.split('.');
43
+ let current = frontmatter;
44
+ for (const part of parts) {
45
+ if (current === null || current === undefined) {
46
+ return '';
47
+ }
48
+ if (typeof current === 'object') {
49
+ current = current[part];
50
+ }
51
+ else {
52
+ return '';
53
+ }
54
+ }
55
+ return current !== null && current !== undefined ? String(current) : '';
56
+ });
57
+ }
58
+ return result;
59
+ }
60
+ /**
61
+ * Parse frontmatter from content
62
+ */
63
+ export function parseFrontmatter(content) {
64
+ const parsed = matter(content);
65
+ // Reconstruct frontmatter part (remove extra newlines)
66
+ let raw = '';
67
+ if (Object.keys(parsed.data).length > 0 && parsed.matter) {
68
+ // Trim extra newlines from matter
69
+ const cleanMatter = parsed.matter.trim();
70
+ raw = `---\n${cleanMatter}\n---\n`;
71
+ }
72
+ // Remove leading newlines from content
73
+ const cleanContent = parsed.content.replace(/^\n+/, '');
74
+ return {
75
+ data: parsed.data,
76
+ content: cleanContent,
77
+ raw,
78
+ };
79
+ }
80
+ /**
81
+ * Parse all markers in a file
82
+ */
83
+ export function parseMarkers(content, commentStyle) {
84
+ const markers = [];
85
+ const { start, end } = commentStyle;
86
+ const startEscaped = escapeRegExp(start);
87
+ const endEscaped = end ? escapeRegExp(end) : '';
88
+ // Start marker pattern
89
+ // {start}@embedoc:{template_name} {attributes}{end}
90
+ // For line comment style (empty end), match until newline
91
+ // Note: "end" is reserved for end marker, so exclude it (using negative lookahead)
92
+ let startPattern;
93
+ if (end) {
94
+ // Block comment style
95
+ startPattern = new RegExp(`${startEscaped}\\s*@embedoc:(?!end\\b)(\\w+)\\s*([^]*?)\\s*${endEscaped}`, 'g');
96
+ }
97
+ else {
98
+ // Line comment style
99
+ startPattern = new RegExp(`${startEscaped}\\s*@embedoc:(?!end\\b)(\\w+)\\s*(.*)$`, 'gm');
100
+ }
101
+ // End marker pattern
102
+ let endPattern;
103
+ if (end) {
104
+ endPattern = new RegExp(`${startEscaped}\\s*@embedoc:end\\s*${endEscaped}`);
105
+ }
106
+ else {
107
+ endPattern = new RegExp(`${startEscaped}\\s*@embedoc:end\\s*$`, 'm');
108
+ }
109
+ let match;
110
+ while ((match = startPattern.exec(content)) !== null) {
111
+ const startIndex = match.index;
112
+ const startMarkerLine = match[0];
113
+ const templateName = match[1];
114
+ const attrString = match[2]?.trim() ?? '';
115
+ // Search for end marker from after start marker
116
+ const afterStart = startIndex + startMarkerLine.length;
117
+ const remainingContent = content.slice(afterStart);
118
+ const endMatch = endPattern.exec(remainingContent);
119
+ if (endMatch) {
120
+ const endMarkerLine = endMatch[0];
121
+ const endIndex = afterStart + endMatch.index + endMarkerLine.length;
122
+ const existingContent = remainingContent.slice(0, endMatch.index);
123
+ if (templateName) {
124
+ markers.push({
125
+ startIndex,
126
+ endIndex,
127
+ templateName,
128
+ params: parseAttributes(attrString),
129
+ existingContent,
130
+ startMarkerLine,
131
+ endMarkerLine,
132
+ });
133
+ }
134
+ }
135
+ }
136
+ return markers;
137
+ }
138
+ /**
139
+ * Get CommentStyle object from style name
140
+ */
141
+ export function getCommentStyle(styleName, customStyles) {
142
+ const styles = { ...DEFAULT_COMMENT_STYLES, ...customStyles };
143
+ const style = styles[styleName];
144
+ if (!style) {
145
+ throw new Error(`Unknown comment style: ${styleName}`);
146
+ }
147
+ return style;
148
+ }
149
+ /**
150
+ * Guess default comment style from file extension
151
+ */
152
+ export function guessCommentStyle(filePath) {
153
+ const ext = filePath.split('.').pop()?.toLowerCase() ?? '';
154
+ const extToStyle = {
155
+ md: 'html',
156
+ html: 'html',
157
+ xml: 'html',
158
+ htm: 'html',
159
+ js: 'block',
160
+ ts: 'block',
161
+ jsx: 'block',
162
+ tsx: 'block',
163
+ css: 'block',
164
+ java: 'block',
165
+ c: 'block',
166
+ cpp: 'block',
167
+ h: 'block',
168
+ hpp: 'block',
169
+ go: 'line',
170
+ py: 'hash',
171
+ rb: 'hash',
172
+ sh: 'hash',
173
+ bash: 'hash',
174
+ yaml: 'hash',
175
+ yml: 'hash',
176
+ sql: 'sql',
177
+ };
178
+ return extToStyle[ext] ?? 'html';
179
+ }
180
+ /**
181
+ * Calculate line number from content index
182
+ */
183
+ function getLineNumber(content, index) {
184
+ return content.slice(0, index).split('\n').length;
185
+ }
186
+ /**
187
+ * Parse inline data markers (@embedoc-data)
188
+ */
189
+ export function parseInlineDataMarkers(content, commentStyle) {
190
+ const results = [];
191
+ const { start, end } = commentStyle;
192
+ const startEscaped = escapeRegExp(start);
193
+ const endEscaped = end ? escapeRegExp(end) : '';
194
+ // Pattern for @embedoc-data:name markers (excluding 'end')
195
+ // Supports: @embedoc-data:name or @embedoc-data:name format="yaml"
196
+ let startPattern;
197
+ let endPattern;
198
+ if (end) {
199
+ // Block comment style - capture attributes without newlines
200
+ // Use negative lookahead to exclude 'end' as a name
201
+ startPattern = new RegExp(`${startEscaped}\\s*@embedoc-data:(?!end\\s*${endEscaped})([\\w.]+)(?:\\s+([^\\n]*?))?\\s*${endEscaped}`, 'g');
202
+ endPattern = new RegExp(`${startEscaped}\\s*@embedoc-data:end\\s*${endEscaped}`);
203
+ }
204
+ else {
205
+ // Line comment style - exclude 'end' as a name
206
+ startPattern = new RegExp(`${startEscaped}\\s*@embedoc-data:(?!end\\s*$)([\\w.]+)(?:\\s+(.*))?$`, 'gm');
207
+ endPattern = new RegExp(`${startEscaped}\\s*@embedoc-data:end\\s*$`, 'm');
208
+ }
209
+ let match;
210
+ while ((match = startPattern.exec(content)) !== null) {
211
+ const startIndex = match.index;
212
+ const startMarkerLine = match[0];
213
+ const name = match[1];
214
+ const attrString = match[2]?.trim() ?? '';
215
+ // Skip if name is 'end' (shouldn't happen with negative lookahead, but be safe)
216
+ if (!name || name === 'end') {
217
+ continue;
218
+ }
219
+ // Parse format attribute
220
+ const attrs = parseAttributes(attrString);
221
+ const format = (attrs['format'] ?? 'yaml');
222
+ // Find end marker - search from after start marker
223
+ const afterStart = startIndex + startMarkerLine.length;
224
+ const remainingContent = content.slice(afterStart);
225
+ // Reset lastIndex for endPattern search
226
+ endPattern.lastIndex = 0;
227
+ const endMatch = endPattern.exec(remainingContent);
228
+ if (endMatch) {
229
+ const dataContent = remainingContent.slice(0, endMatch.index);
230
+ const startLine = getLineNumber(content, startIndex);
231
+ const endLine = getLineNumber(content, afterStart + endMatch.index + endMatch[0].length);
232
+ results.push({
233
+ name,
234
+ format,
235
+ content: dataContent,
236
+ startLine,
237
+ endLine,
238
+ byteSize: Buffer.byteLength(dataContent, 'utf-8'),
239
+ });
240
+ }
241
+ }
242
+ return results;
243
+ }
244
+ /**
245
+ * Escape special regex characters
246
+ */
247
+ function escapeRegExp(str) {
248
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
249
+ }
250
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}