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
package/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * embedoc CLI
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
package/dist/cli.js ADDED
@@ -0,0 +1,337 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * embedoc CLI
4
+ */
5
+ import { Command } from 'commander';
6
+ import { readFile, access } from 'node:fs/promises';
7
+ import { resolve, relative } from 'node:path';
8
+ import { pathToFileURL } from 'node:url';
9
+ import yaml from 'js-yaml';
10
+ import pc from 'picocolors';
11
+ import chokidar from 'chokidar';
12
+ import { tsImport } from 'tsx/esm/api';
13
+ import { initializeDatasources, closeDatasources } from './datasources/index.js';
14
+ import { build } from './core/processor.js';
15
+ import { generateAll } from './core/generator.js';
16
+ import { DependencyGraph } from './core/dependency.js';
17
+ const program = new Command();
18
+ program
19
+ .name('embedoc')
20
+ .description('In-Place Document Generator')
21
+ .version('0.1.0');
22
+ /**
23
+ * Load configuration file
24
+ */
25
+ async function loadConfig(configPath) {
26
+ const absolutePath = resolve(configPath);
27
+ const content = await readFile(absolutePath, { encoding: 'utf-8' });
28
+ if (configPath.endsWith('.json')) {
29
+ return JSON.parse(content);
30
+ }
31
+ return yaml.load(content);
32
+ }
33
+ /**
34
+ * Check if file exists
35
+ */
36
+ async function fileExists(filePath) {
37
+ try {
38
+ await access(filePath);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ /**
46
+ * Load embeds (supports both TypeScript and JavaScript)
47
+ */
48
+ async function loadEmbeds(embedsDir) {
49
+ const tsIndexPath = resolve(embedsDir, 'index.ts');
50
+ const jsIndexPath = resolve(embedsDir, 'index.js');
51
+ try {
52
+ // First try TypeScript file
53
+ if (await fileExists(tsIndexPath)) {
54
+ // Use tsx to directly import TypeScript
55
+ const module = await tsImport(tsIndexPath, import.meta.url);
56
+ return module.embeds ?? {};
57
+ }
58
+ // Fall back to JavaScript
59
+ if (await fileExists(jsIndexPath)) {
60
+ const moduleUrl = pathToFileURL(jsIndexPath).href;
61
+ const module = (await import(moduleUrl));
62
+ return module.embeds ?? {};
63
+ }
64
+ console.warn(pc.yellow(`Warning: No embeds found in ${embedsDir} (index.ts or index.js)`));
65
+ return {};
66
+ }
67
+ catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ console.warn(pc.yellow(`Warning: Could not load embeds from ${embedsDir}: ${message}`));
70
+ return {};
71
+ }
72
+ }
73
+ /**
74
+ * build command
75
+ */
76
+ program
77
+ .command('build [files...]')
78
+ .description('Build documents by replacing markers with embed results')
79
+ .option('-c, --config <path>', 'Path to config file', 'embedoc.config.yaml')
80
+ .option('-d, --dry-run', 'Dry run without writing files')
81
+ .option('-v, --verbose', 'Verbose output')
82
+ .action(async (files, options) => {
83
+ const startTime = Date.now();
84
+ try {
85
+ console.log(pc.cyan('🔧 Loading configuration...'));
86
+ const config = await loadConfig(options.config);
87
+ console.log(pc.cyan('📦 Initializing datasources...'));
88
+ const datasources = initializeDatasources(config);
89
+ console.log(pc.cyan('📝 Loading embeds...'));
90
+ const embedsDir = config.embeds_dir ?? './embeds';
91
+ const embeds = await loadEmbeds(embedsDir);
92
+ console.log(pc.cyan('🔄 Processing files...'));
93
+ const result = await build(config, embeds, datasources, {
94
+ dryRun: options.dryRun,
95
+ verbose: options.verbose,
96
+ specificFiles: files.length > 0 ? files : undefined,
97
+ });
98
+ // Cleanup
99
+ await closeDatasources(datasources);
100
+ // Show results
101
+ const duration = Date.now() - startTime;
102
+ console.log('');
103
+ console.log(pc.green('✅ Build completed!'));
104
+ console.log(` Files processed: ${result.totalFiles}`);
105
+ console.log(` Markers updated: ${result.totalMarkersUpdated}`);
106
+ console.log(` Success: ${result.successFiles}`);
107
+ if (result.failedFiles > 0) {
108
+ console.log(pc.red(` Failed: ${result.failedFiles}`));
109
+ }
110
+ console.log(` Duration: ${duration}ms`);
111
+ if (options.dryRun) {
112
+ console.log(pc.yellow('\n (Dry run - no files were modified)'));
113
+ }
114
+ // Show error details for failures
115
+ for (const r of result.results) {
116
+ if (!r.success && r.error) {
117
+ console.error(pc.red(`\n Error in ${r.filePath}:`));
118
+ console.error(` ${r.error.message}`);
119
+ }
120
+ }
121
+ process.exit(result.failedFiles > 0 ? 1 : 0);
122
+ }
123
+ catch (error) {
124
+ console.error(pc.red('❌ Build failed:'));
125
+ console.error(error instanceof Error ? error.message : String(error));
126
+ process.exit(1);
127
+ }
128
+ });
129
+ /**
130
+ * generate command
131
+ */
132
+ program
133
+ .command('generate')
134
+ .description('Generate new files from datasource records')
135
+ .option('-c, --config <path>', 'Path to config file', 'embedoc.config.yaml')
136
+ .option('-s, --datasource <name>', 'Specific datasource to process')
137
+ .option('-g, --generator <name>', 'Specific generator template to use')
138
+ .option('-a, --all', 'Process all datasources')
139
+ .option('-d, --dry-run', 'Dry run without writing files')
140
+ .option('-v, --verbose', 'Verbose output')
141
+ .action(async (options) => {
142
+ const startTime = Date.now();
143
+ try {
144
+ if (!options.datasource && !options.all) {
145
+ console.error(pc.red('Error: Either --datasource or --all must be specified'));
146
+ process.exit(1);
147
+ }
148
+ console.log(pc.cyan('🔧 Loading configuration...'));
149
+ const config = await loadConfig(options.config);
150
+ console.log(pc.cyan('📦 Initializing datasources...'));
151
+ const datasources = initializeDatasources(config);
152
+ console.log(pc.cyan('📄 Generating files...'));
153
+ const results = await generateAll(config, datasources, {
154
+ dryRun: options.dryRun,
155
+ verbose: options.verbose,
156
+ datasourceName: options.datasource,
157
+ generatorName: options.generator,
158
+ });
159
+ // Cleanup
160
+ await closeDatasources(datasources);
161
+ // Show results
162
+ const duration = Date.now() - startTime;
163
+ const generated = results.filter((r) => r.success && !r.skipped).length;
164
+ const skipped = results.filter((r) => r.skipped).length;
165
+ const failed = results.filter((r) => !r.success).length;
166
+ console.log('');
167
+ console.log(pc.green('✅ Generation completed!'));
168
+ console.log(` Generated: ${generated}`);
169
+ console.log(` Skipped (existing): ${skipped}`);
170
+ if (failed > 0) {
171
+ console.log(pc.red(` Failed: ${failed}`));
172
+ }
173
+ console.log(` Duration: ${duration}ms`);
174
+ if (options.dryRun) {
175
+ console.log(pc.yellow('\n (Dry run - no files were created)'));
176
+ }
177
+ // Show failure details
178
+ for (const r of results) {
179
+ if (!r.success && r.error) {
180
+ console.error(pc.red(`\n Error for ${r.filePath}:`));
181
+ console.error(` ${r.error.message}`);
182
+ }
183
+ }
184
+ process.exit(failed > 0 ? 1 : 0);
185
+ }
186
+ catch (error) {
187
+ console.error(pc.red('❌ Generation failed:'));
188
+ console.error(error instanceof Error ? error.message : String(error));
189
+ process.exit(1);
190
+ }
191
+ });
192
+ /**
193
+ * watch command
194
+ */
195
+ program
196
+ .command('watch')
197
+ .description('Watch files and rebuild on changes')
198
+ .option('-c, --config <path>', 'Path to config file', 'embedoc.config.yaml')
199
+ .option('-v, --verbose', 'Verbose output')
200
+ .option('--debug-deps', 'Show dependency graph for debugging')
201
+ .action(async (options) => {
202
+ try {
203
+ console.log(pc.cyan('🔧 Loading configuration...'));
204
+ const config = await loadConfig(options.config);
205
+ console.log(pc.cyan('📦 Initializing datasources...'));
206
+ let datasources = initializeDatasources(config);
207
+ console.log(pc.cyan('📝 Loading embeds...'));
208
+ const embedsDir = resolve(config.embeds_dir ?? './embeds');
209
+ let embeds = await loadEmbeds(embedsDir);
210
+ // Build dependency graph
211
+ console.log(pc.cyan('🔗 Building dependency graph...'));
212
+ let depGraph = new DependencyGraph(config, embeds);
213
+ await depGraph.build();
214
+ if (options.debugDeps) {
215
+ depGraph.dump();
216
+ }
217
+ // Collect watch targets
218
+ const patterns = config.targets.map((t) => t.pattern);
219
+ const additionalWatchPaths = depGraph.getWatchPaths();
220
+ console.log(pc.cyan('👀 Watching for changes...'));
221
+ console.log(` Document patterns: ${patterns.join(', ')}`);
222
+ if (additionalWatchPaths.length > 0) {
223
+ console.log(` Additional paths: ${additionalWatchPaths.map(p => relative(process.cwd(), p)).join(', ')}`);
224
+ }
225
+ const watcher = chokidar.watch([...patterns, ...additionalWatchPaths], {
226
+ ignored: ['**/node_modules/**', '**/.git/**'],
227
+ persistent: true,
228
+ ignoreInitial: true,
229
+ });
230
+ // Debounce timer
231
+ let debounceTimer = null;
232
+ const pendingChanges = new Map();
233
+ const processChanges = async () => {
234
+ const changes = new Map(pendingChanges);
235
+ pendingChanges.clear();
236
+ // Reload embeds if embed file changed
237
+ let embedsReloaded = false;
238
+ for (const [filePath] of changes) {
239
+ if (filePath.startsWith(embedsDir) && filePath.endsWith('.ts')) {
240
+ console.log(pc.yellow(`\n🔄 Embed changed: ${relative(process.cwd(), filePath)}`));
241
+ console.log(pc.cyan(' Reloading embeds...'));
242
+ try {
243
+ // Import with new timestamp to clear tsx cache
244
+ embeds = await loadEmbeds(embedsDir);
245
+ embedsReloaded = true;
246
+ }
247
+ catch (error) {
248
+ console.error(pc.red(' Failed to reload embeds:'), error);
249
+ return;
250
+ }
251
+ }
252
+ }
253
+ // Rebuild dependency graph if embeds were reloaded
254
+ if (embedsReloaded) {
255
+ console.log(pc.cyan(' Rebuilding dependency graph...'));
256
+ depGraph = new DependencyGraph(config, embeds);
257
+ await depGraph.build();
258
+ }
259
+ // Identify affected documents
260
+ const affectedDocs = new Set();
261
+ for (const [filePath] of changes) {
262
+ const affected = depGraph.getAffectedDocuments(filePath);
263
+ for (const doc of affected) {
264
+ affectedDocs.add(doc);
265
+ }
266
+ }
267
+ if (affectedDocs.size === 0) {
268
+ // Changed file might be a document itself
269
+ for (const [filePath] of changes) {
270
+ const absolutePath = resolve(filePath);
271
+ // Check if matches target patterns
272
+ for (const target of config.targets) {
273
+ const { glob } = await import('glob');
274
+ const matches = await glob(target.pattern, { absolute: true });
275
+ if (matches.includes(absolutePath)) {
276
+ affectedDocs.add(absolutePath);
277
+ break;
278
+ }
279
+ }
280
+ }
281
+ }
282
+ if (affectedDocs.size === 0) {
283
+ console.log(pc.gray('\n No affected documents found'));
284
+ return;
285
+ }
286
+ console.log(pc.yellow(`\n📝 Rebuilding ${affectedDocs.size} document(s)...`));
287
+ for (const docPath of affectedDocs) {
288
+ console.log(pc.gray(` - ${relative(process.cwd(), docPath)}`));
289
+ }
290
+ try {
291
+ // Re-initialize datasources (especially for SQLite)
292
+ await closeDatasources(datasources);
293
+ datasources = initializeDatasources(config);
294
+ const result = await build(config, embeds, datasources, {
295
+ verbose: options.verbose,
296
+ specificFiles: Array.from(affectedDocs),
297
+ });
298
+ if (result.totalMarkersUpdated > 0) {
299
+ console.log(pc.green(` ✅ Updated ${result.totalMarkersUpdated} marker(s)`));
300
+ }
301
+ else {
302
+ console.log(pc.gray(' No markers updated'));
303
+ }
304
+ // Update dependency graph
305
+ depGraph = new DependencyGraph(config, embeds);
306
+ await depGraph.build();
307
+ }
308
+ catch (error) {
309
+ console.error(pc.red(' ❌ Error:'), error);
310
+ }
311
+ };
312
+ // Handle file changes with debounce
313
+ const handleChange = (type) => (filePath) => {
314
+ pendingChanges.set(resolve(filePath), type);
315
+ if (debounceTimer) {
316
+ clearTimeout(debounceTimer);
317
+ }
318
+ debounceTimer = setTimeout(processChanges, 200);
319
+ };
320
+ watcher.on('change', handleChange('change'));
321
+ watcher.on('add', handleChange('add'));
322
+ // Exit on Ctrl+C
323
+ process.on('SIGINT', async () => {
324
+ console.log(pc.cyan('\n\n👋 Stopping watch...'));
325
+ await watcher.close();
326
+ await closeDatasources(datasources);
327
+ process.exit(0);
328
+ });
329
+ }
330
+ catch (error) {
331
+ console.error(pc.red('❌ Watch failed:'));
332
+ console.error(error instanceof Error ? error.message : String(error));
333
+ process.exit(1);
334
+ }
335
+ });
336
+ program.parse();
337
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Dependency Graph
3
+ * Manage dependencies between documents, embeds, and datasources
4
+ */
5
+ import type { EmbedifyConfig, EmbedDefinition, TargetConfig } from '../types/index.js';
6
+ /**
7
+ * Dependency type
8
+ */
9
+ export type DependencyType = 'document' | 'embed' | 'datasource';
10
+ /**
11
+ * Dependency node
12
+ */
13
+ export interface DependencyNode {
14
+ type: DependencyType;
15
+ path: string;
16
+ /** Paths this node depends on */
17
+ dependsOn: Set<string>;
18
+ /** Paths that depend on this node */
19
+ dependedBy: Set<string>;
20
+ }
21
+ /**
22
+ * Dependency graph
23
+ */
24
+ export declare class DependencyGraph {
25
+ private nodes;
26
+ private config;
27
+ private embedsDir;
28
+ private embeds;
29
+ constructor(config: EmbedifyConfig, embeds: Record<string, EmbedDefinition>);
30
+ /**
31
+ * Get or create node
32
+ */
33
+ private getOrCreateNode;
34
+ /**
35
+ * Add dependency
36
+ */
37
+ private addDependency;
38
+ /**
39
+ * Analyze document file and extract dependencies
40
+ */
41
+ analyzeDocument(filePath: string, targetConfig: TargetConfig): Promise<void>;
42
+ /**
43
+ * Analyze all target files and build dependency graph
44
+ */
45
+ build(): Promise<void>;
46
+ /**
47
+ * Get all documents that depend on the specified path
48
+ */
49
+ getAffectedDocuments(changedPath: string): string[];
50
+ /**
51
+ * Get paths to watch (datasources, embeds directory)
52
+ */
53
+ getWatchPaths(): string[];
54
+ /**
55
+ * Debug: Dump graph state
56
+ */
57
+ dump(): void;
58
+ }
59
+ //# sourceMappingURL=dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../src/core/dependency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,qCAAqC;IACrC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAkC;gBAG9C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAOzC;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC;IAkDhB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAuEnD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAkBzB;;OAEG;IACH,IAAI,IAAI,IAAI;CAkBb"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Dependency Graph
3
+ * Manage dependencies between documents, embeds, and datasources
4
+ */
5
+ import { readFile } from 'node:fs/promises';
6
+ import { resolve, relative } from 'node:path';
7
+ import { glob } from 'glob';
8
+ import { parseFrontmatter, parseMarkers, getCommentStyle } from './parser.js';
9
+ /**
10
+ * Dependency graph
11
+ */
12
+ export class DependencyGraph {
13
+ nodes = new Map();
14
+ config;
15
+ embedsDir;
16
+ embeds;
17
+ constructor(config, embeds) {
18
+ this.config = config;
19
+ this.embeds = embeds;
20
+ this.embedsDir = resolve(config.embeds_dir ?? './embeds');
21
+ }
22
+ /**
23
+ * Get or create node
24
+ */
25
+ getOrCreateNode(type, path) {
26
+ const normalizedPath = resolve(path);
27
+ let node = this.nodes.get(normalizedPath);
28
+ if (!node) {
29
+ node = {
30
+ type,
31
+ path: normalizedPath,
32
+ dependsOn: new Set(),
33
+ dependedBy: new Set(),
34
+ };
35
+ this.nodes.set(normalizedPath, node);
36
+ }
37
+ return node;
38
+ }
39
+ /**
40
+ * Add dependency
41
+ */
42
+ addDependency(fromPath, toPath) {
43
+ const fromNode = this.nodes.get(resolve(fromPath));
44
+ const toNode = this.nodes.get(resolve(toPath));
45
+ if (fromNode && toNode) {
46
+ fromNode.dependsOn.add(toNode.path);
47
+ toNode.dependedBy.add(fromNode.path);
48
+ }
49
+ }
50
+ /**
51
+ * Analyze document file and extract dependencies
52
+ */
53
+ async analyzeDocument(filePath, targetConfig) {
54
+ const absolutePath = resolve(filePath);
55
+ const docNode = this.getOrCreateNode('document', absolutePath);
56
+ try {
57
+ const content = await readFile(absolutePath, { encoding: 'utf-8' });
58
+ const commentStyle = getCommentStyle(targetConfig.comment_style, this.config.comment_styles);
59
+ // Parse frontmatter
60
+ const { content: bodyContent } = parseFrontmatter(content);
61
+ // Parse markers to extract embed names
62
+ const markers = parseMarkers(bodyContent, commentStyle);
63
+ const embedNames = new Set(markers.map((m) => m.templateName));
64
+ // Add dependency for each embed
65
+ for (const embedName of embedNames) {
66
+ const embed = this.embeds[embedName];
67
+ if (embed) {
68
+ // Create embed node (virtual path)
69
+ const embedPath = `embed:${embedName}`;
70
+ const embedNode = this.getOrCreateNode('embed', embedPath);
71
+ // Document -> Embed dependency
72
+ docNode.dependsOn.add(embedNode.path);
73
+ embedNode.dependedBy.add(docNode.path);
74
+ // Embed -> Datasource dependency
75
+ if (embed.dependsOn) {
76
+ for (const dsName of embed.dependsOn) {
77
+ const dsConfig = this.config.datasources?.[dsName];
78
+ if (dsConfig?.path) {
79
+ const dsPath = resolve(dsConfig.path);
80
+ const dsNode = this.getOrCreateNode('datasource', dsPath);
81
+ embedNode.dependsOn.add(dsNode.path);
82
+ dsNode.dependedBy.add(embedNode.path);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ catch {
90
+ // Ignore file read errors
91
+ }
92
+ }
93
+ /**
94
+ * Analyze all target files and build dependency graph
95
+ */
96
+ async build() {
97
+ this.nodes.clear();
98
+ for (const targetConfig of this.config.targets) {
99
+ const files = await glob(targetConfig.pattern, {
100
+ ignore: targetConfig.exclude ?? [],
101
+ nodir: true,
102
+ });
103
+ for (const filePath of files) {
104
+ await this.analyzeDocument(filePath, targetConfig);
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * Get all documents that depend on the specified path
110
+ */
111
+ getAffectedDocuments(changedPath) {
112
+ const normalizedPath = resolve(changedPath);
113
+ const affected = new Set();
114
+ // Find changed node
115
+ let startNode = this.nodes.get(normalizedPath);
116
+ // If datasource file, search by path
117
+ if (!startNode) {
118
+ for (const node of this.nodes.values()) {
119
+ if (node.type === 'datasource' && node.path === normalizedPath) {
120
+ startNode = node;
121
+ break;
122
+ }
123
+ }
124
+ }
125
+ // If embed file (.ts file)
126
+ if (!startNode && changedPath.endsWith('.ts')) {
127
+ // Infer embed name from filename
128
+ const fileName = changedPath.split('/').pop()?.replace('.ts', '');
129
+ if (fileName && fileName !== 'index') {
130
+ const embedPath = `embed:${fileName}`;
131
+ startNode = this.nodes.get(resolve(embedPath));
132
+ // Try snake_case/camelCase conversion
133
+ if (!startNode) {
134
+ const snakeCase = fileName.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
135
+ startNode = this.nodes.get(resolve(`embed:${snakeCase}`));
136
+ }
137
+ }
138
+ }
139
+ if (!startNode) {
140
+ // If not found, check if changed file itself is a document
141
+ const docNode = this.nodes.get(normalizedPath);
142
+ if (docNode?.type === 'document') {
143
+ return [normalizedPath];
144
+ }
145
+ return [];
146
+ }
147
+ // BFS to find dependent documents
148
+ const visited = new Set();
149
+ const queue = [startNode];
150
+ while (queue.length > 0) {
151
+ const current = queue.shift();
152
+ if (visited.has(current.path)) {
153
+ continue;
154
+ }
155
+ visited.add(current.path);
156
+ // Add to result if document
157
+ if (current.type === 'document') {
158
+ affected.add(current.path);
159
+ }
160
+ // Add nodes that depend on this node to queue
161
+ for (const dependedByPath of current.dependedBy) {
162
+ const dependedByNode = this.nodes.get(dependedByPath);
163
+ if (dependedByNode && !visited.has(dependedByPath)) {
164
+ queue.push(dependedByNode);
165
+ }
166
+ }
167
+ }
168
+ return Array.from(affected);
169
+ }
170
+ /**
171
+ * Get paths to watch (datasources, embeds directory)
172
+ */
173
+ getWatchPaths() {
174
+ const paths = [];
175
+ // Datasource paths
176
+ if (this.config.datasources) {
177
+ for (const dsConfig of Object.values(this.config.datasources)) {
178
+ if (dsConfig.path) {
179
+ paths.push(resolve(dsConfig.path));
180
+ }
181
+ }
182
+ }
183
+ // Embeds directory
184
+ paths.push(this.embedsDir);
185
+ return paths;
186
+ }
187
+ /**
188
+ * Debug: Dump graph state
189
+ */
190
+ dump() {
191
+ console.log('\n=== Dependency Graph ===');
192
+ for (const [path, node] of this.nodes) {
193
+ console.log(`\n[${node.type}] ${relative(process.cwd(), path)}`);
194
+ if (node.dependsOn.size > 0) {
195
+ console.log(' depends on:');
196
+ for (const dep of node.dependsOn) {
197
+ console.log(` - ${relative(process.cwd(), dep)}`);
198
+ }
199
+ }
200
+ if (node.dependedBy.size > 0) {
201
+ console.log(' depended by:');
202
+ for (const dep of node.dependedBy) {
203
+ console.log(` - ${relative(process.cwd(), dep)}`);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ //# sourceMappingURL=dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/core/dependency.ts"],"names":[],"mappings":"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"}