@vkontakte/api-schema-typescript-generator
Version:
VK API TypeScript generator
216 lines (215 loc) • 8.35 kB
JavaScript
;
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 (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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolvePrimitiveTypesArray = exports.formatArrayDepth = exports.joinOneOfValues = exports.joinCommentLines = exports.transformPatternPropertyName = exports.areQuotesNeededForProperty = exports.isPatternProperty = exports.getSectionFromObjectName = exports.getObjectNameByRef = exports.getEnumPropertyName = exports.getInterfaceName = exports.getMethodSection = exports.isMethodNeeded = exports.prepareMethodsPattern = exports.writeFile = exports.prepareBuildDirectory = exports.readJSONFile = void 0;
const fs_1 = __importStar(require("fs"));
const path_1 = __importDefault(require("path"));
const utils_1 = require("./utils");
const constants_1 = require("./constants");
const log_1 = require("./log");
const prettier_1 = __importDefault(require("prettier"));
async function readJSONFile(path) {
const content = await fs_1.promises.readFile(path, 'utf-8');
return JSON.parse(content);
}
exports.readJSONFile = readJSONFile;
function deleteDirectoryRecursive(directoryPath) {
if (fs_1.default.existsSync(directoryPath)) {
fs_1.default.readdirSync(directoryPath).forEach((file) => {
const currentPath = path_1.default.join(directoryPath, file);
if (fs_1.default.lstatSync(currentPath).isDirectory()) {
deleteDirectoryRecursive(currentPath);
}
else {
fs_1.default.unlinkSync(currentPath);
}
});
fs_1.default.rmdirSync(directoryPath);
}
}
function prepareBuildDirectory(directoryPath) {
deleteDirectoryRecursive(directoryPath);
fs_1.default.mkdirSync(directoryPath, { recursive: true });
}
exports.prepareBuildDirectory = prepareBuildDirectory;
function writeFile(filePath, code, insertAutoGeneratedNote = true) {
if (insertAutoGeneratedNote) {
code =
[
'/**',
" * This is auto-generated file, don't modify this file manually",
' */',
// '/* eslint-disable max-len */',
// '/* eslint-disable @typescript-eslint/no-empty-interface */',
].join(constants_1.newLineChar) +
constants_1.newLineChar.repeat(2) +
code.trim();
}
code = prettier_1.default.format(code, {
semi: true,
singleQuote: true,
trailingComma: 'all',
quoteProps: 'consistent',
parser: 'typescript',
});
fs_1.default.mkdirSync(filePath.replace(path_1.default.basename(filePath), ''), {
recursive: true,
});
fs_1.default.writeFileSync(filePath, code.trim() + constants_1.newLineChar);
}
exports.writeFile = writeFile;
function prepareMethodsPattern(methodsPattern) {
if (!methodsPattern) {
(0, log_1.consoleLogErrorAndExit)('methodsPattern is empty. Pass "*" to generate all methods');
}
return methodsPattern
.replace(/\s+/g, '')
.split(',')
.reduce((acc, pattern) => {
acc[pattern] = true;
return acc;
}, {});
}
exports.prepareMethodsPattern = prepareMethodsPattern;
function isMethodNeeded(methodsPattern, method) {
const [methodSection, methodName] = method.split('.');
return Object.keys(methodsPattern).some((pattern) => {
const [patternSection, patternMethod] = pattern.split('.');
if (patternSection === '*') {
return true;
}
if (patternSection === methodSection) {
return patternMethod === '*' || patternMethod === methodName;
}
return false;
});
}
exports.isMethodNeeded = isMethodNeeded;
function getMethodSection(methodName) {
return methodName.split('.')[0];
}
exports.getMethodSection = getMethodSection;
function getInterfaceName(name) {
name = name
.replace(/\.|(\s+)|_/g, ' ')
.split(' ')
.map((v) => (0, utils_1.capitalizeFirstLetter)(v))
.join('');
return (0, utils_1.capitalizeFirstLetter)(name);
}
exports.getInterfaceName = getInterfaceName;
function getEnumPropertyName(name) {
return name.toUpperCase().replace(/\s+/g, '_').replace(/-/g, '_').replace(/\./g, '_');
}
exports.getEnumPropertyName = getEnumPropertyName;
function getObjectNameByRef(ref) {
const parts = ref.split('/');
return parts[parts.length - 1];
}
exports.getObjectNameByRef = getObjectNameByRef;
function getSectionFromObjectName(name) {
return name.split('_')[0];
}
exports.getSectionFromObjectName = getSectionFromObjectName;
function isPatternProperty(name) {
return name.startsWith('[key: ');
}
exports.isPatternProperty = isPatternProperty;
function areQuotesNeededForProperty(name) {
name = String(name);
if (isPatternProperty(name)) {
return false;
}
if (/[&-]/.test(name)) {
return true;
}
return !(/^[a-z_]([a-z0-9_])+$/i.test(name) || /^[a-z_]/i.test(name));
}
exports.areQuotesNeededForProperty = areQuotesNeededForProperty;
function transformPatternPropertyName(name) {
if (name === '^[0-9]+$') {
return '[key: number]';
}
return '[key: string] /* default pattern property name */';
}
exports.transformPatternPropertyName = transformPatternPropertyName;
function joinCommentLines(indent = 2, ...description) {
let descriptionLines = [];
description.forEach((entry) => {
if (typeof entry === 'string') {
descriptionLines = [
...descriptionLines,
...(0, utils_1.trimArray)((entry || '').trim().split(constants_1.newLineChar)),
];
}
else if (Array.isArray(entry)) {
descriptionLines = [...descriptionLines, ...entry];
}
});
descriptionLines = (0, utils_1.trimArray)(descriptionLines);
if (!descriptionLines.length) {
return [];
}
const indentSpaces = constants_1.spaceChar.repeat(indent);
return [
`${indentSpaces}/**`,
...descriptionLines.map((line) => {
return indentSpaces + ' ' + `* ${line}`.trim();
}),
`${indentSpaces} */`,
];
}
exports.joinCommentLines = joinCommentLines;
function joinOneOfValues(values, primitive) {
const joined = values.join(' | ');
if (joined.length > 120) {
const spacesCount = primitive ? 2 : 4;
return values.join(` |${constants_1.newLineChar}${constants_1.spaceChar.repeat(spacesCount)}`);
}
else {
return joined;
}
}
exports.joinOneOfValues = joinOneOfValues;
function formatArrayDepth(value, depth) {
if (value.endsWith("'") || value.includes('|')) {
return `Array<${value}>` + '[]'.repeat(depth - 1); // Need decrement depth value because of Array<T> has its own depth
}
else {
return value + '[]'.repeat(depth);
}
}
exports.formatArrayDepth = formatArrayDepth;
function resolvePrimitiveTypesArray(types) {
const isEveryTypePrimitive = types.every((type) => !!constants_1.primitiveTypes[type]);
if (isEveryTypePrimitive) {
return types.map((type) => constants_1.primitiveTypes[type]).join(' | ');
}
return null;
}
exports.resolvePrimitiveTypesArray = resolvePrimitiveTypesArray;