@autobe/agent
Version:
AI backend server code generator
122 lines • 6.03 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AutoBeTestOperationProgrammer = void 0;
const utils_1 = require("@autobe/utils");
const path_1 = __importDefault(require("path"));
const tstl_1 = require("tstl");
const validateEmptyCode_1 = require("../../../utils/validateEmptyCode");
const AutoBeTestFunctionProgrammer_1 = require("./AutoBeTestFunctionProgrammer");
var AutoBeTestOperationProgrammer;
(function (AutoBeTestOperationProgrammer) {
/* ----------------------------------------------------------------
WRITERS
---------------------------------------------------------------- */
function writeTemplateCode(scenario) {
return utils_1.StringUtil.trim `
export async function ${scenario.functionName}(
connection: api.IConnection,
): Promise<void> {
...
}
`;
}
AutoBeTestOperationProgrammer.writeTemplateCode = writeTemplateCode;
/* ----------------------------------------------------------------
COMPILERS
---------------------------------------------------------------- */
function compile(props) {
const endpoints = new tstl_1.HashSet(props.procedure.artifacts.document.operations.map((o) => ({
method: o.method,
path: o.path,
})), utils_1.AutoBeOpenApiEndpointComparator.hashCode, utils_1.AutoBeOpenApiEndpointComparator.equals);
for (const authorize of props.procedure.authorizes)
endpoints.insert(authorize.endpoint);
const operations = endpoints
.toJSON()
.map((endpoint) => props.document.operations.find((o) => o.method === endpoint.method && o.path === endpoint.path))
.filter((o) => o !== undefined);
const schemas = Object.assign({}, props.procedure.artifacts.document.components.schemas);
const visit = (x) => {
utils_1.AutoBeOpenApiTypeChecker.visit({
components: props.document.components,
schema: x,
closure: (next) => {
var _a;
if (utils_1.AutoBeOpenApiTypeChecker.isReference(next)) {
const key = next.$ref.split("/").pop();
(_a = schemas[key]) !== null && _a !== void 0 ? _a : (schemas[key] = props.document.components.schemas[key]);
}
},
});
};
for (const op of operations) {
if (op.requestBody)
visit({
$ref: `#/$defs/${op.requestBody.typeName}`,
});
if (op.responseBody)
visit({
$ref: `#/$defs/${op.responseBody.typeName}`,
});
}
return AutoBeTestFunctionProgrammer_1.AutoBeTestFunctionProgrammer.compile({
compiler: props.compiler,
document: {
operations,
components: {
authorizations: props.document.components.authorizations,
schemas,
},
},
function: props.procedure.function,
files: Object.assign(Object.assign({}, Object.fromEntries([
...props.procedure.authorizes,
...props.procedure.prepares,
...props.procedure.generates,
].map((f) => [f.location, f.content]))), { [props.procedure.function.location]: props.procedure.function.content }),
progress: props.progress,
step: props.step,
});
}
AutoBeTestOperationProgrammer.compile = compile;
function replaceImportStatements(props) {
return __awaiter(this, void 0, void 0, function* () {
let code = yield props.compiler.typescript.removeImportStatements(props.content);
const imports = [
...AutoBeTestFunctionProgrammer_1.AutoBeTestFunctionProgrammer.writeImportStatements(props.artifacts.document.components.schemas),
...[...props.prepares, ...props.generates, ...props.authorizes].map((f) => `import { ${f.name} } from "${path_1.default
.relative(path_1.default.dirname(props.location), f.location.replace(".ts", ""))
.replaceAll(path_1.default.sep, "/")}";`),
];
code = [...imports, code].join("\n");
return yield props.compiler.typescript.beautify(code);
});
}
AutoBeTestOperationProgrammer.replaceImportStatements = replaceImportStatements;
/* ----------------------------------------------------------------
VALIDATE
---------------------------------------------------------------- */
function validate(props) {
return (0, validateEmptyCode_1.validateEmptyCode)({
asynchronous: true,
name: props.procedure.function.name,
draft: props.draft,
revise: props.revise,
path: "$input",
});
}
AutoBeTestOperationProgrammer.validate = validate;
})(AutoBeTestOperationProgrammer || (exports.AutoBeTestOperationProgrammer = AutoBeTestOperationProgrammer = {}));
//# sourceMappingURL=AutoBeTestOperationProgrammer.js.map