class-constructor
Version:
Tool to implement builder pattern that actually uses class constructor with ease
2 lines • 3.86 kB
JavaScript
var u=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var y=(e,t)=>{for(var a in t)u(e,a,{get:t[a],enumerable:!0})},h=(e,t,a,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of M(t))!m.call(e,s)&&s!==a&&u(e,s,{get:()=>t[s],enumerable:!(r=T(t,s))||r.enumerable});return e};var B=e=>h(u({},"__esModule",{value:!0}),e);var j={};y(j,{BuilderAccessors:()=>P,ParametrizedBuilder:()=>d,toBuilderMethod:()=>x});module.exports=B(j);var c=class{_builderAccessorsMetadata=new Map;_ancestorsMap=new Map;_initializedAccessorsClasses=new Set;_cachedBuilderObjects=new Map;addBuilderAccessorsMetadata(t){this._builderAccessorsMetadata.has(t.target)||this._builderAccessorsMetadata.set(t.target,new Map),this._builderAccessorsMetadata.get(t.target).set(t.propertyKey,t)}findBuilderAccessorsMetadata(t,a){return this.findMetadata(this._builderAccessorsMetadata,t,a)}getBuilderAccessors(t){return this.getMetadata(this._builderAccessorsMetadata,t)}clear(){this._ancestorsMap.clear(),this._builderAccessorsMetadata.clear(),this._initializedAccessorsClasses.clear(),this._cachedBuilderObjects.clear()}getMetadata(t,a){let r=t.get(a),s=[];r&&(s=Array.from(r.values()));let o=[];for(let n of this.getAncestors(a)??[]){let i=t.get(n);i&&o.push(...Array.from(i.values()))}return o.concat(s)}findMetadata(t,a,r){let s=t.get(a);if(s){let o=s.get(r);if(o)return o}for(let o of this.getAncestors(a)??[]){let n=t.get(o);if(n){let i=n.get(r);if(i)return i}}}getAncestors(t){var a,r,s;if(!t)return[];if(!this._ancestorsMap.has(t)){let o=[];for(let n=(a=t.prototype)!=null&&a.constructor?Object.getPrototypeOf((r=t.prototype)==null?void 0:r.constructor):void 0;typeof(n==null?void 0:n.prototype)<"u";n=Object.getPrototypeOf((s=n.prototype)==null?void 0:s.constructor))o.push(n);this._ancestorsMap.set(t,o)}return this._ancestorsMap.get(t)}addInitializedAccessorsClass(t){this._initializedAccessorsClasses.add(t)}hasInitializedAccessors(t){return this._initializedAccessorsClasses.has(t)}getCachedBuilderObject(t){return this._cachedBuilderObjects.get(t)}setCachedBuilderObject(t,a){this._cachedBuilderObjects.set(t,a)}};function g(){if(typeof globalThis<"u")return globalThis;if(typeof global<"u")return global;if(typeof window<"u")return window;if(typeof self<"u")return self;throw new Error("Failed to get global object")}var p=g(),C=Symbol.for("typescriptClassBuilderMetadataStorage");p[C]||(p[C]=new c);var l=()=>p[C];function b(e){let t=Object.getOwnPropertyNames(e);return new Set(t.filter(a=>{let r=Object.getOwnPropertyDescriptor(e,a);return r&&!r.get&&!r.set}))}function f(e){return e.startsWith("_")?e.slice(1):e}function A(e,t){let a=l();b(t).forEach(s=>{!!a.findBuilderAccessorsMetadata(e,s)||a.addBuilderAccessorsMetadata({target:e,propertyKey:s,get:n=>n[s],set:(n,i)=>{n[s]=i}})}),a.addInitializedAccessorsClass(e)}function O(e){let a=l().getBuilderAccessors(e),r={build:function(){return this.instance}};return a.sort((s,o)=>{let n=s.propertyKey.toString().startsWith("_"),i=o.propertyKey.toString().startsWith("_");return n&&!i?1:!n&&i?-1:0}),a.forEach(s=>{let o=s.propertyKey.toString(),n=o;o.startsWith("_")&&!(f(o)in r)&&(n=f(o)),r[n]=function(...i){let z=i[0];return i.length===0?s.get(this.instance):(s.set(this.instance,z),this)}}),Object.freeze(r)}function d(e,t){let a=l(),r=new e(...t);a.hasInitializedAccessors(e)||A(e,r);let s=a.getCachedBuilderObject(e)||O(e);return a.setCachedBuilderObject(e,s),Object.setPrototypeOf({instance:r},s)}function P(e,t){return function(a,r){let s=l(),o={get:e,set:t};s.addBuilderAccessorsMetadata({target:a.constructor,propertyKey:r,...o})}}function x(e){return{withOptionals:()=>(...t)=>d(e,t),classAsOptionals:()=>(...t)=>d(e,t)}}0&&(module.exports={BuilderAccessors,ParametrizedBuilder,toBuilderMethod});
//# sourceMappingURL=index.js.map