apcore-toolkit 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/CHANGELOG.md +17 -0
- package/README.md +134 -0
- package/dist/formatting/index.d.ts +2 -0
- package/dist/formatting/index.d.ts.map +1 -0
- package/dist/formatting/index.js +2 -0
- package/dist/formatting/index.js.map +1 -0
- package/dist/formatting/markdown.d.ts +8 -0
- package/dist/formatting/markdown.d.ts.map +1 -0
- package/dist/formatting/markdown.js +221 -0
- package/dist/formatting/markdown.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi.d.ts +5 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +73 -0
- package/dist/openapi.js.map +1 -0
- package/dist/output/factory.d.ts +5 -0
- package/dist/output/factory.d.ts.map +1 -0
- package/dist/output/factory.js +13 -0
- package/dist/output/factory.js.map +1 -0
- package/dist/output/index.d.ts +5 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +5 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/registry-writer.d.ts +10 -0
- package/dist/output/registry-writer.d.ts.map +1 -0
- package/dist/output/registry-writer.js +42 -0
- package/dist/output/registry-writer.js.map +1 -0
- package/dist/output/typescript-writer.d.ts +10 -0
- package/dist/output/typescript-writer.d.ts.map +1 -0
- package/dist/output/typescript-writer.js +78 -0
- package/dist/output/typescript-writer.js.map +1 -0
- package/dist/output/yaml-writer.d.ts +8 -0
- package/dist/output/yaml-writer.d.ts.map +1 -0
- package/dist/output/yaml-writer.js +67 -0
- package/dist/output/yaml-writer.js.map +1 -0
- package/dist/resolve-target.d.ts +9 -0
- package/dist/resolve-target.d.ts.map +1 -0
- package/dist/resolve-target.js +28 -0
- package/dist/resolve-target.js.map +1 -0
- package/dist/scanner.d.ts +13 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +53 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema-utils.d.ts +10 -0
- package/dist/schema-utils.d.ts.map +1 -0
- package/dist/schema-utils.js +28 -0
- package/dist/schema-utils.js.map +1 -0
- package/dist/serializers.d.ts +16 -0
- package/dist/serializers.d.ts.map +1 -0
- package/dist/serializers.js +44 -0
- package/dist/serializers.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { FunctionModule, jsonSchemaToTypeBox } from 'apcore-js';
|
|
2
|
+
import { annotationsToDict } from '../serializers.js';
|
|
3
|
+
import { resolveTarget } from '../resolve-target.js';
|
|
4
|
+
export class RegistryWriter {
|
|
5
|
+
async write(modules, registry, options) {
|
|
6
|
+
const registered = [];
|
|
7
|
+
for (const mod of modules) {
|
|
8
|
+
if (options?.dryRun) {
|
|
9
|
+
registered.push(mod.moduleId);
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const fm = await this._toFunctionModule(mod);
|
|
13
|
+
registry.register(mod.moduleId, fm);
|
|
14
|
+
registered.push(mod.moduleId);
|
|
15
|
+
}
|
|
16
|
+
return registered;
|
|
17
|
+
}
|
|
18
|
+
async _toFunctionModule(mod) {
|
|
19
|
+
const targetFn = (await resolveTarget(mod.target));
|
|
20
|
+
return new FunctionModule({
|
|
21
|
+
execute: async (inputs, _context) => {
|
|
22
|
+
const result = await targetFn(inputs);
|
|
23
|
+
if (result == null)
|
|
24
|
+
return {};
|
|
25
|
+
if (typeof result !== 'object' || Array.isArray(result))
|
|
26
|
+
return { result };
|
|
27
|
+
return result;
|
|
28
|
+
},
|
|
29
|
+
moduleId: mod.moduleId,
|
|
30
|
+
inputSchema: jsonSchemaToTypeBox(mod.inputSchema),
|
|
31
|
+
outputSchema: jsonSchemaToTypeBox(mod.outputSchema),
|
|
32
|
+
description: mod.description,
|
|
33
|
+
documentation: mod.documentation,
|
|
34
|
+
tags: mod.tags.length > 0 ? [...mod.tags] : null,
|
|
35
|
+
version: mod.version,
|
|
36
|
+
annotations: annotationsToDict(mod.annotations),
|
|
37
|
+
metadata: Object.keys(mod.metadata).length > 0 ? { ...mod.metadata } : null,
|
|
38
|
+
examples: mod.examples.length > 0 ? [...mod.examples] : null,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=registry-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-writer.js","sourceRoot":"","sources":["../../src/output/registry-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,KAAK,CACT,OAAwB,EACxB,QAA+D,EAC/D,OAA8B;QAE9B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,GAAkB;QAChD,MAAM,QAAQ,GAAG,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAErC,CAAC;QAEb,OAAO,IAAI,cAAc,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,MAA+B,EAAE,QAAiB,EAAE,EAAE;gBACpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,MAAM,IAAI,IAAI;oBAAE,OAAO,EAAE,CAAC;gBAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC3E,OAAO,MAAiC,CAAC;YAC3C,CAAC;YACD,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,WAAW,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC;YACjD,YAAY,EAAE,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAChD,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAA6B;YAC3E,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;YAC3E,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAqB,CAAC,CAAC,CAAC,IAAI;SAClF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScannedModule } from '../types.js';
|
|
2
|
+
export declare class TypeScriptWriter {
|
|
3
|
+
write(modules: ScannedModule[], outputDir: string, options?: {
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
}): string[];
|
|
6
|
+
private _generateCode;
|
|
7
|
+
private _parseTarget;
|
|
8
|
+
private _sanitizeIdentifier;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=typescript-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-writer.d.ts","sourceRoot":"","sources":["../../src/output/typescript-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,gBAAgB;IAC3B,KAAK,CACH,OAAO,EAAE,aAAa,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,MAAM,EAAE;IAgCX,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,mBAAmB;CAO5B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { resolve, join } from 'node:path';
|
|
3
|
+
export class TypeScriptWriter {
|
|
4
|
+
write(modules, outputDir, options) {
|
|
5
|
+
const dryRun = options?.dryRun ?? false;
|
|
6
|
+
const results = [];
|
|
7
|
+
const timestamp = new Date().toISOString();
|
|
8
|
+
const resolvedOut = dryRun ? '' : resolve(outputDir);
|
|
9
|
+
if (!dryRun) {
|
|
10
|
+
mkdirSync(resolvedOut, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
for (const mod of modules) {
|
|
13
|
+
const code = this._generateCode(mod, timestamp);
|
|
14
|
+
results.push(code);
|
|
15
|
+
if (!dryRun) {
|
|
16
|
+
// Path traversal protection: check raw moduleId before sanitization
|
|
17
|
+
const rawResolved = resolve(join(resolvedOut, mod.moduleId));
|
|
18
|
+
if (!rawResolved.startsWith(resolvedOut + '/') && rawResolved !== resolvedOut) {
|
|
19
|
+
console.warn('Skipping module with path traversal in id: %s', mod.moduleId);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const sanitized = this._sanitizeIdentifier(mod.moduleId);
|
|
23
|
+
const filename = `${sanitized}.ts`;
|
|
24
|
+
writeFileSync(resolve(join(resolvedOut, filename)), code, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
_generateCode(mod, timestamp) {
|
|
30
|
+
const { modulePath, exportName } = this._parseTarget(mod.target);
|
|
31
|
+
const lines = [];
|
|
32
|
+
lines.push(`// Auto-generated apcore module: ${JSON.stringify(mod.moduleId)}`);
|
|
33
|
+
lines.push(`// Generated: ${timestamp}`);
|
|
34
|
+
lines.push('// Do not edit manually unless you intend to customize behavior.');
|
|
35
|
+
lines.push('');
|
|
36
|
+
lines.push("import { module } from 'apcore-js';");
|
|
37
|
+
lines.push('');
|
|
38
|
+
lines.push('export default module({');
|
|
39
|
+
lines.push(` id: ${JSON.stringify(mod.moduleId)},`);
|
|
40
|
+
lines.push(` description: ${JSON.stringify(mod.description)},`);
|
|
41
|
+
lines.push(` inputSchema: ${JSON.stringify(mod.inputSchema)},`);
|
|
42
|
+
lines.push(` outputSchema: ${JSON.stringify(mod.outputSchema)},`);
|
|
43
|
+
lines.push(` tags: ${JSON.stringify([...mod.tags])},`);
|
|
44
|
+
lines.push(` version: ${JSON.stringify(mod.version)},`);
|
|
45
|
+
if (mod.annotations !== null) {
|
|
46
|
+
lines.push(` annotations: ${JSON.stringify(mod.annotations)},`);
|
|
47
|
+
}
|
|
48
|
+
lines.push(' async execute(inputs) {');
|
|
49
|
+
lines.push(` const { ${exportName}: _original } = await import(${JSON.stringify(modulePath)});`);
|
|
50
|
+
lines.push(' return _original(inputs);');
|
|
51
|
+
lines.push(' },');
|
|
52
|
+
lines.push('});');
|
|
53
|
+
lines.push('');
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
_parseTarget(target) {
|
|
57
|
+
const lastColon = target.lastIndexOf(':');
|
|
58
|
+
if (lastColon === -1) {
|
|
59
|
+
throw new Error(`Invalid target format: ${target}`);
|
|
60
|
+
}
|
|
61
|
+
const exportName = target.slice(lastColon + 1);
|
|
62
|
+
if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(exportName)) {
|
|
63
|
+
throw new Error(`Invalid export name: ${exportName}`);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
modulePath: target.slice(0, lastColon),
|
|
67
|
+
exportName,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
_sanitizeIdentifier(name) {
|
|
71
|
+
let sanitized = name.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
72
|
+
if (/^[0-9]/.test(sanitized)) {
|
|
73
|
+
sanitized = `_${sanitized}`;
|
|
74
|
+
}
|
|
75
|
+
return sanitized;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=typescript-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-writer.js","sourceRoot":"","sources":["../../src/output/typescript-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ScannedModule } from '../types.js';
|
|
2
|
+
export declare class YAMLWriter {
|
|
3
|
+
write(modules: ScannedModule[], outputDir: string, options?: {
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
}): Record<string, unknown>[];
|
|
6
|
+
private _buildBinding;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=yaml-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-writer.d.ts","sourceRoot":"","sources":["../../src/output/yaml-writer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,qBAAa,UAAU;IACrB,KAAK,CACH,OAAO,EAAE,aAAa,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAqD5B,OAAO,CAAC,aAAa;CAqBtB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import yaml from 'js-yaml';
|
|
2
|
+
import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, join } from 'node:path';
|
|
4
|
+
import { annotationsToDict } from '../serializers.js';
|
|
5
|
+
export class YAMLWriter {
|
|
6
|
+
write(modules, outputDir, options) {
|
|
7
|
+
const dryRun = options?.dryRun ?? false;
|
|
8
|
+
if (modules.length === 0) {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
const outputPath = resolve(outputDir);
|
|
12
|
+
if (!dryRun) {
|
|
13
|
+
mkdirSync(outputPath, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
const results = [];
|
|
16
|
+
const timestamp = new Date().toISOString();
|
|
17
|
+
for (const module of modules) {
|
|
18
|
+
const bindingData = this._buildBinding(module);
|
|
19
|
+
results.push(bindingData);
|
|
20
|
+
if (!dryRun) {
|
|
21
|
+
let safeId = module.moduleId.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
22
|
+
safeId = safeId.replace(/\.{2,}/g, '_');
|
|
23
|
+
const filename = `${safeId}.binding.yaml`;
|
|
24
|
+
const filePath = resolve(join(outputPath, filename));
|
|
25
|
+
// Path traversal protection
|
|
26
|
+
if (!filePath.startsWith(outputPath)) {
|
|
27
|
+
console.warn('Skipping file outside output directory: %s', filePath);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (existsSync(filePath)) {
|
|
31
|
+
console.warn('Overwriting existing file: %s', filePath);
|
|
32
|
+
}
|
|
33
|
+
const header = `# Auto-generated by apcore-toolkit scanner\n` +
|
|
34
|
+
`# Generated: ${timestamp}\n` +
|
|
35
|
+
`# Do not edit manually unless you intend to customize schemas.\n\n`;
|
|
36
|
+
const yamlContent = yaml.dump(bindingData, {
|
|
37
|
+
flowLevel: -1,
|
|
38
|
+
sortKeys: false,
|
|
39
|
+
});
|
|
40
|
+
writeFileSync(filePath, header + yamlContent, 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
_buildBinding(module) {
|
|
46
|
+
return {
|
|
47
|
+
bindings: [
|
|
48
|
+
{
|
|
49
|
+
module_id: module.moduleId,
|
|
50
|
+
target: module.target,
|
|
51
|
+
description: module.description,
|
|
52
|
+
documentation: module.documentation,
|
|
53
|
+
tags: [...module.tags],
|
|
54
|
+
version: module.version,
|
|
55
|
+
annotations: annotationsToDict(module.annotations),
|
|
56
|
+
examples: module.examples.length > 0
|
|
57
|
+
? module.examples.map((e) => ({ ...e }))
|
|
58
|
+
: [],
|
|
59
|
+
metadata: { ...module.metadata },
|
|
60
|
+
input_schema: { ...module.inputSchema },
|
|
61
|
+
output_schema: { ...module.outputSchema },
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=yaml-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-writer.js","sourceRoot":"","sources":["../../src/output/yaml-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamically imports a module and resolves a named export.
|
|
3
|
+
*
|
|
4
|
+
* Target format: `"module/path:exportName"`.
|
|
5
|
+
* The LAST `:` is used as the separator so that Node.js built-in prefixes
|
|
6
|
+
* like `node:path` are supported (e.g. `"node:path:join"`).
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveTarget(target: string): Promise<unknown>;
|
|
9
|
+
//# sourceMappingURL=resolve-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-target.d.ts","sourceRoot":"","sources":["../src/resolve-target.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BpE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamically imports a module and resolves a named export.
|
|
3
|
+
*
|
|
4
|
+
* Target format: `"module/path:exportName"`.
|
|
5
|
+
* The LAST `:` is used as the separator so that Node.js built-in prefixes
|
|
6
|
+
* like `node:path` are supported (e.g. `"node:path:join"`).
|
|
7
|
+
*/
|
|
8
|
+
export async function resolveTarget(target) {
|
|
9
|
+
const lastColon = target.lastIndexOf(":");
|
|
10
|
+
if (lastColon === -1) {
|
|
11
|
+
throw new Error(`Invalid target format: "${target}". Expected "module/path:exportName".`);
|
|
12
|
+
}
|
|
13
|
+
const modulePath = target.slice(0, lastColon);
|
|
14
|
+
const exportName = target.slice(lastColon + 1);
|
|
15
|
+
let mod;
|
|
16
|
+
try {
|
|
17
|
+
mod = (await import(modulePath));
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
21
|
+
throw new Error(`Failed to import module "${modulePath}": ${message}`);
|
|
22
|
+
}
|
|
23
|
+
if (mod[exportName] === undefined) {
|
|
24
|
+
throw new Error(`Export "${exportName}" not found in module "${modulePath}".`);
|
|
25
|
+
}
|
|
26
|
+
return mod[exportName];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=resolve-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-target.js","sourceRoot":"","sources":["../src/resolve-target.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,uCAAuC,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAE/C,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,MAAM,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,0BAA0B,UAAU,IAAI,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ModuleAnnotations } from 'apcore-js';
|
|
2
|
+
import type { ScannedModule } from './types.js';
|
|
3
|
+
export declare abstract class BaseScanner {
|
|
4
|
+
abstract scan(...args: unknown[]): ScannedModule[] | Promise<ScannedModule[]>;
|
|
5
|
+
abstract getSourceName(): string;
|
|
6
|
+
filterModules(modules: ScannedModule[], options?: {
|
|
7
|
+
include?: string;
|
|
8
|
+
exclude?: string;
|
|
9
|
+
}): ScannedModule[];
|
|
10
|
+
static inferAnnotationsFromMethod(method: string): ModuleAnnotations;
|
|
11
|
+
deduplicateIds(modules: ScannedModule[]): ScannedModule[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAC7E,QAAQ,CAAC,aAAa,IAAI,MAAM;IAEhC,aAAa,CACX,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,aAAa,EAAE;IAgBlB,MAAM,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB;IAgBpE,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE;CA2B1D"}
|
package/dist/scanner.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DEFAULT_ANNOTATIONS } from 'apcore-js';
|
|
2
|
+
import { cloneModule } from './types.js';
|
|
3
|
+
export class BaseScanner {
|
|
4
|
+
filterModules(modules, options) {
|
|
5
|
+
let result = modules;
|
|
6
|
+
if (options?.include != null) {
|
|
7
|
+
const include = options.include;
|
|
8
|
+
result = result.filter((m) => new RegExp(include).test(m.moduleId));
|
|
9
|
+
}
|
|
10
|
+
if (options?.exclude != null) {
|
|
11
|
+
const exclude = options.exclude;
|
|
12
|
+
result = result.filter((m) => !new RegExp(exclude).test(m.moduleId));
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
static inferAnnotationsFromMethod(method) {
|
|
17
|
+
const upper = method.toUpperCase();
|
|
18
|
+
if (upper === 'GET') {
|
|
19
|
+
return { ...DEFAULT_ANNOTATIONS, readonly: true };
|
|
20
|
+
}
|
|
21
|
+
if (upper === 'DELETE') {
|
|
22
|
+
return { ...DEFAULT_ANNOTATIONS, destructive: true };
|
|
23
|
+
}
|
|
24
|
+
if (upper === 'PUT') {
|
|
25
|
+
return { ...DEFAULT_ANNOTATIONS, idempotent: true };
|
|
26
|
+
}
|
|
27
|
+
return { ...DEFAULT_ANNOTATIONS };
|
|
28
|
+
}
|
|
29
|
+
deduplicateIds(modules) {
|
|
30
|
+
const seen = new Map();
|
|
31
|
+
const result = [];
|
|
32
|
+
for (const module of modules) {
|
|
33
|
+
const mid = module.moduleId;
|
|
34
|
+
const count = seen.get(mid) ?? 0;
|
|
35
|
+
seen.set(mid, count + 1);
|
|
36
|
+
if (count > 0) {
|
|
37
|
+
const newId = `${mid}_${count + 1}`;
|
|
38
|
+
result.push(cloneModule(module, {
|
|
39
|
+
moduleId: newId,
|
|
40
|
+
warnings: [
|
|
41
|
+
...module.warnings,
|
|
42
|
+
`Module ID renamed from '${mid}' to '${newId}' to avoid collision`,
|
|
43
|
+
],
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
result.push(module);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,OAAgB,WAAW;IAI/B,aAAa,CACX,OAAwB,EACxB,OAAgD;QAEhD,IAAI,MAAM,GAAG,OAAO,CAAC;QAErB,IAAI,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,0BAA0B,CAAC,MAAc;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEnC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,GAAG,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,EAAE,GAAG,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACvD,CAAC;QACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,GAAG,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,OAAwB;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAEzB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,MAAM,EAAE;oBAClB,QAAQ,EAAE,KAAK;oBACf,QAAQ,EAAE;wBACR,GAAG,MAAM,CAAC,QAAQ;wBAClB,2BAA2B,GAAG,SAAS,KAAK,sBAAsB;qBACnE;iBACF,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enrich a JSON Schema's property descriptions from an external map.
|
|
3
|
+
*
|
|
4
|
+
* Returns the original schema reference when no enrichment is needed;
|
|
5
|
+
* otherwise returns a deep copy with descriptions merged in.
|
|
6
|
+
*/
|
|
7
|
+
export declare function enrichSchemaDescriptions(schema: Record<string, unknown>, paramDescriptions: Record<string, string>, options?: {
|
|
8
|
+
overwrite?: boolean;
|
|
9
|
+
}): Record<string, unknown>;
|
|
10
|
+
//# sourceMappingURL=schema-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-utils.d.ts","sourceRoot":"","sources":["../src/schema-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BzB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enrich a JSON Schema's property descriptions from an external map.
|
|
3
|
+
*
|
|
4
|
+
* Returns the original schema reference when no enrichment is needed;
|
|
5
|
+
* otherwise returns a deep copy with descriptions merged in.
|
|
6
|
+
*/
|
|
7
|
+
export function enrichSchemaDescriptions(schema, paramDescriptions, options) {
|
|
8
|
+
if (Object.keys(paramDescriptions).length === 0) {
|
|
9
|
+
return schema;
|
|
10
|
+
}
|
|
11
|
+
const properties = schema.properties;
|
|
12
|
+
if (!properties) {
|
|
13
|
+
return schema;
|
|
14
|
+
}
|
|
15
|
+
const overwrite = options?.overwrite ?? false;
|
|
16
|
+
const result = structuredClone(schema);
|
|
17
|
+
const resultProps = result.properties;
|
|
18
|
+
for (const [name, desc] of Object.entries(paramDescriptions)) {
|
|
19
|
+
if (name in resultProps) {
|
|
20
|
+
const prop = resultProps[name];
|
|
21
|
+
if (overwrite || !("description" in prop)) {
|
|
22
|
+
prop.description = desc;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=schema-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-utils.js","sourceRoot":"","sources":["../src/schema-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA+B,EAC/B,iBAAyC,EACzC,OAAiC;IAEjC,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAEb,CAAC;IACd,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,UAG1B,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC7D,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,SAAS,IAAI,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ScannedModule } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Converts annotations to a plain dictionary.
|
|
4
|
+
* Returns null for null/undefined or unrecognised types.
|
|
5
|
+
*/
|
|
6
|
+
export declare function annotationsToDict(annotations: unknown): Record<string, unknown> | null;
|
|
7
|
+
/**
|
|
8
|
+
* Serializes a ScannedModule to a plain dictionary with snake_case keys,
|
|
9
|
+
* matching the Python SDK's output format.
|
|
10
|
+
*/
|
|
11
|
+
export declare function moduleToDict(module: ScannedModule): Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Batch-converts an array of ScannedModules to plain dictionaries.
|
|
14
|
+
*/
|
|
15
|
+
export declare function modulesToDicts(modules: ScannedModule[]): Record<string, unknown>[];
|
|
16
|
+
//# sourceMappingURL=serializers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializers.d.ts","sourceRoot":"","sources":["../src/serializers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,OAAO,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAgBhC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EAAE,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAE3B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts annotations to a plain dictionary.
|
|
3
|
+
* Returns null for null/undefined or unrecognised types.
|
|
4
|
+
*/
|
|
5
|
+
export function annotationsToDict(annotations) {
|
|
6
|
+
if (annotations == null) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
if (typeof annotations === 'object' &&
|
|
10
|
+
!Array.isArray(annotations)) {
|
|
11
|
+
return { ...annotations };
|
|
12
|
+
}
|
|
13
|
+
console.warn('Unrecognised annotations type %s: %o — returning null', typeof annotations, annotations);
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Serializes a ScannedModule to a plain dictionary with snake_case keys,
|
|
18
|
+
* matching the Python SDK's output format.
|
|
19
|
+
*/
|
|
20
|
+
export function moduleToDict(module) {
|
|
21
|
+
return {
|
|
22
|
+
module_id: module.moduleId,
|
|
23
|
+
description: module.description,
|
|
24
|
+
documentation: module.documentation,
|
|
25
|
+
tags: [...module.tags],
|
|
26
|
+
version: module.version,
|
|
27
|
+
target: module.target,
|
|
28
|
+
annotations: annotationsToDict(module.annotations),
|
|
29
|
+
examples: module.examples.length > 0
|
|
30
|
+
? module.examples.map((e) => ({ ...e }))
|
|
31
|
+
: [],
|
|
32
|
+
metadata: { ...module.metadata },
|
|
33
|
+
input_schema: { ...module.inputSchema },
|
|
34
|
+
output_schema: { ...module.outputSchema },
|
|
35
|
+
warnings: [...module.warnings],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Batch-converts an array of ScannedModules to plain dictionaries.
|
|
40
|
+
*/
|
|
41
|
+
export function modulesToDicts(modules) {
|
|
42
|
+
return modules.map(moduleToDict);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=serializers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializers.js","sourceRoot":"","sources":["../src/serializers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAoB;IAEpB,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IACE,OAAO,WAAW,KAAK,QAAQ;QAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,CAAC;QACD,OAAO,EAAE,GAAI,WAAuC,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,IAAI,CACV,uDAAuD,EACvD,OAAO,WAAW,EAClB,WAAW,CACZ,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAqB;IAErB,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC;QAClD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAClC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,EAAE;QACN,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;QAChC,YAAY,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE;QACvC,aAAa,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE;QACzC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAwB;IAExB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ModuleAnnotations, ModuleExample } from 'apcore-js';
|
|
2
|
+
export interface ScannedModule {
|
|
3
|
+
readonly moduleId: string;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
readonly inputSchema: Record<string, unknown>;
|
|
6
|
+
readonly outputSchema: Record<string, unknown>;
|
|
7
|
+
readonly tags: readonly string[];
|
|
8
|
+
readonly target: string;
|
|
9
|
+
readonly version: string;
|
|
10
|
+
readonly annotations: ModuleAnnotations | null;
|
|
11
|
+
readonly documentation: string | null;
|
|
12
|
+
readonly examples: readonly ModuleExample[];
|
|
13
|
+
readonly metadata: Record<string, unknown>;
|
|
14
|
+
readonly warnings: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
export declare function createScannedModule(options: {
|
|
17
|
+
moduleId: string;
|
|
18
|
+
description: string;
|
|
19
|
+
inputSchema: Record<string, unknown>;
|
|
20
|
+
outputSchema: Record<string, unknown>;
|
|
21
|
+
tags: string[];
|
|
22
|
+
target: string;
|
|
23
|
+
version?: string;
|
|
24
|
+
annotations?: ModuleAnnotations | null;
|
|
25
|
+
documentation?: string | null;
|
|
26
|
+
examples?: ModuleExample[];
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
warnings?: string[];
|
|
29
|
+
}): ScannedModule;
|
|
30
|
+
export declare function cloneModule(module: ScannedModule, overrides?: Partial<ScannedModule>): ScannedModule;
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,aAAa,CAehB;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAWf"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function createScannedModule(options) {
|
|
2
|
+
return {
|
|
3
|
+
moduleId: options.moduleId,
|
|
4
|
+
description: options.description,
|
|
5
|
+
inputSchema: { ...options.inputSchema },
|
|
6
|
+
outputSchema: { ...options.outputSchema },
|
|
7
|
+
tags: [...options.tags],
|
|
8
|
+
target: options.target,
|
|
9
|
+
version: options.version ?? '1.0.0',
|
|
10
|
+
annotations: options.annotations ?? null,
|
|
11
|
+
documentation: options.documentation ?? null,
|
|
12
|
+
examples: [...(options.examples ?? [])],
|
|
13
|
+
metadata: { ...(options.metadata ?? {}) },
|
|
14
|
+
warnings: [...(options.warnings ?? [])],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function cloneModule(module, overrides) {
|
|
18
|
+
const merged = { ...module, ...overrides };
|
|
19
|
+
return {
|
|
20
|
+
...merged,
|
|
21
|
+
tags: [...merged.tags],
|
|
22
|
+
examples: [...merged.examples],
|
|
23
|
+
metadata: { ...merged.metadata },
|
|
24
|
+
warnings: [...merged.warnings],
|
|
25
|
+
inputSchema: { ...merged.inputSchema },
|
|
26
|
+
outputSchema: { ...merged.outputSchema },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,mBAAmB,CAAC,OAanC;IACC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;QACvC,YAAY,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE;QACzC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QACvB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO;QACnC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACvC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QACzC,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAqB,EACrB,SAAkC;IAElC,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC3C,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QACtB,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC9B,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;QAChC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC9B,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE;QACtC,YAAY,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE;KACzC,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "apcore-toolkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared scanner, schema extraction, and output toolkit for apcore framework adapters",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"license": "Apache-2.0",
|
|
16
|
+
"author": {
|
|
17
|
+
"name": "aipartnerup",
|
|
18
|
+
"email": "tercel.yi@gmail.com"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"apcore",
|
|
22
|
+
"mcp",
|
|
23
|
+
"scanner",
|
|
24
|
+
"schema",
|
|
25
|
+
"yaml",
|
|
26
|
+
"openapi",
|
|
27
|
+
"toolkit"
|
|
28
|
+
],
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/aipartnerup/apcore-toolkit-typescript"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://aipartnerup.com",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/aipartnerup/apcore-toolkit-typescript/issues"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md",
|
|
40
|
+
"CHANGELOG.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"test:watch": "vitest",
|
|
47
|
+
"test:coverage": "vitest run --coverage",
|
|
48
|
+
"lint": "eslint src/ tests/",
|
|
49
|
+
"typecheck": "tsc --noEmit",
|
|
50
|
+
"clean": "rm -rf dist"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"apcore-js": ">=0.9.0",
|
|
54
|
+
"js-yaml": "^4.1.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/js-yaml": "^4.0.9",
|
|
58
|
+
"@types/node": "^22.0.0",
|
|
59
|
+
"apdev-js": "^0.2.0",
|
|
60
|
+
"typescript": "^5.5.0",
|
|
61
|
+
"vitest": "^3.0.0",
|
|
62
|
+
"@vitest/coverage-v8": "^3.0.0",
|
|
63
|
+
"eslint": "^9.0.0"
|
|
64
|
+
},
|
|
65
|
+
"engines": {
|
|
66
|
+
"node": ">=20.0.0"
|
|
67
|
+
},
|
|
68
|
+
"apdev": {
|
|
69
|
+
"base_package": "apcore-toolkit"
|
|
70
|
+
}
|
|
71
|
+
}
|