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,18 @@
1
+ /**
2
+ * Replacement Processor
3
+ * Replace marker-enclosed blocks with embed execution results
4
+ */
5
+ import type { EmbedifyConfig, EmbedDefinition, Datasource, ProcessResult, BuildResult, TargetConfig } from '../types/index.js';
6
+ /**
7
+ * Process a single file
8
+ */
9
+ export declare function processFile(filePath: string, content: string, targetConfig: TargetConfig, embeds: Record<string, EmbedDefinition>, datasources: Record<string, Datasource>, config: EmbedifyConfig, dryRun?: boolean): Promise<ProcessResult>;
10
+ /**
11
+ * Process all target files
12
+ */
13
+ export declare function build(config: EmbedifyConfig, embeds: Record<string, EmbedDefinition>, datasources: Record<string, Datasource>, options?: {
14
+ dryRun?: boolean;
15
+ verbose?: boolean;
16
+ specificFiles?: string[];
17
+ }): Promise<BuildResult>;
18
+ //# sourceMappingURL=processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/core/processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,UAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,mBAAmB,CAAC;AA4D3B;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,MAAM,EAAE,cAAc,EACtB,MAAM,UAAQ,GACb,OAAO,CAAC,aAAa,CAAC,CA0IxB;AAgBD;;GAEG;AACH,wBAAsB,KAAK,CACzB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACL,OAAO,CAAC,WAAW,CAAC,CAoEtB"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Replacement Processor
3
+ * Replace marker-enclosed blocks with embed execution results
4
+ */
5
+ import { readFile, writeFile } from 'node:fs/promises';
6
+ import { glob } from 'glob';
7
+ import { parseMarkers, parseFrontmatter, getCommentStyle, parseInlineDataMarkers, } from './parser.js';
8
+ import { createMarkdownHelper } from '../helpers/markdown.js';
9
+ import { buildInlineDatasources, resolveDotPath } from './inline-datasource.js';
10
+ /**
11
+ * Resolve variables with support for inline datasources
12
+ * Supports ${frontmatter.key}, ${datasourceName.path.to.value}
13
+ */
14
+ function resolveVariablesWithInline(params, frontmatter, inlineDatasources) {
15
+ const result = {};
16
+ for (const [key, value] of Object.entries(params)) {
17
+ result[key] = value.replace(/\$\{(\w+(?:\.\w+|\[\d+\])*)\}/g, (_, path) => {
18
+ const parts = path.split('.');
19
+ const rootName = parts[0];
20
+ if (!rootName)
21
+ return '';
22
+ // Check inline datasources first
23
+ const inlineDs = inlineDatasources.get(rootName);
24
+ if (inlineDs) {
25
+ const subPath = parts.slice(1).join('.');
26
+ if (subPath) {
27
+ const resolved = resolveDotPath(inlineDs.data, subPath);
28
+ return resolved !== null && resolved !== undefined ? String(resolved) : '';
29
+ }
30
+ // If no subpath, return stringified value
31
+ const data = inlineDs.data;
32
+ return data !== null && data !== undefined ? String(data) : '';
33
+ }
34
+ // Fall back to frontmatter
35
+ let current = frontmatter;
36
+ for (const part of parts) {
37
+ if (current === null || current === undefined) {
38
+ return '';
39
+ }
40
+ if (typeof current === 'object') {
41
+ current = current[part];
42
+ }
43
+ else {
44
+ return '';
45
+ }
46
+ }
47
+ return current !== null && current !== undefined ? String(current) : '';
48
+ });
49
+ }
50
+ return result;
51
+ }
52
+ /**
53
+ * Process a single file
54
+ */
55
+ export async function processFile(filePath, content, targetConfig, embeds, datasources, config, dryRun = false) {
56
+ const result = {
57
+ filePath,
58
+ success: true,
59
+ markersUpdated: 0,
60
+ changed: false,
61
+ };
62
+ try {
63
+ // Get comment style
64
+ const commentStyle = getCommentStyle(targetConfig.comment_style, config.comment_styles);
65
+ // Parse frontmatter
66
+ const { data: frontmatter, content: bodyContent, raw: frontmatterRaw } = parseFrontmatter(content);
67
+ // Parse inline data markers
68
+ const inlineDataMarkers = parseInlineDataMarkers(bodyContent, commentStyle);
69
+ // Build inline datasources
70
+ const inlineDatasources = buildInlineDatasources(inlineDataMarkers, filePath, config.inline_datasource);
71
+ // Merge inline datasources with external (inline takes precedence)
72
+ const mergedDatasources = { ...datasources };
73
+ for (const [name, ds] of inlineDatasources) {
74
+ if (name in mergedDatasources) {
75
+ const policy = config.inline_datasource?.conflictPolicy ?? 'warn';
76
+ if (policy === 'error') {
77
+ throw new Error(`Inline datasource "${name}" conflicts with external datasource (conflict_policy: error)`);
78
+ }
79
+ else if (policy === 'prefer_external') {
80
+ continue; // Skip inline, use external
81
+ }
82
+ else {
83
+ console.warn(`Warning: Inline datasource "${name}" overrides external datasource in ${filePath}`);
84
+ }
85
+ }
86
+ mergedDatasources[name] = ds;
87
+ }
88
+ // Parse markers
89
+ const markers = parseMarkers(bodyContent, commentStyle);
90
+ if (markers.length === 0 && inlineDataMarkers.length === 0) {
91
+ return result;
92
+ }
93
+ // Create helpers
94
+ const markdownHelper = createMarkdownHelper();
95
+ // Replace from end to start (to preserve indices)
96
+ let processedContent = bodyContent;
97
+ const sortedMarkers = [...markers].sort((a, b) => b.startIndex - a.startIndex);
98
+ for (const marker of sortedMarkers) {
99
+ // Get embed
100
+ const embed = embeds[marker.templateName];
101
+ if (!embed) {
102
+ console.warn(`Warning: Unknown embed "${marker.templateName}" in ${filePath}`);
103
+ continue;
104
+ }
105
+ // Resolve parameter variables (including inline datasources)
106
+ const resolvedParams = resolveVariablesWithInline(marker.params, frontmatter, inlineDatasources);
107
+ // Create context
108
+ const ctx = {
109
+ params: resolvedParams,
110
+ frontmatter,
111
+ datasources: mergedDatasources,
112
+ markdown: markdownHelper,
113
+ filePath,
114
+ };
115
+ // Execute embed
116
+ const embedResult = await embed.render(ctx);
117
+ // Replace content
118
+ const newContent = marker.startMarkerLine +
119
+ '\n' +
120
+ embedResult.content +
121
+ '\n' +
122
+ marker.endMarkerLine;
123
+ processedContent =
124
+ processedContent.slice(0, marker.startIndex) +
125
+ newContent +
126
+ processedContent.slice(marker.endIndex);
127
+ result.markersUpdated++;
128
+ }
129
+ // Prepend frontmatter
130
+ const finalContent = frontmatterRaw + processedContent;
131
+ // Check if changed
132
+ if (finalContent !== content) {
133
+ result.changed = true;
134
+ if (!dryRun) {
135
+ // Write to file
136
+ const lineEnding = config.output?.line_ending ?? 'lf';
137
+ const outputContent = lineEnding === 'crlf'
138
+ ? finalContent.replace(/\n/g, '\r\n')
139
+ : finalContent;
140
+ await writeFile(filePath, outputContent, {
141
+ encoding: config.output?.encoding ?? 'utf-8',
142
+ });
143
+ }
144
+ }
145
+ // Cleanup inline datasources
146
+ for (const ds of inlineDatasources.values()) {
147
+ await ds.close();
148
+ }
149
+ }
150
+ catch (error) {
151
+ result.success = false;
152
+ result.error = error instanceof Error ? error : new Error(String(error));
153
+ }
154
+ return result;
155
+ }
156
+ /**
157
+ * Get target files
158
+ */
159
+ async function getTargetFiles(targetConfig) {
160
+ const files = await glob(targetConfig.pattern, {
161
+ ignore: targetConfig.exclude ?? [],
162
+ nodir: true,
163
+ });
164
+ return files;
165
+ }
166
+ /**
167
+ * Process all target files
168
+ */
169
+ export async function build(config, embeds, datasources, options = {}) {
170
+ const startTime = Date.now();
171
+ const results = [];
172
+ for (const targetConfig of config.targets) {
173
+ // Get target files
174
+ let files;
175
+ if (options.specificFiles && options.specificFiles.length > 0) {
176
+ // When specific files are provided
177
+ files = options.specificFiles.filter((f) => f.endsWith(targetConfig.pattern.split('*').pop() ?? ''));
178
+ }
179
+ else {
180
+ files = await getTargetFiles(targetConfig);
181
+ }
182
+ // Process each file
183
+ for (const filePath of files) {
184
+ if (options.verbose) {
185
+ console.log(`Processing: ${filePath}`);
186
+ }
187
+ try {
188
+ const content = await readFile(filePath, { encoding: 'utf-8' });
189
+ const result = await processFile(filePath, content, targetConfig, embeds, datasources, config, options.dryRun);
190
+ results.push(result);
191
+ if (options.verbose && result.markersUpdated > 0) {
192
+ console.log(` Updated ${result.markersUpdated} marker(s)${result.changed ? ' (changed)' : ' (no changes)'}`);
193
+ }
194
+ }
195
+ catch (error) {
196
+ results.push({
197
+ filePath,
198
+ success: false,
199
+ markersUpdated: 0,
200
+ changed: false,
201
+ error: error instanceof Error ? error : new Error(String(error)),
202
+ });
203
+ if (options.verbose) {
204
+ console.error(` Error: ${error}`);
205
+ }
206
+ }
207
+ }
208
+ }
209
+ const duration = Date.now() - startTime;
210
+ return {
211
+ totalFiles: results.length,
212
+ successFiles: results.filter((r) => r.success).length,
213
+ failedFiles: results.filter((r) => !r.success).length,
214
+ totalMarkersUpdated: results.reduce((sum, r) => sum + r.markersUpdated, 0),
215
+ results,
216
+ duration,
217
+ };
218
+ }
219
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/core/processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CSV Datasource
3
+ */
4
+ import type { Datasource, DatasourceConfig, QueryResult } from '../types/index.js';
5
+ export declare class CsvDatasource implements Datasource {
6
+ readonly type = "csv";
7
+ private data;
8
+ private filePath;
9
+ private encoding;
10
+ constructor(config: DatasourceConfig);
11
+ private loadData;
12
+ query(sql: string, params?: unknown[]): Promise<QueryResult>;
13
+ getAll(): Promise<QueryResult>;
14
+ close(): Promise<void>;
15
+ }
16
+ export declare function createCsvDatasource(config: DatasourceConfig): CsvDatasource;
17
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/datasources/csv.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnF,qBAAa,aAAc,YAAW,UAAU;IAC9C,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,gBAAgB;YAStB,QAAQ;IAgBhB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBhE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAE3E"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * CSV Datasource
3
+ */
4
+ import { readFile } from 'node:fs/promises';
5
+ import { parse } from 'csv-parse/sync';
6
+ export class CsvDatasource {
7
+ type = 'csv';
8
+ data = null;
9
+ filePath;
10
+ encoding;
11
+ constructor(config) {
12
+ if (!config.path) {
13
+ throw new Error('CSV datasource requires "path" configuration');
14
+ }
15
+ this.filePath = config.path;
16
+ this.encoding = config.encoding ?? 'utf-8';
17
+ }
18
+ async loadData() {
19
+ if (this.data !== null) {
20
+ return this.data;
21
+ }
22
+ const content = await readFile(this.filePath, { encoding: this.encoding });
23
+ const records = parse(content, {
24
+ columns: true,
25
+ skip_empty_lines: true,
26
+ trim: true,
27
+ });
28
+ this.data = records;
29
+ return this.data;
30
+ }
31
+ async query(sql, params = []) {
32
+ // CSV does not support SQL queries (simple filtering only)
33
+ // Simple implementation that parses WHERE clause
34
+ const data = await this.loadData();
35
+ // Only supports simple WHERE column = value
36
+ const whereMatch = sql.match(/WHERE\s+(\w+)\s*=\s*\?/i);
37
+ if (whereMatch && params.length > 0) {
38
+ const column = whereMatch[1];
39
+ const value = params[0];
40
+ return data.filter((row) => String(row[column ?? '']) === String(value));
41
+ }
42
+ return data;
43
+ }
44
+ async getAll() {
45
+ return this.loadData();
46
+ }
47
+ async close() {
48
+ this.data = null;
49
+ }
50
+ }
51
+ export function createCsvDatasource(config) {
52
+ return new CsvDatasource(config);
53
+ }
54
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/datasources/csv.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,KAAK,CAAC;IACd,IAAI,GAAuB,IAAI,CAAC;IAChC,QAAQ,CAAS;IACjB,QAAQ,CAAiB;IAEjC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAI,MAAM,CAAC,QAA2B,IAAI,OAAO,CAAC;IACjE,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE;YAC7B,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,OAAsB,CAAC;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,SAAoB,EAAE;QAC7C,2DAA2D;QAC3D,iDAAiD;QACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEnC,4CAA4C;QAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxD,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Glob Datasource
3
+ * Get file list from filesystem
4
+ */
5
+ import type { Datasource, DatasourceConfig, QueryResult } from '../types/index.js';
6
+ export declare class GlobDatasource implements Datasource {
7
+ readonly type = "glob";
8
+ private data;
9
+ private pattern;
10
+ constructor(config: DatasourceConfig);
11
+ private loadData;
12
+ query(sql: string, params?: unknown[]): Promise<QueryResult>;
13
+ getAll(): Promise<QueryResult>;
14
+ close(): Promise<void>;
15
+ }
16
+ export declare function createGlobDatasource(config: DatasourceConfig): GlobDatasource;
17
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/datasources/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYnF,qBAAa,cAAe,YAAW,UAAU;IAC/C,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,gBAAgB;YAQtB,QAAQ;IAgChB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBhE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAE7E"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Glob Datasource
3
+ * Get file list from filesystem
4
+ */
5
+ import { stat } from 'node:fs/promises';
6
+ import { basename, dirname, extname } from 'node:path';
7
+ import { glob as globFn } from 'glob';
8
+ export class GlobDatasource {
9
+ type = 'glob';
10
+ data = null;
11
+ pattern;
12
+ constructor(config) {
13
+ if (!config.pattern) {
14
+ throw new Error('Glob datasource requires "pattern" configuration');
15
+ }
16
+ this.pattern = config.pattern;
17
+ }
18
+ async loadData() {
19
+ if (this.data !== null) {
20
+ return this.data;
21
+ }
22
+ const files = await globFn(this.pattern, { nodir: true });
23
+ const fileInfos = [];
24
+ for (const filePath of files) {
25
+ try {
26
+ const stats = await stat(filePath);
27
+ const ext = extname(filePath);
28
+ fileInfos.push({
29
+ path: filePath,
30
+ name: basename(filePath),
31
+ basename: basename(filePath, ext),
32
+ ext: ext.slice(1), // Remove leading dot
33
+ dir: dirname(filePath),
34
+ size: stats.size,
35
+ mtime: stats.mtime.toISOString(),
36
+ });
37
+ }
38
+ catch {
39
+ // Skip files that cannot be read
40
+ continue;
41
+ }
42
+ }
43
+ this.data = fileInfos;
44
+ return this.data;
45
+ }
46
+ async query(sql, params = []) {
47
+ // Glob does not support SQL queries
48
+ // Simple filtering only
49
+ const data = await this.loadData();
50
+ // Only supports simple WHERE column = value
51
+ const whereMatch = sql.match(/WHERE\s+(\w+)\s*=\s*\?/i);
52
+ if (whereMatch && params.length > 0) {
53
+ const column = whereMatch[1];
54
+ const value = params[0];
55
+ return data.filter((row) => {
56
+ const rowValue = row[column ?? ''];
57
+ return rowValue === value || String(rowValue) === String(value);
58
+ });
59
+ }
60
+ return data;
61
+ }
62
+ async getAll() {
63
+ return this.loadData();
64
+ }
65
+ async close() {
66
+ this.data = null;
67
+ }
68
+ }
69
+ export function createGlobDatasource(config) {
70
+ return new GlobDatasource(config);
71
+ }
72
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/datasources/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Datasource Factory
3
+ */
4
+ import type { Datasource, DatasourceConfig, EmbedifyConfig } from '../types/index.js';
5
+ export { SqliteDatasource, createSqliteDatasource } from './sqlite.js';
6
+ export { CsvDatasource, createCsvDatasource } from './csv.js';
7
+ export { JsonDatasource, createJsonDatasource } from './json.js';
8
+ export { YamlDatasource, createYamlDatasource } from './yaml.js';
9
+ export { GlobDatasource, createGlobDatasource } from './glob.js';
10
+ /**
11
+ * Create a datasource
12
+ */
13
+ export declare function createDatasource(config: DatasourceConfig): Datasource;
14
+ /**
15
+ * Initialize all datasources from config
16
+ */
17
+ export declare function initializeDatasources(config: EmbedifyConfig): Record<string, Datasource>;
18
+ /**
19
+ * Close all datasources
20
+ */
21
+ export declare function closeDatasources(datasources: Record<string, Datasource>): Promise<void>;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/datasources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOtF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAerE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAU5B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Datasource Factory
3
+ */
4
+ import { createSqliteDatasource } from './sqlite.js';
5
+ import { createCsvDatasource } from './csv.js';
6
+ import { createJsonDatasource } from './json.js';
7
+ import { createYamlDatasource } from './yaml.js';
8
+ import { createGlobDatasource } from './glob.js';
9
+ export { SqliteDatasource, createSqliteDatasource } from './sqlite.js';
10
+ export { CsvDatasource, createCsvDatasource } from './csv.js';
11
+ export { JsonDatasource, createJsonDatasource } from './json.js';
12
+ export { YamlDatasource, createYamlDatasource } from './yaml.js';
13
+ export { GlobDatasource, createGlobDatasource } from './glob.js';
14
+ /**
15
+ * Create a datasource
16
+ */
17
+ export function createDatasource(config) {
18
+ switch (config.type) {
19
+ case 'sqlite':
20
+ return createSqliteDatasource(config);
21
+ case 'csv':
22
+ return createCsvDatasource(config);
23
+ case 'json':
24
+ return createJsonDatasource(config);
25
+ case 'yaml':
26
+ return createYamlDatasource(config);
27
+ case 'glob':
28
+ return createGlobDatasource(config);
29
+ default:
30
+ throw new Error(`Unknown datasource type: ${config.type}`);
31
+ }
32
+ }
33
+ /**
34
+ * Initialize all datasources from config
35
+ */
36
+ export function initializeDatasources(config) {
37
+ const datasources = {};
38
+ if (config.datasources) {
39
+ for (const [name, dsConfig] of Object.entries(config.datasources)) {
40
+ datasources[name] = createDatasource(dsConfig);
41
+ }
42
+ }
43
+ return datasources;
44
+ }
45
+ /**
46
+ * Close all datasources
47
+ */
48
+ export async function closeDatasources(datasources) {
49
+ for (const ds of Object.values(datasources)) {
50
+ await ds.close();
51
+ }
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/datasources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,KAAK;YACR,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,4BAA6B,MAA2B,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAsB;IAEtB,MAAM,WAAW,GAA+B,EAAE,CAAC;IAEnD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAuC;IAEvC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * JSON Datasource
3
+ */
4
+ import type { Datasource, DatasourceConfig, QueryResult } from '../types/index.js';
5
+ export declare class JsonDatasource implements Datasource {
6
+ readonly type = "json";
7
+ private data;
8
+ private filePath;
9
+ constructor(config: DatasourceConfig);
10
+ private loadData;
11
+ query(sql: string, params?: unknown[]): Promise<QueryResult>;
12
+ getAll(): Promise<QueryResult>;
13
+ close(): Promise<void>;
14
+ }
15
+ export declare function createJsonDatasource(config: DatasourceConfig): JsonDatasource;
16
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/datasources/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnF,qBAAa,cAAe,YAAW,UAAU;IAC/C,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,gBAAgB;YAQtB,QAAQ;IAoBhB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBhE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAE7E"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * JSON Datasource
3
+ */
4
+ import { readFile } from 'node:fs/promises';
5
+ export class JsonDatasource {
6
+ type = 'json';
7
+ data = null;
8
+ filePath;
9
+ constructor(config) {
10
+ if (!config.path) {
11
+ throw new Error('JSON datasource requires "path" configuration');
12
+ }
13
+ this.filePath = config.path;
14
+ }
15
+ async loadData() {
16
+ if (this.data !== null) {
17
+ return this.data;
18
+ }
19
+ const content = await readFile(this.filePath, { encoding: 'utf-8' });
20
+ const parsed = JSON.parse(content);
21
+ // Use as-is if array, wrap in array if object
22
+ if (Array.isArray(parsed)) {
23
+ this.data = parsed;
24
+ }
25
+ else if (typeof parsed === 'object' && parsed !== null) {
26
+ this.data = [parsed];
27
+ }
28
+ else {
29
+ throw new Error('JSON file must contain an array or object');
30
+ }
31
+ return this.data;
32
+ }
33
+ async query(sql, params = []) {
34
+ // JSON does not support SQL queries
35
+ // Simple filtering only
36
+ const data = await this.loadData();
37
+ // Only supports simple WHERE column = value
38
+ const whereMatch = sql.match(/WHERE\s+(\w+)\s*=\s*\?/i);
39
+ if (whereMatch && params.length > 0) {
40
+ const column = whereMatch[1];
41
+ const value = params[0];
42
+ return data.filter((row) => {
43
+ const rowValue = row[column ?? ''];
44
+ return rowValue === value || String(rowValue) === String(value);
45
+ });
46
+ }
47
+ return data;
48
+ }
49
+ async getAll() {
50
+ return this.loadData();
51
+ }
52
+ async close() {
53
+ this.data = null;
54
+ }
55
+ }
56
+ export function createJsonDatasource(config) {
57
+ return new JsonDatasource(config);
58
+ }
59
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/datasources/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,MAAM,CAAC;IACf,IAAI,GAAuB,IAAI,CAAC;IAChC,QAAQ,CAAS;IAEzB,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QAE9C,8CAA8C;QAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,MAAqB,CAAC;QACpC,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,GAAG,CAAC,MAAiC,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,SAAoB,EAAE;QAC7C,oCAAoC;QACpC,wBAAwB;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEnC,4CAA4C;QAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxD,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACnC,OAAO,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SQLite Datasource
3
+ */
4
+ import type { Datasource, DatasourceConfig, QueryResult } from '../types/index.js';
5
+ export declare class SqliteDatasource implements Datasource {
6
+ readonly type = "sqlite";
7
+ private db;
8
+ private queryString?;
9
+ constructor(config: DatasourceConfig);
10
+ query(sql: string, params?: unknown[]): Promise<QueryResult>;
11
+ getAll(): Promise<QueryResult>;
12
+ close(): Promise<void>;
13
+ }
14
+ export declare function createSqliteDatasource(config: DatasourceConfig): SqliteDatasource;
15
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/datasources/sqlite.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnF,qBAAa,gBAAiB,YAAW,UAAU;IACjD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,MAAM,EAAE,gBAAgB;IAS9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAWhE,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAO9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEjF"}