grunt-generate-view-model
Version:
Global task for generation view model
148 lines • 6.38 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMapperImports = void 0;
const path = __importStar(require("path"));
const import_1 = require("../../../../tasks/model/import");
const enums_1 = require("../../../../tasks/pipes/enums");
const pipes_1 = require("../../../../tasks/pipes");
const classmeta_1 = require("../../../../tasks/pipes/classmeta");
const primitiveTypes = ['string', 'number', 'object', 'any', 'null', 'undefined', 'boolean'];
const getTransformerImportsForField = (fieldMetadata) => {
const imports = [];
const isFieldHasTransformerFunctions = fieldMetadata.fieldConvertFunction && !fieldMetadata.ignoredInView;
if (!isFieldHasTransformerFunctions) {
return imports;
}
[enums_1.FuncDirection.toView, enums_1.FuncDirection.fromView].forEach(direction => {
const directionInfo = fieldMetadata.fieldConvertFunction[direction];
const isDirectionTypeIsPrimitive = !directionInfo || directionInfo.isPrimitive;
if (isDirectionTypeIsPrimitive) {
return;
}
const mainClass = directionInfo.function.split('.')[0];
imports.push(mainClass);
});
return imports;
};
const getMapperFieldImportForField = (fieldMetadata) => {
const imports = [];
if (fieldMetadata.needGeneratedMapper) {
imports.push(`${fieldMetadata.type}Mapper`);
}
return imports;
};
const getMapperImportsForFields = (fields) => {
const imports = [];
fields.forEach(field => {
imports.push(...getTransformerImportsForField(field));
imports.push(...getMapperFieldImportForField(field));
});
return imports;
};
const getContextTypeImports = (meta, possibleImports) => {
const createImport = (type) => {
if (!type || primitiveTypes.includes(type)) {
return null;
}
const contextImport = new import_1.Import();
contextImport.forMapper = true;
contextImport.type = type;
const possibleImport = possibleImports.find(i => i.clauses.find(cl => cl === type));
if (!possibleImport) {
return;
}
const toPath = possibleImport.absPathNode.join('/');
const fromPath = meta.mapperPath;
const arrayPath = path.relative(fromPath, toPath).split('\\');
const arrayPathLength = arrayPath.length - 1;
arrayPath[arrayPathLength] = pipes_1.downFirstLetter(arrayPath[arrayPathLength]);
contextImport.path = arrayPath.join('/');
if (contextImport.path.indexOf('./') < 0 && !possibleImport.isNodeModule) {
contextImport.path = `./${contextImport.path}`;
}
return contextImport;
};
const { classMetadata } = meta;
const imports = [];
const fromViewImport = createImport(classMetadata.contextType.fromView.value);
if (fromViewImport) {
imports.push(fromViewImport);
}
const toViewImport = createImport(classMetadata.contextType.toView.value);
if (toViewImport) {
imports.push(toViewImport);
}
return imports;
};
const getMapperImports = (fileMetadata, imports) => {
let mapperImports = [];
const resultMapperImports = [];
mapperImports = getMapperImportsForFields(fileMetadata.classMetadata.fields);
mapperImports.forEach(mapperImport => {
const importNode = imports.find(nodeImport => {
return nodeImport.clauses.includes(mapperImport);
});
if (!importNode) {
return;
}
const imp = new import_1.Import();
imp.forMapper = true;
imp.type = mapperImport;
const toPath = importNode.absPathNode.join('/');
const fromPath = fileMetadata.mapperPath; // fileMetadata.filename.split('.ts').join('');
const arrayPath = path.relative(fromPath, toPath).split('\\');
const arrayPathLength = arrayPath.length - 1;
arrayPath[arrayPathLength] = pipes_1.downFirstLetter(arrayPath[arrayPathLength]);
imp.path = arrayPath.join('/');
if (imp.path.indexOf('./') < 0 && !importNode.isNodeModule) {
imp.path = `./${imp.path}`;
}
resultMapperImports.push(imp);
});
// @@
//
// получение импортов для сгенерированных мапперов
//
const generatedImports = classmeta_1.getDependencyImportsForImports(resultMapperImports, fileMetadata);
generatedImports.forEach(generatedImport => {
const isMapperImportExistInImports = fileMetadata.imports.find(_import => _import.type.includes(generatedImport.type));
if (isMapperImportExistInImports) {
return;
}
resultMapperImports.push(generatedImport);
});
// @@
//
// Получение путей для типов контекста в трансформерах
//
const contextTypeImports = getContextTypeImports(fileMetadata, imports);
contextTypeImports.forEach(generatedImport => {
const isMapperImportExistInImports = fileMetadata.imports.find(_import => _import.type.includes(generatedImport.type));
if (isMapperImportExistInImports) {
return;
}
resultMapperImports.push(generatedImport);
});
return resultMapperImports;
};
exports.getMapperImports = getMapperImports;
//# sourceMappingURL=index.js.map