diff --git a/lib/docs/.nojekyll b/lib/docs/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/lib/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/lib/docs/assets/highlight.css b/lib/docs/assets/highlight.css new file mode 100644 index 0000000..0d70479 --- /dev/null +++ b/lib/docs/assets/highlight.css @@ -0,0 +1,99 @@ +:root { + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #A31515; + --dark-hl-2: #CE9178; + --light-hl-3: #0000FF; + --dark-hl-3: #569CD6; + --light-hl-4: #0451A5; + --dark-hl-4: #9CDCFE; + --light-hl-5: #008000; + --dark-hl-5: #6A9955; + --light-hl-6: #AF00DB; + --dark-hl-6: #C586C0; + --light-hl-7: #001080; + --dark-hl-7: #9CDCFE; + --light-hl-8: #267F99; + --dark-hl-8: #4EC9B0; + --light-hl-9: #0070C1; + --dark-hl-9: #4FC1FF; + --light-hl-10: #098658; + --dark-hl-10: #B5CEA8; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +pre, code { background: var(--code-background); } diff --git a/lib/docs/assets/icons.js b/lib/docs/assets/icons.js new file mode 100644 index 0000000..e88e8ca --- /dev/null +++ b/lib/docs/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `""`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/lib/docs/assets/icons.svg b/lib/docs/assets/icons.svg new file mode 100644 index 0000000..e371b8b --- /dev/null +++ b/lib/docs/assets/icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/docs/assets/main.js b/lib/docs/assets/main.js new file mode 100644 index 0000000..7d7f77a --- /dev/null +++ b/lib/docs/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Ce=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Ce(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),Ve(t,i,r,e)}function Ve(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?He(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function He(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var Be={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>Be[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",H="mouseup",J={x:0,y:0},me=!1,ne=!1,je=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",H="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var qe=new U;Object.defineProperty(window,"app",{value:qe});fe();we();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/lib/docs/assets/navigation.js b/lib/docs/assets/navigation.js new file mode 100644 index 0000000..d696d62 --- /dev/null +++ b/lib/docs/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/lib/docs/assets/search.js b/lib/docs/assets/search.js new file mode 100644 index 0000000..2ddcac3 --- /dev/null +++ b/lib/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/lib/docs/assets/style.css b/lib/docs/assets/style.css new file mode 100644 index 0000000..9d619a6 --- /dev/null +++ b/lib/docs/assets/style.css @@ -0,0 +1,1448 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} +footer > p { + margin: 0 1em; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} +a.tsd-anchor-link { + color: var(--color-text); +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h4, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; +} + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); +} +.tsd-full-hierarchy, +.tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; +} +.tsd-full-hierarchy ul { + padding-left: 1.5rem; +} +.tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-navigation .tsd-nav-link { + display: none; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-literal { + color: var(--color-ts-type-literal); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/lib/docs/classes/core_ArgumentMethodProcessor.ArgumentMethodProcessor.html b/lib/docs/classes/core_ArgumentMethodProcessor.ArgumentMethodProcessor.html new file mode 100644 index 0000000..eb02197 --- /dev/null +++ b/lib/docs/classes/core_ArgumentMethodProcessor.ArgumentMethodProcessor.html @@ -0,0 +1,42 @@ +ArgumentMethodProcessor | @dxfrontier/cds-ts-dispatcher

The ArgumentMethodProcessor class is responsible for processing method arguments, including reordering arguments by type and applying decorators.

+

Constructors

Properties

args: any[]

The arguments to be processed.

+
propertyName: string | symbol

The name of the property.

+
target: object

The target object.

+
temporaryArgs: TemporaryArgs = ...

A temporary storage for arguments, organized by type.

+

Methods

  • Applies multiple decorators by key.

    +

    Parameters

    • metadataKey:
          | "IS_ROLE"
          | "SINGLE_INSTANCE_SWITCH"
          | "IS_PRESENT"
          | "IS_COLUMN_SUPPLIED"
          | "GET_QUERY"
          | "GET_REQUEST"
          | "REQ"
          | "RES"
          | "RESULTS"
          | "NEXT"
          | "ERROR"
          | "JWT"

      The metadata key.

      +

    Returns void

  • Applies a single decorator by key. This method is used only for single decorators, the ones which can appear only once, like Next, Req, Results, etc.

    +

    Parameters

    • decorator: {
          data: unknown;
          metadataKey:
              | "IS_ROLE"
              | "SINGLE_INSTANCE_SWITCH"
              | "IS_PRESENT"
              | "IS_COLUMN_SUPPLIED"
              | "GET_QUERY"
              | "GET_REQUEST"
              | "REQ"
              | "RES"
              | "RESULTS"
              | "NEXT"
              | "ERROR"
              | "JWT";
      }

      The decorator metadata and data.

      +
      • data: unknown
      • metadataKey:
            | "IS_ROLE"
            | "SINGLE_INSTANCE_SWITCH"
            | "IS_PRESENT"
            | "IS_COLUMN_SUPPLIED"
            | "GET_QUERY"
            | "GET_REQUEST"
            | "REQ"
            | "RES"
            | "RESULTS"
            | "NEXT"
            | "ERROR"
            | "JWT"

    Returns void

  • Checks if a decorator exists for the given metadata key.

    +

    Parameters

    • metadataKey:
          | "IS_ROLE"
          | "SINGLE_INSTANCE_SWITCH"
          | "IS_PRESENT"
          | "IS_COLUMN_SUPPLIED"
          | "GET_QUERY"
          | "GET_REQUEST"
          | "REQ"
          | "RES"
          | "RESULTS"
          | "NEXT"
          | "ERROR"
          | "JWT"

      The metadata key.

      +

    Returns undefined | boolean

    True if the decorator exists, otherwise undefined.

    +
  • Retrieves the assigned decorators, checking if for the current parameter if there's any decorator assigned.

    +

    Returns (
        | "IS_ROLE"
        | "SINGLE_INSTANCE_SWITCH"
        | "IS_PRESENT"
        | "IS_COLUMN_SUPPLIED"
        | "GET_QUERY"
        | "GET_REQUEST"
        | "REQ"
        | "RES"
        | "RESULTS"
        | "NEXT"
        | "ERROR"
        | "JWT")[]

    An array of decorator keys.

    +
  • Retrieves metadata for the given metadata key.

    +

    Parameters

    • metadataKey:
          | "IS_ROLE"
          | "SINGLE_INSTANCE_SWITCH"
          | "IS_PRESENT"
          | "IS_COLUMN_SUPPLIED"
          | "GET_QUERY"
          | "GET_REQUEST"
          | "REQ"
          | "RES"
          | "RESULTS"
          | "NEXT"
          | "ERROR"
          | "JWT"

      The metadata key.

      +

    Returns undefined | MetadataFields[]

    The metadata fields or undefined.

    +
  • Checks if any decorators are attached.

    +

    Returns boolean

    True if any decorators are attached, otherwise false.

    +
  • This method is executed on creation of the instance ArgumentMethodProcessor and serves as an ordering of the args based on the type for later use.

    +

    Returns void

\ No newline at end of file diff --git a/lib/docs/classes/core_CDSDispatcher.CDSDispatcher.html b/lib/docs/classes/core_CDSDispatcher.CDSDispatcher.html new file mode 100644 index 0000000..49090e0 --- /dev/null +++ b/lib/docs/classes/core_CDSDispatcher.CDSDispatcher.html @@ -0,0 +1,96 @@ +CDSDispatcher | @dxfrontier/cds-ts-dispatcher

CDSDispatcher is responsible for managing and registering event handlers for entities within the CDS framework.

+

It supports events such as Before, After, On, and Prepend.

+

Constructors

  • Creates an instance of CDSDispatcher.

    +

    Parameters

    • entities: NonEmptyArray<Constructable<any>>

      An array of entity classes to manage event handlers for.

      +

    Returns CDSDispatcher

    export = new CDSDispatcher([Entity1, Entity2, EntityN]).initialize();
    +
    + +

Properties

container: Container = ...

The dependency injection container for managing service instances and dependencies.

+

This container is configured to:

+
    +
  • Skip base class checks.
  • +
  • Automatically bind injectable classes.
  • +
+
entities: NonEmptyArray<Constructable<any>>

An array of entity classes to manage event handlers for.

+
srv: Service

The service instance used by the dispatcher.

+

This is the service that the dispatcher will interact with to register handlers and perform operations.

+

Methods

  • Builds the handler by type.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +

    Returns void

  • Builds middleware for the entity instance.

    +

    Parameters

    • entityInstance: Constructable<any>

      The entity instance.

      +

    Returns void

  • Builds the service implementation.

    +

    Returns ((srv: Service) => void)

    The function that initializes the service.

    +
      • (srv): void
      • Parameters

        Returns void

  • Executes an 'after' event handler.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +
    • req: Request

      The request object.

      +
    • results: unknown

      The result of the request.

      +

    Returns Promise<unknown>

    The result of the handler's callback.

    +
  • Executes a 'before' event handler.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +
    • req: Request

      The request object.

      +

    Returns Promise<unknown>

    The result of the handler's callback.

    +
  • Executes an 'on' event handler.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +
    • req: Request

      The request object.

      +
    • next: Function

      The next middleware function.

      +

    Returns Promise<unknown>

    The result of the handler's callback.

    +
  • Executes an 'onError' event handler.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +
    • err: Error

      The error object.

      +
    • req: Request

      The request object.

      +

    Returns unknown

    The result of the handler's callback.

    +
  • Returns the active entity or the draft entity of the current handler class.

    +

    Parameters

    • handler: BaseHandler

      The handler instance.

      +
    • entityInstance: Constructable<any>

      The entity instance.

      +

    Returns undefined | Constructable<any>

    The active entity or draft entity, or undefined if not applicable.

    +
  • Retrieves the properties of the handler.

    +

    Parameters

    • handler: BaseHandler

      The handler instance.

      +
    • entityInstance: Constructable<any>

      The entity instance.

      +

    Returns {
        getAction: (() => {
            actionName: undefined | CdsFunction;
        });
        getDefault: (() => {
            entity: undefined | Constructable<any>;
            event:
                | "ERROR"
                | "*"
                | "CREATE"
                | "READ"
                | "UPDATE"
                | "DELETE"
                | "each"
                | "ACTION"
                | "BOUND_ACTION"
                | "BOUND_FUNC"
                | "FUNC"
                | "EDIT"
                | "SAVE"
                | "NEW"
                | "CANCEL"
                | "EVENT";
        });
        getEvent: (() => {
            eventName: undefined | string;
        });
        getPrepend: (() => {
            eventKind: undefined | EventKind;
        });
    }

    The handler properties.

    +
    • getAction: (() => {
          actionName: undefined | CdsFunction;
      })
    • getDefault: (() => {
          entity: undefined | Constructable<any>;
          event:
              | "ERROR"
              | "*"
              | "CREATE"
              | "READ"
              | "UPDATE"
              | "DELETE"
              | "each"
              | "ACTION"
              | "BOUND_ACTION"
              | "BOUND_FUNC"
              | "FUNC"
              | "EDIT"
              | "SAVE"
              | "NEW"
              | "CANCEL"
              | "EVENT";
      })
        • (): {
              entity: undefined | Constructable<any>;
              event:
                  | "ERROR"
                  | "*"
                  | "CREATE"
                  | "READ"
                  | "UPDATE"
                  | "DELETE"
                  | "each"
                  | "ACTION"
                  | "BOUND_ACTION"
                  | "BOUND_FUNC"
                  | "FUNC"
                  | "EDIT"
                  | "SAVE"
                  | "NEW"
                  | "CANCEL"
                  | "EVENT";
          }
        • Returns {
              entity: undefined | Constructable<any>;
              event:
                  | "ERROR"
                  | "*"
                  | "CREATE"
                  | "READ"
                  | "UPDATE"
                  | "DELETE"
                  | "each"
                  | "ACTION"
                  | "BOUND_ACTION"
                  | "BOUND_FUNC"
                  | "FUNC"
                  | "EDIT"
                  | "SAVE"
                  | "NEW"
                  | "CANCEL"
                  | "EVENT";
          }

          • entity: undefined | Constructable<any>
          • event:
                | "ERROR"
                | "*"
                | "CREATE"
                | "READ"
                | "UPDATE"
                | "DELETE"
                | "each"
                | "ACTION"
                | "BOUND_ACTION"
                | "BOUND_FUNC"
                | "FUNC"
                | "EDIT"
                | "SAVE"
                | "NEW"
                | "CANCEL"
                | "EVENT"
    • getEvent: (() => {
          eventName: undefined | string;
      })
        • (): {
              eventName: undefined | string;
          }
        • Returns {
              eventName: undefined | string;
          }

          • eventName: undefined | string
    • getPrepend: (() => {
          eventKind: undefined | EventKind;
      })
  • Gets the handlers for the entity instance.

    +

    Parameters

    • entityInstance: Constructable<any>

      The entity instance.

      +

    Returns undefined | {
        buildHandlers: (() => void);
        buildMiddlewares: (() => void);
    }

    The handler registration functions if handlers are found.

    +
  • Initializes the entities within the CDSDispatcher, registering their corresponding handlers.

    +

    Returns ServiceImpl

    An instance of ServiceImpl representing the registered service implementation.

    +
  • Registers all AFTER event handlers.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +

    Returns void

  • Registers AFTER - SingleInstance event handlers.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +

    Returns void

  • Registers all BEFORE event handlers.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +

    Returns void

  • Registers all ON event handlers.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +

    Returns void

  • Registers all PREPEND event handlers.

    +

    Parameters

    • handlerAndEntity: [BaseHandler, Constructable<any>]

      A tuple containing the handler and entity.

      +

    Returns void

  • Resolves dependencies for the entity.

    +

    Parameters

    • entity: Constructable<any>

      The entity class.

      +

    Returns Constructable<any>

    The resolved entity instance.

    +
\ No newline at end of file diff --git a/lib/docs/classes/core_MetadataDispatcher.MetadataDispatcher.html b/lib/docs/classes/core_MetadataDispatcher.MetadataDispatcher.html new file mode 100644 index 0000000..0ef0aa4 --- /dev/null +++ b/lib/docs/classes/core_MetadataDispatcher.MetadataDispatcher.html @@ -0,0 +1,38 @@ +MetadataDispatcher | @dxfrontier/cds-ts-dispatcher

The MetadataDispatcher class handles metadata operations for target objects, +such as setting and retrieving metadata related to entity handlers, middlewares, and method handlers.

+

Constructors

Properties

metadataKey: string | symbol

The key used to store metadata.

+
target: object

The target object on which metadata operations will be performed.

+

Methods

  • Adds entity handler metadata to the target object.

    +

    Parameters

    • entity: "*" | Constructable<any>

      The entity constructor or a constant representing all entities.

      +

    Returns void

  • Retrieves existing metadata or creates a new accumulator array if metadata is not set.

    +

    Returns any[]

    An array of metadata.

    +
  • Checks if metadata is already set for the target object.

    +

    Returns boolean

    true if metadata is set, false otherwise.

    +
  • Sets the middlewares metadata for the target object.

    +

    Parameters

    • middlewares: Constructable<MiddlewareImpl>[]

      An array of middleware constructors.

      +

    Returns void

  • Retrieves the entity metadata for the given entity.

    +

    Parameters

    • entity: Constructable<any>

      The entity constructor.

      +

    Returns undefined | {
        drafts: any;
        name: string;
    }

    The entity metadata, or undefined if not found.

    +
\ No newline at end of file diff --git a/lib/docs/classes/index.Request.html b/lib/docs/classes/index.Request.html new file mode 100644 index 0000000..3172dd6 --- /dev/null +++ b/lib/docs/classes/index.Request.html @@ -0,0 +1,28 @@ +Request | @dxfrontier/cds-ts-dispatcher

Hierarchy

  • Event
    • Request

Constructors

  • Parameters

    • properties: {
          data?: object;
          event: string;
          headers?: object;
          query?: object;
      }
      • Optionaldata?: object
      • event: string
      • Optionalheaders?: object
      • Optionalquery?: object

    Returns Request

Properties

data: any
entity: string

Shortcut to target (entity) name

+
event: string
features?: {
    [key: string]: boolean;
}
headers: any
http?: {
    req: Request;
    res: Response;
}
id: string
locale: `${string}_${string}`
method: string
params: (string | object)[]
path: string
query: Partial<SELECT & INSERT & UPDATE & DELETE & CREATE & DROP & UPSERT>
subject: ref
target: LinkedDefinition
tenant: string
timestamp: Date
user: User

Methods

  • Parameters

    • code: number
    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: {
          args?: any[];
          code?: string | number;
          message: string;
          status?: number;
          target?: string;
      }
      • Optionalargs?: any[]
      • Optionalcode?: string | number
      • message: string
      • Optionalstatus?: number
      • Optionaltarget?: string

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: {
          args?: any[];
          code?: string | number;
          message: string;
          target?: string;
      }
      • Optionalargs?: any[]
      • Optionalcode?: string | number
      • message: string
      • Optionaltarget?: string

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: {
          args?: any[];
          code?: string | number;
          message: string;
          target?: string;
      }
      • Optionalargs?: any[]
      • Optionalcode?: string | number
      • message: string
      • Optionaltarget?: string

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: {
          args?: any[];
          code?: string | number;
          message: string;
          status?: number;
          target?: string;
      }
      • Optionalargs?: any[]
      • Optionalcode?: string | number
      • message: string
      • Optionalstatus?: number
      • Optionaltarget?: string

    Returns Error

  • Parameters

    • results: any

    Returns void

  • Parameters

    • code: number
    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • code: number
    • message: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: string
    • Optionaltarget: string
    • Optionalargs: any[]

    Returns Error

  • Parameters

    • message: {
          args?: any[];
          code?: string | number;
          message: string;
          target?: string;
      }
      • Optionalargs?: any[]
      • Optionalcode?: string | number
      • message: string
      • Optionaltarget?: string

    Returns Error

\ No newline at end of file diff --git a/lib/docs/classes/index.Service.html b/lib/docs/classes/index.Service.html new file mode 100644 index 0000000..8b5651d --- /dev/null +++ b/lib/docs/classes/index.Service.html @@ -0,0 +1,70 @@ +Service | @dxfrontier/cds-ts-dispatcher

Class cds.Service

+

Hierarchy

  • QueryAPI
    • Service

Constructors

  • Parameters

    • Optionalname: string
    • Optionalmodel: CSN
    • Optionaloptions: {
          impl: string | ServiceImpl;
          kind: string;
      }

    Returns Service

Properties

create: {
    <T>(entity: T, key?: any): INSERT<T>;
    <T>(entity: string | LinkedDefinition, key?: any): INSERT<T>;
}

docs

+
delete: {
    <T>(entityOrPath: target, data?: object): DELETE<T>;
    <T>(entity: T, key?: any): DELETE<T>;
    <T>(entity: string | LinkedDefinition, key?: any): DELETE<T>;
}

Constructs and sends a DELETE request.

+
emit: {
    <T>(details: {
        data?: object;
        event: event;
        headers?: object;
    }): Promise<T>;
    <T>(event: event, data?: object, headers?: object): Promise<T>;
}

Constructs and emits an asynchronous event.

+
entities: Definitions & ((namespace: string) => Definitions)

Provides access to the entities exposed by a service

+
events: Definitions & ((namespace: string) => Definitions)

Provides access to the events declared by a service

+
insert: {
    <T>(data: T): INSERT<T>;
    <T>(data: object | object[]): INSERT<T>;
}

docs

+
kind: string

The kind of the service

+
model: LinkedCSN

The model from which the service's definition was loaded

+
name: string

The name of the service

+
operations: Definitions & ((namespace: string) => Definitions)

Provides access to the operations, i.e. actions and functions, exposed by a service

+
read: {
    <T>(entity: T, key?: any): Awaitable<SELECT<T>, InstanceType<T>>;
    <T>(entity: string | LinkedDefinition, key?: any): SELECT<T>;
}

docs

+
run: {
    (query: ConstructedQuery | ConstructedQuery[]): Promise<any>;
    (query: Partial<SELECT & INSERT & UPDATE & DELETE & CREATE & DROP & UPSERT>): Promise<any>;
    (query: string, args?: object | any[]): Promise<any>;
}

docs

+
send: {
    <T>(event: event, path: string, data?: object, headers?: object): Promise<T>;
    <T>(event: event, data?: object, headers?: object): Promise<T>;
    <T>(details: {
        data?: object;
        event: event;
        headers?: object;
    }): Promise<T>;
    <T>(details: {
        data?: object;
        headers?: object;
        query: ConstructedQuery;
    }): Promise<T>;
    <T>(details: {
        data?: object;
        headers?: object;
        method: string;
        path: string;
    }): Promise<T>;
    <T>(details: {
        data?: object;
        entity: string | LinkedDefinition;
        event: string;
        headers?: object;
        params?: object;
    }): Promise<T>;
}

Constructs and sends a synchronous request.

+
stream: {
    (column: string): {
        from(entity: string | LinkedDefinition): {
            where(filter: any): ReadableStream<any>;
        };
    };
    (query: Partial<SELECT & INSERT & UPDATE & DELETE & CREATE & DROP & UPSERT>): Promise<ReadableStream<any>>;
}

docs

+
transaction: {
    (fn: ((tx: Transaction) => object)): Promise<any>;
    (context?: object): Transaction;
    (context: object, fn: ((tx: Transaction) => object)): Promise<any>;
}
types: Definitions & ((namespace: string) => Definitions)

Provides access to the types exposed by a service

+
update: {
    <T>(entity: T, key?: any): UPDATE<T>;
    <T>(entity: string | LinkedDefinition, key?: any): UPDATE<T>;
}

docs

+
upsert: {
    <T>(data: T): UPSERT<T>;
    <T>(data: object | object[]): UPSERT<T>;
}

docs

+

Methods

  • Type Parameters

    • T extends Constructable<any>

    Parameters

    • eve: event
    • entity: T
    • handler: After<InstanceType<T>, void | Error | InstanceType<T>>

    Returns this

  • Parameters

    • eve: event
    • entity: target
    • handler: ResultsHandler

    Returns this

  • Parameters

    • eve: event
    • handler: ResultsHandler

    Returns this

  • Type Parameters

    • T extends Constructable<any>

    Parameters

    • eve: event
    • entity: T
    • handler: Before<InstanceType<T>, void | Error | InstanceType<T>>

    Returns this

  • Parameters

    • eve: event
    • entity: target
    • handler: EventHandler

    Returns this

  • Parameters

    • eve: event
    • handler: EventHandler

    Returns this

  • Parameters

    • msg: event

    Returns Promise<any>

  • Parameters

    • query: Partial<SELECT & INSERT & UPDATE & DELETE & CREATE & DROP & UPSERT>
    • callback: ((row: object) => void)
        • (row): void
        • Parameters

          • row: object

          Returns void

    Returns this

    docs

    +
  • Constructs and sends a GET request.

    +

    Type Parameters

    • T = any

    Parameters

    • entityOrPath: target
    • Optionaldata: object

    Returns Promise<T>

  • Acts like a parameter-less constructor. Ensure to call await super.init() to have the base class’s handlers added. +You may register own handlers before the base class’s ones, to intercept requests before the default handlers snap in.

    +

    Returns Promise<void>

  • Type Parameters

    • T extends Constructable<any>

    Parameters

    • eve: event
    • entity: T
    • handler: On<InstanceType<T>, void | Error | InstanceType<T>>

    Returns this

  • Type Parameters

    Parameters

    • boundAction: F
    • service: string
    • handler: ActionEventHandler<F["__parameters"], void | Error | F["__returns"]>

    Returns this

  • Type Parameters

    Parameters

    • unboundAction: F
    • handler: ActionEventHandler<F["__parameters"], void | Error | F["__returns"]>

    Returns this

  • Parameters

    • eve: event
    • entity: target
    • handler: OnEventHandler

    Returns this

  • Parameters

    • eve: event
    • handler: OnEventHandler

    Returns this

  • Parameters

    • eve: "error"
    • handler: OnErrorHandler

    Returns this

  • Constructs and sends a PATCH request.

    +

    Type Parameters

    • T = any

    Parameters

    • entityOrPath: target
    • Optionaldata: object

    Returns Promise<T>

  • Constructs and sends a POST request.

    +

    Type Parameters

    • T = any

    Parameters

    • entityOrPath: target
    • Optionaldata: object

    Returns Promise<T>

  • Parameters

    Returns Promise<Service>

  • Constructs and sends a PUT request.

    +

    Type Parameters

    • T = any

    Parameters

    • entityOrPath: target
    • Optionaldata: object

    Returns Promise<T>

  • Parameters

    • eves: event
    • Rest...entity: target[]

    Returns this

\ No newline at end of file diff --git a/lib/docs/classes/types_types.GetQueryType.html b/lib/docs/classes/types_types.GetQueryType.html new file mode 100644 index 0000000..3859610 --- /dev/null +++ b/lib/docs/classes/types_types.GetQueryType.html @@ -0,0 +1,20 @@ +GetQueryType | @dxfrontier/cds-ts-dispatcher

Constructors

Properties

as: SELECT
columns: {
    forInsert: string[];
    forSelect: column_expr[];
    forUpsert: string[];
}
data: {
    [key: string]: expr;
}
distinct: undefined | true
entity: string | ref
entries: data[]
excluding: undefined | string[]
from: {
    forDelete: string | ref;
    forSelect: source;
}
groupBy: undefined | expr[]
having: undefined | predicate
into: string | ref
limit: {
    offset: {
        val: number;
    };
    rows: {
        val: number;
    };
}
mixin: undefined | {
    [key: string]: expr;
}
one: undefined | boolean
orderBy: undefined | ordering_term[]
rows: scalar[][]
values: scalar[]
where: undefined | predicate
\ No newline at end of file diff --git a/lib/docs/classes/util_middleware_MiddlewareEntityRegistry.MiddlewareEntityRegistry.html b/lib/docs/classes/util_middleware_MiddlewareEntityRegistry.MiddlewareEntityRegistry.html new file mode 100644 index 0000000..21be073 --- /dev/null +++ b/lib/docs/classes/util_middleware_MiddlewareEntityRegistry.MiddlewareEntityRegistry.html @@ -0,0 +1,28 @@ +MiddlewareEntityRegistry | @dxfrontier/cds-ts-dispatcher

This class registers the middleware classes for @Use decorator.

+

Constructors

Properties

entityInstance: Constructable<any>

The entity instance to be used.

+
srv: Service

The service instance to be used.

+

Methods

  • Executes the middleware chain starting from the specified index.

    +

    Parameters

    • req: Request

      The request object.

      +
    • startIndex: number = 0

      The index from which to start the middleware chain.

      +

    Returns Promise<void>

  • Retrieves the active entity or its draft entity.

    +

    Returns undefined | Constructable<any>

    The active entity or its draft entity if available.

    +
\ No newline at end of file diff --git a/lib/docs/enums/types_enum.HandlerType.html b/lib/docs/enums/types_enum.HandlerType.html new file mode 100644 index 0000000..3c6f179 --- /dev/null +++ b/lib/docs/enums/types_enum.HandlerType.html @@ -0,0 +1,6 @@ +HandlerType | @dxfrontier/cds-ts-dispatcher

Enumeration Members

Enumeration Members

After: 1
AfterSingleInstance: 2
Before: 0
On: 3
Prepend: 4
\ No newline at end of file diff --git a/lib/docs/functions/decorators_class.EntityHandler.html b/lib/docs/functions/decorators_class.EntityHandler.html new file mode 100644 index 0000000..5210cbf --- /dev/null +++ b/lib/docs/functions/decorators_class.EntityHandler.html @@ -0,0 +1,15 @@ +EntityHandler | @dxfrontier/cds-ts-dispatcher
  • This decorator is used to associate a handler class with a specific entity. +It ensures that all handlers within the class operate with the specified entity context.

    +

    Type Parameters

    • T

    Parameters

    • entity: CDSTyperEntity<T>

      The entity to associate with the handler class. Must be a CDS-Typer class.

      +

    Returns ((target: (new (...args: never) => unknown)) => void)

      • (target): void
      • Parameters

        • target: (new (...args: never) => unknown)
            • new (...args): unknown
            • Parameters

              • Rest...args: never

              Returns unknown

        Returns void

    "@EntityHandler(Customer)"
    +
    + +

    CDS-TS-Dispatcher - @EntityHandler

    +
  • This decorator is used to associate a handler class with all entities. +It ensures that all handlers within the class operate with a generic context applicable to all entities.

    +

    Parameters

    • entity: "*"

      A wildcard '*' indicating all entities.

      +

    Returns ((target: (new (...args: never) => unknown)) => void)

      • (target): void
      • Parameters

        • target: (new (...args: never) => unknown)
            • new (...args): unknown
            • Parameters

              • Rest...args: never

              Returns unknown

        Returns void

    "@EntityHandler(CDS_DISPATCHER.ALL_ENTITIES)"
    or
    "@EntityHandler('*')" +
    + +

    CDS-TS-Dispatcher - @EntityHandler

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_class.Repository.html b/lib/docs/functions/decorators_class.Repository.html new file mode 100644 index 0000000..1c54518 --- /dev/null +++ b/lib/docs/functions/decorators_class.Repository.html @@ -0,0 +1,3 @@ +Repository | @dxfrontier/cds-ts-dispatcher
  • This decorator is used to mark a class as a repository, containing repository logic.

    +

    It makes the class injectable and allows dependency injection to be used within the class.

    +

    Type Parameters

    • Target extends (new (...args: never) => unknown)

    Returns ((target: Target) => void)

      • (target): void
      • Parameters

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_class.ServiceLogic.html b/lib/docs/functions/decorators_class.ServiceLogic.html new file mode 100644 index 0000000..47e34d8 --- /dev/null +++ b/lib/docs/functions/decorators_class.ServiceLogic.html @@ -0,0 +1,3 @@ +ServiceLogic | @dxfrontier/cds-ts-dispatcher
  • This decorator is used to mark a class as containing business logic.

    +

    It makes the class injectable and allows dependency injection to be used within the class.

    +

    Type Parameters

    • Target extends (new (...args: never) => unknown)

    Returns ((target: Target) => void)

      • (target): void
      • Parameters

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_class.UnboundActions.html b/lib/docs/functions/decorators_class.UnboundActions.html new file mode 100644 index 0000000..9bacbb7 --- /dev/null +++ b/lib/docs/functions/decorators_class.UnboundActions.html @@ -0,0 +1,4 @@ +UnboundActions | @dxfrontier/cds-ts-dispatcher
  • This decorator is used to mark a class as containing unbound actions.

    +

    Unbound actions are operations that are not tied to a specific entity. +It makes the class injectable and allows dependency injection to be used within the class.

    +

    Type Parameters

    • Target extends (new (...args: never) => unknown)

    Returns ((target: Target) => void)

      • (target): void
      • Parameters

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterAll.html b/lib/docs/functions/decorators_method.AfterAll.html new file mode 100644 index 0000000..2cf47ea --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterAll.html @@ -0,0 +1,3 @@ +AfterAll | @dxfrontier/cds-ts-dispatcher

Use @AfterAll decorator to execute custom logic after creating a new resource for all events ('CREATE', 'READ', 'UPDATE', 'DELETE', 'BOUND ACTION', 'BOUND FUNCTION')

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterAllDraft.html b/lib/docs/functions/decorators_method.AfterAllDraft.html new file mode 100644 index 0000000..b69e7c0 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterAllDraft.html @@ -0,0 +1,3 @@ +AfterAllDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterCreateAll decorator to execute custom logic after creating a new draft resource for all events ('CREATE', 'READ', 'UPDATE', 'DELETE', 'BOUND ACTION', 'BOUND FUNCTION')

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterCancelDraft.html b/lib/docs/functions/decorators_method.AfterCancelDraft.html new file mode 100644 index 0000000..0eb1d50 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterCancelDraft.html @@ -0,0 +1,3 @@ +AfterCancelDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterCancelDraft decorator to execute custom logic after a 'draft' is cancelled.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterCreate.html b/lib/docs/functions/decorators_method.AfterCreate.html new file mode 100644 index 0000000..7183230 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterCreate.html @@ -0,0 +1,3 @@ +AfterCreate | @dxfrontier/cds-ts-dispatcher

Use @AfterCreate decorator to execute custom logic after creating a new resource.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterCreateDraft.html b/lib/docs/functions/decorators_method.AfterCreateDraft.html new file mode 100644 index 0000000..d29d799 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterCreateDraft.html @@ -0,0 +1,3 @@ +AfterCreateDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterCreateDraft decorator to execute custom logic after creating a new DRAFT resource.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterDelete.html b/lib/docs/functions/decorators_method.AfterDelete.html new file mode 100644 index 0000000..5c235b0 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterDelete.html @@ -0,0 +1,3 @@ +AfterDelete | @dxfrontier/cds-ts-dispatcher

Use @AfterDelete decorator to execute custom logic after performing a delete operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterDeleteDraft.html b/lib/docs/functions/decorators_method.AfterDeleteDraft.html new file mode 100644 index 0000000..50a819e --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterDeleteDraft.html @@ -0,0 +1,3 @@ +AfterDeleteDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterDeleteDraft decorator to execute custom logic after performing a delete operation on a draft.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterEditDraft.html b/lib/docs/functions/decorators_method.AfterEditDraft.html new file mode 100644 index 0000000..d628f46 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterEditDraft.html @@ -0,0 +1,3 @@ +AfterEditDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterEditDraft decorator to execute custom logic after a 'draft' is edited.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterNewDraft.html b/lib/docs/functions/decorators_method.AfterNewDraft.html new file mode 100644 index 0000000..4d92f66 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterNewDraft.html @@ -0,0 +1,3 @@ +AfterNewDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterNewDraft decorator to execute custom logic after a new 'draft' is created.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterRead.html b/lib/docs/functions/decorators_method.AfterRead.html new file mode 100644 index 0000000..60671be --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterRead.html @@ -0,0 +1,3 @@ +AfterRead | @dxfrontier/cds-ts-dispatcher

Use @AfterRead decorator to execute custom logic after performing a read operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterReadDraft.html b/lib/docs/functions/decorators_method.AfterReadDraft.html new file mode 100644 index 0000000..bf28cb0 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterReadDraft.html @@ -0,0 +1,3 @@ +AfterReadDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterReadDraft decorator to execute custom logic after performing a draft read operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterReadDraftEachInstance.html b/lib/docs/functions/decorators_method.AfterReadDraftEachInstance.html new file mode 100644 index 0000000..20e1fd1 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterReadDraftEachInstance.html @@ -0,0 +1,3 @@ +AfterReadDraftEachInstance | @dxfrontier/cds-ts-dispatcher

The @AfterReadDraftEachInstance decorator is used to execute custom logic after performing a read operation on each individual draft instance. This behavior is analogous to the JavaScript Array.prototype.forEach method.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterReadDraftSingleInstance.html b/lib/docs/functions/decorators_method.AfterReadDraftSingleInstance.html new file mode 100644 index 0000000..82632bb --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterReadDraftSingleInstance.html @@ -0,0 +1,3 @@ +AfterReadDraftSingleInstance | @dxfrontier/cds-ts-dispatcher

Use @AfterReadDraftSingleInstance decorator to execute custom logic after creating a new DRAFT single instance resource.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterReadEachInstance.html b/lib/docs/functions/decorators_method.AfterReadEachInstance.html new file mode 100644 index 0000000..97b9e64 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterReadEachInstance.html @@ -0,0 +1,3 @@ +AfterReadEachInstance | @dxfrontier/cds-ts-dispatcher

The @AfterReadEachInstance decorator is used to execute custom logic after performing a read operation on each individual instance. This behavior is analogous to the JavaScript Array.prototype.forEach method.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterReadSingleInstance.html b/lib/docs/functions/decorators_method.AfterReadSingleInstance.html new file mode 100644 index 0000000..2e4a37c --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterReadSingleInstance.html @@ -0,0 +1,3 @@ +AfterReadSingleInstance | @dxfrontier/cds-ts-dispatcher

Use @AfterReadSingleInstance decorator to execute custom logic after creating a new single instance resource.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterSaveDraft.html b/lib/docs/functions/decorators_method.AfterSaveDraft.html new file mode 100644 index 0000000..fdf2c66 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterSaveDraft.html @@ -0,0 +1,3 @@ +AfterSaveDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterSaveDraft decorator to execute custom logic after a 'draft' is saved.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterUpdate.html b/lib/docs/functions/decorators_method.AfterUpdate.html new file mode 100644 index 0000000..6992322 --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterUpdate.html @@ -0,0 +1,3 @@ +AfterUpdate | @dxfrontier/cds-ts-dispatcher

Use @AfterUpdate decorator to execute custom logic after performing an update operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.AfterUpdateDraft.html b/lib/docs/functions/decorators_method.AfterUpdateDraft.html new file mode 100644 index 0000000..cf8a13f --- /dev/null +++ b/lib/docs/functions/decorators_method.AfterUpdateDraft.html @@ -0,0 +1,3 @@ +AfterUpdateDraft | @dxfrontier/cds-ts-dispatcher

Use @AfterUpdateDraft decorator to execute custom logic after performing a DRAFT update operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeAll.html b/lib/docs/functions/decorators_method.BeforeAll.html new file mode 100644 index 0000000..4388367 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeAll.html @@ -0,0 +1,3 @@ +BeforeAll | @dxfrontier/cds-ts-dispatcher

Use @BeforeAll decorator to execute custom logic before creating a new resource for all events ('CREATE', 'READ', 'UPDATE', 'DELETE', 'BOUND ACTION', 'BOUND FUNCTION')

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeAllDraft.html b/lib/docs/functions/decorators_method.BeforeAllDraft.html new file mode 100644 index 0000000..cb629d9 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeAllDraft.html @@ -0,0 +1,3 @@ +BeforeAllDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeAllDraft decorator to execute custom logic before creating a new draft resource for all events ('CREATE', 'READ', 'UPDATE', 'DELETE', 'BOUND ACTION', 'BOUND FUNCTION')

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeCancelDraft.html b/lib/docs/functions/decorators_method.BeforeCancelDraft.html new file mode 100644 index 0000000..54cc8ba --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeCancelDraft.html @@ -0,0 +1,3 @@ +BeforeCancelDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeCancelDraft decorator to execute custom logic before a 'draft' is cancelled.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeCreate.html b/lib/docs/functions/decorators_method.BeforeCreate.html new file mode 100644 index 0000000..e0bd47c --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeCreate.html @@ -0,0 +1,3 @@ +BeforeCreate | @dxfrontier/cds-ts-dispatcher

Use @BeforeCreate decorator to execute custom logic before creating a new resource.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeCreateDraft.html b/lib/docs/functions/decorators_method.BeforeCreateDraft.html new file mode 100644 index 0000000..2e8e6e4 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeCreateDraft.html @@ -0,0 +1,3 @@ +BeforeCreateDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeCreateDraft decorator to execute custom logic before creating a new DRAFT resource.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeDelete.html b/lib/docs/functions/decorators_method.BeforeDelete.html new file mode 100644 index 0000000..a374e37 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeDelete.html @@ -0,0 +1,3 @@ +BeforeDelete | @dxfrontier/cds-ts-dispatcher

Use @BeforeDelete decorator to execute custom logic before performing a delete operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeDeleteDraft.html b/lib/docs/functions/decorators_method.BeforeDeleteDraft.html new file mode 100644 index 0000000..c79b468 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeDeleteDraft.html @@ -0,0 +1,3 @@ +BeforeDeleteDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeDeleteDraft decorator to execute custom logic before performing a delete operation on a draft.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeEditDraft.html b/lib/docs/functions/decorators_method.BeforeEditDraft.html new file mode 100644 index 0000000..faf9925 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeEditDraft.html @@ -0,0 +1,3 @@ +BeforeEditDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeEditDraft decorator to execute custom logic before a 'draft' is edited.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeNewDraft.html b/lib/docs/functions/decorators_method.BeforeNewDraft.html new file mode 100644 index 0000000..cbe6276 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeNewDraft.html @@ -0,0 +1,3 @@ +BeforeNewDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeNewDraft decorator to execute custom logic before a 'draft' is created.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeRead.html b/lib/docs/functions/decorators_method.BeforeRead.html new file mode 100644 index 0000000..95c4366 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeRead.html @@ -0,0 +1,3 @@ +BeforeRead | @dxfrontier/cds-ts-dispatcher

Use @BeforeRead decorator to execute custom logic before performing a read operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeReadDraft.html b/lib/docs/functions/decorators_method.BeforeReadDraft.html new file mode 100644 index 0000000..85b9639 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeReadDraft.html @@ -0,0 +1,3 @@ +BeforeReadDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeReadDraft decorator to execute custom logic before performing a DRAFT read operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeSaveDraft.html b/lib/docs/functions/decorators_method.BeforeSaveDraft.html new file mode 100644 index 0000000..84aba85 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeSaveDraft.html @@ -0,0 +1,3 @@ +BeforeSaveDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeSaveDraft decorator to execute custom logic before a 'draft' is saved.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeUpdate.html b/lib/docs/functions/decorators_method.BeforeUpdate.html new file mode 100644 index 0000000..374e139 --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeUpdate.html @@ -0,0 +1,3 @@ +BeforeUpdate | @dxfrontier/cds-ts-dispatcher

Use @BeforeUpdate decorator to execute custom logic before performing an update operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.BeforeUpdateDraft.html b/lib/docs/functions/decorators_method.BeforeUpdateDraft.html new file mode 100644 index 0000000..be3f19d --- /dev/null +++ b/lib/docs/functions/decorators_method.BeforeUpdateDraft.html @@ -0,0 +1,3 @@ +BeforeUpdateDraft | @dxfrontier/cds-ts-dispatcher

Use @BeforeUpdateDraft decorator to execute custom logic before performing a DRAFT update operation.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.ExecutionAllowedForRole.html b/lib/docs/functions/decorators_method.ExecutionAllowedForRole.html new file mode 100644 index 0000000..21fad7b --- /dev/null +++ b/lib/docs/functions/decorators_method.ExecutionAllowedForRole.html @@ -0,0 +1,6 @@ +ExecutionAllowedForRole | @dxfrontier/cds-ts-dispatcher
  • Use @ExecutionAllowedForRole decorator to enforce role-based access control ensuring that only Users with specific role are authorized to execute the event (AfterRead, AfterCreate, ...) and the custom logic inside of the event.

    +

    Parameters

    • Rest...roles: string[]

    Returns (<Target>(_: Target, __: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • <Target>(_, __, descriptor): void
      • Type Parameters

        • Target

        Parameters

        Returns void

    "@ExecutionAllowedForRole('Manager', 'CEO')"
    +
    + +

    CDS-TS-Dispatcher - @ExecutionAllowedForRole

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.FieldsFormatter.html b/lib/docs/functions/decorators_method.FieldsFormatter.html new file mode 100644 index 0000000..09847ee --- /dev/null +++ b/lib/docs/functions/decorators_method.FieldsFormatter.html @@ -0,0 +1,8 @@ +FieldsFormatter | @dxfrontier/cds-ts-dispatcher
  • Use @FieldsFormatter decorator to enhance / format the fields.

    +

    Type Parameters

    • T

    Parameters

    • formatter: Formatters<T>

      The formatter method to apply.

      +
    • Rest...fields: (keyof T)[]

      An array of fields to apply the formatter method on.

      +

    Returns (<Target>(_: Target, __: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • <Target>(_, __, descriptor): void
      • Type Parameters

        • Target

        Parameters

        Returns void

    // Enhance the 'title' field of Book entity by removing the letter 'W' using the 'blacklist' action.
    "@FieldsFormatter<Book>({ action: 'blacklist', charsToRemove: 'W' }, 'title')" +
    + +

    CDS-TS-Dispatcher - @FieldsFormatter

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnAction.html b/lib/docs/functions/decorators_method.OnAction.html new file mode 100644 index 0000000..657d86e --- /dev/null +++ b/lib/docs/functions/decorators_method.OnAction.html @@ -0,0 +1,3 @@ +OnAction | @dxfrontier/cds-ts-dispatcher

Use @OnAction decorator to execute custom logic when a custom action event is triggered.

+
  • Type Parameters

    • Target extends Object

    Parameters

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnAll.html b/lib/docs/functions/decorators_method.OnAll.html new file mode 100644 index 0000000..fd55be0 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnAll.html @@ -0,0 +1,3 @@ +OnAll | @dxfrontier/cds-ts-dispatcher

Use @OnAll decorator to execute custom logic when a new resource is (READ, CREATED, UPDATED, DELETED)

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnAllDraft.html b/lib/docs/functions/decorators_method.OnAllDraft.html new file mode 100644 index 0000000..3ceed23 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnAllDraft.html @@ -0,0 +1,3 @@ +OnAllDraft | @dxfrontier/cds-ts-dispatcher

Use @OnAllDraft decorator to execute custom logic.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnBoundAction.html b/lib/docs/functions/decorators_method.OnBoundAction.html new file mode 100644 index 0000000..6766ca2 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnBoundAction.html @@ -0,0 +1,3 @@ +OnBoundAction | @dxfrontier/cds-ts-dispatcher

Use @OnBoundAction decorator to execute custom logic when a custom bound action event is triggered.

+
  • Type Parameters

    • Target extends Object

    Parameters

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnBoundActionDraft.html b/lib/docs/functions/decorators_method.OnBoundActionDraft.html new file mode 100644 index 0000000..14dd67c --- /dev/null +++ b/lib/docs/functions/decorators_method.OnBoundActionDraft.html @@ -0,0 +1,3 @@ +OnBoundActionDraft | @dxfrontier/cds-ts-dispatcher

Use @OnBoundActionDraft decorator to execute custom logic when a custom bound action event is triggered on a DRAFT resource.

+
  • Type Parameters

    • Target extends Object

    Parameters

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnBoundFunction.html b/lib/docs/functions/decorators_method.OnBoundFunction.html new file mode 100644 index 0000000..b0690ac --- /dev/null +++ b/lib/docs/functions/decorators_method.OnBoundFunction.html @@ -0,0 +1,3 @@ +OnBoundFunction | @dxfrontier/cds-ts-dispatcher

Use @OnBoundFunction decorator to execute custom logic when a custom bound function event is triggered.

+
  • Type Parameters

    • Target extends Object

    Parameters

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnBoundFunctionDraft.html b/lib/docs/functions/decorators_method.OnBoundFunctionDraft.html new file mode 100644 index 0000000..f23ce01 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnBoundFunctionDraft.html @@ -0,0 +1,3 @@ +OnBoundFunctionDraft | @dxfrontier/cds-ts-dispatcher

Use @OnBoundFunctionDraft decorator to execute custom logic when a custom bound function event is triggered on a DRAFT resource.

+
  • Type Parameters

    • Target extends Object

    Parameters

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnCancelDraft.html b/lib/docs/functions/decorators_method.OnCancelDraft.html new file mode 100644 index 0000000..833f584 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnCancelDraft.html @@ -0,0 +1,3 @@ +OnCancelDraft | @dxfrontier/cds-ts-dispatcher

Use @OnCancelDraft decorator to execute custom logic when a 'draft' is cancelled.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnCreate.html b/lib/docs/functions/decorators_method.OnCreate.html new file mode 100644 index 0000000..d846338 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnCreate.html @@ -0,0 +1,3 @@ +OnCreate | @dxfrontier/cds-ts-dispatcher

Use @OnCreate decorator to execute custom logic when a new resource is created.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnCreateDraft.html b/lib/docs/functions/decorators_method.OnCreateDraft.html new file mode 100644 index 0000000..ef385dc --- /dev/null +++ b/lib/docs/functions/decorators_method.OnCreateDraft.html @@ -0,0 +1,3 @@ +OnCreateDraft | @dxfrontier/cds-ts-dispatcher

Use @OnCreateDraft decorator to execute custom logic when a new DRAFT resource is created.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnDelete.html b/lib/docs/functions/decorators_method.OnDelete.html new file mode 100644 index 0000000..87c88c7 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnDelete.html @@ -0,0 +1,3 @@ +OnDelete | @dxfrontier/cds-ts-dispatcher

Use @OnDelete decorator to execute custom logic when a delete operation is performed.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnDeleteDraft.html b/lib/docs/functions/decorators_method.OnDeleteDraft.html new file mode 100644 index 0000000..e7a8bc3 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnDeleteDraft.html @@ -0,0 +1,3 @@ +OnDeleteDraft | @dxfrontier/cds-ts-dispatcher

Use @OnDeleteDraft decorator to execute custom logic when a delete operation is performed on a DRAFT resource.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnEditDraft.html b/lib/docs/functions/decorators_method.OnEditDraft.html new file mode 100644 index 0000000..c9b61fd --- /dev/null +++ b/lib/docs/functions/decorators_method.OnEditDraft.html @@ -0,0 +1,3 @@ +OnEditDraft | @dxfrontier/cds-ts-dispatcher

Use @OnEditDraft decorator to execute custom logic when a new draft is created from an active instance.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnError.html b/lib/docs/functions/decorators_method.OnError.html new file mode 100644 index 0000000..8481aa3 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnError.html @@ -0,0 +1,3 @@ +OnError | @dxfrontier/cds-ts-dispatcher

Use @OnError decorator to execute custom logic when an error occurs.

+
  • Type Parameters

    • Target extends Object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<any>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<any>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnEvent.html b/lib/docs/functions/decorators_method.OnEvent.html new file mode 100644 index 0000000..d1a1868 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnEvent.html @@ -0,0 +1,3 @@ +OnEvent | @dxfrontier/cds-ts-dispatcher

Use @OnEvent decorator to execute custom logic when a custom event is triggered.

+
  • Type Parameters

    • Target extends Object

    Parameters

    • name: object

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnFunction.html b/lib/docs/functions/decorators_method.OnFunction.html new file mode 100644 index 0000000..f3ef215 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnFunction.html @@ -0,0 +1,3 @@ +OnFunction | @dxfrontier/cds-ts-dispatcher

Use @OnFunction decorator to execute custom logic when a custom function event is triggered.

+
  • Type Parameters

    • Target extends Object

    Parameters

    Returns ((target: Target, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Target
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnNewDraft.html b/lib/docs/functions/decorators_method.OnNewDraft.html new file mode 100644 index 0000000..ccbb195 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnNewDraft.html @@ -0,0 +1,3 @@ +OnNewDraft | @dxfrontier/cds-ts-dispatcher

Use @OnNewDraft decorator to execute custom logic when a 'draft' is created.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnRead.html b/lib/docs/functions/decorators_method.OnRead.html new file mode 100644 index 0000000..083a6bb --- /dev/null +++ b/lib/docs/functions/decorators_method.OnRead.html @@ -0,0 +1,3 @@ +OnRead | @dxfrontier/cds-ts-dispatcher

Use @OnRead decorator to execute custom logic when a read operation is performed.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnReadDraft.html b/lib/docs/functions/decorators_method.OnReadDraft.html new file mode 100644 index 0000000..bfb4a65 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnReadDraft.html @@ -0,0 +1,3 @@ +OnReadDraft | @dxfrontier/cds-ts-dispatcher

Use @OnReadDraft decorator to execute custom logic when a read operation is performed on a DRAFT resource.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnSaveDraft.html b/lib/docs/functions/decorators_method.OnSaveDraft.html new file mode 100644 index 0000000..7090615 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnSaveDraft.html @@ -0,0 +1,3 @@ +OnSaveDraft | @dxfrontier/cds-ts-dispatcher

Use @OnSaveDraft decorator to execute custom logic when the 'active entity' is changed.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnUpdate.html b/lib/docs/functions/decorators_method.OnUpdate.html new file mode 100644 index 0000000..7a09fd3 --- /dev/null +++ b/lib/docs/functions/decorators_method.OnUpdate.html @@ -0,0 +1,3 @@ +OnUpdate | @dxfrontier/cds-ts-dispatcher

Use @OnUpdate decorator to execute custom logic when an update operation is performed.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.OnUpdateDraft.html b/lib/docs/functions/decorators_method.OnUpdateDraft.html new file mode 100644 index 0000000..de1b0cc --- /dev/null +++ b/lib/docs/functions/decorators_method.OnUpdateDraft.html @@ -0,0 +1,3 @@ +OnUpdateDraft | @dxfrontier/cds-ts-dispatcher

Use @OnUpdateDraft decorator to execute custom logic when an update operation is performed on a DRAFT resource.

+
  • Returns ((target: Object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: Object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.Prepend.html b/lib/docs/functions/decorators_method.Prepend.html new file mode 100644 index 0000000..9f1727f --- /dev/null +++ b/lib/docs/functions/decorators_method.Prepend.html @@ -0,0 +1,7 @@ +Prepend | @dxfrontier/cds-ts-dispatcher
  • Use @Prepend decorator to register an event handler to run before existing ones.

    +

    Parameters

    Returns ((target: object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

    "@Prepend({ eventDecoratorName: 'BeforeRead' })"
    +
    + +

    CDS-TS-Dispatcher - @Prepend

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.PrependDraft.html b/lib/docs/functions/decorators_method.PrependDraft.html new file mode 100644 index 0000000..91bf865 --- /dev/null +++ b/lib/docs/functions/decorators_method.PrependDraft.html @@ -0,0 +1,7 @@ +PrependDraft | @dxfrontier/cds-ts-dispatcher
  • Use @PrependDraft decorator to register an event handler to run before existing ones.

    +

    Parameters

    Returns ((target: object, propertyName: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • (target, propertyName, descriptor): void
      • Parameters

        • target: object
        • propertyName: string | symbol
        • descriptor: TypedPropertyDescriptor<RequestType>

        Returns void

    "@PrependDraft({ eventDecoratorName: 'BeforeReadDraft' })"
    +
    + +

    CDS-TS-Dispatcher - @Prepend

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.SingleInstanceCapable.html b/lib/docs/functions/decorators_method.SingleInstanceCapable.html new file mode 100644 index 0000000..1b9bc5b --- /dev/null +++ b/lib/docs/functions/decorators_method.SingleInstanceCapable.html @@ -0,0 +1,2 @@ +SingleInstanceCapable | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.Use.html b/lib/docs/functions/decorators_method.Use.html new file mode 100644 index 0000000..26f2411 --- /dev/null +++ b/lib/docs/functions/decorators_method.Use.html @@ -0,0 +1,4 @@ +Use | @dxfrontier/cds-ts-dispatcher
  • Use the @Use decorator to associate a method or a class with a specified middleware classes, mainly used to verify, enhance, validate various request related-information.

    +

    Type Parameters

    Parameters

    • Rest...MiddlewareClasses: Middleware[]

      The middleware classes to be applied.

      +

    Returns (<Target>(target: Target, propertyKey?: string, descriptor?: TypedPropertyDescriptor<RequestType>) => void)

      • <Target>(target, propertyKey?, descriptor?): void
      • Type Parameters

        • Target extends object

        Parameters

        • target: Target
        • OptionalpropertyKey: string
        • Optionaldescriptor: TypedPropertyDescriptor<RequestType>

        Returns void

\ No newline at end of file diff --git a/lib/docs/functions/decorators_method.Validate.html b/lib/docs/functions/decorators_method.Validate.html new file mode 100644 index 0000000..2a1443d --- /dev/null +++ b/lib/docs/functions/decorators_method.Validate.html @@ -0,0 +1,8 @@ +Validate | @dxfrontier/cds-ts-dispatcher
  • Use @Validate decorator to validate fields.

    +

    Type Parameters

    • T

    Parameters

    • validator: Validators

      The validation method to apply.

      +
    • Rest...fields: (keyof T)[]

      An array of fields to validate.

      +

    Returns (<Target>(_: Target, __: string | symbol, descriptor: TypedPropertyDescriptor<RequestType>) => void)

      • <Target>(_, __, descriptor): void
      • Type Parameters

        • Target

        Parameters

        Returns void

    // Validates the 'comment' field of 'MyEntity' entity using the 'contains' validator with the seed 'text'.
    "@Validate<MyEntity>({ validator: 'contains', seed: 'text' }, 'comment')"
    // If 'comment' contains 'text', the validation will not raise an error message. +
    + +

    CDS-TS-Dispatcher - @Validate

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Error.html b/lib/docs/functions/decorators_parameter.Error.html new file mode 100644 index 0000000..6b8795f --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Error.html @@ -0,0 +1,6 @@ +Error | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.GetQuery.html b/lib/docs/functions/decorators_parameter.GetQuery.html new file mode 100644 index 0000000..e11ea22 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.GetQuery.html @@ -0,0 +1,8 @@ +GetQuery | @dxfrontier/cds-ts-dispatcher
  • Annotates a parameter of a method to get the request.query[INSERT, SELECT, UPDATE, UPSERT, DELETE][property] properties.

    +

    Type Parameters

    Parameters

    • key: Key

      The key indicating the type of query operation (INSERT, SELECT, UPDATE, UPSERT, DELETE).

      +
    • property: PickQueryPropsByKey<Key>

      The specific property to get within the request.query[key][property].

      +

    Returns ParameterDecorator

    "GetQuery('SELECT', 'columns') columns: GetColumns"
    +
    + +

    CDS-TS-Dispatcher - @GetQuery

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.GetRequest.html b/lib/docs/functions/decorators_parameter.GetRequest.html new file mode 100644 index 0000000..8dd374c --- /dev/null +++ b/lib/docs/functions/decorators_parameter.GetRequest.html @@ -0,0 +1,8 @@ +GetRequest | @dxfrontier/cds-ts-dispatcher
  • Annotates a parameter of a method to get the Request properties.

    +

    NOTE: This is a convenient decorator to get only some properties of the Request object, to get all properties use @Req() decorator.

    +

    Parameters

    Returns ParameterDecorator

    "@GetRequest('locale') locale: string"
    +
    + +

    CDS-TS-Dispatcher - @GetRequest

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.IsColumnSupplied.html b/lib/docs/functions/decorators_parameter.IsColumnSupplied.html new file mode 100644 index 0000000..734841b --- /dev/null +++ b/lib/docs/functions/decorators_parameter.IsColumnSupplied.html @@ -0,0 +1,8 @@ +IsColumnSupplied | @dxfrontier/cds-ts-dispatcher
  • Annotates a parameter of a method to check existence of request.query[INSERT, SELECT, UPSERT].columns - item with the value from field parameter.

    +

    Type Parameters

    • Key

    Parameters

    • field: keyof Key

      The name of the column to verify in the request.query[INSERT, SELECT, UPSERT].columns.

      +

    Returns ParameterDecorator

    boolean

    +
    "@IsColumnSupplied('name') isPresent: boolean"
    +
    + +

    CDS-TS-Dispatcher - @IsColumnSupplied

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.IsPresent.html b/lib/docs/functions/decorators_parameter.IsPresent.html new file mode 100644 index 0000000..d465204 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.IsPresent.html @@ -0,0 +1,9 @@ +IsPresent | @dxfrontier/cds-ts-dispatcher
  • Annotates a parameter of a method to check existence of request.query[INSERT, SELECT, UPDATE, UPSERT, DELETE][property] various properties.

    +

    Type Parameters

    Parameters

    • key: Key

      The key indicating the type of query operation (INSERT, SELECT, UPDATE, UPSERT, DELETE).

      +
    • property: PickQueryPropsByKey<Key>

      The specific property to check within the request.query[key][property].

      +

    Returns ParameterDecorator

    boolean

    +
    "@IsPresent('SELECT', 'columns') hasColumns: boolean"
    +
    + +

    CDS-TS-Dispatcher - @IsPresent

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.IsRole.html b/lib/docs/functions/decorators_parameter.IsRole.html new file mode 100644 index 0000000..8205f86 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.IsRole.html @@ -0,0 +1,9 @@ +IsRole | @dxfrontier/cds-ts-dispatcher
  • Annotates a parameter of a method to check the existence of specific role values in the request.

    +

    NOTE: IsRole applies a logical OR between the roles, meaning it checks if at least one of the specified roles exists.

    +

    Parameters

    • Rest...roles: string[]

      An array of role names to verify in req.user.is(role).

      +

    Returns ParameterDecorator

    boolean

    +
    "@IsRole('name', 'anotherRole') roles: boolean"
    +
    + +

    CDS-TS-Dispatcher - @IsRole

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Jwt.html b/lib/docs/functions/decorators_parameter.Jwt.html new file mode 100644 index 0000000..3fe7e75 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Jwt.html @@ -0,0 +1,6 @@ +Jwt | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Next.html b/lib/docs/functions/decorators_parameter.Next.html new file mode 100644 index 0000000..406753f --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Next.html @@ -0,0 +1,6 @@ +Next | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Req.html b/lib/docs/functions/decorators_parameter.Req.html new file mode 100644 index 0000000..65c0db6 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Req.html @@ -0,0 +1,6 @@ +Req | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Res.html b/lib/docs/functions/decorators_parameter.Res.html new file mode 100644 index 0000000..2942002 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Res.html @@ -0,0 +1,6 @@ +Res | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Result.html b/lib/docs/functions/decorators_parameter.Result.html new file mode 100644 index 0000000..053da52 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Result.html @@ -0,0 +1,8 @@ +Result | @dxfrontier/cds-ts-dispatcher
  • Annotates a parameter of a method with the result. +NOTE: This can be used on the create, update, delete when the result contains only an object (create, update) or boolean (delete)

    +

    NOTE If the results is an array use @Results decorator.

    +

    Returns ParameterDecorator

    "@Result() result: MyEntity"
    "@Result() deleted: boolean" +
    + +

    CDS-TS-Dispatcher - @Results

    +
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.Results.html b/lib/docs/functions/decorators_parameter.Results.html new file mode 100644 index 0000000..5578625 --- /dev/null +++ b/lib/docs/functions/decorators_parameter.Results.html @@ -0,0 +1,6 @@ +Results | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/decorators_parameter.SingleInstanceSwitch.html b/lib/docs/functions/decorators_parameter.SingleInstanceSwitch.html new file mode 100644 index 0000000..12f5a6f --- /dev/null +++ b/lib/docs/functions/decorators_parameter.SingleInstanceSwitch.html @@ -0,0 +1,6 @@ +SingleInstanceSwitch | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/functions/index.Inject.html b/lib/docs/functions/index.Inject.html new file mode 100644 index 0000000..8616b7c --- /dev/null +++ b/lib/docs/functions/index.Inject.html @@ -0,0 +1 @@ +Inject | @dxfrontier/cds-ts-dispatcher
  • Type Parameters

    • T = unknown

    Parameters

    • serviceIdentifier: ServiceIdentifierOrFunc<T>

    Returns ((target: DecoratorTarget<unknown>, targetKey?: string | symbol, indexOrPropertyDescriptor?: number | TypedPropertyDescriptor<T>) => void)

      • (target, targetKey?, indexOrPropertyDescriptor?): void
      • Parameters

        • target: DecoratorTarget<unknown>
        • OptionaltargetKey: string | symbol
        • OptionalindexOrPropertyDescriptor: number | TypedPropertyDescriptor<T>

        Returns void

\ No newline at end of file diff --git a/lib/docs/index.html b/lib/docs/index.html new file mode 100644 index 0000000..115fed7 --- /dev/null +++ b/lib/docs/index.html @@ -0,0 +1,2402 @@ +@dxfrontier/cds-ts-dispatcher

@dxfrontier/cds-ts-dispatcher

CDS-TS-Dispatcher

+

SAP +ts-node +Node.js +Express.js +json +npm

+

NPM Downloads +NPM Downloads +NPM Version

+

GitHub Actions Workflow Status +GitHub last commit (branch) +GitHub issues +GitHub contributors +GitHub top language +GitHub Repo stars

+

The goal of CDS-TS-Dispatcher is to significantly reduce the boilerplate code required to implement Typescript handlers provided by the SAP CAP framework.

+ +

Install @sap/cds-dk, typescript, ts-node globally:

+
npm install -g @sap/cds-dk typescript ts-node
+
+ +

Use the following steps if you want to create a new SAP CAP project.

+
    +
  1. Create new folder :
  2. +
+
mkdir new-sap-cap-project
cd new-sap-cap-project +
+ +
    +
  1. Initialize the CDS folder structure :
  2. +
+
cds init
+
+ +
    +
  1. Add CDS-Typer to your npm package.json:
  2. +
+
cds add typer
npm install +
+ +
    +
  1. Add the the following NPM packages :
  2. +
+
npm install @dxfrontier/cds-ts-dispatcher
npm install --save-dev @types/node +
+ +
    +
  1. Add a tsconfig.json :
  2. +
+
tsc --init
+
+ +
    +
  1. It is recommended to use the following tsconfig.json properties:
  2. +
+
{
"compilerOptions": {
/* Base Options: */
"esModuleInterop": true,
"skipLibCheck": true,
"allowJs": true,
"strictPropertyInitialization": false,
"forceConsistentCasingInFileNames": true,
"allowSyntheticDefaultImports": true,
"strictNullChecks": true,
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",

/* Allow decorators */
"experimentalDecorators": true,
"emitDecoratorMetadata": true,

/* Strictness */
"strict": true,

"lib": ["es2022"],

"outDir": "./gen/srv"
},
"include": ["./srv"]
} +
+ +
    +
  1. Run the CDS-TS server
  2. +
+
cds-ts watch
+
+ +

(back to top)

+

Use the following steps if you want to add only the @dxfrontier/cds-ts-dispatcher to an existing project :

+
npm install @dxfrontier/cds-ts-dispatcher
+
+ +

It is recommended to use the following tsconfig.json properties:

+
{
"compilerOptions": {
/* Base Options: */
"esModuleInterop": true,
"skipLibCheck": true,
"allowJs": true,
"strictPropertyInitialization": false,
"forceConsistentCasingInFileNames": true,
"allowSyntheticDefaultImports": true,
"strictNullChecks": true,
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",

/* Allow decorators */
"experimentalDecorators": true,
"emitDecoratorMetadata": true,

/* Strictness */
"strict": true,

"lib": ["es2022"],

"outDir": "./gen/srv"
},
"include": ["./srv"]
} +
+ +
+

[!WARNING] +If below message appears

+
-----------------------------------------------------------------------
WARNING: Package '@sap/cds' was loaded from different installations: [
'***/node_modules/@sap/cds/lib/index.js',
'***/node_modules/@dxfrontier/cds-ts-dispatcher/node_modules/@sap/cds/lib/index.js'
] Rather ensure a single install only to avoid hard-to-resolve errors.
----------------------------------------------------------------------- +
+ +

Run the following command :

+
npm install @sap/cds@latest
+
+ +
+

(back to top)

+

The CDS-TS-Dispatcher dev container repository contains the CDS-TS-Dispatcher & CDS-TS-Repository and all dependencies needed to boot a new project :

+

Tools installed inside of the container :

+
    +
  • Controller - Service - Repository project structure folders : +
      +
    • controller
    • +
    • service
    • +
    • repository
    • +
    • middleware
    • +
    • util
    • +
    • test
    • +
    +
  • +
  • ESLint, Prettier
  • +
  • VSCode Extensions best extensions for SAP CAP TypeScript development
  • +
  • Cloud MTA Build tool for building MTA file
  • +
  • Cloud Foundry CLI (CF)
  • +
  • Git, Cds, Npm, Node
  • +
  • CDS-Typer for building typescript entities out of CDS files
  • +
  • tsconfig.json, .eslintrc, .prettierrc - predefined properties
  • +
  • package.json - predefined scripts
  • +
+

(back to top)

+

Steps

+
    +
  1. Install Docker desktop
  2. +
  3. Clone CDS-TS-Dispatcher devcontainer using below command :
  4. +
+
git clone https://github.com/dxfrontier/cds-ts-dispatcher-dev-container
+
+ +
    +
  1. Open project in VSCode using:
  2. +
+
code cds-ts-dispatcher-dev-container
+
+ +
    +
  1. Change GIT remote origin to your origin
  2. +
+
git remote remove origin
git remote add origin https://github.com/user/YOUR_GIT_REPOSITORY.git
git branch -M main
git push -u origin main +
+ +
    +
  1. +

    Install Remote development pack VScode extension

    +
  2. +
  3. +

    COMMAND + SHIFT + P on MacOS or CTRL + SHIFT + P on Windows

    +
      +
    1. Type - Rebuild and Reopen in Container - This step will start creating the container project and start the Node server.
    2. +
    +
  4. +
  5. +

    Start development as usual.

    +
  6. +
+

(back to top)

+

Execute the following commands :

+
cds add typer
+
+ +
npm install
+
+ +
+

[!TIP] +If above option is being used, this means whenever we change a .CDS file the changes will reflect in the generated @cds-models folder.

+
+

(back to top)

+

Execute the command :

+
npx @cap-js/cds-typer "*" --outputDirectory ./srv/util/types/entities
+
+ +
    +
  • Target folder :./srv/util/types/entities - Change to your desired destination folder.
  • +
+

(back to top)

+
+

[!CAUTION] +Import always the generated entities from the service folders and not from the index.ts

+
+

alt text

+
+

[!TIP] +By default cds-typer will create in your package.json a quick path alias like :

+
"imports": {
"#cds-models/*": "./@cds-models/*/index.js"
} +
+ +

Use import helper to import entities from #cds-models like example :

+
    +
  • import { Book } from '#cds-models/CatalogService';
  • +
+
+

(back to top)

+

We recommend adhering to the Controller-Service-Repository design pattern using the following folder structure:

+
    +
  1. EntityHandler (Controller) - Responsible for managing the REST interface to the business logic implemented in ServiceLogic
  2. +
  3. ServiceLogic (Service) - Contains business logic implementations
  4. +
  5. Repository (Repository) - This component is dedicated to handling entity manipulation operations by leveraging the power of CDS-QL.
  6. +
+

Controller-Service-Repository suggested folder structure

+

alt text <= expanded folders => alt text

+

(back to top)

+

CDSDispatcher(entities : Constructable[])

+

The CDSDispatcher constructor allows you to create an instance for dispatching and managing entities.

+

Parameters

+
    +
  • entities (Array): An array of Entity handler(s) (Constructable) that represent the entities in the CDS.
  • +
+

Method

+ +

Example

+
import { CDSDispatcher } from '@dxfrontier/cds-ts-dispatcher';

export = new CDSDispatcher([
// Entities
BookHandler,
ReviewHandler,
BookStatsHandler,
// Draft
BookEventsHandler,
// Unbound actions
UnboundActionsHandler,
]).initialize();

// or use
// module.exports = new CDSDispatcher([ ... +
+ +

Visual image

+ +

(back to top)

+

The @EntityHandler decorator is utilized at the class-level to annotate a class with:

+
    +
  1. A specific entity that will serve as the base entity for all handler decorators within the class.
  2. +
  3. '*' as all entities that will serve as the base entity for all handler decorators within the class.
  4. +
+

Overloads

+ + + + + + + + + + + + + + + + + + + + +
MethodParametersDescription
1. EntityHandler(entity: CDSTyper)Must be a CDS-Typer generated classIt ensures that all handlers within the class operate with the specified entity context.
2. EntityHandler(entity: '*')A wildcard '*' indicating all entitiesIt ensures that all handlers within the class operate with a generic context indicating that registered events will be triggered for all all entities (active entities and draft entities)

Excluded will be @OnAction(), @OnFunction(), @OnEvent(), @OnError() as these actions belongs to the Service itself.
+

Parameters

+
    +
  • entity (CDSTyperEntity | '*'): A specialized class generated using the CDS-Typer or generic wild card '*' applicable to all entities.
  • +
+

Example 1 using CDS-Typer

+
import { EntityHandler } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@EntityHandler(MyEntity)
export class BookHandler {
// ...
constructor() {}
// All events like @AfterRead, @BeforeRead, ... will be triggered based on 'MyEntity'
} +
+ +

Example 2 using * wildcard indicating that events will be triggered for all entities

+
import { EntityHandler, CDS_DISPATCHER } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@EntityHandler(CDS_DISPATCHER.ALL_ENTITIES) // or use the '*'
export class BookHandler {
// ...
constructor() {}
// All events like @AfterRead, @BeforeRead, ... will be triggered on all entities using wildcard '*'
} +
+ +
+

[!TIP] +After creation of BookHandler class, you can import it into the CDSDispatcher.

+
import { CDSDispatcher } from '@dxfrontier/cds-ts-dispatcher';

export = new CDSDispatcher([
// Entities
BookHandler,
// Unbound actions
// ...
]).initialize(); +
+ +
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the class.

+
+

(back to top)

+

@ServiceLogic()

+

The @ServiceLogic decorator is utilized at the class-level to annotate a class as a specialized class containing only business logic.

+

Example

+
import { ServiceLogic } from '@dxfrontier/cds-ts-dispatcher';

@ServiceLogic()
export class CustomerService {
// ...
constructor() {}
// ...
} +
+ +
+

[!TIP] +When applying @ServiceLogic() decorator, the class becomes eligible to be used with Inject decorator for Dependency injection.

+
+

(back to top)

+

@Repository()

+

The @Repository decorator is utilized as a class-level annotation that designates a particular class as a specialized Repository, this class should contain only CDS-QL code.

+
import { Repository } from '@dxfrontier/cds-ts-dispatcher';

@Repository()
export class CustomerRepository {
// ...
constructor() {}
// ...
} +
+ +
+

[!TIP] +When applying @Repository() decorator, the class becomes eligible to be used with Inject decorator for Dependency injection.

+
+

The CDS-TS-Repository - BaseRepository was designed to reduce the boilerplate code required to implement data access layer for persistance entities.

+

It simplifies the implementation by offering a set of ready-to-use actions for interacting with the database. These actions include:

+
    +
  • .create(): Create new records in the database.
  • +
  • .getAll(): Retrieve all records from the database.
  • +
  • .find(): Query the database to find specific data.
  • +
  • .delete(): Remove records from the database.
  • +
  • .exists(): Check the existence of data in the database.
  • +
  • and many more ...
  • +
+

Example

+
import { Repository } from '@dxfrontier/cds-ts-dispatcher';
import { BaseRepository } from '@dxfrontier/cds-ts-repository';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@Repository()
export class CustomerRepository extends BaseRepository<MyEntity> {
constructor() {
super(MyEntity);
}

public async aMethod() {
const created = await this.create(...)
const createdMany = await this.createMany(...)
const updated = await this.update(...)
// ...
}
} +
+ +

To get started, refer to the official documentation CDS-TS-Repository - BaseRepository. +Explore the capabilities it offers and enhance your data access layer with ease.

+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the class.

+
+

(back to top)

+

@UnboundActions()

+

The @UnboundActions decorator is utilized at the class-level to annotate a class as a specialized class which will be used only for Unbound actions.

+

The following decorators can be used inside of @UnboundActions() :

+ +

Example

+
import { UnboundActions, OnAction, OnFunction, OnEvent, Req, Next, Error } from '@dxfrontier/cds-ts-dispatcher';
import { MyAction, MyFunction, MyEvent } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { ActionRequest, ActionReturn, TypedRequest, Request, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

@UnboundActions()
export class UnboundActionsHandler {
// ... @Inject dependencies, if needed.

constructor() {}

// Unbound action
@OnAction(MyAction)
private async onActionMethod(
@Req() req: ActionRequest<typeof MyAction>,
@Next() next: NextEvent,
): ActionReturn<typeof MyAction> {
// ...
}

// Unbound Function
@OnFunction(MyFunction)
private async onFunctionMethod(
@Req() req: ActionRequest<typeof MyFunction>,
@Next() next: NextEvent,
): ActionReturn<typeof MyFunction> {
// ...
}

// Unbound event
@OnEvent(MyEvent)
private async onEventMethod(@Req() req: TypedRequest<MyEvent>) {
// ...
}

// Unbound error
@OnError()
private onErrorMethod(@Error() err: Error, @Req() req: Request) {
// ...
}
} +
+ +

Imported it in the CDSDispatcher

+
import { CDSDispatcher } from '@dxfrontier/cds-ts-dispatcher';

export = new CDSDispatcher([ UnboundActionsHandler, ...])
// or
// use module.exports = new CDSDispatcher( ... ) +
+ +
+

[!NOTE] +The reason behind introducing a distinct decorator for Unbound actions stems from the fact that these actions are not associated with any specific Entity but instead these actions belongs to the Service itself.

+
+

(back to top)

+

@Use(...Middleware[])

+

The @Use decorator simplifies the integration of middlewares into your classes.

+

When @Use decorator applied at the class-level this decorator inject middlewares into the class and gain access to the req: Request and next: NextMiddleware middleware across all events (@AfterRead, @OnRead ...) within that class.

+

Middleware decorators can perform the following tasks:

+
    +
  • Execute any code.
  • +
  • Make changes to the request object.
  • +
  • End the request-response cycle.
  • +
  • Call the next middleware function in the stack.
  • +
  • If the current middleware function does not end the request-response cycle, it must call next() to pass control to the next middleware function. Otherwise, the request will be left hanging.
  • +
+

Parameters

+
    +
  • ...Middleware[]): Middleware classes to be injected.
  • +
+

Example: middleware implementation

+
import type { MiddlewareImpl, NextMiddleware, Request } from '@dxfrontier/cds-ts-dispatcher';

export class MiddlewareClass implements MiddlewareImpl {
public async use(req: Request, next: NextMiddleware) {
console.log('Middleware use method called.');

await next(); // call next middleware
}
} +
+ +

Example usage

+
import { EntityHandler, Use, Inject, CDS_DISPATCHER } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';
import { Middleware1, Middleware2, MiddlewareN } from 'YOUR_MIDDLEWARE_LOCATION';

import type { Service } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
@Use(Middleware1, Middleware2, MiddlewareN)
export class CustomerHandler {
// ...
@Inject(CDS_DISPATCHER.SRV) private srv: Service;
// ...
constructor() {}
// ...
} +
+ +
+

[!TIP]

+
    +
  1. Think of it (middleware) like as a reusable class, enhancing the functionality of all events within the class.
  2. +
  3. Middlewares when applied with @Use are executed before the normal events.
  4. +
  5. If you need to apply middleware to a method you should use the method specific @Use decorator .
  6. +
+
+
+

[!WARNING] +If req.reject() is used inside of middleware this will stop the stack of middlewares, this means that next middleware will not be executed.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the class.

+
+

(back to top)

+

@Inject(serviceIdentifier: ServiceIdentifierOrFunc<unknown>)

+

The @Inject decorator is utilized as a field-level decorator and allows you to inject dependencies into your classes.

+

Parameters

+
    +
  • serviceIdentifier(ServiceIdentifierOrFunc<unknown>): A Class representing the service to inject.
  • +
+

Example

+
import { EntityHandler, Inject, CDS_DISPATCHER } from "@dxfrontier/cds-ts-dispatcher";
import type { Service } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@EntityHandler(MyEntity)
export class CustomerHandler {
...
@Inject(CustomerService) private customerService: CustomerService
@Inject(CustomerRepository) private customerService: CustomerRepository
@Inject(AnyOtherInjectableClass) private repository: AnyOtherInjectableClass

@Inject(CDS_DISPATCHER.SRV) private srv: Service
// ...
constructor() {}
// ...
} +
+ +
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the class.

+
+

(back to top)

+

@Inject(CDS_DISPATCHER.SRV) private srv: Service

+

This specialized @Inject can be used as a constant in and contains the CDS.ApplicationService for further enhancements :

+ +

Example

+
import { EntityHandler, Inject, CDS_DISPATCHER } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Service } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
// OR @ServiceLogic()
// OR @Repository()
// OR @UnboundActions()
export class CustomerHandler {
// @Inject dependencies
@Inject(CDS_DISPATCHER.SRV) private srv: Service;

constructor() {}
// ...
} +
+ +
+

[!TIP] +The CDS.ApplicationService can be accessed trough this.srv.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@Req()

+

The @Req decorator is utilized at the parameter level to annotate a parameter with the Request object, providing access to request-related information of the current event.

+

Return

+
    +
  • Request: An instance of @sap/cds - Request
  • +
+

Example

+
import { EntityHandler, Req, Results } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
export class BookHandler {
// ...
constructor() {}
// ... all events like @AfterRead, @BeforeRead ...

@AfterRead()
private async aMethod(@Req() req: Request, @Results() results: MyEntity[]) {
// ... req...
}
} +
+ +

(back to top)

+

@Res()

+

The @Res decorator is utilized at the parameter level to annotate a parameter with the Request.http.res - (Response) object, providing access to response-related information of the current event and it can be used to enhance the Response.

+

Return

+
    +
  • RequestResponse: An instance of RequestResponse providing you response-related information.
  • +
+

Example

+
import { EntityHandler, Req, Results } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request, RequestResponse } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
export class BookHandler {
// ...
constructor() {}
// ... all events like @AfterRead, @BeforeRead ...

@AfterRead()
private async aMethod(@Req() req: Request, @Res() response: RequestResponse, @Results() results: MyEntity[]) {
// Example: we assume we want to add a new header language on the response
// We use => res.setHeader('Accept-Language', 'DE_de');
}
} +
+ +
+

[!TIP] +Decorator @Res can be used in all After, Before and On events.

+
+

(back to top)

+

@Results() / @Result

+

The @Results decorator is utilized at the parameter level to annotate a parameter with the request Results.

+

Return

+
    +
  • Array / object: Contains the OData Request Body.
  • +
+

Example

+
import { EntityHandler, Req, Results } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
export class BookHandler {
// ...
constructor() {}
// ... all events like @AfterRead, @BeforeRead ...

@AfterRead()
private async aMethod(@Req() req: Request, @Results() results: MyEntity[]) {
// ...
}
} +
+ +
+

[!TIP] +When using @AfterCreate(), @AfterUpdate() and @AfterDelete() it's recommended to use the @Result decorator for single object result and @Results for arrays of objects.

+
+
@AfterCreate()
@AfterUpdate()
private async aMethod(
@Result() result: Book, // <== @Result() decorator used to annotate it's a an object and not an array
@Req() req: Request,
) {
// ...
}

@AfterRead()
private async aMethod(
@Results() result: Book[], // <== @Results() decorator used to annotate as array of objects
@Req() req: Request,
) {
// ...
}

@AfterDelete()
private async aMethod(
@Result() deleted: boolean, // <== @Result() decorator used to annotate as a boolean
@Req() req: Request,
) {
// ...
} +
+ +
+

[!TIP] +Decorators @Results() and @Result() can be applied to all After events.

+
+

(back to top)

+

@Next()

+

The @Next decorator is utilized at the parameter level to annotate a parameter with the Next function, which is used to proceed to the next event in the chain of execution.

+

Return

+
    +
  • NextEvent: The next event in chain to be called.
  • +
+

Example

+
import { EntityHandler, Req, Results } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
export class BookHandler {
// ...
constructor() {}
// ... all events like @AfterRead, @BeforeRead, @OnCreate ...

@OnCreate()
public async onCreate(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
return next();
}
} +
+ +
+

[!TIP] +Decorator @Next can be applied to all On, On - draft event decorators.

+
+

(back to top)

+

@Error()

+

The @Error decorator is utilized at the parameter level to annotate a parameter with the Error and contains information regarding the failed Request.

+

Return

+
    +
  • Error: An instance of type Error.
  • +
+

Example

+
import { UnboundActions, Req, Error } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@UnboundActions()
export class UnboundActionsHandler {
// ...
constructor() {}

@OnError()
public onError(@Error() err: Error, @Req() req: Request): void {
// ...
}
} +
+ +
+

[!TIP] +Decorator @Error can be applied to @OnError() decorator which resides inside of the @UnboundActions().

+
+

@Jwt()

+

The @Jwt decorator is utilized at the parameter level. It will retrieve the to retrieve JWT from the Request that is based on the node req.http.req - IncomingMessage.

+

Fails if no authorization header is given or has the wrong format.

+

Return

+
    +
  • string | undefined : The retrieved JWT token or undefined if no token was found.
  • +
+

Example

+
import { EntityHandler, Req, Results, Jwt } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
export class BookHandler {
// ...
constructor() {}
// ... all events like @AfterRead, @BeforeRead ...

@AfterRead()
private async aMethod(@Req() req: Request, @Results() results: MyEntity[], @Jwt(): string | undefined) {
// ... req...
}
} +
+ +
+

[!IMPORTANT] +Expected format is Bearer <TOKEN>.

+
+

(back to top)

+

@IsPresent<Key extends CRUDQueryKeys>(key: Key, property: PickQueryPropsByKey<Key>)

+

The @IsPresent decorator is utilized at the parameter level. It allows you to verify the existence of a specified Query property values.

+

Parameters

+
    +
  • key (string): Specifies the type of query operation. Accepted values are INSERT, SELECT, UPDATE, UPSERT, DELETE.
  • +
  • property (string): Specifies the property based on the key.
  • +
+

Return

+
    +
  • boolean: This decorator returns true if property value is filled, false otherwise
  • +
+

Example

+
import { EntityHandler, Req, Results, IsPresent } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
class BookHandler {
// ...
constructor() {}

@AfterRead()
private async aMethod(
@Req() req: Request,
@Results() results: MyEntity[],

@IsPresent('SELECT', 'columns') columnsPresent: boolean,
) {
if (columnsPresent) {
// ...
}

// ...
}
} +
+ +
+

[!TIP] +Decorator @IsPresent() works well with @GetQuery().

+
+

(back to top)

+

@IsRole(...roles: string[])

+

The @IsRole decorator is utilized at the parameter level. It allows you to verify +if the User has assigned a given role.

+

It applies an logical OR on the specified roles, meaning it checks if at least one of the specified roles is assigned

+

Parameters

+
    +
  • role (...string[]): An array of role names to check if are assigned.
  • +
+

Return

+
    +
  • boolean: This decorator returns true if at least one of the specified roles is assigned to the current request user, otherwise false.
  • +
+

Example

+
import { EntityHandler, Req, Results, IsPresent, IsRole } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
class BookHandler {
// ...
constructor() {}

@AfterRead()
private async aMethod(
@Req() req: Request,
@Results() results: MyEntity[],

@IsRole('role', 'anotherRole') roleAssigned: boolean,
) {
if (roleAssigned) {
// ...
}

// ...
}
} +
+ +
+

[!TIP] +The role names correspond to the values of @requires and the @restrict.grants.to annotations in your CDS models.

+
+

(back to top)

+

@IsColumnSupplied<T>(field : keyof T)

+

The @IsColumnSupplied<T>() decorator is utilized at the parameter level. It allows your to verify the existence of a column in the SELECT, INSERT or UPSERT Query.

+

Parameters

+
    +
  • column (string): A string representing the name of the column to be verified.
  • +
+

Return :

+
    +
  • boolean: This decorator returns true if column was found, false otherwise
  • +
+

Example

+
import { EntityHandler, Req, Results, IsPresent } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
class BookHandler {
// ...
constructor() {}

@AfterRead()
private async aMethod(
@Req() req: Request,
@Results() results: MyEntity[],

@IsColumnSupplied<MyEntity>('price') priceSupplied: boolean,
) {
if (priceSupplied) {
// ...
}

// ...
}
} +
+ +

(back to top)

+

@GetQuery<Key extends CRUDQueryKeys>(key: Key, property: PickQueryPropsByKey<Key>)

+

The @GetQuery decorator is utilized at the parameter level. It allows you to retrieve Query property values.

+

Parameters

+
    +
  • key (string): Specifies the type of query operation. Accepted values are INSERT, SELECT, UPDATE, UPSERT, DELETE.
  • +
  • property (string): Specifies the property based on the key.
  • +
+

Return: Varies based on the specified property :

+
    +
  • +
    +SELECT +
      +
    • @GetQuery('SELECT', 'columns') columns: GetQueryType['columns']['forSelect']
    • +
    • @GetQuery('SELECT', 'distinct') distinct: GetQueryType['distinct']
    • +
    • @GetQuery('SELECT', 'excluding') excluding: GetQueryType['excluding']
    • +
    • @GetQuery('SELECT', 'from') from: GetQueryType['from']['forSelect']
    • +
    • @GetQuery('SELECT', 'groupBy') groupBy: GetQueryType['groupBy']
    • +
    • @GetQuery('SELECT', 'having') having: GetQueryType['having']
    • +
    • @GetQuery('SELECT', 'limit') limit: GetQueryType['limit']
    • +
    • @GetQuery('SELECT', 'limit.rows') limitRows: GetQueryType['limit']['rows']
    • +
    • @GetQuery('SELECT', 'limit.offset') limitOffset: GetQueryType['limit']['offset']
    • +
    • @GetQuery('SELECT', 'mixin') mixin: GetQueryType['mixin']
    • +
    • @GetQuery('SELECT', 'one') one: GetQueryType['one']
    • +
    • @GetQuery('SELECT', 'orderBy') orderBy: GetQueryType['orderBy']
    • +
    • @GetQuery('SELECT', 'where') where: GetQueryType['where']
    • +
    +
    +
  • +
  • +
    +INSERT +
      +
    • @GetQuery('INSERT', 'as') as: GetQueryType['as']
    • +
    • @GetQuery('INSERT', 'columns') columns: GetQueryType['columns']['forInsert']
    • +
    • @GetQuery('INSERT', 'entries') entries: GetQueryType['entries']
    • +
    • @GetQuery('INSERT', 'into') into: GetQueryType['into']
    • +
    • @GetQuery('INSERT', 'rows') rows: GetQueryType['rows']
    • +
    • @GetQuery('INSERT', 'values') values: GetQueryType['values']
    • +
    +
    +
  • +
  • +
    + UPDATE +
      +
    • @GetQuery('UPDATE', 'data') data: GetQueryType['data']
    • +
    • @GetQuery('UPDATE', 'entity') entity: GetQueryType['entity']
    • +
    • @GetQuery('UPDATE', 'where') where: GetQueryType['where']
    • +
    +
    +
  • +
  • +
    + UPSERT +
      +
    • @GetQuery('UPSERT', 'columns') columns: GetQueryType['columns'][forUpsert]
    • +
    • @GetQuery('UPSERT', 'entries') entries: GetQueryType['entries']
    • +
    • @GetQuery('UPSERT', 'into') into: GetQueryType['into']
    • +
    • @GetQuery('UPSERT', 'rows') rows: GetQueryType['rows']
    • +
    • @GetQuery('UPSERT', 'values') values: GetQueryType['values']
    • +
    +
    +
  • +
  • +
    + DELETE +
      +
    • +

      @GetQuery('DELETE', 'from') from: GetQueryType['from'][forDelete]

      +
    • +
    • +

      @GetQuery('DELETE', 'where') columns: GetQueryType['where']

      +
    +
  • +
+ + +

Example

+
import { EntityHandler, Req, Results, IsPresent, GetQuery } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { Request, GetQueryType } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
class BookHandler {
// ...
constructor() {}

@AfterRead()
private async aMethod(
@Req() req: Request,
@Results() results: MyEntity[],

// Check existence of columns
@IsPresent('SELECT', 'columns') columnsPresent: boolean,

// Get columns
@GetQuery('SELECT', 'columns') columns: GetQueryType['columns']['forSelect'],

@GetQuery('SELECT', 'orderBy') orderBy: GetQueryType['orderBy'],
@GetQuery('SELECT', 'groupBy') groupBy: GetQueryType['groupBy'],
) {
if (columnsPresent) {
// do something with columns values
// columns.forEach(...)
}

// ...
}
} +
+ +
+

[!TIP] +Decorator @GetQuery() can be used to get the Query property and @IsPresent() can check if the Query property is empty or not.

+
+

(back to top)

+

@GetRequest(property : keyof Request)

+

The @GetRequest decorator is utilized at the parameter level. It allows you tu retrieve the specified property value from the Request object.

+

Parameters

+
    +
  • property (string): Specifies the property to retrieve from the Request object.
  • +
+

Return: Varies based on the specified property :

+
    +
  • @GetRequest('entity') entity: Request['entity'],
  • +
  • @GetRequest('event') event: Request['event'],
  • +
  • @GetRequest('features') features: Request['features'],
  • +
  • @GetRequest('headers') headers: Request['headers'],
  • +
  • @GetRequest('http') http: Request['http'],
  • +
  • @GetRequest('id') id: Request['id'],
  • +
  • @GetRequest('locale') locale: Request['locale'],
  • +
  • @GetRequest('method') method: Request['method'],
  • +
  • @GetRequest('params') params: Request['params'],
  • +
  • @GetRequest('query') query: Request['query'],
  • +
  • @GetRequest('subject') subject: Request['subject'],
  • +
  • @GetRequest('target') target: Request['target'],
  • +
  • @GetRequest('tenant') tenant: Request['tenant'],
  • +
  • @GetRequest('timestamp') timestamp: Request['timestamp'],
  • +
  • @GetRequest('user') user: Request['user'],
  • +
+

Example

+
import { EntityHandler, Results, GetRequest } from '@dxfrontier/cds-ts-dispatcher';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

import type { GetTypeLocale, GetTypeMethod, Request } from '@dxfrontier/cds-ts-dispatcher';

@EntityHandler(MyEntity)
class BookHandler {
// ...
constructor() {}

@AfterRead()
private async aMethod(
// @Req() req: Request, we assume we don't need the hole Request object and we need only 'locale' and 'method'
@Results() results: MyEntity[],

@GetRequest('locale') locale: Request['locale'],
@GetRequest('method') method: Request['method'],
) {
// do something with 'locale' and 'method' ...
}
} +
+ +
+

[!TIP] +Type Request can be import from :

+
import type { Request } from '@dxfrontier/cds-ts-dispatcher';
+
+ +
+

(back to top)

+

@SingleInstanceSwitch

+

The @SingleInstanceSwitch() decorator is applied at the parameter level.

+

It allows you to manage different behaviors based on whether the request is for a single entity instance or an entity set, the parameter assigned to the decorator will behave like a switch.

+

Return

+
    +
  • true when the Request is single instance
  • +
  • false when the Request is entity set
  • +
+

Example 1

+

Single request : http://localhost:4004/odata/v4/main/`MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)`

+
import { AfterRead, SingleInstanceCapable } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterRead()
private async singeInstanceMethodAndEntitySet(@Results() results : MyEntity[], @Req() req: TypedRequest<MyEntity>, @SingleInstanceSwitch() isSingleInstance: boolean) {
if(isSingleInstance) {
// This will be executed only when single instance is called : http://localhost:4004/odata/v4/main/MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)
return this.customerService.handleSingleInstance(req)
}

// nothing to entity set
} +
+ +

Example 2

+

Entity request : http://localhost:4004/odata/v4/main/`MyEntity`

+
import { AfterRead, SingleInstanceCapable } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterRead()
private async singeInstanceMethodAndEntitySet(@Results() results : MyEntity[], @Req() req: TypedRequest<MyEntity>, @SingleInstanceSwitch() isSingleInstance: boolean) {
if(isSingleInstance) {
// This will be executed only when single instance is called : http://localhost:4004/odata/v4/main/MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)
// ...
}

// ... this will be executed when entity set is called : http://localhost:4004/odata/v4/main/MyEntity
results[0] = {
name : 'new value'
}
} +
+ +
+

[!TIP] +Decorator @SingleInstanceSwitch can be used together with the following decorator events:

+ +
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

Use @BeforeCreate(), @BeforeRead(), @BeforeUpdate(), @BeforeDelete() to register handlers to run before .on handlers, frequently used for validating user input.

+

The handlers receive one argument:

+
    +
  • req of type TypedRequest
  • +
+

See also the official SAP JS CDS-Before event

+
+

[!TIP] +If @odata.draft.enabled: true to manage event handlers for draft version you can use

+
    +
  • @BeforeCreateDraft()
  • +
  • @BeforeReadDraft()
  • +
  • @BeforeUpdateDraft()
  • +
  • @BeforeDeleteDraft()
  • +
+
+

(back to top)

+

@BeforeCreate()

+

Example

+
import { BeforeCreate } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeCreate()
private async beforeCreateMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('CREATE', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +It is important to note that the decorator @BeforeCreate() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@BeforeRead()

+

Example

+
import { BeforeRead } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeRead()
private async beforeReadMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('READ', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeRead() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@BeforeUpdate()

+

Example

+
import { BeforeUpdate } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeUpdate()
private async beforeUpdateMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('UPDATE', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeUpdate() will be triggered based on the EntityHandler argument => MyEntity

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@BeforeDelete()

+

Example

+
import { BeforeDelete } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeDelete()
private async beforeDeleteMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('DELETE', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeDelete() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

The @BeforeAll decorator is triggered whenever any CRUD (Create, Read, Update, Delete) event occurs, whether the entity is active or in draft mode.

+

ACTIVE ENTITY

+

For active entities, the @BeforeAll decorator will be triggered when at least one of the following events occurs:

+ +

DRAFT

+

For draft entities, the @BeforeAll decorator will be triggered when at least one of the following events occurs:

+ +

@BeforeAll()

+

Example

+
import { BeforeAll } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeAll()
private async beforeAllEvents(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('*', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeAll() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!TIP] +If the entity has drafts enabled @odata.draft.enabled: true, the @BeforeAll decorator will still be triggered for draft events.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

Use @AfterCreate(), @AfterRead(), @AfterUpdate(), @AfterDelete() register handlers to run after the .on handlers, frequently used to enrich outbound data.

+

The handlers receive two arguments:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersDecoratorDescription
results, req@AfterReadAn array of type MyEntity[] and the Request.
result, req@AfterUpdate
@AfterCreate
An object of type MyEntity and the Request.
deleted, req@AfterDeleteA boolean indicating whether the instance was deleted and the Request.
+
+

[!TIP] +If @odata.draft.enabled: true to manage event handlers for draft version you can use :

+
    +
  • @AfterCreateDraft()
  • +
  • @AfterReadDraft()
  • +
  • @AfterReadDraftSingleInstance()
  • +
  • @AfterUpdateDraft()
  • +
  • @AfterDeleteDraft()
  • +
+
+

(back to top)

+

@AfterCreate()

+

Example

+
import { AfterCreate } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterCreate()
private async afterCreateMethod(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('CREATE', MyEntity, async (result, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterCreate() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterRead()

+

Example

+
import { AfterRead, Results, Req } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterRead()
private async afterReadMethod(@Results() results: MyEntity[], @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('READ', MyEntity, async (results, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterRead() will be triggered based on the EntityHandler argument MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterReadEachInstance()

+

The @AfterReadEachInstance decorator is used to execute custom logic after performing a read operation on each individual instance. This behavior is analogous to the JavaScript Array.prototype.forEach method.

+

Example

+
import { AfterReadEachInstance, Result, Req } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterReadEachInstance()
private async afterEach(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('each', MyEntity, async (result, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterReadEachInstance() will be triggered based on the EntityHandler argument MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterUpdate()

+

Example

+

Single request : http://localhost:4004/odata/v4/main/`MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)`

+
import { AfterUpdate } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterUpdate()
private async afterUpdateMethod(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('UPDATE', MyEntity, async (result, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterUpdate() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterDelete()

+

Example

+
import { AfterDelete} from "@dxfrontier/cds-ts-dispatcher";
import type { Request } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterDelete()
private async afterDeleteMethod(@Result() deleted: boolean, @Req() req: Request) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('DELETE', MyEntity, async (deleted, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterDelete() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

The @AfterAll decorator is triggered whenever any CRUD (Create, Read, Update, Delete) event occurs, whether the entity is active or in draft mode.

+

ACTIVE ENTITY

+

For active entities, the @BeforeAll decorator will be triggered when at least one of the following events occurs:

+ +

DRAFT

+

For draft entities, the @BeforeAll decorator will be triggered when at least one of the following events occurs:

+ +

@AfterAll()

+

Example

+
import { AfterAll} from "@dxfrontier/cds-ts-dispatcher";
import type { Request } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterAll()
private async afterAll(@Result() result: MyEntity | MyEntity[] | boolean, @Req() req: Request) {
if(Array.isArray(result)) {
// when after `READ` event was triggered
}
else if(typeof result === 'boolean' ) {
// when after `DELETE` event was triggered
}
else {
// when after `CREATE`, `UPDATE` was triggered
}

// ...
} +
+ +

Equivalent to 'JS'

+
this.after('*', MyEntity, async (result, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterAll() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!TIP] +If the entity has drafts enabled @odata.draft.enabled: true, the @AfterAll decorator will still be triggered for draft events.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

Use @OnCreate(), @OnRead(), @OnUpdate(), @OnDelete(), OnAction(), @OnFunction(), @OnBoundAction(), @OnBoundFunction() handlers to fulfill requests, e.g. by reading/writing data from/to databases handlers.

+

The handlers receive two arguments:

+
    +
  • req of type TypedRequest
  • +
  • next of type NextEvent
  • +
+
+

[!TIP] +If @odata.draft.enabled: true to manage event handlers for draft version you can use :

+
    +
  • @OnCreateDraft()
  • +
  • @OnReadDraft()
  • +
  • @OnUpdateDraft()
  • +
  • @OnDeleteDraft()
  • +
  • @OnBoundActionDraft()
  • +
  • @OnBoundFunctionDraft()
  • +
+
+

(back to top)

+

@OnCreate()

+

Example

+
import { OnCreate, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnCreate()
private async onCreateMethod(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...

return next();
} +
+ +

Equivalent to 'JS'

+
this.on('CREATE', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnCreate() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnRead()

+

Example

+
import { OnRead, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnRead()
private async onReadMethod(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...

return next();
} +
+ +

Equivalent to 'JS'

+
this.on('READ', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnRead() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnUpdate()

+

Example

+

import { OnUpdate, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnUpdate()
private async onUpdateMethod(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...

return next();
} +
+ +

Equivalent to 'JS'

+
this.on('UPDATE', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnUpdate() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnDelete()

+

Example

+
import { OnDelete, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnDelete()
private async onDeleteMethod(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...

return next();
} +
+ +

Equivalent to 'JS'

+
this.on('DELETE', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnDelete() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnAction(name : CdsAction)

+

Parameters

+
    +
  • name (CdsAction) : Representing the CDS action defined in the CDS file
  • +
+

Example

+

import { OnAction, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { ActionRequest, ActionReturn, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { AnAction } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnAction(AnAction)
private async onActionMethod(@Req() req: ActionRequest<typeof AnAction>, @Next() next: NextEvent): ActionReturn<typeof AnAction> {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on(AnAction, async (req, next) => {
// ...
}); +
+ +
+

[!NOTE] +AnAction was generated using CDS-Typer and imported in the the class.

+
+
+

[!IMPORTANT]
+Decorator @OnAction should be used inside @UnboundActions() class.

+
+

(back to top)

+

@OnFunction(name : CdsFunction)

+

Parameters

+
    +
  • name (CdsFunction) : Representing the CDS action defined in the CDS file.
  • +
+

Example

+
import { OnFunction, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { ActionRequest, ActionReturn, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { AFunction } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnFunction(AFunction)
private async onFunctionMethod(@Req() req: ActionRequest<typeof AFunction>, @Next() next: NextEvent): ActionReturn<typeof AFunction> {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on(AFunction, async (req) => {
// ...
}); +
+ +
+

[!NOTE] +AFunction was generated using CDS-Typer and imported in the the class.

+
+
+

[!IMPORTANT]
+Decorator @OnFunction should be used inside @UnboundAction() class.

+
+

(back to top)

+

@OnEvent(name : CdsEvent)

+

The @OnEvent decorator facilitates the listening of messages from a message broker.

+

This decorator is particularly useful in conjunction with the Emit method to handle triggered events.

+

Parameters

+
    +
  • name (CdsEvent) : Representing the CDS event defined in the CDS file.
  • +
+

Example

+
import { OnEvent, Req } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { AEvent } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnEvent(AEvent)
private async onEventMethod(@Req() req: TypedRequest<AEvent>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on('AEvent', async (req) => {
// ...
}); +
+ +
+

[!NOTE] > AEvent was generated using CDS-Typer and imported in the the class.

+
+
+

[!IMPORTANT]
+Decorator @OnEvent should be used inside @UnboundActions class.

+
+
+

[!TIP] +More info can be found at https://cap.cloud.sap/docs/guides/messaging/

+
+

(back to top)

+

@OnError()

+

Use @OnError decorator to register custom error handler.

+

Error handlers are invoked whenever an error occurs during event processing of all potential events and requests, and are used to augment or modify error messages, before they go out to clients.

+

Example

+
import { OnError, Error, Req } from "@dxfrontier/cds-ts-dispatcher";
import type { Request } from '@dxfrontier/cds-ts-dispatcher';

@OnError()
private onError(@Error() err: Error, @Req() req: Request) { // sync func
err.message = 'New message'
// ...
} +
+ +

Equivalent to 'JS'

+
this.on('error', (err, req) => {
err.message = 'New message';
// ...
}); +
+ +
+

[!IMPORTANT]
+Decorator @OnError should be used inside @UnboundActions class.

+
+
+

[!CAUTION] +OnError callback are expected to be a sync function, i.e., not async, not returning Promises.

+
+
+

[!TIP] +More info can be found at SAP CAP Error

+
+

(back to top)

+

@OnBoundAction(name : CdsAction)

+

Parameters

+
    +
  • name (CdsAction) : Representing the CDS action defined in the CDS file.
  • +
+

Example

+
import { OnBoundAction, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { ActionRequest, ActionReturn, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnBoundAction(MyEntity.actions.AnAction)
private async onActionMethod(@Req() req: ActionRequest<typeof MyEntity.actions.AnAction>, @Next() next: NextEvent): ActionReturn<typeof MyEntity.actions.AnAction> {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on(MyEntity.actions.AnAction, MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnBoundAction() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnBoundFunction(name : CdsFunction)

+

Parameters

+
    +
  • name (CdsFunction) : Representing the CDS action defined in the CDS file.
  • +
+

Example

+
import { OnBoundFunction, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { ActionRequest, ActionReturn, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnBoundFunction(MyEntity.actions.AFunction)
private async onFunctionMethod(@Req() req: ActionRequest<typeof MyEntity.actions.AFunction>, @Next() next: NextEvent): ActionReturn<typeof MyEntity.actions.AFunction> {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on(MyEntity.actions.AFunction, MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnBoundFunction() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnAll()

+

The @OnAll decorator is triggered whenever any CRUD (Create, Read, Update, Delete) event occurs, whether the entity is active or in draft mode.

+

ACTIVE ENTITY

+

For active entities, the @BeforeAll decorator will be triggered when at least one of the following events occurs:

+ +

DRAFT

+

For draft entities, the @BeforeAll decorator will be triggered when at least one of the following events occurs:

+ +
+

[!NOTE] +Exception will be the following decorators @OnEvent(), @OnError() and UNBOUND ACTIONS @OnAction(), UNBOUND FUNCTIONS @OnFunction() as these are bound to the service itself and not to an entity.

+
+

Example

+
import { OnAll, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { Request, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnAll()
private async onAll(@Req() req: Request, @Next() next: NextEvent) {
// ...
return next();
} +
+ +

Equivalent to 'JS'

+
this.on('*', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnAll() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!TIP] +If the entity has drafts enabled @odata.draft.enabled: true, the @OnAll decorator will still be triggered for draft events.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

Use @BeforeNewDraft(), @BeforeCancelDraft(), @BeforeEditDraft(), @BeforeSaveDraft(), @BeforeCreateDraft(), @BeforeReadDraft(), @BeforeUpdateDraft(), @BeforeDeleteDraft() to register handlers to run before.onhandlers, frequently used for validating user input.

+

The handlers receive one argument:

+
    +
  • req of type TypedRequest
  • +
+

@BeforeNewDraft()

+

Use this decorator when you want to validate inputs before a new draft is created.

+

Example

+
import { BeforeNewDraft, TypedRequest } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeNewDraft()
private async beforeCreateDraftMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('NEW', MyEntity.drafts, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeNewDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@BeforeCancelDraft()

+

Use this decorator when you want to validate inputs before a draft is discarded.

+

Example

+
import { BeforeCancelDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeCancelDraft()
private async beforeCancelDraftMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('CANCEL', MyEntity.drafts, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeCancelDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@BeforeEditDraft()

+

Use this decorator when you want to validate inputs when a new draft is created from an active instance.

+

Example

+
import { BeforeEditDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeEditDraft()
private async beforeEditDraftMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('EDIT', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeEditDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@BeforeSaveDraft()

+

Use this decorator when you want to validate inputs when active entity is changed.

+

Example

+
import { BeforeSaveDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@BeforeSaveDraft()
private async beforeSaveDraftMethod(@Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.before('SAVE', MyEntity, async (req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @BeforeSaveDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

Use @AfterNewDraft(), @AfterCancelDraft(), @AfterEditDraft(), @AfterSaveDraft(), @AfterCreateDraft(), @AfterReadDraft(), @AfterUpdateDraft(), @AfterDeleteDraft() register handlers to run after the .on handlers, frequently used to enrich outbound data. The handlers receive two arguments:

+

The results from the preceding .on handler, with the following types:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersDecoratorDescription
results, req@AfterReadAn array of type MyEntity[] and the Request.
result, req@AfterUpdate
@AfterCreate
An object of type MyEntity and the Request.
deleted, req@AfterDeleteA boolean indicating whether the instance was deleted and the Request.
+

@AfterNewDraft()

+

Use this decorator when you want to enhance outbound data when a new draft is created.

+

Example

+
import { AfterNewDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterNewDraft()
private async afterNewDraftMethod(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('NEW', MyEntity.drafts, async (results, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterNewDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterCancelDraft()

+

Use this decorator when you want to enhance outbound data when a draft is discarded.

+

Example

+
import { AfterCancelDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterCancelDraft()
private async afterCancelDraftMethod(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('CANCEL', MyEntity.drafts, async (results, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterCancelDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterEditDraft()

+

Use this decorator when you want to enhance outbound data when a new draft is created from an active instance.

+

Example

+
import { AfterEditDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterEditDraft()
private async afterEditDraftMethod(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('EDIT', MyEntity, async (results, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterEditDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@AfterSaveDraft()

+

Use this decorator when you want to enhance outbound data when the active entity is changed.

+

Example

+
import { AfterSaveDraft } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterSaveDraft()
private async afterSaveDraftMethod(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.after('SAVE', MyEntity, async (results, req) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @AfterSaveDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

Use @OnNewDraft(), @OnCancelDraft(), @OnSaveDraft(), @OnEditDraft(), @OnReadDraft(), @OnUpdateDraft(), @OnCreateDraft(), @OnDeleteDraft(), @OnBoundActionDraft(), @OnBoundFunctionDraft() handlers to support for both, active and draft entities.

+

The handlers receive two arguments:

+
    +
  • req of type TypedRequest
  • +
  • next of type NextEvent
  • +
+

See Official SAP Fiori-draft

+

@OnNewDraft()

+

This decorator will be triggered when a new draft is created.

+

Example

+
import { OnNewDraft, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnNewDraft()
private async onNewDraft(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on('NEW', MyEntity.drafts, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnNewDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnCancelDraft()

+

This decorator will be triggered when a draft is cancelled.

+

Example

+
import { OnCancelDraft, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnCancelDraft()
private async onCancelDraft(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on('CANCEL', MyEntity.drafts, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnCancelDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnEditDraft()

+

This decorator will be triggered when a new draft is created from an active instance

+

Example

+
import { OnEditDraft, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnEditDraft()
private async onEditDraft(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on('EDIT', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnEditDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@OnSaveDraft()

+

This decorator will be triggered when the active entity is changed

+

Example

+

import { OnSaveDraft, Req, Next } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@OnSaveDraft()
private async onSaveDraft(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
} +
+ +

Equivalent to 'JS'

+
this.on('SAVE', MyEntity, async (req, next) => {
// ...
}); +
+ +
+

[!IMPORTANT] +Decorator @OnSaveDraft() will be triggered based on the EntityHandler argument => MyEntity.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

All active entity On, Before, After events have also a Draft variant.

+
+

[!NOTE] +Except the @OnAction(), @OnFunction(), @OnEvent(), @OnError() as these actions are bound to the service and not to an entity.

+
+

(back to top)

+

@AfterReadSingleInstance()

+

The @AfterReadSingleInstance decorator is utilized as a method-level and it can be used when you want to execute custom logic for single instance request.

+

If you want to execute logic for both cases (single instance and entity set) then you should use the @AfterRead(), and you can apply the parameter @SingleInstanceSwitch() decorator to switch between entity set and single instance.

+

Example

+

Single request : http://localhost:4004/odata/v4/main/MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)

+
import { AfterReadSingleInstance, Result, Req } from "@dxfrontier/cds-ts-dispatcher";
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@AfterReadSingleInstance()
private async afterReadSingleInstance(@Result() result: MyEntity, @Req() req: TypedRequest<MyEntity>) {
// This will be executed only when single instance is called : http://localhost:4004/odata/v4/main/MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)
// ...
} +
+ +
+

[!IMPORTANT] +Decorator @AfterReadSingleInstance() will be triggered based on the EntityHandler argument MyEntity.

+
+
+

[!CAUTION] +If @AfterReadSingleInstance() is used all together with @AfterRead(), the event GET (Read), PATCH (Update) will trigger both decorators, this applies only when both decorators are used in the same @EntityHandler().

+

The vice-versa doesn't apply, this means that if you trigger the entity set request the @AfterReadSingleInstance() will not be triggered.

+

Example GET: http://localhost:4004/odata/v4/main/MyEntity(ID=2f12d711-b09e-4b57-b035-2cbd0a023a09)

+
// use this
@AfterReadSingleInstance()
private async afterReadSingleInstance(
@Req() req: Request,
@Result() result: MyEntity
): Promise<void> {
// The `GET` will trigger the single instance request
}

// or this
@AfterRead()
private async afterRead(
@Req() req: Request,
@Results() results: MyEntity[],
@SingleInstanceSwitch() singleInstance: boolean
): Promise<void> {
// The `GET` will trigger for both cases (single instance & entity instance), but you can use the `singleInstance` flag to verify if it's single or entity set.
} +
+ +
+
+

[!TIP] +If @odata.draft.enabled: true and you need to read the draft then you should use @AfterReadDraftSingleInstance() decorator.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the the class.

+
+

(back to top)

+

@Prepend({ eventDecorator : string })

+

The @Prepend decorator is utilized as a method-level decorator to register an event handler to run before existing ones like @BeforeCreate() @AfterCreate() @OnAction() ..., etc.

+

Parameters

+
    +
  • eventDecorator (string) : The eventDecorator can be one of the following : +
      +
    • BEFORE: 'BeforeCreate', 'BeforeRead', 'BeforeUpdate', 'BeforeDelete', 'BeforeAll'.
    • +
    • AFTER: 'AfterCreate', 'AfterRead', 'AfterReadEachInstance', 'AfterReadSingleInstance', 'AfterUpdate', 'AfterDelete', 'AfterAll'.
    • +
    • ON: 'OnCreate', 'OnRead', 'OnUpdate', 'OnDelete', 'OnAll', 'OnAction', 'OnFunction', 'OnBoundAction', 'OnBoundFunction', 'OnEvent', 'OnError'.
    • +
    +
  • +
  • actionName: (CDSFunction) : Action name, applicable only for OnAction, OnBoundAction, OnFunction, OnBoundFunction.
  • +
  • eventName: (CDSEvent) : Event name, applicable only for OnEvent.
  • +
+

Example 1

+
import { Prepend, AfterRead, Req, Results } from '@dxfrontier/cds-ts-dispatcher';
import type { Request } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@Prepend({ eventDecorator: 'AfterRead' })
private async prepend(@Req() req: Request): Promise<void> {
req.locale = 'DE_de';
}

@AfterRead()
private async afterRead(MyEntity
@Req() req: Request,
@Results() results: MyEntity[],
) {

// req.locale will have the value 'DE_de' ...
// ...
} +
+ +

Example 2

+
import { Prepend, OnEvent, Req } from '@dxfrontier/cds-ts-dispatcher';
import type { TypedRequest } from '@dxfrontier/cds-ts-dispatcher';

import { MyEvent } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@Prepend({ eventDecorator: 'OnEvent', eventName: MyEvent })
private async prepend(@Req() req: TypedRequest<MyEvent>) {
req.locale = 'DE_de';
}

@OnEvent(MyEvent)
public async handleMyEvent(@Req() req: TypedRequest<MyEvent>) {
// req.locale will have the value 'DE_de' ...
// ...
} +
+ +
+

[!TIP] +The @Prepend decorator can be used for example :

+
    +
  • When you want to prepare various things before reaching the actual event.
  • +
  • Making transformation on Request, Result, ... before reaching the actual event.
  • +
  • ...
  • +
+
+
+

[!TIP] +If @odata.draft.enabled: true and you need to read the draft then you should use @PrependDraft() decorator.

+
+

(back to top)

+

@Validate<T>({ action, options? }, ...fields: Array<keyof T>)

+

The @Validate decorator is utilized as a method-level decorator, used to validate fields of your entity before reaching your event callback.

+
+

[!TIP] +Think of it as a pre-validation helper.

+
+

The @Validate decorator can be used when you want to validate the Request.data (Request Body) of the @sap/cds - Request object on the following decorators :

+ +

Parameters

+
    +
  • action: Choose from a list of predefined Validators.
  • +
  • options?: [Optional] Additional options for customizing the validation process.
  • +
  • ...fields: Specify the fields of your entity that require validation.
  • +
+

Returns

+

The decorator will raise a Request.reject message if the validation requirements are not met.

+

Validators

+

Below is a list of available validators:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionDescriptionOptions
containsCheck if the string contains the seed.ignoreCase: boolean | undefined; default : false
minOccurrences: number | undefined; default 1
equalsCheck if the string matches the comparison.
matchesCheck if the string matches the pattern.
startsWithChecks if the string starts with the given target string.
endsWithChecks if the string ends with the given target string.
isMailtoURICheck if the string is a Mailto URI format.allow_display_name: If set to true, the validator will also match Display Name <email-address>. Default: false
require_display_name: If set to true, the validator will reject strings without the format Display Name <email-address>. Default: false
allow_utf8_local_part: If set to false, the validator will not allow any non-English UTF8 character in the email address' local part. Default: true
require_tld: If set to false, email addresses without a TLD in their domain will also be matched. Default: true
ignore_max_length: If set to true, the validator will not check for the standard max length of an email. Default: false
allow_ip_domain: If set to true, the validator will allow IP addresses in the host part. Default: false
domain_specific_validation: If set to true, some additional validation will be enabled, e.g., disallowing certain syntactically valid email addresses that are rejected by GMail. Default: false
host_blacklist: An array of strings. If the part of the email after the @ symbol matches any string in the array, validation fails.
host_whitelist: An array of strings. If the part of the email after the @ symbol does not match any string in the array, validation fails.
blacklisted_chars: A string. If any character in the string appears in the name part of the email, validation fails.
isNumericCheck if the string contains only numbers.

no_symbols: If set to true, the validator will reject numeric strings that feature a symbol (e.g., +, -, or .). _Default: false*

locale: An object specifying the locale information for alpha validation.

isTimeCheck if the string is a valid time e.g. 23:01:59.

hourFormat: Specify the hour format to validate. Use 'hour12' for 12-hour format and 'hour24' for 24-hour format. Default: 'hour24'

mode: Specify the time format to validate. Use 'default' for HH:MM format and 'withSeconds' for HH:MM:SS format. Default: 'default'

isLatLongcheck if the string is a valid latitude-longitude coordinate in the format lat,long or lat, long.
isMD5check if the string is a MD5 hash.
isMimeTypecheck if the string matches to a valid [MIME type] format.
isPortcheck if the string is a valid port number.
isSlugcheck if the string is of type slug.
isISBNcheck if the string is an [ISBN] version: "10", "13", 10, 13;
isEmailcheck if the string is an email.Same as isMailtoURI
isAlphaCheck if the string contains only letters (a-zA-Z).
isAlphanumericCheck if the string contains only letters and numbers.
isCreditCardCheck if the string is a credit card.

provider: Specify the credit card provider to validate. Use one of the following: 'amex', 'dinersclub', 'discover', 'jcb', 'mastercard', 'unionpay', 'visa', or '' for any provider. Default: undefined

isCurrencyCheck if the string is a valid currency amount.symbol: The currency symbol to be expected. Default: '$'
require_symbol: If set to true, the validator will expect the currency symbol to be present. Default: false
allow_space_after_symbol: If set to true, the validator will allow a space after the currency symbol. Default: false
symbol_after_digits: If set to true, the currency symbol will be expected after the digits. Default: false
allow_negatives: If set to true, negative currency values will be allowed. Default: true
parens_for_negatives: If set to true, negative currency values will be enclosed in parentheses. Default: false
negative_sign_before_digits: If set to true, the negative sign will be placed before the digits. Default: false
negative_sign_after_digits: If set to true, the negative sign will be placed after the digits. Default: false
allow_negative_sign_placeholder: If set to true, the validator will allow a placeholder - for negative values. Default: false
thousands_separator: The thousands separator to be expected. Default: ','
decimal_separator: The decimal separator to be expected. Default: '.'
allow_decimal: If set to true, decimal values will be allowed. Default: true
require_decimal: If set to true, a decimal value will be required. Default: false
digits_after_decimal: An array of numbers representing the exact number of digits allowed after the decimal point. Default: [2]
allow_space_after_digits: If set to true, the validator will allow a space after the digits. Default: false
isDataURICheck if the string is a data URI format.
isDateCheck if the string is a valid date.format: A string representing the expected date format. Default: undefined
strictMode: If set to true, the validator will reject inputs different from the specified format. Default: false
delimiters: An array of allowed date delimiters. Default: ['/', '-']
isEmptyCheck if the string has a length of zero.ignore_whitespace: If set to true, whitespace characters will be ignored. Default: false
isIBANCheck if a string is an IBAN.whitelist: An array of IBAN countries to whitelist. Default: undefined
blacklist: An array of IBAN countries to blacklist. Default: undefined
isIMEICheck if the string is a valid IMEI.allow_hyphens: If set to true, allows IMEI numbers with hyphens. Default: false
isIPCheck if the string is an IP (version 4 or 6). "4", "6", 4, 6;
isIdentityCardCheck if the string is a valid identity card code.locale: An array of supported locales for identity cards. Acceptable values: "ar-LY", "ar-TN", "ES", "FI", "he-IL", "IN", "IR", "IT", "LK", "NO", "PL", "TH", "zh-CN", "zh-HK", "zh-TW" or 'any'
isInCheck if the string is in an array of allowed values.
isJSONCheck if the string is valid JSON (note: uses JSON.parse).
isJWTCheck if the string is a valid JWT token.
isLengthCheck if the string's length falls in a range.min: The minimum length allowed for the string. Default: 0
max: The maximum length allowed for the string. Default: undefined
isLowercaseCheck if the string is lowercase.
isMobilePhoneCheck if the string is a mobile phone number.strictMode: If set to true, the mobile phone number must be supplied with the country code and must start with +. Default: false
isPassportNumberCheck if the string is a valid passport number relative to a specific country code.
isPostalCodeCheck if the string is a postal code."AD", "AT", "AU", "BE", "BG", "BR", "CA", "CH", "CN", "CZ", "DE", "DK", "DZ", "EE", "ES", "FI", "FR", "GB", "GR", "HR", "HU", "ID", "IE", "IL", "IN", "IR", "IS", "IT", "JP", "KE", "KR", "LI", "LT", "LU", "LV", "MX", "MT", "NL", "NO", "NZ", "PL", "PR", "PT", "RO", "RU", "SA", "SE", "SI", "SK", "TN", "TW", "UA", "US", "ZA", "ZM"
isURLCheck if the string is a URL.protocols: An array of allowed protocols. Default: ['http', 'https', 'ftp']
require_tld: If set to true, URLs must have a top-level domain. Default: true
require_protocol: If set to true, URLs must have a protocol. Default: false
require_host: If set to true, URLs must have a host. Default: true
require_port: If set to true, isURL will check if a port is present in the URL. Default: false
require_valid_protocol: If set to true, URLs must have a valid protocol. Default: true
allow_underscores: If set to true, underscores are allowed in URLs. Default: false
host_whitelist: An array of allowed hosts.
host_blacklist: An array of disallowed hosts.
allow_trailing_dot: If set to true, trailing dots are allowed in URLs. Default: false
allow_protocol_relative_urls: If set to true, protocol-relative URLs are allowed. Default: false
disallow_auth: If set to true, authentication credentials in URLs are disallowed. Default: false
allow_fragments: If set to true, URL fragments are allowed. Default: true
allow_query_components: If set to true, URL query components are allowed. Default: true
validate_length: If set to true, URLs will be validated for length. Default: true
isUUIDCheck if the string is a UUID (version 1, 2, 3, 4, or 5).
isUppercaseCheck if the string is uppercase.
isVATChecks that the string is a valid VAT number.
isWhitelistedChecks if characters appear in the whitelist.
isIntCheck if the string is an integer.min: to check the integer min boundary
max: to check the integer max boundary
allow_leading_zeroes: if false, will disallow integer values with leading zeroes. Default: true
lt: enforce integers being greater than the value provided
gt: enforce integers being less than the value provided
isHexadecimalCheck if the string is a hexadecimal number.
isFloatCheck if the string is a float.min: less or equal
max: greater or equal
gt: greater than
lt: less than
locale: FloatLocale
isHashCheck if the string is a hash of export type algorithm."md4", "md5", "sha1", "sha256", "sha384", "sha512", "ripemd128", "ripemd160", "tiger128", "tiger160", "tiger192", "crc32", "crc32b"
isEANCheck if the string is an EAN (European Article Number).
isDecimalCheck if the string represents a decimal number, such as 0.1, .3, 1.1, 1.00003, 4.0 etc.force_decimal: If set to true, the validator will only return true if the string contains a decimal number. Default: false
decimal_digits: Specifies the number of decimal digits allowed. It can be given as a range like '1,3', a specific value like '3', or min like '1,'. Default: '1,'
locale: The locale to use for number formatting. Default: 'en-US'
isBooleanCheck if a string is a boolean.loose: If set to true, the validator will match a valid boolean string of any case, including ['true', 'True', 'TRUE'], and also 'yes' and 'no'. If set to false, the validator will strictly match ['true', 'false', '0', '1']. Default: false
isBICCheck if a string is a BIC (Bank Identification Code) or SWIFT code.
isBeforeCheck if the string is a date that's before the specified date.
isAfterCheck if the string is a date that's after the specified date.
+

(back to top)

+

Example 1

+
import {
EntityHandler,
Inject,
CDS_DISPATCHER,
Validate,
BeforeCreate,
BeforeUpdate,
OnCreate,
OnUpdate,
Req,
Next,
} from '@dxfrontier/cds-ts-dispatcher';
import type { TypedRequest, Service, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@EntityHandler(MyEntity)
export class CustomerHandler {
// ...
@Inject(CDS_DISPATCHER.SRV) private srv: Service;
// ...
constructor() {}

@BeforeCreate()
@Validate<MyEntity>({ action: 'isLowercase' }, 'comment')
@Validate<MyEntity>({ action: 'endsWith', target: 'N' }, 'description')
private async beforeCreate(@Req() req: TypedRequest<MyEntity>) {
// ...
}

@BeforeUpdate()
@Validate<MyEntity>({ action: 'startsWith', target: 'COMMENT:' }, 'comment')
@Validate<MyEntity>({ action: 'isAlphanumeric' }, 'description')
private async beforeUpdate(@Req() req: TypedRequest<MyEntity>) {
// ...
}

@OnCreate()
@Validate<MyEntity>({ action: 'isAlphanumeric' }, 'book_ID')
private async onCreate(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
return next();
}

@OnUpdate()
@Validate<MyEntity>({ action: 'isLength', options: { min: 5 } }, 'comment')
private async onUpdate(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
return next();
}

// ...
} +
+ +

Example 2: @Validate is used inside of @UnboundActions

+
import { UnboundActions, OnAction, OnFunction, OnEvent, Validate, Next, Req } from '@dxfrontier/cds-ts-dispatcher';
import type { ExposeFields, TypedRequest, ActionRequest, ActionReturn, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { SomeAction, SomeFunction, OrderedBook } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@UnboundActions()
class UnboundActionsHandler {
@OnAction(SomeAction)
@Validate<ExposeFields<typeof SomeAction>>({ action: 'isIn', values: [1, 2] }, 'book', 'quantity')
private async onActionMethod(
@Req() req: ActionRequest<typeof SomeAction>,
@Next() _: NextEvent,
): ActionReturn<typeof SomeAction> {
// ...
}

@OnFunction(SomeFunction)
@Validate<ExposeFields<typeof SomeFunction>>({ action: 'isIn', values: [1, 2] }, 'book', 'quantity')
private async onFunctionMethod(
@Req() req: ActionRequest<typeof SomeFunction>,
@Next() next: NextEvent,
): ActionReturn<typeof SomeFunction> {
// ...
}

@OnEvent(OrderedBook)
@Validate<OrderedBook>({ action: 'isIn', values: [1, 2] }, 'book', 'quantity')
private async onEvent(@Req() req: TypedRequest<OrderedBook>) {
// ...
}
} +
+ +
+

[!IMPORTANT] +To get the fields for

+ +

you must use the ExposeFields type inside of the @Validate decorator.

+
+

(back to top)

+

@FieldsFormatter<T>({ action, options? }, ...fields: Array<keyof T>)

+

The @FieldsFormatter is used as a method level decorator to modify/enhance fields.

+

The @FieldsFormatter decorator can be used on the following decorators :

+
    +
  1. +

    When you want to modify/enhance the results of your callback.

    + +
  2. +
  3. +

    When you want to modify/enhance the Request.data (Request Body) of the @sap/cds - Request object.

    + +
  4. +
+

Parameters

+
    +
  • action: Choose from a list of predefined Formatters.
  • +
  • options?: [Optional] Additional options for customizing the formatter process.
  • +
  • ...fields: Specify the fields of your entity that require formatting.
  • +
+

Formatters

+

Here are the available formatter methods:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionDescription
blacklistRemove characters that appear in the blacklist.
ltrimTrim characters from the left-side of the input.
rtrimTrim characters from the right-side of the input.
trimTrim characters from both sides of the input.
escapeReplace <, >, &, ', " and / with HTML entities.
unescapeReplaces HTML encoded entities with <, >, &, ', " and /.
toLowerConverts string, as a whole, to lower case.
toUpperConverts string, as a whole, to upper case.
upperFirstConverts the first character of the string to upper case.
lowerFirstConverts the first character of the string to lower case.
replaceReplaces matches for pattern in string with replacement.
Note: This method is based on String#replace.
truncateTruncates string if it’s longer than the given maximum string length.
The last characters of the truncated, string are replaced with the omission string which defaults to "…".
snakeCaseSnake case (or snakecase) is the process of writing compound words so that the words are separated with an underscore symbol () instead of a space. The first letter is usually changed to lowercase. Some examples of Snake case would be "foo_bar" or "hello_world".
kebabCaseKebab case, also known as "spinal case" or "hyphen case," involves writing compound words in lowercase letters and separating them with hyphens ("-"). For example, the phrase "user settings panel" would be represented as "user-settings-panel" in the kebab case.
camelCaseThe format indicates the first word starting with either case, then the following words having an initial uppercase letter. CustomerName, LastName ...
customFormatterApply a custom formatter when standard ones do not satisfy your needs.
+

(back to top)

+

Example 1

+
import {
EntityHandler,
Inject,
CDS_DISPATCHER,
BeforeCreate,
BeforeUpdate,
AfterRead,
OnCreate,
OnUpdate,
FieldsFormatter,
Req,
Next,
} from '@dxfrontier/cds-ts-dispatcher';
import type { Service, TypedRequest, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@EntityHandler(MyEntity)
export class CustomerHandler {
// ...
@Inject(CDS_DISPATCHER.SRV) private srv: Service;
// ...
constructor() {}

@BeforeCreate()
@FieldsFormatter<MyEntity>({ action: 'blacklist', charsToRemove: 'le' }, 'format')
private async beforeCreate(@Req() req: TypedRequest<MyEntity>) {
// ...
}

@BeforeUpdate()
@FieldsFormatter<MyEntity>({ action: 'truncate', options: { length: 7 } }, 'format')
private async beforeUpdate(@Req() req: TypedRequest<MyEntity>) {
// ...
}

@AfterRead()
@FieldsFormatter<MyEntity>({ action: 'toUpper' }, 'format')
@FieldsFormatter<MyEntity>(
{
action: 'customFormatter',
callback(req, results) {
if (results) {
// make first item 'toLowerCase' and leave the rest 'toUpper'
results[0].format = results[0].format?.toLowerCase();
}
},
},
'format',
)
private async afterRead(@Results() results: MyEntity[], @Req() req: TypedRequest<MyEntity>) {
// ...
}

@OnCreate()
@FieldsFormatter<MyEntity>({ action: 'ltrim' }, 'language')
private async onCreate(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
return next();
}

@OnUpdate()
@FieldsFormatter<MyEntity>({ action: 'trim' }, 'format')
private async onUpdate(@Req() req: TypedRequest<MyEntity>, @Next() next: NextEvent) {
// ...
return next();
}

// ...
} +
+ +
+

[!TIP] +See best practice for customFormatter

+
+

Example 2 : using @FieldsFormatter decorator inside the @UnboundActions

+
import {
UnboundActions,
OnAction,
OnFunction,
OnEvent,
FieldsFormatter,
Req,
Next,
} from '@dxfrontier/cds-ts-dispatcher';
import type { ActionRequest, ActionReturn, ExposeFields, NextEvent } from '@dxfrontier/cds-ts-dispatcher';

import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@UnboundActions()
class UnboundActionsHandler {
@OnAction(AnAction)
@FieldsFormatter<ExposeFields<typeof AnAction>>({ action: 'toLower' }, 'descr', 'bookName')
private async onActionMethod(
@Req() req: ActionRequest<typeof AnAction>,
@Next() _: NextEvent,
): ActionReturn<typeof AnAction> {
// ...
return next();
}

@OnFunction(AFunction)
@FieldsFormatter<ExposeFields<typeof AFunction>>({ action: 'toUpper' }, 'lastName')
private async onFunctionMethod(
@Req() req: ActionRequest<typeof AFunction>,
@Next() next: NextEvent,
): ActionReturn<typeof AFunction> {
// ...
return next();
}

@OnEvent(AnEvent)
@FieldsFormatter<AnEvent>({ action: 'upperFirst' }, 'name')
private async onEvent(@Req() req: TypedRequest<AnEvent>) {
// ...
}
} +
+ +
+

[!IMPORTANT] +To get the fields for

+ +

you must use the ExposeFields type inside of the @FieldsFormatter decorator.

+
+

(back to top)

+

@ExecutionAllowedForRole(...roles: string[])

+

The @ExecutionAllowedForRole is used as a method level decorator and was designed to enforce role-based access control, ensuring that only users with specific roles are authorized to execute the event.

+

It applies an logical OR on the specified roles, meaning it checks if at least one of the specified roles is assigned to the current request, then the execution will be allowed.

+

Parameters

+
    +
  • ...roles: string[]: Specifies the roles that are permitted to execute the event logic.
  • +
+

Example

+
@AfterRead()
@ExecutionAllowedForRole('Manager', 'User', 'CEO')
private async afterRead(
@Req() req: Request,
@Results() results: BookSale[],
) {
// Method implementation
// Code will be executed only in case of User ( Manager, User and CEO )
} +
+ +

(back to top)

+

@Use(...Middleware[])

+

The @Use decorator is utilized as a method-level decorator and allows you to inject middlewares into your method.

+

Middleware decorators can perform the following tasks:

+
    +
  • Execute any code.
  • +
  • Make changes to the request object.
  • +
  • End the request-response cycle.
  • +
  • Call the next middleware function in the stack.
  • +
  • If the current middleware function does not end the request-response cycle, it must call next() to pass control to the next middleware function. Otherwise, the request will be left hanging.
  • +
+

Parameters

+
    +
  • ...Middleware[]): Middleware classes to be injected.
  • +
+

Example: middleware implementation

+
import type { MiddlewareImpl, NextMiddleware, Request } from '@dxfrontier/cds-ts-dispatcher';

export class MiddlewareClass implements MiddlewareImpl {
public async use(req: Request, next: NextMiddleware) {
console.log('Middleware use method called.');

await next();
}
} +
+ +

Example usage

+
import { EntityHandler, Use, Inject, CDS_DISPATCHER } from '@dxfrontier/cds-ts-dispatcher';
import type { Service, Request } from '@dxfrontier/cds-ts-dispatcher';

import { MiddlewareClass } from 'YOUR_MIDDLEWARE_LOCATION';
import { MyEntity } from 'YOUR_CDS_TYPER_ENTITIES_LOCATION';

@EntityHandler(MyEntity)
export class CustomerHandler {
// ...
@Inject(CDS_DISPATCHER.SRV) private srv: Service;
// ...
constructor() {}

@AfterRead()
@Use(MiddlewareClass)
private async aMethod(@Results() results: MyEntity[], @Req() req: Request) {
// ...
}

// ...
} +
+ +
+

[!TIP]

+
    +
  1. Middlewares when applied with @Use are executed before the normal events.
  2. +
  3. If you need to apply middleware to class you can have a look over class specific @Use decorator .
  4. +
+
+
+

[!WARNING] +If req.reject() is being used inside of middleware this will stop the stack of middlewares, this means that next middleware will not be executed.

+
+
+

[!NOTE] +MyEntity was generated using CDS-Typer and imported in the class.

+
+

(back to top)

+ +
    +
  1. Add mta.yaml to your project using the following command :
  2. +
+
cds add mta
+
+ +
    +
  1. Install npm-run-all package:
  2. +
+
npm install --save-dev npm-run-all
+
+ +
    +
  1. Modify your package.json by adding the following scripts:
  2. +
+
"build:cds": "echo 'STEP 1 : Build CDS' && cds build --production",
"build:ts": "echo 'STEP 2 : Transpile TS => JS' && tsc",
"build:srv:clean:ts": "echo 'Step 3: Clean TS files from srv folder' && find gen/srv/srv -type f -name '*.ts' -delete",

"build:production": "run-s build:cds build:ts build:srv:clean:ts" +
+ +
    +
  1. Modify mta.yaml as follows :
  2. +
+
- builder: custom
+  commands:
+    - npm ci
+    - npm run build:production
+    - npx @cap-js/cds-typer "*" --outputDirectory gen/srv/@cds-models
+
+ +

Steps explained :

+
    +
  • npm ci - Will do a clean install
  • +
  • npm run build:production - will run the package.json script command for CDS build and transpilation of TS to JS and clean the TS files.
  • +
  • npx @cap-js/cds-typer "*" --outputDirectory gen/srv/@cds-models - will make sure the @cds-models are generated.
  • +
+
    +
  1. Install MTA Build tool globally:
  2. +
+
npm i -g mbt
+
+ +
    +
  1. Run command to produce the .mtar file
  2. +
+
mbt build
+
+ +
    +
  1. Deploy your mtar to BTP
  2. +
+
+Can I stack multiple decorators on the same callback ? +

Yes, you can stack multiple decorators.

+

Example 1

+
@AfterRead()
@Use(MiddlewareMethodAfterRead1, MiddlewareMethodAfterRead2)
@FieldsFormatter<MyEntity>({ action: 'blacklist', charsToRemove: 'Mysterious' }, 'title')
private async aMethod(@Results() results: MyEntity[], @Req() req: Request) {
// ...
} +
+ +

Example 2

+
@BeforeRead()
@BeforeCreate()
@BeforeUpdate()
@BeforeDelete()
private async aMethod(@Req() req: TypedRequest<MyEntity>) {
// ..
} +
+ +
+
+Is the sequence of decorators important ? +

Yes, it is important as typescript executes the decorators :

+
    +
  • for Class - from bottom to top
  • +
  • for method - from top to bottom
  • +
+
@SecondClassDecorator() // second executed
@FirstClassDecorator() // first executed
class MyClass {
@FirstDecorator() // first executed
@SecondDecorator() // second executed
myMethod() {
console.log('Method called');
}
} +
+ +
+
+Best practices for @FieldsFormatter - customFormatter +

To have all the custom formatters in one place you can create a new formatters.ts where you will place all custom formatters and use export to make them visible.

+
// formatter.ts
export const customFormatter: Formatters<BookFormat> = {
action: 'customFormatter',
callback(req, results) {
if (results && results.length > 0) {
// make first item 'toLowerCase' and leave the rest 'toUpperCase'
results[0].format = results[0].format?.toLowerCase();
}
},
}; +
+ +

Import the customFormatter in your handler

+
@AfterRead()
@FieldsFormatter<MyEntity>(customFormatter, 'format') // import it here
private async afterRead(@Results() results: MyEntity[], @Req() req: TypedRequest<MyEntity>) {
// ...
} +
+ +
+

[!TIP] +To get all the Formatters typing you can import the Formatters\<T> type where T is the entity of your CDS provided by CDS-Typer

+
+
+

(back to top)

+

Find here a collection of samples for the CDS-TS-Dispatcher-Samples

+

Pull requests are welcome. For major changes, please open an issue first +to discuss what you would like to change.

+

Please make sure to update tests as appropriate.

+

Licence

+

Copyright (c) 2024 DXFrontier

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ +

(back to top)

\ No newline at end of file diff --git a/lib/docs/interfaces/index.ServiceImpl.html b/lib/docs/interfaces/index.ServiceImpl.html new file mode 100644 index 0000000..b851740 --- /dev/null +++ b/lib/docs/interfaces/index.ServiceImpl.html @@ -0,0 +1 @@ +ServiceImpl | @dxfrontier/cds-ts-dispatcher
  • Parameters

    Returns any

\ No newline at end of file diff --git a/lib/docs/modules/constants_constants.html b/lib/docs/modules/constants_constants.html new file mode 100644 index 0000000..c4bade3 --- /dev/null +++ b/lib/docs/modules/constants_constants.html @@ -0,0 +1,3 @@ +constants/constants | @dxfrontier/cds-ts-dispatcher

References

Variables

References

Renames and re-exports CDS_DISPATCHER
\ No newline at end of file diff --git a/lib/docs/modules/constants_internalConstants.html b/lib/docs/modules/constants_internalConstants.html new file mode 100644 index 0000000..0dc584d --- /dev/null +++ b/lib/docs/modules/constants_internalConstants.html @@ -0,0 +1,4 @@ +constants/internalConstants | @dxfrontier/cds-ts-dispatcher

References

Variables

References

Renames and re-exports constants
\ No newline at end of file diff --git a/lib/docs/modules/core_ArgumentMethodProcessor.html b/lib/docs/modules/core_ArgumentMethodProcessor.html new file mode 100644 index 0000000..8782206 --- /dev/null +++ b/lib/docs/modules/core_ArgumentMethodProcessor.html @@ -0,0 +1,2 @@ +core/ArgumentMethodProcessor | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/core_CDSDispatcher.html b/lib/docs/modules/core_CDSDispatcher.html new file mode 100644 index 0000000..e17354f --- /dev/null +++ b/lib/docs/modules/core_CDSDispatcher.html @@ -0,0 +1,2 @@ +core/CDSDispatcher | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/core_MetadataDispatcher.html b/lib/docs/modules/core_MetadataDispatcher.html new file mode 100644 index 0000000..cefc3a8 --- /dev/null +++ b/lib/docs/modules/core_MetadataDispatcher.html @@ -0,0 +1,2 @@ +core/MetadataDispatcher | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/decorators_class.html b/lib/docs/modules/decorators_class.html new file mode 100644 index 0000000..7b91e22 --- /dev/null +++ b/lib/docs/modules/decorators_class.html @@ -0,0 +1,5 @@ +decorators/class | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/decorators_method.html b/lib/docs/modules/decorators_method.html new file mode 100644 index 0000000..d458d76 --- /dev/null +++ b/lib/docs/modules/decorators_method.html @@ -0,0 +1,62 @@ +decorators/method | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/decorators_parameter.html b/lib/docs/modules/decorators_parameter.html new file mode 100644 index 0000000..8c433e8 --- /dev/null +++ b/lib/docs/modules/decorators_parameter.html @@ -0,0 +1,14 @@ +decorators/parameter | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/docs_assets_icons.html b/lib/docs/modules/docs_assets_icons.html new file mode 100644 index 0000000..d746757 --- /dev/null +++ b/lib/docs/modules/docs_assets_icons.html @@ -0,0 +1 @@ +docs/assets/icons | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/docs_assets_main.html b/lib/docs/modules/docs_assets_main.html new file mode 100644 index 0000000..491b1fc --- /dev/null +++ b/lib/docs/modules/docs_assets_main.html @@ -0,0 +1,2 @@ +docs/assets/main | @dxfrontier/cds-ts-dispatcher

Index

Namespaces

\ No newline at end of file diff --git a/lib/docs/modules/docs_assets_main.window.html b/lib/docs/modules/docs_assets_main.window.html new file mode 100644 index 0000000..95490ca --- /dev/null +++ b/lib/docs/modules/docs_assets_main.window.html @@ -0,0 +1,4 @@ +window | @dxfrontier/cds-ts-dispatcher

Index

Variables

\ No newline at end of file diff --git a/lib/docs/modules/docs_assets_navigation.html b/lib/docs/modules/docs_assets_navigation.html new file mode 100644 index 0000000..d6ecd6c --- /dev/null +++ b/lib/docs/modules/docs_assets_navigation.html @@ -0,0 +1,2 @@ +docs/assets/navigation | @dxfrontier/cds-ts-dispatcher

References

References

Re-exports window
\ No newline at end of file diff --git a/lib/docs/modules/docs_assets_search.html b/lib/docs/modules/docs_assets_search.html new file mode 100644 index 0000000..baf3b42 --- /dev/null +++ b/lib/docs/modules/docs_assets_search.html @@ -0,0 +1,2 @@ +docs/assets/search | @dxfrontier/cds-ts-dispatcher

References

References

Re-exports window
\ No newline at end of file diff --git a/lib/docs/modules/index.html b/lib/docs/modules/index.html new file mode 100644 index 0000000..3c48ba5 --- /dev/null +++ b/lib/docs/modules/index.html @@ -0,0 +1,187 @@ +index | @dxfrontier/cds-ts-dispatcher

References

ACTION_EVENTS +ALL_EVENTS +ActionRequest +ActionReturn +AfterAll +AfterAllDraft +AfterCancelDraft +AfterCreate +AfterCreateDraft +AfterDelete +AfterDeleteDraft +AfterEditDraft +AfterNewDraft +AfterRead +AfterReadDraft +AfterReadDraftEachInstance +AfterReadDraftSingleInstance +AfterReadEachInstance +AfterReadSingleInstance +AfterSaveDraft +AfterUpdate +AfterUpdateDraft +BeforeAll +BeforeAllDraft +BeforeCancelDraft +BeforeCreate +BeforeCreateDraft +BeforeDelete +BeforeDeleteDraft +BeforeEditDraft +BeforeNewDraft +BeforeRead +BeforeReadDraft +BeforeSaveDraft +BeforeUpdate +BeforeUpdateDraft +BlacklistAction +CDSDispatcher +CDSTyperEntity +CDS_DISPATCHER +CRUD_EVENTS +CamelCase +CdsEvent +Contains +Custom +DRAFT_EVENTS +EACH_INSTANCE +ERROR_EVENT +EVENTS +EndsWith +EntityHandler +Error +Escape +ExecutionAllowedForRole +ExposeFields +FUNCTION_EVENTS +FieldsFormatter +Formatters +GetQuery +GetQueryType +GetRequest +IsAfter +IsAlpha +IsAlphaNumeric +IsBIC +IsBefore +IsBoolean +IsColumnSupplied +IsCreditCard +IsCurrency +IsDataURI +IsDateValidator +IsDecimal +IsEAN +IsEmailValidator +IsEmpty +IsEquals +IsFloat +IsHash +IsHexadecimal +IsIBAN +IsIMEI +IsIP +IsISBN +IsIdentityCard +IsIn +IsInt +IsJSON +IsJWT +IsLatLong +IsLength +IsLowercase +IsMD5 +IsMailtoURI +IsMimeType +IsNumeric +IsPassportNumber +IsPort +IsPostalCode +IsPresent +IsRole +IsSlug +IsTime +IsURL +IsUUID +IsUppercase +IsVAT +IsWhitelisted +Jwt +KebabCase +LTrim +LodashFormatters +LodashValidators +LowerFirst +Matches +MiddlewareImpl +Next +NextEvent +NextMiddleware +ON_EVENT +OnAction +OnAll +OnAllDraft +OnBoundAction +OnBoundActionDraft +OnBoundFunction +OnBoundFunctionDraft +OnCancelDraft +OnCreate +OnCreateDraft +OnDelete +OnDeleteDraft +OnEditDraft +OnError +OnEvent +OnFunction +OnNewDraft +OnRead +OnReadDraft +OnSaveDraft +OnUpdate +OnUpdateDraft +OnlyEntityStrings +Prepend +PrependDraft +RTrim +Replace +Repository +Req +RequestResponse +RequestType +Res +Result +Results +SRV +ServiceLogic +SingleInstanceCapable +SingleInstanceSwitch +SnakeCase +StartsWith +ToLower +ToUpper +Trim +Truncate +UnboundActions +Unescape +UpperFirst +Use +Validate +ValidatorBase +ValidatorField +ValidatorFormatters +Validators +ValidatorsWithCountryCode +ValidatorsWithLocale +ValidatorsWithLocaleAndOptions +ValidatorsWithMultipleOptions +ValidatorsWithNoOptions +ValidatorsWithOptions +isMobilePhoneValidator +

Classes

Interfaces

Type Aliases

Functions

References

Re-exports ACTION_EVENTS
Re-exports ALL_EVENTS
Re-exports ActionRequest
Re-exports ActionReturn
Re-exports AfterAll
Re-exports AfterAllDraft
Re-exports AfterCancelDraft
Re-exports AfterCreate
Re-exports AfterCreateDraft
Re-exports AfterDelete
Re-exports AfterDeleteDraft
Re-exports AfterEditDraft
Re-exports AfterNewDraft
Re-exports AfterRead
Re-exports AfterReadDraft
Re-exports AfterReadDraftEachInstance
Re-exports AfterReadDraftSingleInstance
Re-exports AfterReadEachInstance
Re-exports AfterReadSingleInstance
Re-exports AfterSaveDraft
Re-exports AfterUpdate
Re-exports AfterUpdateDraft
Re-exports BeforeAll
Re-exports BeforeAllDraft
Re-exports BeforeCancelDraft
Re-exports BeforeCreate
Re-exports BeforeCreateDraft
Re-exports BeforeDelete
Re-exports BeforeDeleteDraft
Re-exports BeforeEditDraft
Re-exports BeforeNewDraft
Re-exports BeforeRead
Re-exports BeforeReadDraft
Re-exports BeforeSaveDraft
Re-exports BeforeUpdate
Re-exports BeforeUpdateDraft
Re-exports BlacklistAction
Re-exports CDSDispatcher
Re-exports CDSTyperEntity
Re-exports CDS_DISPATCHER
Re-exports CRUD_EVENTS
Re-exports CamelCase
Re-exports CdsEvent
Re-exports Contains
Re-exports Custom
Re-exports DRAFT_EVENTS
Re-exports EACH_INSTANCE
Re-exports ERROR_EVENT
Re-exports EVENTS
Re-exports EndsWith
Re-exports EntityHandler
Re-exports Error
Re-exports Escape
Re-exports ExecutionAllowedForRole
Re-exports ExposeFields
Re-exports FUNCTION_EVENTS
Re-exports FieldsFormatter
Re-exports Formatters
Re-exports GetQuery
Re-exports GetQueryType
Re-exports GetRequest
Re-exports IsAfter
Re-exports IsAlpha
Re-exports IsAlphaNumeric
Re-exports IsBIC
Re-exports IsBefore
Re-exports IsBoolean
Re-exports IsColumnSupplied
Re-exports IsCreditCard
Re-exports IsCurrency
Re-exports IsDataURI
Re-exports IsDateValidator
Re-exports IsDecimal
Re-exports IsEAN
Re-exports IsEmailValidator
Re-exports IsEmpty
Re-exports IsEquals
Re-exports IsFloat
Re-exports IsHash
Re-exports IsHexadecimal
Re-exports IsIBAN
Re-exports IsIMEI
Re-exports IsIP
Re-exports IsISBN
Re-exports IsIdentityCard
Re-exports IsIn
Re-exports IsInt
Re-exports IsJSON
Re-exports IsJWT
Re-exports IsLatLong
Re-exports IsLength
Re-exports IsLowercase
Re-exports IsMD5
Re-exports IsMailtoURI
Re-exports IsMimeType
Re-exports IsNumeric
Re-exports IsPassportNumber
Re-exports IsPort
Re-exports IsPostalCode
Re-exports IsPresent
Re-exports IsRole
Re-exports IsSlug
Re-exports IsTime
Re-exports IsURL
Re-exports IsUUID
Re-exports IsUppercase
Re-exports IsVAT
Re-exports IsWhitelisted
Re-exports Jwt
Re-exports KebabCase
Re-exports LTrim
Re-exports LodashFormatters
Re-exports LodashValidators
Re-exports LowerFirst
Re-exports Matches
Re-exports MiddlewareImpl
Re-exports Next
Re-exports NextEvent
Re-exports NextMiddleware
Re-exports ON_EVENT
Re-exports OnAction
Re-exports OnAll
Re-exports OnAllDraft
Re-exports OnBoundAction
Re-exports OnBoundActionDraft
Re-exports OnBoundFunction
Re-exports OnBoundFunctionDraft
Re-exports OnCancelDraft
Re-exports OnCreate
Re-exports OnCreateDraft
Re-exports OnDelete
Re-exports OnDeleteDraft
Re-exports OnEditDraft
Re-exports OnError
Re-exports OnEvent
Re-exports OnFunction
Re-exports OnNewDraft
Re-exports OnRead
Re-exports OnReadDraft
Re-exports OnSaveDraft
Re-exports OnUpdate
Re-exports OnUpdateDraft
Re-exports OnlyEntityStrings
Re-exports Prepend
Re-exports PrependDraft
Re-exports RTrim
Re-exports Replace
Re-exports Repository
Re-exports Req
Re-exports RequestResponse
Re-exports RequestType
Re-exports Res
Re-exports Result
Re-exports Results
Re-exports SRV
Re-exports ServiceLogic
Re-exports SingleInstanceCapable
Re-exports SingleInstanceSwitch
Re-exports SnakeCase
Re-exports StartsWith
Re-exports ToLower
Re-exports ToUpper
Re-exports Trim
Re-exports Truncate
Re-exports UnboundActions
Re-exports Unescape
Re-exports UpperFirst
Re-exports Use
Re-exports Validate
Re-exports ValidatorBase
Re-exports ValidatorField
Re-exports ValidatorFormatters
Re-exports Validators
Re-exports ValidatorsWithCountryCode
Re-exports ValidatorsWithLocale
Re-exports ValidatorsWithLocaleAndOptions
Re-exports ValidatorsWithMultipleOptions
Re-exports ValidatorsWithNoOptions
Re-exports ValidatorsWithOptions
Re-exports isMobilePhoneValidator
\ No newline at end of file diff --git a/lib/docs/modules/types_enum.html b/lib/docs/modules/types_enum.html new file mode 100644 index 0000000..b5b8181 --- /dev/null +++ b/lib/docs/modules/types_enum.html @@ -0,0 +1,2 @@ +types/enum | @dxfrontier/cds-ts-dispatcher

Index

Enumerations

\ No newline at end of file diff --git a/lib/docs/modules/types_formatter.html b/lib/docs/modules/types_formatter.html new file mode 100644 index 0000000..703b25a --- /dev/null +++ b/lib/docs/modules/types_formatter.html @@ -0,0 +1,20 @@ +types/formatter | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/types_internalTypes.html b/lib/docs/modules/types_internalTypes.html new file mode 100644 index 0000000..381a7fb --- /dev/null +++ b/lib/docs/modules/types_internalTypes.html @@ -0,0 +1,31 @@ +types/internalTypes | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/types_types.html b/lib/docs/modules/types_types.html new file mode 100644 index 0000000..33a686e --- /dev/null +++ b/lib/docs/modules/types_types.html @@ -0,0 +1,26 @@ +types/types | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/types_validator.html b/lib/docs/modules/types_validator.html new file mode 100644 index 0000000..457d686 --- /dev/null +++ b/lib/docs/modules/types_validator.html @@ -0,0 +1,61 @@ +types/validator | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/util_decorators_decoratorsUtil.html b/lib/docs/modules/util_decorators_decoratorsUtil.html new file mode 100644 index 0000000..a9e7336 --- /dev/null +++ b/lib/docs/modules/util_decorators_decoratorsUtil.html @@ -0,0 +1,2 @@ +util/decorators/decoratorsUtil | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/util_formatter_formatterUtil.html b/lib/docs/modules/util_formatter_formatterUtil.html new file mode 100644 index 0000000..7df34f2 --- /dev/null +++ b/lib/docs/modules/util_formatter_formatterUtil.html @@ -0,0 +1,2 @@ +util/formatter/formatterUtil | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/util_middleware_MiddlewareEntityRegistry.html b/lib/docs/modules/util_middleware_MiddlewareEntityRegistry.html new file mode 100644 index 0000000..0f9bbc8 --- /dev/null +++ b/lib/docs/modules/util_middleware_MiddlewareEntityRegistry.html @@ -0,0 +1,2 @@ +util/middleware/MiddlewareEntityRegistry | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/util_middleware_middlewareUtil.html b/lib/docs/modules/util_middleware_middlewareUtil.html new file mode 100644 index 0000000..dcefcb8 --- /dev/null +++ b/lib/docs/modules/util_middleware_middlewareUtil.html @@ -0,0 +1,2 @@ +util/middleware/middlewareUtil | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/util_parameter_parameterUtil.html b/lib/docs/modules/util_parameter_parameterUtil.html new file mode 100644 index 0000000..8e3cda2 --- /dev/null +++ b/lib/docs/modules/util_parameter_parameterUtil.html @@ -0,0 +1,2 @@ +util/parameter/parameterUtil | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/modules/util_util.html b/lib/docs/modules/util_util.html new file mode 100644 index 0000000..4e68740 --- /dev/null +++ b/lib/docs/modules/util_util.html @@ -0,0 +1,2 @@ +util/util | @dxfrontier/cds-ts-dispatcher

Index

Variables

\ No newline at end of file diff --git a/lib/docs/modules/util_validation_validatorUtil.html b/lib/docs/modules/util_validation_validatorUtil.html new file mode 100644 index 0000000..97a67b2 --- /dev/null +++ b/lib/docs/modules/util_validation_validatorUtil.html @@ -0,0 +1,2 @@ +util/validation/validatorUtil | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/index.CdsFunction.html b/lib/docs/types/index.CdsFunction.html new file mode 100644 index 0000000..eb8a118 --- /dev/null +++ b/lib/docs/types/index.CdsFunction.html @@ -0,0 +1 @@ +CdsFunction | @dxfrontier/cds-ts-dispatcher
CdsFunction: {
    __parameters: object;
    __returns: any;
    (...args: any[]): any;
}
\ No newline at end of file diff --git a/lib/docs/types/index.TypedRequest.html b/lib/docs/types/index.TypedRequest.html new file mode 100644 index 0000000..4b3917e --- /dev/null +++ b/lib/docs/types/index.TypedRequest.html @@ -0,0 +1 @@ +TypedRequest | @dxfrontier/cds-ts-dispatcher
TypedRequest<T>: Omit<Request, "data"> & {
    data: T;
}

Type Parameters

  • T
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.BlacklistAction.html b/lib/docs/types/types_formatter.BlacklistAction.html new file mode 100644 index 0000000..26b7b75 --- /dev/null +++ b/lib/docs/types/types_formatter.BlacklistAction.html @@ -0,0 +1,3 @@ +BlacklistAction | @dxfrontier/cds-ts-dispatcher
BlacklistAction: {
    action: "blacklist";
    charsToRemove: string;
}

Type declaration

  • action: "blacklist"

    Remove characters that appear in the blacklist.

    +
  • charsToRemove: string

    The characters are used in a RegExp and so you will need to escape some chars, e.g. blacklist(input, '\\[\\]').

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.CamelCase.html b/lib/docs/types/types_formatter.CamelCase.html new file mode 100644 index 0000000..17942e5 --- /dev/null +++ b/lib/docs/types/types_formatter.CamelCase.html @@ -0,0 +1,2 @@ +CamelCase | @dxfrontier/cds-ts-dispatcher
CamelCase: {
    action: "camelCase";
}

Type declaration

  • action: "camelCase"

    Converts string to camel case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Custom.html b/lib/docs/types/types_formatter.Custom.html new file mode 100644 index 0000000..e12c95b --- /dev/null +++ b/lib/docs/types/types_formatter.Custom.html @@ -0,0 +1 @@ +Custom | @dxfrontier/cds-ts-dispatcher
Custom<T>: {
    action: "customFormatter";
    callback: ((req: TypedRequest<T>, results?: T[]) => Promise<void | Error> | void | Error);
}

Type Parameters

  • T
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Escape.html b/lib/docs/types/types_formatter.Escape.html new file mode 100644 index 0000000..80f5ece --- /dev/null +++ b/lib/docs/types/types_formatter.Escape.html @@ -0,0 +1,2 @@ +Escape | @dxfrontier/cds-ts-dispatcher
Escape: {
    action: "escape";
}

Type declaration

  • action: "escape"

    Replace <, >, &, ', " and / with HTML entities.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Formatters.html b/lib/docs/types/types_formatter.Formatters.html new file mode 100644 index 0000000..ec6a0ed --- /dev/null +++ b/lib/docs/types/types_formatter.Formatters.html @@ -0,0 +1 @@ +Formatters | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.KebabCase.html b/lib/docs/types/types_formatter.KebabCase.html new file mode 100644 index 0000000..b42e41e --- /dev/null +++ b/lib/docs/types/types_formatter.KebabCase.html @@ -0,0 +1,2 @@ +KebabCase | @dxfrontier/cds-ts-dispatcher
KebabCase: {
    action: "kebabCase";
}

Type declaration

  • action: "kebabCase"

    Converts string to kebab case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.LTrim.html b/lib/docs/types/types_formatter.LTrim.html new file mode 100644 index 0000000..29b1e06 --- /dev/null +++ b/lib/docs/types/types_formatter.LTrim.html @@ -0,0 +1,3 @@ +LTrim | @dxfrontier/cds-ts-dispatcher
LTrim: {
    action: "ltrim";
    chars?: string;
}

Type declaration

  • action: "ltrim"

    Trim characters from the left-side of the input.

    +
  • Optionalchars?: string

    characters (defaults to whitespace)

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.LodashFormatters.html b/lib/docs/types/types_formatter.LodashFormatters.html new file mode 100644 index 0000000..72fe087 --- /dev/null +++ b/lib/docs/types/types_formatter.LodashFormatters.html @@ -0,0 +1 @@ +LodashFormatters | @dxfrontier/cds-ts-dispatcher
LodashFormatters:
    | SnakeCase
    | KebabCase
    | CamelCase
    | ToLower
    | ToUpper
    | UpperFirst
    | LowerFirst
    | Truncate
    | Replace
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.LowerFirst.html b/lib/docs/types/types_formatter.LowerFirst.html new file mode 100644 index 0000000..b12aa61 --- /dev/null +++ b/lib/docs/types/types_formatter.LowerFirst.html @@ -0,0 +1,2 @@ +LowerFirst | @dxfrontier/cds-ts-dispatcher
LowerFirst: {
    action: "lowerFirst";
}

Type declaration

  • action: "lowerFirst"

    Converts the first character of string to lower case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.RTrim.html b/lib/docs/types/types_formatter.RTrim.html new file mode 100644 index 0000000..2ee989f --- /dev/null +++ b/lib/docs/types/types_formatter.RTrim.html @@ -0,0 +1,3 @@ +RTrim | @dxfrontier/cds-ts-dispatcher
RTrim: {
    action: "rtrim";
    chars?: string;
}

Type declaration

  • action: "rtrim"

    Trim characters from the right-side of the input.

    +
  • Optionalchars?: string

    characters (defaults to whitespace)

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Replace.html b/lib/docs/types/types_formatter.Replace.html new file mode 100644 index 0000000..474a23e --- /dev/null +++ b/lib/docs/types/types_formatter.Replace.html @@ -0,0 +1,4 @@ +Replace | @dxfrontier/cds-ts-dispatcher
Replace: {
    action: "replace";
    pattern: RegExp | string;
    replacement: ReplaceFunction | string;
}

Type declaration

  • action: "replace"

    Replaces matches for pattern in string with replacement.

    +

    Note: This method is based on String#replace.

    +

    Returns the modified string.

    +
  • pattern: RegExp | string
  • replacement: ReplaceFunction | string
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.SnakeCase.html b/lib/docs/types/types_formatter.SnakeCase.html new file mode 100644 index 0000000..ad3505f --- /dev/null +++ b/lib/docs/types/types_formatter.SnakeCase.html @@ -0,0 +1,2 @@ +SnakeCase | @dxfrontier/cds-ts-dispatcher
SnakeCase: {
    action: "snakeCase";
}

Type declaration

  • action: "snakeCase"

    Converts string to kebab case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.ToLower.html b/lib/docs/types/types_formatter.ToLower.html new file mode 100644 index 0000000..bce6fb1 --- /dev/null +++ b/lib/docs/types/types_formatter.ToLower.html @@ -0,0 +1,2 @@ +ToLower | @dxfrontier/cds-ts-dispatcher
ToLower: {
    action: "toLower";
}

Type declaration

  • action: "toLower"

    Converts string, as a whole, to lower case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.ToUpper.html b/lib/docs/types/types_formatter.ToUpper.html new file mode 100644 index 0000000..2e4fb87 --- /dev/null +++ b/lib/docs/types/types_formatter.ToUpper.html @@ -0,0 +1,2 @@ +ToUpper | @dxfrontier/cds-ts-dispatcher
ToUpper: {
    action: "toUpper";
}

Type declaration

  • action: "toUpper"

    Converts string, as a whole, to upper case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Trim.html b/lib/docs/types/types_formatter.Trim.html new file mode 100644 index 0000000..b5e3963 --- /dev/null +++ b/lib/docs/types/types_formatter.Trim.html @@ -0,0 +1,3 @@ +Trim | @dxfrontier/cds-ts-dispatcher
Trim: {
    action: "trim";
    chars?: string;
}

Type declaration

  • action: "trim"

    Trim characters from both sides of the input.

    +
  • Optionalchars?: string

    characters (defaults to whitespace)

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Truncate.html b/lib/docs/types/types_formatter.Truncate.html new file mode 100644 index 0000000..80e6e29 --- /dev/null +++ b/lib/docs/types/types_formatter.Truncate.html @@ -0,0 +1,6 @@ +Truncate | @dxfrontier/cds-ts-dispatcher
Truncate: {
    action: "truncate";
    options?: TruncateOptions;
}

Type declaration

  • action: "truncate"

    Truncates string if it’s longer than the given maximum string length. The last characters of the truncated +string are replaced with the omission string which defaults to "…".

    +

    The string to truncate.

    +

    The options object or maximum string length.

    +

    Returns the truncated string.

    +
  • Optionaloptions?: TruncateOptions
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.Unescape.html b/lib/docs/types/types_formatter.Unescape.html new file mode 100644 index 0000000..3815307 --- /dev/null +++ b/lib/docs/types/types_formatter.Unescape.html @@ -0,0 +1,2 @@ +Unescape | @dxfrontier/cds-ts-dispatcher
Unescape: {
    action: "unescape";
}

Type declaration

  • action: "unescape"

    Replaces HTML encoded entities with <, >, &, ', " and /.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.UpperFirst.html b/lib/docs/types/types_formatter.UpperFirst.html new file mode 100644 index 0000000..9024407 --- /dev/null +++ b/lib/docs/types/types_formatter.UpperFirst.html @@ -0,0 +1,2 @@ +UpperFirst | @dxfrontier/cds-ts-dispatcher
UpperFirst: {
    action: "upperFirst";
}

Type declaration

  • action: "upperFirst"

    Converts the first character of string to upper case.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_formatter.ValidatorFormatters.html b/lib/docs/types/types_formatter.ValidatorFormatters.html new file mode 100644 index 0000000..ae24442 --- /dev/null +++ b/lib/docs/types/types_formatter.ValidatorFormatters.html @@ -0,0 +1 @@ +ValidatorFormatters | @dxfrontier/cds-ts-dispatcher
ValidatorFormatters:
    | BlacklistAction
    | LTrim
    | RTrim
    | Trim
    | Unescape
    | Escape
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.BaseHandler.html b/lib/docs/types/types_internalTypes.BaseHandler.html new file mode 100644 index 0000000..a4b4706 --- /dev/null +++ b/lib/docs/types/types_internalTypes.BaseHandler.html @@ -0,0 +1 @@ +BaseHandler | @dxfrontier/cds-ts-dispatcher
BaseHandler: {
    callback: RequestType;
    eventKind: EventKind;
    handlerType: HandlerType;
    isDraft: boolean;
} & (
    | DefaultHandlers
    | OnHandler
    | EventHandler
    | PrependHandler)
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.CRUDQueryKeys.html b/lib/docs/types/types_internalTypes.CRUDQueryKeys.html new file mode 100644 index 0000000..d6658c8 --- /dev/null +++ b/lib/docs/types/types_internalTypes.CRUDQueryKeys.html @@ -0,0 +1 @@ +CRUDQueryKeys | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.CustomRequest.html b/lib/docs/types/types_internalTypes.CustomRequest.html new file mode 100644 index 0000000..c962bd4 --- /dev/null +++ b/lib/docs/types/types_internalTypes.CustomRequest.html @@ -0,0 +1 @@ +CustomRequest | @dxfrontier/cds-ts-dispatcher
CustomRequest: Exclude<keyof Request, ExcludedRequestMethods>
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.DefaultHandlers.html b/lib/docs/types/types_internalTypes.DefaultHandlers.html new file mode 100644 index 0000000..064a16c --- /dev/null +++ b/lib/docs/types/types_internalTypes.DefaultHandlers.html @@ -0,0 +1 @@ +DefaultHandlers | @dxfrontier/cds-ts-dispatcher
DefaultHandlers: {
    event: CRUD_EVENTS | DRAFT_EVENTS | ERROR_EVENT;
    type: "DEFAULT";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.EventHandler.html b/lib/docs/types/types_internalTypes.EventHandler.html new file mode 100644 index 0000000..4afcf18 --- /dev/null +++ b/lib/docs/types/types_internalTypes.EventHandler.html @@ -0,0 +1 @@ +EventHandler | @dxfrontier/cds-ts-dispatcher
EventHandler: {
    event: ON_EVENT;
    eventName: string;
    type: "EVENT";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.EventKind.html b/lib/docs/types/types_internalTypes.EventKind.html new file mode 100644 index 0000000..261940e --- /dev/null +++ b/lib/docs/types/types_internalTypes.EventKind.html @@ -0,0 +1 @@ +EventKind | @dxfrontier/cds-ts-dispatcher
EventKind:
    | "BEFORE"
    | "AFTER"
    | "AFTER_SINGLE"
    | "ON"
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.ExtendedRequestWithResults.html b/lib/docs/types/types_internalTypes.ExtendedRequestWithResults.html new file mode 100644 index 0000000..abecee5 --- /dev/null +++ b/lib/docs/types/types_internalTypes.ExtendedRequestWithResults.html @@ -0,0 +1 @@ +ExtendedRequestWithResults | @dxfrontier/cds-ts-dispatcher
ExtendedRequestWithResults: Request & {
    results: any;
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.MapPrepend.html b/lib/docs/types/types_internalTypes.MapPrepend.html new file mode 100644 index 0000000..a6d644b --- /dev/null +++ b/lib/docs/types/types_internalTypes.MapPrepend.html @@ -0,0 +1 @@ +MapPrepend | @dxfrontier/cds-ts-dispatcher
MapPrepend: {
    actionName?: CdsFunction;
    event: EVENTS;
    eventKind: EventKind;
    eventName?: CdsEvent;
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.MetadataFields.html b/lib/docs/types/types_internalTypes.MetadataFields.html new file mode 100644 index 0000000..a7ba3ea --- /dev/null +++ b/lib/docs/types/types_internalTypes.MetadataFields.html @@ -0,0 +1 @@ +MetadataFields | @dxfrontier/cds-ts-dispatcher
MetadataFields: {
    parameterIndex: number;
} & (
    | QueryProperties<QueryKeys>
    | RequestProperties
    | OnlyParameterIndexDecorator
    | IsColumnValueSupplied
    | IsRoleProperties)
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.MetadataInputs.html b/lib/docs/types/types_internalTypes.MetadataInputs.html new file mode 100644 index 0000000..91ba035 --- /dev/null +++ b/lib/docs/types/types_internalTypes.MetadataInputs.html @@ -0,0 +1 @@ +MetadataInputs | @dxfrontier/cds-ts-dispatcher
MetadataInputs: {
    metadataFields: MetadataFields;
    metadataKey: keyof typeof PARAMETER;
    propertyKey: string | symbol;
    target: object;
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.NonEmptyArray.html b/lib/docs/types/types_internalTypes.NonEmptyArray.html new file mode 100644 index 0000000..aa047cd --- /dev/null +++ b/lib/docs/types/types_internalTypes.NonEmptyArray.html @@ -0,0 +1 @@ +NonEmptyArray | @dxfrontier/cds-ts-dispatcher
NonEmptyArray<T>: [T, ...T[]]

Type Parameters

  • T
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.OnHandler.html b/lib/docs/types/types_internalTypes.OnHandler.html new file mode 100644 index 0000000..96ded2d --- /dev/null +++ b/lib/docs/types/types_internalTypes.OnHandler.html @@ -0,0 +1 @@ +OnHandler | @dxfrontier/cds-ts-dispatcher
OnHandler: {
    actionName: CdsFunction;
    event: ACTION_EVENTS | FUNCTION_EVENTS;
    type: "ACTION_FUNCTION";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PickQueryPropsByKey.html b/lib/docs/types/types_internalTypes.PickQueryPropsByKey.html new file mode 100644 index 0000000..cfb8f31 --- /dev/null +++ b/lib/docs/types/types_internalTypes.PickQueryPropsByKey.html @@ -0,0 +1 @@ +PickQueryPropsByKey | @dxfrontier/cds-ts-dispatcher
PickQueryPropsByKey<Key>: Key extends QueryInsertProps["type"]
    ? QueryInsertProps["props"]
    : Key extends QuerySelectProps["type"]
        ? QuerySelectProps["props"]
        : Key extends QueryUpdateProps["type"]
            ? QueryUpdateProps["props"]
            : Key extends QueryDeleteProps["type"]
                ? QueryDeleteProps["props"]
                : Key extends QueryUpsertProps["type"]
                    ? QueryUpsertProps["props"]
                    : never

Type Parameters

\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependAction.html b/lib/docs/types/types_internalTypes.PrependAction.html new file mode 100644 index 0000000..e13914a --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependAction.html @@ -0,0 +1 @@ +PrependAction | @dxfrontier/cds-ts-dispatcher
PrependAction: {
    actionName: CdsFunction;
    eventDecorator:
        | "OnAction"
        | "OnFunction"
        | "OnBoundAction"
        | "OnBoundFunction";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependBase.html b/lib/docs/types/types_internalTypes.PrependBase.html new file mode 100644 index 0000000..0f51387 --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependBase.html @@ -0,0 +1 @@ +PrependBase | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependBaseDraft.html b/lib/docs/types/types_internalTypes.PrependBaseDraft.html new file mode 100644 index 0000000..561b3f0 --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependBaseDraft.html @@ -0,0 +1 @@ +PrependBaseDraft | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependDecorators.html b/lib/docs/types/types_internalTypes.PrependDecorators.html new file mode 100644 index 0000000..18b7c1e --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependDecorators.html @@ -0,0 +1 @@ +PrependDecorators | @dxfrontier/cds-ts-dispatcher
PrependDecorators: {
    eventDecorator:
        | "AfterCreate"
        | "AfterRead"
        | "AfterReadSingleInstance"
        | "AfterReadEachInstance"
        | "AfterUpdate"
        | "AfterDelete"
        | "AfterAll"
        | "BeforeCreate"
        | "BeforeRead"
        | "BeforeUpdate"
        | "BeforeDelete"
        | "BeforeAll"
        | "OnCreate"
        | "OnRead"
        | "OnUpdate"
        | "OnDelete"
        | "OnAll"
        | "OnError";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependDraftAction.html b/lib/docs/types/types_internalTypes.PrependDraftAction.html new file mode 100644 index 0000000..fb2a51f --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependDraftAction.html @@ -0,0 +1 @@ +PrependDraftAction | @dxfrontier/cds-ts-dispatcher
PrependDraftAction: {
    actionName: CdsFunction;
    eventDecorator: "OnBoundActionDraft" | "OnBoundFunctionDraft";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependDraftDecorators.html b/lib/docs/types/types_internalTypes.PrependDraftDecorators.html new file mode 100644 index 0000000..836e389 --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependDraftDecorators.html @@ -0,0 +1 @@ +PrependDraftDecorators | @dxfrontier/cds-ts-dispatcher
PrependDraftDecorators: {
    eventDecorator:
        | "AfterCreateDraft"
        | "AfterReadDraft"
        | "AfterReadDraftSingleInstance"
        | "AfterReadDraftEachInstance"
        | "AfterUpdateDraft"
        | "AfterDeleteDraft"
        | "AfterNewDraft"
        | "AfterCancelDraft"
        | "AfterEditDraft"
        | "AfterSaveDraft"
        | "BeforeCreateDraft"
        | "BeforeReadDraft"
        | "BeforeUpdateDraft"
        | "BeforeDeleteDraft"
        | "BeforeNewDraft"
        | "BeforeCancelDraft"
        | "BeforeEditDraft"
        | "BeforeSaveDraft"
        | "OnCreateDraft"
        | "OnReadDraft"
        | "OnUpdateDraft"
        | "OnDeleteDraft"
        | "OnNewDraft"
        | "OnCancelDraft"
        | "OnEditDraft"
        | "OnSaveDraft";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependEvent.html b/lib/docs/types/types_internalTypes.PrependEvent.html new file mode 100644 index 0000000..163e6a1 --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependEvent.html @@ -0,0 +1 @@ +PrependEvent | @dxfrontier/cds-ts-dispatcher
PrependEvent: {
    eventDecorator: "OnEvent";
    eventName: CdsEvent;
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.PrependHandler.html b/lib/docs/types/types_internalTypes.PrependHandler.html new file mode 100644 index 0000000..466c5a6 --- /dev/null +++ b/lib/docs/types/types_internalTypes.PrependHandler.html @@ -0,0 +1 @@ +PrependHandler | @dxfrontier/cds-ts-dispatcher
PrependHandler: {
    event: EVENTS;
    options: {
        actionName?: CdsFunction;
        eventName?: string;
    };
    type: "PREPEND";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.QueryDeleteProps.html b/lib/docs/types/types_internalTypes.QueryDeleteProps.html new file mode 100644 index 0000000..784a380 --- /dev/null +++ b/lib/docs/types/types_internalTypes.QueryDeleteProps.html @@ -0,0 +1 @@ +QueryDeleteProps | @dxfrontier/cds-ts-dispatcher
QueryDeleteProps: {
    props: keyof DELETE<any>["DELETE"];
    type: "DELETE";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.QueryInsertProps.html b/lib/docs/types/types_internalTypes.QueryInsertProps.html new file mode 100644 index 0000000..9d903fc --- /dev/null +++ b/lib/docs/types/types_internalTypes.QueryInsertProps.html @@ -0,0 +1 @@ +QueryInsertProps | @dxfrontier/cds-ts-dispatcher
QueryInsertProps: {
    props: keyof INSERT<any>["INSERT"];
    type: "INSERT";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.QueryKeys.html b/lib/docs/types/types_internalTypes.QueryKeys.html new file mode 100644 index 0000000..110fad2 --- /dev/null +++ b/lib/docs/types/types_internalTypes.QueryKeys.html @@ -0,0 +1 @@ +QueryKeys | @dxfrontier/cds-ts-dispatcher
QueryKeys: Exclude<keyof Query | ExtraRequestKey, "DROP" | "CREATE">
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.QuerySelectProps.html b/lib/docs/types/types_internalTypes.QuerySelectProps.html new file mode 100644 index 0000000..e8df74b --- /dev/null +++ b/lib/docs/types/types_internalTypes.QuerySelectProps.html @@ -0,0 +1 @@ +QuerySelectProps | @dxfrontier/cds-ts-dispatcher
QuerySelectProps: {
    props: keyof Omit<SELECT<any>["SELECT"], ExcludedSelectProperties> | ExtraProperties;
    type: "SELECT";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.QueryUpdateProps.html b/lib/docs/types/types_internalTypes.QueryUpdateProps.html new file mode 100644 index 0000000..37557fa --- /dev/null +++ b/lib/docs/types/types_internalTypes.QueryUpdateProps.html @@ -0,0 +1 @@ +QueryUpdateProps | @dxfrontier/cds-ts-dispatcher
QueryUpdateProps: {
    props: keyof UPDATE<any>["UPDATE"];
    type: "UPDATE";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.QueryUpsertProps.html b/lib/docs/types/types_internalTypes.QueryUpsertProps.html new file mode 100644 index 0000000..c2225ba --- /dev/null +++ b/lib/docs/types/types_internalTypes.QueryUpsertProps.html @@ -0,0 +1 @@ +QueryUpsertProps | @dxfrontier/cds-ts-dispatcher
QueryUpsertProps: {
    props: keyof UPSERT<any>["UPSERT"];
    type: "UPSERT";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.RequestProperties.html b/lib/docs/types/types_internalTypes.RequestProperties.html new file mode 100644 index 0000000..1b26713 --- /dev/null +++ b/lib/docs/types/types_internalTypes.RequestProperties.html @@ -0,0 +1 @@ +RequestProperties | @dxfrontier/cds-ts-dispatcher
RequestProperties: {
    property: keyof Request;
    type: "REQ";
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.ServiceBeforeHandlers.html b/lib/docs/types/types_internalTypes.ServiceBeforeHandlers.html new file mode 100644 index 0000000..d518533 --- /dev/null +++ b/lib/docs/types/types_internalTypes.ServiceBeforeHandlers.html @@ -0,0 +1 @@ +ServiceBeforeHandlers | @dxfrontier/cds-ts-dispatcher
ServiceBeforeHandlers: {
    _handlers: {
        before: any[];
    };
}
\ No newline at end of file diff --git a/lib/docs/types/types_internalTypes.TemporaryArgs.html b/lib/docs/types/types_internalTypes.TemporaryArgs.html new file mode 100644 index 0000000..c9b3061 --- /dev/null +++ b/lib/docs/types/types_internalTypes.TemporaryArgs.html @@ -0,0 +1 @@ +TemporaryArgs | @dxfrontier/cds-ts-dispatcher
TemporaryArgs: {
    error: Error;
    next: NextEvent;
    req: Request;
    res: RequestResponse;
    results: unknown | unknown[];
}
\ No newline at end of file diff --git a/lib/docs/types/types_types.ACTION_EVENTS.html b/lib/docs/types/types_types.ACTION_EVENTS.html new file mode 100644 index 0000000..1f1618e --- /dev/null +++ b/lib/docs/types/types_types.ACTION_EVENTS.html @@ -0,0 +1 @@ +ACTION_EVENTS | @dxfrontier/cds-ts-dispatcher
ACTION_EVENTS: "ACTION" | "BOUND_ACTION"
\ No newline at end of file diff --git a/lib/docs/types/types_types.ALL_EVENTS.html b/lib/docs/types/types_types.ALL_EVENTS.html new file mode 100644 index 0000000..869be4d --- /dev/null +++ b/lib/docs/types/types_types.ALL_EVENTS.html @@ -0,0 +1 @@ +ALL_EVENTS | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_types.ActionRequest.html b/lib/docs/types/types_types.ActionRequest.html new file mode 100644 index 0000000..f831f07 --- /dev/null +++ b/lib/docs/types/types_types.ActionRequest.html @@ -0,0 +1,2 @@ +ActionRequest | @dxfrontier/cds-ts-dispatcher
ActionRequest<T>: Omit<Request, "data"> & {
    data: T["__parameters"];
}

Use ActionRequest type to have the Request of @OnAction, @OnBoundAction, @OnFunction, @OnBoundFunction typed.

+

Type Parameters

\ No newline at end of file diff --git a/lib/docs/types/types_types.ActionReturn.html b/lib/docs/types/types_types.ActionReturn.html new file mode 100644 index 0000000..6ca26d4 --- /dev/null +++ b/lib/docs/types/types_types.ActionReturn.html @@ -0,0 +1,2 @@ +ActionReturn | @dxfrontier/cds-ts-dispatcher
ActionReturn<T>: Promise<T["__returns"] | void | Error>

Use ActionReturn type to have the return of the @OnAction, @OnBoundAction, @OnFunction, @OnBoundFunction typed.

+

Type Parameters

\ No newline at end of file diff --git a/lib/docs/types/types_types.CDSTyperEntity.html b/lib/docs/types/types_types.CDSTyperEntity.html new file mode 100644 index 0000000..e00e748 --- /dev/null +++ b/lib/docs/types/types_types.CDSTyperEntity.html @@ -0,0 +1 @@ +CDSTyperEntity | @dxfrontier/cds-ts-dispatcher
CDSTyperEntity<T>: Constructable<T>

Type Parameters

  • T
\ No newline at end of file diff --git a/lib/docs/types/types_types.CRUD_EVENTS.html b/lib/docs/types/types_types.CRUD_EVENTS.html new file mode 100644 index 0000000..1f879be --- /dev/null +++ b/lib/docs/types/types_types.CRUD_EVENTS.html @@ -0,0 +1 @@ +CRUD_EVENTS | @dxfrontier/cds-ts-dispatcher
CRUD_EVENTS:
    | "READ"
    | "CREATE"
    | "UPDATE"
    | "DELETE"
    | ALL_EVENTS
    | EACH_INSTANCE
\ No newline at end of file diff --git a/lib/docs/types/types_types.CdsEvent.html b/lib/docs/types/types_types.CdsEvent.html new file mode 100644 index 0000000..d2cc207 --- /dev/null +++ b/lib/docs/types/types_types.CdsEvent.html @@ -0,0 +1 @@ +CdsEvent | @dxfrontier/cds-ts-dispatcher
CdsEvent: object
\ No newline at end of file diff --git a/lib/docs/types/types_types.DRAFT_EVENTS.html b/lib/docs/types/types_types.DRAFT_EVENTS.html new file mode 100644 index 0000000..02aae66 --- /dev/null +++ b/lib/docs/types/types_types.DRAFT_EVENTS.html @@ -0,0 +1 @@ +DRAFT_EVENTS | @dxfrontier/cds-ts-dispatcher
DRAFT_EVENTS:
    | "NEW"
    | "CANCEL"
    | "EDIT"
    | "SAVE"
\ No newline at end of file diff --git a/lib/docs/types/types_types.EACH_INSTANCE.html b/lib/docs/types/types_types.EACH_INSTANCE.html new file mode 100644 index 0000000..c8e1ace --- /dev/null +++ b/lib/docs/types/types_types.EACH_INSTANCE.html @@ -0,0 +1 @@ +EACH_INSTANCE | @dxfrontier/cds-ts-dispatcher
EACH_INSTANCE: "each"
\ No newline at end of file diff --git a/lib/docs/types/types_types.ERROR_EVENT.html b/lib/docs/types/types_types.ERROR_EVENT.html new file mode 100644 index 0000000..f8f7317 --- /dev/null +++ b/lib/docs/types/types_types.ERROR_EVENT.html @@ -0,0 +1 @@ +ERROR_EVENT | @dxfrontier/cds-ts-dispatcher
ERROR_EVENT: "ERROR"
\ No newline at end of file diff --git a/lib/docs/types/types_types.EVENTS.html b/lib/docs/types/types_types.EVENTS.html new file mode 100644 index 0000000..2f28b36 --- /dev/null +++ b/lib/docs/types/types_types.EVENTS.html @@ -0,0 +1 @@ +EVENTS | @dxfrontier/cds-ts-dispatcher
EVENTS:
    | CRUD_EVENTS
    | ACTION_EVENTS
    | FUNCTION_EVENTS
    | ERROR_EVENT
    | ON_EVENT
    | DRAFT_EVENTS
\ No newline at end of file diff --git a/lib/docs/types/types_types.FUNCTION_EVENTS.html b/lib/docs/types/types_types.FUNCTION_EVENTS.html new file mode 100644 index 0000000..27a9fab --- /dev/null +++ b/lib/docs/types/types_types.FUNCTION_EVENTS.html @@ -0,0 +1 @@ +FUNCTION_EVENTS | @dxfrontier/cds-ts-dispatcher
FUNCTION_EVENTS: "FUNC" | "BOUND_FUNC"
\ No newline at end of file diff --git a/lib/docs/types/types_types.MiddlewareImpl.html b/lib/docs/types/types_types.MiddlewareImpl.html new file mode 100644 index 0000000..94a0f0f --- /dev/null +++ b/lib/docs/types/types_types.MiddlewareImpl.html @@ -0,0 +1 @@ +MiddlewareImpl | @dxfrontier/cds-ts-dispatcher
MiddlewareImpl: {
    use: ((req: Request, next: NextMiddleware) => Promise<unknown>);
}
\ No newline at end of file diff --git a/lib/docs/types/types_types.NextEvent.html b/lib/docs/types/types_types.NextEvent.html new file mode 100644 index 0000000..86db9b3 --- /dev/null +++ b/lib/docs/types/types_types.NextEvent.html @@ -0,0 +1,5 @@ +NextEvent | @dxfrontier/cds-ts-dispatcher
NextEvent: ((req?: Request) => Function)

Use NextEvent type to annotate the next parameter of the implementation of the ON events.

+
"@Next() next: NextEvent"
+
+ +
\ No newline at end of file diff --git a/lib/docs/types/types_types.NextMiddleware.html b/lib/docs/types/types_types.NextMiddleware.html new file mode 100644 index 0000000..e92962d --- /dev/null +++ b/lib/docs/types/types_types.NextMiddleware.html @@ -0,0 +1,5 @@ +NextMiddleware | @dxfrontier/cds-ts-dispatcher
NextMiddleware: (() => Promise<unknown>)

Use NextMiddleware type to annotate the next parameter of the implementation of the middleware.

+
export class Middleware implements MiddlewareImpl {
public async use(req: TypedRequest<MyEntity>, next: NextMiddleware) {
await next();
}
} +
+ +
\ No newline at end of file diff --git a/lib/docs/types/types_types.ON_EVENT.html b/lib/docs/types/types_types.ON_EVENT.html new file mode 100644 index 0000000..63a59d2 --- /dev/null +++ b/lib/docs/types/types_types.ON_EVENT.html @@ -0,0 +1 @@ +ON_EVENT | @dxfrontier/cds-ts-dispatcher
ON_EVENT: "EVENT"
\ No newline at end of file diff --git a/lib/docs/types/types_types.RequestResponse.html b/lib/docs/types/types_types.RequestResponse.html new file mode 100644 index 0000000..e5e9c20 --- /dev/null +++ b/lib/docs/types/types_types.RequestResponse.html @@ -0,0 +1,2 @@ +RequestResponse | @dxfrontier/cds-ts-dispatcher
RequestResponse: ServerResponse

This object is created internally by an HTTP server, not by the user. Contains various methods and properties related to the response object.

+
\ No newline at end of file diff --git a/lib/docs/types/types_types.RequestType.html b/lib/docs/types/types_types.RequestType.html new file mode 100644 index 0000000..a90f32b --- /dev/null +++ b/lib/docs/types/types_types.RequestType.html @@ -0,0 +1 @@ +RequestType | @dxfrontier/cds-ts-dispatcher
RequestType: ((...args: any[]) => Promise<any>)
\ No newline at end of file diff --git a/lib/docs/types/types_types.ValidatorField.html b/lib/docs/types/types_types.ValidatorField.html new file mode 100644 index 0000000..43985b6 --- /dev/null +++ b/lib/docs/types/types_types.ValidatorField.html @@ -0,0 +1 @@ +ValidatorField | @dxfrontier/cds-ts-dispatcher
ValidatorField:
    | string
    | number
    | undefined
    | null
    | boolean
\ No newline at end of file diff --git a/lib/docs/types/types_validator.Contains.html b/lib/docs/types/types_validator.Contains.html new file mode 100644 index 0000000..bd249ef --- /dev/null +++ b/lib/docs/types/types_validator.Contains.html @@ -0,0 +1,4 @@ +Contains | @dxfrontier/cds-ts-dispatcher
Contains: {
    action: "contains";
    options?: ContainsOptions;
    seed: string;
}

Type declaration

  • action: "contains"

    Check if the string contains the seed.

    +

    Seed

    +

    [Optional] Options

    +
  • Optionaloptions?: ContainsOptions
  • seed: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.EndsWith.html b/lib/docs/types/types_validator.EndsWith.html new file mode 100644 index 0000000..b44faf2 --- /dev/null +++ b/lib/docs/types/types_validator.EndsWith.html @@ -0,0 +1,5 @@ +EndsWith | @dxfrontier/cds-ts-dispatcher
EndsWith: {
    action: "endsWith";
    position?: number;
    target: string;
}

Type declaration

  • action: "endsWith"

    Checks if string ends with the given target string.

    +

    The string to search for.

    +

    [optional] The position to search from.

    +

    Returns true if string ends with target, else false.

    +
  • Optionalposition?: number
  • target: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ExposeFields.html b/lib/docs/types/types_validator.ExposeFields.html new file mode 100644 index 0000000..b35de79 --- /dev/null +++ b/lib/docs/types/types_validator.ExposeFields.html @@ -0,0 +1 @@ +ExposeFields | @dxfrontier/cds-ts-dispatcher
ExposeFields<T>: {
    data: T["__parameters"];
}["data"]

Type Parameters

\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsAfter.html b/lib/docs/types/types_validator.IsAfter.html new file mode 100644 index 0000000..e71d41d --- /dev/null +++ b/lib/docs/types/types_validator.IsAfter.html @@ -0,0 +1,3 @@ +IsAfter | @dxfrontier/cds-ts-dispatcher
IsAfter: {
    action: "isAfter";
    date?: string;
}

Type declaration

  • action: "isAfter"

    Check if the string is a date that's after the specified date.

    +

    Date string (defaults to now)

    +
  • Optionaldate?: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsAlpha.html b/lib/docs/types/types_validator.IsAlpha.html new file mode 100644 index 0000000..3ad4829 --- /dev/null +++ b/lib/docs/types/types_validator.IsAlpha.html @@ -0,0 +1,4 @@ +IsAlpha | @dxfrontier/cds-ts-dispatcher
IsAlpha: {
    action: "isAlpha";
    locale?: AlphaLocale;
    options?: IsAlphaOptions;
}

Type declaration

  • action: "isAlpha"

    Check if the string contains only letters (a-zA-Z).

    +

    [optional] - AlphaLocale

    +

    [optional] - IsAlphaOptions

    +
  • Optionallocale?: AlphaLocale
  • Optionaloptions?: IsAlphaOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsAlphaNumeric.html b/lib/docs/types/types_validator.IsAlphaNumeric.html new file mode 100644 index 0000000..b6fd932 --- /dev/null +++ b/lib/docs/types/types_validator.IsAlphaNumeric.html @@ -0,0 +1,4 @@ +IsAlphaNumeric | @dxfrontier/cds-ts-dispatcher
IsAlphaNumeric: {
    action: "isAlphanumeric";
    locale?: AlphanumericLocale;
    options?: IsAlphanumericOptions;
}

Type declaration

  • action: "isAlphanumeric"

    Check if the string contains only letters and numbers.

    +

    AlphanumericLocale

    +

    IsAlphanumericOptions

    +
  • Optionallocale?: AlphanumericLocale
  • Optionaloptions?: IsAlphanumericOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsBIC.html b/lib/docs/types/types_validator.IsBIC.html new file mode 100644 index 0000000..72f2315 --- /dev/null +++ b/lib/docs/types/types_validator.IsBIC.html @@ -0,0 +1,2 @@ +IsBIC | @dxfrontier/cds-ts-dispatcher
IsBIC: {
    action: "isBIC";
}

Type declaration

  • action: "isBIC"

    Check if a string is a BIC (Bank Identification Code) or SWIFT code.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsBefore.html b/lib/docs/types/types_validator.IsBefore.html new file mode 100644 index 0000000..0160cb2 --- /dev/null +++ b/lib/docs/types/types_validator.IsBefore.html @@ -0,0 +1,3 @@ +IsBefore | @dxfrontier/cds-ts-dispatcher
IsBefore: {
    action: "isBefore";
    date?: string;
}

Type declaration

  • action: "isBefore"

    Check if the string is a date that's before the specified date.

    +

    Date string (defaults to now)

    +
  • Optionaldate?: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsBoolean.html b/lib/docs/types/types_validator.IsBoolean.html new file mode 100644 index 0000000..e486e48 --- /dev/null +++ b/lib/docs/types/types_validator.IsBoolean.html @@ -0,0 +1,2 @@ +IsBoolean | @dxfrontier/cds-ts-dispatcher
IsBoolean: {
    action: "isBoolean";
    options?: Options;
}

Type declaration

  • action: "isBoolean"

    check if a string is a boolean.

    +
  • Optionaloptions?: Options
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsCreditCard.html b/lib/docs/types/types_validator.IsCreditCard.html new file mode 100644 index 0000000..273728e --- /dev/null +++ b/lib/docs/types/types_validator.IsCreditCard.html @@ -0,0 +1,3 @@ +IsCreditCard | @dxfrontier/cds-ts-dispatcher
IsCreditCard: {
    action: "isCreditCard";
    options?: IsCreditCardOptions;
}

Type declaration

  • action: "isCreditCard"

    Check if the string is a credit card.

    +

    [optional]

    +
  • Optionaloptions?: IsCreditCardOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsCurrency.html b/lib/docs/types/types_validator.IsCurrency.html new file mode 100644 index 0000000..4ac7de4 --- /dev/null +++ b/lib/docs/types/types_validator.IsCurrency.html @@ -0,0 +1,3 @@ +IsCurrency | @dxfrontier/cds-ts-dispatcher
IsCurrency: {
    action: "isCurrency";
    options?: IsCurrencyOptions;
}

Type declaration

  • action: "isCurrency"

    Check if the string is a valid currency amount.

    +

    [optional]

    +
  • Optionaloptions?: IsCurrencyOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsDataURI.html b/lib/docs/types/types_validator.IsDataURI.html new file mode 100644 index 0000000..1a8eaba --- /dev/null +++ b/lib/docs/types/types_validator.IsDataURI.html @@ -0,0 +1,2 @@ +IsDataURI | @dxfrontier/cds-ts-dispatcher
IsDataURI: {
    action: "isDataURI";
}

Type declaration

\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsDateValidator.html b/lib/docs/types/types_validator.IsDateValidator.html new file mode 100644 index 0000000..a347e29 --- /dev/null +++ b/lib/docs/types/types_validator.IsDateValidator.html @@ -0,0 +1,3 @@ +IsDateValidator | @dxfrontier/cds-ts-dispatcher
IsDateValidator: {
    action: "isDate";
    options?: IsDateOptions;
}

Type declaration

  • action: "isDate"

    Check if the string is a valid date.

    +

    [optional]

    +
  • Optionaloptions?: IsDateOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsDecimal.html b/lib/docs/types/types_validator.IsDecimal.html new file mode 100644 index 0000000..2522918 --- /dev/null +++ b/lib/docs/types/types_validator.IsDecimal.html @@ -0,0 +1,4 @@ +IsDecimal | @dxfrontier/cds-ts-dispatcher
IsDecimal: {
    action: "isDecimal";
    options?: IsDecimalOptions;
}

Type declaration

  • action: "isDecimal"

    Check if the string represents a decimal number, +such as 0.1, .3, 1.1, 1.00003, 4.0 etc.

    +

    Options

    +
  • Optionaloptions?: IsDecimalOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsEAN.html b/lib/docs/types/types_validator.IsEAN.html new file mode 100644 index 0000000..96d4810 --- /dev/null +++ b/lib/docs/types/types_validator.IsEAN.html @@ -0,0 +1,2 @@ +IsEAN | @dxfrontier/cds-ts-dispatcher
IsEAN: {
    action: "isEAN";
}

Type declaration

  • action: "isEAN"

    Check if the string is an EAN (European Article Number).

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsEmailValidator.html b/lib/docs/types/types_validator.IsEmailValidator.html new file mode 100644 index 0000000..a2e8cf0 --- /dev/null +++ b/lib/docs/types/types_validator.IsEmailValidator.html @@ -0,0 +1,3 @@ +IsEmailValidator | @dxfrontier/cds-ts-dispatcher
IsEmailValidator: {
    action: "isEmail";
    options?: IsEmailOptions;
}

Type declaration

  • action: "isEmail"

    Check if the string is an email.

    +

    [optional]

    +
  • Optionaloptions?: IsEmailOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsEmpty.html b/lib/docs/types/types_validator.IsEmpty.html new file mode 100644 index 0000000..5bb5f76 --- /dev/null +++ b/lib/docs/types/types_validator.IsEmpty.html @@ -0,0 +1,3 @@ +IsEmpty | @dxfrontier/cds-ts-dispatcher
IsEmpty: {
    action: "isEmpty";
}

Type declaration

  • action: "isEmpty"

    Check if the string has a length of zero.

    +

    [optional]

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsEquals.html b/lib/docs/types/types_validator.IsEquals.html new file mode 100644 index 0000000..73611a5 --- /dev/null +++ b/lib/docs/types/types_validator.IsEquals.html @@ -0,0 +1,3 @@ +IsEquals | @dxfrontier/cds-ts-dispatcher
IsEquals: {
    action: "equals";
    comparison: string;
}

Type declaration

  • action: "equals"

    Check if the string matches the comparison.

    +

    String to compare

    +
  • comparison: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsFloat.html b/lib/docs/types/types_validator.IsFloat.html new file mode 100644 index 0000000..e8cd39f --- /dev/null +++ b/lib/docs/types/types_validator.IsFloat.html @@ -0,0 +1,3 @@ +IsFloat | @dxfrontier/cds-ts-dispatcher
IsFloat: {
    action: "isFloat";
    options?: IsFloatOptions;
}

Type declaration

  • action: "isFloat"

    Check if the string is an integer.

    +

    Options

    +
  • Optionaloptions?: IsFloatOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsHash.html b/lib/docs/types/types_validator.IsHash.html new file mode 100644 index 0000000..adf3419 --- /dev/null +++ b/lib/docs/types/types_validator.IsHash.html @@ -0,0 +1,3 @@ +IsHash | @dxfrontier/cds-ts-dispatcher
IsHash: {
    action: "isHash";
    algorithm: HashAlgorithm;
}

Type declaration

  • action: "isHash"

    Check if the string is a hash of export type algorithm.

    +

    HashAlgorithm

    +
  • algorithm: HashAlgorithm
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsHexadecimal.html b/lib/docs/types/types_validator.IsHexadecimal.html new file mode 100644 index 0000000..56643ac --- /dev/null +++ b/lib/docs/types/types_validator.IsHexadecimal.html @@ -0,0 +1,2 @@ +IsHexadecimal | @dxfrontier/cds-ts-dispatcher
IsHexadecimal: {
    action: "isHexadecimal";
}

Type declaration

  • action: "isHexadecimal"

    Check if the string is a hexadecimal number.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsIBAN.html b/lib/docs/types/types_validator.IsIBAN.html new file mode 100644 index 0000000..e6d375e --- /dev/null +++ b/lib/docs/types/types_validator.IsIBAN.html @@ -0,0 +1,3 @@ +IsIBAN | @dxfrontier/cds-ts-dispatcher
IsIBAN: {
    action: "isIBAN";
    options?: IsIBANOptions;
}

Type declaration

  • action: "isIBAN"

    Check if a string is a IBAN (International Bank Account Number).

    +

    [optional]

    +
  • Optionaloptions?: IsIBANOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsIMEI.html b/lib/docs/types/types_validator.IsIMEI.html new file mode 100644 index 0000000..7df5bd1 --- /dev/null +++ b/lib/docs/types/types_validator.IsIMEI.html @@ -0,0 +1,5 @@ +IsIMEI | @dxfrontier/cds-ts-dispatcher
IsIMEI: {
    action: "isIMEI";
    options?: IsIMEIOptions;
}

Type declaration

  • action: "isIMEI"

    Check if the string is a valid IMEI. +Non-hyphenated (###############) only is supported by default. +Use the options param to enable hyphenated (##-######-######-#) support.

    +

    [optional]

    +
  • Optionaloptions?: IsIMEIOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsIP.html b/lib/docs/types/types_validator.IsIP.html new file mode 100644 index 0000000..65e72be --- /dev/null +++ b/lib/docs/types/types_validator.IsIP.html @@ -0,0 +1,3 @@ +IsIP | @dxfrontier/cds-ts-dispatcher
IsIP: {
    action: "isIP";
    version?: IPVersion;
}

Type declaration

  • action: "isIP"

    Check if the string is an IP (version 4 or 6).

    +

    IP Version

    +
  • Optionalversion?: IPVersion
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsISBN.html b/lib/docs/types/types_validator.IsISBN.html new file mode 100644 index 0000000..1e5e31f --- /dev/null +++ b/lib/docs/types/types_validator.IsISBN.html @@ -0,0 +1,3 @@ +IsISBN | @dxfrontier/cds-ts-dispatcher
IsISBN: {
    action: "isISBN";
    version?: ISBNVersion;
}

Type declaration

  • action: "isISBN"

    Check if the string is an ISBN (version 10 or 13).

    +

    ISBN Version

    +
  • Optionalversion?: ISBNVersion
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsIdentityCard.html b/lib/docs/types/types_validator.IsIdentityCard.html new file mode 100644 index 0000000..44ef31d --- /dev/null +++ b/lib/docs/types/types_validator.IsIdentityCard.html @@ -0,0 +1,3 @@ +IsIdentityCard | @dxfrontier/cds-ts-dispatcher
IsIdentityCard: {
    action: "isIdentityCard";
    locale?: "any" | IdentityCardLocale;
}

Type declaration

  • action: "isIdentityCard"

    Check if the string is a valid identity card code.

    +

    IdentityCardLocale

    +
  • Optionallocale?: "any" | IdentityCardLocale
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsIn.html b/lib/docs/types/types_validator.IsIn.html new file mode 100644 index 0000000..e1ec475 --- /dev/null +++ b/lib/docs/types/types_validator.IsIn.html @@ -0,0 +1,3 @@ +IsIn | @dxfrontier/cds-ts-dispatcher
IsIn: {
    action: "isIn";
    values: any[];
}

Type declaration

  • action: "isIn"

    Check if the string is in a array of allowed values.

    +

    Allowed values.

    +
  • values: any[]
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsInt.html b/lib/docs/types/types_validator.IsInt.html new file mode 100644 index 0000000..f14c653 --- /dev/null +++ b/lib/docs/types/types_validator.IsInt.html @@ -0,0 +1,3 @@ +IsInt | @dxfrontier/cds-ts-dispatcher
IsInt: {
    action: "isInt";
    options?: IsIntOptions;
}

Type declaration

  • action: "isInt"

    Check if the string is an integer.

    +

    Options

    +
  • Optionaloptions?: IsIntOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsJSON.html b/lib/docs/types/types_validator.IsJSON.html new file mode 100644 index 0000000..8cd976f --- /dev/null +++ b/lib/docs/types/types_validator.IsJSON.html @@ -0,0 +1,2 @@ +IsJSON | @dxfrontier/cds-ts-dispatcher
IsJSON: {
    action: "isJSON";
}

Type declaration

  • action: "isJSON"

    Check if the string is valid JSON (note: uses JSON.parse).

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsJWT.html b/lib/docs/types/types_validator.IsJWT.html new file mode 100644 index 0000000..f8eac21 --- /dev/null +++ b/lib/docs/types/types_validator.IsJWT.html @@ -0,0 +1,2 @@ +IsJWT | @dxfrontier/cds-ts-dispatcher
IsJWT: {
    action: "isJWT";
}

Type declaration

  • action: "isJWT"

    Check if the string is valid JWT token.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsLatLong.html b/lib/docs/types/types_validator.IsLatLong.html new file mode 100644 index 0000000..3a989a6 --- /dev/null +++ b/lib/docs/types/types_validator.IsLatLong.html @@ -0,0 +1,3 @@ +IsLatLong | @dxfrontier/cds-ts-dispatcher
IsLatLong: {
    action: "isLatLong";
}

Type declaration

  • action: "isLatLong"

    Check if the string is a valid latitude-longitude coordinate in the format:

    +

    lat,long or lat, long.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsLength.html b/lib/docs/types/types_validator.IsLength.html new file mode 100644 index 0000000..5865537 --- /dev/null +++ b/lib/docs/types/types_validator.IsLength.html @@ -0,0 +1,4 @@ +IsLength | @dxfrontier/cds-ts-dispatcher
IsLength: {
    action: "isLength";
    options?: IsLengthOptions;
}

Type declaration

  • action: "isLength"

    Check if the string's length falls in a range.

    +

    Note: this export function takes into account surrogate pairs.

    +

    [optional]

    +
  • Optionaloptions?: IsLengthOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsLowercase.html b/lib/docs/types/types_validator.IsLowercase.html new file mode 100644 index 0000000..409d74d --- /dev/null +++ b/lib/docs/types/types_validator.IsLowercase.html @@ -0,0 +1,2 @@ +IsLowercase | @dxfrontier/cds-ts-dispatcher
IsLowercase: {
    action: "isLowercase";
}

Type declaration

  • action: "isLowercase"

    Check if the string is lowercase.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsMD5.html b/lib/docs/types/types_validator.IsMD5.html new file mode 100644 index 0000000..3db182f --- /dev/null +++ b/lib/docs/types/types_validator.IsMD5.html @@ -0,0 +1,2 @@ +IsMD5 | @dxfrontier/cds-ts-dispatcher
IsMD5: {
    action: "isMD5";
}

Type declaration

  • action: "isMD5"

    Check if the string is a MD5 hash.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsMailtoURI.html b/lib/docs/types/types_validator.IsMailtoURI.html new file mode 100644 index 0000000..aae9a4e --- /dev/null +++ b/lib/docs/types/types_validator.IsMailtoURI.html @@ -0,0 +1,3 @@ +IsMailtoURI | @dxfrontier/cds-ts-dispatcher
IsMailtoURI: {
    action: "isMailtoURI";
    options?: IsEmailOptions;
}

Type declaration

  • action: "isMailtoURI"

    check if the string is a [Magnet URI format][Mailto URI Format].

    options is an object of validating emails inside the URI (check isEmails options for details).

    +

    [optional]

    +
  • Optionaloptions?: IsEmailOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsMimeType.html b/lib/docs/types/types_validator.IsMimeType.html new file mode 100644 index 0000000..65ea8b9 --- /dev/null +++ b/lib/docs/types/types_validator.IsMimeType.html @@ -0,0 +1,2 @@ +IsMimeType | @dxfrontier/cds-ts-dispatcher
IsMimeType: {
    action: "isMimeType";
}

Type declaration

\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsNumeric.html b/lib/docs/types/types_validator.IsNumeric.html new file mode 100644 index 0000000..7b26783 --- /dev/null +++ b/lib/docs/types/types_validator.IsNumeric.html @@ -0,0 +1,3 @@ +IsNumeric | @dxfrontier/cds-ts-dispatcher
IsNumeric: {
    action: "isNumeric";
    options?: IsNumericOptions;
}

Type declaration

  • action: "isNumeric"

    Check if the string contains only numbers.

    +

    [optional]

    +
  • Optionaloptions?: IsNumericOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsPassportNumber.html b/lib/docs/types/types_validator.IsPassportNumber.html new file mode 100644 index 0000000..8676b84 --- /dev/null +++ b/lib/docs/types/types_validator.IsPassportNumber.html @@ -0,0 +1,3 @@ +IsPassportNumber | @dxfrontier/cds-ts-dispatcher
IsPassportNumber: {
    action: "isPassportNumber";
    countryCode?: string;
}

Type declaration

  • action: "isPassportNumber"

    Check if the string is a valid passport number relative to a specific country code.

    +

    Country code

    +
  • OptionalcountryCode?: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsPort.html b/lib/docs/types/types_validator.IsPort.html new file mode 100644 index 0000000..a3dca01 --- /dev/null +++ b/lib/docs/types/types_validator.IsPort.html @@ -0,0 +1,2 @@ +IsPort | @dxfrontier/cds-ts-dispatcher
IsPort: {
    action: "isPort";
}

Type declaration

  • action: "isPort"

    check if the string is a valid port number.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsPostalCode.html b/lib/docs/types/types_validator.IsPostalCode.html new file mode 100644 index 0000000..f68660a --- /dev/null +++ b/lib/docs/types/types_validator.IsPostalCode.html @@ -0,0 +1,3 @@ +IsPostalCode | @dxfrontier/cds-ts-dispatcher
IsPostalCode: {
    action: "isPostalCode";
    locale?: "any" | PostalCodeLocale;
}

Type declaration

  • action: "isPostalCode"

    Check if the string is a postal code

    +

    PostalCodeLocale

    +
  • Optionallocale?: "any" | PostalCodeLocale
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsSlug.html b/lib/docs/types/types_validator.IsSlug.html new file mode 100644 index 0000000..137222f --- /dev/null +++ b/lib/docs/types/types_validator.IsSlug.html @@ -0,0 +1,2 @@ +IsSlug | @dxfrontier/cds-ts-dispatcher
IsSlug: {
    action: "isSlug";
}

Type declaration

  • action: "isSlug"

    Check if the string is of export type slug.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsTime.html b/lib/docs/types/types_validator.IsTime.html new file mode 100644 index 0000000..c1686e6 --- /dev/null +++ b/lib/docs/types/types_validator.IsTime.html @@ -0,0 +1,3 @@ +IsTime | @dxfrontier/cds-ts-dispatcher
IsTime: {
    action: "isTime";
    options?: IsTimeOptions;
}

Type declaration

  • action: "isTime"

    Check if the string is a valid time.

    +

    [optional]

    +
  • Optionaloptions?: IsTimeOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsURL.html b/lib/docs/types/types_validator.IsURL.html new file mode 100644 index 0000000..57ecc66 --- /dev/null +++ b/lib/docs/types/types_validator.IsURL.html @@ -0,0 +1,3 @@ +IsURL | @dxfrontier/cds-ts-dispatcher
IsURL: {
    action: "isURL";
    options?: IsURLOptions;
}

Type declaration

  • action: "isURL"

    Check if the string is an URL.

    +

    [optional]

    +
  • Optionaloptions?: IsURLOptions
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsUUID.html b/lib/docs/types/types_validator.IsUUID.html new file mode 100644 index 0000000..b0138c3 --- /dev/null +++ b/lib/docs/types/types_validator.IsUUID.html @@ -0,0 +1,3 @@ +IsUUID | @dxfrontier/cds-ts-dispatcher
IsUUID: {
    action: "isUUID";
    options?: UUIDVersion;
}

Type declaration

  • action: "isUUID"

    Check if the string is a UUID (version 1, 2, 3, 4 or 5).

    +

    UUID version

    +
  • Optionaloptions?: UUIDVersion
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsUppercase.html b/lib/docs/types/types_validator.IsUppercase.html new file mode 100644 index 0000000..72fa555 --- /dev/null +++ b/lib/docs/types/types_validator.IsUppercase.html @@ -0,0 +1,2 @@ +IsUppercase | @dxfrontier/cds-ts-dispatcher
IsUppercase: {
    action: "isUppercase";
}

Type declaration

  • action: "isUppercase"

    Check if the string is uppercase.

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsVAT.html b/lib/docs/types/types_validator.IsVAT.html new file mode 100644 index 0000000..e117b06 --- /dev/null +++ b/lib/docs/types/types_validator.IsVAT.html @@ -0,0 +1,2 @@ +IsVAT | @dxfrontier/cds-ts-dispatcher
IsVAT: {
    action: "isVAT";
    countryCode: string;
}

Type declaration

  • action: "isVAT"

    Checks that the string is a [valid VAT number

    +
  • countryCode: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.IsWhitelisted.html b/lib/docs/types/types_validator.IsWhitelisted.html new file mode 100644 index 0000000..5de832c --- /dev/null +++ b/lib/docs/types/types_validator.IsWhitelisted.html @@ -0,0 +1,3 @@ +IsWhitelisted | @dxfrontier/cds-ts-dispatcher
IsWhitelisted: {
    action: "isWhitelisted";
    chars: string | string[];
}

Type declaration

  • action: "isWhitelisted"

    Checks characters if they appear in the whitelist.

    +

    whitelist

    +
  • chars: string | string[]
\ No newline at end of file diff --git a/lib/docs/types/types_validator.LodashValidators.html b/lib/docs/types/types_validator.LodashValidators.html new file mode 100644 index 0000000..26aa48d --- /dev/null +++ b/lib/docs/types/types_validator.LodashValidators.html @@ -0,0 +1 @@ +LodashValidators | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_validator.Matches.html b/lib/docs/types/types_validator.Matches.html new file mode 100644 index 0000000..caafe5f --- /dev/null +++ b/lib/docs/types/types_validator.Matches.html @@ -0,0 +1,3 @@ +Matches | @dxfrontier/cds-ts-dispatcher
Matches: {
    action: "matches";
    pattern: RegExp;
}

Type declaration

  • action: "matches"

    Check if string matches the pattern.

    +

    /foo/i

    +
  • pattern: RegExp
\ No newline at end of file diff --git a/lib/docs/types/types_validator.OnlyEntityStrings.html b/lib/docs/types/types_validator.OnlyEntityStrings.html new file mode 100644 index 0000000..085975f --- /dev/null +++ b/lib/docs/types/types_validator.OnlyEntityStrings.html @@ -0,0 +1 @@ +OnlyEntityStrings | @dxfrontier/cds-ts-dispatcher
OnlyEntityStrings<T>: Extract<keyof T, string>

Type Parameters

  • T
\ No newline at end of file diff --git a/lib/docs/types/types_validator.StartsWith.html b/lib/docs/types/types_validator.StartsWith.html new file mode 100644 index 0000000..1726c37 --- /dev/null +++ b/lib/docs/types/types_validator.StartsWith.html @@ -0,0 +1,5 @@ +StartsWith | @dxfrontier/cds-ts-dispatcher
StartsWith: {
    action: "startsWith";
    position?: number;
    target: string;
}

Type declaration

  • action: "startsWith"

    Checks if string starts with the given target string.

    +

    The string to search for.

    +

    [optional] The position to search from.

    +

    Returns true if string starts with target, else false.

    +
  • Optionalposition?: number
  • target: string
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorBase.html b/lib/docs/types/types_validator.ValidatorBase.html new file mode 100644 index 0000000..b518ce8 --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorBase.html @@ -0,0 +1,5 @@ +ValidatorBase | @dxfrontier/cds-ts-dispatcher
ValidatorBase: {
    customMessage?: string;
    mandatoryFieldValidation?: boolean;
}

Type declaration

  • OptionalcustomMessage?: string

    'customMessage' will replace the standard message of the validator.

    +
  • OptionalmandatoryFieldValidation?: boolean

    If mandatoryFieldValidation : true this will mandatory check the Request.data object for the field which needs to be validated. +if mandatoryFieldValidation : false or omitted, this will let the Request.data not to have the field in the body and the validation will just be omitted. +Default is set to false

    +
\ No newline at end of file diff --git a/lib/docs/types/types_validator.Validators.html b/lib/docs/types/types_validator.Validators.html new file mode 100644 index 0000000..9b25ed1 --- /dev/null +++ b/lib/docs/types/types_validator.Validators.html @@ -0,0 +1 @@ +Validators | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorsWithCountryCode.html b/lib/docs/types/types_validator.ValidatorsWithCountryCode.html new file mode 100644 index 0000000..4fd905d --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorsWithCountryCode.html @@ -0,0 +1 @@ +ValidatorsWithCountryCode | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorsWithLocale.html b/lib/docs/types/types_validator.ValidatorsWithLocale.html new file mode 100644 index 0000000..2a3536c --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorsWithLocale.html @@ -0,0 +1 @@ +ValidatorsWithLocale | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorsWithLocaleAndOptions.html b/lib/docs/types/types_validator.ValidatorsWithLocaleAndOptions.html new file mode 100644 index 0000000..5da179a --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorsWithLocaleAndOptions.html @@ -0,0 +1 @@ +ValidatorsWithLocaleAndOptions | @dxfrontier/cds-ts-dispatcher
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorsWithMultipleOptions.html b/lib/docs/types/types_validator.ValidatorsWithMultipleOptions.html new file mode 100644 index 0000000..c686e3e --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorsWithMultipleOptions.html @@ -0,0 +1 @@ +ValidatorsWithMultipleOptions | @dxfrontier/cds-ts-dispatcher
ValidatorsWithMultipleOptions:
    | IsAfter
    | IsBefore
    | IsHash
    | IsIP
    | IsISBN
    | IsIn
    | IsWhitelisted
    | IsEquals
    | Contains
    | Matches
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorsWithNoOptions.html b/lib/docs/types/types_validator.ValidatorsWithNoOptions.html new file mode 100644 index 0000000..51275ef --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorsWithNoOptions.html @@ -0,0 +1 @@ +ValidatorsWithNoOptions | @dxfrontier/cds-ts-dispatcher
ValidatorsWithNoOptions:
    | IsBIC
    | IsEAN
    | IsHexadecimal
    | IsLatLong
    | IsMD5
    | IsMimeType
    | IsPort
    | IsSlug
    | IsDataURI
    | IsEmpty
    | IsLowercase
    | IsUppercase
    | IsJSON
    | IsJWT
\ No newline at end of file diff --git a/lib/docs/types/types_validator.ValidatorsWithOptions.html b/lib/docs/types/types_validator.ValidatorsWithOptions.html new file mode 100644 index 0000000..7354295 --- /dev/null +++ b/lib/docs/types/types_validator.ValidatorsWithOptions.html @@ -0,0 +1 @@ +ValidatorsWithOptions | @dxfrontier/cds-ts-dispatcher
ValidatorsWithOptions:
    | IsBoolean
    | IsDecimal
    | IsFloat
    | IsInt
    | IsMailtoURI
    | IsNumeric
    | IsTime
    | IsDateValidator
    | IsEmailValidator
    | IsCurrency
    | IsIBAN
    | IsIMEI
    | IsURL
    | IsUUID
    | IsCreditCard
    | IsLength
\ No newline at end of file diff --git a/lib/docs/types/types_validator.isMobilePhoneValidator.html b/lib/docs/types/types_validator.isMobilePhoneValidator.html new file mode 100644 index 0000000..c2d0ae8 --- /dev/null +++ b/lib/docs/types/types_validator.isMobilePhoneValidator.html @@ -0,0 +1,4 @@ +isMobilePhoneValidator | @dxfrontier/cds-ts-dispatcher
isMobilePhoneValidator: {
    action: "isMobilePhone";
    locale?: "any" | MobilePhoneLocale | MobilePhoneLocale[];
    options?: IsMobilePhoneOptions;
}

Type declaration

  • action: "isMobilePhone"

    Check if the string is a mobile phone number.

    +

    [optional] - MobilePhoneLocale(s)

    +

    [optional] [optional]

    +
  • Optionallocale?: "any" | MobilePhoneLocale | MobilePhoneLocale[]
  • Optionaloptions?: IsMobilePhoneOptions
\ No newline at end of file diff --git a/lib/docs/variables/constants_constants.CDS_DISPATCHER.html b/lib/docs/variables/constants_constants.CDS_DISPATCHER.html new file mode 100644 index 0000000..1929b5a --- /dev/null +++ b/lib/docs/variables/constants_constants.CDS_DISPATCHER.html @@ -0,0 +1,12 @@ +CDS_DISPATCHER | @dxfrontier/cds-ts-dispatcher
CDS_DISPATCHER: {
    ALL_ENTITIES: "*";
    SRV: "srv";
} = ...

CDS-TS-Dispatcher app helper constants.

+

Type declaration

  • ReadonlyALL_ENTITIES: "*"

    Represents all entities. Use CDS_DISPATCHER.ALL_ENTITIES with the EntityHandler decorator to target all entities in your application.

    +

    This is a constant, but you can also use the asterisk (*) instead of CDS_DISPATCHER.ALL_ENTITIES.

    +
    "@EntityHandler(CDS_DISPATCHER.ALL_ENTITIES)"
    +
    + +
  • ReadonlySRV: "srv"

    Represents the CDS Service. Use CDS_DISPATCHER.SRV to inject the CDS Service into your class as a dependency.

    +

    This is a constant, but you can also use the string 'srv' instead of CDS_DISPATCHER.SRV.

    +
    "@Inject(CDS_DISPATCHER.SRV) private readonly srv: Service"
    +
    + +
\ No newline at end of file diff --git a/lib/docs/variables/constants_internalConstants.SRV.html b/lib/docs/variables/constants_internalConstants.SRV.html new file mode 100644 index 0000000..0ab6c6c --- /dev/null +++ b/lib/docs/variables/constants_internalConstants.SRV.html @@ -0,0 +1,3 @@ +SRV | @dxfrontier/cds-ts-dispatcher
SRV: "srv" = 'srv'

Use SRV to inject the CDS Service into your class as a dependency.

+

use CDS_DISPATCHER.SRV instead, this will be removed in the next releases.

+
\ No newline at end of file diff --git a/lib/docs/variables/constants_internalConstants.constants.html b/lib/docs/variables/constants_internalConstants.constants.html new file mode 100644 index 0000000..651982d --- /dev/null +++ b/lib/docs/variables/constants_internalConstants.constants.html @@ -0,0 +1 @@ +constants | @dxfrontier/cds-ts-dispatcher
constants: {
    ALL_EVENTS: "*";
    DECORATOR: {
        ENTITY_HANDLER_NAME: string;
        METHOD_ACCUMULATOR_NAME: string;
        MIDDLEWARE_KEY: string;
        MIDDLEWARE_NAME: string;
        PARAMETER: {
            ERROR: symbol;
            GET_QUERY: symbol;
            GET_REQUEST: symbol;
            IS_COLUMN_SUPPLIED: symbol;
            IS_PRESENT: symbol;
            IS_ROLE: symbol;
            JWT: symbol;
            NEXT: symbol;
            REQ: symbol;
            RES: symbol;
            RESULTS: symbol;
            SINGLE_INSTANCE_SWITCH: symbol;
        };
    };
    MESSAGES: {
        UNSUPPORTED_DECORATOR_ACTIONS: string;
        VALIDATOR_FIELD_NOT_EXISTS: string;
        VALIDATOR_MANDATORY_PROPERTY_DATA: string;
        VALIDATOR_NOT_VALID: string;
    };
} = ...
\ No newline at end of file diff --git a/lib/docs/variables/docs_assets_main.window.navigationData.html b/lib/docs/variables/docs_assets_main.window.navigationData.html new file mode 100644 index 0000000..dcc8537 --- /dev/null +++ b/lib/docs/variables/docs_assets_main.window.navigationData.html @@ -0,0 +1 @@ +navigationData | @dxfrontier/cds-ts-dispatcher
navigationData: string
\ No newline at end of file diff --git a/lib/docs/variables/docs_assets_main.window.searchData.html b/lib/docs/variables/docs_assets_main.window.searchData.html new file mode 100644 index 0000000..a2698c7 --- /dev/null +++ b/lib/docs/variables/docs_assets_main.window.searchData.html @@ -0,0 +1 @@ +searchData | @dxfrontier/cds-ts-dispatcher
searchData: string
\ No newline at end of file diff --git a/lib/docs/variables/docs_assets_main.window.translations.html b/lib/docs/variables/docs_assets_main.window.translations.html new file mode 100644 index 0000000..444f802 --- /dev/null +++ b/lib/docs/variables/docs_assets_main.window.translations.html @@ -0,0 +1 @@ +translations | @dxfrontier/cds-ts-dispatcher
translations: {
    copied: string;
    copy: string;
    normally_hidden: string;
}
\ No newline at end of file diff --git a/lib/docs/variables/util_decorators_decoratorsUtil.default.html b/lib/docs/variables/util_decorators_decoratorsUtil.default.html new file mode 100644 index 0000000..1f4136e --- /dev/null +++ b/lib/docs/variables/util_decorators_decoratorsUtil.default.html @@ -0,0 +1 @@ +default | @dxfrontier/cds-ts-dispatcher
default: {
    mapPrependDraftEvent(options: PrependBaseDraft): MapPrepend;
    mapPrependEvent(options: PrependBase): MapPrepend;
} = ...
\ No newline at end of file diff --git a/lib/docs/variables/util_formatter_formatterUtil.default.html b/lib/docs/variables/util_formatter_formatterUtil.default.html new file mode 100644 index 0000000..37ad28a --- /dev/null +++ b/lib/docs/variables/util_formatter_formatterUtil.default.html @@ -0,0 +1,25 @@ +default | @dxfrontier/cds-ts-dispatcher
default: {
    applyFormatter<T>(formatter: LodashFormatters | ValidatorFormatters, value: any): string;
    findResults<T>(args: any[]): undefined | T | T[];
    handleCustomFormatter<T>(req: Request, formatter: Custom<T>, results: undefined | T | T[]): Promise<void>;
    handleManyItems<T, Results, Field>(formatter: LodashFormatters | ValidatorFormatters, results: Results, field: Field): void;
    handleOneItem<T, Result, Field>(formatter: LodashFormatters | ValidatorFormatters, result: Result, field: Field): void;
    handleOneItemOfRequest<T, Field>(req: Request, formatter: LodashFormatters | ValidatorFormatters, field: Field): void;
} = ...

Utility functions for applying formatters to various data structures.

+

Type declaration

  • applyFormatter:function
  • findResults:function
    • Finds and returns results from the request object within the provided arguments.

      +

      Type Parameters

      • T

      Parameters

      • args: any[]

        The array of arguments to search for the results.

        +

      Returns undefined | T | T[]

      The found results or undefined if no results are found.

      +
  • handleCustomFormatter:function
    • Handles the application of a custom formatter.

      +

      Type Parameters

      • T

      Parameters

      • req: Request

        The request object.

        +
      • formatter: Custom<T>

        The custom formatter to apply.

        +
      • results: undefined | T | T[]

        The results to format.

        +

      Returns Promise<void>

  • handleManyItems:function
  • handleOneItem:function
  • handleOneItemOfRequest:function
\ No newline at end of file diff --git a/lib/docs/variables/util_middleware_middlewareUtil.default.html b/lib/docs/variables/util_middleware_middlewareUtil.default.html new file mode 100644 index 0000000..ac17871 --- /dev/null +++ b/lib/docs/variables/util_middleware_middlewareUtil.default.html @@ -0,0 +1,17 @@ +default | @dxfrontier/cds-ts-dispatcher
default: {
    executeMiddlewareChain<Middleware>(req: Request, index?: number, middlewares: Middleware[], entityInstance?: Constructable<any>): Promise<void>;
    isRejectUsed(req: Request): boolean;
    registerToClass<Middleware, Target>(target: Target, middlewareClasses: Middleware[]): void;
    registerToMethod<Middleware>(middlewares: Middleware[], descriptor: TypedPropertyDescriptor<RequestType>): void;
} = ...

Utility object for handling middleware operations.

+

Type declaration

  • executeMiddlewareChain:function
    • Executes a chain of middleware functions.

      +

      Type Parameters

      Parameters

      • req: Request

        The request object.

        +
      • index: number = 0

        The current index in the middleware chain. Defaults to 0.

        +
      • middlewares: Middleware[]

        An array of middleware classes to execute.

        +
      • OptionalentityInstance: Constructable<any>

        An optional entity instance.

        +

      Returns Promise<void>

      A promise that resolves when the middleware chain is complete.

      +
  • isRejectUsed:function
    • Checks if the request object has been rejected.

      +

      Parameters

      Returns boolean

      True if the request has been rejected, otherwise false.

      +
  • registerToClass:function
  • registerToMethod:function
\ No newline at end of file diff --git a/lib/docs/variables/util_parameter_parameterUtil.default.html b/lib/docs/variables/util_parameter_parameterUtil.default.html new file mode 100644 index 0000000..1624449 --- /dev/null +++ b/lib/docs/variables/util_parameter_parameterUtil.default.html @@ -0,0 +1,35 @@ +default | @dxfrontier/cds-ts-dispatcher
default: {
    applyIsColumnSupplied(req: Request, args: any[], metadata: MetadataFields[]): void;
    applyIsPresentOrGetDecorator(type: "IsPresent" | "Get", metadataParameters: MetadataFields[], req: Request, args: unknown[]): void;
    applyIsRole(req: Request, args: any[], metadata: MetadataFields[]): void;
    extractArguments(args: any[]): TemporaryArgs;
    findExecutionAllowedRoles(args: any[], roles: string[]): boolean;
    findResults(arg: any):
        | undefined
        | boolean
        | object
        | any[];
    handleRequestOptions(req: Request, args: unknown[], metadata: MetadataFields[]): void;
    isSingleInstance(req: Request): boolean;
    retrieveJwt(req: Request): undefined | string;
    retrieveResponse(req: Request): ServerResponse<IncomingMessage>;
} = ...

Utility object for handling parameter operations.

+

Type declaration

  • applyIsColumnSupplied:function
    • Applies the 'is column supplied' parameter to the request arguments.

      +

      Parameters

      • req: Request

        The request object.

        +
      • args: any[]

        The arguments array.

        +
      • metadata: MetadataFields[]

        The metadata fields array.

        +

      Returns void

  • applyIsPresentOrGetDecorator:function
    • Applies the 'is present' or 'get' decorator to the request arguments.

      +

      Parameters

      • type: "IsPresent" | "Get"

        The type of decorator, either 'Get' or 'IsPresent'.

        +
      • metadataParameters: MetadataFields[]

        The metadata parameters array.

        +
      • req: Request

        The request object.

        +
      • args: unknown[]

        The arguments array.

        +

      Returns void

  • applyIsRole:function
  • extractArguments:function
  • findExecutionAllowedRoles:function
    • Finds if the execution is allowed based on roles.

      +

      Parameters

      • args: any[]

        The arguments array.

        +
      • roles: string[]

        The roles array.

        +

      Returns boolean

      True if the execution is allowed, otherwise false.

      +
  • findResults:function
    • Finds the results from the argument.

      +

      Parameters

      • arg: any

        The argument.

        +

      Returns
          | undefined
          | boolean
          | object
          | any[]

      The results array, boolean, object, or undefined.

      +
  • handleRequestOptions:function
    • Handles request options and applies them to the arguments.

      +

      Parameters

      • req: Request

        The request object.

        +
      • args: unknown[]

        The arguments array.

        +
      • metadata: MetadataFields[]

        The metadata fields array.

        +

      Returns void

  • isSingleInstance:function
    • Checks if the request is for a single instance.

      +

      Parameters

      Returns boolean

      True if the request is for a single instance, otherwise false.

      +
  • retrieveJwt:function
    • Retrieves the JWT from the request.

      +

      Parameters

      Returns undefined | string

      The JWT string if present, otherwise undefined.

      +
  • retrieveResponse:function
    • Retrieves the response object from the request.

      +

      Parameters

      Returns ServerResponse<IncomingMessage>

      The response object.

      +
\ No newline at end of file diff --git a/lib/docs/variables/util_util.default.html b/lib/docs/variables/util_util.default.html new file mode 100644 index 0000000..9df04f0 --- /dev/null +++ b/lib/docs/variables/util_util.default.html @@ -0,0 +1,42 @@ +default | @dxfrontier/cds-ts-dispatcher
default: {
    isRequestType: ((arg: any) => arg is Request);
    lodash: LoDashStatic;
    buildMessage(message: string, placeholders: Record<string, any>): string;
    cleanArgs(args: any[]): void;
    findRequest(args: any[]): Request;
    getArrayFirstItem(data: any): object;
    isFieldEmpty(value: ValidatorField): boolean;
    isNextEvent(arg: any): arg is NextEvent;
    raiseBadRequestEmptyField(req: Request, validatorOrFormatter: Validators | Formatters<any>, field: string): void;
    raiseBadRequestMessage(req: Request, message: string): void;
    subtractLastDotString(str: string): string;
    throwErrorMessage(message: string): void;
} = ...

This util contains common methods for reusable purposes. +Methods don't contain business logic.

+

Type declaration

  • isRequestType: ((arg: any) => arg is Request)

    Type guard to check if an argument is a Request.

    +
      • (arg): arg is Request
      • Parameters

        • arg: any

          The argument to check.

          +

        Returns arg is Request

        True if the argument is a Request, otherwise false.

        +
  • lodash: LoDashStatic

    Single point of lodash.

    +
    util.lodash.replace or util.lodash.startsWith ...
    +
    + +
  • buildMessage:function
    • Builds a message with placeholders.

      +

      Parameters

      • message: string

        The message template with placeholders.

        +
      • placeholders: Record<string, any>

        The object containing placeholder values.

        +

      Returns string

      The message with placeholders replaced by actual values.

      +
  • cleanArgs:function
    • Cleans the args array for a clean re-indexation for new decorators. +If no decorators are found in the registry, this will be omitted.

      +

      Parameters

      • args: any[]

        The arguments array to clean.

        +

      Returns void

  • findRequest:function
    • Finds the SAP CAP Request object from the arguments.

      +

      Parameters

      • args: any[]

        The arguments array.

        +

      Returns Request

      The Request object if found.

      +
  • getArrayFirstItem:function
    • Returns the first item of an array if the array is not empty, otherwise returns an empty object.

      +

      Parameters

      • data: any

        The input array.

        +

      Returns object

      The first item of the array or an empty object.

      +
  • isFieldEmpty:function
    • Checks if a field is empty.

      +

      Parameters

      Returns boolean

      True if the field is empty, otherwise false.

      +
  • isNextEvent:function
    • Type guard to check if an argument is a NextEvent function.

      +

      Parameters

      • arg: any

        The argument to check.

        +

      Returns arg is NextEvent

      True if the argument is a NextEvent function, otherwise false.

      +
  • raiseBadRequestEmptyField:function
    • Raises a bad request error indicating that a required field is empty.

      +

      Parameters

      • req: Request

        The SAP CAP Request object.

        +
      • validatorOrFormatter: Validators | Formatters<any>

        The validator or formatter that identified the empty field.

        +
      • field: string

        The field that is empty.

        +

      Returns void

  • raiseBadRequestMessage:function
    • Raises a bad request error from the SAP CAP Request with '400' error code.

      +

      Parameters

      • req: Request

        The SAP CAP Request object.

        +
      • message: string

        The message to be raised.

        +

      Returns void

  • subtractLastDotString:function
    • Takes a string as an argument like 'i.am.somebody' and returns 'somebody'.

      +

      Parameters

      • str: string

        The input string.

        +

      Returns string

      The last part of the string after the last dot.

      +
  • throwErrorMessage:function
    • Throws an error with the specified message.

      +

      Parameters

      • message: string

        The error message.

        +

      Returns void

      An Error with the specified message.

      +
\ No newline at end of file diff --git a/lib/docs/variables/util_validation_validatorUtil.default.html b/lib/docs/variables/util_validation_validatorUtil.default.html new file mode 100644 index 0000000..4e740c0 --- /dev/null +++ b/lib/docs/variables/util_validation_validatorUtil.default.html @@ -0,0 +1,18 @@ +default | @dxfrontier/cds-ts-dispatcher
default: {
    applyValidator(req: Request, validator: Validators, field: string): void;
    canValidate(req: Request, validator: Validators, field: string): boolean;
    showNotValidMessage(options: {
        field: string;
        input: string;
        message?: null | string;
        req: Request;
        validator: string;
    }): void;
} = ...

Utility object for handling validation operations.

+

Type declaration

  • applyValidator:function
    • Applies the specified validator to the given field in the request.

      +

      Parameters

      • req: Request

        The request object.

        +
      • validator: Validators

        The validator object.

        +
      • field: string

        The field to validate.

        +

      Returns void

  • canValidate:function
    • Determines if validation can be applied to the given field in the request.

      +

      Parameters

      • req: Request

        The request object.

        +
      • validator: Validators

        The validator object.

        +
      • field: string

        The field to validate.

        +

      Returns boolean

      True if validation can be applied, otherwise false.

      +
  • showNotValidMessage:function
    • Displays a message indicating the validation error.

      +

      Parameters

      • options: {
            field: string;
            input: string;
            message?: null | string;
            req: Request;
            validator: string;
        }

        An object containing the validation error details.

        +
        • field: string

          The field that failed validation.

          +
        • input: string

          The input value that failed validation.

          +
        • Optionalmessage?: null | string

          An optional custom message for the validation error.

          +
        • req: Request

          The request object.

          +
        • validator: string

          The validator that failed.

          +

      Returns void

\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e99377b..24d3925 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dxfrontier/cds-ts-dispatcher", - "version": "2.1.1", + "version": "2.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@dxfrontier/cds-ts-dispatcher", - "version": "2.1.1", + "version": "2.1.2", "license": "MIT", "workspaces": [ "./test/bookshop" @@ -42,11 +42,13 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-n": "^16.6.2", "eslint-plugin-promise": "^6.4.0", + "http-server": "^14.1.1", "husky": "^9.0.11", "jest": "^29.7.0", "lint-staged": "^15.2.7", "newman": "^6.1.3", "npm-run-all": "^4.1.5", + "open-cli": "^8.0.0", "prettier": "3.3.2", "start-server-and-test": "^2.0.4", "ts-jest": "^29.1.5", @@ -3038,6 +3040,12 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3942,6 +3950,24 @@ } ] }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -4194,6 +4220,21 @@ "semver": "^7.0.0" } }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bundle-require": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", @@ -4801,6 +4842,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -4928,6 +4978,33 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/csv-parse": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", @@ -5078,6 +5155,34 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -5115,6 +5220,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -6714,6 +6831,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -7073,12 +7202,33 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -7101,12 +7251,108 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/http-reasons": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", "dev": true }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/http-server/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/http-server/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/http-signature": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", @@ -7497,6 +7743,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7539,6 +7800,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -7732,6 +8011,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -10234,7 +10528,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "peer": true, "bin": { "mime": "cli.js" }, @@ -10932,6 +11225,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open-cli": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-8.0.0.tgz", + "integrity": "sha512-3muD3BbfLyzl+aMVSEfn2FfOqGdPYR0O4KNnxXsLEPE2q9OSjBfJAaB6XKbrUzLgymoSMejvb5jpXJfru/Ko2A==", + "dev": true, + "dependencies": { + "file-type": "^18.7.0", + "get-stdin": "^9.0.0", + "meow": "^12.1.1", + "open": "^10.0.0", + "tempy": "^3.1.0" + }, + "bin": { + "open-cli": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open-cli/node_modules/file-type": { + "version": "18.7.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.7.0.tgz", + "integrity": "sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==", + "dev": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/opossum": { "version": "8.1.4", "resolved": "https://registry.npmjs.org/opossum/-/opossum-8.1.4.tgz", @@ -11264,6 +11623,19 @@ "through": "~2.3" } }, + "node_modules/peek-readable": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.1.1.tgz", + "integrity": "sha512-4hEOSH7KeEaZpMDF/xfm1W9fS5rT7Ett3BkXWHqAEzRLLwLaHkwOL+GvvpIEh9UrvX9BDhzfkvteslgraoH69w==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -11391,6 +11763,50 @@ "node": ">=8" } }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -11859,7 +12275,6 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "peer": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -11995,6 +12410,22 @@ "node": ">= 6" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -12228,6 +12659,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", @@ -12336,6 +12779,12 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -13154,6 +13603,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.1.0.tgz", + "integrity": "sha512-19dQEwG6Jd+VabjPRyBhymIF069vZiqWSZa2jJBoKJTsqGKnTxowGoQaLnz+yLARfDI041IUQekyPUMWElOgsQ==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.1.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -13279,6 +13745,45 @@ "integrity": "sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg==", "dev": true }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dev": true, + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -13413,6 +13918,23 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", @@ -13962,6 +14484,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -14019,6 +14568,12 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -14171,6 +14726,30 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", diff --git a/package.json b/package.json index 03f00bd..5a8fed3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dxfrontier/cds-ts-dispatcher", - "version": "2.1.1", + "version": "2.1.2", "description": "The goal of CDS-TS-Dispatcher is to significantly reduce the boilerplate code required to implement TS handlers provided by the SAP CAP framework.", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -21,16 +21,19 @@ "check": "run-s eslint:message eslint prettier:message prettier", "fix": "run-s eslint:message eslint:fix prettier:message prettier:fix", "start:bookshop": "npm run start --prefix ./test/bookshop", - "tests:newman": "newman run ./test/e2e/CDS-TS-Dispatcher.postman_collection.json --environment ./test/e2e/environment.json --bail", + "test:newman": "newman run ./test/e2e/CDS-TS-Dispatcher.postman_collection.json --environment ./test/e2e/environment.json --bail", "test:unit": "npm run build:entities:test --prefix ./test/bookshop && jest", - "test:e2e": "start-server-and-test start:bookshop http://localhost:4004 tests:newman", - "test:all": "run-s test:unit test:e2e", + "test:e2e": "start-server-and-test start:bookshop http://localhost:4004 test:newman", + "test": "run-s test:unit test:e2e", "prepare": "husky", "commit": "commit", + "documentation:message": "echo 'Started creation of documentation based on TypeDoc ...'", + "documentation:build": "npx typedoc", + "documentation:start:server": "http-server ./lib/docs", + "documentation:open:browser": "open-cli http://127.0.0.1:8080", + "documentation": "run-p documentation:start:server documentation:open:browser", "build:message": "echo 'Build started...'", "build:clean": "echo 'Clean dist folder' && npx rimraf ./dist/{*.js,*.map,*.ts,*.mts,*.mjs}", - "build:documentation:message": "echo 'Started creation of documentation based on TypeDoc ...'", - "build:documentation": "npx typedoc", "build:ts": "tsup", "build": "run-s build:clean build:message build:ts" }, @@ -82,24 +85,26 @@ "@commitlint/prompt-cli": "^19.3.1", "@commitlint/types": "^19.0.3", "@dxfrontier/cds-ts-repository": "^1.1.0", + "@swc/core": "^1.6.6", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.6", "@types/string-placeholder": "^1.0.3", "@types/validator": "^13.12.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@swc/core": "^1.6.6", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard-with-typescript": "^43.0.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-n": "^16.6.2", "eslint-plugin-promise": "^6.4.0", + "http-server": "^14.1.1", "husky": "^9.0.11", "jest": "^29.7.0", "lint-staged": "^15.2.7", "newman": "^6.1.3", "npm-run-all": "^4.1.5", + "open-cli": "^8.0.0", "prettier": "3.3.2", "start-server-and-test": "^2.0.4", "ts-jest": "^29.1.5",