@grapesjs/studio-sdk-plugins 1.0.21 → 1.0.22-rc.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.
Files changed (66) hide show
  1. package/dist/animationComponent/components/Animation.d.ts +6 -0
  2. package/dist/animationComponent/components/AnimationGroup.d.ts +4 -0
  3. package/dist/animationComponent/index.cjs.d.ts +3 -0
  4. package/dist/animationComponent/index.cjs.js +507 -0
  5. package/dist/animationComponent/index.d.ts +3 -0
  6. package/dist/animationComponent/index.es.d.ts +3 -0
  7. package/dist/animationComponent/index.es.js +1111 -0
  8. package/dist/animationComponent/index.umd.js +507 -0
  9. package/dist/animationComponent/shared.d.ts +3 -0
  10. package/dist/animationComponent/types.d.ts +28 -0
  11. package/dist/animationComponent/typesSchema.d.ts +48 -0
  12. package/dist/animationComponent/utils.d.ts +19 -0
  13. package/dist/dataSourceEjs/EjsExporter.d.ts +13 -0
  14. package/dist/dataSourceEjs/EjsImporter.d.ts +29 -0
  15. package/dist/dataSourceEjs/index.cjs.d.ts +2 -2
  16. package/dist/dataSourceEjs/index.cjs.js +24 -3
  17. package/dist/dataSourceEjs/index.d.ts +2 -2
  18. package/dist/dataSourceEjs/index.es.d.ts +2 -2
  19. package/dist/dataSourceEjs/index.es.js +697 -114
  20. package/dist/dataSourceEjs/index.umd.js +24 -3
  21. package/dist/dataSourceEjs/shared.d.ts +3 -0
  22. package/dist/dataSourceEjs/types.d.ts +2 -2
  23. package/dist/dataSourceEjs/typesSchema.d.ts +3 -0
  24. package/dist/dataSourceHandlebars/HandlebarsExporter.d.ts +16 -0
  25. package/dist/dataSourceHandlebars/HandlebarsImporter.d.ts +20 -0
  26. package/dist/dataSourceHandlebars/helperImplementations.d.ts +1 -0
  27. package/dist/dataSourceHandlebars/index.cjs.js +20 -1
  28. package/dist/dataSourceHandlebars/index.es.js +401 -99
  29. package/dist/dataSourceHandlebars/index.umd.js +20 -1
  30. package/dist/dataSourceHandlebars/shared.d.ts +3 -0
  31. package/dist/dataSourceHandlebars/types.d.ts +2 -2
  32. package/dist/dataSourceHandlebars/typesSchema.d.ts +3 -0
  33. package/dist/googleFontsAssetProvider/index.cjs.js +1 -1
  34. package/dist/googleFontsAssetProvider/index.es.js +29 -29
  35. package/dist/googleFontsAssetProvider/index.umd.js +1 -1
  36. package/dist/iconifyComponent/index.cjs.js +2 -2
  37. package/dist/iconifyComponent/index.es.js +64 -64
  38. package/dist/iconifyComponent/index.umd.js +2 -2
  39. package/dist/index.cjs.d.ts +1 -0
  40. package/dist/index.cjs.js +587 -51
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.es.d.ts +1 -0
  43. package/dist/index.es.js +4809 -3046
  44. package/dist/index.umd.js +584 -48
  45. package/dist/layoutSidebarButtons/index.cjs.js +1 -1
  46. package/dist/layoutSidebarButtons/index.es.js +59 -59
  47. package/dist/layoutSidebarButtons/index.umd.js +1 -1
  48. package/dist/presetPrintable/index.cjs.js +3 -3
  49. package/dist/presetPrintable/index.es.js +136 -131
  50. package/dist/presetPrintable/index.umd.js +4 -4
  51. package/dist/prosemirror/index.cjs.js +1 -1
  52. package/dist/prosemirror/index.es.js +1 -1
  53. package/dist/prosemirror/index.umd.js +1 -1
  54. package/dist/rteTinyMce/index.cjs.js +2 -2
  55. package/dist/rteTinyMce/index.es.js +67 -67
  56. package/dist/rteTinyMce/index.umd.js +2 -2
  57. package/dist/tableComponent/index.cjs.js +1 -1
  58. package/dist/tableComponent/index.es.js +14 -14
  59. package/dist/tableComponent/index.umd.js +1 -1
  60. package/dist/utilsDataSources.d.ts +28 -0
  61. package/dist/youtubeAssetProvider/index.cjs.js +1 -1
  62. package/dist/youtubeAssetProvider/index.es.js +26 -26
  63. package/dist/youtubeAssetProvider/index.umd.js +1 -1
  64. package/package.json +2 -1
  65. package/dist/dataSourceEjs/EjsStrategy.d.ts +0 -15
  66. package/dist/dataSourceHandlebars/HandlebarsStrategy.d.ts +0 -17
@@ -1,4 +1,25 @@
1
- (function(o,u){typeof exports=="object"&&typeof module<"u"?module.exports=u():typeof define=="function"&&define.amd?define(u):(o=typeof globalThis<"u"?globalThis:o||self,o.StudioSdkPlugins_dataSourceEjs=u())})(this,function(){"use strict";var o=(e=>(e.free="free",e.startup="startup",e.business="business",e.enterprise="enterprise",e))(o||{}),u=(e=>(e.toastAdd="studio:toastAdd",e.dialogOpen="studio:dialogOpen",e.dialogClose="studio:dialogClose",e.sidebarLeftSet="studio:sidebarLeft:set",e.sidebarLeftGet="studio:sidebarLeft:get",e.sidebarLeftToggle="studio:sidebarLeft:toggle",e.sidebarRightSet="studio:sidebarRight:set",e.sidebarRightGet="studio:sidebarRight:get",e.sidebarRightToggle="studio:sidebarRight:toggle",e.sidebarTopSet="studio:sidebarTop:set",e.sidebarTopGet="studio:sidebarTop:get",e.sidebarTopToggle="studio:sidebarTop:toggle",e.sidebarBottomSet="studio:sidebarBottom:set",e.sidebarBottomGet="studio:sidebarBottom:get",e.sidebarBottomToggle="studio:sidebarBottom:toggle",e.symbolAdd="studio:symbolAdd",e.symbolDetach="studio:symbolDetach",e.symbolOverride="studio:symbolOverride",e.symbolPropagateStyles="studio:propagateStyles",e.getPagesConfig="studio:getPagesConfig",e.setPagesConfig="studio:setPagesConfig",e.getPageSettings="studio:getPageSettings",e.setPageSettings="studio:setPageSettings",e.projectFiles="studio:projectFiles",e.canvasReload="studio:canvasReload",e.getBlocksPanel="studio:getBlocksPanel",e.setBlocksPanel="studio:setBlocksPanel",e.getStateContextMenu="studio:getStateContextMenu",e.setStateContextMenu="studio:setStateContextMenu",e.contextMenuComponent="studio:contextMenuComponent",e.layoutAdd="studio:layoutAdd",e.layoutRemove="studio:layoutRemove",e.layoutToggle="studio:layoutToggle",e.layoutUpdate="studio:layoutUpdate",e.layoutGet="studio:layoutGet",e.layoutConfigGet="studio:layoutConfigGet",e.layoutConfigSet="studio:layoutConfigSet",e.getStateTheme="studio:getStateTheme",e.setStateTheme="studio:setStateTheme",e.assetProviderGet="studio:assetProviderGet",e.assetProviderAdd="studio:assetProviderAdd",e.assetProviderRemove="studio:assetProviderRemove",e.fontGet="studio:fontGet",e.fontAdd="studio:fontAdd",e.fontRemove="studio:fontRemove",e.fontManagerOpen="studio:fontManagerOpen",e.menuFontLoad="studio:menuFontLoad",e.toggleStateDataSource="studio:toggleStateDataSource",e.getStateDataSource="studio:getStateDataSource",e.setDragAbsolute="studio:setDragAbsolute",e))(u||{});const h="app.grapesjs.com",b="app-stage.grapesjs.com",y=[h,b,"localhost","127.0.0.1",".local-credentialless.webcontainer.io",".local.webcontainer.io","-sandpack.codesandbox.io"],P="license:check:start",T="license:check:end",A=()=>typeof window<"u",v=({isDev:e,isStage:t})=>`${e?"":`https://${t?b:h}`}/api`,I=()=>{const e=A()&&window.location.hostname;return!!e&&(y.includes(e)||y.some(t=>e.endsWith(t)))};async function E({path:e,baseApiUrl:t,method:s="GET",headers:r={},params:a,body:i}){const f=`${t||v({isDev:!1,isStage:!1})}${e}`,l={method:s,headers:{"Content-Type":"application/json",...r}};i&&(l.body=JSON.stringify(i));const c=a?new URLSearchParams(a).toString():"",n=c?`?${c}`:"",g=await fetch(`${f}${n}`,l);if(!g.ok)throw new Error(`HTTP error! status: ${g.status}`);return g.json()}const $={[o.free]:0,[o.startup]:10,[o.business]:20,[o.enterprise]:30};function L(e){const t=e;return t.init=s=>r=>e(r,s),t}const w=e=>L(e);async function _({editor:e,plan:t,pluginName:s,licenseKey:r,cleanup:a}){let i="",p=!1;const f=I(),l=n=>{console.warn("Cleanup plugin:",s,"Reason:",n),a()},c=(n={})=>{var x;const{error:g,sdkLicense:N}=n,d=(x=n.plan)==null?void 0:x.category;if(!(N||n.license)||g)l(g||"Invalid license");else if(d){const G=$[t],O=$[d];G>O&&l({pluginRequiredPlan:t,licensePlan:d})}};e.on(P,n=>{i=n==null?void 0:n.baseApiUrl,p=!0}),e.on(T,n=>{c(n)}),setTimeout(async()=>{if(!p){if(f)return;if(r){const n=await j({licenseKey:r,pluginName:s,baseApiUrl:i});n&&c(n)}else l("The `licenseKey` option not provided")}},2e3)}async function j(e){const{licenseKey:t,pluginName:s,baseApiUrl:r}=e;try{return(await E({baseApiUrl:r,path:`/sdk/${t||"na"}`,method:"POST",params:{d:window.location.hostname,pn:s}})).result||{}}catch(a){return console.error("Error during SDK license check:",a),!1}}class R{getHelperId(){}getVariableSyntax({collectionId:t,variableType:s,path:r,defaultValue:a}){let i=r;return t&&(i=[this._sanitizeVariableName(t),s,r].filter(Boolean).join(".")),a?`<%= ${i} || \`${a}\` %>`:`<%= ${i} %>`}getCollectionStartSyntax(t){const{collectionId:s,dataSource:r,startIndex:a,endIndex:i}=t,p=(r==null?void 0:r.path)||s||"",f=this._sanitizeVariableName(s);let l="";if(a!==void 0||i!==void 0){const c=a??0,n=i!==void 0?i:"";l=`.slice(${c}${n!==""?`, ${n}`:""})`}return`<% ${p}${l}.forEach(function(currentItem, index, arr) {
2
- const startIndex = parseInt(${a??0}, 10);
1
+ (function(d,f){typeof exports=="object"&&typeof module<"u"?module.exports=f():typeof define=="function"&&define.amd?define(f):(d=typeof globalThis<"u"?globalThis:d||self,d.StudioSdkPlugins_dataSourceEjs=f())})(this,function(){"use strict";const d="app.grapesjs.com",f="app-stage.grapesjs.com",S=[d,f,"localhost","127.0.0.1",".local-credentialless.webcontainer.io",".local.webcontainer.io","-sandpack.codesandbox.io"],C="license:check:start",L="license:check:end",v=()=>typeof window<"u",w=({isDev:i,isStage:t})=>`${i?"":`https://${t?f:d}`}/api`,P=()=>{const i=v()&&window.location.hostname;return!!i&&(S.includes(i)||S.some(t=>i.endsWith(t)))};async function k({path:i,baseApiUrl:t,method:e="GET",headers:r={},params:s,body:n}){const o=`${t||w({isDev:!1,isStage:!1})}${i}`,l={method:e,headers:{"Content-Type":"application/json",...r}};n&&(l.body=JSON.stringify(n));const p=s?new URLSearchParams(s).toString():"",c=p?`?${p}`:"",h=await fetch(`${o}${c}`,l);if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);return h.json()}var g=(i=>(i.free="free",i.startup="startup",i.business="business",i.enterprise="enterprise",i))(g||{});const $={[g.free]:0,[g.startup]:10,[g.business]:20,[g.enterprise]:30};function T(i){const t=i;return t.init=e=>r=>i(r,e),t}const M=i=>T(i);async function N({editor:i,plan:t,pluginName:e,licenseKey:r,cleanup:s}){let n="",a=!1;const o=P(),l=c=>{console.warn("Cleanup plugin:",e,"Reason:",c),s()},p=(c={})=>{var I;const{error:h,sdkLicense:y}=c,u=(I=c.plan)==null?void 0:I.category;if(!(y||c.license)||h)l(h||"Invalid license");else if(u){const G=$[t],R=$[u];G>R&&l({pluginRequiredPlan:t,licensePlan:u})}};i.on(C,c=>{n=c==null?void 0:c.baseApiUrl,a=!0}),i.on(L,c=>{p(c)}),setTimeout(async()=>{if(!a){if(o)return;if(r){const c=await O({licenseKey:r,pluginName:e,baseApiUrl:n});c&&p(c)}else l("The `licenseKey` option not provided")}},2e3)}async function O(i){const{licenseKey:t,pluginName:e,baseApiUrl:r}=i;try{return(await k({baseApiUrl:r,path:`/sdk/${t||"na"}`,method:"POST",params:{d:window.location.hostname,pn:e}})).result||{}}catch(s){return console.error("Error during SDK license check:",s),!1}}var m=(i=>(i.variable="data-variable",i.condition="data-condition",i.conditionTrue="data-condition-true-content",i.conditionFalse="data-condition-false-content",i.collection="data-collection",i.collectionItem="data-collection-item",i))(m||{});class _{constructor(t){this.strategy=t,this.requiredHelpers=new Set,this.helperLibrary={}}registerHelper(t){this.helperLibrary[t]&&this.requiredHelpers.add(t)}generateVariable(t){return this.strategy.getVariableSyntax(t)}generateCollectionStart(t){return this.registerHelper("slice"),this.strategy.getCollectionStartSyntax(t)}generateCollectionEnd(){return this.strategy.getCollectionEndSyntax()}generateConditionalStart(t){return this.strategy.getConditionalStartSyntax(t)}generateConditionElse(){return this.strategy.getConditionElseSyntax()}generateConditionalEnd(){return this.strategy.getConditionalEndSyntax()}reset(){this.requiredHelpers.clear()}}function B(i){return typeof i=="object"&&i.type===m.variable}function x({component:i,value:t,getCustomPath:e}){if(B(t)&&!t.collectionId&&e){const r=t.path??"",s=r.split(".");return{...t,path:e({component:i,path:r,paths:s})}}return t}const W=i=>{E(i,m.variable,{toHTML(t){var a;const e=this.tagName,r=this.__attrToString(t),s=(a=this.getDataResolver)==null?void 0:a.call(this),n=x({component:this,value:s,getCustomPath:t==null?void 0:t.getCustomPath});return`<${e}${r?` ${r}`:""}>${t.exporter.generateVariable(n)}</${e}>`}}),E(i,m.condition,{toHTML(t){var p,c;const e=t.exporter,r=t==null?void 0:t.getCustomPath,s=this.components(),[n,a]=(s==null?void 0:s.models)??[],o=(p=this.getDataResolver)==null?void 0:p.call(this),l=((c=this.resolveCondition)==null?void 0:c.call(this,o==null?void 0:o.condition,r))??{};return`
2
+ ${e.generateConditionalStart(l)}
3
+ ${(n==null?void 0:n.toHTML(t))??""}
4
+ ${e.generateConditionElse()}
5
+ ${(a==null?void 0:a.toHTML(t))??""}
6
+ ${e.generateConditionalEnd()}
7
+ `},resolveCondition(t,e){var s,n;if(!t)return{};if(t.operator==="and"||t.operator==="or")return{operator:t.operator,statements:((n=(s=t.statements)==null?void 0:s.map)==null?void 0:n.call(s,a=>{var o;return((o=this.resolveCondition)==null?void 0:o.call(this,a,e))??{}}))??[]};const r={component:this,getCustomPath:e};return{...t,left:x({...r,value:t.left}),right:x({...r,value:t.right})}}}),E(i,m.collection,{toHTML(t){const e=t.exporter,r=this.tagName,s=this.__attrToString(t),n=this.getDataResolver(),a={...n,dataSource:x({component:this,value:n==null?void 0:n.dataSource,getCustomPath:t==null?void 0:t.getCustomPath})},o=this.components().at(0);return`
8
+ <${r}${s?` ${s}`:""}>${e.generateCollectionStart(a)}
9
+ ${(o==null?void 0:o.toHTML(t))??""}
10
+ ${e.generateCollectionEnd()}</${r}>
11
+ `}})},E=(i,t,e)=>{const r=i.Components.getType(t);if(!r){console.warn(`Component type ${t} not found`);return}const{model:s}=r;i.Components.addType(t,{model:{...e,toHTML(n={}){var o;const{exporter:a}=n;return a?a.export?a.export({component:this}):((o=e.toHTML)==null?void 0:o.call(this,n))??"":s.prototype.toHTML.call(this,n)??""}}})},j=i=>{const t=i;return t.logicalOperator==="and"||t.logicalOperator==="or"},A=(i,t)=>(i.config.optsHtml={...i.config.optsHtml,exporter:new _(t)},W(i),()=>{i.config.optsHtml.exporter=void 0}),J=(i,t)=>{const e=s=>{const{input:n}=s,{contains:a}=t;(!a||n.includes(a))&&(s.input=t.importer.import(n))},r=i.Parser.events.htmlBefore;return i.on(r,e),()=>{i.off(r,e)}};class H{getVariableSyntax(t){const{defaultValue:e}=t,r=this.getFullPath(t),s=e?` || \`${e}\``:"";return`<%= ${r}${s} %>`}getCollectionStartSyntax(t){const{collectionId:e,dataSource:r,startIndex:s,endIndex:n}=t,a=(r==null?void 0:r.path)||e||"",o=this._sanitizeVariableName(e);let l="";if(s!==void 0||n!==void 0){const p=s??0,c=n!==void 0?n:"";l=`.slice(${p}${c!==""?`, ${c}`:""})`}return`<% ${a}${l}.forEach(function(currentItem, index, arr) {
12
+ const startIndex = parseInt(${s??0}, 10);
3
13
  const endIndex = startIndex + arr.length;
4
- const ${f}={ currentItem, currentIndex: startIndex + index, remainingItems: endIndex - (startIndex + index)} %>`}_sanitizeVariableName(t){return t.replace(/[^a-zA-Z0-9_$]/g,"_")}getCollectionEndSyntax(){return"<% }) %>"}getConditionalStartSyntax(t){return t?t.logicalOperator==="and"||t.logicalOperator==="or"?`<% if (${t.statements.map(r=>this._parseCondition(r)).join(` ${t.logicalOperator} `)}) { %>`:`<% if (${this._parseCondition(t)}) { %>`:""}_parseCondition(t){if(!t)return"";if(t.operator==="and"||t.operator==="or")return`(${t.statements.map(r=>this._parseCondition(r)).join(` ${t.operator} `)})`;{const s=this._parseValue(t.left),r=this._parseValue(t.right);switch(t.operator){case"equals":return`${s} === ${r}`;case">":case"<":case">=":case"<=":case"=":case"!=":return`${s} ${t.operator} ${r}`;case"contains":return`${s}?.includes(${r})`;case"startsWith":return`${s}?.startsWith(${r})`;case"endsWith":return`${s}?.endsWith(${r})`;case"equalsIgnoreCase":return`${s}?.toLowerCase() === ${r}?.toLowerCase()`;case"trimEquals":return`${s}?.trim() === ${r}?.trim()`;case"isTruthy":return`!!${s}`;case"isFalsy":return`!${s}`;case"isDefined":return`${s} !== undefined`;case"isNull":return`${s} === null`;case"isUndefined":return`${s} === undefined`;case"isArray":return`Array.isArray(${s})`;case"isObject":return`typeof ${s} === 'object' && ${s} !== null && !Array.isArray(${s})`;case"isString":return`typeof ${s} === 'string'`;case"isNumber":return`typeof ${s} === 'number' && !isNaN(${s})`;case"isBoolean":return`typeof ${s} === 'boolean'`;default:return`${s} ${t.operator} ${r}`}}}_parseValue(t){return typeof t=="object"?this.getVariableSyntax(t):typeof t=="string"?`'${t.replace(/'/g,"\\'")}'`:String(t)}getConditionElseSyntax(){return"<% } else { %>"}getConditionalEndSyntax(){return"<% } %>"}}const D="dataSourceEjs";return w(function(e,t={}){const s=({options:a})=>{a.exportConfig.exportPreset==="ejs"&&(a.exportConfig={...a.exportConfig,exportStrategy:new R})},r=`${e.Commands.events.runBeforeCommand}${u.projectFiles}`;e.on(r,s),_({editor:e,licenseKey:t.licenseKey,plan:o.startup,pluginName:D,cleanup:()=>{e.off(r,s)}})})});
14
+ const ${o}={ currentItem, currentIndex: startIndex + index, remainingItems: endIndex - (startIndex + index)} %>`}_sanitizeVariableName(t){return t.replace(/[^a-zA-Z0-9_$]/g,"_")}getCollectionEndSyntax(){return"<% }) %>"}getConditionalStartSyntax(t){return`<% if (${this._parseCondition(t)}) { %>`}getConditionElseSyntax(){return"<% } else { %>"}getConditionalEndSyntax(){return"<% } %>"}getFullPath({collectionId:t,path:e,variableType:r}){return(t?[this._sanitizeVariableName(t),r,e].filter(Boolean).join("."):e)||""}_parseCondition(t){if(!t)return"";if(j(t)){const e=t.statements.map(r=>this._parseCondition(r));return e.length>1?`(${e.join(`) ${t.logicalOperator} (`)})`:e[0]}else{const e=this._parseValue(t.left),r=this._parseValue(t.right);switch(t.operator){case"equals":return`${e} === ${r}`;case">":case"<":case">=":case"<=":case"=":case"!=":return`${e} ${t.operator} ${r}`;case"contains":return`${e}?.includes(${r})`;case"startsWith":return`${e}?.startsWith(${r})`;case"endsWith":return`${e}?.endsWith(${r})`;case"equalsIgnoreCase":return`${e}?.toLowerCase() === ${r}?.toLowerCase()`;case"trimEquals":return`${e}?.trim() === ${r}?.trim()`;case"isTruthy":return`!!${e}`;case"isFalsy":return`!${e}`;case"isDefined":return`${e} !== undefined`;case"isNull":return`${e} === null`;case"isUndefined":return`${e} === undefined`;case"isArray":return`Array.isArray(${e})`;case"isObject":return`typeof ${e} === 'object' && ${e} !== null && !Array.isArray(${e})`;case"isString":return`typeof ${e} === 'string'`;case"isNumber":return`typeof ${e} === 'number' && !isNaN(${e})`;case"isBoolean":return`typeof ${e} === 'boolean'`;default:return`${e} ${t.operator} ${r}`}}}_parseValue(t){return typeof t=="object"?this.getFullPath(t):typeof t=="string"?`'${t.replace(/'/g,"\\'")}'`:String(t)}}const U=["===","==","!==","!=","<=",">=","<",">","&&","||"],D={"===":"=","==":"=","!==":"!=","!=":"!=","<=":"<=",">=":">=","<":"<",">":">","&&":"&&","||":"||"};class V{constructor(){this.messages=[],this.collectionStack=[]}import(t){this.messages=[],this.collectionStack=[];try{const e=this.parseEjsTemplate(t);return this.astToGrapesJS(e)}catch(e){return console.error("Error during import:",e),this.addMessage("error",`Error during import: ${e instanceof Error?e.message:String(e)}`),""}}parseEjsTemplate(t){const e=[];let r=0;for(;r<t.length;){const s=t.indexOf("<%",r);if(s===-1){r<t.length&&e.push(this.createAppendLiteral(t.slice(r)));break}s>r&&e.push(this.createAppendLiteral(t.slice(r,s)));const n=t.indexOf("%>",s);if(n===-1)throw new Error("Unclosed EJS tag");const a=t.slice(s+2,n).trim();if(r=n+2,a.startsWith("=")||a.startsWith("-")){const o=a.slice(1).trim();e.push(this.createAppendExpression(o))}else{if(a.startsWith("#"))continue;if(a.startsWith("if")){const o=this.parseIfStatement(a,t,r);e.push(o),r=o.endPos||r}else if(a.startsWith("for")){const o=this.parseForStatement(a,t,r);e.push(o),r=o.endPos||r}else{if(a.startsWith("}")||a.startsWith("} else"))break;this.addMessage("info",`Unsupported scriptlet content: ${a}`)}}}return{type:"Program",body:e}}createAppendLiteral(t){return{type:"ExpressionStatement",expression:{type:"CallExpression",callee:{type:"Identifier",name:"__append"},arguments:[{type:"Literal",value:t}]}}}createAppendExpression(t){return{type:"ExpressionStatement",expression:{type:"CallExpression",callee:{type:"Identifier",name:"__append"},arguments:[this.parseJsExpression(t)]}}}findNextElse(t,e){const r=/<%\s*\}\s*else(?:\s+if\s*\([^)]*\))?\s*\{\s*%>/g;r.lastIndex=e;const s=r.exec(t);return s?{start:s.index,end:t.indexOf("%>",s.index)+2}:null}parseIfStatement(t,e,r){const s=t.match(/if\s*\((.*)\)\s*\{?/);if(!s)throw new Error("Invalid if statement syntax");const n=this.parseJsExpression(s[1]),{body:a,endPos:o}=this.parseTemplateBlock(e,r);let l=null,p=o;const c=this.findNextElse(e,o);if(c){const h=e.slice(c.start,c.end);if(/else\s+if/.test(h)){const y=c.end,u=this.parseIfStatement(h,e,y);l={type:"IfStatement",test:u.test,consequent:u.consequent,alternate:u.alternate},p=u.endPos}else{const y=c.end,{body:u,endPos:b}=this.parseTemplateBlock(e,y);l={type:"BlockStatement",body:u},p=b}}return{type:"IfStatement",test:n,consequent:{type:"BlockStatement",body:a},alternate:l,endPos:p}}parseForStatement(t,e,r){const s=t.match(/for\s*\((.*)\)\s*\{?/);if(!s)throw new Error("Invalid for statement syntax");const n=s[1].split("of");if(n.length!==2)throw new Error("Only for...of loops are supported");const a=n[0].trim().replace(/^let\s+|^const\s+|^var\s+/,""),o=n[1].trim(),{body:l,endPos:p}=this.parseTemplateBlock(e,r);return{type:"ForStatement",init:{type:"VariableDeclaration",kind:"let",declarations:[{type:"VariableDeclarator",id:{type:"Identifier",name:a},init:this.parseJsExpression(o)}]},test:null,update:null,body:{type:"BlockStatement",body:l},endPos:p}}parseTemplateBlock(t,e){const r=[];let s=e,n=1;for(;s<t.length&&n>0;){const a=t.indexOf("<%",s);if(a===-1){s<t.length&&r.push(this.createAppendLiteral(t.slice(s)));break}a>s&&r.push(this.createAppendLiteral(t.slice(s,a)));const o=t.indexOf("%>",a);if(o===-1)throw new Error("Unclosed EJS tag");const l=t.slice(a+2,o).trim();if(s=o+2,l==="}"){if(n--,n===0)break}else(l.startsWith("if")||l.startsWith("for"))&&n++;if(l.startsWith("=")||l.startsWith("-")){const p=l.slice(1).trim();r.push(this.createAppendExpression(p))}else{if(l.startsWith("#"))continue;if(l.startsWith("} else")){s=a;break}}}return{body:r,endPos:s}}parseJsExpression(t){if(/^(['"]).*\1$/.test(t))return{type:"Literal",value:t.slice(1,-1)};if(/^-?\d+$/.test(t))return{type:"Literal",value:parseInt(t,10)};if(/^-?\d+\.\d+$/.test(t))return{type:"Literal",value:parseFloat(t)};if(t==="true"||t==="false")return{type:"Literal",value:t==="true"};for(const s of U){const n=t.indexOf(s);if(n>0)return{type:s==="&&"||s==="||"?"LogicalExpression":"BinaryExpression",operator:D[s],left:this.parseJsExpression(t.slice(0,n).trim()),right:this.parseJsExpression(t.slice(n+s.length).trim())}}const e=t.indexOf("."),r=t.indexOf("[");if(e>0||r>0){const s=e>0&&(r===-1||e<r)?e:r;let n,a,o=!1;if(s===e)n=t.slice(0,e),a=this.parseJsExpression(t.slice(e+1));else{n=t.slice(0,r);const l=t.indexOf("]",r);if(l===-1)throw new Error("Unclosed bracket in expression");a=this.parseJsExpression(t.slice(r+1,l)),o=!0}return{type:"MemberExpression",object:this.parseJsExpression(n),property:a,computed:o}}return{type:"Identifier",name:t}}astToGrapesJS(t){switch(t.type){case"Program":return this.handleProgram(t);case"VariableDeclaration":return this.handleVariableDeclaration(t);case"ExpressionStatement":return this.handleExpressionStatement(t);case"IfStatement":return this.handleIfStatement(t);case"ForStatement":return this.handleForStatement(t);case"BlockStatement":return this.handleBlockStatement(t);case"Literal":return this.handleLiteral(t);case"Identifier":return this.handleIdentifier(t);case"MemberExpression":return this.handleMemberExpression(t);case"BinaryExpression":return this.handleBinaryExpression(t);case"LogicalExpression":return this.handleLogicalExpression(t);case"CallExpression":return this.handleCallExpression(t);default:return this.addMessage("warning",`Unsupported node type: ${t.type}`),""}}handleProgram(t){let e="";for(const r of t.body)e+=this.astToGrapesJS(r);return e}handleVariableDeclaration(t){return""}handleExpressionStatement(t){return t.expression.type==="CallExpression"&&t.expression.callee.type==="Identifier"&&t.expression.callee.name==="__append"&&t.expression.arguments.length>0?this.astToGrapesJS(t.expression.arguments[0]):""}handleIfStatement(t){const e=this.getConditionExpression(t.test),r=this.astToGrapesJS(t.consequent);let s="";return t.alternate&&(s=this.astToGrapesJS(t.alternate)),`
15
+ <data-condition data-gjs-data-resolver='${JSON.stringify({condition:e})}'>
16
+ <data-condition-true-content>${r}</data-condition-true-content>
17
+ <data-condition-false-content>${s}</data-condition-false-content>
18
+ </data-condition>
19
+ `}handleForStatement(t){var a;if(((a=t.init)==null?void 0:a.type)!=="VariableDeclaration"||t.init.declarations.length===0)return this.addMessage("warning","Unsupported for loop init format"),"";const e=t.init.declarations[0];if(e.id.type!=="Identifier")return this.addMessage("warning","Unsupported for loop variable declaration id"),"";let r="";if(e.init)r=this.getExpressionString(e.init);else return this.addMessage("warning","For loop collection is undefined"),"";r.startsWith("data.")||(r=`data.${r}`);const s=`collection-${Math.random().toString(36).substring(2,10)}`;this.collectionStack.push(s);const n=this.astToGrapesJS(t.body);return this.collectionStack.pop(),`
20
+ <data-collection data-gjs-data-resolver='${JSON.stringify({dataSource:{type:"data-variable",path:r},collectionId:s})}'>
21
+ <data-collection-item>
22
+ ${n}
23
+ </data-collection-item>
24
+ </data-collection>
25
+ `}handleBlockStatement(t){let e="";for(const r of t.body)e+=this.astToGrapesJS(r);return e}handleLiteral(t){return String(t.value??"")}handleIdentifier(t){let e={path:t.name};if(this.collectionStack.length>0&&t.name==="item"){const r=this.collectionStack[this.collectionStack.length-1];e={path:t.name,collectionId:r,variableType:"currentItem"}}return`<data-variable data-gjs-data-resolver='${JSON.stringify(e)}'></data-variable>`}handleMemberExpression(t,e={}){let s={path:this.getExpressionString(t),...e};if(this.collectionStack.length>0){let n=t;const a=[];let o=!1;for(;n.type==="MemberExpression";)if(n.property.type==="Identifier"?a.unshift(n.property.name):n.property.type==="Literal"&&n.computed&&a.unshift(`[${n.property.value}]`),n=n.object,n.type==="Identifier"&&n.name==="item"){o=!0;break}if(o&&n.type==="Identifier"&&n.name==="item"){const l=this.collectionStack[this.collectionStack.length-1],p=a.join(".").replace(/\.\[/g,"[");s={...s,collectionId:l,variableType:"currentItem",path:p}}}return`<data-variable data-gjs-data-resolver='${JSON.stringify(s)}'></data-variable>`}handleBinaryExpression(t){return`${this.getExpressionString(t.left)} ${t.operator} ${this.getExpressionString(t.right)}`}handleLogicalExpression(t){return t.operator==="||"&&t.right.type==="Literal"?this.handleMemberExpression(t.left,{defaultValue:t.right.value}):`${this.getExpressionString(t.left)} ${t.operator} ${this.getExpressionString(t.right)}`}handleCallExpression(t){var e;if(t.callee.type==="Identifier"&&t.callee.name==="include"){const r=((e=t.arguments[0])==null?void 0:e.type)==="Literal"?String(t.arguments[0].value):"";return this.addMessage("info",`Partial includes are not fully supported: ${r}`),""}return""}getConditionExpression(t){if(t.type==="Identifier")return{logicalOperator:"and",statements:[{left:{type:"data-variable",path:t.name},operator:"isTruthy"}]};if(t.type==="MemberExpression"){let e=this.getExpressionString(t),r="isTruthy";return e.startsWith("!!")?(r="isTruthy",e=e.slice(2)):e.startsWith("!")&&(r="isFalsy",e=e.slice(1)),{logicalOperator:"and",statements:[{left:{type:"data-variable",path:e},operator:r}]}}if(t.type==="BinaryExpression"||t.type==="LogicalExpression"){const e=this.getConditionExpression(t.left),r=this.getConditionExpression(t.right);return`${e} ${t.operator} ${r}`}return t.type==="Literal"?typeof t.value=="string"?`'${t.value}'`:String(t.value??""):this.getExpressionString(t)}getExpressionString(t){switch(t.type){case"Identifier":return t.name;case"Literal":return String(t.value??"");case"MemberExpression":{const e=this.getExpressionString(t.object),r=this.getExpressionString(t.property);return t.computed?`${e}[${r}]`:`${e}.${r}`}case"BinaryExpression":{const e=this.getExpressionString(t.left),r=this.getExpressionString(t.right);return`${e} ${t.operator} ${r}`}case"LogicalExpression":{const e=this.getExpressionString(t.left),r=this.getExpressionString(t.right);return`${e} ${t.operator} ${r}`}default:return this.addMessage("warning",`Unsupported expression type for getExpressionString: ${t.type}`),""}}addMessage(t,e){this.messages.push({type:t,message:e})}}const q="dataSourceEjs",F=g.startup;return M(function(i,t={}){const e=A(i,new H),r=J(i,{contains:"<%",importer:new V});N({editor:i,licenseKey:t.licenseKey,plan:F,pluginName:q,cleanup:()=>{e(),r()}})})});
@@ -0,0 +1,3 @@
1
+ import { SdkPlanCategories } from '../utils';
2
+ export declare const PLUGIN_NAME = "dataSourceEjs";
3
+ export declare const PLUGIN_PLAN = SdkPlanCategories.startup;
@@ -1,3 +1,3 @@
1
- import { SDKPluginOptions } from '../utils';
2
- export interface DataSourceEJSOptions extends SDKPluginOptions {
1
+ import { DataSourceEjsOptions as PluginSchema } from './typesSchema';
2
+ export interface DataSourceEjsOptions extends PluginSchema {
3
3
  }
@@ -0,0 +1,3 @@
1
+ import { SDKPluginOptions } from '../utils';
2
+ export interface DataSourceEjsOptions extends SDKPluginOptions {
3
+ }
@@ -0,0 +1,16 @@
1
+ import { Operator } from '@studio/editor/src/components/DataConditionPicker/statementTypes';
2
+ import { ConditionType, DataCollectionResolverProps, DataVariableResolverProps, IDataSourceExporter } from '@studio/editor/src/typeConfigs/dataSources';
3
+ export declare class HandlebarsExporter implements IDataSourceExporter {
4
+ getHelperId(operator: Operator, typeHint?: 'string' | 'number' | 'any'): string;
5
+ getFullPath({ collectionId, path }: DataVariableResolverProps): string;
6
+ getVariableSyntax(props: DataVariableResolverProps): string;
7
+ getCollectionStartSyntax(options: DataCollectionResolverProps): string;
8
+ getCollectionEndSyntax(): string;
9
+ getConditionalStartSyntax(condition?: ConditionType): string;
10
+ private _parseCondition;
11
+ private _getTypeHint;
12
+ private _parseValue;
13
+ private _sanitizeVariableName;
14
+ getConditionElseSyntax(): string;
15
+ getConditionalEndSyntax(): string;
16
+ }
@@ -0,0 +1,20 @@
1
+ export declare class HandlebarsImporter {
2
+ private messages;
3
+ private collectionStack;
4
+ import(templateString: string): string;
5
+ private parse;
6
+ private astToGrapesJS;
7
+ private handleProgram;
8
+ private handleContentStatement;
9
+ private handleMustacheStatement;
10
+ private handleBlockStatement;
11
+ private handleConditionalBlock;
12
+ private handleEachBlock;
13
+ private handleCommentStatement;
14
+ private handleElementNode;
15
+ private handleTextNode;
16
+ private handlePartialStatement;
17
+ private handleGenericBlock;
18
+ private getExpressionString;
19
+ private addMessage;
20
+ }
@@ -0,0 +1 @@
1
+ export declare const helperImplementations: Record<string, string>;
@@ -1 +1,20 @@
1
- "use strict";var g=(e=>(e.free="free",e.startup="startup",e.business="business",e.enterprise="enterprise",e))(g||{}),y=(e=>(e.toastAdd="studio:toastAdd",e.dialogOpen="studio:dialogOpen",e.dialogClose="studio:dialogClose",e.sidebarLeftSet="studio:sidebarLeft:set",e.sidebarLeftGet="studio:sidebarLeft:get",e.sidebarLeftToggle="studio:sidebarLeft:toggle",e.sidebarRightSet="studio:sidebarRight:set",e.sidebarRightGet="studio:sidebarRight:get",e.sidebarRightToggle="studio:sidebarRight:toggle",e.sidebarTopSet="studio:sidebarTop:set",e.sidebarTopGet="studio:sidebarTop:get",e.sidebarTopToggle="studio:sidebarTop:toggle",e.sidebarBottomSet="studio:sidebarBottom:set",e.sidebarBottomGet="studio:sidebarBottom:get",e.sidebarBottomToggle="studio:sidebarBottom:toggle",e.symbolAdd="studio:symbolAdd",e.symbolDetach="studio:symbolDetach",e.symbolOverride="studio:symbolOverride",e.symbolPropagateStyles="studio:propagateStyles",e.getPagesConfig="studio:getPagesConfig",e.setPagesConfig="studio:setPagesConfig",e.getPageSettings="studio:getPageSettings",e.setPageSettings="studio:setPageSettings",e.projectFiles="studio:projectFiles",e.canvasReload="studio:canvasReload",e.getBlocksPanel="studio:getBlocksPanel",e.setBlocksPanel="studio:setBlocksPanel",e.getStateContextMenu="studio:getStateContextMenu",e.setStateContextMenu="studio:setStateContextMenu",e.contextMenuComponent="studio:contextMenuComponent",e.layoutAdd="studio:layoutAdd",e.layoutRemove="studio:layoutRemove",e.layoutToggle="studio:layoutToggle",e.layoutUpdate="studio:layoutUpdate",e.layoutGet="studio:layoutGet",e.layoutConfigGet="studio:layoutConfigGet",e.layoutConfigSet="studio:layoutConfigSet",e.getStateTheme="studio:getStateTheme",e.setStateTheme="studio:setStateTheme",e.assetProviderGet="studio:assetProviderGet",e.assetProviderAdd="studio:assetProviderAdd",e.assetProviderRemove="studio:assetProviderRemove",e.fontGet="studio:fontGet",e.fontAdd="studio:fontAdd",e.fontRemove="studio:fontRemove",e.fontManagerOpen="studio:fontManagerOpen",e.menuFontLoad="studio:menuFontLoad",e.toggleStateDataSource="studio:toggleStateDataSource",e.getStateDataSource="studio:getStateDataSource",e.setDragAbsolute="studio:setDragAbsolute",e))(y||{});const $="app.grapesjs.com",P="app-stage.grapesjs.com",h=[$,P,"localhost","127.0.0.1",".local-credentialless.webcontainer.io",".local.webcontainer.io","-sandpack.codesandbox.io"],v="license:check:start",A="license:check:end",E=()=>typeof window<"u",L=({isDev:e,isStage:t})=>`${e?"":`https://${t?P:$}`}/api`,_=()=>{const e=E()&&window.location.hostname;return!!e&&(h.includes(e)||h.some(t=>e.endsWith(t)))};async function D({path:e,baseApiUrl:t,method:r="GET",headers:s={},params:n,body:a}){const u=`${t||L({isDev:!1,isStage:!1})}${e}`,l={method:r,headers:{"Content-Type":"application/json",...s}};a&&(l.body=JSON.stringify(a));const o=n?new URLSearchParams(n).toString():"",i=o?`?${o}`:"",c=await fetch(`${u}${i}`,l);if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);return c.json()}const b={[g.free]:0,[g.startup]:10,[g.business]:20,[g.enterprise]:30};function R(e){const t=e;return t.init=r=>s=>e(s,r),t}const w=e=>R(e);async function G({editor:e,plan:t,pluginName:r,licenseKey:s,cleanup:n}){let a="",p=!1;const u=_(),l=i=>{console.warn("Cleanup plugin:",r,"Reason:",i),n()},o=(i={})=>{var d;const{error:c,sdkLicense:T}=i,f=(d=i.plan)==null?void 0:d.category;if(!(T||i.license)||c)l(c||"Invalid license");else if(f){const x=b[t],I=b[f];x>I&&l({pluginRequiredPlan:t,licensePlan:f})}};e.on(v,i=>{a=i==null?void 0:i.baseApiUrl,p=!0}),e.on(A,i=>{o(i)}),setTimeout(async()=>{if(!p){if(u)return;if(s){const i=await N({licenseKey:s,pluginName:r,baseApiUrl:a});i&&o(i)}else l("The `licenseKey` option not provided")}},2e3)}async function N(e){const{licenseKey:t,pluginName:r,baseApiUrl:s}=e;try{return(await D({baseApiUrl:s,path:`/sdk/${t||"na"}`,method:"POST",params:{d:window.location.hostname,pn:r}})).result||{}}catch(n){return console.error("Error during SDK license check:",n),!1}}class O{getHelperId(t,r){return{equals:`${r==="string"?"str":r==="number"?"num":"any"}Equals`,isTruthy:"isTruthy",isFalsy:"isFalsy",isDefined:"isDefined",isNull:"isNull",isUndefined:"isUndefined",isArray:"isArray",isObject:"isObject",isString:"isString",isNumber:"isNumber",isBoolean:"isBoolean",isDefaultValue:"isDefaultValue",">":"numGt","<":"numLt",">=":"numGte","<=":"numLte","=":"numEq","!=":"numNeq",contains:"strContains",startsWith:"strStartsWith",endsWith:"strEndsWith",equalsIgnoreCase:"strEqualsIgnoreCase",trimEquals:"strTrimEquals"}[t]||t}getVariableSyntax({collectionId:t,variableType:r,path:s,defaultValue:n}){let a=s;return t&&(a=[this._sanitizeVariableName(t),r,s].filter(Boolean).join(".")),n?`{{#if ${s}}}{{{${a}}}}{{else}}${n}{{/if}}`:`{{{${a}}}}`}getCollectionStartSyntax(t){const{collectionId:r,dataSource:s}=t,n=s==null?void 0:s.path;let a="";if(t.startIndex!==void 0||t.endIndex!==void 0){const o=t.startIndex??0,i=t.endIndex!==void 0?t.endIndex:"";i!==""?a=` (slice ${n} ${o} ${i})`:a=` (slice ${n} ${o})`}const u=` as |${this._sanitizeVariableName(r)}|`;return`{{#each ${a||n}${u}}}`}getCollectionEndSyntax(){return"{{/each}}"}getConditionalStartSyntax(t){if(!t)return"";if(t.logicalOperator==="and"||t.logicalOperator==="or"){const r=this.getHelperId(t.logicalOperator),s=t.statements.map(n=>this._parseCondition(n)).join(", ");return`{{#if (${r} ${s})}}`}else return`{{#if ${this._parseCondition(t)}}}`}_parseCondition(t){if(!t)return"";if(t.operator==="and"||t.operator==="or"){const r=this.getHelperId(t.operator),s=t.statements.map(n=>this._parseCondition(n)).join(" ");return`(${r} ${s})`}else{const r=this.getHelperId(t.operator,this._getTypeHint(t)),s=this._parseValue(t.left),n=this._parseValue(t.right);return`(${r} ${s} ${n})`}}_getTypeHint(t){return["contains","startsWith","endsWith","equalsIgnoreCase","trimEquals"].includes(t.operator)?"string":[">","<",">=","<=","=","!="].includes(t.operator)?"number":"any"}_parseValue(t){return typeof t=="object"?this.getVariableSyntax(t):typeof t=="string"?`'${t.replace(/'/g,"\\'")}'`:String(t)}_sanitizeVariableName(t){return t.replace(/[^a-zA-Z0-9_$]/g,"_")}getConditionElseSyntax(){return"{{else}}"}getConditionalEndSyntax(){return"{{/if}}"}}const j="dataSourceHandlebars",B=function(e,t={}){const r=({options:n})=>{const a=n.exportConfig;a.exportPreset==="handlebarsjs"&&(n.exportConfig={...a,exportStrategy:new O})},s=`${e.Commands.events.runBeforeCommand}${y.projectFiles}`;e.on(s,r),G({editor:e,licenseKey:t.licenseKey,plan:g.startup,pluginName:j,cleanup:()=>{e.off(s,r)}})},U=w(B);module.exports=U;
1
+ "use strict";const I=require("handlebars/dist/cjs/handlebars"),b="app.grapesjs.com",x="app-stage.grapesjs.com",y=[b,x,"localhost","127.0.0.1",".local-credentialless.webcontainer.io",".local.webcontainer.io","-sandpack.codesandbox.io"],P="license:check:start",T="license:check:end",k=()=>typeof window<"u",L=({isDev:r,isStage:t})=>`${r?"":`https://${t?x:b}`}/api`,w=()=>{const r=k()&&window.location.hostname;return!!r&&(y.includes(r)||y.some(t=>r.endsWith(t)))};async function N({path:r,baseApiUrl:t,method:n="GET",headers:e={},params:a,body:s}){const o=`${t||L({isDev:!1,isStage:!1})}${r}`,u={method:n,headers:{"Content-Type":"application/json",...e}};s&&(u.body=JSON.stringify(s));const l=a?new URLSearchParams(a).toString():"",c=l?`?${l}`:"",h=await fetch(`${o}${c}`,u);if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);return h.json()}var p=(r=>(r.free="free",r.startup="startup",r.business="business",r.enterprise="enterprise",r))(p||{});const $={[p.free]:0,[p.startup]:10,[p.business]:20,[p.enterprise]:30};function H(r){const t=r;return t.init=n=>e=>r(e,n),t}const M=r=>H(r);async function _({editor:r,plan:t,pluginName:n,licenseKey:e,cleanup:a}){let s="",i=!1;const o=w(),u=c=>{console.warn("Cleanup plugin:",n,"Reason:",c),a()},l=(c={})=>{var S;const{error:h,sdkLicense:C}=c,m=(S=c.plan)==null?void 0:S.category;if(!(C||c.license)||h)u(h||"Invalid license");else if(m){const E=$[t],v=$[m];E>v&&u({pluginRequiredPlan:t,licensePlan:m})}};r.on(P,c=>{s=c==null?void 0:c.baseApiUrl,i=!0}),r.on(T,c=>{l(c)}),setTimeout(async()=>{if(!i){if(o)return;if(e){const c=await j({licenseKey:e,pluginName:n,baseApiUrl:s});c&&l(c)}else u("The `licenseKey` option not provided")}},2e3)}async function j(r){const{licenseKey:t,pluginName:n,baseApiUrl:e}=r;try{return(await N({baseApiUrl:e,path:`/sdk/${t||"na"}`,method:"POST",params:{d:window.location.hostname,pn:n}})).result||{}}catch(a){return console.error("Error during SDK license check:",a),!1}}var d=(r=>(r.variable="data-variable",r.condition="data-condition",r.conditionTrue="data-condition-true-content",r.conditionFalse="data-condition-false-content",r.collection="data-collection",r.collectionItem="data-collection-item",r))(d||{});class B{constructor(t){this.strategy=t,this.requiredHelpers=new Set,this.helperLibrary={}}registerHelper(t){this.helperLibrary[t]&&this.requiredHelpers.add(t)}generateVariable(t){return this.strategy.getVariableSyntax(t)}generateCollectionStart(t){return this.registerHelper("slice"),this.strategy.getCollectionStartSyntax(t)}generateCollectionEnd(){return this.strategy.getCollectionEndSyntax()}generateConditionalStart(t){return this.strategy.getConditionalStartSyntax(t)}generateConditionElse(){return this.strategy.getConditionElseSyntax()}generateConditionalEnd(){return this.strategy.getConditionalEndSyntax()}reset(){this.requiredHelpers.clear()}}function O(r){return typeof r=="object"&&r.type===d.variable}function g({component:r,value:t,getCustomPath:n}){if(O(t)&&!t.collectionId&&n){const e=t.path??"",a=e.split(".");return{...t,path:n({component:r,path:e,paths:a})}}return t}const D=r=>{f(r,d.variable,{toHTML(t){var i;const n=this.tagName,e=this.__attrToString(t),a=(i=this.getDataResolver)==null?void 0:i.call(this),s=g({component:this,value:a,getCustomPath:t==null?void 0:t.getCustomPath});return`<${n}${e?` ${e}`:""}>${t.exporter.generateVariable(s)}</${n}>`}}),f(r,d.condition,{toHTML(t){var l,c;const n=t.exporter,e=t==null?void 0:t.getCustomPath,a=this.components(),[s,i]=(a==null?void 0:a.models)??[],o=(l=this.getDataResolver)==null?void 0:l.call(this),u=((c=this.resolveCondition)==null?void 0:c.call(this,o==null?void 0:o.condition,e))??{};return`
2
+ ${n.generateConditionalStart(u)}
3
+ ${(s==null?void 0:s.toHTML(t))??""}
4
+ ${n.generateConditionElse()}
5
+ ${(i==null?void 0:i.toHTML(t))??""}
6
+ ${n.generateConditionalEnd()}
7
+ `},resolveCondition(t,n){var a,s;if(!t)return{};if(t.operator==="and"||t.operator==="or")return{operator:t.operator,statements:((s=(a=t.statements)==null?void 0:a.map)==null?void 0:s.call(a,i=>{var o;return((o=this.resolveCondition)==null?void 0:o.call(this,i,n))??{}}))??[]};const e={component:this,getCustomPath:n};return{...t,left:g({...e,value:t.left}),right:g({...e,value:t.right})}}}),f(r,d.collection,{toHTML(t){const n=t.exporter,e=this.tagName,a=this.__attrToString(t),s=this.getDataResolver(),i={...s,dataSource:g({component:this,value:s==null?void 0:s.dataSource,getCustomPath:t==null?void 0:t.getCustomPath})},o=this.components().at(0);return`
8
+ <${e}${a?` ${a}`:""}>${n.generateCollectionStart(i)}
9
+ ${(o==null?void 0:o.toHTML(t))??""}
10
+ ${n.generateCollectionEnd()}</${e}>
11
+ `}})},f=(r,t,n)=>{const e=r.Components.getType(t);if(!e){console.warn(`Component type ${t} not found`);return}const{model:a}=e;r.Components.addType(t,{model:{...n,toHTML(s={}){var o;const{exporter:i}=s;return i?i.export?i.export({component:this}):((o=n.toHTML)==null?void 0:o.call(this,s))??"":a.prototype.toHTML.call(this,s)??""}}})},V=(r,t)=>(r.config.optsHtml={...r.config.optsHtml,exporter:new B(t)},D(r),()=>{r.config.optsHtml.exporter=void 0}),q=(r,t)=>{const n=a=>{const{input:s}=a,{contains:i}=t;(!i||s.includes(i))&&(a.input=t.importer.import(s))},e=r.Parser.events.htmlBefore;return r.on(e,n),()=>{r.off(e,n)}};class U{getHelperId(t,n){return{equals:`${n==="string"?"str":n==="number"?"num":"any"}Equals`,isTruthy:"isTruthy",isFalsy:"isFalsy",isDefined:"isDefined",isNull:"isNull",isUndefined:"isUndefined",isArray:"isArray",isObject:"isObject",isString:"isString",isNumber:"isNumber",isBoolean:"isBoolean",isDefaultValue:"isDefaultValue",">":"numGt","<":"numLt",">=":"numGte","<=":"numLte","=":"numEq","!=":"numNeq",contains:"strContains",startsWith:"strStartsWith",endsWith:"strEndsWith",equalsIgnoreCase:"strEqualsIgnoreCase",trimEquals:"strTrimEquals"}[t]||t}getFullPath({collectionId:t,path:n}){let e=n;return t&&(e=[this._sanitizeVariableName(t),n].filter(Boolean).join(".")),e||""}getVariableSyntax(t){const{defaultValue:n}=t,e=this.getFullPath(t);return n?`{{#if ${e}}}{{{${e}}}}{{else}}${n}{{/if}}`:`{{{${e}}}}`}getCollectionStartSyntax(t){const{collectionId:n,dataSource:e}=t,a=e==null?void 0:e.path;let s="";if(t.startIndex!==void 0||t.endIndex!==void 0){const l=t.startIndex??0,c=t.endIndex!==void 0?t.endIndex:"";c!==""?s=` (slice ${a} ${l} ${c})`:s=` (slice ${a} ${l})`}const o=` as |${this._sanitizeVariableName(n)}|`;return`{{#each ${s||a}${o}}}`}getCollectionEndSyntax(){return"{{/each}}"}getConditionalStartSyntax(t){if(!t)return"";const n=t,e=t;if(e.statements&&e.logicalOperator==="and"||e.logicalOperator==="or"){const{statements:a}=e,s=e.logicalOperator,i=a.map(u=>this._parseCondition(u)).join(", ");return`{{#if ${a.length>1?`(${s} ${i})`:i}}}`}else return`{{#if ${this._parseCondition(n)}}}`}_parseCondition(t){if(!t)return"";const n=t,e=t;if(e.statements&&e.logicalOperator==="and"||e.logicalOperator==="or"){const{statements:a}=e,s=e.logicalOperator,i=e.statements.map(o=>this._parseCondition(o)).join(" ");return a.length>1?`(${s} ${i})`:i}else{const a=this.getHelperId(n.operator,this._getTypeHint(t)),s=this._parseValue(n.left),i=this._parseValue(n.right);return`(${a} ${s} ${i})`}}_getTypeHint(t){return["contains","startsWith","endsWith","equalsIgnoreCase","trimEquals"].includes(t.operator)?"string":[">","<",">=","<=","=","!="].includes(t.operator)?"number":"any"}_parseValue(t){return typeof t=="object"?this.getFullPath(t):typeof t=="string"?`'${t.replace(/'/g,"\\'")}'`:String(t)}_sanitizeVariableName(t){return t.replace(/[^a-zA-Z0-9_$]/g,"_")}getConditionElseSyntax(){return"{{else}}"}getConditionalEndSyntax(){return"{{/if}}"}}class W{constructor(){this.messages=[],this.collectionStack=[]}import(t){this.messages=[],this.collectionStack=[];const n=this.parse(t);return this.astToGrapesJS(n)}parse(t){try{return I.parse(t)}catch(n){if(n instanceof Error&&n.message.includes("Parse error")){const e=n.message.match(/line (\d+)/),a=e?parseInt(e[1]):0,s=n.message.match(/column (\d+)/),i=s?parseInt(s[1]):0;throw new Error(`Handlebars syntax error at line ${a}, column ${i}: ${n.message}`)}throw n}}astToGrapesJS(t){switch(t.type){case"Program":return this.handleProgram(t);case"ContentStatement":return this.handleContentStatement(t);case"MustacheStatement":return this.handleMustacheStatement(t);case"BlockStatement":return this.handleBlockStatement(t);case"PartialStatement":return this.handlePartialStatement(t);case"CommentStatement":return this.handleCommentStatement(t);case"ElementNode":return this.handleElementNode(t);case"TextNode":return this.handleTextNode(t);default:return this.addMessage("warning",`Unsupported node type: ${t.type}`,t.loc),""}}handleProgram(t){let n="";if(t.body)for(const e of t.body)n+=this.astToGrapesJS(e);return n}handleContentStatement(t){return t.value||""}handleMustacheStatement(t,n={}){const e=this.getExpressionString(t.path),a=n;if(this.collectionStack.length>0)if(e.startsWith("@")){const s=e.split("/");let i=0;const o=s[s.length-1];for(let l=0;l<s.length-1;l++)s[l]===".."&&i++;const u=Math.max(0,this.collectionStack.length-1-i);if(u>=0&&u<this.collectionStack.length){const l=this.collectionStack[u];o==="index"||o==="@index"?(a.collectionId=l,a.variableType="currentIndex"):o==="key"||o==="@key"?(a.collectionId=l,a.variableType="currentKey"):o==="first"||o==="@first"?(a.collectionId=l,a.variableType="isFirst"):o==="last"||o==="@last"?(a.collectionId=l,a.variableType="isLast"):a.path=e}else a.path=e}else{const s=e.split("/");let i=0;for(;s[0]==="..";)i++,s.shift();const o=s.join("/"),u=this.collectionStack.length-1-i;if(u>=0&&u<this.collectionStack.length){const l=this.collectionStack[u];o==="this"?(a.collectionId=l,a.variableType="currentItem"):(a.collectionId=l,a.variableType="currentItem",a.path=o.startsWith("this.")?o.split(".").slice(1).join("."):o)}else a.path=`globalData.${s.join(".")}`}else a.path=e;return`<data-variable data-gjs-data-resolver='${JSON.stringify(a)}'></data-variable>`}handleBlockStatement(t){const n=t.path.original;switch(n){case"if":case"unless":return this.handleConditionalBlock(t,n);case"each":return this.handleEachBlock(t);default:return this.addMessage("warning",`Unsupported block helper: ${n}`,t.loc),this.handleGenericBlock(t)}}handleConditionalBlock(t,n){const s={logicalOperator:"and",statements:[{left:{type:"data-variable",path:this.getExpressionString(t.params[0])},operator:n==="unless"?"isFalsy":"isTruthy"}]},i=this.handleProgram(t.program),o=t.inverse?this.handleProgram(t.inverse):"";return t.params[0].type==="PathExpression"?this.handleMustacheStatement(t.program.body[0],{defaultValue:o}):`
12
+ <data-condition data-gjs-data-resolver='${JSON.stringify({condition:s})}'>
13
+ <data-condition-true-content>${i}</data-condition-true-content>
14
+ <data-condition-false-content>${o}</data-condition-false-content>
15
+ </data-condition>
16
+ `}handleEachBlock(t){const n=this.getExpressionString(t.params[0]),e=`collection-${Math.random().toString(36).substring(2,10)}`;this.collectionStack.push(e);const a=this.handleProgram(t.program);return this.collectionStack.pop(),`
17
+ <data-collection data-gjs-data-resolver='${JSON.stringify({dataSource:{type:"data-variable",path:n},collectionId:e})}'>
18
+ <data-collection-item>${a}</data-collection-item>
19
+ </data-collection>
20
+ `}handleCommentStatement(t){return`<!--${t.value}-->`}handleElementNode(t){let n="";if(t.attributes)for(const a of t.attributes)a.value.type==="TextNode"?n+=` ${a.name}="${a.value.chars}"`:(this.addMessage("warning",`Complex attribute values not fully supported: ${a.name}`,t.loc),n+=` ${a.name}="${this.getExpressionString(a.value)}"`);let e="";if(t.children)for(const a of t.children)e+=this.astToGrapesJS(a);return`<${t.tag}${n}>${e}</${t.tag}>`}handleTextNode(t){return t.chars||""}handlePartialStatement(t){return this.addMessage("warning",`Partials are not fully supported: ${t.name.original}`,t.loc),`{{> ${t.name.original}}}`}handleGenericBlock(t){const n=this.handleProgram(t.program);return`<!-- Unsupported block: ${t.path.original} -->${n}`}getExpressionString(t){return t.type==="PathExpression"?t.original:t.type==="StringLiteral"?t.value:t.type==="NumberLiteral"?t.value.toString():t.type==="BooleanLiteral"?t.value?"true":"false":t.type==="SubExpression"?this.getExpressionString(t.params[0]):t.type==="Hash"?`{${t.pairs.map(e=>`${e.key}=${this.getExpressionString(e.value)}`).join(", ")}}`:(this.addMessage("warning",`Complex expression type not fully supported: ${t.type}`,t.loc),"")}addMessage(t,n,e){this.messages.push({type:t,message:n,location:e?{line:e.start.line,column:e.start.column}:void 0})}}const A="dataSourceHandlebars",G=p.startup,R=function(r,t={}){const n=V(r,new U),e=q(r,{contains:"{{",importer:new W});_({editor:r,licenseKey:t.licenseKey,plan:G,pluginName:A,cleanup:()=>{n(),e()}})},F=M(R);module.exports=F;