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.
- package/README.md +148 -0
- package/dist/cli/commands/generate.d.ts +10 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +64 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +95 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +20 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +182 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +10 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +65 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +88 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/plugin-commands.d.ts +17 -0
- package/dist/cli/plugin-commands.d.ts.map +1 -0
- package/dist/cli/plugin-commands.js +45 -0
- package/dist/cli/plugin-commands.js.map +1 -0
- package/dist/config/index.d.ts +11 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.spec.d.ts +5 -0
- package/dist/config/index.spec.d.ts.map +1 -0
- package/dist/config/index.spec.js +142 -0
- package/dist/config/index.spec.js.map +1 -0
- package/dist/config/loader.d.ts +7 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +85 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/merger.d.ts +27 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +41 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/resolver.d.ts +28 -0
- package/dist/config/resolver.d.ts.map +1 -0
- package/dist/config/resolver.js +165 -0
- package/dist/config/resolver.js.map +1 -0
- package/dist/config/schema.d.ts +53 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +17 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validator.d.ts +6 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +17 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/extractors/index.d.ts +9 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +9 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/extractors/loader.d.ts +19 -0
- package/dist/extractors/loader.d.ts.map +1 -0
- package/dist/extractors/loader.js +120 -0
- package/dist/extractors/loader.js.map +1 -0
- package/dist/extractors/meta-yml-fn.d.ts +19 -0
- package/dist/extractors/meta-yml-fn.d.ts.map +1 -0
- package/dist/extractors/meta-yml-fn.js +66 -0
- package/dist/extractors/meta-yml-fn.js.map +1 -0
- package/dist/extractors/meta-yml.d.ts +24 -0
- package/dist/extractors/meta-yml.d.ts.map +1 -0
- package/dist/extractors/meta-yml.js +65 -0
- package/dist/extractors/meta-yml.js.map +1 -0
- package/dist/extractors/registry.d.ts +58 -0
- package/dist/extractors/registry.d.ts.map +1 -0
- package/dist/extractors/registry.js +114 -0
- package/dist/extractors/registry.js.map +1 -0
- package/dist/extractors/registry.spec.d.ts +2 -0
- package/dist/extractors/registry.spec.d.ts.map +1 -0
- package/dist/extractors/registry.spec.js +102 -0
- package/dist/extractors/registry.spec.js.map +1 -0
- package/dist/extractors/types.d.ts +34 -0
- package/dist/extractors/types.d.ts.map +1 -0
- package/dist/extractors/types.js +8 -0
- package/dist/extractors/types.js.map +1 -0
- package/dist/extractors/yaml-frontmatter-fn.d.ts +18 -0
- package/dist/extractors/yaml-frontmatter-fn.d.ts.map +1 -0
- package/dist/extractors/yaml-frontmatter-fn.js +73 -0
- package/dist/extractors/yaml-frontmatter-fn.js.map +1 -0
- package/dist/extractors/yaml-frontmatter.d.ts +22 -0
- package/dist/extractors/yaml-frontmatter.d.ts.map +1 -0
- package/dist/extractors/yaml-frontmatter.js +83 -0
- package/dist/extractors/yaml-frontmatter.js.map +1 -0
- package/dist/extractors/yaml-frontmatter.spec.d.ts +2 -0
- package/dist/extractors/yaml-frontmatter.spec.d.ts.map +1 -0
- package/dist/extractors/yaml-frontmatter.spec.js +134 -0
- package/dist/extractors/yaml-frontmatter.spec.js.map +1 -0
- package/dist/files/index.d.ts +5 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +5 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/reader.d.ts +50 -0
- package/dist/files/reader.d.ts.map +1 -0
- package/dist/files/reader.js +62 -0
- package/dist/files/reader.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/pipeline.d.ts +11 -0
- package/dist/plugins/pipeline.d.ts.map +1 -0
- package/dist/plugins/pipeline.js +24 -0
- package/dist/plugins/pipeline.js.map +1 -0
- package/dist/plugins/registry.d.ts +57 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +93 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/validation.d.ts +64 -0
- package/dist/plugins/validation.d.ts.map +1 -0
- package/dist/plugins/validation.js +55 -0
- package/dist/plugins/validation.js.map +1 -0
- package/dist/regions/index.d.ts +7 -0
- package/dist/regions/index.d.ts.map +1 -0
- package/dist/regions/index.js +6 -0
- package/dist/regions/index.js.map +1 -0
- package/dist/regions/languages.d.ts +15 -0
- package/dist/regions/languages.d.ts.map +1 -0
- package/dist/regions/languages.js +182 -0
- package/dist/regions/languages.js.map +1 -0
- package/dist/regions/parser.d.ts +63 -0
- package/dist/regions/parser.d.ts.map +1 -0
- package/dist/regions/parser.js +175 -0
- package/dist/regions/parser.js.map +1 -0
- package/dist/regions/parser.spec.d.ts +2 -0
- package/dist/regions/parser.spec.d.ts.map +1 -0
- package/dist/regions/parser.spec.js +190 -0
- package/dist/regions/parser.spec.js.map +1 -0
- package/dist/regions/types.d.ts +37 -0
- package/dist/regions/types.d.ts.map +1 -0
- package/dist/regions/types.js +5 -0
- package/dist/regions/types.js.map +1 -0
- package/dist/scanner/candidates.d.ts +24 -0
- package/dist/scanner/candidates.d.ts.map +1 -0
- package/dist/scanner/candidates.js +83 -0
- package/dist/scanner/candidates.js.map +1 -0
- package/dist/scanner/index.d.ts +8 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +6 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/scan.d.ts +40 -0
- package/dist/scanner/scan.d.ts.map +1 -0
- package/dist/scanner/scan.js +44 -0
- package/dist/scanner/scan.js.map +1 -0
- package/dist/scanner/scanner.d.ts +29 -0
- package/dist/scanner/scanner.d.ts.map +1 -0
- package/dist/scanner/scanner.js +296 -0
- package/dist/scanner/scanner.js.map +1 -0
- package/dist/scanner/scanner.spec.d.ts +2 -0
- package/dist/scanner/scanner.spec.d.ts.map +1 -0
- package/dist/scanner/scanner.spec.js +262 -0
- package/dist/scanner/scanner.spec.js.map +1 -0
- package/dist/scanner/types.d.ts +43 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +5 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +4 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/merger.d.ts +35 -0
- package/dist/schema/merger.d.ts.map +1 -0
- package/dist/schema/merger.js +161 -0
- package/dist/schema/merger.js.map +1 -0
- package/dist/schema/typegen.d.ts +13 -0
- package/dist/schema/typegen.d.ts.map +1 -0
- package/dist/schema/typegen.js +125 -0
- package/dist/schema/typegen.js.map +1 -0
- package/dist/schema/validator.d.ts +7 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +32 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/types/default-map.d.ts +21 -0
- package/dist/types/default-map.d.ts.map +1 -0
- package/dist/types/default-map.js +32 -0
- package/dist/types/default-map.js.map +1 -0
- package/dist/types/extended-iterable.d.ts +197 -0
- package/dist/types/extended-iterable.d.ts.map +1 -0
- package/dist/types/extended-iterable.js +769 -0
- package/dist/types/extended-iterable.js.map +1 -0
- package/dist/types/guards.d.ts +2 -0
- package/dist/types/guards.d.ts.map +1 -0
- package/dist/types/guards.js +2 -0
- package/dist/types/guards.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { mergeConfigSchema, mergeMetadataSchemas, type JSONSchema, type MergeConfigSchemaOptions, type MergeMetadataSchemasOptions, } from './merger.js';
|
|
2
|
+
export { generateMetadataTypes, type GenerateMetadataTypesOptions, } from './typegen.js';
|
|
3
|
+
export { createSchemaValidator } from './validator.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,GACjC,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GAIrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,GAEtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PluginSchemaEntry } from '../plugins/registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* JSON Schema type (subset of JSON Schema spec).
|
|
4
|
+
*/
|
|
5
|
+
export interface JSONSchema {
|
|
6
|
+
$schema?: string;
|
|
7
|
+
$defs?: Record<string, JSONSchema>;
|
|
8
|
+
type?: string;
|
|
9
|
+
properties?: Record<string, JSONSchema>;
|
|
10
|
+
required?: string[];
|
|
11
|
+
items?: JSONSchema;
|
|
12
|
+
anyOf?: JSONSchema[];
|
|
13
|
+
$ref?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface MergeConfigSchemaOptions {
|
|
18
|
+
pluginSchemas: PluginSchemaEntry[];
|
|
19
|
+
}
|
|
20
|
+
export interface MergeMetadataSchemasOptions {
|
|
21
|
+
/** User-defined metadata schema from config (takes priority) */
|
|
22
|
+
configSchema?: JSONSchema;
|
|
23
|
+
/** Plugin metadata schemas */
|
|
24
|
+
pluginSchemas: PluginSchemaEntry[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Merge plugin schemas into a complete config schema.
|
|
28
|
+
*/
|
|
29
|
+
export declare function mergeConfigSchema(options: MergeConfigSchemaOptions): JSONSchema;
|
|
30
|
+
/**
|
|
31
|
+
* Merge metadata schemas from config and plugins.
|
|
32
|
+
* Config schema takes priority on conflicts.
|
|
33
|
+
*/
|
|
34
|
+
export declare function mergeMetadataSchemas(options: MergeMetadataSchemasOptions): JSONSchema;
|
|
35
|
+
//# sourceMappingURL=merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/schema/merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,gEAAgE;IAChE,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,8BAA8B;IAC9B,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACpC;AA6DD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,UAAU,CA4C/E;AAoCD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,UAAU,CA2BZ"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base config schema structure.
|
|
3
|
+
*/
|
|
4
|
+
function createBaseConfigSchema() {
|
|
5
|
+
return {
|
|
6
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
plugins: {
|
|
10
|
+
type: 'array',
|
|
11
|
+
description: 'Plugins to use for scanning and parsing',
|
|
12
|
+
items: { type: 'object' }, // Will be replaced with anyOf
|
|
13
|
+
},
|
|
14
|
+
metadata: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
description: 'JSON Schema defining the expected metadata structure for examples',
|
|
17
|
+
},
|
|
18
|
+
scan: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
include: {
|
|
22
|
+
type: 'array',
|
|
23
|
+
items: { type: 'string' },
|
|
24
|
+
description: 'Glob patterns to include',
|
|
25
|
+
},
|
|
26
|
+
exclude: {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: { type: 'string' },
|
|
29
|
+
description: 'Glob patterns to exclude',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
pathMappings: {
|
|
34
|
+
type: 'array',
|
|
35
|
+
description: 'Path mappings for conflict resolution',
|
|
36
|
+
items: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
pattern: { type: 'string' },
|
|
40
|
+
extractor: { type: 'string' },
|
|
41
|
+
},
|
|
42
|
+
required: ['pattern', 'extractor'],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
generate: {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
outputDir: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Output directory for generated files',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
$defs: {},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Merge plugin schemas into a complete config schema.
|
|
60
|
+
*/
|
|
61
|
+
export function mergeConfigSchema(options) {
|
|
62
|
+
const { pluginSchemas } = options;
|
|
63
|
+
const schema = createBaseConfigSchema();
|
|
64
|
+
const pluginRefs = [];
|
|
65
|
+
for (const { pluginName, options: optionsSchema } of pluginSchemas) {
|
|
66
|
+
if (!optionsSchema)
|
|
67
|
+
continue;
|
|
68
|
+
const defName = `${pluginName.replace(/[^a-zA-Z0-9]/g, '')}Options`;
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(optionsSchema);
|
|
71
|
+
const defs = schema.$defs ?? {};
|
|
72
|
+
defs[defName] = {
|
|
73
|
+
...parsed,
|
|
74
|
+
description: `Options for ${pluginName} plugin`,
|
|
75
|
+
};
|
|
76
|
+
schema.$defs = defs;
|
|
77
|
+
pluginRefs.push({
|
|
78
|
+
type: 'object',
|
|
79
|
+
properties: {
|
|
80
|
+
name: { const: pluginName },
|
|
81
|
+
options: { $ref: `#/$defs/${defName}` },
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Invalid JSON schema, skip
|
|
87
|
+
console.warn(`Invalid options schema for plugin ${pluginName}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
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
|
+
}
|
|
100
|
+
return schema;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Deep merge two JSON Schema objects.
|
|
104
|
+
* Second schema (b) takes priority on conflicts.
|
|
105
|
+
*/
|
|
106
|
+
function deepMergeSchemas(a, b) {
|
|
107
|
+
const result = { ...a };
|
|
108
|
+
for (const [key, value] of Object.entries(b)) {
|
|
109
|
+
if (key === 'properties' &&
|
|
110
|
+
result.properties &&
|
|
111
|
+
typeof value === 'object') {
|
|
112
|
+
// Merge properties, b takes priority
|
|
113
|
+
result.properties = {
|
|
114
|
+
...result.properties,
|
|
115
|
+
...value,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
else if (key === 'required' &&
|
|
119
|
+
Array.isArray(result.required) &&
|
|
120
|
+
Array.isArray(value)) {
|
|
121
|
+
// Union required arrays
|
|
122
|
+
result.required = [...new Set([...result.required, ...value])];
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// b takes priority for all other fields
|
|
126
|
+
result[key] = value;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Merge metadata schemas from config and plugins.
|
|
133
|
+
* Config schema takes priority on conflicts.
|
|
134
|
+
*/
|
|
135
|
+
export function mergeMetadataSchemas(options) {
|
|
136
|
+
const { configSchema, pluginSchemas } = options;
|
|
137
|
+
// Start with empty base or config schema
|
|
138
|
+
let merged = configSchema ?? {
|
|
139
|
+
type: 'object',
|
|
140
|
+
properties: {},
|
|
141
|
+
};
|
|
142
|
+
// Merge in plugin schemas (config already in merged, so it has priority)
|
|
143
|
+
for (const { pluginName, metadata } of pluginSchemas) {
|
|
144
|
+
if (!metadata)
|
|
145
|
+
continue;
|
|
146
|
+
try {
|
|
147
|
+
const pluginSchema = JSON.parse(metadata);
|
|
148
|
+
// Merge plugin into current, but then overlay config again for priority
|
|
149
|
+
const withPlugin = deepMergeSchemas(pluginSchema, merged);
|
|
150
|
+
// Re-apply config schema to ensure it wins on conflicts
|
|
151
|
+
merged = configSchema
|
|
152
|
+
? deepMergeSchemas(withPlugin, configSchema)
|
|
153
|
+
: withPlugin;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
console.warn(`Invalid metadata schema for plugin ${pluginName}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return merged;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/schema/merger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JSONSchema } from './merger.js';
|
|
2
|
+
export interface GenerateMetadataTypesOptions {
|
|
3
|
+
/** Pre-merged metadata schema (from mergeMetadataSchemas) */
|
|
4
|
+
mergedSchema?: JSONSchema;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generate TypeScript type declarations from merged metadata schema.
|
|
8
|
+
*
|
|
9
|
+
* Outputs a module augmentation that extends ExampleMetadataRegistry,
|
|
10
|
+
* which automatically provides types for all Example<> usages.
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateMetadataTypes(options: GenerateMetadataTypesOptions): string;
|
|
13
|
+
//# sourceMappingURL=typegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typegen.d.ts","sourceRoot":"","sources":["../../src/schema/typegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,4BAA4B;IAC3C,6DAA6D;IAC7D,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AA8HD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,MAAM,CAqBR"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert JSON Schema type to TypeScript type.
|
|
3
|
+
* @param schema - The JSON Schema to convert
|
|
4
|
+
* @param indent - Current indentation level (number of spaces)
|
|
5
|
+
*/
|
|
6
|
+
function schemaTypeToTS(schema, indent = 0) {
|
|
7
|
+
const type = schema.type;
|
|
8
|
+
const pad = ' '.repeat(indent);
|
|
9
|
+
const innerPad = ' '.repeat(indent + 2);
|
|
10
|
+
if (schema.const !== undefined) {
|
|
11
|
+
return JSON.stringify(schema.const);
|
|
12
|
+
}
|
|
13
|
+
if (schema.enum) {
|
|
14
|
+
return schema.enum.map((v) => JSON.stringify(v)).join(' | ');
|
|
15
|
+
}
|
|
16
|
+
if (schema.anyOf) {
|
|
17
|
+
const variants = schema.anyOf.map((s) => schemaTypeToTS(s, indent));
|
|
18
|
+
return variants.join(' | ');
|
|
19
|
+
}
|
|
20
|
+
if (schema.oneOf) {
|
|
21
|
+
const variants = schema.oneOf.map((s) => schemaTypeToTS(s, indent));
|
|
22
|
+
return variants.join(' | ');
|
|
23
|
+
}
|
|
24
|
+
if (schema.allOf) {
|
|
25
|
+
const variants = schema.allOf.map((s) => schemaTypeToTS(s, indent));
|
|
26
|
+
return variants.join(' & ');
|
|
27
|
+
}
|
|
28
|
+
switch (type) {
|
|
29
|
+
case 'string':
|
|
30
|
+
return 'string';
|
|
31
|
+
case 'number':
|
|
32
|
+
case 'integer':
|
|
33
|
+
return 'number';
|
|
34
|
+
case 'boolean':
|
|
35
|
+
return 'boolean';
|
|
36
|
+
case 'null':
|
|
37
|
+
return 'null';
|
|
38
|
+
case 'array': {
|
|
39
|
+
const items = schema.items;
|
|
40
|
+
return items ? `Array<${schemaTypeToTS(items, indent)}>` : 'unknown[]';
|
|
41
|
+
}
|
|
42
|
+
case 'object': {
|
|
43
|
+
const properties = schema.properties;
|
|
44
|
+
const additionalProps = schema.additionalProperties;
|
|
45
|
+
// Dictionary type: { additionalProperties: { type: "string" } }
|
|
46
|
+
if (!properties && additionalProps && typeof additionalProps === 'object') {
|
|
47
|
+
return `Record<string, ${schemaTypeToTS(additionalProps, indent)}>`;
|
|
48
|
+
}
|
|
49
|
+
if (!properties)
|
|
50
|
+
return 'Record<string, unknown>';
|
|
51
|
+
const required = new Set(schema.required ?? []);
|
|
52
|
+
const props = Object.entries(properties)
|
|
53
|
+
.map(([key, propSchema]) => {
|
|
54
|
+
const optional = required.has(key) ? '' : '?';
|
|
55
|
+
return `${innerPad}${key}${optional}: ${schemaTypeToTS(propSchema, indent + 2)};`;
|
|
56
|
+
})
|
|
57
|
+
.join('\n');
|
|
58
|
+
return `{\n${props}\n${pad}}`;
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
return 'unknown';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const HEADER = `/**
|
|
65
|
+
* Auto-generated metadata types from config and plugins.
|
|
66
|
+
* Do not edit manually - regenerate with: functional-examples generate
|
|
67
|
+
*
|
|
68
|
+
* This file augments the ExampleMetadataRegistry interface to provide
|
|
69
|
+
* type-safe metadata for all Example types in your project.
|
|
70
|
+
*
|
|
71
|
+
* Include this file in your tsconfig.json to enable type checking.
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
// Import required to make this an augmentation rather than a replacement
|
|
75
|
+
import '@functional-examples/devkit';
|
|
76
|
+
|
|
77
|
+
`;
|
|
78
|
+
/**
|
|
79
|
+
* Generate a metadata type object literal from JSON Schema.
|
|
80
|
+
* The output is indented to fit inside the ExampleMetadataRegistry interface.
|
|
81
|
+
*/
|
|
82
|
+
function generateMetadataType(schema) {
|
|
83
|
+
const properties = schema.properties;
|
|
84
|
+
if (!properties || Object.keys(properties).length === 0) {
|
|
85
|
+
return 'Record<string, unknown>';
|
|
86
|
+
}
|
|
87
|
+
const required = new Set(schema.required ?? []);
|
|
88
|
+
// Base indent is 6 spaces (inside `metadata: { ... }` which is inside the interface)
|
|
89
|
+
const baseIndent = 6;
|
|
90
|
+
const props = Object.entries(properties)
|
|
91
|
+
.map(([key, propSchema]) => {
|
|
92
|
+
const optional = required.has(key) ? '' : '?';
|
|
93
|
+
const tsType = schemaTypeToTS(propSchema, baseIndent);
|
|
94
|
+
return `${' '.repeat(baseIndent)}${key}${optional}: ${tsType};`;
|
|
95
|
+
})
|
|
96
|
+
.join('\n');
|
|
97
|
+
// Closing brace at 4 spaces (level of `metadata:`)
|
|
98
|
+
return `{\n${props}\n }`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generate TypeScript type declarations from merged metadata schema.
|
|
102
|
+
*
|
|
103
|
+
* Outputs a module augmentation that extends ExampleMetadataRegistry,
|
|
104
|
+
* which automatically provides types for all Example<> usages.
|
|
105
|
+
*/
|
|
106
|
+
export function generateMetadataTypes(options) {
|
|
107
|
+
const { mergedSchema } = options;
|
|
108
|
+
if (!mergedSchema || !mergedSchema.properties) {
|
|
109
|
+
// No schema properties - output empty augmentation
|
|
110
|
+
return `${HEADER}declare module '@functional-examples/devkit' {
|
|
111
|
+
interface ExampleMetadataRegistry {
|
|
112
|
+
metadata: Record<string, unknown>;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
`;
|
|
116
|
+
}
|
|
117
|
+
const metadataType = generateMetadataType(mergedSchema);
|
|
118
|
+
return `${HEADER}declare module '@functional-examples/devkit' {
|
|
119
|
+
interface ExampleMetadataRegistry {
|
|
120
|
+
metadata: ${metadataType};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=typegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typegen.js","sourceRoot":"","sources":["../../src/schema/typegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JSONSchema } from './merger.js';
|
|
2
|
+
import type { ValidationResult } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a validator function from a JSON Schema using AJV.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createSchemaValidator(schema: JSONSchema): (value: unknown) => ValidationResult;
|
|
7
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import AjvDefault from 'ajv';
|
|
2
|
+
// Handle both ESM and CJS default exports
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
const Ajv = AjvDefault.default ?? AjvDefault;
|
|
5
|
+
/**
|
|
6
|
+
* Create a validator function from a JSON Schema using AJV.
|
|
7
|
+
*/
|
|
8
|
+
export function createSchemaValidator(schema) {
|
|
9
|
+
const ajv = new Ajv({ allErrors: true });
|
|
10
|
+
const validate = ajv.compile(schema);
|
|
11
|
+
return (value) => {
|
|
12
|
+
const valid = validate(value);
|
|
13
|
+
if (valid) {
|
|
14
|
+
return { success: true, errors: [] };
|
|
15
|
+
}
|
|
16
|
+
const errors = (validate.errors ?? []).map((err) => {
|
|
17
|
+
// Build path from instancePath and params
|
|
18
|
+
const basePath = err.instancePath ? err.instancePath.slice(1) : '';
|
|
19
|
+
const missingProp = err.params?.missingProperty;
|
|
20
|
+
let path = basePath;
|
|
21
|
+
if (missingProp) {
|
|
22
|
+
path = basePath ? `${basePath}/${missingProp}` : missingProp;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
path,
|
|
26
|
+
message: err.message ?? 'Validation failed',
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
return { success: false, errors };
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Map that automatically creates default values when accessing missing keys.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* const countsByCategory = new DefaultMap<string, number[]>(() => []);
|
|
7
|
+
* countsByCategory.get('fruits').push(1); // No need to check if key exists
|
|
8
|
+
* countsByCategory.get('fruits').push(2);
|
|
9
|
+
* console.log(countsByCategory.get('fruits')); // [1, 2]
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare class DefaultMap<K, V> extends Map<K, V> {
|
|
13
|
+
private defaultValueBuilder;
|
|
14
|
+
constructor(defaultValueBuilder: () => V);
|
|
15
|
+
/**
|
|
16
|
+
* Gets the value for a key. If the key doesn't exist, creates a default value,
|
|
17
|
+
* stores it, and returns it.
|
|
18
|
+
*/
|
|
19
|
+
get(key: K): V;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=default-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-map.d.ts","sourceRoot":"","sources":["../../src/types/default-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,mBAAmB;gBAAnB,mBAAmB,EAAE,MAAM,CAAC;IAIhD;;;OAGG;IACM,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;CASxB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Map that automatically creates default values when accessing missing keys.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* const countsByCategory = new DefaultMap<string, number[]>(() => []);
|
|
7
|
+
* countsByCategory.get('fruits').push(1); // No need to check if key exists
|
|
8
|
+
* countsByCategory.get('fruits').push(2);
|
|
9
|
+
* console.log(countsByCategory.get('fruits')); // [1, 2]
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export class DefaultMap extends Map {
|
|
13
|
+
defaultValueBuilder;
|
|
14
|
+
constructor(defaultValueBuilder) {
|
|
15
|
+
super();
|
|
16
|
+
this.defaultValueBuilder = defaultValueBuilder;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Gets the value for a key. If the key doesn't exist, creates a default value,
|
|
20
|
+
* stores it, and returns it.
|
|
21
|
+
*/
|
|
22
|
+
get(key) {
|
|
23
|
+
const inMap = super.get(key);
|
|
24
|
+
if (inMap !== undefined) {
|
|
25
|
+
return inMap;
|
|
26
|
+
}
|
|
27
|
+
const defaultValue = this.defaultValueBuilder();
|
|
28
|
+
super.set(key, defaultValue);
|
|
29
|
+
return defaultValue;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=default-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-map.js","sourceRoot":"","sources":["../../src/types/default-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAiB,SAAQ,GAAS;IACzB;IAApB,YAAoB,mBAA4B;QAC9C,KAAK,EAAE,CAAC;QADU,wBAAmB,GAAnB,mBAAmB,CAAS;IAEhD,CAAC;IAED;;;OAGG;IACM,GAAG,CAAC,GAAM;QACjB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAChD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
|