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.
- package/LICENSE +21 -0
- package/README.md +941 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +337 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/dependency.d.ts +59 -0
- package/dist/core/dependency.d.ts.map +1 -0
- package/dist/core/dependency.js +209 -0
- package/dist/core/dependency.js.map +1 -0
- package/dist/core/generator.d.ts +23 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +211 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/inline-datasource.d.ts +117 -0
- package/dist/core/inline-datasource.d.ts.map +1 -0
- package/dist/core/inline-datasource.js +346 -0
- package/dist/core/inline-datasource.js.map +1 -0
- package/dist/core/parser.d.ts +41 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +250 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/processor.d.ts +18 -0
- package/dist/core/processor.d.ts.map +1 -0
- package/dist/core/processor.js +219 -0
- package/dist/core/processor.js.map +1 -0
- package/dist/datasources/csv.d.ts +17 -0
- package/dist/datasources/csv.d.ts.map +1 -0
- package/dist/datasources/csv.js +54 -0
- package/dist/datasources/csv.js.map +1 -0
- package/dist/datasources/glob.d.ts +17 -0
- package/dist/datasources/glob.d.ts.map +1 -0
- package/dist/datasources/glob.js +72 -0
- package/dist/datasources/glob.js.map +1 -0
- package/dist/datasources/index.d.ts +22 -0
- package/dist/datasources/index.d.ts.map +1 -0
- package/dist/datasources/index.js +53 -0
- package/dist/datasources/index.js.map +1 -0
- package/dist/datasources/json.d.ts +16 -0
- package/dist/datasources/json.d.ts.map +1 -0
- package/dist/datasources/json.js +59 -0
- package/dist/datasources/json.js.map +1 -0
- package/dist/datasources/sqlite.d.ts +15 -0
- package/dist/datasources/sqlite.d.ts.map +1 -0
- package/dist/datasources/sqlite.js +40 -0
- package/dist/datasources/sqlite.js.map +1 -0
- package/dist/datasources/yaml.d.ts +16 -0
- package/dist/datasources/yaml.d.ts.map +1 -0
- package/dist/datasources/yaml.js +60 -0
- package/dist/datasources/yaml.js.map +1 -0
- package/dist/helpers/markdown.d.ts +10 -0
- package/dist/helpers/markdown.d.ts.map +1 -0
- package/dist/helpers/markdown.js +93 -0
- package/dist/helpers/markdown.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +254 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +88 -0
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -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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"}
|