nestjs-apcore 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.
- package/README.md +304 -0
- package/dist/bridge/binding-loader.d.ts +33 -0
- package/dist/bridge/binding-loader.d.ts.map +1 -0
- package/dist/bridge/binding-loader.js +118 -0
- package/dist/bridge/binding-loader.js.map +1 -0
- package/dist/bridge/index.d.ts +3 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +2 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/apcore-executor.service.d.ts +42 -0
- package/dist/core/apcore-executor.service.d.ts.map +1 -0
- package/dist/core/apcore-executor.service.js +68 -0
- package/dist/core/apcore-executor.service.js.map +1 -0
- package/dist/core/apcore-registry.service.d.ts +52 -0
- package/dist/core/apcore-registry.service.d.ts.map +1 -0
- package/dist/core/apcore-registry.service.js +181 -0
- package/dist/core/apcore-registry.service.js.map +1 -0
- package/dist/core/apcore.module.d.ts +27 -0
- package/dist/core/apcore.module.d.ts.map +1 -0
- package/dist/core/apcore.module.js +105 -0
- package/dist/core/apcore.module.js.map +1 -0
- package/dist/decorators/ap-context.decorator.d.ts +2 -0
- package/dist/decorators/ap-context.decorator.d.ts.map +1 -0
- package/dist/decorators/ap-context.decorator.js +9 -0
- package/dist/decorators/ap-context.decorator.js.map +1 -0
- package/dist/decorators/ap-module.decorator.d.ts +3 -0
- package/dist/decorators/ap-module.decorator.d.ts.map +1 -0
- package/dist/decorators/ap-module.decorator.js +7 -0
- package/dist/decorators/ap-module.decorator.js.map +1 -0
- package/dist/decorators/ap-tool-scanner.service.d.ts +28 -0
- package/dist/decorators/ap-tool-scanner.service.d.ts.map +1 -0
- package/dist/decorators/ap-tool-scanner.service.js +166 -0
- package/dist/decorators/ap-tool-scanner.service.js.map +1 -0
- package/dist/decorators/ap-tool.decorator.d.ts +3 -0
- package/dist/decorators/ap-tool.decorator.d.ts.map +1 -0
- package/dist/decorators/ap-tool.decorator.js +7 -0
- package/dist/decorators/ap-tool.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +4 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/apcore-mcp.module.d.ts +28 -0
- package/dist/mcp/apcore-mcp.module.d.ts.map +1 -0
- package/dist/mcp/apcore-mcp.module.js +77 -0
- package/dist/mcp/apcore-mcp.module.js.map +1 -0
- package/dist/mcp/apcore-mcp.service.d.ts +53 -0
- package/dist/mcp/apcore-mcp.service.d.ts.map +1 -0
- package/dist/mcp/apcore-mcp.service.js +148 -0
- package/dist/mcp/apcore-mcp.service.js.map +1 -0
- package/dist/schema/adapters/dto.adapter.d.ts +44 -0
- package/dist/schema/adapters/dto.adapter.d.ts.map +1 -0
- package/dist/schema/adapters/dto.adapter.js +191 -0
- package/dist/schema/adapters/dto.adapter.js.map +1 -0
- package/dist/schema/adapters/json-schema.adapter.d.ts +30 -0
- package/dist/schema/adapters/json-schema.adapter.d.ts.map +1 -0
- package/dist/schema/adapters/json-schema.adapter.js +48 -0
- package/dist/schema/adapters/json-schema.adapter.js.map +1 -0
- package/dist/schema/adapters/schema-adapter.interface.d.ts +21 -0
- package/dist/schema/adapters/schema-adapter.interface.d.ts.map +1 -0
- package/dist/schema/adapters/schema-adapter.interface.js +2 -0
- package/dist/schema/adapters/schema-adapter.interface.js.map +1 -0
- package/dist/schema/adapters/typebox.adapter.d.ts +32 -0
- package/dist/schema/adapters/typebox.adapter.d.ts.map +1 -0
- package/dist/schema/adapters/typebox.adapter.js +46 -0
- package/dist/schema/adapters/typebox.adapter.js.map +1 -0
- package/dist/schema/adapters/zod.adapter.d.ts +16 -0
- package/dist/schema/adapters/zod.adapter.d.ts.map +1 -0
- package/dist/schema/adapters/zod.adapter.js +184 -0
- package/dist/schema/adapters/zod.adapter.js.map +1 -0
- package/dist/schema/schema-extractor.service.d.ts +58 -0
- package/dist/schema/schema-extractor.service.d.ts.map +1 -0
- package/dist/schema/schema-extractor.service.js +100 -0
- package/dist/schema/schema-extractor.service.js.map +1 -0
- package/dist/types.d.ts +106 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/id-generator.d.ts +41 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +87 -0
- package/dist/utils/id-generator.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamically imports class-validator's `getMetadataStorage`.
|
|
3
|
+
* Returns null if class-validator is not installed.
|
|
4
|
+
*/
|
|
5
|
+
function getStorage() {
|
|
6
|
+
try {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
8
|
+
const cv = require('class-validator');
|
|
9
|
+
return cv.getMetadataStorage();
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Adapter implementation
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* SchemaAdapter that converts class-validator decorated DTO classes into
|
|
20
|
+
* JSON Schema / TSchema objects.
|
|
21
|
+
*
|
|
22
|
+
* Detection relies on querying class-validator's global MetadataStorage for
|
|
23
|
+
* validation metadata associated with the target constructor.
|
|
24
|
+
*/
|
|
25
|
+
export class DtoAdapter {
|
|
26
|
+
name = 'dto';
|
|
27
|
+
priority = 20;
|
|
28
|
+
/**
|
|
29
|
+
* Returns `true` when `input` is a class constructor that has at least one
|
|
30
|
+
* class-validator decorator registered in the global MetadataStorage.
|
|
31
|
+
*/
|
|
32
|
+
detect(input) {
|
|
33
|
+
if (typeof input !== 'function')
|
|
34
|
+
return false;
|
|
35
|
+
const storage = getStorage();
|
|
36
|
+
if (!storage)
|
|
37
|
+
return false;
|
|
38
|
+
try {
|
|
39
|
+
const metadatas = storage.getTargetValidationMetadatas(input, '', false, false);
|
|
40
|
+
return Array.isArray(metadatas) && metadatas.length > 0;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Converts a class-validator DTO into a TSchema-compatible JSON Schema
|
|
48
|
+
* object (type: 'object' with properties and required).
|
|
49
|
+
*/
|
|
50
|
+
extract(input) {
|
|
51
|
+
return this.extractJsonSchema(input);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reads class-validator metadata from the global MetadataStorage and builds
|
|
55
|
+
* a JSON Schema object.
|
|
56
|
+
*
|
|
57
|
+
* Mapping rules:
|
|
58
|
+
* - isString -> type: 'string'
|
|
59
|
+
* - isNumber -> type: 'number'
|
|
60
|
+
* - isInt -> type: 'integer'
|
|
61
|
+
* - isBoolean -> type: 'boolean'
|
|
62
|
+
* - isEmail -> type: 'string', format: 'email'
|
|
63
|
+
* - isUrl / isURL -> type: 'string', format: 'uri'
|
|
64
|
+
* - isEnum -> type: 'string', enum: Object.values(constraints[0])
|
|
65
|
+
* - isOptional -> not included in required[]
|
|
66
|
+
* - minLength -> minLength constraint
|
|
67
|
+
* - maxLength -> maxLength constraint
|
|
68
|
+
* - min -> minimum
|
|
69
|
+
* - max -> maximum
|
|
70
|
+
* - isArray -> type: 'array'
|
|
71
|
+
*/
|
|
72
|
+
extractJsonSchema(input) {
|
|
73
|
+
const ctor = input;
|
|
74
|
+
const storage = getStorage();
|
|
75
|
+
if (!storage) {
|
|
76
|
+
throw new Error('class-validator is required to extract schemas from DTO classes. ' +
|
|
77
|
+
'Install it: npm install class-validator');
|
|
78
|
+
}
|
|
79
|
+
const metadatas = storage.getTargetValidationMetadatas(ctor, '', false, false);
|
|
80
|
+
const grouped = storage.groupByPropertyName(metadatas);
|
|
81
|
+
const properties = {};
|
|
82
|
+
const required = [];
|
|
83
|
+
for (const [propertyName, validators] of Object.entries(grouped)) {
|
|
84
|
+
const propSchema = {};
|
|
85
|
+
let isOptional = false;
|
|
86
|
+
for (const meta of validators) {
|
|
87
|
+
const name = meta.name ?? '';
|
|
88
|
+
const constraints = meta.constraints ?? [];
|
|
89
|
+
switch (name) {
|
|
90
|
+
// Type validators
|
|
91
|
+
case 'isString':
|
|
92
|
+
propSchema.type = 'string';
|
|
93
|
+
break;
|
|
94
|
+
case 'isNumber':
|
|
95
|
+
propSchema.type = 'number';
|
|
96
|
+
break;
|
|
97
|
+
case 'isInt':
|
|
98
|
+
propSchema.type = 'integer';
|
|
99
|
+
break;
|
|
100
|
+
case 'isBoolean':
|
|
101
|
+
propSchema.type = 'boolean';
|
|
102
|
+
break;
|
|
103
|
+
// Format validators
|
|
104
|
+
case 'isEmail':
|
|
105
|
+
propSchema.type = 'string';
|
|
106
|
+
propSchema.format = 'email';
|
|
107
|
+
break;
|
|
108
|
+
case 'isUrl':
|
|
109
|
+
case 'isURL':
|
|
110
|
+
propSchema.type = 'string';
|
|
111
|
+
propSchema.format = 'uri';
|
|
112
|
+
break;
|
|
113
|
+
// Enum
|
|
114
|
+
case 'isEnum':
|
|
115
|
+
propSchema.type = 'string';
|
|
116
|
+
if (constraints[0] != null) {
|
|
117
|
+
propSchema.enum = Object.values(constraints[0]);
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
// Optional
|
|
121
|
+
case 'isOptional':
|
|
122
|
+
case 'conditionalValidation':
|
|
123
|
+
isOptional = true;
|
|
124
|
+
break;
|
|
125
|
+
// String constraints
|
|
126
|
+
case 'minLength':
|
|
127
|
+
propSchema.minLength =
|
|
128
|
+
typeof constraints[0] === 'number' ? constraints[0] : undefined;
|
|
129
|
+
break;
|
|
130
|
+
case 'maxLength':
|
|
131
|
+
propSchema.maxLength =
|
|
132
|
+
typeof constraints[0] === 'number' ? constraints[0] : undefined;
|
|
133
|
+
break;
|
|
134
|
+
// Number constraints
|
|
135
|
+
case 'min':
|
|
136
|
+
propSchema.minimum =
|
|
137
|
+
typeof constraints[0] === 'number' ? constraints[0] : undefined;
|
|
138
|
+
break;
|
|
139
|
+
case 'max':
|
|
140
|
+
propSchema.maximum =
|
|
141
|
+
typeof constraints[0] === 'number' ? constraints[0] : undefined;
|
|
142
|
+
break;
|
|
143
|
+
// Array
|
|
144
|
+
case 'isArray':
|
|
145
|
+
propSchema.type = 'array';
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Fall back to design:type if no type validator was found
|
|
150
|
+
if (!propSchema.type) {
|
|
151
|
+
const designType = Reflect.getMetadata('design:type', ctor.prototype, propertyName);
|
|
152
|
+
if (designType) {
|
|
153
|
+
propSchema.type = designTypeToJsonType(designType);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Clean up undefined values from constraints that had no value
|
|
157
|
+
for (const key of Object.keys(propSchema)) {
|
|
158
|
+
if (propSchema[key] === undefined) {
|
|
159
|
+
delete propSchema[key];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
properties[propertyName] = propSchema;
|
|
163
|
+
if (!isOptional) {
|
|
164
|
+
required.push(propertyName);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
type: 'object',
|
|
169
|
+
properties,
|
|
170
|
+
required,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Maps a design:type constructor to a JSON Schema type string.
|
|
176
|
+
*/
|
|
177
|
+
function designTypeToJsonType(designType) {
|
|
178
|
+
switch (designType) {
|
|
179
|
+
case String:
|
|
180
|
+
return 'string';
|
|
181
|
+
case Number:
|
|
182
|
+
return 'number';
|
|
183
|
+
case Boolean:
|
|
184
|
+
return 'boolean';
|
|
185
|
+
case Array:
|
|
186
|
+
return 'array';
|
|
187
|
+
default:
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=dto.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dto.adapter.js","sourceRoot":"","sources":["../../../src/schema/adapters/dto.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TSchema } from '@sinclair/typebox';
|
|
2
|
+
import type { SchemaAdapter } from './schema-adapter.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* Schema adapter for plain JSON Schema objects.
|
|
5
|
+
*
|
|
6
|
+
* JSON Schema is structurally compatible with TypeBox's `TSchema`, so
|
|
7
|
+
* conversion is a straightforward deep clone via JSON round-trip.
|
|
8
|
+
*/
|
|
9
|
+
export declare class JsonSchemaAdapter implements SchemaAdapter {
|
|
10
|
+
readonly name: "json-schema";
|
|
11
|
+
readonly priority = 30;
|
|
12
|
+
/**
|
|
13
|
+
* Returns `true` when `input` is a non-null object that carries a `"type"`
|
|
14
|
+
* property **and** is not already a TypeBox schema (identified by the
|
|
15
|
+
* `Symbol.for('TypeBox.Kind')` symbol key).
|
|
16
|
+
*/
|
|
17
|
+
detect(input: unknown): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Deep-clone the JSON Schema via `JSON.parse(JSON.stringify())`.
|
|
20
|
+
*
|
|
21
|
+
* Because JSON Schema is structurally compatible with TypeBox's `TSchema`,
|
|
22
|
+
* the clone can be returned directly.
|
|
23
|
+
*/
|
|
24
|
+
extract(input: unknown): TSchema;
|
|
25
|
+
/**
|
|
26
|
+
* Deep-clone the JSON Schema via `JSON.parse(JSON.stringify())`.
|
|
27
|
+
*/
|
|
28
|
+
extractJsonSchema(input: unknown): Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=json-schema.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema.adapter.d.ts","sourceRoot":"","sources":["../../../src/schema/adapters/json-schema.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAKnE;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IACvC,QAAQ,CAAC,QAAQ,MAAM;IAEvB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAoB/B;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIhC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG3D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Well-known symbol used by @sinclair/typebox to tag its schema objects. */
|
|
2
|
+
const TYPEBOX_KIND = Symbol.for('TypeBox.Kind');
|
|
3
|
+
/**
|
|
4
|
+
* Schema adapter for plain JSON Schema objects.
|
|
5
|
+
*
|
|
6
|
+
* JSON Schema is structurally compatible with TypeBox's `TSchema`, so
|
|
7
|
+
* conversion is a straightforward deep clone via JSON round-trip.
|
|
8
|
+
*/
|
|
9
|
+
export class JsonSchemaAdapter {
|
|
10
|
+
name = 'json-schema';
|
|
11
|
+
priority = 30;
|
|
12
|
+
/**
|
|
13
|
+
* Returns `true` when `input` is a non-null object that carries a `"type"`
|
|
14
|
+
* property **and** is not already a TypeBox schema (identified by the
|
|
15
|
+
* `Symbol.for('TypeBox.Kind')` symbol key).
|
|
16
|
+
*/
|
|
17
|
+
detect(input) {
|
|
18
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const obj = input;
|
|
22
|
+
// Must have a "type" property to look like a JSON Schema
|
|
23
|
+
if (!('type' in obj)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Reject TypeBox schemas — they are handled by the TypeBox adapter
|
|
27
|
+
if (TYPEBOX_KIND in obj) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Deep-clone the JSON Schema via `JSON.parse(JSON.stringify())`.
|
|
34
|
+
*
|
|
35
|
+
* Because JSON Schema is structurally compatible with TypeBox's `TSchema`,
|
|
36
|
+
* the clone can be returned directly.
|
|
37
|
+
*/
|
|
38
|
+
extract(input) {
|
|
39
|
+
return JSON.parse(JSON.stringify(input));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Deep-clone the JSON Schema via `JSON.parse(JSON.stringify())`.
|
|
43
|
+
*/
|
|
44
|
+
extractJsonSchema(input) {
|
|
45
|
+
return JSON.parse(JSON.stringify(input));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=json-schema.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema.adapter.js","sourceRoot":"","sources":["../../../src/schema/adapters/json-schema.adapter.ts"],"names":[],"mappings":"AAGA,6EAA6E;AAC7E,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,aAAsB,CAAC;IAC9B,QAAQ,GAAG,EAAE,CAAC;IAEvB;;;;OAIG;IACH,MAAM,CAAC,KAAc;QACnB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,GAAG,KAAyC,CAAC;QAEtD,yDAAyD;QACzD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mEAAmE;QACnE,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAY,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAc;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAA4B,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { TSchema } from '@sinclair/typebox';
|
|
2
|
+
/**
|
|
3
|
+
* Contract for pluggable schema adapters.
|
|
4
|
+
*
|
|
5
|
+
* Each adapter knows how to detect a specific schema dialect (TypeBox, JSON
|
|
6
|
+
* Schema, Zod, class-validator DTO, etc.) and convert it into the canonical
|
|
7
|
+
* representations used by the framework.
|
|
8
|
+
*/
|
|
9
|
+
export interface SchemaAdapter {
|
|
10
|
+
/** Human-readable adapter name, e.g. 'typebox' or 'json-schema'. */
|
|
11
|
+
readonly name: string;
|
|
12
|
+
/** Lower priority wins — adapters are tried in ascending priority order. */
|
|
13
|
+
readonly priority: number;
|
|
14
|
+
/** Return `true` when `input` is a schema this adapter can handle. */
|
|
15
|
+
detect(input: unknown): boolean;
|
|
16
|
+
/** Convert `input` into a TypeBox-compatible `TSchema` object. */
|
|
17
|
+
extract(input: unknown): TSchema;
|
|
18
|
+
/** Convert `input` into a plain JSON Schema object. */
|
|
19
|
+
extractJsonSchema(input: unknown): Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=schema-adapter.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-adapter.interface.d.ts","sourceRoot":"","sources":["../../../src/schema/adapters/schema-adapter.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,sEAAsE;IACtE,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAEhC,kEAAkE;IAClE,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjC,uDAAuD;IACvD,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-adapter.interface.js","sourceRoot":"","sources":["../../../src/schema/adapters/schema-adapter.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TSchema } from '@sinclair/typebox';
|
|
2
|
+
import type { SchemaAdapter } from './schema-adapter.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* Schema adapter for `@sinclair/typebox` schemas.
|
|
5
|
+
*
|
|
6
|
+
* TypeBox schemas are already valid JSON Schema objects decorated with
|
|
7
|
+
* additional `Symbol` properties that the TypeBox runtime (e.g.
|
|
8
|
+
* `Value.Check()`) relies on for validation.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TypeBoxAdapter implements SchemaAdapter {
|
|
11
|
+
readonly name: "typebox";
|
|
12
|
+
readonly priority = 100;
|
|
13
|
+
/**
|
|
14
|
+
* Returns `true` when `input` is a TypeBox schema (carries `Symbol.for('TypeBox.Kind')`).
|
|
15
|
+
*/
|
|
16
|
+
detect(input: unknown): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Returns the TypeBox schema as-is. TypeBox schemas are immutable value
|
|
19
|
+
* objects and must retain their `Symbol` keys for runtime validation
|
|
20
|
+
* (e.g. `Value.Check()`).
|
|
21
|
+
*/
|
|
22
|
+
extract(input: unknown): TSchema;
|
|
23
|
+
/**
|
|
24
|
+
* Converts a TypeBox schema to a plain JSON Schema object.
|
|
25
|
+
*
|
|
26
|
+
* Because TypeBox IS JSON Schema (with extra symbol decorations),
|
|
27
|
+
* a JSON round-trip effectively strips the symbols and returns
|
|
28
|
+
* a standards-compliant JSON Schema object.
|
|
29
|
+
*/
|
|
30
|
+
extractJsonSchema(input: unknown): Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=typebox.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typebox.adapter.d.ts","sourceRoot":"","sources":["../../../src/schema/adapters/typebox.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AASnE;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,QAAQ,OAAO;IAExB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAM/B;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIhC;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG3D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Well-known TypeBox symbol used to tag every schema node.
|
|
3
|
+
* We look up this symbol to detect TypeBox schemas without importing
|
|
4
|
+
* the full library at detection time.
|
|
5
|
+
*/
|
|
6
|
+
const KIND = Symbol.for('TypeBox.Kind');
|
|
7
|
+
/**
|
|
8
|
+
* Schema adapter for `@sinclair/typebox` schemas.
|
|
9
|
+
*
|
|
10
|
+
* TypeBox schemas are already valid JSON Schema objects decorated with
|
|
11
|
+
* additional `Symbol` properties that the TypeBox runtime (e.g.
|
|
12
|
+
* `Value.Check()`) relies on for validation.
|
|
13
|
+
*/
|
|
14
|
+
export class TypeBoxAdapter {
|
|
15
|
+
name = 'typebox';
|
|
16
|
+
priority = 100;
|
|
17
|
+
/**
|
|
18
|
+
* Returns `true` when `input` is a TypeBox schema (carries `Symbol.for('TypeBox.Kind')`).
|
|
19
|
+
*/
|
|
20
|
+
detect(input) {
|
|
21
|
+
if (input === null || input === undefined)
|
|
22
|
+
return false;
|
|
23
|
+
if (typeof input !== 'object')
|
|
24
|
+
return false;
|
|
25
|
+
return KIND in input;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns the TypeBox schema as-is. TypeBox schemas are immutable value
|
|
29
|
+
* objects and must retain their `Symbol` keys for runtime validation
|
|
30
|
+
* (e.g. `Value.Check()`).
|
|
31
|
+
*/
|
|
32
|
+
extract(input) {
|
|
33
|
+
return input;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Converts a TypeBox schema to a plain JSON Schema object.
|
|
37
|
+
*
|
|
38
|
+
* Because TypeBox IS JSON Schema (with extra symbol decorations),
|
|
39
|
+
* a JSON round-trip effectively strips the symbols and returns
|
|
40
|
+
* a standards-compliant JSON Schema object.
|
|
41
|
+
*/
|
|
42
|
+
extractJsonSchema(input) {
|
|
43
|
+
return JSON.parse(JSON.stringify(input));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=typebox.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typebox.adapter.js","sourceRoot":"","sources":["../../../src/schema/adapters/typebox.adapter.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,SAAkB,CAAC;IAC1B,QAAQ,GAAG,GAAG,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,KAAc;QACnB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,OAAO,IAAI,IAAK,KAAgB,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAc;QACpB,OAAO,KAAgB,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAc;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAA4B,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TSchema } from '@sinclair/typebox';
|
|
2
|
+
import type { SchemaAdapter } from './schema-adapter.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* SchemaAdapter for Zod schemas.
|
|
5
|
+
*
|
|
6
|
+
* Converts Zod schema definitions to JSON Schema / TSchema representations
|
|
7
|
+
* used internally by apcore.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ZodAdapter implements SchemaAdapter {
|
|
10
|
+
readonly name: "zod";
|
|
11
|
+
readonly priority = 50;
|
|
12
|
+
detect(input: unknown): boolean;
|
|
13
|
+
extract(input: unknown): TSchema;
|
|
14
|
+
extractJsonSchema(input: unknown): Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=zod.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.adapter.d.ts","sourceRoot":"","sources":["../../../src/schema/adapters/zod.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAmNnE;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,aAAa;IAC9C,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,QAAQ,CAAC,QAAQ,MAAM;IAEvB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI/B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAKhC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAM3D"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
function isZodLike(input) {
|
|
2
|
+
if (input === null || input === undefined)
|
|
3
|
+
return false;
|
|
4
|
+
if (typeof input !== 'object')
|
|
5
|
+
return false;
|
|
6
|
+
const obj = input;
|
|
7
|
+
return ('_def' in obj &&
|
|
8
|
+
obj['_def'] !== null &&
|
|
9
|
+
typeof obj['_def'] === 'object' &&
|
|
10
|
+
'safeParse' in obj &&
|
|
11
|
+
typeof obj['safeParse'] === 'function');
|
|
12
|
+
}
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Recursive Zod → JSON Schema conversion
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
function convertZodToJsonSchema(zodSchema) {
|
|
17
|
+
const def = zodSchema._def;
|
|
18
|
+
const typeName = def.typeName ?? '';
|
|
19
|
+
let result = {};
|
|
20
|
+
switch (typeName) {
|
|
21
|
+
case 'ZodString': {
|
|
22
|
+
result = { type: 'string' };
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case 'ZodNumber': {
|
|
26
|
+
result = convertZodNumber(def);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case 'ZodBoolean': {
|
|
30
|
+
result = { type: 'boolean' };
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case 'ZodObject': {
|
|
34
|
+
result = convertZodObject(def);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'ZodArray': {
|
|
38
|
+
const itemSchema = def.type;
|
|
39
|
+
result = { type: 'array', items: convertZodToJsonSchema(itemSchema) };
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 'ZodEnum': {
|
|
43
|
+
const values = def.values;
|
|
44
|
+
result = { type: 'string', enum: [...values] };
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case 'ZodNativeEnum': {
|
|
48
|
+
const enumObj = def.values;
|
|
49
|
+
// Filter out reverse-mapped numeric keys (TypeScript numeric enums
|
|
50
|
+
// produce { 0: 'Red', Red: 0 } — we want only the string-keyed values).
|
|
51
|
+
const vals = Object.values(enumObj).filter((v) => {
|
|
52
|
+
if (typeof v === 'number') {
|
|
53
|
+
// Keep the value if its reverse-lookup key does not map back
|
|
54
|
+
return !(String(v) in enumObj);
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
});
|
|
58
|
+
result = { type: 'string', enum: vals };
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'ZodOptional': {
|
|
62
|
+
const inner = def.innerType;
|
|
63
|
+
result = convertZodToJsonSchema(inner);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case 'ZodNullable': {
|
|
67
|
+
const inner = def.innerType;
|
|
68
|
+
result = { ...convertZodToJsonSchema(inner), nullable: true };
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'ZodDefault': {
|
|
72
|
+
const inner = def.innerType;
|
|
73
|
+
const defaultValue = def.defaultValue();
|
|
74
|
+
result = { ...convertZodToJsonSchema(inner), default: defaultValue };
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case 'ZodLiteral': {
|
|
78
|
+
const value = def.value;
|
|
79
|
+
result = { type: typeof value, const: value };
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case 'ZodUnion': {
|
|
83
|
+
const options = def.options;
|
|
84
|
+
result = { anyOf: options.map((opt) => convertZodToJsonSchema(opt)) };
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case 'ZodRecord': {
|
|
88
|
+
const valueType = def.valueType;
|
|
89
|
+
result = {
|
|
90
|
+
type: 'object',
|
|
91
|
+
additionalProperties: convertZodToJsonSchema(valueType),
|
|
92
|
+
};
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'ZodEffects': {
|
|
96
|
+
const inner = def.schema;
|
|
97
|
+
result = convertZodToJsonSchema(inner);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
default: {
|
|
101
|
+
// Fallback — return an empty schema
|
|
102
|
+
result = {};
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Attach description if present on the def
|
|
107
|
+
if (def.description) {
|
|
108
|
+
result['description'] = def.description;
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Sub-converters
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
function convertZodNumber(def) {
|
|
116
|
+
const checks = def.checks ?? [];
|
|
117
|
+
let type = 'number';
|
|
118
|
+
const result = {};
|
|
119
|
+
for (const check of checks) {
|
|
120
|
+
switch (check.kind) {
|
|
121
|
+
case 'int':
|
|
122
|
+
type = 'integer';
|
|
123
|
+
break;
|
|
124
|
+
case 'min':
|
|
125
|
+
result['minimum'] = check.value;
|
|
126
|
+
break;
|
|
127
|
+
case 'max':
|
|
128
|
+
result['maximum'] = check.value;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
result['type'] = type;
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
function convertZodObject(def) {
|
|
136
|
+
const shape = def.shape?.();
|
|
137
|
+
if (!shape) {
|
|
138
|
+
return { type: 'object' };
|
|
139
|
+
}
|
|
140
|
+
const properties = {};
|
|
141
|
+
const required = [];
|
|
142
|
+
for (const [key, fieldSchema] of Object.entries(shape)) {
|
|
143
|
+
properties[key] = convertZodToJsonSchema(fieldSchema);
|
|
144
|
+
const fieldTypeName = fieldSchema._def.typeName;
|
|
145
|
+
if (fieldTypeName !== 'ZodOptional' && fieldTypeName !== 'ZodDefault') {
|
|
146
|
+
required.push(key);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const result = {
|
|
150
|
+
type: 'object',
|
|
151
|
+
properties,
|
|
152
|
+
};
|
|
153
|
+
if (required.length > 0) {
|
|
154
|
+
result['required'] = required;
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// ZodAdapter
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
/**
|
|
162
|
+
* SchemaAdapter for Zod schemas.
|
|
163
|
+
*
|
|
164
|
+
* Converts Zod schema definitions to JSON Schema / TSchema representations
|
|
165
|
+
* used internally by apcore.
|
|
166
|
+
*/
|
|
167
|
+
export class ZodAdapter {
|
|
168
|
+
name = 'zod';
|
|
169
|
+
priority = 50;
|
|
170
|
+
detect(input) {
|
|
171
|
+
return isZodLike(input);
|
|
172
|
+
}
|
|
173
|
+
extract(input) {
|
|
174
|
+
const jsonSchema = this.extractJsonSchema(input);
|
|
175
|
+
return jsonSchema;
|
|
176
|
+
}
|
|
177
|
+
extractJsonSchema(input) {
|
|
178
|
+
if (!isZodLike(input)) {
|
|
179
|
+
throw new Error('ZodAdapter.extractJsonSchema: input is not a Zod schema');
|
|
180
|
+
}
|
|
181
|
+
return convertZodToJsonSchema(input);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=zod.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.adapter.js","sourceRoot":"","sources":["../../../src/schema/adapters/zod.adapter.ts"],"names":[],"mappings":"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"}
|