functional-examples 0.0.0-alpha.1

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 (202) hide show
  1. package/README.md +148 -0
  2. package/dist/cli/commands/generate.d.ts +10 -0
  3. package/dist/cli/commands/generate.d.ts.map +1 -0
  4. package/dist/cli/commands/generate.js +64 -0
  5. package/dist/cli/commands/generate.js.map +1 -0
  6. package/dist/cli/commands/init.d.ts +14 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -0
  8. package/dist/cli/commands/init.js +95 -0
  9. package/dist/cli/commands/init.js.map +1 -0
  10. package/dist/cli/commands/scan.d.ts +20 -0
  11. package/dist/cli/commands/scan.d.ts.map +1 -0
  12. package/dist/cli/commands/scan.js +182 -0
  13. package/dist/cli/commands/scan.js.map +1 -0
  14. package/dist/cli/commands/validate.d.ts +10 -0
  15. package/dist/cli/commands/validate.d.ts.map +1 -0
  16. package/dist/cli/commands/validate.js +65 -0
  17. package/dist/cli/commands/validate.js.map +1 -0
  18. package/dist/cli/index.d.ts +88 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +43 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/plugin-commands.d.ts +17 -0
  23. package/dist/cli/plugin-commands.d.ts.map +1 -0
  24. package/dist/cli/plugin-commands.js +45 -0
  25. package/dist/cli/plugin-commands.js.map +1 -0
  26. package/dist/config/index.d.ts +11 -0
  27. package/dist/config/index.d.ts.map +1 -0
  28. package/dist/config/index.js +9 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/index.spec.d.ts +5 -0
  31. package/dist/config/index.spec.d.ts.map +1 -0
  32. package/dist/config/index.spec.js +142 -0
  33. package/dist/config/index.spec.js.map +1 -0
  34. package/dist/config/loader.d.ts +7 -0
  35. package/dist/config/loader.d.ts.map +1 -0
  36. package/dist/config/loader.js +85 -0
  37. package/dist/config/loader.js.map +1 -0
  38. package/dist/config/merger.d.ts +27 -0
  39. package/dist/config/merger.d.ts.map +1 -0
  40. package/dist/config/merger.js +41 -0
  41. package/dist/config/merger.js.map +1 -0
  42. package/dist/config/resolver.d.ts +28 -0
  43. package/dist/config/resolver.d.ts.map +1 -0
  44. package/dist/config/resolver.js +165 -0
  45. package/dist/config/resolver.js.map +1 -0
  46. package/dist/config/schema.d.ts +53 -0
  47. package/dist/config/schema.d.ts.map +1 -0
  48. package/dist/config/schema.js +42 -0
  49. package/dist/config/schema.js.map +1 -0
  50. package/dist/config/types.d.ts +17 -0
  51. package/dist/config/types.d.ts.map +1 -0
  52. package/dist/config/types.js +5 -0
  53. package/dist/config/types.js.map +1 -0
  54. package/dist/config/validator.d.ts +6 -0
  55. package/dist/config/validator.d.ts.map +1 -0
  56. package/dist/config/validator.js +17 -0
  57. package/dist/config/validator.js.map +1 -0
  58. package/dist/extractors/index.d.ts +9 -0
  59. package/dist/extractors/index.d.ts.map +1 -0
  60. package/dist/extractors/index.js +9 -0
  61. package/dist/extractors/index.js.map +1 -0
  62. package/dist/extractors/loader.d.ts +19 -0
  63. package/dist/extractors/loader.d.ts.map +1 -0
  64. package/dist/extractors/loader.js +120 -0
  65. package/dist/extractors/loader.js.map +1 -0
  66. package/dist/extractors/meta-yml-fn.d.ts +19 -0
  67. package/dist/extractors/meta-yml-fn.d.ts.map +1 -0
  68. package/dist/extractors/meta-yml-fn.js +66 -0
  69. package/dist/extractors/meta-yml-fn.js.map +1 -0
  70. package/dist/extractors/meta-yml.d.ts +24 -0
  71. package/dist/extractors/meta-yml.d.ts.map +1 -0
  72. package/dist/extractors/meta-yml.js +65 -0
  73. package/dist/extractors/meta-yml.js.map +1 -0
  74. package/dist/extractors/registry.d.ts +58 -0
  75. package/dist/extractors/registry.d.ts.map +1 -0
  76. package/dist/extractors/registry.js +114 -0
  77. package/dist/extractors/registry.js.map +1 -0
  78. package/dist/extractors/registry.spec.d.ts +2 -0
  79. package/dist/extractors/registry.spec.d.ts.map +1 -0
  80. package/dist/extractors/registry.spec.js +102 -0
  81. package/dist/extractors/registry.spec.js.map +1 -0
  82. package/dist/extractors/types.d.ts +34 -0
  83. package/dist/extractors/types.d.ts.map +1 -0
  84. package/dist/extractors/types.js +8 -0
  85. package/dist/extractors/types.js.map +1 -0
  86. package/dist/extractors/yaml-frontmatter-fn.d.ts +18 -0
  87. package/dist/extractors/yaml-frontmatter-fn.d.ts.map +1 -0
  88. package/dist/extractors/yaml-frontmatter-fn.js +73 -0
  89. package/dist/extractors/yaml-frontmatter-fn.js.map +1 -0
  90. package/dist/extractors/yaml-frontmatter.d.ts +22 -0
  91. package/dist/extractors/yaml-frontmatter.d.ts.map +1 -0
  92. package/dist/extractors/yaml-frontmatter.js +83 -0
  93. package/dist/extractors/yaml-frontmatter.js.map +1 -0
  94. package/dist/extractors/yaml-frontmatter.spec.d.ts +2 -0
  95. package/dist/extractors/yaml-frontmatter.spec.d.ts.map +1 -0
  96. package/dist/extractors/yaml-frontmatter.spec.js +134 -0
  97. package/dist/extractors/yaml-frontmatter.spec.js.map +1 -0
  98. package/dist/files/index.d.ts +5 -0
  99. package/dist/files/index.d.ts.map +1 -0
  100. package/dist/files/index.js +5 -0
  101. package/dist/files/index.js.map +1 -0
  102. package/dist/files/reader.d.ts +50 -0
  103. package/dist/files/reader.d.ts.map +1 -0
  104. package/dist/files/reader.js +62 -0
  105. package/dist/files/reader.js.map +1 -0
  106. package/dist/index.d.ts +29 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +22 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/plugins/index.d.ts +4 -0
  111. package/dist/plugins/index.d.ts.map +1 -0
  112. package/dist/plugins/index.js +4 -0
  113. package/dist/plugins/index.js.map +1 -0
  114. package/dist/plugins/pipeline.d.ts +11 -0
  115. package/dist/plugins/pipeline.d.ts.map +1 -0
  116. package/dist/plugins/pipeline.js +24 -0
  117. package/dist/plugins/pipeline.js.map +1 -0
  118. package/dist/plugins/registry.d.ts +57 -0
  119. package/dist/plugins/registry.d.ts.map +1 -0
  120. package/dist/plugins/registry.js +93 -0
  121. package/dist/plugins/registry.js.map +1 -0
  122. package/dist/plugins/validation.d.ts +64 -0
  123. package/dist/plugins/validation.d.ts.map +1 -0
  124. package/dist/plugins/validation.js +55 -0
  125. package/dist/plugins/validation.js.map +1 -0
  126. package/dist/regions/index.d.ts +7 -0
  127. package/dist/regions/index.d.ts.map +1 -0
  128. package/dist/regions/index.js +6 -0
  129. package/dist/regions/index.js.map +1 -0
  130. package/dist/regions/languages.d.ts +15 -0
  131. package/dist/regions/languages.d.ts.map +1 -0
  132. package/dist/regions/languages.js +182 -0
  133. package/dist/regions/languages.js.map +1 -0
  134. package/dist/regions/parser.d.ts +63 -0
  135. package/dist/regions/parser.d.ts.map +1 -0
  136. package/dist/regions/parser.js +175 -0
  137. package/dist/regions/parser.js.map +1 -0
  138. package/dist/regions/parser.spec.d.ts +2 -0
  139. package/dist/regions/parser.spec.d.ts.map +1 -0
  140. package/dist/regions/parser.spec.js +190 -0
  141. package/dist/regions/parser.spec.js.map +1 -0
  142. package/dist/regions/types.d.ts +37 -0
  143. package/dist/regions/types.d.ts.map +1 -0
  144. package/dist/regions/types.js +5 -0
  145. package/dist/regions/types.js.map +1 -0
  146. package/dist/scanner/candidates.d.ts +24 -0
  147. package/dist/scanner/candidates.d.ts.map +1 -0
  148. package/dist/scanner/candidates.js +83 -0
  149. package/dist/scanner/candidates.js.map +1 -0
  150. package/dist/scanner/index.d.ts +8 -0
  151. package/dist/scanner/index.d.ts.map +1 -0
  152. package/dist/scanner/index.js +6 -0
  153. package/dist/scanner/index.js.map +1 -0
  154. package/dist/scanner/scan.d.ts +40 -0
  155. package/dist/scanner/scan.d.ts.map +1 -0
  156. package/dist/scanner/scan.js +44 -0
  157. package/dist/scanner/scan.js.map +1 -0
  158. package/dist/scanner/scanner.d.ts +29 -0
  159. package/dist/scanner/scanner.d.ts.map +1 -0
  160. package/dist/scanner/scanner.js +296 -0
  161. package/dist/scanner/scanner.js.map +1 -0
  162. package/dist/scanner/scanner.spec.d.ts +2 -0
  163. package/dist/scanner/scanner.spec.d.ts.map +1 -0
  164. package/dist/scanner/scanner.spec.js +262 -0
  165. package/dist/scanner/scanner.spec.js.map +1 -0
  166. package/dist/scanner/types.d.ts +43 -0
  167. package/dist/scanner/types.d.ts.map +1 -0
  168. package/dist/scanner/types.js +5 -0
  169. package/dist/scanner/types.js.map +1 -0
  170. package/dist/schema/index.d.ts +4 -0
  171. package/dist/schema/index.d.ts.map +1 -0
  172. package/dist/schema/index.js +4 -0
  173. package/dist/schema/index.js.map +1 -0
  174. package/dist/schema/merger.d.ts +35 -0
  175. package/dist/schema/merger.d.ts.map +1 -0
  176. package/dist/schema/merger.js +161 -0
  177. package/dist/schema/merger.js.map +1 -0
  178. package/dist/schema/typegen.d.ts +13 -0
  179. package/dist/schema/typegen.d.ts.map +1 -0
  180. package/dist/schema/typegen.js +125 -0
  181. package/dist/schema/typegen.js.map +1 -0
  182. package/dist/schema/validator.d.ts +7 -0
  183. package/dist/schema/validator.d.ts.map +1 -0
  184. package/dist/schema/validator.js +32 -0
  185. package/dist/schema/validator.js.map +1 -0
  186. package/dist/types/default-map.d.ts +21 -0
  187. package/dist/types/default-map.d.ts.map +1 -0
  188. package/dist/types/default-map.js +32 -0
  189. package/dist/types/default-map.js.map +1 -0
  190. package/dist/types/extended-iterable.d.ts +197 -0
  191. package/dist/types/extended-iterable.d.ts.map +1 -0
  192. package/dist/types/extended-iterable.js +769 -0
  193. package/dist/types/extended-iterable.js.map +1 -0
  194. package/dist/types/guards.d.ts +2 -0
  195. package/dist/types/guards.d.ts.map +1 -0
  196. package/dist/types/guards.js +2 -0
  197. package/dist/types/guards.js.map +1 -0
  198. package/dist/types/index.d.ts +11 -0
  199. package/dist/types/index.d.ts.map +1 -0
  200. package/dist/types/index.js +10 -0
  201. package/dist/types/index.js.map +1 -0
  202. package/package.json +61 -0
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Configuration resolver - converts config references to actual extractors
3
+ */
4
+ import { resolve } from 'node:path';
5
+ import { PluginRegistry } from '../plugins/registry.js';
6
+ import { validatePluginOptions } from '../plugins/validation.js';
7
+ import { getDefaultIncludePattern } from '../scanner/candidates.js';
8
+ /**
9
+ * Known extractor packages that can be auto-detected
10
+ */
11
+ const KNOWN_EXTRACTORS = [
12
+ '@functional-examples/extractor-frontmatter',
13
+ '@functional-examples/yaml-manifest',
14
+ ];
15
+ /**
16
+ * Default scan configuration
17
+ */
18
+ const DEFAULT_SCAN = {
19
+ exclude: ['**/node_modules/**', '**/dist/**', '**/.git/**'],
20
+ root: '.',
21
+ };
22
+ /**
23
+ * Resolve a configuration to actual extractor instances.
24
+ *
25
+ * If no extractors are specified, attempts to auto-detect installed extractors.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { resolveConfig } from 'functional-examples';
30
+ *
31
+ * // Auto-detect extractors
32
+ * const config = await resolveConfig({});
33
+ *
34
+ * // Use with scanExamples
35
+ * const result = await scanExamples({
36
+ * root: './examples',
37
+ * extractors: config.extractors,
38
+ * pathMappings: config.pathMappings,
39
+ * });
40
+ * ```
41
+ */
42
+ export async function resolveConfig(config) {
43
+ const validationErrors = [];
44
+ // Build plugin registry from config plugins
45
+ const registry = new PluginRegistry();
46
+ const plugins = (config.plugins ?? []);
47
+ for (const plugin of plugins) {
48
+ // Cast to base Plugin type for registry (generics are erased at runtime)
49
+ registry.register(plugin);
50
+ }
51
+ // Run options validation for plugins that have validators and _options
52
+ const optionsValidators = registry.getOptionsValidators();
53
+ if (optionsValidators.length > 0) {
54
+ // Build plugin options map from plugins that expose _options
55
+ const pluginOptions = new Map();
56
+ for (const plugin of plugins) {
57
+ if ('_options' in plugin && plugin._options !== undefined) {
58
+ pluginOptions.set(plugin.name, plugin._options);
59
+ }
60
+ }
61
+ const optionsResult = validatePluginOptions({
62
+ validators: optionsValidators,
63
+ pluginOptions,
64
+ });
65
+ if (!optionsResult.success) {
66
+ for (const error of optionsResult.errors) {
67
+ validationErrors.push({
68
+ path: `plugins.${error.pluginName}.${error.path}`,
69
+ message: error.message,
70
+ });
71
+ }
72
+ }
73
+ }
74
+ // Resolve extractors (legacy path)
75
+ let extractors;
76
+ // Get extractors from plugins
77
+ const pluginExtractors = registry.getExtractors();
78
+ if (pluginExtractors.length > 0) {
79
+ // Prefer plugin extractors
80
+ extractors = pluginExtractors;
81
+ }
82
+ else {
83
+ // Auto-detect installed extractors
84
+ extractors = await autoDetectExtractors();
85
+ }
86
+ if (config.scan?.root) {
87
+ config.scan.root = resolve(config.root, config.scan.root);
88
+ }
89
+ // Determine effective include pattern (smart default detection)
90
+ const effectiveInclude = config.scan?.include?.length
91
+ ? config.scan.include
92
+ : await getDefaultIncludePattern(config.scan?.root ?? config.root);
93
+ return {
94
+ ...config,
95
+ extractors,
96
+ plugins,
97
+ registry,
98
+ pathMappings: config.pathMappings ?? [],
99
+ scan: {
100
+ ...DEFAULT_SCAN,
101
+ ...config.scan,
102
+ include: effectiveInclude,
103
+ },
104
+ validationErrors,
105
+ };
106
+ }
107
+ /**
108
+ * Auto-detect installed extractor packages
109
+ */
110
+ async function autoDetectExtractors() {
111
+ const extractors = [];
112
+ for (const packageName of KNOWN_EXTRACTORS) {
113
+ try {
114
+ const extractor = await loadExtractorFromPackage(packageName);
115
+ if (extractor) {
116
+ extractors.push(extractor);
117
+ }
118
+ }
119
+ catch {
120
+ // Package not installed, skip silently
121
+ }
122
+ }
123
+ return extractors;
124
+ }
125
+ /**
126
+ * Load extractor from package name
127
+ */
128
+ async function loadExtractorFromPackage(packageName, options) {
129
+ try {
130
+ const module = await import(packageName);
131
+ // Try common export patterns
132
+ const factory = module.createFrontmatterExtractor ??
133
+ module.createYamlManifestExtractor ??
134
+ module.createMetaYmlExtractor ??
135
+ module.createExtractor ??
136
+ module.default?.createExtractor ??
137
+ module.default;
138
+ if (typeof factory === 'function') {
139
+ return factory(options);
140
+ }
141
+ // Module might export extractor directly
142
+ if (isExtractorInstance(module.default)) {
143
+ return module.default;
144
+ }
145
+ return null;
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ }
151
+ /**
152
+ * Load extractor from config object
153
+ */
154
+ /**
155
+ * Check if value is an extractor instance
156
+ */
157
+ function isExtractorInstance(value) {
158
+ return (typeof value === 'object' &&
159
+ value !== null &&
160
+ 'name' in value &&
161
+ 'extract' in value &&
162
+ typeof value.name === 'string' &&
163
+ typeof value.extract === 'function');
164
+ }
165
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/config/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Configuration types with Zod schemas for runtime validation
3
+ */
4
+ import { z } from 'zod';
5
+ import type { ExtractorReference } from './types.js';
6
+ export declare const ExtractorConfigSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ module: z.ZodString;
9
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
10
+ }, z.core.$strip>;
11
+ export declare const ExtractorInstanceSchema: z.ZodObject<{
12
+ name: z.ZodString;
13
+ extract: z.ZodFunction<z.core.$ZodFunctionArgs, z.core.$ZodFunctionOut>;
14
+ }, z.core.$strip>;
15
+ export declare const ExtractorReferenceSchema: z.ZodType<ExtractorReference>;
16
+ export declare const ExtractorOrReferenceSchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
17
+ name: z.ZodString;
18
+ module: z.ZodString;
19
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ name: z.ZodString;
22
+ extract: z.ZodFunction<z.core.$ZodFunctionArgs, z.core.$ZodFunctionOut>;
23
+ }, z.core.$strip>]>;
24
+ export declare const ScanConfigSchema: z.ZodObject<{
25
+ include: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ exclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ root: z.ZodOptional<z.ZodString>;
28
+ recursive: z.ZodOptional<z.ZodBoolean>;
29
+ fileExtensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
+ }, z.core.$strip>;
31
+ export declare const ConfigSchema: () => z.ZodObject<{
32
+ extractors: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
33
+ name: z.ZodString;
34
+ module: z.ZodString;
35
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
36
+ }, z.core.$strip>, z.ZodObject<{
37
+ name: z.ZodString;
38
+ extract: z.ZodFunction<z.core.$ZodFunctionArgs, z.core.$ZodFunctionOut>;
39
+ }, z.core.$strip>]>>>;
40
+ scan: z.ZodOptional<z.ZodObject<{
41
+ include: z.ZodOptional<z.ZodArray<z.ZodString>>;
42
+ exclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
+ root: z.ZodOptional<z.ZodString>;
44
+ recursive: z.ZodOptional<z.ZodBoolean>;
45
+ fileExtensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ }, z.core.$strip>>;
47
+ pathMappings: z.ZodOptional<z.ZodArray<z.ZodObject<{
48
+ pattern: z.ZodString;
49
+ extractor: z.ZodString;
50
+ }, z.core.$strip>>>;
51
+ }, z.core.$strip>;
52
+ export type ConfigSchemaType = z.infer<ReturnType<typeof ConfigSchema>>;
53
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;iBAGlC,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAGjE,CAAC;AAGH,eAAO,MAAM,0BAA0B;;;;;;;mBAIrC,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;iBAM3B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;iBAYrB,CAAC;AAEL,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Configuration types with Zod schemas for runtime validation
3
+ */
4
+ import { z } from 'zod';
5
+ export const ExtractorConfigSchema = z.object({
6
+ name: z.string().min(1),
7
+ module: z.string().min(1),
8
+ options: z.record(z.string(), z.unknown()).optional(),
9
+ });
10
+ // Schema for extractor instance (already created)
11
+ export const ExtractorInstanceSchema = z.object({
12
+ name: z.string().min(1),
13
+ extract: z.function(),
14
+ });
15
+ export const ExtractorReferenceSchema = z.union([
16
+ z.string().min(1),
17
+ ExtractorConfigSchema,
18
+ ]);
19
+ // Schema that accepts both references and instances
20
+ export const ExtractorOrReferenceSchema = z.union([
21
+ z.string().min(1),
22
+ ExtractorConfigSchema,
23
+ ExtractorInstanceSchema,
24
+ ]);
25
+ export const ScanConfigSchema = z.object({
26
+ include: z.array(z.string().min(1)).optional(),
27
+ exclude: z.array(z.string().min(1)).optional(),
28
+ root: z.string().optional(),
29
+ recursive: z.boolean().optional(),
30
+ fileExtensions: z.array(z.string().min(1)).optional(),
31
+ });
32
+ export const ConfigSchema = () => z.object({
33
+ extractors: z.array(ExtractorOrReferenceSchema).optional(),
34
+ scan: ScanConfigSchema.optional(),
35
+ pathMappings: z
36
+ .array(z.object({
37
+ pattern: z.string().min(1),
38
+ extractor: z.string().min(1),
39
+ }))
40
+ .optional(),
41
+ });
42
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAkC,CAAC,CAAC,KAAK,CAAC;IAC7E,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjB,qBAAqB;CACtB,CAAC,CAAC;AAEH,oDAAoD;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC;IAChD,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjB,qBAAqB;IACrB,uBAAuB;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAC/B,CAAC,CAAC,MAAM,CAAC;IACP,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE;IAC1D,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC7B,CAAC,CACH;SACA,QAAQ,EAAE;CACd,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration types - re-exported from devkit for backwards compatibility
3
+ */
4
+ import type { BaseMetadata } from '@functional-examples/devkit';
5
+ export type { BaseMetadata, Config, ConfigWithRoot, Extractor, ExtractorConfig, ExtractorConfigOrFunction, ExtractorReference, GenerateConfig, JSONSchemaObject, PathMapping, Plugin, ScanConfig, } from '@functional-examples/devkit';
6
+ /**
7
+ * @deprecated Use Extractor from @functional-examples/devkit
8
+ */
9
+ export interface MetadataExtractorFunction<TMetadata extends BaseMetadata = BaseMetadata> {
10
+ (context: unknown, options?: Record<string, unknown>): Promise<{
11
+ metadata: TMetadata;
12
+ files: unknown[];
13
+ }>;
14
+ name?: string;
15
+ canExtract?: (context: unknown) => boolean | Promise<boolean>;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,YAAY,EACV,YAAY,EACZ,MAAM,EACN,cAAc,EACd,SAAS,EACT,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,MAAM,EACN,UAAU,GACX,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,yBAAyB,CACxC,SAAS,SAAS,YAAY,GAAG,YAAY;IAE7C,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAC7D,QAAQ,EAAE,SAAS,CAAC;QACpB,KAAK,EAAE,OAAO,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Configuration types - re-exported from devkit for backwards compatibility
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Configuration validation using Zod
3
+ */
4
+ import type { ConfigValidationError } from '../types/index.js';
5
+ export declare function validateConfig(config: unknown): ConfigValidationError[];
6
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,qBAAqB,EAAE,CAevE"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration validation using Zod
3
+ */
4
+ import { ConfigSchema } from './schema.js';
5
+ export function validateConfig(config) {
6
+ const schema = ConfigSchema();
7
+ const result = schema.safeParse(config);
8
+ if (result.success) {
9
+ return [];
10
+ }
11
+ return result.error.issues.map((issue) => ({
12
+ path: issue.path.join('.'),
13
+ message: issue.message,
14
+ location: issue.code,
15
+ }));
16
+ }
17
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAC5B,CAAC,KAAK,EAAyB,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,IAAI;KACrB,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Extractor module - types for building extractors
3
+ *
4
+ * Note: Actual extractor implementations have moved to separate packages:
5
+ * - @functional-examples/extractor-frontmatter
6
+ * - @functional-examples/yaml-manifest
7
+ */
8
+ export type { ExtractionContext, ExtractedMetadata } from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Extractor module - types for building extractors
3
+ *
4
+ * Note: Actual extractor implementations have moved to separate packages:
5
+ * - @functional-examples/extractor-frontmatter
6
+ * - @functional-examples/yaml-manifest
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lazy extractor module loading with caching
3
+ */
4
+ import type { BaseMetadata } from '../types/index.js';
5
+ import type { MetadataExtractorFunction } from './types.js';
6
+ /**
7
+ * Resolve a module reference to a loaded extractor
8
+ * @param ref - Package name, local path, or ExtractorConfig
9
+ * @param basePath - Base directory for resolving local paths
10
+ * @returns Loaded extractor or throws if module cannot be loaded
11
+ */
12
+ export declare function loadExtractor(ref: string | {
13
+ module: string;
14
+ }, basePath?: string): Promise<MetadataExtractorFunction<BaseMetadata>>;
15
+ /**
16
+ * Clear the module cache (useful for testing or config reload)
17
+ */
18
+ export declare function clearCache(): void;
19
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,120 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extractors/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
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 type { MetadataExtractorFunction } from './types.js';
14
+ import type { BaseMetadata } from '../types/index.js';
15
+ /**
16
+ * Extractor for directory-based examples with meta.yml.
17
+ */
18
+ export declare function createMetaYmlExtractor<TMetadata extends BaseMetadata = BaseMetadata>(): MetadataExtractorFunction<TMetadata>;
19
+ //# sourceMappingURL=meta-yml-fn.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,66 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,24 @@
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 type { MetadataExtractor, ExtractionContext, ExtractedMetadata } from './types.js';
14
+ /**
15
+ * Extractor for directory-based examples with meta.yml.
16
+ * Used by isolated-workers pattern.
17
+ */
18
+ export declare class MetaYmlExtractor implements MetadataExtractor {
19
+ readonly name = "meta-yml";
20
+ canExtract(context: ExtractionContext): boolean;
21
+ extract(context: ExtractionContext): Promise<ExtractedMetadata>;
22
+ private collectFiles;
23
+ }
24
+ //# sourceMappingURL=meta-yml.d.ts.map
@@ -0,0 +1 @@
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"}