domma-cms 0.36.7 → 0.36.8

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "domma-cms",
3
- "version": "0.36.7",
3
+ "version": "0.36.8",
4
4
  "description": "File-based CMS powered by Domma and Fastify. Run npx domma-cms my-site to create a new project.",
5
5
  "type": "module",
6
6
  "main": "server/server.js",
@@ -1 +1 @@
1
- (function(c,l){typeof module<"u"&&module.exports?module.exports=l():c.FormLogicEngine=l()})(typeof globalThis<"u"?globalThis:this,function(){"use strict";function c(e){return e===""||e===null||e===void 0?"":String(e)}function l(e){const s=parseFloat(e);return isNaN(s)?null:s}function f(e){return e==null?!0:typeof e=="string"?e.trim()==="":Array.isArray(e)?e.length===0:!1}function p(e,s){if(!e||!e.field||!e.operator)return!0;const t=s[e.field],n=c(t),r=c(e.value);switch(e.operator){case"equals":return n===r;case"not_equals":return n!==r;case"contains":return n.toLowerCase().includes(r.toLowerCase());case"not_contains":return!n.toLowerCase().includes(r.toLowerCase());case"starts_with":return n.toLowerCase().startsWith(r.toLowerCase());case"ends_with":return n.toLowerCase().endsWith(r.toLowerCase());case"greater_than":{const i=l(t),a=l(e.value);return i!==null&&a!==null&&i>a}case"less_than":{const i=l(t),a=l(e.value);return i!==null&&a!==null&&i<a}case"is_empty":return f(t);case"is_not_empty":return!f(t);case"in":return(Array.isArray(e.value)?e.value.map(c):String(e.value).split(",").map(a=>a.trim())).includes(n);case"not_in":return!(Array.isArray(e.value)?e.value.map(c):String(e.value).split(",").map(a=>a.trim())).includes(n);case"matches_regex":try{const i=e.flags||"";return new RegExp(e.value,i).test(n)}catch(i){return typeof console<"u"&&console.warn&&console.warn('[FormLogicEngine] Invalid regex in condition for field "'+e.field+'": '+e.value,i&&i.message),!1}default:return!0}}function u(e,s){return e?Array.isArray(e.all)?e.all.every(t=>t.all||t.any?u(t,s):p(t,s)):Array.isArray(e.any)?e.any.some(t=>t.all||t.any?u(t,s):p(t,s)):e.field&&e.operator?p(e,s):!0:!0}function d(e,s){const t=e.logic;if(!t||!t.visibility)return"visible";const n=t.visibility,r=n.conditions||[];for(const i of r)if(i.when&&u(i.when,s))return i.then==="hidden"?"hidden":"visible";return n.default==="hidden"?"hidden":"visible"}function y(e,s){const t=e.logic;if(!t||!t.requirement)return e.required||!1;const n=t.requirement,r=n.conditions||[];for(const i of r)if(i.when&&u(i.when,s))return i.then===!0;return n.default===!0}function h(e,s,t){const n=e.logic;if(!n||!Array.isArray(n.validation))return[];const r=[];for(const i of n.validation)switch(i.type){case"regex":{if(!f(s))try{new RegExp(i.pattern||"",i.flags||"").test(c(s))||r.push({message:i.message||"Invalid format."})}catch{}break}case"match":{const a=t[i.field];!f(s)&&c(s)!==c(a)&&r.push({message:i.message||"Fields do not match."});break}}return r}function m(e,s){const t=e.logic;if(!t||!t.cascade||!t.cascade.sourceField)return null;const n=t.cascade,r=c(s[n.sourceField]),i=n.mapping||{};return Object.prototype.hasOwnProperty.call(i,r)?i[r]||[]:n.defaultOptions||null}function _(e,s){s==="fade"?(e.style.transition="opacity 0.25s ease",e.style.opacity="1",requestAnimationFrame(function(){e.style.opacity="0",setTimeout(function(){e.classList.add("fb-field-hidden"),e.style.transition="",e.style.opacity=""},260)})):s==="slide"?(e.style.overflow="hidden",e.style.maxHeight=e.scrollHeight+"px",e.style.transition="max-height 0.3s ease, opacity 0.2s ease",requestAnimationFrame(function(){e.style.maxHeight="0",e.style.opacity="0",setTimeout(function(){e.classList.add("fb-field-hidden"),e.style.transition="",e.style.maxHeight="",e.style.opacity="",e.style.overflow=""},320)})):s==="scale"&&(e.style.transition="opacity 0.2s ease, transform 0.2s ease",e.style.transform="scale(1)",e.style.opacity="1",requestAnimationFrame(function(){e.style.transform="scale(0.95)",e.style.opacity="0",setTimeout(function(){e.classList.add("fb-field-hidden"),e.style.transition="",e.style.transform="",e.style.opacity=""},220)}))}function v(e,s){e.classList.remove("fb-field-hidden"),s==="fade"?(e.style.opacity="0",e.style.transition="opacity 0.25s ease",requestAnimationFrame(function(){e.style.opacity="1",setTimeout(function(){e.style.transition="",e.style.opacity=""},260)})):s==="slide"?(e.style.overflow="hidden",e.style.maxHeight="0",e.style.opacity="0",e.style.transition="max-height 0.3s ease, opacity 0.2s ease",requestAnimationFrame(function(){e.style.maxHeight=e.scrollHeight+"px",e.style.opacity="1",setTimeout(function(){e.style.transition="",e.style.maxHeight="",e.style.opacity="",e.style.overflow=""},320)})):s==="scale"&&(e.style.transform="scale(0.95)",e.style.opacity="0",e.style.transition="opacity 0.2s ease, transform 0.2s ease",requestAnimationFrame(function(){e.style.transform="scale(1)",e.style.opacity="1",setTimeout(function(){e.style.transition="",e.style.transform="",e.style.opacity=""},220)}))}function o(e,s){this._form=e,this._wrapper=s,this._fields=(e.fields||[]).filter(t=>t.type!=="page-break"),this._listeners=[],this._depMap=new Map,this._initialEval=!1}return o.prototype._buildDepMap=function(){this._depMap.clear();const e=this;e._fields.forEach(function(s){const t=s.logic;if(!t)return;function n(r){if(!r)return;(r.all||r.any||[]).forEach(function(a){a.field?(e._depMap.has(a.field)||e._depMap.set(a.field,new Set),e._depMap.get(a.field).add(s.name)):n(a)})}if(t.visibility&&(t.visibility.conditions||[]).forEach(function(r){n(r.when)}),t.requirement&&(t.requirement.conditions||[]).forEach(function(r){n(r.when)}),t.cascade&&t.cascade.sourceField){const r=t.cascade.sourceField;e._depMap.has(r)||e._depMap.set(r,new Set),e._depMap.get(r).add(s.name)}})},o.prototype._getValues=function(){const e={};return this._fields.forEach(function(s){const t=this._wrapper.querySelector('[name="'+s.name+'"]');if(t)if(t.type==="radio"){const n=this._wrapper.querySelector('[name="'+s.name+'"]:checked');e[s.name]=n?n.value:""}else if(t.type==="checkbox"){const n=this._wrapper.querySelectorAll('input[type="checkbox"][name="'+s.name+'"]');if(n.length>1){const r=[];n.forEach(function(i){i.checked&&r.push(i.value)}),e[s.name]=r}else e[s.name]=t.checked?t.value||"true":""}else e[s.name]=t.value},this),e},o.prototype._applyVisibility=function(e,s){const n=d(e,s)==="hidden",r=this._findFieldWrapper(e.name);if(!r)return;r.setAttribute("aria-hidden",String(n));const i=this._initialEval?"none":e.logic?.visibility?.transition||"none";if(i==="none"){r.classList.toggle("fb-field-hidden",n);return}r.style.transition="",n?_(r,i):v(r,i)},o.prototype._applyRequirement=function(e,s){const t=y(e,s),n=this._wrapper.querySelector('[name="'+e.name+'"]');n&&(t?n.setAttribute("required",""):n.removeAttribute("required"))},o.prototype._applyCascade=function(e,s){const t=m(e,s);if(t===null)return;const n=this._wrapper.querySelector('select[name="'+e.name+'"]');if(!n)return;const r=n.value;n.textContent="",t.forEach(function(i){const a=document.createElement("option");a.value=i.value,a.textContent=i.label||i.value,i.value===r&&(a.selected=!0),n.appendChild(a)})},o.prototype._applyValidation=function(e,s){const t=this._wrapper.querySelector('[name="'+e.name+'"]');if(!t)return;const n=t.type==="checkbox"?t.checked?t.value||"true":"":t.value,r=h(e,n,s);let i=t.parentNode.querySelector(".fb-validation-error");r.length?(i||(i=document.createElement("div"),i.className="fb-validation-error",t.parentNode.appendChild(i)),i.textContent=r[0].message):i&&i.remove()},o.prototype._findFieldWrapper=function(e){const s=this._wrapper.querySelector('[name="'+e+'"]');if(!s)return null;const t=s.closest("form")||this._wrapper;let n=s;for(;n.parentNode&&n.parentNode!==t;)n=n.parentNode;return n},o.prototype.evaluate=function(e){const s=this._getValues(),t=this;let n;if(e&&this._depMap.has(e)){const r=this._depMap.get(e);n=this._fields.filter(function(i){return r.has(i.name)})}else n=this._fields;n.forEach(function(r){r.logic&&(t._applyVisibility(r,s),t._applyRequirement(r,s),t._applyCascade(r,s))})},o.prototype.init=function(){this._buildDepMap();const e=this;this._wrapper.querySelectorAll("input, select, textarea").forEach(function(t){const n=t.getAttribute("name");if(!n)return;const r=function(){e.evaluate(n)};t.addEventListener("input",r),t.addEventListener("change",r),e._listeners.push({el:t,event:"input",fn:r}),e._listeners.push({el:t,event:"change",fn:r});const i=e._fields.find(function(a){return a.name===n});if(i&&i.logic&&Array.isArray(i.logic.validation)&&i.logic.validation.length){const a=function(){const g=e._getValues();e._applyValidation(i,g)};t.addEventListener("blur",a),e._listeners.push({el:t,event:"blur",fn:a})}}),this._initialEval=!0,this.evaluate(),this._initialEval=!1},o.prototype.destroy=function(){this._listeners.forEach(function(e){e.el.removeEventListener(e.event,e.fn)}),this._listeners=[]},{evaluateCondition:p,evaluateConditionGroup:u,evaluateFieldVisibility:d,evaluateFieldRequirement:y,validateField:h,getCascadeOptions:m,FormLogicRuntime:o}});
1
+ (function(c,l){typeof module<"u"&&module.exports?module.exports=l():c.FormLogicEngine=l()})(typeof globalThis<"u"?globalThis:this,function(){"use strict";function c(e){return e===""||e===null||e===void 0?"":String(e)}function l(e){const i=parseFloat(e);return isNaN(i)?null:i}function f(e){return e==null?!0:typeof e=="string"?e.trim()==="":Array.isArray(e)?e.length===0:!1}function p(e,i){if(!e||!e.field||!e.operator)return!0;const n=i[e.field],t=c(n),r=c(e.value);switch(e.operator){case"equals":return t===r;case"not_equals":return t!==r;case"contains":return t.toLowerCase().includes(r.toLowerCase());case"not_contains":return!t.toLowerCase().includes(r.toLowerCase());case"starts_with":return t.toLowerCase().startsWith(r.toLowerCase());case"ends_with":return t.toLowerCase().endsWith(r.toLowerCase());case"greater_than":{const s=l(n),a=l(e.value);return s!==null&&a!==null&&s>a}case"less_than":{const s=l(n),a=l(e.value);return s!==null&&a!==null&&s<a}case"is_empty":return f(n);case"is_not_empty":return!f(n);case"in":return(Array.isArray(e.value)?e.value.map(c):String(e.value).split(",").map(a=>a.trim())).includes(t);case"not_in":return!(Array.isArray(e.value)?e.value.map(c):String(e.value).split(",").map(a=>a.trim())).includes(t);case"matches_regex":try{const s=e.flags||"";return new RegExp(e.value,s).test(t)}catch(s){return typeof console<"u"&&console.warn&&console.warn('[FormLogicEngine] Invalid regex in condition for field "'+e.field+'": '+e.value,s&&s.message),!1}default:return!0}}function u(e,i){return e?Array.isArray(e.all)?e.all.every(n=>n.all||n.any?u(n,i):p(n,i)):Array.isArray(e.any)?e.any.some(n=>n.all||n.any?u(n,i):p(n,i)):e.field&&e.operator?p(e,i):!0:!0}function y(e,i){const n=e.logic;if(!n||!n.visibility)return"visible";const t=n.visibility,r=t.conditions||[];for(const s of r)if(s.when&&u(s.when,i))return s.then==="hidden"?"hidden":"visible";return t.default==="hidden"?"hidden":"visible"}function h(e,i){const n=e.logic;if(!n||!n.requirement)return e.required||!1;const t=n.requirement,r=t.conditions||[];for(const s of r)if(s.when&&u(s.when,i))return s.then===!0;return t.default===!0}function m(e,i,n){const t=e.logic;if(!t||!Array.isArray(t.validation))return[];const r=[];for(const s of t.validation)switch(s.type){case"regex":{if(!f(i))try{new RegExp(s.pattern||"",s.flags||"").test(c(i))||r.push({message:s.message||"Invalid format."})}catch{}break}case"match":{const a=n[s.field];!f(i)&&c(i)!==c(a)&&r.push({message:s.message||"Fields do not match."});break}}return r}function _(e,i){const n=e.logic;if(!n||!n.cascade||!n.cascade.sourceField)return null;const t=n.cascade,r=c(i[t.sourceField]),s=t.mapping||{};return Object.prototype.hasOwnProperty.call(s,r)?s[r]||[]:t.defaultOptions||null}function v(e,i){i==="fade"?(e.style.transition="opacity 0.25s ease",e.style.opacity="1",requestAnimationFrame(function(){e.style.opacity="0",setTimeout(function(){e.classList.add("fb-field-hidden"),e.style.transition="",e.style.opacity=""},260)})):i==="slide"?(e.style.overflow="hidden",e.style.maxHeight=e.scrollHeight+"px",e.style.transition="max-height 0.3s ease, opacity 0.2s ease",requestAnimationFrame(function(){e.style.maxHeight="0",e.style.opacity="0",setTimeout(function(){e.classList.add("fb-field-hidden"),e.style.transition="",e.style.maxHeight="",e.style.opacity="",e.style.overflow=""},320)})):i==="scale"&&(e.style.transition="opacity 0.2s ease, transform 0.2s ease",e.style.transform="scale(1)",e.style.opacity="1",requestAnimationFrame(function(){e.style.transform="scale(0.95)",e.style.opacity="0",setTimeout(function(){e.classList.add("fb-field-hidden"),e.style.transition="",e.style.transform="",e.style.opacity=""},220)}))}function g(e,i){e.classList.remove("fb-field-hidden"),i==="fade"?(e.style.opacity="0",e.style.transition="opacity 0.25s ease",requestAnimationFrame(function(){e.style.opacity="1",setTimeout(function(){e.style.transition="",e.style.opacity=""},260)})):i==="slide"?(e.style.overflow="hidden",e.style.maxHeight="0",e.style.opacity="0",e.style.transition="max-height 0.3s ease, opacity 0.2s ease",requestAnimationFrame(function(){e.style.maxHeight=e.scrollHeight+"px",e.style.opacity="1",setTimeout(function(){e.style.transition="",e.style.maxHeight="",e.style.opacity="",e.style.overflow=""},320)})):i==="scale"&&(e.style.transform="scale(0.95)",e.style.opacity="0",e.style.transition="opacity 0.2s ease, transform 0.2s ease",requestAnimationFrame(function(){e.style.transform="scale(1)",e.style.opacity="1",setTimeout(function(){e.style.transition="",e.style.transform="",e.style.opacity=""},220)}))}function o(e,i){this._form=e,this._wrapper=i,this._fields=(e.fields||[]).filter(n=>n.type!=="page-break"),this._listeners=[],this._depMap=new Map,this._initialEval=!1}return o.prototype._buildDepMap=function(){this._depMap.clear();const e=this;e._fields.forEach(function(i){const n=i.logic;if(!n)return;function t(r){if(!r)return;(r.all||r.any||[]).forEach(function(a){a.field?(e._depMap.has(a.field)||e._depMap.set(a.field,new Set),e._depMap.get(a.field).add(i.name)):t(a)})}if(n.visibility&&(n.visibility.conditions||[]).forEach(function(r){t(r.when)}),n.requirement&&(n.requirement.conditions||[]).forEach(function(r){t(r.when)}),n.cascade&&n.cascade.sourceField){const r=n.cascade.sourceField;e._depMap.has(r)||e._depMap.set(r,new Set),e._depMap.get(r).add(i.name)}})},o.prototype._getValues=function(){const e={};return this._fields.forEach(function(i){const n=this._wrapper.querySelector('[name="'+i.name+'"]');if(n)if(n.type==="radio"){const t=this._wrapper.querySelector('[name="'+i.name+'"]:checked');e[i.name]=t?t.value:""}else if(n.type==="checkbox"){const t=this._wrapper.querySelectorAll('input[type="checkbox"][name="'+i.name+'"]');if(t.length>1){const r=[];t.forEach(function(s){s.checked&&r.push(s.value)}),e[i.name]=r}else e[i.name]=n.checked?n.value||"true":""}else e[i.name]=n.value},this),e},o.prototype._applyVisibility=function(e,i){const t=y(e,i)==="hidden",r=this._findFieldWrapper(e.name);if(!r)return;r.setAttribute("aria-hidden",String(t));const s=this._initialEval?"none":e.logic?.visibility?.transition||"none";if(s==="none"){r.classList.toggle("fb-field-hidden",t);return}r.style.transition="",t?v(r,s):g(r,s)},o.prototype._applyRequirement=function(e,i){const n=h(e,i),t=this._wrapper.querySelector('[name="'+e.name+'"]');t&&(n?t.setAttribute("required",""):t.removeAttribute("required"))},o.prototype._applyCascade=function(e,i){const n=_(e,i);if(n===null)return;const t=this._wrapper.querySelector('select[name="'+e.name+'"]');if(!t)return;const r=t.value;t.textContent="",n.forEach(function(s){const a=document.createElement("option");a.value=s.value,a.textContent=s.label||s.value,s.value===r&&(a.selected=!0),t.appendChild(a)})},o.prototype._applyValidation=function(e,i){const n=this._wrapper.querySelector('[name="'+e.name+'"]');if(!n)return;const t=n.type==="checkbox"?n.checked?n.value||"true":"":n.value,r=m(e,t,i);let s=n.parentNode.querySelector(".fb-validation-error");r.length?(s||(s=document.createElement("div"),s.className="fb-validation-error",n.parentNode.appendChild(s)),s.textContent=r[0].message):s&&s.remove()},o.prototype._findFieldWrapper=function(e){const i=this._wrapper.querySelector('[name="'+e+'"]');if(!i)return null;const n=i.closest("form")||this._wrapper;let t=i;for(;t.parentNode&&t.parentNode!==n;)t=t.parentNode;return t},o.prototype.evaluate=function(e){const i=this._getValues(),n=this;let t;if(e&&this._depMap.has(e)){const r=this._depMap.get(e);t=this._fields.filter(function(s){return r.has(s.name)})}else t=this._fields;t.forEach(function(r){r.logic&&(n._applyVisibility(r,i),n._applyRequirement(r,i),n._applyCascade(r,i))})},o.prototype.init=function(){this._buildDepMap();const e=this;this._wrapper.querySelectorAll("input, select, textarea").forEach(function(t){const r=t.getAttribute("name");if(!r)return;const s=function(){e.evaluate(r)};t.addEventListener("input",s),t.addEventListener("change",s),e._listeners.push({el:t,event:"input",fn:s}),e._listeners.push({el:t,event:"change",fn:s});const a=e._fields.find(function(d){return d.name===r});if(a&&a.logic&&Array.isArray(a.logic.validation)&&a.logic.validation.length){const d=function(){const w=e._getValues();e._applyValidation(a,w)};t.addEventListener("blur",d),e._listeners.push({el:t,event:"blur",fn:d})}}),this._wrapper.querySelectorAll("[data-chooser-field]").forEach(function(t){const r=t.getAttribute("data-chooser-field");if(!r)return;const s=function(){setTimeout(function(){e.evaluate(r)},0)};t.addEventListener("click",s),e._listeners.push({el:t,event:"click",fn:s})}),this._initialEval=!0,this.evaluate(),this._initialEval=!1},o.prototype.destroy=function(){this._listeners.forEach(function(e){e.el.removeEventListener(e.event,e.fn)}),this._listeners=[]},{evaluateCondition:p,evaluateConditionGroup:u,evaluateFieldVisibility:y,evaluateFieldRequirement:h,validateField:m,getCascadeOptions:_,FormLogicRuntime:o}});
@@ -123,7 +123,7 @@
123
123
  <script src="/public/js/collection-browser.js?v=20260523-browser"></script>
124
124
 
125
125
  <!-- Core Forms (logic engine must load before renderer) -->
126
- <script src="/public/js/form-logic-engine.js?v=20260509-chooser"></script>
126
+ <script src="/public/js/form-logic-engine.js?v=20260704-chooser-events"></script>
127
127
  <script src="/public/js/forms.js?v=20260509-chooser" type="module"></script>
128
128
 
129
129
  <!-- Core effects runtime -->