functional-examples 0.0.0-alpha.1 → 0.0.0-alpha.3

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 (48) hide show
  1. package/README.md +168 -26
  2. package/README.md.template +106 -0
  3. package/dist/cli/commands/validate.d.ts +2 -2
  4. package/dist/cli/commands/validate.d.ts.map +1 -1
  5. package/dist/cli/commands/validate.js +92 -25
  6. package/dist/cli/commands/validate.js.map +1 -1
  7. package/dist/cli/index.d.ts +1 -1
  8. package/dist/config/resolver.d.ts +10 -10
  9. package/dist/config/resolver.d.ts.map +1 -1
  10. package/dist/config/resolver.js +156 -57
  11. package/dist/config/resolver.js.map +1 -1
  12. package/dist/config/types.d.ts +1 -1
  13. package/dist/config/types.d.ts.map +1 -1
  14. package/dist/plugins/pipeline.d.ts +4 -0
  15. package/dist/plugins/pipeline.d.ts.map +1 -1
  16. package/dist/plugins/pipeline.js +10 -1
  17. package/dist/plugins/pipeline.js.map +1 -1
  18. package/dist/plugins/registry.d.ts +1 -0
  19. package/dist/plugins/registry.d.ts.map +1 -1
  20. package/dist/plugins/registry.js +2 -3
  21. package/dist/plugins/registry.js.map +1 -1
  22. package/dist/scanner/scan.d.ts +3 -3
  23. package/dist/scanner/scan.d.ts.map +1 -1
  24. package/dist/scanner/scan.js.map +1 -1
  25. package/dist/scanner/scanner.d.ts.map +1 -1
  26. package/dist/scanner/scanner.js +5 -5
  27. package/dist/scanner/scanner.js.map +1 -1
  28. package/dist/schema/merger.d.ts.map +1 -1
  29. package/dist/schema/merger.js +75 -20
  30. package/dist/schema/merger.js.map +1 -1
  31. package/dist/schema/validator.d.ts.map +1 -1
  32. package/dist/schema/validator.js +7 -1
  33. package/dist/schema/validator.js.map +1 -1
  34. package/dist/types/index.d.ts +1 -1
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/index.js.map +1 -1
  37. package/package.json +4 -3
  38. package/dist/config/index.spec.d.ts +0 -5
  39. package/dist/extractors/loader.d.ts +0 -19
  40. package/dist/extractors/meta-yml-fn.d.ts +0 -19
  41. package/dist/extractors/meta-yml.d.ts +0 -24
  42. package/dist/extractors/registry.d.ts +0 -58
  43. package/dist/extractors/registry.spec.d.ts +0 -2
  44. package/dist/extractors/yaml-frontmatter-fn.d.ts +0 -18
  45. package/dist/extractors/yaml-frontmatter.d.ts +0 -22
  46. package/dist/extractors/yaml-frontmatter.spec.d.ts +0 -2
  47. package/dist/regions/parser.spec.d.ts +0 -2
  48. package/dist/scanner/scanner.spec.d.ts +0 -2
@@ -63,6 +63,11 @@ export function mergeConfigSchema(options) {
63
63
  const schema = createBaseConfigSchema();
64
64
  const pluginRefs = [];
65
65
  for (const { pluginName, options: optionsSchema } of pluginSchemas) {
66
+ // Always add string format for every known plugin
67
+ pluginRefs.push({
68
+ const: pluginName,
69
+ description: `Use the default options for ${pluginName}`,
70
+ });
66
71
  if (!optionsSchema)
67
72
  continue;
68
73
  const defName = `${pluginName.replace(/[^a-zA-Z0-9]/g, '')}Options`;
@@ -74,12 +79,15 @@ export function mergeConfigSchema(options) {
74
79
  description: `Options for ${pluginName} plugin`,
75
80
  };
76
81
  schema.$defs = defs;
82
+ // Tuple format for plugins with options
77
83
  pluginRefs.push({
78
- type: 'object',
79
- properties: {
80
- name: { const: pluginName },
81
- options: { $ref: `#/$defs/${defName}` },
82
- },
84
+ type: 'array',
85
+ prefixItems: [
86
+ { const: pluginName },
87
+ { $ref: `#/$defs/${defName}` },
88
+ ],
89
+ minItems: 2,
90
+ maxItems: 2,
83
91
  });
84
92
  }
85
93
  catch {
@@ -87,18 +95,55 @@ export function mergeConfigSchema(options) {
87
95
  console.warn(`Invalid options schema for plugin ${pluginName}`);
88
96
  }
89
97
  }
90
- // Update plugins array to use anyOf if we have plugin schemas
91
- if (pluginRefs.length > 0) {
92
- const properties = schema.properties ?? {};
93
- properties.plugins = {
94
- type: 'array',
95
- description: 'Plugins to use for scanning and parsing',
96
- items: { anyOf: pluginRefs },
97
- };
98
- schema.properties = properties;
99
- }
98
+ // Add generic fallbacks for unknown plugins
99
+ pluginRefs.push({ type: 'string', description: 'Unknown plugin package name' }, {
100
+ type: 'array',
101
+ description: 'Unknown plugin with options',
102
+ prefixItems: [
103
+ { type: 'string' },
104
+ { type: 'object' },
105
+ ],
106
+ minItems: 1,
107
+ maxItems: 2,
108
+ });
109
+ // Update plugins array to use anyOf
110
+ const properties = schema.properties ?? {};
111
+ properties.plugins = {
112
+ type: 'array',
113
+ description: 'Plugins to use for scanning and parsing',
114
+ items: { anyOf: pluginRefs },
115
+ };
116
+ schema.properties = properties;
100
117
  return schema;
101
118
  }
119
+ /**
120
+ * Base metadata schema with universal fields shared across all plugins.
121
+ */
122
+ function createBaseMetadataSchema() {
123
+ return {
124
+ type: 'object',
125
+ properties: {
126
+ id: {
127
+ type: 'string',
128
+ description: 'Unique example identifier',
129
+ },
130
+ title: {
131
+ type: 'string',
132
+ description: 'Example title',
133
+ },
134
+ description: {
135
+ type: 'string',
136
+ description: 'Example description',
137
+ },
138
+ tags: {
139
+ type: 'array',
140
+ items: { type: 'string' },
141
+ description: 'Tags for categorizing the example',
142
+ },
143
+ },
144
+ required: ['id', 'title'],
145
+ };
146
+ }
102
147
  /**
103
148
  * Deep merge two JSON Schema objects.
104
149
  * Second schema (b) takes priority on conflicts.
@@ -115,6 +160,15 @@ function deepMergeSchemas(a, b) {
115
160
  ...value,
116
161
  };
117
162
  }
163
+ else if (key === '$defs' &&
164
+ result.$defs &&
165
+ typeof value === 'object') {
166
+ // Merge $defs, b takes priority on conflicts
167
+ result.$defs = {
168
+ ...result.$defs,
169
+ ...value,
170
+ };
171
+ }
118
172
  else if (key === 'required' &&
119
173
  Array.isArray(result.required) &&
120
174
  Array.isArray(value)) {
@@ -134,11 +188,12 @@ function deepMergeSchemas(a, b) {
134
188
  */
135
189
  export function mergeMetadataSchemas(options) {
136
190
  const { configSchema, pluginSchemas } = options;
137
- // Start with empty base or config schema
138
- let merged = configSchema ?? {
139
- type: 'object',
140
- properties: {},
141
- };
191
+ // Start with base metadata schema containing universal fields
192
+ const base = createBaseMetadataSchema();
193
+ // Overlay config schema on top of base (config takes priority)
194
+ let merged = configSchema
195
+ ? deepMergeSchemas(base, configSchema)
196
+ : base;
142
197
  // Merge in plugin schemas (config already in merged, so it has priority)
143
198
  for (const { pluginName, metadata } of pluginSchemas) {
144
199
  if (!metadata)
@@ -1 +1 @@
1
- {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/schema/merger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/schema/merger.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/schema/validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAM3E;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,GACjB,CAAC,KAAK,EAAE,OAAO,KAAK,gBAAgB,CA6BtC"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/schema/validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAM3E;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,GACjB,CAAC,KAAK,EAAE,OAAO,KAAK,gBAAgB,CAuCtC"}
@@ -21,9 +21,15 @@ export function createSchemaValidator(schema) {
21
21
  if (missingProp) {
22
22
  path = basePath ? `${basePath}/${missingProp}` : missingProp;
23
23
  }
24
+ let message = err.message ?? 'Validation failed';
25
+ // Include the offending property name for additionalProperties errors
26
+ const additionalProp = err.params?.additionalProperty;
27
+ if (additionalProp) {
28
+ message += `: '${additionalProp}'`;
29
+ }
24
30
  return {
25
31
  path,
26
- message: err.message ?? 'Validation failed',
32
+ message,
27
33
  };
28
34
  });
29
35
  return { success: false, errors };
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/schema/validator.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,KAAK,CAAC;AAI7B,0CAA0C;AAC1C,8DAA8D;AAC9D,MAAM,GAAG,GAAI,UAAkB,CAAC,OAAO,IAAI,UAAU,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,CAAC,KAAc,EAAoB,EAAE;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAsB,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACpE,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,eAAqC,CAAC;YAEtE,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAC/D,CAAC;YAED,OAAO;gBACL,IAAI;gBACJ,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,mBAAmB;aAC5C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/schema/validator.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,KAAK,CAAC;AAI7B,0CAA0C;AAC1C,8DAA8D;AAC9D,MAAM,GAAG,GAAI,UAAkB,CAAC,OAAO,IAAI,UAAU,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,CAAC,KAAc,EAAoB,EAAE;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAsB,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACpE,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,eAAqC,CAAC;YAEtE,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAC/D,CAAC;YAED,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,mBAAmB,CAAC;YAEjD,sEAAsE;YACtE,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,kBAEtB,CAAC;YACd,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,IAAI,MAAM,cAAc,GAAG,CAAC;YACrC,CAAC;YAED,OAAO;gBACL,IAAI;gBACJ,OAAO;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Types are defined in @functional-examples/devkit and re-exported here
5
5
  * for backwards compatibility.
6
6
  */
7
- export type { ValidationError, ValidationResult, BaseMetadata, ExampleMetadata, ExampleMetadataRegistry, ParsedRegion, ExampleFile, Example, ScannedExample, ExtractorError, ExtractorOptions, ExtractorResult, Extractor, ExtractorFactory, FileParseContext, FileContentsParser, Plugin, PluginCommands, PluginSchemas, PluginValidators, PluginRegistryInterface, PluginValidatorEntry, PluginSchemaEntry, Config, ConfigWithRoot, ScanConfig, PathMapping, ConfigValidationError, ResolvedConfig, JSONSchemaObject, GenerateConfig, ExtractorConfig, ExtractorReference, ExtractorConfigOrFunction, } from '@functional-examples/devkit';
7
+ export type { ValidationError, ValidationResult, BaseMetadata, ExampleMetadata, ExampleMetadataRegistry, ParsedRegion, ExampleFile, Example, ScannedExample, ExtractorError, ExtractorOptions, ExtractorResult, Extractor, ExtractorFactory, FileParseContext, FileContentsParser, Plugin, PluginReference, PluginCommands, PluginSchemas, PluginValidators, PluginRegistryInterface, PluginValidatorEntry, PluginSchemaEntry, Config, ConfigWithRoot, ScanConfig, PathMapping, ConfigValidationError, ResolvedConfig, JSONSchemaObject, GenerateConfig, ExtractorConfig, ExtractorReference, ExtractorConfigOrFunction, } from '@functional-examples/devkit';
8
8
  export type { TypeGuard } from './guards.js';
9
9
  export { DefaultMap } from './default-map.js';
10
10
  export { asSettled, AsyncExtendedIterable, asyncIter, ExtendedIterable, iter, } from './extended-iterable.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAEV,eAAe,EACf,gBAAgB,EAGhB,YAAY,EACZ,eAAe,EACf,uBAAuB,EAGvB,YAAY,EACZ,WAAW,EACX,OAAO,EACP,cAAc,EAGd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,gBAAgB,EAGhB,gBAAgB,EAChB,kBAAkB,EAGlB,MAAM,EACN,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EAGjB,MAAM,EACN,cAAc,EACd,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,IAAI,GACL,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAEV,eAAe,EACf,gBAAgB,EAGhB,YAAY,EACZ,eAAe,EACf,uBAAuB,EAGvB,YAAY,EACZ,WAAW,EACX,OAAO,EACP,cAAc,EAGd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,gBAAgB,EAGhB,gBAAgB,EAChB,kBAAkB,EAGlB,MAAM,EACN,eAAe,EACf,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EAGjB,MAAM,EACN,cAAc,EACd,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,IAAI,GACL,MAAM,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwDH,8DAA8D;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,IAAI,GACL,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyDH,8DAA8D;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,IAAI,GACL,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functional-examples",
3
- "version": "0.0.0-alpha.1",
3
+ "version": "0.0.0-alpha.3",
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.0-alpha.1"
39
+ "@functional-examples/devkit": "0.0.0-alpha.3"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "22.19.8",
@@ -56,6 +56,7 @@
56
56
  "build": "tsc -p tsconfig.lib.json",
57
57
  "test": "vitest run",
58
58
  "test:watch": "vitest",
59
- "lint": "eslint ."
59
+ "lint": "eslint .",
60
+ "extract-docs": "typedoc --options typedoc.json"
60
61
  }
61
62
  }
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for configuration system
3
- */
4
- export {};
5
- //# sourceMappingURL=index.spec.d.ts.map
@@ -1,19 +0,0 @@
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
@@ -1,19 +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 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
@@ -1,24 +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 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
@@ -1,58 +0,0 @@
1
- /**
2
- * Registry for metadata extractors (function-based with lazy loading)
3
- */
4
- import type { BaseMetadata } from '../types/index.js';
5
- import type { ExtractionContext, ExtractedMetadata, MetadataExtractorFunction } from './types.js';
6
- /**
7
- * Registry that holds metadata extractors and dispatches extraction requests.
8
- * Extractors are tried in registration order; first match wins.
9
- */
10
- export declare class ExtractorRegistry<TMetadata extends BaseMetadata = BaseMetadata> {
11
- private entries;
12
- private loadedExtractors;
13
- /**
14
- * Register a new extractor (immediate loading)
15
- */
16
- register(extractor: MetadataExtractorFunction<TMetadata>): this;
17
- /**
18
- * Register a lazy extractor reference (loaded on first use)
19
- */
20
- registerLazy(ref: string | {
21
- module: string;
22
- }, basePath?: string): this;
23
- /**
24
- * Get all registered extractors (immediate only)
25
- */
26
- getExtractors(): readonly MetadataExtractorFunction<TMetadata>[];
27
- /**
28
- * Find first extractor that can handle given context
29
- */
30
- findExtractor(context: ExtractionContext): Promise<MetadataExtractorFunction<TMetadata> | undefined>;
31
- /**
32
- * Extract metadata using first matching extractor
33
- */
34
- extract(context: ExtractionContext): Promise<ExtractedMetadata<TMetadata>>;
35
- /**
36
- * Clear module cache (for testing or config reload)
37
- */
38
- clearCache(): void;
39
- /**
40
- * Get extractor from entry, loading lazily if needed
41
- */
42
- private getExtractorForEntry;
43
- /**
44
- * Check if extractor can handle context
45
- */
46
- private checkCanExtract;
47
- /**
48
- * Perform extraction using extractor
49
- */
50
- private performExtract;
51
- }
52
- /**
53
- * Create a registry with default extractors:
54
- * - MetaYmlExtractor (for directory-based examples with meta.yml)
55
- * - YamlFrontmatterExtractor (for single-file examples with YAML frontmatter)
56
- */
57
- export declare function createDefaultRegistry(): ExtractorRegistry;
58
- //# sourceMappingURL=registry.d.ts.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=registry.spec.d.ts.map
@@ -1,18 +0,0 @@
1
- /**
2
- * YAML frontmatter extractor for single-file examples (function-based).
3
- *
4
- * Supports frontmatter in comment blocks:
5
- * ```typescript
6
- * // ---
7
- * // title: Example Title
8
- * // description: What this demonstrates
9
- * // ---
10
- * ```
11
- */
12
- import type { MetadataExtractorFunction } from './types.js';
13
- import type { BaseMetadata } from '../types/index.js';
14
- /**
15
- * Extractor for YAML frontmatter in single-file examples.
16
- */
17
- export declare function createYamlFrontmatterExtractor<TMetadata extends BaseMetadata = BaseMetadata>(): MetadataExtractorFunction<TMetadata>;
18
- //# sourceMappingURL=yaml-frontmatter-fn.d.ts.map
@@ -1,22 +0,0 @@
1
- /**
2
- * YAML frontmatter extractor for single-file examples.
3
- *
4
- * Supports frontmatter in comment blocks:
5
- * ```typescript
6
- * // ---
7
- * // title: Example Title
8
- * // description: What this demonstrates
9
- * // ---
10
- * ```
11
- */
12
- import type { MetadataExtractor, ExtractionContext, ExtractedMetadata } from './types.js';
13
- /**
14
- * Extractor for YAML frontmatter in single-file examples.
15
- * Used by cli-forge and flexibench patterns.
16
- */
17
- export declare class YamlFrontmatterExtractor implements MetadataExtractor {
18
- readonly name = "yaml-frontmatter";
19
- canExtract(context: ExtractionContext): boolean;
20
- extract(context: ExtractionContext): Promise<ExtractedMetadata>;
21
- }
22
- //# sourceMappingURL=yaml-frontmatter.d.ts.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=yaml-frontmatter.spec.d.ts.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parser.spec.d.ts.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=scanner.spec.d.ts.map