artmapper
Version:
Spring Boot clone for Node.js with TypeScript/JavaScript - JPA-like ORM, Lombok decorators, dependency injection, and MySQL support
211 lines • 7.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.REQUIRED_ARGS_CONSTRUCTOR_METADATA_KEY = exports.ALL_ARGS_CONSTRUCTOR_METADATA_KEY = exports.NO_ARGS_CONSTRUCTOR_METADATA_KEY = exports.EQUALS_AND_HASH_CODE_METADATA_KEY = exports.TO_STRING_METADATA_KEY = exports.BUILDER_METADATA_KEY = exports.SETTER_METADATA_KEY = exports.GETTER_METADATA_KEY = exports.DATA_METADATA_KEY = void 0;
exports.Data = Data;
exports.Getter = Getter;
exports.Setter = Setter;
exports.Builder = Builder;
exports.ToString = ToString;
exports.EqualsAndHashCode = EqualsAndHashCode;
exports.NoArgsConstructor = NoArgsConstructor;
exports.AllArgsConstructor = AllArgsConstructor;
exports.RequiredArgsConstructor = RequiredArgsConstructor;
require("reflect-metadata");
exports.DATA_METADATA_KEY = Symbol('data');
exports.GETTER_METADATA_KEY = Symbol('getter');
exports.SETTER_METADATA_KEY = Symbol('setter');
exports.BUILDER_METADATA_KEY = Symbol('builder');
exports.TO_STRING_METADATA_KEY = Symbol('toString');
exports.EQUALS_AND_HASH_CODE_METADATA_KEY = Symbol('equalsAndHashCode');
exports.NO_ARGS_CONSTRUCTOR_METADATA_KEY = Symbol('noArgsConstructor');
exports.ALL_ARGS_CONSTRUCTOR_METADATA_KEY = Symbol('allArgsConstructor');
exports.REQUIRED_ARGS_CONSTRUCTOR_METADATA_KEY = Symbol('requiredArgsConstructor');
/**
* Lombok @Data equivalent - generates getters, setters, toString, equals, hashCode, and constructors
*/
function Data() {
return function (target) {
Reflect.defineMetadata(exports.DATA_METADATA_KEY, true, target);
// Apply all Lombok features
generateGetters(target);
generateSetters(target);
generateToString(target);
generateEqualsAndHashCode(target);
generateNoArgsConstructor(target);
};
}
/**
* Lombok @Getter - generates getter methods for all properties
*/
function Getter(accessLevel) {
return function (target) {
Reflect.defineMetadata(exports.GETTER_METADATA_KEY, { accessLevel: accessLevel || 'PUBLIC' }, target);
generateGetters(target);
};
}
/**
* Lombok @Setter - generates setter methods for all properties
*/
function Setter(accessLevel) {
return function (target) {
Reflect.defineMetadata(exports.SETTER_METADATA_KEY, { accessLevel: accessLevel || 'PUBLIC' }, target);
generateSetters(target);
};
}
/**
* Lombok @Builder - generates a builder pattern
*/
function Builder() {
return function (target) {
Reflect.defineMetadata(exports.BUILDER_METADATA_KEY, true, target);
generateBuilder(target);
};
}
/**
* Lombok @ToString - generates toString method
*/
function ToString(includeFieldNames) {
return function (target) {
Reflect.defineMetadata(exports.TO_STRING_METADATA_KEY, { includeFieldNames: includeFieldNames !== false }, target);
generateToString(target);
};
}
/**
* Lombok @EqualsAndHashCode - generates equals and hashCode methods
*/
function EqualsAndHashCode() {
return function (target) {
Reflect.defineMetadata(exports.EQUALS_AND_HASH_CODE_METADATA_KEY, true, target);
generateEqualsAndHashCode(target);
};
}
/**
* Lombok @NoArgsConstructor - generates no-args constructor
*/
function NoArgsConstructor() {
return function (target) {
Reflect.defineMetadata(exports.NO_ARGS_CONSTRUCTOR_METADATA_KEY, true, target);
generateNoArgsConstructor(target);
};
}
/**
* Lombok @AllArgsConstructor - generates constructor with all fields
*/
function AllArgsConstructor() {
return function (target) {
Reflect.defineMetadata(exports.ALL_ARGS_CONSTRUCTOR_METADATA_KEY, true, target);
generateAllArgsConstructor(target);
};
}
/**
* Lombok @RequiredArgsConstructor - generates constructor with required fields
*/
function RequiredArgsConstructor() {
return function (target) {
Reflect.defineMetadata(exports.REQUIRED_ARGS_CONSTRUCTOR_METADATA_KEY, true, target);
generateRequiredArgsConstructor(target);
};
}
// Helper functions to generate code
function generateGetters(target) {
const prototype = target.prototype;
const propertyNames = Object.getOwnPropertyNames(prototype).filter(name => name !== 'constructor' && typeof prototype[name] !== 'function');
propertyNames.forEach(prop => {
const getterName = `get${capitalize(prop)}`;
if (!prototype[getterName]) {
Object.defineProperty(prototype, getterName, {
get: function () {
return this[prop];
},
enumerable: false,
configurable: true,
});
}
});
}
function generateSetters(target) {
const prototype = target.prototype;
const propertyNames = Object.getOwnPropertyNames(prototype).filter(name => name !== 'constructor' && typeof prototype[name] !== 'function');
propertyNames.forEach(prop => {
const setterName = `set${capitalize(prop)}`;
if (!prototype[setterName]) {
prototype[setterName] = function (value) {
this[prop] = value;
return this;
};
}
});
}
function generateToString(target) {
const prototype = target.prototype;
if (!prototype.toString || prototype.toString === Object.prototype.toString) {
prototype.toString = function () {
const props = Object.keys(this).map(key => `${key}=${this[key]}`);
return `${target.name}(${props.join(', ')})`;
};
}
}
function generateEqualsAndHashCode(target) {
const prototype = target.prototype;
if (!prototype.equals) {
prototype.equals = function (other) {
if (this === other)
return true;
if (!other || this.constructor !== other.constructor)
return false;
const keys = Object.keys(this);
return keys.every(key => this[key] === other[key]);
};
}
if (!prototype.hashCode) {
prototype.hashCode = function () {
const keys = Object.keys(this).sort();
let hash = 0;
keys.forEach(key => {
const value = this[key];
const valueHash = value === null ? 0 : typeof value === 'object' ? JSON.stringify(value).length : String(value).length;
hash = ((hash << 5) - hash) + valueHash;
hash = hash & hash;
});
return hash;
};
}
}
function generateNoArgsConstructor(target) {
// TypeScript classes already have no-args constructor by default
// This is mainly for metadata tracking
}
function generateAllArgsConstructor(target) {
// In TypeScript, we can't dynamically modify constructors
// This would need to be handled at compile time or through factory methods
}
function generateRequiredArgsConstructor(target) {
// Similar to AllArgsConstructor, would need compile-time transformation
}
function generateBuilder(target) {
const prototype = target.prototype;
if (!prototype.builder) {
target.builder = function () {
return new BuilderClass(target);
};
}
}
class BuilderClass {
constructor(targetClass) {
this.targetClass = targetClass;
this.data = {};
}
set(key, value) {
this.data[key] = value;
return this;
}
build() {
const instance = Object.create(this.targetClass.prototype);
Object.assign(instance, this.data);
return instance;
}
}
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
//# sourceMappingURL=lombok.js.map