@sap/cds 5.6.1 → 5.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +136 -0
- package/_i18n/i18n_fr.properties +4 -4
- package/apis/cds.d.ts +7 -10
- package/apis/connect.d.ts +3 -3
- package/apis/core.d.ts +2 -4
- package/apis/models.d.ts +2 -3
- package/apis/ql.d.ts +0 -1
- package/apis/services.d.ts +7 -3
- package/bin/build/buildTaskFactory.js +16 -10
- package/bin/build/buildTaskProviderFactory.js +3 -3
- package/bin/build/constants.js +2 -1
- package/bin/build/provider/buildTaskProviderInternal.js +14 -14
- package/bin/build/provider/hana/2migration.js +2 -3
- package/bin/build/provider/hana/index.js +34 -0
- package/bin/build/provider/hana/migrationtable.js +90 -22
- package/bin/build/provider/hana/template/undeploy.json +5 -0
- package/bin/build/provider/node-cf/index.js +9 -2
- package/bin/serve.js +16 -18
- package/lib/compile/cdsc.js +15 -5
- package/lib/compile/etc/_localized.js +4 -4
- package/lib/compile/extend.js +8 -0
- package/lib/compile/index.js +3 -1
- package/lib/compile/minify.js +61 -0
- package/lib/compile/resolve.js +4 -1
- package/lib/compile/to/gql.js +9 -0
- package/lib/compile/to/sql.js +26 -30
- package/lib/connect/index.js +1 -1
- package/lib/core/entities.js +0 -3
- package/lib/core/infer.js +1 -0
- package/lib/core/reflect.js +1 -34
- package/lib/deploy.js +25 -17
- package/lib/env/defaults.js +3 -1
- package/lib/env/index.js +13 -4
- package/lib/env/presets.js +38 -0
- package/lib/env/requires.js +16 -11
- package/lib/index.js +13 -11
- package/lib/log/format/kibana.js +4 -2
- package/lib/log/index.js +2 -2
- package/lib/ql/Whereable.js +1 -0
- package/lib/req/cds-context.js +79 -0
- package/lib/req/context.js +5 -77
- package/lib/req/request.js +1 -1
- package/lib/serve/Service-api.js +8 -4
- package/lib/serve/Service-dispatch.js +0 -7
- package/lib/serve/Service-methods.js +6 -8
- package/lib/serve/Transaction.js +35 -30
- package/lib/serve/adapters.js +1 -4
- package/lib/utils/axios.js +1 -1
- package/libx/_runtime/audit/Service.js +44 -20
- package/libx/_runtime/audit/generic/personal/access.js +16 -11
- package/libx/_runtime/audit/generic/personal/modification.js +5 -5
- package/libx/_runtime/audit/generic/personal/utils.js +46 -37
- package/libx/_runtime/{common/auth → auth}/index.js +21 -7
- package/libx/_runtime/{common/auth → auth}/strategies/JWT.js +2 -2
- package/libx/_runtime/{common/auth → auth}/strategies/basic.js +2 -2
- package/libx/_runtime/{common/auth → auth}/strategies/dummy.js +1 -1
- package/libx/_runtime/{common/auth → auth}/strategies/mock.js +2 -2
- package/libx/_runtime/{common/auth → auth}/strategies/utils/uaa.js +1 -1
- package/libx/_runtime/{common/auth → auth}/strategies/utils/xssec.js +0 -0
- package/libx/_runtime/{common/auth → auth}/strategies/xsuaa.js +2 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +7 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +0 -8
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +3 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +6 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/delete.js +3 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +2 -11
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +16 -6
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +26 -65
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +3 -66
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +26 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +5 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +2 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriParser.js +13 -10
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/ConditionalRequestControlCommand.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/validator/ConditionalRequestValidator.js +0 -8
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +18 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +54 -76
- package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -7
- package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +3 -6
- package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +3 -6
- package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +3 -6
- package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +3 -6
- package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +3 -6
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +2 -2
- package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +8 -4
- package/libx/_runtime/cds-services/services/Service.js +0 -6
- package/libx/_runtime/cds-services/services/utils/columns.js +10 -3
- package/libx/_runtime/cds-services/services/utils/compareJson.js +4 -7
- package/libx/_runtime/cds-services/services/utils/differ.js +4 -1
- package/libx/_runtime/cds-services/services/utils/handlerUtils.js +1 -41
- package/libx/_runtime/cds-services/util/assert.js +1 -262
- package/libx/_runtime/cds.js +6 -9
- package/libx/_runtime/common/aspects/entity.js +1 -1
- package/libx/_runtime/common/composition/delete.js +4 -2
- package/libx/_runtime/common/composition/update.js +27 -35
- package/libx/_runtime/common/composition/utils.js +3 -7
- package/libx/_runtime/common/error/standardError.js +11 -0
- package/libx/_runtime/common/generic/auth.js +61 -30
- package/libx/_runtime/common/generic/crud.js +11 -23
- package/libx/_runtime/common/generic/input.js +20 -0
- package/libx/_runtime/common/generic/paging.js +2 -2
- package/libx/_runtime/common/generic/put.js +4 -10
- package/libx/_runtime/common/generic/sorting.js +12 -30
- package/libx/_runtime/common/perf/index.js +24 -0
- package/libx/_runtime/common/utils/cqn.js +58 -1
- package/libx/_runtime/common/utils/cqn2cqn4sql.js +289 -114
- package/libx/_runtime/common/utils/csn.js +38 -56
- package/libx/_runtime/common/utils/entityFromCqn.js +6 -6
- package/libx/_runtime/common/utils/resolveView.js +4 -5
- package/libx/_runtime/common/utils/rewriteAsterisks.js +46 -5
- package/libx/_runtime/common/utils/search2cqn4sql.js +21 -9
- package/libx/_runtime/common/utils/structured.js +35 -25
- package/libx/_runtime/db/Service.js +0 -6
- package/libx/_runtime/db/expand/expand-v2.js +130 -0
- package/libx/_runtime/db/expand/expandCQNToJoin.js +82 -61
- package/libx/_runtime/db/expand/index.js +3 -1
- package/libx/_runtime/db/generic/arrayed.js +14 -27
- package/libx/_runtime/db/generic/input.js +52 -10
- package/libx/_runtime/db/generic/integrity.js +367 -26
- package/libx/_runtime/db/generic/virtual.js +51 -13
- package/libx/_runtime/db/query/update.js +9 -3
- package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +8 -9
- package/libx/_runtime/{common → db}/utils/propagateForeignKeys.js +11 -14
- package/libx/_runtime/fiori/generic/activate.js +1 -0
- package/libx/_runtime/fiori/generic/before.js +2 -1
- package/libx/_runtime/fiori/generic/edit.js +2 -1
- package/libx/_runtime/fiori/generic/patch.js +1 -1
- package/libx/_runtime/fiori/generic/read.js +151 -57
- package/libx/_runtime/fiori/uiflex/handler/transformRESULT.js +0 -4
- package/libx/_runtime/fiori/uiflex/index.js +1 -1
- package/libx/_runtime/fiori/uiflex/{extensibility/index.js → service.js} +6 -4
- package/libx/_runtime/fiori/utils/delete.js +7 -1
- package/libx/_runtime/hana/Service.js +1 -8
- package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +5 -14
- package/libx/_runtime/hana/execute.js +10 -4
- package/libx/_runtime/hana/pool.js +55 -45
- package/libx/_runtime/hana/search.js +7 -6
- package/libx/_runtime/hana/search2cqn4sql.js +8 -5
- package/libx/_runtime/hana/searchToContains.js +3 -1
- package/libx/_runtime/index.js +5 -5
- package/libx/_runtime/messaging/AMQPWebhookMessaging.js +3 -3
- package/libx/_runtime/messaging/Outbox.js +53 -0
- package/libx/_runtime/messaging/common-utils/AMQPClient.js +17 -10
- package/libx/_runtime/messaging/common-utils/connections.js +14 -9
- package/libx/_runtime/messaging/common-utils/waitingTime.js +2 -0
- package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -3
- package/libx/_runtime/messaging/enterprise-messaging-utils/registerEndpoints.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging.js +21 -15
- package/libx/_runtime/messaging/file-based.js +5 -5
- package/libx/_runtime/messaging/message-queuing.js +2 -3
- package/libx/_runtime/messaging/outbox/OutboxRunner.js +75 -0
- package/libx/_runtime/messaging/outbox/utils.js +192 -0
- package/libx/_runtime/messaging/service.js +16 -30
- package/libx/_runtime/remote/Service.js +21 -2
- package/libx/_runtime/remote/utils/client.js +15 -3
- package/libx/_runtime/remote/utils/{dataConversion.js → data.js} +12 -2
- package/libx/_runtime/sqlite/Service.js +7 -10
- package/libx/_runtime/sqlite/customBuilder/CustomExpressionBuilder.js +19 -0
- package/libx/_runtime/sqlite/execute.js +18 -12
- package/libx/_runtime/types/api.js +2 -1
- package/libx/odata/{odata2cqn/afterburner.js → afterburner.js} +28 -16
- package/libx/odata/{cqn2odata/index.js → cqn2odata.js} +1 -1
- package/libx/odata/{odata2cqn/grammar.pegjs → grammar.pegjs} +182 -118
- package/libx/odata/index.js +18 -15
- package/libx/odata/parser.js +1 -0
- package/libx/odata/utils.js +57 -0
- package/libx/rest/RestAdapter.js +2 -6
- package/libx/rest/utils/data.js +1 -6
- package/package.json +4 -3
- package/server.js +13 -10
- package/srv/audit-log.cds +87 -0
- package/{libx/_runtime/fiori/uiflex/extensibility/index.cds → srv/flex.cds} +0 -0
- package/srv/flex.js +1 -0
- package/srv/outbox.cds +11 -0
- package/srv/outbox.js +0 -0
- package/libx/_runtime/cds-services/adapter/perf/performance.js +0 -104
- package/libx/_runtime/cds-services/adapter/perf/performanceMeasurement.js +0 -33
- package/libx/odata/odata2cqn/index.js +0 -3
- package/libx/odata/odata2cqn/parser.js +0 -1
- package/libx/odata/readme.md +0 -1
- package/libx/odata/utils/index.js +0 -64
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function peg$subclass(t,r){function e(){this.constructor=t}e.prototype=r.prototype,t.prototype=new e}function peg$SyntaxError(t,r,e,n){this.message=t,this.expected=r,this.found=e,this.location=n,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,peg$SyntaxError)}function peg$parse(t,r){r=void 0!==r?r:{};var e,n={},s={ODataRelativeURI:Fe},a=Fe,u="/",o=Ee("/",!1),c=Ee("?",!1),i=Ee("&",!1),f="$count",l=Ee("$count",!1),h="$ref",p=Ee("$ref",!1),A="$value",d=Ee("$value",!1),g=function(t){return[t]},v=function(t,r){return r},b=Ee("=",!1),y="$select=",m=Ee("$select=",!1),C="$expand=",x=Ee("$expand=",!1),w="$filter=",$=Ee("$filter=",!1),E="$orderby=",S=Ee("$orderby=",!1),B="$top=",z=Ee("$top=",!1),Z="$skip=",O=Ee("$skip=",!1),T="$skiptoken=",F=Ee("$skiptoken=",!1),L="$search=",j=Ee("$search=",!1),k="$count=",R=Ee("$count=",!1),_="$apply=",N=Ee("$apply=",!1),q=Ee("*",!1),I=Ee(";",!1),D=function(t){return t?[t]:[]},U=function(t,r){t.push({xpr:r})},M=function(t,r){t.push({val:r})},P=function(t,r,e){t.push(r,...e)},G=function(t,r){t.push(r)},H=function(t,r,e){t.push(r,...e)},J=":",K=Ee(":",!1),Q="any",V=Ee("any",!1),W="all",X=Ee("all",!1),Y=Ee("asc",!1),tt="desc",rt=Ee("desc",!1),et=/^[a-zA-Z]/,nt=Se([["a","z"],["A","Z"]],!1,!1),st=/^[a-zA-Z0-9\-]/,at=Se([["a","z"],["A","Z"],["0","9"],"-"],!1,!1),ut=/^[^&]/,ot=Se(["&"],!0,!1),ct=Be("a comparison"),it=Ee("eq",!1),ft=Ee("ne",!1),lt=Ee("lt",!1),ht=Ee("gt",!1),pt=Ee("le",!1),At=Ee("ge",!1),dt=(Ee("add",!1),Ee("sub",!1),Ee("mul",!1),Ee("div",!1),Ee("mod",!1),Be("an operand")),gt=Be("navigation with $count"),vt=function(t,r){return r},bt=function(t,r){return r?{id:t,where:r}:t},yt=Be("a reference"),mt=function(t,r){return r},Ct=function(t){return{val:t}},xt=Ee("{",!1),wt=/^[^}]/,$t=Se(["}"],!0,!1),Et=Ee("}",!1),St="[",Bt=Ee("[",!1),zt="]",Zt=Ee("]",!1),Ot=/^[^\]]/,Tt=Se(["]"],!0,!1),Ft=Be("a function call"),Lt=/^[a-z]/,jt=Se([["a","z"]],!1,!1),kt=function(t,r,e){return e},Rt=Be("a boolean function"),_t="contains",Nt=Ee("contains",!1),qt="endswith",It=Ee("endswith",!1),Dt="startswith",Ut=Ee("startswith",!1),Mt=Ee("NOT",!0),Pt=Ee("AND",!0),Gt=Ee("OR",!0),Ht="aggregate",Jt=Ee("aggregate",!1),Kt="groupby",Qt=Ee("groupby",!1),Vt="filter",Wt=Ee("filter",!1),Xt="expand",Yt=Ee("expand",!1),tr="search",rr=Ee("search",!1),er="concat",nr=Ee("concat",!1),sr="compute",ar=Ee("compute",!1),ur="topcount",or=Ee("topcount",!1),cr="bottomcount",ir=Ee("bottomcount",!1),fr="topsum",lr=Ee("topsum",!1),hr="bottomsum",pr=Ee("bottomsum",!1),Ar="toppercent",dr=Ee("toppercent",!1),gr="bottompercent",vr=Ee("bottompercent",!1),br="with",yr=Ee("with",!1),mr="from",Cr=Ee("from",!1),xr=Ee("as",!1),wr="rollup",$r=Ee("rollup",!1),Er="$all",Sr=Ee("$all",!1),Br="identity",zr=Ee("identity",!1),Zr="true",Or=Ee("true",!1),Tr="false",Fr=Ee("false",!1),Lr=Be("Edm.String"),jr=Ee("'",!1),kr="''",Rr=Ee("''",!1),_r=/^[^']/,Nr=Se(["'"],!0,!1),qr='"',Ir=Ee('"',!1),Dr='\\"',Ur=Ee('\\"',!1),Mr=/^[^"]/,Pr=Se(['"'],!0,!1),Gr=/^[a-zA-Z0-9.+\-]/,Hr=Se([["a","z"],["A","Z"],["0","9"],".","+","-"],!1,!1),Jr=/^[0-9]/,Kr=Se([["0","9"]],!1,!1),Qr="-",Vr=Ee("-",!1),Wr=Ee("T",!1),Xr=".",Yr=Ee(".",!1),te=Ee("Z",!1),re=Ee("+",!1),ee=/^[+\-]/,ne=Se(["+","-"],!1,!1),se=Ee("e",!1),ae=/^[_a-zA-Z]/,ue=Se(["_",["a","z"],["A","Z"]],!1,!1),oe=/^[_a-zA-Z0-9"."]/,ce=Se(["_",["a","z"],["A","Z"],["0","9"],'"',".",'"'],!1,!1),ie=/^[0-9a-fA-F]/,fe=Se([["0","9"],["a","f"],["A","F"]],!1,!1),le=/^[a-zA-Z0-9\-"."_~!$&'()*+,;=:@]/,he=Se([["a","z"],["A","Z"],["0","9"],"-",'"',".",'"',"_","~","!","$","&","'","(",")","*","+",",",";","=",":","@"],!1,!1),pe=Ee(",",!1),Ae=Ee("(",!1),de=Ee(")",!1),ge=Be("optional whitespaces"),ve=/^[ \t\n]/,be=Se([" ","\t","\n"],!1,!1),ye=Be("mandatory whitespaces"),me=0,Ce=[{line:1,column:1}],xe=0,we=[],$e=0;if("startRule"in r){if(!(r.startRule in s))throw new Error("Can't start parsing from rule \""+r.startRule+'".');a=s[r.startRule]}function Ee(t,r){return{type:"literal",text:t,ignoreCase:r}}function Se(t,r,e){return{type:"class",parts:t,inverted:r,ignoreCase:e}}function Be(t){return{type:"other",description:t}}function ze(r){var e,n=Ce[r];if(n)return n;for(e=r-1;!Ce[e];)e--;for(n={line:(n=Ce[e]).line,column:n.column};e<r;)10===t.charCodeAt(e)?(n.line++,n.column=1):n.column++,e++;return Ce[r]=n,n}function Ze(t,r){var e=ze(t),n=ze(r);return{start:{offset:t,line:e.line,column:e.column},end:{offset:r,line:n.line,column:n.column}}}function Oe(t){me<xe||(me>xe&&(xe=me,we=[]),we.push(t))}function Te(t,r,e){return new peg$SyntaxError(peg$SyntaxError.buildMessage(t,r),t,r,e)}function Fe(){var r,e,s,a,f,l,h,p,A,d,g,v,b,y;if(r=me,47===t.charCodeAt(me)?(e=u,me++):(e=n,0===$e&&Oe(o)),e===n&&(e=null),e!==n)if(s=me,(a=Le())!==n&&(s,a=void(Fn=a)),(s=a)!==n){if(a=me,(f=Sn())!==n)if(63===t.charCodeAt(me)?(l="?",me++):(l=n,0===$e&&Oe(c)),l!==n)if((h=Sn())!==n)if((p=ke())!==n){for(A=[],d=me,(g=Sn())!==n?(38===t.charCodeAt(me)?(v="&",me++):(v=n,0===$e&&Oe(i)),v!==n&&(b=Sn())!==n&&(y=ke())!==n?d=g=[g,v,b,y]:(me=d,d=n)):(me=d,d=n);d!==n;)A.push(d),d=me,(g=Sn())!==n?(38===t.charCodeAt(me)?(v="&",me++):(v=n,0===$e&&Oe(i)),v!==n&&(b=Sn())!==n&&(y=ke())!==n?d=g=[g,v,b,y]:(me=d,d=n)):(me=d,d=n);A!==n?a=f=[f,l,h,p,A]:(me=a,a=n)}else me=a,a=n;else me=a,a=n;else me=a,a=n;else me=a,a=n;a===n&&(a=null),a!==n&&(f=Sn())!==n?(r,r=e=function(){if(Ln)return Fn.columns=[{args:[{val:1}],as:"$count",func:"count"}],delete Fn.expand,delete Fn.limit,delete Fn.orderBy,Fn.apply&&(Fn.apply={apply:Fn.apply},In(Fn,Fn.apply)),{SELECT:Fn};let t;if(Fn.expand){Fn.columns||(Fn.columns=["*"],t=!0);for(const t of Fn.expand){const r=Fn.columns.findIndex(Rn(t));r>-1&&Fn.columns.splice(r,1),Fn.columns.push(t)}delete Fn.expand}return In(Fn,Fn.apply,t),{SELECT:Fn}}()):(me=r,r=n)}else me=r,r=n;else me=r,r=n;return r}function Le(){var r,e,s,a,c,i,b,y;return r=me,t.substr(me,6)===f?(e=f,me+=6):(e=n,0===$e&&Oe(l)),e!==n&&(r,e=void(Ln=!0)),(r=e)===n&&(r=me,e=me,t.substr(me,4)===h?(s=h,me+=4):(s=n,0===$e&&Oe(p)),s===n&&(t.substr(me,6)===A?(s=A,me+=6):(s=n,0===$e&&Oe(d))),(e=s!==n?t.substring(e,me):s)!==n&&(r,y=e,e=!jn.includes(y)&&{from:{ref:[y]}}),(r=e)===n&&(r=me,e=me,(s=yn())!==n?(a=me,(c=$n())!==n&&(i=En())!==n?a=c=[c,i]:(me=a,a=n),a===n&&(a=me,(c=$n())!==n&&(i=je())!==n&&(b=En())!==n?a=c=[c,i,b]:(me=a,a=n)),a===n&&(a=null),a!==n?(c=me,$e++,i=xn(),$e--,i===n?c=void 0:(me=c,c=n),c!==n?e=s=[s,a,c]:(me=e,e=n)):(me=e,e=n)):(me=e,e=n),e===n&&(e=me,s=me,a=me,c=me,$e++,i=vn(),$e--,i===n?c=void 0:(me=c,c=n),c!==n&&(i=We())!==n?a=c=[c,i]:(me=a,a=n),a!==n&&(s,a=a[1]),(s=a)===n&&(s=xn()),s!==n&&(e,s=g(s)),e=s),e!==n?(s=me,47===t.charCodeAt(me)?(a=u,me++):(a=n,0===$e&&Oe(o)),a!==n&&(c=Le())!==n?(s,s=a=v(0,c)):(me=s,s=n),s===n&&(s=null),s!==n?(r,r=e=function(t,r){const[e,n]=t,s=[n?n.length>2?{id:e,where:n[1].map((t=>t.val&&t.val.match&&t.val.match(/^"(.*)"$/)?{val:t.val.match(/^"(.*)"$/)[1]}:t))}:{id:e,where:[]}:On?`${"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,"val")?e.val:e}`:e];if(r&&r.from){const t=r.from.ref;Object.prototype.hasOwnProperty.call(t[0],"val")&&(s[s.length-1]={id:s[s.length-1],where:[t.shift()]}),s.push(...t)}const a={from:{ref:s}};return r&&r.columns&&(a.columns=r.columns),a}(e,s)):(me=r,r=n)):(me=r,r=n))),r}function je(){var r,e,s,a,u,o,c;return r=me,(e=We())!==n&&(r,e=g(e)),(r=e)===n&&(r=me,(e=Ve())!==n&&Sn()!==n?(61===t.charCodeAt(me)?(s="=",me++):(s=n,0===$e&&Oe(b)),s!==n&&Sn()!==n&&(a=We())!==n?(u=me,(o=wn())!==n&&(c=je())!==n?u=o=[o,c]:(me=u,u=n),u===n&&(u=null),u!==n?(r,r=e=function(t,r,e){const n=[t,"=",r];return e&&n.push("and",...e[1]),n}(e,a,u)):(me=r,r=n)):(me=r,r=n)):(me=r,r=n)),r}function ke(){var r,e,s,a,u,o,c,i,f,l;if(r=me,t.substr(me,8)===y?(e=y,me+=8):(e=n,0===$e&&Oe(m)),e!==n)if((s=Sn())!==n)if((a=Re())!==n){for(u=[],o=me,(c=wn())!==n&&(i=Re())!==n?o=c=[c,i]:(me=o,o=n);o!==n;)u.push(o),o=me,(c=wn())!==n&&(i=Re())!==n?o=c=[c,i]:(me=o,o=n);u!==n?r=e=[e,s,a,u]:(me=r,r=n)}else me=r,r=n;else me=r,r=n;else me=r,r=n;if(r===n){if(r=me,t.substr(me,8)===C?(e=C,me+=8):(e=n,0===$e&&Oe(x)),e!==n)if((s=Sn())!==n)if((a=_e())!==n){for(u=[],o=me,(c=wn())!==n&&(i=_e())!==n?o=c=[c,i]:(me=o,o=n);o!==n;)u.push(o),o=me,(c=wn())!==n&&(i=_e())!==n?o=c=[c,i]:(me=o,o=n);u!==n?r=e=[e,s,a,u]:(me=r,r=n)}else me=r,r=n;else me=r,r=n;else me=r,r=n;if(r===n&&(r=me,t.substr(me,8)===w?(e=w,me+=8):(e=n,0===$e&&Oe($)),e!==n&&(s=Sn())!==n&&(a=De())!==n?(r,l=a,r=e=void(Fn.where=l)):(me=r,r=n),r===n)){if(r=me,t.substr(me,9)===E?(e=E,me+=9):(e=n,0===$e&&Oe(S)),e!==n)if((s=Sn())!==n)if((a=He())!==n){for(u=[],o=me,(c=wn())!==n&&(i=He())!==n?o=c=[c,i]:(me=o,o=n);o!==n;)u.push(o),o=me,(c=wn())!==n&&(i=He())!==n?o=c=[c,i]:(me=o,o=n);u!==n?r=e=[e,s,a,u]:(me=r,r=n)}else me=r,r=n;else me=r,r=n;else me=r,r=n;r===n&&(r=me,t.substr(me,5)===B?(e=B,me+=5):(e=n,0===$e&&Oe(z)),e!==n&&(s=Sn())!==n?(a=function(){var t,r;t=me,(r=bn())!==n&&(t,e=r,r=void((Fn.limit||(Fn.limit={})).rows={val:e}));var e;return t=r}(),a!==n?r=e=[e,s,a]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,6)===Z?(e=Z,me+=6):(e=n,0===$e&&Oe(O)),e!==n&&(s=Sn())!==n&&(a=Ne())!==n?r=e=[e,s,a]:(me=r,r=n),r===n&&(r=me,t.substr(me,11)===T?(e=T,me+=11):(e=n,0===$e&&Oe(F)),e!==n&&(s=Sn())!==n&&(a=Ne())!==n?r=e=[e,s,a]:(me=r,r=n),r===n&&(r=me,t.substr(me,8)===L?(e=L,me+=8):(e=n,0===$e&&Oe(j)),e!==n&&(s=Sn())!==n&&(a=qe())!==n?(r,r=e=void((f=a)&&(Fn.search=f))):(me=r,r=n),r===n&&(r=me,t.substr(me,7)===k?(e=k,me+=7):(e=n,0===$e&&Oe(R)),e!==n&&(s=Sn())!==n?(a=function(){var t,r;t=me,(r=gn())!==n&&(t,r=void(r&&(Fn.count=!0)));return t=r}(),a!==n?r=e=[e,s,a]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,7)===_?(e=_,me+=7):(e=n,0===$e&&Oe(N)),e!==n?(s=me,(a=Sn())!==n&&(s,a=void(Fn.apply={})),(s=a)!==n&&(a=Je())!==n?r=e=[e,s,a]:(me=r,r=n)):(me=r,r=n),r===n&&(r=function(){var r,e,s,a,u,o;r=me,et.test(t.charAt(me))?(e=t.charAt(me),me++):(e=n,0===$e&&Oe(nt));if(e!==n){for(s=[],st.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(at));a!==n;)s.push(a),st.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(at));if(s!==n)if(61===t.charCodeAt(me)?(a="=",me++):(a=n,0===$e&&Oe(b)),a!==n){for(u=[],ut.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(ot));o!==n;)u.push(o),ut.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(ot));u!==n?r=e=[e,s,a,u]:(me=r,r=n)}else me=r,r=n;else me=r,r=n}else me=r,r=n;return r}())))))))}}return r}function Re(){var r,e,s;return r=me,42===t.charCodeAt(me)?(e="*",me++):(e=n,0===$e&&Oe(q)),e===n&&(e=Ve()),e!==n&&(r,s=e,Fn.columns=Array.isArray(Fn.columns)?Fn.columns:[],Fn.columns.find(Rn(s))||Fn.columns.push(s),e=s),r=e}function _e(){var r,e,s,a,u,o,c,i,f,l,h;if(r=me,e=me,42===t.charCodeAt(me)?(s="*",me++):(s=n,0===$e&&Oe(q)),s===n&&(s=Ve()),s!==n&&(e,s=function(t){const r="*"===t?{}:t;return r.expand="*",Array.isArray(Fn.expand)||(Fn.expand=[]),Fn.expand.find(Rn(r))||Fn.expand.push(r),r}(s)),(e=s)!==n){if(s=me,a=me,(u=$n())!==n&&(a,Tn.push(Fn),Fn=Fn.expand[Fn.expand.length-1],u=void(Fn.expand="*")),(a=u)!==n){for(u=me,o=[],c=me,(i=Sn())!==n?(59===t.charCodeAt(me)?(f=";",me++):(f=n,0===$e&&Oe(I)),f===n&&(f=null),f!==n&&(l=Sn())!==n&&(h=ke())!==n?c=i=[i,f,l,h]:(me=c,c=n)):(me=c,c=n);c!==n;)o.push(c),c=me,(i=Sn())!==n?(59===t.charCodeAt(me)?(f=";",me++):(f=n,0===$e&&Oe(I)),f===n&&(f=null),f!==n&&(l=Sn())!==n&&(h=ke())!==n?c=i=[i,f,l,h]:(me=c,c=n)):(me=c,c=n);o!==n&&(u,o=function(t){if(Fn.columns){"*"===Fn.expand&&(Fn.expand=[]);for(const t of Fn.columns)Fn.expand.find(Rn(t))||Fn.expand.push(t);delete Fn.columns}else Array.isArray(Fn.expand)&&-1===Fn.expand.indexOf("*")&&Fn.expand.unshift("*")}()),(u=o)!==n?(o=me,(c=En())!==n&&(o,c=void(Fn=Tn.pop())),(o=c)!==n?s=a=[a,u,o]:(me=s,s=n)):(me=s,s=n)}else me=s,s=n;s===n&&(s=null),s!==n?(a=me,(u=wn())!==n&&(o=_e())!==n?a=u=[u,o]:(me=a,a=n),a===n&&(a=null),a!==n?r=e=[e,s,a]:(me=r,r=n)):(me=r,r=n)}else me=r,r=n;return r}function Ne(){var t,r,e;return t=me,(r=bn())!==n&&(t,e=r,Fn.limit&&Fn.limit.offset&&Fn.limit.offset.val&&(e+=Fn.limit.offset.val),r=void((Fn.limit||(Fn.limit={})).offset={val:e})),t=r}function qe(){var t,r;return t=me,(r=Ie())!==n&&(t,r=r),(t=r)===n&&(t=Sn()),t}function Ie(){var r,e,s,a,u,o,c;if(r=me,e=me,(s=rn())===n&&(s=null),s!==n&&(e,s=D(s)),(e=s)!==n)if(s=me,(a=$n())!==n&&(u=Ie())!==n&&(o=En())!==n?(s,s=a=U(e,u)):(me=s,s=n),s===n&&(s=me,a=function(){var r,e,s,a,u;r=me,34===t.charCodeAt(me)?(e=qr,me++):(e=n,0===$e&&Oe(Ir));if(e!==n){for(s=me,a=[],t.substr(me,2)===Dr?(u=Dr,me+=2):(u=n,0===$e&&Oe(Ur)),u===n&&(Mr.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Pr)));u!==n;)a.push(u),t.substr(me,2)===Dr?(u=Dr,me+=2):(u=n,0===$e&&Oe(Ur)),u===n&&(Mr.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Pr)));(s=a!==n?t.substring(s,me):a)!==n?(34===t.charCodeAt(me)?(a=qr,me++):(a=n,0===$e&&Oe(Ir)),a!==n?(r,r=e=s.replace(/\\\\/g,"\\").replace(/\\"/g,'"')):(me=r,r=n)):(me=r,r=n)}else me=r,r=n;return r}(),a!==n&&(s,a=M(e,a)),(s=a)===n&&(s=me,(a=vn())!==n&&(s,a=M(e,a)),(s=a)===n&&(s=me,a=function(){var r,e,s;r=me,e=[],Gr.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(Hr));if(s!==n)for(;s!==n;)e.push(s),Gr.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(Hr));else e=n;r=e!==n?t.substring(r,me):e;return r}(),a!==n&&(s,a=M(e,a)),s=a))),s!==n){for(a=[],u=me,(o=en())===n&&(o=sn())===n&&(o=nn()),o!==n&&(c=Ie())!==n?(u,u=o=P(e,o,c)):(me=u,u=n);u!==n;)a.push(u),u=me,(o=en())===n&&(o=sn())===n&&(o=nn()),o!==n&&(c=Ie())!==n?(u,u=o=P(e,o,c)):(me=u,u=n);a!==n?(r,r=e=e):(me=r,r=n)}else me=r,r=n;else me=r,r=n;return r}function De(){var t,r;return t=me,(r=Ue())!==n&&(t,r=r),t=r}function Ue(){var r,e,s,a,u,o,c,i;if(r=me,e=me,(s=rn())===n&&(s=null),s!==n&&(e,s=D(s)),(e=s)!==n)if(s=me,(a=$n())!==n&&(u=Ue())!==n&&(o=En())!==n?(s,s=a=U(e,u)):(me=s,s=n),s===n&&(s=me,(a=Ke())!==n&&(s,i=a,a=void e.push(...i)),(s=a)===n&&(s=me,(a=Me())!==n&&(s,a=function(t,r){t.push(...r)}(e,a)),(s=a)===n&&(s=me,a=function(){var r,e,s,a;$e++,r=me,t.substr(me,8)===_t?(e=_t,me+=8):(e=n,0===$e&&Oe(Nt));e===n&&(t.substr(me,8)===qt?(e=qt,me+=8):(e=n,0===$e&&Oe(It)),e===n&&(t.substr(me,10)===Dt?(e=Dt,me+=10):(e=n,0===$e&&Oe(Ut))));e!==n&&$n()!==n&&(s=Qe())!==n&&wn()!==n&&(a=Qe())!==n&&En()!==n?(r,r=e={func:e,args:[s,a]}):(me=r,r=n);$e--,r===n&&(e=n,0===$e&&Oe(Rt));return r}(),a!==n&&(s,a=function(t,r){t.push(r)}(e,a)),(s=a)===n&&(s=me,(a=gn())!==n&&(s,a=M(e,a)),s=a)))),s!==n){for(a=[],u=me,(o=en())===n&&(o=sn()),o!==n&&(c=Ue())!==n?(u,u=o=P(e,o,c)):(me=u,u=n);u!==n;)a.push(u),u=me,(o=en())===n&&(o=sn()),o!==n&&(c=Ue())!==n?(u,u=o=P(e,o,c)):(me=u,u=n);a!==n?(r,r=e=e):(me=r,r=n)}else me=r,r=n;else me=r,r=n;return r}function Me(){var r,e,s,a,c,i,f;if(r=me,e=me,(s=yn())!==n&&(e,s=[s]),(e=s)!==n)if(47===t.charCodeAt(me)?(s=u,me++):(s=n,0===$e&&Oe(o)),s!==n){for(a=[],c=me,(i=yn())!==n?(47===t.charCodeAt(me)?(f=u,me++):(f=n,0===$e&&Oe(o)),f!==n?(c,c=i=G(e,i)):(me=c,c=n)):(me=c,c=n);c!==n;)a.push(c),c=me,(i=yn())!==n?(47===t.charCodeAt(me)?(f=u,me++):(f=n,0===$e&&Oe(o)),f!==n?(c,c=i=G(e,i)):(me=c,c=n)):(me=c,c=n);a!==n?(c=me,i=function(){var r,e,s;r=me,t.substr(me,3)===Q?(e=Q,me+=3):(e=n,0===$e&&Oe(V));e!==n&&$n()!==n?((s=Ge())===n&&(s=null),s!==n&&En()!==n?(r,r=e=s):(me=r,r=n)):(me=r,r=n);return r}(),i!==n&&(c,i=function(t,r){let e=t.pop();if(!r)return["exists",{ref:[...t,{id:e}]}];let n=[];for(let t=0,s=0;t<r.length;++t){let a=r[t];a.ref&&0===a.ref.length&&"="===r[t+1]?n[s++]={func:"contains",args:[{ref:e},r[t+=2]]}:n[s++]=a}return n.length<r.length?(e=t.pop(),["exists",{ref:[...t,{id:e,where:n}]}]):["exists",{ref:[...t,{id:e,where:r}]}]}(e,i)),(c=i)===n&&(c=me,i=function(){var r,e,s;r=me,t.substr(me,3)===W?(e=W,me+=3):(e=n,0===$e&&Oe(X));e!==n&&$n()!==n&&(s=Ge())!==n&&En()!==n?(r,r=e=s):(me=r,r=n);return r}(),i!==n&&(c,i=function(t,r){let e=t.pop();return["not","exists",{ref:[...t,{id:e,where:["not",{xpr:[...r]}]}]}]}(e,i)),c=i),c!==n?(r,r=e=c):(me=r,r=n)):(me=r,r=n)}else me=r,r=n;else me=r,r=n;return r}function Pe(){var t,r,e,s,a,u,o,c,i;if(t=me,r=me,(e=rn())===n&&(e=null),e!==n&&(r,e=(c=e)?[c]:[]),(r=e)!==n)if(e=me,(s=$n())!==n&&(a=Pe())!==n&&(u=En())!==n?(e,i=a,e=s=void r.push("(",...i,")")):(me=e,e=n),e===n&&(e=me,(s=Ke())!==n&&(e,s=function(t,r){t.push(...r)}(r,s)),(e=s)===n&&(e=me,(s=Me())!==n&&(e,s=function(t,r){t.push(...r)}(r,s)),e=s)),e!==n){for(s=[],a=me,(u=en())===n&&(u=sn()),u!==n&&(o=Pe())!==n?(a,a=u=H(r,u,o)):(me=a,a=n);a!==n;)s.push(a),a=me,(u=en())===n&&(u=sn()),u!==n&&(o=Pe())!==n?(a,a=u=H(r,u,o)):(me=a,a=n);s!==n?(t,t=r=r):(me=t,t=n)}else me=t,t=n;else me=t,t=n;return t}function Ge(){var r,e,s,a;return r=me,(e=yn())!==n?(58===t.charCodeAt(me)?(s=J,me++):(s=n,0===$e&&Oe(K)),s!==n&&(a=Pe())!==n?(r,r=e=function(t,r){for(const e of r)e.ref&&e.ref[0]===t&&e.ref.shift();return r}(e,a)):(me=r,r=n)):(me=r,r=n),r}function He(){var r,e,s,a,u;return r=me,(e=tn())===n&&(e=Ve()),e!==n?(s=me,Bn()!==n?(a=me,"asc"===t.substr(me,3)?(u="asc",me+=3):(u=n,0===$e&&Oe(Y)),u===n&&(t.substr(me,4)===tt?(u=tt,me+=4):(u=n,0===$e&&Oe(rt))),(a=u!==n?t.substring(a,me):u)!==n?(s,s=a):(me=s,s=n)):(me=s,s=n),s===n&&(s=null),s!==n?(r,r=e=function(t,r){const e=zn(t,r&&{sort:r});Fn.orderBy=Fn.orderBy?[...Fn.orderBy,e]:[e]}(e,s)):(me=r,r=n)):(me=r,r=n),r}function Je(){var r,e,s,a,c,i;if(r=me,(e=an())!==n){for(s=[],a=me,47===t.charCodeAt(me)?(c=u,me++):(c=n,0===$e&&Oe(o)),c!==n&&(i=an())!==n?a=c=[c,i]:(me=a,a=n);a!==n;)s.push(a),a=me,47===t.charCodeAt(me)?(c=u,me++):(c=n,0===$e&&Oe(o)),c!==n&&(i=an())!==n?a=c=[c,i]:(me=a,a=n);s!==n?r=e=[e,s]:(me=r,r=n)}else me=r,r=n;return r}function Ke(){var r,e,s,a,u,o;return $e++,r=me,(e=Qe())!==n&&Bn()!==n?(s=me,"eq"===t.substr(me,2)?(a="eq",me+=2):(a=n,0===$e&&Oe(it)),a===n&&("ne"===t.substr(me,2)?(a="ne",me+=2):(a=n,0===$e&&Oe(ft)),a===n&&("lt"===t.substr(me,2)?(a="lt",me+=2):(a=n,0===$e&&Oe(lt)),a===n&&("gt"===t.substr(me,2)?(a="gt",me+=2):(a=n,0===$e&&Oe(ht)),a===n&&("le"===t.substr(me,2)?(a="le",me+=2):(a=n,0===$e&&Oe(pt)),a===n&&("ge"===t.substr(me,2)?(a="ge",me+=2):(a=n,0===$e&&Oe(At))))))),(s=a!==n?t.substring(s,me):a)!==n&&(a=Bn())!==n&&(u=Qe())!==n?(r,r=e=[e,{eq:"=",ne:"!=",lt:"<",gt:">",le:"<=",ge:">="}[o=s]||o,u]):(me=r,r=n)):(me=r,r=n),$e--,r===n&&(e=n,0===$e&&Oe(ct)),r}function Qe(){var r;return $e++,r=function(){var r,e,s,a,c,i,h;$e++,r=me,e=[],s=me,(a=yn())!==n?(c=me,(i=$n())!==n&&(h=je())!==n&&En()!==n?(c,c=i=vt(0,h)):(me=c,c=n),c===n&&(c=null),c!==n?(47===t.charCodeAt(me)?(i=u,me++):(i=n,0===$e&&Oe(o)),i!==n?(s,s=a=bt(a,c)):(me=s,s=n)):(me=s,s=n)):(me=s,s=n);if(s!==n)for(;s!==n;)e.push(s),s=me,(a=yn())!==n?(c=me,(i=$n())!==n&&(h=je())!==n&&En()!==n?(c,c=i=vt(0,h)):(me=c,c=n),c===n&&(c=null),c!==n?(47===t.charCodeAt(me)?(i=u,me++):(i=n,0===$e&&Oe(o)),i!==n?(s,s=a=bt(a,c)):(me=s,s=n)):(me=s,s=n)):(me=s,s=n);else e=n;e!==n?(t.substr(me,6)===f?(s=f,me+=6):(s=n,0===$e&&Oe(l)),s!==n?(r,r=e={func:"count",as:"$count",args:[{ref:e}]}):(me=r,r=n)):(me=r,r=n);$e--,r===n&&(e=n,0===$e&&Oe(gt));return r}(),r===n&&(r=tn())===n&&(r=Ve())===n&&(r=We())===n&&(r=Xe())===n&&(r=Ye())===n&&(r=function(){var r,e,s,a,u;r=me,91===t.charCodeAt(me)?(e=St,me++):(e=n,0===$e&&Oe(Bt));if(e!==n){for(s=me,a=[],Ot.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Tt));u!==n;)a.push(u),Ot.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Tt));(s=a!==n?t.substring(s,me):a)!==n?(93===t.charCodeAt(me)?(a=zt,me++):(a=n,0===$e&&Oe(Zt)),a!==n?(r,r=e={list:s.replace(/"/g,"").split(",").map((t=>({val:t})))}):(me=r,r=n)):(me=r,r=n)}else me=r,r=n;return r}()),$e--,r===n&&(n,0===$e&&Oe(dt)),r}function Ve(){var r,e,s,a,c,i,f,l;if($e++,r=me,(e=yn())!==n){for(s=[],a=me,47===t.charCodeAt(me)?(c=u,me++):(c=n,0===$e&&Oe(o)),c!==n&&(i=yn())!==n?(a,a=c=mt(0,i)):(me=a,a=n);a!==n;)s.push(a),a=me,47===t.charCodeAt(me)?(c=u,me++):(c=n,0===$e&&Oe(o)),c!==n&&(i=yn())!==n?(a,a=c=mt(0,i)):(me=a,a=n);s!==n?(r,l=s,r=e="null"===(f=e)?{val:null}:{ref:[f,...l]}):(me=r,r=n)}else me=r,r=n;return $e--,r===n&&(e=n,0===$e&&Oe(yt)),r}function We(){var r,e,s;return r=me,(e=gn())===n&&(e=function(){var r,e,s,a,u,o,c,i,f,l,h,p,A,d,g,v,b,y,m,C,x,w,$,E;r=me,e=me,s=[],Jr.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(Kr));if(a!==n)for(;a!==n;)s.push(a),Jr.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(Kr));else s=n;if(s!==n)if(45===t.charCodeAt(me)?(a=Qr,me++):(a=n,0===$e&&Oe(Vr)),a!==n)if(Jr.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Kr)),u!==n)if(Jr.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(Kr)),o!==n)if(45===t.charCodeAt(me)?(c=Qr,me++):(c=n,0===$e&&Oe(Vr)),c!==n)if(Jr.test(t.charAt(me))?(i=t.charAt(me),me++):(i=n,0===$e&&Oe(Kr)),i!==n)if(Jr.test(t.charAt(me))?(f=t.charAt(me),me++):(f=n,0===$e&&Oe(Kr)),f!==n){if(l=me,84===t.charCodeAt(me)?(h="T",me++):(h=n,0===$e&&Oe(Wr)),h!==n)if(Jr.test(t.charAt(me))?(p=t.charAt(me),me++):(p=n,0===$e&&Oe(Kr)),p!==n)if(Jr.test(t.charAt(me))?(A=t.charAt(me),me++):(A=n,0===$e&&Oe(Kr)),A!==n)if(58===t.charCodeAt(me)?(d=J,me++):(d=n,0===$e&&Oe(K)),d!==n)if(Jr.test(t.charAt(me))?(g=t.charAt(me),me++):(g=n,0===$e&&Oe(Kr)),g!==n)if(Jr.test(t.charAt(me))?(v=t.charAt(me),me++):(v=n,0===$e&&Oe(Kr)),v!==n){if(b=me,58===t.charCodeAt(me)?(y=J,me++):(y=n,0===$e&&Oe(K)),y!==n)if(Jr.test(t.charAt(me))?(m=t.charAt(me),me++):(m=n,0===$e&&Oe(Kr)),m!==n)if(Jr.test(t.charAt(me))?(C=t.charAt(me),me++):(C=n,0===$e&&Oe(Kr)),C!==n){if(x=me,46===t.charCodeAt(me)?(w=".",me++):(w=n,0===$e&&Oe(Yr)),w!==n){if($=[],Jr.test(t.charAt(me))?(E=t.charAt(me),me++):(E=n,0===$e&&Oe(Kr)),E!==n)for(;E!==n;)$.push(E),Jr.test(t.charAt(me))?(E=t.charAt(me),me++):(E=n,0===$e&&Oe(Kr));else $=n;$!==n?x=w=[w,$]:(me=x,x=n)}else me=x,x=n;x===n&&(x=null),x!==n?b=y=[y,m,C,x]:(me=b,b=n)}else me=b,b=n;else me=b,b=n;else me=b,b=n;b===n&&(b=null),b!==n?(90===t.charCodeAt(me)?(y="Z",me++):(y=n,0===$e&&Oe(te)),y===n&&(y=me,43===t.charCodeAt(me)?(m="+",me++):(m=n,0===$e&&Oe(re)),m===n&&(45===t.charCodeAt(me)?(m=Qr,me++):(m=n,0===$e&&Oe(Vr))),m!==n?(Jr.test(t.charAt(me))?(C=t.charAt(me),me++):(C=n,0===$e&&Oe(Kr)),C!==n?(Jr.test(t.charAt(me))?(x=t.charAt(me),me++):(x=n,0===$e&&Oe(Kr)),x!==n?(58===t.charCodeAt(me)?(w=J,me++):(w=n,0===$e&&Oe(K)),w!==n?(Jr.test(t.charAt(me))?($=t.charAt(me),me++):($=n,0===$e&&Oe(Kr)),$!==n?(Jr.test(t.charAt(me))?(E=t.charAt(me),me++):(E=n,0===$e&&Oe(Kr)),E!==n?y=m=[m,C,x,w,$,E]:(me=y,y=n)):(me=y,y=n)):(me=y,y=n)):(me=y,y=n)):(me=y,y=n)):(me=y,y=n)),y===n&&(y=null),y!==n?l=h=[h,p,A,d,g,v,b,y]:(me=l,l=n)):(me=l,l=n)}else me=l,l=n;else me=l,l=n;else me=l,l=n;else me=l,l=n;else me=l,l=n;else me=l,l=n;l===n&&(l=null),l!==n?e=s=[s,a,u,o,c,i,f,l]:(me=e,e=n)}else me=e,e=n;else me=e,e=n;else me=e,e=n;else me=e,e=n;else me=e,e=n;else me=e,e=n;else me=e,e=n;r=e!==n?t.substring(r,me):e;return r}()),e!==n&&(r,e=Ct(e)),(r=e)===n&&(r=me,(e=mn())!==n&&(r,e=Ct(e)),(r=e)===n&&(r=me,e=function(){var r,e,s,a,u,o,c,i,f,l;r=me,e=me,s=me,ee.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(ne));a===n&&(a=null);if(a!==n){if(u=[],Jr.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(Kr)),o!==n)for(;o!==n;)u.push(o),Jr.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(Kr));else u=n;if(u!==n){if(o=me,46===t.charCodeAt(me)?(c=Xr,me++):(c=n,0===$e&&Oe(Yr)),c!==n){if(i=[],Jr.test(t.charAt(me))?(f=t.charAt(me),me++):(f=n,0===$e&&Oe(Kr)),f!==n)for(;f!==n;)i.push(f),Jr.test(t.charAt(me))?(f=t.charAt(me),me++):(f=n,0===$e&&Oe(Kr));else i=n;i!==n?o=c=[c,i]:(me=o,o=n)}else me=o,o=n;if(o===n&&(o=null),o!==n){if(c=me,101===t.charCodeAt(me)?(i="e",me++):(i=n,0===$e&&Oe(se)),i!==n){if(f=[],Jr.test(t.charAt(me))?(l=t.charAt(me),me++):(l=n,0===$e&&Oe(Kr)),l!==n)for(;l!==n;)f.push(l),Jr.test(t.charAt(me))?(l=t.charAt(me),me++):(l=n,0===$e&&Oe(Kr));else f=n;f!==n?c=i=[i,f]:(me=c,c=n)}else me=c,c=n;c===n&&(c=null),c!==n?s=a=[a,u,o,c]:(me=s,s=n)}else me=s,s=n}else me=s,s=n}else me=s,s=n;e=s!==n?t.substring(e,me):s;e!==n&&(r,e=kn(e));return r=e}(),e!==n&&(r,e="number"==typeof(s=e)?{val:s}:{val:s,literal:"number"}),(r=e)===n&&(r=me,(e=vn())!==n&&(r,e=Ct(e)),r=e))),r}function Xe(){var r,e,s,a,u,o;if(r=me,e=me,s=me,123===t.charCodeAt(me)?(a="{",me++):(a=n,0===$e&&Oe(xt)),a!==n){for(u=[],(o=Xe())===n&&(wt.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe($t)));o!==n;)u.push(o),(o=Xe())===n&&(wt.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe($t)));u!==n?(125===t.charCodeAt(me)?(o="}",me++):(o=n,0===$e&&Oe(Et)),o!==n?s=a=[a,u,o]:(me=s,s=n)):(me=s,s=n)}else me=s,s=n;return(e=s!==n?t.substring(e,me):s)!==n&&(r,e=Ct(e)),r=e}function Ye(){var r,e,s,a,u,o,c,i;if(r=me,e=me,s=me,91===t.charCodeAt(me)?(a=St,me++):(a=n,0===$e&&Oe(Bt)),a!==n&&(u=Sn())!==n?(93===t.charCodeAt(me)?(o=zt,me++):(o=n,0===$e&&Oe(Zt)),o!==n?s=a=[a,u,o]:(me=s,s=n)):(me=s,s=n),s===n)if(s=me,91===t.charCodeAt(me)?(a=St,me++):(a=n,0===$e&&Oe(Bt)),a!==n)if((u=Sn())!==n)if(123===t.charCodeAt(me)?(o="{",me++):(o=n,0===$e&&Oe(xt)),o!==n){for(c=[],(i=Ye())===n&&(Ot.test(t.charAt(me))?(i=t.charAt(me),me++):(i=n,0===$e&&Oe(Tt)));i!==n;)c.push(i),(i=Ye())===n&&(Ot.test(t.charAt(me))?(i=t.charAt(me),me++):(i=n,0===$e&&Oe(Tt)));c!==n?(93===t.charCodeAt(me)?(i=zt,me++):(i=n,0===$e&&Oe(Zt)),i!==n?s=a=[a,u,o,c,i]:(me=s,s=n)):(me=s,s=n)}else me=s,s=n;else me=s,s=n;else me=s,s=n;return(e=s!==n?t.substring(e,me):s)!==n&&(r,e=Ct(e)),r=e}function tn(){var r,e,s,a,u,o,c;if($e++,r=me,e=me,s=[],Lt.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(jt)),a!==n)for(;a!==n;)s.push(a),Lt.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(jt));else s=n;if((e=s!==n?t.substring(e,me):s)!==n)if((s=$n())!==n)if((a=Qe())!==n){for(u=[],o=me,wn()!==n&&(c=Qe())!==n?(o,o=kt(0,0,c)):(me=o,o=n);o!==n;)u.push(o),o=me,wn()!==n&&(c=Qe())!==n?(o,o=kt(0,0,c)):(me=o,o=n);u!==n&&(o=En())!==n?(r,r=e=function(t,r,e){if(Zn&&!(t in Zn.functions))throw Object.assign(new Error(`"${t}" is an unknown function in OData URL spec (strict mode)`),{statusCode:400});return{func:t,args:[r,...e]}}(e,a,u)):(me=r,r=n)}else me=r,r=n;else me=r,r=n;else me=r,r=n;return $e--,r===n&&(e=n,0===$e&&Oe(Ft)),r}function rn(){var r,e;return r=me,Sn()!==n?("not"===t.substr(me,3).toLowerCase()?(e=t.substr(me,3),me+=3):(e=n,0===$e&&Oe(Mt)),e!==n&&Bn()!==n?(r,r="not"):(me=r,r=n)):(me=r,r=n),r}function en(){var r,e;return r=me,Bn()!==n?("and"===t.substr(me,3).toLowerCase()?(e=t.substr(me,3),me+=3):(e=n,0===$e&&Oe(Pt)),e!==n&&Bn()!==n?(r,r="and"):(me=r,r=n)):(me=r,r=n),r}function nn(){var t,r;return t=me,(r=Bn())!==n&&(t,r="and"),t=r}function sn(){var r,e;return r=me,Bn()!==n?("or"===t.substr(me,2).toLowerCase()?(e=t.substr(me,2),me+=2):(e=n,0===$e&&Oe(Gt)),e!==n&&Bn()!==n?(r,r="or"):(me=r,r=n)):(me=r,r=n),r}function an(){var r,e,s;return r=me,t.substr(me,9)===Ht?(e=Ht,me+=9):(e=n,0===$e&&Oe(Jt)),e!==n?(s=function(){var t,r,e,s,a;if(t=me,$n()!==n)if(Sn()!==n)if((r=un())!==n){for(e=[],s=me,Sn()!==n&&wn()!==n&&Sn()!==n&&(a=un())!==n?(s,s=v(0,a)):(me=s,s=n);s!==n;)e.push(s),s=me,Sn()!==n&&wn()!==n&&Sn()!==n&&(a=un())!==n?(s,s=v(0,a)):(me=s,s=n);e!==n&&(s=Sn())!==n&&En()!==n?(t,t=function(t,r){let e=Fn.apply;e.aggregate&&(Fn.apply={apply:e},e.groupBy&&(Fn.apply.groupBy=e.groupBy),e=Fn.apply),e.aggregate=[t,...r]}(r,e)):(me=t,t=n)}else me=t,t=n;else me=t,t=n;else me=t,t=n;return t}(),s!==n?r=e=[e,s]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,7)===Kt?(e=Kt,me+=7):(e=n,0===$e&&Oe(Qt)),e!==n?(s=function(){var t,r,e,s,a,u,o,c,i;if(t=me,(r=$n())!==n)if((e=$n())!==n)if((s=hn())!==n){for(a=[],u=me,(o=wn())!==n&&(c=hn())!==n?(u,u=o=v(0,c)):(me=u,u=n);u!==n;)a.push(u),u=me,(o=wn())!==n&&(c=hn())!==n?(u,u=o=v(0,c)):(me=u,u=n);a!==n?(u=me,(o=En())!==n&&(u,o=function(t,r){let e=Fn.apply;(e.groupBy||e.where||e.search)&&(Fn.apply={apply:e},e=Fn.apply),e.groupBy=[t,...r]}(s,a)),(u=o)!==n?(o=me,(c=wn())!==n&&(i=Je())!==n?o=c=[c,i]:(me=o,o=n),o===n&&(o=null),o!==n&&(c=En())!==n?t=r=[r,e,s,a,u,o,c]:(me=t,t=n)):(me=t,t=n)):(me=t,t=n)}else me=t,t=n;else me=t,t=n;else me=t,t=n;return t}(),s!==n?r=e=[e,s]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,6)===Vt?(e=Vt,me+=6):(e=n,0===$e&&Oe(Wt)),e!==n&&(s=pn())!==n?r=e=[e,s]:(me=r,r=n),r===n&&(r=me,t.substr(me,6)===Xt?(e=Xt,me+=6):(e=n,0===$e&&Oe(Yt)),e!==n&&(s=An())!==n?r=e=[e,s]:(me=r,r=n),r===n&&(r=me,t.substr(me,6)===tr?(e=tr,me+=6):(e=n,0===$e&&Oe(rr)),e!==n?(s=function(){var t,r,e,s,a,u;t=me,(r=$n())!==n&&(e=Sn())!==n?(s=me,(a=qe())!==n&&(s,a=function(t){if(!t)return;let r=Fn.apply;r.search&&(Fn.apply={apply:r},r=Fn.apply),r.search=t}(a)),(s=a)!==n&&(a=Sn())!==n&&(u=En())!==n?t=r=[r,e,s,a,u]:(me=t,t=n)):(me=t,t=n);return t}(),s!==n?r=e=[e,s]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,6)===er?(e=er,me+=6):(e=n,0===$e&&Oe(nr)),e!==n?(s=function(){var t,r,e,s,a,u,o,c,i,f;if(t=me,(r=$n())!==n)if((e=Sn())!==n)if((s=Je())!==n){if(a=[],u=me,(o=Sn())!==n&&(c=wn())!==n&&(i=Sn())!==n&&(f=Je())!==n?u=o=[o,c,i,f]:(me=u,u=n),u!==n)for(;u!==n;)a.push(u),u=me,(o=Sn())!==n&&(c=wn())!==n&&(i=Sn())!==n&&(f=Je())!==n?u=o=[o,c,i,f]:(me=u,u=n);else a=n;a!==n&&(u=Sn())!==n&&(o=En())!==n?t=r=[r,e,s,a,u,o]:(me=t,t=n)}else me=t,t=n;else me=t,t=n;else me=t,t=n;return t}(),s!==n?r=e=[e,s]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,7)===sr?(e=sr,me+=7):(e=n,0===$e&&Oe(ar)),e!==n?(s=function(){var t,r,e,s,a,u,o,c,i,f;if(t=me,(r=$n())!==n)if((e=Sn())!==n)if((s=dn())!==n){for(a=[],u=me,(o=Sn())!==n&&(c=wn())!==n&&(i=Sn())!==n&&(f=dn())!==n?u=o=[o,c,i,f]:(me=u,u=n);u!==n;)a.push(u),u=me,(o=Sn())!==n&&(c=wn())!==n&&(i=Sn())!==n&&(f=dn())!==n?u=o=[o,c,i,f]:(me=u,u=n);a!==n&&(u=Sn())!==n&&(o=En())!==n?t=r=[r,e,s,a,u,o]:(me=t,t=n)}else me=t,t=n;else me=t,t=n;else me=t,t=n;return t}(),s!==n?r=e=[e,s]:(me=r,r=n)):(me=r,r=n),r===n&&(r=me,t.substr(me,8)===ur?(e=ur,me+=8):(e=n,0===$e&&Oe(or)),e===n&&(t.substr(me,11)===cr?(e=cr,me+=11):(e=n,0===$e&&Oe(ir)),e===n&&(t.substr(me,6)===fr?(e=fr,me+=6):(e=n,0===$e&&Oe(lr)),e===n&&(t.substr(me,9)===hr?(e=hr,me+=9):(e=n,0===$e&&Oe(pr)),e===n&&(t.substr(me,10)===Ar?(e=Ar,me+=10):(e=n,0===$e&&Oe(dr)),e===n&&(t.substr(me,13)===gr?(e=gr,me+=13):(e=n,0===$e&&Oe(vr))))))),e!==n?(s=function(){var t,r,e;t=me,$n()!==n&&Sn()!==n&&(r=Qe())!==n&&Sn()!==n&&wn()!==n&&Sn()!==n&&(e=Qe())!==n&&Sn()!==n&&En()!==n?(t,t=[r,e]):(me=t,t=n);return t}(),s!==n?(r,r=e=function(t,r){if(!{topcount:!0,bottomcount:!0,topsum:!1,bottomsum:!1,toppercent:!1,bottompercent:!1}[t])throw Object.assign(new Error(`Transformation "${t}" in $apply is not supported yet.`),{statusCode:501});(Fn.apply.aggregate||(Fn.apply.aggregate=[])).push({func:t,args:r})}(e,s)):(me=r,r=n)):(me=r,r=n),r===n&&(r=function(){var r;t.substr(me,8)===Br?(r=Br,me+=8):(r=n,0===$e&&Oe(zr));return r}())))))))),r}function un(){var r,e,s,a;return r=me,e=me,t.substr(me,6)===f?(s=f,me+=6):(s=n,0===$e&&Oe(l)),s!==n&&(a=ln())!==n?(e,e=s={func:"count",args:[{val:1}],as:a}):(me=e,e=n),e===n&&(e=on()),e!==n&&(r,e=e),r=e}function on(){var t,r,e,s,a;return t=me,(r=Ve())!==n&&(e=cn())!==n?((s=fn())===n&&(s=null),s!==n&&(a=ln())!==n?(t,t=r={func:e,args:[r],as:a}):(me=t,t=n)):(me=t,t=n),t===n&&(t=me,(r=yn())!==n&&(e=$n())!==n&&(s=on())!==n&&(a=En())!==n?t=r=[r,e,s,a]:(me=t,t=n)),t}function cn(){var r,e,s,a,u;if(r=me,Bn()!==n)if(t.substr(me,4)===br?(e=br,me+=4):(e=n,0===$e&&Oe(yr)),e!==n)if(Bn()!==n){if(s=me,a=[],Lt.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(jt)),u!==n)for(;u!==n;)a.push(u),Lt.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(jt));else a=n;(s=a!==n?t.substring(s,me):a)!==n?(r,r=s):(me=r,r=n)}else me=r,r=n;else me=r,r=n;else me=r,r=n;return r}function fn(){var r,e,s,a,u,o,c;return r=me,(e=Bn())!==n?(t.substr(me,4)===mr?(s=mr,me+=4):(s=n,0===$e&&Oe(Cr)),s!==n&&(a=Bn())!==n&&(u=Ve())!==n&&(o=cn())!==n?((c=fn())===n&&(c=null),c!==n?r=e=[e,s,a,u,o,c]:(me=r,r=n)):(me=r,r=n)):(me=r,r=n),r}function ln(){var r,e,s;return r=me,Bn()!==n?("as"===t.substr(me,2)?(e="as",me+=2):(e=n,0===$e&&Oe(xr)),e!==n&&Bn()!==n&&(s=yn())!==n?(r,r=s):(me=r,r=n)):(me=r,r=n),r}function hn(){var r,e;return r=me,e=function(){var r,e,s,a,u,o,c,i,f,l,h;r=me,e=me,t.substr(me,6)===wr?(s=wr,me+=6):(s=n,0===$e&&Oe($r));if(s!==n)if((a=$n())!==n)if((u=Sn())!==n)if(t.substr(me,4)===Er?(o=Er,me+=4):(o=n,0===$e&&Oe(Sr)),o===n&&(o=Ve()),o!==n){if(c=[],i=me,(f=Sn())!==n&&(l=wn())!==n&&(h=Ve())!==n?i=f=[f,l,h]:(me=i,i=n),i!==n)for(;i!==n;)c.push(i),i=me,(f=Sn())!==n&&(l=wn())!==n&&(h=Ve())!==n?i=f=[f,l,h]:(me=i,i=n);else c=n;c!==n&&(i=Sn())!==n&&(f=En())!==n?e=s=[s,a,u,o,c,i,f]:(me=e,e=n)}else me=e,e=n;else me=e,e=n;else me=e,e=n;else me=e,e=n;e!==n&&(r,e=function(t){const r=new Error("Rollup in groupby is not supported yet.");throw r.statusCode=501,r}());return r=e}(),e===n&&(e=Ve()),e!==n&&(r,e=e),r=e}function pn(){var t,r,e,s,a,u;return t=me,(r=$n())!==n&&(e=Sn())!==n?(s=me,(a=De())!==n&&(s,a=function(t){let r=Fn.apply;r.where&&(Fn.apply={apply:r},r=Fn.apply),r.where=t}(a)),(s=a)!==n&&(a=Sn())!==n&&(u=En())!==n?t=r=[r,e,s,a,u]:(me=t,t=n)):(me=t,t=n),t}function An(){var t,r,e,s,a,u,o,c,i,f,l,h,p,A;if(t=me,(r=$n())!==n)if((e=Sn())!==n)if((s=Ve())!==n)if((a=Sn())!==n)if((u=wn())!==n)if((o=Sn())!==n){if(c=me,(i=An())!==n){for(f=[],l=me,(h=Sn())!==n&&(p=wn())!==n&&(A=An())!==n?l=h=[h,p,A]:(me=l,l=n);l!==n;)f.push(l),l=me,(h=Sn())!==n&&(p=wn())!==n&&(A=An())!==n?l=h=[h,p,A]:(me=l,l=n);f!==n?c=i=[i,f]:(me=c,c=n)}else me=c,c=n;if(c===n)if(c=me,(i=pn())!==n){for(f=[],l=me,(h=Sn())!==n&&(p=wn())!==n&&(A=An())!==n?l=h=[h,p,A]:(me=l,l=n);l!==n;)f.push(l),l=me,(h=Sn())!==n&&(p=wn())!==n&&(A=An())!==n?l=h=[h,p,A]:(me=l,l=n);f!==n?c=i=[i,f]:(me=c,c=n)}else me=c,c=n;c!==n&&(i=Sn())!==n&&(f=En())!==n?t=r=[r,e,s,a,u,o,c,i,f]:(me=t,t=n)}else me=t,t=n;else me=t,t=n;else me=t,t=n;else me=t,t=n;else me=t,t=n;else me=t,t=n;return t}function dn(){var t,r,e;return t=me,(r=Ue())!==n&&(e=ln())!==n?t=r=[r,e]:(me=t,t=n),t}function gn(){var r,e;return r=me,t.substr(me,4)===Zr?(e=Zr,me+=4):(e=n,0===$e&&Oe(Or)),e===n&&(t.substr(me,5)===Tr?(e=Tr,me+=5):(e=n,0===$e&&Oe(Fr))),e!==n&&(r,e="true"===e),r=e}function vn(){var r,e,s,a,u;if($e++,r=me,39===t.charCodeAt(me)?(e="'",me++):(e=n,0===$e&&Oe(jr)),e!==n){for(s=me,a=[],t.substr(me,2)===kr?(u=kr,me+=2):(u=n,0===$e&&Oe(Rr)),u===n&&(_r.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Nr)));u!==n;)a.push(u),t.substr(me,2)===kr?(u=kr,me+=2):(u=n,0===$e&&Oe(Rr)),u===n&&(_r.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(Nr)));(s=a!==n?t.substring(s,me):a)!==n?(39===t.charCodeAt(me)?(a="'",me++):(a=n,0===$e&&Oe(jr)),a!==n?(r,r=e=s.replace(/''/g,"'")):(me=r,r=n)):(me=r,r=n)}else me=r,r=n;return $e--,r===n&&(e=n,0===$e&&Oe(Lr)),r}function bn(){var r,e,s,a,u,o;if(r=me,e=me,s=me,ee.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(ne)),a===n&&(a=null),a!==n){if(u=[],Jr.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(Kr)),o!==n)for(;o!==n;)u.push(o),Jr.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(Kr));else u=n;u!==n?s=a=[a,u]:(me=s,s=n)}else me=s,s=n;return(e=s!==n?t.substring(e,me):s)!==n&&(r,e=parseInt(e)),r=e}function yn(){var r,e,s,a,u,o,c,i;if(r=me,e=me,$e++,s=gn(),$e--,s===n?e=void 0:(me=e,e=n),e!==n)if(s=me,$e++,a=mn(),$e--,a===n?s=void 0:(me=s,s=n),s!==n){if(a=me,u=me,ae.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(ue)),o!==n){for(c=[],oe.test(t.charAt(me))?(i=t.charAt(me),me++):(i=n,0===$e&&Oe(ce));i!==n;)c.push(i),oe.test(t.charAt(me))?(i=t.charAt(me),me++):(i=n,0===$e&&Oe(ce));c!==n?u=o=[o,c]:(me=u,u=n)}else me=u,u=n;(a=u!==n?t.substring(a,me):u)!==n?(r,r=e=a):(me=r,r=n)}else me=r,r=n;else me=r,r=n;return r}function mn(){var r,e,s,a,u,o,c,i,f,l,h,p,A,d;return r=me,e=me,(s=Cn())!==n&&(a=Cn())!==n?(45===t.charCodeAt(me)?(u=Qr,me++):(u=n,0===$e&&Oe(Vr)),u===n&&(u=null),u!==n&&(o=Cn())!==n?(45===t.charCodeAt(me)?(c=Qr,me++):(c=n,0===$e&&Oe(Vr)),c===n&&(c=null),c!==n&&(i=Cn())!==n?(45===t.charCodeAt(me)?(f=Qr,me++):(f=n,0===$e&&Oe(Vr)),f===n&&(f=null),f!==n&&(l=Cn())!==n?(45===t.charCodeAt(me)?(h=Qr,me++):(h=n,0===$e&&Oe(Vr)),h===n&&(h=null),h!==n&&(p=Cn())!==n&&(A=Cn())!==n&&(d=Cn())!==n?e=s=[s,a,u,o,c,i,f,l,h,p,A,d]:(me=e,e=n)):(me=e,e=n)):(me=e,e=n)):(me=e,e=n)):(me=e,e=n),r=e!==n?t.substring(r,me):e}function Cn(){var r,e,s,a,u,o;return r=me,e=me,ie.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(fe)),s!==n?(ie.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(fe)),a!==n?(ie.test(t.charAt(me))?(u=t.charAt(me),me++):(u=n,0===$e&&Oe(fe)),u!==n?(ie.test(t.charAt(me))?(o=t.charAt(me),me++):(o=n,0===$e&&Oe(fe)),o!==n?e=s=[s,a,u,o]:(me=e,e=n)):(me=e,e=n)):(me=e,e=n)):(me=e,e=n),r=e!==n?t.substring(r,me):e}function xn(){var r,e,s,a;if(r=me,e=me,s=[],le.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(he)),a!==n)for(;a!==n;)s.push(a),le.test(t.charAt(me))?(a=t.charAt(me),me++):(a=n,0===$e&&Oe(he));else s=n;return(e=s!==n?t.substring(e,me):s)!==n&&(r,e=Ct(e)),r=e}function wn(){var r,e,s,a;return r=me,(e=Sn())!==n?(44===t.charCodeAt(me)?(s=",",me++):(s=n,0===$e&&Oe(pe)),s!==n&&(a=Sn())!==n?r=e=[e,s,a]:(me=r,r=n)):(me=r,r=n),r}function $n(){var r,e,s,a;return r=me,(e=Sn())!==n?(40===t.charCodeAt(me)?(s="(",me++):(s=n,0===$e&&Oe(Ae)),s!==n&&(a=Sn())!==n?r=e=[e,s,a]:(me=r,r=n)):(me=r,r=n),r}function En(){var r,e,s;return r=me,(e=Sn())!==n?(41===t.charCodeAt(me)?(s=")",me++):(s=n,0===$e&&Oe(de)),s!==n?r=e=[e,s]:(me=r,r=n)):(me=r,r=n),r}function Sn(){var r,e,s;for($e++,r=me,e=[],ve.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(be));s!==n;)e.push(s),ve.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(be));return r=e!==n?t.substring(r,me):e,$e--,r===n&&(e=n,0===$e&&Oe(ge)),r}function Bn(){var r,e,s;if($e++,r=me,e=[],ve.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(be)),s!==n)for(;s!==n;)e.push(s),ve.test(t.charAt(me))?(s=t.charAt(me),me++):(s=n,0===$e&&Oe(be));else e=n;return r=e!==n?t.substring(r,me):e,$e--,r===n&&(e=n,0===$e&&Oe(ye)),r}const zn=Object.assign,{strict:Zn,minimal:On}=r,Tn=[];let Fn,Ln;const jn=["$value"],kn=r.safeNumber||function(t){const r=Number(t);return Number.isSafeInteger(r)?r:t},Rn=t=>r=>t===r||t.as&&r.as&&t.as===r.as||r.as&&t.ref&&r.as===t.ref[t.ref.length-1]||t.ref&&r.ref&&t.ref.join("")===r.ref.join(""),_n=t=>r=>{if(Array.isArray(r))return r.map(_n(t));const e=r.ref&&t.find((t=>t.as&&t.func&&t.as===r.ref[0]));return e||r},Nn=t=>r=>Array.isArray(r)?r.map(Nn(t)):r.ref&&!t.find(Rn(r))?{val:null}:r,qn=(t,r)=>{if(1===r.ref.length)t.find(Rn(r))||t.push(r);else{const e=r.ref.shift(),n=t.find((t=>t.ref&&t.ref[0]===e));if(n)qn(n.expand,r);else{const n={ref:[e],expand:[]};qn(n.expand,r),t.push(n)}}},In=(t,r,e=!1)=>{if(!r)return;if(t.apply&&delete t.apply,(r.apply||r.where&&t.where||r.search&&t.search)&&(t.from={SELECT:{from:t.from}}),r.where&&(t.where?t.from.SELECT.where=r.where:t.where=r.where),r.search&&(t.search?t.from.SELECT.search=r.search:t.search=r.search),r.groupBy){t.groupBy=[];for(const e of r.groupBy)t.groupBy.find(Rn(e))||t.groupBy.push(e)}const n=[...t.groupBy||[],...r.aggregate||[]];n.length&&(t.columns=t.columns&&!e?t.columns.reduce(((t,r)=>{const e=n.find(Rn(r));return e&&t.push(e),t}),[]):n,t.where&&(t.where=t.where.map(_n(t.columns)),t.groupBy&&(t.having=t.where.map(Nn(t.groupBy)),delete t.where)),t.columns=t.columns.reduce(((t,r)=>(r.ref&&r.ref.length>1&&n.find(Rn(r))?qn(t,{ref:[...r.ref]}):t.push(r),t)),[])),r.apply&&In(t.from.SELECT,r.apply)};if((e=a())!==n&&me===t.length)return e;throw e!==n&&me<t.length&&Oe({type:"end"}),Te(we,xe<t.length?t.charAt(xe):null,xe<t.length?Ze(xe,xe+1):Ze(xe,xe))}peg$subclass(peg$SyntaxError,Error),peg$SyntaxError.buildMessage=function(t,r){var e={literal:function(t){return'"'+s(t.text)+'"'},class:function(t){var r,e="";for(r=0;r<t.parts.length;r++)e+=t.parts[r]instanceof Array?a(t.parts[r][0])+"-"+a(t.parts[r][1]):a(t.parts[r]);return"["+(t.inverted?"^":"")+e+"]"},any:function(t){return"any character"},end:function(t){return"end of input"},other:function(t){return t.description}};function n(t){return t.charCodeAt(0).toString(16).toUpperCase()}function s(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,(function(t){return"\\x0"+n(t)})).replace(/[\x10-\x1F\x7F-\x9F]/g,(function(t){return"\\x"+n(t)}))}function a(t){return t.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,(function(t){return"\\x0"+n(t)})).replace(/[\x10-\x1F\x7F-\x9F]/g,(function(t){return"\\x"+n(t)}))}return"Expected "+function(t){var r,n,s,a=new Array(t.length);for(r=0;r<t.length;r++)a[r]=(s=t[r],e[s.type](s));if(a.sort(),a.length>0){for(r=1,n=1;r<a.length;r++)a[r-1]!==a[r]&&(a[n]=a[r],n++);a.length=n}switch(a.length){case 1:return a[0];case 2:return a[0]+" or "+a[1];default:return a.slice(0,-1).join(", ")+", or "+a[a.length-1]}}(t)+" but "+function(t){return t?'"'+s(t)+'"':"end of input"}(r)+" found."},module.exports={SyntaxError:peg$SyntaxError,parse:peg$parse};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const getSafeNumber = str => {
|
|
2
|
+
const n = Number(str)
|
|
3
|
+
return Number.isSafeInteger(n) || String(n) === str ? n : str
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
|
7
|
+
const _PT = ([hh, mm, ss]) => `PT${hh}H${mm}M${ss}S`
|
|
8
|
+
const _isTimestamp = val =>
|
|
9
|
+
/^\d+-\d\d-\d\d(T\d\d:\d\d(:\d\d(\.\d+)?)?(Z|([+-]{1}\d\d:\d\d))?)?$/.test(val) && !isNaN(Date.parse(val))
|
|
10
|
+
|
|
11
|
+
const formatVal = (val, element, csnTarget, kind) => {
|
|
12
|
+
if (val === null || val === 'null') return 'null'
|
|
13
|
+
if (typeof val === 'boolean') return val
|
|
14
|
+
if (typeof val === 'number') return getSafeNumber(val)
|
|
15
|
+
if (!csnTarget && typeof val === 'string' && UUID.test(val)) return kind === 'odata-v2' ? `guid'${val}'` : val
|
|
16
|
+
const { type } = (csnTarget && csnTarget.elements && csnTarget.elements[element]) || { type: undefined }
|
|
17
|
+
|
|
18
|
+
if (kind === 'odata-v2') {
|
|
19
|
+
switch (type) {
|
|
20
|
+
case 'cds.Binary':
|
|
21
|
+
case 'cds.LargeBinary':
|
|
22
|
+
return `binary'${val}'`
|
|
23
|
+
case 'cds.Date':
|
|
24
|
+
return `datetime'${val}T00:00:00'`
|
|
25
|
+
case 'cds.DateTime':
|
|
26
|
+
return `datetime'${val}'`
|
|
27
|
+
case 'cds.Time':
|
|
28
|
+
return `time'${_PT(val.split(':'))}'`
|
|
29
|
+
case 'cds.Timestamp':
|
|
30
|
+
return `datetimeoffset'${val}'`
|
|
31
|
+
case 'cds.UUID':
|
|
32
|
+
return `guid'${val}'`
|
|
33
|
+
default:
|
|
34
|
+
return `'${val}'`
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
switch (type) {
|
|
38
|
+
case 'cds.Decimal':
|
|
39
|
+
case 'cds.Integer64':
|
|
40
|
+
return getSafeNumber(val)
|
|
41
|
+
case 'cds.Boolean':
|
|
42
|
+
case 'cds.DateTime':
|
|
43
|
+
case 'cds.Date':
|
|
44
|
+
case 'cds.Timestamp':
|
|
45
|
+
case 'cds.Time':
|
|
46
|
+
case 'cds.UUID':
|
|
47
|
+
return val
|
|
48
|
+
default:
|
|
49
|
+
return _isTimestamp(val) ? val : `'${val}'` // Why are we checking strings for timestamps? --> expensive
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = {
|
|
55
|
+
getSafeNumber,
|
|
56
|
+
formatVal
|
|
57
|
+
}
|
package/libx/rest/RestAdapter.js
CHANGED
|
@@ -14,9 +14,6 @@ const operation = require('./middleware/operation')
|
|
|
14
14
|
|
|
15
15
|
const error = require('./middleware/error')
|
|
16
16
|
|
|
17
|
-
// REVISIT: _commit_attempted workaround to avoid double rollback leading to release error
|
|
18
|
-
const _commit_attempted = Symbol()
|
|
19
|
-
|
|
20
17
|
class RestAdapter extends express.Router {
|
|
21
18
|
constructor(srv) {
|
|
22
19
|
super()
|
|
@@ -69,7 +66,6 @@ class RestAdapter extends express.Router {
|
|
|
69
66
|
|
|
70
67
|
// unfortunately, express doesn't catch async errors -> try catch needed
|
|
71
68
|
try {
|
|
72
|
-
req._tx[_commit_attempted] = true
|
|
73
69
|
await req._tx.commit(result)
|
|
74
70
|
} catch (e) {
|
|
75
71
|
return next(e)
|
|
@@ -85,8 +81,8 @@ class RestAdapter extends express.Router {
|
|
|
85
81
|
this.use('/', (err, req, res, next) => {
|
|
86
82
|
// request may fail during processing or during commit -> both caught here
|
|
87
83
|
|
|
88
|
-
//
|
|
89
|
-
if (req._tx
|
|
84
|
+
// REVISIT: rollback needed if error occured before commit attempted -> how to distinguish?
|
|
85
|
+
if (req._tx) req._tx.rollback(err).catch(() => {})
|
|
90
86
|
|
|
91
87
|
next(err)
|
|
92
88
|
})
|
package/libx/rest/utils/data.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
const cds = require('../../_runtime/cds')
|
|
2
|
-
|
|
3
1
|
const { deepCopyObject } = require('../../_runtime/common/utils/copy')
|
|
4
2
|
const { checkKeys, checkStatic } = require('../../_runtime/cds-services/util/assert')
|
|
5
3
|
const { MULTIPLE_ERRORS } = require('../../_runtime/common/error/constants')
|
|
@@ -29,11 +27,8 @@ const _getDeepCopy = (data, definition, model, validations, skipKeys) => {
|
|
|
29
27
|
for (const k in data) {
|
|
30
28
|
const element = (definition.elements && definition.elements[k]) || (definition.params && definition.params[k])
|
|
31
29
|
if (!element) {
|
|
32
|
-
|
|
33
|
-
if (additional_properties === 'ignore' || !additional_properties) {
|
|
30
|
+
if (!definition['@open']) {
|
|
34
31
|
// ignore input (the default)
|
|
35
|
-
} else if (additional_properties === 'error') {
|
|
36
|
-
validations.push({ message: `Unknown property "${k}"`, code: 400 })
|
|
37
32
|
} else {
|
|
38
33
|
d[k] = data[k] && typeof data[k] === 'object' ? deepCopyObject(data[k]) : data[k]
|
|
39
34
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sap/cds",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.1",
|
|
4
4
|
"description": "SAP Cloud Application Programming Model - CDS for Node.js",
|
|
5
5
|
"homepage": "https://cap.cloud.sap/",
|
|
6
6
|
"keywords": [
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"lib/",
|
|
20
20
|
"libx/",
|
|
21
21
|
"tasks/",
|
|
22
|
+
"srv/",
|
|
22
23
|
"_i18n/",
|
|
23
24
|
"server.js",
|
|
24
25
|
"common.cds",
|
|
@@ -40,8 +41,8 @@
|
|
|
40
41
|
}
|
|
41
42
|
},
|
|
42
43
|
"lint-staged": {
|
|
43
|
-
"libx/odata/
|
|
44
|
-
"npm run pegjs:odata2cqn && git add libx/odata/
|
|
44
|
+
"libx/odata/grammar.pegjs": [
|
|
45
|
+
"npm run pegjs:odata2cqn && git add libx/odata/parser.js"
|
|
45
46
|
],
|
|
46
47
|
"{libx,tests/_runtime}/**/*.js": [
|
|
47
48
|
"npx prettier --write"
|
package/server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const express = require('express')
|
|
2
|
-
const cds = require('./lib')
|
|
2
|
+
const cds = require('./lib'), { unfold_csn: cds_localized } = cds.compile._localized
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Standard express.js bootstrapping, constructing an express `application`
|
|
@@ -44,12 +44,11 @@ module.exports = async function cds_server (options, o = { ...options, __proto__
|
|
|
44
44
|
if (cds.requires.extensibility) await require('./libx/_runtime/fiori/uiflex')() // REVISIT: later this should be a ext umbrella service
|
|
45
45
|
|
|
46
46
|
// load specified models or all in project
|
|
47
|
-
const csn = await cds.load
|
|
48
|
-
|
|
49
|
-
cds.model = o.from = cds.linked (cds.compile.for.odata(m))
|
|
47
|
+
const csn = await cds.load(o.from||'*',o) .then (cds.minify)
|
|
48
|
+
cds.model = o.from = cds_localized(cds.linked(cds.compile.for.odata(csn)))
|
|
50
49
|
|
|
51
50
|
// connect to essential framework services if required
|
|
52
|
-
const _init = o.in_memory && (db => cds.deploy(
|
|
51
|
+
const _init = o.in_memory && (db => cds.deploy(csn).to(db,o))
|
|
53
52
|
if (cds.requires.db) cds.db = await cds.connect.to ('db') .then (_init)
|
|
54
53
|
if (cds.requires.messaging) await cds.connect.to ('messaging')
|
|
55
54
|
if (cds.requires.multitenancy) await cds.mtx.in (app)
|
|
@@ -138,13 +137,17 @@ function cors (req, res, next) {
|
|
|
138
137
|
next()
|
|
139
138
|
}
|
|
140
139
|
|
|
141
|
-
function correlate (req,
|
|
142
|
-
|
|
143
|
-
const id =
|
|
144
|
-
|| req.headers['x-correlation-id'] || req.headers['x-correlationid']
|
|
140
|
+
function correlate (req, res, next) {
|
|
141
|
+
// derive correlation id from req
|
|
142
|
+
const id = req.headers['x-correlation-id'] || req.headers['x-correlationid']
|
|
145
143
|
|| req.headers['x-request-id'] || req.headers['x-vcap-request-id']
|
|
146
144
|
|| cds.utils.uuid()
|
|
147
|
-
cds.context
|
|
145
|
+
// new intermediate cds.context, if necessary
|
|
146
|
+
if (!cds.context) cds.context = { id }
|
|
147
|
+
// guarantee x-correlation-id going forward and set on res
|
|
148
|
+
req.headers['x-correlation-id'] = id
|
|
149
|
+
res.set('x-correlation-id', id)
|
|
150
|
+
// guaranteed access to cds.context._.req -> REVISIT
|
|
148
151
|
if (!cds.context._) cds.context._ = {}
|
|
149
152
|
if (!cds.context._.req) cds.context._.req = req
|
|
150
153
|
next()
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
service AuditLogService {
|
|
2
|
+
|
|
3
|
+
// SEC-254: Log read access to sensitive personal data
|
|
4
|
+
event dataAccessLog {
|
|
5
|
+
accesses : array of Access;
|
|
6
|
+
// accessFilters : array of KeyValuePair;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// SEC-265: Log changes to personal data
|
|
10
|
+
event dataModificationLog : {
|
|
11
|
+
modifications : array of DataModification;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// config change
|
|
15
|
+
event configChangeLog : {
|
|
16
|
+
action : String @assert.range enum {
|
|
17
|
+
Create;
|
|
18
|
+
Update;
|
|
19
|
+
Delete
|
|
20
|
+
};
|
|
21
|
+
// success : Boolean;
|
|
22
|
+
configurations : array of ConfigChange;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// security message
|
|
26
|
+
event securityLog : {
|
|
27
|
+
action : String;
|
|
28
|
+
data : String;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// types
|
|
34
|
+
|
|
35
|
+
define type KeyValuePair {
|
|
36
|
+
keyName : String;
|
|
37
|
+
value : String;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
define type DataObject {
|
|
41
|
+
type : String;
|
|
42
|
+
id : array of KeyValuePair;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
define type DataSubject {
|
|
46
|
+
type : String;
|
|
47
|
+
id : array of KeyValuePair;
|
|
48
|
+
role : String;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
define type Attribute {
|
|
52
|
+
name : String;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
define type Attachment {
|
|
56
|
+
id : String;
|
|
57
|
+
name : String;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
define type Access {
|
|
61
|
+
dataObject : DataObject;
|
|
62
|
+
dataSubject : DataSubject;
|
|
63
|
+
attributes : array of Attribute;
|
|
64
|
+
attachments : array of Attachment;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
define type ChangedAttribute {
|
|
68
|
+
name : String;
|
|
69
|
+
oldValue : String;
|
|
70
|
+
newValue : String;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
define type DataModification {
|
|
74
|
+
dataObject : DataObject;
|
|
75
|
+
dataSubject : DataSubject;
|
|
76
|
+
action : String @assert.range enum {
|
|
77
|
+
Create;
|
|
78
|
+
Update;
|
|
79
|
+
Delete;
|
|
80
|
+
};
|
|
81
|
+
attributes : array of ChangedAttribute;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
define type ConfigChange {
|
|
85
|
+
dataObject : DataObject;
|
|
86
|
+
attributes : array of ChangedAttribute;
|
|
87
|
+
};
|
|
File without changes
|
package/srv/flex.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('../libx/_runtime/fiori/uiflex/service')
|
package/srv/outbox.cds
ADDED
package/srv/outbox.js
ADDED
|
File without changes
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/* istanbul ignore file */
|
|
2
|
-
// REVISIT: remove istanbul ignore once re-enabled
|
|
3
|
-
|
|
4
|
-
const cds = require('../../../cds')
|
|
5
|
-
|
|
6
|
-
const { performance, PerformanceObserver } = require('perf_hooks')
|
|
7
|
-
|
|
8
|
-
const _addDurationToRequest = (req, splitName, duration) => {
|
|
9
|
-
if (splitName[2] === 'Total') {
|
|
10
|
-
req.performanceMeasurement.results.total = duration
|
|
11
|
-
} else if (splitName[splitName.length - 2] === 'SQL') {
|
|
12
|
-
req.performanceMeasurement.results.db += duration
|
|
13
|
-
} else if (splitName[splitName.length - 1] === 'ODataIn') {
|
|
14
|
-
req.performanceMeasurement.results.ODataIn = duration
|
|
15
|
-
} else if (splitName[splitName.length - 1] === 'default') {
|
|
16
|
-
req.performanceMeasurement.results.defaulthandler += duration
|
|
17
|
-
} else if (splitName[splitName.length - 1] === 'custom') {
|
|
18
|
-
req.performanceMeasurement.results.customhandler += duration
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const _clearMeasuresAndMarksOfRequest = req => {
|
|
23
|
-
for (const mark of req.performanceMeasurement.marks) {
|
|
24
|
-
performance.clearMarks(mark)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (performance.clearMeasures) {
|
|
28
|
-
for (const measure of req.performanceMeasurement.measures) {
|
|
29
|
-
performance.clearMeasures(measure)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const _observerCallback = req => items => {
|
|
35
|
-
const entry = items.getEntries()[0]
|
|
36
|
-
const splitName = entry.name.split(' ')
|
|
37
|
-
|
|
38
|
-
if (splitName[0] === req.performanceMeasurement.uuid) {
|
|
39
|
-
if (entry.entryType === 'mark') {
|
|
40
|
-
req.performanceMeasurement.marks.push(entry.name)
|
|
41
|
-
} else if (entry.entryType === 'measure') {
|
|
42
|
-
req.performanceMeasurement.measures.push(entry.name)
|
|
43
|
-
_addDurationToRequest(req, splitName, entry.duration)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const _statisticsRequested = req =>
|
|
49
|
-
(req.query && req.query['sap-statistics'] === 'true') ||
|
|
50
|
-
(req.headers && req.headers['sap-statistics'] === 'true' && (!req.query || !req.query['sap-statistics']))
|
|
51
|
-
|
|
52
|
-
const measurePerformance = (req, res) => {
|
|
53
|
-
if (_statisticsRequested(req)) {
|
|
54
|
-
const uuid = cds.utils.uuid()
|
|
55
|
-
const startMark = `${uuid} Start`
|
|
56
|
-
const endMark = `${uuid} End`
|
|
57
|
-
|
|
58
|
-
req.performanceMeasurement = {
|
|
59
|
-
uuid,
|
|
60
|
-
performance,
|
|
61
|
-
sqlId: 0,
|
|
62
|
-
results: { total: 0.0, db: 0.0, ODataIn: 0.0, defaulthandler: 0.0, customhandler: 0.0 },
|
|
63
|
-
marks: [],
|
|
64
|
-
measures: []
|
|
65
|
-
}
|
|
66
|
-
req.performanceMeasurement.observer = new PerformanceObserver(_observerCallback(req))
|
|
67
|
-
req.performanceMeasurement.observer.observe({ entryTypes: ['measure', 'mark'] })
|
|
68
|
-
|
|
69
|
-
const includeStatusHeader = originalFn =>
|
|
70
|
-
function (...args) {
|
|
71
|
-
if (!res.headersSent) {
|
|
72
|
-
// avoid ERR_HTTP_HEADERS_SENT in case res.write was used before res.end
|
|
73
|
-
performance.mark(endMark)
|
|
74
|
-
performance.measure(`${uuid} 0 Total`, startMark, endMark)
|
|
75
|
-
|
|
76
|
-
_clearMeasuresAndMarksOfRequest(req)
|
|
77
|
-
|
|
78
|
-
req.performanceMeasurement.observer.disconnect()
|
|
79
|
-
|
|
80
|
-
const statusCode = res.statusCode && res.statusCode.toString()
|
|
81
|
-
|
|
82
|
-
if (!statusCode.startsWith('4') && !statusCode.startsWith('5')) {
|
|
83
|
-
const stats = `total=${req.performanceMeasurement.results.total.toFixed(2)}`
|
|
84
|
-
// ,defaulthandler=${req.performanceMeasurement.results.defaulthandler.toFixed(2)}
|
|
85
|
-
// ,customhandler=${req.performanceMeasurement.results.customhandler.toFixed(2)}
|
|
86
|
-
// ,db=${req.performanceMeasurement.results.db.toFixed(2)}`
|
|
87
|
-
res.setHeader('sap-statistics', stats)
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
originalFn.call(this, ...args)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// if res.write is used e.g. by odata-server, no headers can be set afterwards
|
|
95
|
-
const originalWrite = res.write
|
|
96
|
-
res.write = includeStatusHeader(originalWrite)
|
|
97
|
-
const originalEnd = res.end
|
|
98
|
-
res.end = includeStatusHeader(originalEnd)
|
|
99
|
-
|
|
100
|
-
performance.mark(startMark)
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
module.exports = measurePerformance
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
const measurePerformance = require('./performance')
|
|
2
|
-
|
|
3
|
-
let dynatrace
|
|
4
|
-
try {
|
|
5
|
-
const sdk = require('@dynatrace/oneagent-sdk')
|
|
6
|
-
const api = sdk.createInstance()
|
|
7
|
-
dynatrace = {
|
|
8
|
-
sdk,
|
|
9
|
-
api
|
|
10
|
-
}
|
|
11
|
-
} catch (_) {
|
|
12
|
-
// ignore
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const sapStatistics = (req, res, next) => {
|
|
16
|
-
measurePerformance(req, res)
|
|
17
|
-
next()
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const useDynatrace = (req, res, next) => {
|
|
21
|
-
req.dynatrace = dynatrace
|
|
22
|
-
next()
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const performanceMeasurement = app => {
|
|
26
|
-
app.use(sapStatistics)
|
|
27
|
-
|
|
28
|
-
if (dynatrace) {
|
|
29
|
-
app.use(useDynatrace)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
module.exports = performanceMeasurement
|