From e9dcb4f09321b64de75066242cbf5e9049007837 Mon Sep 17 00:00:00 2001 From: hb432 Date: Mon, 15 Jun 2020 11:06:22 -0400 Subject: [PATCH] accessors v2: electric boolagoo --- README.md | 3 +++ index.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ index.min.js | 2 +- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fdabdba..59edbab 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,9 @@ Converts the input `string` into a [UUID](https://docs.oracle.com/javase/10/docs ### `framework.values(object)` An alias for `Object.values(object)`. +### `framework.wrapper(object)` +Adds nashorn-style accessors to the input `object`. These accessors themselves implement `framework.wrapper`, meaning any accessed property will also have accessors, and so on. + # Polyfills ### `atob(), btoa()` ```javascript diff --git a/index.js b/index.js index 73368d0..82159bf 100644 --- a/index.js +++ b/index.js @@ -260,6 +260,54 @@ }, values: (object) => { return Object.values(object); + }, + wrapper: (object) => { + if (object === null || typeof object !== 'object') { + return object; + } else { + const output = { instance: object }; + framework.entries(object).forEach((entry) => { + let index = undefined; + entry.key.startsWith('is') && entry.key[2] && (index = 2); + entry.key.startsWith('get') && entry.key[3] && (index = 3); + if (index) { + let key = entry.key.slice(index); + if (key.length) { + let camel = framework.lower(key[0]) + key.slice(1); + if (!framework.keys(object).includes(camel)) { + try { + entry.value(); + Object.defineProperty(output, camel, { + get () { + return framework.wrapper(entry.value()); + }, + set (value) { + return object[`set${key}`] && object[`set${key}`](value); + } + }); + } catch (error) {} + } + } + } else { + Object.defineProperty(output, entry.key, { + get () { + return framework.wrapper(entry.value); + } + }); + } + }); + const array = framework.array(object); + framework.keys(array).forEach((index) => { + if (!framework.keys(output).includes(index)) { + Object.defineProperty(output, index, { + get () { + return framework.wrapper(array[index]); + } + }); + } + }); + return output; + } } }; diff --git a/index.min.js b/index.min.js index 70c42a6..897a69f 100644 --- a/index.min.js +++ b/index.min.js @@ -1 +1 @@ -!function(){const tasks=[],framework={array:object=>{const output=[];if("number"==typeof object.length){if(object.length>0){let index=0;for(;output.length{output.push(entry)}):"function"==typeof object.forEachRemaining&&object.forEachRemaining(entry=>{output.push(entry)});return output},base:{characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:string=>{let index=0,result="";for(;index>6&3,e=63&c;b?c||(e=64):d=e=64,result+=framework.base.characters.charAt(a>>2&63),result+=framework.base.characters.charAt((3&a)<<4|b>>4&15),result+=framework.base.characters.charAt(d),result+=framework.base.characters.charAt(e)}return result},decode:string=>{let index=0,result="";for(;index>2&15,f=(3&c)<<6|63&framework.base.characters.indexOf(string.charAt(index++));result+=String.fromCharCode((63&a)<<2|b>>4&3),result+=e?String.fromCharCode(e):"",result+=f?String.fromCharCode(f):""}return result}},camel:(string,separator)=>{const pascal=framework.pascal(string,separator);return framework.lower(pascal[0])+pascal.slice(1)},clamp:(number,min,max)=>numbermax?max:number,collect:(...array)=>{const output=new java.util.ArrayList;return array.forEach(entry=>{output.add(entry)}),output},define:(object,consumer)=>{consumer||(consumer=entry=>({get:()=>entry.value,set:value=>{entry.value=value}}));const output={};return framework.entries(object).forEach(entry=>{const info=consumer(entry);info&&Object.defineProperty(output,entry.key,{get(){if(info.get)return info.get()},set(value){info.set&&info.set(value)}})}),output},entries:object=>framework.keys(object).map(key=>({key:key,value:object[key]})),extend:(object,...objects)=>Object.assign(object,...objects),flat:array=>array.filter(entry=>entry),interval:(script,period)=>{const state={iteration:null},loop=()=>{try{script()}catch(error){console.error(error)}state.iteration=framework.timeout(loop,period)};state.iteration=framework.timeout(loop,period);const output={cancel:()=>state.iteration.cancel()};return tasks.push(output),output},key:(object,value)=>framework.keys(object)[framework.values(object).indexOf(value)],keys:object=>Object.keys(object),lower:string=>string.toLowerCase(),match:(object,filter)=>{switch(typeof filter){case"undefined":return!0;case"function":return filter(object);case"object":switch(framework.type(filter)){case"Array":return filter.map(entry=>framework.match(object,entry)).includes(!0);case"Object":return!framework.keys(filter).map(key=>framework.match(object[key],filter[key])).includes(!1);default:return object===filter}default:return object===filter}},mirror:options=>{options||(options={});const mirror=framework.extend(options.array||[],{add:options.add||(()=>{}),remove:options.remove||(()=>{}),clear:options.clear||(()=>{})});return{get:()=>mirror,set:value=>{mirror.clear(),value.forEach(mirror.add)}}},object:(array,consumer)=>(consumer||(consumer=(entry,index)=>({[entry.key||index]:entry.value||entry})),framework.extend({},...framework.flat(framework.array(array).map(consumer)))),pascal:(string,separator)=>string.split(separator).map(chunk=>framework.upper(chunk[0])+framework.lower(chunk.slice(1))).join(""),simplify:(...context)=>{let output=null;const object=context[0];switch(framework.type(object)){case"Array":output=[];for(let entry of object)context.includes(entry)||output.push(framework.simplify(entry,...context));output=framework.flat(output),output.length||(output=null);break;case"Object":output={};for(let key of framework.keys(object))context.includes(object[key])||(output[key]=framework.simplify(object[key],...context));output=framework.strain(output),framework.keys(output).length||(output=null);break;default:output=object}return output},splice:(string,separator,...index)=>string.split(separator).slice(...index).join(separator),strain:(object,consumer)=>(consumer||(consumer=entry=>entry.value),framework.object(framework.entries(object).filter(consumer))),timeout:(script,period)=>{const state={cancel:!1},unit=java.util.concurrent.TimeUnit.MILLISECONDS,runnable=new(Java.extend(Java.type("java.lang.Runnable")))({run:()=>state.cancel||script()});java.util.concurrent.CompletableFuture.delayedExecutor(period,unit).execute(runnable);const output={cancel:()=>state.cancel=!0};return tasks.push(output),output},type:object=>{const type=toString.apply(object).split(" ")[1].slice(0,-1);return"Object"===type?object.constructor.name:type},upper:string=>string.toUpperCase(),uuid:string=>string?java.util.UUID.fromString(string):java.util.UUID.randomUUID(),values:object=>Object.values(object)};core.event("org.bukkit.event.server.PluginDisableEvent",event=>{event.getPlugin()===core.plugin&&tasks.forEach(task=>task.cancel())}),core.export(framework)}(); \ No newline at end of file +!function(){const tasks=[],framework={array:object=>{const output=[];if("number"==typeof object.length){if(object.length>0){let index=0;for(;output.length{output.push(entry)}):"function"==typeof object.forEachRemaining&&object.forEachRemaining(entry=>{output.push(entry)});return output},base:{characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:string=>{let index=0,result="";for(;index>6&3,e=63&c;b?c||(e=64):d=e=64,result+=framework.base.characters.charAt(a>>2&63),result+=framework.base.characters.charAt((3&a)<<4|b>>4&15),result+=framework.base.characters.charAt(d),result+=framework.base.characters.charAt(e)}return result},decode:string=>{let index=0,result="";for(;index>2&15,f=(3&c)<<6|63&framework.base.characters.indexOf(string.charAt(index++));result+=String.fromCharCode((63&a)<<2|b>>4&3),result+=e?String.fromCharCode(e):"",result+=f?String.fromCharCode(f):""}return result}},camel:(string,separator)=>{const pascal=framework.pascal(string,separator);return framework.lower(pascal[0])+pascal.slice(1)},clamp:(number,min,max)=>numbermax?max:number,collect:(...array)=>{const output=new java.util.ArrayList;return array.forEach(entry=>{output.add(entry)}),output},define:(object,consumer)=>{consumer||(consumer=entry=>({get:()=>entry.value,set:value=>{entry.value=value}}));const output={};return framework.entries(object).forEach(entry=>{const info=consumer(entry);info&&Object.defineProperty(output,entry.key,{get(){if(info.get)return info.get()},set(value){info.set&&info.set(value)}})}),output},entries:object=>framework.keys(object).map(key=>({key:key,value:object[key]})),extend:(object,...objects)=>Object.assign(object,...objects),flat:array=>array.filter(entry=>entry),interval:(script,period)=>{const state={iteration:null},loop=()=>{try{script()}catch(error){console.error(error)}state.iteration=framework.timeout(loop,period)};state.iteration=framework.timeout(loop,period);const output={cancel:()=>state.iteration.cancel()};return tasks.push(output),output},key:(object,value)=>framework.keys(object)[framework.values(object).indexOf(value)],keys:object=>Object.keys(object),lower:string=>string.toLowerCase(),match:(object,filter)=>{switch(typeof filter){case"undefined":return!0;case"function":return filter(object);case"object":switch(framework.type(filter)){case"Array":return filter.map(entry=>framework.match(object,entry)).includes(!0);case"Object":return!framework.keys(filter).map(key=>framework.match(object[key],filter[key])).includes(!1);default:return object===filter}default:return object===filter}},mirror:options=>{options||(options={});const mirror=framework.extend(options.array||[],{add:options.add||(()=>{}),remove:options.remove||(()=>{}),clear:options.clear||(()=>{})});return{get:()=>mirror,set:value=>{mirror.clear(),value.forEach(mirror.add)}}},object:(array,consumer)=>(consumer||(consumer=(entry,index)=>({[entry.key||index]:entry.value||entry})),framework.extend({},...framework.flat(framework.array(array).map(consumer)))),pascal:(string,separator)=>string.split(separator).map(chunk=>framework.upper(chunk[0])+framework.lower(chunk.slice(1))).join(""),simplify:(...context)=>{let output=null;const object=context[0];switch(framework.type(object)){case"Array":output=[];for(let entry of object)context.includes(entry)||output.push(framework.simplify(entry,...context));output=framework.flat(output),output.length||(output=null);break;case"Object":output={};for(let key of framework.keys(object))context.includes(object[key])||(output[key]=framework.simplify(object[key],...context));output=framework.strain(output),framework.keys(output).length||(output=null);break;default:output=object}return output},splice:(string,separator,...index)=>string.split(separator).slice(...index).join(separator),strain:(object,consumer)=>(consumer||(consumer=entry=>entry.value),framework.object(framework.entries(object).filter(consumer))),timeout:(script,period)=>{const state={cancel:!1},unit=java.util.concurrent.TimeUnit.MILLISECONDS,runnable=new(Java.extend(Java.type("java.lang.Runnable")))({run:()=>state.cancel||script()});java.util.concurrent.CompletableFuture.delayedExecutor(period,unit).execute(runnable);const output={cancel:()=>state.cancel=!0};return tasks.push(output),output},type:object=>{const type=toString.apply(object).split(" ")[1].slice(0,-1);return"Object"===type?object.constructor.name:type},upper:string=>string.toUpperCase(),uuid:string=>string?java.util.UUID.fromString(string):java.util.UUID.randomUUID(),values:object=>Object.values(object),wrapper:object=>{if(null===object||"object"!=typeof object)return object;{const output={instance:object};framework.entries(object).forEach(entry=>{let index=void 0;if(entry.key.startsWith("is")&&entry.key[2]&&(index=2),entry.key.startsWith("get")&&entry.key[3]&&(index=3),index){let key=entry.key.slice(index);if(key.length){let camel=framework.lower(key[0])+key.slice(1);if(!framework.keys(object).includes(camel))try{entry.value(),Object.defineProperty(output,camel,{get:()=>framework.wrapper(entry.value()),set:value=>object[`set${key}`]&&object[`set${key}`](value)})}catch(error){}}}else Object.defineProperty(output,entry.key,{get:()=>framework.wrapper(entry.value)})});const array=framework.array(object);return framework.keys(array).forEach(index=>{framework.keys(output).includes(index)||Object.defineProperty(output,index,{get:()=>framework.wrapper(array[index])})}),output}}};core.event("org.bukkit.event.server.PluginDisableEvent",event=>{event.getPlugin()===core.plugin&&tasks.forEach(task=>task.cancel())}),core.export(framework)}(); \ No newline at end of file