@zspk/ts-esm-generator
Version:
Генератор определений типов TypeScript для пользовательских элементов управления UI5, реализованных в TypeScript.
539 lines • 33.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTypeNode = exports.createMethodSignature = exports.createMethodDeclaration = exports.createConstructorBlock = exports.addLineBreakBefore = exports.generateEventTypeAliases = exports.generateEventParameterInterfaces = exports.generateSettingsInterface = exports.generateEventWithGenericsCompatibilityModule = exports.collectMetadataClass = exports.expandDefaultKey = void 0;
const typescript_1 = __importDefault(require("typescript"));
const astToString_1 = __importDefault(require("./astToString"));
const loglevel_1 = __importDefault(require("loglevel"));
const jsdocGenerator_1 = require("./jsdocGenerator");
const factory = typescript_1.default.factory;
const PropertyBindingInfoType = "sap.ui.base.ManagedObject.PropertyBindingInfo";
const AggregationBindingInfoType = "sap.ui.base.ManagedObject.AggregationBindingInfo";
function createParameterDeclaration(name, type, questionToken) {
return factory.createParameterDeclaration(undefined, undefined, name, questionToken, type);
}
function generateSettingsInterface(classInfo, managedObject, requiredImports, knownGlobals) {
if (!managedObject.settingsTypeName)
return;
const typeElements = [];
// properties
for (const n in classInfo.properties) {
const property = classInfo.properties[n];
if (property.visibility === "hidden")
continue;
const actualType = createTypeNode(property.type, requiredImports, knownGlobals);
const bindingType = createTypeNode(PropertyBindingInfoType, requiredImports, knownGlobals);
const propertyTypes = [actualType, bindingType];
if (property.type !== "string") {
propertyTypes.push(createBindingStringTypeNode());
}
const propertySignature = factory.createPropertySignature(undefined, property.name, factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), factory.createUnionTypeNode(propertyTypes));
(0, jsdocGenerator_1.createJSDoc)(propertySignature, property);
typeElements.push(propertySignature);
}
// aggregations
for (const n in classInfo.aggregations) {
const aggregation = classInfo.aggregations[n];
if (aggregation.visibility !== "hidden") {
let aggregationInitializationTypeNode;
const aggregationSingleTypeNode = createTypeNode(aggregation.type, requiredImports, knownGlobals);
if (aggregation.cardinality === "0..1") {
if (Array.isArray(aggregation.altTypes) && aggregation.altTypes.length > 0) {
const typesToUse = [
aggregationSingleTypeNode,
createTypeNode(
// add first altType as alternative - only ONE is supported by UI5
aggregation.altTypes[0], requiredImports, knownGlobals)
];
typesToUse.push(createTypeNode(
// altType can be bound via property binding
PropertyBindingInfoType, requiredImports, knownGlobals));
if (aggregation.altTypes[0] !== "string") {
// if "string" is not anyway allowed, also allow binding strings
typesToUse.push(createBindingStringTypeNode());
}
aggregationInitializationTypeNode = factory.createUnionTypeNode(typesToUse);
}
else {
// no altTypes
aggregationInitializationTypeNode = aggregationSingleTypeNode;
}
}
else {
// 0..n
aggregationInitializationTypeNode = factory.createUnionTypeNode([
factory.createArrayTypeNode(aggregationSingleTypeNode),
aggregationSingleTypeNode,
createTypeNode(
// 3. an aggregation binding info object
AggregationBindingInfoType, requiredImports, knownGlobals),
createBindingStringTypeNode() // 4. a binding string
]);
}
const propertySignature = factory.createPropertySignature(undefined, aggregation.name, factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), aggregationInitializationTypeNode);
(0, jsdocGenerator_1.createJSDoc)(propertySignature, aggregation);
typeElements.push(propertySignature);
}
}
// associations
for (const n in classInfo.associations) {
const association = classInfo.associations[n];
if (association.visibility !== "hidden") {
let associationInitializationTypeNode;
const associationSingleTypeNode = createTypeNode(association.type, requiredImports, knownGlobals);
// allow object and string (=ID) and in case of multiple associations also arrays
if (association.cardinality === "0..1") {
associationInitializationTypeNode = factory.createUnionTypeNode([associationSingleTypeNode, factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword)]);
}
else {
// 0..n
associationInitializationTypeNode = factory.createUnionTypeNode([
associationSingleTypeNode,
factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword),
factory.createArrayTypeNode(factory.createUnionTypeNode([associationSingleTypeNode, factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword)]))
]);
}
const propertySignature = factory.createPropertySignature(undefined, association.name, factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), associationInitializationTypeNode);
(0, jsdocGenerator_1.createJSDoc)(propertySignature, association);
factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), typeElements.push(propertySignature);
}
}
// events
for (const n in classInfo.events) {
const event = classInfo.events[n];
if (event.visibility !== "hidden") {
const propertySignature = factory.createPropertySignature(undefined, event.name, factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), factory.createFunctionTypeNode([], [createParameterDeclaration("event", factory.createTypeReferenceNode(managedObject.eventTypeAliases[event.name].statement.name))], factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.VoidKeyword)));
(0, jsdocGenerator_1.createJSDoc)(propertySignature, event);
typeElements.push(propertySignature);
}
}
let ownSettingsTypeName = "T" + managedObject.className + "Settings";
if (managedObject.settingsTypeName.endsWith(ownSettingsTypeName)) {
// name clash
ownSettingsTypeName += "_1"; // append suffix to make the name unique
}
const localName = uniqueImport(managedObject.settingsTypeName, requiredImports, knownGlobals);
if (!managedObject.isConstructorDecorated) {
printConstructorBlockWarning(ownSettingsTypeName, managedObject.className);
}
const settingsSuperclass = factory.createIdentifier(localName);
const settingsSuperclassAsExpression = factory.createExpressionWithTypeArguments(settingsSuperclass, undefined);
const heritageClauses = [factory.createHeritageClause(typescript_1.default.SyntaxKind.ExtendsKeyword, [settingsSuperclassAsExpression])];
return factory.createInterfaceDeclaration([factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], ownSettingsTypeName, undefined, heritageClauses, typeElements);
}
exports.generateSettingsInterface = generateSettingsInterface;
// creates a template string that matches all binding strings
function createBindingStringTypeNode() {
return factory.createTemplateLiteralType(factory.createTemplateHead("{", "{"), [
factory.createTemplateLiteralTypeSpan(factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), factory.createTemplateTail("}", "}"))
]);
}
function printConstructorBlockWarning(settingsTypeName, className) {
const constructorBlock = createConstructorBlock(settingsTypeName);
loglevel_1.default.warn(`NOTE: Для класса ${className} нужно добавить конструктор:\n===== BEGIN =====\n${(0, astToString_1.default)(constructorBlock)}====== END ======`);
}
function createMethodDeclaration(modifiers, name, typeParameters, parameters, type) {
return factory.createMethodDeclaration(modifiers, undefined, name, undefined, typeParameters, parameters, type, undefined);
}
exports.createMethodDeclaration = createMethodDeclaration;
function createMethodSignature(modifiers, name, typeParameters, parameters, type) {
return factory.createMethodSignature(modifiers, name, undefined, typeParameters, parameters, type);
}
exports.createMethodSignature = createMethodSignature;
function createTypeNode(typeName, requiredImports, knownGlobals, typeArguments = []) {
if (!typeName || typeof typeName !== "string")
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword);
switch (typeName) {
case "this":
return factory.createThisTypeNode();
case "void":
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.VoidKeyword);
case "string":
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword);
case "string[]":
return factory.createArrayTypeNode(factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword));
case "int":
case "float":
case "number":
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword);
case "int[]":
case "float[]":
case "number[]":
return factory.createArrayTypeNode(factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword));
case "boolean":
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.BooleanKeyword);
case "boolean[]":
return factory.createArrayTypeNode(factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.BooleanKeyword));
case "object":
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword);
case "object[]":
return factory.createArrayTypeNode(factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword));
case "function":
return factory.createTypeReferenceNode(factory.createIdentifier("Function"));
case "function[]":
return factory.createArrayTypeNode(factory.createTypeReferenceNode(factory.createIdentifier("Function")));
case "any":
return factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword);
case "any[]": // a kinda strange type, but to be complete, let's cover it
return factory.createArrayTypeNode(factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword));
default:
// UI5 type
if (typeName.endsWith("[]")) {
// rare case: an array thereof, something like "sap.ui.core.CSSSize[]"
return factory.createArrayTypeNode(factory.createTypeReferenceNode(uniqueImport(typeName.slice(0, -2).trim(), requiredImports, knownGlobals), typeArguments));
}
else {
// common case: something like "sap.ui.core.CSSSize"
return factory.createTypeReferenceNode(uniqueImport(typeName, requiredImports, knownGlobals), typeArguments);
}
}
}
exports.createTypeNode = createTypeNode;
function uniqueImport(typeName, requiredImports, knownGlobals) {
if (typeName === requiredImports.currentClassName) {
return typeName;
}
// нужен обработчик на стандатрные типы
if (typeName.match(/^(Record|Map)(<.+,.+>)$/) || typeName === "Date") {
return typeName;
}
let moduleName;
let localName;
const matches = typeName.match(/"([^"]+)"\.(.*)/);
if (matches) {
moduleName = matches[1];
localName = matches[2];
}
else {
const parts = typeName.split(".");
if (parts.length === 1) {
if (typeName.startsWith('"') && typeName.endsWith('"')) {
// Литерал
return typeName;
}
}
localName = parts[parts.length - 1];
moduleName = parts.join("/");
}
let moduleInfo = knownGlobals[typeName];
if (!moduleInfo) {
moduleInfo = {
exportName: localName,
moduleName: moduleName
};
}
else {
moduleName = moduleInfo.moduleName;
if (!moduleInfo.exportName) {
moduleInfo.localName = localName;
}
}
if (moduleInfo.exportName) {
localName = moduleInfo.exportName;
}
const imports = requiredImports[localName];
if (!imports) {
requiredImports[localName] = {
isDefault: !moduleInfo.exportName,
globalModule: moduleInfo.moduleName
};
}
return localName;
}
function addLineBreakBefore(node, count = 1) {
for (let i = 0; i < count; i++) {
typescript_1.default.addSyntheticLeadingComment(node, typescript_1.default.SyntaxKind.SingleLineCommentTrivia, "");
}
}
exports.addLineBreakBefore = addLineBreakBefore;
function createConstructorBlock(settingsTypeName) {
const nodes = [];
// This creates:
// constructor(id?: string | $SampleControlSettings);
nodes.push(factory.createConstructorDeclaration(undefined, [
createParameterDeclaration("idOrSettings", factory.createUnionTypeNode([factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), factory.createTypeReferenceNode(settingsTypeName)]), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], undefined));
// This creates:
// constructor(id?: string, settings?: $SampleControlSettings);
nodes.push(factory.createConstructorDeclaration(undefined, [
createParameterDeclaration("id", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken)),
createParameterDeclaration("settings", factory.createTypeReferenceNode(settingsTypeName), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], undefined));
// This creates:
// constructor(id?: string, settings?: $SampleControlSettings) {
// super(id, settings);
// }
nodes.push(factory.createConstructorDeclaration(undefined, [
createParameterDeclaration("id", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken)),
createParameterDeclaration("settings", factory.createTypeReferenceNode(settingsTypeName), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], factory.createBlock([
factory.createExpressionStatement(factory.createCallExpression(factory.createSuper(), undefined, [factory.createIdentifier("id"), factory.createIdentifier("settings")]))
])));
return nodes;
}
exports.createConstructorBlock = createConstructorBlock;
function makeEventParametersName(className, eventName) {
const capitalizedEventName = eventName.charAt(0).toUpperCase() + eventName.slice(1);
return {
eventParametersName: `${className}${capitalizedEventName}EventParameters`,
eventTypealiasName: `${className}${capitalizedEventName}EventType`
};
}
function generateEventWithGenericsCompatibilityModule(className, requiredImports, knownGlobals) {
const typeParameters = [
factory.createTypeParameterDeclaration(undefined, factory.createIdentifier("T"), factory.createTypeReferenceNode(factory.createIdentifier("Record"), [
factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword),
factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword)
]), factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword))
];
const methods = [
factory.createMethodSignature(undefined, factory.createIdentifier("constructor"), undefined, undefined, [
createParameterDeclaration(factory.createIdentifier("id"), factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword)),
createParameterDeclaration(factory.createIdentifier("source"), createTypeNode("sap.ui.base.EventProvider", requiredImports, knownGlobals)),
createParameterDeclaration(factory.createIdentifier("parameters"), factory.createTypeReferenceNode(factory.createIdentifier("T"), undefined))
], undefined),
factory.createMethodSignature(undefined, factory.createIdentifier("getParameters"), undefined, undefined, [], factory.createTypeReferenceNode(factory.createIdentifier("T"), undefined)),
factory.createMethodSignature(undefined, factory.createIdentifier("getParameter"), undefined, [
factory.createTypeParameterDeclaration(undefined, factory.createIdentifier("ParamName"), factory.createTypeOperatorNode(typescript_1.default.SyntaxKind.KeyOfKeyword, factory.createTypeReferenceNode(factory.createIdentifier("T"), undefined)), undefined)
], [createParameterDeclaration(factory.createIdentifier("name"), factory.createTypeReferenceNode(factory.createIdentifier("ParamName"), undefined))], factory.createIndexedAccessTypeNode(factory.createTypeReferenceNode(factory.createIdentifier("T"), undefined), factory.createTypeReferenceNode(factory.createIdentifier("ParamName"), undefined)))
];
uniqueImport("sap.ui.base.Event", requiredImports, knownGlobals);
return factory.createInterfaceDeclaration([factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(`${className}Event`), typeParameters, [factory.createHeritageClause(typescript_1.default.SyntaxKind.ExtendsKeyword, [factory.createExpressionWithTypeArguments(factory.createIdentifier("Event"), undefined)])], methods);
}
exports.generateEventWithGenericsCompatibilityModule = generateEventWithGenericsCompatibilityModule;
function generateEventParameterInterfaces(events, className, requiredImports, knownGlobals) {
const eventParameterInterfaces = {};
for (const eventName in events) {
const event = events[eventName];
if (event.visibility !== "hidden") {
const properties = [];
for (const parameterName in event.parameters) {
const parameter = event.parameters[parameterName];
if (parameter) {
const property = factory.createPropertySignature(undefined, factory.createIdentifier(parameterName), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), createTypeNode(parameter.type || "string", requiredImports, knownGlobals));
properties.push(property);
}
}
// ESLint фикс
if (properties.length === 0) {
properties.push(factory.createPropertySignature(undefined, factory.createIdentifier("unused"), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.UndefinedKeyword)));
}
const interfc = factory.createInterfaceDeclaration([factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(makeEventParametersName(className, eventName).eventParametersName), undefined, undefined, properties);
eventParameterInterfaces[eventName] = {
jsDoc: event,
statement: interfc
};
}
}
return eventParameterInterfaces;
}
exports.generateEventParameterInterfaces = generateEventParameterInterfaces;
function generateEventTypeAliases(events, managedObject) {
const eventTypeAliases = {};
for (const eventName in managedObject.eventParameterInterfaces) {
const typeNode = factory.createTypeReferenceNode(managedObject.eventParameterInterfaces[eventName].statement.name.text);
const typeAlias = factory.createTypeAliasDeclaration([factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(makeEventParametersName(managedObject.className, eventName).eventTypealiasName), undefined, factory.createTypeReferenceNode(`${managedObject.className}Event`, [typeNode]));
eventTypeAliases[eventName] = {
jsDoc: events[eventName],
statement: typeAlias
};
}
return eventTypeAliases;
}
exports.generateEventTypeAliases = generateEventTypeAliases;
const pluralRegEx = /(children|ies|ves|oes|ses|ches|shes|xes|s)$/i;
const mSingular = {
children: -3,
ies: "y",
ves: "f",
oes: -2,
ses: -2,
ches: -2,
shes: -2,
xes: -2,
s: -1
};
function collectMetadataClass(metadata, managedObject, imports, knownGlobals, createMethod) {
if (!metadata)
return;
function upper(n) {
return n.slice(0, 1).toUpperCase() + n.slice(1);
}
function each(map, defaultKey, callback) {
if (!map)
return;
for (const n in map) {
if (Object.prototype.hasOwnProperty.call(map, n)) {
const settings = expandDefaultKey(map[n], defaultKey);
if (settings == null) {
loglevel_1.default.warn(`Некорректные метаданные для ${n} ('${map[n].name}')`);
continue;
}
callback(n, settings, map[n]);
}
}
}
const modifiers = [];
if (managedObject.isIncludeMethodModifier === true) {
modifiers.push(factory.createModifier(typescript_1.default.SyntaxKind.PublicKeyword));
}
each(metadata.properties, "type", (n, settings) => {
if (settings.visibility === "hidden")
return;
const methodName = upper(n);
const propertyType = settings.type || "string";
const setterParameters = createParameterDeclaration(n, createTypeNode(propertyType, imports, knownGlobals));
const setter = createMethod(modifiers, "set" + methodName, [], [setterParameters], factory.createThisTypeNode());
const getter = createMethod(modifiers, "get" + methodName, [], [], createTypeNode(propertyType, imports, knownGlobals));
managedObject.methods.push(getter, setter);
(0, jsdocGenerator_1.createJSDoc)(getter, settings);
(0, jsdocGenerator_1.createJSDoc)(setter, settings);
if (!!settings.bindable) {
const bindParameters = createParameterDeclaration("bindingInfo", createTypeNode(PropertyBindingInfoType, imports, knownGlobals));
const bind = createMethod(modifiers, "bind" + methodName, [], [bindParameters], factory.createThisTypeNode());
const unbind = createMethod(modifiers, "unbind" + methodName, [], [], factory.createThisTypeNode());
managedObject.methods.push(bind, unbind);
(0, jsdocGenerator_1.createJSDoc)(bind, settings);
(0, jsdocGenerator_1.createJSDoc)(unbind, settings);
}
});
each(metadata.aggregations, "type", (n, settings) => {
if (settings.visibility === "hidden")
return;
const methodName = upper(n);
const singularMethodName = upper(settings.singularName || guessSingularName(n));
const aggregationType = settings.type || "sap.ui.core.Control";
const typeNode = createTypeNode(aggregationType, imports, knownGlobals);
const parameterType = createParameterDeclaration(n, typeNode);
settings.multiple = !!settings.multiple;
if (settings.multiple === true) {
const getter = createMethod(modifiers, "get" + methodName, [], [], factory.createArrayTypeNode(typeNode));
const add = createMethod(modifiers, "add" + singularMethodName, [], [parameterType], factory.createThisTypeNode());
const insert = createMethod(modifiers, "insert" + singularMethodName, [], [parameterType, createParameterDeclaration("index", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword))], factory.createThisTypeNode());
const remove = createMethod(modifiers, "remove" + singularMethodName, [], [
createParameterDeclaration(n, factory.createUnionTypeNode([
factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword),
factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword),
typeNode
]))
], factory.createThisTypeNode());
const removeAll = createMethod(modifiers, "removeAll" + methodName, [], [], factory.createArrayTypeNode(typeNode));
const indexOf = createMethod(modifiers, "indexOf" + singularMethodName, [], [createParameterDeclaration(n, typeNode)], factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword));
const destroy = createMethod(modifiers, "destroy" + methodName, [], [], factory.createThisTypeNode());
managedObject.methods.push(getter, add, insert, remove, removeAll, indexOf, destroy);
(0, jsdocGenerator_1.createJSDoc)(getter, settings);
(0, jsdocGenerator_1.createJSDoc)(add, settings);
(0, jsdocGenerator_1.createJSDoc)(insert, settings);
(0, jsdocGenerator_1.createJSDoc)(remove, settings);
(0, jsdocGenerator_1.createJSDoc)(removeAll, settings);
(0, jsdocGenerator_1.createJSDoc)(indexOf, settings);
(0, jsdocGenerator_1.createJSDoc)(destroy, settings);
}
else {
const getter = createMethod(modifiers, "get" + methodName, [], [], typeNode);
const setter = createMethod(modifiers, "set" + methodName, [], [parameterType], factory.createThisTypeNode());
managedObject.methods.push(getter, setter);
(0, jsdocGenerator_1.createJSDoc)(getter, settings);
(0, jsdocGenerator_1.createJSDoc)(setter, settings);
}
if (!!settings.bindable) {
const bindParameters = createParameterDeclaration("bindingInfo", createTypeNode(AggregationBindingInfoType, imports, knownGlobals));
const bind = createMethod(modifiers, "bind" + methodName, [], [bindParameters], factory.createThisTypeNode());
const unbind = createMethod(modifiers, "unbind" + methodName, [], [], factory.createThisTypeNode());
managedObject.methods.push(bind, unbind);
(0, jsdocGenerator_1.createJSDoc)(bind, settings);
(0, jsdocGenerator_1.createJSDoc)(unbind, settings);
}
});
each(metadata.associations, "type", (n, settings) => {
if (settings.visibility === "hidden")
return;
const methodName = upper(n);
const singularMethodName = upper(settings.singularName || guessSingularName(n));
const associationType = settings.type || "sap.ui.core.Control";
const typeNode = createTypeNode(associationType, imports, knownGlobals);
const stringTypeNode = factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword);
const numberTypeNode = factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword);
settings.multiple = !!settings.multiple;
if (settings.multiple === true) {
const getter = createMethod(modifiers, "get" + methodName, [], [], factory.createArrayTypeNode(stringTypeNode));
const add = createMethod(modifiers, "add" + singularMethodName, [], [createParameterDeclaration(n, factory.createUnionTypeNode([stringTypeNode, typeNode]))], factory.createThisTypeNode());
const remove = createMethod(modifiers, "remove" + singularMethodName, [], [createParameterDeclaration(n, factory.createUnionTypeNode([numberTypeNode, stringTypeNode, typeNode]))], stringTypeNode);
const removeAll = createMethod(modifiers, "removeAll" + methodName, [], [], factory.createArrayTypeNode(stringTypeNode));
managedObject.methods.push(getter, add, remove, removeAll);
(0, jsdocGenerator_1.createJSDoc)(getter, settings);
(0, jsdocGenerator_1.createJSDoc)(add, settings);
(0, jsdocGenerator_1.createJSDoc)(remove, settings);
(0, jsdocGenerator_1.createJSDoc)(removeAll, settings);
}
else {
const getter = createMethod(modifiers, "get" + methodName, [], [], stringTypeNode);
const setter = createMethod(modifiers, "set" + methodName, [], [createParameterDeclaration(n, factory.createUnionTypeNode([stringTypeNode, typeNode]), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))], factory.createThisTypeNode());
managedObject.methods.push(getter, setter);
(0, jsdocGenerator_1.createJSDoc)(getter, settings);
(0, jsdocGenerator_1.createJSDoc)(setter, settings);
}
});
each(metadata.events, null, (n, settings) => {
const methodName = upper(n);
const callback = factory.createFunctionTypeNode([], [createParameterDeclaration("event", factory.createTypeReferenceNode(managedObject.eventTypeAliases[n].statement.name))], factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.VoidKeyword));
const callbackWithData = factory.createFunctionTypeNode([], [
createParameterDeclaration("event", factory.createTypeReferenceNode(managedObject.eventTypeAliases[n].statement.name)),
createParameterDeclaration("data", factory.createTypeReferenceNode("CustomDataType"))
], factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.VoidKeyword));
const returnValue = settings.allowPreventDefault ? factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.BooleanKeyword) : factory.createThisTypeNode();
const attach = createMethod(modifiers, "attach" + methodName, [], [
createParameterDeclaration("fn", callback),
createParameterDeclaration("listener", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], factory.createThisTypeNode());
const attach2 = createMethod(modifiers, "attach" + methodName, [factory.createTypeParameterDeclaration(undefined, "CustomDataType", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword))], [
createParameterDeclaration("data", factory.createTypeReferenceNode("CustomDataType")),
createParameterDeclaration("fn", callbackWithData),
createParameterDeclaration("listener", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], factory.createThisTypeNode());
const detach = createMethod(modifiers, "detach" + methodName, [], [
createParameterDeclaration("fn", callback),
createParameterDeclaration("listener", factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.ObjectKeyword), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], factory.createThisTypeNode());
const fire = createMethod(modifiers, "fire" + methodName, [], [
createParameterDeclaration("parameters", factory.createTypeReferenceNode(managedObject.eventParameterInterfaces[n].statement.name), factory.createToken(typescript_1.default.SyntaxKind.QuestionToken))
], returnValue);
managedObject.methods.push(attach, attach2, detach, fire);
(0, jsdocGenerator_1.createJSDoc)(attach, settings);
(0, jsdocGenerator_1.createJSDoc)(attach2, settings);
(0, jsdocGenerator_1.createJSDoc)(detach, settings);
(0, jsdocGenerator_1.createJSDoc)(fire, settings);
// each<SpecialSetting>(settings.parameters, "type", (pName: string, pSettings) => {
// info.parameters[pName] = {
// name: pName,
// doc: settings.doc,
// since: settings.since,
// deprecation: settings.deprecation,
// experimental: settings.experimental,
// type: pSettings && pSettings.type ? pSettings.type : ""
// };
// });
});
}
exports.collectMetadataClass = collectMetadataClass;
function expandDefaultKey(node, defaultKey) {
if (node != null) {
// if, instead of an object literal only a string is given and there is a defaultKey, then wrap the literal
if (typeof node === "string" && defaultKey != null) {
const result = {};
result[defaultKey] = node;
return result;
}
}
return node;
}
exports.expandDefaultKey = expandDefaultKey;
function guessSingularName(sPluralName) {
return sPluralName.replace(pluralRegEx, ($, plural) => {
const vRepl = mSingular[plural.toLowerCase()];
return typeof vRepl === "string" ? vRepl : plural.slice(0, vRepl);
});
}
//# sourceMappingURL=astGenerationHelper.js.map