functional-examples 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +63 -44
  2. package/README.md.template +28 -54
  3. package/dist/cli/commands/scan.d.ts +1 -1
  4. package/dist/cli/index.d.ts +2 -2
  5. package/dist/config/resolver.d.ts.map +1 -1
  6. package/dist/config/resolver.js +25 -2
  7. package/dist/config/resolver.js.map +1 -1
  8. package/dist/config/schema.d.ts +10 -0
  9. package/dist/config/schema.d.ts.map +1 -1
  10. package/dist/config/schema.js +6 -0
  11. package/dist/config/schema.js.map +1 -1
  12. package/dist/files/reader.d.ts +4 -20
  13. package/dist/files/reader.d.ts.map +1 -1
  14. package/dist/files/reader.js +6 -22
  15. package/dist/files/reader.js.map +1 -1
  16. package/dist/index.d.ts +2 -3
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/plugins/pipeline.d.ts +2 -1
  21. package/dist/plugins/pipeline.d.ts.map +1 -1
  22. package/dist/plugins/pipeline.js +4 -3
  23. package/dist/plugins/pipeline.js.map +1 -1
  24. package/dist/regions/defaults.d.ts +11 -0
  25. package/dist/regions/defaults.d.ts.map +1 -0
  26. package/dist/regions/defaults.js +20 -0
  27. package/dist/regions/defaults.js.map +1 -0
  28. package/dist/regions/parser.d.ts +18 -56
  29. package/dist/regions/parser.d.ts.map +1 -1
  30. package/dist/regions/parser.js +81 -149
  31. package/dist/regions/parser.js.map +1 -1
  32. package/dist/scanner/scanner.d.ts.map +1 -1
  33. package/dist/scanner/scanner.js +14 -5
  34. package/dist/scanner/scanner.js.map +1 -1
  35. package/dist/types/index.d.ts +2 -1
  36. package/dist/types/index.d.ts.map +1 -1
  37. package/dist/types/index.js +2 -0
  38. package/dist/types/index.js.map +1 -1
  39. package/package.json +2 -2
  40. package/dist/config/index.spec.d.ts.map +0 -1
  41. package/dist/config/index.spec.js +0 -142
  42. package/dist/config/index.spec.js.map +0 -1
  43. package/dist/extractors/loader.d.ts.map +0 -1
  44. package/dist/extractors/loader.js +0 -120
  45. package/dist/extractors/loader.js.map +0 -1
  46. package/dist/extractors/meta-yml-fn.d.ts.map +0 -1
  47. package/dist/extractors/meta-yml-fn.js +0 -66
  48. package/dist/extractors/meta-yml-fn.js.map +0 -1
  49. package/dist/extractors/meta-yml.d.ts.map +0 -1
  50. package/dist/extractors/meta-yml.js +0 -65
  51. package/dist/extractors/meta-yml.js.map +0 -1
  52. package/dist/extractors/registry.d.ts.map +0 -1
  53. package/dist/extractors/registry.js +0 -114
  54. package/dist/extractors/registry.js.map +0 -1
  55. package/dist/extractors/registry.spec.d.ts.map +0 -1
  56. package/dist/extractors/registry.spec.js +0 -102
  57. package/dist/extractors/registry.spec.js.map +0 -1
  58. package/dist/extractors/yaml-frontmatter-fn.d.ts.map +0 -1
  59. package/dist/extractors/yaml-frontmatter-fn.js +0 -73
  60. package/dist/extractors/yaml-frontmatter-fn.js.map +0 -1
  61. package/dist/extractors/yaml-frontmatter.d.ts.map +0 -1
  62. package/dist/extractors/yaml-frontmatter.js +0 -83
  63. package/dist/extractors/yaml-frontmatter.js.map +0 -1
  64. package/dist/extractors/yaml-frontmatter.spec.d.ts.map +0 -1
  65. package/dist/extractors/yaml-frontmatter.spec.js +0 -134
  66. package/dist/extractors/yaml-frontmatter.spec.js.map +0 -1
  67. package/dist/regions/index.d.ts +0 -7
  68. package/dist/regions/index.d.ts.map +0 -1
  69. package/dist/regions/index.js +0 -6
  70. package/dist/regions/index.js.map +0 -1
  71. package/dist/regions/languages.d.ts +0 -15
  72. package/dist/regions/languages.d.ts.map +0 -1
  73. package/dist/regions/languages.js +0 -182
  74. package/dist/regions/languages.js.map +0 -1
  75. package/dist/regions/parser.spec.d.ts.map +0 -1
  76. package/dist/regions/parser.spec.js +0 -190
  77. package/dist/regions/parser.spec.js.map +0 -1
  78. package/dist/regions/types.d.ts +0 -37
  79. package/dist/regions/types.d.ts.map +0 -1
  80. package/dist/regions/types.js +0 -5
  81. package/dist/regions/types.js.map +0 -1
  82. package/dist/scanner/scanner.spec.d.ts.map +0 -1
  83. package/dist/scanner/scanner.spec.js +0 -262
  84. package/dist/scanner/scanner.spec.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functional-examples",
3
- "version": "0.0.1",
3
+ "version": "0.1.0",
4
4
  "author": {
5
5
  "name": "Craigory Coppola",
6
6
  "url": "https://craigory.dev"
@@ -36,7 +36,7 @@
36
36
  "jiti": "^2.4.2",
37
37
  "minimatch": "^10.0.0",
38
38
  "tinyglobby": "^0.2.15",
39
- "@functional-examples/devkit": "0.0.1"
39
+ "@functional-examples/devkit": "0.1.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "22.19.8",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.spec.d.ts","sourceRoot":"","sources":["../../src/config/index.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,142 +0,0 @@
1
- /**
2
- * Tests for configuration system
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { findConfigFile, validateConfig, mergeConfigs } from './index.js';
6
- describe('Config System', () => {
7
- describe('findConfigFile', () => {
8
- // Test with a directory that definitely won't have a config
9
- it('should return null when no config exists', async () => {
10
- const configPath = await findConfigFile('/nonexistent-path-12345');
11
- expect(configPath).toBeNull();
12
- });
13
- it('should search for various config file patterns', async () => {
14
- // This test verifies the function doesn't throw and handles paths correctly
15
- // In a real test environment, we would use a temp directory with actual config files
16
- const configPath = await findConfigFile(process.cwd());
17
- // The result depends on whether a config file exists - we just verify no errors
18
- expect(configPath === null || typeof configPath === 'string').toBe(true);
19
- });
20
- });
21
- describe('validateConfig', () => {
22
- it('should pass valid config', () => {
23
- const config = {
24
- extractors: [
25
- '@scope/extractor',
26
- {
27
- name: 'my-extractor',
28
- module: '@scope/extractor',
29
- options: { key: 'value' },
30
- },
31
- ],
32
- scan: {
33
- include: ['examples/**/*'],
34
- exclude: ['**/node_modules/**'],
35
- recursive: true,
36
- },
37
- };
38
- const errors = validateConfig(config);
39
- expect(errors).toHaveLength(0);
40
- });
41
- it('should fail with empty extractors', () => {
42
- const config = {
43
- extractors: [],
44
- };
45
- const errors = validateConfig(config);
46
- expect(errors.length).toBeGreaterThan(0);
47
- expect(errors[0]).toMatchObject({
48
- path: 'extractors',
49
- });
50
- });
51
- it('should fail with empty extractor string', () => {
52
- const config = {
53
- extractors: [''],
54
- };
55
- const errors = validateConfig(config);
56
- expect(errors.length).toBeGreaterThan(0);
57
- expect(errors[0].path).toMatch(/extractors/);
58
- });
59
- it('should fail with invalid extractor config', () => {
60
- const config = {
61
- extractors: [
62
- {
63
- name: 'test',
64
- module: '',
65
- },
66
- ],
67
- };
68
- const errors = validateConfig(config);
69
- expect(errors.length).toBeGreaterThan(0);
70
- expect(errors[0].path).toMatch(/extractors.*module/);
71
- });
72
- it('should validate scan include patterns', () => {
73
- const config = {
74
- extractors: ['@scope/test'],
75
- scan: {
76
- include: [''],
77
- },
78
- };
79
- const errors = validateConfig(config);
80
- expect(errors.length).toBeGreaterThan(0);
81
- expect(errors.some((e) => e.path.includes('scan') && e.path.includes('include'))).toBe(true);
82
- });
83
- it('should validate scan exclude patterns', () => {
84
- const config = {
85
- extractors: ['@scope/test'],
86
- scan: {
87
- exclude: ['', 'valid'],
88
- },
89
- };
90
- const errors = validateConfig(config);
91
- expect(errors.length).toBeGreaterThan(0);
92
- expect(errors.some((e) => e.path.includes('scan') && e.path.includes('exclude'))).toBe(true);
93
- });
94
- });
95
- describe('mergeConfigs', () => {
96
- it('should merge extractor arrays', () => {
97
- const config1 = {
98
- extractors: ['extractor1'],
99
- };
100
- const config2 = {
101
- extractors: ['extractor2'],
102
- };
103
- const merged = mergeConfigs(config1, config2);
104
- expect(merged.extractors).toEqual(['extractor1', 'extractor2']);
105
- });
106
- it('should deep merge scan config', () => {
107
- const config1 = {
108
- scan: { include: ['**/*.ts'] },
109
- };
110
- const config2 = {
111
- scan: { exclude: ['**/test/**'] },
112
- };
113
- const merged = mergeConfigs(config1, config2);
114
- expect(merged.scan).toEqual({
115
- include: ['**/*.ts'],
116
- exclude: ['**/test/**'],
117
- recursive: true,
118
- fileExtensions: ['.ts', '.js', '.tsx', '.jsx', '.py', '.rb', '.go'],
119
- });
120
- });
121
- it('should provide defaults for scan config', () => {
122
- const config = {};
123
- const merged = mergeConfigs(config);
124
- expect(merged.scan).toEqual({
125
- include: [],
126
- exclude: [],
127
- recursive: true,
128
- fileExtensions: ['.ts', '.js', '.tsx', '.jsx', '.py', '.rb', '.go'],
129
- });
130
- });
131
- it('should handle null configs', () => {
132
- const merged = mergeConfigs(null, undefined, {});
133
- expect(merged.scan).toEqual({
134
- include: [],
135
- exclude: [],
136
- recursive: true,
137
- fileExtensions: ['.ts', '.js', '.tsx', '.jsx', '.py', '.rb', '.go'],
138
- });
139
- });
140
- });
141
- });
142
- //# sourceMappingURL=index.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../src/config/index.spec.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/extractors/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAM5D;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC,CAmBlD;AAsHD;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
@@ -1,120 +0,0 @@
1
- /**
2
- * Lazy extractor module loading with caching
3
- */
4
- import { pathToFileURL } from 'node:url';
5
- import * as path from 'node:path';
6
- const cache = new Map();
7
- /**
8
- * Resolve a module reference to a loaded extractor
9
- * @param ref - Package name, local path, or ExtractorConfig
10
- * @param basePath - Base directory for resolving local paths
11
- * @returns Loaded extractor or throws if module cannot be loaded
12
- */
13
- export async function loadExtractor(ref, basePath) {
14
- const modulePath = typeof ref === 'string' ? ref : ref.module;
15
- const cached = cache.get(modulePath);
16
- if (cached) {
17
- return cached;
18
- }
19
- try {
20
- const extractor = await loadModule(modulePath, basePath);
21
- cache.set(modulePath, extractor);
22
- return extractor;
23
- }
24
- catch (error) {
25
- throw new Error(`Failed to load extractor module "${modulePath}": ${error instanceof Error ? error.message : String(error)}`);
26
- }
27
- }
28
- /**
29
- * Load a module from various formats (ESM, CJS, package)
30
- * @param modulePath - Module identifier
31
- * @param basePath - Base directory for resolving local paths
32
- * @returns Loaded extractor function
33
- */
34
- async function loadModule(modulePath, basePath) {
35
- let resolvedPath = modulePath;
36
- if (modulePath.startsWith('./') || modulePath.startsWith('../')) {
37
- if (!basePath) {
38
- throw new Error(`Local path "${modulePath}" requires basePath to be provided`);
39
- }
40
- resolvedPath = path.resolve(basePath, modulePath);
41
- }
42
- else if (modulePath.startsWith('/') || isAbsolutePath(modulePath)) {
43
- resolvedPath = modulePath;
44
- }
45
- const ext = path.extname(resolvedPath).toLowerCase();
46
- const isTypeScript = ext === '.ts' || ext === '.mts' || ext === '.cts';
47
- const isJavaScript = ext === '.js' || ext === '.mjs' || ext === '.cjs';
48
- if (isTypeScript) {
49
- return await loadTypeScriptModule(resolvedPath);
50
- }
51
- else if (isJavaScript) {
52
- return await loadJavaScriptModule(resolvedPath);
53
- }
54
- return await loadPackageModule(modulePath);
55
- }
56
- /**
57
- * Check if a path is absolute (not starting with /)
58
- */
59
- function isAbsolutePath(p) {
60
- return path.isAbsolute(p);
61
- }
62
- /**
63
- * Load a TypeScript module using tsx
64
- */
65
- async function loadTypeScriptModule(filePath) {
66
- const tsx = await import('tsx');
67
- const module = await tsx.import(filePath);
68
- return normalizeModuleExport(module, filePath);
69
- }
70
- /**
71
- * Load a JavaScript module (ESM or CJS)
72
- */
73
- async function loadJavaScriptModule(filePath) {
74
- const fileUrl = pathToFileURL(filePath).href;
75
- const module = await import(fileUrl);
76
- return normalizeModuleExport(module, filePath);
77
- }
78
- /**
79
- * Load a package from node_modules
80
- */
81
- async function loadPackageModule(packageName) {
82
- try {
83
- const module = await import(packageName);
84
- return normalizeModuleExport(module, packageName);
85
- }
86
- catch (error) {
87
- throw new Error(`Package "${packageName}" not found. Make sure it is installed.`);
88
- }
89
- }
90
- /**
91
- * Normalize module export to extractor function
92
- * Handles default exports, named exports, and object exports with extractor property
93
- */
94
- function normalizeModuleExport(module, modulePath) {
95
- if (typeof module === 'function') {
96
- return module;
97
- }
98
- if (module && typeof module === 'object') {
99
- const obj = module;
100
- if (typeof obj.extractor === 'function') {
101
- return obj.extractor;
102
- }
103
- if (typeof obj.default === 'function') {
104
- return obj.default;
105
- }
106
- for (const value of Object.values(obj)) {
107
- if (typeof value === 'function') {
108
- return value;
109
- }
110
- }
111
- }
112
- throw new Error(`Invalid module export from "${modulePath}". Expected a function export or object with extractor property.`);
113
- }
114
- /**
115
- * Clear the module cache (useful for testing or config reload)
116
- */
117
- export function clearCache() {
118
- cache.clear();
119
- }
120
- //# sourceMappingURL=loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extractors/loader.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta-yml-fn.d.ts","sourceRoot":"","sources":["../../src/extractors/meta-yml-fn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAEnE;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,SAAS,YAAY,GAAG,YAAY,KAC1C,yBAAyB,CAAC,SAAS,CAAC,CAiExC"}
@@ -1,66 +0,0 @@
1
- /**
2
- * meta.yml extractor for directory-based examples (function-based).
3
- *
4
- * Expected structure:
5
- * ```
6
- * examples/
7
- * my-example/
8
- * meta.yml
9
- * main.ts
10
- * helper.ts
11
- * ```
12
- */
13
- import YAML from 'yaml';
14
- import fs from 'node:fs/promises';
15
- import path from 'node:path';
16
- /**
17
- * Extractor for directory-based examples with meta.yml.
18
- */
19
- export function createMetaYmlExtractor() {
20
- const extractor = async (context) => {
21
- if (!context.isDirectory ||
22
- !(context.entries?.includes('meta.yml') ?? false)) {
23
- return undefined;
24
- }
25
- const metaPath = path.join(context.path, 'meta.yml');
26
- const metaContent = await fs.readFile(metaPath, 'utf-8');
27
- const parsed = YAML.parse(metaContent);
28
- const dirName = path.basename(context.path);
29
- const metadata = {
30
- id: dirName,
31
- title: dirName,
32
- ...parsed,
33
- };
34
- const contentFileName = parsed.contentFile ?? 'content.md';
35
- const excludedFiles = new Set(['meta.yml', contentFileName]);
36
- const files = [];
37
- await collectFiles(context.path, context.path, excludedFiles, files);
38
- return {
39
- metadata,
40
- files,
41
- };
42
- };
43
- async function collectFiles(rootPath, currentPath, excludedFiles, collected) {
44
- const entries = await fs.readdir(currentPath, { withFileTypes: true });
45
- for (const entry of entries) {
46
- const fullPath = path.join(currentPath, entry.name);
47
- const relativePath = path.relative(rootPath, fullPath);
48
- if (entry.isDirectory()) {
49
- await collectFiles(rootPath, fullPath, excludedFiles, collected);
50
- }
51
- else if (!excludedFiles.has(entry.name)) {
52
- const contents = await fs.readFile(fullPath, 'utf-8');
53
- collected.push({
54
- path: relativePath,
55
- contents,
56
- });
57
- }
58
- }
59
- }
60
- extractor.name = 'meta-yml';
61
- extractor.canExtract = (context) => {
62
- return (context.isDirectory && (context.entries?.includes('meta.yml') ?? false));
63
- };
64
- return extractor;
65
- }
66
- //# sourceMappingURL=meta-yml-fn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta-yml-fn.js","sourceRoot":"","sources":["../../src/extractors/meta-yml-fn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;GAEG;AACH,MAAM,UAAU,sBAAsB;IAGpC,MAAM,SAAS,GAAyC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxE,IACE,CAAC,OAAO,CAAC,WAAW;YACpB,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EACjD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA4B,CAAC;QAElE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,GAAG,MAAM;SACG,CAAC;QAEf,MAAM,eAAe,GAClB,MAAmC,CAAC,WAAW,IAAI,YAAY,CAAC;QACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAErE,OAAO;YACL,QAAQ;YACR,KAAK;SACN,CAAC;IACJ,CAAC,CAAC;IAEF,KAAK,UAAU,YAAY,CACzB,QAAgB,EAChB,WAAmB,EACnB,aAA0B,EAC1B,SAAwB;QAExB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtD,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,YAAY;oBAClB,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC;IAC5B,SAAS,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,EAAE;QACjC,OAAO,CACL,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CACxE,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta-yml.d.ts","sourceRoot":"","sources":["../../src/extractors/meta-yml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG1F;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,IAAI,cAAc;IAE3B,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO;IAKzC,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YA0BvD,YAAY;CAuB3B"}
@@ -1,65 +0,0 @@
1
- /**
2
- * meta.yml extractor for directory-based examples.
3
- *
4
- * Expected structure:
5
- * ```
6
- * examples/
7
- * my-example/
8
- * meta.yml
9
- * main.ts
10
- * helper.ts
11
- * ```
12
- */
13
- import YAML from 'yaml';
14
- import fs from 'node:fs/promises';
15
- import path from 'node:path';
16
- /**
17
- * Extractor for directory-based examples with meta.yml.
18
- * Used by isolated-workers pattern.
19
- */
20
- export class MetaYmlExtractor {
21
- name = 'meta-yml';
22
- canExtract(context) {
23
- // Must be a directory with meta.yml
24
- return context.isDirectory && (context.entries?.includes('meta.yml') ?? false);
25
- }
26
- async extract(context) {
27
- const metaPath = path.join(context.path, 'meta.yml');
28
- const metaContent = await fs.readFile(metaPath, 'utf-8');
29
- const parsed = YAML.parse(metaContent);
30
- // Generate ID from directory name if not provided
31
- const dirName = path.basename(context.path);
32
- const metadata = {
33
- id: dirName,
34
- title: dirName,
35
- ...parsed,
36
- };
37
- // Collect all files except meta.yml and any content file
38
- const contentFileName = parsed.contentFile ?? 'content.md';
39
- const excludedFiles = new Set(['meta.yml', contentFileName]);
40
- const files = [];
41
- await this.collectFiles(context.path, context.path, excludedFiles, files);
42
- return {
43
- metadata,
44
- files,
45
- };
46
- }
47
- async collectFiles(rootPath, currentPath, excludedFiles, collected) {
48
- const entries = await fs.readdir(currentPath, { withFileTypes: true });
49
- for (const entry of entries) {
50
- const fullPath = path.join(currentPath, entry.name);
51
- const relativePath = path.relative(rootPath, fullPath);
52
- if (entry.isDirectory()) {
53
- await this.collectFiles(rootPath, fullPath, excludedFiles, collected);
54
- }
55
- else if (!excludedFiles.has(entry.name)) {
56
- const contents = await fs.readFile(fullPath, 'utf-8');
57
- collected.push({
58
- path: relativePath,
59
- contents,
60
- });
61
- }
62
- }
63
- }
64
- }
65
- //# sourceMappingURL=meta-yml.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta-yml.js","sourceRoot":"","sources":["../../src/extractors/meta-yml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,UAAU,CAAC;IAE3B,UAAU,CAAC,OAA0B;QACnC,oCAAoC;QACpC,OAAO,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0B;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA4B,CAAC;QAElE,kDAAkD;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,GAAG,MAAM;SACV,CAAC;QAEF,yDAAyD;QACzD,MAAM,eAAe,GAAI,MAAmC,CAAC,WAAW,IAAI,YAAY,CAAC;QACzF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QAE7D,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAE1E,OAAO;YACL,QAAQ;YACR,KAAK;SACN,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,QAAgB,EAChB,WAAmB,EACnB,aAA0B,EAC1B,SAAwB;QAExB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtD,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,YAAY;oBAClB,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/extractors/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAqBpB;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,SAAS,SAAS,YAAY,GAAG,YAAY;IAC1E,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,gBAAgB,CACZ;IAEZ;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAAG,IAAI;IAK/D;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAKvE;;OAEG;IACH,aAAa,IAAI,SAAS,yBAAyB,CAAC,SAAS,CAAC,EAAE;IAYhE;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAW5D;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAYxC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;YACW,oBAAoB;IA0BlC;;OAEG;YACW,eAAe;IAc7B;;OAEG;YACW,cAAc;CAM7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,iBAAiB,CAIzD"}
@@ -1,114 +0,0 @@
1
- /**
2
- * Registry for metadata extractors (function-based with lazy loading)
3
- */
4
- import { createYamlFrontmatterExtractor } from './yaml-frontmatter-fn.js';
5
- import { createMetaYmlExtractor } from './meta-yml-fn.js';
6
- import { loadExtractor, clearCache } from './loader.js';
7
- /**
8
- * Registry that holds metadata extractors and dispatches extraction requests.
9
- * Extractors are tried in registration order; first match wins.
10
- */
11
- export class ExtractorRegistry {
12
- entries = [];
13
- loadedExtractors = new Map();
14
- /**
15
- * Register a new extractor (immediate loading)
16
- */
17
- register(extractor) {
18
- this.entries.push({ type: 'immediate', extractor });
19
- return this;
20
- }
21
- /**
22
- * Register a lazy extractor reference (loaded on first use)
23
- */
24
- registerLazy(ref, basePath) {
25
- this.entries.push({ type: 'lazy', ref, basePath });
26
- return this;
27
- }
28
- /**
29
- * Get all registered extractors (immediate only)
30
- */
31
- getExtractors() {
32
- const immediateEntries = this.entries.filter((entry) => entry.type === 'immediate');
33
- return immediateEntries.map((e) => e.extractor);
34
- }
35
- /**
36
- * Find first extractor that can handle given context
37
- */
38
- async findExtractor(context) {
39
- for (const entry of this.entries) {
40
- const extractor = await this.getExtractorForEntry(entry, context);
41
- if (!extractor)
42
- continue;
43
- const canExtract = await this.checkCanExtract(extractor, context);
44
- if (canExtract)
45
- return extractor;
46
- }
47
- return undefined;
48
- }
49
- /**
50
- * Extract metadata using first matching extractor
51
- */
52
- async extract(context) {
53
- const extractor = await this.findExtractor(context);
54
- if (!extractor) {
55
- throw new Error(`No extractor found for ${context.isDirectory ? 'directory' : 'file'}: ${context.path}`);
56
- }
57
- return await this.performExtract(extractor, context);
58
- }
59
- /**
60
- * Clear module cache (for testing or config reload)
61
- */
62
- clearCache() {
63
- this.loadedExtractors.clear();
64
- clearCache();
65
- }
66
- /**
67
- * Get extractor from entry, loading lazily if needed
68
- */
69
- async getExtractorForEntry(entry, _context) {
70
- if (entry.type === 'immediate') {
71
- return entry.extractor;
72
- }
73
- const cacheKey = typeof entry.ref === 'string' ? entry.ref : entry.ref.module;
74
- if (this.loadedExtractors.has(cacheKey)) {
75
- return this.loadedExtractors.get(cacheKey);
76
- }
77
- try {
78
- const extractor = (await loadExtractor(entry.ref, entry.basePath || process.cwd()));
79
- this.loadedExtractors.set(cacheKey, extractor);
80
- return extractor;
81
- }
82
- catch (error) {
83
- return undefined;
84
- }
85
- }
86
- /**
87
- * Check if extractor can handle context
88
- */
89
- async checkCanExtract(extractor, context) {
90
- if ('canExtract' in extractor &&
91
- typeof extractor.canExtract === 'function') {
92
- const result = extractor.canExtract(context);
93
- return result instanceof Promise ? await result : result;
94
- }
95
- return true;
96
- }
97
- /**
98
- * Perform extraction using extractor
99
- */
100
- async performExtract(extractor, context) {
101
- return extractor(context);
102
- }
103
- }
104
- /**
105
- * Create a registry with default extractors:
106
- * - MetaYmlExtractor (for directory-based examples with meta.yml)
107
- * - YamlFrontmatterExtractor (for single-file examples with YAML frontmatter)
108
- */
109
- export function createDefaultRegistry() {
110
- return new ExtractorRegistry()
111
- .register(createMetaYmlExtractor())
112
- .register(createYamlFrontmatterExtractor());
113
- }
114
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/extractors/registry.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.spec.d.ts","sourceRoot":"","sources":["../../src/extractors/registry.spec.ts"],"names":[],"mappings":""}