@object-ui/plugin-editor 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,25 @@
1
+ (function(W,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("react"),require("@object-ui/core"),require("@object-ui/components")):typeof define=="function"&&define.amd?define(["exports","react","@object-ui/core","@object-ui/components"],c):(W=typeof globalThis<"u"?globalThis:W||self,c(W.ObjectUIPluginEditor={},W.React,W.ObjectUICore,W.ObjectUIComponents))})(this,(function(W,c,gr,hr){"use strict";var ge={exports:{}},te={};var Le;function mr(){if(Le)return te;Le=1;var r=c,t=Symbol.for("react.element"),n=Symbol.for("react.fragment"),a=Object.prototype.hasOwnProperty,u=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function v(y,d,O){var w,S={},$=null,Y=null;O!==void 0&&($=""+O),d.key!==void 0&&($=""+d.key),d.ref!==void 0&&(Y=d.ref);for(w in d)a.call(d,w)&&!l.hasOwnProperty(w)&&(S[w]=d[w]);if(y&&y.defaultProps)for(w in d=y.defaultProps,d)S[w]===void 0&&(S[w]=d[w]);return{$$typeof:t,type:y,key:$,ref:Y,props:S,_owner:u.current}}return te.Fragment=n,te.jsx=v,te.jsxs=v,te}var ne={};var $e;function br(){return $e||($e=1,process.env.NODE_ENV!=="production"&&(function(){var r=c,t=Symbol.for("react.element"),n=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),v=Symbol.for("react.provider"),y=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),O=Symbol.for("react.suspense"),w=Symbol.for("react.suspense_list"),S=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),Y=Symbol.for("react.offscreen"),Z=Symbol.iterator,le="@@iterator";function se(e){if(e===null||typeof e!="object")return null;var o=Z&&e[Z]||e[le];return typeof o=="function"?o:null}var U=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function g(e){{for(var o=arguments.length,i=new Array(o>1?o-1:0),s=1;s<o;s++)i[s-1]=arguments[s];z("error",e,i)}}function z(e,o,i){{var s=U.ReactDebugCurrentFrame,m=s.getStackAddendum();m!==""&&(o+="%s",i=i.concat([m]));var E=i.map(function(p){return String(p)});E.unshift("Warning: "+o),Function.prototype.apply.call(console[e],console,E)}}var B=!1,P=!1,C=!1,R=!1,J=!1,M;M=Symbol.for("react.module.reference");function b(e){return!!(typeof e=="string"||typeof e=="function"||e===a||e===l||J||e===u||e===O||e===w||R||e===Y||B||P||C||typeof e=="object"&&e!==null&&(e.$$typeof===$||e.$$typeof===S||e.$$typeof===v||e.$$typeof===y||e.$$typeof===d||e.$$typeof===M||e.getModuleId!==void 0))}function q(e,o,i){var s=e.displayName;if(s)return s;var m=o.displayName||o.name||"";return m!==""?i+"("+m+")":i}function H(e){return e.displayName||"Context"}function D(e){if(e==null)return null;if(typeof e.tag=="number"&&g("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case a:return"Fragment";case n:return"Portal";case l:return"Profiler";case u:return"StrictMode";case O:return"Suspense";case w:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case y:var o=e;return H(o)+".Consumer";case v:var i=e;return H(i._context)+".Provider";case d:return q(e,e.render,"ForwardRef");case S:var s=e.displayName||null;return s!==null?s:D(e.type)||"Memo";case $:{var m=e,E=m._payload,p=m._init;try{return D(p(E))}catch{return null}}}return null}var F=Object.assign,h=0,T,fe,Q,de,Ee,x,V;function K(){}K.__reactDisabledLog=!0;function pe(){{if(h===0){T=console.log,fe=console.info,Q=console.warn,de=console.error,Ee=console.group,x=console.groupCollapsed,V=console.groupEnd;var e={configurable:!0,enumerable:!0,value:K,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}h++}}function At(){{if(h--,h===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:F({},e,{value:T}),info:F({},e,{value:fe}),warn:F({},e,{value:Q}),error:F({},e,{value:de}),group:F({},e,{value:Ee}),groupCollapsed:F({},e,{value:x}),groupEnd:F({},e,{value:V})})}h<0&&g("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var Ce=U.ReactCurrentDispatcher,Me;function Oe(e,o,i){{if(Me===void 0)try{throw Error()}catch(m){var s=m.stack.trim().match(/\n( *(at )?)/);Me=s&&s[1]||""}return`
2
+ `+Me+e}}var xe=!1,we;{var kt=typeof WeakMap=="function"?WeakMap:Map;we=new kt}function er(e,o){if(!e||xe)return"";{var i=we.get(e);if(i!==void 0)return i}var s;xe=!0;var m=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var E;E=Ce.current,Ce.current=null,pe();try{if(o){var p=function(){throw Error()};if(Object.defineProperty(p.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(p,[])}catch(A){s=A}Reflect.construct(e,[],p)}else{try{p.call()}catch(A){s=A}e.call(p.prototype)}}else{try{throw Error()}catch(A){s=A}e()}}catch(A){if(A&&s&&typeof A.stack=="string"){for(var f=A.stack.split(`
3
+ `),I=s.stack.split(`
4
+ `),j=f.length-1,_=I.length-1;j>=1&&_>=0&&f[j]!==I[_];)_--;for(;j>=1&&_>=0;j--,_--)if(f[j]!==I[_]){if(j!==1||_!==1)do if(j--,_--,_<0||f[j]!==I[_]){var L=`
5
+ `+f[j].replace(" at new "," at ");return e.displayName&&L.includes("<anonymous>")&&(L=L.replace("<anonymous>",e.displayName)),typeof e=="function"&&we.set(e,L),L}while(j>=1&&_>=0);break}}}finally{xe=!1,Ce.current=E,At(),Error.prepareStackTrace=m}var re=e?e.displayName||e.name:"",G=re?Oe(re):"";return typeof e=="function"&&we.set(e,G),G}function Dt(e,o,i){return er(e,!1)}function Ft(e){var o=e.prototype;return!!(o&&o.isReactComponent)}function Re(e,o,i){if(e==null)return"";if(typeof e=="function")return er(e,Ft(e));if(typeof e=="string")return Oe(e);switch(e){case O:return Oe("Suspense");case w:return Oe("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case d:return Dt(e.render);case S:return Re(e.type,o,i);case $:{var s=e,m=s._payload,E=s._init;try{return Re(E(m),o,i)}catch{}}}return""}var ve=Object.prototype.hasOwnProperty,rr={},tr=U.ReactDebugCurrentFrame;function je(e){if(e){var o=e._owner,i=Re(e.type,e._source,o?o.type:null);tr.setExtraStackFrame(i)}else tr.setExtraStackFrame(null)}function Lt(e,o,i,s,m){{var E=Function.call.bind(ve);for(var p in e)if(E(e,p)){var f=void 0;try{if(typeof e[p]!="function"){var I=Error((s||"React class")+": "+i+" type `"+p+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[p]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw I.name="Invariant Violation",I}f=e[p](o,p,s,i,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(j){f=j}f&&!(f instanceof Error)&&(je(m),g("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",s||"React class",i,p,typeof f),je(null)),f instanceof Error&&!(f.message in rr)&&(rr[f.message]=!0,je(m),g("Failed %s type: %s",i,f.message),je(null))}}}var $t=Array.isArray;function Ie(e){return $t(e)}function Vt(e){{var o=typeof Symbol=="function"&&Symbol.toStringTag,i=o&&e[Symbol.toStringTag]||e.constructor.name||"Object";return i}}function Wt(e){try{return nr(e),!1}catch{return!0}}function nr(e){return""+e}function ar(e){if(Wt(e))return g("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Vt(e)),nr(e)}var or=U.ReactCurrentOwner,Ut={key:!0,ref:!0,__self:!0,__source:!0},ir,ur;function Nt(e){if(ve.call(e,"ref")){var o=Object.getOwnPropertyDescriptor(e,"ref").get;if(o&&o.isReactWarning)return!1}return e.ref!==void 0}function Yt(e){if(ve.call(e,"key")){var o=Object.getOwnPropertyDescriptor(e,"key").get;if(o&&o.isReactWarning)return!1}return e.key!==void 0}function qt(e,o){typeof e.ref=="string"&&or.current}function zt(e,o){{var i=function(){ir||(ir=!0,g("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",o))};i.isReactWarning=!0,Object.defineProperty(e,"key",{get:i,configurable:!0})}}function Bt(e,o){{var i=function(){ur||(ur=!0,g("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",o))};i.isReactWarning=!0,Object.defineProperty(e,"ref",{get:i,configurable:!0})}}var Jt=function(e,o,i,s,m,E,p){var f={$$typeof:t,type:e,key:o,ref:i,props:p,_owner:E};return f._store={},Object.defineProperty(f._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(f,"_self",{configurable:!1,enumerable:!1,writable:!1,value:s}),Object.defineProperty(f,"_source",{configurable:!1,enumerable:!1,writable:!1,value:m}),Object.freeze&&(Object.freeze(f.props),Object.freeze(f)),f};function Ht(e,o,i,s,m){{var E,p={},f=null,I=null;i!==void 0&&(ar(i),f=""+i),Yt(o)&&(ar(o.key),f=""+o.key),Nt(o)&&(I=o.ref,qt(o,m));for(E in o)ve.call(o,E)&&!Ut.hasOwnProperty(E)&&(p[E]=o[E]);if(e&&e.defaultProps){var j=e.defaultProps;for(E in j)p[E]===void 0&&(p[E]=j[E])}if(f||I){var _=typeof e=="function"?e.displayName||e.name||"Unknown":e;f&&zt(p,_),I&&Bt(p,_)}return Jt(e,f,I,m,s,or.current,p)}}var Ae=U.ReactCurrentOwner,cr=U.ReactDebugCurrentFrame;function ee(e){if(e){var o=e._owner,i=Re(e.type,e._source,o?o.type:null);cr.setExtraStackFrame(i)}else cr.setExtraStackFrame(null)}var ke;ke=!1;function De(e){return typeof e=="object"&&e!==null&&e.$$typeof===t}function lr(){{if(Ae.current){var e=D(Ae.current.type);if(e)return`
6
+
7
+ Check the render method of \``+e+"`."}return""}}function Gt(e){return""}var sr={};function Xt(e){{var o=lr();if(!o){var i=typeof e=="string"?e:e.displayName||e.name;i&&(o=`
8
+
9
+ Check the top-level render call using <`+i+">.")}return o}}function fr(e,o){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var i=Xt(o);if(sr[i])return;sr[i]=!0;var s="";e&&e._owner&&e._owner!==Ae.current&&(s=" It was passed a child from "+D(e._owner.type)+"."),ee(e),g('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',i,s),ee(null)}}function dr(e,o){{if(typeof e!="object")return;if(Ie(e))for(var i=0;i<e.length;i++){var s=e[i];De(s)&&fr(s,o)}else if(De(e))e._store&&(e._store.validated=!0);else if(e){var m=se(e);if(typeof m=="function"&&m!==e.entries)for(var E=m.call(e),p;!(p=E.next()).done;)De(p.value)&&fr(p.value,o)}}}function Zt(e){{var o=e.type;if(o==null||typeof o=="string")return;var i;if(typeof o=="function")i=o.propTypes;else if(typeof o=="object"&&(o.$$typeof===d||o.$$typeof===S))i=o.propTypes;else return;if(i){var s=D(o);Lt(i,e.props,"prop",s,e)}else if(o.PropTypes!==void 0&&!ke){ke=!0;var m=D(o);g("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",m||"Unknown")}typeof o.getDefaultProps=="function"&&!o.getDefaultProps.isReactClassApproved&&g("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function Qt(e){{for(var o=Object.keys(e.props),i=0;i<o.length;i++){var s=o[i];if(s!=="children"&&s!=="key"){ee(e),g("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",s),ee(null);break}}e.ref!==null&&(ee(e),g("Invalid attribute `ref` supplied to `React.Fragment`."),ee(null))}}var pr={};function vr(e,o,i,s,m,E){{var p=b(e);if(!p){var f="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(f+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var I=Gt();I?f+=I:f+=lr();var j;e===null?j="null":Ie(e)?j="array":e!==void 0&&e.$$typeof===t?(j="<"+(D(e.type)||"Unknown")+" />",f=" Did you accidentally export a JSX literal instead of a component?"):j=typeof e,g("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",j,f)}var _=Ht(e,o,i,m,E);if(_==null)return _;if(p){var L=o.children;if(L!==void 0)if(s)if(Ie(L)){for(var re=0;re<L.length;re++)dr(L[re],e);Object.freeze&&Object.freeze(L)}else g("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else dr(L,e)}if(ve.call(o,"key")){var G=D(e),A=Object.keys(o).filter(function(an){return an!=="key"}),Fe=A.length>0?"{key: someKey, "+A.join(": ..., ")+": ...}":"{key: someKey}";if(!pr[G+Fe]){var nn=A.length>0?"{"+A.join(": ..., ")+": ...}":"{}";g(`A props object containing a "key" prop is being spread into JSX:
10
+ let props = %s;
11
+ <%s {...props} />
12
+ React keys must be passed directly to JSX without using spread:
13
+ let props = %s;
14
+ <%s key={someKey} {...props} />`,Fe,G,nn,G),pr[G+Fe]=!0}}return e===a?Qt(_):Zt(_),_}}function Kt(e,o,i){return vr(e,o,i,!0)}function en(e,o,i){return vr(e,o,i,!1)}var rn=en,tn=Kt;ne.Fragment=a,ne.jsx=rn,ne.jsxs=tn})()),ne}var Ve;function yr(){return Ve||(Ve=1,process.env.NODE_ENV==="production"?ge.exports=mr():ge.exports=br()),ge.exports}var ae=yr();const Er=c.lazy(()=>Promise.resolve().then(()=>It)),Se=({schema:r,value:t,onChange:n})=>ae.jsx(c.Suspense,{fallback:ae.jsx(hr.Skeleton,{className:"w-full h-[400px]"}),children:ae.jsx(Er,{value:t??r.value,language:r.language,theme:r.theme,height:r.height,onChange:n??r.onChange,readOnly:r.readOnly,className:r.className})});gr.ComponentRegistry.register("code-editor",Se,{label:"Code Editor",category:"plugin",inputs:[{name:"value",type:"string",label:"Code",defaultValue:""},{name:"language",type:"enum",label:"Language",enum:["javascript","typescript","python","json","html","css"],defaultValue:"javascript"},{name:"theme",type:"enum",label:"Theme",enum:["vs-dark","light"],defaultValue:"vs-dark"},{name:"height",type:"string",label:"Height",defaultValue:"400px"},{name:"readOnly",type:"boolean",label:"Read Only",defaultValue:!1}],defaultProps:{value:`// Write your code here
15
+ console.log("Hello, World!");`,language:"javascript",theme:"vs-dark",height:"400px",readOnly:!1}});const Or={"code-editor":Se};function We(r,t){(t==null||t>r.length)&&(t=r.length);for(var n=0,a=Array(t);n<t;n++)a[n]=r[n];return a}function wr(r){if(Array.isArray(r))return r}function Rr(r,t,n){return(t=Mr(t))in r?Object.defineProperty(r,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[t]=n,r}function jr(r,t){var n=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(n!=null){var a,u,l,v,y=[],d=!0,O=!1;try{if(l=(n=n.call(r)).next,t!==0)for(;!(d=(a=l.call(n)).done)&&(y.push(a.value),y.length!==t);d=!0);}catch(w){O=!0,u=w}finally{try{if(!d&&n.return!=null&&(v=n.return(),Object(v)!==v))return}finally{if(O)throw u}}return y}}function Sr(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
16
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Ue(r,t){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(r);t&&(a=a.filter(function(u){return Object.getOwnPropertyDescriptor(r,u).enumerable})),n.push.apply(n,a)}return n}function Ne(r){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?Ue(Object(n),!0).forEach(function(a){Rr(r,a,n[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Ue(Object(n)).forEach(function(a){Object.defineProperty(r,a,Object.getOwnPropertyDescriptor(n,a))})}return r}function _r(r,t){if(r==null)return{};var n,a,u=Pr(r,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(r);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(r,n)&&(u[n]=r[n])}return u}function Pr(r,t){if(r==null)return{};var n={};for(var a in r)if({}.hasOwnProperty.call(r,a)){if(t.indexOf(a)!==-1)continue;n[a]=r[a]}return n}function Tr(r,t){return wr(r)||jr(r,t)||xr(r,t)||Sr()}function Cr(r,t){if(typeof r!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var a=n.call(r,t);if(typeof a!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(r)}function Mr(r){var t=Cr(r,"string");return typeof t=="symbol"?t:t+""}function xr(r,t){if(r){if(typeof r=="string")return We(r,t);var n={}.toString.call(r).slice(8,-1);return n==="Object"&&r.constructor&&(n=r.constructor.name),n==="Map"||n==="Set"?Array.from(r):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?We(r,t):void 0}}function Ir(r,t,n){return t in r?Object.defineProperty(r,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[t]=n,r}function Ye(r,t){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(r);t&&(a=a.filter(function(u){return Object.getOwnPropertyDescriptor(r,u).enumerable})),n.push.apply(n,a)}return n}function qe(r){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?Ye(Object(n),!0).forEach(function(a){Ir(r,a,n[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Ye(Object(n)).forEach(function(a){Object.defineProperty(r,a,Object.getOwnPropertyDescriptor(n,a))})}return r}function Ar(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return function(a){return t.reduceRight(function(u,l){return l(u)},a)}}function oe(r){return function t(){for(var n=this,a=arguments.length,u=new Array(a),l=0;l<a;l++)u[l]=arguments[l];return u.length>=r.length?r.apply(this,u):function(){for(var v=arguments.length,y=new Array(v),d=0;d<v;d++)y[d]=arguments[d];return t.apply(n,[].concat(u,y))}}}function he(r){return{}.toString.call(r).includes("Object")}function kr(r){return!Object.keys(r).length}function ie(r){return typeof r=="function"}function Dr(r,t){return Object.prototype.hasOwnProperty.call(r,t)}function Fr(r,t){return he(t)||N("changeType"),Object.keys(t).some(function(n){return!Dr(r,n)})&&N("changeField"),t}function Lr(r){ie(r)||N("selectorType")}function $r(r){ie(r)||he(r)||N("handlerType"),he(r)&&Object.values(r).some(function(t){return!ie(t)})&&N("handlersType")}function Vr(r){r||N("initialIsRequired"),he(r)||N("initialType"),kr(r)&&N("initialContent")}function Wr(r,t){throw new Error(r[t]||r.default)}var Ur={initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"},N=oe(Wr)(Ur),me={changes:Fr,selector:Lr,handler:$r,initial:Vr};function Nr(r){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};me.initial(r),me.handler(t);var n={current:r},a=oe(zr)(n,t),u=oe(qr)(n),l=oe(me.changes)(r),v=oe(Yr)(n);function y(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(w){return w};return me.selector(O),O(n.current)}function d(O){Ar(a,u,l,v)(O)}return[y,d]}function Yr(r,t){return ie(t)?t(r.current):t}function qr(r,t){return r.current=qe(qe({},r.current),t),t}function zr(r,t,n){return ie(t)?t(r.current):Object.keys(n).forEach(function(a){var u;return(u=t[a])===null||u===void 0?void 0:u.call(t,r.current[a])}),n}var Br={create:Nr},Jr={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs"}};function Hr(r){return function t(){for(var n=this,a=arguments.length,u=new Array(a),l=0;l<a;l++)u[l]=arguments[l];return u.length>=r.length?r.apply(this,u):function(){for(var v=arguments.length,y=new Array(v),d=0;d<v;d++)y[d]=arguments[d];return t.apply(n,[].concat(u,y))}}}function Gr(r){return{}.toString.call(r).includes("Object")}function Xr(r){return r||Be("configIsRequired"),Gr(r)||Be("configType"),r.urls?(Zr(),{paths:{vs:r.urls.monacoBase}}):r}function Zr(){console.warn(ze.deprecation)}function Qr(r,t){throw new Error(r[t]||r.default)}var ze={configIsRequired:"the configuration object is required",configType:"the configuration object should be an object",default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:`Deprecation warning!
17
+ You are using deprecated way of configuration.
18
+
19
+ Instead of using
20
+ monaco.config({ urls: { monacoBase: '...' } })
21
+ use
22
+ monaco.config({ paths: { vs: '...' } })
23
+
24
+ For more please check the link https://github.com/suren-atoyan/monaco-loader#config
25
+ `},Be=Hr(Qr)(ze),Kr={config:Xr},et=function(){for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];return function(u){return n.reduceRight(function(l,v){return v(l)},u)}};function Je(r,t){return Object.keys(t).forEach(function(n){t[n]instanceof Object&&r[n]&&Object.assign(t[n],Je(r[n],t[n]))}),Ne(Ne({},r),t)}var rt={type:"cancelation",msg:"operation is manually canceled"};function _e(r){var t=!1,n=new Promise(function(a,u){r.then(function(l){return t?u(rt):a(l)}),r.catch(u)});return n.cancel=function(){return t=!0},n}var tt=["monaco"],nt=Br.create({config:Jr,isInitialized:!1,resolve:null,reject:null,monaco:null}),He=Tr(nt,2),ue=He[0],be=He[1];function at(r){var t=Kr.config(r),n=t.monaco,a=_r(t,tt);be(function(u){return{config:Je(u.config,a),monaco:n}})}function ot(){var r=ue(function(t){var n=t.monaco,a=t.isInitialized,u=t.resolve;return{monaco:n,isInitialized:a,resolve:u}});if(!r.isInitialized){if(be({isInitialized:!0}),r.monaco)return r.resolve(r.monaco),_e(Pe);if(window.monaco&&window.monaco.editor)return Ge(window.monaco),r.resolve(window.monaco),_e(Pe);et(it,ct)(lt)}return _e(Pe)}function it(r){return document.body.appendChild(r)}function ut(r){var t=document.createElement("script");return r&&(t.src=r),t}function ct(r){var t=ue(function(a){var u=a.config,l=a.reject;return{config:u,reject:l}}),n=ut("".concat(t.config.paths.vs,"/loader.js"));return n.onload=function(){return r()},n.onerror=t.reject,n}function lt(){var r=ue(function(n){var a=n.config,u=n.resolve,l=n.reject;return{config:a,resolve:u,reject:l}}),t=window.require;t.config(r.config),t(["vs/editor/editor.main"],function(n){var a=n.m||n;Ge(a),r.resolve(a)},function(n){r.reject(n)})}function Ge(r){ue().monaco||be({monaco:r})}function st(){return ue(function(r){var t=r.monaco;return t})}var Pe=new Promise(function(r,t){return be({resolve:r,reject:t})}),Xe={config:at,init:ot,__getMonacoInstance:st},ft={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},Te=ft,dt={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},pt=dt;function vt({children:r}){return c.createElement("div",{style:pt.container},r)}var gt=vt,ht=gt;function mt({width:r,height:t,isEditorReady:n,loading:a,_ref:u,className:l,wrapperProps:v}){return c.createElement("section",{style:{...Te.wrapper,width:r,height:t},...v},!n&&c.createElement(ht,null,a),c.createElement("div",{ref:u,style:{...Te.fullWidth,...!n&&Te.hide},className:l}))}var bt=mt,Ze=c.memo(bt);function yt(r){c.useEffect(r,[])}var Qe=yt;function Et(r,t,n=!0){let a=c.useRef(!0);c.useEffect(a.current||!n?()=>{a.current=!1}:r,t)}var k=Et;function ce(){}function X(r,t,n,a){return Ot(r,a)||wt(r,t,n,a)}function Ot(r,t){return r.editor.getModel(Ke(r,t))}function wt(r,t,n,a){return r.editor.createModel(t,n,a?Ke(r,a):void 0)}function Ke(r,t){return r.Uri.parse(t)}function Rt({original:r,modified:t,language:n,originalLanguage:a,modifiedLanguage:u,originalModelPath:l,modifiedModelPath:v,keepCurrentOriginalModel:y=!1,keepCurrentModifiedModel:d=!1,theme:O="light",loading:w="Loading...",options:S={},height:$="100%",width:Y="100%",className:Z,wrapperProps:le={},beforeMount:se=ce,onMount:U=ce}){let[g,z]=c.useState(!1),[B,P]=c.useState(!0),C=c.useRef(null),R=c.useRef(null),J=c.useRef(null),M=c.useRef(U),b=c.useRef(se),q=c.useRef(!1);Qe(()=>{let h=Xe.init();return h.then(T=>(R.current=T)&&P(!1)).catch(T=>T?.type!=="cancelation"&&console.error("Monaco initialization: error:",T)),()=>C.current?F():h.cancel()}),k(()=>{if(C.current&&R.current){let h=C.current.getOriginalEditor(),T=X(R.current,r||"",a||n||"text",l||"");T!==h.getModel()&&h.setModel(T)}},[l],g),k(()=>{if(C.current&&R.current){let h=C.current.getModifiedEditor(),T=X(R.current,t||"",u||n||"text",v||"");T!==h.getModel()&&h.setModel(T)}},[v],g),k(()=>{let h=C.current.getModifiedEditor();h.getOption(R.current.editor.EditorOption.readOnly)?h.setValue(t||""):t!==h.getValue()&&(h.executeEdits("",[{range:h.getModel().getFullModelRange(),text:t||"",forceMoveMarkers:!0}]),h.pushUndoStop())},[t],g),k(()=>{C.current?.getModel()?.original.setValue(r||"")},[r],g),k(()=>{let{original:h,modified:T}=C.current.getModel();R.current.editor.setModelLanguage(h,a||n||"text"),R.current.editor.setModelLanguage(T,u||n||"text")},[n,a,u],g),k(()=>{R.current?.editor.setTheme(O)},[O],g),k(()=>{C.current?.updateOptions(S)},[S],g);let H=c.useCallback(()=>{if(!R.current)return;b.current(R.current);let h=X(R.current,r||"",a||n||"text",l||""),T=X(R.current,t||"",u||n||"text",v||"");C.current?.setModel({original:h,modified:T})},[n,t,u,r,a,l,v]),D=c.useCallback(()=>{!q.current&&J.current&&(C.current=R.current.editor.createDiffEditor(J.current,{automaticLayout:!0,...S}),H(),R.current?.editor.setTheme(O),z(!0),q.current=!0)},[S,O,H]);c.useEffect(()=>{g&&M.current(C.current,R.current)},[g]),c.useEffect(()=>{!B&&!g&&D()},[B,g,D]);function F(){let h=C.current?.getModel();y||h?.original?.dispose(),d||h?.modified?.dispose(),C.current?.dispose()}return c.createElement(Ze,{width:Y,height:$,isEditorReady:g,loading:w,_ref:J,className:Z,wrapperProps:le})}var jt=Rt;c.memo(jt);function St(r){let t=c.useRef();return c.useEffect(()=>{t.current=r},[r]),t.current}var _t=St,ye=new Map;function Pt({defaultValue:r,defaultLanguage:t,defaultPath:n,value:a,language:u,path:l,theme:v="light",line:y,loading:d="Loading...",options:O={},overrideServices:w={},saveViewState:S=!0,keepCurrentModel:$=!1,width:Y="100%",height:Z="100%",className:le,wrapperProps:se={},beforeMount:U=ce,onMount:g=ce,onChange:z,onValidate:B=ce}){let[P,C]=c.useState(!1),[R,J]=c.useState(!0),M=c.useRef(null),b=c.useRef(null),q=c.useRef(null),H=c.useRef(g),D=c.useRef(U),F=c.useRef(),h=c.useRef(a),T=_t(l),fe=c.useRef(!1),Q=c.useRef(!1);Qe(()=>{let x=Xe.init();return x.then(V=>(M.current=V)&&J(!1)).catch(V=>V?.type!=="cancelation"&&console.error("Monaco initialization: error:",V)),()=>b.current?Ee():x.cancel()}),k(()=>{let x=X(M.current,r||a||"",t||u||"",l||n||"");x!==b.current?.getModel()&&(S&&ye.set(T,b.current?.saveViewState()),b.current?.setModel(x),S&&b.current?.restoreViewState(ye.get(l)))},[l],P),k(()=>{b.current?.updateOptions(O)},[O],P),k(()=>{!b.current||a===void 0||(b.current.getOption(M.current.editor.EditorOption.readOnly)?b.current.setValue(a):a!==b.current.getValue()&&(Q.current=!0,b.current.executeEdits("",[{range:b.current.getModel().getFullModelRange(),text:a,forceMoveMarkers:!0}]),b.current.pushUndoStop(),Q.current=!1))},[a],P),k(()=>{let x=b.current?.getModel();x&&u&&M.current?.editor.setModelLanguage(x,u)},[u],P),k(()=>{y!==void 0&&b.current?.revealLine(y)},[y],P),k(()=>{M.current?.editor.setTheme(v)},[v],P);let de=c.useCallback(()=>{if(!(!q.current||!M.current)&&!fe.current){D.current(M.current);let x=l||n,V=X(M.current,a||r||"",t||u||"",x||"");b.current=M.current?.editor.create(q.current,{model:V,automaticLayout:!0,...O},w),S&&b.current.restoreViewState(ye.get(x)),M.current.editor.setTheme(v),y!==void 0&&b.current.revealLine(y),C(!0),fe.current=!0}},[r,t,n,a,u,l,O,w,S,v,y]);c.useEffect(()=>{P&&H.current(b.current,M.current)},[P]),c.useEffect(()=>{!R&&!P&&de()},[R,P,de]),h.current=a,c.useEffect(()=>{P&&z&&(F.current?.dispose(),F.current=b.current?.onDidChangeModelContent(x=>{Q.current||z(b.current.getValue(),x)}))},[P,z]),c.useEffect(()=>{if(P){let x=M.current.editor.onDidChangeMarkers(V=>{let K=b.current.getModel()?.uri;if(K&&V.find(pe=>pe.path===K.path)){let pe=M.current.editor.getModelMarkers({resource:K});B?.(pe)}});return()=>{x?.dispose()}}return()=>{}},[P,B]);function Ee(){F.current?.dispose(),$?S&&ye.set(l,b.current.saveViewState()):b.current.getModel()?.dispose(),b.current.dispose()}return c.createElement(Ze,{width:Y,height:Z,isEditorReady:P,loading:d,_ref:q,className:le,wrapperProps:se})}var Tt=Pt,Ct=c.memo(Tt),Mt=Ct;function xt({value:r="",language:t="javascript",theme:n="vs-dark",height:a="400px",onChange:u,readOnly:l=!1,className:v=""}){return ae.jsx("div",{className:v,children:ae.jsx(Mt,{height:a,language:t,theme:n,value:r,onChange:u,options:{readOnly:l,minimap:{enabled:!1},fontSize:14,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0}})})}const It=Object.freeze(Object.defineProperty({__proto__:null,default:xt},Symbol.toStringTag,{value:"Module"}));W.CodeEditorRenderer=Se,W.editorComponents=Or,Object.defineProperty(W,Symbol.toStringTag,{value:"Module"})}));
@@ -0,0 +1,14 @@
1
+ export interface MonacoImplProps {
2
+ value?: string;
3
+ language?: string;
4
+ theme?: 'vs-dark' | 'light';
5
+ height?: string;
6
+ onChange?: (value: string | undefined) => void;
7
+ readOnly?: boolean;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * MonacoImpl - The heavy implementation that imports Monaco Editor
12
+ * This component is lazy-loaded to avoid including Monaco in the initial bundle
13
+ */
14
+ export default function MonacoImpl({ value, language, theme, height, onChange, readOnly, className, }: MonacoImplProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { default as React } from 'react';
2
+ export type { CodeEditorSchema } from './types';
3
+ export interface CodeEditorRendererProps {
4
+ schema: {
5
+ type: string;
6
+ id?: string;
7
+ className?: string;
8
+ value?: string;
9
+ language?: string;
10
+ theme?: 'vs-dark' | 'light';
11
+ height?: string;
12
+ readOnly?: boolean;
13
+ onChange?: (value: string | undefined) => void;
14
+ };
15
+ value?: string;
16
+ onChange?: (value: string | undefined) => void;
17
+ }
18
+ /**
19
+ * CodeEditorRenderer - The public API for the code editor component
20
+ * This wrapper handles lazy loading internally using React.Suspense
21
+ */
22
+ export declare const CodeEditorRenderer: React.FC<CodeEditorRendererProps>;
23
+ export declare const editorComponents: {
24
+ 'code-editor': React.FC<CodeEditorRendererProps>;
25
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ import { BaseSchema } from '@object-ui/types';
2
+ /**
3
+ * Code Editor component schema.
4
+ * Renders a Monaco-based code editor with syntax highlighting.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import type { CodeEditorSchema } from '@object-ui/plugin-editor';
9
+ *
10
+ * const editorSchema: CodeEditorSchema = {
11
+ * type: 'code-editor',
12
+ * value: 'console.log("Hello, World!");',
13
+ * language: 'javascript',
14
+ * theme: 'vs-dark',
15
+ * height: '400px'
16
+ * }
17
+ * ```
18
+ */
19
+ export interface CodeEditorSchema extends BaseSchema {
20
+ type: 'code-editor';
21
+ /**
22
+ * The code content to display in the editor.
23
+ */
24
+ value?: string;
25
+ /**
26
+ * Programming language for syntax highlighting.
27
+ * @default 'javascript'
28
+ */
29
+ language?: 'javascript' | 'typescript' | 'python' | 'json' | 'html' | 'css' | 'markdown' | string;
30
+ /**
31
+ * Color theme for the editor.
32
+ * @default 'vs-dark'
33
+ */
34
+ theme?: 'vs-dark' | 'light';
35
+ /**
36
+ * Height of the editor.
37
+ * @default '400px'
38
+ */
39
+ height?: string;
40
+ /**
41
+ * Whether the editor is read-only.
42
+ * @default false
43
+ */
44
+ readOnly?: boolean;
45
+ /**
46
+ * Callback when the code content changes.
47
+ */
48
+ onChange?: (value: string | undefined) => void;
49
+ }
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@object-ui/plugin-editor",
3
+ "version": "0.3.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "main": "dist/index.umd.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.umd.cjs"
14
+ }
15
+ },
16
+ "dependencies": {
17
+ "@monaco-editor/react": "^4.6.0",
18
+ "@object-ui/components": "0.3.0",
19
+ "@object-ui/core": "0.3.0",
20
+ "@object-ui/react": "0.3.0",
21
+ "@object-ui/types": "0.3.0"
22
+ },
23
+ "peerDependencies": {
24
+ "react": "^18.0.0 || ^19.0.0",
25
+ "react-dom": "^18.0.0 || ^19.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/react": "^18.3.12",
29
+ "@types/react-dom": "^18.3.1",
30
+ "@vitejs/plugin-react": "^4.2.1",
31
+ "typescript": "^5.9.3",
32
+ "vite": "^7.3.1",
33
+ "vite-plugin-dts": "^4.5.4"
34
+ },
35
+ "scripts": {
36
+ "build": "vite build",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "type-check": "tsc --noEmit",
40
+ "lint": "eslint ."
41
+ }
42
+ }
@@ -0,0 +1,45 @@
1
+ import Editor from '@monaco-editor/react';
2
+
3
+ export interface MonacoImplProps {
4
+ value?: string;
5
+ language?: string;
6
+ theme?: 'vs-dark' | 'light';
7
+ height?: string;
8
+ onChange?: (value: string | undefined) => void;
9
+ readOnly?: boolean;
10
+ className?: string;
11
+ }
12
+
13
+ /**
14
+ * MonacoImpl - The heavy implementation that imports Monaco Editor
15
+ * This component is lazy-loaded to avoid including Monaco in the initial bundle
16
+ */
17
+ export default function MonacoImpl({
18
+ value = '',
19
+ language = 'javascript',
20
+ theme = 'vs-dark',
21
+ height = '400px',
22
+ onChange,
23
+ readOnly = false,
24
+ className = '',
25
+ }: MonacoImplProps) {
26
+ return (
27
+ <div className={className}>
28
+ <Editor
29
+ height={height}
30
+ language={language}
31
+ theme={theme}
32
+ value={value}
33
+ onChange={onChange}
34
+ options={{
35
+ readOnly,
36
+ minimap: { enabled: false },
37
+ fontSize: 14,
38
+ lineNumbers: 'on',
39
+ scrollBeyondLastLine: false,
40
+ automaticLayout: true,
41
+ }}
42
+ />
43
+ </div>
44
+ );
45
+ }
@@ -0,0 +1,90 @@
1
+ import { describe, it, expect, beforeAll } from 'vitest';
2
+ import { ComponentRegistry } from '@object-ui/core';
3
+
4
+ describe('Plugin Editor', () => {
5
+ // Import all renderers to register them
6
+ beforeAll(async () => {
7
+ await import('./index');
8
+ });
9
+
10
+ describe('code-editor component', () => {
11
+ it('should be registered in ComponentRegistry', () => {
12
+ const editorRenderer = ComponentRegistry.get('code-editor');
13
+ expect(editorRenderer).toBeDefined();
14
+ });
15
+
16
+ it('should have proper metadata', () => {
17
+ const config = ComponentRegistry.getConfig('code-editor');
18
+ expect(config).toBeDefined();
19
+ expect(config?.label).toBe('Code Editor');
20
+ expect(config?.category).toBe('plugin');
21
+ expect(config?.inputs).toBeDefined();
22
+ expect(config?.defaultProps).toBeDefined();
23
+ });
24
+
25
+ it('should have expected inputs', () => {
26
+ const config = ComponentRegistry.getConfig('code-editor');
27
+ const inputNames = config?.inputs?.map((input: any) => input.name) || [];
28
+
29
+ expect(inputNames).toContain('value');
30
+ expect(inputNames).toContain('language');
31
+ expect(inputNames).toContain('theme');
32
+ expect(inputNames).toContain('height');
33
+ expect(inputNames).toContain('readOnly');
34
+ });
35
+
36
+ it('should have language as enum input', () => {
37
+ const config = ComponentRegistry.getConfig('code-editor');
38
+ const languageInput = config?.inputs?.find((input: any) => input.name === 'language');
39
+
40
+ expect(languageInput).toBeDefined();
41
+ expect(languageInput?.type).toBe('enum');
42
+ expect(languageInput?.enum).toBeDefined();
43
+ expect(Array.isArray(languageInput?.enum)).toBe(true);
44
+
45
+ const enumValues = languageInput?.enum || [];
46
+ expect(enumValues).toContain('javascript');
47
+ expect(enumValues).toContain('typescript');
48
+ expect(enumValues).toContain('python');
49
+ expect(enumValues).toContain('json');
50
+ expect(enumValues).toContain('html');
51
+ expect(enumValues).toContain('css');
52
+ });
53
+
54
+ it('should have theme as enum input', () => {
55
+ const config = ComponentRegistry.getConfig('code-editor');
56
+ const themeInput = config?.inputs?.find((input: any) => input.name === 'theme');
57
+
58
+ expect(themeInput).toBeDefined();
59
+ expect(themeInput?.type).toBe('enum');
60
+ expect(themeInput?.enum).toBeDefined();
61
+ expect(Array.isArray(themeInput?.enum)).toBe(true);
62
+
63
+ const enumValues = themeInput?.enum || [];
64
+ expect(enumValues).toContain('vs-dark');
65
+ expect(enumValues).toContain('light');
66
+ });
67
+
68
+ it('should have sensible default props', () => {
69
+ const config = ComponentRegistry.getConfig('code-editor');
70
+ const defaults = config?.defaultProps;
71
+
72
+ expect(defaults).toBeDefined();
73
+ expect(defaults?.value).toBeDefined();
74
+ expect(typeof defaults?.value).toBe('string');
75
+ expect(defaults?.language).toBe('javascript');
76
+ expect(defaults?.theme).toBe('vs-dark');
77
+ expect(defaults?.height).toBe('400px');
78
+ expect(defaults?.readOnly).toBe(false);
79
+ });
80
+
81
+ it('should have readOnly as boolean input', () => {
82
+ const config = ComponentRegistry.getConfig('code-editor');
83
+ const readOnlyInput = config?.inputs?.find((input: any) => input.name === 'readOnly');
84
+
85
+ expect(readOnlyInput).toBeDefined();
86
+ expect(readOnlyInput?.type).toBe('boolean');
87
+ expect(readOnlyInput?.defaultValue).toBe(false);
88
+ });
89
+ });
90
+ });
package/src/index.tsx ADDED
@@ -0,0 +1,75 @@
1
+ import React, { Suspense } from 'react';
2
+ import { ComponentRegistry } from '@object-ui/core';
3
+ import { Skeleton } from '@object-ui/components';
4
+
5
+ // Export types for external use
6
+ export type { CodeEditorSchema } from './types';
7
+
8
+ // 🚀 Lazy load the implementation file
9
+ // This ensures Monaco Editor is only loaded when the component is actually rendered
10
+ const LazyMonacoEditor = React.lazy(() => import('./MonacoImpl'));
11
+
12
+ export interface CodeEditorRendererProps {
13
+ schema: {
14
+ type: string;
15
+ id?: string;
16
+ className?: string;
17
+ value?: string;
18
+ language?: string;
19
+ theme?: 'vs-dark' | 'light';
20
+ height?: string;
21
+ readOnly?: boolean;
22
+ onChange?: (value: string | undefined) => void;
23
+ };
24
+ value?: string;
25
+ onChange?: (value: string | undefined) => void;
26
+ }
27
+
28
+ /**
29
+ * CodeEditorRenderer - The public API for the code editor component
30
+ * This wrapper handles lazy loading internally using React.Suspense
31
+ */
32
+ export const CodeEditorRenderer: React.FC<CodeEditorRendererProps> = ({ schema, value, onChange }) => {
33
+ return (
34
+ <Suspense fallback={<Skeleton className="w-full h-[400px]" />}>
35
+ <LazyMonacoEditor
36
+ value={value ?? schema.value}
37
+ language={schema.language}
38
+ theme={schema.theme}
39
+ height={schema.height}
40
+ onChange={onChange ?? schema.onChange}
41
+ readOnly={schema.readOnly}
42
+ className={schema.className}
43
+ />
44
+ </Suspense>
45
+ );
46
+ };
47
+
48
+ // Register the component with the ComponentRegistry
49
+ ComponentRegistry.register(
50
+ 'code-editor',
51
+ CodeEditorRenderer,
52
+ {
53
+ label: 'Code Editor',
54
+ category: 'plugin',
55
+ inputs: [
56
+ { name: 'value', type: 'string', label: 'Code', defaultValue: '' },
57
+ { name: 'language', type: 'enum', label: 'Language', enum: ['javascript', 'typescript', 'python', 'json', 'html', 'css'], defaultValue: 'javascript' },
58
+ { name: 'theme', type: 'enum', label: 'Theme', enum: ['vs-dark', 'light'], defaultValue: 'vs-dark' },
59
+ { name: 'height', type: 'string', label: 'Height', defaultValue: '400px' },
60
+ { name: 'readOnly', type: 'boolean', label: 'Read Only', defaultValue: false },
61
+ ],
62
+ defaultProps: {
63
+ value: '// Write your code here\nconsole.log("Hello, World!");',
64
+ language: 'javascript',
65
+ theme: 'vs-dark',
66
+ height: '400px',
67
+ readOnly: false,
68
+ },
69
+ }
70
+ );
71
+
72
+ // Standard Export Protocol - for manual integration
73
+ export const editorComponents = {
74
+ 'code-editor': CodeEditorRenderer,
75
+ };
package/src/types.ts ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * TypeScript type definitions for @object-ui/plugin-editor
3
+ *
4
+ * These types can be imported by applications using this plugin
5
+ * to get full TypeScript support for code-editor schemas.
6
+ */
7
+
8
+ import type { BaseSchema } from '@object-ui/types';
9
+
10
+ /**
11
+ * Code Editor component schema.
12
+ * Renders a Monaco-based code editor with syntax highlighting.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import type { CodeEditorSchema } from '@object-ui/plugin-editor';
17
+ *
18
+ * const editorSchema: CodeEditorSchema = {
19
+ * type: 'code-editor',
20
+ * value: 'console.log("Hello, World!");',
21
+ * language: 'javascript',
22
+ * theme: 'vs-dark',
23
+ * height: '400px'
24
+ * }
25
+ * ```
26
+ */
27
+ export interface CodeEditorSchema extends BaseSchema {
28
+ type: 'code-editor';
29
+
30
+ /**
31
+ * The code content to display in the editor.
32
+ */
33
+ value?: string;
34
+
35
+ /**
36
+ * Programming language for syntax highlighting.
37
+ * @default 'javascript'
38
+ */
39
+ language?: 'javascript' | 'typescript' | 'python' | 'json' | 'html' | 'css' | 'markdown' | string;
40
+
41
+ /**
42
+ * Color theme for the editor.
43
+ * @default 'vs-dark'
44
+ */
45
+ theme?: 'vs-dark' | 'light';
46
+
47
+ /**
48
+ * Height of the editor.
49
+ * @default '400px'
50
+ */
51
+ height?: string;
52
+
53
+ /**
54
+ * Whether the editor is read-only.
55
+ * @default false
56
+ */
57
+ readOnly?: boolean;
58
+
59
+ /**
60
+ * Callback when the code content changes.
61
+ */
62
+ onChange?: (value: string | undefined) => void;
63
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "jsx": "react-jsx",
6
+ "baseUrl": ".",
7
+ "paths": {
8
+ "@/*": ["src/*"]
9
+ },
10
+ "noImplicitAny": true,
11
+ "noEmit": false,
12
+ "declaration": true,
13
+ "composite": true,
14
+ "skipLibCheck": true
15
+ },
16
+ "include": ["src"]
17
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import dts from 'vite-plugin-dts';
4
+ import { resolve } from 'path';
5
+
6
+ export default defineConfig({
7
+ plugins: [
8
+ react(),
9
+ dts({
10
+ insertTypesEntry: true,
11
+ include: ['src'],
12
+ }),
13
+ ],
14
+ resolve: {
15
+ alias: {
16
+ '@': resolve(__dirname, './src'),
17
+ },
18
+ },
19
+ build: {
20
+ lib: {
21
+ entry: resolve(__dirname, 'src/index.tsx'),
22
+ name: 'ObjectUIPluginEditor',
23
+ fileName: 'index',
24
+ },
25
+ rollupOptions: {
26
+ external: ['react', 'react-dom', '@object-ui/components', '@object-ui/core', '@object-ui/react'],
27
+ output: {
28
+ globals: {
29
+ react: 'React',
30
+ 'react-dom': 'ReactDOM',
31
+ '@object-ui/components': 'ObjectUIComponents',
32
+ '@object-ui/core': 'ObjectUICore',
33
+ '@object-ui/react': 'ObjectUIReact',
34
+ },
35
+ },
36
+ },
37
+ },
38
+ });
@@ -0,0 +1,43 @@
1
+ // vite.config.ts
2
+ import { defineConfig } from "file:///home/runner/work/objectui/objectui/node_modules/.pnpm/vite@5.4.21_@types+node@24.10.8/node_modules/vite/dist/node/index.js";
3
+ import react from "file:///home/runner/work/objectui/objectui/node_modules/.pnpm/@vitejs+plugin-react@4.7.0_vite@5.4.21_@types+node@24.10.8_/node_modules/@vitejs/plugin-react/dist/index.js";
4
+ import dts from "file:///home/runner/work/objectui/objectui/node_modules/.pnpm/vite-plugin-dts@3.9.1_@types+node@24.10.8_rollup@4.55.1_typescript@5.9.3_vite@5.4.21_@types+node@24.10.8_/node_modules/vite-plugin-dts/dist/index.mjs";
5
+ import { resolve } from "path";
6
+ var __vite_injected_original_dirname = "/home/runner/work/objectui/objectui/packages/plugin-editor";
7
+ var vite_config_default = defineConfig({
8
+ plugins: [
9
+ react(),
10
+ dts({
11
+ insertTypesEntry: true,
12
+ include: ["src"]
13
+ })
14
+ ],
15
+ resolve: {
16
+ alias: {
17
+ "@": resolve(__vite_injected_original_dirname, "./src")
18
+ }
19
+ },
20
+ build: {
21
+ lib: {
22
+ entry: resolve(__vite_injected_original_dirname, "src/index.tsx"),
23
+ name: "ObjectUIPluginEditor",
24
+ fileName: "index"
25
+ },
26
+ rollupOptions: {
27
+ external: ["react", "react-dom", "@object-ui/components", "@object-ui/core", "@object-ui/react"],
28
+ output: {
29
+ globals: {
30
+ react: "React",
31
+ "react-dom": "ReactDOM",
32
+ "@object-ui/components": "ObjectUIComponents",
33
+ "@object-ui/core": "ObjectUICore",
34
+ "@object-ui/react": "ObjectUIReact"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ });
40
+ export {
41
+ vite_config_default as default
42
+ };
43
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvaG9tZS9ydW5uZXIvd29yay9vYmplY3R1aS9vYmplY3R1aS9wYWNrYWdlcy9wbHVnaW4tZWRpdG9yXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvaG9tZS9ydW5uZXIvd29yay9vYmplY3R1aS9vYmplY3R1aS9wYWNrYWdlcy9wbHVnaW4tZWRpdG9yL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9ob21lL3J1bm5lci93b3JrL29iamVjdHVpL29iamVjdHVpL3BhY2thZ2VzL3BsdWdpbi1lZGl0b3Ivdml0ZS5jb25maWcudHNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcbmltcG9ydCByZWFjdCBmcm9tICdAdml0ZWpzL3BsdWdpbi1yZWFjdCc7XG5pbXBvcnQgZHRzIGZyb20gJ3ZpdGUtcGx1Z2luLWR0cyc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHBsdWdpbnM6IFtcbiAgICByZWFjdCgpLFxuICAgIGR0cyh7XG4gICAgICBpbnNlcnRUeXBlc0VudHJ5OiB0cnVlLFxuICAgICAgaW5jbHVkZTogWydzcmMnXSxcbiAgICB9KSxcbiAgXSxcbiAgcmVzb2x2ZToge1xuICAgIGFsaWFzOiB7XG4gICAgICAnQCc6IHJlc29sdmUoX19kaXJuYW1lLCAnLi9zcmMnKSxcbiAgICB9LFxuICB9LFxuICBidWlsZDoge1xuICAgIGxpYjoge1xuICAgICAgZW50cnk6IHJlc29sdmUoX19kaXJuYW1lLCAnc3JjL2luZGV4LnRzeCcpLFxuICAgICAgbmFtZTogJ09iamVjdFVJUGx1Z2luRWRpdG9yJyxcbiAgICAgIGZpbGVOYW1lOiAnaW5kZXgnLFxuICAgIH0sXG4gICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgZXh0ZXJuYWw6IFsncmVhY3QnLCAncmVhY3QtZG9tJywgJ0BvYmplY3QtdWkvY29tcG9uZW50cycsICdAb2JqZWN0LXVpL2NvcmUnLCAnQG9iamVjdC11aS9yZWFjdCddLFxuICAgICAgb3V0cHV0OiB7XG4gICAgICAgIGdsb2JhbHM6IHtcbiAgICAgICAgICByZWFjdDogJ1JlYWN0JyxcbiAgICAgICAgICAncmVhY3QtZG9tJzogJ1JlYWN0RE9NJyxcbiAgICAgICAgICAnQG9iamVjdC11aS9jb21wb25lbnRzJzogJ09iamVjdFVJQ29tcG9uZW50cycsXG4gICAgICAgICAgJ0BvYmplY3QtdWkvY29yZSc6ICdPYmplY3RVSUNvcmUnLFxuICAgICAgICAgICdAb2JqZWN0LXVpL3JlYWN0JzogJ09iamVjdFVJUmVhY3QnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQWdXLFNBQVMsb0JBQW9CO0FBQzdYLE9BQU8sV0FBVztBQUNsQixPQUFPLFNBQVM7QUFDaEIsU0FBUyxlQUFlO0FBSHhCLElBQU0sbUNBQW1DO0FBS3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFNBQVM7QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLElBQUk7QUFBQSxNQUNGLGtCQUFrQjtBQUFBLE1BQ2xCLFNBQVMsQ0FBQyxLQUFLO0FBQUEsSUFDakIsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNQLE9BQU87QUFBQSxNQUNMLEtBQUssUUFBUSxrQ0FBVyxPQUFPO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxLQUFLO0FBQUEsTUFDSCxPQUFPLFFBQVEsa0NBQVcsZUFBZTtBQUFBLE1BQ3pDLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxlQUFlO0FBQUEsTUFDYixVQUFVLENBQUMsU0FBUyxhQUFhLHlCQUF5QixtQkFBbUIsa0JBQWtCO0FBQUEsTUFDL0YsUUFBUTtBQUFBLFFBQ04sU0FBUztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IseUJBQXlCO0FBQUEsVUFDekIsbUJBQW1CO0FBQUEsVUFDbkIsb0JBQW9CO0FBQUEsUUFDdEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=