@morphql/playground 0.1.9 → 0.1.10

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.
@@ -351,4 +351,4 @@ set totalWithTax = total * (1 + taxRate)`}},{name:"if",category:"control",doc:{s
351
351
  )`}},{name:"modify",category:"action",doc:{signature:"modify <target> = <expression>",description:"Modifies a field in the output by reading from the target (not source). Useful for post-processing already-mapped values.",parameters:[{name:"target",description:"The field name to modify"},{name:"expression",description:"The expression to assign (reads from target, not source)"}],example:`set total = price * quantity
352
352
  modify total = total * 1.10`}},{name:"return",category:"action",doc:{signature:"return <expression>",description:"Returns a value from the transformation, bypassing the default serialization. Reads from target context by default.",parameters:[{name:"expression",description:"The value to return"}],example:`set computed = price * 1.1
353
353
  return computed`}}],w2=()=>C2.map(i=>i.name),L2=[{name:"substring",doc:{signature:"substring(str, start, [length])",description:"Extracts a portion of a string. Supports negative indices.",parameters:[{name:"str",description:"The source string"},{name:"start",description:"Starting index (0-based, negative counts from end)"},{name:"length",description:"(Optional) Number of characters to extract"}],returns:"string",example:`substring("Hello World", 0, 5) // "Hello"
354
- substring("Hello World", -5) // "World"`}},{name:"split",doc:{signature:"split(str, [separator], [limit])",description:"Splits a string into an array.",parameters:[{name:"str",description:"The string to split"},{name:"separator",description:'(Optional) Delimiter string. Default: ""'},{name:"limit",description:"(Optional) Maximum number of splits"}],returns:"array",example:'split("a,b,c", ",") // ["a", "b", "c"]'}},{name:"replace",doc:{signature:"replace(str, search, replacement)",description:"Replaces occurrences in a string.",parameters:[{name:"str",description:"The source string"},{name:"search",description:"The substring to find"},{name:"replacement",description:"The replacement string"}],returns:"string",example:'replace("Hello World", "World", "MorphQL") // "Hello MorphQL"'}},{name:"text",doc:{signature:"text(value)",description:"Converts a value to a string.",parameters:[{name:"value",description:"The value to convert"}],returns:"string",example:'text(123) // "123"'}},{name:"number",doc:{signature:"number(value)",description:"Converts a value to a number.",parameters:[{name:"value",description:"The value to convert"}],returns:"number",example:'number("42") // 42'}},{name:"uppercase",doc:{signature:"uppercase(str)",description:"Converts a string to uppercase.",parameters:[{name:"str",description:"The string to convert"}],returns:"string",example:'uppercase("hello") // "HELLO"'}},{name:"lowercase",doc:{signature:"lowercase(str)",description:"Converts a string to lowercase.",parameters:[{name:"str",description:"The string to convert"}],returns:"string",example:'lowercase("HELLO") // "hello"'}},{name:"extractnumber",doc:{signature:"extractnumber(str)",description:"Extracts the first numeric sequence from a string.",parameters:[{name:"str",description:"The string to extract from"}],returns:"number",example:'extractnumber("Price: 100USD") // 100'}},{name:"xmlnode",doc:{signature:"xmlnode(value, [attrKey, attrVal, ...])",description:"Wraps a value for XML output with optional attributes.",parameters:[{name:"value",description:"The node content"},{name:"attrKey, attrVal",description:"(Optional) Pairs of attribute keys and values"}],returns:"XML node",example:'xmlnode(content, "id", 1, "type", "text")'}},{name:"to_base64",doc:{signature:"to_base64(value)",description:"Encodes a string value to Base64.",parameters:[{name:"value",description:"The string to encode"}],returns:"string",example:'to_base64("hello") // "aGVsbG8="'}},{name:"from_base64",doc:{signature:"from_base64(value)",description:"Decodes a Base64 string value.",parameters:[{name:"value",description:"The Base64 string to decode"}],returns:"string",example:'from_base64("aGVsbG8=") // "hello"'}},{name:"aslist",doc:{signature:"aslist(value)",description:"Ensures a value is an array. Useful for input formats like XML that might return a single object or an array for the same field.",parameters:[{name:"value",description:"The value to normalize"}],returns:"array",example:"aslist(items) // Always returns an array"}},{name:"spreadsheet",doc:{signature:"spreadsheet(data)",description:"Converts spreadsheet-style data (array of arrays) into an array of objects with named properties. First row is treated as headers.",parameters:[{name:"data",description:"Array of arrays (rows)"}],returns:"array of objects",example:'spreadsheet(csvData) // Converts [["name","age"],["John",30]] to [{name:"John",age:30}]'}}],M2=()=>L2.map(i=>i.name),k2=[{symbol:"===",category:"comparison",precedence:7},{symbol:"!==",category:"comparison",precedence:7},{symbol:"==",category:"comparison",precedence:7},{symbol:"!=",category:"comparison",precedence:7},{symbol:"<=",category:"comparison",precedence:6},{symbol:">=",category:"comparison",precedence:6},{symbol:"<",category:"comparison",precedence:6},{symbol:">",category:"comparison",precedence:6},{symbol:"&&",category:"logical",precedence:5},{symbol:"||",category:"logical",precedence:4},{symbol:"!",category:"logical",precedence:9},{symbol:"+",category:"arithmetic",precedence:10},{symbol:"-",category:"arithmetic",precedence:10},{symbol:"*",category:"arithmetic",precedence:11},{symbol:"/",category:"arithmetic",precedence:11},{symbol:"=",category:"assignment",precedence:1}],U2=()=>k2.map(i=>i.symbol);function I2(){return{keywords:w2(),builtinFunctions:M2(),operators:U2(),symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\/\/.*$/,"comment"],[/\/\*/,"comment","@comment"],[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":"keyword","@builtinFunctions":"predefined","@default":"identifier"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/,"number"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]]}}}const z2=I2();function B2(i){i.languages.register({id:"morphql"}),i.languages.setMonarchTokensProvider("morphql",z2),i.languages.setLanguageConfiguration("morphql",{comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"(",close:")"},{open:"{",close:"}"},{open:"[",close:"]"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"(",close:")"},{open:"{",close:"}"},{open:"[",close:"]"},{open:'"',close:'"'},{open:"'",close:"'"}]})}function eo({node:i,name:n}){const[s,r]=pt.useState(!0);if(!i)return null;const u=i.properties&&Object.keys(i.properties).length>0,c=i.items,h=u||c,p=d=>{switch(d){case"string":return"text-emerald-400";case"number":return"text-amber-400";case"boolean":return"text-indigo-400";case"array":return"text-pink-400";case"object":return"text-slate-400";default:return"text-slate-500"}};return et.jsxs("div",{className:"pl-4",children:[et.jsxs("div",{className:"flex items-center gap-2 py-0.5 group",children:[h?et.jsx("button",{onClick:()=>r(!s),className:"p-0.5 hover:bg-slate-800 rounded transition-colors text-slate-500",children:et.jsx(Lu,{className:`w-3 h-3 transition-transform ${s?"rotate-90":""}`})}):et.jsx("div",{className:"w-4"}),n&&et.jsxs("span",{className:"text-xs font-mono text-slate-300",children:[n,":"]}),et.jsxs("span",{className:`text-[10px] uppercase font-bold ${p(i.type)} tracking-wider opacity-80`,children:[i.type,i.isOpen&&et.jsx("span",{className:"text-[10px] text-indigo-400 ml-1 italic",children:"(open)"})]})]}),s&&et.jsxs("div",{children:[u&&Object.entries(i.properties).map(([d,_])=>et.jsx(eo,{name:d,node:_},d)),c&&et.jsx(eo,{name:"items",node:i.items})]})]})}function j2({initialQuery:i=As[0].query,initialSourceData:n=As[0].source,className:s="",onQueryChange:r,onSourceDataChange:u}){const[c,h]=pt.useState(i),[p,d]=pt.useState(n),[_,T]=pt.useState(!1),[v,R]=pt.useState({result:"",generatedCode:"",error:null}),[q,K]=pt.useState("query"),[Q,O]=pt.useState("output"),b=C=>{const y=C.trim();return y.startsWith("<")?"xml":y.startsWith("{")||y.startsWith("[")?"json":"plaintext"},N=b(p);pt.useEffect(()=>{h(i)},[i]),pt.useEffect(()=>{d(n)},[n]),pt.useEffect(()=>{async function C(){try{const y=await x2(c,{analyze:!0}),S=y(p);R({result:typeof S=="string"?S:JSON.stringify(S,null,2),generatedCode:y.code,error:null,analysis:y.analysis})}catch(y){R({result:"",generatedCode:"",error:y instanceof Error?y.message:String(y)})}}C()},[c,p]);const P=C=>{const y=As.find(S=>S.name===C.target.value);y&&(h(y.query),d(y.source),r?.(y.query),u?.(y.source))},z=()=>{navigator.clipboard.writeText(v.result),T(!0),setTimeout(()=>T(!1),2e3)},Z=C=>{const y=C||"";h(y),r?.(y)},I=C=>{const y=C||"";d(y),u?.(y)};return et.jsxs("div",{className:`flex flex-col h-full bg-[#0f172a] text-slate-200 overflow-hidden ${s}`,children:[et.jsxs("header",{className:"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-[#1e293b]",children:[et.jsxs("div",{className:"flex items-center gap-3",children:[et.jsx("div",{className:"w-8 h-8 rounded-lg bg-indigo-500 flex items-center justify-center shadow-lg shadow-indigo-500/20",children:et.jsx(Lu,{className:"w-5 h-5 text-white fill-current"})}),et.jsxs("div",{children:[et.jsx("h1",{className:"text-lg font-bold bg-clip-text text-transparent bg-gradient-to-r from-white to-slate-400",children:"MorphQL Playground"}),et.jsx("p",{className:"text-xs text-slate-400 font-medium",children:"High-Performance Query-to-Code Engine"})]})]}),et.jsxs("div",{className:"flex items-center gap-4",children:[et.jsxs("select",{className:"text-xs font-semibold px-3 py-1.5 rounded-full bg-slate-800 hover:bg-slate-700 transition-colors border border-slate-700 text-slate-200 outline-none cursor-pointer",onChange:P,defaultValue:"",children:[et.jsx("option",{value:"",disabled:!0,children:"Load Example..."}),As.map(C=>et.jsx("option",{value:C.name,children:C.name},C.name))]}),et.jsx("a",{href:"https://hyperwindmill.github.io/morphql",className:"text-xs font-semibold px-3 py-1.5 rounded-full bg-slate-800 hover:bg-slate-700 transition-colors border border-slate-700",children:"Documentation"})]})]}),et.jsxs("main",{className:"flex-1 flex overflow-hidden",children:[et.jsxs("div",{className:"w-1/2 flex flex-col border-r border-slate-800",children:[et.jsxs("div",{className:"flex items-center gap-1 px-4 py-2 bg-slate-900 border-b border-slate-800",children:[et.jsxs("button",{onClick:()=>K("query"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${q==="query"?"bg-slate-800 text-indigo-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(gS,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Morph Query"})]}),et.jsxs("button",{onClick:()=>K("js"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${q==="js"?"bg-slate-800 text-amber-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(fS,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Generated JS"})]}),et.jsxs("button",{onClick:()=>K("source"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${q==="source"?"bg-slate-800 text-emerald-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(Nm,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Source Data"})]})]}),et.jsxs("div",{className:"flex-1 overflow-hidden",children:[et.jsx("div",{className:`h-full flex flex-col pt-2 bg-[#1e1e1e] ${q==="query"?"block":"hidden"}`,children:et.jsx(vu,{theme:"vs-dark",defaultLanguage:"morphql",value:c,onChange:Z,beforeMount:C=>{B2(C)},options:{minimap:{enabled:!1},fontSize:13,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})}),et.jsx("div",{className:`h-full flex flex-col pt-2 bg-[#1e1e1e] ${q==="js"?"block":"hidden"}`,children:et.jsx(vu,{theme:"vs-dark",defaultLanguage:"javascript",value:v.generatedCode,options:{readOnly:!0,minimap:{enabled:!1},fontSize:13,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})}),et.jsx("div",{className:`h-full flex flex-col pt-2 bg-[#1e1e1e] ${q==="source"?"block":"hidden"}`,children:et.jsx(vu,{theme:"vs-dark",language:N,value:p,onChange:I,options:{minimap:{enabled:!1},fontSize:14,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})})]})]}),et.jsxs("div",{className:"w-1/2 flex flex-col overflow-hidden",children:[et.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-slate-900 border-b border-slate-800",children:[et.jsxs("div",{className:"flex items-center gap-1",children:[et.jsxs("button",{onClick:()=>O("output"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${Q==="output"?"bg-slate-800 text-amber-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(Lu,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Transformation Result"})]}),et.jsxs("button",{onClick:()=>O("structure"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${Q==="structure"?"bg-slate-800 text-indigo-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(Rm,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Structure"})]})]}),Q==="output"&&et.jsx("button",{onClick:z,className:"p-1 hover:bg-slate-800 rounded transition-colors text-slate-400 hover:text-white",title:"Copy Result",children:_?et.jsx(oS,{className:"w-4 h-4 text-emerald-400"}):et.jsx(dS,{className:"w-4 h-4"})})]}),et.jsxs("div",{className:"flex-1 overflow-hidden bg-[#1e1e1e]",children:[et.jsx("div",{className:`h-full flex flex-col pt-2 ${Q==="output"?"block":"hidden"}`,children:v.error?et.jsxs("div",{className:"p-4 flex gap-3 text-red-400 bg-red-950/20 m-4 rounded-lg border border-red-900/50",children:[et.jsx(Rm,{className:"w-5 h-5 flex-shrink-0"}),et.jsxs("div",{children:[et.jsx("p",{className:"text-sm font-bold mb-1",children:"Compilation/Execution Error"}),et.jsx("p",{className:"text-xs font-mono",children:v.error})]})]}):et.jsx(vu,{theme:"vs-dark",language:b(v.result),value:v.result,options:{readOnly:!0,minimap:{enabled:!1},fontSize:14,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})}),Q==="structure"&&et.jsxs("div",{className:"h-full flex flex-col divide-y divide-slate-800 overflow-hidden",children:[et.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[et.jsxs("div",{className:"px-4 py-1.5 bg-slate-900/50 flex items-center justify-between border-b border-slate-800",children:[et.jsx("span",{className:"text-[9px] font-black uppercase tracking-widest text-slate-500",children:"Input Structure"}),et.jsx(Nm,{className:"w-3 h-3 text-slate-600"})]}),et.jsx("div",{className:"flex-1 overflow-auto p-4 custom-scrollbar",children:v.analysis?.source?et.jsx(eo,{node:v.analysis.source}):et.jsx("div",{className:"h-full flex items-center justify-center text-slate-600 italic text-xs",children:"No input structure detected"})})]}),et.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[et.jsxs("div",{className:"px-4 py-1.5 bg-slate-900/50 flex items-center justify-between border-b border-slate-800",children:[et.jsx("span",{className:"text-[9px] font-black uppercase tracking-widest text-slate-500",children:"Output Structure"}),et.jsx(Lu,{className:"w-3 h-3 text-slate-600"})]}),et.jsx("div",{className:"flex-1 overflow-auto p-4 custom-scrollbar",children:v.analysis?.target?et.jsx(eo,{node:v.analysis.target}):et.jsx("div",{className:"h-full flex items-center justify-center text-slate-600 italic text-xs",children:"No output structure detected"})})]})]})]})]})]}),et.jsxs("footer",{className:"px-6 py-2 border-t border-slate-800 bg-[#1e293b] flex justify-between items-center",children:[et.jsx("div",{className:"flex items-center gap-6",children:et.jsx("div",{className:"text-[10px] font-bold text-slate-500 uppercase tracking-tighter",children:"Version: 0.1.9"})}),et.jsx("div",{className:"text-[10px] text-slate-500 font-medium italic",children:"MorphQL Engine © 2026"})]})]})}function D2(){const[i,n]=pt.useState(()=>sessionStorage.getItem("morph_query")||As[0].query),[s,r]=pt.useState(()=>sessionStorage.getItem("morph_source")||As[0].source),u=h=>{n(h),sessionStorage.setItem("morph_query",h)},c=h=>{r(h),sessionStorage.setItem("morph_source",h)};return et.jsx("div",{className:"h-screen w-screen",children:et.jsx(j2,{initialQuery:i,initialSourceData:s,onQueryChange:u,onSourceDataChange:c})})}YT.createRoot(document.getElementById("root")).render(et.jsx(Ra.StrictMode,{children:et.jsx(D2,{})}))});export default P2();
354
+ substring("Hello World", -5) // "World"`}},{name:"split",doc:{signature:"split(str, [separator], [limit])",description:"Splits a string into an array.",parameters:[{name:"str",description:"The string to split"},{name:"separator",description:'(Optional) Delimiter string. Default: ""'},{name:"limit",description:"(Optional) Maximum number of splits"}],returns:"array",example:'split("a,b,c", ",") // ["a", "b", "c"]'}},{name:"replace",doc:{signature:"replace(str, search, replacement)",description:"Replaces occurrences in a string.",parameters:[{name:"str",description:"The source string"},{name:"search",description:"The substring to find"},{name:"replacement",description:"The replacement string"}],returns:"string",example:'replace("Hello World", "World", "MorphQL") // "Hello MorphQL"'}},{name:"text",doc:{signature:"text(value)",description:"Converts a value to a string.",parameters:[{name:"value",description:"The value to convert"}],returns:"string",example:'text(123) // "123"'}},{name:"number",doc:{signature:"number(value)",description:"Converts a value to a number.",parameters:[{name:"value",description:"The value to convert"}],returns:"number",example:'number("42") // 42'}},{name:"uppercase",doc:{signature:"uppercase(str)",description:"Converts a string to uppercase.",parameters:[{name:"str",description:"The string to convert"}],returns:"string",example:'uppercase("hello") // "HELLO"'}},{name:"lowercase",doc:{signature:"lowercase(str)",description:"Converts a string to lowercase.",parameters:[{name:"str",description:"The string to convert"}],returns:"string",example:'lowercase("HELLO") // "hello"'}},{name:"extractnumber",doc:{signature:"extractnumber(str)",description:"Extracts the first numeric sequence from a string.",parameters:[{name:"str",description:"The string to extract from"}],returns:"number",example:'extractnumber("Price: 100USD") // 100'}},{name:"xmlnode",doc:{signature:"xmlnode(value, [attrKey, attrVal, ...])",description:"Wraps a value for XML output with optional attributes.",parameters:[{name:"value",description:"The node content"},{name:"attrKey, attrVal",description:"(Optional) Pairs of attribute keys and values"}],returns:"XML node",example:'xmlnode(content, "id", 1, "type", "text")'}},{name:"to_base64",doc:{signature:"to_base64(value)",description:"Encodes a string value to Base64.",parameters:[{name:"value",description:"The string to encode"}],returns:"string",example:'to_base64("hello") // "aGVsbG8="'}},{name:"from_base64",doc:{signature:"from_base64(value)",description:"Decodes a Base64 string value.",parameters:[{name:"value",description:"The Base64 string to decode"}],returns:"string",example:'from_base64("aGVsbG8=") // "hello"'}},{name:"aslist",doc:{signature:"aslist(value)",description:"Ensures a value is an array. Useful for input formats like XML that might return a single object or an array for the same field.",parameters:[{name:"value",description:"The value to normalize"}],returns:"array",example:"aslist(items) // Always returns an array"}},{name:"spreadsheet",doc:{signature:"spreadsheet(data)",description:"Converts spreadsheet-style data (array of arrays) into an array of objects with named properties. First row is treated as headers.",parameters:[{name:"data",description:"Array of arrays (rows)"}],returns:"array of objects",example:'spreadsheet(csvData) // Converts [["name","age"],["John",30]] to [{name:"John",age:30}]'}}],M2=()=>L2.map(i=>i.name),k2=[{symbol:"===",category:"comparison",precedence:7},{symbol:"!==",category:"comparison",precedence:7},{symbol:"==",category:"comparison",precedence:7},{symbol:"!=",category:"comparison",precedence:7},{symbol:"<=",category:"comparison",precedence:6},{symbol:">=",category:"comparison",precedence:6},{symbol:"<",category:"comparison",precedence:6},{symbol:">",category:"comparison",precedence:6},{symbol:"&&",category:"logical",precedence:5},{symbol:"||",category:"logical",precedence:4},{symbol:"!",category:"logical",precedence:9},{symbol:"+",category:"arithmetic",precedence:10},{symbol:"-",category:"arithmetic",precedence:10},{symbol:"*",category:"arithmetic",precedence:11},{symbol:"/",category:"arithmetic",precedence:11},{symbol:"=",category:"assignment",precedence:1}],U2=()=>k2.map(i=>i.symbol);function I2(){return{keywords:w2(),builtinFunctions:M2(),operators:U2(),symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\/\/.*$/,"comment"],[/\/\*/,"comment","@comment"],[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":"keyword","@builtinFunctions":"predefined","@default":"identifier"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/,"number"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]]}}}const z2=I2();function B2(i){i.languages.register({id:"morphql"}),i.languages.setMonarchTokensProvider("morphql",z2),i.languages.setLanguageConfiguration("morphql",{comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"(",close:")"},{open:"{",close:"}"},{open:"[",close:"]"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"(",close:")"},{open:"{",close:"}"},{open:"[",close:"]"},{open:'"',close:'"'},{open:"'",close:"'"}]})}function eo({node:i,name:n}){const[s,r]=pt.useState(!0);if(!i)return null;const u=i.properties&&Object.keys(i.properties).length>0,c=i.items,h=u||c,p=d=>{switch(d){case"string":return"text-emerald-400";case"number":return"text-amber-400";case"boolean":return"text-indigo-400";case"array":return"text-pink-400";case"object":return"text-slate-400";default:return"text-slate-500"}};return et.jsxs("div",{className:"pl-4",children:[et.jsxs("div",{className:"flex items-center gap-2 py-0.5 group",children:[h?et.jsx("button",{onClick:()=>r(!s),className:"p-0.5 hover:bg-slate-800 rounded transition-colors text-slate-500",children:et.jsx(Lu,{className:`w-3 h-3 transition-transform ${s?"rotate-90":""}`})}):et.jsx("div",{className:"w-4"}),n&&et.jsxs("span",{className:"text-xs font-mono text-slate-300",children:[n,":"]}),et.jsxs("span",{className:`text-[10px] uppercase font-bold ${p(i.type)} tracking-wider opacity-80`,children:[i.type,i.isOpen&&et.jsx("span",{className:"text-[10px] text-indigo-400 ml-1 italic",children:"(open)"})]})]}),s&&et.jsxs("div",{children:[u&&Object.entries(i.properties).map(([d,_])=>et.jsx(eo,{name:d,node:_},d)),c&&et.jsx(eo,{name:"items",node:i.items})]})]})}function j2({initialQuery:i=As[0].query,initialSourceData:n=As[0].source,className:s="",onQueryChange:r,onSourceDataChange:u}){const[c,h]=pt.useState(i),[p,d]=pt.useState(n),[_,T]=pt.useState(!1),[v,R]=pt.useState({result:"",generatedCode:"",error:null}),[q,K]=pt.useState("query"),[Q,O]=pt.useState("output"),b=C=>{const y=C.trim();return y.startsWith("<")?"xml":y.startsWith("{")||y.startsWith("[")?"json":"plaintext"},N=b(p);pt.useEffect(()=>{h(i)},[i]),pt.useEffect(()=>{d(n)},[n]),pt.useEffect(()=>{async function C(){try{const y=await x2(c,{analyze:!0}),S=y(p);R({result:typeof S=="string"?S:JSON.stringify(S,null,2),generatedCode:y.code,error:null,analysis:y.analysis})}catch(y){R({result:"",generatedCode:"",error:y instanceof Error?y.message:String(y)})}}C()},[c,p]);const P=C=>{const y=As.find(S=>S.name===C.target.value);y&&(h(y.query),d(y.source),r?.(y.query),u?.(y.source))},z=()=>{navigator.clipboard.writeText(v.result),T(!0),setTimeout(()=>T(!1),2e3)},Z=C=>{const y=C||"";h(y),r?.(y)},I=C=>{const y=C||"";d(y),u?.(y)};return et.jsxs("div",{className:`flex flex-col h-full bg-[#0f172a] text-slate-200 overflow-hidden ${s}`,children:[et.jsxs("header",{className:"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-[#1e293b]",children:[et.jsxs("div",{className:"flex items-center gap-3",children:[et.jsx("div",{className:"w-8 h-8 rounded-lg bg-indigo-500 flex items-center justify-center shadow-lg shadow-indigo-500/20",children:et.jsx(Lu,{className:"w-5 h-5 text-white fill-current"})}),et.jsxs("div",{children:[et.jsx("h1",{className:"text-lg font-bold bg-clip-text text-transparent bg-gradient-to-r from-white to-slate-400",children:"MorphQL Playground"}),et.jsx("p",{className:"text-xs text-slate-400 font-medium",children:"High-Performance Query-to-Code Engine"})]})]}),et.jsxs("div",{className:"flex items-center gap-4",children:[et.jsxs("select",{className:"text-xs font-semibold px-3 py-1.5 rounded-full bg-slate-800 hover:bg-slate-700 transition-colors border border-slate-700 text-slate-200 outline-none cursor-pointer",onChange:P,defaultValue:"",children:[et.jsx("option",{value:"",disabled:!0,children:"Load Example..."}),As.map(C=>et.jsx("option",{value:C.name,children:C.name},C.name))]}),et.jsx("a",{href:"https://hyperwindmill.github.io/morphql",className:"text-xs font-semibold px-3 py-1.5 rounded-full bg-slate-800 hover:bg-slate-700 transition-colors border border-slate-700",children:"Documentation"})]})]}),et.jsxs("main",{className:"flex-1 flex overflow-hidden",children:[et.jsxs("div",{className:"w-1/2 flex flex-col border-r border-slate-800",children:[et.jsxs("div",{className:"flex items-center gap-1 px-4 py-2 bg-slate-900 border-b border-slate-800",children:[et.jsxs("button",{onClick:()=>K("query"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${q==="query"?"bg-slate-800 text-indigo-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(gS,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Morph Query"})]}),et.jsxs("button",{onClick:()=>K("js"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${q==="js"?"bg-slate-800 text-amber-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(fS,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Generated JS"})]}),et.jsxs("button",{onClick:()=>K("source"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${q==="source"?"bg-slate-800 text-emerald-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(Nm,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Source Data"})]})]}),et.jsxs("div",{className:"flex-1 overflow-hidden",children:[et.jsx("div",{className:`h-full flex flex-col pt-2 bg-[#1e1e1e] ${q==="query"?"block":"hidden"}`,children:et.jsx(vu,{theme:"vs-dark",defaultLanguage:"morphql",value:c,onChange:Z,beforeMount:C=>{B2(C)},options:{minimap:{enabled:!1},fontSize:13,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})}),et.jsx("div",{className:`h-full flex flex-col pt-2 bg-[#1e1e1e] ${q==="js"?"block":"hidden"}`,children:et.jsx(vu,{theme:"vs-dark",defaultLanguage:"javascript",value:v.generatedCode,options:{readOnly:!0,minimap:{enabled:!1},fontSize:13,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})}),et.jsx("div",{className:`h-full flex flex-col pt-2 bg-[#1e1e1e] ${q==="source"?"block":"hidden"}`,children:et.jsx(vu,{theme:"vs-dark",language:N,value:p,onChange:I,options:{minimap:{enabled:!1},fontSize:14,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})})]})]}),et.jsxs("div",{className:"w-1/2 flex flex-col overflow-hidden",children:[et.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-slate-900 border-b border-slate-800",children:[et.jsxs("div",{className:"flex items-center gap-1",children:[et.jsxs("button",{onClick:()=>O("output"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${Q==="output"?"bg-slate-800 text-amber-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(Lu,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Transformation Result"})]}),et.jsxs("button",{onClick:()=>O("structure"),className:`flex items-center gap-2 px-3 py-1.5 rounded-md transition-all ${Q==="structure"?"bg-slate-800 text-indigo-400 shadow-sm":"text-slate-500 hover:text-slate-300 hover:bg-slate-800/50"}`,children:[et.jsx(Rm,{className:"w-4 h-4"}),et.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider",children:"Structure"})]})]}),Q==="output"&&et.jsx("button",{onClick:z,className:"p-1 hover:bg-slate-800 rounded transition-colors text-slate-400 hover:text-white",title:"Copy Result",children:_?et.jsx(oS,{className:"w-4 h-4 text-emerald-400"}):et.jsx(dS,{className:"w-4 h-4"})})]}),et.jsxs("div",{className:"flex-1 overflow-hidden bg-[#1e1e1e]",children:[et.jsx("div",{className:`h-full flex flex-col pt-2 ${Q==="output"?"block":"hidden"}`,children:v.error?et.jsxs("div",{className:"p-4 flex gap-3 text-red-400 bg-red-950/20 m-4 rounded-lg border border-red-900/50",children:[et.jsx(Rm,{className:"w-5 h-5 flex-shrink-0"}),et.jsxs("div",{children:[et.jsx("p",{className:"text-sm font-bold mb-1",children:"Compilation/Execution Error"}),et.jsx("p",{className:"text-xs font-mono",children:v.error})]})]}):et.jsx(vu,{theme:"vs-dark",language:b(v.result),value:v.result,options:{readOnly:!0,minimap:{enabled:!1},fontSize:14,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:10}}})}),Q==="structure"&&et.jsxs("div",{className:"h-full flex flex-col divide-y divide-slate-800 overflow-hidden",children:[et.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[et.jsxs("div",{className:"px-4 py-1.5 bg-slate-900/50 flex items-center justify-between border-b border-slate-800",children:[et.jsx("span",{className:"text-[9px] font-black uppercase tracking-widest text-slate-500",children:"Input Structure"}),et.jsx(Nm,{className:"w-3 h-3 text-slate-600"})]}),et.jsx("div",{className:"flex-1 overflow-auto p-4 custom-scrollbar",children:v.analysis?.source?et.jsx(eo,{node:v.analysis.source}):et.jsx("div",{className:"h-full flex items-center justify-center text-slate-600 italic text-xs",children:"No input structure detected"})})]}),et.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[et.jsxs("div",{className:"px-4 py-1.5 bg-slate-900/50 flex items-center justify-between border-b border-slate-800",children:[et.jsx("span",{className:"text-[9px] font-black uppercase tracking-widest text-slate-500",children:"Output Structure"}),et.jsx(Lu,{className:"w-3 h-3 text-slate-600"})]}),et.jsx("div",{className:"flex-1 overflow-auto p-4 custom-scrollbar",children:v.analysis?.target?et.jsx(eo,{node:v.analysis.target}):et.jsx("div",{className:"h-full flex items-center justify-center text-slate-600 italic text-xs",children:"No output structure detected"})})]})]})]})]})]}),et.jsxs("footer",{className:"px-6 py-2 border-t border-slate-800 bg-[#1e293b] flex justify-between items-center",children:[et.jsx("div",{className:"flex items-center gap-6",children:et.jsx("div",{className:"text-[10px] font-bold text-slate-500 uppercase tracking-tighter",children:"Version: 0.1.10"})}),et.jsx("div",{className:"text-[10px] text-slate-500 font-medium italic",children:"MorphQL Engine © 2026"})]})]})}function D2(){const[i,n]=pt.useState(()=>sessionStorage.getItem("morph_query")||As[0].query),[s,r]=pt.useState(()=>sessionStorage.getItem("morph_source")||As[0].source),u=h=>{n(h),sessionStorage.setItem("morph_query",h)},c=h=>{r(h),sessionStorage.setItem("morph_source",h)};return et.jsx("div",{className:"h-screen w-screen",children:et.jsx(j2,{initialQuery:i,initialSourceData:s,onQueryChange:u,onSourceDataChange:c})})}YT.createRoot(document.getElementById("root")).render(et.jsx(Ra.StrictMode,{children:et.jsx(D2,{})}))});export default P2();
package/dist/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>playground</title>
8
- <script type="module" crossorigin src="/assets/index-DN0PJ3NV.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Va8sPisH.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-BZb28VQj.css">
10
10
  </head>
11
11
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morphql/playground",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "Interactive playground for morphql - Test MorphQL queries in real-time.",
5
5
  "type": "module",
6
6
  "publishConfig": {