UNPKG

@autobe/agent

Version:

AI backend server code generator

541 lines 34.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); 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.orchestrateInterfaceSchemaRename = orchestrateInterfaceSchemaRename; const __typia_transform__validateReport = __importStar(require("typia/lib/internal/_validateReport.js")); const openapi_1 = require("@samchon/openapi"); const typia_1 = __importDefault(require("typia")); const uuid_1 = require("uuid"); const assertSchemaModel_1 = require("../../context/assertSchemaModel"); const divideArray_1 = require("../../utils/divideArray"); const executeCachedBatch_1 = require("../../utils/executeCachedBatch"); const transformInterfaceSchemaRenameHistory_1 = require("./histories/transformInterfaceSchemaRenameHistory"); function orchestrateInterfaceSchemaRename(ctx_1, document_1) { return __awaiter(this, arguments, void 0, function* (ctx, document, capacity = 2 /* AutoBeConfigConstant.INTERFACE_CAPACITY */ * 10) { const tableNames = ctx .state() .prisma.result.data.files.map((f) => f.models) .flat() .map((m) => m.name) .filter((m) => m.startsWith("mv_") === false); const entireTypeNames = new Set(); for (let name of Object.keys(document.components.schemas)) { if (name.startsWith("IPage")) name = name.replace("IPage", ""); name = name.split(".")[0]; entireTypeNames.add(name); } const matrix = (0, divideArray_1.divideArray)({ array: Array.from(entireTypeNames), capacity, }); const progress = { total: entireTypeNames.size, completed: 0, }; const refactors = uniqueRefactors((yield (0, executeCachedBatch_1.executeCachedBatch)(ctx, matrix.map((typeNames) => (promptCacheKey) => divideAndConquer(ctx, { tableNames, typeNames, promptCacheKey, progress, })))).flat()); orchestrateInterfaceSchemaRename.rename(document, refactors); }); } (function (orchestrateInterfaceSchemaRename) { orchestrateInterfaceSchemaRename.rename = (document, refactors) => { var _a, _b; // REPLACE RULE const replace = (typeName) => { // exact match const exact = refactors.find((r) => r.from === typeName); if (exact !== undefined) return exact.to; // T.X match const prefix = refactors.find((r) => typeName.startsWith(`${r.from}.`)); if (prefix !== undefined) return typeName.replace(`${prefix.from}.`, `${prefix.to}.`); // IPageT exact match const pageExact = refactors.find((r) => typeName === `IPage${r.from}`); if (pageExact !== undefined) return `IPage${pageExact.to}`; // IPageT.X match const pagePrefix = refactors.find((r) => typeName.startsWith(`IPage${r.from}.`)); if (pagePrefix !== undefined) return typeName.replace(`IPage${pagePrefix.from}.`, `IPage${pagePrefix.to}.`); return null; }; // JSON SCHEMA REFERENCES const $refChangers = new Map(); for (const value of Object.values(document.components.schemas)) openapi_1.OpenApiTypeChecker.visit({ components: document.components, schema: value, closure: (schema) => { if (openapi_1.OpenApiTypeChecker.isReference(schema) === false) return; const x = schema.$ref.split("/").pop(); const y = replace(x); if (y !== null) $refChangers.set(schema, () => { schema.$ref = `#/components/schemas/${y}`; }); }, }); for (const fn of $refChangers.values()) fn(); // COMPONENT SCHEMAS for (const x of Object.keys(document.components.schemas)) { const y = replace(x); if (y !== null) { document.components.schemas[y] = document.components.schemas[x]; delete document.components.schemas[x]; } } // OPERATIONS for (const op of document.operations) { if (op.requestBody) op.requestBody.typeName = (_a = replace(op.requestBody.typeName)) !== null && _a !== void 0 ? _a : op.requestBody.typeName; if (op.responseBody) op.responseBody.typeName = (_b = replace(op.responseBody.typeName)) !== null && _b !== void 0 ? _b : op.responseBody.typeName; } }; })(orchestrateInterfaceSchemaRename || (exports.orchestrateInterfaceSchemaRename = orchestrateInterfaceSchemaRename = {})); const divideAndConquer = (ctx, props) => __awaiter(void 0, void 0, void 0, function* () { try { const pointer = { value: null, }; const { metric, tokenUsage } = yield ctx.conversate(Object.assign({ source: SOURCE, controller: createController(ctx.model, (value) => (pointer.value = value)), enforceFunctionCall: true, promptCacheKey: props.promptCacheKey }, (0, transformInterfaceSchemaRenameHistory_1.transformInterfaceSchemaRenameHistory)(props))); if (pointer.value === null) { props.progress.completed += props.typeNames.length; return []; } pointer.value.refactors = uniqueRefactors(pointer.value.refactors); ctx.dispatch({ type: SOURCE, id: (0, uuid_1.v7)(), refactors: pointer.value.refactors, total: props.progress.total, completed: (props.progress.completed += props.typeNames.length), metric, tokenUsage, created_at: new Date().toISOString(), }); return pointer.value.refactors; } catch (_a) { props.progress.completed += props.typeNames.length; return []; } }); const uniqueRefactors = (refactors) => { // Remove self-references (A->A) refactors = refactors.filter((r) => r.from !== r.to); // Remove duplicates (keep the first occurrence) refactors = Array.from(new Map(refactors.map((r) => [r.from, r])).values()); // Build adjacency map: from -> to const renameMap = new Map(); for (const r of refactors) { renameMap.set(r.from, r.to); } // Resolve transitive chains: A->B, B->C becomes A->C const resolveChain = (from) => { const visited = new Set(); let current = from; while (renameMap.has(current)) { // Cycle detection: A->B, B->C, C->A if (visited.has(current)) { // Cycle detected, keep the last valid mapping before cycle return current; } visited.add(current); current = renameMap.get(current); } return current; }; // Build final refactor list with resolved chains const resolved = new Map(); for (const from of renameMap.keys()) { const finalTo = resolveChain(from); // Only include if actually changes if (from !== finalTo) { resolved.set(from, { from, to: finalTo, }); } } return Array.from(resolved.values()); }; const createController = (model, build) => { (0, assertSchemaModel_1.assertSchemaModel)(model); const application = collection[model === "chatgpt" ? "chatgpt" : model === "gemini" ? "gemini" : "claude"]; return { protocol: "class", name: SOURCE, application, execute: { rename: (props) => { build(props); }, }, }; }; const collection = { chatgpt: { model: "chatgpt", options: { reference: true, strict: false, separate: null }, functions: [ { name: "rename", parameters: { description: " Properties containing refactoring operations to fix naming\nviolations.\n\n------------------------------\n\nCurrent Type: {@link IAutoBeInterfaceSchemaRenameApplication.IProps}", type: "object", properties: { refactors: { description: "List of refactoring operations to rename incorrectly named DTO types.\n\nEach refactor specifies:\n\n- `from`: The current INCORRECT type name (e.g., \"ISale\", \"IBbsComment\")\n- `to`: The CORRECT type name with all components preserved (e.g.,\n \"IShoppingSale\", \"IBbsArticleComment\")\n\nIMPORTANT: Only include type names that violate the naming rules. If a\ntype name correctly preserves all components from the table name, do NOT\ninclude it in the refactors list.\n\nThe orchestrator will automatically handle:\n\n- Renaming the base type (e.g., ISale \u2192 IShoppingSale)\n- Renaming all variants (e.g., ISale.ICreate \u2192 IShoppingSale.ICreate)\n- Renaming page types (e.g., IPageISale \u2192 IPageIShoppingSale)\n- Updating all $ref references throughout the OpenAPI document", type: "array", items: { $ref: "#/$defs/AutoBeInterfaceSchemaRefactor" } } }, required: [ "refactors" ], additionalProperties: false, $defs: { AutoBeInterfaceSchemaRefactor: { description: "Represents a DTO type name refactoring operation.\n\nThis interface defines a single rename operation to fix DTO type names that\nviolate the critical naming convention: ALL words from the Prisma table name\nMUST be preserved in the DTO type name.\n\nCommon violations detected:\n- Service prefix omission: `shopping_sales` \u2192 `ISale` (should be `IShoppingSale`)\n- Intermediate word omission: `bbs_article_comments` \u2192 `IBbsComment` (should be `IBbsArticleComment`)\n- Multiple words omitted: `shopping_order_good_refunds` \u2192 `IShoppingRefund` (should be `IShoppingOrderGoodRefund`)\n\nThe orchestrator automatically handles renaming all related variants:\n- Base type: `ISale` \u2192 `IShoppingSale`\n- Create variant: `ISale.ICreate` \u2192 `IShoppingSale.ICreate`\n- Update variant: `ISale.IUpdate` \u2192 `IShoppingSale.IUpdate`\n- Summary variant: `ISale.ISummary` \u2192 `IShoppingSale.ISummary`\n- Page type: `IPageISale` \u2192 `IPageIShoppingSale`", type: "object", properties: { from: { description: "Current INCORRECT type name that violates naming rules.\n\nThis is the base type name (without variant suffixes or IPage prefix)\nthat omits service prefixes or intermediate components from the\nPrisma table name.", type: "string" }, to: { description: "CORRECT type name with all components preserved.\n\nThis is the proper base type name that preserves ALL words from the\nPrisma table name, converted from snake_case to PascalCase with \"I\" prefix.", type: "string" } }, required: [ "from", "to" ] } } }, description: "Analyze DTO type names and identify naming violations.\n\nThis method examines existing DTO type names to detect violations of the\nCRITICAL naming rule: ALL words from the Prisma table name MUST be\npreserved in the DTO type name. Omitting intermediate words breaks\ntype-to-table traceability and causes system failures.\n\nThe method receives a list of Prisma table names and current DTO type\nnames, then identifies which type names incorrectly omit service prefixes\nor intermediate components from their corresponding table names.", validate: (() => { const _io0 = input => Array.isArray(input.refactors) && input.refactors.every(elem => "object" === typeof elem && null !== elem && _io1(elem)); const _io1 = input => "string" === typeof input.from && "string" === typeof input.to; const _vo0 = (input, _path, _exceptionable = true) => [(Array.isArray(input.refactors) || _report(_exceptionable, { path: _path + ".refactors", expected: "Array<AutoBeInterfaceSchemaRefactor>", value: input.refactors })) && input.refactors.map((elem, _index2) => ("object" === typeof elem && null !== elem || _report(_exceptionable, { path: _path + ".refactors[" + _index2 + "]", expected: "AutoBeInterfaceSchemaRefactor", value: elem })) && _vo1(elem, _path + ".refactors[" + _index2 + "]", true && _exceptionable) || _report(_exceptionable, { path: _path + ".refactors[" + _index2 + "]", expected: "AutoBeInterfaceSchemaRefactor", value: elem })).every(flag => flag) || _report(_exceptionable, { path: _path + ".refactors", expected: "Array<AutoBeInterfaceSchemaRefactor>", value: input.refactors })].every(flag => flag); const _vo1 = (input, _path, _exceptionable = true) => ["string" === typeof input.from || _report(_exceptionable, { path: _path + ".from", expected: "string", value: input.from }), "string" === typeof input.to || _report(_exceptionable, { path: _path + ".to", expected: "string", value: input.to })].every(flag => flag); const __is = input => "object" === typeof input && null !== input && _io0(input); let errors; let _report; return input => { if (false === __is(input)) { errors = []; _report = __typia_transform__validateReport._validateReport(errors); ((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, { path: _path + "", expected: "IAutoBeInterfaceSchemaRenameApplication.IProps", value: input })) && _vo0(input, _path + "", true) || _report(true, { path: _path + "", expected: "IAutoBeInterfaceSchemaRenameApplication.IProps", value: input }))(input, "$input", true); const success = 0 === errors.length; return success ? { success, data: input } : { success, errors, data: input }; } return { success: true, data: input }; }; })() } ] }, claude: { model: "claude", options: { reference: true, separate: null }, functions: [ { name: "rename", parameters: { description: " Properties containing refactoring operations to fix naming\nviolations.\n\n------------------------------\n\nCurrent Type: {@link IAutoBeInterfaceSchemaRenameApplication.IProps}", type: "object", properties: { refactors: { description: "List of refactoring operations to rename incorrectly named DTO types.\n\nEach refactor specifies:\n\n- `from`: The current INCORRECT type name (e.g., \"ISale\", \"IBbsComment\")\n- `to`: The CORRECT type name with all components preserved (e.g.,\n \"IShoppingSale\", \"IBbsArticleComment\")\n\nIMPORTANT: Only include type names that violate the naming rules. If a\ntype name correctly preserves all components from the table name, do NOT\ninclude it in the refactors list.\n\nThe orchestrator will automatically handle:\n\n- Renaming the base type (e.g., ISale \u2192 IShoppingSale)\n- Renaming all variants (e.g., ISale.ICreate \u2192 IShoppingSale.ICreate)\n- Renaming page types (e.g., IPageISale \u2192 IPageIShoppingSale)\n- Updating all $ref references throughout the OpenAPI document", type: "array", items: { $ref: "#/$defs/AutoBeInterfaceSchemaRefactor" } } }, required: [ "refactors" ], additionalProperties: false, $defs: { AutoBeInterfaceSchemaRefactor: { description: "Represents a DTO type name refactoring operation.\n\nThis interface defines a single rename operation to fix DTO type names that\nviolate the critical naming convention: ALL words from the Prisma table name\nMUST be preserved in the DTO type name.\n\nCommon violations detected:\n- Service prefix omission: `shopping_sales` \u2192 `ISale` (should be `IShoppingSale`)\n- Intermediate word omission: `bbs_article_comments` \u2192 `IBbsComment` (should be `IBbsArticleComment`)\n- Multiple words omitted: `shopping_order_good_refunds` \u2192 `IShoppingRefund` (should be `IShoppingOrderGoodRefund`)\n\nThe orchestrator automatically handles renaming all related variants:\n- Base type: `ISale` \u2192 `IShoppingSale`\n- Create variant: `ISale.ICreate` \u2192 `IShoppingSale.ICreate`\n- Update variant: `ISale.IUpdate` \u2192 `IShoppingSale.IUpdate`\n- Summary variant: `ISale.ISummary` \u2192 `IShoppingSale.ISummary`\n- Page type: `IPageISale` \u2192 `IPageIShoppingSale`", type: "object", properties: { from: { description: "Current INCORRECT type name that violates naming rules.\n\nThis is the base type name (without variant suffixes or IPage prefix)\nthat omits service prefixes or intermediate components from the\nPrisma table name.", type: "string" }, to: { description: "CORRECT type name with all components preserved.\n\nThis is the proper base type name that preserves ALL words from the\nPrisma table name, converted from snake_case to PascalCase with \"I\" prefix.", type: "string" } }, required: [ "from", "to" ] } } }, description: "Analyze DTO type names and identify naming violations.\n\nThis method examines existing DTO type names to detect violations of the\nCRITICAL naming rule: ALL words from the Prisma table name MUST be\npreserved in the DTO type name. Omitting intermediate words breaks\ntype-to-table traceability and causes system failures.\n\nThe method receives a list of Prisma table names and current DTO type\nnames, then identifies which type names incorrectly omit service prefixes\nor intermediate components from their corresponding table names.", validate: (() => { const _io0 = input => Array.isArray(input.refactors) && input.refactors.every(elem => "object" === typeof elem && null !== elem && _io1(elem)); const _io1 = input => "string" === typeof input.from && "string" === typeof input.to; const _vo0 = (input, _path, _exceptionable = true) => [(Array.isArray(input.refactors) || _report(_exceptionable, { path: _path + ".refactors", expected: "Array<AutoBeInterfaceSchemaRefactor>", value: input.refactors })) && input.refactors.map((elem, _index2) => ("object" === typeof elem && null !== elem || _report(_exceptionable, { path: _path + ".refactors[" + _index2 + "]", expected: "AutoBeInterfaceSchemaRefactor", value: elem })) && _vo1(elem, _path + ".refactors[" + _index2 + "]", true && _exceptionable) || _report(_exceptionable, { path: _path + ".refactors[" + _index2 + "]", expected: "AutoBeInterfaceSchemaRefactor", value: elem })).every(flag => flag) || _report(_exceptionable, { path: _path + ".refactors", expected: "Array<AutoBeInterfaceSchemaRefactor>", value: input.refactors })].every(flag => flag); const _vo1 = (input, _path, _exceptionable = true) => ["string" === typeof input.from || _report(_exceptionable, { path: _path + ".from", expected: "string", value: input.from }), "string" === typeof input.to || _report(_exceptionable, { path: _path + ".to", expected: "string", value: input.to })].every(flag => flag); const __is = input => "object" === typeof input && null !== input && _io0(input); let errors; let _report; return input => { if (false === __is(input)) { errors = []; _report = __typia_transform__validateReport._validateReport(errors); ((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, { path: _path + "", expected: "IAutoBeInterfaceSchemaRenameApplication.IProps", value: input })) && _vo0(input, _path + "", true) || _report(true, { path: _path + "", expected: "IAutoBeInterfaceSchemaRenameApplication.IProps", value: input }))(input, "$input", true); const success = 0 === errors.length; return success ? { success, data: input } : { success, errors, data: input }; } return { success: true, data: input }; }; })() } ] }, gemini: { model: "gemini", options: { reference: true, separate: null }, functions: [ { name: "rename", parameters: { description: " Properties containing refactoring operations to fix naming\nviolations.\n\n------------------------------\n\nCurrent Type: {@link IAutoBeInterfaceSchemaRenameApplication.IProps}", type: "object", properties: { refactors: { description: "List of refactoring operations to rename incorrectly named DTO types.\n\nEach refactor specifies:\n\n- `from`: The current INCORRECT type name (e.g., \"ISale\", \"IBbsComment\")\n- `to`: The CORRECT type name with all components preserved (e.g.,\n \"IShoppingSale\", \"IBbsArticleComment\")\n\nIMPORTANT: Only include type names that violate the naming rules. If a\ntype name correctly preserves all components from the table name, do NOT\ninclude it in the refactors list.\n\nThe orchestrator will automatically handle:\n\n- Renaming the base type (e.g., ISale \u2192 IShoppingSale)\n- Renaming all variants (e.g., ISale.ICreate \u2192 IShoppingSale.ICreate)\n- Renaming page types (e.g., IPageISale \u2192 IPageIShoppingSale)\n- Updating all $ref references throughout the OpenAPI document", type: "array", items: { $ref: "#/$defs/AutoBeInterfaceSchemaRefactor" } } }, required: [ "refactors" ], additionalProperties: false, $defs: { AutoBeInterfaceSchemaRefactor: { description: "Represents a DTO type name refactoring operation.\n\nThis interface defines a single rename operation to fix DTO type names that\nviolate the critical naming convention: ALL words from the Prisma table name\nMUST be preserved in the DTO type name.\n\nCommon violations detected:\n- Service prefix omission: `shopping_sales` \u2192 `ISale` (should be `IShoppingSale`)\n- Intermediate word omission: `bbs_article_comments` \u2192 `IBbsComment` (should be `IBbsArticleComment`)\n- Multiple words omitted: `shopping_order_good_refunds` \u2192 `IShoppingRefund` (should be `IShoppingOrderGoodRefund`)\n\nThe orchestrator automatically handles renaming all related variants:\n- Base type: `ISale` \u2192 `IShoppingSale`\n- Create variant: `ISale.ICreate` \u2192 `IShoppingSale.ICreate`\n- Update variant: `ISale.IUpdate` \u2192 `IShoppingSale.IUpdate`\n- Summary variant: `ISale.ISummary` \u2192 `IShoppingSale.ISummary`\n- Page type: `IPageISale` \u2192 `IPageIShoppingSale`", type: "object", properties: { from: { description: "Current INCORRECT type name that violates naming rules.\n\nThis is the base type name (without variant suffixes or IPage prefix)\nthat omits service prefixes or intermediate components from the\nPrisma table name.", type: "string" }, to: { description: "CORRECT type name with all components preserved.\n\nThis is the proper base type name that preserves ALL words from the\nPrisma table name, converted from snake_case to PascalCase with \"I\" prefix.", type: "string" } }, required: [ "from", "to" ] } } }, description: "Analyze DTO type names and identify naming violations.\n\nThis method examines existing DTO type names to detect violations of the\nCRITICAL naming rule: ALL words from the Prisma table name MUST be\npreserved in the DTO type name. Omitting intermediate words breaks\ntype-to-table traceability and causes system failures.\n\nThe method receives a list of Prisma table names and current DTO type\nnames, then identifies which type names incorrectly omit service prefixes\nor intermediate components from their corresponding table names.", validate: (() => { const _io0 = input => Array.isArray(input.refactors) && input.refactors.every(elem => "object" === typeof elem && null !== elem && _io1(elem)); const _io1 = input => "string" === typeof input.from && "string" === typeof input.to; const _vo0 = (input, _path, _exceptionable = true) => [(Array.isArray(input.refactors) || _report(_exceptionable, { path: _path + ".refactors", expected: "Array<AutoBeInterfaceSchemaRefactor>", value: input.refactors })) && input.refactors.map((elem, _index2) => ("object" === typeof elem && null !== elem || _report(_exceptionable, { path: _path + ".refactors[" + _index2 + "]", expected: "AutoBeInterfaceSchemaRefactor", value: elem })) && _vo1(elem, _path + ".refactors[" + _index2 + "]", true && _exceptionable) || _report(_exceptionable, { path: _path + ".refactors[" + _index2 + "]", expected: "AutoBeInterfaceSchemaRefactor", value: elem })).every(flag => flag) || _report(_exceptionable, { path: _path + ".refactors", expected: "Array<AutoBeInterfaceSchemaRefactor>", value: input.refactors })].every(flag => flag); const _vo1 = (input, _path, _exceptionable = true) => ["string" === typeof input.from || _report(_exceptionable, { path: _path + ".from", expected: "string", value: input.from }), "string" === typeof input.to || _report(_exceptionable, { path: _path + ".to", expected: "string", value: input.to })].every(flag => flag); const __is = input => "object" === typeof input && null !== input && _io0(input); let errors; let _report; return input => { if (false === __is(input)) { errors = []; _report = __typia_transform__validateReport._validateReport(errors); ((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, { path: _path + "", expected: "IAutoBeInterfaceSchemaRenameApplication.IProps", value: input })) && _vo0(input, _path + "", true) || _report(true, { path: _path + "", expected: "IAutoBeInterfaceSchemaRenameApplication.IProps", value: input }))(input, "$input", true); const success = 0 === errors.length; return success ? { success, data: input } : { success, errors, data: input }; } return { success: true, data: input }; }; })() } ] }, }; const SOURCE = "interfaceSchemaRename"; //# sourceMappingURL=orchestrateInterfaceSchemaRename.js.map