diff --git a/.changeset/chilly-worms-sing.md b/.changeset/chilly-worms-sing.md new file mode 100644 index 0000000000..0b7880f8b2 --- /dev/null +++ b/.changeset/chilly-worms-sing.md @@ -0,0 +1,5 @@ +--- +"@neo4j/graphql": major +--- + +The `operations` argument of `@subscription` has been renamed to `events`, with each event being past tense. This mirrors naming used elsewhere for subscriptions. diff --git a/.changeset/fast-dolphins-sort.md b/.changeset/fast-dolphins-sort.md new file mode 100644 index 0000000000..8c79e8af86 --- /dev/null +++ b/.changeset/fast-dolphins-sort.md @@ -0,0 +1,5 @@ +--- +"@neo4j/graphql": patch +--- + +Fix the configuration of nested operations when leaving a type with only relationships with no nested delete, connect or disconnect operations. diff --git a/.changeset/pre.json b/.changeset/pre.json index 0beeeacd32..414da2ee36 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -30,9 +30,11 @@ "fluffy-suns-invite", "gentle-colts-relate", "khaki-experts-decide", + "khaki-mayflies-float", "loud-comics-try", "loud-rivers-wonder", "moody-crews-march", + "neat-adults-appear", "new-comics-retire", "nine-poems-retire", "ninety-onions-press", @@ -41,15 +43,20 @@ "orange-kings-turn", "poor-fans-smile", "quick-insects-turn", + "rotten-avocados-knock", "shy-moles-invite", "smart-vans-greet", + "smooth-knives-breathe", "sour-dolls-crash", "sour-pugs-drive", "spotty-snakes-fry", + "tame-geese-roll", + "tender-rats-reflect", + "twelve-forks-kneel", + "unlucky-foxes-draw", "weak-planes-punch", "wicked-ties-burn", "witty-penguins-collect", - "witty-rabbits-prove", - "young-ligers-poke" + "witty-rabbits-prove" ] } diff --git a/.changeset/purple-hairs-glow.md b/.changeset/purple-hairs-glow.md new file mode 100644 index 0000000000..058e5c75c8 --- /dev/null +++ b/.changeset/purple-hairs-glow.md @@ -0,0 +1,14 @@ +--- +"@neo4j/graphql": major +--- + +The `@id` directive has had a number of breaking changes. + +The `unique` argument has been removed. In an effort to simplify directives, `@id` will now only only be responsible for the autogeneration of UUID values. +If you would like the property to also be backed by a unique node property constraint, use the `@unique` directive alongside `@id`. + +The `autogenerate` argument has been removed. With this value set to `false` and the above removal of constraint management, this would make the directive a no-op. + +The `global` argument has been removed. This quite key feature of specifying the globally unique identifier for Relay was hidden away inside the `@id` directive. This functionality has been moved into its own directive, `@relayId`, which is used with no arguments. The use of the `@relayId` directive also implies that the field will be backed by a unique node property constraint. + +Note, if using the `@id` and `@relayId` directive together on the same field, this will be an autogenerated ID compatible with Relay, and be backed by a single unique node property constraint. If you wish to give this constraint a name, use the `@unique` directive also with the `constraintName` argument. diff --git a/.changeset/tame-geese-roll.md b/.changeset/tame-geese-roll.md deleted file mode 100644 index 9f241afed8..0000000000 --- a/.changeset/tame-geese-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@neo4j/graphql-toolbox": patch ---- - -update dependency @neo4j-ndl/react to v1.10.3 diff --git a/.changeset/unlucky-foxes-draw.md b/.changeset/unlucky-foxes-draw.md deleted file mode 100644 index a27162cccf..0000000000 --- a/.changeset/unlucky-foxes-draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@neo4j/graphql": patch ---- - -If possible, instantiate JWKS endpoint connection on startup, to benefit from caching. diff --git a/.yarn/releases/yarn-3.6.2.cjs b/.yarn/releases/yarn-3.6.3.cjs similarity index 99% rename from .yarn/releases/yarn-3.6.2.cjs rename to .yarn/releases/yarn-3.6.3.cjs index f4ae436b44..9837c30281 100755 --- a/.yarn/releases/yarn-3.6.2.cjs +++ b/.yarn/releases/yarn-3.6.3.cjs @@ -233,7 +233,7 @@ attempted value: ${s} `);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger("No matching choices")),t.join(` `)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(` `)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function pqe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>({...i}));let t=[];for(let i=1;i{mse.exports=wL()});var yse=w((nft,Ise)=>{"use strict";var dqe=xb(),TL=class extends dqe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};Ise.exports=TL});var Bse=w((sft,wse)=>{"use strict";var Cqe=Cl(),LL=class extends Cqe{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};wse.exports=LL});var Qse=w(ML=>{"use strict";var bse=ji(),ui=(r,e)=>{bse.defineExport(ML,r,e),bse.defineExport(ML,r.toLowerCase(),e)};ui("AutoComplete",()=>kne());ui("BasicAuth",()=>One());ui("Confirm",()=>Hne());ui("Editable",()=>Yne());ui("Form",()=>vb());ui("Input",()=>wL());ui("Invisible",()=>Xne());ui("List",()=>_ne());ui("MultiSelect",()=>ese());ui("Numeral",()=>ise());ui("Password",()=>sse());ui("Scale",()=>Ase());ui("Select",()=>Cl());ui("Snippet",()=>fse());ui("Sort",()=>pse());ui("Survey",()=>Cse());ui("Text",()=>Ese());ui("Toggle",()=>yse());ui("Quiz",()=>Bse())});var vse=w((aft,Sse)=>{Sse.exports={ArrayPrompt:Mm(),AuthPrompt:dL(),BooleanPrompt:xb(),NumberPrompt:vL(),StringPrompt:au()}});var Km=w((Aft,Pse)=>{"use strict";var xse=J("assert"),KL=J("events"),ml=ji(),ho=class extends KL{constructor(e,t){super(),this.options=ml.merge({},e),this.answers={...t}}register(e,t){if(ml.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}xse.equal(typeof t,"function","expected a function");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t=="function"&&(t=await t.call(this)),await this.ask(ml.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let t=ml.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=ml;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];xse(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||Yh()}static get prompts(){return Qse()}static get types(){return vse()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return ml.mixinEmitter(e,new KL),e}};ml.mixinEmitter(ho,new KL);var OL=ho.prompts;for(let r of Object.keys(OL)){let e=r.toLowerCase(),t=i=>new OL[r](i).run();ho.prompt[e]=t,ho[e]=t,ho[r]||Reflect.defineProperty(ho,r,{get:()=>OL[r]})}var Om=r=>{ml.defineExport(ho,r,()=>ho.types[r])};Om("ArrayPrompt");Om("AuthPrompt");Om("BooleanPrompt");Om("NumberPrompt");Om("StringPrompt");Pse.exports=ho});var Kse=w((Vft,Ose)=>{function wqe(r,e){for(var t=-1,i=r==null?0:r.length;++t{var Bqe=Y0(),bqe=bh();function Qqe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s{var Sqe=Jh(),vqe=Rh();function xqe(r,e){return r&&Sqe(e,vqe(e),r)}Hse.exports=xqe});var jse=w((_ft,Yse)=>{function Pqe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yse.exports=Pqe});var Jse=w(($ft,qse)=>{var Dqe=vn(),kqe=ab(),Rqe=jse(),Fqe=Object.prototype,Nqe=Fqe.hasOwnProperty;function Tqe(r){if(!Dqe(r))return Rqe(r);var e=kqe(r),t=[];for(var i in r)i=="constructor"&&(e||!Nqe.call(r,i))||t.push(i);return t}qse.exports=Tqe});var Wh=w((eht,Wse)=>{var Lqe=lT(),Mqe=Jse(),Oqe=gm();function Kqe(r){return Oqe(r)?Lqe(r,!0):Mqe(r)}Wse.exports=Kqe});var Vse=w((tht,zse)=>{var Uqe=Jh(),Hqe=Wh();function Gqe(r,e){return r&&Uqe(e,Hqe(e),r)}zse.exports=Gqe});var qL=w((Ym,zh)=>{var Yqe=ys(),$se=typeof Ym=="object"&&Ym&&!Ym.nodeType&&Ym,Xse=$se&&typeof zh=="object"&&zh&&!zh.nodeType&&zh,jqe=Xse&&Xse.exports===$se,Zse=jqe?Yqe.Buffer:void 0,_se=Zse?Zse.allocUnsafe:void 0;function qqe(r,e){if(e)return r.slice();var t=r.length,i=_se?_se(t):new r.constructor(t);return r.copy(i),i}zh.exports=qqe});var JL=w((rht,eoe)=>{function Jqe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t{var Wqe=Jh(),zqe=lb();function Vqe(r,e){return Wqe(r,zqe(r),e)}toe.exports=Vqe});var kb=w((nht,ioe)=>{var Xqe=cT(),Zqe=Xqe(Object.getPrototypeOf,Object);ioe.exports=Zqe});var WL=w((sht,noe)=>{var _qe=q0(),$qe=kb(),eJe=lb(),tJe=dT(),rJe=Object.getOwnPropertySymbols,iJe=rJe?function(r){for(var e=[];r;)_qe(e,eJe(r)),r=$qe(r);return e}:tJe;noe.exports=iJe});var ooe=w((oht,soe)=>{var nJe=Jh(),sJe=WL();function oJe(r,e){return nJe(r,sJe(r),e)}soe.exports=oJe});var Aoe=w((aht,aoe)=>{var aJe=pT(),AJe=WL(),lJe=Wh();function cJe(r){return aJe(r,lJe,AJe)}aoe.exports=cJe});var coe=w((Aht,loe)=>{var uJe=Object.prototype,gJe=uJe.hasOwnProperty;function fJe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]=="string"&&gJe.call(r,"index")&&(t.index=r.index,t.input=r.input),t}loe.exports=fJe});var Rb=w((lht,goe)=>{var uoe=fT();function hJe(r){var e=new r.constructor(r.byteLength);return new uoe(e).set(new uoe(r)),e}goe.exports=hJe});var hoe=w((cht,foe)=>{var pJe=Rb();function dJe(r,e){var t=e?pJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}foe.exports=dJe});var doe=w((uht,poe)=>{var CJe=/\w*$/;function mJe(r){var e=new r.constructor(r.source,CJe.exec(r));return e.lastIndex=r.lastIndex,e}poe.exports=mJe});var yoe=w((ght,Ioe)=>{var Coe=Rc(),moe=Coe?Coe.prototype:void 0,Eoe=moe?moe.valueOf:void 0;function EJe(r){return Eoe?Object(Eoe.call(r)):{}}Ioe.exports=EJe});var zL=w((fht,woe)=>{var IJe=Rb();function yJe(r,e){var t=e?IJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}woe.exports=yJe});var boe=w((hht,Boe)=>{var wJe=Rb(),BJe=hoe(),bJe=doe(),QJe=yoe(),SJe=zL(),vJe="[object Boolean]",xJe="[object Date]",PJe="[object Map]",DJe="[object Number]",kJe="[object RegExp]",RJe="[object Set]",FJe="[object String]",NJe="[object Symbol]",TJe="[object ArrayBuffer]",LJe="[object DataView]",MJe="[object Float32Array]",OJe="[object Float64Array]",KJe="[object Int8Array]",UJe="[object Int16Array]",HJe="[object Int32Array]",GJe="[object Uint8Array]",YJe="[object Uint8ClampedArray]",jJe="[object Uint16Array]",qJe="[object Uint32Array]";function JJe(r,e,t){var i=r.constructor;switch(e){case TJe:return wJe(r);case vJe:case xJe:return new i(+r);case LJe:return BJe(r,t);case MJe:case OJe:case KJe:case UJe:case HJe:case GJe:case YJe:case jJe:case qJe:return SJe(r,t);case PJe:return new i;case DJe:case FJe:return new i(r);case kJe:return bJe(r);case RJe:return new i;case NJe:return QJe(r)}}Boe.exports=JJe});var voe=w((pht,Soe)=>{var WJe=vn(),Qoe=Object.create,zJe=function(){function r(){}return function(e){if(!WJe(e))return{};if(Qoe)return Qoe(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Soe.exports=zJe});var VL=w((dht,xoe)=>{var VJe=voe(),XJe=kb(),ZJe=ab();function _Je(r){return typeof r.constructor=="function"&&!ZJe(r)?VJe(XJe(r)):{}}xoe.exports=_Je});var Doe=w((Cht,Poe)=>{var $Je=hm(),eWe=Wo(),tWe="[object Map]";function rWe(r){return eWe(r)&&$Je(r)==tWe}Poe.exports=rWe});var Noe=w((mht,Foe)=>{var iWe=Doe(),nWe=nb(),koe=sb(),Roe=koe&&koe.isMap,sWe=Roe?nWe(Roe):iWe;Foe.exports=sWe});var Loe=w((Eht,Toe)=>{var oWe=hm(),aWe=Wo(),AWe="[object Set]";function lWe(r){return aWe(r)&&oWe(r)==AWe}Toe.exports=lWe});var Uoe=w((Iht,Koe)=>{var cWe=Loe(),uWe=nb(),Moe=sb(),Ooe=Moe&&Moe.isSet,gWe=Ooe?uWe(Ooe):cWe;Koe.exports=gWe});var qoe=w((yht,joe)=>{var fWe=fm(),hWe=Kse(),pWe=Y0(),dWe=Gse(),CWe=Vse(),mWe=qL(),EWe=JL(),IWe=roe(),yWe=ooe(),wWe=CT(),BWe=Aoe(),bWe=hm(),QWe=coe(),SWe=boe(),vWe=VL(),xWe=vs(),PWe=lm(),DWe=Noe(),kWe=vn(),RWe=Uoe(),FWe=Rh(),NWe=Wh(),TWe=1,LWe=2,MWe=4,Hoe="[object Arguments]",OWe="[object Array]",KWe="[object Boolean]",UWe="[object Date]",HWe="[object Error]",Goe="[object Function]",GWe="[object GeneratorFunction]",YWe="[object Map]",jWe="[object Number]",Yoe="[object Object]",qWe="[object RegExp]",JWe="[object Set]",WWe="[object String]",zWe="[object Symbol]",VWe="[object WeakMap]",XWe="[object ArrayBuffer]",ZWe="[object DataView]",_We="[object Float32Array]",$We="[object Float64Array]",e3e="[object Int8Array]",t3e="[object Int16Array]",r3e="[object Int32Array]",i3e="[object Uint8Array]",n3e="[object Uint8ClampedArray]",s3e="[object Uint16Array]",o3e="[object Uint32Array]",ur={};ur[Hoe]=ur[OWe]=ur[XWe]=ur[ZWe]=ur[KWe]=ur[UWe]=ur[_We]=ur[$We]=ur[e3e]=ur[t3e]=ur[r3e]=ur[YWe]=ur[jWe]=ur[Yoe]=ur[qWe]=ur[JWe]=ur[WWe]=ur[zWe]=ur[i3e]=ur[n3e]=ur[s3e]=ur[o3e]=!0;ur[HWe]=ur[Goe]=ur[VWe]=!1;function Fb(r,e,t,i,n,s){var o,a=e&TWe,l=e&LWe,c=e&MWe;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!kWe(r))return r;var u=xWe(r);if(u){if(o=QWe(r),!a)return EWe(r,o)}else{var g=bWe(r),f=g==Goe||g==GWe;if(PWe(r))return mWe(r,a);if(g==Yoe||g==Hoe||f&&!n){if(o=l||f?{}:vWe(r),!a)return l?yWe(r,CWe(o,r)):IWe(r,dWe(o,r))}else{if(!ur[g])return n?r:{};o=SWe(r,g,a)}}s||(s=new fWe);var h=s.get(r);if(h)return h;s.set(r,o),RWe(r)?r.forEach(function(y){o.add(Fb(y,e,t,y,r,s))}):DWe(r)&&r.forEach(function(y,B){o.set(B,Fb(y,e,t,B,r,s))});var p=c?l?BWe:wWe:l?NWe:FWe,C=u?void 0:p(r);return hWe(C||r,function(y,B){C&&(B=y,y=r[B]),pWe(o,B,Fb(y,e,t,B,r,s))}),o}joe.exports=Fb});var XL=w((wht,Joe)=>{var a3e=qoe(),A3e=1,l3e=4;function c3e(r){return a3e(r,A3e|l3e)}Joe.exports=c3e});var zoe=w((Bht,Woe)=>{var u3e=HN();function g3e(r,e,t){return r==null?r:u3e(r,e,t)}Woe.exports=g3e});var $oe=w((Pht,_oe)=>{function f3e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}_oe.exports=f3e});var tae=w((Dht,eae)=>{var h3e=rm(),p3e=HR();function d3e(r,e){return e.length<2?r:h3e(r,p3e(e,0,-1))}eae.exports=d3e});var iae=w((kht,rae)=>{var C3e=Bh(),m3e=$oe(),E3e=tae(),I3e=Zc();function y3e(r,e){return e=C3e(e,r),r=E3e(r,e),r==null||delete r[I3e(m3e(e))]}rae.exports=y3e});var sae=w((Rht,nae)=>{var w3e=iae();function B3e(r,e){return r==null?!0:w3e(r,e)}nae.exports=B3e});var cae=w((opt,S3e)=>{S3e.exports={name:"@yarnpkg/cli",version:"3.6.2",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var oM=w((kmt,bae)=>{"use strict";bae.exports=function(e,t){t===!0&&(t=0);var i="";if(typeof e=="string")try{i=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(i=e.protocol);var n=i.split(/\:|\+/).filter(Boolean);return typeof t=="number"?n[t]:n}});var Sae=w((Rmt,Qae)=>{"use strict";var q3e=oM();function J3e(r){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:r,query:{},parse_failed:!1};try{var t=new URL(r);e.protocols=q3e(t),e.protocol=e.protocols[0],e.port=t.port,e.resource=t.hostname,e.host=t.host,e.user=t.username||"",e.password=t.password||"",e.pathname=t.pathname,e.hash=t.hash.slice(1),e.search=t.search.slice(1),e.href=t.href,e.query=Object.fromEntries(t.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=r,e.query={},e.parse_failed=!0}return e}Qae.exports=J3e});var Pae=w((Fmt,xae)=>{"use strict";var W3e=Sae();function z3e(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var V3e=z3e(W3e),X3e="text/plain",Z3e="us-ascii",vae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),_3e=(r,{stripHash:e})=>{let t=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===Z3e)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length>0||l&&l!==X3e)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`};function $3e(r,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},r=r.trim(),/^data:/i.test(r))return _3e(r,e);if(/^view-source:/i.test(r))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname){let o=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,a=0,l="";for(;;){let u=o.exec(n.pathname);if(!u)break;let g=u[0],f=u.index,h=n.pathname.slice(a,f);l+=h.replace(/\/{2,}/g,"/"),l+=g,a=f+g.length}let c=n.pathname.slice(a,n.pathname.length);l+=c.replace(/\/{2,}/g,"/"),n.pathname=l}if(n.pathname)try{n.pathname=decodeURI(n.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let o=n.pathname.split("/"),a=o[o.length-1];vae(a,e.removeDirectoryIndex)&&(o=o.slice(0,-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])vae(o,e.removeQueryParameters)&&n.searchParams.delete(o);if(e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters){n.searchParams.sort();try{n.search=decodeURIComponent(n.search)}catch{}}e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(r=r.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r}var aM=(r,e=!1)=>{let t=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,i=s=>{let o=new Error(s);throw o.subject_url=r,o};(typeof r!="string"||!r.trim())&&i("Invalid url."),r.length>aM.MAX_INPUT_LENGTH&&i("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),r=$3e(r,e));let n=V3e.default(r);if(n.parse_failed){let s=n.href.match(t);s?(n.protocols=["ssh"],n.protocol="ssh",n.resource=s[2],n.host=s[2],n.user=s[1],n.pathname=`/${s[3]}`,n.parse_failed=!1):i("URL parsing failed.")}return n};aM.MAX_INPUT_LENGTH=2048;xae.exports=aM});var Rae=w((Nmt,kae)=>{"use strict";var e4e=oM();function Dae(r){if(Array.isArray(r))return r.indexOf("ssh")!==-1||r.indexOf("rsync")!==-1;if(typeof r!="string")return!1;var e=e4e(r);if(r=r.substring(r.indexOf("://")+3),Dae(e))return!0;var t=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!r.match(t)&&r.indexOf("@"){"use strict";var t4e=Pae(),Fae=Rae();function r4e(r){var e=t4e(r);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),Fae(e.protocols)||e.protocols.length===0&&Fae(r)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}Nae.exports=r4e});var Mae=w((Lmt,Lae)=>{"use strict";var i4e=Tae();function AM(r){if(typeof r!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(r)&&(r="https://github.com/"+r);var t=i4e(r),i=t.resource.split("."),n=null;switch(t.toString=function(y){return AM.stringify(this,y)},t.source=i.length>2?i.slice(1-i.length).join("."):t.source=t.resource,t.git_suffix=/\.git$/.test(t.pathname),t.name=decodeURIComponent((t.pathname||t.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),t.owner=decodeURIComponent(t.user),t.source){case"git.cloudforge.com":t.owner=t.user,t.organization=i[0],t.source="cloudforge.com";break;case"visualstudio.com":if(t.resource==="vs-ssh.visualstudio.com"){n=t.name.split("/"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3],t.full_name=n[2]+"/"+n[3]);break}else{n=t.name.split("/"),n.length===2?(t.owner=n[1],t.name=n[1],t.full_name="_git/"+t.name):n.length===3?(t.name=n[2],n[0]==="DefaultCollection"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+"/_git/"+t.name):(t.owner=n[0],t.full_name=t.owner+"/_git/"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+"/"+t.owner+"/_git/"+t.name);break}case"dev.azure.com":case"azure.com":if(t.resource==="ssh.dev.azure.com"){n=t.name.split("/"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3]);break}else{n=t.name.split("/"),n.length===5?(t.organization=n[0],t.owner=n[1],t.name=n[4],t.full_name="_git/"+t.name):n.length===3?(t.name=n[2],n[0]==="DefaultCollection"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+"/_git/"+t.name):(t.owner=n[0],t.full_name=t.owner+"/_git/"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+"/"+t.owner+"/_git/"+t.name),t.query&&t.query.path&&(t.filepath=t.query.path.replace(/^\/+/g,"")),t.query&&t.query.version&&(t.ref=t.query.version.replace(/^GB/,""));break}default:n=t.name.split("/");var s=n.length-1;if(n.length>=2){var o=n.indexOf("-",2),a=n.indexOf("blob",2),l=n.indexOf("tree",2),c=n.indexOf("commit",2),u=n.indexOf("src",2),g=n.indexOf("raw",2),f=n.indexOf("edit",2);s=o>0?o-1:a>0?a-1:l>0?l-1:c>0?c-1:u>0?u-1:g>0?g-1:f>0?f-1:s,t.owner=n.slice(0,s).join("/"),t.name=n[s],c&&(t.commit=n[s+2])}t.ref="",t.filepathtype="",t.filepath="";var h=n.length>s&&n[s+1]==="-"?s+1:s;n.length>h+2&&["raw","src","blob","tree","edit"].indexOf(n[h+1])>=0&&(t.filepathtype=n[h+1],t.ref=n[h+2],n.length>h+3&&(t.filepath=n.slice(h+3).join("/"))),t.organization=t.owner;break}t.full_name||(t.full_name=t.owner,t.name&&(t.full_name&&(t.full_name+="/"),t.full_name+=t.name)),t.owner.startsWith("scm/")&&(t.source="bitbucket-server",t.owner=t.owner.replace("scm/",""),t.organization=t.owner,t.full_name=t.owner+"/"+t.name);var p=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,C=p.exec(t.pathname);return C!=null&&(t.source="bitbucket-server",C[1]==="users"?t.owner="~"+C[2]:t.owner=C[2],t.organization=t.owner,t.name=C[3],n=C[4].split("/"),n.length>1&&(["raw","browse"].indexOf(n[1])>=0?(t.filepathtype=n[1],n.length>2&&(t.filepath=n.slice(2).join("/"))):n[1]==="commits"&&n.length>2&&(t.commit=n[2])),t.full_name=t.owner+"/"+t.name,t.query.at?t.ref=t.query.at:t.ref=""),t}AM.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join("+"):r.protocol);var t=r.port?":"+r.port:"",i=r.user||"git",n=r.git_suffix?".git":"";switch(e){case"ssh":return t?"ssh://"+i+"@"+r.resource+t+"/"+r.full_name+n:i+"@"+r.resource+":"+r.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+r.resource+t+"/"+r.full_name+n;case"http":case"https":var s=r.token?n4e(r):r.user&&(r.protocols.includes("http")||r.protocols.includes("https"))?r.user+"@":"";return e+"://"+s+r.resource+t+"/"+s4e(r)+n;default:return r.href}};function n4e(r){switch(r.source){case"bitbucket.org":return"x-token-auth:"+r.token+"@";default:return r.token+"@"}}function s4e(r){switch(r.source){case"bitbucket-server":return"scm/"+r.full_name;default:return""+r.full_name}}Lae.exports=AM});var DM=w((Syt,iAe)=>{var S4e=bh(),v4e=Ih();function x4e(r,e,t){(t!==void 0&&!v4e(r[e],t)||t===void 0&&!(e in r))&&S4e(r,e,t)}iAe.exports=x4e});var sAe=w((vyt,nAe)=>{var P4e=gm(),D4e=Wo();function k4e(r){return D4e(r)&&P4e(r)}nAe.exports=k4e});var AAe=w((xyt,aAe)=>{var R4e=Fc(),F4e=kb(),N4e=Wo(),T4e="[object Object]",L4e=Function.prototype,M4e=Object.prototype,oAe=L4e.toString,O4e=M4e.hasOwnProperty,K4e=oAe.call(Object);function U4e(r){if(!N4e(r)||R4e(r)!=T4e)return!1;var e=F4e(r);if(e===null)return!0;var t=O4e.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&oAe.call(t)==K4e}aAe.exports=U4e});var kM=w((Pyt,lAe)=>{function H4e(r,e){if(!(e==="constructor"&&typeof r[e]=="function")&&e!="__proto__")return r[e]}lAe.exports=H4e});var uAe=w((Dyt,cAe)=>{var G4e=Jh(),Y4e=Wh();function j4e(r){return G4e(r,Y4e(r))}cAe.exports=j4e});var CAe=w((kyt,dAe)=>{var gAe=DM(),q4e=qL(),J4e=zL(),W4e=JL(),z4e=VL(),fAe=nm(),hAe=vs(),V4e=sAe(),X4e=lm(),Z4e=U0(),_4e=vn(),$4e=AAe(),e8e=ob(),pAe=kM(),t8e=uAe();function r8e(r,e,t,i,n,s,o){var a=pAe(r,t),l=pAe(e,t),c=o.get(l);if(c){gAe(r,t,c);return}var u=s?s(a,l,t+"",r,e,o):void 0,g=u===void 0;if(g){var f=hAe(l),h=!f&&X4e(l),p=!f&&!h&&e8e(l);u=l,f||h||p?hAe(a)?u=a:V4e(a)?u=W4e(a):h?(g=!1,u=q4e(l,!0)):p?(g=!1,u=J4e(l,!0)):u=[]:$4e(l)||fAe(l)?(u=a,fAe(a)?u=t8e(a):(!_4e(a)||Z4e(a))&&(u=z4e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),gAe(r,t,u)}dAe.exports=r8e});var IAe=w((Ryt,EAe)=>{var i8e=fm(),n8e=DM(),s8e=aT(),o8e=CAe(),a8e=vn(),A8e=Wh(),l8e=kM();function mAe(r,e,t,i,n){r!==e&&s8e(e,function(s,o){if(n||(n=new i8e),a8e(s))o8e(r,e,o,t,mAe,i,n);else{var a=i?i(l8e(r,o),s,o+"",r,e,n):void 0;a===void 0&&(a=s),n8e(r,o,a)}},A8e)}EAe.exports=mAe});var wAe=w((Fyt,yAe)=>{var c8e=J0(),u8e=jN(),g8e=qN();function f8e(r,e){return g8e(u8e(r,e,c8e),r+"")}yAe.exports=f8e});var bAe=w((Nyt,BAe)=>{var h8e=Ih(),p8e=gm(),d8e=im(),C8e=vn();function m8e(r,e,t){if(!C8e(t))return!1;var i=typeof e;return(i=="number"?p8e(t)&&d8e(e,t.length):i=="string"&&e in t)?h8e(t[e],r):!1}BAe.exports=m8e});var SAe=w((Tyt,QAe)=>{var E8e=wAe(),I8e=bAe();function y8e(r){return E8e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s=="function"?(n--,s):void 0,o&&I8e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var w8e=IAe(),B8e=SAe(),b8e=B8e(function(r,e,t){w8e(r,e,t)});vAe.exports=b8e});var GAe=w((Twt,HAe)=>{var HM;HAe.exports=()=>(typeof HM>"u"&&(HM=J("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),HM)});var lle=w((sBt,Ale)=>{var XM=Symbol("arg flag"),Rn=class extends Error{constructor(e,t){super(e),this.name="ArgError",this.code=t,Object.setPrototypeOf(this,Rn.prototype)}};function uE(r,{argv:e=process.argv.slice(2),permissive:t=!1,stopAtPositional:i=!1}={}){if(!r)throw new Rn("argument specification object is required","ARG_CONFIG_NO_SPEC");let n={_:[]},s={},o={};for(let a of Object.keys(r)){if(!a)throw new Rn("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(a[0]!=="-")throw new Rn(`argument key must start with '-' but found: '${a}'`,"ARG_CONFIG_NONOPT_KEY");if(a.length===1)throw new Rn(`argument key must have a name; singular '-' keys are not allowed: ${a}`,"ARG_CONFIG_NONAME_KEY");if(typeof r[a]=="string"){s[a]=r[a];continue}let l=r[a],c=!1;if(Array.isArray(l)&&l.length===1&&typeof l[0]=="function"){let[u]=l;l=(g,f,h=[])=>(h.push(u(g,f,h[h.length-1])),h),c=u===Boolean||u[XM]===!0}else if(typeof l=="function")c=l===Boolean||l[XM]===!0;else throw new Rn(`type missing or not a function or valid array type: ${a}`,"ARG_CONFIG_VAD_TYPE");if(a[1]!=="-"&&a.length>2)throw new Rn(`short argument keys (with a single hyphen) must have only one character: ${a}`,"ARG_CONFIG_SHORTOPT_TOOLONG");o[a]=[l,c]}for(let a=0,l=e.length;a0){n._=n._.concat(e.slice(a));break}if(c==="--"){n._=n._.concat(e.slice(a+1));break}if(c.length>1&&c[0]==="-"){let u=c[1]==="-"||c.length===2?[c]:c.slice(1).split("").map(g=>`-${g}`);for(let g=0;g1&&e[a+1][0]==="-"&&!(e[a+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(y===Number||typeof BigInt<"u"&&y===BigInt))){let v=h===C?"":` (alias for ${C})`;throw new Rn(`option requires argument: ${h}${v}`,"ARG_MISSING_REQUIRED_LONGARG")}n[C]=y(e[a+1],C,n[C]),++a}else n[C]=y(p,C,n[C])}}else n._.push(c)}return n}uE.flag=r=>(r[XM]=!0,r);uE.COUNT=uE.flag((r,e,t)=>(t||0)+1);uE.ArgError=Rn;Ale.exports=uE});var Ile=w((LBt,Ele)=>{var eO;Ele.exports=()=>(typeof eO>"u"&&(eO=J("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),eO)});var vle=w((oO,aO)=>{(function(r){oO&&typeof oO=="object"&&typeof aO<"u"?aO.exports=r():typeof define=="function"&&define.amd?define([],r):typeof window<"u"?window.isWindows=r():typeof global<"u"?global.isWindows=r():typeof self<"u"?self.isWindows=r():this.isWindows=r()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var kle=w((T0t,Dle)=>{"use strict";AO.ifExists=wze;var np=J("util"),Ts=J("path"),xle=vle(),Eze=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,Ize={createPwshFile:!0,createCmdFile:xle(),fs:J("fs")},yze=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function Ple(r){let e={...Ize,...r},t=e.fs;return e.fs_={chmod:t.chmod?np.promisify(t.chmod):async()=>{},mkdir:np.promisify(t.mkdir),readFile:np.promisify(t.readFile),stat:np.promisify(t.stat),unlink:np.promisify(t.unlink),writeFile:np.promisify(t.writeFile)},e}async function AO(r,e,t){let i=Ple(t);await i.fs_.stat(r),await bze(r,e,i)}function wze(r,e,t){return AO(r,e,t).catch(()=>{})}function Bze(r,e){return e.fs_.unlink(r).catch(()=>{})}async function bze(r,e,t){let i=await Pze(r,t);return await Qze(e,t),Sze(r,e,i,t)}function Qze(r,e){return e.fs_.mkdir(Ts.dirname(r),{recursive:!0})}function Sze(r,e,t,i){let n=Ple(i),s=[{generator:Rze,extension:""}];return n.createCmdFile&&s.push({generator:kze,extension:".cmd"}),n.createPwshFile&&s.push({generator:Fze,extension:".ps1"}),Promise.all(s.map(o=>Dze(r,e+o.extension,t,o.generator,n)))}function vze(r,e){return Bze(r,e)}function xze(r,e){return Nze(r,e)}async function Pze(r,e){let n=(await e.fs_.readFile(r,"utf8")).trim().split(/\r*\n/)[0].match(Eze);if(!n){let s=Ts.extname(r).toLowerCase();return{program:yze.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function Dze(r,e,t,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[t.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:t.program,args:o}),await vze(e,n),await n.fs_.writeFile(e,i(r,e,n),"utf8"),xze(e,n)}function kze(r,e,t){let n=Ts.relative(Ts.dirname(e),r).split("/").join("\\"),s=Ts.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=t.prog,l=t.args||"",c=lO(t.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=t.progArgs?`${t.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r +`)),this.write(this.margin[2]),this.restore()}};Ise.exports=TL});var Bse=w((sft,wse)=>{"use strict";var Cqe=Cl(),LL=class extends Cqe{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};wse.exports=LL});var Qse=w(ML=>{"use strict";var bse=ji(),ui=(r,e)=>{bse.defineExport(ML,r,e),bse.defineExport(ML,r.toLowerCase(),e)};ui("AutoComplete",()=>kne());ui("BasicAuth",()=>One());ui("Confirm",()=>Hne());ui("Editable",()=>Yne());ui("Form",()=>vb());ui("Input",()=>wL());ui("Invisible",()=>Xne());ui("List",()=>_ne());ui("MultiSelect",()=>ese());ui("Numeral",()=>ise());ui("Password",()=>sse());ui("Scale",()=>Ase());ui("Select",()=>Cl());ui("Snippet",()=>fse());ui("Sort",()=>pse());ui("Survey",()=>Cse());ui("Text",()=>Ese());ui("Toggle",()=>yse());ui("Quiz",()=>Bse())});var vse=w((aft,Sse)=>{Sse.exports={ArrayPrompt:Mm(),AuthPrompt:dL(),BooleanPrompt:xb(),NumberPrompt:vL(),StringPrompt:au()}});var Km=w((Aft,Pse)=>{"use strict";var xse=J("assert"),KL=J("events"),ml=ji(),ho=class extends KL{constructor(e,t){super(),this.options=ml.merge({},e),this.answers={...t}}register(e,t){if(ml.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}xse.equal(typeof t,"function","expected a function");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t=="function"&&(t=await t.call(this)),await this.ask(ml.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let t=ml.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=ml;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];xse(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||Yh()}static get prompts(){return Qse()}static get types(){return vse()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return ml.mixinEmitter(e,new KL),e}};ml.mixinEmitter(ho,new KL);var OL=ho.prompts;for(let r of Object.keys(OL)){let e=r.toLowerCase(),t=i=>new OL[r](i).run();ho.prompt[e]=t,ho[e]=t,ho[r]||Reflect.defineProperty(ho,r,{get:()=>OL[r]})}var Om=r=>{ml.defineExport(ho,r,()=>ho.types[r])};Om("ArrayPrompt");Om("AuthPrompt");Om("BooleanPrompt");Om("NumberPrompt");Om("StringPrompt");Pse.exports=ho});var Kse=w((Vft,Ose)=>{function wqe(r,e){for(var t=-1,i=r==null?0:r.length;++t{var Bqe=Y0(),bqe=bh();function Qqe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s{var Sqe=Jh(),vqe=Rh();function xqe(r,e){return r&&Sqe(e,vqe(e),r)}Hse.exports=xqe});var jse=w((_ft,Yse)=>{function Pqe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yse.exports=Pqe});var Jse=w(($ft,qse)=>{var Dqe=vn(),kqe=ab(),Rqe=jse(),Fqe=Object.prototype,Nqe=Fqe.hasOwnProperty;function Tqe(r){if(!Dqe(r))return Rqe(r);var e=kqe(r),t=[];for(var i in r)i=="constructor"&&(e||!Nqe.call(r,i))||t.push(i);return t}qse.exports=Tqe});var Wh=w((eht,Wse)=>{var Lqe=lT(),Mqe=Jse(),Oqe=gm();function Kqe(r){return Oqe(r)?Lqe(r,!0):Mqe(r)}Wse.exports=Kqe});var Vse=w((tht,zse)=>{var Uqe=Jh(),Hqe=Wh();function Gqe(r,e){return r&&Uqe(e,Hqe(e),r)}zse.exports=Gqe});var qL=w((Ym,zh)=>{var Yqe=ys(),$se=typeof Ym=="object"&&Ym&&!Ym.nodeType&&Ym,Xse=$se&&typeof zh=="object"&&zh&&!zh.nodeType&&zh,jqe=Xse&&Xse.exports===$se,Zse=jqe?Yqe.Buffer:void 0,_se=Zse?Zse.allocUnsafe:void 0;function qqe(r,e){if(e)return r.slice();var t=r.length,i=_se?_se(t):new r.constructor(t);return r.copy(i),i}zh.exports=qqe});var JL=w((rht,eoe)=>{function Jqe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t{var Wqe=Jh(),zqe=lb();function Vqe(r,e){return Wqe(r,zqe(r),e)}toe.exports=Vqe});var kb=w((nht,ioe)=>{var Xqe=cT(),Zqe=Xqe(Object.getPrototypeOf,Object);ioe.exports=Zqe});var WL=w((sht,noe)=>{var _qe=q0(),$qe=kb(),eJe=lb(),tJe=dT(),rJe=Object.getOwnPropertySymbols,iJe=rJe?function(r){for(var e=[];r;)_qe(e,eJe(r)),r=$qe(r);return e}:tJe;noe.exports=iJe});var ooe=w((oht,soe)=>{var nJe=Jh(),sJe=WL();function oJe(r,e){return nJe(r,sJe(r),e)}soe.exports=oJe});var Aoe=w((aht,aoe)=>{var aJe=pT(),AJe=WL(),lJe=Wh();function cJe(r){return aJe(r,lJe,AJe)}aoe.exports=cJe});var coe=w((Aht,loe)=>{var uJe=Object.prototype,gJe=uJe.hasOwnProperty;function fJe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]=="string"&&gJe.call(r,"index")&&(t.index=r.index,t.input=r.input),t}loe.exports=fJe});var Rb=w((lht,goe)=>{var uoe=fT();function hJe(r){var e=new r.constructor(r.byteLength);return new uoe(e).set(new uoe(r)),e}goe.exports=hJe});var hoe=w((cht,foe)=>{var pJe=Rb();function dJe(r,e){var t=e?pJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}foe.exports=dJe});var doe=w((uht,poe)=>{var CJe=/\w*$/;function mJe(r){var e=new r.constructor(r.source,CJe.exec(r));return e.lastIndex=r.lastIndex,e}poe.exports=mJe});var yoe=w((ght,Ioe)=>{var Coe=Rc(),moe=Coe?Coe.prototype:void 0,Eoe=moe?moe.valueOf:void 0;function EJe(r){return Eoe?Object(Eoe.call(r)):{}}Ioe.exports=EJe});var zL=w((fht,woe)=>{var IJe=Rb();function yJe(r,e){var t=e?IJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}woe.exports=yJe});var boe=w((hht,Boe)=>{var wJe=Rb(),BJe=hoe(),bJe=doe(),QJe=yoe(),SJe=zL(),vJe="[object Boolean]",xJe="[object Date]",PJe="[object Map]",DJe="[object Number]",kJe="[object RegExp]",RJe="[object Set]",FJe="[object String]",NJe="[object Symbol]",TJe="[object ArrayBuffer]",LJe="[object DataView]",MJe="[object Float32Array]",OJe="[object Float64Array]",KJe="[object Int8Array]",UJe="[object Int16Array]",HJe="[object Int32Array]",GJe="[object Uint8Array]",YJe="[object Uint8ClampedArray]",jJe="[object Uint16Array]",qJe="[object Uint32Array]";function JJe(r,e,t){var i=r.constructor;switch(e){case TJe:return wJe(r);case vJe:case xJe:return new i(+r);case LJe:return BJe(r,t);case MJe:case OJe:case KJe:case UJe:case HJe:case GJe:case YJe:case jJe:case qJe:return SJe(r,t);case PJe:return new i;case DJe:case FJe:return new i(r);case kJe:return bJe(r);case RJe:return new i;case NJe:return QJe(r)}}Boe.exports=JJe});var voe=w((pht,Soe)=>{var WJe=vn(),Qoe=Object.create,zJe=function(){function r(){}return function(e){if(!WJe(e))return{};if(Qoe)return Qoe(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Soe.exports=zJe});var VL=w((dht,xoe)=>{var VJe=voe(),XJe=kb(),ZJe=ab();function _Je(r){return typeof r.constructor=="function"&&!ZJe(r)?VJe(XJe(r)):{}}xoe.exports=_Je});var Doe=w((Cht,Poe)=>{var $Je=hm(),eWe=Wo(),tWe="[object Map]";function rWe(r){return eWe(r)&&$Je(r)==tWe}Poe.exports=rWe});var Noe=w((mht,Foe)=>{var iWe=Doe(),nWe=nb(),koe=sb(),Roe=koe&&koe.isMap,sWe=Roe?nWe(Roe):iWe;Foe.exports=sWe});var Loe=w((Eht,Toe)=>{var oWe=hm(),aWe=Wo(),AWe="[object Set]";function lWe(r){return aWe(r)&&oWe(r)==AWe}Toe.exports=lWe});var Uoe=w((Iht,Koe)=>{var cWe=Loe(),uWe=nb(),Moe=sb(),Ooe=Moe&&Moe.isSet,gWe=Ooe?uWe(Ooe):cWe;Koe.exports=gWe});var qoe=w((yht,joe)=>{var fWe=fm(),hWe=Kse(),pWe=Y0(),dWe=Gse(),CWe=Vse(),mWe=qL(),EWe=JL(),IWe=roe(),yWe=ooe(),wWe=CT(),BWe=Aoe(),bWe=hm(),QWe=coe(),SWe=boe(),vWe=VL(),xWe=vs(),PWe=lm(),DWe=Noe(),kWe=vn(),RWe=Uoe(),FWe=Rh(),NWe=Wh(),TWe=1,LWe=2,MWe=4,Hoe="[object Arguments]",OWe="[object Array]",KWe="[object Boolean]",UWe="[object Date]",HWe="[object Error]",Goe="[object Function]",GWe="[object GeneratorFunction]",YWe="[object Map]",jWe="[object Number]",Yoe="[object Object]",qWe="[object RegExp]",JWe="[object Set]",WWe="[object String]",zWe="[object Symbol]",VWe="[object WeakMap]",XWe="[object ArrayBuffer]",ZWe="[object DataView]",_We="[object Float32Array]",$We="[object Float64Array]",e3e="[object Int8Array]",t3e="[object Int16Array]",r3e="[object Int32Array]",i3e="[object Uint8Array]",n3e="[object Uint8ClampedArray]",s3e="[object Uint16Array]",o3e="[object Uint32Array]",ur={};ur[Hoe]=ur[OWe]=ur[XWe]=ur[ZWe]=ur[KWe]=ur[UWe]=ur[_We]=ur[$We]=ur[e3e]=ur[t3e]=ur[r3e]=ur[YWe]=ur[jWe]=ur[Yoe]=ur[qWe]=ur[JWe]=ur[WWe]=ur[zWe]=ur[i3e]=ur[n3e]=ur[s3e]=ur[o3e]=!0;ur[HWe]=ur[Goe]=ur[VWe]=!1;function Fb(r,e,t,i,n,s){var o,a=e&TWe,l=e&LWe,c=e&MWe;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!kWe(r))return r;var u=xWe(r);if(u){if(o=QWe(r),!a)return EWe(r,o)}else{var g=bWe(r),f=g==Goe||g==GWe;if(PWe(r))return mWe(r,a);if(g==Yoe||g==Hoe||f&&!n){if(o=l||f?{}:vWe(r),!a)return l?yWe(r,CWe(o,r)):IWe(r,dWe(o,r))}else{if(!ur[g])return n?r:{};o=SWe(r,g,a)}}s||(s=new fWe);var h=s.get(r);if(h)return h;s.set(r,o),RWe(r)?r.forEach(function(y){o.add(Fb(y,e,t,y,r,s))}):DWe(r)&&r.forEach(function(y,B){o.set(B,Fb(y,e,t,B,r,s))});var p=c?l?BWe:wWe:l?NWe:FWe,C=u?void 0:p(r);return hWe(C||r,function(y,B){C&&(B=y,y=r[B]),pWe(o,B,Fb(y,e,t,B,r,s))}),o}joe.exports=Fb});var XL=w((wht,Joe)=>{var a3e=qoe(),A3e=1,l3e=4;function c3e(r){return a3e(r,A3e|l3e)}Joe.exports=c3e});var zoe=w((Bht,Woe)=>{var u3e=HN();function g3e(r,e,t){return r==null?r:u3e(r,e,t)}Woe.exports=g3e});var $oe=w((Pht,_oe)=>{function f3e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}_oe.exports=f3e});var tae=w((Dht,eae)=>{var h3e=rm(),p3e=HR();function d3e(r,e){return e.length<2?r:h3e(r,p3e(e,0,-1))}eae.exports=d3e});var iae=w((kht,rae)=>{var C3e=Bh(),m3e=$oe(),E3e=tae(),I3e=Zc();function y3e(r,e){return e=C3e(e,r),r=E3e(r,e),r==null||delete r[I3e(m3e(e))]}rae.exports=y3e});var sae=w((Rht,nae)=>{var w3e=iae();function B3e(r,e){return r==null?!0:w3e(r,e)}nae.exports=B3e});var cae=w((opt,S3e)=>{S3e.exports={name:"@yarnpkg/cli",version:"3.6.3",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var oM=w((kmt,bae)=>{"use strict";bae.exports=function(e,t){t===!0&&(t=0);var i="";if(typeof e=="string")try{i=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(i=e.protocol);var n=i.split(/\:|\+/).filter(Boolean);return typeof t=="number"?n[t]:n}});var Sae=w((Rmt,Qae)=>{"use strict";var q3e=oM();function J3e(r){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:r,query:{},parse_failed:!1};try{var t=new URL(r);e.protocols=q3e(t),e.protocol=e.protocols[0],e.port=t.port,e.resource=t.hostname,e.host=t.host,e.user=t.username||"",e.password=t.password||"",e.pathname=t.pathname,e.hash=t.hash.slice(1),e.search=t.search.slice(1),e.href=t.href,e.query=Object.fromEntries(t.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=r,e.query={},e.parse_failed=!0}return e}Qae.exports=J3e});var Pae=w((Fmt,xae)=>{"use strict";var W3e=Sae();function z3e(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var V3e=z3e(W3e),X3e="text/plain",Z3e="us-ascii",vae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),_3e=(r,{stripHash:e})=>{let t=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===Z3e)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length>0||l&&l!==X3e)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`};function $3e(r,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},r=r.trim(),/^data:/i.test(r))return _3e(r,e);if(/^view-source:/i.test(r))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname){let o=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,a=0,l="";for(;;){let u=o.exec(n.pathname);if(!u)break;let g=u[0],f=u.index,h=n.pathname.slice(a,f);l+=h.replace(/\/{2,}/g,"/"),l+=g,a=f+g.length}let c=n.pathname.slice(a,n.pathname.length);l+=c.replace(/\/{2,}/g,"/"),n.pathname=l}if(n.pathname)try{n.pathname=decodeURI(n.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let o=n.pathname.split("/"),a=o[o.length-1];vae(a,e.removeDirectoryIndex)&&(o=o.slice(0,-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])vae(o,e.removeQueryParameters)&&n.searchParams.delete(o);if(e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters){n.searchParams.sort();try{n.search=decodeURIComponent(n.search)}catch{}}e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(r=r.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r}var aM=(r,e=!1)=>{let t=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,i=s=>{let o=new Error(s);throw o.subject_url=r,o};(typeof r!="string"||!r.trim())&&i("Invalid url."),r.length>aM.MAX_INPUT_LENGTH&&i("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),r=$3e(r,e));let n=V3e.default(r);if(n.parse_failed){let s=n.href.match(t);s?(n.protocols=["ssh"],n.protocol="ssh",n.resource=s[2],n.host=s[2],n.user=s[1],n.pathname=`/${s[3]}`,n.parse_failed=!1):i("URL parsing failed.")}return n};aM.MAX_INPUT_LENGTH=2048;xae.exports=aM});var Rae=w((Nmt,kae)=>{"use strict";var e4e=oM();function Dae(r){if(Array.isArray(r))return r.indexOf("ssh")!==-1||r.indexOf("rsync")!==-1;if(typeof r!="string")return!1;var e=e4e(r);if(r=r.substring(r.indexOf("://")+3),Dae(e))return!0;var t=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!r.match(t)&&r.indexOf("@"){"use strict";var t4e=Pae(),Fae=Rae();function r4e(r){var e=t4e(r);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),Fae(e.protocols)||e.protocols.length===0&&Fae(r)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}Nae.exports=r4e});var Mae=w((Lmt,Lae)=>{"use strict";var i4e=Tae();function AM(r){if(typeof r!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(r)&&(r="https://github.com/"+r);var t=i4e(r),i=t.resource.split("."),n=null;switch(t.toString=function(y){return AM.stringify(this,y)},t.source=i.length>2?i.slice(1-i.length).join("."):t.source=t.resource,t.git_suffix=/\.git$/.test(t.pathname),t.name=decodeURIComponent((t.pathname||t.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),t.owner=decodeURIComponent(t.user),t.source){case"git.cloudforge.com":t.owner=t.user,t.organization=i[0],t.source="cloudforge.com";break;case"visualstudio.com":if(t.resource==="vs-ssh.visualstudio.com"){n=t.name.split("/"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3],t.full_name=n[2]+"/"+n[3]);break}else{n=t.name.split("/"),n.length===2?(t.owner=n[1],t.name=n[1],t.full_name="_git/"+t.name):n.length===3?(t.name=n[2],n[0]==="DefaultCollection"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+"/_git/"+t.name):(t.owner=n[0],t.full_name=t.owner+"/_git/"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+"/"+t.owner+"/_git/"+t.name);break}case"dev.azure.com":case"azure.com":if(t.resource==="ssh.dev.azure.com"){n=t.name.split("/"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3]);break}else{n=t.name.split("/"),n.length===5?(t.organization=n[0],t.owner=n[1],t.name=n[4],t.full_name="_git/"+t.name):n.length===3?(t.name=n[2],n[0]==="DefaultCollection"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+"/_git/"+t.name):(t.owner=n[0],t.full_name=t.owner+"/_git/"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+"/"+t.owner+"/_git/"+t.name),t.query&&t.query.path&&(t.filepath=t.query.path.replace(/^\/+/g,"")),t.query&&t.query.version&&(t.ref=t.query.version.replace(/^GB/,""));break}default:n=t.name.split("/");var s=n.length-1;if(n.length>=2){var o=n.indexOf("-",2),a=n.indexOf("blob",2),l=n.indexOf("tree",2),c=n.indexOf("commit",2),u=n.indexOf("src",2),g=n.indexOf("raw",2),f=n.indexOf("edit",2);s=o>0?o-1:a>0?a-1:l>0?l-1:c>0?c-1:u>0?u-1:g>0?g-1:f>0?f-1:s,t.owner=n.slice(0,s).join("/"),t.name=n[s],c&&(t.commit=n[s+2])}t.ref="",t.filepathtype="",t.filepath="";var h=n.length>s&&n[s+1]==="-"?s+1:s;n.length>h+2&&["raw","src","blob","tree","edit"].indexOf(n[h+1])>=0&&(t.filepathtype=n[h+1],t.ref=n[h+2],n.length>h+3&&(t.filepath=n.slice(h+3).join("/"))),t.organization=t.owner;break}t.full_name||(t.full_name=t.owner,t.name&&(t.full_name&&(t.full_name+="/"),t.full_name+=t.name)),t.owner.startsWith("scm/")&&(t.source="bitbucket-server",t.owner=t.owner.replace("scm/",""),t.organization=t.owner,t.full_name=t.owner+"/"+t.name);var p=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,C=p.exec(t.pathname);return C!=null&&(t.source="bitbucket-server",C[1]==="users"?t.owner="~"+C[2]:t.owner=C[2],t.organization=t.owner,t.name=C[3],n=C[4].split("/"),n.length>1&&(["raw","browse"].indexOf(n[1])>=0?(t.filepathtype=n[1],n.length>2&&(t.filepath=n.slice(2).join("/"))):n[1]==="commits"&&n.length>2&&(t.commit=n[2])),t.full_name=t.owner+"/"+t.name,t.query.at?t.ref=t.query.at:t.ref=""),t}AM.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join("+"):r.protocol);var t=r.port?":"+r.port:"",i=r.user||"git",n=r.git_suffix?".git":"";switch(e){case"ssh":return t?"ssh://"+i+"@"+r.resource+t+"/"+r.full_name+n:i+"@"+r.resource+":"+r.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+r.resource+t+"/"+r.full_name+n;case"http":case"https":var s=r.token?n4e(r):r.user&&(r.protocols.includes("http")||r.protocols.includes("https"))?r.user+"@":"";return e+"://"+s+r.resource+t+"/"+s4e(r)+n;default:return r.href}};function n4e(r){switch(r.source){case"bitbucket.org":return"x-token-auth:"+r.token+"@";default:return r.token+"@"}}function s4e(r){switch(r.source){case"bitbucket-server":return"scm/"+r.full_name;default:return""+r.full_name}}Lae.exports=AM});var DM=w((Syt,iAe)=>{var S4e=bh(),v4e=Ih();function x4e(r,e,t){(t!==void 0&&!v4e(r[e],t)||t===void 0&&!(e in r))&&S4e(r,e,t)}iAe.exports=x4e});var sAe=w((vyt,nAe)=>{var P4e=gm(),D4e=Wo();function k4e(r){return D4e(r)&&P4e(r)}nAe.exports=k4e});var AAe=w((xyt,aAe)=>{var R4e=Fc(),F4e=kb(),N4e=Wo(),T4e="[object Object]",L4e=Function.prototype,M4e=Object.prototype,oAe=L4e.toString,O4e=M4e.hasOwnProperty,K4e=oAe.call(Object);function U4e(r){if(!N4e(r)||R4e(r)!=T4e)return!1;var e=F4e(r);if(e===null)return!0;var t=O4e.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&oAe.call(t)==K4e}aAe.exports=U4e});var kM=w((Pyt,lAe)=>{function H4e(r,e){if(!(e==="constructor"&&typeof r[e]=="function")&&e!="__proto__")return r[e]}lAe.exports=H4e});var uAe=w((Dyt,cAe)=>{var G4e=Jh(),Y4e=Wh();function j4e(r){return G4e(r,Y4e(r))}cAe.exports=j4e});var CAe=w((kyt,dAe)=>{var gAe=DM(),q4e=qL(),J4e=zL(),W4e=JL(),z4e=VL(),fAe=nm(),hAe=vs(),V4e=sAe(),X4e=lm(),Z4e=U0(),_4e=vn(),$4e=AAe(),e8e=ob(),pAe=kM(),t8e=uAe();function r8e(r,e,t,i,n,s,o){var a=pAe(r,t),l=pAe(e,t),c=o.get(l);if(c){gAe(r,t,c);return}var u=s?s(a,l,t+"",r,e,o):void 0,g=u===void 0;if(g){var f=hAe(l),h=!f&&X4e(l),p=!f&&!h&&e8e(l);u=l,f||h||p?hAe(a)?u=a:V4e(a)?u=W4e(a):h?(g=!1,u=q4e(l,!0)):p?(g=!1,u=J4e(l,!0)):u=[]:$4e(l)||fAe(l)?(u=a,fAe(a)?u=t8e(a):(!_4e(a)||Z4e(a))&&(u=z4e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),gAe(r,t,u)}dAe.exports=r8e});var IAe=w((Ryt,EAe)=>{var i8e=fm(),n8e=DM(),s8e=aT(),o8e=CAe(),a8e=vn(),A8e=Wh(),l8e=kM();function mAe(r,e,t,i,n){r!==e&&s8e(e,function(s,o){if(n||(n=new i8e),a8e(s))o8e(r,e,o,t,mAe,i,n);else{var a=i?i(l8e(r,o),s,o+"",r,e,n):void 0;a===void 0&&(a=s),n8e(r,o,a)}},A8e)}EAe.exports=mAe});var wAe=w((Fyt,yAe)=>{var c8e=J0(),u8e=jN(),g8e=qN();function f8e(r,e){return g8e(u8e(r,e,c8e),r+"")}yAe.exports=f8e});var bAe=w((Nyt,BAe)=>{var h8e=Ih(),p8e=gm(),d8e=im(),C8e=vn();function m8e(r,e,t){if(!C8e(t))return!1;var i=typeof e;return(i=="number"?p8e(t)&&d8e(e,t.length):i=="string"&&e in t)?h8e(t[e],r):!1}BAe.exports=m8e});var SAe=w((Tyt,QAe)=>{var E8e=wAe(),I8e=bAe();function y8e(r){return E8e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s=="function"?(n--,s):void 0,o&&I8e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var w8e=IAe(),B8e=SAe(),b8e=B8e(function(r,e,t){w8e(r,e,t)});vAe.exports=b8e});var GAe=w((Twt,HAe)=>{var HM;HAe.exports=()=>(typeof HM>"u"&&(HM=J("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),HM)});var lle=w((sBt,Ale)=>{var XM=Symbol("arg flag"),Rn=class extends Error{constructor(e,t){super(e),this.name="ArgError",this.code=t,Object.setPrototypeOf(this,Rn.prototype)}};function uE(r,{argv:e=process.argv.slice(2),permissive:t=!1,stopAtPositional:i=!1}={}){if(!r)throw new Rn("argument specification object is required","ARG_CONFIG_NO_SPEC");let n={_:[]},s={},o={};for(let a of Object.keys(r)){if(!a)throw new Rn("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(a[0]!=="-")throw new Rn(`argument key must start with '-' but found: '${a}'`,"ARG_CONFIG_NONOPT_KEY");if(a.length===1)throw new Rn(`argument key must have a name; singular '-' keys are not allowed: ${a}`,"ARG_CONFIG_NONAME_KEY");if(typeof r[a]=="string"){s[a]=r[a];continue}let l=r[a],c=!1;if(Array.isArray(l)&&l.length===1&&typeof l[0]=="function"){let[u]=l;l=(g,f,h=[])=>(h.push(u(g,f,h[h.length-1])),h),c=u===Boolean||u[XM]===!0}else if(typeof l=="function")c=l===Boolean||l[XM]===!0;else throw new Rn(`type missing or not a function or valid array type: ${a}`,"ARG_CONFIG_VAD_TYPE");if(a[1]!=="-"&&a.length>2)throw new Rn(`short argument keys (with a single hyphen) must have only one character: ${a}`,"ARG_CONFIG_SHORTOPT_TOOLONG");o[a]=[l,c]}for(let a=0,l=e.length;a0){n._=n._.concat(e.slice(a));break}if(c==="--"){n._=n._.concat(e.slice(a+1));break}if(c.length>1&&c[0]==="-"){let u=c[1]==="-"||c.length===2?[c]:c.slice(1).split("").map(g=>`-${g}`);for(let g=0;g1&&e[a+1][0]==="-"&&!(e[a+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(y===Number||typeof BigInt<"u"&&y===BigInt))){let v=h===C?"":` (alias for ${C})`;throw new Rn(`option requires argument: ${h}${v}`,"ARG_MISSING_REQUIRED_LONGARG")}n[C]=y(e[a+1],C,n[C]),++a}else n[C]=y(p,C,n[C])}}else n._.push(c)}return n}uE.flag=r=>(r[XM]=!0,r);uE.COUNT=uE.flag((r,e,t)=>(t||0)+1);uE.ArgError=Rn;Ale.exports=uE});var Ile=w((LBt,Ele)=>{var eO;Ele.exports=()=>(typeof eO>"u"&&(eO=J("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),eO)});var vle=w((oO,aO)=>{(function(r){oO&&typeof oO=="object"&&typeof aO<"u"?aO.exports=r():typeof define=="function"&&define.amd?define([],r):typeof window<"u"?window.isWindows=r():typeof global<"u"?global.isWindows=r():typeof self<"u"?self.isWindows=r():this.isWindows=r()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var kle=w((T0t,Dle)=>{"use strict";AO.ifExists=wze;var np=J("util"),Ts=J("path"),xle=vle(),Eze=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,Ize={createPwshFile:!0,createCmdFile:xle(),fs:J("fs")},yze=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function Ple(r){let e={...Ize,...r},t=e.fs;return e.fs_={chmod:t.chmod?np.promisify(t.chmod):async()=>{},mkdir:np.promisify(t.mkdir),readFile:np.promisify(t.readFile),stat:np.promisify(t.stat),unlink:np.promisify(t.unlink),writeFile:np.promisify(t.writeFile)},e}async function AO(r,e,t){let i=Ple(t);await i.fs_.stat(r),await bze(r,e,i)}function wze(r,e,t){return AO(r,e,t).catch(()=>{})}function Bze(r,e){return e.fs_.unlink(r).catch(()=>{})}async function bze(r,e,t){let i=await Pze(r,t);return await Qze(e,t),Sze(r,e,i,t)}function Qze(r,e){return e.fs_.mkdir(Ts.dirname(r),{recursive:!0})}function Sze(r,e,t,i){let n=Ple(i),s=[{generator:Rze,extension:""}];return n.createCmdFile&&s.push({generator:kze,extension:".cmd"}),n.createPwshFile&&s.push({generator:Fze,extension:".ps1"}),Promise.all(s.map(o=>Dze(r,e+o.extension,t,o.generator,n)))}function vze(r,e){return Bze(r,e)}function xze(r,e){return Nze(r,e)}async function Pze(r,e){let n=(await e.fs_.readFile(r,"utf8")).trim().split(/\r*\n/)[0].match(Eze);if(!n){let s=Ts.extname(r).toLowerCase();return{program:yze.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function Dze(r,e,t,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[t.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:t.program,args:o}),await vze(e,n),await n.fs_.writeFile(e,i(r,e,n),"utf8"),xze(e,n)}function kze(r,e,t){let n=Ts.relative(Ts.dirname(e),r).split("/").join("\\"),s=Ts.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=t.prog,l=t.args||"",c=lO(t.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=t.progArgs?`${t.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r `:"";return o?g+=`@IF EXIST ${o} (\r ${o} ${l} ${n} ${u}%*\r ) ELSE (\r @@ -409,7 +409,7 @@ ${e.map(t=>` `,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,A9=new Date,pRe=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,dRe=r=>r,NB=dRe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),CRe=pRe&&Object.keys(NB).find(r=>{let e=NB[r];return!(e.date&&(e.date[0]!==A9.getDate()||e.date[1]!==A9.getMonth()+1))})||"default";function c9(r,{configuration:e,json:t}){if(!e.get("enableMessageNames"))return"";let n=FA(r===null?0:r);return!t&&r===null?$e(e,n,"grey"):n}function qR(r,{configuration:e,json:t}){let i=c9(r,{configuration:e,json:t});if(!i||r===null||r===0)return i;let n=Ct[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return If(e,i,s)}var Ge=class extends vi{constructor({configuration:t,stdout:i,json:n=!1,includePrefix:s=!0,includeFooter:o=!0,includeLogs:a=!n,includeInfos:l=a,includeWarnings:c=a,forgettableBufferSize:u=hRe,forgettableNames:g=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errors=[];this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(Xd(this,{configuration:t}),this.configuration=t,this.forgettableBufferSize=u,this.forgettableNames=new Set([...g,...fRe]),this.includePrefix=s,this.includeFooter=o,this.includeInfos=l,this.includeWarnings=c,this.json=n,this.stdout=i,t.get("enableProgressBars")&&!n&&i.isTTY&&i.columns>22){let f=t.get("progressBarStyle")||CRe;if(!Object.prototype.hasOwnProperty.call(NB,f))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=NB[f];let h=12,p=Math.max(0,Math.min(i.columns-h,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*p/80)}}static async start(t,i){let n=new this(t),s=process.emitWarning;process.emitWarning=(o,a)=>{if(typeof o!="string"){let c=o;o=c.message,a=a!=null?a:c.name}let l=typeof a<"u"?`${a}: ${o}`:o;n.reportWarning(0,l)};try{await i(n)}catch(o){n.reportExceptionOnce(o)}finally{await n.finalize(),process.emitWarning=s}return n}hasErrors(){return this.errors.length>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(t){this.cacheHitCount+=1}reportCacheMiss(t,i){this.lastCacheMiss=t,this.cacheMissCount+=1,typeof i<"u"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(13,i)}startSectionSync({reportHeader:t,reportFooter:i,skipIfEmpty:n},s){let o={committed:!1,action:()=>{t==null||t()}};n?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(i==null||i(l-a))}}async startSectionPromise({reportHeader:t,reportFooter:i,skipIfEmpty:n},s){let o={committed:!1,action:()=>{t==null||t()}};n?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(i==null||i(l-a))}}startTimerImpl(t,i,n){return{cb:typeof i=="function"?i:n,reportHeader:()=>{this.reportInfo(null,`\u250C ${t}`),this.indent+=1,RB!==null&&!this.json&&this.includeInfos&&this.stdout.write(RB.start(t))},reportFooter:a=>{if(this.indent-=1,RB!==null&&!this.json&&this.includeInfos){this.stdout.write(RB.end(t));for(let[l,c]of this.errors)this.reportErrorImpl(l,c)}this.configuration.get("enableTimers")&&a>200?this.reportInfo(null,`\u2514 Completed in ${$e(this.configuration,a,Ue.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:(typeof i=="function"?{}:i).skipIfEmpty}}startTimerSync(t,i,n){let{cb:s,...o}=this.startTimerImpl(t,i,n);return this.startSectionSync(o,s)}async startTimerPromise(t,i,n){let{cb:s,...o}=this.startTimerImpl(t,i,n);return this.startSectionPromise(o,s)}async startCacheReport(t){let i=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await t()}catch(n){throw this.reportExceptionOnce(n),n}finally{i!==null&&this.reportCacheChanges(i)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(t,i){if(!this.includeInfos)return;this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:"",o=`${this.formatPrefix(s,"blueBright")}${i}`;if(this.json)this.reportJson({type:"info",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i});else if(this.forgettableNames.has(t))if(this.forgettableLines.push(o),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(o,{truncate:!0});else this.writeLineWithForgettableReset(o)}reportWarning(t,i){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:"";this.json?this.reportJson({type:"warning",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i}):this.writeLineWithForgettableReset(`${this.formatPrefix(s,"yellowBright")}${i}`)}reportError(t,i){this.errors.push([t,i]),this.reportErrorImpl(t,i)}reportErrorImpl(t,i){this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:"";this.json?this.reportJson({type:"error",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i}):this.writeLineWithForgettableReset(`${this.formatPrefix(s,"redBright")}${i}`,{truncate:!1})}reportProgress(t){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(t.hasProgress&&t.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let i=!1,n=Promise.resolve().then(async()=>{let o={progress:t.hasProgress?0:void 0,title:t.hasTitle?"":void 0};this.progress.set(t,{definition:o,lastScaledSize:t.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:a,title:l}of t)i||o.progress===a&&o.title===l||(o.progress=a,o.title=l,this.refreshProgress());s()}),s=()=>{i||(i=!0,this.progress.delete(t),this.refreshProgress({delta:1}))};return{...n,stop:s}}reportJson(t){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(t)}`)}async finalize(){if(!this.includeFooter)return;let t="";this.errors.length>0?t="Failed with errors":this.warningCount>0?t="Done with warnings":t="Done";let i=$e(this.configuration,Date.now()-this.startTime,Ue.DURATION),n=this.configuration.get("enableTimers")?`${t} in ${i}`:t;this.errors.length>0?this.reportError(0,n):this.warningCount>0?this.reportWarning(0,n):this.reportInfo(0,n)}writeLine(t,{truncate:i}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(t,{truncate:i})} `),this.writeProgress()}writeLineWithForgettableReset(t,{truncate:i}={}){this.forgettableLines=[],this.writeLine(t,{truncate:i})}writeLines(t,{truncate:i}={}){this.clearProgress({delta:t.length});for(let n of t)this.stdout.write(`${this.truncate(n,{truncate:i})} `);this.writeProgress()}reportCacheChanges({cacheHitCount:t,cacheMissCount:i}){let n=this.cacheHitCount-t,s=this.cacheMissCount-i;if(n===0&&s===0)return;let o="";this.cacheHitCount>1?o+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?o+=" - one package was already cached":o+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?o+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(o+=`, one had to be fetched (${mt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?o+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(o+=` - one package had to be fetched (${mt(this.configuration,this.lastCacheMiss)})`),this.reportInfo(13,o)}commit(){let t=this.uncommitted;this.uncommitted=new Set;for(let i of t)i.committed=!0,i.action()}clearProgress({delta:t=0,clear:i=!1}){this.progressStyle!==null&&this.progress.size+t>0&&(this.stdout.write(`\x1B[${this.progress.size+t}A`),(t>0||i)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let t=Date.now();t-this.progressTime>a9&&(this.progressFrame=(this.progressFrame+1)%o9.length,this.progressTime=t);let i=o9[this.progressFrame];for(let n of this.progress.values()){let s="";if(typeof n.lastScaledSize<"u"){let c=this.progressStyle.chars[0].repeat(n.lastScaledSize),u=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-n.lastScaledSize);s=` ${c}${u}`}let o=this.formatName(null),a=o?`${o}: `:"",l=n.definition.title?` ${n.definition.title}`:"";this.stdout.write(`${$e(this.configuration,"\u27A4","blueBright")} ${a}${i}${s}${l} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},a9)}refreshProgress({delta:t=0,force:i=!1}={}){let n=!1,s=!1;if(i||this.progress.size===0)n=!0;else for(let o of this.progress.values()){let a=typeof o.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*o.definition.progress):void 0,l=o.lastScaledSize;o.lastScaledSize=a;let c=o.lastTitle;if(o.lastTitle=o.definition.title,a!==l||(s=c!==o.definition.title)){n=!0;break}}n&&(this.clearProgress({delta:t,clear:s}),this.writeProgress())}truncate(t,{truncate:i}={}){return this.progressStyle===null&&(i=!1),typeof i>"u"&&(i=this.configuration.get("preferTruncatedLines")),i&&(t=(0,l9.default)(t,0,this.stdout.columns-1)),t}formatName(t){return c9(t,{configuration:this.configuration,json:this.json})}formatPrefix(t,i){return this.includePrefix?`${$e(this.configuration,"\u27A4",i)} ${t}${this.formatIndent()}`:""}formatNameWithHyperlink(t){return qR(t,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Tr="3.6.2";var f9=(n=>(n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm",n))(f9||{});async function el(r,e,t,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${t}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await O.writeFilePromise(x.format({dir:r,name:e,ext:".cmd"}),n)}await O.writeFilePromise(x.join(r,e),`#!/bin/sh +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},a9)}refreshProgress({delta:t=0,force:i=!1}={}){let n=!1,s=!1;if(i||this.progress.size===0)n=!0;else for(let o of this.progress.values()){let a=typeof o.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*o.definition.progress):void 0,l=o.lastScaledSize;o.lastScaledSize=a;let c=o.lastTitle;if(o.lastTitle=o.definition.title,a!==l||(s=c!==o.definition.title)){n=!0;break}}n&&(this.clearProgress({delta:t,clear:s}),this.writeProgress())}truncate(t,{truncate:i}={}){return this.progressStyle===null&&(i=!1),typeof i>"u"&&(i=this.configuration.get("preferTruncatedLines")),i&&(t=(0,l9.default)(t,0,this.stdout.columns-1)),t}formatName(t){return c9(t,{configuration:this.configuration,json:this.json})}formatPrefix(t,i){return this.includePrefix?`${$e(this.configuration,"\u27A4",i)} ${t}${this.formatIndent()}`:""}formatNameWithHyperlink(t){return qR(t,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Tr="3.6.3";var f9=(n=>(n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm",n))(f9||{});async function el(r,e,t,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${t}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await O.writeFilePromise(x.format({dir:r,name:e,ext:".cmd"}),n)}await O.writeFilePromise(x.join(r,e),`#!/bin/sh exec "${t}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" `,{mode:493})}async function h9(r){let e=await ot.tryFind(r);if(e!=null&&e.packageManager){let i=vw(e.packageManager);if(i!=null&&i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManagerField:!0,packageManager:Number(s)===1?"Yarn Classic":"Yarn",reason:n};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:n};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:n}}}}let t;try{t=await O.readFilePromise(x.join(r,xt.lockfile),"utf8")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:O.existsSync(x.join(r,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:O.existsSync(x.join(r,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function FC({project:r,locator:e,binFolder:t,ignoreCorepack:i,lifecycleScript:n}){var c,u;let s={};for(let[g,f]of Object.entries(process.env))typeof f<"u"&&(s[g.toLowerCase()!=="path"?g:"PATH"]=f);let o=K.fromPortablePath(t);s.BERRY_BIN_FOLDER=K.fromPortablePath(o);let a=process.env.COREPACK_ROOT&&!i?K.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([el(t,"node",process.execPath),...Tr!==null?[el(t,"run",process.execPath,[a,"run"]),el(t,"yarn",process.execPath,[a]),el(t,"yarnpkg",process.execPath,[a]),el(t,"node-gyp",process.execPath,[a,"run","--top-level","node-gyp"])]:[]]),r&&(s.INIT_CWD=K.fromPortablePath(r.configuration.startingCwd),s.PROJECT_CWD=K.fromPortablePath(r.cwd)),s.PATH=s.PATH?`${o}${K.delimiter}${s.PATH}`:`${o}`,s.npm_execpath=`${o}${K.sep}yarn`,s.npm_node_execpath=`${o}${K.sep}node`,e){if(!r)throw new Error("Assertion failed: Missing project");let g=r.tryWorkspaceByLocator(e),f=g?(c=g.manifest.version)!=null?c:"":(u=r.storedPackages.get(e.locatorHash).version)!=null?u:"";s.npm_package_name=Mt(e),s.npm_package_version=f;let h;if(g)h=g.cwd;else{let p=r.storedPackages.get(e.locatorHash);if(!p)throw new Error(`Package for ${mt(r.configuration,e)} not found in the project`);let C=r.configuration.getLinkers(),y={project:r,report:new Ge({stdout:new tl.PassThrough,configuration:r.configuration})},B=C.find(v=>v.supportsPackage(p,y));if(!B)throw new Error(`The package ${mt(r.configuration,p)} isn't supported by any of the available linkers`);h=await B.findPackageLocation(p,y)}s.npm_package_json=K.fromPortablePath(x.join(h,xt.manifest))}let l=Tr!==null?`yarn/${Tr}`:`yarn/${mf("@yarnpkg/core").version}-core`;return s.npm_config_user_agent=`${l} npm/? node/${process.version} ${process.platform} ${process.arch}`,n&&(s.npm_lifecycle_event=n),r&&await r.configuration.triggerHook(g=>g.setupScriptEnvironment,r,s,async(g,f,h)=>await el(t,Jr(g),f,h)),s}var mRe=2,ERe=(0,g9.default)(mRe);async function IRe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await ERe(async()=>{await O.mktempPromise(async o=>{let a=x.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:K.fromPortablePath(r),report:i}),g=s&&qo(s)?nC(s):s,f=g?Es(g):"an external project";c.write(`Packing ${f} from sources `);let h=await h9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} diff --git a/.yarnrc.yml b/.yarnrc.yml index a8ee4c0595..0e636f82c2 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -8,4 +8,4 @@ plugins: - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs spec: "@yarnpkg/plugin-typescript" -yarnPath: .yarn/releases/yarn-3.6.2.cjs +yarnPath: .yarn/releases/yarn-3.6.3.cjs diff --git a/examples/migration/package.json b/examples/migration/package.json index afc8b52eb6..75f2457df5 100644 --- a/examples/migration/package.json +++ b/examples/migration/package.json @@ -7,7 +7,7 @@ }, "dependencies": { "@apollo/server": "^4.7.0", - "@neo4j/graphql": "^4.0.0-beta.1", + "@neo4j/graphql": "^4.0.0-beta.2", "graphql": "16.8.0", "neo4j-driver": "5.11.0" } diff --git a/examples/neo-place/package.json b/examples/neo-place/package.json index f8dee600fc..a01f2ace7c 100644 --- a/examples/neo-place/package.json +++ b/examples/neo-place/package.json @@ -50,7 +50,7 @@ "ws": "^8.11.0" }, "devDependencies": { - "concurrently": "8.2.0", + "concurrently": "8.2.1", "parcel": "2.9.3" } } diff --git a/package.json b/package.json index 3638628073..46f0adf509 100644 --- a/package.json +++ b/package.json @@ -28,24 +28,24 @@ }, "devDependencies": { "@tsconfig/node16": "1.0.4", - "@typescript-eslint/eslint-plugin": "6.4.0", - "@typescript-eslint/parser": "6.4.0", - "concurrently": "8.2.0", + "@typescript-eslint/eslint-plugin": "6.5.0", + "@typescript-eslint/parser": "6.5.0", + "concurrently": "8.2.1", "dotenv": "16.3.1", - "eslint": "8.47.0", + "eslint": "8.48.0", "eslint-config-prettier": "9.0.0", "eslint-formatter-summary": "1.1.0", "eslint-import-resolver-typescript": "3.6.0", "eslint-plugin-eslint-comments": "3.2.0", - "eslint-plugin-import": "2.28.0", + "eslint-plugin-import": "2.28.1", "eslint-plugin-jest": "27.2.3", "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-react": "7.33.2", "eslint-plugin-simple-import-sort": "10.0.0", "graphql": "16.8.0", "husky": "8.0.3", - "jest": "29.6.2", - "lint-staged": "14.0.0", + "jest": "29.6.4", + "lint-staged": "14.0.1", "neo4j-driver": "5.11.0", "npm-run-all": "4.1.5", "prettier": "2.8.8", @@ -53,7 +53,7 @@ "ts-jest": "29.1.1", "typescript": "5.1.6" }, - "packageManager": "yarn@3.6.2", + "packageManager": "yarn@3.6.3", "dependencies": { "@changesets/changelog-github": "0.4.8", "@changesets/cli": "2.26.2" diff --git a/packages/apollo-federation-subgraph-compatibility/package.json b/packages/apollo-federation-subgraph-compatibility/package.json index c91b5910d6..263f0a461c 100644 --- a/packages/apollo-federation-subgraph-compatibility/package.json +++ b/packages/apollo-federation-subgraph-compatibility/package.json @@ -1,7 +1,7 @@ { "name": "apollo-federation-subgraph-compatibility", "version": "1.0.0", - "packageManager": "yarn@3.6.2", + "packageManager": "yarn@3.6.3", "scripts": { "build": "webpack --config webpack.config.js", "test:docker": "yarn build && fedtest docker --compose docker-compose.yml --schema schema.graphql", @@ -10,7 +10,7 @@ "dependencies": { "@apollo/server": "^4.7.0", "@graphql-tools/wrap": "^10.0.0", - "@neo4j/graphql": "^4.0.0-beta.1", + "@neo4j/graphql": "^4.0.0-beta.2", "graphql": "16.8.0", "graphql-tag": "^2.12.6", "neo4j-driver": "^5.8.0" diff --git a/packages/graphql-amqp-subscriptions-engine/package.json b/packages/graphql-amqp-subscriptions-engine/package.json index 567d28da61..3051a74d1c 100644 --- a/packages/graphql-amqp-subscriptions-engine/package.json +++ b/packages/graphql-amqp-subscriptions-engine/package.json @@ -33,17 +33,17 @@ }, "author": "Neo4j Inc.", "devDependencies": { - "@apollo/server": "4.9.1", + "@apollo/server": "4.9.3", "@neo4j/graphql": "^4.0.0-beta.0", "@types/amqplib": "0.10.1", "@types/body-parser": "1.19.2", "@types/cors": "2.8.13", "@types/debug": "4.1.8", - "@types/jest": "29.5.3", + "@types/jest": "29.5.4", "@types/node": "18.15.1", "camelcase": "6.3.0", "graphql-ws": "5.14.0", - "jest": "29.6.2", + "jest": "29.6.4", "neo4j-driver": "5.11.0", "pluralize": "8.0.0", "randomstring": "1.3.0", diff --git a/packages/graphql-toolbox/CHANGELOG.md b/packages/graphql-toolbox/CHANGELOG.md index d8dc0f43a1..166895be8c 100644 --- a/packages/graphql-toolbox/CHANGELOG.md +++ b/packages/graphql-toolbox/CHANGELOG.md @@ -1,5 +1,24 @@ # @neo4j/graphql-toolbox +## 2.0.5-beta.2 + +### Patch Changes + +* [#3792](https://github.com/neo4j/graphql/pull/3792) [`56857a3e5`](https://github.com/neo4j/graphql/commit/56857a3e53134ad9f46f3265567c55570f674aab) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: ensure no additional commas are added to the editor value + +* Updated dependencies [[`2ba1d45b5`](https://github.com/neo4j/graphql/commit/2ba1d45b5bf642975381ca8431cb10094151586d), [`a16ba357c`](https://github.com/neo4j/graphql/commit/a16ba357cb745ba728009c5e6b531b4c56a62f43), [`85b3c06e8`](https://github.com/neo4j/graphql/commit/85b3c06e800699f30daedc796286c37cd318746c), [`56857a3e5`](https://github.com/neo4j/graphql/commit/56857a3e53134ad9f46f3265567c55570f674aab), [`e9bf1e619`](https://github.com/neo4j/graphql/commit/e9bf1e619ee71ead228530a9d46834a655686c6d), [`9354860ae`](https://github.com/neo4j/graphql/commit/9354860ae2f5f4a82179de874344724862d0c231)]: + * @neo4j/graphql@4.0.0-beta.2 + * @neo4j/introspector@2.0.0-beta.1 + +## 2.0.7 + +### Patch Changes + +* [#3791](https://github.com/neo4j/graphql/pull/3791) [`688d2a311`](https://github.com/neo4j/graphql/commit/688d2a311a2e61a8df7f8f038ff8b4f598b175bf) Thanks [@mjfwebb](https://github.com/mjfwebb)! - update dependency @neo4j-ndl/react to v1.10.3 + +* Updated dependencies [[`9354860ae`](https://github.com/neo4j/graphql/commit/9354860ae2f5f4a82179de874344724862d0c231)]: + * @neo4j/graphql@3.24.2 + ## 2.0.6 ### Patch Changes diff --git a/packages/graphql-toolbox/package.json b/packages/graphql-toolbox/package.json index 40cc271f66..44fdcc472a 100644 --- a/packages/graphql-toolbox/package.json +++ b/packages/graphql-toolbox/package.json @@ -1,7 +1,7 @@ { "name": "@neo4j/graphql-toolbox", "private": true, - "version": "2.0.5-beta.1", + "version": "2.0.5-beta.2", "description": "Developer UI For Neo4j GraphQL", "exports": "./dist/main.js", "main": "./dist/main.js", @@ -43,17 +43,17 @@ "author": "Neo4j", "dependencies": { "@codemirror/autocomplete": "6.9.0", - "@codemirror/commands": "6.2.4", - "@codemirror/lang-javascript": "6.1.9", + "@codemirror/commands": "6.2.5", + "@codemirror/lang-javascript": "6.2.1", "@codemirror/language": "6.9.0", "@dnd-kit/core": "6.0.8", "@dnd-kit/modifiers": "6.0.1", "@dnd-kit/sortable": "7.0.2", "@graphiql/react": "0.19.3", - "@neo4j-ndl/base": "1.10.1", - "@neo4j-ndl/react": "1.10.3", - "@neo4j/graphql": "4.0.0-beta.1", - "@neo4j/introspector": "2.0.0-beta.0", + "@neo4j-ndl/base": "1.10.2", + "@neo4j-ndl/react": "1.10.5", + "@neo4j/graphql": "4.0.0-beta.2", + "@neo4j/introspector": "2.0.0-beta.1", "classnames": "2.3.2", "cm6-graphql": "0.0.9", "codemirror": "6.0.1", @@ -73,12 +73,12 @@ "devDependencies": { "@playwright/test": "1.37.1", "@tsconfig/create-react-app": "2.0.1", - "@types/codemirror": "5.60.8", + "@types/codemirror": "5.60.9", "@types/lodash.debounce": "4.0.7", - "@types/markdown-it": "13.0.0", + "@types/markdown-it": "13.0.1", "@types/prettier": "2.7.3", "@types/react-dom": "18.2.7", - "@types/webpack": "5.28.1", + "@types/webpack": "5.28.2", "autoprefixer": "10.4.15", "compression-webpack-plugin": "10.0.0", "copy-webpack-plugin": "11.0.0", @@ -89,11 +89,11 @@ "html-inline-script-webpack-plugin": "3.2.1", "html-webpack-inline-source-plugin": "0.0.10", "html-webpack-plugin": "5.5.3", - "jest": "29.6.2", - "jest-environment-jsdom": "29.6.2", + "jest": "29.6.4", + "jest-environment-jsdom": "29.6.4", "node-polyfill-webpack-plugin": "2.0.1", "parse5": "7.1.2", - "postcss": "8.4.28", + "postcss": "8.4.29", "postcss-loader": "7.3.3", "randomstring": "1.3.0", "style-loader": "3.3.3", diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index c15d64b639..9fd21c5b73 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,34 +1,50 @@ # @neo4j/graphql +## 4.0.0-beta.2 + +### Major Changes + +* [#3592](https://github.com/neo4j/graphql/pull/3592) [`2ba1d45b5`](https://github.com/neo4j/graphql/commit/2ba1d45b5bf642975381ca8431cb10094151586d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The Neo4j GraphQL Library now only accepts a `string`, `DocumentNode` or an array containing these types. A callback function returning these is also accepted. This is a reduction from `TypeSource` which also included types such as `GraphQLSchema` and `DefinitionNode`, which would have resulted in unexpected behaviour if passed in. + +* [#3809](https://github.com/neo4j/graphql/pull/3809) [`a16ba357c`](https://github.com/neo4j/graphql/commit/a16ba357cb745ba728009c5e6b531b4c56a62f43) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The `limit` argument of the `@queryOptions` directive has been moved to its own directive, `@limit`. + +* [#3792](https://github.com/neo4j/graphql/pull/3792) [`56857a3e5`](https://github.com/neo4j/graphql/commit/56857a3e53134ad9f46f3265567c55570f674aab) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Use driver default access mode "READ" for `@cypher` directives in the `Query` type, and "WRITE" in the `Mutation` type. + +### Patch Changes + +* [#3758](https://github.com/neo4j/graphql/pull/3758) [`e9bf1e619`](https://github.com/neo4j/graphql/commit/e9bf1e619ee71ead228530a9d46834a655686c6d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `cypherParams` added to the `Neo4jGraphQLContext` type, and the fields within it can be referred to directly. + +* [#3795](https://github.com/neo4j/graphql/pull/3795) [`9354860ae`](https://github.com/neo4j/graphql/commit/9354860ae2f5f4a82179de874344724862d0c231) Thanks [@darrellwarde](https://github.com/darrellwarde)! - If possible, instantiate JWKS endpoint connection on startup, to benefit from caching. + ## 4.0.0-beta.1 ### Patch Changes -- [#3729](https://github.com/neo4j/graphql/pull/3729) [`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Improve the checking for non-existent parameters when evaluating authorization rules +* [#3729](https://github.com/neo4j/graphql/pull/3729) [`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Improve the checking for non-existent parameters when evaluating authorization rules ## 4.0.0-beta.0 ### Major Changes -- [#3062](https://github.com/neo4j/graphql/pull/3062) [`ea1bae3c3`](https://github.com/neo4j/graphql/commit/ea1bae3c3b8ec53febfa056c5fec25aa9b0c5c2a) Thanks [@mjfwebb](https://github.com/mjfwebb)! - The deprecated `@callback` directive has been removed. Any remaining usages of `@callback` should be replaced with `@populatedBy`. See https://github.com/neo4j/graphql/blob/dev/docs/modules/ROOT/pages/guides/v4-migration/index.adoc#callback-renamed-to-populatedby for more information. +* [#3062](https://github.com/neo4j/graphql/pull/3062) [`ea1bae3c3`](https://github.com/neo4j/graphql/commit/ea1bae3c3b8ec53febfa056c5fec25aa9b0c5c2a) Thanks [@mjfwebb](https://github.com/mjfwebb)! - The deprecated `@callback` directive has been removed. Any remaining usages of `@callback` should be replaced with `@populatedBy`. See for more information. -- [#3013](https://github.com/neo4j/graphql/pull/3013) [`0fb2592b4`](https://github.com/neo4j/graphql/commit/0fb2592b4271adc02f4bbbf6e467eec5f7742be1) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove aggregation fields for relationships to a single node (non-List relationships) - these serve no functional utility +* [#3013](https://github.com/neo4j/graphql/pull/3013) [`0fb2592b4`](https://github.com/neo4j/graphql/commit/0fb2592b4271adc02f4bbbf6e467eec5f7742be1) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove aggregation fields for relationships to a single node (non-List relationships) - these serve no functional utility -- [#2863](https://github.com/neo4j/graphql/pull/2863) [`c9ee9e757`](https://github.com/neo4j/graphql/commit/c9ee9e757427f512950ec58aad7e30923b297a05) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Support for Neo4j database 4.3 has been dropped. Please use the current Neo4j 5 release, or the LTS 4.4 release. +* [#2863](https://github.com/neo4j/graphql/pull/2863) [`c9ee9e757`](https://github.com/neo4j/graphql/commit/c9ee9e757427f512950ec58aad7e30923b297a05) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Support for Neo4j database 4.3 has been dropped. Please use the current Neo4j 5 release, or the LTS 4.4 release. -- [#2996](https://github.com/neo4j/graphql/pull/2996) [`4a78e7a8d`](https://github.com/neo4j/graphql/commit/4a78e7a8d70d3ff1ebaff8ba63ce1f9e5849d8e6) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Aliased properties are now automatically escaped using backticks. If you were using backticks in the `property` argument of your `@alias` directives, these should now be removed. +* [#2996](https://github.com/neo4j/graphql/pull/2996) [`4a78e7a8d`](https://github.com/neo4j/graphql/commit/4a78e7a8d70d3ff1ebaff8ba63ce1f9e5849d8e6) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Aliased properties are now automatically escaped using backticks. If you were using backticks in the `property` argument of your `@alias` directives, these should now be removed. -- [#2834](https://github.com/neo4j/graphql/pull/2834) [`8d3aff007`](https://github.com/neo4j/graphql/commit/8d3aff007c0d5428313cef23602e9a4ef5ef3792) Thanks [@a-alle](https://github.com/a-alle)! - Deprecated @node directive arguments `label` and `additionalLabels` have been removed. Please use the `labels` argument. +* [#2834](https://github.com/neo4j/graphql/pull/2834) [`8d3aff007`](https://github.com/neo4j/graphql/commit/8d3aff007c0d5428313cef23602e9a4ef5ef3792) Thanks [@a-alle](https://github.com/a-alle)! - Deprecated @node directive arguments `label` and `additionalLabels` have been removed. Please use the `labels` argument. -- [#3671](https://github.com/neo4j/graphql/pull/3671) [`b3951fa81`](https://github.com/neo4j/graphql/commit/b3951fa81232a968fe492a4b10ea54afc604e2d2) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove `nodes` and `relationships` from the public API of the `Neo4jGraphQL` class. +* [#3671](https://github.com/neo4j/graphql/pull/3671) [`b3951fa81`](https://github.com/neo4j/graphql/commit/b3951fa81232a968fe492a4b10ea54afc604e2d2) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove `nodes` and `relationships` from the public API of the `Neo4jGraphQL` class. -- [#3628](https://github.com/neo4j/graphql/pull/3628) [`2167c9ac1`](https://github.com/neo4j/graphql/commit/2167c9ac10b178ad881b12310fc798fc1f77b262) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Specifying Cypher query options to be used is now `cypherQueryOptions` instead of just `queryOptions`, and each option accepts a simple string rather than an enum. +* [#3628](https://github.com/neo4j/graphql/pull/3628) [`2167c9ac1`](https://github.com/neo4j/graphql/commit/2167c9ac10b178ad881b12310fc798fc1f77b262) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Specifying Cypher query options to be used is now `cypherQueryOptions` instead of just `queryOptions`, and each option accepts a simple string rather than an enum. -- [#3242](https://github.com/neo4j/graphql/pull/3242) [`29d68ad51`](https://github.com/neo4j/graphql/commit/29d68ad515bcd2ee573d40387978250f92f83fe9) Thanks [@angrykoala](https://github.com/angrykoala)! - Escape properties and relationships if needed, using | and & as part of the label is no longer supported +* [#3242](https://github.com/neo4j/graphql/pull/3242) [`29d68ad51`](https://github.com/neo4j/graphql/commit/29d68ad515bcd2ee573d40387978250f92f83fe9) Thanks [@angrykoala](https://github.com/angrykoala)! - Escape properties and relationships if needed, using | and & as part of the label is no longer supported -- [#3105](https://github.com/neo4j/graphql/pull/3105) [`395e12f14`](https://github.com/neo4j/graphql/commit/395e12f14e0e7fffe50e3841ca5e69da459855d2) Thanks [@mjfwebb](https://github.com/mjfwebb)! - skipValidateTypeDefs has been removed. Please use startupValidation instead. See https://neo4j.com/docs/graphql-manual/current/guides/v4-migration/#startup-validation +* [#3105](https://github.com/neo4j/graphql/pull/3105) [`395e12f14`](https://github.com/neo4j/graphql/commit/395e12f14e0e7fffe50e3841ca5e69da459855d2) Thanks [@mjfwebb](https://github.com/mjfwebb)! - skipValidateTypeDefs has been removed. Please use startupValidation instead. See -- [#3043](https://github.com/neo4j/graphql/pull/3043) [`15a7f0418`](https://github.com/neo4j/graphql/commit/15a7f04188bcc676477ec562e24b27851a927905) Thanks [@mjfwebb](https://github.com/mjfwebb)! - It was possible to define schemas with types that have multiple relationship fields connected by the same type of relationships. Instances of this scenario are now detected during schema generation and an error is thrown so developers are informed to remedy the type definitions. +* [#3043](https://github.com/neo4j/graphql/pull/3043) [`15a7f0418`](https://github.com/neo4j/graphql/commit/15a7f04188bcc676477ec562e24b27851a927905) Thanks [@mjfwebb](https://github.com/mjfwebb)! - It was possible to define schemas with types that have multiple relationship fields connected by the same type of relationships. Instances of this scenario are now detected during schema generation and an error is thrown so developers are informed to remedy the type definitions. An example of what is now considered invalid with these checks: @@ -46,15 +62,15 @@ For more information about this change and how to disable this validation please see the [4.0.0 migration guide](https://neo4j.com/docs/graphql-manual/current/guides/v4-migration/) -- [#2818](https://github.com/neo4j/graphql/pull/2818) [`93b9d806b`](https://github.com/neo4j/graphql/commit/93b9d806b12c79dae7491b901378acf9d43f1c06) Thanks [@a-alle](https://github.com/a-alle)! - Removed deprecated argument `plural` from `@node` directive. Please use the `@plural` directive instead. +* [#2818](https://github.com/neo4j/graphql/pull/2818) [`93b9d806b`](https://github.com/neo4j/graphql/commit/93b9d806b12c79dae7491b901378acf9d43f1c06) Thanks [@a-alle](https://github.com/a-alle)! - Removed deprecated argument `plural` from `@node` directive. Please use the `@plural` directive instead. -- [#3670](https://github.com/neo4j/graphql/pull/3670) [`d4aea32c6`](https://github.com/neo4j/graphql/commit/d4aea32c66aa1dcbf7b3399165adf74fed36e92e) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Removal of the following exports: `Neo4jGraphQLAuthenticationError`, `Neo4jGraphQLForbiddenError`, `EventMeta`, `Neo4jGraphQLAuthPlugin` and `RelationField`. This are either redundant, or internals which shouldn't have been exported. +* [#3670](https://github.com/neo4j/graphql/pull/3670) [`d4aea32c6`](https://github.com/neo4j/graphql/commit/d4aea32c66aa1dcbf7b3399165adf74fed36e92e) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Removal of the following exports: `Neo4jGraphQLAuthenticationError`, `Neo4jGraphQLForbiddenError`, `EventMeta`, `Neo4jGraphQLAuthPlugin` and `RelationField`. This are either redundant, or internals which shouldn't have been exported. -- [#3679](https://github.com/neo4j/graphql/pull/3679) [`5ea18136e`](https://github.com/neo4j/graphql/commit/5ea18136e36303efc0806cc7027b7dfce13e1fa4) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove unused `DeleteInfo`, `GraphQLSortArg`, `GraphQLOptionsArg` and `GraphQLWhereArg` type exports. +* [#3679](https://github.com/neo4j/graphql/pull/3679) [`5ea18136e`](https://github.com/neo4j/graphql/commit/5ea18136e36303efc0806cc7027b7dfce13e1fa4) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove unused `DeleteInfo`, `GraphQLSortArg`, `GraphQLOptionsArg` and `GraphQLWhereArg` type exports. -- [#3673](https://github.com/neo4j/graphql/pull/3673) [`aa11d5251`](https://github.com/neo4j/graphql/commit/aa11d525111cfda005581ed2327407b9c9c319f9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Programmatic toggling of debug logging is now done using the `debug` option of the constructor. +* [#3673](https://github.com/neo4j/graphql/pull/3673) [`aa11d5251`](https://github.com/neo4j/graphql/commit/aa11d525111cfda005581ed2327407b9c9c319f9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Programmatic toggling of debug logging is now done using the `debug` option of the constructor. -- [#3234](https://github.com/neo4j/graphql/pull/3234) [`f1225baa7`](https://github.com/neo4j/graphql/commit/f1225baa75c71ad82e36e9fb250477382eb6757c) Thanks [@angrykoala](https://github.com/angrykoala)! - Change subscriptions setup, this requires changes to constructor options passed to Neo4jGraphQL. See +* [#3234](https://github.com/neo4j/graphql/pull/3234) [`f1225baa7`](https://github.com/neo4j/graphql/commit/f1225baa75c71ad82e36e9fb250477382eb6757c) Thanks [@angrykoala](https://github.com/angrykoala)! - Change subscriptions setup, this requires changes to constructor options passed to Neo4jGraphQL. See For single instance subscriptions use `true`: @@ -78,11 +94,11 @@ }); ``` -- [#3645](https://github.com/neo4j/graphql/pull/3645) [`7df67be49`](https://github.com/neo4j/graphql/commit/7df67be4991b8829acbd00651c66b41558729008) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The minimum version of `neo4j-driver` is now `5.8.0`, please upgrade. The `boomkark` field in the selection set has been marked as deprecated and will be removed in version `5.0.0` of the library. +* [#3645](https://github.com/neo4j/graphql/pull/3645) [`7df67be49`](https://github.com/neo4j/graphql/commit/7df67be4991b8829acbd00651c66b41558729008) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The minimum version of `neo4j-driver` is now `5.8.0`, please upgrade. The `boomkark` field in the selection set has been marked as deprecated and will be removed in version `5.0.0` of the library. -- [#2922](https://github.com/neo4j/graphql/pull/2922) [`7743399d3`](https://github.com/neo4j/graphql/commit/7743399d320b26126bb6e83bcd498c1c78517a83) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - The `requires` argument of the `@customResolver` directive now accepts a graphql selection set. This means it is now possible to require non-scalar fields such as related types. +* [#2922](https://github.com/neo4j/graphql/pull/2922) [`7743399d3`](https://github.com/neo4j/graphql/commit/7743399d320b26126bb6e83bcd498c1c78517a83) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - The `requires` argument of the `@customResolver` directive now accepts a graphql selection set. This means it is now possible to require non-scalar fields such as related types. -- [#2769](https://github.com/neo4j/graphql/pull/2769) [`e5b53a597`](https://github.com/neo4j/graphql/commit/e5b53a5976a2880e0efdecddcddcfb427015c823) Thanks [@angrykoala](https://github.com/angrykoala)! - `@cypher` directive now requires the parameter `columnName`. +* [#2769](https://github.com/neo4j/graphql/pull/2769) [`e5b53a597`](https://github.com/neo4j/graphql/commit/e5b53a5976a2880e0efdecddcddcfb427015c823) Thanks [@angrykoala](https://github.com/angrykoala)! - `@cypher` directive now requires the parameter `columnName`. This requires all cypher queries to be made with a valid alias that must be referred in this new parameter. @@ -100,59 +116,65 @@ @cypher(statement: "MATCH (i:Item) WHERE i.public=true RETURN i.name as result", columnName: "result") ``` -- [#3630](https://github.com/neo4j/graphql/pull/3630) [`3896544b5`](https://github.com/neo4j/graphql/commit/3896544b50939df38a792bcd9b41bc77f25bc5a9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `neo4jDatabaseInfo` has been removed from the context. It is our belief that this has little utility in the library. If you regularly use different drivers connected to _different versions_ of Neo4j and require this feature, please raise an issue: https://github.com/neo4j/graphql/issues/new/choose +* [#3630](https://github.com/neo4j/graphql/pull/3630) [`3896544b5`](https://github.com/neo4j/graphql/commit/3896544b50939df38a792bcd9b41bc77f25bc5a9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `neo4jDatabaseInfo` has been removed from the context. It is our belief that this has little utility in the library. If you regularly use different drivers connected to _different versions_ of Neo4j and require this feature, please raise an issue: -- [#2944](https://github.com/neo4j/graphql/pull/2944) [`8f0656b35`](https://github.com/neo4j/graphql/commit/8f0656b35b86a1d4966dea8cdb2a8ee5a3505dd6) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Made `@relationshipProperties` mandatory for relationship property interfaces +* [#2944](https://github.com/neo4j/graphql/pull/2944) [`8f0656b35`](https://github.com/neo4j/graphql/commit/8f0656b35b86a1d4966dea8cdb2a8ee5a3505dd6) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Made `@relationshipProperties` mandatory for relationship property interfaces -- [#3099](https://github.com/neo4j/graphql/pull/3099) [`c9f35f10c`](https://github.com/neo4j/graphql/commit/c9f35f10c0fde1af7b82a3adbd7137955705495a) Thanks [@mjfwebb](https://github.com/mjfwebb)! - config.callbacks has been deprecated and replaced with features.populatedBy.callbacks. See https://neo4j.com/docs/graphql-manual/current/guides/v4-migration/#_callback_renamed_to_populatedby for more information. +* [#3099](https://github.com/neo4j/graphql/pull/3099) [`c9f35f10c`](https://github.com/neo4j/graphql/commit/c9f35f10c0fde1af7b82a3adbd7137955705495a) Thanks [@mjfwebb](https://github.com/mjfwebb)! - config.callbacks has been deprecated and replaced with features.populatedBy.callbacks. See for more information. -- [#3687](https://github.com/neo4j/graphql/pull/3687) [`1ad4328e4`](https://github.com/neo4j/graphql/commit/1ad4328e4bba39801aa96bf961e6e5c5a2a9ce8d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Validation of type definitions is now configured using the `validate` boolean option in the constructor, which defaults to `true`. +* [#3687](https://github.com/neo4j/graphql/pull/3687) [`1ad4328e4`](https://github.com/neo4j/graphql/commit/1ad4328e4bba39801aa96bf961e6e5c5a2a9ce8d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Validation of type definitions is now configured using the `validate` boolean option in the constructor, which defaults to `true`. -- [#2819](https://github.com/neo4j/graphql/pull/2819) [`2ab3d5212`](https://github.com/neo4j/graphql/commit/2ab3d521277d66afd7acaea00aa56d44f10480bd) Thanks [@a-alle](https://github.com/a-alle)! - Removed `@computed` directive. Please use `@customResolver` instead. +* [#2819](https://github.com/neo4j/graphql/pull/2819) [`2ab3d5212`](https://github.com/neo4j/graphql/commit/2ab3d521277d66afd7acaea00aa56d44f10480bd) Thanks [@a-alle](https://github.com/a-alle)! - Removed `@computed` directive. Please use `@customResolver` instead. -- [#2598](https://github.com/neo4j/graphql/pull/2598) [`257aa4c97`](https://github.com/neo4j/graphql/commit/257aa4c97a0d367063725dff703fdd30f0f8ecb5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove all arguments from IExecutableSchemaDefinition apart from `typeDefs` and `resolvers`. This is to simplify the API and to remove any unexpected behaviours from arguments which we blindly pass through. +* [#2598](https://github.com/neo4j/graphql/pull/2598) [`257aa4c97`](https://github.com/neo4j/graphql/commit/257aa4c97a0d367063725dff703fdd30f0f8ecb5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove all arguments from IExecutableSchemaDefinition apart from `typeDefs` and `resolvers`. This is to simplify the API and to remove any unexpected behaviours from arguments which we blindly pass through. -- [#3653](https://github.com/neo4j/graphql/pull/3653) [`5b5f08ce7`](https://github.com/neo4j/graphql/commit/5b5f08ce764f431fa685c8320351236a9aaf57a0) Thanks [@angrykoala](https://github.com/angrykoala)! - All labels and field names are escaped in the generated Cypher +* [#3653](https://github.com/neo4j/graphql/pull/3653) [`5b5f08ce7`](https://github.com/neo4j/graphql/commit/5b5f08ce764f431fa685c8320351236a9aaf57a0) Thanks [@angrykoala](https://github.com/angrykoala)! - All labels and field names are escaped in the generated Cypher -- [#3097](https://github.com/neo4j/graphql/pull/3097) [`9f5a44545`](https://github.com/neo4j/graphql/commit/9f5a445455280abfcf862c2cf23ce44e7a11bc0d) Thanks [@mjfwebb](https://github.com/mjfwebb)! - `enableRegex` has been removed and replaced with `MATCHES` filters in the features configuration object. See the migration guide for more information: https://neo4j.com/docs/graphql-manual/current/guides/v4-migration +* [#3097](https://github.com/neo4j/graphql/pull/3097) [`9f5a44545`](https://github.com/neo4j/graphql/commit/9f5a445455280abfcf862c2cf23ce44e7a11bc0d) Thanks [@mjfwebb](https://github.com/mjfwebb)! - `enableRegex` has been removed and replaced with `MATCHES` filters in the features configuration object. See the migration guide for more information: -- [#2955](https://github.com/neo4j/graphql/pull/2955) [`9f3a9374e`](https://github.com/neo4j/graphql/commit/9f3a9374e5272577f2453cd3704c6924526f8b45) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Relationship type strings are now automatically escaped using backticks. If you were using backticks in the `type` argument of your `@relationship` directives, these should now be removed to avoid backticks being added into your relationship type labels. +* [#2955](https://github.com/neo4j/graphql/pull/2955) [`9f3a9374e`](https://github.com/neo4j/graphql/commit/9f3a9374e5272577f2453cd3704c6924526f8b45) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Relationship type strings are now automatically escaped using backticks. If you were using backticks in the `type` argument of your `@relationship` directives, these should now be removed to avoid backticks being added into your relationship type labels. -- [#3674](https://github.com/neo4j/graphql/pull/3674) [`59e369992`](https://github.com/neo4j/graphql/commit/59e369992b2226a3c5feec72f2799e2b30765819) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `cypherQueryOptions` moved into context-only, as a per-request option. +* [#3674](https://github.com/neo4j/graphql/pull/3674) [`59e369992`](https://github.com/neo4j/graphql/commit/59e369992b2226a3c5feec72f2799e2b30765819) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `cypherQueryOptions` moved into context-only, as a per-request option. ### Minor Changes -- [#3661](https://github.com/neo4j/graphql/pull/3661) [`ce84c47cc`](https://github.com/neo4j/graphql/commit/ce84c47cc610366def7d3abd9227ecb5244ef9d1) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The evaluation of authorization rules is now supported when using the Neo4j GraphQL Library as a Federation Subgraph. +* [#3661](https://github.com/neo4j/graphql/pull/3661) [`ce84c47cc`](https://github.com/neo4j/graphql/commit/ce84c47cc610366def7d3abd9227ecb5244ef9d1) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The evaluation of authorization rules is now supported when using the Neo4j GraphQL Library as a Federation Subgraph. + +## 3.24.2 + +### Patch Changes + +* [#3795](https://github.com/neo4j/graphql/pull/3795) [`9354860ae`](https://github.com/neo4j/graphql/commit/9354860ae2f5f4a82179de874344724862d0c231) Thanks [@darrellwarde](https://github.com/darrellwarde)! - If possible, instantiate JWKS endpoint connection on startup, to benefit from caching. ## 3.24.1 ### Patch Changes -- [#3729](https://github.com/neo4j/graphql/pull/3729) [`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Improve the checking for non-existent parameters when evaluating authorization rules +* [#3729](https://github.com/neo4j/graphql/pull/3729) [`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Improve the checking for non-existent parameters when evaluating authorization rules ## 3.24.0 ### Minor Changes -- [#3639](https://github.com/neo4j/graphql/pull/3639) [`09cc28ef2`](https://github.com/neo4j/graphql/commit/09cc28ef26f13c46c220bd160d68c5f6c4668f39) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Encourages switching from `driverConfig` to `sessionConfig` in both constructor and context. Can be used to switch database, and to use impersonation and user switching. +* [#3639](https://github.com/neo4j/graphql/pull/3639) [`09cc28ef2`](https://github.com/neo4j/graphql/commit/09cc28ef26f13c46c220bd160d68c5f6c4668f39) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Encourages switching from `driverConfig` to `sessionConfig` in both constructor and context. Can be used to switch database, and to use impersonation and user switching. ### Patch Changes -- [#3678](https://github.com/neo4j/graphql/pull/3678) [`c55a2b6fd`](https://github.com/neo4j/graphql/commit/c55a2b6fd36f9eb2ba5f51be3f21e97b68789fcc) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix generation of schema for fields to an interface relationship when using subscriptions. +* [#3678](https://github.com/neo4j/graphql/pull/3678) [`c55a2b6fd`](https://github.com/neo4j/graphql/commit/c55a2b6fd36f9eb2ba5f51be3f21e97b68789fcc) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix generation of schema for fields to an interface relationship when using subscriptions. -- [#3627](https://github.com/neo4j/graphql/pull/3627) [`cd884be5c`](https://github.com/neo4j/graphql/commit/cd884be5c07870ea778f5d81db5c55d45eca6dc3) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixing argument parsing Flat/Int wrongly coerced as String. +* [#3627](https://github.com/neo4j/graphql/pull/3627) [`cd884be5c`](https://github.com/neo4j/graphql/commit/cd884be5c07870ea778f5d81db5c55d45eca6dc3) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixing argument parsing Flat/Int wrongly coerced as String. ## 3.23.1 ### Patch Changes -- [#3603](https://github.com/neo4j/graphql/pull/3603) [`0a5e91bb2`](https://github.com/neo4j/graphql/commit/0a5e91bb2d7db61802ffe31517f60949884f4be5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Ensure that label checks are done against parameters. +* [#3603](https://github.com/neo4j/graphql/pull/3603) [`0a5e91bb2`](https://github.com/neo4j/graphql/commit/0a5e91bb2d7db61802ffe31517f60949884f4be5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Ensure that label checks are done against parameters. ## 3.23.0 ### Minor Changes -- [#3581](https://github.com/neo4j/graphql/pull/3581) [`775fdea1d`](https://github.com/neo4j/graphql/commit/775fdea1d7af274094a7dd56018e75fb2b2596e2) Thanks [@ID!](https://github.com/ID!)! - This release includes the addition of three new directives for authentication and authorization: +* [#3581](https://github.com/neo4j/graphql/pull/3581) [`775fdea1d`](https://github.com/neo4j/graphql/commit/775fdea1d7af274094a7dd56018e75fb2b2596e2) Thanks [@ID!](https://github.com/ID!)! - This release includes the addition of three new directives for authentication and authorization: The `@authentication` directive is used to configure authentication checks at either the schema, object or field level: @@ -184,7 +206,7 @@ ### Minor Changes -- [#3509](https://github.com/neo4j/graphql/pull/3509) [`cc201e6fc`](https://github.com/neo4j/graphql/commit/cc201e6fc6f0146f0cf80aad2bcaf086a215554c) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced schema configuration directive: `@filterable`. +* [#3509](https://github.com/neo4j/graphql/pull/3509) [`cc201e6fc`](https://github.com/neo4j/graphql/commit/cc201e6fc6f0146f0cf80aad2bcaf086a215554c) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced schema configuration directive: `@filterable`. Usage: @@ -196,19 +218,19 @@ ### Patch Changes -- [#3542](https://github.com/neo4j/graphql/pull/3542) [`f779a0061`](https://github.com/neo4j/graphql/commit/f779a00612adc4e0c42a3696435cbf6072dcfe31) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3541 which caused an error when using `@key` and other directives on the same type +* [#3542](https://github.com/neo4j/graphql/pull/3542) [`f779a0061`](https://github.com/neo4j/graphql/commit/f779a00612adc4e0c42a3696435cbf6072dcfe31) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3541 which caused an error when using `@key` and other directives on the same type -- [#3538](https://github.com/neo4j/graphql/pull/3538) [`56a733023`](https://github.com/neo4j/graphql/commit/56a733023f6f300b92c8811e37bf6884dc661133) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3537 which prevented extending the schema with `@neo4j/graphql` directives when calling `getSubgraphSchema()` +* [#3538](https://github.com/neo4j/graphql/pull/3538) [`56a733023`](https://github.com/neo4j/graphql/commit/56a733023f6f300b92c8811e37bf6884dc661133) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3537 which prevented extending the schema with `@neo4j/graphql` directives when calling `getSubgraphSchema()` ## 3.21.0 ### Minor Changes -- [#3402](https://github.com/neo4j/graphql/pull/3402) [`baa787745`](https://github.com/neo4j/graphql/commit/baa787745f5fef2af6b29ba3b4722a51f94b1961) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Add top-level boolean operators for filtering on Subscriptions relationship events +* [#3402](https://github.com/neo4j/graphql/pull/3402) [`baa787745`](https://github.com/neo4j/graphql/commit/baa787745f5fef2af6b29ba3b4722a51f94b1961) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Add top-level boolean operators for filtering on Subscriptions relationship events -- [#3482](https://github.com/neo4j/graphql/pull/3482) [`b891355e5`](https://github.com/neo4j/graphql/commit/b891355e58de1c56df68ce528a0a814d5202cab3) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Export a new type, `Neo4jGraphQLContext` which can be passed into a GraphQL server to provide strong typing when populating the context with values to influence the behaviour of the Neo4j GraphQL Library. For an example of how this might be used, see the [Apollo docs](https://www.apollographql.com/docs/apollo-server/data/context#the-context-function). +* [#3482](https://github.com/neo4j/graphql/pull/3482) [`b891355e5`](https://github.com/neo4j/graphql/commit/b891355e58de1c56df68ce528a0a814d5202cab3) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Export a new type, `Neo4jGraphQLContext` which can be passed into a GraphQL server to provide strong typing when populating the context with values to influence the behaviour of the Neo4j GraphQL Library. For an example of how this might be used, see the [Apollo docs](https://www.apollographql.com/docs/apollo-server/data/context#the-context-function). -- [#3431](https://github.com/neo4j/graphql/pull/3431) [`f19a57ca2`](https://github.com/neo4j/graphql/commit/f19a57ca236cb608c8138237751c4432ede6233f) Thanks [@angrykoala](https://github.com/angrykoala)! - Add @settable directive, allowing to disable some fields from mutation operations +* [#3431](https://github.com/neo4j/graphql/pull/3431) [`f19a57ca2`](https://github.com/neo4j/graphql/commit/f19a57ca236cb608c8138237751c4432ede6233f) Thanks [@angrykoala](https://github.com/angrykoala)! - Add @settable directive, allowing to disable some fields from mutation operations For example: @@ -219,7 +241,7 @@ } ``` -- [#3432](https://github.com/neo4j/graphql/pull/3432) [`0a444662b`](https://github.com/neo4j/graphql/commit/0a444662b2ac986971076505fbb6c17aec4ea539) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Add `aggregate` argument to the @relationship directive, allowing to disable nested aggregation +* [#3432](https://github.com/neo4j/graphql/pull/3432) [`0a444662b`](https://github.com/neo4j/graphql/commit/0a444662b2ac986971076505fbb6c17aec4ea539) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Add `aggregate` argument to the @relationship directive, allowing to disable nested aggregation For example: @@ -235,7 +257,7 @@ } ``` -- [#3403](https://github.com/neo4j/graphql/pull/3403) [`f4d691566`](https://github.com/neo4j/graphql/commit/f4d6915661ef5f18e0d5fa3bd1b96d3564d94ee8) Thanks [@angrykoala](https://github.com/angrykoala)! - Add @selectable directive, allowing to disable fields from query, aggregations and subscription responses +* [#3403](https://github.com/neo4j/graphql/pull/3403) [`f4d691566`](https://github.com/neo4j/graphql/commit/f4d6915661ef5f18e0d5fa3bd1b96d3564d94ee8) Thanks [@angrykoala](https://github.com/angrykoala)! - Add @selectable directive, allowing to disable fields from query, aggregations and subscription responses For example: @@ -248,32 +270,32 @@ ### Patch Changes -- [#3438](https://github.com/neo4j/graphql/pull/3438) [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3437 which caused the `nestedOperations` argument of `@relationship` to generate empty input types if the CONNECT, CREATE or CONNECT_OR_CREATE operations were not generated +* [#3438](https://github.com/neo4j/graphql/pull/3438) [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3437 which caused the `nestedOperations` argument of `@relationship` to generate empty input types if the CONNECT, CREATE or CONNECT_OR_CREATE operations were not generated -- [#3489](https://github.com/neo4j/graphql/pull/3489) [`0f32311ea`](https://github.com/neo4j/graphql/commit/0f32311ea685c996f35a62410a21ef1d9f495b46) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove internal performance measurements requiring `performance.now` +* [#3489](https://github.com/neo4j/graphql/pull/3489) [`0f32311ea`](https://github.com/neo4j/graphql/commit/0f32311ea685c996f35a62410a21ef1d9f495b46) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove internal performance measurements requiring `performance.now` -- [#3465](https://github.com/neo4j/graphql/pull/3465) [`5616aa662`](https://github.com/neo4j/graphql/commit/5616aa662256e416b8401c8e50be79db194dfb28) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3429 and added support for unions/interfaces to the `nestedOperations` argument of `@relationship` +* [#3465](https://github.com/neo4j/graphql/pull/3465) [`5616aa662`](https://github.com/neo4j/graphql/commit/5616aa662256e416b8401c8e50be79db194dfb28) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3429 and added support for unions/interfaces to the `nestedOperations` argument of `@relationship` -- [#3446](https://github.com/neo4j/graphql/pull/3446) [`1d5506525`](https://github.com/neo4j/graphql/commit/1d550652512331f3fc69bf3b5307fbcb3fd79aab) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - An empty `nestedOperations` array no longer causes `UpdateFieldInput` input types from being generated with only the `where` field +* [#3446](https://github.com/neo4j/graphql/pull/3446) [`1d5506525`](https://github.com/neo4j/graphql/commit/1d550652512331f3fc69bf3b5307fbcb3fd79aab) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - An empty `nestedOperations` array no longer causes `UpdateFieldInput` input types from being generated with only the `where` field -- [#3438](https://github.com/neo4j/graphql/pull/3438) [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3413 which caused the `nestedOperations` argument of `@relationship` to control top-level operations +* [#3438](https://github.com/neo4j/graphql/pull/3438) [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3413 which caused the `nestedOperations` argument of `@relationship` to control top-level operations -- [#3445](https://github.com/neo4j/graphql/pull/3445) [`cc7c8e6a9`](https://github.com/neo4j/graphql/commit/cc7c8e6a9ba5b880c971efbfcd36485c92948a6b) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3428 which caused an error when removing the `CONNECT_OR_CREATE` `nestedOperation` if the related type has a unique field +* [#3445](https://github.com/neo4j/graphql/pull/3445) [`cc7c8e6a9`](https://github.com/neo4j/graphql/commit/cc7c8e6a9ba5b880c971efbfcd36485c92948a6b) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #3428 which caused an error when removing the `CONNECT_OR_CREATE` `nestedOperation` if the related type has a unique field ## 3.20.1 ### Patch Changes -- [#3396](https://github.com/neo4j/graphql/pull/3396) [`449d66fbd`](https://github.com/neo4j/graphql/commit/449d66fbddb061c40bfd3df10c8c12bf037960d7) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix sorting fields with @alias directive +* [#3396](https://github.com/neo4j/graphql/pull/3396) [`449d66fbd`](https://github.com/neo4j/graphql/commit/449d66fbddb061c40bfd3df10c8c12bf037960d7) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix sorting fields with @alias directive -- Updated dependencies [[`ddae88e48`](https://github.com/neo4j/graphql/commit/ddae88e48a2e13ea9b6f4d9b39c46c52cf35a17e), [`42d2f6938`](https://github.com/neo4j/graphql/commit/42d2f6938df2b728c5ed552200565d1f8145e8bd)]: - - @neo4j/cypher-builder@0.4.3 +* Updated dependencies [[`ddae88e48`](https://github.com/neo4j/graphql/commit/ddae88e48a2e13ea9b6f4d9b39c46c52cf35a17e), [`42d2f6938`](https://github.com/neo4j/graphql/commit/42d2f6938df2b728c5ed552200565d1f8145e8bd)]: + * @neo4j/cypher-builder@0.4.3 ## 3.20.0 ### Minor Changes -- [#3357](https://github.com/neo4j/graphql/pull/3357) [`a39b22fc1`](https://github.com/neo4j/graphql/commit/a39b22fc1f8f1227cac5a7efbaab1d855062054e) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Introduced relationship directive configuration with the new nestedOperations argument. This allows users to specify which nested operations they want to be built into the schema. +* [#3357](https://github.com/neo4j/graphql/pull/3357) [`a39b22fc1`](https://github.com/neo4j/graphql/commit/a39b22fc1f8f1227cac5a7efbaab1d855062054e) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Introduced relationship directive configuration with the new nestedOperations argument. This allows users to specify which nested operations they want to be built into the schema. Usage: @@ -286,13 +308,13 @@ ### Patch Changes -- [#3358](https://github.com/neo4j/graphql/pull/3358) [`6cce9ffe0`](https://github.com/neo4j/graphql/commit/6cce9ffe0605795be8e2e1990860d4ea0bd256ec) Thanks [@a-alle](https://github.com/a-alle)! - Fix update mutation returning info object when subscriptions enabled +* [#3358](https://github.com/neo4j/graphql/pull/3358) [`6cce9ffe0`](https://github.com/neo4j/graphql/commit/6cce9ffe0605795be8e2e1990860d4ea0bd256ec) Thanks [@a-alle](https://github.com/a-alle)! - Fix update mutation returning info object when subscriptions enabled ## 3.19.0 ### Minor Changes -- [#3333](https://github.com/neo4j/graphql/pull/3333) [`cc08bcd8a`](https://github.com/neo4j/graphql/commit/cc08bcd8a07044e38380fada05893de980351644) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced top-level schema configuration, `@query`, `@mutation`, `@subscription`. +* [#3333](https://github.com/neo4j/graphql/pull/3333) [`cc08bcd8a`](https://github.com/neo4j/graphql/commit/cc08bcd8a07044e38380fada05893de980351644) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced top-level schema configuration, `@query`, `@mutation`, `@subscription`. Usage: @@ -305,496 +327,496 @@ ### Patch Changes -- [#3344](https://github.com/neo4j/graphql/pull/3344) [`dcfe28b49`](https://github.com/neo4j/graphql/commit/dcfe28b4912bb328a03caab48991f0903f000751) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix relationship validation when an update and connect are used in the same Mutation. +* [#3344](https://github.com/neo4j/graphql/pull/3344) [`dcfe28b49`](https://github.com/neo4j/graphql/commit/dcfe28b4912bb328a03caab48991f0903f000751) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix relationship validation when an update and connect are used in the same Mutation. -- [#3322](https://github.com/neo4j/graphql/pull/3322) [`ce573b770`](https://github.com/neo4j/graphql/commit/ce573b7705a01caadcc1ad10984f85976451ca2c) Thanks [@angrykoala](https://github.com/angrykoala)! - Optimise query source metadata in executor +* [#3322](https://github.com/neo4j/graphql/pull/3322) [`ce573b770`](https://github.com/neo4j/graphql/commit/ce573b7705a01caadcc1ad10984f85976451ca2c) Thanks [@angrykoala](https://github.com/angrykoala)! - Optimise query source metadata in executor -- [#3341](https://github.com/neo4j/graphql/pull/3341) [`43e189c14`](https://github.com/neo4j/graphql/commit/43e189c14853cd626e14b53338b4ef0ca7e489b8) Thanks [@tbwiss](https://github.com/tbwiss)! - feat: Neo4jGraphQL class, added public method to validate the type definitions +* [#3341](https://github.com/neo4j/graphql/pull/3341) [`43e189c14`](https://github.com/neo4j/graphql/commit/43e189c14853cd626e14b53338b4ef0ca7e489b8) Thanks [@tbwiss](https://github.com/tbwiss)! - feat: Neo4jGraphQL class, added public method to validate the type definitions ## 3.18.3 ### Patch Changes -- [#3264](https://github.com/neo4j/graphql/pull/3264) [`e8092aa85`](https://github.com/neo4j/graphql/commit/e8092aa855244f7da21bb82f874bfda534a6fa4b) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Federation: Setting `@key` resolvable to false no longer prevents queries and mutations for a type from being generated. +* [#3264](https://github.com/neo4j/graphql/pull/3264) [`e8092aa85`](https://github.com/neo4j/graphql/commit/e8092aa855244f7da21bb82f874bfda534a6fa4b) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Federation: Setting `@key` resolvable to false no longer prevents queries and mutations for a type from being generated. -- [#3309](https://github.com/neo4j/graphql/pull/3309) [`99fe4b4b8`](https://github.com/neo4j/graphql/commit/99fe4b4b813538fa985111918bf6ffe2ef458f05) Thanks [@angrykoala](https://github.com/angrykoala)! - Improve server performance for large schemas when querying +* [#3309](https://github.com/neo4j/graphql/pull/3309) [`99fe4b4b8`](https://github.com/neo4j/graphql/commit/99fe4b4b813538fa985111918bf6ffe2ef458f05) Thanks [@angrykoala](https://github.com/angrykoala)! - Improve server performance for large schemas when querying -- Updated dependencies [[`2d3661476`](https://github.com/neo4j/graphql/commit/2d3661476b78713d11b6d74a8db8c7af51d18989)]: - - @neo4j/cypher-builder@0.4.2 +* Updated dependencies [[`2d3661476`](https://github.com/neo4j/graphql/commit/2d3661476b78713d11b6d74a8db8c7af51d18989)]: + * @neo4j/cypher-builder@0.4.2 ## 3.18.2 ### Patch Changes -- [#3216](https://github.com/neo4j/graphql/pull/3216) [`a8aabfeca`](https://github.com/neo4j/graphql/commit/a8aabfecad39b371fa82d16ea00e1e45d4044d05) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix error in logical operations on optional parameters #3215 +* [#3216](https://github.com/neo4j/graphql/pull/3216) [`a8aabfeca`](https://github.com/neo4j/graphql/commit/a8aabfecad39b371fa82d16ea00e1e45d4044d05) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix error in logical operations on optional parameters #3215 -- [#3192](https://github.com/neo4j/graphql/pull/3192) [`8657dff82`](https://github.com/neo4j/graphql/commit/8657dff8274ea3d3a4a42c18c8e81232748cbeff) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Source query and params are added to driver transaction config to aid with debugging the library from database query logs. +* [#3192](https://github.com/neo4j/graphql/pull/3192) [`8657dff82`](https://github.com/neo4j/graphql/commit/8657dff8274ea3d3a4a42c18c8e81232748cbeff) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Source query and params are added to driver transaction config to aid with debugging the library from database query logs. -- Updated dependencies [[`f0d6d45b0`](https://github.com/neo4j/graphql/commit/f0d6d45b07cc65081ede71ce98efc916ce506977), [`f0d6d45b0`](https://github.com/neo4j/graphql/commit/f0d6d45b07cc65081ede71ce98efc916ce506977)]: - - @neo4j/cypher-builder@0.4.1 +* Updated dependencies [[`f0d6d45b0`](https://github.com/neo4j/graphql/commit/f0d6d45b07cc65081ede71ce98efc916ce506977), [`f0d6d45b0`](https://github.com/neo4j/graphql/commit/f0d6d45b07cc65081ede71ce98efc916ce506977)]: + * @neo4j/cypher-builder@0.4.1 ## 3.18.1 ### Patch Changes -- [#3183](https://github.com/neo4j/graphql/pull/3183) [`cbc15970c`](https://github.com/neo4j/graphql/commit/cbc15970cd87e5cdcfbae40ce5bacf1fb819ade8) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix query by edge property on union type +* [#3183](https://github.com/neo4j/graphql/pull/3183) [`cbc15970c`](https://github.com/neo4j/graphql/commit/cbc15970cd87e5cdcfbae40ce5bacf1fb819ade8) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix query by edge property on union type ## 3.18.0 ### Minor Changes -- [#3076](https://github.com/neo4j/graphql/pull/3076) [`7a2f2acc4`](https://github.com/neo4j/graphql/commit/7a2f2acc434d1996a4b3785416acb0c46ad7f199) Thanks [@mjfwebb](https://github.com/mjfwebb)! - enableRegex has been deprecated and replaced with MATCHES filters in the features configuration object. +* [#3076](https://github.com/neo4j/graphql/pull/3076) [`7a2f2acc4`](https://github.com/neo4j/graphql/commit/7a2f2acc434d1996a4b3785416acb0c46ad7f199) Thanks [@mjfwebb](https://github.com/mjfwebb)! - enableRegex has been deprecated and replaced with MATCHES filters in the features configuration object. -- [#3085](https://github.com/neo4j/graphql/pull/3085) [`ce5fb9eb3`](https://github.com/neo4j/graphql/commit/ce5fb9eb36a08dde95de605b49f842876b1c1515) Thanks [@mjfwebb](https://github.com/mjfwebb)! - config.callbacks has been deprecated and replaced with features.populatedBy.callbacks. See https://neo4j.com/docs/graphql-manual/current/guides/v4-migration/#_callback_renamed_to_populatedby for more information. +* [#3085](https://github.com/neo4j/graphql/pull/3085) [`ce5fb9eb3`](https://github.com/neo4j/graphql/commit/ce5fb9eb36a08dde95de605b49f842876b1c1515) Thanks [@mjfwebb](https://github.com/mjfwebb)! - config.callbacks has been deprecated and replaced with features.populatedBy.callbacks. See for more information. ### Patch Changes -- Updated dependencies [[`2bc2c7019`](https://github.com/neo4j/graphql/commit/2bc2c70196c084f850aaf5b17838b0a66eaca79c), [`0d7a140ae`](https://github.com/neo4j/graphql/commit/0d7a140aea93eca94c03bcd49fda9ee9dfa5ae2b), [`d47624ea1`](https://github.com/neo4j/graphql/commit/d47624ea1b1b79401c59d326b4d0e31e64a1545d), [`bfae63097`](https://github.com/neo4j/graphql/commit/bfae6309717ab936768cab7e5e2a1a20bbff60da), [`b276bbae2`](https://github.com/neo4j/graphql/commit/b276bbae29ead5b110f28984cc77914755ac4c22), [`a04ef4469`](https://github.com/neo4j/graphql/commit/a04ef44692e744e3154a74c5ac2c73f323732fc7)]: - - @neo4j/cypher-builder@0.4.0 +* Updated dependencies [[`2bc2c7019`](https://github.com/neo4j/graphql/commit/2bc2c70196c084f850aaf5b17838b0a66eaca79c), [`0d7a140ae`](https://github.com/neo4j/graphql/commit/0d7a140aea93eca94c03bcd49fda9ee9dfa5ae2b), [`d47624ea1`](https://github.com/neo4j/graphql/commit/d47624ea1b1b79401c59d326b4d0e31e64a1545d), [`bfae63097`](https://github.com/neo4j/graphql/commit/bfae6309717ab936768cab7e5e2a1a20bbff60da), [`b276bbae2`](https://github.com/neo4j/graphql/commit/b276bbae29ead5b110f28984cc77914755ac4c22), [`a04ef4469`](https://github.com/neo4j/graphql/commit/a04ef44692e744e3154a74c5ac2c73f323732fc7)]: + * @neo4j/cypher-builder@0.4.0 ## 3.17.2 ### Patch Changes -- [#3036](https://github.com/neo4j/graphql/pull/3036) [`ff99e317c`](https://github.com/neo4j/graphql/commit/ff99e317cff519b1ae26bd52c70b2d89ac923512) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix #2993 - skip the generation of relationship property input types if all fields are autogenerated. +* [#3036](https://github.com/neo4j/graphql/pull/3036) [`ff99e317c`](https://github.com/neo4j/graphql/commit/ff99e317cff519b1ae26bd52c70b2d89ac923512) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix #2993 - skip the generation of relationship property input types if all fields are autogenerated. -- [#3051](https://github.com/neo4j/graphql/pull/3051) [`b6e4ebdc6`](https://github.com/neo4j/graphql/commit/b6e4ebdc62770951e333893c8f9562a2c9cbb99f) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Include cardinality validation for abstract type during the update create +* [#3051](https://github.com/neo4j/graphql/pull/3051) [`b6e4ebdc6`](https://github.com/neo4j/graphql/commit/b6e4ebdc62770951e333893c8f9562a2c9cbb99f) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Include cardinality validation for abstract type during the update create -- [#3029](https://github.com/neo4j/graphql/pull/3029) [`0ce8bcf4b`](https://github.com/neo4j/graphql/commit/0ce8bcf4b7b021e341496cde8b10140f00d47c84) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixed a bug that generates a relationship field of a union type as a List, in some inputs, even if defined as a 1 to 1 relationship field by the user. +* [#3029](https://github.com/neo4j/graphql/pull/3029) [`0ce8bcf4b`](https://github.com/neo4j/graphql/commit/0ce8bcf4b7b021e341496cde8b10140f00d47c84) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixed a bug that generates a relationship field of a union type as a List, in some inputs, even if defined as a 1 to 1 relationship field by the user. -- [#3037](https://github.com/neo4j/graphql/pull/3037) [`39abf6591`](https://github.com/neo4j/graphql/commit/39abf65915bb100baab15f3e838b899152109e63) Thanks [@angrykoala](https://github.com/angrykoala)! - Optimize Cypher query for filters on single relationships for required fields +* [#3037](https://github.com/neo4j/graphql/pull/3037) [`39abf6591`](https://github.com/neo4j/graphql/commit/39abf65915bb100baab15f3e838b899152109e63) Thanks [@angrykoala](https://github.com/angrykoala)! - Optimize Cypher query for filters on single relationships for required fields -- [#3010](https://github.com/neo4j/graphql/pull/3010) [`03141c81e`](https://github.com/neo4j/graphql/commit/03141c81e38e85bc6499231ae90a19e3fbdb17c3) Thanks [@happenslol](https://github.com/happenslol)! - Fix Date scalar serialization for custom resolvers +* [#3010](https://github.com/neo4j/graphql/pull/3010) [`03141c81e`](https://github.com/neo4j/graphql/commit/03141c81e38e85bc6499231ae90a19e3fbdb17c3) Thanks [@happenslol](https://github.com/happenslol)! - Fix Date scalar serialization for custom resolvers -- Updated dependencies [[`cdbf0c1fe`](https://github.com/neo4j/graphql/commit/cdbf0c1fed34e5c39c8697410e13b338498f7520), [`507f9f7ff`](https://github.com/neo4j/graphql/commit/507f9f7ff5a57ff42f6554b21c2eff0cf37c10ba), [`084e0e036`](https://github.com/neo4j/graphql/commit/084e0e036ea05091db9082cae227b55a55157109), [`c4b9f120a`](https://github.com/neo4j/graphql/commit/c4b9f120ac2e22a6c9c1a34c920cb1ddf88fa45d)]: - - @neo4j/cypher-builder@0.3.0 +* Updated dependencies [[`cdbf0c1fe`](https://github.com/neo4j/graphql/commit/cdbf0c1fed34e5c39c8697410e13b338498f7520), [`507f9f7ff`](https://github.com/neo4j/graphql/commit/507f9f7ff5a57ff42f6554b21c2eff0cf37c10ba), [`084e0e036`](https://github.com/neo4j/graphql/commit/084e0e036ea05091db9082cae227b55a55157109), [`c4b9f120a`](https://github.com/neo4j/graphql/commit/c4b9f120ac2e22a6c9c1a34c920cb1ddf88fa45d)]: + * @neo4j/cypher-builder@0.3.0 ## 3.17.1 ### Patch Changes -- [#2983](https://github.com/neo4j/graphql/pull/2983) [`56d126238`](https://github.com/neo4j/graphql/commit/56d1262389ff38522d7b9c3964e878415994b1fa) Thanks [@happenslol](https://github.com/happenslol)! - Fix count aggregate field translation resulting in a syntax error when used inside inline fragments +* [#2983](https://github.com/neo4j/graphql/pull/2983) [`56d126238`](https://github.com/neo4j/graphql/commit/56d1262389ff38522d7b9c3964e878415994b1fa) Thanks [@happenslol](https://github.com/happenslol)! - Fix count aggregate field translation resulting in a syntax error when used inside inline fragments -- [#2988](https://github.com/neo4j/graphql/pull/2988) [`cfe96e713`](https://github.com/neo4j/graphql/commit/cfe96e713ea54e6c670d7fe0dc535e7065b81d9c) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix: context is now fully populated when using Apollo Federation, therefore, driver is no longer mandatory on construction and can be injected into the context like usual +* [#2988](https://github.com/neo4j/graphql/pull/2988) [`cfe96e713`](https://github.com/neo4j/graphql/commit/cfe96e713ea54e6c670d7fe0dc535e7065b81d9c) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix: context is now fully populated when using Apollo Federation, therefore, driver is no longer mandatory on construction and can be injected into the context like usual -- [#2942](https://github.com/neo4j/graphql/pull/2942) [`8e41a724a`](https://github.com/neo4j/graphql/commit/8e41a724a3abae1fa63fb5cd4cc1cf7a08e124d1) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix `@coalesce` and `@default` for Enum List values +* [#2942](https://github.com/neo4j/graphql/pull/2942) [`8e41a724a`](https://github.com/neo4j/graphql/commit/8e41a724a3abae1fa63fb5cd4cc1cf7a08e124d1) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix `@coalesce` and `@default` for Enum List values -- [#2994](https://github.com/neo4j/graphql/pull/2994) [`eaf16062c`](https://github.com/neo4j/graphql/commit/eaf16062c9a27eacdea53de87423b726bef7bed6) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix order of operations for nested update (delete->disconnect->update->connect->create) +* [#2994](https://github.com/neo4j/graphql/pull/2994) [`eaf16062c`](https://github.com/neo4j/graphql/commit/eaf16062c9a27eacdea53de87423b726bef7bed6) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix order of operations for nested update (delete->disconnect->update->connect->create) -- [#2743](https://github.com/neo4j/graphql/pull/2743) [`514bb64b6`](https://github.com/neo4j/graphql/commit/514bb64b6c22e886b3d8c06fc48b968af86bd421) Thanks [@dvanmali](https://github.com/dvanmali)! - fix: remove dependency of bindPredicate property from auth plugin into context +* [#2743](https://github.com/neo4j/graphql/pull/2743) [`514bb64b6`](https://github.com/neo4j/graphql/commit/514bb64b6c22e886b3d8c06fc48b968af86bd421) Thanks [@dvanmali](https://github.com/dvanmali)! - fix: remove dependency of bindPredicate property from auth plugin into context -- [#2930](https://github.com/neo4j/graphql/pull/2930) [`99985018e`](https://github.com/neo4j/graphql/commit/99985018e6894d827efbfe1fa5fad6cc177594eb) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Federation: `@shareable` directives defined on an `OBJECT` are now propagated effectively through the schema. `resolvable` argument of the `@key` directive now stops type generation of the relevant types. +* [#2930](https://github.com/neo4j/graphql/pull/2930) [`99985018e`](https://github.com/neo4j/graphql/commit/99985018e6894d827efbfe1fa5fad6cc177594eb) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Federation: `@shareable` directives defined on an `OBJECT` are now propagated effectively through the schema. `resolvable` argument of the `@key` directive now stops type generation of the relevant types. ## 3.17.0 ### Minor Changes -- [#2442](https://github.com/neo4j/graphql/pull/2442) [`6f0d9c06d`](https://github.com/neo4j/graphql/commit/6f0d9c06d9b34d30211bdf703bb0b26844033179) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Experimental support for Apollo Federation. Call `getSubgraphSchema()` to allow the schema to be used in a supergraph. The API is still being refined and will be subject to breaking changes. +* [#2442](https://github.com/neo4j/graphql/pull/2442) [`6f0d9c06d`](https://github.com/neo4j/graphql/commit/6f0d9c06d9b34d30211bdf703bb0b26844033179) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Experimental support for Apollo Federation. Call `getSubgraphSchema()` to allow the schema to be used in a supergraph. The API is still being refined and will be subject to breaking changes. ### Patch Changes -- [#2913](https://github.com/neo4j/graphql/pull/2913) [`a0d4dc4cf`](https://github.com/neo4j/graphql/commit/a0d4dc4cf5d007235be3c7e36202aea9d39b6542) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fixes #2889 where nodes could not be created with enum list as a property +* [#2913](https://github.com/neo4j/graphql/pull/2913) [`a0d4dc4cf`](https://github.com/neo4j/graphql/commit/a0d4dc4cf5d007235be3c7e36202aea9d39b6542) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fixes #2889 where nodes could not be created with enum list as a property -- [#2620](https://github.com/neo4j/graphql/pull/2620) [`6421735f0`](https://github.com/neo4j/graphql/commit/6421735f014f0e2edacb1be7ba15c8819a1a0adb) Thanks [@mhlz](https://github.com/mhlz)! - Selection of fields on interfaces in unions fail in some cases +* [#2620](https://github.com/neo4j/graphql/pull/2620) [`6421735f0`](https://github.com/neo4j/graphql/commit/6421735f014f0e2edacb1be7ba15c8819a1a0adb) Thanks [@mhlz](https://github.com/mhlz)! - Selection of fields on interfaces in unions fail in some cases -- [#2892](https://github.com/neo4j/graphql/pull/2892) [`cdbf768a0`](https://github.com/neo4j/graphql/commit/cdbf768a05323b15595fe26b5d047866f0f0c036) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Removed deprecation messages from single relationships that did not make sense +* [#2892](https://github.com/neo4j/graphql/pull/2892) [`cdbf768a0`](https://github.com/neo4j/graphql/commit/cdbf768a05323b15595fe26b5d047866f0f0c036) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Removed deprecation messages from single relationships that did not make sense -- [#2879](https://github.com/neo4j/graphql/pull/2879) [`1902f903f`](https://github.com/neo4j/graphql/commit/1902f903f89453f2d17be909e2b05f1c12ac39a9) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixed a bug that prevents to return of the correct SelectionSet when a nested abstract field is null. +* [#2879](https://github.com/neo4j/graphql/pull/2879) [`1902f903f`](https://github.com/neo4j/graphql/commit/1902f903f89453f2d17be909e2b05f1c12ac39a9) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixed a bug that prevents to return of the correct SelectionSet when a nested abstract field is null. -- [#2884](https://github.com/neo4j/graphql/pull/2884) [`1a2101c33`](https://github.com/neo4j/graphql/commit/1a2101c33d00a738be26c57fa378d4a9e3bede41) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Add unique identifier to Cypher queries when combining with `UNION`, to ensure results aren't incorrectly de-duped. Fixes #2820. +* [#2884](https://github.com/neo4j/graphql/pull/2884) [`1a2101c33`](https://github.com/neo4j/graphql/commit/1a2101c33d00a738be26c57fa378d4a9e3bede41) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Add unique identifier to Cypher queries when combining with `UNION`, to ensure results aren't incorrectly de-duped. Fixes #2820. -- Updated dependencies [[`c436ab040`](https://github.com/neo4j/graphql/commit/c436ab0403a45395594728e6fc192034712f45af), [`1a2101c33`](https://github.com/neo4j/graphql/commit/1a2101c33d00a738be26c57fa378d4a9e3bede41)]: - - @neo4j/cypher-builder@0.2.1 +* Updated dependencies [[`c436ab040`](https://github.com/neo4j/graphql/commit/c436ab0403a45395594728e6fc192034712f45af), [`1a2101c33`](https://github.com/neo4j/graphql/commit/1a2101c33d00a738be26c57fa378d4a9e3bede41)]: + * @neo4j/cypher-builder@0.2.1 ## 3.16.1 ### Patch Changes -- [#2810](https://github.com/neo4j/graphql/pull/2810) [`0fe3a6853`](https://github.com/neo4j/graphql/commit/0fe3a68536e0cc5ec2cdd05057d038ca38358ff8) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2803 - invalid cypher when using aggregation filters within nested relationships/connections +* [#2810](https://github.com/neo4j/graphql/pull/2810) [`0fe3a6853`](https://github.com/neo4j/graphql/commit/0fe3a68536e0cc5ec2cdd05057d038ca38358ff8) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2803 - invalid cypher when using aggregation filters within nested relationships/connections -- [#2877](https://github.com/neo4j/graphql/pull/2877) [`79ef38c5d`](https://github.com/neo4j/graphql/commit/79ef38c5dd43da19a64b0e7c25019209e19415f3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2871 - invalid cypher for relationship filters nested within a SINGLE relationship +* [#2877](https://github.com/neo4j/graphql/pull/2877) [`79ef38c5d`](https://github.com/neo4j/graphql/commit/79ef38c5dd43da19a64b0e7c25019209e19415f3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2871 - invalid cypher for relationship filters nested within a SINGLE relationship -- Updated dependencies [[`81df28ed9`](https://github.com/neo4j/graphql/commit/81df28ed9238c1b4692aabe8e1de438ba01ae914), [`4fdb5135f`](https://github.com/neo4j/graphql/commit/4fdb5135fa3bdb84b87893d14afe263ad5ed020f), [`d4455881c`](https://github.com/neo4j/graphql/commit/d4455881c83f9ec597e657d92b9c9c126721541b)]: - - @neo4j/cypher-builder@0.2.0 +* Updated dependencies [[`81df28ed9`](https://github.com/neo4j/graphql/commit/81df28ed9238c1b4692aabe8e1de438ba01ae914), [`4fdb5135f`](https://github.com/neo4j/graphql/commit/4fdb5135fa3bdb84b87893d14afe263ad5ed020f), [`d4455881c`](https://github.com/neo4j/graphql/commit/d4455881c83f9ec597e657d92b9c9c126721541b)]: + * @neo4j/cypher-builder@0.2.0 ## 3.16.0 ### Minor Changes -- [#2761](https://github.com/neo4j/graphql/pull/2761) [`6d2ba44d4`](https://github.com/neo4j/graphql/commit/6d2ba44d49a043bf4aed5311e368cf0c30719745) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added fine grain controls over startup validation. This makes it possible to turn off checks for custom resolvers when using the new `@customResolver` directive and addresses #2394 +* [#2761](https://github.com/neo4j/graphql/pull/2761) [`6d2ba44d4`](https://github.com/neo4j/graphql/commit/6d2ba44d49a043bf4aed5311e368cf0c30719745) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added fine grain controls over startup validation. This makes it possible to turn off checks for custom resolvers when using the new `@customResolver` directive and addresses #2394 -- [#2825](https://github.com/neo4j/graphql/pull/2825) [`14df1f827`](https://github.com/neo4j/graphql/commit/14df1f8271323a9d320810f5a19c02e79a5b3d84) Thanks [@a-alle](https://github.com/a-alle)! - `@node` arguments `label` and `additionalLabels` deprecated in favor of a new `labels` argument +* [#2825](https://github.com/neo4j/graphql/pull/2825) [`14df1f827`](https://github.com/neo4j/graphql/commit/14df1f8271323a9d320810f5a19c02e79a5b3d84) Thanks [@a-alle](https://github.com/a-alle)! - `@node` arguments `label` and `additionalLabels` deprecated in favor of a new `labels` argument ### Patch Changes -- [#2835](https://github.com/neo4j/graphql/pull/2835) [`29e1d659a`](https://github.com/neo4j/graphql/commit/29e1d659aa7c48c73e6f19ed37bff320bff4dfeb) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixed a wrong predicate generated by the batch create and field-level auth for some inputs. +* [#2835](https://github.com/neo4j/graphql/pull/2835) [`29e1d659a`](https://github.com/neo4j/graphql/commit/29e1d659aa7c48c73e6f19ed37bff320bff4dfeb) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fixed a wrong predicate generated by the batch create and field-level auth for some inputs. -- [#2822](https://github.com/neo4j/graphql/pull/2822) [`022861de2`](https://github.com/neo4j/graphql/commit/022861de2e1d69f8b56444b1c92308b2365e599c) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced \_LENGTH aggregation filters for string fields. +* [#2822](https://github.com/neo4j/graphql/pull/2822) [`022861de2`](https://github.com/neo4j/graphql/commit/022861de2e1d69f8b56444b1c92308b2365e599c) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced \_LENGTH aggregation filters for string fields. -- [#2785](https://github.com/neo4j/graphql/pull/2785) [`8859980f9`](https://github.com/neo4j/graphql/commit/8859980f93598212fb226aa0172a0f0091965801) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix comparison of duration fields on aggregations #2697 +* [#2785](https://github.com/neo4j/graphql/pull/2785) [`8859980f9`](https://github.com/neo4j/graphql/commit/8859980f93598212fb226aa0172a0f0091965801) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix comparison of duration fields on aggregations #2697 -- [#2795](https://github.com/neo4j/graphql/pull/2795) [`a270243bb`](https://github.com/neo4j/graphql/commit/a270243bb3baaa0abadeb395fff5b0036a754c7b) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix reusing the same parameters in custom @cypher queries within the same GraphQL query +* [#2795](https://github.com/neo4j/graphql/pull/2795) [`a270243bb`](https://github.com/neo4j/graphql/commit/a270243bb3baaa0abadeb395fff5b0036a754c7b) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix reusing the same parameters in custom @cypher queries within the same GraphQL query -- [#2632](https://github.com/neo4j/graphql/pull/2632) [`3fff70828`](https://github.com/neo4j/graphql/commit/3fff708284e95b4667be5094bbda6cf828a467a9) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced the logical operator NOT, some comparators like `NOT_CONTAINS` are no longer necessary and will be deprecated starting from version 4.0. +* [#2632](https://github.com/neo4j/graphql/pull/2632) [`3fff70828`](https://github.com/neo4j/graphql/commit/3fff708284e95b4667be5094bbda6cf828a467a9) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Introduced the logical operator NOT, some comparators like `NOT_CONTAINS` are no longer necessary and will be deprecated starting from version 4.0. -- [#2821](https://github.com/neo4j/graphql/pull/2821) [`8db2a1e2c`](https://github.com/neo4j/graphql/commit/8db2a1e2ce8a2f8d3077663a6665e0e670652db1) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix parameter collision on nested disconnect #2782 +* [#2821](https://github.com/neo4j/graphql/pull/2821) [`8db2a1e2c`](https://github.com/neo4j/graphql/commit/8db2a1e2ce8a2f8d3077663a6665e0e670652db1) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix parameter collision on nested disconnect #2782 -- [#2752](https://github.com/neo4j/graphql/pull/2752) [`44ce8a741`](https://github.com/neo4j/graphql/commit/44ce8a74154182fca7ce6cf269bcd0009e61e34b) Thanks [@Andy2003](https://github.com/Andy2003)! - Removes apoc.do.when from generated Cypher, improving query performance in some update mutations +* [#2752](https://github.com/neo4j/graphql/pull/2752) [`44ce8a741`](https://github.com/neo4j/graphql/commit/44ce8a74154182fca7ce6cf269bcd0009e61e34b) Thanks [@Andy2003](https://github.com/Andy2003)! - Removes apoc.do.when from generated Cypher, improving query performance in some update mutations -- [#2813](https://github.com/neo4j/graphql/pull/2813) [`4f6d4ae97`](https://github.com/neo4j/graphql/commit/4f6d4ae97f1278d37e65a25a10561efdfdeb6bac) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Add deprecation to aggregation filters not relying on an aggregating function. +* [#2813](https://github.com/neo4j/graphql/pull/2813) [`4f6d4ae97`](https://github.com/neo4j/graphql/commit/4f6d4ae97f1278d37e65a25a10561efdfdeb6bac) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Add deprecation to aggregation filters not relying on an aggregating function. -- Updated dependencies [[`81df28ed9`](https://github.com/neo4j/graphql/commit/81df28ed9238c1b4692aabe8e1de438ba01ae914)]: - - @neo4j/cypher-builder@0.1.10 +* Updated dependencies [[`81df28ed9`](https://github.com/neo4j/graphql/commit/81df28ed9238c1b4692aabe8e1de438ba01ae914)]: + * @neo4j/cypher-builder@0.1.10 ## 3.15.0 ### Minor Changes -- [#2359](https://github.com/neo4j/graphql/pull/2359) [`3fd44b3ef`](https://github.com/neo4j/graphql/commit/3fd44b3ef08d6eebec3cb1dd51111af8bf4e9fb2) Thanks [@farhadnowzari](https://github.com/farhadnowzari)! - - The `JwksEndpoint` in `Neo4jGraphQLAuthJWKSPlugin` now will accept a function as well which returns a computed endpoint. +* [#2359](https://github.com/neo4j/graphql/pull/2359) [`3fd44b3ef`](https://github.com/neo4j/graphql/commit/3fd44b3ef08d6eebec3cb1dd51111af8bf4e9fb2) Thanks [@farhadnowzari](https://github.com/farhadnowzari)! - - The `JwksEndpoint` in `Neo4jGraphQLAuthJWKSPlugin` now will accept a function as well which returns a computed endpoint. - - The `Secret` in `Neo4jGraphQLAuthJWTPlugin` now will accept a function as well which returns a computed secret. + * The `Secret` in `Neo4jGraphQLAuthJWTPlugin` now will accept a function as well which returns a computed secret. -- [#2588](https://github.com/neo4j/graphql/pull/2588) [`ef1822849`](https://github.com/neo4j/graphql/commit/ef182284930c8444c7205e2bc398ef17481e6279) Thanks [@a-alle](https://github.com/a-alle)! - Add `overwrite` argument on connect operation for relationships to standard types and arrays of +* [#2588](https://github.com/neo4j/graphql/pull/2588) [`ef1822849`](https://github.com/neo4j/graphql/commit/ef182284930c8444c7205e2bc398ef17481e6279) Thanks [@a-alle](https://github.com/a-alle)! - Add `overwrite` argument on connect operation for relationships to standard types and arrays of ### Patch Changes -- [#2715](https://github.com/neo4j/graphql/pull/2715) [`f17f6b5b0`](https://github.com/neo4j/graphql/commit/f17f6b5b0259d26cf207a340be027b6c20ec2b81) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: issue on generated Cypher with interface type (#2709) +* [#2715](https://github.com/neo4j/graphql/pull/2715) [`f17f6b5b0`](https://github.com/neo4j/graphql/commit/f17f6b5b0259d26cf207a340be027b6c20ec2b81) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: issue on generated Cypher with interface type (#2709) -- [#2760](https://github.com/neo4j/graphql/pull/2760) [`343845b26`](https://github.com/neo4j/graphql/commit/343845b26b577f0126dd3d7f2c070c5d0d1e3bf3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2713 - missing checks for connection not NONE when filtering by connection_ALL +* [#2760](https://github.com/neo4j/graphql/pull/2760) [`343845b26`](https://github.com/neo4j/graphql/commit/343845b26b577f0126dd3d7f2c070c5d0d1e3bf3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2713 - missing checks for connection not NONE when filtering by connection_ALL -- [#2760](https://github.com/neo4j/graphql/pull/2760) [`6a784dd1f`](https://github.com/neo4j/graphql/commit/6a784dd1ffbaa8c901e04b67f62590545bdd4f5d) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2708 - invalid cypher when using an aggregation filter within a relationship filter +* [#2760](https://github.com/neo4j/graphql/pull/2760) [`6a784dd1f`](https://github.com/neo4j/graphql/commit/6a784dd1ffbaa8c901e04b67f62590545bdd4f5d) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2708 - invalid cypher when using an aggregation filter within a relationship filter -- [#2760](https://github.com/neo4j/graphql/pull/2760) [`163cf903d`](https://github.com/neo4j/graphql/commit/163cf903d375222b8455733d7f6a45ae831dea25) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixes #2670 - invalid cypher when using an aggregation filter within a connection filter +* [#2760](https://github.com/neo4j/graphql/pull/2760) [`163cf903d`](https://github.com/neo4j/graphql/commit/163cf903d375222b8455733d7f6a45ae831dea25) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixes #2670 - invalid cypher when using an aggregation filter within a connection filter ## 3.14.2 ### Patch Changes -- [#2674](https://github.com/neo4j/graphql/pull/2674) [`785e99db7`](https://github.com/neo4j/graphql/commit/785e99db7c75276ea1380cbef68435fe02dc8049) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix aliased fields on aggregations filtering #2656 +* [#2674](https://github.com/neo4j/graphql/pull/2674) [`785e99db7`](https://github.com/neo4j/graphql/commit/785e99db7c75276ea1380cbef68435fe02dc8049) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix aliased fields on aggregations filtering #2656 -- [#2675](https://github.com/neo4j/graphql/pull/2675) [`6c38084c0`](https://github.com/neo4j/graphql/commit/6c38084c0f2513085babc6a71b5039adf4b5c7e2) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2675 - counting aggregation source not target +* [#2675](https://github.com/neo4j/graphql/pull/2675) [`6c38084c0`](https://github.com/neo4j/graphql/commit/6c38084c0f2513085babc6a71b5039adf4b5c7e2) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2675 - counting aggregation source not target -- [#2619](https://github.com/neo4j/graphql/pull/2619) [`788fe93ef`](https://github.com/neo4j/graphql/commit/788fe93ef4d52e8a4fd697ac7f134b0e523ea4de) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: resolvers input for Neo4jGraphQL class accepts a IResolvers array +* [#2619](https://github.com/neo4j/graphql/pull/2619) [`788fe93ef`](https://github.com/neo4j/graphql/commit/788fe93ef4d52e8a4fd697ac7f134b0e523ea4de) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: resolvers input for Neo4jGraphQL class accepts a IResolvers array -- [#2631](https://github.com/neo4j/graphql/pull/2631) [`ea1917a5a`](https://github.com/neo4j/graphql/commit/ea1917a5a751fe9df362e687cc1f4d9b353e588f) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: node directive label is not used in interface sub-query (bug report #2614) +* [#2631](https://github.com/neo4j/graphql/pull/2631) [`ea1917a5a`](https://github.com/neo4j/graphql/commit/ea1917a5a751fe9df362e687cc1f4d9b353e588f) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: node directive label is not used in interface sub-query (bug report #2614) -- [#2680](https://github.com/neo4j/graphql/pull/2680) [`1f8dee357`](https://github.com/neo4j/graphql/commit/1f8dee357296956c90968d79a5a3e0e9343fe2f9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix aggregation Cypher translation when aliasing relationship properties using the `@alias` directive +* [#2680](https://github.com/neo4j/graphql/pull/2680) [`1f8dee357`](https://github.com/neo4j/graphql/commit/1f8dee357296956c90968d79a5a3e0e9343fe2f9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix aggregation Cypher translation when aliasing relationship properties using the `@alias` directive -- [#2666](https://github.com/neo4j/graphql/pull/2666) [`f19ef34d7`](https://github.com/neo4j/graphql/commit/f19ef34d7908539fdba6bebc5b2a76fc09cf46c1) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2662 - missing `size()` call on string edge property aggregations when filtering by AVERAGE/LONGEST/SHORTEST. +* [#2666](https://github.com/neo4j/graphql/pull/2666) [`f19ef34d7`](https://github.com/neo4j/graphql/commit/f19ef34d7908539fdba6bebc5b2a76fc09cf46c1) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2662 - missing `size()` call on string edge property aggregations when filtering by AVERAGE/LONGEST/SHORTEST. -- [#2664](https://github.com/neo4j/graphql/pull/2664) [`3252f44d7`](https://github.com/neo4j/graphql/commit/3252f44d7d5453690f0aa0f35b9246a41ff5908b) Thanks [@a-alle](https://github.com/a-alle)! - Fix point types when subscriptions enabled +* [#2664](https://github.com/neo4j/graphql/pull/2664) [`3252f44d7`](https://github.com/neo4j/graphql/commit/3252f44d7d5453690f0aa0f35b9246a41ff5908b) Thanks [@a-alle](https://github.com/a-alle)! - Fix point types when subscriptions enabled -- Updated dependencies [[`ddf51ccfe`](https://github.com/neo4j/graphql/commit/ddf51ccfeec896b64ee943e910e59ac4e2f62869)]: - - @neo4j/cypher-builder@0.1.9 +* Updated dependencies [[`ddf51ccfe`](https://github.com/neo4j/graphql/commit/ddf51ccfeec896b64ee943e910e59ac4e2f62869)]: + * @neo4j/cypher-builder@0.1.9 ## 3.14.1 ### Patch Changes -- [#2516](https://github.com/neo4j/graphql/pull/2516) [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2388 - filtering on nested aggregation queries +* [#2516](https://github.com/neo4j/graphql/pull/2516) [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2388 - filtering on nested aggregation queries -- [#2576](https://github.com/neo4j/graphql/pull/2576) [`05280d0f1`](https://github.com/neo4j/graphql/commit/05280d0f16792e8e004c732ab039152d4dd32707) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Reverts #2492 which caused a regression when creating bi-directional Union relationships +* [#2576](https://github.com/neo4j/graphql/pull/2576) [`05280d0f1`](https://github.com/neo4j/graphql/commit/05280d0f16792e8e004c732ab039152d4dd32707) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Reverts #2492 which caused a regression when creating bi-directional Union relationships -- [#2578](https://github.com/neo4j/graphql/pull/2578) [`26d8a0045`](https://github.com/neo4j/graphql/commit/26d8a00453b03fa14328bcc2f5f4685e7b5e3ba3) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix sorting on multiple fields in the same object #2577 +* [#2578](https://github.com/neo4j/graphql/pull/2578) [`26d8a0045`](https://github.com/neo4j/graphql/commit/26d8a00453b03fa14328bcc2f5f4685e7b5e3ba3) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix sorting on multiple fields in the same object #2577 -- [#2580](https://github.com/neo4j/graphql/pull/2580) [`189352546`](https://github.com/neo4j/graphql/commit/18935254652240c1ad826c3c85a5be873c4dbd20) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix sorting by cypher fields when not in the selection set +* [#2580](https://github.com/neo4j/graphql/pull/2580) [`189352546`](https://github.com/neo4j/graphql/commit/18935254652240c1ad826c3c85a5be873c4dbd20) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix sorting by cypher fields when not in the selection set -- [#2564](https://github.com/neo4j/graphql/pull/2564) [`9243fb3af`](https://github.com/neo4j/graphql/commit/9243fb3afc0c04408bf78c1ba581856ccb0e51fc) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added checks for constraints on additional labels specified by the `@node` directive when running `assertIndexesAndConstraints`. +* [#2564](https://github.com/neo4j/graphql/pull/2564) [`9243fb3af`](https://github.com/neo4j/graphql/commit/9243fb3afc0c04408bf78c1ba581856ccb0e51fc) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added checks for constraints on additional labels specified by the `@node` directive when running `assertIndexesAndConstraints`. -- [#2516](https://github.com/neo4j/graphql/pull/2516) [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2520 - Transaction closed error when using multiple aggregation filters on update mutation +* [#2516](https://github.com/neo4j/graphql/pull/2516) [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed #2520 - Transaction closed error when using multiple aggregation filters on update mutation -- [#2516](https://github.com/neo4j/graphql/pull/2516) [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Performance improved by removing use of `apoc.runFirstColumn` from aggregation projections +* [#2516](https://github.com/neo4j/graphql/pull/2516) [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Performance improved by removing use of `apoc.runFirstColumn` from aggregation projections -- [#2516](https://github.com/neo4j/graphql/pull/2516) [`1b2913803`](https://github.com/neo4j/graphql/commit/1b2913803880bd1e8e1f1b7f79262ae20b1585e3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Performance increase by removing use of `apoc.runFirstColumn` from nested aggregate where filters +* [#2516](https://github.com/neo4j/graphql/pull/2516) [`1b2913803`](https://github.com/neo4j/graphql/commit/1b2913803880bd1e8e1f1b7f79262ae20b1585e3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Performance increase by removing use of `apoc.runFirstColumn` from nested aggregate where filters -- [#2587](https://github.com/neo4j/graphql/pull/2587) [`cd4f57a5d`](https://github.com/neo4j/graphql/commit/cd4f57a5ddc67660f7c41fd67e2006e68a8a0e1d) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid Cypher query on nested fields with `@cypher` directive using `columnName` #2581 +* [#2587](https://github.com/neo4j/graphql/pull/2587) [`cd4f57a5d`](https://github.com/neo4j/graphql/commit/cd4f57a5ddc67660f7c41fd67e2006e68a8a0e1d) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid Cypher query on nested fields with `@cypher` directive using `columnName` #2581 -- [#2580](https://github.com/neo4j/graphql/pull/2580) [`88d2cdfc1`](https://github.com/neo4j/graphql/commit/88d2cdfc1265f8a45c384872d32704bf452d36df) Thanks [@angrykoala](https://github.com/angrykoala)! - Improved performance on some connection pagination queries +* [#2580](https://github.com/neo4j/graphql/pull/2580) [`88d2cdfc1`](https://github.com/neo4j/graphql/commit/88d2cdfc1265f8a45c384872d32704bf452d36df) Thanks [@angrykoala](https://github.com/angrykoala)! - Improved performance on some connection pagination queries ## 3.14.0 ### Minor Changes -- [#2455](https://github.com/neo4j/graphql/pull/2455) [`9d9bea661`](https://github.com/neo4j/graphql/commit/9d9bea6611851dd3ae9912aa0eb29554ed2b0eb0) Thanks [@angrykoala](https://github.com/angrykoala)! - Add columnName argument to @cypher directive +* [#2455](https://github.com/neo4j/graphql/pull/2455) [`9d9bea661`](https://github.com/neo4j/graphql/commit/9d9bea6611851dd3ae9912aa0eb29554ed2b0eb0) Thanks [@angrykoala](https://github.com/angrykoala)! - Add columnName argument to @cypher directive -- [#2551](https://github.com/neo4j/graphql/pull/2551) [`652ebcdba`](https://github.com/neo4j/graphql/commit/652ebcdbadf71c3e55989672eb1064b52b32828e) Thanks [@angrykoala](https://github.com/angrykoala)! - Subscriptions stable release. - - [Documentation](https://neo4j.com/docs/graphql-manual/current/subscriptions/) - - [Examples](https://github.com/neo4j/graphql/tree/dev/examples/subscriptions) +* [#2551](https://github.com/neo4j/graphql/pull/2551) [`652ebcdba`](https://github.com/neo4j/graphql/commit/652ebcdbadf71c3e55989672eb1064b52b32828e) Thanks [@angrykoala](https://github.com/angrykoala)! - Subscriptions stable release. + * [Documentation](https://neo4j.com/docs/graphql-manual/current/subscriptions/) + * [Examples](https://github.com/neo4j/graphql/tree/dev/examples/subscriptions) ### Patch Changes -- Updated dependencies [[`2d2cb2e42`](https://github.com/neo4j/graphql/commit/2d2cb2e42dc0d495b944fa5a49abed8e4c0892e5)]: - - @neo4j/cypher-builder@0.1.8 +* Updated dependencies [[`2d2cb2e42`](https://github.com/neo4j/graphql/commit/2d2cb2e42dc0d495b944fa5a49abed8e4c0892e5)]: + * @neo4j/cypher-builder@0.1.8 ## 3.13.1 ### Patch Changes -- [#2515](https://github.com/neo4j/graphql/pull/2515) [`1bec3f95d`](https://github.com/neo4j/graphql/commit/1bec3f95d0f469c2a4e879b1904a4d1a4938207e) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Add `bindPredicate` which allows the predicate used to evaluate `bind` rules to be changed +* [#2515](https://github.com/neo4j/graphql/pull/2515) [`1bec3f95d`](https://github.com/neo4j/graphql/commit/1bec3f95d0f469c2a4e879b1904a4d1a4938207e) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Add `bindPredicate` which allows the predicate used to evaluate `bind` rules to be changed -- [#2503](https://github.com/neo4j/graphql/pull/2503) [`0d70b0704`](https://github.com/neo4j/graphql/commit/0d70b07049a0f4b2391240929aadc54f62eedc42) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Allow scalars to be passed as their native Neo4j values - this might apply to using with the OGM for example +* [#2503](https://github.com/neo4j/graphql/pull/2503) [`0d70b0704`](https://github.com/neo4j/graphql/commit/0d70b07049a0f4b2391240929aadc54f62eedc42) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Allow scalars to be passed as their native Neo4j values - this might apply to using with the OGM for example -- [#2472](https://github.com/neo4j/graphql/pull/2472) [`5d349e05c`](https://github.com/neo4j/graphql/commit/5d349e05c08ed655144b9919528ba66047f49443) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Removes use of runFirstColumn for top-level aggregation queries. +* [#2472](https://github.com/neo4j/graphql/pull/2472) [`5d349e05c`](https://github.com/neo4j/graphql/commit/5d349e05c08ed655144b9919528ba66047f49443) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Removes use of runFirstColumn for top-level aggregation queries. -- [#2501](https://github.com/neo4j/graphql/pull/2501) [`638f3205a`](https://github.com/neo4j/graphql/commit/638f3205ab3b20eb69a7bb33e6c11685d3e53a51) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fix bug during the create operation caused by defining a relational field name as "node" +* [#2501](https://github.com/neo4j/graphql/pull/2501) [`638f3205a`](https://github.com/neo4j/graphql/commit/638f3205ab3b20eb69a7bb33e6c11685d3e53a51) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fix bug during the create operation caused by defining a relational field name as "node" -- [#2492](https://github.com/neo4j/graphql/pull/2492) [`2710165e0`](https://github.com/neo4j/graphql/commit/2710165e0bfd200a8755e1b94f363ee17258fcac) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Ensure that union create input is non-nullable for required relationships +* [#2492](https://github.com/neo4j/graphql/pull/2492) [`2710165e0`](https://github.com/neo4j/graphql/commit/2710165e0bfd200a8755e1b94f363ee17258fcac) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Ensure that union create input is non-nullable for required relationships -- Updated dependencies [[`c8c2d2d4d`](https://github.com/neo4j/graphql/commit/c8c2d2d4d4897adfd1afcd666bf9f46263dfab1f)]: - - @neo4j/cypher-builder@0.1.7 +* Updated dependencies [[`c8c2d2d4d`](https://github.com/neo4j/graphql/commit/c8c2d2d4d4897adfd1afcd666bf9f46263dfab1f)]: + * @neo4j/cypher-builder@0.1.7 ## 3.13.0 ### Minor Changes -- [#2456](https://github.com/neo4j/graphql/pull/2456) [`b981c45f7`](https://github.com/neo4j/graphql/commit/b981c45f76753557c18b1152ad62f258d2bee7f7) Thanks [@a-alle](https://github.com/a-alle)! - Adds support for subscriptions events for connect and disconnect +* [#2456](https://github.com/neo4j/graphql/pull/2456) [`b981c45f7`](https://github.com/neo4j/graphql/commit/b981c45f76753557c18b1152ad62f258d2bee7f7) Thanks [@a-alle](https://github.com/a-alle)! - Adds support for subscriptions events for connect and disconnect -- [#2383](https://github.com/neo4j/graphql/pull/2383) [`20aa9c05b`](https://github.com/neo4j/graphql/commit/20aa9c05be4c780493d536bc98335fb88d857b6a) Thanks [@a-alle](https://github.com/a-alle)! - Adds filtering on connect and disconnect subscriptions events +* [#2383](https://github.com/neo4j/graphql/pull/2383) [`20aa9c05b`](https://github.com/neo4j/graphql/commit/20aa9c05be4c780493d536bc98335fb88d857b6a) Thanks [@a-alle](https://github.com/a-alle)! - Adds filtering on connect and disconnect subscriptions events ### Patch Changes -- [#2406](https://github.com/neo4j/graphql/pull/2406) [`12ec721e6`](https://github.com/neo4j/graphql/commit/12ec721e66f7ce570b31be3341c625a48bda304f) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Bulk-create performance improvements for protected nodes and fields. +* [#2406](https://github.com/neo4j/graphql/pull/2406) [`12ec721e6`](https://github.com/neo4j/graphql/commit/12ec721e66f7ce570b31be3341c625a48bda304f) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Bulk-create performance improvements for protected nodes and fields. -- [#2488](https://github.com/neo4j/graphql/pull/2488) [`c06ac56ae`](https://github.com/neo4j/graphql/commit/c06ac56ae84360dc19bccd4545334c8c65b1c768) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix cursor based pagination over connection fields +* [#2488](https://github.com/neo4j/graphql/pull/2488) [`c06ac56ae`](https://github.com/neo4j/graphql/commit/c06ac56ae84360dc19bccd4545334c8c65b1c768) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix cursor based pagination over connection fields -- [#2438](https://github.com/neo4j/graphql/pull/2438) [`e220f36e0`](https://github.com/neo4j/graphql/commit/e220f36e07bb27aeb5c787e7ebf5b09e7fba2afc) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested delete attempting to delete same node multiple times +* [#2438](https://github.com/neo4j/graphql/pull/2438) [`e220f36e0`](https://github.com/neo4j/graphql/commit/e220f36e07bb27aeb5c787e7ebf5b09e7fba2afc) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested delete attempting to delete same node multiple times -- [#2476](https://github.com/neo4j/graphql/pull/2476) [`b624c7ace`](https://github.com/neo4j/graphql/commit/b624c7aced55493f9df1abcaca91b139713f4186) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove additional SKIP and LIMIT from Cypher which was causing excessive skipping +* [#2476](https://github.com/neo4j/graphql/pull/2476) [`b624c7ace`](https://github.com/neo4j/graphql/commit/b624c7aced55493f9df1abcaca91b139713f4186) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove additional SKIP and LIMIT from Cypher which was causing excessive skipping -- Updated dependencies [[`150b64c04`](https://github.com/neo4j/graphql/commit/150b64c046dd511d29436b33d67770aed6217c8f)]: - - @neo4j/cypher-builder@0.1.6 +* Updated dependencies [[`150b64c04`](https://github.com/neo4j/graphql/commit/150b64c046dd511d29436b33d67770aed6217c8f)]: + * @neo4j/cypher-builder@0.1.6 ## 3.12.2 ### Patch Changes -- [#2431](https://github.com/neo4j/graphql/pull/2431) [`82846ef0a`](https://github.com/neo4j/graphql/commit/82846ef0a5ac0c778d295970405626bed829cff3) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - remove dependency from crypto +* [#2431](https://github.com/neo4j/graphql/pull/2431) [`82846ef0a`](https://github.com/neo4j/graphql/commit/82846ef0a5ac0c778d295970405626bed829cff3) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - remove dependency from crypto -- Updated dependencies [[`e23691152`](https://github.com/neo4j/graphql/commit/e23691152db927d03891c592a716ca41e58d5f47), [`4c79ec3cf`](https://github.com/neo4j/graphql/commit/4c79ec3cf29ea7f0cd0e5fc18f98e65c221af8e5)]: - - @neo4j/cypher-builder@0.1.5 +* Updated dependencies [[`e23691152`](https://github.com/neo4j/graphql/commit/e23691152db927d03891c592a716ca41e58d5f47), [`4c79ec3cf`](https://github.com/neo4j/graphql/commit/4c79ec3cf29ea7f0cd0e5fc18f98e65c221af8e5)]: + * @neo4j/cypher-builder@0.1.5 ## 3.12.1 ### Patch Changes -- [#2370](https://github.com/neo4j/graphql/pull/2370) [`d71ddb54d`](https://github.com/neo4j/graphql/commit/d71ddb54d811e280357bd37270b9f5cae0c600aa) Thanks [@angrykoala](https://github.com/angrykoala)! - Speeds up schema generation in getSchema +* [#2370](https://github.com/neo4j/graphql/pull/2370) [`d71ddb54d`](https://github.com/neo4j/graphql/commit/d71ddb54d811e280357bd37270b9f5cae0c600aa) Thanks [@angrykoala](https://github.com/angrykoala)! - Speeds up schema generation in getSchema -- [#2338](https://github.com/neo4j/graphql/pull/2338) [`35bbf3197`](https://github.com/neo4j/graphql/commit/35bbf3197ecd3ad576567189242036ac3ee07b57) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Alias subquery return in UNWIND CREATE +* [#2338](https://github.com/neo4j/graphql/pull/2338) [`35bbf3197`](https://github.com/neo4j/graphql/commit/35bbf3197ecd3ad576567189242036ac3ee07b57) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Alias subquery return in UNWIND CREATE -- [#2407](https://github.com/neo4j/graphql/pull/2407) [`f2a56c738`](https://github.com/neo4j/graphql/commit/f2a56c73854c60144ec2809b855cd52eb1288a43) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Included enum in OnCreateInput types +* [#2407](https://github.com/neo4j/graphql/pull/2407) [`f2a56c738`](https://github.com/neo4j/graphql/commit/f2a56c73854c60144ec2809b855cd52eb1288a43) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Included enum in OnCreateInput types -- [#2390](https://github.com/neo4j/graphql/pull/2390) [`d04699b50`](https://github.com/neo4j/graphql/commit/d04699b50f0dd50984ab6688743f4fe027d797a0) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Allow SortDirection to be used in input type definitions +* [#2390](https://github.com/neo4j/graphql/pull/2390) [`d04699b50`](https://github.com/neo4j/graphql/commit/d04699b50f0dd50984ab6688743f4fe027d797a0) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Allow SortDirection to be used in input type definitions -- [#2339](https://github.com/neo4j/graphql/pull/2339) [`27dd34de7`](https://github.com/neo4j/graphql/commit/27dd34de7815824afa490667ce2484f017c823a3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added deprecation warnings to old full-text inputs. +* [#2339](https://github.com/neo4j/graphql/pull/2339) [`27dd34de7`](https://github.com/neo4j/graphql/commit/27dd34de7815824afa490667ce2484f017c823a3) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added deprecation warnings to old full-text inputs. -- [#2360](https://github.com/neo4j/graphql/pull/2360) [`f2799750a`](https://github.com/neo4j/graphql/commit/f2799750a0a1aeaecaf9ead5295483e5205ada62) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fix deprecation directives carried on to generated fields and inputs +* [#2360](https://github.com/neo4j/graphql/pull/2360) [`f2799750a`](https://github.com/neo4j/graphql/commit/f2799750a0a1aeaecaf9ead5295483e5205ada62) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fix deprecation directives carried on to generated fields and inputs -- [#2371](https://github.com/neo4j/graphql/pull/2371) [`9d0859b59`](https://github.com/neo4j/graphql/commit/9d0859b596be29d0e64f6531e2bf0c17325b9a34) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove redundant adding of resolvers to schema to improve performance +* [#2371](https://github.com/neo4j/graphql/pull/2371) [`9d0859b59`](https://github.com/neo4j/graphql/commit/9d0859b596be29d0e64f6531e2bf0c17325b9a34) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove redundant adding of resolvers to schema to improve performance -- Updated dependencies [[`94b6cea4f`](https://github.com/neo4j/graphql/commit/94b6cea4f26b90523fed59d0b22cbac25461a71c)]: - - @neo4j/cypher-builder@0.1.4 +* Updated dependencies [[`94b6cea4f`](https://github.com/neo4j/graphql/commit/94b6cea4f26b90523fed59d0b22cbac25461a71c)]: + * @neo4j/cypher-builder@0.1.4 ## 3.12.0 ### Minor Changes -- [#2286](https://github.com/neo4j/graphql/pull/2286) [`8642d3d67`](https://github.com/neo4j/graphql/commit/8642d3d67882cda2a0e212bdcf4b56376d419509) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Created a new top-level query for full-text indexes. Added the full-text score to the results of this new query and made it possible to filter, sort and paginate the results. Deprecated existing full-text queries. +* [#2286](https://github.com/neo4j/graphql/pull/2286) [`8642d3d67`](https://github.com/neo4j/graphql/commit/8642d3d67882cda2a0e212bdcf4b56376d419509) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Created a new top-level query for full-text indexes. Added the full-text score to the results of this new query and made it possible to filter, sort and paginate the results. Deprecated existing full-text queries. -- [#2115](https://github.com/neo4j/graphql/pull/2115) [`3b06cafbc`](https://github.com/neo4j/graphql/commit/3b06cafbc9f8ac6bfe43997bdd8e9db784b3907b) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Optimized batch creation, when possible, to improve performance when a large numbers of nodes are created in single mutation +* [#2115](https://github.com/neo4j/graphql/pull/2115) [`3b06cafbc`](https://github.com/neo4j/graphql/commit/3b06cafbc9f8ac6bfe43997bdd8e9db784b3907b) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Optimized batch creation, when possible, to improve performance when a large numbers of nodes are created in single mutation ### Patch Changes -- [#2281](https://github.com/neo4j/graphql/pull/2281) [`0faef6f33`](https://github.com/neo4j/graphql/commit/0faef6f3330d70126817f6496556f5ad85611ad9) Thanks [@angrykoala](https://github.com/angrykoala)! - Add reconnect option in AMQP subscriptions plugin +* [#2281](https://github.com/neo4j/graphql/pull/2281) [`0faef6f33`](https://github.com/neo4j/graphql/commit/0faef6f3330d70126817f6496556f5ad85611ad9) Thanks [@angrykoala](https://github.com/angrykoala)! - Add reconnect option in AMQP subscriptions plugin -- Updated dependencies [[`7aff0cf19`](https://github.com/neo4j/graphql/commit/7aff0cf194010c8268024917abec931d9ba2c359)]: - - @neo4j/cypher-builder@0.1.3 +* Updated dependencies [[`7aff0cf19`](https://github.com/neo4j/graphql/commit/7aff0cf194010c8268024917abec931d9ba2c359)]: + * @neo4j/cypher-builder@0.1.3 ## 3.11.1 ### Patch Changes -- [#2304](https://github.com/neo4j/graphql/pull/2304) [`2c6d986a1`](https://github.com/neo4j/graphql/commit/2c6d986a19061fd8bc7739a2dd4737e7828e20d0) Thanks [@angrykoala](https://github.com/angrykoala)! - Use @neo4j/cypher-builder for cypher generation +* [#2304](https://github.com/neo4j/graphql/pull/2304) [`2c6d986a1`](https://github.com/neo4j/graphql/commit/2c6d986a19061fd8bc7739a2dd4737e7828e20d0) Thanks [@angrykoala](https://github.com/angrykoala)! - Use @neo4j/cypher-builder for cypher generation -- Updated dependencies [[`42771f950`](https://github.com/neo4j/graphql/commit/42771f950badfc33e8babf07f85931ebd6018749)]: - - @neo4j/cypher-builder@0.1.2 +* Updated dependencies [[`42771f950`](https://github.com/neo4j/graphql/commit/42771f950badfc33e8babf07f85931ebd6018749)]: + * @neo4j/cypher-builder@0.1.2 ## 3.11.0 ### Minor Changes -- [#2220](https://github.com/neo4j/graphql/pull/2220) [`44fc500eb`](https://github.com/neo4j/graphql/commit/44fc500ebbaff3f8cdfcc676bd2ef8cad2fd58ec) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added the `@plural` directive and depreacted the `plural` argument of the `@node` directive. +* [#2220](https://github.com/neo4j/graphql/pull/2220) [`44fc500eb`](https://github.com/neo4j/graphql/commit/44fc500ebbaff3f8cdfcc676bd2ef8cad2fd58ec) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added the `@plural` directive and depreacted the `plural` argument of the `@node` directive. -- [#2225](https://github.com/neo4j/graphql/pull/2225) [`b37376e38`](https://github.com/neo4j/graphql/commit/b37376e38e13ab2ed6f0e0eeb99f2d9f17161fd7) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added the `@customResolver` directive and deprecated the `@computed` directive. +* [#2225](https://github.com/neo4j/graphql/pull/2225) [`b37376e38`](https://github.com/neo4j/graphql/commit/b37376e38e13ab2ed6f0e0eeb99f2d9f17161fd7) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added the `@customResolver` directive and deprecated the `@computed` directive. -- [#2232](https://github.com/neo4j/graphql/pull/2232) [`94512c90e`](https://github.com/neo4j/graphql/commit/94512c90e5e37601a4d260f1153ac043639ceb6f) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added checks for custom resolvers for fields with the `@customResolver` directive. +* [#2232](https://github.com/neo4j/graphql/pull/2232) [`94512c90e`](https://github.com/neo4j/graphql/commit/94512c90e5e37601a4d260f1153ac043639ceb6f) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added checks for custom resolvers for fields with the `@customResolver` directive. -- [#2214](https://github.com/neo4j/graphql/pull/2214) [`4ee4d40ad`](https://github.com/neo4j/graphql/commit/4ee4d40ad5aca514ddc08091b2501bfa699294e9) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added the `@populatedBy` directive to replace the `@callback` directive and deprecated the `@callback` directive. +* [#2214](https://github.com/neo4j/graphql/pull/2214) [`4ee4d40ad`](https://github.com/neo4j/graphql/commit/4ee4d40ad5aca514ddc08091b2501bfa699294e9) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added the `@populatedBy` directive to replace the `@callback` directive and deprecated the `@callback` directive. ### Patch Changes -- [#2268](https://github.com/neo4j/graphql/pull/2268) [`8eff620b9`](https://github.com/neo4j/graphql/commit/8eff620b93d86d544d4594b69c5058a9092347c0) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid nested results on sorted connections without edges #2262 +* [#2268](https://github.com/neo4j/graphql/pull/2268) [`8eff620b9`](https://github.com/neo4j/graphql/commit/8eff620b93d86d544d4594b69c5058a9092347c0) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid nested results on sorted connections without edges #2262 -- [#2200](https://github.com/neo4j/graphql/pull/2200) [`c769933cb`](https://github.com/neo4j/graphql/commit/c769933cba76d16c4f14b2c18aaf5c47415b05d9) Thanks [@a-alle](https://github.com/a-alle)! - Throw an error when the same db property is being modified at once +* [#2200](https://github.com/neo4j/graphql/pull/2200) [`c769933cb`](https://github.com/neo4j/graphql/commit/c769933cba76d16c4f14b2c18aaf5c47415b05d9) Thanks [@a-alle](https://github.com/a-alle)! - Throw an error when the same db property is being modified at once -- [#2260](https://github.com/neo4j/graphql/pull/2260) [`5ce80724f`](https://github.com/neo4j/graphql/commit/5ce80724f4d45a38e5d4b5d0d369384a4599d51f) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid Cypher on nested update operations with interfaces +* [#2260](https://github.com/neo4j/graphql/pull/2260) [`5ce80724f`](https://github.com/neo4j/graphql/commit/5ce80724f4d45a38e5d4b5d0d369384a4599d51f) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid Cypher on nested update operations with interfaces -- [#2252](https://github.com/neo4j/graphql/pull/2252) [`2c8f3ec37`](https://github.com/neo4j/graphql/commit/2c8f3ec37ce57f281972ddc107a9490392c482df) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested update with subscriptions invalid Cypher +* [#2252](https://github.com/neo4j/graphql/pull/2252) [`2c8f3ec37`](https://github.com/neo4j/graphql/commit/2c8f3ec37ce57f281972ddc107a9490392c482df) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested update with subscriptions invalid Cypher -- [#2274](https://github.com/neo4j/graphql/pull/2274) [`74e6fee11`](https://github.com/neo4j/graphql/commit/74e6fee119c8f0c7d30384422e722754411135b9) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix ordering with nested interface fields #2267 +* [#2274](https://github.com/neo4j/graphql/pull/2274) [`74e6fee11`](https://github.com/neo4j/graphql/commit/74e6fee119c8f0c7d30384422e722754411135b9) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix ordering with nested interface fields #2267 -- [#2266](https://github.com/neo4j/graphql/pull/2266) [`e7bcf4f0b`](https://github.com/neo4j/graphql/commit/e7bcf4f0b69a75c10e0ee0a604fd35cab09fcfaf) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix error of queries with mixed nested fields and cypher elements #2261 +* [#2266](https://github.com/neo4j/graphql/pull/2266) [`e7bcf4f0b`](https://github.com/neo4j/graphql/commit/e7bcf4f0b69a75c10e0ee0a604fd35cab09fcfaf) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix error of queries with mixed nested fields and cypher elements #2261 ## 3.10.1 ### Patch Changes -- [#2207](https://github.com/neo4j/graphql/pull/2207) [`23467c469`](https://github.com/neo4j/graphql/commit/23467c4699287c9d33c0a1004db83ddb9e7e606a) Thanks [@angrykoala](https://github.com/angrykoala)! - Use lastBookmark instead of lastBookmarks to keep compatibility of neo4j-driver 4 in tests +* [#2207](https://github.com/neo4j/graphql/pull/2207) [`23467c469`](https://github.com/neo4j/graphql/commit/23467c4699287c9d33c0a1004db83ddb9e7e606a) Thanks [@angrykoala](https://github.com/angrykoala)! - Use lastBookmark instead of lastBookmarks to keep compatibility of neo4j-driver 4 in tests ## 3.10.0 ### Minor Changes -- [#2175](https://github.com/neo4j/graphql/pull/2175) [`7b8a73cbd`](https://github.com/neo4j/graphql/commit/7b8a73cbd3e6accaaa7d64daa35f25941a7022c1) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added extra where fields for custom scalars. For lists of custom scalars \_NOT, \_INCLUDES and \_NOT_INCLUDES are now supported. For a single value custom scalars \_NOT, \_IN and \_NOT_IN are now supported. +* [#2175](https://github.com/neo4j/graphql/pull/2175) [`7b8a73cbd`](https://github.com/neo4j/graphql/commit/7b8a73cbd3e6accaaa7d64daa35f25941a7022c1) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Added extra where fields for custom scalars. For lists of custom scalars \_NOT, \_INCLUDES and \_NOT_INCLUDES are now supported. For a single value custom scalars \_NOT, \_IN and \_NOT_IN are now supported. ### Patch Changes -- [#2183](https://github.com/neo4j/graphql/pull/2183) [`64b3d0777`](https://github.com/neo4j/graphql/commit/64b3d07776685400313603f57e274ad8e821968b) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix invalid auth clauses for operations other than CONNECT or CREATE in `connectOrCreate` +* [#2183](https://github.com/neo4j/graphql/pull/2183) [`64b3d0777`](https://github.com/neo4j/graphql/commit/64b3d07776685400313603f57e274ad8e821968b) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Fix invalid auth clauses for operations other than CONNECT or CREATE in `connectOrCreate` -- [#2190](https://github.com/neo4j/graphql/pull/2190) [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix union types on custom cypher directives +* [#2190](https://github.com/neo4j/graphql/pull/2190) [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix union types on custom cypher directives -- [#2190](https://github.com/neo4j/graphql/pull/2190) [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid WHERE clause after WITH in a CALL subquery +* [#2190](https://github.com/neo4j/graphql/pull/2190) [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix invalid WHERE clause after WITH in a CALL subquery -- [#2180](https://github.com/neo4j/graphql/pull/2180) [`5a748dc32`](https://github.com/neo4j/graphql/commit/5a748dc326ff063a8d8db6c281d681a68b679ade) Thanks [@a-alle](https://github.com/a-alle)! - Fix sort priority order between edge and node sort fields in the same query +* [#2180](https://github.com/neo4j/graphql/pull/2180) [`5a748dc32`](https://github.com/neo4j/graphql/commit/5a748dc326ff063a8d8db6c281d681a68b679ade) Thanks [@a-alle](https://github.com/a-alle)! - Fix sort priority order between edge and node sort fields in the same query -- [#2196](https://github.com/neo4j/graphql/pull/2196) [`c4ced43c0`](https://github.com/neo4j/graphql/commit/c4ced43c01cdd0d86d60a68906c3e79d847c5394) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix #2189: `@cypher` directive forcefuly omits empty fields +* [#2196](https://github.com/neo4j/graphql/pull/2196) [`c4ced43c0`](https://github.com/neo4j/graphql/commit/c4ced43c01cdd0d86d60a68906c3e79d847c5394) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix #2189: `@cypher` directive forcefuly omits empty fields ## 3.9.0 ### Minor Changes -- [#2099](https://github.com/neo4j/graphql/pull/2099) [`0c89c88ae`](https://github.com/neo4j/graphql/commit/0c89c88ae25bb6c06edac4adff43b47802f45ea1) Thanks [@a-alle](https://github.com/a-alle)! - Allows combining filters with AND/OR when subscribing to events. +* [#2099](https://github.com/neo4j/graphql/pull/2099) [`0c89c88ae`](https://github.com/neo4j/graphql/commit/0c89c88ae25bb6c06edac4adff43b47802f45ea1) Thanks [@a-alle](https://github.com/a-alle)! - Allows combining filters with AND/OR when subscribing to events. -- [#2025](https://github.com/neo4j/graphql/pull/2025) [`fb1e2c93f`](https://github.com/neo4j/graphql/commit/fb1e2c93f41adeaa61cc458f20a5812472ed3e2c) Thanks [@a-alle](https://github.com/a-alle)! - Add support for @exclude directive on subscription operations +* [#2025](https://github.com/neo4j/graphql/pull/2025) [`fb1e2c93f`](https://github.com/neo4j/graphql/commit/fb1e2c93f41adeaa61cc458f20a5812472ed3e2c) Thanks [@a-alle](https://github.com/a-alle)! - Add support for @exclude directive on subscription operations ### Patch Changes -- [#2105](https://github.com/neo4j/graphql/pull/2105) [`28742a5bd`](https://github.com/neo4j/graphql/commit/28742a5bd77b21497300248d18ff23206e1ec66f) Thanks [@a-alle](https://github.com/a-alle)! - Fix on `@cypher` directive fields in connections +* [#2105](https://github.com/neo4j/graphql/pull/2105) [`28742a5bd`](https://github.com/neo4j/graphql/commit/28742a5bd77b21497300248d18ff23206e1ec66f) Thanks [@a-alle](https://github.com/a-alle)! - Fix on `@cypher` directive fields in connections ## 3.8.0 ### Minor Changes -- [#2081](https://github.com/neo4j/graphql/pull/2081) [`e978b185f`](https://github.com/neo4j/graphql/commit/e978b185f1d0fe4ec7bd75ecbaa03a5216105a14) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Allow `@fulltext` directive to specify `ID` fields +* [#2081](https://github.com/neo4j/graphql/pull/2081) [`e978b185f`](https://github.com/neo4j/graphql/commit/e978b185f1d0fe4ec7bd75ecbaa03a5216105a14) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Allow `@fulltext` directive to specify `ID` fields -- [#1972](https://github.com/neo4j/graphql/pull/1972) [`a965bd861`](https://github.com/neo4j/graphql/commit/a965bd861bef0fab93480705ac4f011f1f6c534f) Thanks [@a-alle](https://github.com/a-alle)! - Add more filtering options on subscriptions +* [#1972](https://github.com/neo4j/graphql/pull/1972) [`a965bd861`](https://github.com/neo4j/graphql/commit/a965bd861bef0fab93480705ac4f011f1f6c534f) Thanks [@a-alle](https://github.com/a-alle)! - Add more filtering options on subscriptions -- [#1822](https://github.com/neo4j/graphql/pull/1822) [`1d90a5252`](https://github.com/neo4j/graphql/commit/1d90a5252abf724fc91b92fe3a86ee69c0ab26bb) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Adds database version detection so that Cypher can be generated in a dynamic manner. Uses this new logic to switch between `point.distance()` and `distance()` as needed. This PR also switches over to use the Cypher index management API. +* [#1822](https://github.com/neo4j/graphql/pull/1822) [`1d90a5252`](https://github.com/neo4j/graphql/commit/1d90a5252abf724fc91b92fe3a86ee69c0ab26bb) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Adds database version detection so that Cypher can be generated in a dynamic manner. Uses this new logic to switch between `point.distance()` and `distance()` as needed. This PR also switches over to use the Cypher index management API. ### Patch Changes -- [#1986](https://github.com/neo4j/graphql/pull/1986) [`f958503e0`](https://github.com/neo4j/graphql/commit/f958503e059fcfabc46628fd651914e08d29b998) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Sum aggregate on where unexpected behaviour (#1933) +* [#1986](https://github.com/neo4j/graphql/pull/1986) [`f958503e0`](https://github.com/neo4j/graphql/commit/f958503e059fcfabc46628fd651914e08d29b998) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Sum aggregate on where unexpected behaviour (#1933) -- [#2053](https://github.com/neo4j/graphql/pull/2053) [`2abb6036f`](https://github.com/neo4j/graphql/commit/2abb6036f267ba0c1310f36e3a7882948800ae05) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.cypher.runFirstColumnSingle from connections projections +* [#2053](https://github.com/neo4j/graphql/pull/2053) [`2abb6036f`](https://github.com/neo4j/graphql/commit/2abb6036f267ba0c1310f36e3a7882948800ae05) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.cypher.runFirstColumnSingle from connections projections -- [#2023](https://github.com/neo4j/graphql/pull/2023) [`a037e34a9`](https://github.com/neo4j/graphql/commit/a037e34a9bb1f8eff07992e0d08b9c0fbf5f5a11) Thanks [@litewarp](https://github.com/litewarp)! - fix: nested relation error with interface query +* [#2023](https://github.com/neo4j/graphql/pull/2023) [`a037e34a9`](https://github.com/neo4j/graphql/commit/a037e34a9bb1f8eff07992e0d08b9c0fbf5f5a11) Thanks [@litewarp](https://github.com/litewarp)! - fix: nested relation error with interface query -- [#2009](https://github.com/neo4j/graphql/pull/2009) [`8260fb845`](https://github.com/neo4j/graphql/commit/8260fb845aced51dbf90425870b766210c96a22c) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested interface projections +* [#2009](https://github.com/neo4j/graphql/pull/2009) [`8260fb845`](https://github.com/neo4j/graphql/commit/8260fb845aced51dbf90425870b766210c96a22c) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested interface projections -- [#2065](https://github.com/neo4j/graphql/pull/2065) [`99a7f707a`](https://github.com/neo4j/graphql/commit/99a7f707ad4afd2ef1613e8218de713836d165f3) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: multiple nodes created if following connection of multiple interface relationships +* [#2065](https://github.com/neo4j/graphql/pull/2065) [`99a7f707a`](https://github.com/neo4j/graphql/commit/99a7f707ad4afd2ef1613e8218de713836d165f3) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: multiple nodes created if following connection of multiple interface relationships -- [#2014](https://github.com/neo4j/graphql/pull/2014) [`66c040179`](https://github.com/neo4j/graphql/commit/66c0401791e9fc0182a2e5c271bff11bd05f5fef) Thanks [@mjfwebb](https://github.com/mjfwebb)! - refactor: fix linting errors and add types +* [#2014](https://github.com/neo4j/graphql/pull/2014) [`66c040179`](https://github.com/neo4j/graphql/commit/66c0401791e9fc0182a2e5c271bff11bd05f5fef) Thanks [@mjfwebb](https://github.com/mjfwebb)! - refactor: fix linting errors and add types -- [#2002](https://github.com/neo4j/graphql/pull/2002) [`1ceb09860`](https://github.com/neo4j/graphql/commit/1ceb09860e256ea5f7bebe4797c31045d3ca9ece) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Remove "Math.floor(Math.random() \* Math.random())" from integration tests +* [#2002](https://github.com/neo4j/graphql/pull/2002) [`1ceb09860`](https://github.com/neo4j/graphql/commit/1ceb09860e256ea5f7bebe4797c31045d3ca9ece) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Remove "Math.floor(Math.random() \* Math.random())" from integration tests -- [#2062](https://github.com/neo4j/graphql/pull/2062) [`972a06c83`](https://github.com/neo4j/graphql/commit/972a06c83db82bbef49c56f861d07ff688b99cb5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: there will no longer be a Cypher syntax error when selecting interface relationship fields following the creation of multiple nodes +* [#2062](https://github.com/neo4j/graphql/pull/2062) [`972a06c83`](https://github.com/neo4j/graphql/commit/972a06c83db82bbef49c56f861d07ff688b99cb5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: there will no longer be a Cypher syntax error when selecting interface relationship fields following the creation of multiple nodes ## 3.7.0 ### Minor Changes -- [#1925](https://github.com/neo4j/graphql/pull/1925) [`1c589e246`](https://github.com/neo4j/graphql/commit/1c589e246f0ce9ffe82c5e7612deb4e7bac7c6e1) Thanks [@tbwiss](https://github.com/tbwiss)! - feat: Adding the functionality to enable global authentication via a setting in the Auth plugin +* [#1925](https://github.com/neo4j/graphql/pull/1925) [`1c589e246`](https://github.com/neo4j/graphql/commit/1c589e246f0ce9ffe82c5e7612deb4e7bac7c6e1) Thanks [@tbwiss](https://github.com/tbwiss)! - feat: Adding the functionality to enable global authentication via a setting in the Auth plugin ### Patch Changes -- [#1918](https://github.com/neo4j/graphql/pull/1918) [`957da9430`](https://github.com/neo4j/graphql/commit/957da943008508b43e996efea0c7fa0fe7c08495) Thanks [@angrykoala](https://github.com/angrykoala)! - Refactor Cypher projections on relationships to subqueries +* [#1918](https://github.com/neo4j/graphql/pull/1918) [`957da9430`](https://github.com/neo4j/graphql/commit/957da943008508b43e996efea0c7fa0fe7c08495) Thanks [@angrykoala](https://github.com/angrykoala)! - Refactor Cypher projections on relationships to subqueries -* [#1968](https://github.com/neo4j/graphql/pull/1968) [`4e6a38799`](https://github.com/neo4j/graphql/commit/4e6a38799a470bc9846b3800e3abbdd508a88e38) Thanks [@angrykoala](https://github.com/angrykoala)! - Unpin peer dependencies to support a wider range of versions +* [#1968](https://github.com/neo4j/graphql/pull/1968) [`4e6a38799`](https://github.com/neo4j/graphql/commit/4e6a38799a470bc9846b3800e3abbdd508a88e38) Thanks [@angrykoala](https://github.com/angrykoala)! - Unpin peer dependencies to support a wider range of versions -- [#1954](https://github.com/neo4j/graphql/pull/1954) [`31c287458`](https://github.com/neo4j/graphql/commit/31c2874588842501636fd754fe18bbc648e4e849) Thanks [@angrykoala](https://github.com/angrykoala)! - Performance improvement on \_SINGLE operations +* [#1954](https://github.com/neo4j/graphql/pull/1954) [`31c287458`](https://github.com/neo4j/graphql/commit/31c2874588842501636fd754fe18bbc648e4e849) Thanks [@angrykoala](https://github.com/angrykoala)! - Performance improvement on \_SINGLE operations -* [#1939](https://github.com/neo4j/graphql/pull/1939) [`37a77f97c`](https://github.com/neo4j/graphql/commit/37a77f97cab35edf2ab0a09cb49800564ac99e6f) Thanks [@angrykoala](https://github.com/angrykoala)! - Performance improvement in nested relationship operations \_SOME, \_ALL and \_NONE +* [#1939](https://github.com/neo4j/graphql/pull/1939) [`37a77f97c`](https://github.com/neo4j/graphql/commit/37a77f97cab35edf2ab0a09cb49800564ac99e6f) Thanks [@angrykoala](https://github.com/angrykoala)! - Performance improvement in nested relationship operations \_SOME, \_ALL and \_NONE -- [#1934](https://github.com/neo4j/graphql/pull/1934) [`8b6d0990b`](https://github.com/neo4j/graphql/commit/8b6d0990b04a985e06d9b9f880ddd86b75cd00d5) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.coll.sortMulti +* [#1934](https://github.com/neo4j/graphql/pull/1934) [`8b6d0990b`](https://github.com/neo4j/graphql/commit/8b6d0990b04a985e06d9b9f880ddd86b75cd00d5) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.coll.sortMulti -* [#1955](https://github.com/neo4j/graphql/pull/1955) [`5955a6a36`](https://github.com/neo4j/graphql/commit/5955a6a363b0490916ca2765e457b01be751ad20) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix label injection through unicode +* [#1955](https://github.com/neo4j/graphql/pull/1955) [`5955a6a36`](https://github.com/neo4j/graphql/commit/5955a6a363b0490916ca2765e457b01be751ad20) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix label injection through unicode ## 3.6.3 ### Patch Changes -- [#1842](https://github.com/neo4j/graphql/pull/1842) [`037856af`](https://github.com/neo4j/graphql/commit/037856afc74e9739707cb5a92cb830edc24a43b1) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fix bug where callback fields were not included in the onCreate input type. +* [#1842](https://github.com/neo4j/graphql/pull/1842) [`037856af`](https://github.com/neo4j/graphql/commit/037856afc74e9739707cb5a92cb830edc24a43b1) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Fix bug where callback fields were not included in the onCreate input type. -* [#1919](https://github.com/neo4j/graphql/pull/1919) [`7e90ecfe`](https://github.com/neo4j/graphql/commit/7e90ecfed5a3cc61dda8d54d525c190842f0d1ef) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Support for Neo4j GraphQL Toolbox in Safari web browser +* [#1919](https://github.com/neo4j/graphql/pull/1919) [`7e90ecfe`](https://github.com/neo4j/graphql/commit/7e90ecfed5a3cc61dda8d54d525c190842f0d1ef) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Support for Neo4j GraphQL Toolbox in Safari web browser -- [#1926](https://github.com/neo4j/graphql/pull/1926) [`7affa891`](https://github.com/neo4j/graphql/commit/7affa8912e16bf3ebf27bd5460eb5c671f9b672a) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.cypher.runFirstColumnSingle from point values projection +* [#1926](https://github.com/neo4j/graphql/pull/1926) [`7affa891`](https://github.com/neo4j/graphql/commit/7affa8912e16bf3ebf27bd5460eb5c671f9b672a) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.cypher.runFirstColumnSingle from point values projection -* [#1882](https://github.com/neo4j/graphql/pull/1882) [`07109478`](https://github.com/neo4j/graphql/commit/07109478b0dbd7ca4cf99f31e720f09ea8ad77c2) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Pass the cypherParams from the top-level context to the translate functions. +* [#1882](https://github.com/neo4j/graphql/pull/1882) [`07109478`](https://github.com/neo4j/graphql/commit/07109478b0dbd7ca4cf99f31e720f09ea8ad77c2) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Pass the cypherParams from the top-level context to the translate functions. -- [#1837](https://github.com/neo4j/graphql/pull/1837) [`07d2b61e`](https://github.com/neo4j/graphql/commit/07d2b61e35820def7c399b110a7bc99217f76e60) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested filters on aggregations +* [#1837](https://github.com/neo4j/graphql/pull/1837) [`07d2b61e`](https://github.com/neo4j/graphql/commit/07d2b61e35820def7c399b110a7bc99217f76e60) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested filters on aggregations -* [#1854](https://github.com/neo4j/graphql/pull/1854) [`d7870c31`](https://github.com/neo4j/graphql/commit/d7870c31faaa1e211236fac4e50714937f07ce22) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove instances of `apoc.meta.type`, to reduce our Apoc footprint in the GraphQL Library. +* [#1854](https://github.com/neo4j/graphql/pull/1854) [`d7870c31`](https://github.com/neo4j/graphql/commit/d7870c31faaa1e211236fac4e50714937f07ce22) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove instances of `apoc.meta.type`, to reduce our Apoc footprint in the GraphQL Library. ## 3.6.2 ### Patch Changes -- [#1849](https://github.com/neo4j/graphql/pull/1849) [`68e44f53`](https://github.com/neo4j/graphql/commit/68e44f53672740780cd51d7985f15c85fd7def54) Thanks [@tbwiss](https://github.com/tbwiss)! - Fix: Cypher generation syntax error +* [#1849](https://github.com/neo4j/graphql/pull/1849) [`68e44f53`](https://github.com/neo4j/graphql/commit/68e44f53672740780cd51d7985f15c85fd7def54) Thanks [@tbwiss](https://github.com/tbwiss)! - Fix: Cypher generation syntax error Generated cypher statement when executed produces a syntax error, requires white spaces between AND and variable name. ## 3.6.1 ### Patch Changes -- [#1796](https://github.com/neo4j/graphql/pull/1796) [`3c2d0658`](https://github.com/neo4j/graphql/commit/3c2d065889159dd4b5c37c24de58cd1b34869790) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: move `ORDER BY`, `SKIP` and `LIMIT` to as early as possible in a Cypher query. This results in significant reduction in projecting related nodes which will be made redundant by a late `SKIP` and `LIMIT`. +* [#1796](https://github.com/neo4j/graphql/pull/1796) [`3c2d0658`](https://github.com/neo4j/graphql/commit/3c2d065889159dd4b5c37c24de58cd1b34869790) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: move `ORDER BY`, `SKIP` and `LIMIT` to as early as possible in a Cypher query. This results in significant reduction in projecting related nodes which will be made redundant by a late `SKIP` and `LIMIT`. -* [#1810](https://github.com/neo4j/graphql/pull/1810) [`fad52b51`](https://github.com/neo4j/graphql/commit/fad52b513d7835b0a01856c2882ab536df205252) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.runFirstColumn from count projection to avoid database contention +* [#1810](https://github.com/neo4j/graphql/pull/1810) [`fad52b51`](https://github.com/neo4j/graphql/commit/fad52b513d7835b0a01856c2882ab536df205252) Thanks [@angrykoala](https://github.com/angrykoala)! - Remove apoc.runFirstColumn from count projection to avoid database contention ## 3.6.0 ### Minor Changes -- [#1619](https://github.com/neo4j/graphql/pull/1619) [`0a49f56d`](https://github.com/neo4j/graphql/commit/0a49f56dbd45eb3ca69ceafce4ed308cdc1d6e90) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Feat: Array methods pop and push +* [#1619](https://github.com/neo4j/graphql/pull/1619) [`0a49f56d`](https://github.com/neo4j/graphql/commit/0a49f56dbd45eb3ca69ceafce4ed308cdc1d6e90) Thanks [@mjfwebb](https://github.com/mjfwebb)! - Feat: Array methods pop and push -* [#1773](https://github.com/neo4j/graphql/pull/1773) [`381c4061`](https://github.com/neo4j/graphql/commit/381c40610766f9eb6c938ddba424e44e3382f103) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Comparators `LT`, `LTE`, `GT`, and `GTE` now are included for string fields. +* [#1773](https://github.com/neo4j/graphql/pull/1773) [`381c4061`](https://github.com/neo4j/graphql/commit/381c40610766f9eb6c938ddba424e44e3382f103) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Comparators `LT`, `LTE`, `GT`, and `GTE` now are included for string fields. Add `features` option to `Neo4jGraphQLConfig`, which allows to enable, disable or configure specific features. ### Patch Changes -- [#1778](https://github.com/neo4j/graphql/pull/1778) [`4c8098f4`](https://github.com/neo4j/graphql/commit/4c8098f428937b7bd6bf3d29abb778618c7b030c) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fixed: Aggregation column contains implicit grouping expressions +* [#1778](https://github.com/neo4j/graphql/pull/1778) [`4c8098f4`](https://github.com/neo4j/graphql/commit/4c8098f428937b7bd6bf3d29abb778618c7b030c) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fixed: Aggregation column contains implicit grouping expressions -* [#1781](https://github.com/neo4j/graphql/pull/1781) [`36ebee06`](https://github.com/neo4j/graphql/commit/36ebee06352f5edbbd3748f818b8c0a7c5262681) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: always specify a default database to avoid round-trip requests for routing table +* [#1781](https://github.com/neo4j/graphql/pull/1781) [`36ebee06`](https://github.com/neo4j/graphql/commit/36ebee06352f5edbbd3748f818b8c0a7c5262681) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: always specify a default database to avoid round-trip requests for routing table -- [#1757](https://github.com/neo4j/graphql/pull/1757) [`ba713faf`](https://github.com/neo4j/graphql/commit/ba713faf7da05c6f9031c83542dbc51bc1a0239e) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix connection projection for nodes with zero relationships +* [#1757](https://github.com/neo4j/graphql/pull/1757) [`ba713faf`](https://github.com/neo4j/graphql/commit/ba713faf7da05c6f9031c83542dbc51bc1a0239e) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix connection projection for nodes with zero relationships -* [#1738](https://github.com/neo4j/graphql/pull/1738) [`801cdaea`](https://github.com/neo4j/graphql/commit/801cdaea608e83fa3ba9fffb56b4f93db88d149a) Thanks [@litewarp](https://github.com/litewarp)! - fixed: cannot query Cypher fields on root connections when sort is not provided as an argument +* [#1738](https://github.com/neo4j/graphql/pull/1738) [`801cdaea`](https://github.com/neo4j/graphql/commit/801cdaea608e83fa3ba9fffb56b4f93db88d149a) Thanks [@litewarp](https://github.com/litewarp)! - fixed: cannot query Cypher fields on root connections when sort is not provided as an argument -- [#1747](https://github.com/neo4j/graphql/pull/1747) [`21a0c58c`](https://github.com/neo4j/graphql/commit/21a0c58c85c8368c70c6a83a428f0c20231557b4) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Invalid Cypher generated for connection predicates +* [#1747](https://github.com/neo4j/graphql/pull/1747) [`21a0c58c`](https://github.com/neo4j/graphql/commit/21a0c58c85c8368c70c6a83a428f0c20231557b4) Thanks [@tbwiss](https://github.com/tbwiss)! - fix: Invalid Cypher generated for connection predicates -* [#1770](https://github.com/neo4j/graphql/pull/1770) [`4d62eea7`](https://github.com/neo4j/graphql/commit/4d62eea78fe4a2d72805697a0adcb0b21625e87e) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested connection filters using SINGLE and SOME +* [#1770](https://github.com/neo4j/graphql/pull/1770) [`4d62eea7`](https://github.com/neo4j/graphql/commit/4d62eea78fe4a2d72805697a0adcb0b21625e87e) Thanks [@angrykoala](https://github.com/angrykoala)! - Fix nested connection filters using SINGLE and SOME Fix implicit and parameters missing in connection where -- [#1780](https://github.com/neo4j/graphql/pull/1780) [`28ffcf88`](https://github.com/neo4j/graphql/commit/28ffcf88d0b5026eb2f3cce756b762fc9d025811) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fixed: an EXISTS clause is used in a RETURN clause where it is not valid +* [#1780](https://github.com/neo4j/graphql/pull/1780) [`28ffcf88`](https://github.com/neo4j/graphql/commit/28ffcf88d0b5026eb2f3cce756b762fc9d025811) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fixed: an EXISTS clause is used in a RETURN clause where it is not valid -* [#1723](https://github.com/neo4j/graphql/pull/1723) [`0f52cf7e`](https://github.com/neo4j/graphql/commit/0f52cf7e360da1c9e68a8d63c81f1c35a66679f4) Thanks [@tbwiss](https://github.com/tbwiss)! - Fix: Simple connection query with `totalCount` fails. +* [#1723](https://github.com/neo4j/graphql/pull/1723) [`0f52cf7e`](https://github.com/neo4j/graphql/commit/0f52cf7e360da1c9e68a8d63c81f1c35a66679f4) Thanks [@tbwiss](https://github.com/tbwiss)! - Fix: Simple connection query with `totalCount` fails. -- [#1789](https://github.com/neo4j/graphql/pull/1789) [`52f755b0`](https://github.com/neo4j/graphql/commit/52f755b0a5ecda6f8356a61e83591c7c00b1e30e) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: structure of CASE statements not in line with best practice +* [#1789](https://github.com/neo4j/graphql/pull/1789) [`52f755b0`](https://github.com/neo4j/graphql/commit/52f755b0a5ecda6f8356a61e83591c7c00b1e30e) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fix: structure of CASE statements not in line with best practice -* [#1743](https://github.com/neo4j/graphql/pull/1743) [`1c7987b5`](https://github.com/neo4j/graphql/commit/1c7987b51b10fed565d92e9d74256f986800c2cf) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fixed: redundant check against non-existent parameter when querying interface connection using `_on` +* [#1743](https://github.com/neo4j/graphql/pull/1743) [`1c7987b5`](https://github.com/neo4j/graphql/commit/1c7987b51b10fed565d92e9d74256f986800c2cf) Thanks [@darrellwarde](https://github.com/darrellwarde)! - fixed: redundant check against non-existent parameter when querying interface connection using `_on` -- [#1724](https://github.com/neo4j/graphql/pull/1724) [`de4756ca`](https://github.com/neo4j/graphql/commit/de4756caa7b5d6baad4ea549e7a7652dabfa89fc) Thanks [@tbwiss](https://github.com/tbwiss)! - Fix: Filtering using connection fields could fail +* [#1724](https://github.com/neo4j/graphql/pull/1724) [`de4756ca`](https://github.com/neo4j/graphql/commit/de4756caa7b5d6baad4ea549e7a7652dabfa89fc) Thanks [@tbwiss](https://github.com/tbwiss)! - Fix: Filtering using connection fields could fail ## 3.5.1 ### Patch Changes -- 30af948c: Update Cypher execution functionality so that transaction functions are used when executing using either a driver or a session. +* 30af948c: Update Cypher execution functionality so that transaction functions are used when executing using either a driver or a session. diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 73d97add1a..3d48f185cf 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@neo4j/graphql", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.2", "description": "A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations", "keywords": [ "neo4j", @@ -49,17 +49,17 @@ }, "author": "Neo4j Inc.", "devDependencies": { - "@apollo/gateway": "2.5.2", - "@apollo/server": "4.9.1", + "@apollo/gateway": "2.5.3", + "@apollo/server": "4.9.3", "@faker-js/faker": "8.0.2", "@types/deep-equal": "1.0.1", "@types/is-uuid": "1.0.0", - "@types/jest": "29.5.3", + "@types/jest": "29.5.4", "@types/jsonwebtoken": "9.0.2", "@types/node": "18.15.1", "@types/pluralize": "0.0.30", "@types/randomstring": "1.1.8", - "@types/semver": "7.5.0", + "@types/semver": "7.5.1", "@types/supertest": "2.0.12", "@types/ws": "8.5.5", "dedent": "1.5.1", @@ -67,7 +67,7 @@ "graphql-tag": "2.12.6", "graphql-ws": "5.14.0", "is-uuid": "1.0.2", - "jest": "29.6.2", + "jest": "29.6.4", "jest-extended": "4.0.1", "jwks-rsa": "^3.0.1", "koa": "2.14.2", diff --git a/packages/graphql/src/classes/Neo4jGraphQL.ts b/packages/graphql/src/classes/Neo4jGraphQL.ts index c06f0435c1..fbf19383ca 100644 --- a/packages/graphql/src/classes/Neo4jGraphQL.ts +++ b/packages/graphql/src/classes/Neo4jGraphQL.ts @@ -25,7 +25,7 @@ import type Node from "./Node"; import type Relationship from "./Relationship"; import checkNeo4jCompat from "./utils/verify-database"; import type { AssertIndexesAndConstraintsOptions } from "./utils/asserts-indexes-and-constraints"; -import assertIndexesAndConstraints from "./utils/asserts-indexes-and-constraints"; +import { assertIndexesAndConstraints } from "./utils/asserts-indexes-and-constraints"; import { wrapQueryAndMutation } from "../schema/resolvers/composition/wrap-query-and-mutation"; import type { WrapResolverArguments } from "../schema/resolvers/composition/wrap-query-and-mutation"; import { defaultFieldResolver } from "../schema/resolvers/field/defaultField"; diff --git a/packages/graphql/src/classes/SubscriptionDirective.ts b/packages/graphql/src/classes/SubscriptionDirective.ts index cbd1999c22..aa28c8f5e9 100644 --- a/packages/graphql/src/classes/SubscriptionDirective.ts +++ b/packages/graphql/src/classes/SubscriptionDirective.ts @@ -1,4 +1,3 @@ - /* * Copyright (c) "Neo4j" * Neo4j Sweden AB [http://neo4j.com] @@ -18,21 +17,21 @@ * limitations under the License. */ -import { SubscriptionOperations } from "../graphql/directives/subscription"; +import { SubscriptionEvent } from "../graphql/directives/subscription"; export class SubscriptionDirective { - public create: boolean; - public update: boolean; - public delete: boolean; - public createRelationship: boolean; - public deleteRelationship: boolean; + public created: boolean; + public updated: boolean; + public deleted: boolean; + public relationshipCreated: boolean; + public relationshipDeleted: boolean; - constructor(operations?: (SubscriptionOperations)[]) { + constructor(operations?: SubscriptionEvent[]) { const operationsSet = new Set(operations); - this.create = operationsSet.has(SubscriptionOperations.CREATE); - this.update = operationsSet.has(SubscriptionOperations.UPDATE); - this.delete = operationsSet.has(SubscriptionOperations.DELETE); - this.createRelationship = operationsSet.has(SubscriptionOperations.CREATE_RELATIONSHIP); - this.deleteRelationship = operationsSet.has(SubscriptionOperations.DELETE_RELATIONSHIP); + this.created = operationsSet.has(SubscriptionEvent.CREATED); + this.updated = operationsSet.has(SubscriptionEvent.UPDATED); + this.deleted = operationsSet.has(SubscriptionEvent.DELETED); + this.relationshipCreated = operationsSet.has(SubscriptionEvent.RELATIONSHIP_CREATED); + this.relationshipDeleted = operationsSet.has(SubscriptionEvent.RELATIONSHIP_DELETED); } } diff --git a/packages/graphql/src/classes/authorization/Neo4jGraphQLAuthorization.ts b/packages/graphql/src/classes/authorization/Neo4jGraphQLAuthorization.ts index e396372f44..efcf2db1de 100644 --- a/packages/graphql/src/classes/authorization/Neo4jGraphQLAuthorization.ts +++ b/packages/graphql/src/classes/authorization/Neo4jGraphQLAuthorization.ts @@ -47,10 +47,6 @@ export class Neo4jGraphQLAuthorization { this.authorization = authorization; } - public get globalAuthentication(): boolean { - return this.authorization.globalAuthentication || false; - } - public async decode( context: Neo4jGraphQLContext | Neo4jGraphQLSubscriptionsConnectionParams ): Promise { diff --git a/packages/graphql/src/classes/utils/asserts-indexes-and-constraints.ts b/packages/graphql/src/classes/utils/asserts-indexes-and-constraints.ts index 6b54272c61..ae5acad1cf 100644 --- a/packages/graphql/src/classes/utils/asserts-indexes-and-constraints.ts +++ b/packages/graphql/src/classes/utils/asserts-indexes-and-constraints.ts @@ -29,6 +29,32 @@ export interface AssertIndexesAndConstraintsOptions { create?: boolean; } +export async function assertIndexesAndConstraints({ + driver, + sessionConfig, + nodes, + options, +}: { + driver: Driver; + sessionConfig?: Neo4jGraphQLSessionConfig; + nodes: Node[]; + options?: AssertIndexesAndConstraintsOptions; +}): Promise { + await driver.verifyConnectivity(); + + const session = driver.session(sessionConfig); + + try { + if (options?.create) { + await createIndexesAndConstraints({ nodes, session }); + } else { + await checkIndexesAndConstraints({ nodes, session }); + } + } finally { + await session.close(); + } +} + async function createIndexesAndConstraints({ nodes, session }: { nodes: Node[]; session: Session }) { const constraintsToCreate = await getMissingConstraints({ nodes, session }); const indexesToCreate: { indexName: string; label: string; properties: string[] }[] = []; @@ -261,31 +287,3 @@ async function getMissingConstraints({ return missingConstraints; } - -async function assertIndexesAndConstraints({ - driver, - sessionConfig, - nodes, - options, -}: { - driver: Driver; - sessionConfig?: Neo4jGraphQLSessionConfig; - nodes: Node[]; - options?: AssertIndexesAndConstraintsOptions; -}): Promise { - await driver.verifyConnectivity(); - - const session = driver.session(sessionConfig); - - try { - if (options?.create) { - await createIndexesAndConstraints({ nodes, session }); - } else { - await checkIndexesAndConstraints({ nodes, session }); - } - } finally { - await session.close(); - } -} - -export default assertIndexesAndConstraints; diff --git a/packages/graphql/src/graphql/directives/exclude.ts b/packages/graphql/src/graphql/directives/exclude.ts deleted file mode 100644 index 609fe6e84d..0000000000 --- a/packages/graphql/src/graphql/directives/exclude.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { DirectiveLocation, GraphQLDirective, GraphQLList, GraphQLNonNull } from "graphql"; -import { ExcludeOperationEnum } from "./arguments/enums/ExcludeOperation"; - -export const excludeDirective = new GraphQLDirective({ - name: "exclude", - description: - "Instructs @neo4j/graphql to exclude the specified operations from query and mutation generation. If used without an argument, no queries or mutations will be generated for this type.", - locations: [DirectiveLocation.INTERFACE, DirectiveLocation.OBJECT], - args: { - operations: { - defaultValue: ExcludeOperationEnum.getValues().map((v) => v.value), - type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(ExcludeOperationEnum))), - }, - }, -}); diff --git a/packages/graphql/src/graphql/directives/id.ts b/packages/graphql/src/graphql/directives/id.ts index 419af58004..8ee60d7600 100644 --- a/packages/graphql/src/graphql/directives/id.ts +++ b/packages/graphql/src/graphql/directives/id.ts @@ -17,26 +17,10 @@ * limitations under the License. */ -import { DirectiveLocation, GraphQLBoolean, GraphQLDirective, GraphQLNonNull } from "graphql"; +import { DirectiveLocation, GraphQLDirective } from "graphql"; export const idDirective = new GraphQLDirective({ name: "id", - description: - "Indicates that the field is an identifier for the object type. By default; autogenerated, and has a unique node property constraint in the database.", + description: "Enables the autogeneration of UUID values for an ID field. The field becomes immutable.", locations: [DirectiveLocation.FIELD_DEFINITION], - args: { - autogenerate: { - defaultValue: false, - type: new GraphQLNonNull(GraphQLBoolean), - }, - unique: { - defaultValue: true, - type: new GraphQLNonNull(GraphQLBoolean), - }, - global: { - description: "Opt-in to implementing the Node interface with a globally unique id", - type: new GraphQLNonNull(GraphQLBoolean), - defaultValue: false, - }, - }, }); diff --git a/packages/graphql/src/graphql/directives/index.ts b/packages/graphql/src/graphql/directives/index.ts index 5af8702674..8cd68d111a 100644 --- a/packages/graphql/src/graphql/directives/index.ts +++ b/packages/graphql/src/graphql/directives/index.ts @@ -24,7 +24,6 @@ export { cypherDirective } from "./cypher"; export { selectableDirective } from "./selectable"; export { settableDirective } from "./settable"; export { defaultDirective } from "./default"; -export { excludeDirective } from "./exclude"; export { fulltextDirective } from "./fulltext"; export { idDirective } from "./id"; export { nodeDirective } from "./node"; @@ -32,12 +31,11 @@ export { pluralDirective } from "./plural"; export { populatedByDirective } from "./populatedBy"; export { privateDirective } from "./private"; export { limitDirective } from "./limit"; -export { readonlyDirective } from "./readonly"; export { relationshipPropertiesDirective } from "./relationship-properties"; export { relationshipDirective } from "./relationship"; +export { relayIdDirective } from "./relay-id"; export { timestampDirective } from "./timestamp"; export { uniqueDirective } from "./unique"; -export { writeonlyDirective } from "./writeonly"; export { mutationDirective } from "./mutation"; export { queryDirective } from "./query"; export { subscriptionDirective } from "./subscription"; diff --git a/packages/graphql/src/graphql/directives/readonly.ts b/packages/graphql/src/graphql/directives/relay-id.ts similarity index 77% rename from packages/graphql/src/graphql/directives/readonly.ts rename to packages/graphql/src/graphql/directives/relay-id.ts index 240faf866c..298597ee89 100644 --- a/packages/graphql/src/graphql/directives/readonly.ts +++ b/packages/graphql/src/graphql/directives/relay-id.ts @@ -19,9 +19,9 @@ import { DirectiveLocation, GraphQLDirective } from "graphql"; -export const readonlyDirective = new GraphQLDirective({ - name: "readonly", +export const relayIdDirective = new GraphQLDirective({ + name: "relayId", description: - "Instructs @neo4j/graphql to only include a field in generated input type for creating, and in the object type within which the directive is applied.", + "Mark the field to be used as the global node identifier for Relay. This field will be backed by a unique node property constraint.", locations: [DirectiveLocation.FIELD_DEFINITION], }); diff --git a/packages/graphql/src/graphql/directives/subscription.ts b/packages/graphql/src/graphql/directives/subscription.ts index 4c13b7af70..e062c3be12 100644 --- a/packages/graphql/src/graphql/directives/subscription.ts +++ b/packages/graphql/src/graphql/directives/subscription.ts @@ -19,38 +19,38 @@ import { DirectiveLocation, GraphQLDirective, GraphQLEnumType, GraphQLList, GraphQLNonNull } from "graphql"; -export enum SubscriptionOperations { - CREATE = "CREATE", - UPDATE = "UPDATE", - DELETE = "DELETE", - CREATE_RELATIONSHIP = "CREATE_RELATIONSHIP", - DELETE_RELATIONSHIP = "DELETE_RELATIONSHIP", +export enum SubscriptionEvent { + CREATED = "CREATED", + UPDATED = "UPDATED", + DELETED = "DELETED", + RELATIONSHIP_CREATED = "RELATIONSHIP_CREATED", + RELATIONSHIP_DELETED = "RELATIONSHIP_DELETED", } -const SUBSCRIPTION_FIELDS = new GraphQLEnumType({ - name: "SubscriptionFields", +const SubscriptionEventType = new GraphQLEnumType({ + name: "SubscriptionEvent", values: { - [SubscriptionOperations.CREATE]: { value: SubscriptionOperations.CREATE }, - [SubscriptionOperations.UPDATE]: { value: SubscriptionOperations.UPDATE }, - [SubscriptionOperations.DELETE]: { value: SubscriptionOperations.DELETE }, - [SubscriptionOperations.CREATE_RELATIONSHIP]: { value: SubscriptionOperations.CREATE_RELATIONSHIP }, - [SubscriptionOperations.DELETE_RELATIONSHIP]: { value: SubscriptionOperations.DELETE_RELATIONSHIP }, + [SubscriptionEvent.CREATED]: { value: SubscriptionEvent.CREATED }, + [SubscriptionEvent.UPDATED]: { value: SubscriptionEvent.UPDATED }, + [SubscriptionEvent.DELETED]: { value: SubscriptionEvent.DELETED }, + [SubscriptionEvent.RELATIONSHIP_CREATED]: { value: SubscriptionEvent.RELATIONSHIP_CREATED }, + [SubscriptionEvent.RELATIONSHIP_DELETED]: { value: SubscriptionEvent.RELATIONSHIP_DELETED }, }, }); export const subscriptionDirective = new GraphQLDirective({ name: "subscription", - description: "Define the granularity of operations available in the subscription root type.", + description: "Define the granularity of events available in the subscription root type.", args: { - operations: { - description: "Enable/Disable subscription operations for this type", - type: new GraphQLNonNull(new GraphQLList(SUBSCRIPTION_FIELDS)), + events: { + description: "Enable/Disable subscription events for this type", + type: new GraphQLNonNull(new GraphQLList(SubscriptionEventType)), defaultValue: [ - SubscriptionOperations.CREATE, - SubscriptionOperations.UPDATE, - SubscriptionOperations.DELETE, - SubscriptionOperations.CREATE_RELATIONSHIP, - SubscriptionOperations.DELETE_RELATIONSHIP, + SubscriptionEvent.CREATED, + SubscriptionEvent.UPDATED, + SubscriptionEvent.DELETED, + SubscriptionEvent.RELATIONSHIP_CREATED, + SubscriptionEvent.RELATIONSHIP_DELETED, ], }, }, diff --git a/packages/graphql/src/graphql/directives/writeonly.ts b/packages/graphql/src/graphql/directives/writeonly.ts deleted file mode 100644 index 34e7c0a26e..0000000000 --- a/packages/graphql/src/graphql/directives/writeonly.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { DirectiveLocation, GraphQLDirective } from "graphql"; - -export const writeonlyDirective = new GraphQLDirective({ - name: "writeonly", - description: - "Instructs @neo4j/graphql to only include a field in the generated input types for the object type within which the directive is applied, but exclude it from the object type itself.", - locations: [DirectiveLocation.FIELD_DEFINITION], -}); diff --git a/packages/graphql/src/schema-model/annotation/IDAnnotation.ts b/packages/graphql/src/schema-model/annotation/IDAnnotation.ts index 0f058831a6..2a8ee7f43c 100644 --- a/packages/graphql/src/schema-model/annotation/IDAnnotation.ts +++ b/packages/graphql/src/schema-model/annotation/IDAnnotation.ts @@ -17,14 +17,4 @@ * limitations under the License. */ -export class IDAnnotation { - public readonly autogenerate: boolean; - public readonly unique: boolean; - public readonly global: boolean; - - constructor({ autogenerate, unique, global }: { autogenerate: boolean; unique: boolean; global: boolean }) { - this.autogenerate = autogenerate; - this.unique = unique; - this.global = global; - } -} +export class IDAnnotation {} diff --git a/packages/graphql/src/schema-model/annotation/SubscriptionAnnotation.ts b/packages/graphql/src/schema-model/annotation/SubscriptionAnnotation.ts index e400df4fa0..f24d024e00 100644 --- a/packages/graphql/src/schema-model/annotation/SubscriptionAnnotation.ts +++ b/packages/graphql/src/schema-model/annotation/SubscriptionAnnotation.ts @@ -18,9 +18,9 @@ */ export class SubscriptionAnnotation { - public readonly operations: string[]; + public readonly events: string[]; - constructor({ operations }: { operations: string[] }) { - this.operations = operations; + constructor({ events }: { events: string[] }) { + this.events = events; } } diff --git a/packages/graphql/src/schema-model/generate-model.test.ts b/packages/graphql/src/schema-model/generate-model.test.ts index e823f4f33b..3998a18730 100644 --- a/packages/graphql/src/schema-model/generate-model.test.ts +++ b/packages/graphql/src/schema-model/generate-model.test.ts @@ -376,7 +376,7 @@ describe("Annotations & Attributes", () => { accounts: [Account!]! @relationship(type: "HAS_ACCOUNT", direction: OUT) } - type Account @subscription(operations: [CREATE]) { + type Account @subscription(events: [CREATED]) { id: ID! accountName: String! @settable(onCreate: false) } @@ -404,17 +404,17 @@ describe("Annotations & Attributes", () => { const userSubscription = userEntity?.annotations[AnnotationsKey.subscription]; expect(userSubscription).toBeDefined(); - expect(userSubscription?.operations).toStrictEqual([ - "CREATE", - "UPDATE", - "DELETE", - "CREATE_RELATIONSHIP", - "DELETE_RELATIONSHIP", + expect(userSubscription?.events).toStrictEqual([ + "CREATED", + "UPDATED", + "DELETED", + "RELATIONSHIP_CREATED", + "RELATIONSHIP_DELETED", ]); const accountSubscription = accountEntity?.annotations[AnnotationsKey.subscription]; expect(accountSubscription).toBeDefined(); - expect(accountSubscription?.operations).toStrictEqual(["CREATE"]); + expect(accountSubscription?.events).toStrictEqual(["CREATED"]); }); test("attributes should be generated with the correct annotations", () => { diff --git a/packages/graphql/src/schema-model/parser/annotations-parser/id-annotation.test.ts b/packages/graphql/src/schema-model/parser/annotations-parser/id-annotation.test.ts deleted file mode 100644 index 64c0e90a9a..0000000000 --- a/packages/graphql/src/schema-model/parser/annotations-parser/id-annotation.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { makeDirectiveNode } from "@graphql-tools/utils"; -import { parseIDAnnotation } from "./id-annotation"; -import { idDirective } from "../../../graphql/directives"; -const tests = [ - { - name: "should parse correctly with all properties set to true", - directive: makeDirectiveNode("id", { autogenerate: true, unique: true, global: true }, idDirective), - expected: { - autogenerate: true, - unique: true, - global: true, - }, - }, - { - name: "should parse correctly with all properties set to false", - directive: makeDirectiveNode("id", { autogenerate: false, unique: false, global: false }, idDirective), - expected: { - autogenerate: false, - unique: false, - global: false, - }, - }, - { - name: "should parse correctly with autogenerate set to false, unique and global set to true", - directive: makeDirectiveNode("id", { autogenerate: false, unique: true, global: true }, idDirective), - expected: { - autogenerate: false, - unique: true, - global: true, - }, - }, -]; - -describe("parseIDAnnotation", () => { - tests.forEach((test) => { - it(`${test.name}`, () => { - const idAnnotation = parseIDAnnotation(test.directive); - expect(idAnnotation.autogenerate).toBe(test.expected.autogenerate); - expect(idAnnotation.unique).toBe(test.expected.unique); - expect(idAnnotation.global).toBe(test.expected.global); - }); - }); -}); diff --git a/packages/graphql/src/schema-model/parser/annotations-parser/id-annotation.ts b/packages/graphql/src/schema-model/parser/annotations-parser/id-annotation.ts deleted file mode 100644 index 1819c4aea8..0000000000 --- a/packages/graphql/src/schema-model/parser/annotations-parser/id-annotation.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { type DirectiveNode } from "graphql"; -import { IDAnnotation } from "../../annotation/IDAnnotation"; -import { parseArguments } from "../parse-arguments"; -import { idDirective } from "../../../graphql/directives"; - -export function parseIDAnnotation(directive: DirectiveNode): IDAnnotation { - const { autogenerate, unique, global } = parseArguments(idDirective, directive) as { - autogenerate: boolean; - unique: boolean; - global: boolean; - }; - - return new IDAnnotation({ - autogenerate, - unique, - global, - }); -} diff --git a/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.test.ts b/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.test.ts index 048b5c4b94..26da15d2d1 100644 --- a/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.test.ts +++ b/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.test.ts @@ -23,22 +23,22 @@ import { subscriptionDirective } from "../../../graphql/directives"; const tests = [ { - name: "should parse correctly when CREATE operation is passed", - directive: makeDirectiveNode("subscription", { operations: ["CREATE"] }, subscriptionDirective), - operations: ["CREATE"], - expected: { operations: ["CREATE"] }, + name: "should parse correctly when CREATED event is passed", + directive: makeDirectiveNode("subscription", { events: ["CREATED"] }, subscriptionDirective), + events: ["CREATED"], + expected: { events: ["CREATED"] }, }, { - name: "should parse correctly when UPDATE operation is passed", - directive: makeDirectiveNode("subscription", { operations: ["UPDATE"] }, subscriptionDirective), - operations: ["UPDATE"], - expected: { operations: ["UPDATE"] }, + name: "should parse correctly when UPDATED event is passed", + directive: makeDirectiveNode("subscription", { events: ["UPDATED"] }, subscriptionDirective), + events: ["UPDATED"], + expected: { events: ["UPDATED"] }, }, { - name: "should parse correctly when CREATE and UPDATE operations are passed", - directive: makeDirectiveNode("subscription", { operations: ["CREATE", "UPDATE"] }, subscriptionDirective), - operations: ["CREATE", "UPDATE"], - expected: { operations: ["CREATE", "UPDATE"] }, + name: "should parse correctly when CREATE and UPDATE events are passed", + directive: makeDirectiveNode("subscription", { events: ["CREATED", "UPDATED"] }, subscriptionDirective), + events: ["CREATED", "UPDATED"], + expected: { events: ["CREATED", "UPDATED"] }, }, ]; @@ -46,7 +46,7 @@ describe("parseSubscriptionAnnotation", () => { tests.forEach((test) => { it(`${test.name}`, () => { const subscriptionAnnotation = parseSubscriptionAnnotation(test.directive); - expect(subscriptionAnnotation.operations).toEqual(test.operations); + expect(subscriptionAnnotation.events).toEqual(test.events); }); }); }); diff --git a/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.ts b/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.ts index 44f8b7f485..9eca2aaed5 100644 --- a/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.ts +++ b/packages/graphql/src/schema-model/parser/annotations-parser/subscription-annotation.ts @@ -22,9 +22,9 @@ import { parseArguments } from "../parse-arguments"; import { subscriptionDirective } from "../../../graphql/directives"; export function parseSubscriptionAnnotation(directive: DirectiveNode): SubscriptionAnnotation { - const { operations } = parseArguments(subscriptionDirective, directive) as { operations: string[] }; + const { events } = parseArguments(subscriptionDirective, directive) as { events: string[] }; return new SubscriptionAnnotation({ - operations, + events, }); } diff --git a/packages/graphql/src/schema-model/parser/parse-annotation.ts b/packages/graphql/src/schema-model/parser/parse-annotation.ts index 1fbe15124a..47be28ccef 100644 --- a/packages/graphql/src/schema-model/parser/parse-annotation.ts +++ b/packages/graphql/src/schema-model/parser/parse-annotation.ts @@ -22,7 +22,6 @@ import { parseCoalesceAnnotation } from "./annotations-parser/coalesce-annotatio import { parseCypherAnnotation } from "./annotations-parser/cypher-annotation"; import { parseCustomResolverAnnotation } from "./annotations-parser/custom-resolver-annotation"; import { parseDefaultAnnotation } from "./annotations-parser/default-annotation"; -import { parseIDAnnotation } from "./annotations-parser/id-annotation"; import { parseFilterableAnnotation } from "./annotations-parser/filterable-annotation"; import { parseMutationAnnotation } from "./annotations-parser/mutation-annotation"; import { parsePluralAnnotation } from "./annotations-parser/plural-annotation"; @@ -44,6 +43,7 @@ import { parseSubscriptionsAuthorizationAnnotation } from "./annotations-parser/ import { filterTruthy } from "../../utils/utils"; import type { Annotation } from "../annotation/Annotation"; import { AnnotationsKey } from "../annotation/Annotation"; +import { IDAnnotation } from "../annotation/IDAnnotation"; export function parseAnnotations(directives: readonly DirectiveNode[]): Annotation[] { return filterTruthy( @@ -66,7 +66,7 @@ export function parseAnnotations(directives: readonly DirectiveNode[]): Annotati case AnnotationsKey.fulltext: return parseFullTextAnnotation(directive); case AnnotationsKey.id: - return parseIDAnnotation(directive); + return new IDAnnotation(); case AnnotationsKey.jwtClaim: return parseJWTClaimAnnotation(directive); case AnnotationsKey.jwtPayload: diff --git a/packages/graphql/src/schema/check-directive-combinations.ts b/packages/graphql/src/schema/check-directive-combinations.ts index 786a9415ed..b3bb63e66d 100644 --- a/packages/graphql/src/schema/check-directive-combinations.ts +++ b/packages/graphql/src/schema/check-directive-combinations.ts @@ -30,7 +30,7 @@ function checkDirectiveCombinations(directives: readonly DirectiveNode[] = []): customResolver: ["alias", "authentication", "authorization", "id", "readonly", "relationship", "writeonly"], cypher: [], default: [], - id: ["cypher", "customResolver", "relationship", "timestamp", "unique"], + id: ["cypher", "customResolver", "relationship", "timestamp"], populatedBy: ["id", "default", "relationship"], private: [], readonly: ["cypher", "customResolver"], @@ -47,7 +47,7 @@ function checkDirectiveCombinations(directives: readonly DirectiveNode[] = []): "readonly", ], timestamp: ["id", "unique"], - unique: ["cypher", "id", "customResolver", "relationship", "timestamp"], + unique: ["cypher", "customResolver", "relationship", "timestamp"], writeonly: ["cypher", "customResolver"], // OBJECT node: [], diff --git a/packages/graphql/src/schema/create-relationship-fields/create-relationship-fields.ts b/packages/graphql/src/schema/create-relationship-fields/create-relationship-fields.ts index f6cd6dc291..6097c36862 100644 --- a/packages/graphql/src/schema/create-relationship-fields/create-relationship-fields.ts +++ b/packages/graphql/src/schema/create-relationship-fields/create-relationship-fields.ts @@ -186,7 +186,7 @@ function createRelationshipFields({ }, }); } - + // n..m Relationships if (rel.typeMeta.array && rel.filterableOptions.byValue) { addRelationshipArrayFilters({ @@ -352,7 +352,7 @@ function createRelationshipFields({ schemaComposer.getOrCreateITC(connectName, (tc) => { tc.addFields({ where: connectWhereName }); - if (node.relationFields.length) { + if (nodeHasRelationshipWithNestedOperation(node, RelationshipNestedOperationsOption.CONNECT)) { tc.addFields({ connect: rel.typeMeta.array ? `[${node.name}ConnectInput!]` : `${node.name}ConnectInput`, }); @@ -384,6 +384,7 @@ function createRelationshipFields({ }, }); } + if (rel.settableOptions.onUpdate && nodeFieldUpdateInput) { const connectionUpdateInputName = `${rel.connectionPrefix}${upperFieldName}UpdateConnectionInput`; @@ -420,7 +421,7 @@ function createRelationshipFields({ schemaComposer.getOrCreateITC(nodeFieldDeleteInputName, (tc) => { tc.addFields({ where: `${rel.connectionPrefix}${upperFieldName}ConnectionWhere` }); - if (node.relationFields.length) { + if (nodeHasRelationshipWithNestedOperation(node, RelationshipNestedOperationsOption.DELETE)) { tc.addFields({ delete: `${node.name}DeleteInput` }); } }); @@ -442,7 +443,7 @@ function createRelationshipFields({ schemaComposer.getOrCreateITC(nodeFieldDisconnectInputName, (tc) => { tc.addFields({ where: `${rel.connectionPrefix}${upperFieldName}ConnectionWhere` }); - if (node.relationFields.length) { + if (nodeHasRelationshipWithNestedOperation(node, RelationshipNestedOperationsOption.DISCONNECT)) { tc.addFields({ disconnect: `${node.name}DisconnectInput` }); } }); @@ -463,4 +464,11 @@ function createRelationshipFields({ }); } +function nodeHasRelationshipWithNestedOperation( + node: Node, + nestedOperation: RelationshipNestedOperationsOption +): boolean { + return node.relationFields.some((relationField) => relationField.nestedOperations.includes(nestedOperation)); +} + export default createRelationshipFields; diff --git a/packages/graphql/src/schema/get-nodes.ts b/packages/graphql/src/schema/get-nodes.ts index 7359fc3a2c..ab6792877b 100644 --- a/packages/graphql/src/schema/get-nodes.ts +++ b/packages/graphql/src/schema/get-nodes.ts @@ -195,9 +195,7 @@ function getNodes( const globalIdFields = nodeFields.primitiveFields.filter((field) => field.isGlobalIdField); if (globalIdFields.length > 1) { - throw new Error( - "Only one field may be decorated with an '@id' directive with the global argument set to `true`" - ); + throw new Error("Only one field may be decorated with the `@relayId` directive"); } const globalIdField = globalIdFields[0]; @@ -208,16 +206,11 @@ function getNodes( const hasAlias = idField.directives?.find((x) => x.name.value === "alias"); if (!hasAlias) { throw new Error( - `Type ${definition.name.value} already has a field "id." Either remove it, or if you need access to this property, consider using the "@alias" directive to access it via another field` + `Type ${definition.name.value} already has a field 'id', which is reserved for Relay global node identification.\nEither remove it, or if you need access to this property, consider using the '@alias' directive to access it via another field.` ); } } - if (globalIdField && !globalIdField.unique) { - throw new Error( - `Fields decorated with the "@id" directive must be unique in the database. Please remove it, or consider making the field unique` - ); - } const node = new Node({ name: definition.name.value, interfaces: nodeInterfaces, diff --git a/packages/graphql/src/schema/get-obj-field-meta.ts b/packages/graphql/src/schema/get-obj-field-meta.ts index dc10bf53d5..e5707be977 100644 --- a/packages/graphql/src/schema/get-obj-field-meta.ts +++ b/packages/graphql/src/schema/get-obj-field-meta.ts @@ -137,6 +137,7 @@ function getObjFieldMeta({ }); const typeMeta = getFieldTypeMeta(field.type); const idDirective = directives.find((x) => x.name.value === "id"); + const relayIdDirective = directives.find((x) => x.name.value === "relayId"); const defaultDirective = directives.find((x) => x.name.value === "default"); const coalesceDirective = directives.find((x) => x.name.value === "coalesce"); const timestampDirective = directives.find((x) => x.name.value === "timestamp"); @@ -188,6 +189,7 @@ function getObjFieldMeta({ "settable", "subscriptionsAuthorization", "filterable", + "relayId", ].includes(x.name.value) ), arguments: [...(field.arguments || [])], @@ -536,10 +538,10 @@ function getObjFieldMeta({ primitiveField.autogenerate = true; } - const global = idDirective.arguments?.find((a) => a.name.value === "global"); - if (global) { - primitiveField.isGlobalIdField = true; - } + } + + if (relayIdDirective) { + primitiveField.isGlobalIdField = true; } if (defaultDirective) { diff --git a/packages/graphql/src/schema/make-augmented-schema.test.ts b/packages/graphql/src/schema/make-augmented-schema.test.ts index 330cd4242c..1fe1dd4ae7 100644 --- a/packages/graphql/src/schema/make-augmented-schema.test.ts +++ b/packages/graphql/src/schema/make-augmented-schema.test.ts @@ -567,40 +567,31 @@ describe("makeAugmentedSchema", () => { test("should throw error if more than one @id directive field has the global argument set to true", () => { const typeDefs = gql` type User { - email: ID! @id(global: true) - name: ID! @id(global: true) + email: ID! @id @unique @relayId + name: ID! @id @unique @relayId } `; expect(() => makeAugmentedSchema(typeDefs)).toThrow( - "Only one field may be decorated with an '@id' directive with the global argument set to `true`" - ); - }); - test("should throw if an @id directive has the global argument set to true, but the unique argument set to false", () => { - const typeDefs = gql` - type User { - email: ID! @id(global: true, unique: false) - } - `; - expect(() => makeAugmentedSchema(typeDefs)).toThrow( - `Fields decorated with the "@id" directive must be unique in the database. Please remove it, or consider making the field unique` + "Only one field may be decorated with the `@relayId` directive" ); }); + test("should throw if a type already contains an id field", () => { const typeDefs = gql` type User { id: ID! - email: ID! @id(global: true) + email: ID! @id @unique @relayId } `; expect(() => makeAugmentedSchema(typeDefs)).toThrow( - `Type User already has a field "id." Either remove it, or if you need access to this property, consider using the "@alias" directive to access it via another field` + `Type User already has a field 'id', which is reserved for Relay global node identification.\nEither remove it, or if you need access to this property, consider using the '@alias' directive to access it via another field` ); }); test("should not throw if a type already contains an id field but the field is aliased", () => { const typeDefs = gql` type User { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") } `; expect(() => makeAugmentedSchema(typeDefs)).not.toThrow(); diff --git a/packages/graphql/src/schema/parse-subscription-directive.test.ts b/packages/graphql/src/schema/parse-subscription-directive.test.ts index 14b1630392..3333410671 100644 --- a/packages/graphql/src/schema/parse-subscription-directive.test.ts +++ b/packages/graphql/src/schema/parse-subscription-directive.test.ts @@ -21,7 +21,7 @@ import type { DirectiveNode, ObjectTypeDefinitionNode } from "graphql"; import { parse } from "graphql"; import { SubscriptionDirective } from "../classes/SubscriptionDirective"; import parseSubscriptionDirective from "./parse-subscription-directive"; -import { SubscriptionOperations } from "../graphql/directives/subscription"; +import { SubscriptionEvent } from "../graphql/directives/subscription"; describe("parseSubscriptionDirective", () => { test("should throw an error if incorrect directive is passed in", () => { @@ -47,21 +47,27 @@ describe("parseSubscriptionDirective", () => { const definition = parse(typeDefs).definitions[0] as ObjectTypeDefinitionNode; const directive = definition?.directives?.length ? (definition.directives[0] as DirectiveNode) : undefined; - const expected = new SubscriptionDirective([SubscriptionOperations.CREATE, SubscriptionOperations.UPDATE, SubscriptionOperations.DELETE, SubscriptionOperations.CREATE_RELATIONSHIP, SubscriptionOperations.DELETE_RELATIONSHIP]); + const expected = new SubscriptionDirective([ + SubscriptionEvent.CREATED, + SubscriptionEvent.UPDATED, + SubscriptionEvent.DELETED, + SubscriptionEvent.RELATIONSHIP_CREATED, + SubscriptionEvent.RELATIONSHIP_DELETED, + ]); expect(parseSubscriptionDirective(directive)).toMatchObject(expected); }); test("should return an instance with only update enabled, when only update passed", () => { const typeDefs = ` - type TestType @subscription(operations: [UPDATE]) { + type TestType @subscription(events: [UPDATED]) { name: String } `; const definition = parse(typeDefs).definitions[0] as ObjectTypeDefinitionNode; const directive = definition?.directives?.length ? (definition.directives[0] as DirectiveNode) : undefined; - const expected = new SubscriptionDirective([SubscriptionOperations.UPDATE]); + const expected = new SubscriptionDirective([SubscriptionEvent.UPDATED]); expect(parseSubscriptionDirective(directive)).toMatchObject(expected); }); diff --git a/packages/graphql/src/schema/parse-subscription-directive.ts b/packages/graphql/src/schema/parse-subscription-directive.ts index f19f334dd0..00fe213a90 100644 --- a/packages/graphql/src/schema/parse-subscription-directive.ts +++ b/packages/graphql/src/schema/parse-subscription-directive.ts @@ -27,10 +27,10 @@ function parseSubscriptionDirective(directiveNode: DirectiveNode | undefined) { throw new Error("Undefined or incorrect directive passed into parseSubscriptionDirective function"); } const arg = parseArguments(subscriptionDirectiveDefinition, directiveNode) as { - operations: ConstructorParameters[0]; + events: ConstructorParameters[0]; }; - return new SubscriptionDirective(arg.operations); + return new SubscriptionDirective(arg.events); } export default parseSubscriptionDirective; diff --git a/packages/graphql/src/schema/parse/get-unique-meta.ts b/packages/graphql/src/schema/parse/get-unique-meta.ts index ff78ebf6e3..b551cd6f3c 100644 --- a/packages/graphql/src/schema/parse/get-unique-meta.ts +++ b/packages/graphql/src/schema/parse/get-unique-meta.ts @@ -17,13 +17,7 @@ * limitations under the License. */ -import type { - BooleanValueNode, - DirectiveNode, - InterfaceTypeDefinitionNode, - ObjectTypeDefinitionNode, - StringValueNode, -} from "graphql"; +import type { DirectiveNode, InterfaceTypeDefinitionNode, ObjectTypeDefinitionNode } from "graphql"; import { Kind } from "graphql"; import type { Unique } from "../../types"; @@ -40,29 +34,14 @@ function getUniqueMeta( if (uniqueDirective) { const constraintName = uniqueDirective.arguments?.find((a) => a.name.value === "constraintName"); - return { - constraintName: constraintName - ? (constraintName.value as StringValueNode).value - : `${type.name.value}_${fieldName}`, - }; + if (constraintName && constraintName.value.kind === Kind.STRING) { + return { constraintName: constraintName.value.value }; + } + return { constraintName: `${type.name.value}_${fieldName}` }; } - let uniqueId = false; - - const idDirective = directives.find((x) => x.name.value === "id"); - - if (idDirective) { - const idDirectiveUniqueArgument = idDirective?.arguments?.find((a) => a.name.value === "unique")?.value as - | BooleanValueNode - | undefined; - // If unique argument is absent from @id directive, default is to use unique constraint - uniqueId = idDirectiveUniqueArgument ? idDirectiveUniqueArgument.value : true; - } - - if (uniqueId) { - return { - constraintName: `${type.name.value}_${fieldName}`, - }; + if (directives.some((directive) => directive.name.value === "relayId")) { + return { constraintName: `${type.name.value}_${fieldName}` }; } } diff --git a/packages/graphql/src/schema/schema-configuration.test.ts b/packages/graphql/src/schema/schema-configuration.test.ts index 1206beb00d..c3be009048 100644 --- a/packages/graphql/src/schema/schema-configuration.test.ts +++ b/packages/graphql/src/schema/schema-configuration.test.ts @@ -27,7 +27,7 @@ import { schemaConfigurationFromSchemaExtensions, } from "./schema-configuration"; import parseExcludeDirective from "./parse-exclude-directive"; -import { SubscriptionOperations } from "../graphql/directives/subscription"; +import { SubscriptionEvent } from "../graphql/directives/subscription"; describe("schemaConfiguration", () => { test("schemaConfigurationFromObjectTypeDefinition should return a Schema Configuration object", () => { @@ -43,11 +43,11 @@ describe("schemaConfiguration", () => { expect(schemaConfiguration).toMatchObject({ queryDirective: new QueryDirective({ read: false, aggregate: false }), subscriptionDirective: new SubscriptionDirective([ - SubscriptionOperations.CREATE, - SubscriptionOperations.DELETE, - SubscriptionOperations.UPDATE, - SubscriptionOperations.CREATE_RELATIONSHIP, - SubscriptionOperations.DELETE_RELATIONSHIP, + SubscriptionEvent.CREATED, + SubscriptionEvent.DELETED, + SubscriptionEvent.UPDATED, + SubscriptionEvent.RELATIONSHIP_CREATED, + SubscriptionEvent.RELATIONSHIP_DELETED, ]), }); }); @@ -67,11 +67,11 @@ describe("schemaConfiguration", () => { expect(schemaConfiguration).toMatchObject({ subscriptionDirective: new SubscriptionDirective([ - SubscriptionOperations.CREATE, - SubscriptionOperations.DELETE, - SubscriptionOperations.UPDATE, - SubscriptionOperations.CREATE_RELATIONSHIP, - SubscriptionOperations.DELETE_RELATIONSHIP, + SubscriptionEvent.CREATED, + SubscriptionEvent.DELETED, + SubscriptionEvent.UPDATED, + SubscriptionEvent.RELATIONSHIP_CREATED, + SubscriptionEvent.RELATIONSHIP_DELETED, ]), }); }); @@ -81,7 +81,7 @@ describe("schemaConfiguration", () => { type TestType @query(read:false) @mutation(operations: [CREATE, DELETE]) { name: String } - extend schema @subscription(operations: [CREATE]) + extend schema @subscription(events: [CREATED]) `; const documentNode = parse(typeDefs); diff --git a/packages/graphql/src/schema/schema-configuration.ts b/packages/graphql/src/schema/schema-configuration.ts index c428fbf2a2..afec6eba7f 100644 --- a/packages/graphql/src/schema/schema-configuration.ts +++ b/packages/graphql/src/schema/schema-configuration.ts @@ -156,8 +156,7 @@ export function getSchemaConfigurationFlags(options: { if (options.excludeDirective) { const excludeOperationsSet = new Set(options.excludeDirective.operations); - schemaConfigurationFlags.read = schemaConfigurationFlags.aggregate = - !excludeOperationsSet.has("read"); + schemaConfigurationFlags.read = schemaConfigurationFlags.aggregate = !excludeOperationsSet.has("read"); schemaConfigurationFlags.create = !excludeOperationsSet.has("create"); schemaConfigurationFlags.delete = !excludeOperationsSet.has("delete"); schemaConfigurationFlags.update = !excludeOperationsSet.has("update"); @@ -183,11 +182,11 @@ export function getSchemaConfigurationFlags(options: { } if (subscriptionDirective) { - schemaConfigurationFlags.subscribeCreate = subscriptionDirective.create; - schemaConfigurationFlags.subscribeUpdate = subscriptionDirective.update; - schemaConfigurationFlags.subscribeDelete = subscriptionDirective.delete; - schemaConfigurationFlags.subscribeCreateRelationship = subscriptionDirective.createRelationship; - schemaConfigurationFlags.subscribeDeleteRelationship = subscriptionDirective.deleteRelationship; + schemaConfigurationFlags.subscribeCreate = subscriptionDirective.created; + schemaConfigurationFlags.subscribeUpdate = subscriptionDirective.updated; + schemaConfigurationFlags.subscribeDelete = subscriptionDirective.deleted; + schemaConfigurationFlags.subscribeCreateRelationship = subscriptionDirective.relationshipCreated; + schemaConfigurationFlags.subscribeDeleteRelationship = subscriptionDirective.relationshipDeleted; } return schemaConfigurationFlags; diff --git a/packages/graphql/src/schema/validation/validate-document.test.ts b/packages/graphql/src/schema/validation/validate-document.test.ts index 2230fc6906..296b7f47b6 100644 --- a/packages/graphql/src/schema/validation/validate-document.test.ts +++ b/packages/graphql/src/schema/validation/validate-document.test.ts @@ -178,9 +178,9 @@ describe("validateDocument", () => { } type Post { - id: ID! @id + id: ID! @id @unique title: String! - datetime: DateTime @readonly @timestamp(operations: [CREATE]) + datetime: DateTime @timestamp(operations: [CREATE]) } `; @@ -371,7 +371,7 @@ describe("validateDocument", () => { test("should not throw error on validation of schema", () => { const doc = gql` type Order { - orderID: ID! @id + orderID: ID! @id @unique placedAt: DateTime @timestamp shipTo: Address! @relationship(type: "SHIPS_TO", direction: OUT) customer: Customer! @relationship(type: "PLACED", direction: IN) diff --git a/packages/graphql/src/translate/batch-create/parser.test.ts b/packages/graphql/src/translate/batch-create/parser.test.ts index 21de2de39b..61a82a7f5c 100644 --- a/packages/graphql/src/translate/batch-create/parser.test.ts +++ b/packages/graphql/src/translate/batch-create/parser.test.ts @@ -35,7 +35,7 @@ describe("TreeDescriptor Parser", () => { beforeAll(async () => { typeDefs = gql` type Actor { - id: ID! @id + id: ID! @id @unique name: String age: Int height: Int diff --git a/packages/graphql/src/types/index.ts b/packages/graphql/src/types/index.ts index f91036510c..05bb1c35dc 100644 --- a/packages/graphql/src/types/index.ts +++ b/packages/graphql/src/types/index.ts @@ -77,9 +77,9 @@ export interface TypeMeta { originalType?: TypeNode; } -export interface Unique { +export type Unique = { constraintName: string; -} +}; export interface Callback { operations: CallbackOperations[]; @@ -430,7 +430,6 @@ export interface Neo4jAuthorizationSettings { key: Key | ((context: Neo4jGraphQLContext) => Key); verify?: boolean; verifyOptions?: JWTVerifyOptions; - globalAuthentication?: boolean; } export interface RemoteJWKS { url: string | URL; diff --git a/packages/graphql/tests/e2e/subscriptions/create.e2e.test.ts b/packages/graphql/tests/e2e/subscriptions/create.e2e.test.ts index 863aab27f9..ea2a870417 100644 --- a/packages/graphql/tests/e2e/subscriptions/create.e2e.test.ts +++ b/packages/graphql/tests/e2e/subscriptions/create.e2e.test.ts @@ -44,7 +44,7 @@ describe("Create Subscription", () => { title: String actors: [${typeActor}] } - type ${typeActor} @exclude(operations: [SUBSCRIBE]) { + type ${typeActor} @subscription(events: []) { name: String } `; diff --git a/packages/graphql/tests/e2e/subscriptions/delete.e2e.test.ts b/packages/graphql/tests/e2e/subscriptions/delete.e2e.test.ts index c9552def48..39e51e721e 100644 --- a/packages/graphql/tests/e2e/subscriptions/delete.e2e.test.ts +++ b/packages/graphql/tests/e2e/subscriptions/delete.e2e.test.ts @@ -44,7 +44,7 @@ describe("Delete Subscription", () => { title: String actors: [${typeActor}] } - type ${typeActor} @exclude(operations: [SUBSCRIBE]) { + type ${typeActor} @subscription(events: []) { name: String }`; diff --git a/packages/graphql/tests/e2e/subscriptions/update.e2e.test.ts b/packages/graphql/tests/e2e/subscriptions/update.e2e.test.ts index 153fadf20c..ee55f463f2 100644 --- a/packages/graphql/tests/e2e/subscriptions/update.e2e.test.ts +++ b/packages/graphql/tests/e2e/subscriptions/update.e2e.test.ts @@ -44,7 +44,7 @@ describe("Update Subscriptions", () => { title: String actors: [${typeActor}] } - type ${typeActor} @exclude(operations: [SUBSCRIBE]) { + type ${typeActor} @subscription(events: []) { name: String } `; diff --git a/packages/graphql/tests/integration/connect-or-create/connect-or-create-id.int.test.ts b/packages/graphql/tests/integration/connect-or-create/connect-or-create-id.int.test.ts index 193973ac15..e2e1ae8799 100644 --- a/packages/graphql/tests/integration/connect-or-create/connect-or-create-id.int.test.ts +++ b/packages/graphql/tests/integration/connect-or-create/connect-or-create-id.int.test.ts @@ -46,7 +46,7 @@ describe("connect-or-create with @id", () => { type ${typeMovie.name} { title: String! @unique subtitle: String @unique - id: ID! @id + id: ID! @id @unique actors: [${typeActor.name}!]! @relationship(type: "ACTED_IN", direction: IN) } diff --git a/packages/graphql/tests/integration/directives/alias.int.test.ts b/packages/graphql/tests/integration/directives/alias.int.test.ts index 10d5c9b614..c847fd16ec 100644 --- a/packages/graphql/tests/integration/directives/alias.int.test.ts +++ b/packages/graphql/tests/integration/directives/alias.int.test.ts @@ -55,7 +55,7 @@ describe("@alias directive", () => { } type ${AliasDirectiveTestUser} implements AliasInterface { - id: ID! @id + id: ID! @id @unique name: String! @alias(property: "dbName") likes: [${AliasDirectiveTestMovie}!]! @relationship(direction: OUT, type: "LIKES", properties: "AliasDirectiveTestLikesProps") createdAt: DateTime! @timestamp(operations: [CREATE]) @alias(property: "dbCreatedAt") @@ -394,7 +394,7 @@ describe("@alias directive", () => { } } `; - + await graphql({ schema: await neoSchema.getSchema(), source: create, diff --git a/packages/graphql/tests/integration/directives/alias/connect-or-create.int.test.ts b/packages/graphql/tests/integration/directives/alias/connect-or-create.int.test.ts index 38cb39152c..053fe846d5 100644 --- a/packages/graphql/tests/integration/directives/alias/connect-or-create.int.test.ts +++ b/packages/graphql/tests/integration/directives/alias/connect-or-create.int.test.ts @@ -53,7 +53,7 @@ describe("@alias directive", () => { type ${typeMovie} { title: String titleAgain: String @alias(property: "title") - id: ID! @id + id: ID! @id @unique actors: [${typeActor}!]! @relationship(type: "ACTED_IN", direction: IN) } `; diff --git a/packages/graphql/tests/integration/directives/authorization/is-authenticated.int.test.ts b/packages/graphql/tests/integration/directives/authorization/is-authenticated.int.test.ts index 6532312dc4..22d3734d1e 100644 --- a/packages/graphql/tests/integration/directives/authorization/is-authenticated.int.test.ts +++ b/packages/graphql/tests/integration/directives/authorization/is-authenticated.int.test.ts @@ -3279,7 +3279,7 @@ describe("auth/is-authenticated", () => { const session = await neo4j.getSession({ defaultAccessMode: "WRITE" }); const typeDefs = ` - type ${User} @exclude { + type ${User} @mutation(operations: []) @query(read: false, aggregate: false) { id: ID name: String } @@ -3329,7 +3329,7 @@ describe("auth/is-authenticated", () => { roles: [String!]! } - type ${User} @exclude { + type ${User} @mutation(operations: []) @query(read: false, aggregate: false) { id: ID name: String } @@ -3375,7 +3375,7 @@ describe("auth/is-authenticated", () => { const session = await neo4j.getSession({ defaultAccessMode: "WRITE" }); const typeDefs = ` - type ${User} @exclude { + type ${User} @mutation(operations: []) @query(read: false, aggregate: false) { id: ID name: String } @@ -3429,7 +3429,7 @@ describe("auth/is-authenticated", () => { roles: [String!]! } - type ${User} @exclude { + type ${User} @mutation(operations: []) @query(read: false, aggregate: false) { id: ID name: String } diff --git a/packages/graphql/tests/integration/directives/authorization/roles.int.test.ts b/packages/graphql/tests/integration/directives/authorization/roles.int.test.ts index 383abedb5e..e1f6512ba8 100644 --- a/packages/graphql/tests/integration/directives/authorization/roles.int.test.ts +++ b/packages/graphql/tests/integration/directives/authorization/roles.int.test.ts @@ -1063,7 +1063,7 @@ describe("auth/roles", () => { roles: [String!]! } - type ${typeUser} @exclude { + type ${typeUser} @mutation(operations: []) @query(read: false, aggregate: false) { id: ID name: String } diff --git a/packages/graphql/tests/integration/directives/cypher/column-name.int.test.ts b/packages/graphql/tests/integration/directives/cypher/column-name.int.test.ts index 644d2dd2fa..c871bc3eda 100644 --- a/packages/graphql/tests/integration/directives/cypher/column-name.int.test.ts +++ b/packages/graphql/tests/integration/directives/cypher/column-name.int.test.ts @@ -863,7 +863,7 @@ describe("cypher with columnName argument", () => { } type User { - id: ID @id + id: ID @id @unique updates: [PostMovieUser!]! @cypher( statement: """ diff --git a/packages/graphql/tests/integration/directives/cypher/cypher.int.test.ts b/packages/graphql/tests/integration/directives/cypher/cypher.int.test.ts index c93bf6808b..5c62e732ea 100644 --- a/packages/graphql/tests/integration/directives/cypher/cypher.int.test.ts +++ b/packages/graphql/tests/integration/directives/cypher/cypher.int.test.ts @@ -863,7 +863,7 @@ describe("cypher", () => { } type User { - id: ID @id + id: ID @id @unique updates: [PostMovieUser!]! @cypher( statement: """ diff --git a/packages/graphql/tests/integration/directives/id.int.test.ts b/packages/graphql/tests/integration/directives/id.int.test.ts index 76ef69833e..f15b51e1a7 100644 --- a/packages/graphql/tests/integration/directives/id.int.test.ts +++ b/packages/graphql/tests/integration/directives/id.int.test.ts @@ -42,7 +42,7 @@ describe("@id directive", () => { const typeDefs = ` type Movie { - id: ID! @id + id: ID! @id @unique name: String } `; @@ -128,12 +128,12 @@ describe("@id directive", () => { const typeDefs = ` type Genre { - id: ID! @id + id: ID! @id @unique name: String! } type Movie { - id: ID! @id + id: ID! @id @unique name: String! genres: [Genre!]! @relationship(type: "HAS_GENRE", direction: OUT) } @@ -188,7 +188,7 @@ describe("@id directive", () => { const typeDefs = ` type Actor { - id: ID! @id + id: ID! @id @unique name: String! } @@ -198,7 +198,7 @@ describe("@id directive", () => { } type Movie { - id: ID! @id + id: ID! @id @unique title: String! actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN, properties: "ActedIn") } diff --git a/packages/graphql/tests/integration/directives/relationship/nestedOperations.int.test.ts b/packages/graphql/tests/integration/directives/relationship/nestedOperations.int.test.ts index 6bce5bc36b..87986c1ca3 100644 --- a/packages/graphql/tests/integration/directives/relationship/nestedOperations.int.test.ts +++ b/packages/graphql/tests/integration/directives/relationship/nestedOperations.int.test.ts @@ -385,7 +385,7 @@ describe("@relationhip - nestedOperations", () => { test("Should only be able to perform the connectOrCreate nested op when CONNECT_OR_CREATE is the only nestedOperation specified", async () => { const typeDefs = `#graphql type ${Person} { - id: ID! @id + id: ID! @id @unique name: String } @@ -1148,7 +1148,7 @@ describe("@relationhip - nestedOperations", () => { test("Should only be able to perform the connectOrCreate nested op when CONNECT_OR_CREATE is the only nestedOperation specified", async () => { const typeDefs = `#graphql type ${PersonOne} { - id: ID! @id + id: ID! @id @unique name: String } diff --git a/packages/graphql/tests/integration/directives/unique.int.test.ts b/packages/graphql/tests/integration/directives/unique.int.test.ts index 3d290ac5fe..c7d449d113 100644 --- a/packages/graphql/tests/integration/directives/unique.int.test.ts +++ b/packages/graphql/tests/integration/directives/unique.int.test.ts @@ -708,7 +708,7 @@ describe("assertIndexesAndConstraints/unique", () => { const typeDefs = ` type ${type.name} { - id: ID! @id + id: ID! @id @unique name: String! } `; @@ -732,7 +732,7 @@ describe("assertIndexesAndConstraints/unique", () => { const typeDefs = ` type ${type.name} { - id: ID! @id @alias(property: "identifier") + id: ID! @id @unique @alias(property: "identifier") name: String! } `; @@ -745,54 +745,6 @@ describe("assertIndexesAndConstraints/unique", () => { ).rejects.toThrow(`Missing constraint for ${type.name}.identifier`); }); - test("should not throw an error when unique argument is set to false", async () => { - // Skip if multi-db not supported - if (!MULTIDB_SUPPORT) { - console.log("MULTIDB_SUPPORT NOT AVAILABLE - SKIPPING"); - return; - } - - const type = new UniqueType("User"); - - const typeDefs = ` - type ${type.name} { - id: ID! @id(unique: false) - name: String! - } - `; - - const neoSchema = new Neo4jGraphQL({ typeDefs }); - await neoSchema.getSchema(); - - await expect( - neoSchema.assertIndexesAndConstraints({ driver, sessionConfig: { database: databaseName } }) - ).resolves.not.toThrow(); - }); - - test("should not throw an error when unique argument is set to false when used with @alias", async () => { - // Skip if multi-db not supported - if (!MULTIDB_SUPPORT) { - console.log("MULTIDB_SUPPORT NOT AVAILABLE - SKIPPING"); - return; - } - - const type = new UniqueType("User"); - - const typeDefs = ` - type ${type.name} { - id: ID! @id(unique: false) @alias(property: "identifier") - name: String! - } - `; - - const neoSchema = new Neo4jGraphQL({ typeDefs }); - await neoSchema.getSchema(); - - await expect( - neoSchema.assertIndexesAndConstraints({ driver, sessionConfig: { database: databaseName } }) - ).resolves.not.toThrow(); - }); - test("should not throw an error when all necessary constraints exist", async () => { // Skip if multi-db not supported if (!MULTIDB_SUPPORT) { @@ -804,7 +756,7 @@ describe("assertIndexesAndConstraints/unique", () => { const typeDefs = ` type ${type.name} { - id: ID! @id + id: ID! @id @unique name: String! } `; @@ -840,7 +792,7 @@ describe("assertIndexesAndConstraints/unique", () => { const typeDefs = ` type ${type.name} { - id: ID! @id @alias(property: "identifier") + id: ID! @id @unique @alias(property: "identifier") name: String! } `; @@ -876,7 +828,7 @@ describe("assertIndexesAndConstraints/unique", () => { const typeDefs = ` type ${type.name} { - id: ID! @id + id: ID! @id @unique name: String! } `; @@ -922,7 +874,7 @@ describe("assertIndexesAndConstraints/unique", () => { const typeDefs = ` type ${type.name} { - id: ID! @id @alias(property: "identifier") + id: ID! @id @unique @alias(property: "identifier") name: String! } `; @@ -960,101 +912,6 @@ describe("assertIndexesAndConstraints/unique", () => { } }); - test("should not create a constraint if it doesn't exist and unique option is set to false", async () => { - // Skip if multi-db not supported - if (!MULTIDB_SUPPORT) { - console.log("MULTIDB_SUPPORT NOT AVAILABLE - SKIPPING"); - return; - } - - const type = new UniqueType("User"); - - const typeDefs = ` - type ${type.name} { - id: ID! @id(unique: false) - name: String! - } - `; - - const neoSchema = new Neo4jGraphQL({ typeDefs }); - await neoSchema.getSchema(); - - await expect( - neoSchema.assertIndexesAndConstraints({ - driver, - sessionConfig: { database: databaseName }, - options: { create: true }, - }) - ).resolves.not.toThrow(); - - const session = driver.session({ database: databaseName }); - - const cypher = "SHOW UNIQUE CONSTRAINTS"; - - try { - const result = await session.run(cypher); - - expect( - result.records - .map((record) => { - return record.toObject(); - }) - .filter((record) => record.labelsOrTypes.includes(type.name)) - ).toHaveLength(0); - } finally { - await session.close(); - } - }); - - test("should not create a constraint if it doesn't exist and unique option is set to false when used with @alias", async () => { - // Skip if multi-db not supported - if (!MULTIDB_SUPPORT) { - console.log("MULTIDB_SUPPORT NOT AVAILABLE - SKIPPING"); - return; - } - - const type = new UniqueType("User"); - - const typeDefs = ` - type ${type.name} { - id: ID! @id(unique: false) @alias(property: "identifier") - name: String! - } - `; - - const neoSchema = new Neo4jGraphQL({ typeDefs }); - await neoSchema.getSchema(); - - await expect( - neoSchema.assertIndexesAndConstraints({ - driver, - sessionConfig: { database: databaseName }, - options: { create: true }, - }) - ).resolves.not.toThrow(); - - const session = driver.session({ database: databaseName }); - - const cypher = "SHOW UNIQUE CONSTRAINTS"; - - try { - const result = await session.run(cypher); - - expect( - result.records - .map((record) => { - return record.toObject(); - }) - .filter( - (record) => - record.labelsOrTypes.includes(type.name) && record.properties.includes("identifier") - ) - ).toHaveLength(0); - } finally { - await session.close(); - } - }); - test("should not throw if constraint exists on an additional label", async () => { // Skip if multi-db not supported if (!MULTIDB_SUPPORT) { @@ -1065,8 +922,8 @@ describe("assertIndexesAndConstraints/unique", () => { const baseType = new UniqueType("Base"); const additionalType = new UniqueType("Additional"); const typeDefs = ` - type ${baseType.name} @node(labels: ["${baseType.name}", "${additionalType.name}"]) @exclude(operations: [CREATE, UPDATE, DELETE]) { - someIdProperty: ID! @id @alias(property: "someAlias") + type ${baseType.name} @node(labels: ["${baseType.name}", "${additionalType.name}"]) @mutation(operations: []) { + someIdProperty: ID! @id @unique @alias(property: "someAlias") title: String! } `; @@ -1106,8 +963,8 @@ describe("assertIndexesAndConstraints/unique", () => { const baseType = new UniqueType("Base"); const additionalType = new UniqueType("Additional"); const typeDefs = ` - type ${baseType.name} @node(labels: ["${baseType.name}", "${additionalType.name}"]) @exclude(operations: [CREATE, UPDATE, DELETE]) { - someIdProperty: ID! @id @alias(property: "someAlias") + type ${baseType.name} @node(labels: ["${baseType.name}", "${additionalType.name}"]) @mutation(operations: []) { + someIdProperty: ID! @id @unique @alias(property: "someAlias") title: String! } `; diff --git a/packages/graphql/tests/integration/filtering/advanced-filtering.int.test.ts b/packages/graphql/tests/integration/filtering/advanced-filtering.int.test.ts index 47973fa070..85e4c8dd29 100644 --- a/packages/graphql/tests/integration/filtering/advanced-filtering.int.test.ts +++ b/packages/graphql/tests/integration/filtering/advanced-filtering.int.test.ts @@ -1983,13 +1983,13 @@ describe("Advanced Filtering", () => { const typeDefs = ` type Movie { - id: ID! @id + id: ID! @id @unique budget: Int! actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN) } type Actor { - id: ID! @id + id: ID! @id @unique flag: Boolean! actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: OUT) } diff --git a/packages/graphql/tests/integration/global-node.int.test.ts b/packages/graphql/tests/integration/global-node.int.test.ts index 7700c3f5e2..e66fde4324 100644 --- a/packages/graphql/tests/integration/global-node.int.test.ts +++ b/packages/graphql/tests/integration/global-node.int.test.ts @@ -47,7 +47,7 @@ describe("Global node resolution", () => { const session = await neo4j.getSession(); const typeDefs = `type ${typeFilm.name} { - dbId: ID! @id(global:true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") title: String! }`; @@ -92,7 +92,7 @@ describe("Global node resolution", () => { const session = await neo4j.getSession(); const typeDefs = `type ${typeFilm.name} { - title: ID! @id(autogenerate: false, global: true) + title: ID! @relayId }`; const neoSchema = new Neo4jGraphQL({ @@ -132,7 +132,7 @@ describe("Global node resolution", () => { test("returns the correct id when queried", async () => { const session = await neo4j.getSession(); const typeDefs = `type ${typeFilm.name} { - title: ID! @id(autogenerate: false, global: true) + title: ID! @relayId }`; const neoSchema = new Neo4jGraphQL({ @@ -186,13 +186,13 @@ describe("Global node resolution", () => { test("return the correct id when the underlying field is an aliased id db property", async () => { const typeDefs = gql` type ${typeFilm.name} { - dbId: ID! @id(autogenerate: false, global: true) @alias(property: "id") + dbId: ID! @relayId @alias(property: "id") title: String! createdBy: ${typeUser.name}! @relationship(type: "CREATED_BY", direction: OUT) } type ${typeUser.name} { - dbId: ID! @id(autogenerate: false, global: true) @alias(property: "id") + dbId: ID! @relayId @alias(property: "id") name: String! createdFilms: [${typeFilm.name}!]! @relationship(type: "CREATED_BY", direction: IN) } @@ -267,13 +267,13 @@ describe("Global node resolution", () => { test("return the correct id when the underlying field is of type Int", async () => { const typeDefs = gql` type ${typeFilm.name} { - dbId: Int! @id(autogenerate: false, global: true) @alias(property: "id") + dbId: Int! @relayId @alias(property: "id") title: String! createdBy: ${typeUser.name}! @relationship(type: "CREATED_BY", direction: OUT) } type ${typeUser.name} { - dbId: Int! @id(autogenerate: false, global: true) @alias(property: "id") + dbId: Int! @relayId @alias(property: "id") name: String! createdFilms: [${typeFilm.name}!]! @relationship(type: "CREATED_BY", direction: IN) } @@ -348,12 +348,12 @@ describe("Global node resolution", () => { test("sends and returns the correct selectionSet for the node", async () => { const typeDefs = ` type ${typeFilm.name} { - title: ID! @id(autogenerate: false, global: true) + title: ID! @relayId website: String } type FilmActor { - name: ID! @id(autogenerate: false, global: true) + name: ID! @relayId hairColor: String } `; @@ -446,13 +446,13 @@ describe("Global node resolution", () => { const typeDefs = ` type ${typeUser.name} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! created: [${typeFilm.name}!]! @relationship(type: "CREATED", direction: OUT) } type ${typeFilm.name} { - title: ID! @id(global: true, autogenerate: false) + title: ID! @relayId creator: ${typeUser.name}! @relationship(type: "CREATED", direction: IN) } @@ -509,7 +509,7 @@ describe("Global node resolution", () => { const typeDefs = ` type ${typeUser.name} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! } @@ -569,7 +569,7 @@ describe("Global node resolution", () => { } type ${typeUser.name} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! } diff --git a/packages/graphql/tests/integration/interfaces.int.test.ts b/packages/graphql/tests/integration/interfaces.int.test.ts index 32058384c7..beadf21fb7 100644 --- a/packages/graphql/tests/integration/interfaces.int.test.ts +++ b/packages/graphql/tests/integration/interfaces.int.test.ts @@ -51,18 +51,18 @@ describe("Interfaces tests", () => { const typeDefs = ` type ${SomeNodeType} { - id: ID! @id + id: ID! @id @unique other: ${OtherNodeType}! @relationship(type: "HAS_OTHER_NODES", direction: OUT) } type ${OtherNodeType} { - id: ID! @id + id: ID! @id @unique interfaceField: MyInterface! @relationship(type: "HAS_INTERFACE_NODES", direction: OUT) } interface MyInterface { id: ID! @id } type ${MyImplementationType} implements MyInterface { - id: ID! @id + id: ID! @id @unique } extend type ${SomeNodeType} @authentication diff --git a/packages/graphql/tests/integration/issues/1121.int.test.ts b/packages/graphql/tests/integration/issues/1121.int.test.ts index f235db29ec..61d896083f 100644 --- a/packages/graphql/tests/integration/issues/1121.int.test.ts +++ b/packages/graphql/tests/integration/issues/1121.int.test.ts @@ -56,12 +56,12 @@ describe("https://github.com/neo4j/graphql/issues/1121", () => { } interface Ingredient_Interface { - id: ID! @id(autogenerate: true) + id: ID! @id name: String } type ${Banana.name} implements Ingredient_Interface { - id: ID! @id(autogenerate: true) + id: ID! @id @unique name: String sweetness: String qty_ozs: Float @@ -70,14 +70,14 @@ describe("https://github.com/neo4j/graphql/issues/1121", () => { union Ingredient_Union = ${Sugar.name} | ${Syrup.name} type ${Sugar.name} { - id: ID! @id(autogenerate: true) + id: ID! @id @unique name: String sweetness: String qty_ozs: Float } type ${Syrup.name} { - id: ID! @id(autogenerate: true) + id: ID! @id @unique name: String sweetness: String qty_ozs: Float diff --git a/packages/graphql/tests/integration/issues/1127.int.test.ts b/packages/graphql/tests/integration/issues/1127.int.test.ts index ed27dd43ea..dd89ff1e30 100644 --- a/packages/graphql/tests/integration/issues/1127.int.test.ts +++ b/packages/graphql/tests/integration/issues/1127.int.test.ts @@ -39,7 +39,7 @@ describe("https://github.com/neo4j/graphql/issues/1127", () => { const typeDefs = ` type ${customerType.name} { - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) @@ -47,7 +47,7 @@ describe("https://github.com/neo4j/graphql/issues/1127", () => { } type ${addressType.name} { - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) diff --git a/packages/graphql/tests/integration/issues/1150.int.test.ts b/packages/graphql/tests/integration/issues/1150.int.test.ts index b1be721cd5..d87c187eed 100644 --- a/packages/graphql/tests/integration/issues/1150.int.test.ts +++ b/packages/graphql/tests/integration/issues/1150.int.test.ts @@ -41,7 +41,7 @@ describe("https://github.com/neo4j/graphql/issues/1150", () => { } type Battery { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! } @@ -49,12 +49,12 @@ describe("https://github.com/neo4j/graphql/issues/1150", () => { @authorization(validate: [{ when: [BEFORE], where: { jwt: { roles_INCLUDES: "admin" } } }]) type CombustionEngine { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! } type Drive { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! driveCompositions: [DriveComposition!]! @relationship(type: "CONSISTS_OF", properties: "RelationProps", direction: OUT) @@ -63,7 +63,7 @@ describe("https://github.com/neo4j/graphql/issues/1150", () => { union DriveComponent = Battery | CombustionEngine type DriveComposition { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! driveComponent: [DriveComponent!]! @relationship(type: "HAS", properties: "RelationProps", direction: OUT) diff --git a/packages/graphql/tests/integration/issues/1221.int.test.ts b/packages/graphql/tests/integration/issues/1221.int.test.ts index 58a49e6ffd..615fcd3e29 100644 --- a/packages/graphql/tests/integration/issues/1221.int.test.ts +++ b/packages/graphql/tests/integration/issues/1221.int.test.ts @@ -36,13 +36,13 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { const typeDefs = ` type ${testSeries} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! architecture: [${testMasterData}!]! @relationship(type: "ARCHITECTURE", properties: "RelationProps", direction: OUT) } - type ${testNameDetails} @exclude(operations: [CREATE, UPDATE, DELETE, READ]) { + type ${testNameDetails} @mutation(operations: []) @query(read: false, aggregate: false) { fullName: String! } @@ -51,7 +51,7 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { } type ${testMasterData} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! nameDetails: ${testNameDetails} @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } @@ -59,7 +59,7 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { const extendedTypeDefs = ` type ${testMain} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! main: [${testSeries}!]! @relationship(type: "MAIN", properties: "RelationProps", direction: OUT) } diff --git a/packages/graphql/tests/integration/issues/1249.int.test.ts b/packages/graphql/tests/integration/issues/1249.int.test.ts index 0ea6e2924b..81c12ddf65 100644 --- a/packages/graphql/tests/integration/issues/1249.int.test.ts +++ b/packages/graphql/tests/integration/issues/1249.int.test.ts @@ -30,14 +30,14 @@ describe("https://github.com/neo4j/graphql/issues/1249", () => { const typeDefs = ` type Bulk - @exclude(operations: [CREATE, DELETE, UPDATE]) + @mutation(operations: []) @node(labels: ["Bulk", "$tenant"]) { id: ID! supplierMaterialNumber: String! material: Material! @relationship(type: "MATERIAL_BULK", direction: OUT) } - type Material @exclude(operations: [CREATE, DELETE, UPDATE]) { + type Material @mutation(operations: []) { id: ID! itemNumber: String! @@ -45,7 +45,7 @@ describe("https://github.com/neo4j/graphql/issues/1249", () => { @relationship(type: "MATERIAL_SUPPLIER", properties: "RelationMaterialSupplier", direction: OUT) } - type Supplier @exclude(operations: [CREATE, DELETE, UPDATE]) { + type Supplier @mutation(operations: []) { id: ID! name: String supplierId: String! diff --git a/packages/graphql/tests/integration/issues/1287.int.test.ts b/packages/graphql/tests/integration/issues/1287.int.test.ts index 7cfdb0fb0f..e3651587ea 100644 --- a/packages/graphql/tests/integration/issues/1287.int.test.ts +++ b/packages/graphql/tests/integration/issues/1287.int.test.ts @@ -35,7 +35,7 @@ describe("https://github.com/neo4j/graphql/issues/1287", () => { const typeDefs = ` type ${screeningsType} { - id: ID! @id + id: ID! @id @unique title: String beginsAt: DateTime! movie: ${norwegianScreenable}! @relationship(type: "SCREENS_MOVIE", direction: OUT) @@ -50,7 +50,7 @@ describe("https://github.com/neo4j/graphql/issues/1287", () => { } type ${norwegianScreenable} implements ScreenableMeta { - id: ID! @id + id: ID! @id @unique spokenLanguage: String! subtitlesLanguage: String! premiere: DateTime! diff --git a/packages/graphql/tests/integration/issues/1430.int.test.ts b/packages/graphql/tests/integration/issues/1430.int.test.ts index b9e08e18f4..ce7addeaee 100644 --- a/packages/graphql/tests/integration/issues/1430.int.test.ts +++ b/packages/graphql/tests/integration/issues/1430.int.test.ts @@ -39,24 +39,24 @@ describe("https://github.com/neo4j/graphql/issues/1430", () => { const typeDefs = ` type ${testAbce.name} { - id:ID @id + id:ID @id @unique name: String interface: InterfaceMom @relationship(type:"HAS_INTERFACE", direction:OUT) } interface InterfaceMom { - id:ID @id + id:ID @id name:String } type ${testChildOne.name} implements InterfaceMom { - id:ID @id + id:ID @id @unique name:String feathur: String } type ${testChildTwo.name} implements InterfaceMom { - id:ID @id + id:ID @id @unique name:String sth: String } diff --git a/packages/graphql/tests/integration/issues/1535.int.test.ts b/packages/graphql/tests/integration/issues/1535.int.test.ts index 98088bf00c..616456c9e1 100644 --- a/packages/graphql/tests/integration/issues/1535.int.test.ts +++ b/packages/graphql/tests/integration/issues/1535.int.test.ts @@ -47,7 +47,7 @@ describe("https://github.com/neo4j/graphql/issues/1535", () => { const typeDefs = ` type ${testTenant} { - id: ID! @id + id: ID! @id @unique name: String! events: [Event!]! @relationship(type: "HOSTED_BY", direction: IN) fooBars: [FooBar!]! @relationship(type: "HAS_FOOBARS", direction: OUT) @@ -60,7 +60,7 @@ describe("https://github.com/neo4j/graphql/issues/1535", () => { } type Screening implements Event { - id: ID! @id + id: ID! @id @unique title: String beginsAt: DateTime! } @@ -73,7 +73,7 @@ describe("https://github.com/neo4j/graphql/issues/1535", () => { } type FooBar { - id: ID! @id + id: ID! @id @unique name: String! } `; diff --git a/packages/graphql/tests/integration/issues/1536.int.test.ts b/packages/graphql/tests/integration/issues/1536.int.test.ts index 759bd04bc8..8c1d76a57f 100644 --- a/packages/graphql/tests/integration/issues/1536.int.test.ts +++ b/packages/graphql/tests/integration/issues/1536.int.test.ts @@ -48,12 +48,12 @@ describe("https://github.com/neo4j/graphql/issues/1536", () => { const typeDefs = ` type ${SomeNodeType} { - id: ID! @id + id: ID! @id @unique other: ${OtherNodeType}! @relationship(type: "HAS_OTHER_NODES", direction: OUT) } type ${OtherNodeType} { - id: ID! @id + id: ID! @id @unique interfaceField: MyInterface! @relationship(type: "HAS_INTERFACE_NODES", direction: OUT) } @@ -62,7 +62,7 @@ describe("https://github.com/neo4j/graphql/issues/1536", () => { } type ${MyImplementationType} implements MyInterface { - id: ID! @id + id: ID! @id @unique } `; diff --git a/packages/graphql/tests/integration/issues/1735.int.test.ts b/packages/graphql/tests/integration/issues/1735.int.test.ts index 0b37d7fcd2..642961f21a 100644 --- a/packages/graphql/tests/integration/issues/1735.int.test.ts +++ b/packages/graphql/tests/integration/issues/1735.int.test.ts @@ -41,7 +41,7 @@ describe("https://github.com/neo4j/graphql/issues/1735", () => { } type ${movieType.name} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") title: String! actors: [${actorType.name}!]! @relationship(type: "ACTED_IN", direction: IN, properties: "MovieActorEdgeProperties") leadActorsCount: Int! @cypher(statement:""" @@ -52,7 +52,7 @@ describe("https://github.com/neo4j/graphql/issues/1735", () => { } type ${actorType.name} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! movies: [${movieType.name}!]! @relationship(type: "ACTED_IN", direction: OUT, properties: "MovieActorEdgeProperties") } diff --git a/packages/graphql/tests/integration/issues/1751.int.test.ts b/packages/graphql/tests/integration/issues/1751.int.test.ts index 9bd461d58a..fe7263a224 100644 --- a/packages/graphql/tests/integration/issues/1751.int.test.ts +++ b/packages/graphql/tests/integration/issues/1751.int.test.ts @@ -42,7 +42,7 @@ describe("https://github.com/neo4j/graphql/issues/1735", () => { } type ${adminType} { - adminId: ID! @id + adminId: ID! @id @unique organizations: [${organizationType}!]! @relationship(type: "HAS_ADMINISTRATOR", direction: IN) } `; diff --git a/packages/graphql/tests/integration/issues/1760.int.test.ts b/packages/graphql/tests/integration/issues/1760.int.test.ts index c458316a94..f283821eef 100644 --- a/packages/graphql/tests/integration/issues/1760.int.test.ts +++ b/packages/graphql/tests/integration/issues/1760.int.test.ts @@ -41,15 +41,15 @@ describe("https://github.com/neo4j/graphql/issues/1760", () => { } interface BusinessObject { - id: ID! @id(autogenerate: false) + id: ID! nameDetails: NameDetails } type ApplicationVariant implements BusinessObject @authorization(validate: [{ when: [BEFORE], where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { + @mutation(operations: []) { markets: [Market!]! @relationship(type: "HAS_MARKETS", direction: OUT) - id: ID! @id(autogenerate: false) + id: ID! @unique relatedId: ID @cypher(statement: "MATCH (this)<-[:HAS_BASE]-(n:BaseObject) RETURN n.id as res", columnName: "res") baseObject: BaseObject! @relationship(type: "HAS_BASE", direction: IN) @@ -59,21 +59,22 @@ describe("https://github.com/neo4j/graphql/issues/1760", () => { type NameDetails @authorization(validate: [{ when: [BEFORE], where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, READ, UPDATE, DELETE]) { + @mutation(operations: []) + @query(read: false, aggregate: false) { fullName: String! } type Market implements BusinessObject @authorization(validate: [{ when: [BEFORE], where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { - id: ID! @id(autogenerate: false) + @mutation(operations: []) { + id: ID! @unique nameDetails: NameDetails @relationship(type: "HAS_NAME", direction: OUT) } type BaseObject @authorization(validate: [{ when: [BEFORE], where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { - id: ID! @id + @mutation(operations: []) { + id: ID! @id @unique } `; const neoGraphql = new Neo4jGraphQL({ typeDefs, driver, features: { authorization: { key: secret } } }); diff --git a/packages/graphql/tests/integration/issues/1782.int.test.ts b/packages/graphql/tests/integration/issues/1782.int.test.ts index 3af9d04847..9498891898 100644 --- a/packages/graphql/tests/integration/issues/1782.int.test.ts +++ b/packages/graphql/tests/integration/issues/1782.int.test.ts @@ -38,13 +38,13 @@ describe("https://github.com/neo4j/graphql/issues/1782", () => { const typeDefs = ` type ${testSeries} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! architecture: [${testMasterData}!]! @relationship(type: "ARCHITECTURE", properties: "RelationProps", direction: OUT) } - type ${testNameDetails} @exclude(operations: [CREATE, UPDATE, DELETE, READ]) { + type ${testNameDetails} @mutation(operations: []) @query(read: false, aggregate: false) { fullName: String! } @@ -53,7 +53,7 @@ describe("https://github.com/neo4j/graphql/issues/1782", () => { } type ${testMasterData} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! nameDetails: ${testNameDetails} @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } @@ -61,7 +61,7 @@ describe("https://github.com/neo4j/graphql/issues/1782", () => { const extendedTypeDefs = ` type ${testMain} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! main: [${testSeries}!]! @relationship(type: "MAIN", properties: "RelationProps", direction: OUT) } diff --git a/packages/graphql/tests/integration/issues/1783.int.test.ts b/packages/graphql/tests/integration/issues/1783.int.test.ts index 86e276aa1c..618d409420 100644 --- a/packages/graphql/tests/integration/issues/1783.int.test.ts +++ b/packages/graphql/tests/integration/issues/1783.int.test.ts @@ -35,14 +35,14 @@ describe("https://github.com/neo4j/graphql/issues/1783", () => { const typeDefs = ` type ${testSeries} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! architecture: [${testMasterData}!]! @relationship(type: "ARCHITECTURE", properties: "RelationProps", direction: OUT) nameDetails: ${testNameDetails} @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } - type ${testNameDetails} @exclude(operations: [CREATE, UPDATE, DELETE, READ]) { + type ${testNameDetails} @mutation(operations: []) @query(read: false, aggregate: false) { fullName: String! } @@ -51,7 +51,7 @@ describe("https://github.com/neo4j/graphql/issues/1783", () => { } type ${testMasterData} { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! nameDetails: ${testNameDetails} @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } diff --git a/packages/graphql/tests/integration/issues/1817.int.test.ts b/packages/graphql/tests/integration/issues/1817.int.test.ts index 60e844a422..07538f15d4 100644 --- a/packages/graphql/tests/integration/issues/1817.int.test.ts +++ b/packages/graphql/tests/integration/issues/1817.int.test.ts @@ -35,30 +35,30 @@ describe("https://github.com/neo4j/graphql/issues/1817", () => { const typeDefs = ` type ${TypeContainerType} { - id: ID! @id + id: ID! @id @unique name: String! specifiesContainers: [${TypeContainer}!]! @relationship(type: "hasContainer", properties: "CoT_Co_hasContainer", direction: OUT) } type ${TypeContainer} { - id: ID! @id + id: ID! @id @unique name: String containsMaterial: [${TypeMaterial}!]! @relationship(type: "hasMaterial", properties: "Co_Ma_hasMaterial", direction: OUT) } type ${TypeMaterial} { - id: ID! @id + id: ID! @id @unique name: String } interface CoT_Co_hasContainer @relationshipProperties { - id: ID! @id + id: ID! @id } interface Co_Ma_hasMaterial @relationshipProperties { - id: ID! @id + id: ID! @id } `; diff --git a/packages/graphql/tests/integration/issues/1933.int.test.ts b/packages/graphql/tests/integration/issues/1933.int.test.ts index 501f05e35c..b16a3fc571 100644 --- a/packages/graphql/tests/integration/issues/1933.int.test.ts +++ b/packages/graphql/tests/integration/issues/1933.int.test.ts @@ -39,9 +39,9 @@ describe("https://github.com/neo4j/graphql/issues/1933", () => { const typeDefs = ` type ${employeeType} { - employeeId: ID! @id(autogenerate: false) - firstName: String! @readonly - lastName: String @readonly + employeeId: ID! @unique + firstName: String! @settable(onCreate: false, onUpdate: false) + lastName: String @settable(onCreate: false, onUpdate: false) projects: [${projectType}!]! @relationship(type: "PARTICIPATES", direction: OUT, properties: "EmployeeParticipationProperties") } @@ -51,8 +51,8 @@ describe("https://github.com/neo4j/graphql/issues/1933", () => { } type ${projectType} { - projectId: ID! @id(autogenerate: false) - name: String! @readonly + projectId: ID! @unique + name: String! @settable(onCreate: false, onUpdate: false) description: String employees: [${employeeType}!]! @relationship(type: "PARTICIPATES", direction: IN, properties: "EmployeeParticipationProperties") diff --git a/packages/graphql/tests/integration/issues/200.int.test.ts b/packages/graphql/tests/integration/issues/200.int.test.ts index be3b3507fc..4a454894e9 100644 --- a/packages/graphql/tests/integration/issues/200.int.test.ts +++ b/packages/graphql/tests/integration/issues/200.int.test.ts @@ -39,7 +39,7 @@ describe("https://github.com/neo4j/graphql/issues/200", () => { test("should successfully execute given mutation", async () => { const typeDefs = ` type Category { - categoryId: ID! @id + categoryId: ID! @id @unique name: String! description: String! @default(value: "") exampleImageLocations: [String!] diff --git a/packages/graphql/tests/integration/issues/2022.int.test.ts b/packages/graphql/tests/integration/issues/2022.int.test.ts index 6a5c421f9c..31a46f29a3 100644 --- a/packages/graphql/tests/integration/issues/2022.int.test.ts +++ b/packages/graphql/tests/integration/issues/2022.int.test.ts @@ -48,14 +48,14 @@ describe("https://github.com/neo4j/graphql/issues/2022", () => { const typeDefs = ` type ${ArtPiece} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") title: String! auction: ${AuctionItem}! @relationship(type: "SOLD_AT_AUCTION_AS", direction: OUT) owner: ${Organization}! @relationship(type: "OWNED_BY", direction: OUT) } type ${AuctionItem} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") auctionName: String! lotNumber: Int! @@ -65,7 +65,7 @@ describe("https://github.com/neo4j/graphql/issues/2022", () => { } type ${Organization} { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! artCollection: [${ArtPiece}!]! @relationship(type: "OWNED_BY", direction: IN) diff --git a/packages/graphql/tests/integration/issues/2100.int.test.ts b/packages/graphql/tests/integration/issues/2100.int.test.ts index 6bb5c4d012..da1df4bd0c 100644 --- a/packages/graphql/tests/integration/issues/2100.int.test.ts +++ b/packages/graphql/tests/integration/issues/2100.int.test.ts @@ -54,13 +54,13 @@ describe("https://github.com/neo4j/graphql/issues/2100", () => { } interface Church { - id: ID @id + id: ID @id name: String! serviceLogs: [${ServiceLogType}!]! @relationship(type: "HAS_HISTORY", direction: OUT) } type ${BacentaType} implements Church @authentication { - id: ID @id + id: ID @id @unique name: String! serviceLogs: [${ServiceLogType}!]! @relationship(type: "HAS_HISTORY", direction: OUT) bussing(limit: Int!): [${BussingRecordType}!]! diff --git a/packages/graphql/tests/integration/issues/2189.int.test.ts b/packages/graphql/tests/integration/issues/2189.int.test.ts index b91825682c..d9ba87ac00 100644 --- a/packages/graphql/tests/integration/issues/2189.int.test.ts +++ b/packages/graphql/tests/integration/issues/2189.int.test.ts @@ -42,7 +42,7 @@ describe("https://github.com/neo4j/graphql/issues/2189", () => { const typeDefs = ` type ${Test_Item} { - uuid: ID! @id + uuid: ID! @id @unique int: Int str: String bool: Boolean @@ -59,7 +59,7 @@ describe("https://github.com/neo4j/graphql/issues/2189", () => { ) } type ${Test_Feedback} { - uuid: ID! @id + uuid: ID! @id @unique int: Int str: String bool: Boolean diff --git a/packages/graphql/tests/integration/issues/2261.int.test.ts b/packages/graphql/tests/integration/issues/2261.int.test.ts index 49d7c3e068..f057b94828 100644 --- a/packages/graphql/tests/integration/issues/2261.int.test.ts +++ b/packages/graphql/tests/integration/issues/2261.int.test.ts @@ -50,13 +50,13 @@ describe("https://github.com/neo4j/graphql/issues/2261", () => { } type ${ProgrammeItem} implements Product { - id: ID! @id + id: ID! @id @unique uri: String! @cypher(statement: "RETURN 'example://programme-item/' + this.id as x", columnName: "x") editions: [${Edition}!]! @relationship(type: "HAS_EDITION", direction: OUT) } type ${Edition} { - id: ID! @id + id: ID! @id @unique uri: String! @cypher(statement: "RETURN 'example://edition/' + this.id as x", columnName: "x") product: Product! @relationship(type: "HAS_EDITION", direction: IN) } diff --git a/packages/graphql/tests/integration/issues/235.int.test.ts b/packages/graphql/tests/integration/issues/235.int.test.ts index c14795947b..2633918a79 100644 --- a/packages/graphql/tests/integration/issues/235.int.test.ts +++ b/packages/graphql/tests/integration/issues/235.int.test.ts @@ -40,19 +40,19 @@ describe("https://github.com/neo4j/graphql/issues/235", () => { test("should create the correct number of nodes following multiple connect", async () => { const typeDefs = gql` type A { - ID: ID! @id + ID: ID! @id @unique name: String! rel_b: [B!]! @relationship(type: "REL_B", direction: OUT) rel_c: [C!]! @relationship(type: "REL_C", direction: OUT) } type B { - ID: ID! @id + ID: ID! @id @unique name: String! } type C { - ID: ID! @id + ID: ID! @id @unique name: String! } `; diff --git a/packages/graphql/tests/integration/issues/2388.int.test.ts b/packages/graphql/tests/integration/issues/2388.int.test.ts index bd5ba6dfe7..25c781264d 100644 --- a/packages/graphql/tests/integration/issues/2388.int.test.ts +++ b/packages/graphql/tests/integration/issues/2388.int.test.ts @@ -57,7 +57,7 @@ describe("https://github.com/neo4j/graphql/issues/2388", () => { { operations: [READ], where: { jwt: { roles_INCLUDES: "downstream" } } } ]) { - id: ID! @id + id: ID! @id @unique } type ${PartUsage} diff --git a/packages/graphql/tests/integration/issues/2396.int.test.ts b/packages/graphql/tests/integration/issues/2396.int.test.ts index f0656d6a35..e856ad9e87 100644 --- a/packages/graphql/tests/integration/issues/2396.int.test.ts +++ b/packages/graphql/tests/integration/issues/2396.int.test.ts @@ -52,18 +52,18 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { session = await neo4j.getSession(); const typeDefs = ` - type ${PostalCode} @exclude(operations: [DELETE]) { + type ${PostalCode} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - number: String! @id(autogenerate: false) + number: String! @unique address: [${Address}!]! @relationship(type: "HAS_POSTAL_CODE", direction: IN) } extend type ${PostalCode} @authorization(filter: [{ where: { node: { archivedAt: null } } }]) - type ${Address} @exclude(operations: [DELETE]) { + type ${Address} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) @@ -72,9 +72,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { extend type ${Address} @authorization(filter: [{ where: { node: { archivedAt: null } } }]) - type ${Mandate} @exclude(operations: [DELETE]) { + type ${Mandate} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - number: ID! @id # numéro + number: ID! @id @unique # numéro createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) @@ -85,9 +85,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { extend type ${Mandate} @authorization(filter: [{ where: { node: { archivedAt: null } } }]) - type ${Valuation} @exclude(operations: [DELETE]) { + type ${Valuation} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) @@ -111,9 +111,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { BUSINESS_FUND } - type ${Estate} @exclude(operations: [DELETE]) { + type ${Estate} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) diff --git a/packages/graphql/tests/integration/issues/2437.int.test.ts b/packages/graphql/tests/integration/issues/2437.int.test.ts index d8efb3e5e4..0c4d012a77 100644 --- a/packages/graphql/tests/integration/issues/2437.int.test.ts +++ b/packages/graphql/tests/integration/issues/2437.int.test.ts @@ -49,8 +49,8 @@ describe("https://github.com/neo4j/graphql/issues/2437", () => { roles: [String!]! } - type ${Agent} @exclude(operations: [DELETE]) { - uuid: ID! @id + type ${Agent} @mutation(operations: [CREATE, UPDATE]) { + uuid: ID! @id @unique archivedAt: DateTime valuations: [${Valuation}!]! @relationship(type: "IS_VALUATION_AGENT", direction: OUT) @@ -59,8 +59,8 @@ describe("https://github.com/neo4j/graphql/issues/2437", () => { extend type ${Agent} @authorization(validate: [{ operations: [CREATE], where: { jwt: { roles_INCLUDES: "Admin" } } }], filter: [{ where: { node: { archivedAt: null } } }]) - type ${Valuation} @exclude(operations: [DELETE]) { - uuid: ID! @id + type ${Valuation} @mutation(operations: [CREATE, UPDATE]) { + uuid: ID! @id @unique archivedAt: DateTime agent: ${Agent}! @relationship(type: "IS_VALUATION_AGENT", direction: IN) diff --git a/packages/graphql/tests/integration/issues/2474.int.test.ts b/packages/graphql/tests/integration/issues/2474.int.test.ts index e7320b918c..5722fd9e24 100644 --- a/packages/graphql/tests/integration/issues/2474.int.test.ts +++ b/packages/graphql/tests/integration/issues/2474.int.test.ts @@ -53,7 +53,7 @@ describe("https://github.com/neo4j/graphql/issues/2474", () => { const typeDefs = ` type ${PostalCode.name} { archivedAt: DateTime - number: String! @id(autogenerate: false) + number: String! @unique address: [${Address.name}!]! @relationship(type: "HAS_POSTAL_CODE", direction: IN) } @@ -61,25 +61,25 @@ describe("https://github.com/neo4j/graphql/issues/2474", () => { type ${Address.name} { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) postalCode: ${PostalCode.name} @relationship(type: "HAS_POSTAL_CODE", direction: OUT) node: [AddressNode!]! @relationship(type: "HAS_ADDRESS", direction: IN) } - type ${Mandate.name} @exclude(operations: [DELETE]) { + type ${Mandate.name} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - number: ID! @id # numéro + number: ID! @id @unique # numéro createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) price: Float! valuation: ${Valuation.name}! @relationship(type: "HAS_VALUATION", direction: OUT) } - type ${Valuation.name} @exclude(operations: [DELETE]) { + type ${Valuation.name} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) estate: ${Estate.name} @relationship(type: "VALUATION_FOR", direction: OUT) @@ -100,9 +100,9 @@ describe("https://github.com/neo4j/graphql/issues/2474", () => { BUSINESS_FUND } - type ${Estate.name} @exclude(operations: [DELETE]) { + type ${Estate.name} @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) estateType: EstateType! diff --git a/packages/graphql/tests/integration/issues/2548.int.test.ts b/packages/graphql/tests/integration/issues/2548.int.test.ts index a474c2f790..dd5700fc9b 100644 --- a/packages/graphql/tests/integration/issues/2548.int.test.ts +++ b/packages/graphql/tests/integration/issues/2548.int.test.ts @@ -54,7 +54,7 @@ describe("https://github.com/neo4j/graphql/issues/2548", () => { { operations: [READ], where: { jwt: { roles_INCLUDES: "ADMIN" } } } ] ) { - userId: ID! @id + userId: ID! @id @unique isPublic: Boolean } `; diff --git a/packages/graphql/tests/integration/issues/2574.int.test.ts b/packages/graphql/tests/integration/issues/2574.int.test.ts index de1baca42d..1674d197b7 100644 --- a/packages/graphql/tests/integration/issues/2574.int.test.ts +++ b/packages/graphql/tests/integration/issues/2574.int.test.ts @@ -48,19 +48,19 @@ describe("https://github.com/neo4j/graphql/issues/2574", () => { const typeDefs = ` type ${A} { - uuid: ID! @id + uuid: ID! @id @unique child: ${D}! @relationship(type: "HAS_PARENT", direction: IN) } type ${B} { - uuid: ID! @id + uuid: ID! @id @unique child: ${D}! @relationship(type: "HAS_PARENT", direction: IN) } union C = ${A} | ${B} type ${D} { - uuid: ID! @id + uuid: ID! @id @unique test: String! parent: C! @relationship(type: "HAS_PARENT", direction: OUT) } diff --git a/packages/graphql/tests/integration/issues/2581.int.test.ts b/packages/graphql/tests/integration/issues/2581.int.test.ts index 606b2c9abf..6324c597ed 100644 --- a/packages/graphql/tests/integration/issues/2581.int.test.ts +++ b/packages/graphql/tests/integration/issues/2581.int.test.ts @@ -70,7 +70,7 @@ describe("https://github.com/neo4j/graphql/issues/2581", () => { type ${Book} { name: String! year: Int - refID: ID @id + refID: ID @id @unique soldCopies: Int @cypher( statement: "OPTIONAL MATCH(sales:${Sales}) WHERE this.refID = sales.refID WITH count(sales) as result RETURN result as result" diff --git a/packages/graphql/tests/integration/issues/2630.int.test.ts b/packages/graphql/tests/integration/issues/2630.int.test.ts index 54e04d80f7..6b7a4a40f2 100644 --- a/packages/graphql/tests/integration/issues/2630.int.test.ts +++ b/packages/graphql/tests/integration/issues/2630.int.test.ts @@ -57,7 +57,7 @@ describe("https://github.com/neo4j/graphql/issues/2630", () => { } type ${Post} { - id: ID! @id + id: ID! @id @unique subject: ${PostSubject}! @relationship(type: "POST_FOR", direction: OUT) } @@ -75,7 +75,7 @@ describe("https://github.com/neo4j/graphql/issues/2630", () => { }); afterEach(async () => { - await cleanNodes(session, [Post, User]) + await cleanNodes(session, [Post, User]); await session.close(); }); diff --git a/packages/graphql/tests/integration/issues/2812.int.test.ts b/packages/graphql/tests/integration/issues/2812.int.test.ts index 9cfbd72131..ddba9f6415 100644 --- a/packages/graphql/tests/integration/issues/2812.int.test.ts +++ b/packages/graphql/tests/integration/issues/2812.int.test.ts @@ -52,7 +52,7 @@ describe("https://github.com/neo4j/graphql/issues/2812", () => { } type ${Actor} @authorization(validate: [{ where: { node: { nodeCreatedBy: "$jwt.sub" } } }]) { - id: ID! @id + id: ID! @id @unique name: String nodeCreatedBy: String fieldA: String @authorization(validate: [{ operations: [CREATE, UPDATE], where: { jwt: { roles_INCLUDES: "role-A" } } }]) diff --git a/packages/graphql/tests/integration/issues/283.int.test.ts b/packages/graphql/tests/integration/issues/283.int.test.ts index 0c2c88a574..5d988529e5 100644 --- a/packages/graphql/tests/integration/issues/283.int.test.ts +++ b/packages/graphql/tests/integration/issues/283.int.test.ts @@ -45,9 +45,9 @@ describe("https://github.com/neo4j/graphql/issues/283", () => { } type Post { - id: ID! @id + id: ID! @id @unique title: String! - datetime: DateTime @readonly @timestamp(operations: [CREATE]) + datetime: DateTime @timestamp(operations: [CREATE]) } `; // Presence of a custom resolver was causing the bug diff --git a/packages/graphql/tests/integration/issues/2871.int.test.ts b/packages/graphql/tests/integration/issues/2871.int.test.ts index 29d9700c16..9b850f5863 100644 --- a/packages/graphql/tests/integration/issues/2871.int.test.ts +++ b/packages/graphql/tests/integration/issues/2871.int.test.ts @@ -110,19 +110,19 @@ describe("https://github.com/neo4j/graphql/issues/2871", () => { const typeDefs = ` type ${FirstLevel} { - id: ID! @id(unique: true) + id: ID! @id @unique secondLevel: ${SecondLevel}! @relationship(type: "HAS_SECOND_LEVEL", direction: OUT) createdAt: DateTime! @timestamp(operations: [CREATE]) } type ${SecondLevel} { - id: ID! @id(unique: true) + id: ID! @id @unique thirdLevel: [${ThirdLevel}!]! @relationship(type: "HAS_THIRD_LEVEL", direction: OUT) createdAt: DateTime! @timestamp(operations: [CREATE]) } type ${ThirdLevel} { - id: ID! @id(unique: true) + id: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) } `; diff --git a/packages/graphql/tests/integration/issues/3428.int.test.ts b/packages/graphql/tests/integration/issues/3428.int.test.ts index f087f8db0b..87bb1061b3 100644 --- a/packages/graphql/tests/integration/issues/3428.int.test.ts +++ b/packages/graphql/tests/integration/issues/3428.int.test.ts @@ -186,7 +186,7 @@ describe("https://github.com/neo4j/graphql/issues/3428", () => { test("Should not error and should only be able to perform the disconnect nested op when only the DISCONNECT nestedOperation is specified on rel to a type with a unique field", async () => { const typeDefs = `#graphql type ${Person} { - id: ID! @id + id: ID! @id @unique name: String } @@ -290,7 +290,7 @@ describe("https://github.com/neo4j/graphql/issues/3428", () => { test("Should only be able to perform the disconnect and connectOrCreate nested ops when DISCONNECT and CONNECT_OR_CREATE are the only nestedOperations specified", async () => { const typeDefs = `#graphql type ${Person} { - id: ID! @id + id: ID! @id @unique name: String } diff --git a/packages/graphql/tests/integration/issues/413.int.test.ts b/packages/graphql/tests/integration/issues/413.int.test.ts index a71bd7a4b2..163f7f2fdb 100644 --- a/packages/graphql/tests/integration/issues/413.int.test.ts +++ b/packages/graphql/tests/integration/issues/413.int.test.ts @@ -48,7 +48,7 @@ describe("413", () => { } type JobPlan { - id: ID! @id + id: ID! @id @unique tenantID: ID! name: String! } diff --git a/packages/graphql/tests/integration/issues/440.int.test.ts b/packages/graphql/tests/integration/issues/440.int.test.ts index 9567f0d55e..32f3fe0b81 100644 --- a/packages/graphql/tests/integration/issues/440.int.test.ts +++ b/packages/graphql/tests/integration/issues/440.int.test.ts @@ -30,12 +30,12 @@ describe("https://github.com/neo4j/graphql/issues/440", () => { let neo4j: Neo4j; const typeDefs = gql` type Video { - id: ID! @id(autogenerate: false) + id: ID! @unique categories: [Category!]! @relationship(type: "IS_CATEGORIZED_AS", direction: OUT) } type Category { - id: ID! @id(autogenerate: false) + id: ID! @unique videos: [Video!]! @relationship(type: "IS_CATEGORIZED_AS", direction: IN) } `; diff --git a/packages/graphql/tests/integration/issues/488.int.test.ts b/packages/graphql/tests/integration/issues/488.int.test.ts index dad2c4d803..f54cc9901f 100644 --- a/packages/graphql/tests/integration/issues/488.int.test.ts +++ b/packages/graphql/tests/integration/issues/488.int.test.ts @@ -55,17 +55,17 @@ describe("https://github.com/neo4j/graphql/issues/488", () => { union Keyword = ${testEmoji.name} | ${testHashtag.name} | ${testText.name} type ${testEmoji.name} { - id: ID! @id + id: ID! @id @unique type: String! } type ${testHashtag.name} { - id: ID! @id + id: ID! @id @unique type: String! } type ${testText.name} { - id: ID! @id + id: ID! @id @unique type: String! } `; diff --git a/packages/graphql/tests/integration/issues/505.int.test.ts b/packages/graphql/tests/integration/issues/505.int.test.ts index cd635bfc14..101194f15d 100644 --- a/packages/graphql/tests/integration/issues/505.int.test.ts +++ b/packages/graphql/tests/integration/issues/505.int.test.ts @@ -52,7 +52,7 @@ describe("https://github.com/neo4j/graphql/issues/505", () => { } ] ) - @exclude(operations: [CREATE, UPDATE]) { + @mutation(operations: [DELETE]) { id: ID! name: String! members: [${userType}!]! @relationship(type: "MEMBER_OF", direction: IN) diff --git a/packages/graphql/tests/integration/issues/556.int.test.ts b/packages/graphql/tests/integration/issues/556.int.test.ts index 4084b1d147..78dfeae0a3 100644 --- a/packages/graphql/tests/integration/issues/556.int.test.ts +++ b/packages/graphql/tests/integration/issues/556.int.test.ts @@ -33,7 +33,7 @@ describe("https://github.com/neo4j/graphql/issues/556 - Input Object type Articl } type Thing556 { - id: ID! @id + id: ID! @id @unique } `; diff --git a/packages/graphql/tests/integration/issues/832.int.test.ts b/packages/graphql/tests/integration/issues/832.int.test.ts index 527b17f520..ae7ceb552a 100644 --- a/packages/graphql/tests/integration/issues/832.int.test.ts +++ b/packages/graphql/tests/integration/issues/832.int.test.ts @@ -62,7 +62,7 @@ describe("https://github.com/neo4j/graphql/issues/832", () => { } type ${Interaction} { - id: ID! @id + id: ID! @id @unique kind: String! subjects: [Entity!]! @relationship(type: "ACTED_IN", direction: IN) objects: [Entity!]! @relationship(type: "ACTED_IN", direction: OUT) diff --git a/packages/graphql/tests/integration/issues/847.int.test.ts b/packages/graphql/tests/integration/issues/847.int.test.ts index dddead53cf..2d1b8f4231 100644 --- a/packages/graphql/tests/integration/issues/847.int.test.ts +++ b/packages/graphql/tests/integration/issues/847.int.test.ts @@ -53,7 +53,7 @@ describe("https://github.com/neo4j/graphql/issues/847", () => { } type ${interactionType.name} { - id : ID! @id + id : ID! @id @unique kind : String! subjects : [Entity!]! @relationship(type: "ACTED_IN", direction: IN ) objects : [Entity!]! @relationship(type: "ACTED_IN", direction: OUT) diff --git a/packages/graphql/tests/integration/issues/894.int.test.ts b/packages/graphql/tests/integration/issues/894.int.test.ts index c02f0a7d97..e520b37ac7 100644 --- a/packages/graphql/tests/integration/issues/894.int.test.ts +++ b/packages/graphql/tests/integration/issues/894.int.test.ts @@ -48,13 +48,13 @@ describe("https://github.com/neo4j/graphql/issues/894", () => { const typeDefs = ` type ${testUser.name} { - id: ID! @id @alias(property: "_id") + id: ID! @id @unique @alias(property: "_id") name: String! activeOrganization: ${testOrganization.name} @relationship(type: "ACTIVELY_MANAGING", direction: OUT) } type ${testOrganization.name} { - id: ID! @id @alias(property: "_id") + id: ID! @id @unique @alias(property: "_id") name: String! } `; diff --git a/packages/graphql/tests/integration/issues/interface-post-multi-create.ts b/packages/graphql/tests/integration/issues/interface-post-multi-create.ts index 5930aaef8d..2a78763f9c 100644 --- a/packages/graphql/tests/integration/issues/interface-post-multi-create.ts +++ b/packages/graphql/tests/integration/issues/interface-post-multi-create.ts @@ -62,7 +62,7 @@ describe("Projecting interface relationships following create of multiple nodes" } type ${Interaction} { - id: ID! @id + id: ID! @id @unique kind: String! subjects: [Entity!]! @relationship(type: "ACTED_IN", direction: IN) objects: [Entity!]! @relationship(type: "ACTED_IN", direction: OUT) diff --git a/packages/graphql/tests/integration/limit.int.test.ts b/packages/graphql/tests/integration/limit.int.test.ts index 7ffa0c049c..7ef574a4d9 100644 --- a/packages/graphql/tests/integration/limit.int.test.ts +++ b/packages/graphql/tests/integration/limit.int.test.ts @@ -38,7 +38,7 @@ describe("https://github.com/neo4j/graphql/issues/1628", () => { driver = await neo4j.getDriver(); const typeDefs = ` - type ${workType} @node(labels: ["${workType}", "Resource"]) @exclude(operations: [CREATE, UPDATE, DELETE]) { + type ${workType} @node(labels: ["${workType}", "Resource"]) @mutation(operations: []) { """ IRI """ @@ -46,7 +46,7 @@ describe("https://github.com/neo4j/graphql/issues/1628", () => { title: [${titleType}!]! @relationship(type: "title", direction: OUT) } - type ${titleType} @node(labels: ["${titleType}", "property"]) @exclude(operations: [CREATE, UPDATE, DELETE]) { + type ${titleType} @node(labels: ["${titleType}", "property"]) @mutation(operations: []) { value: String } `; diff --git a/packages/graphql/tests/performance/schema/schema-performance.ts b/packages/graphql/tests/performance/schema/schema-performance.ts index 9d98c917f1..5afb07e0fa 100644 --- a/packages/graphql/tests/performance/schema/schema-performance.ts +++ b/packages/graphql/tests/performance/schema/schema-performance.ts @@ -29,7 +29,7 @@ const basicTypeDefs = ` } type Article @authorization(filter: [{ where: { node: { id: "$jwt.sub" } } }]) { - id: ID! @id @authorization(filter: [{ where: { node: { id: "$jwt.sub" } } }]) + id: ID! @id @unique @authorization(filter: [{ where: { node: { id: "$jwt.sub" } } }]) blocks: [Block!]! @relationship(type: "HAS_BLOCK", direction: OUT, properties: "HasBlock") images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } @@ -43,16 +43,16 @@ const basicTypeDefs = ` } type TextBlock implements Block { - id: ID @id + id: ID @id @unique text: String } type DividerBlock implements Block { - id: ID @id + id: ID @id @unique } type ImageBlock implements Block { - id: ID @id + id: ID @id @unique images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } diff --git a/packages/graphql/tests/performance/schema/subgraph-schema-performance.ts b/packages/graphql/tests/performance/schema/subgraph-schema-performance.ts index 76037c0f97..163d1c4d45 100644 --- a/packages/graphql/tests/performance/schema/subgraph-schema-performance.ts +++ b/packages/graphql/tests/performance/schema/subgraph-schema-performance.ts @@ -31,7 +31,7 @@ const basicTypeDefs = ` } type Article @key(fields: "id") { - id: ID! @id + id: ID! @id @unique blocks: [Block!]! @relationship(type: "HAS_BLOCK", direction: OUT, properties: "HasBlock") images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } @@ -45,16 +45,16 @@ const basicTypeDefs = ` } type TextBlock implements Block { - id: ID @id + id: ID @id @unique text: String } type DividerBlock implements Block { - id: ID @id + id: ID @id @unique } type ImageBlock implements Block { - id: ID @id + id: ID @id @unique images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } diff --git a/packages/graphql/tests/performance/server/typedefs.js b/packages/graphql/tests/performance/server/typedefs.js index e4fe85b50b..e83f369223 100644 --- a/packages/graphql/tests/performance/server/typedefs.js +++ b/packages/graphql/tests/performance/server/typedefs.js @@ -74,7 +74,7 @@ const basicTypeDefs = ` } type Article @authorization(filter: [{ where: { node: { id: "$jwt.sub" } } }]) { - id: ID! @id @authorization(filter: [{ where: { node: { id: "$jwt.sub" } } }]) + id: ID! @id @unique @authorization(filter: [{ where: { node: { id: "$jwt.sub" } } }]) blocks: [Block!]! @relationship(type: "HAS_BLOCK", direction: OUT, properties: "HasBlock") images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } @@ -84,20 +84,20 @@ const basicTypeDefs = ` } interface Block { - id: ID @id + id: ID @id @unique } type TextBlock implements Block { - id: ID @id + id: ID @id @unique text: String } type DividerBlock implements Block { - id: ID @id + id: ID @id @unique } type ImageBlock implements Block { - id: ID @id + id: ID @id @unique images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } diff --git a/packages/graphql/tests/schema/connect-or-create-id.test.ts b/packages/graphql/tests/schema/connect-or-create-id.test.ts index 2b539567b9..955d99ec66 100644 --- a/packages/graphql/tests/schema/connect-or-create-id.test.ts +++ b/packages/graphql/tests/schema/connect-or-create-id.test.ts @@ -27,7 +27,7 @@ describe("connect or create with id", () => { const typeDefs = gql` type Movie { title: String! - id: ID! @id + id: ID! @id @unique } type Actor { @@ -471,14 +471,14 @@ describe("connect or create with id", () => { test("connect or create with non-autogenerated id", async () => { const typeDefs = gql` type Post { - id: ID! @id(autogenerate: false) + id: ID! @unique content: String! creator: User! @relationship(type: "HAS_POST", direction: IN) createdAt: DateTime! } type User { - id: ID! @id(autogenerate: true) + id: ID! @id @unique name: String! posts: [Post!]! @relationship(type: "HAS_POST", direction: OUT) } diff --git a/packages/graphql/tests/schema/directives/autogenerate.test.ts b/packages/graphql/tests/schema/directives/autogenerate.test.ts index de0dbd784c..ca425cf0b7 100644 --- a/packages/graphql/tests/schema/directives/autogenerate.test.ts +++ b/packages/graphql/tests/schema/directives/autogenerate.test.ts @@ -26,7 +26,7 @@ describe("Autogenerate", () => { test("Simple", async () => { const typeDefs = gql` type Movie { - id: ID! @id + id: ID! @id @unique name: String! } `; diff --git a/packages/graphql/tests/schema/directives/exclude.test.ts b/packages/graphql/tests/schema/directives/exclude.test.ts deleted file mode 100644 index 2a1c88bd83..0000000000 --- a/packages/graphql/tests/schema/directives/exclude.test.ts +++ /dev/null @@ -1,1338 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { printSchemaWithDirectives } from "@graphql-tools/utils"; -import { lexicographicSortSchema } from "graphql/utilities"; -import { gql } from "graphql-tag"; -import { Neo4jGraphQL } from "../../../src"; - -describe("@exclude directive", () => { - test("can be used to skip generation of Query", async () => { - const typeDefs = gql` - type Actor @exclude(operations: [READ]) { - name: String - } - - type Movie { - title: String - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type Actor { - name: String - } - - input ActorCreateInput { - name: String - } - - input ActorUpdateInput { - name: String - } - - input ActorWhere { - AND: [ActorWhere!] - NOT: ActorWhere - OR: [ActorWhere!] - name: String - name_CONTAINS: String - name_ENDS_WITH: String - name_IN: [String] - name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_STARTS_WITH: String - } - - type CreateActorsMutationResponse { - actors: [Actor!]! - info: CreateInfo! - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateMoviesMutationResponse { - info: CreateInfo! - movies: [Movie!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Movie { - title: String - } - - type MovieAggregateSelection { - count: Int! - title: StringAggregateSelectionNullable! - } - - input MovieCreateInput { - title: String - } - - type MovieEdge { - cursor: String! - node: Movie! - } - - input MovieOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [MovieSort!] - } - - \\"\\"\\" - Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. - \\"\\"\\" - input MovieSort { - title: SortDirection - } - - input MovieUpdateInput { - title: String - } - - input MovieWhere { - AND: [MovieWhere!] - NOT: MovieWhere - OR: [MovieWhere!] - title: String - title_CONTAINS: String - title_ENDS_WITH: String - title_IN: [String] - title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_STARTS_WITH: String - } - - type MoviesConnection { - edges: [MovieEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type Mutation { - createActors(input: [ActorCreateInput!]!): CreateActorsMutationResponse! - createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! - deleteActors(where: ActorWhere): DeleteInfo! - deleteMovies(where: MovieWhere): DeleteInfo! - updateActors(update: ActorUpdateInput, where: ActorWhere): UpdateActorsMutationResponse! - updateMovies(update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - movies(options: MovieOptions, where: MovieWhere): [Movie!]! - moviesAggregate(where: MovieWhere): MovieAggregateSelection! - moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateActorsMutationResponse { - actors: [Actor!]! - info: UpdateInfo! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateMoviesMutationResponse { - info: UpdateInfo! - movies: [Movie!]! - }" - `); - }); - - test("can be used to skip generation of Mutation", async () => { - const typeDefs = gql` - type Actor @exclude(operations: [CREATE]) { - name: String - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type Actor { - name: String - } - - type ActorAggregateSelection { - count: Int! - name: StringAggregateSelectionNullable! - } - - type ActorEdge { - cursor: String! - node: Actor! - } - - input ActorOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more ActorSort objects to sort Actors by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [ActorSort!] - } - - \\"\\"\\" - Fields to sort Actors by. The order in which sorts are applied is not guaranteed when specifying many fields in one ActorSort object. - \\"\\"\\" - input ActorSort { - name: SortDirection - } - - input ActorUpdateInput { - name: String - } - - input ActorWhere { - AND: [ActorWhere!] - NOT: ActorWhere - OR: [ActorWhere!] - name: String - name_CONTAINS: String - name_ENDS_WITH: String - name_IN: [String] - name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_STARTS_WITH: String - } - - type ActorsConnection { - edges: [ActorEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Mutation { - deleteActors(where: ActorWhere): DeleteInfo! - updateActors(update: ActorUpdateInput, where: ActorWhere): UpdateActorsMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - actors(options: ActorOptions, where: ActorWhere): [Actor!]! - actorsAggregate(where: ActorWhere): ActorAggregateSelection! - actorsConnection(after: String, first: Int, sort: [ActorSort], where: ActorWhere): ActorsConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateActorsMutationResponse { - actors: [Actor!]! - info: UpdateInfo! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - }" - `); - }); - - test("can be used with no arguments to skip generation of all Queries and Mutations and removes the type itself if not referenced elsewhere", async () => { - const typeDefs = gql` - type Actor @exclude { - name: String - } - - type Movie { - title: String - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateMoviesMutationResponse { - info: CreateInfo! - movies: [Movie!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Movie { - title: String - } - - type MovieAggregateSelection { - count: Int! - title: StringAggregateSelectionNullable! - } - - input MovieCreateInput { - title: String - } - - type MovieEdge { - cursor: String! - node: Movie! - } - - input MovieOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [MovieSort!] - } - - \\"\\"\\" - Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. - \\"\\"\\" - input MovieSort { - title: SortDirection - } - - input MovieUpdateInput { - title: String - } - - input MovieWhere { - AND: [MovieWhere!] - NOT: MovieWhere - OR: [MovieWhere!] - title: String - title_CONTAINS: String - title_ENDS_WITH: String - title_IN: [String] - title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_STARTS_WITH: String - } - - type MoviesConnection { - edges: [MovieEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type Mutation { - createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! - deleteMovies(where: MovieWhere): DeleteInfo! - updateMovies(update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - movies(options: MovieOptions, where: MovieWhere): [Movie!]! - moviesAggregate(where: MovieWhere): MovieAggregateSelection! - moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateMoviesMutationResponse { - info: UpdateInfo! - movies: [Movie!]! - }" - `); - }); - - test("can be used with no arguments to skip generation of all Queries and Mutations but retains the type itself if referenced elsewhere", async () => { - const typeDefs = gql` - type Actor @exclude { - name: String - } - - type Movie { - title: String - } - - type Query { - customActorQuery: Actor - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type Actor { - name: String - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateMoviesMutationResponse { - info: CreateInfo! - movies: [Movie!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Movie { - title: String - } - - type MovieAggregateSelection { - count: Int! - title: StringAggregateSelectionNullable! - } - - input MovieCreateInput { - title: String - } - - type MovieEdge { - cursor: String! - node: Movie! - } - - input MovieOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [MovieSort!] - } - - \\"\\"\\" - Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. - \\"\\"\\" - input MovieSort { - title: SortDirection - } - - input MovieUpdateInput { - title: String - } - - input MovieWhere { - AND: [MovieWhere!] - NOT: MovieWhere - OR: [MovieWhere!] - title: String - title_CONTAINS: String - title_ENDS_WITH: String - title_IN: [String] - title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_STARTS_WITH: String - } - - type MoviesConnection { - edges: [MovieEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type Mutation { - createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! - deleteMovies(where: MovieWhere): DeleteInfo! - updateMovies(update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - customActorQuery: Actor - movies(options: MovieOptions, where: MovieWhere): [Movie!]! - moviesAggregate(where: MovieWhere): MovieAggregateSelection! - moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateMoviesMutationResponse { - info: UpdateInfo! - movies: [Movie!]! - }" - `); - }); - - test("can be used with no arguments to skip generation of all Queries and Mutations but retains the type itself if referenced in a `@relationship` directive", async () => { - const typeDefs = gql` - type Actor @exclude { - name: String - } - - type Movie { - title: String - actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN) - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type Actor { - name: String - } - - input ActorConnectWhere { - node: ActorWhere! - } - - input ActorCreateInput { - name: String - } - - input ActorOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more ActorSort objects to sort Actors by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [ActorSort!] - } - - \\"\\"\\" - Fields to sort Actors by. The order in which sorts are applied is not guaranteed when specifying many fields in one ActorSort object. - \\"\\"\\" - input ActorSort { - name: SortDirection - } - - input ActorUpdateInput { - name: String - } - - input ActorWhere { - AND: [ActorWhere!] - NOT: ActorWhere - OR: [ActorWhere!] - name: String - name_CONTAINS: String - name_ENDS_WITH: String - name_IN: [String] - name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_STARTS_WITH: String - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateMoviesMutationResponse { - info: CreateInfo! - movies: [Movie!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Movie { - actors(directed: Boolean = true, options: ActorOptions, where: ActorWhere): [Actor!]! - actorsAggregate(directed: Boolean = true, where: ActorWhere): MovieActorActorsAggregationSelection - actorsConnection(after: String, directed: Boolean = true, first: Int, sort: [MovieActorsConnectionSort!], where: MovieActorsConnectionWhere): MovieActorsConnection! - title: String - } - - type MovieActorActorsAggregationSelection { - count: Int! - node: MovieActorActorsNodeAggregateSelection - } - - type MovieActorActorsNodeAggregateSelection { - name: StringAggregateSelectionNullable! - } - - input MovieActorsAggregateInput { - AND: [MovieActorsAggregateInput!] - NOT: MovieActorsAggregateInput - OR: [MovieActorsAggregateInput!] - count: Int - count_GT: Int - count_GTE: Int - count_LT: Int - count_LTE: Int - node: MovieActorsNodeAggregationWhereInput - } - - input MovieActorsConnectFieldInput { - \\"\\"\\" - Whether or not to overwrite any matching relationship with the new properties. Will default to \`false\` in 4.0.0. - \\"\\"\\" - overwrite: Boolean! = true - where: ActorConnectWhere - } - - type MovieActorsConnection { - edges: [MovieActorsRelationship!]! - pageInfo: PageInfo! - totalCount: Int! - } - - input MovieActorsConnectionSort { - node: ActorSort - } - - input MovieActorsConnectionWhere { - AND: [MovieActorsConnectionWhere!] - NOT: MovieActorsConnectionWhere - OR: [MovieActorsConnectionWhere!] - node: ActorWhere - node_NOT: ActorWhere @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - } - - input MovieActorsCreateFieldInput { - node: ActorCreateInput! - } - - input MovieActorsDeleteFieldInput { - where: MovieActorsConnectionWhere - } - - input MovieActorsDisconnectFieldInput { - where: MovieActorsConnectionWhere - } - - input MovieActorsFieldInput { - connect: [MovieActorsConnectFieldInput!] - create: [MovieActorsCreateFieldInput!] - } - - input MovieActorsNodeAggregationWhereInput { - AND: [MovieActorsNodeAggregationWhereInput!] - NOT: MovieActorsNodeAggregationWhereInput - OR: [MovieActorsNodeAggregationWhereInput!] - name_AVERAGE_EQUAL: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_GT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_GTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_LENGTH_EQUAL: Float - name_AVERAGE_LENGTH_GT: Float - name_AVERAGE_LENGTH_GTE: Float - name_AVERAGE_LENGTH_LT: Float - name_AVERAGE_LENGTH_LTE: Float - name_AVERAGE_LT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_LTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_EQUAL: String @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_GT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_GTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_LONGEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_LENGTH_EQUAL: Int - name_LONGEST_LENGTH_GT: Int - name_LONGEST_LENGTH_GTE: Int - name_LONGEST_LENGTH_LT: Int - name_LONGEST_LENGTH_LTE: Int - name_LONGEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_LTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_SHORTEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_LENGTH_EQUAL: Int - name_SHORTEST_LENGTH_GT: Int - name_SHORTEST_LENGTH_GTE: Int - name_SHORTEST_LENGTH_LT: Int - name_SHORTEST_LENGTH_LTE: Int - name_SHORTEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - } - - type MovieActorsRelationship { - cursor: String! - node: Actor! - } - - input MovieActorsUpdateConnectionInput { - node: ActorUpdateInput - } - - input MovieActorsUpdateFieldInput { - connect: [MovieActorsConnectFieldInput!] - create: [MovieActorsCreateFieldInput!] - delete: [MovieActorsDeleteFieldInput!] - disconnect: [MovieActorsDisconnectFieldInput!] - update: MovieActorsUpdateConnectionInput - where: MovieActorsConnectionWhere - } - - type MovieAggregateSelection { - count: Int! - title: StringAggregateSelectionNullable! - } - - input MovieConnectInput { - actors: [MovieActorsConnectFieldInput!] - } - - input MovieCreateInput { - actors: MovieActorsFieldInput - title: String - } - - input MovieDeleteInput { - actors: [MovieActorsDeleteFieldInput!] - } - - input MovieDisconnectInput { - actors: [MovieActorsDisconnectFieldInput!] - } - - type MovieEdge { - cursor: String! - node: Movie! - } - - input MovieOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [MovieSort!] - } - - input MovieRelationInput { - actors: [MovieActorsCreateFieldInput!] - } - - \\"\\"\\" - Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. - \\"\\"\\" - input MovieSort { - title: SortDirection - } - - input MovieUpdateInput { - actors: [MovieActorsUpdateFieldInput!] - title: String - } - - input MovieWhere { - AND: [MovieWhere!] - NOT: MovieWhere - OR: [MovieWhere!] - actors: ActorWhere @deprecated(reason: \\"Use \`actors_SOME\` instead.\\") - actorsAggregate: MovieActorsAggregateInput - actorsConnection: MovieActorsConnectionWhere @deprecated(reason: \\"Use \`actorsConnection_SOME\` instead.\\") - \\"\\"\\" - Return Movies where all of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_ALL: MovieActorsConnectionWhere - \\"\\"\\" - Return Movies where none of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_NONE: MovieActorsConnectionWhere - actorsConnection_NOT: MovieActorsConnectionWhere @deprecated(reason: \\"Use \`actorsConnection_NONE\` instead.\\") - \\"\\"\\" - Return Movies where one of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_SINGLE: MovieActorsConnectionWhere - \\"\\"\\" - Return Movies where some of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_SOME: MovieActorsConnectionWhere - \\"\\"\\"Return Movies where all of the related Actors match this filter\\"\\"\\" - actors_ALL: ActorWhere - \\"\\"\\"Return Movies where none of the related Actors match this filter\\"\\"\\" - actors_NONE: ActorWhere - actors_NOT: ActorWhere @deprecated(reason: \\"Use \`actors_NONE\` instead.\\") - \\"\\"\\"Return Movies where one of the related Actors match this filter\\"\\"\\" - actors_SINGLE: ActorWhere - \\"\\"\\"Return Movies where some of the related Actors match this filter\\"\\"\\" - actors_SOME: ActorWhere - title: String - title_CONTAINS: String - title_ENDS_WITH: String - title_IN: [String] - title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_STARTS_WITH: String - } - - type MoviesConnection { - edges: [MovieEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type Mutation { - createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! - deleteMovies(delete: MovieDeleteInput, where: MovieWhere): DeleteInfo! - updateMovies(connect: MovieConnectInput, create: MovieRelationInput, delete: MovieDeleteInput, disconnect: MovieDisconnectInput, update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - movies(options: MovieOptions, where: MovieWhere): [Movie!]! - moviesAggregate(where: MovieWhere): MovieAggregateSelection! - moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateMoviesMutationResponse { - info: UpdateInfo! - movies: [Movie!]! - }" - `); - }); - - test("doesn't break if provided with an empty array", async () => { - const typeDefs = gql` - type Actor @exclude(operations: []) { - name: String - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type Actor { - name: String - } - - type ActorAggregateSelection { - count: Int! - name: StringAggregateSelectionNullable! - } - - input ActorCreateInput { - name: String - } - - type ActorEdge { - cursor: String! - node: Actor! - } - - input ActorOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more ActorSort objects to sort Actors by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [ActorSort!] - } - - \\"\\"\\" - Fields to sort Actors by. The order in which sorts are applied is not guaranteed when specifying many fields in one ActorSort object. - \\"\\"\\" - input ActorSort { - name: SortDirection - } - - input ActorUpdateInput { - name: String - } - - input ActorWhere { - AND: [ActorWhere!] - NOT: ActorWhere - OR: [ActorWhere!] - name: String - name_CONTAINS: String - name_ENDS_WITH: String - name_IN: [String] - name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_STARTS_WITH: String - } - - type ActorsConnection { - edges: [ActorEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type CreateActorsMutationResponse { - actors: [Actor!]! - info: CreateInfo! - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Mutation { - createActors(input: [ActorCreateInput!]!): CreateActorsMutationResponse! - deleteActors(where: ActorWhere): DeleteInfo! - updateActors(update: ActorUpdateInput, where: ActorWhere): UpdateActorsMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - actors(options: ActorOptions, where: ActorWhere): [Actor!]! - actorsAggregate(where: ActorWhere): ActorAggregateSelection! - actorsConnection(after: String, first: Int, sort: [ActorSort], where: ActorWhere): ActorsConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateActorsMutationResponse { - actors: [Actor!]! - info: UpdateInfo! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - }" - `); - }); - - test("can be used with interfaces", async () => { - const typeDefs = gql` - interface Production @exclude(operations: [CREATE]) { - title: String - } - - type Movie implements Production { - title: String - } - - type Series implements Production @exclude(operations: [UPDATE]) { - title: String - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateSeriesMutationResponse { - info: CreateInfo! - series: [Series!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Movie implements Production { - title: String - } - - type MovieAggregateSelection { - count: Int! - title: StringAggregateSelectionNullable! - } - - type MovieEdge { - cursor: String! - node: Movie! - } - - input MovieOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [MovieSort!] - } - - \\"\\"\\" - Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. - \\"\\"\\" - input MovieSort { - title: SortDirection - } - - input MovieUpdateInput { - title: String - } - - input MovieWhere { - AND: [MovieWhere!] - NOT: MovieWhere - OR: [MovieWhere!] - title: String - title_CONTAINS: String - title_ENDS_WITH: String - title_IN: [String] - title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_STARTS_WITH: String - } - - type MoviesConnection { - edges: [MovieEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type Mutation { - createSeries(input: [SeriesCreateInput!]!): CreateSeriesMutationResponse! - deleteMovies(where: MovieWhere): DeleteInfo! - deleteSeries(where: SeriesWhere): DeleteInfo! - updateMovies(update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - interface Production { - title: String - } - - type Query { - movies(options: MovieOptions, where: MovieWhere): [Movie!]! - moviesAggregate(where: MovieWhere): MovieAggregateSelection! - moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! - series(options: SeriesOptions, where: SeriesWhere): [Series!]! - seriesAggregate(where: SeriesWhere): SeriesAggregateSelection! - seriesConnection(after: String, first: Int, sort: [SeriesSort], where: SeriesWhere): SeriesConnection! - } - - type Series implements Production { - title: String - } - - type SeriesAggregateSelection { - count: Int! - title: StringAggregateSelectionNullable! - } - - type SeriesConnection { - edges: [SeriesEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - input SeriesCreateInput { - title: String - } - - type SeriesEdge { - cursor: String! - node: Series! - } - - input SeriesOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more SeriesSort objects to sort Series by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [SeriesSort!] - } - - \\"\\"\\" - Fields to sort Series by. The order in which sorts are applied is not guaranteed when specifying many fields in one SeriesSort object. - \\"\\"\\" - input SeriesSort { - title: SortDirection - } - - input SeriesWhere { - AND: [SeriesWhere!] - NOT: SeriesWhere - OR: [SeriesWhere!] - title: String - title_CONTAINS: String - title_ENDS_WITH: String - title_IN: [String] - title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - title_STARTS_WITH: String - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateMoviesMutationResponse { - info: UpdateInfo! - movies: [Movie!]! - }" - `); - }); -}); diff --git a/packages/graphql/tests/schema/directives/readonly.test.ts b/packages/graphql/tests/schema/directives/readonly.test.ts deleted file mode 100644 index 91da8fab6e..0000000000 --- a/packages/graphql/tests/schema/directives/readonly.test.ts +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { printSchemaWithDirectives } from "@graphql-tools/utils"; -import { lexicographicSortSchema } from "graphql/utilities"; -import { gql } from "graphql-tag"; -import { Neo4jGraphQL } from "../../../src"; - -describe("@readonly directive", () => { - test("makes a field readonly", async () => { - const typeDefs = gql` - type User { - id: ID! @readonly - username: String! - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateUsersMutationResponse { - info: CreateInfo! - users: [User!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type IDAggregateSelectionNonNullable { - longest: ID! - shortest: ID! - } - - type Mutation { - createUsers(input: [UserCreateInput!]!): CreateUsersMutationResponse! - deleteUsers(where: UserWhere): DeleteInfo! - updateUsers(update: UserUpdateInput, where: UserWhere): UpdateUsersMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - users(options: UserOptions, where: UserWhere): [User!]! - usersAggregate(where: UserWhere): UserAggregateSelection! - usersConnection(after: String, first: Int, sort: [UserSort], where: UserWhere): UsersConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNonNullable { - longest: String! - shortest: String! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateUsersMutationResponse { - info: UpdateInfo! - users: [User!]! - } - - type User { - id: ID! - username: String! - } - - type UserAggregateSelection { - count: Int! - id: IDAggregateSelectionNonNullable! - username: StringAggregateSelectionNonNullable! - } - - input UserCreateInput { - id: ID! - username: String! - } - - type UserEdge { - cursor: String! - node: User! - } - - input UserOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more UserSort objects to sort Users by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [UserSort!] - } - - \\"\\"\\" - Fields to sort Users by. The order in which sorts are applied is not guaranteed when specifying many fields in one UserSort object. - \\"\\"\\" - input UserSort { - id: SortDirection - username: SortDirection - } - - input UserUpdateInput { - username: String - } - - input UserWhere { - AND: [UserWhere!] - NOT: UserWhere - OR: [UserWhere!] - id: ID - id_CONTAINS: ID - id_ENDS_WITH: ID - id_IN: [ID!] - id_NOT: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_CONTAINS: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_ENDS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_IN: [ID!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_STARTS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_STARTS_WITH: ID - username: String - username_CONTAINS: String - username_ENDS_WITH: String - username_IN: [String!] - username_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_STARTS_WITH: String - } - - type UsersConnection { - edges: [UserEdge!]! - pageInfo: PageInfo! - totalCount: Int! - }" - `); - }); - - test("makes an inherited field readonly", async () => { - const typeDefs = gql` - interface UserInterface { - id: ID! @readonly - username: String! - } - - type User implements UserInterface { - id: ID! - username: String! - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateUsersMutationResponse { - info: CreateInfo! - users: [User!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type IDAggregateSelectionNonNullable { - longest: ID! - shortest: ID! - } - - type Mutation { - createUsers(input: [UserCreateInput!]!): CreateUsersMutationResponse! - deleteUsers(where: UserWhere): DeleteInfo! - updateUsers(update: UserUpdateInput, where: UserWhere): UpdateUsersMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - users(options: UserOptions, where: UserWhere): [User!]! - usersAggregate(where: UserWhere): UserAggregateSelection! - usersConnection(after: String, first: Int, sort: [UserSort], where: UserWhere): UsersConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNonNullable { - longest: String! - shortest: String! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateUsersMutationResponse { - info: UpdateInfo! - users: [User!]! - } - - type User implements UserInterface { - id: ID! - username: String! - } - - type UserAggregateSelection { - count: Int! - id: IDAggregateSelectionNonNullable! - username: StringAggregateSelectionNonNullable! - } - - input UserCreateInput { - id: ID! - username: String! - } - - type UserEdge { - cursor: String! - node: User! - } - - interface UserInterface { - id: ID! - username: String! - } - - input UserOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more UserSort objects to sort Users by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [UserSort!] - } - - \\"\\"\\" - Fields to sort Users by. The order in which sorts are applied is not guaranteed when specifying many fields in one UserSort object. - \\"\\"\\" - input UserSort { - id: SortDirection - username: SortDirection - } - - input UserUpdateInput { - username: String - } - - input UserWhere { - AND: [UserWhere!] - NOT: UserWhere - OR: [UserWhere!] - id: ID - id_CONTAINS: ID - id_ENDS_WITH: ID - id_IN: [ID!] - id_NOT: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_CONTAINS: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_ENDS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_IN: [ID!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_STARTS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_STARTS_WITH: ID - username: String - username_CONTAINS: String - username_ENDS_WITH: String - username_IN: [String!] - username_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_STARTS_WITH: String - } - - type UsersConnection { - edges: [UserEdge!]! - pageInfo: PageInfo! - totalCount: Int! - }" - `); - }); -}); diff --git a/packages/graphql/tests/schema/directives/relationship-nested-operations.test.ts b/packages/graphql/tests/schema/directives/relationship-nested-operations.test.ts index 97249601ba..546ed06d75 100644 --- a/packages/graphql/tests/schema/directives/relationship-nested-operations.test.ts +++ b/packages/graphql/tests/schema/directives/relationship-nested-operations.test.ts @@ -2512,7 +2512,7 @@ describe("Relationship nested operations", () => { test("Single relationship to type with unique field with nested operation CONNECT_OR_CREATE specified", async () => { const typeDefs = gql` type Person { - id: ID! @id + id: ID! @id @unique name: String } @@ -6733,12 +6733,12 @@ describe("Relationship nested operations", () => { test("Single relationship to type with unique field with nested operation CONNECT_OR_CREATE specified", async () => { const typeDefs = gql` type PersonOne { - id: ID! @id + id: ID! @id @unique name: String } type PersonTwo { - id: ID! @id + id: ID! @id @unique nameTwo: String } diff --git a/packages/graphql/tests/schema/directives/subscription.test.ts b/packages/graphql/tests/schema/directives/subscription.test.ts index ccb8313def..f47f17ca37 100644 --- a/packages/graphql/tests/schema/directives/subscription.test.ts +++ b/packages/graphql/tests/schema/directives/subscription.test.ts @@ -91,7 +91,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @subscription(operations: [UPDATE, DELETE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP]) { + type Movie @subscription(events: [UPDATED, DELETED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED]) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -140,7 +140,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @subscription(operations: [CREATE, DELETE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP]) { + type Movie @subscription(events: [CREATED, DELETED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED]) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -189,7 +189,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @subscription(operations: [CREATE, UPDATE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP]) { + type Movie @subscription(events: [CREATED, UPDATED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED]) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -238,7 +238,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @subscription(operations: [CREATE, UPDATE, DELETE, DELETE_RELATIONSHIP]) { + type Movie @subscription(events: [CREATED, UPDATED, DELETED, RELATIONSHIP_DELETED]) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -287,7 +287,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @subscription(operations: [CREATE, UPDATE, DELETE, CREATE_RELATIONSHIP]) { + type Movie @subscription(events: [CREATED, UPDATED, DELETED, RELATIONSHIP_CREATED]) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -336,7 +336,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @subscription(operations: []) { + type Movie @subscription(events: []) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -385,7 +385,7 @@ describe("@subscription directive", () => { actedIn: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } - type Movie @query(read: true) @subscription(operations: []) { + type Movie @query(read: true) @subscription(events: []) { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } @@ -461,7 +461,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @subscription(operations: [UPDATE, DELETE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP]) + extend schema @subscription(events: [UPDATED, DELETED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED]) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); @@ -511,7 +511,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @subscription(operations: [CREATE, DELETE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP]) + extend schema @subscription(events: [CREATED, DELETED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED]) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); @@ -561,7 +561,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @subscription(operations: [CREATE, UPDATE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP]) + extend schema @subscription(events: [CREATED, UPDATED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED]) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); @@ -611,7 +611,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @subscription(operations: [CREATE, UPDATE, DELETE, DELETE_RELATIONSHIP]) + extend schema @subscription(events: [CREATED, UPDATED, DELETED, RELATIONSHIP_DELETED]) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); @@ -661,7 +661,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @subscription(operations: [CREATE, UPDATE, DELETE, CREATE_RELATIONSHIP]) + extend schema @subscription(events: [CREATED, UPDATED, DELETED, RELATIONSHIP_CREATED]) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); @@ -711,7 +711,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @subscription(operations: []) + extend schema @subscription(events: []) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); @@ -761,7 +761,7 @@ describe("@subscription directive", () => { title: String actors: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } - extend schema @query(read: true) @subscription(operations: []) + extend schema @query(read: true) @subscription(events: []) `; const neoSchema = new Neo4jGraphQL({ typeDefs, features: { subscriptions: subscriptionPlugin } }); diff --git a/packages/graphql/tests/schema/directives/writeonly.test.ts b/packages/graphql/tests/schema/directives/writeonly.test.ts deleted file mode 100644 index b3db3629a8..0000000000 --- a/packages/graphql/tests/schema/directives/writeonly.test.ts +++ /dev/null @@ -1,717 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.com] - * - * This file is part of Neo4j. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { printSchemaWithDirectives } from "@graphql-tools/utils"; -import { lexicographicSortSchema } from "graphql/utilities"; -import { gql } from "graphql-tag"; -import { Neo4jGraphQL } from "../../../src"; - -describe("@writeonly directive", () => { - test("makes a field writeonly", async () => { - const typeDefs = gql` - type User { - username: String! - password: String! @writeonly - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateUsersMutationResponse { - info: CreateInfo! - users: [User!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Mutation { - createUsers(input: [UserCreateInput!]!): CreateUsersMutationResponse! - deleteUsers(where: UserWhere): DeleteInfo! - updateUsers(update: UserUpdateInput, where: UserWhere): UpdateUsersMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - users(options: UserOptions, where: UserWhere): [User!]! - usersAggregate(where: UserWhere): UserAggregateSelection! - usersConnection(after: String, first: Int, sort: [UserSort], where: UserWhere): UsersConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNonNullable { - longest: String! - shortest: String! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateUsersMutationResponse { - info: UpdateInfo! - users: [User!]! - } - - type User { - username: String! - } - - type UserAggregateSelection { - count: Int! - password: StringAggregateSelectionNonNullable! - username: StringAggregateSelectionNonNullable! - } - - input UserCreateInput { - password: String! - username: String! - } - - type UserEdge { - cursor: String! - node: User! - } - - input UserOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more UserSort objects to sort Users by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [UserSort!] - } - - \\"\\"\\" - Fields to sort Users by. The order in which sorts are applied is not guaranteed when specifying many fields in one UserSort object. - \\"\\"\\" - input UserSort { - password: SortDirection - username: SortDirection - } - - input UserUpdateInput { - password: String - username: String - } - - input UserWhere { - AND: [UserWhere!] - NOT: UserWhere - OR: [UserWhere!] - password: String - password_CONTAINS: String - password_ENDS_WITH: String - password_IN: [String!] - password_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_STARTS_WITH: String - username: String - username_CONTAINS: String - username_ENDS_WITH: String - username_IN: [String!] - username_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_STARTS_WITH: String - } - - type UsersConnection { - edges: [UserEdge!]! - pageInfo: PageInfo! - totalCount: Int! - }" - `); - }); - - test("makes an inherited field writeonly", async () => { - const typeDefs = gql` - interface UserInterface { - username: String! - password: String! @writeonly - } - - type User implements UserInterface { - username: String! - password: String! - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateUsersMutationResponse { - info: CreateInfo! - users: [User!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type Mutation { - createUsers(input: [UserCreateInput!]!): CreateUsersMutationResponse! - deleteUsers(where: UserWhere): DeleteInfo! - updateUsers(update: UserUpdateInput, where: UserWhere): UpdateUsersMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - users(options: UserOptions, where: UserWhere): [User!]! - usersAggregate(where: UserWhere): UserAggregateSelection! - usersConnection(after: String, first: Int, sort: [UserSort], where: UserWhere): UsersConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNonNullable { - longest: String! - shortest: String! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateUsersMutationResponse { - info: UpdateInfo! - users: [User!]! - } - - type User implements UserInterface { - username: String! - } - - type UserAggregateSelection { - count: Int! - password: StringAggregateSelectionNonNullable! - username: StringAggregateSelectionNonNullable! - } - - input UserCreateInput { - password: String! - username: String! - } - - type UserEdge { - cursor: String! - node: User! - } - - interface UserInterface { - username: String! - } - - input UserOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more UserSort objects to sort Users by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [UserSort!] - } - - \\"\\"\\" - Fields to sort Users by. The order in which sorts are applied is not guaranteed when specifying many fields in one UserSort object. - \\"\\"\\" - input UserSort { - password: SortDirection - username: SortDirection - } - - input UserUpdateInput { - password: String - username: String - } - - input UserWhere { - AND: [UserWhere!] - NOT: UserWhere - OR: [UserWhere!] - password: String - password_CONTAINS: String - password_ENDS_WITH: String - password_IN: [String!] - password_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - password_STARTS_WITH: String - username: String - username_CONTAINS: String - username_ENDS_WITH: String - username_IN: [String!] - username_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - username_STARTS_WITH: String - } - - type UsersConnection { - edges: [UserEdge!]! - pageInfo: PageInfo! - totalCount: Int! - }" - `); - }); - - test("makes a relationship field writeonly", async () => { - const typeDefs = gql` - type Actor { - name: String - } - - type Movie { - id: ID - actors: [Actor!]! @writeonly @relationship(type: "ACTED_IN", direction: IN) - } - `; - const neoSchema = new Neo4jGraphQL({ typeDefs }); - const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); - - expect(printedSchema).toMatchInlineSnapshot(` - "schema { - query: Query - mutation: Mutation - } - - type Actor { - name: String - } - - type ActorAggregateSelection { - count: Int! - name: StringAggregateSelectionNullable! - } - - input ActorConnectWhere { - node: ActorWhere! - } - - input ActorCreateInput { - name: String - } - - type ActorEdge { - cursor: String! - node: Actor! - } - - input ActorOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more ActorSort objects to sort Actors by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [ActorSort!] - } - - \\"\\"\\" - Fields to sort Actors by. The order in which sorts are applied is not guaranteed when specifying many fields in one ActorSort object. - \\"\\"\\" - input ActorSort { - name: SortDirection - } - - input ActorUpdateInput { - name: String - } - - input ActorWhere { - AND: [ActorWhere!] - NOT: ActorWhere - OR: [ActorWhere!] - name: String - name_CONTAINS: String - name_ENDS_WITH: String - name_IN: [String] - name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - name_STARTS_WITH: String - } - - type ActorsConnection { - edges: [ActorEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type CreateActorsMutationResponse { - actors: [Actor!]! - info: CreateInfo! - } - - type CreateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - relationshipsCreated: Int! - } - - type CreateMoviesMutationResponse { - info: CreateInfo! - movies: [Movie!]! - } - - type DeleteInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesDeleted: Int! - relationshipsDeleted: Int! - } - - type IDAggregateSelectionNullable { - longest: ID - shortest: ID - } - - type Movie { - id: ID - } - - input MovieActorsAggregateInput { - AND: [MovieActorsAggregateInput!] - NOT: MovieActorsAggregateInput - OR: [MovieActorsAggregateInput!] - count: Int - count_GT: Int - count_GTE: Int - count_LT: Int - count_LTE: Int - node: MovieActorsNodeAggregationWhereInput - } - - input MovieActorsConnectFieldInput { - \\"\\"\\" - Whether or not to overwrite any matching relationship with the new properties. Will default to \`false\` in 4.0.0. - \\"\\"\\" - overwrite: Boolean! = true - where: ActorConnectWhere - } - - input MovieActorsConnectionWhere { - AND: [MovieActorsConnectionWhere!] - NOT: MovieActorsConnectionWhere - OR: [MovieActorsConnectionWhere!] - node: ActorWhere - node_NOT: ActorWhere @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - } - - input MovieActorsCreateFieldInput { - node: ActorCreateInput! - } - - input MovieActorsDeleteFieldInput { - where: MovieActorsConnectionWhere - } - - input MovieActorsDisconnectFieldInput { - where: MovieActorsConnectionWhere - } - - input MovieActorsFieldInput { - connect: [MovieActorsConnectFieldInput!] - create: [MovieActorsCreateFieldInput!] - } - - input MovieActorsNodeAggregationWhereInput { - AND: [MovieActorsNodeAggregationWhereInput!] - NOT: MovieActorsNodeAggregationWhereInput - OR: [MovieActorsNodeAggregationWhereInput!] - name_AVERAGE_EQUAL: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_GT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_GTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_LENGTH_EQUAL: Float - name_AVERAGE_LENGTH_GT: Float - name_AVERAGE_LENGTH_GTE: Float - name_AVERAGE_LENGTH_LT: Float - name_AVERAGE_LENGTH_LTE: Float - name_AVERAGE_LT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_AVERAGE_LTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_EQUAL: String @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_GT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_GTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_LONGEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_LENGTH_EQUAL: Int - name_LONGEST_LENGTH_GT: Int - name_LONGEST_LENGTH_GTE: Int - name_LONGEST_LENGTH_LT: Int - name_LONGEST_LENGTH_LTE: Int - name_LONGEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LONGEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_LT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_LTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") - name_SHORTEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_LENGTH_EQUAL: Int - name_SHORTEST_LENGTH_GT: Int - name_SHORTEST_LENGTH_GTE: Int - name_SHORTEST_LENGTH_LT: Int - name_SHORTEST_LENGTH_LTE: Int - name_SHORTEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - name_SHORTEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") - } - - input MovieActorsUpdateConnectionInput { - node: ActorUpdateInput - } - - input MovieActorsUpdateFieldInput { - connect: [MovieActorsConnectFieldInput!] - create: [MovieActorsCreateFieldInput!] - delete: [MovieActorsDeleteFieldInput!] - disconnect: [MovieActorsDisconnectFieldInput!] - update: MovieActorsUpdateConnectionInput - where: MovieActorsConnectionWhere - } - - type MovieAggregateSelection { - count: Int! - id: IDAggregateSelectionNullable! - } - - input MovieConnectInput { - actors: [MovieActorsConnectFieldInput!] - } - - input MovieCreateInput { - actors: MovieActorsFieldInput - id: ID - } - - input MovieDeleteInput { - actors: [MovieActorsDeleteFieldInput!] - } - - input MovieDisconnectInput { - actors: [MovieActorsDisconnectFieldInput!] - } - - type MovieEdge { - cursor: String! - node: Movie! - } - - input MovieOptions { - limit: Int - offset: Int - \\"\\"\\" - Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. - \\"\\"\\" - sort: [MovieSort!] - } - - input MovieRelationInput { - actors: [MovieActorsCreateFieldInput!] - } - - \\"\\"\\" - Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. - \\"\\"\\" - input MovieSort { - id: SortDirection - } - - input MovieUpdateInput { - actors: [MovieActorsUpdateFieldInput!] - id: ID - } - - input MovieWhere { - AND: [MovieWhere!] - NOT: MovieWhere - OR: [MovieWhere!] - actors: ActorWhere @deprecated(reason: \\"Use \`actors_SOME\` instead.\\") - actorsAggregate: MovieActorsAggregateInput - actorsConnection: MovieActorsConnectionWhere @deprecated(reason: \\"Use \`actorsConnection_SOME\` instead.\\") - \\"\\"\\" - Return Movies where all of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_ALL: MovieActorsConnectionWhere - \\"\\"\\" - Return Movies where none of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_NONE: MovieActorsConnectionWhere - actorsConnection_NOT: MovieActorsConnectionWhere @deprecated(reason: \\"Use \`actorsConnection_NONE\` instead.\\") - \\"\\"\\" - Return Movies where one of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_SINGLE: MovieActorsConnectionWhere - \\"\\"\\" - Return Movies where some of the related MovieActorsConnections match this filter - \\"\\"\\" - actorsConnection_SOME: MovieActorsConnectionWhere - \\"\\"\\"Return Movies where all of the related Actors match this filter\\"\\"\\" - actors_ALL: ActorWhere - \\"\\"\\"Return Movies where none of the related Actors match this filter\\"\\"\\" - actors_NONE: ActorWhere - actors_NOT: ActorWhere @deprecated(reason: \\"Use \`actors_NONE\` instead.\\") - \\"\\"\\"Return Movies where one of the related Actors match this filter\\"\\"\\" - actors_SINGLE: ActorWhere - \\"\\"\\"Return Movies where some of the related Actors match this filter\\"\\"\\" - actors_SOME: ActorWhere - id: ID - id_CONTAINS: ID - id_ENDS_WITH: ID - id_IN: [ID] - id_NOT: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_CONTAINS: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_ENDS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_IN: [ID] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_NOT_STARTS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") - id_STARTS_WITH: ID - } - - type MoviesConnection { - edges: [MovieEdge!]! - pageInfo: PageInfo! - totalCount: Int! - } - - type Mutation { - createActors(input: [ActorCreateInput!]!): CreateActorsMutationResponse! - createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! - deleteActors(where: ActorWhere): DeleteInfo! - deleteMovies(delete: MovieDeleteInput, where: MovieWhere): DeleteInfo! - updateActors(update: ActorUpdateInput, where: ActorWhere): UpdateActorsMutationResponse! - updateMovies(connect: MovieConnectInput, create: MovieRelationInput, delete: MovieDeleteInput, disconnect: MovieDisconnectInput, update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! - } - - \\"\\"\\"Pagination information (Relay)\\"\\"\\" - type PageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type Query { - actors(options: ActorOptions, where: ActorWhere): [Actor!]! - actorsAggregate(where: ActorWhere): ActorAggregateSelection! - actorsConnection(after: String, first: Int, sort: [ActorSort], where: ActorWhere): ActorsConnection! - movies(options: MovieOptions, where: MovieWhere): [Movie!]! - moviesAggregate(where: MovieWhere): MovieAggregateSelection! - moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! - } - - enum SortDirection { - \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" - ASC - \\"\\"\\"Sort by field values in descending order.\\"\\"\\" - DESC - } - - type StringAggregateSelectionNullable { - longest: String - shortest: String - } - - type UpdateActorsMutationResponse { - actors: [Actor!]! - info: UpdateInfo! - } - - type UpdateInfo { - bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") - nodesCreated: Int! - nodesDeleted: Int! - relationshipsCreated: Int! - relationshipsDeleted: Int! - } - - type UpdateMoviesMutationResponse { - info: UpdateInfo! - movies: [Movie!]! - }" - `); - }); -}); diff --git a/packages/graphql/tests/schema/global-node.test.ts b/packages/graphql/tests/schema/global-node.test.ts index 88c49552c4..dd7689c266 100644 --- a/packages/graphql/tests/schema/global-node.test.ts +++ b/packages/graphql/tests/schema/global-node.test.ts @@ -26,7 +26,7 @@ describe("Node Interface Types", () => { test("nodes should implement the Node Interface and generate a top-level node query", async () => { const typeDefs = gql` type Movie { - title: String! @id(autogenerate: false, global: true) + title: String! @relayId } `; const neoSchema = new Neo4jGraphQL({ typeDefs }); diff --git a/packages/graphql/tests/schema/issues/1182.test.ts b/packages/graphql/tests/schema/issues/1182.test.ts index 1026a1c069..7be530241e 100644 --- a/packages/graphql/tests/schema/issues/1182.test.ts +++ b/packages/graphql/tests/schema/issues/1182.test.ts @@ -26,13 +26,13 @@ describe("https://github.com/neo4j/graphql/issues/1182", () => { test("DateTime and Point fields are included in onCreate", async () => { const typeDefs = gql` type Movie { - id: ID! @id + id: ID! @id @unique title: String! actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN) } type Actor { - id: ID! @id + id: ID! @id @unique name: String! dob: DateTime! homeAddress: Point! diff --git a/packages/graphql/tests/schema/issues/200.test.ts b/packages/graphql/tests/schema/issues/200.test.ts index 68b2298e4e..0a58adb50a 100644 --- a/packages/graphql/tests/schema/issues/200.test.ts +++ b/packages/graphql/tests/schema/issues/200.test.ts @@ -26,7 +26,7 @@ describe("200", () => { test("Preserve schema array non null", async () => { const typeDefs = gql` type Category { - categoryId: ID! @id + categoryId: ID! @id @unique name: String! description: String! @default(value: "") exampleImageLocations: [String!] diff --git a/packages/graphql/tests/schema/issues/2377.test.ts b/packages/graphql/tests/schema/issues/2377.test.ts index 18bfcc591c..9faddf774b 100644 --- a/packages/graphql/tests/schema/issues/2377.test.ts +++ b/packages/graphql/tests/schema/issues/2377.test.ts @@ -44,7 +44,7 @@ describe("https://github.com/neo4j/graphql/issues/2377", () => { } interface ResourceEntity { - id: ID! @id(autogenerate: false) + id: ID! name: String """ Allowed resource types (enums) @@ -58,7 +58,7 @@ describe("https://github.com/neo4j/graphql/issues/2377", () => { } type Resource implements ResourceEntity { - id: ID! @id(autogenerate: false) + id: ID! @unique name: String type: ResourceType! externalIds: [ID!] diff --git a/packages/graphql/tests/schema/issues/2993.test.ts b/packages/graphql/tests/schema/issues/2993.test.ts index 4fc26d70a9..99baf4fd74 100644 --- a/packages/graphql/tests/schema/issues/2993.test.ts +++ b/packages/graphql/tests/schema/issues/2993.test.ts @@ -26,7 +26,7 @@ describe("https://github.com/neo4j/graphql/issues/2993", () => { test("should generate schema with only autogenerated properties on relationship", async () => { const typeDefs = gql` interface Profile { - id: ID! @id(autogenerate: true) + id: ID! @id userName: String! } diff --git a/packages/graphql/tests/schema/issues/3428.test.ts b/packages/graphql/tests/schema/issues/3428.test.ts index dba15cdd27..84a108c1fc 100644 --- a/packages/graphql/tests/schema/issues/3428.test.ts +++ b/packages/graphql/tests/schema/issues/3428.test.ts @@ -26,7 +26,7 @@ describe("Relationship nested operations", () => { test("Single relationship to type with unique field with no nested operation specified", async () => { const typeDefs = gql` type Person { - id: ID! @id + id: ID! @id @unique name: String } diff --git a/packages/graphql/tests/schema/issues/3537.test.ts b/packages/graphql/tests/schema/issues/3537.test.ts index 7c6be562b4..5aed41f029 100644 --- a/packages/graphql/tests/schema/issues/3537.test.ts +++ b/packages/graphql/tests/schema/issues/3537.test.ts @@ -520,7 +520,7 @@ describe("Extending the schema in when using getSubgraphSchema", () => { title: String } - extend schema @subscription(operations: [UPDATE]) + extend schema @subscription(events: [UPDATED]) `; const subscriptionPlugin = new TestSubscriptionsEngine(); diff --git a/packages/graphql/tests/schema/issues/3816.test.ts b/packages/graphql/tests/schema/issues/3816.test.ts new file mode 100644 index 0000000000..995cb33129 --- /dev/null +++ b/packages/graphql/tests/schema/issues/3816.test.ts @@ -0,0 +1,1049 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.com] + * + * This file is part of Neo4j. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { printSchemaWithDirectives } from "@graphql-tools/utils"; +import { gql } from "graphql-tag"; +import { lexicographicSortSchema } from "graphql/utilities"; +import { Neo4jGraphQL } from "../../../src"; + +describe("https://github.com/neo4j/graphql/issues/3816", () => { + test("Combination of nested operations in reported issue", async () => { + const typeDefs = gql` + type Movie { + name: String! + genre: Genre! @relationship(type: "HAS_GENRE", direction: OUT, nestedOperations: [CONNECT, DISCONNECT]) + } + + type Genre { + name: String! + movies: [Movie!]! @relationship(type: "HAS_GENRE", direction: IN) + } + `; + + const neoSchema = new Neo4jGraphQL({ typeDefs }); + const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); + + expect(printedSchema).toMatchInlineSnapshot(` + "schema { + query: Query + mutation: Mutation + } + + type CreateGenresMutationResponse { + genres: [Genre!]! + info: CreateInfo! + } + + type CreateInfo { + bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") + nodesCreated: Int! + relationshipsCreated: Int! + } + + type CreateMoviesMutationResponse { + info: CreateInfo! + movies: [Movie!]! + } + + type DeleteInfo { + bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") + nodesDeleted: Int! + relationshipsDeleted: Int! + } + + type Genre { + movies(directed: Boolean = true, options: MovieOptions, where: MovieWhere): [Movie!]! + moviesAggregate(directed: Boolean = true, where: MovieWhere): GenreMovieMoviesAggregationSelection + moviesConnection(after: String, directed: Boolean = true, first: Int, sort: [GenreMoviesConnectionSort!], where: GenreMoviesConnectionWhere): GenreMoviesConnection! + name: String! + } + + type GenreAggregateSelection { + count: Int! + name: StringAggregateSelectionNonNullable! + } + + input GenreConnectInput { + movies: [GenreMoviesConnectFieldInput!] + } + + input GenreConnectWhere { + node: GenreWhere! + } + + input GenreCreateInput { + movies: GenreMoviesFieldInput + name: String! + } + + input GenreDeleteInput { + movies: [GenreMoviesDeleteFieldInput!] + } + + input GenreDisconnectInput { + movies: [GenreMoviesDisconnectFieldInput!] + } + + type GenreEdge { + cursor: String! + node: Genre! + } + + type GenreMovieMoviesAggregationSelection { + count: Int! + node: GenreMovieMoviesNodeAggregateSelection + } + + type GenreMovieMoviesNodeAggregateSelection { + name: StringAggregateSelectionNonNullable! + } + + input GenreMoviesAggregateInput { + AND: [GenreMoviesAggregateInput!] + NOT: GenreMoviesAggregateInput + OR: [GenreMoviesAggregateInput!] + count: Int + count_GT: Int + count_GTE: Int + count_LT: Int + count_LTE: Int + node: GenreMoviesNodeAggregationWhereInput + } + + input GenreMoviesConnectFieldInput { + connect: [MovieConnectInput!] + \\"\\"\\" + Whether or not to overwrite any matching relationship with the new properties. Will default to \`false\` in 4.0.0. + \\"\\"\\" + overwrite: Boolean! = true + where: MovieConnectWhere + } + + type GenreMoviesConnection { + edges: [GenreMoviesRelationship!]! + pageInfo: PageInfo! + totalCount: Int! + } + + input GenreMoviesConnectionSort { + node: MovieSort + } + + input GenreMoviesConnectionWhere { + AND: [GenreMoviesConnectionWhere!] + NOT: GenreMoviesConnectionWhere + OR: [GenreMoviesConnectionWhere!] + node: MovieWhere + node_NOT: MovieWhere @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + } + + input GenreMoviesCreateFieldInput { + node: MovieCreateInput! + } + + input GenreMoviesDeleteFieldInput { + where: GenreMoviesConnectionWhere + } + + input GenreMoviesDisconnectFieldInput { + disconnect: MovieDisconnectInput + where: GenreMoviesConnectionWhere + } + + input GenreMoviesFieldInput { + connect: [GenreMoviesConnectFieldInput!] + create: [GenreMoviesCreateFieldInput!] + } + + input GenreMoviesNodeAggregationWhereInput { + AND: [GenreMoviesNodeAggregationWhereInput!] + NOT: GenreMoviesNodeAggregationWhereInput + OR: [GenreMoviesNodeAggregationWhereInput!] + name_AVERAGE_EQUAL: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LENGTH_EQUAL: Float + name_AVERAGE_LENGTH_GT: Float + name_AVERAGE_LENGTH_GTE: Float + name_AVERAGE_LENGTH_LT: Float + name_AVERAGE_LENGTH_LTE: Float + name_AVERAGE_LT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_EQUAL: String @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LONGEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LENGTH_EQUAL: Int + name_LONGEST_LENGTH_GT: Int + name_LONGEST_LENGTH_GTE: Int + name_LONGEST_LENGTH_LT: Int + name_LONGEST_LENGTH_LTE: Int + name_LONGEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_SHORTEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LENGTH_EQUAL: Int + name_SHORTEST_LENGTH_GT: Int + name_SHORTEST_LENGTH_GTE: Int + name_SHORTEST_LENGTH_LT: Int + name_SHORTEST_LENGTH_LTE: Int + name_SHORTEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + } + + type GenreMoviesRelationship { + cursor: String! + node: Movie! + } + + input GenreMoviesUpdateConnectionInput { + node: MovieUpdateInput + } + + input GenreMoviesUpdateFieldInput { + connect: [GenreMoviesConnectFieldInput!] + create: [GenreMoviesCreateFieldInput!] + delete: [GenreMoviesDeleteFieldInput!] + disconnect: [GenreMoviesDisconnectFieldInput!] + update: GenreMoviesUpdateConnectionInput + where: GenreMoviesConnectionWhere + } + + input GenreOptions { + limit: Int + offset: Int + \\"\\"\\" + Specify one or more GenreSort objects to sort Genres by. The sorts will be applied in the order in which they are arranged in the array. + \\"\\"\\" + sort: [GenreSort!] + } + + input GenreRelationInput { + movies: [GenreMoviesCreateFieldInput!] + } + + \\"\\"\\" + Fields to sort Genres by. The order in which sorts are applied is not guaranteed when specifying many fields in one GenreSort object. + \\"\\"\\" + input GenreSort { + name: SortDirection + } + + input GenreUpdateInput { + movies: [GenreMoviesUpdateFieldInput!] + name: String + } + + input GenreWhere { + AND: [GenreWhere!] + NOT: GenreWhere + OR: [GenreWhere!] + movies: MovieWhere @deprecated(reason: \\"Use \`movies_SOME\` instead.\\") + moviesAggregate: GenreMoviesAggregateInput + moviesConnection: GenreMoviesConnectionWhere @deprecated(reason: \\"Use \`moviesConnection_SOME\` instead.\\") + \\"\\"\\" + Return Genres where all of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_ALL: GenreMoviesConnectionWhere + \\"\\"\\" + Return Genres where none of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_NONE: GenreMoviesConnectionWhere + moviesConnection_NOT: GenreMoviesConnectionWhere @deprecated(reason: \\"Use \`moviesConnection_NONE\` instead.\\") + \\"\\"\\" + Return Genres where one of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_SINGLE: GenreMoviesConnectionWhere + \\"\\"\\" + Return Genres where some of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_SOME: GenreMoviesConnectionWhere + \\"\\"\\"Return Genres where all of the related Movies match this filter\\"\\"\\" + movies_ALL: MovieWhere + \\"\\"\\"Return Genres where none of the related Movies match this filter\\"\\"\\" + movies_NONE: MovieWhere + movies_NOT: MovieWhere @deprecated(reason: \\"Use \`movies_NONE\` instead.\\") + \\"\\"\\"Return Genres where one of the related Movies match this filter\\"\\"\\" + movies_SINGLE: MovieWhere + \\"\\"\\"Return Genres where some of the related Movies match this filter\\"\\"\\" + movies_SOME: MovieWhere + name: String + name_CONTAINS: String + name_ENDS_WITH: String + name_IN: [String!] + name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_STARTS_WITH: String + } + + type GenresConnection { + edges: [GenreEdge!]! + pageInfo: PageInfo! + totalCount: Int! + } + + type Movie { + genre(directed: Boolean = true, options: GenreOptions, where: GenreWhere): Genre! + genreAggregate(directed: Boolean = true, where: GenreWhere): MovieGenreGenreAggregationSelection + genreConnection(after: String, directed: Boolean = true, first: Int, sort: [MovieGenreConnectionSort!], where: MovieGenreConnectionWhere): MovieGenreConnection! + name: String! + } + + type MovieAggregateSelection { + count: Int! + name: StringAggregateSelectionNonNullable! + } + + input MovieConnectInput { + genre: MovieGenreConnectFieldInput + } + + input MovieConnectWhere { + node: MovieWhere! + } + + input MovieCreateInput { + genre: MovieGenreFieldInput + name: String! + } + + input MovieDisconnectInput { + genre: MovieGenreDisconnectFieldInput + } + + type MovieEdge { + cursor: String! + node: Movie! + } + + input MovieGenreAggregateInput { + AND: [MovieGenreAggregateInput!] + NOT: MovieGenreAggregateInput + OR: [MovieGenreAggregateInput!] + count: Int + count_GT: Int + count_GTE: Int + count_LT: Int + count_LTE: Int + node: MovieGenreNodeAggregationWhereInput + } + + input MovieGenreConnectFieldInput { + connect: GenreConnectInput + \\"\\"\\" + Whether or not to overwrite any matching relationship with the new properties. Will default to \`false\` in 4.0.0. + \\"\\"\\" + overwrite: Boolean! = true + where: GenreConnectWhere + } + + type MovieGenreConnection { + edges: [MovieGenreRelationship!]! + pageInfo: PageInfo! + totalCount: Int! + } + + input MovieGenreConnectionSort { + node: GenreSort + } + + input MovieGenreConnectionWhere { + AND: [MovieGenreConnectionWhere!] + NOT: MovieGenreConnectionWhere + OR: [MovieGenreConnectionWhere!] + node: GenreWhere + node_NOT: GenreWhere @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + } + + input MovieGenreDisconnectFieldInput { + disconnect: GenreDisconnectInput + where: MovieGenreConnectionWhere + } + + input MovieGenreFieldInput { + connect: MovieGenreConnectFieldInput + } + + type MovieGenreGenreAggregationSelection { + count: Int! + node: MovieGenreGenreNodeAggregateSelection + } + + type MovieGenreGenreNodeAggregateSelection { + name: StringAggregateSelectionNonNullable! + } + + input MovieGenreNodeAggregationWhereInput { + AND: [MovieGenreNodeAggregationWhereInput!] + NOT: MovieGenreNodeAggregationWhereInput + OR: [MovieGenreNodeAggregationWhereInput!] + name_AVERAGE_EQUAL: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LENGTH_EQUAL: Float + name_AVERAGE_LENGTH_GT: Float + name_AVERAGE_LENGTH_GTE: Float + name_AVERAGE_LENGTH_LT: Float + name_AVERAGE_LENGTH_LTE: Float + name_AVERAGE_LT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_EQUAL: String @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LONGEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LENGTH_EQUAL: Int + name_LONGEST_LENGTH_GT: Int + name_LONGEST_LENGTH_GTE: Int + name_LONGEST_LENGTH_LT: Int + name_LONGEST_LENGTH_LTE: Int + name_LONGEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_SHORTEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LENGTH_EQUAL: Int + name_SHORTEST_LENGTH_GT: Int + name_SHORTEST_LENGTH_GTE: Int + name_SHORTEST_LENGTH_LT: Int + name_SHORTEST_LENGTH_LTE: Int + name_SHORTEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + } + + type MovieGenreRelationship { + cursor: String! + node: Genre! + } + + input MovieGenreUpdateFieldInput { + connect: MovieGenreConnectFieldInput + disconnect: MovieGenreDisconnectFieldInput + where: MovieGenreConnectionWhere + } + + input MovieOptions { + limit: Int + offset: Int + \\"\\"\\" + Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. + \\"\\"\\" + sort: [MovieSort!] + } + + \\"\\"\\" + Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. + \\"\\"\\" + input MovieSort { + name: SortDirection + } + + input MovieUpdateInput { + genre: MovieGenreUpdateFieldInput + name: String + } + + input MovieWhere { + AND: [MovieWhere!] + NOT: MovieWhere + OR: [MovieWhere!] + genre: GenreWhere + genreAggregate: MovieGenreAggregateInput + genreConnection: MovieGenreConnectionWhere + genreConnection_NOT: MovieGenreConnectionWhere + genre_NOT: GenreWhere + name: String + name_CONTAINS: String + name_ENDS_WITH: String + name_IN: [String!] + name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_STARTS_WITH: String + } + + type MoviesConnection { + edges: [MovieEdge!]! + pageInfo: PageInfo! + totalCount: Int! + } + + type Mutation { + createGenres(input: [GenreCreateInput!]!): CreateGenresMutationResponse! + createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! + deleteGenres(delete: GenreDeleteInput, where: GenreWhere): DeleteInfo! + deleteMovies(where: MovieWhere): DeleteInfo! + updateGenres(connect: GenreConnectInput, create: GenreRelationInput, delete: GenreDeleteInput, disconnect: GenreDisconnectInput, update: GenreUpdateInput, where: GenreWhere): UpdateGenresMutationResponse! + updateMovies(connect: MovieConnectInput, disconnect: MovieDisconnectInput, update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! + } + + \\"\\"\\"Pagination information (Relay)\\"\\"\\" + type PageInfo { + endCursor: String + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + } + + type Query { + genres(options: GenreOptions, where: GenreWhere): [Genre!]! + genresAggregate(where: GenreWhere): GenreAggregateSelection! + genresConnection(after: String, first: Int, sort: [GenreSort], where: GenreWhere): GenresConnection! + movies(options: MovieOptions, where: MovieWhere): [Movie!]! + moviesAggregate(where: MovieWhere): MovieAggregateSelection! + moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! + } + + enum SortDirection { + \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" + ASC + \\"\\"\\"Sort by field values in descending order.\\"\\"\\" + DESC + } + + type StringAggregateSelectionNonNullable { + longest: String! + shortest: String! + } + + type UpdateGenresMutationResponse { + genres: [Genre!]! + info: UpdateInfo! + } + + type UpdateInfo { + bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") + nodesCreated: Int! + nodesDeleted: Int! + relationshipsCreated: Int! + relationshipsDeleted: Int! + } + + type UpdateMoviesMutationResponse { + info: UpdateInfo! + movies: [Movie!]! + }" + `); + }); + + test("No nested operations in one type", async () => { + const typeDefs = gql` + type Movie { + name: String! + genre: Genre! @relationship(type: "HAS_GENRE", direction: OUT, nestedOperations: []) + } + + type Genre { + name: String! + movies: [Movie!]! @relationship(type: "HAS_GENRE", direction: IN) + } + `; + + const neoSchema = new Neo4jGraphQL({ typeDefs }); + const printedSchema = printSchemaWithDirectives(lexicographicSortSchema(await neoSchema.getSchema())); + + expect(printedSchema).toMatchInlineSnapshot(` + "schema { + query: Query + mutation: Mutation + } + + type CreateGenresMutationResponse { + genres: [Genre!]! + info: CreateInfo! + } + + type CreateInfo { + bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") + nodesCreated: Int! + relationshipsCreated: Int! + } + + type CreateMoviesMutationResponse { + info: CreateInfo! + movies: [Movie!]! + } + + type DeleteInfo { + bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") + nodesDeleted: Int! + relationshipsDeleted: Int! + } + + type Genre { + movies(directed: Boolean = true, options: MovieOptions, where: MovieWhere): [Movie!]! + moviesAggregate(directed: Boolean = true, where: MovieWhere): GenreMovieMoviesAggregationSelection + moviesConnection(after: String, directed: Boolean = true, first: Int, sort: [GenreMoviesConnectionSort!], where: GenreMoviesConnectionWhere): GenreMoviesConnection! + name: String! + } + + type GenreAggregateSelection { + count: Int! + name: StringAggregateSelectionNonNullable! + } + + input GenreConnectInput { + movies: [GenreMoviesConnectFieldInput!] + } + + input GenreCreateInput { + movies: GenreMoviesFieldInput + name: String! + } + + input GenreDeleteInput { + movies: [GenreMoviesDeleteFieldInput!] + } + + input GenreDisconnectInput { + movies: [GenreMoviesDisconnectFieldInput!] + } + + type GenreEdge { + cursor: String! + node: Genre! + } + + type GenreMovieMoviesAggregationSelection { + count: Int! + node: GenreMovieMoviesNodeAggregateSelection + } + + type GenreMovieMoviesNodeAggregateSelection { + name: StringAggregateSelectionNonNullable! + } + + input GenreMoviesAggregateInput { + AND: [GenreMoviesAggregateInput!] + NOT: GenreMoviesAggregateInput + OR: [GenreMoviesAggregateInput!] + count: Int + count_GT: Int + count_GTE: Int + count_LT: Int + count_LTE: Int + node: GenreMoviesNodeAggregationWhereInput + } + + input GenreMoviesConnectFieldInput { + \\"\\"\\" + Whether or not to overwrite any matching relationship with the new properties. Will default to \`false\` in 4.0.0. + \\"\\"\\" + overwrite: Boolean! = true + where: MovieConnectWhere + } + + type GenreMoviesConnection { + edges: [GenreMoviesRelationship!]! + pageInfo: PageInfo! + totalCount: Int! + } + + input GenreMoviesConnectionSort { + node: MovieSort + } + + input GenreMoviesConnectionWhere { + AND: [GenreMoviesConnectionWhere!] + NOT: GenreMoviesConnectionWhere + OR: [GenreMoviesConnectionWhere!] + node: MovieWhere + node_NOT: MovieWhere @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + } + + input GenreMoviesCreateFieldInput { + node: MovieCreateInput! + } + + input GenreMoviesDeleteFieldInput { + where: GenreMoviesConnectionWhere + } + + input GenreMoviesDisconnectFieldInput { + where: GenreMoviesConnectionWhere + } + + input GenreMoviesFieldInput { + connect: [GenreMoviesConnectFieldInput!] + create: [GenreMoviesCreateFieldInput!] + } + + input GenreMoviesNodeAggregationWhereInput { + AND: [GenreMoviesNodeAggregationWhereInput!] + NOT: GenreMoviesNodeAggregationWhereInput + OR: [GenreMoviesNodeAggregationWhereInput!] + name_AVERAGE_EQUAL: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LENGTH_EQUAL: Float + name_AVERAGE_LENGTH_GT: Float + name_AVERAGE_LENGTH_GTE: Float + name_AVERAGE_LENGTH_LT: Float + name_AVERAGE_LENGTH_LTE: Float + name_AVERAGE_LT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_EQUAL: String @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LONGEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LENGTH_EQUAL: Int + name_LONGEST_LENGTH_GT: Int + name_LONGEST_LENGTH_GTE: Int + name_LONGEST_LENGTH_LT: Int + name_LONGEST_LENGTH_LTE: Int + name_LONGEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_SHORTEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LENGTH_EQUAL: Int + name_SHORTEST_LENGTH_GT: Int + name_SHORTEST_LENGTH_GTE: Int + name_SHORTEST_LENGTH_LT: Int + name_SHORTEST_LENGTH_LTE: Int + name_SHORTEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + } + + type GenreMoviesRelationship { + cursor: String! + node: Movie! + } + + input GenreMoviesUpdateConnectionInput { + node: MovieUpdateInput + } + + input GenreMoviesUpdateFieldInput { + connect: [GenreMoviesConnectFieldInput!] + create: [GenreMoviesCreateFieldInput!] + delete: [GenreMoviesDeleteFieldInput!] + disconnect: [GenreMoviesDisconnectFieldInput!] + update: GenreMoviesUpdateConnectionInput + where: GenreMoviesConnectionWhere + } + + input GenreOptions { + limit: Int + offset: Int + \\"\\"\\" + Specify one or more GenreSort objects to sort Genres by. The sorts will be applied in the order in which they are arranged in the array. + \\"\\"\\" + sort: [GenreSort!] + } + + input GenreRelationInput { + movies: [GenreMoviesCreateFieldInput!] + } + + \\"\\"\\" + Fields to sort Genres by. The order in which sorts are applied is not guaranteed when specifying many fields in one GenreSort object. + \\"\\"\\" + input GenreSort { + name: SortDirection + } + + input GenreUpdateInput { + movies: [GenreMoviesUpdateFieldInput!] + name: String + } + + input GenreWhere { + AND: [GenreWhere!] + NOT: GenreWhere + OR: [GenreWhere!] + movies: MovieWhere @deprecated(reason: \\"Use \`movies_SOME\` instead.\\") + moviesAggregate: GenreMoviesAggregateInput + moviesConnection: GenreMoviesConnectionWhere @deprecated(reason: \\"Use \`moviesConnection_SOME\` instead.\\") + \\"\\"\\" + Return Genres where all of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_ALL: GenreMoviesConnectionWhere + \\"\\"\\" + Return Genres where none of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_NONE: GenreMoviesConnectionWhere + moviesConnection_NOT: GenreMoviesConnectionWhere @deprecated(reason: \\"Use \`moviesConnection_NONE\` instead.\\") + \\"\\"\\" + Return Genres where one of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_SINGLE: GenreMoviesConnectionWhere + \\"\\"\\" + Return Genres where some of the related GenreMoviesConnections match this filter + \\"\\"\\" + moviesConnection_SOME: GenreMoviesConnectionWhere + \\"\\"\\"Return Genres where all of the related Movies match this filter\\"\\"\\" + movies_ALL: MovieWhere + \\"\\"\\"Return Genres where none of the related Movies match this filter\\"\\"\\" + movies_NONE: MovieWhere + movies_NOT: MovieWhere @deprecated(reason: \\"Use \`movies_NONE\` instead.\\") + \\"\\"\\"Return Genres where one of the related Movies match this filter\\"\\"\\" + movies_SINGLE: MovieWhere + \\"\\"\\"Return Genres where some of the related Movies match this filter\\"\\"\\" + movies_SOME: MovieWhere + name: String + name_CONTAINS: String + name_ENDS_WITH: String + name_IN: [String!] + name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_STARTS_WITH: String + } + + type GenresConnection { + edges: [GenreEdge!]! + pageInfo: PageInfo! + totalCount: Int! + } + + type Movie { + genre(directed: Boolean = true, options: GenreOptions, where: GenreWhere): Genre! + genreAggregate(directed: Boolean = true, where: GenreWhere): MovieGenreGenreAggregationSelection + genreConnection(after: String, directed: Boolean = true, first: Int, sort: [MovieGenreConnectionSort!], where: MovieGenreConnectionWhere): MovieGenreConnection! + name: String! + } + + type MovieAggregateSelection { + count: Int! + name: StringAggregateSelectionNonNullable! + } + + input MovieConnectWhere { + node: MovieWhere! + } + + input MovieCreateInput { + name: String! + } + + type MovieEdge { + cursor: String! + node: Movie! + } + + input MovieGenreAggregateInput { + AND: [MovieGenreAggregateInput!] + NOT: MovieGenreAggregateInput + OR: [MovieGenreAggregateInput!] + count: Int + count_GT: Int + count_GTE: Int + count_LT: Int + count_LTE: Int + node: MovieGenreNodeAggregationWhereInput + } + + type MovieGenreConnection { + edges: [MovieGenreRelationship!]! + pageInfo: PageInfo! + totalCount: Int! + } + + input MovieGenreConnectionSort { + node: GenreSort + } + + input MovieGenreConnectionWhere { + AND: [MovieGenreConnectionWhere!] + NOT: MovieGenreConnectionWhere + OR: [MovieGenreConnectionWhere!] + node: GenreWhere + node_NOT: GenreWhere @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + } + + type MovieGenreGenreAggregationSelection { + count: Int! + node: MovieGenreGenreNodeAggregateSelection + } + + type MovieGenreGenreNodeAggregateSelection { + name: StringAggregateSelectionNonNullable! + } + + input MovieGenreNodeAggregationWhereInput { + AND: [MovieGenreNodeAggregationWhereInput!] + NOT: MovieGenreNodeAggregationWhereInput + OR: [MovieGenreNodeAggregationWhereInput!] + name_AVERAGE_EQUAL: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_GTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LENGTH_EQUAL: Float + name_AVERAGE_LENGTH_GT: Float + name_AVERAGE_LENGTH_GTE: Float + name_AVERAGE_LENGTH_LT: Float + name_AVERAGE_LENGTH_LTE: Float + name_AVERAGE_LT: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_AVERAGE_LTE: Float @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_EQUAL: String @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_GTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LONGEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LENGTH_EQUAL: Int + name_LONGEST_LENGTH_GT: Int + name_LONGEST_LENGTH_GTE: Int + name_LONGEST_LENGTH_LT: Int + name_LONGEST_LENGTH_LTE: Int + name_LONGEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LONGEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_LT: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_LTE: Int @deprecated(reason: \\"Aggregation filters that are not relying on an aggregating function will be deprecated.\\") + name_SHORTEST_EQUAL: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_GTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LENGTH_EQUAL: Int + name_SHORTEST_LENGTH_GT: Int + name_SHORTEST_LENGTH_GTE: Int + name_SHORTEST_LENGTH_LT: Int + name_SHORTEST_LENGTH_LTE: Int + name_SHORTEST_LT: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + name_SHORTEST_LTE: Int @deprecated(reason: \\"Please use the explicit _LENGTH version for string aggregation.\\") + } + + type MovieGenreRelationship { + cursor: String! + node: Genre! + } + + input MovieOptions { + limit: Int + offset: Int + \\"\\"\\" + Specify one or more MovieSort objects to sort Movies by. The sorts will be applied in the order in which they are arranged in the array. + \\"\\"\\" + sort: [MovieSort!] + } + + \\"\\"\\" + Fields to sort Movies by. The order in which sorts are applied is not guaranteed when specifying many fields in one MovieSort object. + \\"\\"\\" + input MovieSort { + name: SortDirection + } + + input MovieUpdateInput { + name: String + } + + input MovieWhere { + AND: [MovieWhere!] + NOT: MovieWhere + OR: [MovieWhere!] + genre: GenreWhere + genreAggregate: MovieGenreAggregateInput + genreConnection: MovieGenreConnectionWhere + genreConnection_NOT: MovieGenreConnectionWhere + genre_NOT: GenreWhere + name: String + name_CONTAINS: String + name_ENDS_WITH: String + name_IN: [String!] + name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_IN: [String!] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_STARTS_WITH: String + } + + type MoviesConnection { + edges: [MovieEdge!]! + pageInfo: PageInfo! + totalCount: Int! + } + + type Mutation { + createGenres(input: [GenreCreateInput!]!): CreateGenresMutationResponse! + createMovies(input: [MovieCreateInput!]!): CreateMoviesMutationResponse! + deleteGenres(delete: GenreDeleteInput, where: GenreWhere): DeleteInfo! + deleteMovies(where: MovieWhere): DeleteInfo! + updateGenres(connect: GenreConnectInput, create: GenreRelationInput, delete: GenreDeleteInput, disconnect: GenreDisconnectInput, update: GenreUpdateInput, where: GenreWhere): UpdateGenresMutationResponse! + updateMovies(update: MovieUpdateInput, where: MovieWhere): UpdateMoviesMutationResponse! + } + + \\"\\"\\"Pagination information (Relay)\\"\\"\\" + type PageInfo { + endCursor: String + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + } + + type Query { + genres(options: GenreOptions, where: GenreWhere): [Genre!]! + genresAggregate(where: GenreWhere): GenreAggregateSelection! + genresConnection(after: String, first: Int, sort: [GenreSort], where: GenreWhere): GenresConnection! + movies(options: MovieOptions, where: MovieWhere): [Movie!]! + moviesAggregate(where: MovieWhere): MovieAggregateSelection! + moviesConnection(after: String, first: Int, sort: [MovieSort], where: MovieWhere): MoviesConnection! + } + + enum SortDirection { + \\"\\"\\"Sort by field values in ascending order.\\"\\"\\" + ASC + \\"\\"\\"Sort by field values in descending order.\\"\\"\\" + DESC + } + + type StringAggregateSelectionNonNullable { + longest: String! + shortest: String! + } + + type UpdateGenresMutationResponse { + genres: [Genre!]! + info: UpdateInfo! + } + + type UpdateInfo { + bookmark: String @deprecated(reason: \\"This field has been deprecated because bookmarks are now handled by the driver.\\") + nodesCreated: Int! + nodesDeleted: Int! + relationshipsCreated: Int! + relationshipsDeleted: Int! + } + + type UpdateMoviesMutationResponse { + info: UpdateInfo! + movies: [Movie!]! + }" + `); + }); +}); diff --git a/packages/graphql/tests/schema/issues/556.test.ts b/packages/graphql/tests/schema/issues/556.test.ts index 5c85c8e5ca..f22a6aa5f1 100644 --- a/packages/graphql/tests/schema/issues/556.test.ts +++ b/packages/graphql/tests/schema/issues/556.test.ts @@ -33,7 +33,7 @@ describe("https://github.com/neo4j/graphql/issues/556", () => { } type Article { - id: ID! @id + id: ID! @id @unique blocks: [Block!]! @relationship(type: "HAS_BLOCK", direction: OUT, properties: "HasBlock") images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } @@ -47,16 +47,16 @@ describe("https://github.com/neo4j/graphql/issues/556", () => { } type TextBlock implements Block { - id: ID @id + id: ID @id @unique text: String } type DividerBlock implements Block { - id: ID @id + id: ID @id @unique } type ImageBlock implements Block { - id: ID @id + id: ID @id @unique images: [Image!]! @relationship(type: "HAS_IMAGE", direction: OUT) } diff --git a/packages/graphql/tests/schema/issues/872.test.ts b/packages/graphql/tests/schema/issues/872.test.ts index 909254a56f..f698ee9a1a 100644 --- a/packages/graphql/tests/schema/issues/872.test.ts +++ b/packages/graphql/tests/schema/issues/872.test.ts @@ -27,7 +27,7 @@ describe("https://github.com/neo4j/graphql/issues/872", () => { const typeDefs = gql` type Movie { title: String! - id: ID! @id + id: ID! @id @unique } type Actor { diff --git a/packages/graphql/tests/schema/rfcs/rfc-003.test.ts b/packages/graphql/tests/schema/rfcs/rfc-003.test.ts index 2e4c140eff..28d23c65b6 100644 --- a/packages/graphql/tests/schema/rfcs/rfc-003.test.ts +++ b/packages/graphql/tests/schema/rfcs/rfc-003.test.ts @@ -34,15 +34,15 @@ describe("schema/rfc/003", () => { } type Target { - id: ID @id + id: ID @id @unique } type SecondTarget { - id: ID @id + id: ID @id @unique } type ThirdTarget { - id: ID @id + id: ID @id @unique } `; @@ -58,7 +58,7 @@ describe("schema/rfc/003", () => { } type Target { - id: ID @id + id: ID @id @unique } `; @@ -74,7 +74,7 @@ describe("schema/rfc/003", () => { } type Target { - id: ID @id + id: ID @id @unique } `; @@ -89,7 +89,7 @@ describe("schema/rfc/003", () => { } type Target { - id: ID @id + id: ID @id @unique } `; @@ -109,14 +109,14 @@ describe("schema/rfc/003", () => { } type Source implements SourceInterface { - id: ID @id + id: ID @id @unique targets: [Target!]! target1: Target! target2: Target } type Target { - id: ID @id + id: ID @id @unique } `; @@ -132,12 +132,12 @@ describe("schema/rfc/003", () => { } type Source implements SourceInterface { - id: ID @id + id: ID @id @unique targets: [Target!] } type Target { - id: ID @id + id: ID @id @unique } `; @@ -153,12 +153,12 @@ describe("schema/rfc/003", () => { } type Source implements SourceInterface { - id: ID @id + id: ID @id @unique targets: [Target]! } type Target { - id: ID @id + id: ID @id @unique } `; @@ -174,12 +174,12 @@ describe("schema/rfc/003", () => { } type Source implements SourceInterface { - id: ID @id + id: ID @id @unique targets: [Target] } type Target { - id: ID @id + id: ID @id @unique } `; diff --git a/packages/graphql/tests/schema/subscriptions.test.ts b/packages/graphql/tests/schema/subscriptions.test.ts index 537e18b496..9748ee91c2 100644 --- a/packages/graphql/tests/schema/subscriptions.test.ts +++ b/packages/graphql/tests/schema/subscriptions.test.ts @@ -3415,7 +3415,7 @@ describe("Subscriptions", () => { test("Subscriptions excluded", async () => { const typeDefs = gql` - type Movie @exclude(operations: [SUBSCRIBE]) { + type Movie @subscription(events: []) { id: ID actorCount: Int averageRating: Float @@ -3931,7 +3931,7 @@ describe("Subscriptions", () => { test("Type with relationship to a subscriptions excluded type", async () => { const typeDefs = gql` - type User @exclude(operations: [CREATE, DELETE, UPDATE, SUBSCRIBE]) { + type User @mutation(operations: []) @subscription(events: []) { username: String! name: String } @@ -3974,6 +3974,10 @@ describe("Subscriptions", () => { owner: AgreementOwnerConnectFieldInput } + type AgreementConnectedRelationships { + owner: AgreementOwnerConnectedRelationship + } + input AgreementCreateInput { id: Int! name: String @@ -4039,6 +4043,10 @@ describe("Subscriptions", () => { where: UserConnectWhere } + type AgreementOwnerConnectedRelationship { + node: UserEventPayload! + } + type AgreementOwnerConnection { edges: [AgreementOwnerRelationship!]! pageInfo: PageInfo! @@ -4155,6 +4163,10 @@ describe("Subscriptions", () => { node: User! } + input AgreementOwnerRelationshipSubscriptionWhere { + node: UserSubscriptionWhere + } + input AgreementOwnerUpdateConnectionInput { node: UserUpdateInput } @@ -4174,6 +4186,7 @@ describe("Subscriptions", () => { type AgreementRelationshipCreatedEvent { agreement: AgreementEventPayload! + createdRelationship: AgreementConnectedRelationships! event: EventType! relationshipFieldName: String! timestamp: Float! @@ -4184,10 +4197,12 @@ describe("Subscriptions", () => { NOT: AgreementRelationshipCreatedSubscriptionWhere OR: [AgreementRelationshipCreatedSubscriptionWhere!] agreement: AgreementSubscriptionWhere + createdRelationship: AgreementRelationshipsSubscriptionWhere } type AgreementRelationshipDeletedEvent { agreement: AgreementEventPayload! + deletedRelationship: AgreementConnectedRelationships! event: EventType! relationshipFieldName: String! timestamp: Float! @@ -4198,6 +4213,11 @@ describe("Subscriptions", () => { NOT: AgreementRelationshipDeletedSubscriptionWhere OR: [AgreementRelationshipDeletedSubscriptionWhere!] agreement: AgreementSubscriptionWhere + deletedRelationship: AgreementRelationshipsSubscriptionWhere + } + + input AgreementRelationshipsSubscriptionWhere { + owner: AgreementOwnerRelationshipSubscriptionWhere } \\"\\"\\" @@ -4410,6 +4430,11 @@ describe("Subscriptions", () => { node: User! } + type UserEventPayload { + name: String + username: String! + } + input UserOptions { limit: Int offset: Int @@ -4427,6 +4452,32 @@ describe("Subscriptions", () => { username: SortDirection } + input UserSubscriptionWhere { + AND: [UserSubscriptionWhere!] + NOT: UserSubscriptionWhere + OR: [UserSubscriptionWhere!] + name: String + name_CONTAINS: String + name_ENDS_WITH: String + name_IN: [String] + name_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + name_STARTS_WITH: String + username: String + username_CONTAINS: String + username_ENDS_WITH: String + username_IN: [String] + username_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + username_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + username_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + username_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + username_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + username_STARTS_WITH: String + } + input UserUpdateInput { name: String username: String @@ -4478,7 +4529,7 @@ describe("Subscriptions", () => { union Actor = Star | Person - type Star @exclude(operations: [SUBSCRIBE]) { + type Star @subscription(events: []) { movies: [Movie!]! @relationship(type: "ACTED_IN", direction: OUT) } type Person { @@ -5534,7 +5585,7 @@ describe("Subscriptions", () => { test("Type with relationship to a subscriptions excluded type + Interface type", async () => { const typeDefs = gql` - type Movie implements Production @exclude(operations: [SUBSCRIBE]) { + type Movie implements Production @subscription(events: []) { title: String! id: ID @unique director: Creature! @@ -5842,6 +5893,32 @@ describe("Subscriptions", () => { title: SortDirection } + input MovieSubscriptionWhere { + AND: [MovieSubscriptionWhere!] + NOT: MovieSubscriptionWhere + OR: [MovieSubscriptionWhere!] + id: ID + id_CONTAINS: ID + id_ENDS_WITH: ID + id_IN: [ID] + id_NOT: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + id_NOT_CONTAINS: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + id_NOT_ENDS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + id_NOT_IN: [ID] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + id_NOT_STARTS_WITH: ID @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + id_STARTS_WITH: ID + title: String + title_CONTAINS: String + title_ENDS_WITH: String + title_IN: [String] + title_NOT: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + title_NOT_CONTAINS: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + title_NOT_ENDS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + title_NOT_IN: [String] @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + title_NOT_STARTS_WITH: String @deprecated(reason: \\"Negation filters will be deprecated, use the NOT operator to achieve the same behavior\\") + title_STARTS_WITH: String + } + input MovieUpdateInput { director: MovieDirectorUpdateFieldInput id: ID @@ -6151,6 +6228,7 @@ describe("Subscriptions", () => { } input ProductionImplementationsSubscriptionWhere { + Movie: MovieSubscriptionWhere Series: SeriesSubscriptionWhere } diff --git a/packages/graphql/tests/tck/connections/connect-or-create/connect-or-create.test.ts b/packages/graphql/tests/tck/connections/connect-or-create/connect-or-create.test.ts index 100104f219..3edb7f852b 100644 --- a/packages/graphql/tests/tck/connections/connect-or-create/connect-or-create.test.ts +++ b/packages/graphql/tests/tck/connections/connect-or-create/connect-or-create.test.ts @@ -173,7 +173,7 @@ describe("Create or Connect", () => { beforeAll(() => { typeDefs = gql` type Movie { - id: ID! @id + id: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) title: String! @unique actors: [Actor!]! @relationship(type: "ACTED_IN", properties: "ActedIn", direction: IN) diff --git a/packages/graphql/tests/tck/directives/autogenerate.test.ts b/packages/graphql/tests/tck/directives/autogenerate.test.ts index 68ab265639..f63ce3e640 100644 --- a/packages/graphql/tests/tck/directives/autogenerate.test.ts +++ b/packages/graphql/tests/tck/directives/autogenerate.test.ts @@ -29,7 +29,7 @@ describe("Cypher autogenerate directive", () => { beforeAll(() => { typeDefs = gql` type Movie { - id: ID! @id + id: ID! @id @unique name: String! } `; diff --git a/packages/graphql/tests/tck/fragments.test.ts b/packages/graphql/tests/tck/fragments.test.ts index e911f50e79..a0d07fff59 100644 --- a/packages/graphql/tests/tck/fragments.test.ts +++ b/packages/graphql/tests/tck/fragments.test.ts @@ -33,7 +33,7 @@ describe("Cypher Fragment", () => { } type User implements Entity { - id: ID! @id + id: ID! @id @unique username: String! owns: [OwnableType!]! @relationship(type: "OWNS", direction: OUT) } @@ -46,12 +46,12 @@ describe("Cypher Fragment", () => { } type Tile implements Ownable { - id: ID! @id + id: ID! @id @unique owner: User! @relationship(type: "OWNS", direction: IN) } type Character implements Ownable { - id: ID! @id + id: ID! @id @unique owner: User! @relationship(type: "OWNS", direction: IN) } `; diff --git a/packages/graphql/tests/tck/global-node.test.ts b/packages/graphql/tests/tck/global-node.test.ts index a141c6f200..772911a86d 100644 --- a/packages/graphql/tests/tck/global-node.test.ts +++ b/packages/graphql/tests/tck/global-node.test.ts @@ -26,12 +26,12 @@ describe("Global nodes", () => { test("it should fetch the correct node and fields", async () => { const typeDefs = gql` type Actor { - name: ID! @id(global: true) + name: ID! @id @unique @relayId movies: [Movie!]! @relationship(type: "ACTED_IN", direction: OUT) } type Movie { - title: ID! @id(global: true) + title: ID! @id @unique @relayId actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN) } `; @@ -66,12 +66,12 @@ describe("Global nodes", () => { test("it should project the correct node and fields when id is the idField", async () => { const typeDefs = gql` type Actor { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! movies: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } type Movie { - title: ID! @id(global: true) + title: ID! @id @unique @relayId actors: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } `; @@ -109,12 +109,12 @@ describe("Global nodes", () => { test("it should project the correct selectionSet when id is used as a where argument", async () => { const typeDefs = gql` type Actor { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! movies: [Actor!]! @relationship(type: "ACTED_IN", direction: OUT) } type Movie { - title: ID! @id(global: true) + title: ID! @id @unique @relayId actors: [Movie!]! @relationship(type: "ACTED_IN", direction: IN) } `; @@ -153,7 +153,7 @@ describe("Global nodes", () => { test("it should project the param as an integer when the underlying field is a number (fixes 1560)", async () => { const typeDefs = gql` type Actor { - dbId: Int! @id(global: true, autogenerate: false) + dbId: Int! @relayId name: String! } `; diff --git a/packages/graphql/tests/tck/issues/1150.test.ts b/packages/graphql/tests/tck/issues/1150.test.ts index 2226a2821b..2974f80df8 100644 --- a/packages/graphql/tests/tck/issues/1150.test.ts +++ b/packages/graphql/tests/tck/issues/1150.test.ts @@ -32,19 +32,19 @@ describe("https://github.com/neo4j/graphql/issues/1150", () => { } type Battery { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! } extend type Battery @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "admin" } } }]) type CombustionEngine { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! } type Drive { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! driveCompositions: [DriveComposition!]! @relationship(type: "CONSISTS_OF", properties: "RelationProps", direction: OUT) @@ -53,7 +53,7 @@ describe("https://github.com/neo4j/graphql/issues/1150", () => { union DriveComponent = Battery | CombustionEngine type DriveComposition { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! driveComponent: [DriveComponent!]! @relationship(type: "HAS", properties: "RelationProps", direction: OUT) diff --git a/packages/graphql/tests/tck/issues/1182.test.ts b/packages/graphql/tests/tck/issues/1182.test.ts index 69035f6be5..be108ecf8c 100644 --- a/packages/graphql/tests/tck/issues/1182.test.ts +++ b/packages/graphql/tests/tck/issues/1182.test.ts @@ -29,13 +29,13 @@ describe("https://github.com/neo4j/graphql/issues/1182", () => { beforeAll(() => { typeDefs = gql` type Movie { - id: ID! @id + id: ID! @id @unique title: String! actors: [Actor!]! @relationship(type: "ACTED_IN", direction: IN) } type Actor { - id: ID! @id + id: ID! @id @unique name: String! dob: DateTime! homeAddress: Point! diff --git a/packages/graphql/tests/tck/issues/1221.test.ts b/packages/graphql/tests/tck/issues/1221.test.ts index 1370a4fd0b..8837bf7659 100644 --- a/packages/graphql/tests/tck/issues/1221.test.ts +++ b/packages/graphql/tests/tck/issues/1221.test.ts @@ -29,13 +29,13 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { test("should apply where filter for deep relations, two relations deep", async () => { typeDefs = gql` type Series { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! architecture: [MasterData!]! @relationship(type: "ARCHITECTURE", properties: "RelationProps", direction: OUT) } - type NameDetails @exclude(operations: [CREATE, UPDATE, DELETE, READ]) { + type NameDetails @mutation(operations: []) @query(read: false, aggregate: false) { fullName: String! } @@ -44,7 +44,7 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { } type MasterData { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! nameDetails: NameDetails @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } @@ -121,19 +121,19 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { test("should apply where filter for deep relations, three relations deep", async () => { typeDefs = gql` type Main { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! main: [Series!]! @relationship(type: "MAIN", properties: "RelationProps", direction: OUT) } type Series { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! architecture: [MasterData!]! @relationship(type: "ARCHITECTURE", properties: "RelationProps", direction: OUT) } - type NameDetails @exclude(operations: [CREATE, UPDATE, DELETE, READ]) { + type NameDetails @mutation(operations: []) @query(read: false, aggregate: false) { fullName: String! } @@ -142,7 +142,7 @@ describe("https://github.com/neo4j/graphql/issues/1221", () => { } type MasterData { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! nameDetails: NameDetails @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } diff --git a/packages/graphql/tests/tck/issues/1249.test.ts b/packages/graphql/tests/tck/issues/1249.test.ts index ddd30c2e06..0c5e6a83a6 100644 --- a/packages/graphql/tests/tck/issues/1249.test.ts +++ b/packages/graphql/tests/tck/issues/1249.test.ts @@ -28,13 +28,13 @@ describe("https://github.com/neo4j/graphql/issues/1249", () => { beforeAll(() => { typeDefs = gql` - type Bulk @exclude(operations: [CREATE, DELETE, UPDATE]) @node(labels: ["Bulk", "$tenant"]) { + type Bulk @mutation(operations: []) @node(labels: ["Bulk", "$tenant"]) { id: ID! supplierMaterialNumber: String! material: Material! @relationship(type: "MATERIAL_BULK", direction: OUT) } - type Material @exclude(operations: [CREATE, DELETE, UPDATE]) { + type Material @mutation(operations: []) { id: ID! itemNumber: String! @@ -42,7 +42,7 @@ describe("https://github.com/neo4j/graphql/issues/1249", () => { @relationship(type: "MATERIAL_SUPPLIER", properties: "RelationMaterialSupplier", direction: OUT) } - type Supplier @exclude(operations: [CREATE, DELETE, UPDATE]) { + type Supplier @mutation(operations: []) { id: ID! name: String supplierId: String! diff --git a/packages/graphql/tests/tck/issues/1430.test.ts b/packages/graphql/tests/tck/issues/1430.test.ts index d5019282f0..8b942d52a2 100644 --- a/packages/graphql/tests/tck/issues/1430.test.ts +++ b/packages/graphql/tests/tck/issues/1430.test.ts @@ -29,7 +29,7 @@ describe("https://github.com/neo4j/graphql/issues/1430", () => { beforeAll(() => { typeDefs = gql` type ABCE { - id: ID @id + id: ID @id @unique name: String interface: InterfaceMom @relationship(type: "HAS_INTERFACE", direction: OUT) } @@ -40,13 +40,13 @@ describe("https://github.com/neo4j/graphql/issues/1430", () => { } type ChildOne implements InterfaceMom { - id: ID @id + id: ID @id @unique name: String feathur: String } type ChildTwo implements InterfaceMom { - id: ID @id + id: ID @id @unique name: String sth: String } diff --git a/packages/graphql/tests/tck/issues/1535.test.ts b/packages/graphql/tests/tck/issues/1535.test.ts index 0c09bfc3c2..276a545b5d 100644 --- a/packages/graphql/tests/tck/issues/1535.test.ts +++ b/packages/graphql/tests/tck/issues/1535.test.ts @@ -29,7 +29,7 @@ describe("https://github.com/neo4j/graphql/issues/1535", () => { beforeAll(() => { typeDefs = gql` type Tenant { - id: ID! @id + id: ID! @id @unique name: String! events: [Event!]! @relationship(type: "HOSTED_BY", direction: IN) fooBars: [FooBar!]! @relationship(type: "HAS_FOOBARS", direction: OUT) @@ -42,7 +42,7 @@ describe("https://github.com/neo4j/graphql/issues/1535", () => { } type Screening implements Event { - id: ID! @id + id: ID! @id @unique title: String beginsAt: DateTime! } @@ -55,7 +55,7 @@ describe("https://github.com/neo4j/graphql/issues/1535", () => { } type FooBar { - id: ID! @id + id: ID! @id @unique name: String! } `; diff --git a/packages/graphql/tests/tck/issues/1536.test.ts b/packages/graphql/tests/tck/issues/1536.test.ts index 5d3529c3be..b45ddf20db 100644 --- a/packages/graphql/tests/tck/issues/1536.test.ts +++ b/packages/graphql/tests/tck/issues/1536.test.ts @@ -29,12 +29,12 @@ describe("https://github.com/neo4j/graphql/issues/1536", () => { beforeAll(() => { typeDefs = gql` type SomeNode { - id: ID! @id + id: ID! @id @unique other: OtherNode! @relationship(type: "HAS_OTHER_NODES", direction: OUT) } type OtherNode { - id: ID! @id + id: ID! @id @unique interfaceField: MyInterface! @relationship(type: "HAS_INTERFACE_NODES", direction: OUT) } @@ -43,7 +43,7 @@ describe("https://github.com/neo4j/graphql/issues/1536", () => { } type MyImplementation implements MyInterface { - id: ID! @id + id: ID! @id @unique } `; diff --git a/packages/graphql/tests/tck/issues/1628.test.ts b/packages/graphql/tests/tck/issues/1628.test.ts index 25898aa616..efdccd30ef 100644 --- a/packages/graphql/tests/tck/issues/1628.test.ts +++ b/packages/graphql/tests/tck/issues/1628.test.ts @@ -28,7 +28,7 @@ describe("https://github.com/neo4j/graphql/issues/1628", () => { beforeAll(() => { typeDefs = gql` - type frbr__Work @node(labels: ["frbr__Work", "Resource"]) @exclude(operations: [CREATE, UPDATE, DELETE]) { + type frbr__Work @node(labels: ["frbr__Work", "Resource"]) @mutation(operations: []) { """ IRI """ @@ -36,9 +36,7 @@ describe("https://github.com/neo4j/graphql/issues/1628", () => { dcterms__title: [dcterms_title!]! @relationship(type: "dcterms__title", direction: OUT) } - type dcterms_title - @node(labels: ["dcterms_title", "property"]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { + type dcterms_title @node(labels: ["dcterms_title", "property"]) @mutation(operations: []) { value: String } `; diff --git a/packages/graphql/tests/tck/issues/1751.test.ts b/packages/graphql/tests/tck/issues/1751.test.ts index 554177fb46..5bfbae4635 100644 --- a/packages/graphql/tests/tck/issues/1751.test.ts +++ b/packages/graphql/tests/tck/issues/1751.test.ts @@ -29,14 +29,14 @@ describe("https://github.com/neo4j/graphql/issues/1751", () => { beforeAll(() => { typeDefs = gql` type Organization { - organizationId: ID! @id + organizationId: ID! @id @unique title: String createdAt: DateTime! admins: [Admin!]! @relationship(type: "HAS_ADMINISTRATOR", direction: OUT) } type Admin { - adminId: ID! @id + adminId: ID! @id @unique createdAt: DateTime! isSuperAdmin: Boolean organizations: [Organization!]! @relationship(type: "HAS_ADMINISTRATOR", direction: IN) diff --git a/packages/graphql/tests/tck/issues/1760.test.ts b/packages/graphql/tests/tck/issues/1760.test.ts index 76fa848695..889a8592de 100644 --- a/packages/graphql/tests/tck/issues/1760.test.ts +++ b/packages/graphql/tests/tck/issues/1760.test.ts @@ -34,15 +34,15 @@ describe("https://github.com/neo4j/graphql/issues/1760", () => { } interface BusinessObject { - id: ID! @id(autogenerate: false) + id: ID! nameDetails: NameDetails } type ApplicationVariant implements BusinessObject @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { + @mutation(operations: []) { markets: [Market!]! @relationship(type: "HAS_MARKETS", direction: OUT) - id: ID! @id(autogenerate: false) + id: ID! @unique relatedId: ID @cypher(statement: "MATCH (this)<-[:HAS_BASE]-(n:BaseObject) RETURN n.id as res", columnName: "res") baseObject: BaseObject! @relationship(type: "HAS_BASE", direction: IN) @@ -52,21 +52,22 @@ describe("https://github.com/neo4j/graphql/issues/1760", () => { type NameDetails @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, READ, UPDATE, DELETE]) { + @mutation(operations: []) + @query(read: false, aggregate: false) { fullName: String! } type Market implements BusinessObject @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { - id: ID! @id(autogenerate: false) + @mutation(operations: []) { + id: ID! @unique nameDetails: NameDetails @relationship(type: "HAS_NAME", direction: OUT) } type BaseObject @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "ALL" } } }]) - @exclude(operations: [CREATE, UPDATE, DELETE]) { - id: ID! @id + @mutation(operations: []) { + id: ID! @id @unique } `; diff --git a/packages/graphql/tests/tck/issues/1783.test.ts b/packages/graphql/tests/tck/issues/1783.test.ts index 0ca82482cf..eea6675254 100644 --- a/packages/graphql/tests/tck/issues/1783.test.ts +++ b/packages/graphql/tests/tck/issues/1783.test.ts @@ -29,14 +29,14 @@ describe("https://github.com/neo4j/graphql/issues/1783", () => { beforeAll(() => { typeDefs = gql` type Series { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! architecture: [MasterData!]! @relationship(type: "ARCHITECTURE", properties: "RelationProps", direction: OUT) nameDetails: NameDetails @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } - type NameDetails @exclude(operations: [CREATE, UPDATE, DELETE, READ]) { + type NameDetails @mutation(operations: []) @query(read: false, aggregate: false) { fullName: String! } @@ -45,7 +45,7 @@ describe("https://github.com/neo4j/graphql/issues/1783", () => { } type MasterData { - id: ID! @id(autogenerate: false) + id: ID! @unique current: Boolean! nameDetails: NameDetails @relationship(type: "HAS_NAME", properties: "RelationProps", direction: OUT) } diff --git a/packages/graphql/tests/tck/issues/1933.test.ts b/packages/graphql/tests/tck/issues/1933.test.ts index a927eafc5c..dddd08ec80 100644 --- a/packages/graphql/tests/tck/issues/1933.test.ts +++ b/packages/graphql/tests/tck/issues/1933.test.ts @@ -29,9 +29,9 @@ describe("https://github.com/neo4j/graphql/issues/1933", () => { beforeAll(() => { typeDefs = gql` type Employee { - employeeId: ID! @id(autogenerate: false) - firstName: String! @readonly - lastName: String @readonly + employeeId: ID! @unique + firstName: String! @settable(onCreate: false, onUpdate: false) + lastName: String @settable(onCreate: false, onUpdate: false) projects: [Project!]! @relationship(type: "PARTICIPATES", direction: OUT, properties: "EmployeeParticipationProperties") } @@ -41,8 +41,8 @@ describe("https://github.com/neo4j/graphql/issues/1933", () => { } type Project { - projectId: ID! @id(autogenerate: false) - name: String! @readonly + projectId: ID! @unique + name: String! @settable(onCreate: false, onUpdate: false) description: String employees: [Employee!]! @relationship(type: "PARTICIPATES", direction: IN, properties: "EmployeeParticipationProperties") diff --git a/packages/graphql/tests/tck/issues/2022.test.ts b/packages/graphql/tests/tck/issues/2022.test.ts index 38c4976fef..2579d7423f 100644 --- a/packages/graphql/tests/tck/issues/2022.test.ts +++ b/packages/graphql/tests/tck/issues/2022.test.ts @@ -29,14 +29,14 @@ describe("https://github.com/neo4j/graphql/issues/2022", () => { beforeAll(() => { typeDefs = gql` type ArtPiece { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") title: String! auction: AuctionItem! @relationship(type: "SOLD_AT_AUCTION_AS", direction: OUT) owner: Organization! @relationship(type: "OWNED_BY", direction: OUT) } type AuctionItem { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") auctionName: String! lotNumber: Int! @@ -46,7 +46,7 @@ describe("https://github.com/neo4j/graphql/issues/2022", () => { } type Organization { - dbId: ID! @id(global: true) @alias(property: "id") + dbId: ID! @id @unique @relayId @alias(property: "id") name: String! artCollection: [ArtPiece!]! @relationship(type: "OWNED_BY", direction: IN) diff --git a/packages/graphql/tests/tck/issues/2100.test.ts b/packages/graphql/tests/tck/issues/2100.test.ts index 5977943e23..f147c76ccf 100644 --- a/packages/graphql/tests/tck/issues/2100.test.ts +++ b/packages/graphql/tests/tck/issues/2100.test.ts @@ -53,7 +53,7 @@ describe("https://github.com/neo4j/graphql/issues/2100", () => { } type Bacenta implements Church { - id: ID @id + id: ID @id @unique name: String! serviceLogs: [ServiceLog!]! @relationship(type: "HAS_HISTORY", direction: OUT) bussing(limit: Int!): [BussingRecord!]! diff --git a/packages/graphql/tests/tck/issues/2396.test.ts b/packages/graphql/tests/tck/issues/2396.test.ts index 5c8385d680..f2d8fd8253 100644 --- a/packages/graphql/tests/tck/issues/2396.test.ts +++ b/packages/graphql/tests/tck/issues/2396.test.ts @@ -29,9 +29,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { beforeAll(() => { typeDefs = gql` - type PostalCode @exclude(operations: [DELETE]) { + type PostalCode @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - number: String! @id(autogenerate: false) + number: String! @unique address: [Address!]! @relationship(type: "HAS_POSTAL_CODE", direction: IN) } @@ -40,9 +40,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { union AddressNode = Estate - type Address @exclude(operations: [DELETE]) { + type Address @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) @@ -61,7 +61,7 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { extend type Address @authorization(filter: [{ where: { node: { archivedAt: null } } }]) - type Mandate @exclude(operations: [DELETE]) { + type Mandate @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime number: String! @unique createdAt: DateTime! @timestamp(operations: [CREATE]) @@ -74,9 +74,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { extend type Mandate @authorization(filter: [{ where: { node: { archivedAt: null } } }]) - type Valuation @exclude(operations: [DELETE]) { + type Valuation @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) @@ -100,9 +100,9 @@ describe("https://github.com/neo4j/graphql/issues/2396", () => { BUSINESS_FUND } - type Estate @exclude(operations: [DELETE]) { + type Estate @mutation(operations: [CREATE, UPDATE]) { archivedAt: DateTime - uuid: ID! @id + uuid: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) updatedAt: DateTime! @timestamp(operations: [CREATE, UPDATE]) diff --git a/packages/graphql/tests/tck/issues/2437.test.ts b/packages/graphql/tests/tck/issues/2437.test.ts index 0c80bc440b..b4537c25fe 100644 --- a/packages/graphql/tests/tck/issues/2437.test.ts +++ b/packages/graphql/tests/tck/issues/2437.test.ts @@ -32,8 +32,8 @@ describe("https://github.com/neo4j/graphql/issues/2437", () => { roles: [String!]! } - type Agent @exclude(operations: [DELETE]) { - uuid: ID! @id + type Agent @mutation(operations: [CREATE, UPDATE]) { + uuid: ID! @id @unique archivedAt: DateTime valuations: [Valuation!]! @relationship(type: "IS_VALUATION_AGENT", direction: OUT) @@ -41,8 +41,8 @@ describe("https://github.com/neo4j/graphql/issues/2437", () => { extend type Agent @authorization(validate: [{ operations: [CREATE], where: { jwt: { roles_INCLUDES: "Admin" } } }], filter: [{ where: { node: { archivedAt: null } } }]) - type Valuation @exclude(operations: [DELETE]) { - uuid: ID! @id + type Valuation @mutation(operations: [CREATE, UPDATE]) { + uuid: ID! @id @unique archivedAt: DateTime agent: Agent! @relationship(type: "IS_VALUATION_AGENT", direction: IN) diff --git a/packages/graphql/tests/tck/issues/2581.test.ts b/packages/graphql/tests/tck/issues/2581.test.ts index 4e6f306ea7..241f6eff59 100644 --- a/packages/graphql/tests/tck/issues/2581.test.ts +++ b/packages/graphql/tests/tck/issues/2581.test.ts @@ -50,7 +50,7 @@ describe("https://github.com/neo4j/graphql/issues/2581", () => { type Book { name: String! year: Int - refID: ID @id + refID: ID @id @unique soldCopies: Int @cypher( statement: "OPTIONAL MATCH(sales:Sales) WHERE this.refID = sales.refID WITH count(sales) as result RETURN result as result" diff --git a/packages/graphql/tests/tck/issues/2812.test.ts b/packages/graphql/tests/tck/issues/2812.test.ts index d21508e0fc..4bc167cb68 100644 --- a/packages/graphql/tests/tck/issues/2812.test.ts +++ b/packages/graphql/tests/tck/issues/2812.test.ts @@ -30,7 +30,7 @@ describe("https://github.com/neo4j/graphql/issues/2812", () => { } type Actor @authorization(validate: [{ when: [BEFORE], where: { node: { nodeCreatedBy: "$jwt.sub" } } }]) { - id: ID! @id + id: ID! @id @unique name: String nodeCreatedBy: String fieldA: String diff --git a/packages/graphql/tests/tck/issues/2871.test.ts b/packages/graphql/tests/tck/issues/2871.test.ts index 65dd04e494..03d1083afa 100644 --- a/packages/graphql/tests/tck/issues/2871.test.ts +++ b/packages/graphql/tests/tck/issues/2871.test.ts @@ -26,19 +26,19 @@ describe("https://github.com/neo4j/graphql/issues/2871", () => { const typeDefs = gql` type FirstLevel { - id: ID! @id(unique: true) + id: ID! @id @unique secondLevel: SecondLevel! @relationship(type: "HAS_SECOND_LEVEL", direction: OUT) createdAt: DateTime! @timestamp(operations: [CREATE]) } type SecondLevel { - id: ID! @id(unique: true) + id: ID! @id @unique thirdLevel: [ThirdLevel!]! @relationship(type: "HAS_THIRD_LEVEL", direction: OUT) createdAt: DateTime! @timestamp(operations: [CREATE]) } type ThirdLevel { - id: ID! @id(unique: true) + id: ID! @id @unique createdAt: DateTime! @timestamp(operations: [CREATE]) } `; diff --git a/packages/graphql/tests/tck/issues/488.test.ts b/packages/graphql/tests/tck/issues/488.test.ts index 774c95b5c9..0be6826aa1 100644 --- a/packages/graphql/tests/tck/issues/488.test.ts +++ b/packages/graphql/tests/tck/issues/488.test.ts @@ -36,17 +36,17 @@ describe("#488", () => { union Keyword = Emoji | Hashtag | Text type Emoji { - id: ID! @id + id: ID! @id @unique type: String! } type Hashtag { - id: ID! @id + id: ID! @id @unique type: String! } type Text { - id: ID! @id + id: ID! @id @unique type: String! } `; diff --git a/packages/graphql/tests/tck/issues/601.test.ts b/packages/graphql/tests/tck/issues/601.test.ts index 318e87edf1..2014f9cf28 100644 --- a/packages/graphql/tests/tck/issues/601.test.ts +++ b/packages/graphql/tests/tck/issues/601.test.ts @@ -38,8 +38,8 @@ describe("#601", () => { uploadedAt: DateTime! } - type Document @exclude(operations: [CREATE, UPDATE, DELETE]) { - id: ID! @id + type Document @mutation(operations: []) { + id: ID! @id @unique stakeholder: Stakeholder! @relationship(type: "REQUIRES", direction: OUT) customerContact: CustomerContact! @@ -48,7 +48,7 @@ describe("#601", () => { extend type Document @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "view" } } }]) - type CustomerContact @exclude(operations: [CREATE, UPDATE, DELETE]) { + type CustomerContact @mutation(operations: []) { email: String! firstname: String! lastname: String! @@ -57,7 +57,7 @@ describe("#601", () => { extend type CustomerContact @authorization(validate: [{ where: { jwt: { roles_INCLUDES: "view" } } }]) - type Stakeholder @exclude(operations: [CREATE, UPDATE, DELETE]) { + type Stakeholder @mutation(operations: []) { id: ID! fields: String! documents: [Document!]! @relationship(type: "REQUIRES", direction: OUT) diff --git a/packages/graphql/tests/tck/issues/832.test.ts b/packages/graphql/tests/tck/issues/832.test.ts index c160e63239..750d6e5755 100644 --- a/packages/graphql/tests/tck/issues/832.test.ts +++ b/packages/graphql/tests/tck/issues/832.test.ts @@ -43,7 +43,7 @@ describe("https://github.com/neo4j/graphql/issues/832", () => { } type Interaction { - id: ID! @id + id: ID! @id @unique kind: String! subjects: [Entity!]! @relationship(type: "ACTED_IN", direction: IN) objects: [Entity!]! @relationship(type: "ACTED_IN", direction: OUT) diff --git a/packages/graphql/tests/tck/issues/847.test.ts b/packages/graphql/tests/tck/issues/847.test.ts index d684af4e4f..09db2bbc7f 100644 --- a/packages/graphql/tests/tck/issues/847.test.ts +++ b/packages/graphql/tests/tck/issues/847.test.ts @@ -39,7 +39,7 @@ describe("https://github.com/neo4j/graphql/issues/847", () => { } type Interaction { - id: ID! @id + id: ID! @id @unique kind: String! subjects: [Entity!]! @relationship(type: "ACTED_IN", direction: IN) objects: [Entity!]! @relationship(type: "ACTED_IN", direction: OUT) diff --git a/packages/graphql/tests/tck/issues/894.test.ts b/packages/graphql/tests/tck/issues/894.test.ts index 3f1d1b64b8..4897fd6437 100644 --- a/packages/graphql/tests/tck/issues/894.test.ts +++ b/packages/graphql/tests/tck/issues/894.test.ts @@ -29,13 +29,13 @@ describe("https://github.com/neo4j/graphql/issues/894", () => { beforeAll(() => { typeDefs = gql` type User { - id: ID! @id @alias(property: "_id") + id: ID! @id @unique @alias(property: "_id") name: String! activeOrganization: Organization @relationship(type: "ACTIVELY_MANAGING", direction: OUT) } type Organization { - id: ID! @id @alias(property: "_id") + id: ID! @id @unique @alias(property: "_id") name: String! } `; diff --git a/packages/graphql/tests/tck/issues/901.test.ts b/packages/graphql/tests/tck/issues/901.test.ts index 40e656e542..4825053993 100644 --- a/packages/graphql/tests/tck/issues/901.test.ts +++ b/packages/graphql/tests/tck/issues/901.test.ts @@ -29,7 +29,7 @@ describe("https://github.com/neo4j/graphql/issues/901", () => { beforeAll(() => { typeDefs = gql` type Series { - id: ID! @id + id: ID! @id @unique name: String! brand: Series @relationship(type: "HAS_BRAND", direction: OUT, properties: "Properties") manufacturer: Series @relationship(type: "HAS_MANUFACTURER", direction: OUT, properties: "Properties") diff --git a/packages/graphql/tests/tck/math.test.ts b/packages/graphql/tests/tck/math.test.ts index 6f7e1fbb59..fa2599a9d2 100644 --- a/packages/graphql/tests/tck/math.test.ts +++ b/packages/graphql/tests/tck/math.test.ts @@ -38,7 +38,7 @@ describe("Math operators", () => { } type Movie { - id: ID! @id + id: ID! @id @unique title: String! viewers: Int revenue: Float diff --git a/packages/graphql/tests/tck/operations/batch/batch-create-auth.test.ts b/packages/graphql/tests/tck/operations/batch/batch-create-auth.test.ts index 79f023af5d..fe1af7445d 100644 --- a/packages/graphql/tests/tck/operations/batch/batch-create-auth.test.ts +++ b/packages/graphql/tests/tck/operations/batch/batch-create-auth.test.ts @@ -34,7 +34,7 @@ describe("Batch Create, Auth", () => { } type Actor @authorization(validate: [{ when: [BEFORE], where: { node: { id: "$jwt.sub" } } }]) { - id: ID! @id + id: ID! @id @unique name: String website: Website @relationship(type: "HAS_WEBSITE", direction: OUT) movies: [Movie!]! @relationship(type: "ACTED_IN", direction: OUT, properties: "ActedIn") diff --git a/packages/graphql/tests/tck/operations/batch/batch-create-fields.test.ts b/packages/graphql/tests/tck/operations/batch/batch-create-fields.test.ts index 6d343a2800..6d3152a19f 100644 --- a/packages/graphql/tests/tck/operations/batch/batch-create-fields.test.ts +++ b/packages/graphql/tests/tck/operations/batch/batch-create-fields.test.ts @@ -29,7 +29,7 @@ describe("Batch Create, Scalar types", () => { beforeAll(() => { typeDefs = gql` type Actor { - id: ID! @id + id: ID! @id @unique name: String born: Date createdAt: DateTime @timestamp(operations: [CREATE]) diff --git a/packages/graphql/tests/tck/operations/batch/batch-create.test.ts b/packages/graphql/tests/tck/operations/batch/batch-create.test.ts index 7a0bed377b..0cdcfc7a7d 100644 --- a/packages/graphql/tests/tck/operations/batch/batch-create.test.ts +++ b/packages/graphql/tests/tck/operations/batch/batch-create.test.ts @@ -29,7 +29,7 @@ describe("Batch Create", () => { beforeAll(() => { typeDefs = gql` type Actor { - id: ID! @id + id: ID! @id @unique name: String website: Website @relationship(type: "HAS_WEBSITE", direction: OUT) movies: [Movie!]! @relationship(type: "ACTED_IN", direction: OUT, properties: "ActedIn") diff --git a/packages/introspector/CHANGELOG.md b/packages/introspector/CHANGELOG.md index 4fb73dbcdc..5c8ee99b8b 100644 --- a/packages/introspector/CHANGELOG.md +++ b/packages/introspector/CHANGELOG.md @@ -1,5 +1,11 @@ # @neo4j/introspector +## 2.0.0-beta.1 + +### Patch Changes + +- [#3743](https://github.com/neo4j/graphql/pull/3743) [`85b3c06e8`](https://github.com/neo4j/graphql/commit/85b3c06e800699f30daedc796286c37cd318746c) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Introspector now produces `@mutation` directive instead on `@exclude` when readonly + ## 2.0.0-beta.0 ### Major Changes diff --git a/packages/introspector/package.json b/packages/introspector/package.json index 04e26e083d..c5bb1b1d5d 100644 --- a/packages/introspector/package.json +++ b/packages/introspector/package.json @@ -1,6 +1,6 @@ { "name": "@neo4j/introspector", - "version": "2.0.0-beta.0", + "version": "2.0.0-beta.1", "description": "Introspect a Neo4j database model/schema", "keywords": [ "neo4j", @@ -36,11 +36,11 @@ }, "author": "Neo4j Inc.", "devDependencies": { - "@neo4j/graphql": "^4.0.0-beta.0", - "@types/jest": "29.5.3", + "@neo4j/graphql": "^4.0.0-beta.2", + "@types/jest": "29.5.4", "@types/node": "18.15.1", "@types/pluralize": "0.0.30", - "jest": "29.6.2", + "jest": "29.6.4", "ts-jest": "29.1.1", "typescript": "5.1.6" }, diff --git a/packages/ogm/CHANGELOG.md b/packages/ogm/CHANGELOG.md index 91fd4b0e95..5bcd699ed3 100644 --- a/packages/ogm/CHANGELOG.md +++ b/packages/ogm/CHANGELOG.md @@ -1,67 +1,85 @@ # @neo4j/graphql-ogm +## 4.0.0-beta.2 + +### Major Changes + +* [#3592](https://github.com/neo4j/graphql/pull/3592) [`2ba1d45b5`](https://github.com/neo4j/graphql/commit/2ba1d45b5bf642975381ca8431cb10094151586d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The Neo4j GraphQL Library now only accepts a `string`, `DocumentNode` or an array containing these types. A callback function returning these is also accepted. This is a reduction from `TypeSource` which also included types such as `GraphQLSchema` and `DefinitionNode`, which would have resulted in unexpected behaviour if passed in. + +### Patch Changes + +* Updated dependencies [[`2ba1d45b5`](https://github.com/neo4j/graphql/commit/2ba1d45b5bf642975381ca8431cb10094151586d), [`a16ba357c`](https://github.com/neo4j/graphql/commit/a16ba357cb745ba728009c5e6b531b4c56a62f43), [`56857a3e5`](https://github.com/neo4j/graphql/commit/56857a3e53134ad9f46f3265567c55570f674aab), [`e9bf1e619`](https://github.com/neo4j/graphql/commit/e9bf1e619ee71ead228530a9d46834a655686c6d), [`9354860ae`](https://github.com/neo4j/graphql/commit/9354860ae2f5f4a82179de874344724862d0c231)]: + * @neo4j/graphql@4.0.0-beta.2 + ## 4.0.0-beta.1 ### Patch Changes -- Updated dependencies [[`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa)]: - - @neo4j/graphql@4.0.0-beta.1 +* Updated dependencies [[`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa)]: + * @neo4j/graphql@4.0.0-beta.1 ## 4.0.0-beta.0 ### Major Changes -- [#3673](https://github.com/neo4j/graphql/pull/3673) [`aa11d5251`](https://github.com/neo4j/graphql/commit/aa11d525111cfda005581ed2327407b9c9c319f9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Programmatic toggling of debug logging is now done using the `debug` option of the constructor. +* [#3673](https://github.com/neo4j/graphql/pull/3673) [`aa11d5251`](https://github.com/neo4j/graphql/commit/aa11d525111cfda005581ed2327407b9c9c319f9) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Programmatic toggling of debug logging is now done using the `debug` option of the constructor. + +* [#3645](https://github.com/neo4j/graphql/pull/3645) [`7df67be49`](https://github.com/neo4j/graphql/commit/7df67be4991b8829acbd00651c66b41558729008) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The minimum version of `neo4j-driver` is now `5.8.0`, please upgrade. The `boomkark` field in the selection set has been marked as deprecated and will be removed in version `5.0.0` of the library. + +* [#3671](https://github.com/neo4j/graphql/pull/3671) [`b3951fa81`](https://github.com/neo4j/graphql/commit/b3951fa81232a968fe492a4b10ea54afc604e2d2) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove `nodes` from the public API of the `OGM` class. -- [#3645](https://github.com/neo4j/graphql/pull/3645) [`7df67be49`](https://github.com/neo4j/graphql/commit/7df67be4991b8829acbd00651c66b41558729008) Thanks [@darrellwarde](https://github.com/darrellwarde)! - The minimum version of `neo4j-driver` is now `5.8.0`, please upgrade. The `boomkark` field in the selection set has been marked as deprecated and will be removed in version `5.0.0` of the library. +* [#3687](https://github.com/neo4j/graphql/pull/3687) [`1ad4328e4`](https://github.com/neo4j/graphql/commit/1ad4328e4bba39801aa96bf961e6e5c5a2a9ce8d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Validation of type definitions is now configured using the `validate` boolean option in the constructor, which defaults to `true`. -- [#3671](https://github.com/neo4j/graphql/pull/3671) [`b3951fa81`](https://github.com/neo4j/graphql/commit/b3951fa81232a968fe492a4b10ea54afc604e2d2) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove `nodes` from the public API of the `OGM` class. +* [#2598](https://github.com/neo4j/graphql/pull/2598) [`257aa4c97`](https://github.com/neo4j/graphql/commit/257aa4c97a0d367063725dff703fdd30f0f8ecb5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove all arguments from IExecutableSchemaDefinition apart from `typeDefs` and `resolvers`. This is to simplify the API and to remove any unexpected behaviours from arguments which we blindly pass through. -- [#3687](https://github.com/neo4j/graphql/pull/3687) [`1ad4328e4`](https://github.com/neo4j/graphql/commit/1ad4328e4bba39801aa96bf961e6e5c5a2a9ce8d) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Validation of type definitions is now configured using the `validate` boolean option in the constructor, which defaults to `true`. +* [#3674](https://github.com/neo4j/graphql/pull/3674) [`59e369992`](https://github.com/neo4j/graphql/commit/59e369992b2226a3c5feec72f2799e2b30765819) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `cypherQueryOptions` moved into context-only, as a per-request option. + +### Patch Changes -- [#2598](https://github.com/neo4j/graphql/pull/2598) [`257aa4c97`](https://github.com/neo4j/graphql/commit/257aa4c97a0d367063725dff703fdd30f0f8ecb5) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Remove all arguments from IExecutableSchemaDefinition apart from `typeDefs` and `resolvers`. This is to simplify the API and to remove any unexpected behaviours from arguments which we blindly pass through. +* Updated dependencies [[`ea1bae3c3`](https://github.com/neo4j/graphql/commit/ea1bae3c3b8ec53febfa056c5fec25aa9b0c5c2a), [`0fb2592b4`](https://github.com/neo4j/graphql/commit/0fb2592b4271adc02f4bbbf6e467eec5f7742be1), [`c9ee9e757`](https://github.com/neo4j/graphql/commit/c9ee9e757427f512950ec58aad7e30923b297a05), [`4a78e7a8d`](https://github.com/neo4j/graphql/commit/4a78e7a8d70d3ff1ebaff8ba63ce1f9e5849d8e6), [`8d3aff007`](https://github.com/neo4j/graphql/commit/8d3aff007c0d5428313cef23602e9a4ef5ef3792), [`b3951fa81`](https://github.com/neo4j/graphql/commit/b3951fa81232a968fe492a4b10ea54afc604e2d2), [`2167c9ac1`](https://github.com/neo4j/graphql/commit/2167c9ac10b178ad881b12310fc798fc1f77b262), [`29d68ad51`](https://github.com/neo4j/graphql/commit/29d68ad515bcd2ee573d40387978250f92f83fe9), [`395e12f14`](https://github.com/neo4j/graphql/commit/395e12f14e0e7fffe50e3841ca5e69da459855d2), [`15a7f0418`](https://github.com/neo4j/graphql/commit/15a7f04188bcc676477ec562e24b27851a927905), [`93b9d806b`](https://github.com/neo4j/graphql/commit/93b9d806b12c79dae7491b901378acf9d43f1c06), [`d4aea32c6`](https://github.com/neo4j/graphql/commit/d4aea32c66aa1dcbf7b3399165adf74fed36e92e), [`5ea18136e`](https://github.com/neo4j/graphql/commit/5ea18136e36303efc0806cc7027b7dfce13e1fa4), [`aa11d5251`](https://github.com/neo4j/graphql/commit/aa11d525111cfda005581ed2327407b9c9c319f9), [`f1225baa7`](https://github.com/neo4j/graphql/commit/f1225baa75c71ad82e36e9fb250477382eb6757c), [`7df67be49`](https://github.com/neo4j/graphql/commit/7df67be4991b8829acbd00651c66b41558729008), [`7743399d3`](https://github.com/neo4j/graphql/commit/7743399d320b26126bb6e83bcd498c1c78517a83), [`e5b53a597`](https://github.com/neo4j/graphql/commit/e5b53a5976a2880e0efdecddcddcfb427015c823), [`3896544b5`](https://github.com/neo4j/graphql/commit/3896544b50939df38a792bcd9b41bc77f25bc5a9), [`8f0656b35`](https://github.com/neo4j/graphql/commit/8f0656b35b86a1d4966dea8cdb2a8ee5a3505dd6), [`c9f35f10c`](https://github.com/neo4j/graphql/commit/c9f35f10c0fde1af7b82a3adbd7137955705495a), [`1ad4328e4`](https://github.com/neo4j/graphql/commit/1ad4328e4bba39801aa96bf961e6e5c5a2a9ce8d), [`2ab3d5212`](https://github.com/neo4j/graphql/commit/2ab3d521277d66afd7acaea00aa56d44f10480bd), [`257aa4c97`](https://github.com/neo4j/graphql/commit/257aa4c97a0d367063725dff703fdd30f0f8ecb5), [`ce84c47cc`](https://github.com/neo4j/graphql/commit/ce84c47cc610366def7d3abd9227ecb5244ef9d1), [`5b5f08ce7`](https://github.com/neo4j/graphql/commit/5b5f08ce764f431fa685c8320351236a9aaf57a0), [`9f5a44545`](https://github.com/neo4j/graphql/commit/9f5a445455280abfcf862c2cf23ce44e7a11bc0d), [`9f3a9374e`](https://github.com/neo4j/graphql/commit/9f3a9374e5272577f2453cd3704c6924526f8b45), [`59e369992`](https://github.com/neo4j/graphql/commit/59e369992b2226a3c5feec72f2799e2b30765819)]: + * @neo4j/graphql@4.0.0-beta.0 -- [#3674](https://github.com/neo4j/graphql/pull/3674) [`59e369992`](https://github.com/neo4j/graphql/commit/59e369992b2226a3c5feec72f2799e2b30765819) Thanks [@darrellwarde](https://github.com/darrellwarde)! - `cypherQueryOptions` moved into context-only, as a per-request option. +## 3.24.2 ### Patch Changes -- Updated dependencies [[`ea1bae3c3`](https://github.com/neo4j/graphql/commit/ea1bae3c3b8ec53febfa056c5fec25aa9b0c5c2a), [`0fb2592b4`](https://github.com/neo4j/graphql/commit/0fb2592b4271adc02f4bbbf6e467eec5f7742be1), [`c9ee9e757`](https://github.com/neo4j/graphql/commit/c9ee9e757427f512950ec58aad7e30923b297a05), [`4a78e7a8d`](https://github.com/neo4j/graphql/commit/4a78e7a8d70d3ff1ebaff8ba63ce1f9e5849d8e6), [`8d3aff007`](https://github.com/neo4j/graphql/commit/8d3aff007c0d5428313cef23602e9a4ef5ef3792), [`b3951fa81`](https://github.com/neo4j/graphql/commit/b3951fa81232a968fe492a4b10ea54afc604e2d2), [`2167c9ac1`](https://github.com/neo4j/graphql/commit/2167c9ac10b178ad881b12310fc798fc1f77b262), [`29d68ad51`](https://github.com/neo4j/graphql/commit/29d68ad515bcd2ee573d40387978250f92f83fe9), [`395e12f14`](https://github.com/neo4j/graphql/commit/395e12f14e0e7fffe50e3841ca5e69da459855d2), [`15a7f0418`](https://github.com/neo4j/graphql/commit/15a7f04188bcc676477ec562e24b27851a927905), [`93b9d806b`](https://github.com/neo4j/graphql/commit/93b9d806b12c79dae7491b901378acf9d43f1c06), [`d4aea32c6`](https://github.com/neo4j/graphql/commit/d4aea32c66aa1dcbf7b3399165adf74fed36e92e), [`5ea18136e`](https://github.com/neo4j/graphql/commit/5ea18136e36303efc0806cc7027b7dfce13e1fa4), [`aa11d5251`](https://github.com/neo4j/graphql/commit/aa11d525111cfda005581ed2327407b9c9c319f9), [`f1225baa7`](https://github.com/neo4j/graphql/commit/f1225baa75c71ad82e36e9fb250477382eb6757c), [`7df67be49`](https://github.com/neo4j/graphql/commit/7df67be4991b8829acbd00651c66b41558729008), [`7743399d3`](https://github.com/neo4j/graphql/commit/7743399d320b26126bb6e83bcd498c1c78517a83), [`e5b53a597`](https://github.com/neo4j/graphql/commit/e5b53a5976a2880e0efdecddcddcfb427015c823), [`3896544b5`](https://github.com/neo4j/graphql/commit/3896544b50939df38a792bcd9b41bc77f25bc5a9), [`8f0656b35`](https://github.com/neo4j/graphql/commit/8f0656b35b86a1d4966dea8cdb2a8ee5a3505dd6), [`c9f35f10c`](https://github.com/neo4j/graphql/commit/c9f35f10c0fde1af7b82a3adbd7137955705495a), [`1ad4328e4`](https://github.com/neo4j/graphql/commit/1ad4328e4bba39801aa96bf961e6e5c5a2a9ce8d), [`2ab3d5212`](https://github.com/neo4j/graphql/commit/2ab3d521277d66afd7acaea00aa56d44f10480bd), [`257aa4c97`](https://github.com/neo4j/graphql/commit/257aa4c97a0d367063725dff703fdd30f0f8ecb5), [`ce84c47cc`](https://github.com/neo4j/graphql/commit/ce84c47cc610366def7d3abd9227ecb5244ef9d1), [`5b5f08ce7`](https://github.com/neo4j/graphql/commit/5b5f08ce764f431fa685c8320351236a9aaf57a0), [`9f5a44545`](https://github.com/neo4j/graphql/commit/9f5a445455280abfcf862c2cf23ce44e7a11bc0d), [`9f3a9374e`](https://github.com/neo4j/graphql/commit/9f3a9374e5272577f2453cd3704c6924526f8b45), [`59e369992`](https://github.com/neo4j/graphql/commit/59e369992b2226a3c5feec72f2799e2b30765819)]: - - @neo4j/graphql@4.0.0-beta.0 +* Updated dependencies [[`9354860ae`](https://github.com/neo4j/graphql/commit/9354860ae2f5f4a82179de874344724862d0c231)]: + * @neo4j/graphql@3.24.2 ## 3.24.1 ### Patch Changes -- Updated dependencies [[`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa)]: - - @neo4j/graphql@3.24.1 +* Updated dependencies [[`be5dcdcde`](https://github.com/neo4j/graphql/commit/be5dcdcdec49adb6748dd8fc34b0b6f3e6d783fa)]: + * @neo4j/graphql@3.24.1 ## 3.24.0 ### Minor Changes -- [#3639](https://github.com/neo4j/graphql/pull/3639) [`09cc28ef2`](https://github.com/neo4j/graphql/commit/09cc28ef26f13c46c220bd160d68c5f6c4668f39) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Encourages switching from `driverConfig` to `sessionConfig` in both constructor and context. Can be used to switch database, and to use impersonation and user switching. +* [#3639](https://github.com/neo4j/graphql/pull/3639) [`09cc28ef2`](https://github.com/neo4j/graphql/commit/09cc28ef26f13c46c220bd160d68c5f6c4668f39) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Encourages switching from `driverConfig` to `sessionConfig` in both constructor and context. Can be used to switch database, and to use impersonation and user switching. ### Patch Changes -- [#3607](https://github.com/neo4j/graphql/pull/3607) [`12ee8b8f4`](https://github.com/neo4j/graphql/commit/12ee8b8f48043d3bf8cd7a0df4b001340e90c0c0) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Ignore the schema configuration directives for OGM purposes. Fix #3591 +* [#3607](https://github.com/neo4j/graphql/pull/3607) [`12ee8b8f4`](https://github.com/neo4j/graphql/commit/12ee8b8f48043d3bf8cd7a0df4b001340e90c0c0) Thanks [@MacondoExpress](https://github.com/MacondoExpress)! - Ignore the schema configuration directives for OGM purposes. Fix #3591 -- Updated dependencies [[`c55a2b6fd`](https://github.com/neo4j/graphql/commit/c55a2b6fd36f9eb2ba5f51be3f21e97b68789fcc), [`cd884be5c`](https://github.com/neo4j/graphql/commit/cd884be5c07870ea778f5d81db5c55d45eca6dc3), [`09cc28ef2`](https://github.com/neo4j/graphql/commit/09cc28ef26f13c46c220bd160d68c5f6c4668f39)]: - - @neo4j/graphql@3.24.0 +* Updated dependencies [[`c55a2b6fd`](https://github.com/neo4j/graphql/commit/c55a2b6fd36f9eb2ba5f51be3f21e97b68789fcc), [`cd884be5c`](https://github.com/neo4j/graphql/commit/cd884be5c07870ea778f5d81db5c55d45eca6dc3), [`09cc28ef2`](https://github.com/neo4j/graphql/commit/09cc28ef26f13c46c220bd160d68c5f6c4668f39)]: + * @neo4j/graphql@3.24.0 ## 3.23.1 ### Patch Changes -- [#3601](https://github.com/neo4j/graphql/pull/3601) [`5556221c8`](https://github.com/neo4j/graphql/commit/5556221c82c8bf676e72bf6f3113473e271df1fb) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Ignore `@authentication`, `@authorization` and `subscriptionsAuthorization` directives in the OGM. +* [#3601](https://github.com/neo4j/graphql/pull/3601) [`5556221c8`](https://github.com/neo4j/graphql/commit/5556221c82c8bf676e72bf6f3113473e271df1fb) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Ignore `@authentication`, `@authorization` and `subscriptionsAuthorization` directives in the OGM. -- Updated dependencies [[`0a5e91bb2`](https://github.com/neo4j/graphql/commit/0a5e91bb2d7db61802ffe31517f60949884f4be5)]: - - @neo4j/graphql@3.23.1 +* Updated dependencies [[`0a5e91bb2`](https://github.com/neo4j/graphql/commit/0a5e91bb2d7db61802ffe31517f60949884f4be5)]: + * @neo4j/graphql@3.23.1 ## 3.23.0 ### Minor Changes -- [#3581](https://github.com/neo4j/graphql/pull/3581) [`775fdea1d`](https://github.com/neo4j/graphql/commit/775fdea1d7af274094a7dd56018e75fb2b2596e2) Thanks [@ID!](https://github.com/ID!)! - This release includes the addition of three new directives for authentication and authorization: +* [#3581](https://github.com/neo4j/graphql/pull/3581) [`775fdea1d`](https://github.com/neo4j/graphql/commit/775fdea1d7af274094a7dd56018e75fb2b2596e2) Thanks [@ID!](https://github.com/ID!)! - This release includes the addition of three new directives for authentication and authorization: The `@authentication` directive is used to configure authentication checks at either the schema, object or field level: @@ -91,260 +109,260 @@ ### Patch Changes -- Updated dependencies [[`775fdea1d`](https://github.com/neo4j/graphql/commit/775fdea1d7af274094a7dd56018e75fb2b2596e2)]: - - @neo4j/graphql@3.23.0 +* Updated dependencies [[`775fdea1d`](https://github.com/neo4j/graphql/commit/775fdea1d7af274094a7dd56018e75fb2b2596e2)]: + * @neo4j/graphql@3.23.0 ## 3.22.0 ### Patch Changes -- [#3117](https://github.com/neo4j/graphql/pull/3117) [`c30569a97`](https://github.com/neo4j/graphql/commit/c30569a976f0f6a436ce11016845be47852a54cd) Thanks [@g10](https://github.com/g10)! - feat: expose `assertIndexesAndConstraints` on OGM +* [#3117](https://github.com/neo4j/graphql/pull/3117) [`c30569a97`](https://github.com/neo4j/graphql/commit/c30569a976f0f6a436ce11016845be47852a54cd) Thanks [@g10](https://github.com/g10)! - feat: expose `assertIndexesAndConstraints` on OGM -- [#3556](https://github.com/neo4j/graphql/pull/3556) [`4f221fdb2`](https://github.com/neo4j/graphql/commit/4f221fdb2d416f41c77a35bd6c7779f16927d246) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Preserve library generated casing when generating TypeScript types using the OGM. +* [#3556](https://github.com/neo4j/graphql/pull/3556) [`4f221fdb2`](https://github.com/neo4j/graphql/commit/4f221fdb2d416f41c77a35bd6c7779f16927d246) Thanks [@darrellwarde](https://github.com/darrellwarde)! - Preserve library generated casing when generating TypeScript types using the OGM. -- Updated dependencies [[`f779a0061`](https://github.com/neo4j/graphql/commit/f779a00612adc4e0c42a3696435cbf6072dcfe31), [`cc201e6fc`](https://github.com/neo4j/graphql/commit/cc201e6fc6f0146f0cf80aad2bcaf086a215554c), [`56a733023`](https://github.com/neo4j/graphql/commit/56a733023f6f300b92c8811e37bf6884dc661133)]: - - @neo4j/graphql@3.22.0 +* Updated dependencies [[`f779a0061`](https://github.com/neo4j/graphql/commit/f779a00612adc4e0c42a3696435cbf6072dcfe31), [`cc201e6fc`](https://github.com/neo4j/graphql/commit/cc201e6fc6f0146f0cf80aad2bcaf086a215554c), [`56a733023`](https://github.com/neo4j/graphql/commit/56a733023f6f300b92c8811e37bf6884dc661133)]: + * @neo4j/graphql@3.22.0 ## 3.21.0 ### Patch Changes -- Updated dependencies [[`baa787745`](https://github.com/neo4j/graphql/commit/baa787745f5fef2af6b29ba3b4722a51f94b1961), [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86), [`b891355e5`](https://github.com/neo4j/graphql/commit/b891355e58de1c56df68ce528a0a814d5202cab3), [`0f32311ea`](https://github.com/neo4j/graphql/commit/0f32311ea685c996f35a62410a21ef1d9f495b46), [`5616aa662`](https://github.com/neo4j/graphql/commit/5616aa662256e416b8401c8e50be79db194dfb28), [`f19a57ca2`](https://github.com/neo4j/graphql/commit/f19a57ca236cb608c8138237751c4432ede6233f), [`1d5506525`](https://github.com/neo4j/graphql/commit/1d550652512331f3fc69bf3b5307fbcb3fd79aab), [`0a444662b`](https://github.com/neo4j/graphql/commit/0a444662b2ac986971076505fbb6c17aec4ea539), [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86), [`cc7c8e6a9`](https://github.com/neo4j/graphql/commit/cc7c8e6a9ba5b880c971efbfcd36485c92948a6b), [`f4d691566`](https://github.com/neo4j/graphql/commit/f4d6915661ef5f18e0d5fa3bd1b96d3564d94ee8)]: - - @neo4j/graphql@3.21.0 +* Updated dependencies [[`baa787745`](https://github.com/neo4j/graphql/commit/baa787745f5fef2af6b29ba3b4722a51f94b1961), [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86), [`b891355e5`](https://github.com/neo4j/graphql/commit/b891355e58de1c56df68ce528a0a814d5202cab3), [`0f32311ea`](https://github.com/neo4j/graphql/commit/0f32311ea685c996f35a62410a21ef1d9f495b46), [`5616aa662`](https://github.com/neo4j/graphql/commit/5616aa662256e416b8401c8e50be79db194dfb28), [`f19a57ca2`](https://github.com/neo4j/graphql/commit/f19a57ca236cb608c8138237751c4432ede6233f), [`1d5506525`](https://github.com/neo4j/graphql/commit/1d550652512331f3fc69bf3b5307fbcb3fd79aab), [`0a444662b`](https://github.com/neo4j/graphql/commit/0a444662b2ac986971076505fbb6c17aec4ea539), [`8c99be2fe`](https://github.com/neo4j/graphql/commit/8c99be2fe3ef5a831c8f043403dedf980cf84f86), [`cc7c8e6a9`](https://github.com/neo4j/graphql/commit/cc7c8e6a9ba5b880c971efbfcd36485c92948a6b), [`f4d691566`](https://github.com/neo4j/graphql/commit/f4d6915661ef5f18e0d5fa3bd1b96d3564d94ee8)]: + * @neo4j/graphql@3.21.0 ## 3.20.1 ### Patch Changes -- Updated dependencies [[`449d66fbd`](https://github.com/neo4j/graphql/commit/449d66fbddb061c40bfd3df10c8c12bf037960d7)]: - - @neo4j/graphql@3.20.1 +* Updated dependencies [[`449d66fbd`](https://github.com/neo4j/graphql/commit/449d66fbddb061c40bfd3df10c8c12bf037960d7)]: + * @neo4j/graphql@3.20.1 ## 3.20.0 ### Patch Changes -- Updated dependencies [[`6cce9ffe0`](https://github.com/neo4j/graphql/commit/6cce9ffe0605795be8e2e1990860d4ea0bd256ec), [`a39b22fc1`](https://github.com/neo4j/graphql/commit/a39b22fc1f8f1227cac5a7efbaab1d855062054e)]: - - @neo4j/graphql@3.20.0 +* Updated dependencies [[`6cce9ffe0`](https://github.com/neo4j/graphql/commit/6cce9ffe0605795be8e2e1990860d4ea0bd256ec), [`a39b22fc1`](https://github.com/neo4j/graphql/commit/a39b22fc1f8f1227cac5a7efbaab1d855062054e)]: + * @neo4j/graphql@3.20.0 ## 3.19.0 ### Patch Changes -- Updated dependencies [[`cc08bcd8a`](https://github.com/neo4j/graphql/commit/cc08bcd8a07044e38380fada05893de980351644), [`dcfe28b49`](https://github.com/neo4j/graphql/commit/dcfe28b4912bb328a03caab48991f0903f000751), [`ce573b770`](https://github.com/neo4j/graphql/commit/ce573b7705a01caadcc1ad10984f85976451ca2c), [`43e189c14`](https://github.com/neo4j/graphql/commit/43e189c14853cd626e14b53338b4ef0ca7e489b8)]: - - @neo4j/graphql@3.19.0 +* Updated dependencies [[`cc08bcd8a`](https://github.com/neo4j/graphql/commit/cc08bcd8a07044e38380fada05893de980351644), [`dcfe28b49`](https://github.com/neo4j/graphql/commit/dcfe28b4912bb328a03caab48991f0903f000751), [`ce573b770`](https://github.com/neo4j/graphql/commit/ce573b7705a01caadcc1ad10984f85976451ca2c), [`43e189c14`](https://github.com/neo4j/graphql/commit/43e189c14853cd626e14b53338b4ef0ca7e489b8)]: + * @neo4j/graphql@3.19.0 ## 3.18.3 ### Patch Changes -- Updated dependencies [[`e8092aa85`](https://github.com/neo4j/graphql/commit/e8092aa855244f7da21bb82f874bfda534a6fa4b), [`99fe4b4b8`](https://github.com/neo4j/graphql/commit/99fe4b4b813538fa985111918bf6ffe2ef458f05)]: - - @neo4j/graphql@3.18.3 +* Updated dependencies [[`e8092aa85`](https://github.com/neo4j/graphql/commit/e8092aa855244f7da21bb82f874bfda534a6fa4b), [`99fe4b4b8`](https://github.com/neo4j/graphql/commit/99fe4b4b813538fa985111918bf6ffe2ef458f05)]: + * @neo4j/graphql@3.18.3 ## 3.18.2 ### Patch Changes -- Updated dependencies [[`a8aabfeca`](https://github.com/neo4j/graphql/commit/a8aabfecad39b371fa82d16ea00e1e45d4044d05), [`8657dff82`](https://github.com/neo4j/graphql/commit/8657dff8274ea3d3a4a42c18c8e81232748cbeff)]: - - @neo4j/graphql@3.18.2 +* Updated dependencies [[`a8aabfeca`](https://github.com/neo4j/graphql/commit/a8aabfecad39b371fa82d16ea00e1e45d4044d05), [`8657dff82`](https://github.com/neo4j/graphql/commit/8657dff8274ea3d3a4a42c18c8e81232748cbeff)]: + * @neo4j/graphql@3.18.2 ## 3.18.1 ### Patch Changes -- Updated dependencies [[`cbc15970c`](https://github.com/neo4j/graphql/commit/cbc15970cd87e5cdcfbae40ce5bacf1fb819ade8)]: - - @neo4j/graphql@3.18.1 +* Updated dependencies [[`cbc15970c`](https://github.com/neo4j/graphql/commit/cbc15970cd87e5cdcfbae40ce5bacf1fb819ade8)]: + * @neo4j/graphql@3.18.1 ## 3.18.0 ### Patch Changes -- Updated dependencies [[`7a2f2acc4`](https://github.com/neo4j/graphql/commit/7a2f2acc434d1996a4b3785416acb0c46ad7f199), [`ce5fb9eb3`](https://github.com/neo4j/graphql/commit/ce5fb9eb36a08dde95de605b49f842876b1c1515)]: - - @neo4j/graphql@3.18.0 +* Updated dependencies [[`7a2f2acc4`](https://github.com/neo4j/graphql/commit/7a2f2acc434d1996a4b3785416acb0c46ad7f199), [`ce5fb9eb3`](https://github.com/neo4j/graphql/commit/ce5fb9eb36a08dde95de605b49f842876b1c1515)]: + * @neo4j/graphql@3.18.0 ## 3.17.2 ### Patch Changes -- Updated dependencies [[`ff99e317c`](https://github.com/neo4j/graphql/commit/ff99e317cff519b1ae26bd52c70b2d89ac923512), [`b6e4ebdc6`](https://github.com/neo4j/graphql/commit/b6e4ebdc62770951e333893c8f9562a2c9cbb99f), [`0ce8bcf4b`](https://github.com/neo4j/graphql/commit/0ce8bcf4b7b021e341496cde8b10140f00d47c84), [`39abf6591`](https://github.com/neo4j/graphql/commit/39abf65915bb100baab15f3e838b899152109e63), [`03141c81e`](https://github.com/neo4j/graphql/commit/03141c81e38e85bc6499231ae90a19e3fbdb17c3)]: - - @neo4j/graphql@3.17.2 +* Updated dependencies [[`ff99e317c`](https://github.com/neo4j/graphql/commit/ff99e317cff519b1ae26bd52c70b2d89ac923512), [`b6e4ebdc6`](https://github.com/neo4j/graphql/commit/b6e4ebdc62770951e333893c8f9562a2c9cbb99f), [`0ce8bcf4b`](https://github.com/neo4j/graphql/commit/0ce8bcf4b7b021e341496cde8b10140f00d47c84), [`39abf6591`](https://github.com/neo4j/graphql/commit/39abf65915bb100baab15f3e838b899152109e63), [`03141c81e`](https://github.com/neo4j/graphql/commit/03141c81e38e85bc6499231ae90a19e3fbdb17c3)]: + * @neo4j/graphql@3.17.2 ## 3.17.1 ### Patch Changes -- Updated dependencies [[`56d126238`](https://github.com/neo4j/graphql/commit/56d1262389ff38522d7b9c3964e878415994b1fa), [`cfe96e713`](https://github.com/neo4j/graphql/commit/cfe96e713ea54e6c670d7fe0dc535e7065b81d9c), [`8e41a724a`](https://github.com/neo4j/graphql/commit/8e41a724a3abae1fa63fb5cd4cc1cf7a08e124d1), [`eaf16062c`](https://github.com/neo4j/graphql/commit/eaf16062c9a27eacdea53de87423b726bef7bed6), [`514bb64b6`](https://github.com/neo4j/graphql/commit/514bb64b6c22e886b3d8c06fc48b968af86bd421), [`99985018e`](https://github.com/neo4j/graphql/commit/99985018e6894d827efbfe1fa5fad6cc177594eb)]: - - @neo4j/graphql@3.17.1 +* Updated dependencies [[`56d126238`](https://github.com/neo4j/graphql/commit/56d1262389ff38522d7b9c3964e878415994b1fa), [`cfe96e713`](https://github.com/neo4j/graphql/commit/cfe96e713ea54e6c670d7fe0dc535e7065b81d9c), [`8e41a724a`](https://github.com/neo4j/graphql/commit/8e41a724a3abae1fa63fb5cd4cc1cf7a08e124d1), [`eaf16062c`](https://github.com/neo4j/graphql/commit/eaf16062c9a27eacdea53de87423b726bef7bed6), [`514bb64b6`](https://github.com/neo4j/graphql/commit/514bb64b6c22e886b3d8c06fc48b968af86bd421), [`99985018e`](https://github.com/neo4j/graphql/commit/99985018e6894d827efbfe1fa5fad6cc177594eb)]: + * @neo4j/graphql@3.17.1 ## 3.17.0 ### Patch Changes -- Updated dependencies [[`6f0d9c06d`](https://github.com/neo4j/graphql/commit/6f0d9c06d9b34d30211bdf703bb0b26844033179), [`a0d4dc4cf`](https://github.com/neo4j/graphql/commit/a0d4dc4cf5d007235be3c7e36202aea9d39b6542), [`6421735f0`](https://github.com/neo4j/graphql/commit/6421735f014f0e2edacb1be7ba15c8819a1a0adb), [`cdbf768a0`](https://github.com/neo4j/graphql/commit/cdbf768a05323b15595fe26b5d047866f0f0c036), [`1902f903f`](https://github.com/neo4j/graphql/commit/1902f903f89453f2d17be909e2b05f1c12ac39a9), [`1a2101c33`](https://github.com/neo4j/graphql/commit/1a2101c33d00a738be26c57fa378d4a9e3bede41)]: - - @neo4j/graphql@3.17.0 +* Updated dependencies [[`6f0d9c06d`](https://github.com/neo4j/graphql/commit/6f0d9c06d9b34d30211bdf703bb0b26844033179), [`a0d4dc4cf`](https://github.com/neo4j/graphql/commit/a0d4dc4cf5d007235be3c7e36202aea9d39b6542), [`6421735f0`](https://github.com/neo4j/graphql/commit/6421735f014f0e2edacb1be7ba15c8819a1a0adb), [`cdbf768a0`](https://github.com/neo4j/graphql/commit/cdbf768a05323b15595fe26b5d047866f0f0c036), [`1902f903f`](https://github.com/neo4j/graphql/commit/1902f903f89453f2d17be909e2b05f1c12ac39a9), [`1a2101c33`](https://github.com/neo4j/graphql/commit/1a2101c33d00a738be26c57fa378d4a9e3bede41)]: + * @neo4j/graphql@3.17.0 ## 3.16.1 ### Patch Changes -- Updated dependencies [[`0fe3a6853`](https://github.com/neo4j/graphql/commit/0fe3a68536e0cc5ec2cdd05057d038ca38358ff8), [`79ef38c5d`](https://github.com/neo4j/graphql/commit/79ef38c5dd43da19a64b0e7c25019209e19415f3)]: - - @neo4j/graphql@3.16.1 +* Updated dependencies [[`0fe3a6853`](https://github.com/neo4j/graphql/commit/0fe3a68536e0cc5ec2cdd05057d038ca38358ff8), [`79ef38c5d`](https://github.com/neo4j/graphql/commit/79ef38c5dd43da19a64b0e7c25019209e19415f3)]: + * @neo4j/graphql@3.16.1 ## 3.16.0 ### Patch Changes -- Updated dependencies [[`29e1d659a`](https://github.com/neo4j/graphql/commit/29e1d659aa7c48c73e6f19ed37bff320bff4dfeb), [`022861de2`](https://github.com/neo4j/graphql/commit/022861de2e1d69f8b56444b1c92308b2365e599c), [`8859980f9`](https://github.com/neo4j/graphql/commit/8859980f93598212fb226aa0172a0f0091965801), [`a270243bb`](https://github.com/neo4j/graphql/commit/a270243bb3baaa0abadeb395fff5b0036a754c7b), [`3fff70828`](https://github.com/neo4j/graphql/commit/3fff708284e95b4667be5094bbda6cf828a467a9), [`8db2a1e2c`](https://github.com/neo4j/graphql/commit/8db2a1e2ce8a2f8d3077663a6665e0e670652db1), [`44ce8a741`](https://github.com/neo4j/graphql/commit/44ce8a74154182fca7ce6cf269bcd0009e61e34b), [`6d2ba44d4`](https://github.com/neo4j/graphql/commit/6d2ba44d49a043bf4aed5311e368cf0c30719745), [`14df1f827`](https://github.com/neo4j/graphql/commit/14df1f8271323a9d320810f5a19c02e79a5b3d84), [`4f6d4ae97`](https://github.com/neo4j/graphql/commit/4f6d4ae97f1278d37e65a25a10561efdfdeb6bac)]: - - @neo4j/graphql@3.16.0 +* Updated dependencies [[`29e1d659a`](https://github.com/neo4j/graphql/commit/29e1d659aa7c48c73e6f19ed37bff320bff4dfeb), [`022861de2`](https://github.com/neo4j/graphql/commit/022861de2e1d69f8b56444b1c92308b2365e599c), [`8859980f9`](https://github.com/neo4j/graphql/commit/8859980f93598212fb226aa0172a0f0091965801), [`a270243bb`](https://github.com/neo4j/graphql/commit/a270243bb3baaa0abadeb395fff5b0036a754c7b), [`3fff70828`](https://github.com/neo4j/graphql/commit/3fff708284e95b4667be5094bbda6cf828a467a9), [`8db2a1e2c`](https://github.com/neo4j/graphql/commit/8db2a1e2ce8a2f8d3077663a6665e0e670652db1), [`44ce8a741`](https://github.com/neo4j/graphql/commit/44ce8a74154182fca7ce6cf269bcd0009e61e34b), [`6d2ba44d4`](https://github.com/neo4j/graphql/commit/6d2ba44d49a043bf4aed5311e368cf0c30719745), [`14df1f827`](https://github.com/neo4j/graphql/commit/14df1f8271323a9d320810f5a19c02e79a5b3d84), [`4f6d4ae97`](https://github.com/neo4j/graphql/commit/4f6d4ae97f1278d37e65a25a10561efdfdeb6bac)]: + * @neo4j/graphql@3.16.0 ## 3.15.0 ### Patch Changes -- Updated dependencies [[`f17f6b5b0`](https://github.com/neo4j/graphql/commit/f17f6b5b0259d26cf207a340be027b6c20ec2b81), [`343845b26`](https://github.com/neo4j/graphql/commit/343845b26b577f0126dd3d7f2c070c5d0d1e3bf3), [`6a784dd1f`](https://github.com/neo4j/graphql/commit/6a784dd1ffbaa8c901e04b67f62590545bdd4f5d), [`163cf903d`](https://github.com/neo4j/graphql/commit/163cf903d375222b8455733d7f6a45ae831dea25), [`3fd44b3ef`](https://github.com/neo4j/graphql/commit/3fd44b3ef08d6eebec3cb1dd51111af8bf4e9fb2), [`ef1822849`](https://github.com/neo4j/graphql/commit/ef182284930c8444c7205e2bc398ef17481e6279)]: - - @neo4j/graphql@3.15.0 +* Updated dependencies [[`f17f6b5b0`](https://github.com/neo4j/graphql/commit/f17f6b5b0259d26cf207a340be027b6c20ec2b81), [`343845b26`](https://github.com/neo4j/graphql/commit/343845b26b577f0126dd3d7f2c070c5d0d1e3bf3), [`6a784dd1f`](https://github.com/neo4j/graphql/commit/6a784dd1ffbaa8c901e04b67f62590545bdd4f5d), [`163cf903d`](https://github.com/neo4j/graphql/commit/163cf903d375222b8455733d7f6a45ae831dea25), [`3fd44b3ef`](https://github.com/neo4j/graphql/commit/3fd44b3ef08d6eebec3cb1dd51111af8bf4e9fb2), [`ef1822849`](https://github.com/neo4j/graphql/commit/ef182284930c8444c7205e2bc398ef17481e6279)]: + * @neo4j/graphql@3.15.0 ## 3.14.2 ### Patch Changes -- Updated dependencies [[`785e99db7`](https://github.com/neo4j/graphql/commit/785e99db7c75276ea1380cbef68435fe02dc8049), [`6c38084c0`](https://github.com/neo4j/graphql/commit/6c38084c0f2513085babc6a71b5039adf4b5c7e2), [`788fe93ef`](https://github.com/neo4j/graphql/commit/788fe93ef4d52e8a4fd697ac7f134b0e523ea4de), [`ea1917a5a`](https://github.com/neo4j/graphql/commit/ea1917a5a751fe9df362e687cc1f4d9b353e588f), [`1f8dee357`](https://github.com/neo4j/graphql/commit/1f8dee357296956c90968d79a5a3e0e9343fe2f9), [`f19ef34d7`](https://github.com/neo4j/graphql/commit/f19ef34d7908539fdba6bebc5b2a76fc09cf46c1), [`3252f44d7`](https://github.com/neo4j/graphql/commit/3252f44d7d5453690f0aa0f35b9246a41ff5908b)]: - - @neo4j/graphql@3.14.2 +* Updated dependencies [[`785e99db7`](https://github.com/neo4j/graphql/commit/785e99db7c75276ea1380cbef68435fe02dc8049), [`6c38084c0`](https://github.com/neo4j/graphql/commit/6c38084c0f2513085babc6a71b5039adf4b5c7e2), [`788fe93ef`](https://github.com/neo4j/graphql/commit/788fe93ef4d52e8a4fd697ac7f134b0e523ea4de), [`ea1917a5a`](https://github.com/neo4j/graphql/commit/ea1917a5a751fe9df362e687cc1f4d9b353e588f), [`1f8dee357`](https://github.com/neo4j/graphql/commit/1f8dee357296956c90968d79a5a3e0e9343fe2f9), [`f19ef34d7`](https://github.com/neo4j/graphql/commit/f19ef34d7908539fdba6bebc5b2a76fc09cf46c1), [`3252f44d7`](https://github.com/neo4j/graphql/commit/3252f44d7d5453690f0aa0f35b9246a41ff5908b)]: + * @neo4j/graphql@3.14.2 ## 3.14.1 ### Patch Changes -- [#2579](https://github.com/neo4j/graphql/pull/2579) [`7f4a3981d`](https://github.com/neo4j/graphql/commit/7f4a3981df423ab39417333e9deec9c328e13e63) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed the `fulltext` argument in OGM queries +* [#2579](https://github.com/neo4j/graphql/pull/2579) [`7f4a3981d`](https://github.com/neo4j/graphql/commit/7f4a3981df423ab39417333e9deec9c328e13e63) Thanks [@Liam-Doodson](https://github.com/Liam-Doodson)! - Fixed the `fulltext` argument in OGM queries -- Updated dependencies [[`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39), [`05280d0f1`](https://github.com/neo4j/graphql/commit/05280d0f16792e8e004c732ab039152d4dd32707), [`26d8a0045`](https://github.com/neo4j/graphql/commit/26d8a00453b03fa14328bcc2f5f4685e7b5e3ba3), [`189352546`](https://github.com/neo4j/graphql/commit/18935254652240c1ad826c3c85a5be873c4dbd20), [`9243fb3af`](https://github.com/neo4j/graphql/commit/9243fb3afc0c04408bf78c1ba581856ccb0e51fc), [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39), [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39), [`1b2913803`](https://github.com/neo4j/graphql/commit/1b2913803880bd1e8e1f1b7f79262ae20b1585e3), [`cd4f57a5d`](https://github.com/neo4j/graphql/commit/cd4f57a5ddc67660f7c41fd67e2006e68a8a0e1d), [`88d2cdfc1`](https://github.com/neo4j/graphql/commit/88d2cdfc1265f8a45c384872d32704bf452d36df)]: - - @neo4j/graphql@3.14.1 +* Updated dependencies [[`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39), [`05280d0f1`](https://github.com/neo4j/graphql/commit/05280d0f16792e8e004c732ab039152d4dd32707), [`26d8a0045`](https://github.com/neo4j/graphql/commit/26d8a00453b03fa14328bcc2f5f4685e7b5e3ba3), [`189352546`](https://github.com/neo4j/graphql/commit/18935254652240c1ad826c3c85a5be873c4dbd20), [`9243fb3af`](https://github.com/neo4j/graphql/commit/9243fb3afc0c04408bf78c1ba581856ccb0e51fc), [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39), [`95ecaf7c3`](https://github.com/neo4j/graphql/commit/95ecaf7c37b3e6e69bf025d49b5ad00ad44dcb39), [`1b2913803`](https://github.com/neo4j/graphql/commit/1b2913803880bd1e8e1f1b7f79262ae20b1585e3), [`cd4f57a5d`](https://github.com/neo4j/graphql/commit/cd4f57a5ddc67660f7c41fd67e2006e68a8a0e1d), [`88d2cdfc1`](https://github.com/neo4j/graphql/commit/88d2cdfc1265f8a45c384872d32704bf452d36df)]: + * @neo4j/graphql@3.14.1 ## 3.14.0 ### Patch Changes -- Updated dependencies [[`9d9bea661`](https://github.com/neo4j/graphql/commit/9d9bea6611851dd3ae9912aa0eb29554ed2b0eb0), [`652ebcdba`](https://github.com/neo4j/graphql/commit/652ebcdbadf71c3e55989672eb1064b52b32828e)]: - - @neo4j/graphql@3.14.0 +* Updated dependencies [[`9d9bea661`](https://github.com/neo4j/graphql/commit/9d9bea6611851dd3ae9912aa0eb29554ed2b0eb0), [`652ebcdba`](https://github.com/neo4j/graphql/commit/652ebcdbadf71c3e55989672eb1064b52b32828e)]: + * @neo4j/graphql@3.14.0 ## 3.13.1 ### Patch Changes -- Updated dependencies [[`1bec3f95d`](https://github.com/neo4j/graphql/commit/1bec3f95d0f469c2a4e879b1904a4d1a4938207e), [`0d70b0704`](https://github.com/neo4j/graphql/commit/0d70b07049a0f4b2391240929aadc54f62eedc42), [`5d349e05c`](https://github.com/neo4j/graphql/commit/5d349e05c08ed655144b9919528ba66047f49443), [`638f3205a`](https://github.com/neo4j/graphql/commit/638f3205ab3b20eb69a7bb33e6c11685d3e53a51), [`2710165e0`](https://github.com/neo4j/graphql/commit/2710165e0bfd200a8755e1b94f363ee17258fcac)]: - - @neo4j/graphql@3.13.1 +* Updated dependencies [[`1bec3f95d`](https://github.com/neo4j/graphql/commit/1bec3f95d0f469c2a4e879b1904a4d1a4938207e), [`0d70b0704`](https://github.com/neo4j/graphql/commit/0d70b07049a0f4b2391240929aadc54f62eedc42), [`5d349e05c`](https://github.com/neo4j/graphql/commit/5d349e05c08ed655144b9919528ba66047f49443), [`638f3205a`](https://github.com/neo4j/graphql/commit/638f3205ab3b20eb69a7bb33e6c11685d3e53a51), [`2710165e0`](https://github.com/neo4j/graphql/commit/2710165e0bfd200a8755e1b94f363ee17258fcac)]: + * @neo4j/graphql@3.13.1 ## 3.13.0 ### Patch Changes -- Updated dependencies [[`12ec721e6`](https://github.com/neo4j/graphql/commit/12ec721e66f7ce570b31be3341c625a48bda304f), [`b981c45f7`](https://github.com/neo4j/graphql/commit/b981c45f76753557c18b1152ad62f258d2bee7f7), [`c06ac56ae`](https://github.com/neo4j/graphql/commit/c06ac56ae84360dc19bccd4545334c8c65b1c768), [`e220f36e0`](https://github.com/neo4j/graphql/commit/e220f36e07bb27aeb5c787e7ebf5b09e7fba2afc), [`b624c7ace`](https://github.com/neo4j/graphql/commit/b624c7aced55493f9df1abcaca91b139713f4186), [`20aa9c05b`](https://github.com/neo4j/graphql/commit/20aa9c05be4c780493d536bc98335fb88d857b6a)]: - - @neo4j/graphql@3.13.0 +* Updated dependencies [[`12ec721e6`](https://github.com/neo4j/graphql/commit/12ec721e66f7ce570b31be3341c625a48bda304f), [`b981c45f7`](https://github.com/neo4j/graphql/commit/b981c45f76753557c18b1152ad62f258d2bee7f7), [`c06ac56ae`](https://github.com/neo4j/graphql/commit/c06ac56ae84360dc19bccd4545334c8c65b1c768), [`e220f36e0`](https://github.com/neo4j/graphql/commit/e220f36e07bb27aeb5c787e7ebf5b09e7fba2afc), [`b624c7ace`](https://github.com/neo4j/graphql/commit/b624c7aced55493f9df1abcaca91b139713f4186), [`20aa9c05b`](https://github.com/neo4j/graphql/commit/20aa9c05be4c780493d536bc98335fb88d857b6a)]: + * @neo4j/graphql@3.13.0 ## 3.12.2 ### Patch Changes -- Updated dependencies [[`82846ef0a`](https://github.com/neo4j/graphql/commit/82846ef0a5ac0c778d295970405626bed829cff3)]: - - @neo4j/graphql@3.12.2 +* Updated dependencies [[`82846ef0a`](https://github.com/neo4j/graphql/commit/82846ef0a5ac0c778d295970405626bed829cff3)]: + * @neo4j/graphql@3.12.2 ## 3.12.1 ### Patch Changes -- Updated dependencies [[`d71ddb54d`](https://github.com/neo4j/graphql/commit/d71ddb54d811e280357bd37270b9f5cae0c600aa), [`35bbf3197`](https://github.com/neo4j/graphql/commit/35bbf3197ecd3ad576567189242036ac3ee07b57), [`f2a56c738`](https://github.com/neo4j/graphql/commit/f2a56c73854c60144ec2809b855cd52eb1288a43), [`d04699b50`](https://github.com/neo4j/graphql/commit/d04699b50f0dd50984ab6688743f4fe027d797a0), [`27dd34de7`](https://github.com/neo4j/graphql/commit/27dd34de7815824afa490667ce2484f017c823a3), [`f2799750a`](https://github.com/neo4j/graphql/commit/f2799750a0a1aeaecaf9ead5295483e5205ada62), [`9d0859b59`](https://github.com/neo4j/graphql/commit/9d0859b596be29d0e64f6531e2bf0c17325b9a34)]: - - @neo4j/graphql@3.12.1 +* Updated dependencies [[`d71ddb54d`](https://github.com/neo4j/graphql/commit/d71ddb54d811e280357bd37270b9f5cae0c600aa), [`35bbf3197`](https://github.com/neo4j/graphql/commit/35bbf3197ecd3ad576567189242036ac3ee07b57), [`f2a56c738`](https://github.com/neo4j/graphql/commit/f2a56c73854c60144ec2809b855cd52eb1288a43), [`d04699b50`](https://github.com/neo4j/graphql/commit/d04699b50f0dd50984ab6688743f4fe027d797a0), [`27dd34de7`](https://github.com/neo4j/graphql/commit/27dd34de7815824afa490667ce2484f017c823a3), [`f2799750a`](https://github.com/neo4j/graphql/commit/f2799750a0a1aeaecaf9ead5295483e5205ada62), [`9d0859b59`](https://github.com/neo4j/graphql/commit/9d0859b596be29d0e64f6531e2bf0c17325b9a34)]: + * @neo4j/graphql@3.12.1 ## 3.12.0 ### Patch Changes -- Updated dependencies [[`0faef6f33`](https://github.com/neo4j/graphql/commit/0faef6f3330d70126817f6496556f5ad85611ad9), [`8642d3d67`](https://github.com/neo4j/graphql/commit/8642d3d67882cda2a0e212bdcf4b56376d419509), [`3b06cafbc`](https://github.com/neo4j/graphql/commit/3b06cafbc9f8ac6bfe43997bdd8e9db784b3907b)]: - - @neo4j/graphql@3.12.0 +* Updated dependencies [[`0faef6f33`](https://github.com/neo4j/graphql/commit/0faef6f3330d70126817f6496556f5ad85611ad9), [`8642d3d67`](https://github.com/neo4j/graphql/commit/8642d3d67882cda2a0e212bdcf4b56376d419509), [`3b06cafbc`](https://github.com/neo4j/graphql/commit/3b06cafbc9f8ac6bfe43997bdd8e9db784b3907b)]: + * @neo4j/graphql@3.12.0 ## 3.11.1 ### Patch Changes -- Updated dependencies [[`2c6d986a1`](https://github.com/neo4j/graphql/commit/2c6d986a19061fd8bc7739a2dd4737e7828e20d0)]: - - @neo4j/graphql@3.11.1 +* Updated dependencies [[`2c6d986a1`](https://github.com/neo4j/graphql/commit/2c6d986a19061fd8bc7739a2dd4737e7828e20d0)]: + * @neo4j/graphql@3.11.1 ## 3.11.0 ### Patch Changes -- Updated dependencies [[`8eff620b9`](https://github.com/neo4j/graphql/commit/8eff620b93d86d544d4594b69c5058a9092347c0), [`c769933cb`](https://github.com/neo4j/graphql/commit/c769933cba76d16c4f14b2c18aaf5c47415b05d9), [`44fc500eb`](https://github.com/neo4j/graphql/commit/44fc500ebbaff3f8cdfcc676bd2ef8cad2fd58ec), [`b37376e38`](https://github.com/neo4j/graphql/commit/b37376e38e13ab2ed6f0e0eeb99f2d9f17161fd7), [`5ce80724f`](https://github.com/neo4j/graphql/commit/5ce80724f4d45a38e5d4b5d0d369384a4599d51f), [`2c8f3ec37`](https://github.com/neo4j/graphql/commit/2c8f3ec37ce57f281972ddc107a9490392c482df), [`94512c90e`](https://github.com/neo4j/graphql/commit/94512c90e5e37601a4d260f1153ac043639ceb6f), [`74e6fee11`](https://github.com/neo4j/graphql/commit/74e6fee119c8f0c7d30384422e722754411135b9), [`4ee4d40ad`](https://github.com/neo4j/graphql/commit/4ee4d40ad5aca514ddc08091b2501bfa699294e9), [`e7bcf4f0b`](https://github.com/neo4j/graphql/commit/e7bcf4f0b69a75c10e0ee0a604fd35cab09fcfaf)]: - - @neo4j/graphql@3.11.0 +* Updated dependencies [[`8eff620b9`](https://github.com/neo4j/graphql/commit/8eff620b93d86d544d4594b69c5058a9092347c0), [`c769933cb`](https://github.com/neo4j/graphql/commit/c769933cba76d16c4f14b2c18aaf5c47415b05d9), [`44fc500eb`](https://github.com/neo4j/graphql/commit/44fc500ebbaff3f8cdfcc676bd2ef8cad2fd58ec), [`b37376e38`](https://github.com/neo4j/graphql/commit/b37376e38e13ab2ed6f0e0eeb99f2d9f17161fd7), [`5ce80724f`](https://github.com/neo4j/graphql/commit/5ce80724f4d45a38e5d4b5d0d369384a4599d51f), [`2c8f3ec37`](https://github.com/neo4j/graphql/commit/2c8f3ec37ce57f281972ddc107a9490392c482df), [`94512c90e`](https://github.com/neo4j/graphql/commit/94512c90e5e37601a4d260f1153ac043639ceb6f), [`74e6fee11`](https://github.com/neo4j/graphql/commit/74e6fee119c8f0c7d30384422e722754411135b9), [`4ee4d40ad`](https://github.com/neo4j/graphql/commit/4ee4d40ad5aca514ddc08091b2501bfa699294e9), [`e7bcf4f0b`](https://github.com/neo4j/graphql/commit/e7bcf4f0b69a75c10e0ee0a604fd35cab09fcfaf)]: + * @neo4j/graphql@3.11.0 ## 3.10.1 ### Patch Changes -- Updated dependencies [[`23467c469`](https://github.com/neo4j/graphql/commit/23467c4699287c9d33c0a1004db83ddb9e7e606a)]: - - @neo4j/graphql@3.10.1 +* Updated dependencies [[`23467c469`](https://github.com/neo4j/graphql/commit/23467c4699287c9d33c0a1004db83ddb9e7e606a)]: + * @neo4j/graphql@3.10.1 ## 3.10.0 ### Patch Changes -- Updated dependencies [[`64b3d0777`](https://github.com/neo4j/graphql/commit/64b3d07776685400313603f57e274ad8e821968b), [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b), [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b), [`5a748dc32`](https://github.com/neo4j/graphql/commit/5a748dc326ff063a8d8db6c281d681a68b679ade), [`c4ced43c0`](https://github.com/neo4j/graphql/commit/c4ced43c01cdd0d86d60a68906c3e79d847c5394), [`7b8a73cbd`](https://github.com/neo4j/graphql/commit/7b8a73cbd3e6accaaa7d64daa35f25941a7022c1)]: - - @neo4j/graphql@3.10.0 +* Updated dependencies [[`64b3d0777`](https://github.com/neo4j/graphql/commit/64b3d07776685400313603f57e274ad8e821968b), [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b), [`cad28dd1f`](https://github.com/neo4j/graphql/commit/cad28dd1f2f92fccf713beee600d2234c7c9709b), [`5a748dc32`](https://github.com/neo4j/graphql/commit/5a748dc326ff063a8d8db6c281d681a68b679ade), [`c4ced43c0`](https://github.com/neo4j/graphql/commit/c4ced43c01cdd0d86d60a68906c3e79d847c5394), [`7b8a73cbd`](https://github.com/neo4j/graphql/commit/7b8a73cbd3e6accaaa7d64daa35f25941a7022c1)]: + * @neo4j/graphql@3.10.0 ## 3.9.0 ### Patch Changes -- Updated dependencies [[`28742a5bd`](https://github.com/neo4j/graphql/commit/28742a5bd77b21497300248d18ff23206e1ec66f), [`0c89c88ae`](https://github.com/neo4j/graphql/commit/0c89c88ae25bb6c06edac4adff43b47802f45ea1), [`fb1e2c93f`](https://github.com/neo4j/graphql/commit/fb1e2c93f41adeaa61cc458f20a5812472ed3e2c)]: - - @neo4j/graphql@3.9.0 +* Updated dependencies [[`28742a5bd`](https://github.com/neo4j/graphql/commit/28742a5bd77b21497300248d18ff23206e1ec66f), [`0c89c88ae`](https://github.com/neo4j/graphql/commit/0c89c88ae25bb6c06edac4adff43b47802f45ea1), [`fb1e2c93f`](https://github.com/neo4j/graphql/commit/fb1e2c93f41adeaa61cc458f20a5812472ed3e2c)]: + * @neo4j/graphql@3.9.0 ## 3.8.0 ### Patch Changes -- [#2014](https://github.com/neo4j/graphql/pull/2014) [`66c040179`](https://github.com/neo4j/graphql/commit/66c0401791e9fc0182a2e5c271bff11bd05f5fef) Thanks [@mjfwebb](https://github.com/mjfwebb)! - refactor: fix linting errors and add types +* [#2014](https://github.com/neo4j/graphql/pull/2014) [`66c040179`](https://github.com/neo4j/graphql/commit/66c0401791e9fc0182a2e5c271bff11bd05f5fef) Thanks [@mjfwebb](https://github.com/mjfwebb)! - refactor: fix linting errors and add types -- Updated dependencies [[`f958503e0`](https://github.com/neo4j/graphql/commit/f958503e059fcfabc46628fd651914e08d29b998), [`2abb6036f`](https://github.com/neo4j/graphql/commit/2abb6036f267ba0c1310f36e3a7882948800ae05), [`e978b185f`](https://github.com/neo4j/graphql/commit/e978b185f1d0fe4ec7bd75ecbaa03a5216105a14), [`a037e34a9`](https://github.com/neo4j/graphql/commit/a037e34a9bb1f8eff07992e0d08b9c0fbf5f5a11), [`a965bd861`](https://github.com/neo4j/graphql/commit/a965bd861bef0fab93480705ac4f011f1f6c534f), [`8260fb845`](https://github.com/neo4j/graphql/commit/8260fb845aced51dbf90425870b766210c96a22c), [`99a7f707a`](https://github.com/neo4j/graphql/commit/99a7f707ad4afd2ef1613e8218de713836d165f3), [`66c040179`](https://github.com/neo4j/graphql/commit/66c0401791e9fc0182a2e5c271bff11bd05f5fef), [`1d90a5252`](https://github.com/neo4j/graphql/commit/1d90a5252abf724fc91b92fe3a86ee69c0ab26bb), [`1ceb09860`](https://github.com/neo4j/graphql/commit/1ceb09860e256ea5f7bebe4797c31045d3ca9ece), [`972a06c83`](https://github.com/neo4j/graphql/commit/972a06c83db82bbef49c56f861d07ff688b99cb5)]: - - @neo4j/graphql@3.8.0 +* Updated dependencies [[`f958503e0`](https://github.com/neo4j/graphql/commit/f958503e059fcfabc46628fd651914e08d29b998), [`2abb6036f`](https://github.com/neo4j/graphql/commit/2abb6036f267ba0c1310f36e3a7882948800ae05), [`e978b185f`](https://github.com/neo4j/graphql/commit/e978b185f1d0fe4ec7bd75ecbaa03a5216105a14), [`a037e34a9`](https://github.com/neo4j/graphql/commit/a037e34a9bb1f8eff07992e0d08b9c0fbf5f5a11), [`a965bd861`](https://github.com/neo4j/graphql/commit/a965bd861bef0fab93480705ac4f011f1f6c534f), [`8260fb845`](https://github.com/neo4j/graphql/commit/8260fb845aced51dbf90425870b766210c96a22c), [`99a7f707a`](https://github.com/neo4j/graphql/commit/99a7f707ad4afd2ef1613e8218de713836d165f3), [`66c040179`](https://github.com/neo4j/graphql/commit/66c0401791e9fc0182a2e5c271bff11bd05f5fef), [`1d90a5252`](https://github.com/neo4j/graphql/commit/1d90a5252abf724fc91b92fe3a86ee69c0ab26bb), [`1ceb09860`](https://github.com/neo4j/graphql/commit/1ceb09860e256ea5f7bebe4797c31045d3ca9ece), [`972a06c83`](https://github.com/neo4j/graphql/commit/972a06c83db82bbef49c56f861d07ff688b99cb5)]: + * @neo4j/graphql@3.8.0 ## 3.7.0 ### Patch Changes -- [#1968](https://github.com/neo4j/graphql/pull/1968) [`4e6a38799`](https://github.com/neo4j/graphql/commit/4e6a38799a470bc9846b3800e3abbdd508a88e38) Thanks [@angrykoala](https://github.com/angrykoala)! - Unpin peer dependencies to support a wider range of versions +* [#1968](https://github.com/neo4j/graphql/pull/1968) [`4e6a38799`](https://github.com/neo4j/graphql/commit/4e6a38799a470bc9846b3800e3abbdd508a88e38) Thanks [@angrykoala](https://github.com/angrykoala)! - Unpin peer dependencies to support a wider range of versions -- Updated dependencies [[`957da9430`](https://github.com/neo4j/graphql/commit/957da943008508b43e996efea0c7fa0fe7c08495), [`4e6a38799`](https://github.com/neo4j/graphql/commit/4e6a38799a470bc9846b3800e3abbdd508a88e38), [`1c589e246`](https://github.com/neo4j/graphql/commit/1c589e246f0ce9ffe82c5e7612deb4e7bac7c6e1), [`31c287458`](https://github.com/neo4j/graphql/commit/31c2874588842501636fd754fe18bbc648e4e849), [`37a77f97c`](https://github.com/neo4j/graphql/commit/37a77f97cab35edf2ab0a09cb49800564ac99e6f), [`8b6d0990b`](https://github.com/neo4j/graphql/commit/8b6d0990b04a985e06d9b9f880ddd86b75cd00d5), [`5955a6a36`](https://github.com/neo4j/graphql/commit/5955a6a363b0490916ca2765e457b01be751ad20)]: - - @neo4j/graphql@3.7.0 +* Updated dependencies [[`957da9430`](https://github.com/neo4j/graphql/commit/957da943008508b43e996efea0c7fa0fe7c08495), [`4e6a38799`](https://github.com/neo4j/graphql/commit/4e6a38799a470bc9846b3800e3abbdd508a88e38), [`1c589e246`](https://github.com/neo4j/graphql/commit/1c589e246f0ce9ffe82c5e7612deb4e7bac7c6e1), [`31c287458`](https://github.com/neo4j/graphql/commit/31c2874588842501636fd754fe18bbc648e4e849), [`37a77f97c`](https://github.com/neo4j/graphql/commit/37a77f97cab35edf2ab0a09cb49800564ac99e6f), [`8b6d0990b`](https://github.com/neo4j/graphql/commit/8b6d0990b04a985e06d9b9f880ddd86b75cd00d5), [`5955a6a36`](https://github.com/neo4j/graphql/commit/5955a6a363b0490916ca2765e457b01be751ad20)]: + * @neo4j/graphql@3.7.0 ## 3.6.3 ### Patch Changes -- Updated dependencies [[`037856af`](https://github.com/neo4j/graphql/commit/037856afc74e9739707cb5a92cb830edc24a43b1), [`7e90ecfe`](https://github.com/neo4j/graphql/commit/7e90ecfed5a3cc61dda8d54d525c190842f0d1ef), [`7affa891`](https://github.com/neo4j/graphql/commit/7affa8912e16bf3ebf27bd5460eb5c671f9b672a), [`07109478`](https://github.com/neo4j/graphql/commit/07109478b0dbd7ca4cf99f31e720f09ea8ad77c2), [`07d2b61e`](https://github.com/neo4j/graphql/commit/07d2b61e35820def7c399b110a7bc99217f76e60), [`d7870c31`](https://github.com/neo4j/graphql/commit/d7870c31faaa1e211236fac4e50714937f07ce22)]: - - @neo4j/graphql@3.6.3 +* Updated dependencies [[`037856af`](https://github.com/neo4j/graphql/commit/037856afc74e9739707cb5a92cb830edc24a43b1), [`7e90ecfe`](https://github.com/neo4j/graphql/commit/7e90ecfed5a3cc61dda8d54d525c190842f0d1ef), [`7affa891`](https://github.com/neo4j/graphql/commit/7affa8912e16bf3ebf27bd5460eb5c671f9b672a), [`07109478`](https://github.com/neo4j/graphql/commit/07109478b0dbd7ca4cf99f31e720f09ea8ad77c2), [`07d2b61e`](https://github.com/neo4j/graphql/commit/07d2b61e35820def7c399b110a7bc99217f76e60), [`d7870c31`](https://github.com/neo4j/graphql/commit/d7870c31faaa1e211236fac4e50714937f07ce22)]: + * @neo4j/graphql@3.6.3 ## 3.6.2 ### Patch Changes -- Updated dependencies [[`68e44f53`](https://github.com/neo4j/graphql/commit/68e44f53672740780cd51d7985f15c85fd7def54)]: - - @neo4j/graphql@3.6.2 +* Updated dependencies [[`68e44f53`](https://github.com/neo4j/graphql/commit/68e44f53672740780cd51d7985f15c85fd7def54)]: + * @neo4j/graphql@3.6.2 ## 3.6.1 ### Patch Changes -- Updated dependencies [[`3c2d0658`](https://github.com/neo4j/graphql/commit/3c2d065889159dd4b5c37c24de58cd1b34869790), [`fad52b51`](https://github.com/neo4j/graphql/commit/fad52b513d7835b0a01856c2882ab536df205252)]: - - @neo4j/graphql@3.6.1 +* Updated dependencies [[`3c2d0658`](https://github.com/neo4j/graphql/commit/3c2d065889159dd4b5c37c24de58cd1b34869790), [`fad52b51`](https://github.com/neo4j/graphql/commit/fad52b513d7835b0a01856c2882ab536df205252)]: + * @neo4j/graphql@3.6.1 ## 3.6.0 ### Patch Changes -- Updated dependencies [[`4c8098f4`](https://github.com/neo4j/graphql/commit/4c8098f428937b7bd6bf3d29abb778618c7b030c), [`36ebee06`](https://github.com/neo4j/graphql/commit/36ebee06352f5edbbd3748f818b8c0a7c5262681), [`ba713faf`](https://github.com/neo4j/graphql/commit/ba713faf7da05c6f9031c83542dbc51bc1a0239e), [`801cdaea`](https://github.com/neo4j/graphql/commit/801cdaea608e83fa3ba9fffb56b4f93db88d149a), [`21a0c58c`](https://github.com/neo4j/graphql/commit/21a0c58c85c8368c70c6a83a428f0c20231557b4), [`4d62eea7`](https://github.com/neo4j/graphql/commit/4d62eea78fe4a2d72805697a0adcb0b21625e87e), [`0a49f56d`](https://github.com/neo4j/graphql/commit/0a49f56dbd45eb3ca69ceafce4ed308cdc1d6e90), [`28ffcf88`](https://github.com/neo4j/graphql/commit/28ffcf88d0b5026eb2f3cce756b762fc9d025811), [`0f52cf7e`](https://github.com/neo4j/graphql/commit/0f52cf7e360da1c9e68a8d63c81f1c35a66679f4), [`381c4061`](https://github.com/neo4j/graphql/commit/381c40610766f9eb6c938ddba424e44e3382f103), [`52f755b0`](https://github.com/neo4j/graphql/commit/52f755b0a5ecda6f8356a61e83591c7c00b1e30e), [`1c7987b5`](https://github.com/neo4j/graphql/commit/1c7987b51b10fed565d92e9d74256f986800c2cf), [`de4756ca`](https://github.com/neo4j/graphql/commit/de4756caa7b5d6baad4ea549e7a7652dabfa89fc)]: - - @neo4j/graphql@3.6.0 +* Updated dependencies [[`4c8098f4`](https://github.com/neo4j/graphql/commit/4c8098f428937b7bd6bf3d29abb778618c7b030c), [`36ebee06`](https://github.com/neo4j/graphql/commit/36ebee06352f5edbbd3748f818b8c0a7c5262681), [`ba713faf`](https://github.com/neo4j/graphql/commit/ba713faf7da05c6f9031c83542dbc51bc1a0239e), [`801cdaea`](https://github.com/neo4j/graphql/commit/801cdaea608e83fa3ba9fffb56b4f93db88d149a), [`21a0c58c`](https://github.com/neo4j/graphql/commit/21a0c58c85c8368c70c6a83a428f0c20231557b4), [`4d62eea7`](https://github.com/neo4j/graphql/commit/4d62eea78fe4a2d72805697a0adcb0b21625e87e), [`0a49f56d`](https://github.com/neo4j/graphql/commit/0a49f56dbd45eb3ca69ceafce4ed308cdc1d6e90), [`28ffcf88`](https://github.com/neo4j/graphql/commit/28ffcf88d0b5026eb2f3cce756b762fc9d025811), [`0f52cf7e`](https://github.com/neo4j/graphql/commit/0f52cf7e360da1c9e68a8d63c81f1c35a66679f4), [`381c4061`](https://github.com/neo4j/graphql/commit/381c40610766f9eb6c938ddba424e44e3382f103), [`52f755b0`](https://github.com/neo4j/graphql/commit/52f755b0a5ecda6f8356a61e83591c7c00b1e30e), [`1c7987b5`](https://github.com/neo4j/graphql/commit/1c7987b51b10fed565d92e9d74256f986800c2cf), [`de4756ca`](https://github.com/neo4j/graphql/commit/de4756caa7b5d6baad4ea549e7a7652dabfa89fc)]: + * @neo4j/graphql@3.6.0 ## 3.5.1 ### Patch Changes -- Updated dependencies [30af948c] - - @neo4j/graphql@3.5.1 +* Updated dependencies [30af948c] + * @neo4j/graphql@3.5.1 diff --git a/packages/ogm/package.json b/packages/ogm/package.json index fdf1499a1a..f81a0b3396 100644 --- a/packages/ogm/package.json +++ b/packages/ogm/package.json @@ -1,6 +1,6 @@ { "name": "@neo4j/graphql-ogm", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.2", "description": "GraphQL powered OGM for Neo4j and Javascript applications", "keywords": [ "neo4j", @@ -38,7 +38,7 @@ "@graphql-codegen/plugin-helpers": "^5.0.0", "@graphql-codegen/typescript": "^4.0.0", "@graphql-tools/merge": "^9.0.0", - "@neo4j/graphql": "^4.0.0-beta.1", + "@neo4j/graphql": "^4.0.0-beta.2", "prettier": "^2.7.1" }, "peerDependencies": { @@ -46,12 +46,12 @@ "neo4j-driver": "^5.8.0" }, "devDependencies": { - "@types/jest": "29.5.3", + "@types/jest": "29.5.4", "@types/node": "18.15.1", "camelcase": "6.3.0", "graphql-tag": "2.12.6", - "jest": "29.6.2", - "jsonwebtoken": "9.0.1", + "jest": "29.6.4", + "jsonwebtoken": "9.0.2", "libnpmsearch": "6.0.2", "npm-run-all": "4.1.5", "pluralize": "8.0.0", diff --git a/packages/ogm/src/generate.test.ts b/packages/ogm/src/generate.test.ts index ef2db768fa..90d895dddd 100644 --- a/packages/ogm/src/generate.test.ts +++ b/packages/ogm/src/generate.test.ts @@ -1709,7 +1709,7 @@ describe("generate", () => { test("https://github.com/neo4j/graphql/issues/3539", async () => { const typeDefs = gql` type FAQ { - id: ID! @id + id: ID! @id @unique activated: Boolean! name: String! entries: [FAQEntry!]! @@ -1717,7 +1717,7 @@ describe("generate", () => { } type FAQEntry { - id: ID! @id + id: ID! @id @unique title: String! body: String! inFAQs: [FAQ!]! @relationship(type: "FAQ_ENTRY_IN_FAQ", properties: "FaqEntryInFaq", direction: OUT) diff --git a/packages/ogm/src/utils/filter-document.test.ts b/packages/ogm/src/utils/filter-document.test.ts index 8851006a3d..ad66d007e9 100644 --- a/packages/ogm/src/utils/filter-document.test.ts +++ b/packages/ogm/src/utils/filter-document.test.ts @@ -32,7 +32,7 @@ describe("filterDocument", () => { bikes: [Car!]! @relationship(type: "HAS_CAR", direction: OUT) } - type Car @query(read: false, aggregate: false) @mutation(operations: []), @subscription(operations: []) { + type Car @query(read: false, aggregate: false) @mutation(operations: []), @subscription(events: []) { name: String @filterable(byValue: false, byAggregate: false) engine: String @selectable(onRead: false, onAggregate: false) } @@ -43,7 +43,7 @@ describe("filterDocument", () => { model: String @selectable type: String @settable } - extend schema @query(read: false, aggregate: false) @mutation(operations: []) @subscription(operations: []) + extend schema @query(read: false, aggregate: false) @mutation(operations: []) @subscription(events: []) `; const filtered = filterDocument(initial); @@ -70,7 +70,7 @@ describe("filterDocument", () => { type: String } - extend schema @query(read: true, aggregate: true) @mutation(operations: [CREATE, UPDATE, DELETE]) @subscription(operations: [CREATE, UPDATE, DELETE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP])" + extend schema @query(read: true, aggregate: true) @mutation(operations: [CREATE, UPDATE, DELETE]) @subscription(events: [CREATED, UPDATED, DELETED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED])" `); }); }); diff --git a/packages/ogm/src/utils/filter-document.ts b/packages/ogm/src/utils/filter-document.ts index eaae4907b1..e09ac2cab4 100644 --- a/packages/ogm/src/utils/filter-document.ts +++ b/packages/ogm/src/utils/filter-document.ts @@ -43,7 +43,7 @@ export function filterDocument(typeDefs: Neo4jGraphQLConstructor["typeDefs"]): D const schemaExtension = ` extend schema @query(read: true, aggregate: true) @mutation(operations: [CREATE, UPDATE, DELETE]) - @subscription(operations: [CREATE, UPDATE, DELETE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP])`; + @subscription(events: [CREATED, UPDATED, DELETED, RELATIONSHIP_CREATED, RELATIONSHIP_DELETED])`; const merged = mergeTypeDefs( Array.isArray(typeDefs) ? (typeDefs as string[]).concat(schemaExtension) : [typeDefs as string, schemaExtension] ); diff --git a/packages/ogm/tests/issues/1130.test.ts b/packages/ogm/tests/issues/1130.test.ts index 32647417b7..b57c374071 100644 --- a/packages/ogm/tests/issues/1130.test.ts +++ b/packages/ogm/tests/issues/1130.test.ts @@ -29,7 +29,7 @@ describe("issues/1130", () => { # <-- Changing the name to "SicIndustry" works type SICIndustry { - code: ID! @id(autogenerate: false) + code: ID! @unique title: String! companies: [Company!]! @relationship(type: "CONDUCTS_BUSINESS_IN", direction: IN) } diff --git a/packages/ogm/tests/issues/3591.test.ts b/packages/ogm/tests/issues/3591.test.ts index ac1c533e39..42f6b1bbb9 100644 --- a/packages/ogm/tests/issues/3591.test.ts +++ b/packages/ogm/tests/issues/3591.test.ts @@ -22,7 +22,7 @@ import { generate, OGM } from "../../src"; describe("issues/3591", () => { test("should correctly generate types and ignore all the schema configuration directives", async () => { const typeDefs = ` - type User @query(aggregate: false) @mutation(operation: [CREATE]), @subscription(operation: [CREATE]) { + type User @query(aggregate: false) @mutation(operation: [CREATE]), @subscription(events: [CREATED]) { id: ID! @id company: [Company!]! @relationship(type: "WORKS_AT", direction: OUT) favoriteRestaurants: [Restaurant!]! @relationship(type: "FAVORITE_RESTAURANTS", direction: OUT) diff --git a/packages/package-tests/babel/package.json b/packages/package-tests/babel/package.json index e3bae5b5a3..3de01e34b7 100644 --- a/packages/package-tests/babel/package.json +++ b/packages/package-tests/babel/package.json @@ -13,8 +13,8 @@ "neo4j-driver": "^5.8.0" }, "devDependencies": { - "@babel/core": "7.22.10", + "@babel/core": "7.22.11", "@babel/node": "7.22.10", - "@babel/preset-env": "7.22.10" + "@babel/preset-env": "7.22.14" } } diff --git a/yarn.lock b/yarn.lock index 2216d76385..25f98f8b6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -99,21 +99,21 @@ __metadata: languageName: node linkType: hard -"@apollo/composition@npm:2.5.2": - version: 2.5.2 - resolution: "@apollo/composition@npm:2.5.2" +"@apollo/composition@npm:2.5.3": + version: 2.5.3 + resolution: "@apollo/composition@npm:2.5.3" dependencies: - "@apollo/federation-internals": 2.5.2 - "@apollo/query-graphs": 2.5.2 + "@apollo/federation-internals": 2.5.3 + "@apollo/query-graphs": 2.5.3 peerDependencies: graphql: ^16.5.0 - checksum: d2222e9bddca8195d371497fc0849f18343cfc274fd8a3d2fd4803a4759deb56e3cb50ee1625ab61debdbba18ed572aa5c43f9515fea7868e7183092f4471261 + checksum: 8b117c434e4f184df848fbaafb0ae4e4f4d24270d89c74298cef2787cbefd32b9058edbbc5c49af447a758f4bc585d1cdecd620d8bb6c31051df55624f0b22c7 languageName: node linkType: hard -"@apollo/federation-internals@npm:2.5.2": - version: 2.5.2 - resolution: "@apollo/federation-internals@npm:2.5.2" +"@apollo/federation-internals@npm:2.5.3": + version: 2.5.3 + resolution: "@apollo/federation-internals@npm:2.5.3" dependencies: "@types/uuid": ^9.0.0 chalk: ^4.1.0 @@ -121,7 +121,7 @@ __metadata: uuid: ^9.0.0 peerDependencies: graphql: ^16.5.0 - checksum: c9a8a521c7c37e334acbfff258005cf0f42a4128bc1b16a123a2013e553761dd77b514fa7b792bf7888e9d40d3a88b7bbb7eef9f158c58e9e215fd2eb1d42094 + checksum: bc3b90835f1e0908e515f63e3afd65795efb69a68a333063a522a88948ca52c6a73e339d7673d7d0ad7b43e7f94766872e5abcdb4e89ee6d7c0f167a27e5458c languageName: node linkType: hard @@ -154,13 +154,13 @@ __metadata: languageName: node linkType: hard -"@apollo/gateway@npm:2.5.2": - version: 2.5.2 - resolution: "@apollo/gateway@npm:2.5.2" +"@apollo/gateway@npm:2.5.3": + version: 2.5.3 + resolution: "@apollo/gateway@npm:2.5.3" dependencies: - "@apollo/composition": 2.5.2 - "@apollo/federation-internals": 2.5.2 - "@apollo/query-planner": 2.5.2 + "@apollo/composition": 2.5.3 + "@apollo/federation-internals": 2.5.3 + "@apollo/query-planner": 2.5.3 "@apollo/server-gateway-interface": ^1.1.0 "@apollo/usage-reporting-protobuf": ^4.1.0 "@apollo/utils.createhash": ^2.0.0 @@ -178,7 +178,7 @@ __metadata: node-fetch: ^2.6.7 peerDependencies: graphql: ^16.5.0 - checksum: c3dbad59d717781177fd253fe33bd09528c1870ffbb3007dc1f01d71d9f4b1d37e567e2f6d688c9b965320e8d232d6e13ccb1e8cc5c59db50f459752b6178ce7 + checksum: 45ff8772d9499e73fc9463cf9158a45dea20811730142474257b870c4917f9008b54cd023233cabe711156488cb40893f2f26223cb8ccb93f9870ee6cdcec36b languageName: node linkType: hard @@ -205,33 +205,33 @@ __metadata: languageName: node linkType: hard -"@apollo/query-graphs@npm:2.5.2": - version: 2.5.2 - resolution: "@apollo/query-graphs@npm:2.5.2" +"@apollo/query-graphs@npm:2.5.3": + version: 2.5.3 + resolution: "@apollo/query-graphs@npm:2.5.3" dependencies: - "@apollo/federation-internals": 2.5.2 + "@apollo/federation-internals": 2.5.3 deep-equal: ^2.0.5 ts-graphviz: ^1.5.4 uuid: ^9.0.0 peerDependencies: graphql: ^16.5.0 - checksum: 38951c649fca13352f20da7c96c89f155224ae1a2d57671432b6ef5b42fb896439bff38416e4457ed8863a3ff8fb596f0e8a1a25c1c9f36421f487abeb0b709d + checksum: 45b2761517805537a64dfae0a9ccddb12b3fdf412e66e9b56128e5eb1c6f347bc7182d490e04913e28ae2be8776ca4f64b038ffab7f0aa50d878ba3f4203d3fc languageName: node linkType: hard -"@apollo/query-planner@npm:2.5.2": - version: 2.5.2 - resolution: "@apollo/query-planner@npm:2.5.2" +"@apollo/query-planner@npm:2.5.3": + version: 2.5.3 + resolution: "@apollo/query-planner@npm:2.5.3" dependencies: - "@apollo/federation-internals": 2.5.2 - "@apollo/query-graphs": 2.5.2 + "@apollo/federation-internals": 2.5.3 + "@apollo/query-graphs": 2.5.3 "@apollo/utils.keyvaluecache": ^2.1.0 chalk: ^4.1.0 deep-equal: ^2.0.5 pretty-format: ^29.0.0 peerDependencies: graphql: ^16.5.0 - checksum: 563271fd8f77c4148327dc8433ed1d28c9cb5160e3bee423f265fddee553f65c9e1cbe2887501de21b5da0ec144391f211943f87dea5820ccca4a464a446b5c3 + checksum: 98bb2b1dd302de35b5460b5f92ebe9be90fd2d877fccaaa0902511f45792406676ff117c6871c77f7300e6d290ab67cee0ba83fc8e9f4f95d818bb52258ad11d languageName: node linkType: hard @@ -263,9 +263,9 @@ __metadata: languageName: node linkType: hard -"@apollo/server@npm:4.9.1, @apollo/server@npm:^4.7.0": - version: 4.9.1 - resolution: "@apollo/server@npm:4.9.1" +"@apollo/server@npm:4.9.3, @apollo/server@npm:^4.7.0": + version: 4.9.3 + resolution: "@apollo/server@npm:4.9.3" dependencies: "@apollo/cache-control-types": ^1.0.3 "@apollo/server-gateway-interface": ^1.1.1 @@ -295,19 +295,19 @@ __metadata: whatwg-mimetype: ^3.0.0 peerDependencies: graphql: ^16.6.0 - checksum: d5299acfc8f0519adb5aed59e067880bdfd2528353711be07c935d0038ef95e06eecfc58af473011d215c92659f1858ae06c26fe9f70f865383d8e5457e17be5 + checksum: 28537d7646669a5dc1302cfd75d8a9bf473459ee585c6b778d174628a2cfb3f89a5ac742eca7de2a779b6c9e3f30da509a8787a71227520d009ac190aa7a9207 languageName: node linkType: hard "@apollo/subgraph@npm:^2.2.3": - version: 2.5.2 - resolution: "@apollo/subgraph@npm:2.5.2" + version: 2.5.3 + resolution: "@apollo/subgraph@npm:2.5.3" dependencies: "@apollo/cache-control-types": ^1.0.2 - "@apollo/federation-internals": 2.5.2 + "@apollo/federation-internals": 2.5.3 peerDependencies: graphql: ^16.5.0 - checksum: 6c79135f053887dcbd4bdcef857cda02a6c033682ddb7db31d9d0402e0ed279754190c58014b4fa91ac696e60622dd39d562d1a1251a3aef59c49ab463457664 + checksum: b8c8175f086cece887a696f6b060dbf37b6d711d42b6d1ffa1b98dbe0391c9b44b6fac619cd325983d47d9c432b03ce1b67da63d20d044cfef4a871d904f8fe7 languageName: node linkType: hard @@ -468,12 +468,12 @@ __metadata: linkType: hard "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.22.10, @babel/code-frame@npm:^7.22.5": - version: 7.22.10 - resolution: "@babel/code-frame@npm:7.22.10" + version: 7.22.13 + resolution: "@babel/code-frame@npm:7.22.13" dependencies: - "@babel/highlight": ^7.22.10 + "@babel/highlight": ^7.22.13 chalk: ^2.4.2 - checksum: 89a06534ad19759da6203a71bad120b1d7b2ddc016c8e07d4c56b35dea25e7396c6da60a754e8532a86733092b131ae7f661dbe6ba5d165ea777555daa2ed3c9 + checksum: 22e342c8077c8b77eeb11f554ecca2ba14153f707b85294fcf6070b6f6150aae88a7b7436dd88d8c9289970585f3fe5b9b941c5aa3aa26a6d5a8ef3f292da058 languageName: node linkType: hard @@ -485,25 +485,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14.0": - version: 7.22.10 - resolution: "@babel/core@npm:7.22.10" + version: 7.22.11 + resolution: "@babel/core@npm:7.22.11" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.10 "@babel/generator": ^7.22.10 "@babel/helper-compilation-targets": ^7.22.10 "@babel/helper-module-transforms": ^7.22.9 - "@babel/helpers": ^7.22.10 - "@babel/parser": ^7.22.10 + "@babel/helpers": ^7.22.11 + "@babel/parser": ^7.22.11 "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.10 - "@babel/types": ^7.22.10 + "@babel/traverse": ^7.22.11 + "@babel/types": ^7.22.11 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.2 + json5: ^2.2.3 semver: ^6.3.1 - checksum: cc4efa09209fe1f733cf512e9e4bb50870b191ab2dee8014e34cd6e731f204e48476cc53b4bbd0825d4d342304d577ae43ff5fd8ab3896080673c343321acb32 + checksum: f258b2539ea2e5bfe55a708c2f3e1093a1b4744f12becc35abeb896037b66210de9a8ad6296a706046d5dc3a24e564362b73a9b814e5bfe500c8baab60c22d2e languageName: node linkType: hard @@ -542,8 +542,8 @@ __metadata: linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.18.6": - version: 7.22.10 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.10" + version: 7.22.11 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.11" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.5 @@ -556,7 +556,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 9683edbf73889abce183b06eac29524448aaab1dba7bdccdd6c26cf03e5ade3903b581b4d681da88fbff824fa117b840cc945bebf7db3c1f8c745f3c5a8a2595 + checksum: b7aeb22e29aba5327616328576363522b3b186918faeda605e300822af4a5f29416eb34b5bd825d07ab496550e271d02d7634f0022a62b5b8cbf0eb6389bc3fa languageName: node linkType: hard @@ -604,7 +604,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.22.9": +"@babel/helper-module-transforms@npm:^7.22.9": version: 7.22.9 resolution: "@babel/helper-module-transforms@npm:7.22.9" dependencies: @@ -696,34 +696,34 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/helpers@npm:7.22.10" +"@babel/helpers@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/helpers@npm:7.22.11" dependencies: "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.10 - "@babel/types": ^7.22.10 - checksum: 3b1219e362df390b6c5d94b75a53fc1c2eb42927ced0b8022d6a29b833a839696206b9bdad45b4805d05591df49fc16b6fb7db758c9c2ecfe99e3e94cb13020f + "@babel/traverse": ^7.22.11 + "@babel/types": ^7.22.11 + checksum: 93186544228b5e371486466ec3b86a77cce91beeff24a5670ca8ec46d50328f7700dab82d532351286e9d68624dc51d6d71589b051dd9535e44be077a43ec013 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/highlight@npm:7.22.10" +"@babel/highlight@npm:^7.22.13": + version: 7.22.13 + resolution: "@babel/highlight@npm:7.22.13" dependencies: "@babel/helper-validator-identifier": ^7.22.5 chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: f714a1e1a72dd9d72f6383f4f30fd342e21a8df32d984a4ea8f5eab691bb6ba6db2f8823d4b4cf135d98869e7a98925b81306aa32ee3c429f8cfa52c75889e1b + checksum: 7266d2bff8aa8fc78eb65b6e92a8211e12897a731126a282d2f9bb50d8fcaa4c1b02af2284f990ac7e3ab8d892d448a2cab8f5ed0ea8a90bce2c025b11ebe802 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.10, @babel/parser@npm:^7.22.5": - version: 7.22.10 - resolution: "@babel/parser@npm:7.22.10" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.11, @babel/parser@npm:^7.22.5": + version: 7.22.14 + resolution: "@babel/parser@npm:7.22.14" bin: parser: ./bin/babel-parser.js - checksum: af51567b7d3cdf523bc608eae057397486c7fa6c2e5753027c01fe5c36f0767b2d01ce3049b222841326cc5b8c7fda1d810ac1a01af0a97bb04679e2ef9f7049 + checksum: a2293971f0889726a3d5a35fcceedc71d2fa4c8d97f438fc348fe0cf7e739affc6e2665e4c6ddd4900714772e19bfd5d6feb967ca1f623b894c0099ecb148b52 languageName: node linkType: hard @@ -1053,15 +1053,15 @@ __metadata: linkType: hard "@babel/plugin-transform-modules-commonjs@npm:^7.0.0": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.22.5" + version: 7.22.11 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.22.11" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.22.9 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-simple-access": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2067aca8f6454d54ffcce69b02c457cfa61428e11372f6a1d99ff4fcfbb55c396ed2ca6ca886bf06c852e38c1a205b8095921b2364fd0243f3e66bc1dda61caa + checksum: c15ad7f1234a930cab214224bb85f6b3a3f301fa1d4d15bef193e5c11c614ce369551e5cbb708fde8d3f7e1cb84b05e9798a3647a11b56c3d67580e362a712d4 languageName: node linkType: hard @@ -1160,11 +1160,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.22.10 - resolution: "@babel/runtime@npm:7.22.10" + version: 7.22.11 + resolution: "@babel/runtime@npm:7.22.11" dependencies: regenerator-runtime: ^0.14.0 - checksum: 524d41517e68953dbc73a4f3616b8475e5813f64e28ba89ff5fca2c044d535c2ea1a3f310df1e5bb06162e1f0b401b5c4af73fe6e2519ca2450d9d8c44cf268d + checksum: a5cd6683a8fcdb8065cb1677f221e22f6c67ec8f15ad1d273b180b93ab3bd86c66da2c48f500d4e72d8d2cfa85ff4872a3f350e5aa3855630036af5da765c001 languageName: node linkType: hard @@ -1179,9 +1179,9 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.22.10": - version: 7.22.10 - resolution: "@babel/traverse@npm:7.22.10" +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/traverse@npm:7.22.11" dependencies: "@babel/code-frame": ^7.22.10 "@babel/generator": ^7.22.10 @@ -1189,22 +1189,22 @@ __metadata: "@babel/helper-function-name": ^7.22.5 "@babel/helper-hoist-variables": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.22.10 - "@babel/types": ^7.22.10 + "@babel/parser": ^7.22.11 + "@babel/types": ^7.22.11 debug: ^4.1.0 globals: ^11.1.0 - checksum: 9f7b358563bfb0f57ac4ed639f50e5c29a36b821a1ce1eea0c7db084f5b925e3275846d0de63bde01ca407c85d9804e0efbe370d92cd2baaafde3bd13b0f4cdb + checksum: 4ad62d548ca8b95dbf45bae16cc167428f174f3c837d55a5878b1f17bdbc8b384d6df741dc7c461b62c04d881cf25644d3ab885909ba46e3ac43224e2b15b504 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.22.10 - resolution: "@babel/types@npm:7.22.10" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.22.11 + resolution: "@babel/types@npm:7.22.11" dependencies: "@babel/helper-string-parser": ^7.22.5 "@babel/helper-validator-identifier": ^7.22.5 to-fast-properties: ^2.0.0 - checksum: 095c4f4b7503fa816e4094113f0ec2351ef96ff32012010b771693066ff628c7c664b21c6bd3fb93aeb46fe7c61f6b3a3c9e4ed0034d6a2481201c417371c8af + checksum: 431a6446896adb62c876d0fe75263835735d3c974aae05356a87eb55f087c20a777028cf08eadcace7993e058bbafe3b21ce2119363222c6cef9eedd7a204810 languageName: node linkType: hard @@ -1660,30 +1660,30 @@ __metadata: languageName: node linkType: hard -"@codemirror/commands@npm:6.2.4, @codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.2.1": - version: 6.2.4 - resolution: "@codemirror/commands@npm:6.2.4" +"@codemirror/commands@npm:6.2.5, @codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.2.1": + version: 6.2.5 + resolution: "@codemirror/commands@npm:6.2.5" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: 468895fa19ff0554181b698c81f850820de5c0289cab92c44392fb127286f09ca72b921d6ea4353b70b616a4fd0c3667d86b6f917202a3ad2e196eb7b581f7b6 + checksum: 6d373bcfd4337160243e1493c8703a8e367e208811742331679a6410a3645de36ae8a5664e11790fec521137b45f34d703e9292932a98c4de10139510f3f29a3 languageName: node linkType: hard -"@codemirror/lang-javascript@npm:6.1.9": - version: 6.1.9 - resolution: "@codemirror/lang-javascript@npm:6.1.9" +"@codemirror/lang-javascript@npm:6.2.1": + version: 6.2.1 + resolution: "@codemirror/lang-javascript@npm:6.2.1" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.6.0 "@codemirror/lint": ^6.0.0 "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 + "@codemirror/view": ^6.17.0 "@lezer/common": ^1.0.0 "@lezer/javascript": ^1.0.0 - checksum: 6c79b51c61d37b3f4dde6312df02183045c31f055e5cf8550b497f39798b823b4e380a641a2cfc97f3f26fd4e89194258d8ef741c42acd72b3f2e18257b427a5 + checksum: 3df38c4cced06195283a9a2a9365aaa7c8c1b157852b331bc3a118403f774bbba57d2a392de52f5e28d2b344a323bc0146bcf7c8ef8be2473f167d815e4a37cd languageName: node linkType: hard @@ -1702,24 +1702,24 @@ __metadata: linkType: hard "@codemirror/lint@npm:^6.0.0, @codemirror/lint@npm:^6.1.0": - version: 6.4.0 - resolution: "@codemirror/lint@npm:6.4.0" + version: 6.4.1 + resolution: "@codemirror/lint@npm:6.4.1" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 crelt: ^1.0.5 - checksum: ba15f7dd87afbceafaa0b68f94b0d53727e4aacca7a81a4ed3278706df5787fdf18cd3f0d807a136f902b2fc2296bf3490462fd543d1d4ced17a0d8c171820fd + checksum: ac8120ca96b5ef57abd2705b2620c15c7449b5056bca87053480e244c6772863e1537387a863cfb784f9f2af2c8b30be78a31660d96a815672059085beb51fd5 languageName: node linkType: hard "@codemirror/search@npm:^6.0.0, @codemirror/search@npm:^6.2.3": - version: 6.5.1 - resolution: "@codemirror/search@npm:6.5.1" + version: 6.5.2 + resolution: "@codemirror/search@npm:6.5.2" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 crelt: ^1.0.5 - checksum: 672515c20238f69ff5cd8b662128699178ba7e020fc44a8ed2b0dcc25d8d5f5579418865616dd8809317a408fb08b6001a442f0fb706a772250b4284d7437045 + checksum: bc535151277fda0a370ac496b9b0d5751fd91bd8e3eb29dafbfe6bf3125dc450a7e361ebc302f0ebc4193ac337bdf555ab3d5ec753dbb44452225618a5630dd3 languageName: node linkType: hard @@ -1730,14 +1730,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.9.0": - version: 6.16.0 - resolution: "@codemirror/view@npm:6.16.0" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.9.0": + version: 6.17.0 + resolution: "@codemirror/view@npm:6.17.0" dependencies: "@codemirror/state": ^6.1.4 - style-mod: ^4.0.0 + style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 54d412b5159716c8a1a9c46fa04ff083e68a663cb887e6e2a4ca86fe9c3930d5255200fe84c65620e0a442f62dc2c13df277bcd1d4eef2e11e3c4e124fcf9d38 + checksum: a4b3098b2821c6fd354c2a7fdee8be848d346be11d6159b8573d3d9004a8608cb92d52beb3482357682d795a974b9d3f9dd96cea23d705baf84c15cbed27fefb languageName: node linkType: hard @@ -2004,9 +2004,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.6.2 - resolution: "@eslint-community/regexpp@npm:4.6.2" - checksum: a3c341377b46b54fa228f455771b901d1a2717f95d47dcdf40199df30abc000ba020f747f114f08560d119e979d882a94cf46cfc51744544d54b00319c0f2724 + version: 4.8.0 + resolution: "@eslint-community/regexpp@npm:4.8.0" + checksum: 601e6d033d556e98e8c929905bef335f20d7389762812df4d0f709d9b4d2631610dda975fb272e23b5b68e24a163b3851b114c8080a0a19fb4c141a1eff6305b languageName: node linkType: hard @@ -2027,10 +2027,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:^8.47.0": - version: 8.47.0 - resolution: "@eslint/js@npm:8.47.0" - checksum: 0ef57fe27b6d4c305b33f3b2d2fee1ab397a619006f1d6f4ce5ee4746b8f03d11a4e098805a7d78601ca534cf72917d37f0ac19896c992a32e26299ecb9f9de1 +"@eslint/js@npm:8.48.0": + version: 8.48.0 + resolution: "@eslint/js@npm:8.48.0" + checksum: b2755f9c0ee810c886eba3c50dcacb184ba5a5cd1cbc01988ee506ad7340653cae0bd55f1d95c64b56dfc6d25c2caa7825335ffd2c50165bae9996fe0f396851 languageName: node linkType: hard @@ -2129,7 +2129,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/dom@npm:^1.0.1, @floating-ui/dom@npm:^1.3.0": +"@floating-ui/dom@npm:^1.0.1, @floating-ui/dom@npm:^1.5.1": version: 1.5.1 resolution: "@floating-ui/dom@npm:1.5.1" dependencies: @@ -2140,14 +2140,14 @@ __metadata: linkType: hard "@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.1": - version: 2.0.1 - resolution: "@floating-ui/react-dom@npm:2.0.1" + version: 2.0.2 + resolution: "@floating-ui/react-dom@npm:2.0.2" dependencies: - "@floating-ui/dom": ^1.3.0 + "@floating-ui/dom": ^1.5.1 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 00fef2cf69ac2b15952e47505fd9e23f6cc5c20a26adc707862932826d1682f3c30f83c9887abfc93574fdca2d34dd2fc00271527318b1db403549cd6bc9eb00 + checksum: 4797e1f7a19c1e531ed0d578ccdcbe58970743e5a480ba30424857fc953063f36d481f8c5d69248a8f1d521b739e94bf5e1ffb35506400dea3d914f166ed2f7f languageName: node linkType: hard @@ -2357,8 +2357,8 @@ __metadata: linkType: hard "@graphql-tools/batch-execute@npm:^9.0.1": - version: 9.0.1 - resolution: "@graphql-tools/batch-execute@npm:9.0.1" + version: 9.0.2 + resolution: "@graphql-tools/batch-execute@npm:9.0.2" dependencies: "@graphql-tools/utils": ^10.0.5 dataloader: ^2.2.2 @@ -2366,7 +2366,7 @@ __metadata: value-or-promise: ^1.0.12 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: c2bcf9dbcd3d08b2e04708fddad7f587677b62e189b0357b8a5495693e17b257b3022f5983d503966baaf32cbdc92a0a00dc95be7f5b6039357a31ffdde29a19 + checksum: 35da796959dbdb9bf59c913b2db25ab6db244243a5d3adb011f528841ac4c54f36d0731d2cb5b5ea8d0f2d28b61e34fe47a9afc905072848c1cc362193583f1b languageName: node linkType: hard @@ -2661,13 +2661,13 @@ __metadata: linkType: hard "@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.10 - resolution: "@humanwhocodes/config-array@npm:0.11.10" + version: 0.11.11 + resolution: "@humanwhocodes/config-array@npm:0.11.11" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.5 - checksum: 1b1302e2403d0e35bc43e66d67a2b36b0ad1119efc704b5faff68c41f791a052355b010fb2d27ef022670f550de24cd6d08d5ecf0821c16326b7dcd0ee5d5d8a + checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 languageName: node linkType: hard @@ -2756,50 +2756,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/console@npm:29.6.2" +"@jest/console@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/console@npm:29.6.4" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.6.2 - jest-util: ^29.6.2 + jest-message-util: ^29.6.3 + jest-util: ^29.6.3 slash: ^3.0.0 - checksum: 1198667bda0430770c3e9b92681c0ee9f8346394574071c633f306192ac5f08e12972d6a5fdf03eb0d441051c8439bce0f6f9f355dc60d98777a35328331ba2e + checksum: 1caf061a39266b86e96ca13358401839e4d930742cbaa9e87e79d7ce170a83195e52e5b2d22eb5aa9a949219b61a163a81e337ec98b8323d88d79853051df96c languageName: node linkType: hard -"@jest/core@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/core@npm:29.6.2" +"@jest/core@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/core@npm:29.6.4" dependencies: - "@jest/console": ^29.6.2 - "@jest/reporters": ^29.6.2 - "@jest/test-result": ^29.6.2 - "@jest/transform": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/console": ^29.6.4 + "@jest/reporters": ^29.6.4 + "@jest/test-result": ^29.6.4 + "@jest/transform": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^29.5.0 - jest-config: ^29.6.2 - jest-haste-map: ^29.6.2 - jest-message-util: ^29.6.2 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.2 - jest-resolve-dependencies: ^29.6.2 - jest-runner: ^29.6.2 - jest-runtime: ^29.6.2 - jest-snapshot: ^29.6.2 - jest-util: ^29.6.2 - jest-validate: ^29.6.2 - jest-watcher: ^29.6.2 + jest-changed-files: ^29.6.3 + jest-config: ^29.6.4 + jest-haste-map: ^29.6.4 + jest-message-util: ^29.6.3 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.6.4 + jest-resolve-dependencies: ^29.6.4 + jest-runner: ^29.6.4 + jest-runtime: ^29.6.4 + jest-snapshot: ^29.6.4 + jest-util: ^29.6.3 + jest-validate: ^29.6.3 + jest-watcher: ^29.6.4 micromatch: ^4.0.4 - pretty-format: ^29.6.2 + pretty-format: ^29.6.3 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -2807,76 +2807,76 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 6bbb3886430248c0092f275b1b946a701406732f7442c04e63e4ee2297c2ec02d8ceeec508a202e08128197699b2bcddbae2c2f74adb2cf30f2f0d7d94a7c2dc + checksum: 0f36532c909775814cb7d4310d61881beaefdec6229ef0b7493c6191dfca20ae5222120846ea5ef8cdeaa8cef265aae9cea8989dcab572d8daea9afd14247c7a languageName: node linkType: hard -"@jest/environment@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/environment@npm:29.6.2" +"@jest/environment@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/environment@npm:29.6.4" dependencies: - "@jest/fake-timers": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/fake-timers": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-mock: ^29.6.2 - checksum: c7de0e4c0d9166e02d0eb166574e05ec460e1db3b69d6476e63244edd52d7c917e6876af55fe723ff3086f52c0b1869dec60654054735a7a48c9d4ac43af2a25 + jest-mock: ^29.6.3 + checksum: 810d8f1fc26d293acfc44927bcb78adc58ed4ea580a64c8d94aa6c67239dcb149186bf25b94ff28b79de15253e0c877ad8d330feac205f185f3517593168510c languageName: node linkType: hard -"@jest/expect-utils@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/expect-utils@npm:29.6.2" +"@jest/expect-utils@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/expect-utils@npm:29.6.4" dependencies: - jest-get-type: ^29.4.3 - checksum: 0decf2009aa3735f9df469e78ce1721c2815e4278439887e0cf0321ca8979541a22515d114a59b2445a6cd70a074b09dc9c00b5e7b3b3feac5174b9c4a78b2e1 + jest-get-type: ^29.6.3 + checksum: a17059e02a4c0fca98e2abb7e9e58c70df3cd3d4ebcc6a960cb57c571726f7bd738c6cd008a9bf99770b77e92f7e21c75fe1f9ceec9b7a7710010f9340bb28ad languageName: node linkType: hard -"@jest/expect@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/expect@npm:29.6.2" +"@jest/expect@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/expect@npm:29.6.4" dependencies: - expect: ^29.6.2 - jest-snapshot: ^29.6.2 - checksum: bd2d88a4e7c5420079c239afef341ec53dc7e353816cd13acbb42631a31fd321fe58677bb43a4dba851028f4c7e31da7980314e9094cd5b348896cb6cd3d42b2 + expect: ^29.6.4 + jest-snapshot: ^29.6.4 + checksum: e9d7306a96e2f9f9f7a0d93d41850cbad987ebda951a5d9a63d3f5fb61da4c1e41adb54af7f7222e4a185454ecb17ddc77845e18001ee28ac114f7a7fe9e671d languageName: node linkType: hard -"@jest/fake-timers@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/fake-timers@npm:29.6.2" +"@jest/fake-timers@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/fake-timers@npm:29.6.4" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.6.2 - jest-mock: ^29.6.2 - jest-util: ^29.6.2 - checksum: 1abcda02f22d2ba32e178b7ab80a9180235a6c75ec9faef33324627b19a70dad64889a9ea49b8f07230e14a6e683b9120542c6d1d6b2ecaf937f4efde32dad88 + jest-message-util: ^29.6.3 + jest-mock: ^29.6.3 + jest-util: ^29.6.3 + checksum: 3f06d1090cbaaf781920fe59b10509ad86b587c401818a066ee1550101c6203e0718f0f83bbd2afa8bdf7b43eb280f89fb9f8c98886094e53ccabe5e64de9be1 languageName: node linkType: hard -"@jest/globals@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/globals@npm:29.6.2" +"@jest/globals@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/globals@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.2 - "@jest/expect": ^29.6.2 - "@jest/types": ^29.6.1 - jest-mock: ^29.6.2 - checksum: aa4a54f19cc025205bc696546940e1fe9c752c2d4d825852088aa76d44677ebba1ec66fabb78e615480cff23a06a70b5a3f893ab5163d901cdfa0d2267870b10 + "@jest/environment": ^29.6.4 + "@jest/expect": ^29.6.4 + "@jest/types": ^29.6.3 + jest-mock: ^29.6.3 + checksum: a41b18871a248151264668a38b13cb305f03db112bfd89ec44e858af0e79066e0b03d6b68c8baf1ec6c578be6fdb87519389c83438608b91471d17a5724858e0 languageName: node linkType: hard -"@jest/reporters@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/reporters@npm:29.6.2" +"@jest/reporters@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/reporters@npm:29.6.4" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.6.2 - "@jest/test-result": ^29.6.2 - "@jest/transform": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/console": ^29.6.4 + "@jest/test-result": ^29.6.4 + "@jest/transform": ^29.6.4 + "@jest/types": ^29.6.3 "@jridgewell/trace-mapping": ^0.3.18 "@types/node": "*" chalk: ^4.0.0 @@ -2885,13 +2885,13 @@ __metadata: glob: ^7.1.3 graceful-fs: ^4.2.9 istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^5.1.0 + istanbul-lib-instrument: ^6.0.0 istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.6.2 - jest-util: ^29.6.2 - jest-worker: ^29.6.2 + jest-message-util: ^29.6.3 + jest-util: ^29.6.3 + jest-worker: ^29.6.4 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -2901,88 +2901,88 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 7cf880d0730cee7d24ee96928003ef6946bf93423b0ae9a2edb53cae2c231b8ac50ec264f48a73744e3f11ca319cd414edacf99b2e7bf37cd72fe0b362090dd1 + checksum: 9ee0db497f3a826f535d3af0575ceb67984f9708bc6386450359517c212c67218ae98b8ea93ab05df2f920aed9c4166ef64209d66a09b7e30fc0077c91347ad0 languageName: node linkType: hard -"@jest/schemas@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/schemas@npm:29.6.0" +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: "@sinclair/typebox": ^0.27.8 - checksum: c00511c69cf89138a7d974404d3a5060af375b5a52b9c87215d91873129b382ca11c1ff25bd6d605951404bb381ddce5f8091004a61e76457da35db1f5c51365 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 languageName: node linkType: hard -"@jest/source-map@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/source-map@npm:29.6.0" +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" dependencies: "@jridgewell/trace-mapping": ^0.3.18 callsites: ^3.0.0 graceful-fs: ^4.2.9 - checksum: 9c6c40387410bb70b2fae8124287fc28f6bdd1b2d7f24348e8611e1bb638b404518228a4ce64a582365b589c536ae8e7ebab0126cef59a87874b71061d19783b + checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb languageName: node linkType: hard -"@jest/test-result@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/test-result@npm:29.6.2" +"@jest/test-result@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/test-result@npm:29.6.4" dependencies: - "@jest/console": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/console": ^29.6.4 + "@jest/types": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 8aff37f18c8d2df4d9f453d57ec018a6479eb697fabcf74b1ca06e34553da1d7a2b85580a290408ba0b02e58543263244a2cb065c7c7180c8d8180cc78444fbd + checksum: a13c82d29038e80059191a1a443240678c6934ea832fdabaec12b3ece397b6303022a064494a6bbd167a024f04e6b4d9ace1001300927ff70405ec9d854f1193 languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/test-sequencer@npm:29.6.2" +"@jest/test-sequencer@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/test-sequencer@npm:29.6.4" dependencies: - "@jest/test-result": ^29.6.2 + "@jest/test-result": ^29.6.4 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.2 + jest-haste-map: ^29.6.4 slash: ^3.0.0 - checksum: 12dc2577e45eeb98b85d1769846b7d6effa536907986ad3c4cbd014df9e24431a564cc8cd94603332e4b1f9bfb421371883efc6a5085b361a52425ffc2a52dc6 + checksum: 517fc66b74a87431a8a1429e4505d85bd09c11f2ba835e46c07c79911fbee23b89c01ec444c7c1d12d1b36f9eba60fcbbccc8e1bc1ae54a1a8b03b5f530ff81b languageName: node linkType: hard -"@jest/transform@npm:^29.6.2": - version: 29.6.2 - resolution: "@jest/transform@npm:29.6.2" +"@jest/transform@npm:^29.6.4": + version: 29.6.4 + resolution: "@jest/transform@npm:29.6.4" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@jridgewell/trace-mapping": ^0.3.18 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.2 - jest-regex-util: ^29.4.3 - jest-util: ^29.6.2 + jest-haste-map: ^29.6.4 + jest-regex-util: ^29.6.3 + jest-util: ^29.6.3 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.2 - checksum: ffb8c3c344cd48bedadec295d9c436737eccc39c1f0868aa9753b76397b33b2e5b121058af6f287ba6f2036181137e37df1212334bfa9d9a712986a4518cdc18 + checksum: 0341a200a0bb926fc67ab9aede91c7b4009458206495e92057e72a115c55da5fed117457e68c6ea821e24c58b55da75c6a7b0f272ed63c2693db583d689a3383 languageName: node linkType: hard -"@jest/types@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/types@npm:29.6.1" +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 89fc1ccf71a84fe0da643e0675b1cfe6a6f19ea72e935b2ab1dbdb56ec547e94433fb59b3536d3832a6e156c077865b7176fe9dae707dab9c3d2f9405ba6233c + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc languageName: node linkType: hard @@ -3086,12 +3086,12 @@ __metadata: linkType: hard "@lezer/javascript@npm:^1.0.0": - version: 1.4.5 - resolution: "@lezer/javascript@npm:1.4.5" + version: 1.4.7 + resolution: "@lezer/javascript@npm:1.4.7" dependencies: "@lezer/highlight": ^1.1.3 "@lezer/lr": ^1.3.0 - checksum: 1402075c58f7344a3024f75253c8dabc7049d51b65480af194f081044be21434261c8a4db4ccf42629a2bfc838104838c8d87a58693134ee5660c122b63b4b72 + checksum: 37c05793e0e45280fa5d7b845a3132a84596105d48b7d2c195abea0a198477ea6719b07d1c8967679e80fc466388151956901fd6962479c130ffda64a6d09591 languageName: node linkType: hard @@ -3386,21 +3386,21 @@ __metadata: languageName: node linkType: hard -"@neo4j-ndl/base@npm:1.10.1, @neo4j-ndl/base@npm:^1.10.1": - version: 1.10.1 - resolution: "@neo4j-ndl/base@npm:1.10.1" - checksum: 450317cfe2dd2e46ce0bc36610d1505e16c365941770d464f31aadfcf198ecc488b8f4de60243174781ab58c91296060998090d7080623a6f92e95fdec9d554b +"@neo4j-ndl/base@npm:1.10.2, @neo4j-ndl/base@npm:^1.10.2": + version: 1.10.2 + resolution: "@neo4j-ndl/base@npm:1.10.2" + checksum: 1efc17dad18d1ab4fa4b582dc26796e70b7f7823cc36982c8566e2af70220f6228c41e638837e2597aad47d133f913e6e0a1fb775a373d4a70cc7c022c9061b8 languageName: node linkType: hard -"@neo4j-ndl/react@npm:1.10.3": - version: 1.10.3 - resolution: "@neo4j-ndl/react@npm:1.10.3" +"@neo4j-ndl/react@npm:1.10.5": + version: 1.10.5 + resolution: "@neo4j-ndl/react@npm:1.10.5" dependencies: "@floating-ui/react": ^0.24.2 "@heroicons/react": 2.0.13 "@neo4j-cypher/react-codemirror": ^1.0.1 - "@neo4j-ndl/base": ^1.10.1 + "@neo4j-ndl/base": ^1.10.2 "@tanstack/react-table": ^8.9.3 classnames: ^2.3.1 date-fns: ^2.30.0 @@ -3418,7 +3418,7 @@ __metadata: peerDependencies: "@heroicons/react": 2.0.13 react: ">=16.8.0" - checksum: 6ac8b4acfbfa92d83f4dc3adc73062249cf25e6ec66fbd3a343feb6a987ee5839b5b951c86ad181953d26a31c36d8a0ece0ca236ae761e6534758c549bb9103e + checksum: a1be7a6ee7f756ed469654e4ab649560be481b556b3e931c9a5441165612e9bb9ab24aa203967de46e502671f75d850165b09f630ef46b2b300c732134080a59 languageName: node linkType: hard @@ -3433,20 +3433,20 @@ __metadata: version: 0.0.0-use.local resolution: "@neo4j/graphql-amqp-subscriptions-engine@workspace:packages/graphql-amqp-subscriptions-engine" dependencies: - "@apollo/server": 4.9.1 + "@apollo/server": 4.9.3 "@neo4j/graphql": ^4.0.0-beta.0 "@types/amqplib": 0.10.1 "@types/body-parser": 1.19.2 "@types/cors": 2.8.13 "@types/debug": 4.1.8 - "@types/jest": 29.5.3 + "@types/jest": 29.5.4 "@types/node": 18.15.1 amqplib: 0.10.3 body-parser: ^1.20.2 camelcase: 6.3.0 cors: ^2.8.5 graphql-ws: 5.14.0 - jest: 29.6.2 + jest: 29.6.4 neo4j-driver: 5.11.0 pluralize: 8.0.0 randomstring: 1.3.0 @@ -3467,13 +3467,13 @@ __metadata: "@graphql-codegen/plugin-helpers": ^5.0.0 "@graphql-codegen/typescript": ^4.0.0 "@graphql-tools/merge": ^9.0.0 - "@neo4j/graphql": ^4.0.0-beta.1 - "@types/jest": 29.5.3 + "@neo4j/graphql": ^4.0.0-beta.2 + "@types/jest": 29.5.4 "@types/node": 18.15.1 camelcase: 6.3.0 graphql-tag: 2.12.6 - jest: 29.6.2 - jsonwebtoken: 9.0.1 + jest: 29.6.4 + jsonwebtoken: 9.0.2 libnpmsearch: 6.0.2 npm-run-all: 4.1.5 pluralize: 8.0.0 @@ -3493,25 +3493,25 @@ __metadata: resolution: "@neo4j/graphql-toolbox@workspace:packages/graphql-toolbox" dependencies: "@codemirror/autocomplete": 6.9.0 - "@codemirror/commands": 6.2.4 - "@codemirror/lang-javascript": 6.1.9 + "@codemirror/commands": 6.2.5 + "@codemirror/lang-javascript": 6.2.1 "@codemirror/language": 6.9.0 "@dnd-kit/core": 6.0.8 "@dnd-kit/modifiers": 6.0.1 "@dnd-kit/sortable": 7.0.2 "@graphiql/react": 0.19.3 - "@neo4j-ndl/base": 1.10.1 - "@neo4j-ndl/react": 1.10.3 - "@neo4j/graphql": 4.0.0-beta.1 - "@neo4j/introspector": 2.0.0-beta.0 + "@neo4j-ndl/base": 1.10.2 + "@neo4j-ndl/react": 1.10.5 + "@neo4j/graphql": 4.0.0-beta.2 + "@neo4j/introspector": 2.0.0-beta.1 "@playwright/test": 1.37.1 "@tsconfig/create-react-app": 2.0.1 - "@types/codemirror": 5.60.8 + "@types/codemirror": 5.60.9 "@types/lodash.debounce": 4.0.7 - "@types/markdown-it": 13.0.0 + "@types/markdown-it": 13.0.1 "@types/prettier": 2.7.3 "@types/react-dom": 18.2.7 - "@types/webpack": 5.28.1 + "@types/webpack": 5.28.2 autoprefixer: 10.4.15 classnames: 2.3.2 cm6-graphql: 0.0.9 @@ -3529,13 +3529,13 @@ __metadata: html-inline-script-webpack-plugin: 3.2.1 html-webpack-inline-source-plugin: 0.0.10 html-webpack-plugin: 5.5.3 - jest: 29.6.2 - jest-environment-jsdom: 29.6.2 + jest: 29.6.4 + jest-environment-jsdom: 29.6.4 markdown-it: 13.0.1 neo4j-driver: 5.11.0 node-polyfill-webpack-plugin: 2.0.1 parse5: 7.1.2 - postcss: 8.4.28 + postcss: 8.4.29 postcss-loader: 7.3.3 prettier: 3.0.0 process: 0.11.10 @@ -3559,12 +3559,12 @@ __metadata: languageName: unknown linkType: soft -"@neo4j/graphql@4.0.0-beta.1, @neo4j/graphql@^4.0.0-beta.0, @neo4j/graphql@^4.0.0-beta.1, @neo4j/graphql@workspace:packages/graphql": +"@neo4j/graphql@4.0.0-beta.2, @neo4j/graphql@^4.0.0-beta.0, @neo4j/graphql@^4.0.0-beta.2, @neo4j/graphql@workspace:packages/graphql": version: 0.0.0-use.local resolution: "@neo4j/graphql@workspace:packages/graphql" dependencies: - "@apollo/gateway": 2.5.2 - "@apollo/server": 4.9.1 + "@apollo/gateway": 2.5.3 + "@apollo/server": 4.9.3 "@apollo/subgraph": ^2.2.3 "@faker-js/faker": 8.0.2 "@graphql-tools/merge": ^9.0.0 @@ -3574,12 +3574,12 @@ __metadata: "@neo4j/cypher-builder": ^1.0.0 "@types/deep-equal": 1.0.1 "@types/is-uuid": 1.0.0 - "@types/jest": 29.5.3 + "@types/jest": 29.5.4 "@types/jsonwebtoken": 9.0.2 "@types/node": 18.15.1 "@types/pluralize": 0.0.30 "@types/randomstring": 1.1.8 - "@types/semver": 7.5.0 + "@types/semver": 7.5.1 "@types/supertest": 2.0.12 "@types/ws": 8.5.5 camelcase: ^6.3.0 @@ -3594,7 +3594,7 @@ __metadata: graphql-tag: 2.12.6 graphql-ws: 5.14.0 is-uuid: 1.0.2 - jest: 29.6.2 + jest: 29.6.4 jest-extended: 4.0.1 jose: ^4.13.1 jwks-rsa: ^3.0.1 @@ -3627,17 +3627,17 @@ __metadata: languageName: node linkType: soft -"@neo4j/introspector@2.0.0-beta.0, @neo4j/introspector@workspace:packages/introspector": +"@neo4j/introspector@2.0.0-beta.1, @neo4j/introspector@workspace:packages/introspector": version: 0.0.0-use.local resolution: "@neo4j/introspector@workspace:packages/introspector" dependencies: - "@neo4j/graphql": ^4.0.0-beta.0 - "@types/jest": 29.5.3 + "@neo4j/graphql": ^4.0.0-beta.2 + "@types/jest": 29.5.4 "@types/node": 18.15.1 "@types/pluralize": 0.0.30 camelcase: ^6.3.0 debug: ^4.3.4 - jest: 29.6.2 + jest: 29.6.4 pluralize: ^8.0.0 ts-jest: 29.1.1 typescript: 5.1.6 @@ -4412,90 +4412,106 @@ __metadata: languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-android-arm64@npm:2.2.0" +"@parcel/watcher-android-arm64@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-android-arm64@npm:2.3.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-darwin-arm64@npm:2.2.0" +"@parcel/watcher-darwin-arm64@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.3.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-darwin-x64@npm:2.2.0" +"@parcel/watcher-darwin-x64@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.3.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.2.0" +"@parcel/watcher-freebsd-x64@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.3.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.3.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.2.0" +"@parcel/watcher-linux-arm64-glibc@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.3.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.2.0" +"@parcel/watcher-linux-arm64-musl@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.3.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.2.0" +"@parcel/watcher-linux-x64-glibc@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.3.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.2.0" +"@parcel/watcher-linux-x64-musl@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.3.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-win32-arm64@npm:2.2.0" +"@parcel/watcher-win32-arm64@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.3.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.2.0": - version: 2.2.0 - resolution: "@parcel/watcher-win32-x64@npm:2.2.0" +"@parcel/watcher-win32-ia32@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.3.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.3.0": + version: 2.3.0 + resolution: "@parcel/watcher-win32-x64@npm:2.3.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@parcel/watcher@npm:^2.0.7": - version: 2.2.0 - resolution: "@parcel/watcher@npm:2.2.0" - dependencies: - "@parcel/watcher-android-arm64": 2.2.0 - "@parcel/watcher-darwin-arm64": 2.2.0 - "@parcel/watcher-darwin-x64": 2.2.0 - "@parcel/watcher-linux-arm-glibc": 2.2.0 - "@parcel/watcher-linux-arm64-glibc": 2.2.0 - "@parcel/watcher-linux-arm64-musl": 2.2.0 - "@parcel/watcher-linux-x64-glibc": 2.2.0 - "@parcel/watcher-linux-x64-musl": 2.2.0 - "@parcel/watcher-win32-arm64": 2.2.0 - "@parcel/watcher-win32-x64": 2.2.0 + version: 2.3.0 + resolution: "@parcel/watcher@npm:2.3.0" + dependencies: + "@parcel/watcher-android-arm64": 2.3.0 + "@parcel/watcher-darwin-arm64": 2.3.0 + "@parcel/watcher-darwin-x64": 2.3.0 + "@parcel/watcher-freebsd-x64": 2.3.0 + "@parcel/watcher-linux-arm-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-musl": 2.3.0 + "@parcel/watcher-linux-x64-glibc": 2.3.0 + "@parcel/watcher-linux-x64-musl": 2.3.0 + "@parcel/watcher-win32-arm64": 2.3.0 + "@parcel/watcher-win32-ia32": 2.3.0 + "@parcel/watcher-win32-x64": 2.3.0 detect-libc: ^1.0.3 is-glob: ^4.0.3 micromatch: ^4.0.5 @@ -4508,6 +4524,8 @@ __metadata: optional: true "@parcel/watcher-darwin-x64": optional: true + "@parcel/watcher-freebsd-x64": + optional: true "@parcel/watcher-linux-arm-glibc": optional: true "@parcel/watcher-linux-arm64-glibc": @@ -4520,9 +4538,11 @@ __metadata: optional: true "@parcel/watcher-win32-arm64": optional: true + "@parcel/watcher-win32-ia32": + optional: true "@parcel/watcher-win32-x64": optional: true - checksum: 40dd90025b441e77719c8a052add5ff10e7ff1e8234bc9dfa74be14f1b09a1f4a3f4ee38775c9c64569f2f55ee5db987c55786c0832a5aa10a9569ad22fd67ea + checksum: 12f494998dbae363cc9c48b49f7e09589c179e84133e3b6cd0c087573a7dc70b3adec458f95b39e3b8e4d9c93cff770ce15b1d2452d6741a5047f1ca90485ded languageName: node linkType: hard @@ -6749,90 +6769,91 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-darwin-arm64@npm:1.3.78" +"@swc/core-darwin-arm64@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-darwin-arm64@npm:1.3.81" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-darwin-x64@npm:1.3.78" +"@swc/core-darwin-x64@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-darwin-x64@npm:1.3.81" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.78" +"@swc/core-linux-arm-gnueabihf@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.81" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.78" +"@swc/core-linux-arm64-gnu@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.81" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.78" +"@swc/core-linux-arm64-musl@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.81" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.78" +"@swc/core-linux-x64-gnu@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.81" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-linux-x64-musl@npm:1.3.78" +"@swc/core-linux-x64-musl@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-linux-x64-musl@npm:1.3.81" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.78" +"@swc/core-win32-arm64-msvc@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.81" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.78" +"@swc/core-win32-ia32-msvc@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.81" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.78": - version: 1.3.78 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.78" +"@swc/core-win32-x64-msvc@npm:1.3.81": + version: 1.3.81 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.81" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.36": - version: 1.3.78 - resolution: "@swc/core@npm:1.3.78" - dependencies: - "@swc/core-darwin-arm64": 1.3.78 - "@swc/core-darwin-x64": 1.3.78 - "@swc/core-linux-arm-gnueabihf": 1.3.78 - "@swc/core-linux-arm64-gnu": 1.3.78 - "@swc/core-linux-arm64-musl": 1.3.78 - "@swc/core-linux-x64-gnu": 1.3.78 - "@swc/core-linux-x64-musl": 1.3.78 - "@swc/core-win32-arm64-msvc": 1.3.78 - "@swc/core-win32-ia32-msvc": 1.3.78 - "@swc/core-win32-x64-msvc": 1.3.78 + version: 1.3.81 + resolution: "@swc/core@npm:1.3.81" + dependencies: + "@swc/core-darwin-arm64": 1.3.81 + "@swc/core-darwin-x64": 1.3.81 + "@swc/core-linux-arm-gnueabihf": 1.3.81 + "@swc/core-linux-arm64-gnu": 1.3.81 + "@swc/core-linux-arm64-musl": 1.3.81 + "@swc/core-linux-x64-gnu": 1.3.81 + "@swc/core-linux-x64-musl": 1.3.81 + "@swc/core-win32-arm64-msvc": 1.3.81 + "@swc/core-win32-ia32-msvc": 1.3.81 + "@swc/core-win32-x64-msvc": 1.3.81 + "@swc/types": ^0.1.4 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -6859,7 +6880,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: b7494c4ca9a2e968cd00430c9dbb5cc4f0c3dd3baaf66d129185c5a8816caf6424a2da8e0f181ed94e7c0c39f76046ee995d6c5ec08198d5f5d6f60735ffb1ab + checksum: 2d1f97294ab923dc15b0596ea792659cef72e6a35addf4d978cd1d6d99f2dc2ae3a86ffd0e31a9ba98c58e5260a819368587018658fa423a0d64cd2599c28d45 languageName: node linkType: hard @@ -6882,6 +6903,13 @@ __metadata: languageName: node linkType: hard +"@swc/types@npm:^0.1.4": + version: 0.1.4 + resolution: "@swc/types@npm:0.1.4" + checksum: 9b09de7dca8e4b19bfb43f9e332c771855158cb761d26000807fe858447ecbc5342a6c257b26d9aa5497f7138fc58913693e2bee222e5042e0e8f57c2979ae66 + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^1.1.2": version: 1.1.2 resolution: "@szmarczak/http-timer@npm:1.1.2" @@ -7084,12 +7112,12 @@ __metadata: languageName: node linkType: hard -"@types/codemirror@npm:5.60.8, @types/codemirror@npm:^5.60.8": - version: 5.60.8 - resolution: "@types/codemirror@npm:5.60.8" +"@types/codemirror@npm:5.60.9, @types/codemirror@npm:^5.60.8": + version: 5.60.9 + resolution: "@types/codemirror@npm:5.60.9" dependencies: "@types/tern": "*" - checksum: bc3a63eab0308b3ef5ed2ca22afb7f1c0b8acde6477e1d569df7e93f3fe4f78754d28a3e081c72931259fe1bf906a319b54bcdeba74600b989e5558d32478496 + checksum: 89da80a8d5c904f573289769098ad7721a4b58e056c1d08168b967bcfb63e30433d9d0bee0c43ff4b6679b0b7b87cfe942cc3f250ca0365ee244c9fb68ac9a70 languageName: node linkType: hard @@ -7172,14 +7200,14 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.30, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.35 - resolution: "@types/express-serve-static-core@npm:4.17.35" + version: 4.17.36 + resolution: "@types/express-serve-static-core@npm:4.17.36" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" "@types/send": "*" - checksum: cc8995d10c6feda475ec1b3a0e69eb0f35f21ab6b49129ad5c6f279e0bc5de8175bc04ec51304cb79a43eec3ed2f5a1e01472eb6d5f827b8c35c6ca8ad24eb6e + checksum: 410b13cbd663f18c0f8729e7f2ff54d960d96de76ebbae7cadb612972f85cc66c54051e00d32f11aa230c0a683d81a6d6fc7f7e4e383a95c0801494c517f36e1 languageName: node linkType: hard @@ -7284,13 +7312,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:29.5.3": - version: 29.5.3 - resolution: "@types/jest@npm:29.5.3" +"@types/jest@npm:29.5.4": + version: 29.5.4 + resolution: "@types/jest@npm:29.5.4" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: e36bb92e0b9e5ea7d6f8832baa42f087fc1697f6cd30ec309a07ea4c268e06ec460f1f0cfd2581daf5eff5763475190ec1ad8ac6520c49ccfe4f5c0a48bfa676 + checksum: 38ed5942f44336452efd0f071eab60aaa57cd8d46530348d0a3aa5a691dcbf1366c4ca8f6ee8364efb45b4413bfefae443e5d4f469246a472a03b21ac11cd4ed languageName: node linkType: hard @@ -7345,9 +7373,9 @@ __metadata: linkType: hard "@types/linkify-it@npm:*": - version: 3.0.2 - resolution: "@types/linkify-it@npm:3.0.2" - checksum: dff8f10fafb885422474e456596f12d518ec4cdd6c33cca7a08e7c86b912d301ed91cf5a7613e148c45a12600dc9ab3d85ad16d5b48dc1aaeda151a68f16b536 + version: 3.0.3 + resolution: "@types/linkify-it@npm:3.0.3" + checksum: a734becc4e7476833b0e6951ec133c006a34809639c722d3e28b7cf88f5f6ccbb433f195788be5e56209b1e9e6e0778879291dd2db401acee3bb585c44dcc329 languageName: node linkType: hard @@ -7374,13 +7402,13 @@ __metadata: languageName: node linkType: hard -"@types/markdown-it@npm:13.0.0": - version: 13.0.0 - resolution: "@types/markdown-it@npm:13.0.0" +"@types/markdown-it@npm:13.0.1": + version: 13.0.1 + resolution: "@types/markdown-it@npm:13.0.1" dependencies: "@types/linkify-it": "*" "@types/mdurl": "*" - checksum: 7bcf45d0a1c2bc2c28f91460af571b9e8a195d4983cda809af04bf1d400f98902c71849b7cb8c036e35a3be7fa2483117d4faeab24a7de059e04be3e9f641aff + checksum: 184d383ac21903a9e6be1639cde2b0cc082d0366b423fd8a69d0f37d9d1d36338f66611226ba4ef1da6148f370a62e08f688e8147ead43d429d6ff213c38c062 languageName: node linkType: hard @@ -7430,9 +7458,9 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.5.0 - resolution: "@types/node@npm:20.5.0" - checksum: 659bc5fc93b5c02bd88ca4bfae4f6b9dc307d45884d1dd9d69df85819a9943cdc00cd3c87eec3048866df6a67f52297f74d170e47a44f61edb3e8f770d94e85e + version: 20.5.7 + resolution: "@types/node@npm:20.5.7" + checksum: fc284c8e16ddc04569730d58e87eae349eb1c3dd9020cb79a1862d9d9add6f04e7367a236f3252db8db2572f90278e250f4cd43d27d264972b54394eaba1ed76 languageName: node linkType: hard @@ -7493,9 +7521,9 @@ __metadata: linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.9.8 + resolution: "@types/qs@npm:6.9.8" + checksum: c28e07d00d07970e5134c6eed184a0189b8a4649e28fdf36d9117fe671c067a44820890de6bdecef18217647a95e9c6aebdaaae69f5fe4b0bec9345db885f77e languageName: node linkType: hard @@ -7532,13 +7560,13 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 18.2.20 - resolution: "@types/react@npm:18.2.20" + version: 18.2.21 + resolution: "@types/react@npm:18.2.21" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 30f699c60e5e4bfef273ce64d320651cdd60f5c6a08361c6c7eca8cebcccda1ac953d2ee57c9f321b5ae87f8a62c72b6d35ca42df0e261d337849952daab2141 + checksum: ffed203bfe7aad772b8286f7953305c9181ac3a8f27d3f5400fbbc2a8e27ca8e5bbff818ee014f39ca0d19d2b3bb154e5bdbec7e232c6f80b59069375aa78349 languageName: node linkType: hard @@ -7572,10 +7600,10 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:7.5.0, @types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": - version: 7.5.0 - resolution: "@types/semver@npm:7.5.0" - checksum: 0a64b9b9c7424d9a467658b18dd70d1d781c2d6f033096a6e05762d20ebbad23c1b69b0083b0484722aabf35640b78ccc3de26368bcae1129c87e9df028a22e2 +"@types/semver@npm:7.5.1, @types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": + version: 7.5.1 + resolution: "@types/semver@npm:7.5.1" + checksum: 2fffe938c7ac168711f245a16e1856a3578d77161ca17e29a05c3e02c7be3e9c5beefa29a3350f6c1bd982fb70aa28cc52e4845eb7d36246bcdc0377170d584d languageName: node linkType: hard @@ -7661,16 +7689,16 @@ __metadata: linkType: hard "@types/unist@npm:^2": - version: 2.0.7 - resolution: "@types/unist@npm:2.0.7" - checksum: b97a219554e83431f19a93ff113306bf0512909292815e8f32964e47d041c505af1aaa2a381c23e137c4c0b962fad58d4ce9c5c3256642921a466be43c1fc715 + version: 2.0.8 + resolution: "@types/unist@npm:2.0.8" + checksum: f4852d10a6752dc70df363917ef74453e5d2fd42824c0f6d09d19d530618e1402193977b1207366af4415aaec81d4e262c64d00345402020c4ca179216e553c7 languageName: node linkType: hard "@types/uuid@npm:^9.0.0": - version: 9.0.2 - resolution: "@types/uuid@npm:9.0.2" - checksum: 1754bcf3444e1e3aeadd6e774fc328eb53bc956665e2e8fb6ec127aa8e1f43d9a224c3d22a9a6233dca8dd81a12dc7fed4d84b8876dd5ec82d40f574f7ff8b68 + version: 9.0.3 + resolution: "@types/uuid@npm:9.0.3" + checksum: 3dde198defd71c067dd14b3050a8fe6d1ead5fe94ec318472e2c30a399d13f18941fe66cffabdcac7267177c9de2f975fdee6f0cc87cde610a2578e1ce4cc3af languageName: node linkType: hard @@ -7681,14 +7709,14 @@ __metadata: languageName: node linkType: hard -"@types/webpack@npm:5.28.1": - version: 5.28.1 - resolution: "@types/webpack@npm:5.28.1" +"@types/webpack@npm:5.28.2": + version: 5.28.2 + resolution: "@types/webpack@npm:5.28.2" dependencies: "@types/node": "*" tapable: ^2.2.0 webpack: ^5 - checksum: 9f9bfe041382acfab36015f95011f6539705ba116fd9b3b8d7599a6396d996b7efcdb71947dba6d24a1a1bf397d15fdfb3c50d2f73e0aa5366a76198d5ec98b3 + checksum: 0b147aaaaa8992417a5ed65af83eb0df9b5247c38ab482f3c844495935a29c474cb21bc865ca36052c353034f40d14c8d232f0c831fdc1a6956baa985d7b1135 languageName: node linkType: hard @@ -7717,15 +7745,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.4.0" +"@typescript-eslint/eslint-plugin@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.5.0" dependencies: "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.4.0 - "@typescript-eslint/type-utils": 6.4.0 - "@typescript-eslint/utils": 6.4.0 - "@typescript-eslint/visitor-keys": 6.4.0 + "@typescript-eslint/scope-manager": 6.5.0 + "@typescript-eslint/type-utils": 6.5.0 + "@typescript-eslint/utils": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.4 @@ -7738,25 +7766,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: d59e88228a4088f3dcaa614103eefa7a0c57315ed79ee1c48afd9817ad013522aa9a9f987e90e1fd7dccc0bbb03ed23e4df6f5ea5cceef8856db33c78ea13d53 + checksum: d81525c9a081186ec1ae7d957972065d50bae8fe4b3de111e573adc7267bb830baaec8f1ae47d3b937984ac34324bacc3951868b7986d4f9974bbe480f2261c0 languageName: node linkType: hard -"@typescript-eslint/parser@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/parser@npm:6.4.0" +"@typescript-eslint/parser@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/parser@npm:6.5.0" dependencies: - "@typescript-eslint/scope-manager": 6.4.0 - "@typescript-eslint/types": 6.4.0 - "@typescript-eslint/typescript-estree": 6.4.0 - "@typescript-eslint/visitor-keys": 6.4.0 + "@typescript-eslint/scope-manager": 6.5.0 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/typescript-estree": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 36c8dbeacfc03af9c5a4a0f065861ac6f3747fc64be582a32b0b084de5b5247cef086a0c0052291b97145e0ea8f82acbec452dd927b7b7a1917d56381d59a17c + checksum: e9a70886ec2660aee5c77cdff67ba11651eb855b7ecd3ad1e70837fce997d6e6db9dfe1e1eab46a9b2147cbc034ae9c109951f3bc24ce54e78cae669b6bc9c95 languageName: node linkType: hard @@ -7770,22 +7798,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/scope-manager@npm:6.4.0" +"@typescript-eslint/scope-manager@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/scope-manager@npm:6.5.0" dependencies: - "@typescript-eslint/types": 6.4.0 - "@typescript-eslint/visitor-keys": 6.4.0 - checksum: 19406eac3a1899f77eb7c3aa52577e2146075e1318c6eb34d220678afa167832b89c90860714f33b99e107544b48f6970594ca4bcf48c5ede8f2a14a0795ba33 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 + checksum: 30d78143f68e07d6bd15a147f64cc16830f8a8c8409b37aa7c7d205d7585f3648ec1c5365b3f177b7561971b407f773f6dba83b3b78fa63091045f2d6bbc6b9f languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/type-utils@npm:6.4.0" +"@typescript-eslint/type-utils@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/type-utils@npm:6.5.0" dependencies: - "@typescript-eslint/typescript-estree": 6.4.0 - "@typescript-eslint/utils": 6.4.0 + "@typescript-eslint/typescript-estree": 6.5.0 + "@typescript-eslint/utils": 6.5.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -7793,7 +7821,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 7930d2ffdc844a5b706d48ae3e4584882f7f0c06d581a3b06bc280a351c55974b16dbb73f1842f7389f04b80c2cfaf867edd2f261b699804d8a4fea9c20b3869 + checksum: 80b9e5099f5bdb05348ea8664c0a5084efc851de43ef6c1997041e1f07e9cc34ac874cc9e8afb317c887513d657e2583ad360e3d57feaab775bde0acc1807982 languageName: node linkType: hard @@ -7804,10 +7832,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/types@npm:6.4.0" - checksum: 85b293ad1559dbf8103b2c4cfd0db11c3d9c970d502e2c13d4b1d35e420567042d7077a716d2b4e5113286314d5260f378f242a6dd22ad4b94b4aa69c5f79223 +"@typescript-eslint/types@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/types@npm:6.5.0" + checksum: 950ec16991d71494d10cb752535bbc4395295e3f03a716d53ec55bbb0aaff487aa774cc5002f775ffcc80b9f0e16ac53ecebf7cac1444ca4f7a847b0859ffbfb languageName: node linkType: hard @@ -7829,12 +7857,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.4.0" +"@typescript-eslint/typescript-estree@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.5.0" dependencies: - "@typescript-eslint/types": 6.4.0 - "@typescript-eslint/visitor-keys": 6.4.0 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -7843,24 +7871,24 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a8db3896550515d0adf140ee115527b409916c4a14ac1f45b5623d130a27ae2d08a1ac906ceda440b01167c88846e2b91ca2025f3d718bff389948f66990c1e7 + checksum: 05717fa1f2609fa5669803191cf309a379c815aaf4fff6850f40560eec8749759c36b288f05cecffd5c1d0be8de1fe414ecfee6ecf99b6ae521baa48c8b58455 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/utils@npm:6.4.0" +"@typescript-eslint/utils@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/utils@npm:6.5.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 "@types/json-schema": ^7.0.12 "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.4.0 - "@typescript-eslint/types": 6.4.0 - "@typescript-eslint/typescript-estree": 6.4.0 + "@typescript-eslint/scope-manager": 6.5.0 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/typescript-estree": 6.5.0 semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: abc55382c601c7ed298076548d2df78f15b07ed6830086db6ce1b82d461f0a190ee103a804690ac9205cdca9f373a864e1dd3e20012e9d103f3137963e0aa5ea + checksum: 58a82213c8a7bac97a6538b9845c1de5c5692fbf72548f95ed5e044a222608590bcafbb9eacba92a8c4e9eb3e5d0a2fd553eae0d6694ed2d6152aed4dabf9480 languageName: node linkType: hard @@ -7892,13 +7920,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.4.0": - version: 6.4.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.4.0" +"@typescript-eslint/visitor-keys@npm:6.5.0": + version: 6.5.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.5.0" dependencies: - "@typescript-eslint/types": 6.4.0 + "@typescript-eslint/types": 6.5.0 eslint-visitor-keys: ^3.4.1 - checksum: 42eb614b9c0a49b6929e093757d772fd27fe5dda9c75f4c7820d1710012c8257eea9bd4f1c4173e2265a8a9ad86cefc1a21869893e7304f3b29b94fa1f987554 + checksum: 768a02dd0d8aae45708646bb0c51e67da09e71dc101bb0a0e55d7e0c8eadfea2f531acd3035d1ec34bf2380b66188f3fc47c6bef0201eae36b2dcc48d1934442 languageName: node linkType: hard @@ -8608,7 +8636,7 @@ __metadata: "@apollo/federation-subgraph-compatibility": 1.2.2 "@apollo/server": ^4.7.0 "@graphql-tools/wrap": ^10.0.0 - "@neo4j/graphql": ^4.0.0-beta.1 + "@neo4j/graphql": ^4.0.0-beta.2 fork-ts-checker-webpack-plugin: 8.0.0 graphql: 16.8.0 graphql-tag: ^2.12.6 @@ -8766,15 +8794,15 @@ __metadata: linkType: hard "array.prototype.findlastindex@npm:^1.2.2": - version: 1.2.2 - resolution: "array.prototype.findlastindex@npm:1.2.2" + version: 1.2.3 + resolution: "array.prototype.findlastindex@npm:1.2.3" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.1.3 - checksum: 8a166359f69a2a751c843f26b9c8cd03d0dc396a92cdcb85f4126b5f1cecdae5b2c0c616a71ea8aff026bde68165b44950b3664404bb73db0673e288495ba264 + get-intrinsic: ^1.2.1 + checksum: 31f35d7b370c84db56484618132041a9af401b338f51899c2e78ef7690fbba5909ee7ca3c59a7192085b328cc0c68c6fd1f6d1553db01a689a589ae510f3966e languageName: node linkType: hard @@ -9139,20 +9167,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.6.2": - version: 29.6.2 - resolution: "babel-jest@npm:29.6.2" +"babel-jest@npm:^29.6.4": + version: 29.6.4 + resolution: "babel-jest@npm:29.6.4" dependencies: - "@jest/transform": ^29.6.2 + "@jest/transform": ^29.6.4 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.5.0 + babel-preset-jest: ^29.6.3 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: 3936b5d6ed6f08670c830ed919e38a4a593d0643b8e30fdeb16f4588b262ea5255fb96fd1849c02fba0b082ecfa4e788ce9a128ad1b9e654d46aac09c3a55504 + checksum: c574f1805ab6b51a7d0f5a028aad19eec4634be81e66e6f4631b79b34d8ea05dfb53629f3686c77345163872730aa0408c9e5937ed85f846984228f7ab5e5d96 languageName: node linkType: hard @@ -9169,15 +9197,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-plugin-jest-hoist@npm:29.5.0" +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + checksum: 51250f22815a7318f17214a9d44650ba89551e6d4f47a2dc259128428324b52f5a73979d010cefd921fd5a720d8c1d55ad74ff601cd94c7bd44d5f6292fde2d1 languageName: node linkType: hard @@ -9258,15 +9286,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-preset-jest@npm:29.5.0" +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" dependencies: - babel-plugin-jest-hoist: ^29.5.0 + babel-plugin-jest-hoist: ^29.6.3 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb languageName: node linkType: hard @@ -9984,9 +10012,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001517, caniuse-lite@npm:^1.0.30001520": - version: 1.0.30001521 - resolution: "caniuse-lite@npm:1.0.30001521" - checksum: be2a2b2cd3be03401887aaa31b89f3e7c6230289e6ef704e224268389cc136480fca502ac9e5001a65ff1e50459d3d95f8c4b2d39f878ab9843af3d6f372c8bb + version: 1.0.30001525 + resolution: "caniuse-lite@npm:1.0.30001525" + checksum: a0d190c185b8e1220dbc72e42f310633059aa175ca3396eb781b249ac3da6c62b30cb8efc5fa24d632cb938f58d90b0c7772d1c9942b6643cf418c27c2cb8632 languageName: node linkType: hard @@ -10515,9 +10543,9 @@ __metadata: linkType: hard "codemirror@npm:^5.65.3": - version: 5.65.14 - resolution: "codemirror@npm:5.65.14" - checksum: aa123819015f6104fb1a6300c254ecfc891e7ce66839674dbd1505c19b3117110a13249773f16364d1cfe5daf9172d3fe16920d511f4e79721c4da4ec34bc5f4 + version: 5.65.15 + resolution: "codemirror@npm:5.65.15" + checksum: 30e0cff9bfb2265b94fa6766e13975cb71db228e114d6d8cdcc160b495e32b0ff921ac09959715e3fef30a48c5a9d0655ffd0ff6c5fe7024656add438bb2b058 languageName: node linkType: hard @@ -10744,9 +10772,9 @@ __metadata: languageName: node linkType: hard -"concurrently@npm:8.2.0": - version: 8.2.0 - resolution: "concurrently@npm:8.2.0" +"concurrently@npm:8.2.1": + version: 8.2.1 + resolution: "concurrently@npm:8.2.1" dependencies: chalk: ^4.1.2 date-fns: ^2.30.0 @@ -10760,7 +10788,7 @@ __metadata: bin: conc: dist/bin/concurrently.js concurrently: dist/bin/concurrently.js - checksum: eafe6a4d9b7fda87f55ea285cfc6acd937a5286ceec8991ab48e6cc27c45fce6a5c6f45e18d7555defa15dc7d7e8941bc5a9d1ceaf182e31441d420e00333434 + checksum: 216cb16d5b301cbd9c657b19430836d1686fe8fa9b9ef35ef7ac601e1a5cf6535166a3e57de446696dbd5e7e3f45d78fc70f33c5fd4bb565342cd5e752c5b069 languageName: node linkType: hard @@ -10948,9 +10976,9 @@ __metadata: linkType: hard "core-js@npm:^3.9.1": - version: 3.32.0 - resolution: "core-js@npm:3.32.0" - checksum: 52921395028550e4c9d21d47b9836439bb5b6b9eefc34d45a3948a68d81fdd093acc0fadf69f9cf632b82f01f95f22f484408a93dd9e940b19119ac204cd2925 + version: 3.32.1 + resolution: "core-js@npm:3.32.1" + checksum: e4af91d9c6be7b59235feb3f273d16705126ce09a0b4a787144d131d874f0cd10be3c24fc52e5eea7d7cb03ceabe4be7b255abcd9474b5eb1ff365d2c5611f9a languageName: node linkType: hard @@ -12032,10 +12060,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.4.3": - version: 29.4.3 - resolution: "diff-sequences@npm:29.4.3" - checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa languageName: node linkType: hard @@ -12090,11 +12118,11 @@ __metadata: linkType: hard "dns-packet@npm:^5.2.2": - version: 5.6.0 - resolution: "dns-packet@npm:5.6.0" + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" dependencies: "@leichtgewicht/ip-codec": ^2.0.1 - checksum: 1b643814e5947a87620f8a906287079347492282964ce1c236d52c414e3e3941126b96581376b180ba6e66899e70b86b587bc1aa23e3acd9957765be952d83fc + checksum: 64c06457f0c6e143f7a0946e0aeb8de1c5f752217cfa143ef527467c00a6d78db1835cfdb6bb68333d9f9a4963cf23f410439b5262a8935cce1236f45e344b81 languageName: node linkType: hard @@ -12360,9 +12388,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.477": - version: 1.4.495 - resolution: "electron-to-chromium@npm:1.4.495" - checksum: b076b1f5ef61f45ca03f4dce47ec280c705405b0cfd3741cc791ef0172a73122846bdf4bddddc4120dece693166e17fe0d6efc847664ecc5852fbec4df9c3153 + version: 1.4.506 + resolution: "electron-to-chromium@npm:1.4.506" + checksum: 449966efca7ab56a308726eec952d0e5a673c12de23921da5336698adb49bfcc1e4e04f3e24c144db9ba8d40023c95bbe8a44a50eb709ddf55984884539eea91 languageName: node linkType: hard @@ -12564,7 +12592,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2, es-abstract@npm:^1.21.3": +"es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1": version: 1.22.1 resolution: "es-abstract@npm:1.22.1" dependencies: @@ -12629,13 +12657,13 @@ __metadata: linkType: hard "es-iterator-helpers@npm:^1.0.12": - version: 1.0.13 - resolution: "es-iterator-helpers@npm:1.0.13" + version: 1.0.14 + resolution: "es-iterator-helpers@npm:1.0.14" dependencies: asynciterator.prototype: ^1.0.0 call-bind: ^1.0.2 define-properties: ^1.2.0 - es-abstract: ^1.21.3 + es-abstract: ^1.22.1 es-set-tostringtag: ^2.0.1 function-bind: ^1.1.1 get-intrinsic: ^1.2.1 @@ -12646,7 +12674,7 @@ __metadata: internal-slot: ^1.0.5 iterator.prototype: ^1.1.0 safe-array-concat: ^1.0.0 - checksum: 1b08ae7388439121fee1129cb23497abd7bf23dd440f7fa44d119c9f92f38f9b7d75b7d98453fcd15948a7eb58abb2a48c673c7250d2e15871abe3641f567ed7 + checksum: 484ca398389d5e259855e2d848573233985a7e7a4126c5de62c8a554174495aea47320ae1d2b55b757ece62ac1cb8455532aa61fd123fe4e01d0567eb2d7adfa languageName: node linkType: hard @@ -12919,9 +12947,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:2.28.0": - version: 2.28.0 - resolution: "eslint-plugin-import@npm:2.28.0" +"eslint-plugin-import@npm:2.28.1": + version: 2.28.1 + resolution: "eslint-plugin-import@npm:2.28.1" dependencies: array-includes: ^3.1.6 array.prototype.findlastindex: ^1.2.2 @@ -12932,18 +12960,17 @@ __metadata: eslint-import-resolver-node: ^0.3.7 eslint-module-utils: ^2.8.0 has: ^1.0.3 - is-core-module: ^2.12.1 + is-core-module: ^2.13.0 is-glob: ^4.0.3 minimatch: ^3.1.2 object.fromentries: ^2.0.6 object.groupby: ^1.0.0 object.values: ^1.1.6 - resolve: ^1.22.3 semver: ^6.3.1 tsconfig-paths: ^3.14.2 peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: f9eba311b93ca1bb89311856b1f7285bd79e0181d7eb70fe115053ff77e2235fea749b30f538b78927dc65769340b5be61f4c9581d1c82bcdcccb2061f440ad1 + checksum: e8ae6dd8f06d8adf685f9c1cfd46ac9e053e344a05c4090767e83b63a85c8421ada389807a39e73c643b9bff156715c122e89778169110ed68d6428e12607edf languageName: node linkType: hard @@ -13053,14 +13080,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.47.0": - version: 8.47.0 - resolution: "eslint@npm:8.47.0" +"eslint@npm:8.48.0": + version: 8.48.0 + resolution: "eslint@npm:8.48.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.2 - "@eslint/js": ^8.47.0 + "@eslint/js": 8.48.0 "@humanwhocodes/config-array": ^0.11.10 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 @@ -13096,7 +13123,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 1988617f703eadc5c7540468d54dc8e5171cf2bb9483f6172799cd1ff54a9a5e4470f003784e8cef92687eaa14de37172732787040e67817581a20bcb9c15970 + checksum: f20b359a4f8123fec5c033577368cc020d42978b1b45303974acd8da7a27063168ee3fe297ab5b35327162f6a93154063e3ce6577102f70f9809aff793db9bd0 languageName: node linkType: hard @@ -13318,17 +13345,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.6.2": - version: 29.6.2 - resolution: "expect@npm:29.6.2" +"expect@npm:^29.0.0, expect@npm:^29.6.4": + version: 29.6.4 + resolution: "expect@npm:29.6.4" dependencies: - "@jest/expect-utils": ^29.6.2 - "@types/node": "*" - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.6.2 - jest-message-util: ^29.6.2 - jest-util: ^29.6.2 - checksum: 71f7b0c560e58bf6d27e0fded261d4bdb7ef81552a6bb4bd1ee09ce7a1f7dca67fbf83cf9b07a6645a88ef52e65085a0dcbe17f6c063b53ff7c2f0f3ea4ef69e + "@jest/expect-utils": ^29.6.4 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.6.4 + jest-message-util: ^29.6.3 + jest-util: ^29.6.3 + checksum: 019b187d665562e4948b239e011a8791363e916f3076a229298d625e67fdadb06e8c2748798c49b4cf418ea223673eadd1de06537e08ba3c055c6f0efefc2306 languageName: node linkType: hard @@ -13570,8 +13596,8 @@ __metadata: linkType: hard "fastify@npm:^4.17.0": - version: 4.21.0 - resolution: "fastify@npm:4.21.0" + version: 4.22.0 + resolution: "fastify@npm:4.22.0" dependencies: "@fastify/ajv-compiler": ^3.5.0 "@fastify/error": ^3.2.0 @@ -13589,7 +13615,7 @@ __metadata: secure-json-parse: ^2.5.0 semver: ^7.5.0 tiny-lru: ^11.0.1 - checksum: 25af01ac4cf899a1158f64fb8fd8296240dfe84eeb999b3f5ac40ff84221b0962dd5f729e499a89078e8416bcf54cf56ada028f61f9f97c4001dc7301ab740ea + checksum: 0a0bbdd0b46246486f20c2b6b00dc37e35a5ce535cd1576e3de773960d7830fc3a31eac96094ae39b06c8683e4c8fb60e418ae8d6c3cb44dee70df0759de2ec1 languageName: node linkType: hard @@ -13812,12 +13838,13 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.1.0 + resolution: "flat-cache@npm:3.1.0" dependencies: - flatted: ^3.1.0 + flatted: ^3.2.7 + keyv: ^4.5.3 rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + checksum: 99312601d5b90f44aef403f17f056dc09be7e437703740b166cdc9386d99e681f74e6b6e8bd7d010bda66904ea643c9527276b1b80308a2119741d94108a4d8f languageName: node linkType: hard @@ -13828,7 +13855,7 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.1.0": +"flatted@npm:^3.2.7": version: 3.2.7 resolution: "flatted@npm:3.2.7" checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 @@ -13963,9 +13990,9 @@ __metadata: linkType: hard "fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: 8c76a6e21dedea87109d6171a0ac77afa14205794a565d71cb10d2925f629a3922da61bf45ea52dbc30bce4d8636dc0a27213a88cbd600eab047d82f9a3a94c5 + version: 4.3.4 + resolution: "fraction.js@npm:4.3.4" + checksum: 26fdecf114e3b693c760d3b2d5447f8ba9e815991ca7c7cdb930156780793b87f10936979a890b389676d960d7cd026273da9a44a6e20c12e3c4fd282a026ed3 languageName: node linkType: hard @@ -14101,7 +14128,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:2.3.2, fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -14111,7 +14138,17 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@2.3.2#~builtin, fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" dependencies: @@ -14120,6 +14157,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + "function-bind@npm:^1.1.1": version: 1.1.1 resolution: "function-bind@npm:1.1.1" @@ -14128,18 +14174,18 @@ __metadata: linkType: hard "function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + functions-have-names: ^1.2.3 + checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -14367,8 +14413,8 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.2.5": - version: 10.3.3 - resolution: "glob@npm:10.3.3" + version: 10.3.4 + resolution: "glob@npm:10.3.4" dependencies: foreground-child: ^3.1.0 jackspeak: ^2.0.3 @@ -14377,7 +14423,7 @@ __metadata: path-scurry: ^1.10.1 bin: glob: dist/cjs/src/bin.js - checksum: 29190d3291f422da0cb40b77a72fc8d2c51a36524e99b8bf412548b7676a6627489528b57250429612b6eec2e6fe7826d328451d3e694a9d15e575389308ec53 + checksum: 176b97c124414401cb51329a93d2ba112cef8814adbed10348481916b9521b677773eee2691cb6b24d66632d8c8bb8913533f5ac4bfb2d0ef5454a1856082361 languageName: node linkType: hard @@ -15683,7 +15729,7 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": version: 1.0.5 resolution: "internal-slot@npm:1.0.5" dependencies: @@ -15913,7 +15959,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": version: 2.13.0 resolution: "is-core-module@npm:2.13.0" dependencies: @@ -16462,7 +16508,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": +"istanbul-lib-instrument@npm:^5.0.4": version: 5.2.1 resolution: "istanbul-lib-instrument@npm:5.2.1" dependencies: @@ -16475,6 +16521,19 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.0 + resolution: "istanbul-lib-instrument@npm:6.0.0" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^7.5.4 + checksum: b9dc3723a769e65dbe1b912f935088ffc07cf393fa78a3ce79022c91aabb0ad01405ffd56083cdd822e514798e9daae3ea7bfe85633b094ecb335d28eb0a3f97 + languageName: node + linkType: hard + "istanbul-lib-report@npm:^3.0.0": version: 3.0.1 resolution: "istanbul-lib-report@npm:3.0.1" @@ -16508,83 +16567,83 @@ __metadata: linkType: hard "iterator.prototype@npm:^1.1.0": - version: 1.1.0 - resolution: "iterator.prototype@npm:1.1.0" + version: 1.1.1 + resolution: "iterator.prototype@npm:1.1.1" dependencies: - define-properties: ^1.1.4 - get-intrinsic: ^1.1.3 + define-properties: ^1.2.0 + get-intrinsic: ^1.2.1 has-symbols: ^1.0.3 - has-tostringtag: ^1.0.0 reflect.getprototypeof: ^1.0.3 - checksum: 462fe16c770affeb9c08620b13fc98d38307335821f4fabd489f491d38c79855c6a93d4b56f6146eaa56711f61690aa5c7eb0ce8586c95145d2f665a3834d916 + checksum: 2807469a39e280ff25ed95f8f84197b870a12fae2b15cb8779bbb0d12bc0e648be4d6277bedb6f4ae05d3fc94f05a29f90c018335003f27045582cf5455248df languageName: node linkType: hard "jackspeak@npm:^2.0.3": - version: 2.3.0 - resolution: "jackspeak@npm:2.3.0" + version: 2.3.1 + resolution: "jackspeak@npm:2.3.1" dependencies: "@isaacs/cliui": ^8.0.2 "@pkgjs/parseargs": ^0.11.0 dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 71bf716f4b5793226d4aeb9761ebf2605ee093b59f91a61451d57d998dd64bbf2b54323fb749b8b2ae8b6d8a463de4f6e3fedab50108671f247bbc80195a6306 + checksum: 34ea4d618d8d36ac104fe1053c85dfb6a63306cfe87e157ef42f18a7aa30027887370a4e163dd4993e45c6bf8a8ae003bf8476fdb8538e8ee5cd1938c27b15d0 languageName: node linkType: hard -"jest-changed-files@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-changed-files@npm:29.5.0" +"jest-changed-files@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-changed-files@npm:29.6.3" dependencies: execa: ^5.0.0 + jest-util: ^29.6.3 p-limit: ^3.1.0 - checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + checksum: 55bc820a70c220a02fec214d5c48d5e0d829549e5c7b9959776b4ca3f76f5ff20c7c8ff816a847822766f1d712477ab3027f7a66ec61bf65de3f852e878b4dfd languageName: node linkType: hard -"jest-circus@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-circus@npm:29.6.2" +"jest-circus@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-circus@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.2 - "@jest/expect": ^29.6.2 - "@jest/test-result": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.6.4 + "@jest/expect": ^29.6.4 + "@jest/test-result": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^1.0.0 is-generator-fn: ^2.0.0 - jest-each: ^29.6.2 - jest-matcher-utils: ^29.6.2 - jest-message-util: ^29.6.2 - jest-runtime: ^29.6.2 - jest-snapshot: ^29.6.2 - jest-util: ^29.6.2 + jest-each: ^29.6.3 + jest-matcher-utils: ^29.6.4 + jest-message-util: ^29.6.3 + jest-runtime: ^29.6.4 + jest-snapshot: ^29.6.4 + jest-util: ^29.6.3 p-limit: ^3.1.0 - pretty-format: ^29.6.2 + pretty-format: ^29.6.3 pure-rand: ^6.0.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 4f5a96a68c3c808c3d5a9279a2f39a2937386e2cebba5096971f267d79562ce2133a13bc05356a39f8f1ba68fcfe1eb39c4572b3fb0f91affbd932950e89c1e3 + checksum: 31f64ddf6df4aefe30ef5f8de9da137c9cba58ab5e2a25cf749450735088dc88a9974591a4256d481af0fe64608173c921219f9fad9a7dd87cbe47a79e111be8 languageName: node linkType: hard -"jest-cli@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-cli@npm:29.6.2" +"jest-cli@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-cli@npm:29.6.4" dependencies: - "@jest/core": ^29.6.2 - "@jest/test-result": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/core": ^29.6.4 + "@jest/test-result": ^29.6.4 + "@jest/types": ^29.6.3 chalk: ^4.0.0 exit: ^0.1.2 graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.6.2 - jest-util: ^29.6.2 - jest-validate: ^29.6.2 + jest-config: ^29.6.4 + jest-util: ^29.6.3 + jest-validate: ^29.6.3 prompts: ^2.0.1 yargs: ^17.3.1 peerDependencies: @@ -16594,34 +16653,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 0b7b09ae4bd327caf1981eac5a14679ddda3c5c836c9f8ea0ecfe1e5e10e9a39a5ed783fa38d25383604c4d3405595e74b391d955e99aea7e51acb41a59ea108 + checksum: 87a85a27eff0e502717b6ee0ce861d3e50d8c47d7298477f8ca10964b958f06c20241d28f1360ce2a85072763483e4924248106a8ed530ca460a56db3fdfc53e languageName: node linkType: hard -"jest-config@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-config@npm:29.6.2" +"jest-config@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-config@npm:29.6.4" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.6.2 - "@jest/types": ^29.6.1 - babel-jest: ^29.6.2 + "@jest/test-sequencer": ^29.6.4 + "@jest/types": ^29.6.3 + babel-jest: ^29.6.4 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.6.2 - jest-environment-node: ^29.6.2 - jest-get-type: ^29.4.3 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.2 - jest-runner: ^29.6.2 - jest-util: ^29.6.2 - jest-validate: ^29.6.2 + jest-circus: ^29.6.4 + jest-environment-node: ^29.6.4 + jest-get-type: ^29.6.3 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.6.4 + jest-runner: ^29.6.4 + jest-util: ^29.6.3 + jest-validate: ^29.6.3 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.6.2 + pretty-format: ^29.6.3 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -16632,76 +16691,76 @@ __metadata: optional: true ts-node: optional: true - checksum: 3bd104a3ac2dd9d34986238142437606354169766dcf88359a7a12ac106d0dc17dcc6b627e4f20db97a58bac5b0502b5436c9cc4722b3629b2a114bba6da9128 + checksum: 177352658774344896df3988dbe892e0b117579f45cc43aebc588493665bf19a557e202f097f5b4a987314ec2d84afa0769299ac6e702c5923d1fd3cfa4692b0 languageName: node linkType: hard -"jest-diff@npm:^29.0.0, jest-diff@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-diff@npm:29.6.2" +"jest-diff@npm:^29.0.0, jest-diff@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-diff@npm:29.6.4" dependencies: chalk: ^4.0.0 - diff-sequences: ^29.4.3 - jest-get-type: ^29.4.3 - pretty-format: ^29.6.2 - checksum: 0effd66a0c23f8c139ebf7ca99ed30b479b86fff66f19ad4869f130aaf7ae6a24ca1533f697b7e4930cbe2ddffc85387723fcca673501c653fb77a38f538e959 + diff-sequences: ^29.6.3 + jest-get-type: ^29.6.3 + pretty-format: ^29.6.3 + checksum: e205c45ab6dbcc660dc2a682cddb20f6a3cbbbdecd2821cce2050619f96dbd7560ee25f7f51d42c302596aeaddbea54390b78be3ab639340d24d67e4d270a8b0 languageName: node linkType: hard -"jest-docblock@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-docblock@npm:29.4.3" +"jest-docblock@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-docblock@npm:29.6.3" dependencies: detect-newline: ^3.0.0 - checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + checksum: 6f3213a1e79e7eedafeb462acfa9a41303f9c0167893b140f6818fa16d7eb6bf3f9b9cf4669097ca6b7154847793489ecd6b4f6cfb0e416b88cfa3b4b36715b6 languageName: node linkType: hard -"jest-each@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-each@npm:29.6.2" +"jest-each@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-each@npm:29.6.3" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 chalk: ^4.0.0 - jest-get-type: ^29.4.3 - jest-util: ^29.6.2 - pretty-format: ^29.6.2 - checksum: b64194f4ca27afc6070a42b7ecccbc68be0ded19a849f8cd8f91a2abb23fadae2d38d47559a315f4d1f576927761f3ea437a75ab6cf19206332abb8527d7c165 + jest-get-type: ^29.6.3 + jest-util: ^29.6.3 + pretty-format: ^29.6.3 + checksum: fe06e80b3554e2a8464f5f5c61943e02db1f8a7177139cb55b3201a1d1513cb089d8800401f102729a31bf8dd6f88229044e6088fea9dd5647ed11e841b6b88c languageName: node linkType: hard -"jest-environment-jsdom@npm:29.6.2": - version: 29.6.2 - resolution: "jest-environment-jsdom@npm:29.6.2" +"jest-environment-jsdom@npm:29.6.4": + version: 29.6.4 + resolution: "jest-environment-jsdom@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.2 - "@jest/fake-timers": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.6.4 + "@jest/fake-timers": ^29.6.4 + "@jest/types": ^29.6.3 "@types/jsdom": ^20.0.0 "@types/node": "*" - jest-mock: ^29.6.2 - jest-util: ^29.6.2 + jest-mock: ^29.6.3 + jest-util: ^29.6.3 jsdom: ^20.0.0 peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - checksum: 82db2bfbbc9c810c73408ada6169d62a8cdcb6eb0d7343903abd1154dabeabae16a5d847e3f943d354bcb719b8192a1762483b8686bd4ac5bd37d332048af824 + checksum: 2afe105f12d7d93ca56e2e6f67ab07ada3dd3da0516d1198f254930683ab9feb2b8c14417baaca53544eed88fd7fb5744f0dbce2e100269746187317ce0347df languageName: node linkType: hard -"jest-environment-node@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-environment-node@npm:29.6.2" +"jest-environment-node@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-environment-node@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.2 - "@jest/fake-timers": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.6.4 + "@jest/fake-timers": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-mock: ^29.6.2 - jest-util: ^29.6.2 - checksum: 0b754ac2d3bdb7ce5d6fc28595b9d1c64176f20506b6f773b18b0280ab0b396ed7d927c8519779d3c560fa2b13236ee7077092ccb19a13bea23d40dd30f06450 + jest-mock: ^29.6.3 + jest-util: ^29.6.3 + checksum: 518221505af4bd32c84f2af2c03f9d771de2711bd69fe7723b648fcc2e05d95b4e75f493afa9010209e26a4a3309ebee971f9b18c45b540891771d3b68c3a16e languageName: node linkType: hard @@ -16720,83 +16779,83 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^29.0.0, jest-get-type@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-get-type@npm:29.4.3" - checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce +"jest-get-type@npm:^29.0.0, jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 languageName: node linkType: hard -"jest-haste-map@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-haste-map@npm:29.6.2" +"jest-haste-map@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-haste-map@npm:29.6.4" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 fb-watchman: ^2.0.0 fsevents: ^2.3.2 graceful-fs: ^4.2.9 - jest-regex-util: ^29.4.3 - jest-util: ^29.6.2 - jest-worker: ^29.6.2 + jest-regex-util: ^29.6.3 + jest-util: ^29.6.3 + jest-worker: ^29.6.4 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: 726233972030eb2e5bce6c9468e497310436b455c88b40e744bd053e20a6f3ff19aec340edcbd89537c629ed5cf8916506bc895d690cc39a0862c74dcd95b7b8 + checksum: 4f720fd3813bb38400b7a9a094e55664cbddd907ba1769457ed746f6c870c615167647a5b697a788183d832b1dcb1b66143e52990a6f4403283f6686077fa868 languageName: node linkType: hard -"jest-leak-detector@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-leak-detector@npm:29.6.2" +"jest-leak-detector@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-leak-detector@npm:29.6.3" dependencies: - jest-get-type: ^29.4.3 - pretty-format: ^29.6.2 - checksum: e00152acdba8aa8f9334775b77375947508051c34646fbeb702275da2b6ac6145f8cad6d5893112e76484d00fa8c0b4fd71b78ab0b4ef34950f5b6a84f37ae67 + jest-get-type: ^29.6.3 + pretty-format: ^29.6.3 + checksum: 27548fcfc7602fe1b88f8600185e35ffff71751f3631e52bbfdfc72776f5a13a430185cf02fc632b41320a74f99ae90e40ce101c8887509f0f919608a7175129 languageName: node linkType: hard -"jest-matcher-utils@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-matcher-utils@npm:29.6.2" +"jest-matcher-utils@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-matcher-utils@npm:29.6.4" dependencies: chalk: ^4.0.0 - jest-diff: ^29.6.2 - jest-get-type: ^29.4.3 - pretty-format: ^29.6.2 - checksum: 3e1b65dd30d05f75fe56dc45fbe4135aec2ff96a3d1e21afbf6a66f3a45a7e29cd0fd37cf80b9564e0381d6205833f77ccaf766c6f7e1aad6b7924d117be504e + jest-diff: ^29.6.4 + jest-get-type: ^29.6.3 + pretty-format: ^29.6.3 + checksum: 9e17bce282e74bdbba2ce5475c490e0bba4f464cd42132bfc5df0337e0853af4dba925c7f4f61cbb0a4818fa121d28d7ff0196ec8829773a22fce59a822976d2 languageName: node linkType: hard -"jest-message-util@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-message-util@npm:29.6.2" +"jest-message-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-message-util@npm:29.6.3" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.6.2 + pretty-format: ^29.6.3 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: e8e3c8d2301e2ca4038ed6df8cbba7fedc6949d1ede4c0e3f1f44f53afb56d77eb35983fa460140d0eadeab99a5f3ae04b703fe77cd7b316b40b361228b5aa1a + checksum: 59f5229a06c073a8877ba4d2e304cc07d63b0062bf5764d4bed14364403889e77f1825d1bd9017c19a840847d17dffd414dc06f1fcb537b5f9e03dbc65b84ada languageName: node linkType: hard -"jest-mock@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-mock@npm:29.6.2" +"jest-mock@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-mock@npm:29.6.3" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-util: ^29.6.2 - checksum: 0bacb5d58441462c0e531ec4d2f7377eecbe21f664d8a460e72f94ba61d22635028931678e7a0f1c3e3f5894973db8e409432f7db4c01283456c8fdbd85f5b3b + jest-util: ^29.6.3 + checksum: 35772968010c0afb1bb1ef78570b9cbea907c6f967d24b4e95e1a596a1000c63d60e225fb9ddfdd5218674da4aa61d92a09927fc26310cecbbfaa8278d919e32 languageName: node linkType: hard @@ -16812,168 +16871,168 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-regex-util@npm:29.4.3" - checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-resolve-dependencies@npm:29.6.2" +"jest-resolve-dependencies@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-resolve-dependencies@npm:29.6.4" dependencies: - jest-regex-util: ^29.4.3 - jest-snapshot: ^29.6.2 - checksum: d40ee11af2c9d2ef0dbbcf9a5b7dda37c2b86cf4e5de1705795919fd8927907569115c502116ab56de0dca576d5faa31ec9b636240333b6830a568a63004da17 + jest-regex-util: ^29.6.3 + jest-snapshot: ^29.6.4 + checksum: 34f81d22cbd72203130cc14cbb66d5783d9f59fba4d366b9653f8fb4f6feeaac25d89696f2f77c700659843d5440dc92f58ad443ba05da1da46c39234866d916 languageName: node linkType: hard -"jest-resolve@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-resolve@npm:29.6.2" +"jest-resolve@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-resolve@npm:29.6.4" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.2 + jest-haste-map: ^29.6.4 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.6.2 - jest-validate: ^29.6.2 + jest-util: ^29.6.3 + jest-validate: ^29.6.3 resolve: ^1.20.0 resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: 01721957e61821a576b2ded043eeab8b392166e0e6d8d680f75657737e2ea7481ff29c2716b866ccd12e743f3a8da465504b1028e78b6a3c68b9561303de7ec8 + checksum: 5f0ef260aec79ef00e16e0ba7b27d527054e1faed08a144279cd191b5c5b71af67c52b9ddfd24aa2f563d254618ce9bf7519809f23fb2abf6c4fa375503caa28 languageName: node linkType: hard -"jest-runner@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-runner@npm:29.6.2" +"jest-runner@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-runner@npm:29.6.4" dependencies: - "@jest/console": ^29.6.2 - "@jest/environment": ^29.6.2 - "@jest/test-result": ^29.6.2 - "@jest/transform": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/console": ^29.6.4 + "@jest/environment": ^29.6.4 + "@jest/test-result": ^29.6.4 + "@jest/transform": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 - jest-docblock: ^29.4.3 - jest-environment-node: ^29.6.2 - jest-haste-map: ^29.6.2 - jest-leak-detector: ^29.6.2 - jest-message-util: ^29.6.2 - jest-resolve: ^29.6.2 - jest-runtime: ^29.6.2 - jest-util: ^29.6.2 - jest-watcher: ^29.6.2 - jest-worker: ^29.6.2 + jest-docblock: ^29.6.3 + jest-environment-node: ^29.6.4 + jest-haste-map: ^29.6.4 + jest-leak-detector: ^29.6.3 + jest-message-util: ^29.6.3 + jest-resolve: ^29.6.4 + jest-runtime: ^29.6.4 + jest-util: ^29.6.3 + jest-watcher: ^29.6.4 + jest-worker: ^29.6.4 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 46bd506a08ddf79628a509aed4105ab74c0b03727a3e24c90bbc2915531860b3da99f7ace2fd9603194440553cffac9cfb1a3b7d0ce03d5fc9c5f2d5ffbb3d3f + checksum: ca977dd30262171fe000de8407a3187c16e7057ddf690bcc21068155aacd4824ee927b544e0fa9f2885948b47a5123b472da41e095e3bcbdebb79f1fa2f2fc56 languageName: node linkType: hard -"jest-runtime@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-runtime@npm:29.6.2" +"jest-runtime@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-runtime@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.2 - "@jest/fake-timers": ^29.6.2 - "@jest/globals": ^29.6.2 - "@jest/source-map": ^29.6.0 - "@jest/test-result": ^29.6.2 - "@jest/transform": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.6.4 + "@jest/fake-timers": ^29.6.4 + "@jest/globals": ^29.6.4 + "@jest/source-map": ^29.6.3 + "@jest/test-result": ^29.6.4 + "@jest/transform": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.2 - jest-message-util: ^29.6.2 - jest-mock: ^29.6.2 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.2 - jest-snapshot: ^29.6.2 - jest-util: ^29.6.2 + jest-haste-map: ^29.6.4 + jest-message-util: ^29.6.3 + jest-mock: ^29.6.3 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.6.4 + jest-snapshot: ^29.6.4 + jest-util: ^29.6.3 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 8e7e4486b23b01a9c407313681bed0def39680c2ae21cf01347f111983252ec3a024c56493c5411fed53633f02863eed0816099110cbe04b3889aa5babf1042d + checksum: 93deacd06f8f2bb808dbfb8acbcbc0b724187b3d3fffafd497a32c939bf385ca21f5a3f03eebd5b958a0e93865d0e68a0db73bd0fe16dafbd5e922558aa7b359 languageName: node linkType: hard -"jest-snapshot@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-snapshot@npm:29.6.2" +"jest-snapshot@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-snapshot@npm:29.6.4" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 "@babel/plugin-syntax-jsx": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.6.2 - "@jest/transform": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/expect-utils": ^29.6.4 + "@jest/transform": ^29.6.4 + "@jest/types": ^29.6.3 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.6.2 + expect: ^29.6.4 graceful-fs: ^4.2.9 - jest-diff: ^29.6.2 - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.6.2 - jest-message-util: ^29.6.2 - jest-util: ^29.6.2 + jest-diff: ^29.6.4 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.6.4 + jest-message-util: ^29.6.3 + jest-util: ^29.6.3 natural-compare: ^1.4.0 - pretty-format: ^29.6.2 + pretty-format: ^29.6.3 semver: ^7.5.3 - checksum: c1c70a9dbce7fca62ed73ac38234b4ee643e8b667acf71b4417ab67776c1188bb08b8ad450e56a2889ad182903ffd416386fa8082a477724ccf8d8c29a4c6906 + checksum: 0c9b5ec640457fb780ac6c9b6caa814436e9e16bf744772eee3bfd055ae5f7a3085a6a09b2f30910e31915dafc3955d92357cc98189e4d5dcb417b5fdafda6e3 languageName: node linkType: hard -"jest-util@npm:^29.0.0, jest-util@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-util@npm:29.6.2" +"jest-util@npm:^29.0.0, jest-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-util@npm:29.6.3" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: 8aedc0c80083d0cabd6c6c4f04dea1cbcac609fd7bc3b1fc05a3999291bd6e63dd52b0c806f9378d5cae28eff5a6191709a4987861001293f8d03e53984adca4 + checksum: 7bf3ba3ac67ac6ceff7d8fdd23a86768e23ddd9133ecd9140ef87cc0c28708effabaf67a6cd45cd9d90a63d645a522ed0825d09ee59ac4c03b9c473b1fef4c7c languageName: node linkType: hard -"jest-validate@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-validate@npm:29.6.2" +"jest-validate@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-validate@npm:29.6.3" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 camelcase: ^6.2.0 chalk: ^4.0.0 - jest-get-type: ^29.4.3 + jest-get-type: ^29.6.3 leven: ^3.1.0 - pretty-format: ^29.6.2 - checksum: 32648d002189c0ad8a958eace7c6b7d05ea1dc440a1b91e0f22dc1aef489899446ec80b2d527fd13713862d89dfb4606e24a3bf8a10c4ddac3c911e93b7f0374 + pretty-format: ^29.6.3 + checksum: caa489ed11080441c636b8035ab71bafbdc0c052b1e452855e4d2dd24ac15e497710a270ea6fc5ef8926b22c1ce4d6e07ec2dc193f0810cff5851d7a2222c045 languageName: node linkType: hard -"jest-watcher@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-watcher@npm:29.6.2" +"jest-watcher@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-watcher@npm:29.6.4" dependencies: - "@jest/test-result": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/test-result": ^29.6.4 + "@jest/types": ^29.6.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.6.2 + jest-util: ^29.6.3 string-length: ^4.0.1 - checksum: 14624190fc8b5fbae466a2ec81458a88c15716d99f042bb4674d53e9623d305cb2905bc1dffeda05fd1a10a05c2a83efe5ac41942477e2b15eaebb08d0aaab32 + checksum: 13c0f96f7e9212e4f3ef2daf3e787045bdcec414061bf286eca934c7f4083fb04d38df9ced9c0edfbe15f3521ca581eb2ed6108c338a0db1f3e1def65687992f languageName: node linkType: hard @@ -16988,26 +17047,26 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-worker@npm:29.6.2" +"jest-worker@npm:^29.6.4": + version: 29.6.4 + resolution: "jest-worker@npm:29.6.4" dependencies: "@types/node": "*" - jest-util: ^29.6.2 + jest-util: ^29.6.3 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 11035564534bf181ead80b25be138c2d42372bd5626151a3e705200d47a74fd9da3ca79f8a7b15806cdc325ad73c3d21d23acceeed99d50941589ff02915ed38 + checksum: 05d19a5759ebfeb964036065be55ad8d8e8ddffa85d9b3a4c0b95765695efb1d8226ec824a4d8e660c38cda3389bfeb98d819f47232acf9fb0e79f553b7c0a76 languageName: node linkType: hard -"jest@npm:29.6.2, jest@npm:^29.5.0": - version: 29.6.2 - resolution: "jest@npm:29.6.2" +"jest@npm:29.6.4, jest@npm:^29.5.0": + version: 29.6.4 + resolution: "jest@npm:29.6.4" dependencies: - "@jest/core": ^29.6.2 - "@jest/types": ^29.6.1 + "@jest/core": ^29.6.4 + "@jest/types": ^29.6.3 import-local: ^3.0.2 - jest-cli: ^29.6.2 + jest-cli: ^29.6.4 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -17015,16 +17074,16 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: dd63facd4e6aefc35d2c42acd7e4c9fb0d8fe4705df4b3ccedd953605424d7aa89c88af8cf4c9951752709cac081d29c35b264e1794643d5688ea724ccc9a485 + checksum: ba28ca7a86d029bcd742bb254c0c8d0119c1e002ddae128ff6409ebabc0b29c36f69dbf3fdd326aff16e7b2500c9a918bbc6a9a5db4d966e035127242239439f languageName: node linkType: hard "jiti@npm:^1.18.2": - version: 1.19.2 - resolution: "jiti@npm:1.19.2" + version: 1.19.3 + resolution: "jiti@npm:1.19.3" bin: jiti: bin/jiti.js - checksum: 6a49757d176f3365926e082538f58fb91803ba1b789faf2fa7375f3ba7e2ae151cd2f1a736dcb8e2154539db5e7e7d94b375d36d99593d6b50833ba482a9b448 + checksum: de3dacdfe30948d96b69712b04cc28127c17f43d5233a5aa069933e04ac4c9aaf265bef4cdf2b0c2a6f5af236a58aea9bfea83e8e289e2490802bdff7f99bff7 languageName: node linkType: hard @@ -17281,15 +17340,21 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:9.0.1, jsonwebtoken@npm:^9.0.0": - version: 9.0.1 - resolution: "jsonwebtoken@npm:9.0.1" +"jsonwebtoken@npm:9.0.2, jsonwebtoken@npm:^9.0.0": + version: 9.0.2 + resolution: "jsonwebtoken@npm:9.0.2" dependencies: jws: ^3.2.2 - lodash: ^4.17.21 + lodash.includes: ^4.3.0 + lodash.isboolean: ^3.0.3 + lodash.isinteger: ^4.0.4 + lodash.isnumber: ^3.0.3 + lodash.isplainobject: ^4.0.6 + lodash.isstring: ^4.0.1 + lodash.once: ^4.0.0 ms: ^2.1.1 - semver: ^7.3.8 - checksum: 0eafe268896f4e8f9ab1f0f20e8c645721b7a9cddc41c0aba1e58da5c34564e8c9990817c1a5b646d795bcbb1339350826fe57c4569b5379ba9eea4a9aa5bbd0 + semver: ^7.5.4 + checksum: fc739a6a8b33f1974f9772dca7f8493ca8df4cc31c5a09dcfdb7cff77447dcf22f4236fb2774ef3fe50df0abeb8e1c6f4c41eba82f500a804ab101e2fbc9d61a languageName: node linkType: hard @@ -17370,7 +17435,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.0.0": +"keyv@npm:^4.0.0, keyv@npm:^4.5.3": version: 4.5.3 resolution: "keyv@npm:4.5.3" dependencies: @@ -17593,80 +17658,90 @@ __metadata: languageName: node linkType: hard -"lightningcss-darwin-arm64@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-darwin-arm64@npm:1.21.5" +"lightningcss-darwin-arm64@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-darwin-arm64@npm:1.21.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"lightningcss-darwin-x64@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-darwin-x64@npm:1.21.5" +"lightningcss-darwin-x64@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-darwin-x64@npm:1.21.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"lightningcss-linux-arm-gnueabihf@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.21.5" +"lightningcss-freebsd-x64@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-freebsd-x64@npm:1.21.7" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.21.7" conditions: os=linux & cpu=arm languageName: node linkType: hard -"lightningcss-linux-arm64-gnu@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-linux-arm64-gnu@npm:1.21.5" +"lightningcss-linux-arm64-gnu@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-linux-arm64-gnu@npm:1.21.7" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-arm64-musl@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-linux-arm64-musl@npm:1.21.5" +"lightningcss-linux-arm64-musl@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-linux-arm64-musl@npm:1.21.7" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"lightningcss-linux-x64-gnu@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-linux-x64-gnu@npm:1.21.5" +"lightningcss-linux-x64-gnu@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-linux-x64-gnu@npm:1.21.7" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-x64-musl@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-linux-x64-musl@npm:1.21.5" +"lightningcss-linux-x64-musl@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-linux-x64-musl@npm:1.21.7" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"lightningcss-win32-x64-msvc@npm:1.21.5": - version: 1.21.5 - resolution: "lightningcss-win32-x64-msvc@npm:1.21.5" +"lightningcss-win32-x64-msvc@npm:1.21.7": + version: 1.21.7 + resolution: "lightningcss-win32-x64-msvc@npm:1.21.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "lightningcss@npm:^1.16.1": - version: 1.21.5 - resolution: "lightningcss@npm:1.21.5" + version: 1.21.7 + resolution: "lightningcss@npm:1.21.7" dependencies: detect-libc: ^1.0.3 - lightningcss-darwin-arm64: 1.21.5 - lightningcss-darwin-x64: 1.21.5 - lightningcss-linux-arm-gnueabihf: 1.21.5 - lightningcss-linux-arm64-gnu: 1.21.5 - lightningcss-linux-arm64-musl: 1.21.5 - lightningcss-linux-x64-gnu: 1.21.5 - lightningcss-linux-x64-musl: 1.21.5 - lightningcss-win32-x64-msvc: 1.21.5 + lightningcss-darwin-arm64: 1.21.7 + lightningcss-darwin-x64: 1.21.7 + lightningcss-freebsd-x64: 1.21.7 + lightningcss-linux-arm-gnueabihf: 1.21.7 + lightningcss-linux-arm64-gnu: 1.21.7 + lightningcss-linux-arm64-musl: 1.21.7 + lightningcss-linux-x64-gnu: 1.21.7 + lightningcss-linux-x64-musl: 1.21.7 + lightningcss-win32-x64-msvc: 1.21.7 dependenciesMeta: lightningcss-darwin-arm64: optional: true lightningcss-darwin-x64: optional: true + lightningcss-freebsd-x64: + optional: true lightningcss-linux-arm-gnueabihf: optional: true lightningcss-linux-arm64-gnu: @@ -17679,7 +17754,7 @@ __metadata: optional: true lightningcss-win32-x64-msvc: optional: true - checksum: fcfb80302740c275fea8dc6ebc1a31da681321d92f0ddb33deb71037bb3dee08b8143ee03ddad8cef39c7ba4000447b362c9295d264deec124c9a206a848fef4 + checksum: 354e3549cc3942ba2369871473cc6ff7b63f09ccf1ca2d6f52b809f97e59acc8c091c227df41dc135034e70f281f94a25b0847e18de619c12552a8cb9a246406 languageName: node linkType: hard @@ -17722,9 +17797,9 @@ __metadata: languageName: node linkType: hard -"lint-staged@npm:14.0.0": - version: 14.0.0 - resolution: "lint-staged@npm:14.0.0" +"lint-staged@npm:14.0.1": + version: 14.0.1 + resolution: "lint-staged@npm:14.0.1" dependencies: chalk: 5.3.0 commander: 11.0.0 @@ -17738,7 +17813,7 @@ __metadata: yaml: 2.3.1 bin: lint-staged: bin/lint-staged.js - checksum: 7269cd21c15a7b5734a28775f879a91f6b59291bec9a897a1f2faae1cd8316dd50e19fd13207fb6798c705eb5371a25caee0e2dfd5932fbcd38ea5f8155f918c + checksum: 8c5d740cb3c90fab2d970fa6bbffe5ddf35ec66ed374a52caf3a3cf83d8f4d5fd01a949994822bce5ea18c0b8dc8fa4ce087ef886a8c11db674139a063cdfe4f languageName: node linkType: hard @@ -17970,6 +18045,13 @@ __metadata: languageName: node linkType: hard +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 + languageName: node + linkType: hard + "lodash.isequal@npm:^4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" @@ -17977,6 +18059,34 @@ __metadata: languageName: node linkType: hard +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 + languageName: node + linkType: hard + "lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -18005,6 +18115,13 @@ __metadata: languageName: node linkType: hard +"lodash.once@npm:^4.0.0": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 + languageName: node + linkType: hard + "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" @@ -18549,7 +18666,7 @@ __metadata: resolution: "migration@workspace:examples/migration" dependencies: "@apollo/server": ^4.7.0 - "@neo4j/graphql": ^4.0.0-beta.1 + "@neo4j/graphql": ^4.0.0-beta.2 graphql: 16.8.0 neo4j-driver: 5.11.0 languageName: unknown @@ -19323,7 +19440,7 @@ __metadata: "@apollo/server": ^4.7.0 "@neo4j/graphql": ^4.0.0-beta.0 "@neo4j/graphql-amqp-subscriptions-engine": ^1.0.0-beta.0 - concurrently: 8.2.0 + concurrently: 8.2.1 dotenv: ^16.0.3 express: ^4.18.2 graphql: ^16.6.0 @@ -19373,24 +19490,24 @@ __metadata: "@changesets/changelog-github": 0.4.8 "@changesets/cli": 2.26.2 "@tsconfig/node16": 1.0.4 - "@typescript-eslint/eslint-plugin": 6.4.0 - "@typescript-eslint/parser": 6.4.0 - concurrently: 8.2.0 + "@typescript-eslint/eslint-plugin": 6.5.0 + "@typescript-eslint/parser": 6.5.0 + concurrently: 8.2.1 dotenv: 16.3.1 - eslint: 8.47.0 + eslint: 8.48.0 eslint-config-prettier: 9.0.0 eslint-formatter-summary: 1.1.0 eslint-import-resolver-typescript: 3.6.0 eslint-plugin-eslint-comments: 3.2.0 - eslint-plugin-import: 2.28.0 + eslint-plugin-import: 2.28.1 eslint-plugin-jest: 27.2.3 eslint-plugin-jsx-a11y: 6.7.1 eslint-plugin-react: 7.33.2 eslint-plugin-simple-import-sort: 10.0.0 graphql: 16.8.0 husky: 8.0.3 - jest: 29.6.2 - lint-staged: 14.0.0 + jest: 29.6.4 + lint-staged: 14.0.1 neo4j-driver: 5.11.0 npm-run-all: 4.1.5 prettier: 2.8.8 @@ -19486,9 +19603,23 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:~2.6.1": - version: 2.6.12 - resolution: "node-fetch@npm:2.6.12" +"node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 + languageName: node + linkType: hard + +"node-fetch@npm:~2.6.1": + version: 2.6.13 + resolution: "node-fetch@npm:2.6.13" dependencies: whatwg-url: ^5.0.0 peerDependencies: @@ -19496,7 +19627,7 @@ __metadata: peerDependenciesMeta: encoding: optional: true - checksum: 3bc1655203d47ee8e313c0d96664b9673a3d4dd8002740318e9d27d14ef306693a4b2ef8d6525775056fd912a19e23f3ac0d7111ad8925877b7567b29a625592 + checksum: 055845ae5b4796c78c7053564745345025cf959563b3568b43c385f67d311779e6b00e5fef6ed1b79f86ba4048e4b4b722e1aa948305521b9353eb7e788912c9 languageName: node linkType: hard @@ -19934,57 +20065,57 @@ __metadata: linkType: hard "object.entries@npm:^1.1.6": - version: 1.1.6 - resolution: "object.entries@npm:1.1.6" + version: 1.1.7 + resolution: "object.entries@npm:1.1.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0f8c47517e6a9a980241eafe3b73de11e59511883173c2b93d67424a008e47e11b77c80e431ad1d8a806f6108b225a1cab9223e53e555776c612a24297117d28 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: da287d434e7e32989586cd734382364ba826a2527f2bc82e6acbf9f9bfafa35d51018b66ec02543ffdfa2a5ba4af2b6f1ca6e588c65030cb4fd9c67d6ced594c languageName: node linkType: hard "object.fromentries@npm:^2.0.6": - version: 2.0.6 - resolution: "object.fromentries@npm:2.0.6" + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 453c6d694180c0c30df451b60eaf27a5b9bca3fb43c37908fd2b78af895803dc631242bcf05582173afa40d8d0e9c96e16e8874b39471aa53f3ac1f98a085d85 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 languageName: node linkType: hard "object.groupby@npm:^1.0.0": - version: 1.0.0 - resolution: "object.groupby@npm:1.0.0" + version: 1.0.1 + resolution: "object.groupby@npm:1.0.1" dependencies: call-bind: ^1.0.2 define-properties: ^1.2.0 - es-abstract: ^1.21.2 + es-abstract: ^1.22.1 get-intrinsic: ^1.2.1 - checksum: 64b00b287d57580111c958e7ff375c9b61811fa356f2cf0d35372d43cab61965701f00fac66c19fd8f49c4dfa28744bee6822379c69a73648ad03e09fcdeae70 + checksum: d7959d6eaaba358b1608066fc67ac97f23ce6f573dc8fc661f68c52be165266fcb02937076aedb0e42722fdda0bdc0bbf74778196ac04868178888e9fd3b78b5 languageName: node linkType: hard "object.hasown@npm:^1.1.2": - version: 1.1.2 - resolution: "object.hasown@npm:1.1.2" + version: 1.1.3 + resolution: "object.hasown@npm:1.1.3" dependencies: - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: b936572536db0cdf38eb30afd2f1026a8b6f2cc5d2c4497c9d9bbb01eaf3e980dead4fd07580cfdd098e6383e5a9db8212d3ea0c6bdd2b5e68c60aa7e3b45566 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 languageName: node linkType: hard "object.values@npm:^1.1.6": - version: 1.1.6 - resolution: "object.values@npm:1.1.6" + version: 1.1.7 + resolution: "object.values@npm:1.1.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: f3e4ae4f21eb1cc7cebb6ce036d4c67b36e1c750428d7b7623c56a0db90edced63d08af8a316d81dfb7c41a3a5fa81b05b7cc9426e98d7da986b1682460f0777 languageName: node linkType: hard @@ -21151,14 +21282,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.28, postcss@npm:^8.1.10, postcss@npm:^8.4.21, postcss@npm:^8.4.23": - version: 8.4.28 - resolution: "postcss@npm:8.4.28" +"postcss@npm:8.4.29, postcss@npm:^8.1.10, postcss@npm:^8.4.21, postcss@npm:^8.4.23": + version: 8.4.29 + resolution: "postcss@npm:8.4.29" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: f605c24a36f7e400bad379735fbfc893ccb8d293ad6d419bb824db77cdcb69f43d614ef35f9f7091f32ca588d130ec60dbcf53b366e6bf88a8a64bbeb3c05f6d + checksum: dd6daa25e781db9ae5b651d9b7bfde0ec6e60e86a37da69a18eb4773d5ddd51e28fc4ff054fbdc04636a31462e6bf09a1e50986f69ac52b10d46b7457cd36d12 languageName: node linkType: hard @@ -21200,14 +21331,14 @@ __metadata: linkType: hard "preferred-pm@npm:^3.0.0": - version: 3.0.3 - resolution: "preferred-pm@npm:3.0.3" + version: 3.1.1 + resolution: "preferred-pm@npm:3.1.1" dependencies: find-up: ^5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: ^4.0.0 which-pm: 2.0.0 - checksum: 0de0948cb6ae22213f2ad7868032d89f1e1443d9caabc22ceeb9d284f19d359d65b67fab178f4db5c8c6ca6ae34642bdc72730b70ab1899ea158e2677a88a6d0 + checksum: ab524b2c3de1c5bc941b51c4843a4e7f7587a33a0a0b0f08f5b1168188723f5133aea789fb512de37586166a3f6f2850e49ec66c8ce39e234e0178671e5774f1 languageName: node linkType: hard @@ -21267,14 +21398,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.2": - version: 29.6.2 - resolution: "pretty-format@npm:29.6.2" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.3": + version: 29.6.3 + resolution: "pretty-format@npm:29.6.3" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: a0f972a44f959023c0df9cdfe9eed7540264d7f7ddf74667db8a5294444d5aa153fd47d20327df10ae86964e2ceec10e46ea06b1a5c9c12e02348b78c952c9fc + checksum: 4e1c0db48e65571c22e80ff92123925ff8b3a2a89b71c3a1683cfde711004d492de32fe60c6bc10eea8bf6c678e5cbe544ac6c56cb8096e1eb7caf856928b1c4 languageName: node linkType: hard @@ -22236,16 +22367,16 @@ __metadata: linkType: hard "reflect.getprototypeof@npm:^1.0.3": - version: 1.0.3 - resolution: "reflect.getprototypeof@npm:1.0.3" + version: 1.0.4 + resolution: "reflect.getprototypeof@npm:1.0.4" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.1 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 globalthis: ^1.0.3 which-builtin-type: ^1.1.3 - checksum: 843e2506c013da66f83635f943c5bd41243bc6c7703298531cfb16eb6baaefd92f83031fa37140ad31c4edc86938b6eb385e6fc85bf1628e79348ed49e044f3d + checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 languageName: node linkType: hard @@ -22274,7 +22405,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0": +"regexp.prototype.flags@npm:^1.5.0": version: 1.5.0 resolution: "regexp.prototype.flags@npm:1.5.0" dependencies: @@ -22452,7 +22583,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.4, resolve@npm:^1.1.5, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.3, resolve@npm:^1.22.4, resolve@npm:^1.4.0": +"resolve@npm:^1.1.4, resolve@npm:^1.1.5, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.4, resolve@npm:^1.4.0": version: 1.22.4 resolution: "resolve@npm:1.22.4" dependencies: @@ -22478,7 +22609,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.4#~builtin, resolve@patch:resolve@^1.1.5#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.2#~builtin, resolve@patch:resolve@^1.22.3#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.4.0#~builtin": +"resolve@patch:resolve@^1.1.4#~builtin, resolve@patch:resolve@^1.1.5#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.2#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.4.0#~builtin": version: 1.22.4 resolution: "resolve@patch:resolve@npm%3A1.22.4#~builtin::version=1.22.4&hash=c3c19d" dependencies: @@ -23844,18 +23975,18 @@ __metadata: linkType: hard "string.prototype.matchall@npm:^4.0.8": - version: 4.0.8 - resolution: "string.prototype.matchall@npm:4.0.8" + version: 4.0.9 + resolution: "string.prototype.matchall@npm:4.0.9" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - regexp.prototype.flags: ^1.4.3 + internal-slot: ^1.0.5 + regexp.prototype.flags: ^1.5.0 side-channel: ^1.0.4 - checksum: 952da3a818de42ad1c10b576140a5e05b4de7b34b8d9dbf00c3ac8c1293e9c0f533613a39c5cda53e0a8221f2e710bc2150e730b1c2278d60004a8a35726efb6 + checksum: a68a9914755ec8c9b9129d6fb70603d78b839a1ca4a907e601fcb860109cecfbd1884e8b38989885f9c825c1c2015ff5b1ed9ddac7c8d040e4e4b3c9bc4ed5ed languageName: node linkType: hard @@ -24033,10 +24164,10 @@ __metadata: languageName: node linkType: hard -"style-mod@npm:^4.0.0": - version: 4.0.3 - resolution: "style-mod@npm:4.0.3" - checksum: 934556e720bd29026ff8fef43a1a35b58957813025b91f996d886e9405acf934ddb1934def4400b174bd7784c9263eb9c71f07ae83925af9271b7d921d546854 +"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": + version: 4.1.0 + resolution: "style-mod@npm:4.1.0" + checksum: 8402b14ca11113a3640d46b3cf7ba49f05452df7846bc5185a3535d9b6a64a3019e7fb636b59ccbb7816aeb0725b24723e77a85b05612a9360e419958e13b4e6 languageName: node linkType: hard @@ -24234,8 +24365,8 @@ __metadata: linkType: hard "systeminformation@npm:^5.7": - version: 5.18.15 - resolution: "systeminformation@npm:5.18.15" + version: 5.21.2 + resolution: "systeminformation@npm:5.21.2" bin: systeminformation: lib/cli.js conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) @@ -24363,8 +24494,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.16.8": - version: 5.19.2 - resolution: "terser@npm:5.19.2" + version: 5.19.3 + resolution: "terser@npm:5.19.3" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -24372,7 +24503,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: e059177775b4d4f4cff219ad89293175aefbd1b081252270444dc83e42a2c5f07824eb2a85eae6e22ef6eb7ef04b21af36dd7d1dd7cfb93912310e57d416a205 + checksum: dde1b387891ad953760cec56b168d1f2b1eae5f47410bec57f3587daa9719ee0cf3155961adf77cdff9ea88e086dd49c78a721eafdcbdd0dd590c47c8e660a37 languageName: node linkType: hard @@ -24674,11 +24805,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "ts-api-utils@npm:1.0.1" + version: 1.0.2 + resolution: "ts-api-utils@npm:1.0.2" peerDependencies: typescript: ">=4.2.0" - checksum: 78794fc7270d295b36c1ac613465b5dc7e7226907a533125b30f177efef9dd630d4e503b00be31b44335eb2ebf9e136ebe97353f8fc5d383885d5fead9d54c09 + checksum: 6375e12ba90b6cbe73f564405248da14c52aa44b62b386e1cbbb1da2640265dd33e99d3e019688dffa874e365cf596b161ccd49351e90638be825c2639697640 languageName: node linkType: hard @@ -24838,9 +24969,9 @@ __metadata: linkType: hard "tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1": - version: 2.6.1 - resolution: "tslib@npm:2.6.1" - checksum: b0d176d176487905b66ae4d5856647df50e37beea7571c53b8d10ba9222c074b81f1410fb91da13debaf2cbc970663609068bdebafa844ea9d69b146527c38fe + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad languageName: node linkType: hard @@ -26375,7 +26506,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:2.3.1, yaml@npm:^2.1.1": +"yaml@npm:2.3.1": version: 2.3.1 resolution: "yaml@npm:2.3.1" checksum: 2c7bc9a7cd4c9f40d3b0b0a98e370781b68b8b7c4515720869aced2b00d92f5da1762b4ffa947f9e795d6cd6b19f410bd4d15fdd38aca7bd96df59bd9486fb54 @@ -26389,6 +26520,13 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.1.1": + version: 2.3.2 + resolution: "yaml@npm:2.3.2" + checksum: acd80cc24df12c808c6dec8a0176d404ef9e6f08ad8786f746ecc9d8974968c53c6e8a67fdfabcc5f99f3dc59b6bb0994b95646ff03d18e9b1dcd59eccc02146 + languageName: node + linkType: hard + "yamljs@npm:0.3.0": version: 0.3.0 resolution: "yamljs@npm:0.3.0"